diff --git a/go.mod b/go.mod index 89c0e54ab5..d4851fde39 100644 --- a/go.mod +++ b/go.mod @@ -11,33 +11,27 @@ require ( github.com/grpc-ecosystem/grpc-health-probe v0.4.40 github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 - github.com/onsi/ginkgo/v2 v2.25.3 - github.com/openshift/api v3.9.0+incompatible - github.com/operator-framework/api v0.34.0 + github.com/onsi/ginkgo/v2 v2.26.0 + github.com/openshift/api v0.0.0-20251021211107-8c9accafe91d + github.com/operator-framework/api v0.35.0 github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000 - github.com/operator-framework/operator-registry v1.59.0 + github.com/operator-framework/operator-registry v1.60.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.10.1 github.com/stretchr/testify v1.11.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 - google.golang.org/protobuf v1.36.9 + google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/client-go v0.33.4 - k8s.io/code-generator v0.33.4 - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a + k8s.io/api v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 + k8s.io/code-generator v0.34.1 + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 - sigs.k8s.io/controller-runtime v0.21.0 - sigs.k8s.io/controller-tools v0.18.0 + sigs.k8s.io/controller-runtime v0.22.3 + sigs.k8s.io/controller-tools v0.19.0 ) -// latest gRPC library causes changes in the way the CatalogSource connection status behaves -// previously it would reach READY - but now seems to stay on IDLE unless there is data going down the pipe -// this is breaking many CatalogSource related tests -// issue: https://github.com/operator-framework/operator-lifecycle-manager/issues/3284 -replace google.golang.org/grpc => google.golang.org/grpc v1.63.2 - require ( cel.dev/expr v0.24.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect @@ -84,12 +78,12 @@ require ( github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-air/gini v1.0.4 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.16.2 // indirect - github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect @@ -97,14 +91,14 @@ require ( github.com/go-openapi/swag v0.23.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect - github.com/goccy/go-yaml v1.11.0 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-migrate/migrate/v4 v4.19.0 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/cel-go v0.26.0 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/cel-go v0.26.1 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-containerregistry v0.20.6 // indirect github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect @@ -147,7 +141,7 @@ require ( github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/onsi/gomega v1.38.2 // indirect @@ -162,7 +156,7 @@ require ( github.com/proglottis/gpgme v0.1.5 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/common v0.67.1 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -183,9 +177,9 @@ require ( github.com/x448/float16 v0.8.4 // indirect github.com/zeebo/errs v1.4.0 // indirect go.etcd.io/bbolt v1.4.3 // indirect - go.etcd.io/etcd/api/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/v3 v3.5.21 // indirect + go.etcd.io/etcd/api/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/v3 v3.6.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect @@ -203,65 +197,52 @@ require ( go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect - golang.org/x/crypto v0.42.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/lint v0.0.0-20241112194109-818c5a804067 // indirect - golang.org/x/mod v0.28.0 // indirect - golang.org/x/net v0.44.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.31.0 // indirect golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/term v0.35.0 // indirect - golang.org/x/text v0.29.0 // indirect - golang.org/x/time v0.13.0 // indirect - golang.org/x/tools v0.36.0 // indirect - golang.org/x/tools/go/expect v0.1.1-deprecated // indirect - golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.38.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/grpc v1.75.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/grpc v1.76.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.33.4 // indirect - k8s.io/apiserver v0.33.4 // indirect + k8s.io/apiextensions-apiserver v0.34.1 // indirect + k8s.io/apiserver v0.34.1 // indirect k8s.io/cli-runtime v0.33.2 // indirect - k8s.io/component-base v0.33.4 // indirect - k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect + k8s.io/component-base v0.34.1 // indirect + k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect k8s.io/klog v1.0.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kms v0.33.4 // indirect - k8s.io/kube-aggregator v0.33.4 // indirect + k8s.io/kms v0.34.1 // indirect + k8s.io/kube-aggregator v0.34.1 // indirect k8s.io/kubectl v0.33.2 // indirect oras.land/oras-go/v2 v2.6.0 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) replace ( - // pinned because of incompatibility with k8s.io/apiserver - github.com/google/cel-go => github.com/google/cel-go v0.22.1 - // controller runtime - github.com/openshift/api => github.com/openshift/api v0.0.0-20210517065120-b325f58df679 - github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 // release-4.5 - // use staged repositories github.com/operator-framework/api => ./staging/api github.com/operator-framework/operator-lifecycle-manager => ./staging/operator-lifecycle-manager github.com/operator-framework/operator-registry => ./staging/operator-registry - - // pinned because of incompatibility with k8s.io/apiserver otelgrpc API changes - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc => go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 - - // pinned because no tag supports 1.18 yet - sigs.k8s.io/structured-merge-diff => sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 ) diff --git a/go.sum b/go.sum index 18f84d01fa..70729a421b 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,10 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -17,1317 +17,44 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= -cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accessapproval v1.7.2/go.mod h1:/gShiq9/kK/h8T/eEn1BTzalDvk0mZxJlhfw0p+Xuc0= -cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= -cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= -cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/accesscontextmanager v1.8.2/go.mod h1:E6/SCRM30elQJ2PKtFMs2YhfJpZSNcJyejhuzoId4Zk= -cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= -cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= -cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.1/go.mod h1:kY3nIMAVQOK2XDqDPHaOuD9e+FdMA6OOpfBjsvaFSOo= -cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= -cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.57.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.2/go.mod h1:c3kCiVmb6UC1dHAjZjcpDj6ZS0bHQ2slL88ZjC2LtlA= -cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.4/go.mod h1:zZgNCxLCy8b2rKKVfC1YkC2vTrpfZmeRCySM3aUbskA= -cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= -cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigateway v1.6.2/go.mod h1:CwMC90nnZElorCW63P2pAYm25AtQrHfuOkbRSHj0bT8= -cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= -cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= -cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeconnect v1.6.2/go.mod h1:s6O0CgXT9RgAxlq3DLXvG8riw8PYYbU/v25jqP3Dy18= -cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= -cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= -cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apigeeregistry v0.7.2/go.mod h1:9CA2B2+TGsPKtfi3F7/1ncCCsL62NXBRfM6iPoGSM+8= -cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= -cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= -cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/appengine v1.8.2/go.mod h1:WMeJV9oZ51pvclqFN2PqHoGnys7rK0rz6s3Mp6yMvDo= -cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= -cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= -cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/area120 v0.8.2/go.mod h1:a5qfo+x77SRLXnCynFWPUZhnZGeSgvQ+Y0v1kSItkh4= -cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= -cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= -cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= -cloud.google.com/go/artifactregistry v1.14.3/go.mod h1:A2/E9GXnsyXl7GUvQ/2CjHA+mVRoWAXC0brg2os+kNI= -cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= -cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= -cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= -cloud.google.com/go/asset v1.15.1/go.mod h1:yX/amTvFWRpp5rcFq6XbCxzKT8RJUam1UoboE179jU4= -cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= -cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.16.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.1/go.mod h1:byvDw36UME5AzGNK7o4JnOnINkwOZ1yRrGrKIahHrng= -cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/assuredworkloads v1.11.2/go.mod h1:O1dfr+oZJMlE6mw0Bp0P1KZSlj5SghMBvTpZqIcUAW4= -cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= -cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= -cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/automl v1.13.2/go.mod h1:gNY/fUmDEN40sP8amAX3MaXkxcqPIn7F1UIIPZpy4Mg= -cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= -cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= -cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= -cloud.google.com/go/baremetalsolution v1.2.1/go.mod h1:3qKpKIw12RPXStwQXcbhfxVj1dqQGEvcmA+SX/mUR88= -cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= -cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= -cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.1/go.mod h1:RpBuIYLkQu8+CWDk3dFD/t/jOCGuUpkpX+Y0n1Xccs8= -cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= -cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.1/go.mod h1:zl/rWWAFVeV+kx+X2Javly7o1EIQThU4WlkynffL/lk= -cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= -cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= -cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec= -cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= -cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= -cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= -cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.2/go.mod h1:u/AdV/3wr3xoRBk5xvUzYMS1IawOAPwQMuHgHMdljDg= -cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= -cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= -cloud.google.com/go/binaryauthorization v1.7.1/go.mod h1:GTAyfRWYgcbsP3NJogpV3yeunbUIjx2T9xVeYovtURE= -cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= -cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/certificatemanager v1.7.2/go.mod h1:15SYTDQMd00kdoW0+XY5d9e+JbOPjp24AvF48D8BbcQ= -cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= -cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= -cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= -cloud.google.com/go/channel v1.17.1/go.mod h1:xqfzcOZAcP4b/hUDH0GkGg1Sd5to6di1HOJn/pi5uBQ= -cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= -cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.1/go.mod h1:K7wGc/3zfvmYWOWwYTgF/d/UVJhS4pu+HAy7PL7mCsU= -cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= -cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= -cloud.google.com/go/clouddms v1.7.1/go.mod h1:o4SR8U95+P7gZ/TX+YbJxehOCsM+fe6/brlrFquiszk= -cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= -cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= -cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.2/go.mod h1:A7nYkjNlW2gUoROg1kvJrQGhJP/38UaWwsnuBDOBVUk= -cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= -cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= -cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= -cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU= -cloud.google.com/go/contactcenterinsights v1.11.1/go.mod h1:FeNP3Kg8iteKM80lMwSk3zZZKVxr+PGnAId6soKuXwE= -cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso= -cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= -cloud.google.com/go/container v1.26.1/go.mod h1:5smONjPRUxeEpDG7bMKWfDL4sauswqEtnBK1/KKpR04= -cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4= -cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.30.1/go.mod h1:vkbfX0EnAKL/vgVECs5BZn24e1cJROzgszJirRKQ4Bg= -cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= -cloud.google.com/go/containeranalysis v0.11.1/go.mod h1:rYlUOM7nem1OJMKwE1SadufX0JP3wnXj844EtZAwWLY= -cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8= -cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= -cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.1/go.mod h1:TzAWaz+ON1tkNr4MOcak8EBHX7wIRX/gZKM+yTVsv+A= -cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk= -cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= -cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataflow v0.9.2/go.mod h1:vBfdBZ/ejlTaYIGB3zB4T08UshH70vbtZeMD+urnUSo= -cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE= -cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= -cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/dataform v0.8.2/go.mod h1:X9RIqDs6NbGPLR80tnYoPNiO1w0wenKTb8PxxlhTMKM= -cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg= -cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= -cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datafusion v1.7.2/go.mod h1:62K2NEC6DRlpNmI43WHMWf9Vg/YvN6QVi8EVwifElI0= -cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE= -cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= -cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/datalabeling v0.8.2/go.mod h1:cyDvGHuJWu9U/cLDA7d8sb9a0tWLEletStu2sTmg3BE= -cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI= -cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= -cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.10.1/go.mod h1:1MzmBv8FvjYfc7vDdxhnLFNskikkB+3vl475/XdCDhs= -cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y= -cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.13.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.1/go.mod h1:bWxQAbg6Smg+sca2+Ex7s8D9a5qU6xfXtwmq4BVReps= -cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= -cloud.google.com/go/dataproc/v2 v2.2.1/go.mod h1:QdAJLaBjh+l4PVlVZcmrmhGccosY/omC1qwfQ61Zv/o= -cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4= -cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= -cloud.google.com/go/dataqna v0.8.2/go.mod h1:KNEqgx8TTmUipnQsScOoDpq/VlXVptUqVMZnt30WAPs= -cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4= -cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= -cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.1/go.mod h1:7ngSYwnw95YFyTd5tOGBxHlOZiL+OtpjheqU7t2/s/c= -cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0= -cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= -cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.1/go.mod h1:8jeadyLkH9qu9xgO3hVWw8jVr29N1mnW42gRJT8GY6g= -cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw= -cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= -cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.1/go.mod h1:n/h+/N2ouKOO+rbe/ZnI186xImpqvCVj2DdsWS/0EAk= -cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c= -cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.47.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= -cloud.google.com/go/dialogflow v1.48.2/go.mod h1:7A2oDf6JJ1/+hdpnFRfb/RjJUOh2X3rhIa5P8wQSEX4= -cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/dlp v1.10.2/go.mod h1:ZbdKIhcnyhILgccwVDzkwqybthh7+MplGC3kZVZsIOQ= -cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0= -cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= -cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.2/go.mod h1:Q/wcRT+qnuXOpjAkvOV4A+IeQl04q2/ReT7SSbytLSo= -cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y= -cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.6/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.8/go.mod h1:Vd/y5PosxCpUHmwC+v9arZyeMfTqBR9VIwOwIqQYYfA= -cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/domains v0.9.2/go.mod h1:3YvXGYzZG1Temjbk7EyGCuGGiXHJwVNmwIf+E/cUp5I= -cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU= -cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= -cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/edgecontainer v1.1.2/go.mod h1:wQRjIzqxEs9e9wrtle4hQPSR1Y51kqN75dgF7UllZZ4= -cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA= -cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= -cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/essentialcontacts v1.6.3/go.mod h1:yiPCD7f2TkP82oJEFXFTou8Jl8L6LBRPeBEkTaO0Ggo= -cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM= -cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= -cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.1/go.mod h1:EqBxmGHFrruIara4FUQ3RHlgfCn7yo1HYsu2Hpt/C3Y= -cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM= -cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= -cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/filestore v1.7.2/go.mod h1:TYOlyJs25f/omgj+vY7/tIG/E7BX369triSPzE4LdgE= -cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0= -cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= -cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/functions v1.15.2/go.mod h1:CHAjtcR6OU4XF2HuiVeriEdELNcnvRZSk1Q8RMqy4lE= -cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug= -cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= -cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.2/go.mod h1:OMZbXzEJloyXMC7gqdSB+EOEQ1AKcpGYvO3s1ec5ixk= -cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I= -cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= -cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkeconnect v0.8.2/go.mod h1:6nAVhwchBJYgQCXD2pHBFQNiJNyAd/wyxljpaa6ZPrY= -cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo= -cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= -cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkehub v0.14.2/go.mod h1:iyjYH23XzAxSdhrbmfoQdePnlMj2EWcvnR+tHdBQsCY= -cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8= -cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= -cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.1/go.mod h1:AcrGoin6VLKT/fwZEYuqvVominLriQBCKmbjtnbMjG8= -cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo= -cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= -cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/gsuiteaddons v1.6.2/go.mod h1:K65m9XSgs8hTF3X9nNTPi8IQueljSdYo9F+Mi+s4MyU= -cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48= -cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= -cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= -cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= -cloud.google.com/go/iap v1.9.1/go.mod h1:SIAkY7cGMLohLSdBR25BuIxO+I4fXJiL06IBL7cy/5Q= -cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI= -cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= -cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/ids v1.4.2/go.mod h1:3vw8DX6YddRu9BncxuzMyWn0g8+ooUjI2gslJ7FH3vk= -cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU= -cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= -cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/iot v1.7.2/go.mod h1:q+0P5zr1wRFpw7/MOgDXrG/HVA+l+cSwdObffkrpnSg= -cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I= -cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= -cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= -cloud.google.com/go/kms v1.15.3/go.mod h1:AJdXqHxS2GlPyduM99s9iGqi2nwbviBbhV/hdmt4iOQ= -cloud.google.com/go/kms v1.15.4/go.mod h1:L3Sdj6QTHK8dfwK5D1JLsAyELsNMnd3tAIwGS4ltKpc= -cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= -cloud.google.com/go/kms v1.15.6/go.mod h1:yF75jttnIdHfGBoE51AKsD/Yqf+/jICzB9v1s1acsms= -cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= -cloud.google.com/go/language v1.11.1/go.mod h1:Xyid9MG9WOX3utvDbpX7j3tXDmmDooMyMDqgUVpH17U= -cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4= -cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= -cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/lifesciences v0.9.2/go.mod h1:QHEOO4tDzcSAzeJg7s2qwnLM2ji8IRpQl4p6m5Z9yTA= -cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM= -cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= -cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= -cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= -cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/managedidentities v1.6.2/go.mod h1:5c2VG66eCa0WIq6IylRk3TBW83l161zkFvCj28X7jn8= -cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4= -cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= -cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.1/go.mod h1:BxSa0BnW1g2U2gNdbq5zikLlHUuHW0GFWh7sgML2kIY= -cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4= -cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= -cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/mediatranslation v0.8.2/go.mod h1:c9pUaDRLkgHRx3irYE5ZC8tfXGrMYwNZdmDqKMSfFp8= -cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y= -cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= -cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/memcache v1.10.2/go.mod h1:f9ZzJHLBrmd4BkguIAa/l/Vle6uTHzHokdnzSWOdQ6A= -cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo= -cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= -cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk= -cloud.google.com/go/metastore v1.13.1/go.mod h1:IbF62JLxuZmhItCppcIfzBBfUFq0DIB9HPDoLgWrVOU= -cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA= -cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= -cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= -cloud.google.com/go/monitoring v1.16.1/go.mod h1:6HsxddR+3y9j+o/cMJH6q/KJ/CBTvM/38L/1m7bTRJ4= -cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc= -cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.1/go.mod h1:SJzPMakCF0GHOuKEH/r4hxVKF04zl+cRPQyc3d/fqII= -cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.1/go.mod h1:LyGPXR742uQcDxZ/wv4EI0Vu5N6NKJ77ZYVnDe69Zug= -cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo= -cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= -cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= -cloud.google.com/go/networkmanagement v1.9.1/go.mod h1:CCSYgrQQvW73EJawO2QamemYcOb57LvrDdDU51F0mcI= -cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw= -cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= -cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/networksecurity v0.9.2/go.mod h1:jG0SeAttWzPMUILEHDUvFYdQTl8L/E/KC8iZDj85lEI= -cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0= -cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= -cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= -cloud.google.com/go/notebooks v1.10.1/go.mod h1:5PdJc2SgAybE76kFQCWrTfJolCOUQXF97e+gteUUA6A= -cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ= -cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= -cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= -cloud.google.com/go/optimization v1.5.1/go.mod h1:NC0gnUD5MWVAF7XLdoYVPmYYVth93Q6BUzqAq3ZwtV8= -cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo= -cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= -cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orchestration v1.8.2/go.mod h1:T1cP+6WyTmh6LSZzeUhvGf0uZVmJyTx7t8z7Vg87+A0= -cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs= -cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= -cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/orgpolicy v1.11.2/go.mod h1:biRDpNwfyytYnmCRWZWxrKF22Nkz9eNVj9zyaBdpm1o= -cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM= -cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/osconfig v1.12.2/go.mod h1:eh9GPaMZpI6mEJEuhEjUJmaxvQ3gav+fFEJon1Y8Iw0= -cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM= -cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= -cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE= -cloud.google.com/go/oslogin v1.11.1/go.mod h1:OhD2icArCVNUxKqtK0mcSmKL7lgr0LVlQz+v9s1ujTg= -cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU= -cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= -cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= -cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/phishingprotection v0.8.2/go.mod h1:LhJ91uyVHEYKSKcMGhOa14zMMWfbEdxG032oT6ECbC8= -cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8= -cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= -cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= -cloud.google.com/go/policytroubleshooter v1.9.1/go.mod h1:MYI8i0bCrL8cW+VHN1PoiBTyNZTstCg2WUw2eVC4c4U= -cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs= -cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= -cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= -cloud.google.com/go/privatecatalog v0.9.2/go.mod h1:RMA4ATa8IXfzvjrhhK8J6H4wwcztab+oZph3c6WmtFc= -cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE= -cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= -cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= -cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.1/go.mod h1:JZYZJOeZjgSSTGP4uz7NlQ4/d1w5hGmksVgM0lbEij0= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommendationengine v0.8.2/go.mod h1:QIybYHPK58qir9CV2ix/re/M//Ty10OxjnnhWdaKS1Y= -cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8= -cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= -cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= -cloud.google.com/go/recommender v1.11.1/go.mod h1:sGwFFAyI57v2Hc5LbIj+lTwXipGu9NW015rkaEM5B18= -cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y= -cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/redis v1.13.2/go.mod h1:0Hg7pCMXS9uz02q+LoEVl5dNHUkIQv+C/3L76fandSA= -cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U= -cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= -cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcemanager v1.9.2/go.mod h1:OujkBg1UZg5lX2yIyMo5Vz9O5hf7XQOSV7WxqxxMtQE= -cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U= -cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= -cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/resourcesettings v1.6.2/go.mod h1:mJIEDd9MobzunWMeniaMp6tzg4I2GvD3TTmPkc8vBXk= -cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic= -cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= -cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/retail v1.14.2/go.mod h1:W7rrNRChAEChX336QF7bnMxbsjugcOCPU44i5kbLiL8= -cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo= -cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= -cloud.google.com/go/retail v1.15.1/go.mod h1:In9nSBOYhLbDGa87QvWlnE1XA14xBN2FpQRiRsUs9wU= -cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU= -cloud.google.com/go/run v1.3.1/go.mod h1:cymddtZOzdwLIAsmS6s+Asl4JoXIDm/K1cpZTxV4Q5s= -cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE= -cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= -cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/scheduler v1.10.2/go.mod h1:O3jX6HRH5eKCA3FutMw375XHZJudNIKVonSCHv7ropY= -cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc= -cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/secretmanager v1.11.2/go.mod h1:MQm4t3deoSub7+WNwiC4/tRYgDBHJgJPvswqQVB1Vss= -cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI= -cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= -cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/security v1.15.2/go.mod h1:2GVE/v1oixIRHDaClVbHuPcZwAqFM28mXuAKCfMgYIg= -cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs= -cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= -cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/securitycenter v1.23.1/go.mod h1:w2HV3Mv/yKhbXKwOCu2i8bCuLtNP1IMHuiYQn4HJq5s= -cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI= -cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.1/go.mod h1:tJywXimEWzNzw9FvtNjsQxxJ3/41jseeILgwU/QLrGI= -cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg= -cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= -cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/shell v1.7.2/go.mod h1:KqRPKwBV0UyLickMn0+BY1qIyE98kKyI216sH/TuHmc= -cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc= -cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= -cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= -cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.53.1/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.54.0/go.mod h1:wZvSQVBgngF0Gq86fKup6KIYmN2be7uOKjtK97X+bQU= -cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= -cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0= -cloud.google.com/go/spanner v1.57.0/go.mod h1:aXQ5QDdhPRIqVhYmnkAdwPYvj/DRN0FguclhEWw+jOo= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.1/go.mod h1:WcuaWz/3hOlzPFOVo9DUsblMIHwxP589y6ZMtaG+iAA= -cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI= -cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/storage v1.37.0/go.mod h1:i34TiT2IhiNDmcj65PqwCjcoUX7Z5pLzS8DEmoiFq1k= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/storagetransfer v1.10.1/go.mod h1:rS7Sy0BtPviWYTTJVWCSV4QrbBitgPeuK4/FKa4IdLs= -cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA= -cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= -cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/talent v1.6.3/go.mod h1:xoDO97Qd4AK43rGjJvyBHMskiEf3KulgYzcH6YWOVoo= -cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY= -cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= -cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/texttospeech v1.7.2/go.mod h1:VYPT6aTOEl3herQjFHYErTlSZJ4vB00Q2ZTmuVgluD4= -cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so= -cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= -cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/tpu v1.6.2/go.mod h1:NXh3NDwt71TsPZdtGWgAG5ThDfGd32X1mJ2cMaRlVgU= -cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY= -cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= -cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/trace v1.10.2/go.mod h1:NPXemMi6MToRFcSxRl2uDnu/qAlAQ3oULUphcHGh1vA= -cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY= -cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= -cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.1/go.mod h1:TWIgDZknq2+JD4iRcojgeDtqGEp154HN/uL6hMvylS8= -cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY= -cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= -cloud.google.com/go/video v1.20.1/go.mod h1:3gJS+iDprnj8SY6pe0SwLeC5BUW80NjhwX7INWEuWGU= -cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA= -cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= -cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/videointelligence v1.11.2/go.mod h1:ocfIGYtIVmIcWk1DsSGOoDiXca4vaZQII1C85qtoplc= -cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo= -cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= -cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vision/v2 v2.7.3/go.mod h1:V0IcLCY7W+hpMKXK1JYE0LV5llEqVmj+UJChjvA1WsM= -cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw= -cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= -cloud.google.com/go/vision/v2 v2.7.6/go.mod h1:ZkvWTVNPBU3YZYzgF9Y1jwEbD1NBOCyJn0KFdQfE6Bw= -cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmmigration v1.7.2/go.mod h1:iA2hVj22sm2LLYXGPT1pB63mXHhrH1m/ruux9TwWLd8= -cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo= -cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= -cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.1/go.mod h1:aT3Xsm5sNx0QShk1Jc1B8OddrxAScYLwzVoaiXfdzzk= -cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA= -cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= -cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/vpcaccess v1.7.2/go.mod h1:mmg/MnRHv+3e8FJUjeSibVFvQF1cCy2MsFaFqxeY1HU= -cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc= -cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= -cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/webrisk v1.9.2/go.mod h1:pY9kfDgAqxUpDBOrG4w8deLfhvJmejKB0qd/5uQIPBc= -cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8= -cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= -cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/websecurityscanner v1.6.2/go.mod h1:7YgjuU5tun7Eg2kpKgGnDuEOXWIrh8x8lWrJT4zfmas= -cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw= -cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= -cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= -cloud.google.com/go/workflows v1.12.1/go.mod h1:5A95OhD/edtOhQd/O741NSfIMezNTbCwLM1P1tBRGHM= -cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc= -cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= -cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= @@ -1340,39 +67,18 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0 github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/akrylysov/pogreb v0.10.2 h1:e6PxmeyEhWyi2AKOBIJzAEi4HkiC+lKyCocRGlnDi78= github.com/akrylysov/pogreb v0.10.2/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= -github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y= -github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= -github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= @@ -1383,36 +89,19 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -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.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= github.com/containerd/containerd v1.7.28 h1:Nsgm1AtcmEh4AHAJ4gGlNSaKgXiNccU270Dnf81FQ3c= @@ -1453,6 +142,11 @@ github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU= +github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= +github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -1481,9 +175,7 @@ github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -1491,54 +183,44 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.14 h1:3fAqdB6BCPKHDMHAKRwtPUwYexKtGrNuw8HX/T/4neo= +github.com/gkampitakis/go-snaps v0.5.14/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-air/gini v1.0.4 h1:lteMAxHKNOAjIqazL/klOJJmxq6YxxSuJ17MnMXny+s= github.com/go-air/gini v1.0.4/go.mod h1:dd8RvT1xcv6N1da33okvBd8DhMh1/A4siGy6ErjTljs= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= @@ -1548,51 +230,35 @@ github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lo github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= +github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= 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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= @@ -1600,27 +266,18 @@ github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.8.1/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y= -github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= -github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54= -github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= -github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-migrate/migrate/v4 v4.19.0 h1:RcjOnCGz3Or6HQYEJ/EEVLfWnmw9KnoigPSjzhCuaSE= github.com/golang-migrate/migrate/v4 v4.19.0/go.mod h1:9dyEcu+hO+G9hPSw8AIg50yg622pXJsoHItQnDGZkI0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1628,6 +285,7 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -1637,7 +295,6 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -1655,21 +312,18 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40= -github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= +github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -1681,17 +335,11 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.20.6 h1:cvWX87UxxLgaH76b4hIvya6Dzz9qHB31qAwjAohdSTU= github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2FAkwCDf9/HZgsFJ02E2Y= -github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -1699,8 +347,7 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1710,61 +357,21 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -1774,18 +381,14 @@ github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w7 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 h1:JYghRBlGCZyCF2wNUJ8W0cwaQdtpcssJ4CgC406g+WU= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 h1:+epNPbD5EqgpEMm5wrl4Hqts3jZt8+kYaqUisuuIGTk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/grpc-ecosystem/grpc-health-probe v0.4.40 h1:Lr1E28yjpR3D1V42tNDjrFB0Vk+4X0TCDSVfiWXo008= @@ -1806,13 +409,9 @@ github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5 github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -1828,48 +427,35 @@ github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ github.com/joelanford/ignore v0.1.1 h1:vKky5RDoPT+WbONrbQBgOn95VV/UPh4ejlyAbbzgnQk= github.com/joelanford/ignore v0.1.1/go.mod h1:8eho/D8fwQ3rIXrLwE23AaeaGDNXqLE9QJ3zJ4LIPCw= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= -github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.8.0 h1:ZX/URYa7ilESY19ik/vBmCn6zdGQLxACwjAcWbHlYlg= github.com/kisielk/errcheck v1.8.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 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/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -1882,49 +468,38 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= -github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 h1:aOeI7xAOVdK+R6xbVsZuU9HmCZYmQVmZgPf9xJUd2Sg= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0/go.mod h1:0hZWbtfeCYUQeAQdPLUzETiBhUSns7O6LDj9vH88xKA= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 h1:lPmsut5Sk7eK2BmDXuvNEvMbT7MkAJBu64Yxr7iJ6nk= github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37/go.mod h1:dYWq+UWoFCDY1TndvFUQuhBbIYmZpjreC8adEAx93zE= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= @@ -1953,10 +528,10 @@ github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFL github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -1964,18 +539,21 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.25.3 h1:Ty8+Yi/ayDAGtk4XxmmfUy4GabvM+MegeB4cDLRi6nw= -github.com/onsi/ginkgo/v2 v2.25.3/go.mod h1:43uiyQC4Ed2tkOzLsEYm7hnrb7UJTWHYNsuy3bG/snE= +github.com/onsi/ginkgo/v2 v2.26.0 h1:1J4Wut1IlYZNEAWIV3ALrT9NfiaGW2cDCJQSFQMs/gE= +github.com/onsi/ginkgo/v2 v2.26.0/go.mod h1:qhEywmzWTBUY88kfO0BRvX4py7scov9yR+Az2oavUzw= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -1984,29 +562,21 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/openshift/api v0.0.0-20210517065120-b325f58df679 h1:aKnhCEj48qYquZk+w5t0fVthwAtifHUXTQrvwM1xJf8= -github.com/openshift/api v0.0.0-20210517065120-b325f58df679/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= -github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 h1:kMiuiZXH1GdfbiMwsuAQOqGaMxlo9NCUk0wT4XAdfNM= -github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0/go.mod h1:uUQ4LClRO+fg5MF/P6QxjMCb1C9f7Oh4RKepftDnEJE= +github.com/openshift/api v0.0.0-20220525145417-ee5b62754c68/go.mod h1:LEnw1IVscIxyDnltE3Wi7bQb/QzIM8BfPNKoGA1Qlxw= +github.com/openshift/api v0.0.0-20251021211107-8c9accafe91d h1:hfgRVl8k/YV6Haz6eH3hk/FGuiK/sf+G4HI6s+Dor6w= +github.com/openshift/api v0.0.0-20251021211107-8c9accafe91d/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY= +github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= +github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a h1:ylsEgoC8Dlg4A0C1TLH0A4x/TZao7k1YveLwROhRUdk= +github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a/go.mod h1:eDO5QeVi2IiXmDwB0e2z1DpAznWroZKe978pzZwFBzg= github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -2022,17 +592,13 @@ github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UH 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/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI= +github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -2045,30 +611,23 @@ github.com/redis/go-redis/extra/redisotel/v9 v9.10.0 h1:4z7/hCJ9Jft8EBb2tDmK38p2 github.com/redis/go-redis/extra/redisotel/v9 v9.10.0/go.mod h1:B0thqLh4hB8MvvcUKSwyP5YiIcCCp8UrQ0cA9gEqyjk= github.com/redis/go-redis/v9 v9.10.0 h1:FxwK3eV8p/CQa0Ch276C7u2d0eNC9kCmAYQ7mCXCzVs= github.com/redis/go-redis/v9 v9.10.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= 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= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/secure-systems-lab/go-securesystemslib v0.9.1 h1:nZZaNz4DiERIQguNy0cL5qTdn9lR8XKHf4RUyG1Sx3g= github.com/secure-systems-lab/go-securesystemslib v0.9.1/go.mod h1:np53YzT0zXGMv6x4iEWc9Z59uR+x+ndLwCLqPYpLXVU= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sigstore/fulcio v1.7.1 h1:RcoW20Nz49IGeZyu3y9QYhyyV3ZKQ85T+FXPKkvE+aQ= github.com/sigstore/fulcio v1.7.1/go.mod h1:7lYY+hsd8Dt+IvKQRC+KEhWpCZ/GlmNvwIa5JhypMS8= @@ -2087,16 +646,11 @@ github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -2108,12 +662,10 @@ github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GB github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= 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.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -2127,16 +679,18 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= github.com/tidwall/btree v1.8.1/go.mod h1:jBbTdUWhSZClZWoDg54VnvV7/54modSOzDN7VXftj1A= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -2162,28 +716,23 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v2 v2.305.21 h1:eLiFfexc2mE+pTLz9WwnoEsX5JTTpLCYVivKkmVXIRA= -go.etcd.io/etcd/client/v2 v2.305.21/go.mod h1:OKkn4hlYNf43hpjEM3Ke3aRdUkhSl8xjKjSf8eCq2J8= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= -go.etcd.io/etcd/pkg/v3 v3.5.21 h1:jUItxeKyrDuVuWhdh0HtjUANwyuzcb7/FAeUfABmQsk= -go.etcd.io/etcd/pkg/v3 v3.5.21/go.mod h1:wpZx8Egv1g4y+N7JAsqi2zoUiBIUWznLjqJbylDjWgU= -go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= -go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= -go.etcd.io/etcd/server/v3 v3.5.21 h1:9w0/k12majtgarGmlMVuhwXRI2ob3/d1Ik3X5TKo0yU= -go.etcd.io/etcd/server/v3 v3.5.21/go.mod h1:G1mOzdwuzKT1VRL7SqRchli/qcFrtLBTAQ4lV20sXXo= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= +go.etcd.io/etcd/pkg/v3 v3.6.4 h1:fy8bmXIec1Q35/jRZ0KOes8vuFxbvdN0aAFqmEfJZWA= +go.etcd.io/etcd/pkg/v3 v3.6.4/go.mod h1:kKcYWP8gHuBRcteyv6MXWSN0+bVMnfgqiHueIZnKMtE= +go.etcd.io/etcd/server/v3 v3.6.4 h1:LsCA7CzjVt+8WGrdsnh6RhC0XqCsLkBly3ve5rTxMAU= +go.etcd.io/etcd/server/v3 v3.6.4/go.mod h1:aYCL/h43yiONOv0QIR82kH/2xZ7m+IWYjzRmyQfnCAg= +go.etcd.io/raft/v3 v3.6.0 h1:5NtvbDVYpnfZWcIHgGRk9DyzkBIXOi8j+DDp1IcnUWQ= +go.etcd.io/raft/v3 v3.6.0/go.mod h1:nLvLevg6+xrVtHUmVaTcTz603gQPHfh7kUAwV6YpfGo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -2199,17 +748,10 @@ go.opentelemetry.io/contrib/bridges/prometheus v0.61.0 h1:RyrtJzu5MAmIcbRrwg75b+ go.opentelemetry.io/contrib/bridges/prometheus v0.61.0/go.mod h1:tirr4p9NXbzjlbruiRGp53IzlYrDk5CO2fdHj0sSSaY= go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 h1:XfzKtKSrbtYk9TNCF8dkO0Y9M7IOfb4idCwBOTwGBiI= go.opentelemetry.io/contrib/exporters/autoexport v0.61.0/go.mod h1:N6otC+qXTD5bAnbK2O1f/1SXq3cX+3KYSWrkBUqG0cw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= -go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= @@ -2236,32 +778,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 h1:G8Xec/SgZQricwW go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0/go.mod h1:PD57idA/AiFD5aqoxGxCvT/ILJPeHy3MjqU/NS7KogY= go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= -go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= -go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.podman.io/common v0.65.0 h1:8JNl25U4VpKDkFHSymSPm4te7ZQHJbfAB/l2FqtmYEg= @@ -2281,74 +807,41 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 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/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -2359,7 +852,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20241112194109-818c5a804067 h1:adDmSQyFTCiv19j015EGKJBoaa7ElV0Q1Wovb/4G7NA= golang.org/x/lint v0.0.0-20241112194109-818c5a804067/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -2370,28 +862,19 @@ 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.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= 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= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2404,12 +887,10 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20191004110552-13f9640d40b9/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= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2420,6 +901,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2428,49 +910,22 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/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-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2481,31 +936,10 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/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.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= +golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2517,27 +951,20 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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-20220601150217-0de741cfad7f/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.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/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= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2545,14 +972,15 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2567,6 +995,7 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2576,94 +1005,41 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/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-20210423185535-09eb48e85fd7/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/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-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/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-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/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= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2673,37 +1049,25 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= -golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2712,13 +1076,10 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 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-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/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= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2740,6 +1101,7 @@ golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2749,59 +1111,32 @@ 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-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= -golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= -golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= +golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2823,62 +1158,13 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= -google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= -google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g= -google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2902,7 +1188,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -2915,200 +1200,39 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= -google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= -google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= -google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= -google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= -google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= -google.golang.org/genproto/googleapis/api v0.0.0-20240122161410-6c6643bf1457/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I= -google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:PVreiBMirk8ypES6aw9d4p6iiBNSIfZEBqr3UGoAi2E= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:SCz6T5xjNXM4QFPRwxHcfChp7V+9DcXR3ay2TkHR8Tg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920183334-c177e329c48b/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231211222908-989df2bf70f3/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240122161410-6c6643bf1457/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -3124,16 +1248,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -3154,6 +1270,7 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYs gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -3161,18 +1278,19 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -3180,143 +1298,70 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= -k8s.io/api v0.21.0-rc.0/go.mod h1:Dkc/ZauWJrgZhjOjeBgW89xZQiTBJA2RaBKYHXPsi2Y= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= -k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.21.0-rc.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= +k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= k8s.io/cli-runtime v0.33.2 h1:koNYQKSDdq5AExa/RDudXMhhtFasEg48KLS2KSAU74Y= k8s.io/cli-runtime v0.33.2/go.mod h1:gnhsAWpovqf1Zj5YRRBBU7PFsRc6NkEkwYNQE+mXL88= -k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.21.0-rc.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/code-generator v0.33.4 h1:DiA801QxqApRIBh3OWULasVAUA237XnYvFNMh+E34Y8= -k8s.io/code-generator v0.33.4/go.mod h1:ifWxKWhEl/Z1K7WmWAyOBEf3ex/i546ingCzLC8YVIY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc= +k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.33.4 h1:rvsVglcIFa9WeKk5vd3mBufSG4D5dqponz1Jz5d6FXU= -k8s.io/kms v0.33.4/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E= -k8s.io/kube-aggregator v0.33.4 h1:TdIJKHb0/bLpby7FblXIaVEzyA1jGEjzt/n9cRvwq8U= -k8s.io/kube-aggregator v0.33.4/go.mod h1:wZuctdRvGde5bwzxkZRs0GYj2KOpCNgx8rRGVoNb62k= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kms v0.34.1 h1:iCFOvewDPzWM9fMTfyIPO+4MeuZ0tcZbugxLNSHFG4w= +k8s.io/kms v0.34.1/go.mod h1:s1CFkLG7w9eaTYvctOxosx88fl4spqmixnNpys0JAtM= +k8s.io/kube-aggregator v0.34.1 h1:WNLV0dVNoFKmuyvdWLd92iDSyD/TSTjqwaPj0U9XAEU= +k8s.io/kube-aggregator v0.34.1/go.mod h1:RU8j+5ERfp0h+gIvWtxRPfsa5nK7rboDm8RST8BJfYQ= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= k8s.io/kubectl v0.33.2 h1:7XKZ6DYCklu5MZQzJe+CkCjoGZwD1wWl7t/FxzhMz7Y= k8s.io/kubectl v0.33.2/go.mod h1:8rC67FB8tVTYraovAGNi/idWIK90z2CHFNMmGJZJ3KI= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.38.1/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.0.0-20220910160915-348f15de615a/go.mod h1:8p47QxPkdugex9J4n9P2tLZ9bK01yngIVp00g4nomW0= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.19.0/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.2/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= -sigs.k8s.io/controller-tools v0.18.0 h1:rGxGZCZTV2wJreeRgqVoWab/mfcumTMmSwKzoM9xrsE= -sigs.k8s.io/controller-tools v0.18.0/go.mod h1:gLKoiGBriyNh+x1rWtUQnakUYEujErjXs9pf+x/8n1U= +sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTijTq8Y= +sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk= +sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/manifests/0000_50_olm_00-catalogsources.crd.yaml b/manifests/0000_50_olm_00-catalogsources.crd.yaml index 1ce841df79..e0bde39811 100644 --- a/manifests/0000_50_olm_00-catalogsources.crd.yaml +++ b/manifests/0000_50_olm_00-catalogsources.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -635,8 +635,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml index 63c9bdc6f0..563474fa48 100644 --- a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -1386,8 +1386,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1771,7 +1771,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1826,6 +1828,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1876,8 +1914,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1904,7 +1942,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2548,7 +2588,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2601,10 +2641,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2616,6 +2656,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3217,7 +3308,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3272,6 +3365,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3322,8 +3451,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3350,7 +3479,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3973,7 +4104,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4027,9 +4158,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4544,7 +4717,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4569,6 +4744,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4656,7 +4844,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4711,6 +4901,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4761,8 +4987,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4789,7 +5015,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5433,7 +5661,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5486,10 +5714,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5501,6 +5729,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6010,6 +6289,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6161,7 +6441,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6175,7 +6455,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7409,15 +7689,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7586,16 +7864,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7670,7 +7945,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8063,6 +8338,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8189,7 +8568,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/manifests/0000_50_olm_00-installplans.crd.yaml b/manifests/0000_50_olm_00-installplans.crd.yaml index 3fd8618308..08f6701336 100644 --- a/manifests/0000_50_olm_00-installplans.crd.yaml +++ b/manifests/0000_50_olm_00-installplans.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-olmconfigs.crd.yaml b/manifests/0000_50_olm_00-olmconfigs.crd.yaml index d050561f88..ec2291246b 100644 --- a/manifests/0000_50_olm_00-olmconfigs.crd.yaml +++ b/manifests/0000_50_olm_00-olmconfigs.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-operatorconditions.crd.yaml b/manifests/0000_50_olm_00-operatorconditions.crd.yaml index 8b57b2927c..2f5a208669 100644 --- a/manifests/0000_50_olm_00-operatorconditions.crd.yaml +++ b/manifests/0000_50_olm_00-operatorconditions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-operatorgroups.crd.yaml b/manifests/0000_50_olm_00-operatorgroups.crd.yaml index 72847359aa..acf2160ddc 100644 --- a/manifests/0000_50_olm_00-operatorgroups.crd.yaml +++ b/manifests/0000_50_olm_00-operatorgroups.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-operators.crd.yaml b/manifests/0000_50_olm_00-operators.crd.yaml index 5a0e2ba520..c571a3264a 100644 --- a/manifests/0000_50_olm_00-operators.crd.yaml +++ b/manifests/0000_50_olm_00-operators.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-subscriptions.crd.yaml b/manifests/0000_50_olm_00-subscriptions.crd.yaml index b093a12ef5..87ce80f720 100644 --- a/manifests/0000_50_olm_00-subscriptions.crd.yaml +++ b/manifests/0000_50_olm_00-subscriptions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -622,8 +622,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -972,7 +972,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1027,6 +1029,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1102,7 +1140,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1141,7 +1181,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1991,15 +2031,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2168,16 +2206,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2252,7 +2287,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2645,6 +2680,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2771,7 +2910,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml b/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml index 1ce841df79..e0bde39811 100644 --- a/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -635,8 +635,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml b/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml index 63c9bdc6f0..563474fa48 100644 --- a/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -1386,8 +1386,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1771,7 +1771,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1826,6 +1828,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1876,8 +1914,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1904,7 +1942,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2548,7 +2588,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2601,10 +2641,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2616,6 +2656,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3217,7 +3308,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3272,6 +3365,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3322,8 +3451,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3350,7 +3479,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3973,7 +4104,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4027,9 +4158,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4544,7 +4717,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4569,6 +4744,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4656,7 +4844,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4711,6 +4901,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4761,8 +4987,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4789,7 +5015,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5433,7 +5661,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5486,10 +5714,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5501,6 +5729,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6010,6 +6289,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6161,7 +6441,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6175,7 +6455,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7409,15 +7689,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7586,16 +7864,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7670,7 +7945,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8063,6 +8338,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8189,7 +8568,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/microshift-manifests/0000_50_olm_00-installplans.crd.yaml b/microshift-manifests/0000_50_olm_00-installplans.crd.yaml index 3fd8618308..08f6701336 100644 --- a/microshift-manifests/0000_50_olm_00-installplans.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-installplans.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml b/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml index d050561f88..ec2291246b 100644 --- a/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml b/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml index 8b57b2927c..2f5a208669 100644 --- a/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml b/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml index 72847359aa..acf2160ddc 100644 --- a/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-operators.crd.yaml b/microshift-manifests/0000_50_olm_00-operators.crd.yaml index 5a0e2ba520..c571a3264a 100644 --- a/microshift-manifests/0000_50_olm_00-operators.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-operators.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml b/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml index b093a12ef5..87ce80f720 100644 --- a/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -622,8 +622,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -972,7 +972,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1027,6 +1029,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1102,7 +1140,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1141,7 +1181,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1991,15 +2031,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2168,16 +2206,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2252,7 +2287,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2645,6 +2680,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2771,7 +2910,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/api/.github/workflows/go.yaml b/staging/api/.github/workflows/go.yaml index 36b19911d5..5ebc0026ce 100644 --- a/staging/api/.github/workflows/go.yaml +++ b/staging/api/.github/workflows/go.yaml @@ -16,7 +16,7 @@ jobs: - name: Check out code into the Go module directory uses: actions/checkout@v5 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.mod id: go @@ -47,7 +47,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.mod id: go diff --git a/staging/api/.github/workflows/stale.yaml b/staging/api/.github/workflows/stale.yaml index 8a6bac598b..f3425f3ed0 100644 --- a/staging/api/.github/workflows/stale.yaml +++ b/staging/api/.github/workflows/stale.yaml @@ -33,7 +33,7 @@ jobs: issues: write # allow labeling, commenting, closing issues pull-requests: write # allow labeling, commenting, closing PRs steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 90 diff --git a/staging/api/.github/workflows/verify.yml b/staging/api/.github/workflows/verify.yml index ce7bab22c5..9a5ac9605c 100644 --- a/staging/api/.github/workflows/verify.yml +++ b/staging/api/.github/workflows/verify.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version-file: go.mod - name: Run the verify target @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version-file: go.mod - name: Deploy Kind diff --git a/staging/api/crds/operators.coreos.com_catalogsources.yaml b/staging/api/crds/operators.coreos.com_catalogsources.yaml index f8924f9af4..2b10463bac 100644 --- a/staging/api/crds/operators.coreos.com_catalogsources.yaml +++ b/staging/api/crds/operators.coreos.com_catalogsources.yaml @@ -631,8 +631,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml index 20bb1a0394..b957a9badb 100644 --- a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml @@ -1382,8 +1382,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1767,7 +1767,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1822,6 +1824,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1872,8 +1910,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1900,7 +1938,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2544,7 +2584,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2597,10 +2637,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2612,6 +2652,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3213,7 +3304,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3268,6 +3361,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3318,8 +3447,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3346,7 +3475,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3969,7 +4100,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4023,9 +4154,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4541,7 +4714,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4566,6 +4741,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4653,7 +4841,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4708,6 +4898,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4758,8 +4984,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4786,7 +5012,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5430,7 +5658,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5483,10 +5711,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5498,6 +5726,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6007,6 +6286,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6158,7 +6438,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6172,7 +6452,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7406,15 +7686,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7583,16 +7861,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7667,7 +7942,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8060,6 +8335,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8186,7 +8565,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/api/crds/operators.coreos.com_subscriptions.yaml b/staging/api/crds/operators.coreos.com_subscriptions.yaml index c388b9181e..10f465665c 100644 --- a/staging/api/crds/operators.coreos.com_subscriptions.yaml +++ b/staging/api/crds/operators.coreos.com_subscriptions.yaml @@ -618,8 +618,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -968,7 +968,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1023,6 +1025,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1098,7 +1136,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1137,7 +1177,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1987,15 +2027,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2164,16 +2202,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2248,7 +2283,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2641,6 +2676,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2767,7 +2906,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/api/crds/zz_defs.go b/staging/api/crds/zz_defs.go index 50b1b0352a..06bb23be58 100644 --- a/staging/api/crds/zz_defs.go +++ b/staging/api/crds/zz_defs.go @@ -85,7 +85,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x70\x17\x52\xbd\x85\xbb\x90\xc2\x5d\x48\xe1\x2e\x24\xdb\xc2\x5d\x48\xe1\x2e\xa4\x50\xc3\x2f\xd4\xf0\x0b\x35\xfc\xfa\x7f\x15\x6a\xf8\x35\xb7\x50\xc3\x6f\x48\x0b\x35\xfc\x7a\x8f\x1e\x6a\xf8\x85\x1a\x7e\xc3\x06\x0e\x35\xfc\x48\xa8\xe1\x17\x6a\xf8\x7d\xc1\x35\xfc\xc2\x5d\x48\x5f\xc4\x85\x20\xe1\x36\x90\x01\x63\x7f\x5e\xb7\x81\x84\xbb\x90\x5a\x07\x09\x77\x21\x05\xd6\x17\xee\x42\xfa\xdd\x72\xbf\x70\x17\x52\x8f\x41\xc2\x5d\x48\xe1\x2e\xa4\xd6\x16\xee\x42\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\xbb\x90\xc2\x5d\x48\xe1\x2e\xa4\x62\xe4\x70\x17\x52\xb8\x0b\x09\x5b\xb8\x0b\xa9\xc7\x08\xe1\x2e\xa4\x2f\xf5\x2e\xa4\x5a\x3e\xd0\x97\x7b\x21\xd2\xf0\x65\x84\x5b\x91\xc2\xad\x48\x0d\x2d\xdc\x8a\x14\x6e\x45\xda\xd5\xc2\xad\x48\xe1\x56\xa4\x96\x16\x2a\x20\xf6\x6c\xa1\x02\x62\xdf\x16\x2a\x20\x36\xb5\x50\x01\x71\xb3\x85\x0a\x88\xa1\x02\x62\xa8\x80\x18\x2a\x20\x6e\x0f\x18\x2a\x20\x86\x0a\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\xa8\x80\x18\x6e\x45\xfa\x2c\xaf\x14\x09\xf7\x89\x74\xb4\xcf\xe7\x3e\x91\x70\x2b\x52\xad\xf3\x70\x2b\x52\x60\x61\xe1\x56\xa4\x2f\x8e\x8b\x85\x5b\x91\x76\x74\x1e\x6e\x45\x0a\xb7\x22\x85\x5b\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\xb7\x22\x85\x5b\x91\xc2\xad\x48\xd8\xc2\xad\x48\xe1\x56\xa4\x70\x2b\xd2\xce\x8f\xe1\x5a\x4b\x1a\xe9\x63\xc1\x35\xf0\xc6\x9c\x9b\xbe\xe8\xfc\xb2\xd6\x9b\x39\x5d\x17\x6c\x99\x4b\xa7\xf7\x2f\xdf\x9f\x1e\x93\x88\x6a\x9a\x88\x25\x39\x15\xb1\x35\x2d\xe3\x17\xc5\xcf\x29\x68\x1a\x53\x4d\x0b\xaf\x84\xd1\x8f\x2f\x59\x8c\x4c\x35\x86\x6b\xc2\x52\xba\x04\xc3\xbc\x1a\x27\x91\x2b\x20\x94\x5c\x41\x92\x4c\x2f\xb8\xb8\xe2\xe4\x12\xa4\xaa\xb0\xeb\x4f\x22\x4b\x3f\x11\x05\xf2\xd2\xde\x2c\x04\xd7\x99\x41\x34\xa6\xed\xb9\xef\x67\x52\x1d\xae\x0c\x52\x3f\xb6\x4f\xcf\x30\xa8\xb7\xed\x92\x9e\x62\xed\xb8\x4c\x33\xa7\xa7\x46\xb0\x7f\x6a\x88\x3a\x57\x3e\xa2\x7e\xc1\x12\x98\xce\xa9\x82\xd8\x8f\xab\x0c\xad\x09\x19\xdb\xb9\xe5\x9a\x25\xec\x57\x70\xa7\x09\x50\x9d\xcb\xc6\x3c\x89\x1e\x02\x47\xb7\x21\x64\xea\xe7\xf1\x82\x35\x19\x31\xfa\x18\x2c\x22\x1a\xad\xe0\x05\x6b\x55\xe1\x6b\x48\x75\xec\x3e\xf0\x26\x89\x3d\x91\x59\x39\x68\x9f\xc4\x4c\x22\x13\x5a\x13\xa5\x85\xf4\x90\xcb\x24\x4c\x23\x9a\x44\x79\x82\x2c\xe7\xe8\xf4\xc4\x0e\xda\x7d\x5d\x56\x07\x29\x95\xeb\x1f\x30\x79\xff\x89\x9f\xfe\xee\x39\x6f\xef\x36\x0a\xa0\x68\x8f\xbc\xc9\xb4\x53\x48\x85\x5c\x9f\x53\xb9\x84\x1b\x93\xf0\x9b\x4a\x5f\x9b\x04\xfc\x87\x57\xef\xde\xbc\x7c\xf3\xfa\xe4\xcd\xc9\xb9\xe3\xcb\xde\x19\xb6\x49\xda\x4e\x6d\xb5\x16\x46\xb1\xd0\x6e\x8a\x24\x61\x29\xd3\xc5\x57\x96\x06\x9b\x55\x66\xcb\xb7\x31\x81\x2e\xe7\x9a\xa5\x60\x3d\x5f\x54\x6b\x23\xd2\x18\xfa\x48\x01\x34\xde\xcf\x95\xd2\x0b\x30\xcc\x95\x2c\x73\x2a\x29\xd7\xe0\x8f\x02\xa6\xed\x47\xb1\x20\x4a\x38\x45\x9e\xa9\xd2\x4b\xa6\x40\xdb\xb4\xa1\x53\xd1\xcc\x52\xb0\x87\x15\xbd\xb4\x17\x28\x2d\x84\xe1\xdf\x66\x53\x53\x11\xb3\x05\x8b\xac\x65\x88\xa4\x34\x2e\x52\x5d\x9c\x62\x01\xb2\x38\xfe\xca\x05\xb7\x51\xdf\x26\x98\x81\x5f\x32\x29\x38\x2a\x4c\x97\x54\x32\x3a\x4f\xa0\xf0\xff\x29\xd0\x76\xbc\x72\x41\x9c\xcc\xd7\x1a\x9a\xd9\x92\x1d\xc1\xed\x86\xbb\x79\xab\xb9\xbf\x47\x8d\xfd\x9c\x97\x39\x69\xa5\xb0\x62\xbe\x67\x2e\x59\x21\x06\xc5\x1c\xf3\x93\x10\xe7\x91\x07\x9d\xd0\x99\x64\x56\xfb\xa3\x05\xc6\x38\x66\x4c\x15\x49\x73\x73\x52\x1b\x29\x48\x29\x36\x4f\x60\x62\x64\x1d\xd6\x9c\x4c\x53\xf6\x31\x07\x03\x65\xec\x09\x25\x90\x4b\x30\xf8\x66\xf0\xd8\x8a\xba\x00\x46\x10\x12\x78\x09\x16\xb5\xe2\x8c\x77\x99\x9a\xf3\x38\x72\x0e\xf3\x93\x05\x59\x8b\x5c\xd6\xd8\xff\x8a\x1a\x3c\x46\xea\x6d\x9c\x88\x4b\x80\x43\x1e\x34\x21\x31\x18\xc5\x81\x71\x73\x12\x2d\x85\x88\x8d\xfe\x20\xc5\x35\x4b\x71\x14\x47\x00\xc5\xae\xcd\xd7\x24\x16\xf9\x3c\x29\xd0\xc4\xb0\x7c\x77\x5a\x65\x34\xba\x30\x73\xc0\x8e\xdb\x52\x17\x0f\x74\x9a\x1d\xe0\x5b\xee\xbf\xee\x4b\x35\xfb\x59\x09\x5e\x3a\x9d\x8b\x65\xcd\x7a\xed\x2e\x53\x64\x0e\x4a\x4f\x61\xb1\x10\x52\xff\xcd\xec\x6f\xce\x91\x68\xb8\x28\x00\xe8\x11\x08\x03\x0c\x10\xda\x98\x82\x52\xa7\x7a\x21\x77\x30\x90\x0a\xea\x35\xb1\xc0\xcc\xd0\xbb\xe4\x87\xe4\xff\xec\xfd\xfb\x8f\xbf\x4d\xf7\xbf\xdb\xdb\xfb\xf0\x6c\xfa\xd7\x8f\x7f\xdc\xfb\xf7\x0c\xff\xf1\x74\xff\xbb\xfd\xdf\xfc\x1f\x7f\xdc\xdf\xdf\xdb\xfb\xf0\xc3\x9b\x57\xe7\xa7\x2f\x3f\xb2\xfd\xdf\x3e\xf0\x3c\xbd\xb0\x7f\xfd\xb6\xf7\x01\x5e\x7e\xec\xd9\xc9\xfe\xfe\x77\x7f\x68\x98\x10\xe5\xeb\x77\x8b\x56\x22\xee\x95\xbd\x3b\xed\x73\x1e\xd5\x44\x3a\xc6\xf5\x54\xc8\xa9\xfd\xe0\x90\x68\x99\xef\x16\x65\x8d\xdc\xdb\xe5\x1a\xee\x7b\x1e\xbc\xad\xf4\xb5\xe1\x31\x72\x57\xd8\x39\x73\xa5\x99\x4d\xc1\xd9\x33\x2b\xdd\x2d\xcc\xb6\x7b\xb1\xbf\xf9\x88\x3b\xdb\xd1\x23\xca\xf3\xee\xcb\x27\xca\x47\x3e\x6c\xf4\xbf\x91\x84\x6b\x39\x7e\xdb\x58\x3d\x64\xa4\x61\x26\x98\xce\x2d\xcc\x24\x13\x92\xe9\xf5\x71\x42\x95\x7a\x4b\x53\xb8\xe9\x86\x9c\x2c\x4a\x35\x6c\x62\xe8\xd9\x9c\x3f\xee\x80\x76\xa1\x28\x6e\xc8\x66\x80\x9f\x2c\x50\x0f\xa9\xf4\xe3\x81\xea\xbf\x2d\x08\xd3\x93\xb8\x90\xe4\x57\x90\xc2\x5d\x66\x28\xc1\xea\x32\x8d\x23\xb8\xcf\xda\xf7\xa1\x05\x6c\x0a\xa2\x1c\xc1\x66\xe4\xa3\x6b\xa3\x51\x2c\xd8\xf2\xa6\xa0\x3b\xdb\xd5\x29\x89\x28\x37\x0b\xc5\xeb\x39\x17\xe4\x53\x02\x4b\x1a\xad\x3f\x99\x05\x7f\x92\x60\xa6\x68\x74\xc0\x4f\x56\x39\xa8\x89\xff\x2e\xea\x87\x29\x02\x0c\x6f\x6c\x65\xfc\x67\xab\x30\x7a\xed\xbb\x71\x26\x12\xeb\x0f\x64\x22\x9e\x99\x3d\x98\x6d\xac\x16\x59\x68\xf1\xb0\x10\x25\x3e\x3c\xfd\xb8\xf5\xa6\xb3\x66\x6a\x61\x95\xca\x2a\x71\xc8\x1c\xb9\x7e\x9b\x5c\xe3\x01\x42\x8e\xe2\x94\xa1\x09\x96\xec\x9d\x9e\x1d\xed\xd7\x56\x6e\xa4\x1c\x7b\x0e\xc7\x02\x7c\xdc\x8d\x19\x48\x95\xc6\x54\x3c\x43\x31\xc5\xd1\x92\x30\xe6\x38\xfa\xb9\x18\x00\xa3\x7d\xb5\x25\xad\xd7\x4f\xf6\xec\x88\x7c\x32\x12\x72\xc2\x38\xd8\x3d\xc8\x24\xbb\x64\x09\x2c\xcd\x4c\x2a\x81\x0c\xde\x25\xb3\x7b\x4f\x99\x32\xa7\x54\x1d\xbd\x53\xcc\xd1\xb5\x68\xdd\x82\xb7\xee\xe0\x76\x31\x25\x15\xeb\xde\x13\x85\xd3\xf3\x32\x71\x29\x2f\xd4\xde\x42\x74\xe0\x0b\x21\x23\x73\x9a\xef\x80\xa3\x76\x49\xec\x06\x34\xed\x02\x27\x9a\x7f\x0a\x2d\x92\x2a\x43\x7b\xb5\x0e\xaf\x68\xa5\x52\xc0\x8c\xbc\x33\x48\x78\xc5\x14\x4c\x0a\xa9\x77\x67\x17\x1e\xc3\xaf\x68\xb3\x9c\x58\xe9\xf6\x0c\xff\xb9\xb6\xde\x26\x67\x8e\x41\x74\x47\x39\xaa\x89\x5e\x88\x04\x65\xf8\x06\xe3\xf6\x2b\x16\x5b\xd1\x07\xa4\x14\x72\x66\x53\xf9\xad\x1e\x2c\x92\xb8\xe5\x94\x2c\xd4\x71\x23\xb2\xa0\xb1\xc9\xe2\x17\x47\x0e\xe6\xd0\x66\x37\x98\x1b\x70\xa3\x2e\xaf\x6a\x51\x2c\xa1\x45\x20\x7a\x23\x30\xff\xdf\x16\xd9\x30\xcb\xa0\x73\x91\x6b\x8b\x0f\x96\x7d\x2c\x44\xce\x63\x62\x38\xe3\x21\x59\x69\x9d\xa9\xc3\x83\x83\xf2\xe8\x9e\x31\x71\x10\x8b\x48\x1d\x44\x82\x47\x90\x69\x75\xe0\x09\xf9\x20\x13\xf1\xd4\xff\x31\xa5\x9e\x0e\x0f\xc6\x32\x4e\x42\x80\xe7\x2d\xb7\x79\x4e\x89\x5d\x6d\xcb\x0b\x25\x30\x77\xbe\xa4\x45\xe2\x22\x26\x1b\xcf\xc5\xfa\x1d\xaf\xe5\xfb\xc5\x1d\xb4\x85\xe0\x5f\x61\xa4\x4f\x54\xb5\xeb\xf6\x93\xa3\xcd\xb2\xdc\x61\x4b\xee\x6f\x9a\x3d\xf7\xbc\xd4\x48\xc3\xe5\x2a\x50\x0a\xd2\x9a\xe2\xf5\xb4\x46\x5d\xb2\x4f\x0c\x1b\xe4\x6b\x62\x58\xb5\x76\x77\x25\x5b\x93\x64\x9b\x66\xbf\x32\x72\x13\xd6\xb0\xf8\xa6\x70\xbb\x4d\x60\xb1\x80\x48\x7f\x5b\x31\x13\x15\x55\x18\x0a\xb7\xd6\x37\xfe\x5f\xdf\x36\x9f\xf2\xbd\x3c\x50\xfd\xc2\x4f\xec\x94\xda\x6d\xdf\xc3\x6c\xde\x2f\xb1\xc7\x0d\xf9\xc5\x02\xcf\x0e\x86\xea\x3d\xfa\xa6\x9d\x21\xd5\x7a\x25\x9c\x5c\x98\x24\xb5\x97\x3b\x03\x30\x90\xdf\x54\x0e\x04\x67\x82\x2d\xbd\x81\x40\xde\x0a\x57\xce\x06\x26\xe4\x14\xaf\x0c\x2e\x7f\xc1\x13\xf9\xad\xb0\x85\x6d\x3a\x2a\x95\xf4\x34\xd8\x76\xc6\xef\x0c\x83\xe7\x0f\x65\x38\x8f\x05\x4c\x2d\x9c\xa7\x24\xac\xaa\x1f\xac\x15\xb0\x17\xb0\xee\x84\xaa\x3b\xfc\x5c\x28\x11\xfa\x99\x26\x25\x8e\x7a\xcd\xc0\x46\x4a\xfc\xcd\x55\x3f\x10\xe9\x9c\x71\x3b\x15\x3b\xb0\xdf\x67\x1c\xdb\xef\x07\x8f\xf1\xcf\xee\x49\xf4\x84\x76\xbf\x98\xa2\x61\x20\x7f\x37\x20\x5e\xa8\xf0\x3c\x77\x81\x74\x57\x5c\x50\x25\x18\xe8\xe5\x2f\x39\x4d\x66\xe4\x85\x15\xaf\x11\x78\xf6\xa7\x2e\x72\xb3\x5d\x6c\xf9\xe3\xaf\x58\x12\x47\x54\xc6\xa8\x59\x59\xf6\x43\x94\xb0\x88\x43\xbd\xf4\xd6\xd1\xb7\x67\x80\x25\xf2\xd8\xcb\xbc\x49\x46\xa5\x66\x51\x9e\x50\x69\x18\x3e\x2c\x85\xec\x88\x47\xef\xb9\x99\x25\x36\x9f\x41\x24\x78\xdc\xe1\x39\x1c\xb6\xab\xe7\x9b\x9d\x57\xb7\x17\xe5\x36\x90\xcc\x55\x54\x61\x29\x6c\x92\xd7\x5e\x4d\x2b\xee\x18\x4b\x2c\x3c\xb3\x2b\x78\xcb\xc4\x0a\x57\x46\x8c\xab\x16\x7e\x62\xca\x47\xfb\xef\x57\x0e\x9c\x82\xda\x67\xe4\x1f\x6b\xaf\x73\x75\x85\x20\x31\xed\xfd\x50\x68\xc6\x71\xf3\x75\xa4\xe8\x76\xb2\x64\x23\x0b\x21\xe1\x12\x24\xd9\x8b\x05\x7e\x83\x05\x9c\xf6\x67\xe4\x5f\x46\x19\x6c\x73\xc3\xd8\xc6\x61\x69\x4b\x00\x39\xc2\x2e\x92\x30\x24\xa0\xdd\x9e\x2a\xf2\x8c\xec\xd9\xaa\x50\x2c\x4d\x21\x66\x54\x43\xb2\xde\xf7\xd2\xb7\x35\xab\xf5\xc1\x9a\x3e\xc5\xd2\x2a\x45\xd2\xbe\xfe\x73\xcb\x9b\x38\xd9\xdb\x44\xaa\x9f\xbc\xb9\xb9\x04\xac\x95\xa4\x37\xb0\xa7\xf0\x62\x76\x06\x29\x34\x46\xa4\x4d\x4a\x5e\x53\x11\x75\x3d\x6f\x2e\x70\xeb\x67\x83\xa0\x94\x48\x58\x22\x7d\x5a\x9a\xbb\x01\x75\xb2\x68\x77\xb9\xb7\x0e\x21\xa4\xdd\x23\x35\x25\x46\x17\xfc\xfa\xcf\x31\xd5\xb4\xe1\x05\x8b\x32\xeb\x6c\x17\xa9\x75\xc9\x36\x65\xe7\x4d\x7b\xdd\xc3\xf5\xe2\x86\x1f\xd5\x03\x2a\x35\xbb\xbe\xec\x83\x5d\x27\x68\x9b\xb6\xb1\x92\x1e\x0d\xa6\x12\x96\x4c\x69\xb9\xae\x38\x20\x9c\x0b\x53\x10\xc6\x95\xa6\x5c\x33\x64\xd5\xc4\xbf\x39\x75\xc6\xf7\x2b\xa6\x1b\xc2\x00\xdf\x19\xdd\x1d\x4d\xbb\x98\x89\x63\x8d\x1f\xe7\xeb\x0c\xc8\xdf\x2b\x7f\xbc\x92\x59\xb4\xfb\xfb\x93\x05\x71\x0c\xd4\xe2\x26\x8d\x63\x09\x6a\x9b\xb3\xed\xfa\xba\x15\x7c\xde\x58\x35\x16\x82\xa7\xde\xd8\xe5\x6a\x04\x2a\xc5\x96\x46\x49\xf1\xf5\x21\xbd\x2f\xa7\xa6\xac\x98\x5f\xdd\xc0\xd6\x33\x0b\x69\x71\x62\x32\xed\xd5\xc1\x48\x70\x95\xa7\xa5\x15\x21\x86\x0c\x78\x0c\x3c\x5a\x63\x49\xa8\xe4\x12\x1a\xc2\x78\x7e\x54\x0d\x28\x41\xc8\xff\x62\x4b\xa3\x76\xbb\xc9\x55\x25\x67\xef\x9d\xde\x98\x29\x53\x06\xf0\x0b\x90\x46\xf9\xc7\xcc\x1d\x23\xf4\xfa\x1e\x2a\x5e\x48\x57\xa3\xca\x07\x95\x6e\x4e\x16\x0b\x05\xee\x9e\xee\x79\x51\xdd\xd2\xfb\x2b\x3c\x4c\x2d\x07\x32\xe0\x58\x0a\xeb\xcd\xcf\x84\x62\xbe\x1c\x5c\x71\x2e\xd4\x2a\x64\x8a\x85\xad\x5f\xd9\x3c\x56\x3d\xcb\x0d\x03\xb1\x37\x16\x8d\xb6\xb7\x9c\xdb\xcd\x84\xaa\x45\xd3\xf3\xc2\x86\x1a\x9c\xe7\xdb\x5b\x5d\x44\xd1\x60\x6a\x5c\x7d\x69\xe5\x59\x26\x29\xbf\x80\x98\x24\x70\xcd\x22\xb1\x94\x34\x5b\xb1\x08\x8b\x1d\x5a\x57\xaf\xd1\x18\xb5\x0d\xa1\x6a\xc6\xf0\xa6\xd3\x2b\xcb\xe7\x09\x53\xab\xdd\x4e\xc3\x56\xe2\x50\x10\x49\xd0\x3b\x39\x5f\x1f\xda\x38\xb3\x9f\x97\xc2\x8f\x0f\x78\x77\xfd\xba\x7c\x11\x8b\xed\x3e\xb1\x94\x46\x91\x21\x6c\xef\x00\x05\x27\x09\x56\x88\xa8\x81\x43\x68\xef\x67\x32\xbd\x5c\x00\x64\x16\x9f\x31\x50\x4d\xa5\x68\x5b\x54\x8c\x47\x80\xc5\x1b\x5d\x11\x4e\x00\xef\x03\xd0\x92\x81\x95\x60\x01\xbd\x7e\x7e\x17\x81\xeb\xdd\x12\x67\xbb\x11\xa1\xc5\x80\xd0\x0e\xf1\x82\x17\x76\x02\xbd\xc2\x43\xbd\x50\x60\xfe\x6d\xc0\x8b\x4f\x86\x6e\xb6\xad\xd5\x79\x66\x43\xc1\x47\xf3\xc3\x1f\x6b\xbd\xb8\x18\x2e\x45\x56\xe2\xca\x0d\xb0\xc9\x31\x9c\x55\xce\xa3\x41\xcc\x54\x64\xd8\x4c\x83\xe1\xe8\x58\x70\xe5\x6b\x73\x52\x6e\xcb\x69\x5e\xd2\xc4\x25\xc8\xba\xc1\x32\x91\xa0\x1f\x34\xce\xbd\xbe\x6a\x53\x8f\x20\x9d\x43\x1c\x43\xec\xe3\xdd\xd7\xa4\xe1\xd0\xef\x10\x38\xba\x64\x02\x7f\x2c\x9e\x8a\x24\x69\x3f\xd3\x5b\x0d\x2b\x7d\xcc\x2a\x1e\x00\xbd\xe3\x4c\x3a\xc4\xcc\x13\x0f\x50\xa6\x0a\x8a\x2c\x1d\xd1\x88\x64\x46\x61\x29\xe0\x3e\x07\x7d\x05\xc0\x49\xb4\x82\xe8\x42\x95\x31\x76\xda\xd0\xe1\xc6\x46\xbb\x18\xaa\x76\x01\xb1\xca\x41\x0b\xc1\xd4\x6c\xa8\x4b\x72\x07\xc2\x8c\x5a\xc8\xe1\x6a\x33\x26\x6b\xfb\xe0\xa2\x97\x94\x25\x74\x9e\x74\x28\xcc\x27\x8b\xf2\xcd\x49\x75\xfe\xcc\x4b\x47\x59\x9e\x24\xce\x2b\x8d\x51\x2a\x5a\xd2\xc5\x82\x45\x18\xa4\x88\x51\x3a\x65\x54\xef\xce\xa5\x8f\x8a\xcc\x51\x9a\xea\x7c\x6b\xeb\x5b\xf0\xa6\x0d\x5f\x8c\x16\xca\x1a\xed\xad\x7d\x30\xe4\x7d\x5d\x83\x35\xb3\x03\xab\xa2\xd7\x1c\x5a\x33\xf2\x56\x68\x17\xed\xf6\x06\x94\x72\x91\x76\xe4\x3d\x50\x25\x78\xe5\x28\x40\xcd\x43\xb2\x25\xe3\x74\x77\x95\x02\xbb\xfe\xaa\xc5\xbc\x50\x34\xe9\x1a\x8b\x17\xb3\xa5\xa4\xba\xe0\xe0\xe5\x12\xdd\xa1\xe9\xc4\x82\x45\x8e\x11\x6f\xe4\x88\xaf\x11\x6d\x5c\x08\xdc\x6e\x9b\x2a\xe3\x5a\x8a\x38\x8f\xc0\x95\x69\xce\x55\xb5\xe3\x5b\x3d\x07\xea\xe1\x5f\x7e\x8c\x32\x9d\x20\x06\x4d\x99\xf3\x57\x0b\x0e\x84\xaa\xcc\x68\xf9\x1e\xdb\x73\x29\xf1\x44\xf5\xfb\x80\x87\xdd\xd1\xe9\x09\x79\x0f\x6d\x48\xd7\xc9\x77\xba\xe2\xfb\xa6\x24\xa1\x4a\x9f\x4b\xca\x15\x4e\xf8\x9c\xa5\x4d\x26\x0a\xa3\x59\x21\x06\x34\x3e\x97\x88\x15\x8d\x8f\x2d\x0a\x34\x3e\x6e\xe0\xde\x7d\x38\xe7\xf6\x1a\x6e\xc3\xda\xbf\xdd\x6b\x99\x1e\x69\xe4\x12\x6f\xeb\x29\x30\xca\x70\x12\xf7\x36\xb8\x52\xd6\x66\xab\x1d\xea\x63\xae\x0b\xaa\xdb\x6d\x0c\x04\x03\x6d\x4a\x2d\xfd\xca\xfb\x06\x73\x1e\x83\x4c\xd0\xe7\x56\x8e\x17\xad\x8c\x90\x1c\xcf\x9c\xf2\x4f\x0b\x3b\x0e\x86\xb9\x3a\xcf\x62\xe9\x34\xb0\x01\x73\xbe\x47\x83\x5d\xae\x86\xb8\xed\x06\x99\x6c\x14\x41\xa6\xdb\xb9\x6c\x2f\x9b\x9c\x37\xac\x18\x21\x61\xaa\x9b\xb1\xca\xe1\xd4\x6d\xec\x97\xeb\xca\xc6\xa4\xac\xf2\x94\x1a\x06\x45\x63\x0c\x90\x2b\x9e\x59\x1d\xc9\xea\x34\x96\x22\xad\xe3\xce\x3a\x5e\xfc\xf6\x75\xee\x90\x63\x5a\xb4\x48\xb5\xef\xb0\x96\xf4\x82\x59\x4a\xaf\x5f\x03\x5f\xea\xd5\x21\xf9\xd3\x57\xff\xf3\xeb\xbf\x34\xbc\x28\xe6\x36\xa6\xed\x15\x70\x67\x25\xba\x0d\xe8\x6d\xf7\xba\x69\xe6\x9c\xf9\x50\xec\xd9\xb2\x7c\xa7\x70\x28\x94\x58\x89\x4e\x68\xd0\x8e\x6f\xe7\x59\x3b\x38\xbf\xc7\x64\x02\xa5\x29\x8f\x60\x62\xc4\x81\x9d\xc3\x18\x55\xd6\xf2\xc8\x64\x4d\x9e\x7f\x35\xc1\x10\x4f\x9c\x94\xa5\xae\x59\xc9\xd6\x3f\x5c\x7f\x9c\xed\x58\x0c\x53\xe4\xaf\x93\x8d\x99\x32\x45\xcc\xde\x8b\x05\xa2\x69\xcb\x24\x51\xed\x93\x60\x79\xb6\x37\x02\x6c\xf3\x6c\x28\x56\xd2\x85\x09\x5d\xb6\xc9\x7e\x76\xc9\x94\x71\x96\xe6\xe9\x21\x79\xd6\xf0\x8a\xe5\xc8\xb7\x81\x1e\xb6\xa7\xf2\x3c\xa3\x86\x2d\x2f\x25\x4d\x53\xcc\xb8\x62\x31\x70\xcd\x16\x0c\x63\x5e\x0a\x12\x43\x3d\xde\x7e\xe8\xe3\xb4\x0a\xe0\x63\x08\x97\x61\xa3\xbd\x88\xee\xd4\x9e\xe3\x12\x85\x52\xe7\xb5\x8b\xaa\x9c\x77\x9d\x81\xa5\x4a\xab\x36\x10\xb8\xce\xac\x24\x57\xf1\x1f\xa5\x40\x39\xe3\x4b\x55\x46\x5b\x22\xff\x6b\x33\x8f\x9b\xcf\xae\x56\xe0\xa2\x1b\xa0\xea\x1d\xf4\xa5\x82\x8c\x28\x59\x06\x19\x63\xe0\x79\x3b\xfb\xd8\xb6\xc5\x1a\xa9\x2b\x85\xe4\x98\x2a\xe8\x61\x77\xad\xc4\x62\xfa\x6b\x15\x8a\xe4\xe0\x5b\x63\x40\xcf\x9f\x7d\xd5\x8a\x77\xc5\x7b\x8d\x2f\x95\x51\x9a\x1f\x8e\xa6\xff\xa2\xd3\x5f\x3f\xee\xb9\x7f\x3c\x9b\xfe\xf5\xff\x4e\x0e\x3f\x3e\xad\xfc\xf9\xb1\x39\xb8\x72\xb7\xe4\x5c\xb6\x1a\x0e\xbb\xb3\xd6\x8b\x55\x1e\x3f\x26\x3e\x98\xeb\x5c\xe6\x30\x21\xdf\xd3\x44\xc1\x84\xfc\xc8\xf1\x9c\xbc\x21\xd0\xda\xa3\x2b\x8c\x64\xf3\xd8\x8c\xfa\xb8\xfd\x15\x9c\x52\xfb\x3b\x6e\xba\x6d\x2a\x68\x3f\x20\x79\xcb\x42\x85\x11\xf2\x0a\x06\xda\xec\xae\x85\x10\x33\xb8\xa6\x69\x96\xc0\x2c\x12\xe9\x41\xf1\xfc\x16\x0f\xb9\xe7\x5f\xf7\xc0\x9e\xbd\x0f\x16\x47\x3e\xee\x7d\x98\xba\x7f\x3d\xf5\x3f\xed\x7f\xb7\xf7\xef\x59\xeb\xf3\xfd\xa7\x07\x18\xda\x5b\xa0\xda\xc7\x0f\xd3\x12\xed\x66\x1f\x9f\xee\x7f\x57\x79\xb6\xbf\x0b\x09\xb7\x93\xa8\x52\x9a\x4d\x2f\x1a\x2b\xc6\x35\x8a\xb2\x4d\xd9\x58\x29\xcd\x76\xa9\x78\x0b\xb6\x7c\x43\xb3\xf7\xb0\x00\x09\x3c\xea\x36\x21\x1d\x6f\x7d\x42\xf6\x62\x73\x84\x63\x0e\xde\xbe\x17\x5e\x65\xf1\xd4\x1d\x64\xc5\x77\x9e\xbb\x17\x17\x1e\x6d\xc6\xe4\xd4\x22\xdd\x26\xa5\x28\xb9\x43\x59\x2f\x7b\xbd\x7d\x17\x10\xa7\x0d\xe2\xe4\xb4\x8c\xba\x1b\x61\xe8\x31\xc7\x91\x35\x78\xb5\x69\x10\x3d\x90\xbc\x9f\xec\xcb\x5b\x42\x7f\x3b\x07\x29\xd6\x39\xba\x07\x7f\x0f\xc5\x4f\xd6\xee\x32\xba\x9f\x9c\x35\x2a\x97\x7d\xa5\x8b\x1f\x4f\x5e\x58\x9c\x41\xc6\x84\x12\xe5\x4a\x24\xb1\x22\x39\x67\xbf\xe4\x40\x4e\x5e\x14\xd5\x87\x18\x8f\x92\x1c\xef\xed\xf9\xf1\xc7\x93\x17\x6a\x46\xc8\x3f\x20\xa2\x46\xaf\xbf\x6a\x09\xe1\xc4\x52\x7b\xef\xde\xbe\xfe\xdf\x68\x01\xc0\x2f\xdd\xb5\x19\xae\xb0\x48\xc2\xa8\xb5\x48\xd9\xc3\xd7\xf4\x6a\xa3\x1b\x71\x46\x11\xcd\x9a\x6d\x0c\xc4\xd9\xed\xb8\x0d\xd2\x5d\x41\x92\x29\x4c\x3e\x22\x2a\x97\x6e\x35\x66\x40\x9b\x05\x81\x69\xe8\xce\x71\xee\xf3\xa9\x30\x5f\x6d\x54\x5c\x74\x24\x38\x87\x08\x23\x13\x8c\x10\xda\x87\x43\x54\xdf\xdf\x14\xf0\x77\x4a\xb4\x9b\x01\xce\xe5\x98\x9e\x7f\x78\x03\xe9\xed\x13\xba\xa1\xc8\x77\x4e\x94\xc7\x19\x8f\xa0\x6a\xe7\x5b\x1c\x8d\xdf\x66\x0e\x0e\x6e\x77\xce\x12\xb6\xd6\x3b\x6a\x44\x6b\xb4\x44\x67\xf0\xfb\x0e\xdb\x75\x3d\x2c\x73\xcb\xb2\xb1\x91\xdb\x8a\x06\xd4\xc2\x9f\xbc\xa2\x8a\xcc\x01\x38\xda\x73\xad\xdd\x0e\xb8\xc3\x79\x28\xad\xad\x79\x36\xd5\x62\xda\xa0\x5f\x75\x40\xae\x1b\x6a\x2d\xe6\x83\xda\xda\x8e\x06\x1b\x04\xae\x56\xeb\x5d\x30\x50\xe5\xad\x3d\x5e\x7a\x1a\xec\xa5\x6e\xd6\xca\x6a\x73\x76\x46\xd6\xe2\xd8\xc6\xbf\xb6\xa7\x64\xd4\xed\x9a\xe1\x49\x0b\x74\x2f\xd6\xa8\x79\xc4\x1c\xed\x36\x9f\x81\xbc\x64\x3d\x84\x8f\xf7\xf5\xf7\x7b\xb1\x96\x57\xef\x4f\x8f\x31\x3f\xcf\x7c\xe0\xfd\x13\x88\xfd\x55\xa9\xe2\xf6\x3d\x3a\x91\x0d\x35\x3a\xba\x7b\x82\xce\x84\x1c\x3f\x48\x26\x85\x16\x91\xe8\x70\x3a\xb5\xa6\xcc\x20\x68\xdb\x72\x8c\x86\xf4\x31\x54\xde\xb0\x7c\xac\x96\x95\xa6\xb4\x90\x86\x5c\x6b\xbf\xe5\xf3\xe2\x4e\xac\xb2\x77\xa7\xf5\x91\xff\xfc\xf7\xd1\xff\x0b\x00\x00\xff\xff\xbd\xa3\xb8\x4f\x69\x56\x01\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x7b\xbc\x0b\x49\xe5\x73\x2d\x69\xa4\x07\x5d\x88\xe4\x1d\x8e\xe1\x4a\xa4\xad\x16\xae\x44\x0a\x57\x22\x85\x2b\x91\xc2\x95\x48\xa1\x94\x5f\x28\xe5\x57\x6d\x9f\x8d\x1f\x8f\x84\x52\x7e\x03\x3f\x0d\xa5\xfc\xba\x5a\x28\xe5\x17\x4a\xf9\x35\x8d\x1e\x4a\xf9\x85\x52\x7e\xc3\x06\x0e\xa5\xfc\x48\x28\xe5\x17\x4a\xf9\x7d\xc1\xa5\xfc\xc2\x95\x48\x5f\xc4\xbd\x20\xe1\x52\x90\x01\x63\x7f\x5e\x97\x82\x84\x2b\x91\x5a\x07\x09\x57\x22\x05\xd6\x17\xae\x44\xfa\xdd\x72\xbf\x70\x25\x52\x8f\x41\xc2\x95\x48\xe1\x4a\xa4\xd6\x16\xae\x44\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\x2b\x91\xc2\x95\x48\xe1\x4a\xa4\x62\xe4\x70\x25\x52\xb8\x12\x09\x5b\xb8\x12\xa9\xc7\x08\xe1\x4a\xa4\x2f\xf5\x4a\xa4\x5a\x5a\xd0\x97\x7b\x2f\xd2\xf0\x65\x84\xcb\x91\xc2\xe5\x48\x0d\x2d\x5c\x8e\x14\x2e\x47\xda\xd5\xc2\xe5\x48\xe1\x72\xa4\x96\x16\x0a\x21\xf6\x6c\xa1\x10\x62\xdf\x16\x0a\x21\x36\xb5\x50\x08\x71\xb3\x85\x42\x88\xa1\x10\x62\x28\x84\x18\x0a\x21\x6e\x0f\x18\x0a\x21\x86\x42\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\x28\x84\x18\x2e\x47\xfa\x2c\x6f\x16\x09\xd7\x8a\x74\xb4\xcf\xe7\x5a\x91\x70\x39\x52\xad\xf3\x70\x39\x52\x60\x61\xe1\x72\xa4\x2f\x8e\x8b\x85\xcb\x91\x76\x74\x1e\x2e\x47\x0a\x97\x23\x85\xcb\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\x97\x23\x85\xcb\x91\xc2\xe5\x48\xd8\xc2\xe5\x48\xe1\x72\xa4\x70\x39\xd2\xce\x8f\xe1\x1a\x2f\x37\x39\x16\x5c\x03\x6f\xcc\xb9\xe9\x8b\xce\x2f\x6b\xbd\x99\xd3\x75\xc1\x96\xb9\x74\x7a\xff\xf2\xfd\xe9\x31\x89\xa8\xa6\x89\x58\x92\x53\x11\x5b\xd3\x32\x7e\x51\xfc\x9c\x82\xa6\x31\xd5\xb4\xbc\x41\x25\x93\xe2\x92\xc5\xc8\x54\x63\xb8\x26\x2c\xa5\x4b\x30\xcc\xab\x71\x12\xb9\x02\x42\xc9\x15\x24\xc9\xf4\x82\x8b\x2b\x4e\x2e\x41\xaa\x0a\xbb\xfe\x24\xb2\xf4\x13\x51\x20\x2f\xed\x05\x43\x70\x9d\x19\x44\x63\xda\x9e\xfb\x7e\x26\xd5\xe1\xca\x20\xf5\x63\xfb\xf4\x0c\x83\x7a\xdb\xee\xea\x29\xd6\x8e\xcb\x34\x73\x7a\x6a\x04\xfb\xa7\x86\xa8\x73\xe5\x23\xea\x17\x2c\x81\xe9\x9c\x2a\x88\xfd\xb8\xca\xd0\x9a\x90\xb1\x9d\x5b\xae\x59\xc2\x7e\x05\x77\x9a\x00\xd5\xb9\x6c\xcc\x93\xe8\x21\x70\x74\x1b\x42\xa6\x7e\x1e\x2f\x58\x93\x11\xa3\x8f\xc1\x22\xa2\xd1\x0a\x5e\xb0\x56\x15\xbe\x86\x54\xc7\xee\x03\x6f\x92\xd8\x13\x99\x95\x83\xf6\x49\xcc\x24\x32\xa1\x35\x51\x5a\x48\x0f\xb9\x4c\xc2\x34\xa2\x49\x94\x27\xc8\x72\x8e\x4e\x4f\xec\xa0\xdd\xb7\x66\x75\x90\x52\xb9\xfe\x01\x93\xf7\x9f\xf8\xe9\xef\x9e\xf3\xf6\x6e\xa3\x00\x8a\xf6\xc8\x9b\x4c\x3b\x85\x54\xc8\xf5\x39\x95\x4b\xb8\x31\x09\xbf\xa9\xf4\xb5\x49\xc0\x7f\x78\xf5\xee\xcd\xcb\x37\xaf\x4f\xde\x9c\x9c\x3b\xbe\xec\x9d\x61\x9b\xa4\xed\xd4\x56\x6b\x61\x14\x0b\xed\xa6\x48\x12\x96\x32\x5d\x7c\x65\x69\xb0\x59\x65\xb6\x7c\x1b\x13\xe8\x72\xae\x59\x0a\xd6\xf3\x45\xb5\x36\x22\x8d\xa1\x8f\x14\x40\xe3\x35\x5d\x29\xbd\x00\xc3\x5c\xc9\x32\xa7\x92\x72\x0d\xfe\x28\x60\xda\x7e\x14\x0b\xa2\x84\x53\xe4\x99\x2a\xbd\x64\x0a\xb4\x4d\x1b\x3a\x15\xcd\x2c\x05\x7b\x58\xd1\x4b\x7b\x81\xd2\x42\x18\xfe\x6d\x36\x35\x15\x31\x5b\xb0\xc8\x5a\x86\x48\x4a\xe3\x22\xd5\xc5\x29\x16\x20\x8b\xe3\xaf\x5c\x70\x1b\xf5\x6d\x82\x19\xf8\x25\x93\x82\xa3\xc2\x74\x49\x25\xa3\xf3\x04\x0a\xff\x9f\x02\x6d\xc7\x2b\x17\xc4\xc9\x7c\xad\xa1\x99\x2d\xd9\x11\xdc\x6e\xb8\x0b\xb8\x9a\xfb\x7b\xd4\xd8\xcf\x79\x99\x93\x56\x0a\x2b\xe6\x7b\xe6\x92\x15\x62\x50\xcc\x31\x3f\x09\x71\x1e\x79\xd0\x09\x9d\x49\x66\xb5\x3f\x5a\x60\x8c\x63\xc6\x54\x91\x34\x37\x27\xb5\x91\x82\x94\x62\xf3\x04\x26\x46\xd6\x61\xcd\xc9\x34\x65\x1f\x73\x30\x50\xc6\x9e\x50\x02\xb9\x04\x83\x6f\x06\x8f\xad\xa8\x0b\x60\x04\x21\x81\x97\x60\x51\x2b\xce\x78\x97\xa9\x39\x8f\x23\xe7\x30\x3f\x59\x90\xb5\xc8\x65\x8d\xfd\xaf\xa8\xc1\x63\xa4\xde\xc6\x89\xb8\x04\x38\xe4\x41\x13\x12\x83\x51\x1c\x18\x37\x27\xd1\x52\x88\xd8\xe8\x0f\x52\x5c\xb3\x14\x47\x71\x04\x50\xec\xda\x7c\x4d\x62\x91\xcf\x93\x02\x4d\x0c\xcb\x77\xa7\x55\x46\xa3\x0b\x33\x07\xec\xb8\x2d\x75\xf1\x40\xa7\xd9\x01\xbe\xe5\xfe\xeb\xbe\x54\xb3\x9f\x95\xe0\xa5\xd3\xb9\x58\xd6\xac\xd7\xee\x32\x45\xe6\xa0\xf4\x14\x16\x0b\x21\xf5\xdf\xcc\xfe\xe6\x1c\x89\x86\x8b\x02\x80\x1e\x81\x30\xc0\x00\xa1\x8d\x29\x28\x75\xaa\x17\x72\x07\x03\xa9\xa0\x5e\x13\x0b\xcc\x0c\xbd\x4b\x7e\x48\xfe\xcf\xde\xbf\xff\xf8\xdb\x74\xff\xbb\xbd\xbd\x0f\xcf\xa6\x7f\xfd\xf8\xc7\xbd\x7f\xcf\xf0\x1f\x4f\xf7\xbf\xdb\xff\xcd\xff\xf1\xc7\xfd\xfd\xbd\xbd\x0f\x3f\xbc\x79\x75\x7e\xfa\xf2\x23\xdb\xff\xed\x03\xcf\xd3\x0b\xfb\xd7\x6f\x7b\x1f\xe0\xe5\xc7\x9e\x9d\xec\xef\x7f\xf7\x87\x86\x09\x51\xbe\x7e\xb7\x68\x25\xe2\x5e\xd9\xbb\xd3\x3e\xe7\x51\x4d\xa4\x63\x5c\x4f\x85\x9c\xda\x0f\x0e\x89\x96\xf9\x6e\x51\xd6\xc8\xbd\x5d\xae\xe1\xbe\xe7\xc1\xdb\x4a\x5f\x1b\x1e\x23\x77\x85\x9d\x33\x57\x9a\xd9\x14\x9c\x3d\xb3\xd2\xdd\xc2\x6c\xbb\x17\xfb\x9b\x8f\xb8\xb3\x1d\x3d\xa2\x3c\xef\xbe\x7c\xa2\x7c\xe4\xc3\x46\xff\x1b\x49\xb8\x96\xe3\xb7\x8d\xd5\x43\x46\x1a\x66\x82\xe9\xdc\xc2\x4c\x32\x21\x99\x5e\x1f\x27\x54\xa9\xb7\x34\x85\x9b\x6e\xc8\xc9\xa2\x54\xc3\x26\x86\x9e\xcd\xf9\xe3\x0e\x68\x17\x8a\xe2\x86\x6c\x06\xf8\xc9\x02\xf5\x90\x4a\x3f\x1e\xa8\xfe\xdb\x82\x30\x3d\x89\x0b\x49\x7e\x05\x29\xdc\x65\x86\x12\xac\x2e\xd3\x38\x82\xfb\xac\x7d\x1f\x5a\xc0\xa6\x20\xca\x11\x6c\x46\x3e\xba\x36\x1a\xc5\x82\x2d\x6f\x0a\xba\xb3\x5d\x9d\x92\x88\x72\xb3\x50\xbc\xa5\x73\x41\x3e\x25\xb0\xa4\xd1\xfa\x93\x59\xf0\x27\x09\x66\x8a\x46\x07\xfc\x64\x95\x83\x9a\xf8\xef\xa2\x7e\x98\x22\xc0\xf0\xe2\x56\xc6\x7f\xb6\x0a\xa3\xd7\xbe\x1b\x67\x22\xb1\xfe\x40\x26\xe2\x99\xd9\x83\xd9\xc6\x6a\x91\x85\x16\x0f\x0b\x51\xe2\xc3\xd3\x8f\x5b\x6f\x3a\x6b\xa6\x16\x56\xa9\xac\x12\x87\xcc\x91\xeb\xb7\xc9\x35\x1e\x20\xe4\x28\x4e\x19\x9a\x60\xc9\xde\xe9\xd9\xd1\x7e\x6d\xe5\x46\xca\xb1\xe7\x70\x2c\xc0\xc7\xdd\x98\x81\x54\x69\x4c\xc5\x33\x14\x53\x1c\x2d\x09\x63\x8e\xa3\x9f\x8b\x01\x30\xda\x57\x5b\xd2\x7a\xfd\x64\xcf\x8e\xc8\x27\x23\x21\x27\x8c\x83\xdd\x83\x4c\xb2\x4b\x96\xc0\xd2\xcc\xa4\x12\xc8\xe0\x5d\x32\xbb\xf7\x94\x29\x73\x4a\xd5\xd1\x3b\xc5\x1c\x5d\x8b\xd6\x2d\x78\xeb\x0e\x6e\x17\x53\x52\xb1\xee\x3d\x51\x38\x3d\x2f\x13\x97\xf2\x42\xed\x2d\x44\x07\xbe\x10\x32\x32\xa7\xf9\x0e\x38\x6a\x97\xc4\x6e\x40\xd3\x2e\x70\xa2\xf9\xa7\xd0\x22\xa9\x32\xb4\x57\xeb\xf0\x8a\x56\x2a\x05\xcc\xc8\x3b\x83\x84\x57\x4c\xc1\xa4\x90\x7a\x77\x76\xe1\x31\xfc\x8a\x36\xcb\x89\x95\x6e\xcf\xf0\x9f\x6b\xeb\x6d\x72\xe6\x18\x44\x77\x94\xa3\x9a\xe8\x85\x48\x50\x86\x6f\x30\x6e\xbf\x62\xb1\x15\x7d\x40\x4a\x21\x67\x36\x95\xdf\xea\xc1\x22\x89\x5b\x4e\xc9\x42\x1d\x37\x22\x0b\x1a\x9b\x2c\x7e\x71\xe4\x60\x0e\x6d\x76\x83\xb9\x01\x37\xea\xf2\xaa\x16\xc5\x12\x5a\x04\xa2\x37\x02\xf3\xff\x6d\x91\x0d\xb3\x0c\x3a\x17\xb9\xb6\xf8\x60\xd9\xc7\x42\xe4\x3c\x26\x86\x33\x1e\x92\x95\xd6\x99\x3a\x3c\x38\x28\x8f\xee\x19\x13\x07\xb1\x88\xd4\x41\x24\x78\x04\x99\x56\x07\x9e\x90\x0f\x32\x11\x4f\xfd\x1f\x53\xea\xe9\xf0\x60\x2c\xe3\x24\x04\x78\xde\x72\x9b\xe7\x94\xd8\xd5\xb6\xbc\x50\x02\x73\xe7\x4b\x5a\x24\x2e\x62\xb2\xf1\x5c\xac\xdf\xf1\x5a\xbe\x5f\xdc\x41\x5b\x08\xfe\x15\x46\xfa\x44\x55\xbb\x6e\x3f\x39\xda\x2c\xcb\x1d\xb6\xe4\xfe\xa6\xd9\x73\xcf\x4b\x8d\x34\x5c\xae\x02\xa5\x20\xad\x29\x5e\x4f\x6b\xd4\x25\xfb\xc4\xb0\x41\xbe\x26\x86\x55\x6b\x77\x65\xb2\x35\x49\xb6\x69\xf6\x2b\x23\x37\x61\x0d\x8b\x6f\x0a\xb7\xdb\x04\x16\x0b\x88\xf4\xb7\x15\x33\x51\x51\x85\xa1\x70\x6b\x7d\xe3\xff\xf5\x6d\xf3\x29\xdf\xcb\x03\xd5\x2f\xfc\xc4\x4e\xa9\xdd\xf6\x3d\xcc\xe6\xfd\x12\x7b\xdc\x90\x5f\x2c\xf0\xec\x60\xa8\xde\xa3\x6f\xda\x19\x52\xad\x57\xc2\xc9\x85\x49\x52\x7b\xb9\x33\x00\x03\xf9\x4d\xe5\x40\x70\x26\xd8\xd2\x1b\x08\xe4\xad\x70\xe5\x6c\x60\x42\x4e\xf1\xca\xe0\xf2\x17\x3c\x91\xdf\x0a\x5b\xd8\xa6\xa3\x52\x49\x4f\x83\x6d\x67\xfc\xce\x30\x78\xfe\x50\x86\xf3\x58\xc0\xd4\xc2\x79\x4a\xc2\xaa\xfa\xc1\x5a\x01\x7b\x01\xeb\x4e\xa8\xba\xc3\xcf\x85\x12\xa1\x9f\x69\x52\xe2\xa8\xd7\x0c\x6c\xa4\xc4\xdf\x5c\xf5\x03\x91\xce\x19\xb7\x53\xb1\x03\xfb\x7d\xc6\xb1\xfd\x7e\xf0\x18\xff\xec\x9e\x44\x4f\x68\xf7\x8b\x29\x1a\x06\xf2\x77\x03\xe2\x85\x0a\xcf\x73\x17\x48\x77\xc5\x05\x55\x82\x81\x5e\xfe\x92\xd3\x64\x46\x5e\x58\xf1\x1a\x81\x67\x7f\xea\x22\x37\xdb\xc5\x96\x3f\xfe\x8a\x25\x71\x44\x65\x8c\x9a\x95\x65\x3f\x44\x09\x8b\x38\xd4\x4b\x6f\x1d\x7d\x7b\x06\x58\x22\x8f\xbd\xcc\x9b\x64\x54\x6a\x16\xe5\x09\x95\x86\xe1\xc3\x52\xc8\x8e\x78\xf4\x9e\x9b\x59\x62\xf3\x19\x44\x82\xc7\x1d\x9e\xc3\x61\xbb\x7a\xbe\xd9\x79\x75\x7b\x51\x6e\x03\xc9\x5c\x45\x15\x96\xc2\x26\x79\xed\xd5\xb4\xe2\x8e\xb1\xc4\xc2\x33\xbb\x82\xb7\x4c\xac\x70\x65\xc4\xb8\x6a\xe1\x27\xa6\x7c\xb4\xff\x7e\xe5\xc0\x29\xa8\x7d\x46\xfe\xb1\xf6\x3a\x57\x57\x08\x12\xd3\xde\x0f\x85\x66\x1c\x37\x5f\x47\x8a\x6e\x27\x4b\x36\xb2\x10\x12\x2e\x41\x92\xbd\x58\xe0\x37\x58\xc0\x69\x7f\x46\xfe\x65\x94\xc1\x36\x37\x8c\x6d\x1c\x96\xb6\x04\x90\x23\xec\x22\x09\x43\x02\xda\xed\xa9\x22\xcf\xc8\x9e\xad\x0a\xc5\xd2\x14\x62\x46\x35\x24\xeb\x7d\x2f\x7d\x5b\xb3\x5a\x1f\xac\xe9\x53\x2c\xad\x52\x24\xed\xeb\x3f\xb7\xbc\x89\x93\xbd\x4d\xa4\xfa\xc9\x9b\x9b\x4b\xc0\x5a\x49\x7a\x03\x7b\x0a\x2f\x66\x67\x90\x42\x63\x44\xda\xa4\xe4\x35\x15\x51\xd7\xf3\xe6\x02\xb7\x7e\x36\x08\x4a\x89\x84\x25\xd2\xa7\xa5\xb9\x1b\x50\x27\x8b\x76\x97\x7b\xeb\x10\x42\xda\x3d\x52\x53\x62\x74\xc1\xaf\xff\x1c\x53\x4d\x1b\x5e\xb0\x28\xb3\xce\x76\x91\x5a\x97\x6c\x53\x76\xde\xb4\xd7\x3d\x5c\x2f\x6e\xf8\x51\x3d\xa0\x52\xb3\xeb\xcb\x3e\xd8\x75\x82\xb6\x69\x1b\x2b\xe9\xd1\x60\x2a\x61\xc9\x94\x96\xeb\x8a\x03\xc2\xb9\x30\x05\x61\x5c\x69\xca\x35\x43\x56\x4d\xfc\x9b\x53\x67\x7c\xbf\x62\xba\x21\x0c\xf0\x9d\xd1\xdd\xd1\xb4\x8b\x99\x38\xd6\xf8\x71\xbe\xce\x80\xfc\xbd\xf2\xc7\x2b\x99\x45\xbb\xbf\x3f\x59\x10\xc7\x40\x2d\x6e\xd2\x38\x96\xa0\xb6\x39\xdb\xae\xaf\x5b\xc1\xe7\x8d\x55\x63\x21\x78\xea\x8d\x5d\xae\x46\xa0\x52\x6c\x69\x94\x14\x5f\x1f\xd2\xfb\x72\x6a\xca\x8a\xf9\xd5\x0d\x6c\x3d\xb3\x90\x16\x27\x26\xd3\x5e\x1d\x8c\x04\x57\x79\x5a\x5a\x11\x62\xc8\x80\xc7\xc0\xa3\x35\x96\x84\x4a\x2e\xa1\x21\x8c\xe7\x47\xd5\x80\x12\x84\xfc\x2f\xb6\x34\x6a\xb7\x9b\x5c\x55\x72\xf6\xde\xe9\x8d\x99\x32\x65\x00\xbf\x00\x69\x94\x7f\xcc\xdc\x31\x42\xaf\xef\xa1\xe2\x85\x74\x35\xaa\x7c\x50\xe9\xe6\x64\xb1\x50\xe0\xee\xe9\x9e\x17\xd5\x2d\xbd\xbf\xc2\xc3\xd4\x72\x20\x03\x8e\xa5\xb0\xde\xfc\x4c\x28\xe6\xcb\xc1\x15\xe7\x42\xad\x42\xa6\x58\xd8\xfa\x95\xcd\x63\xd5\xb3\xdc\x30\x10\x7b\x63\xd1\x68\x7b\xcb\xb9\xdd\x4c\xa8\x5a\x34\x3d\x2f\x6c\xa8\xc1\x79\xbe\xbd\xd5\x45\x14\x0d\xa6\xc6\xd5\x97\x56\x9e\x65\x92\xf2\x0b\x88\x49\x02\xd7\x2c\x12\x4b\x49\xb3\x15\x8b\xb0\xd8\xa1\x75\xf5\x1a\x8d\x51\xdb\x10\xaa\x66\x0c\x6f\x3a\xbd\xb2\x7c\x9e\x30\xb5\xda\xed\x34\x6c\x25\x0e\x05\x91\x04\xbd\x93\xf3\xf5\xa1\x8d\x33\xfb\x79\x29\xfc\xf8\x80\x77\xd7\xaf\xcb\x17\xb1\xd8\xee\x13\x4b\x69\x14\x19\xc2\xf6\x0e\x50\x70\x92\x60\x85\x88\x1a\x38\x84\xf6\x7e\x26\xd3\xcb\x05\x40\x66\xf1\x19\x03\xd5\x54\x8a\xb6\x45\xc5\x78\x04\x58\xbc\xd1\x15\xe1\x04\xf0\x3e\x00\x2d\x19\x58\x09\x16\xd0\xeb\xe7\x77\x11\xb8\xde\x2d\x71\xb6\x1b\x11\x5a\x0c\x08\xed\x10\x2f\x78\x61\x27\xd0\x2b\x3c\xd4\x0b\x05\xe6\xdf\x06\xbc\xf8\x64\xe8\x66\xdb\x5a\x9d\x67\x36\x14\x7c\x34\x3f\xfc\xb1\xd6\x8b\x8b\xe1\x52\x64\x25\xae\xdc\x00\x9b\x1c\xc3\x59\xe5\x3c\x1a\xc4\x4c\x45\x86\xcd\x34\x18\x8e\x8e\x05\x57\xbe\x36\x27\xe5\xb6\x9c\xe6\x25\x4d\x5c\x82\xac\x1b\x2c\x13\x09\xfa\x41\xe3\xdc\xeb\xab\x36\xf5\x08\xd2\x39\xc4\x31\xc4\x3e\xde\x7d\x4d\x1a\x0e\xfd\x0e\x81\xa3\x4b\x26\xf0\xc7\xe2\xa9\x48\x92\xf6\x33\xbd\xd5\xb0\xd2\xc7\xac\xe2\x01\xd0\x3b\xce\xa4\x43\xcc\x3c\xf1\x00\x65\xaa\xa0\xc8\xd2\x11\x8d\x48\x66\x14\x96\x02\xee\x73\xd0\x57\x00\x9c\x44\x2b\x88\x2e\x54\x19\x63\xa7\x0d\x1d\x6e\x6c\xb4\x8b\xa1\x6a\x17\x10\xab\x1c\xb4\x10\x4c\xcd\x86\xba\x24\x77\x20\xcc\xa8\x85\x1c\xae\x36\x63\xb2\xb6\x0f\x2e\x7a\x49\x59\x42\xe7\x49\x87\xc2\x7c\xb2\x28\xdf\x9c\x54\xe7\xcf\xbc\x74\x94\xe5\x49\xe2\xbc\xd2\x18\xa5\xa2\x25\x5d\x2c\x58\x84\x41\x8a\x18\xa5\x53\x46\xf5\xee\x5c\xfa\xa8\xc8\x1c\xa5\xa9\xce\xb7\xb6\xbe\x05\x6f\xda\xf0\xc5\x68\xa1\xac\xd1\xde\xda\x07\x43\xde\xd7\x35\x58\x33\x3b\xb0\x2a\x7a\xcd\xa1\x35\x23\x6f\x85\x76\xd1\x6e\x6f\x40\x29\x17\x69\x47\xde\x03\x55\x82\x57\x8e\x02\xd4\x3c\x24\x5b\x32\x4e\x77\x57\x29\xb0\xeb\xaf\x5a\xcc\x0b\x45\x93\xae\xb1\x78\x31\x5b\x4a\xaa\x0b\x0e\x5e\x2e\xd1\x1d\x9a\x4e\x2c\x58\xe4\x18\xf1\x46\x8e\xf8\x1a\xd1\xc6\x85\xc0\xed\xb6\xa9\x32\xae\xa5\x88\xf3\x08\x5c\x99\xe6\x5c\x55\x3b\xbe\xd5\x73\xa0\x1e\xfe\xe5\xc7\x28\xd3\x09\x62\xd0\x94\x39\x7f\xb5\xe0\x40\xa8\xca\x8c\x96\xef\xb1\x3d\x97\x12\x4f\x54\xbf\x0f\x78\xd8\x1d\x9d\x9e\x90\xf7\xd0\x86\x74\x9d\x7c\xa7\x2b\xbe\x6f\x4a\x12\xaa\xf4\xb9\xa4\x5c\xe1\x84\xcf\x59\xda\x64\xa2\x30\x9a\x15\x62\x40\xe3\x73\x89\x58\xd1\xf8\xd8\xa2\x40\xe3\xe3\x06\xee\xdd\x87\x73\x6e\xaf\xe1\x36\xac\xfd\xdb\xbd\x96\xe9\x91\x46\x2e\xf1\xb6\x9e\x02\xa3\x0c\x27\x71\x6f\x83\x2b\x65\x6d\xb6\xda\xa1\x3e\xe6\xba\xa0\xba\xdd\xc6\x40\x30\xd0\xa6\xd4\xd2\xaf\xbc\x6f\x30\xe7\x31\xc8\x04\x7d\x6e\xe5\x78\xd1\xca\x08\xc9\xf1\xcc\x29\xff\xb4\xb0\xe3\x60\x98\xab\xf3\x2c\x96\x4e\x03\x1b\x30\xe7\x7b\x34\xd8\xe5\x6a\x88\xdb\x6e\x90\xc9\x46\x11\x64\xba\x9d\xcb\xf6\xb2\xc9\x79\xc3\x8a\x11\x12\xa6\xba\x19\xab\x1c\x4e\xdd\xc6\x7e\xb9\xae\x6c\x4c\xca\x2a\x4f\xa9\x61\x50\x34\xc6\x00\xb9\xe2\x99\xd5\x91\xac\x4e\x63\x29\xd2\x3a\xee\xac\xe3\xc5\x6f\x5f\xe7\x0e\x39\xa6\x45\x8b\x54\xfb\x0e\x6b\x49\x2f\x98\xa5\xf4\xfa\x35\xf0\xa5\x5e\x1d\x92\x3f\x7d\xf5\x3f\xbf\xfe\x4b\xc3\x8b\x62\x6e\x63\xda\x5e\x01\x77\x56\xa2\xdb\x80\xde\x76\xaf\x9b\x66\xce\x99\x0f\xc5\x9e\x2d\xcb\x77\x0a\x87\x42\x89\x95\xe8\x84\x06\xed\xf8\x76\x9e\xb5\x83\xf3\x7b\x4c\x26\x50\x9a\xf2\x08\x26\x46\x1c\xd8\x39\x8c\x51\x65\x2d\x8f\x4c\xd6\xe4\xf9\x57\x13\x0c\xf1\xc4\x49\x59\xea\x9a\x95\x6c\xfd\xc3\xf5\xc7\xd9\x8e\xc5\x30\x45\xfe\x3a\xd9\x98\x29\x53\xc4\xec\xbd\x58\x20\x9a\xb6\x4c\x12\xd5\x3e\x09\x96\x67\x7b\x23\xc0\x36\xcf\x86\x62\x25\x5d\x98\xd0\x65\x9b\xec\x67\x97\x4c\x19\x67\x69\x9e\x1e\x92\x67\x0d\xaf\x58\x8e\x7c\x1b\xe8\x61\x7b\x2a\xcf\x33\x6a\xd8\xf2\x52\xd2\x34\xc5\x8c\x2b\x16\x03\xd7\x6c\xc1\x30\xe6\xa5\x20\x31\xd4\xe3\xed\x87\x3e\x4e\xab\x00\x3e\x86\x70\x19\x36\xda\x8b\xe8\x4e\xed\x39\x2e\x51\x28\x75\x5e\xbb\xa8\xca\x79\xd7\x19\x58\xaa\xb4\x6a\x03\x81\xeb\xcc\x4a\x72\x15\xff\x51\x0a\x94\x33\xbe\x54\x65\xb4\x25\xf2\xbf\x36\xf3\xb8\xf9\xec\x6a\x05\x2e\xba\x01\xaa\xde\x41\x5f\x2a\xc8\x88\x92\x65\x90\x31\x06\x9e\xb7\xb3\x8f\x6d\x5b\xac\x91\xba\x52\x48\x8e\xa9\x82\x1e\x76\xd7\x4a\x2c\xa6\xbf\x56\xa1\x48\x0e\xbe\x35\x06\xf4\xfc\xd9\x57\xad\x78\x57\xbc\xd7\xf8\x52\x19\xa5\xf9\xe1\x68\xfa\x2f\x3a\xfd\xf5\xe3\x9e\xfb\xc7\xb3\xe9\x5f\xff\xef\xe4\xf0\xe3\xd3\xca\x9f\x1f\x9b\x83\x2b\x77\x4b\xce\x65\xab\xe1\xb0\x3b\x6b\xbd\x58\xe5\xf1\x63\xe2\x83\xb9\xce\x65\x0e\x13\xf2\x3d\x4d\x14\x4c\xc8\x8f\x1c\xcf\xc9\x1b\x02\xad\x3d\xba\xc2\x48\x36\x8f\xcd\xa8\x8f\xdb\x5f\xc1\x29\xb5\xbf\xe3\xa6\xdb\xa6\x82\xf6\x03\x92\xb7\x2c\x54\x18\x21\xaf\x60\xa0\xcd\xee\x5a\x08\x31\x83\x6b\x9a\x66\x09\xcc\x22\x91\x1e\x14\xcf\x6f\xf1\x90\x7b\xfe\x75\x0f\xec\xd9\xfb\x60\x71\xe4\xe3\xde\x87\xa9\xfb\xd7\x53\xff\xd3\xfe\x77\x7b\xff\x9e\xb5\x3e\xdf\x7f\x7a\x80\xa1\xbd\x05\xaa\x7d\xfc\x30\x2d\xd1\x6e\xf6\xf1\xe9\xfe\x77\x95\x67\xfb\xbb\x90\x70\x3b\x89\x2a\xa5\xd9\xf4\xa2\xb1\x62\x5c\xa3\x28\xdb\x94\x8d\x95\xd2\x6c\x97\x8a\xb7\x60\xcb\x37\x34\x7b\x0f\x0b\x90\xc0\xa3\x6e\x13\xd2\xf1\xd6\x27\x64\x2f\x36\x47\x38\xe6\xe0\xed\x7b\xe1\x55\x16\x4f\xdd\x41\x56\x7c\xe7\xb9\x7b\x71\xe1\xd1\x66\x4c\x4e\x2d\xd2\x6d\x52\x8a\x92\x3b\x94\xf5\xb2\xd7\xdb\x77\x01\x71\xda\x20\x4e\x4e\xcb\xa8\xbb\x11\x86\x1e\x73\x1c\x59\x83\x57\x9b\x06\xd1\x03\xc9\xfb\xc9\xbe\xbc\x25\xf4\xb7\x73\x90\x62\x9d\xa3\x7b\xf0\xf7\x50\xfc\x64\xed\x2e\xa3\xfb\xc9\x59\xa3\x72\xd9\x57\xba\xf8\xf1\xe4\x85\xc5\x19\x64\x4c\x28\x51\xae\x44\x12\x2b\x92\x73\xf6\x4b\x0e\xe4\xe4\x45\x51\x7d\x88\xf1\x28\xc9\xf1\xde\x9e\x1f\x7f\x3c\x79\xa1\x66\x84\xfc\x03\x22\x6a\xf4\xfa\xab\x96\x10\x4e\x2c\xb5\xf7\xee\xed\xeb\xff\x8d\x16\x00\xfc\xd2\x5d\x9b\xe1\x0a\x8b\x24\x8c\x5a\x8b\x94\x3d\x7c\x4d\xaf\x36\xba\x11\x67\x14\xd1\xac\xd9\xc6\x40\x9c\xdd\x8e\xdb\x20\xdd\x15\x24\x99\xc2\xe4\x23\xa2\x72\xe9\x56\x63\x06\xb4\x59\x10\x98\x86\xee\x1c\xe7\x3e\x9f\x0a\xf3\xd5\x46\xc5\x45\x47\x82\x73\x88\x30\x32\xc1\x08\xa1\x7d\x38\x44\xf5\xfd\x4d\x01\x7f\xa7\x44\xbb\x19\xe0\x5c\x8e\xe9\xf9\x87\x37\x90\xde\x3e\xa1\x1b\x8a\x7c\xe7\x44\x79\x9c\xf1\x08\xaa\x76\xbe\xc5\xd1\xf8\x6d\xe6\xe0\xe0\x76\xe7\x2c\x61\x6b\xbd\xa3\x46\xb4\x46\x4b\x74\x06\xbf\xef\xb0\x5d\xd7\xc3\x32\xb7\x2c\x1b\x1b\xb9\xad\x68\x40\x2d\xfc\xc9\x2b\xaa\xc8\x1c\x80\xa3\x3d\xd7\xda\xed\x80\x3b\x9c\x87\xd2\xda\x9a\x67\x53\x2d\xa6\x0d\xfa\x55\x07\xe4\xba\xa1\xd6\x62\x3e\xa8\xad\xed\x68\xb0\x41\xe0\x6a\xb5\xde\x05\x03\x55\xde\xda\xe3\xa5\xa7\xc1\x5e\xea\x66\xad\xac\x36\x67\x67\x64\x2d\x8e\x6d\xfc\x6b\x7b\x4a\x46\xdd\xae\x19\x9e\xb4\x40\xf7\x62\x8d\x9a\x47\xcc\xd1\x6e\xf3\x19\xc8\x4b\xd6\x43\xf8\x78\x5f\x7f\xbf\x17\x6b\x79\xf5\xfe\xf4\x18\xf3\xf3\xcc\x07\xde\x3f\x81\xd8\x5f\x95\x2a\x6e\xdf\xa3\x13\xd9\x50\xa3\xa3\xbb\x27\xe8\x4c\xc8\xf1\x83\x64\x52\x68\x11\x89\x0e\xa7\x53\x6b\xca\x0c\x82\xb6\x2d\xc7\x68\x48\x1f\x43\xe5\x0d\xcb\xc7\x6a\x59\x69\x4a\x0b\x69\xc8\xb5\xf6\x5b\x3e\x2f\xee\xc4\x2a\x7b\x77\x5a\x1f\xf9\xcf\x7f\x1f\xfd\xbf\x00\x00\x00\xff\xff\x78\xea\x72\xfc\x70\x56\x01\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -105,7 +105,7 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\x23\xb9\x95\x2f\xf8\xbf\x3f\x05\x42\xf6\xac\xa4\x31\x49\x55\xd9\x63\xef\x4c\xdd\xd9\x71\xe8\xaa\xd4\xdd\xda\xee\x52\x29\x24\xb9\xbc\x8e\x9e\xbe\x36\x98\x79\x48\x62\x94\x09\xe4\x00\x48\xaa\xe8\xdb\xf7\xbb\x6f\xe0\x00\xc8\x07\x1f\x12\x99\x80\x44\x56\x75\xc2\x11\xee\x12\x99\x04\x4e\xe2\x71\x70\x9e\xbf\x43\x0b\xf6\x09\xa4\x62\x82\xbf\x23\xb4\x60\xf0\x59\x03\x37\x7f\xa9\xd1\xc3\xbf\xaa\x11\x13\x67\xf3\xb7\xbf\x7a\x60\x3c\x7d\x47\x2e\x4a\xa5\x45\x7e\x0b\x4a\x94\x32\x81\xf7\x30\x61\x9c\x69\x26\xf8\xaf\x72\xd0\x34\xa5\x9a\xbe\xfb\x15\x21\x94\x73\xa1\xa9\xf9\x58\x99\x3f\x09\x49\x04\xd7\x52\x64\x19\xc8\xe1\x14\xf8\xe8\xa1\x1c\xc3\xb8\x64\x59\x0a\x12\x3b\xf7\x43\xcf\xdf\x8c\xde\xfe\xeb\xe8\xcd\xaf\x08\xe1\x34\x87\x77\x24\xc9\x4a\xa5\x41\x2a\x90\x73\x96\x80\x7b\x4c\x8d\x44\x01\x92\x6a\x21\xd5\x28\x11\x12\x84\xf9\x4f\xfe\x2b\x55\x40\x62\x06\x9b\x4a\x51\x16\xef\xc8\xda\x67\x6c\xbf\x9e\x26\xaa\x61\x2a\x24\xf3\x7f\x13\x32\x24\x22\xcb\xf1\xdf\xee\x5d\xed\xf0\x77\x76\x78\x37\x41\xf8\x7d\xc6\x94\xfe\x7e\xf3\x33\x3f\x30\xa5\xf1\xb9\x22\x2b\x25\xcd\x36\xbd\x08\x3e\xa2\x66\x42\xea\xeb\x9a\x2c\x43\x46\xa2\xe6\xcd\x7f\xbb\x07\x19\x9f\x96\x19\x95\x1b\x7a\xfb\x15\x21\x2a\x11\x05\xbc\x23\xd8\x59\x41\x13\x48\x7f\x45\x88\x1f\xcb\x76\x3e\x24\x34\x4d\x71\xbd\x68\x76\x23\x19\xd7\x20\x2f\x44\x56\xe6\xbc\x1a\xdc\x3c\x93\x82\x4a\x24\x2b\x34\xae\xc9\xfd\x0c\x70\xd6\x88\x98\x10\x3d\x03\x72\x71\xf7\xa9\x7a\x94\x90\xff\x52\x82\xdf\x50\x3d\x7b\x47\x46\x66\x01\x46\x29\x53\x45\x46\x17\x86\x84\xc6\x53\x76\x35\xdf\xdb\xef\x1a\x9f\xeb\x85\xa1\x57\x69\xc9\xf8\xf4\xa9\xf1\xdd\x4b\x6c\x47\xc2\xbc\xb1\x4e\xcd\xe1\x3f\xad\x7c\xbe\xed\xf0\xfe\xf5\xa9\x19\x99\xe8\x19\xd5\x44\xcf\x98\x22\x82\x03\x91\x50\x64\x34\x01\xf5\x04\x41\x6b\x1e\xb1\x14\xdd\xae\x7e\xb1\x81\xa4\x66\x97\x9a\xea\x52\x8d\x8a\x19\x55\xab\x53\x7c\xb3\xf4\xe9\x9a\xee\xec\x83\xf3\xb7\x34\x2b\x66\xf4\xad\xfb\x50\x25\x33\xc8\x69\xbd\x07\x44\x01\xfc\xfc\xe6\xea\xd3\xef\xef\x96\xbe\x20\xed\xd9\x59\xbb\xfb\x09\x53\x66\xaa\x90\x51\x10\xcf\x29\x70\xed\x16\x05\x90\xbf\xaf\xfd\xcd\x5d\x01\xc9\xdf\x47\x2b\x94\x8b\xf1\x7f\x41\xa2\x1b\x1f\x4b\xf8\xef\x92\x49\x48\x9b\x14\x99\x09\xf2\xdc\x67\xe9\x63\x33\xff\x8d\x8f\x0a\x69\xd8\x82\x6e\x1c\x79\xdb\x1a\xec\xaf\xf5\xf9\xd2\xdb\xfe\x3c\x5c\xfa\x96\x10\x33\x49\xee\xad\x53\xc3\x0b\x41\xe1\x0e\x75\x7b\x10\x52\x37\xb3\x76\xe7\x32\x65\xb6\x8b\x04\x05\xdc\x72\x47\xdc\x54\xdc\xbd\xe5\x68\xa5\x73\x33\x45\x20\x95\x61\x11\x65\x96\x1a\x26\x3a\x07\xa9\x89\x84\x44\x4c\x39\xfb\x47\xd5\xbb\x22\x5a\xe0\xb0\x19\xd5\xa0\x34\xc1\x73\xcd\x69\x46\xe6\x34\x2b\x61\x40\x28\x4f\x57\xfa\xce\xe9\x82\x48\x30\xe3\x92\x92\x37\x7a\xc4\x9f\xa8\x55\x5a\x3e\x08\x09\x84\xf1\x89\x78\x47\x66\x5a\x17\xea\xdd\xd9\xd9\x94\x69\x7f\x3d\x24\x22\xcf\x4b\xce\xf4\xe2\x0c\x39\x3d\x1b\x97\x86\xf5\x9e\xa5\x30\x87\xec\x4c\xb1\xe9\x90\xca\x64\xc6\x34\x24\xba\x94\x70\x46\x0b\x36\xc4\x97\xe1\x78\x45\x8c\xf2\xf4\xd7\xd2\x6d\x13\xb5\x34\xf0\xda\xf3\x40\x3c\x87\xde\x71\xb1\x0c\xc7\xb6\x9b\xd3\x76\x68\x5f\xb6\x5e\x13\xf3\x91\x99\xc6\xdb\xcb\xbb\x7b\xe2\x29\x72\x47\x1d\x97\xa8\x7e\x74\xcd\x0c\xf9\xd5\x32\x33\xcb\xf8\x04\xa4\xfd\xe5\x44\x8a\x1c\x7b\x05\x9e\x16\x82\x71\x8d\x7f\x24\x19\x03\xae\x89\x2a\xc7\x39\xd3\x0a\xb7\x35\x28\x6d\x16\x72\xb5\xe3\x0b\xbc\x4e\xc9\x18\x48\x59\xa4\x54\x43\xba\xfa\xc8\x15\x27\x17\x34\x87\xec\x82\x2a\x78\xf5\xb5\x33\x6b\xa4\x86\x66\x41\xb6\x5e\xbd\xa6\xb0\xb0\xfa\x83\x95\x53\x4f\x88\xbf\xdd\x77\x59\xee\x8d\x8c\x86\xa4\x90\x64\x54\x5a\x01\x85\x68\xc8\x32\xf2\xf1\x87\x0f\x64\x26\x1e\xcd\x41\x62\x5c\x69\x9a\x65\x78\x30\x9d\x10\xb1\xd2\x35\xde\x01\x09\xe5\x24\xa7\x9c\x4e\x81\xd0\xa2\x50\x64\x22\x24\xa1\x64\xca\xe6\xc0\x3d\x03\x58\x5e\x8b\x8d\xef\xb7\x89\xb3\x11\x7b\x23\xad\xbd\x55\xfd\xb7\x8e\xe0\xa5\x6f\x36\xf1\x3a\xd3\x56\xe4\xb3\xdd\x26\xd6\xb4\xf3\xba\x0b\x3c\x52\x9c\x94\x5c\x69\x59\xe2\x2e\x49\xc9\x03\x2c\xdc\xe9\xca\x69\x41\x94\x16\xe6\xc3\x47\xa6\x67\x84\x36\x4f\x16\xd5\x78\x5c\xc6\xab\xaf\x65\x9a\x02\x4d\xc6\x0b\x62\xa4\x51\x64\x67\x5a\x88\x0c\x79\x1d\xf6\x67\xd8\x1a\x91\xa0\x25\x83\x39\x10\x2a\xc7\x4c\x4b\x2a\x17\xd5\xde\x5a\x3d\x07\x4f\xce\x3f\xce\x4b\x43\x38\xda\x3c\x7b\xe4\xa9\x9d\x4d\xec\x75\xe2\x64\xb3\xb4\x92\x8f\xbb\x4f\xf4\xcd\x95\xdb\xc1\xb5\xb0\xad\xdc\x0e\x06\x45\xcc\x4e\x75\x62\x51\x25\xb5\x23\x01\x6e\x6b\xa6\x44\xc8\x6a\x6f\x91\xf1\x62\xed\x18\x8d\xad\x4e\xc6\x60\xd8\xa0\xa4\xdc\x4c\xfd\xda\x23\xd4\x61\x62\x9f\xda\x8c\xa6\x89\x47\xbe\x6e\xe7\x37\xfb\xa6\x52\xd2\xf5\xd4\x13\xc2\x34\xe4\x1b\x7a\x26\xcb\xd3\xdc\x9c\xcf\xea\x63\x43\xe0\x9c\xa5\x60\x26\x56\x53\x66\x77\x99\xe1\x09\x74\x2c\x4a\x6d\xe7\xd3\x3d\x92\x92\x39\xa3\x84\x4e\xa7\x12\xa6\xb8\xff\x37\x0e\xfb\xcc\x9c\xd8\xb6\xf9\xd8\xd7\x6d\x68\x95\x9a\x27\x9f\x30\xec\xf7\xc9\x07\xf8\x3a\xe6\xd1\x7c\x60\x55\x6e\x6e\xb7\xe7\xd6\xd0\x36\x9a\x98\x39\xf1\x53\x2b\xe4\x93\x0f\x6f\xb3\xb6\xb6\x3d\xb3\xc2\xb6\xb5\xd7\x79\x89\x10\xf7\xed\xd8\x9c\x99\xfa\x02\x30\x9c\x03\x1f\xac\x59\xfa\x18\x48\x01\x72\x22\x64\x6e\x0e\x0f\x27\x94\x24\x56\x94\xad\xf8\x16\x32\x5c\x9e\x3c\x35\x9d\x64\xdb\xf5\xb7\x6d\x9b\x5d\x60\xdb\x90\x14\x54\xcf\x9e\x79\x6c\xbb\xa5\xb2\xad\x39\x69\xcf\x3e\xfc\x0c\xe3\x5b\xe9\xbb\xbe\xb7\xa2\xf7\x6d\xa6\x21\x7a\xa7\x78\x65\x6d\xd3\xeb\x36\x9c\x7b\xb9\xdd\xd2\xc7\x0f\xa0\x94\x91\x17\x50\x08\x95\xf4\x91\x00\x4f\x84\xe1\x29\xff\xef\xdd\xc7\x6b\x3b\xfa\x3a\xee\xba\xda\xae\x34\x61\x79\x91\x41\x6e\x64\x51\xf2\xe3\x07\x2a\xd5\x8c\x66\x20\x7f\xc2\x5b\xf1\xc7\x3f\xf3\xbc\xfd\x49\x42\x37\x1f\xec\x66\x33\x42\xa6\x82\xd4\xb0\xbf\x14\x32\xba\xb0\x84\xa5\x90\x88\xd4\x5c\x0b\x42\x92\xc2\x28\x0b\x79\x51\x6a\x20\xd4\x7e\x8b\xef\xc0\xf8\x74\x1b\xca\x77\x5a\x0d\x62\x44\xaa\x9c\xea\x77\x64\xbc\xd0\xcf\x9d\x36\x42\x3e\x0f\xd3\x6d\xd9\x4e\x93\x98\xe7\x99\x8f\x6d\x5b\xb1\xa0\x66\xc7\xcf\xbe\xa5\x91\xb7\x29\xe3\x20\x6f\x84\xd4\xdb\xf0\x49\xa3\xd8\x4d\x61\x55\x1c\x6d\x36\x3f\x65\x8c\xeb\xdf\xff\xee\x89\x27\x53\x28\x32\xb1\x30\xfb\xe7\xf9\xe3\xb9\xe5\xfb\x6c\xcd\x4a\xb6\xed\x6f\x5b\xf6\xb1\x65\x7f\xd6\x34\x18\xa3\xa7\x75\xda\x67\xa7\x8e\x78\xac\x77\xab\x14\xe8\xbd\xdd\xb7\x37\x57\xde\xd6\x73\x0b\x13\x90\xc0\x13\xcf\xe7\xaa\x3f\xb5\x20\x94\x7c\x5f\x8e\x41\x72\xd0\xa0\x1a\x9a\xc0\xa2\x00\x6f\x58\x03\xfb\x03\x09\x92\x94\x9a\x65\xec\x1f\xeb\xcc\x11\xeb\xde\x2a\xfa\x4d\xfb\x8c\x4c\xe5\x1f\x7b\x46\xb2\xf2\x8f\x3d\x27\x5f\xd9\xb6\xcb\xd5\xfd\xfc\x2e\xb4\xad\xb5\x4e\x68\x04\x71\x1a\x43\xb5\x32\x69\x7b\x29\xa2\x73\xf2\xe7\xb7\xf9\x1a\x4a\x6f\xd0\x78\xde\x32\x3e\x6f\x22\x98\x9c\x6c\xf2\x4b\x8c\x8c\xc2\x3f\x42\x93\xf8\x8f\x3f\x8d\x6c\x97\xa7\x23\x72\x99\x17\x7a\xe1\xcd\x40\xec\x99\xce\x99\x22\x5c\xe8\x55\x41\x30\xfa\x34\xcd\xd7\x1b\x21\x9f\x9d\xa9\xf3\x9b\x2b\x6f\xde\x7e\xc5\xa5\x55\x05\x24\x07\x20\xe8\xdf\xb5\xc8\x68\x89\xf9\x13\x06\x59\x4a\x98\x91\xe1\x0d\xb1\x64\x9c\x89\xe4\xc1\x59\xf2\x6f\xdf\x13\x25\x2c\xcf\x31\x8a\x9e\x91\xfc\x13\xc1\x55\x99\x03\x61\xcf\x31\x91\x5e\xb2\xef\x25\xfb\x66\xeb\x25\xfb\x5e\xb2\x6f\x35\xeb\xa4\x3b\x04\xe6\xb8\x44\xc8\x46\xf6\x88\xcf\xf5\x0c\xf2\xa9\xd6\x33\x48\x6c\x3d\x83\xec\x19\xe4\x73\x1d\x3f\xfb\x96\x5b\x49\xba\xcf\xf6\xf5\x1c\xef\xe8\x3d\x07\xbd\xe7\xa0\xf7\x1c\xb8\xd6\x5f\x9f\xae\xf5\xd7\x67\x7f\x7d\xb6\xdb\x17\x77\x7d\xf6\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\x41\xb3\xf5\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\xc1\x86\xd6\x4b\xf6\x1d\x3b\xed\x25\xfb\x5e\xb2\xdf\xd4\x7a\xcf\x41\xef\x39\xe8\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\xe7\x20\xc9\x80\xf2\xf5\xea\xfc\x52\x72\x23\x3e\x87\x02\x20\x9b\x30\x97\xda\xe7\x7e\x4d\xc6\x30\xa3\x73\x26\x4a\x49\x1e\x67\xc0\x7d\x5e\x2a\x99\x82\x56\x66\x17\x80\x86\x75\x1a\xe0\x33\xec\xed\x69\x96\x36\x24\xc0\xe9\x38\x5b\xdb\xf1\x73\xdc\xcb\xfd\xf2\x69\x4f\xc9\x58\x08\xf3\x76\xab\x33\x86\xda\x8b\xd7\x06\x22\x24\xb5\x6c\xd2\xb9\xd6\x27\xb6\x5c\xdc\xbe\x7f\xd1\x74\x96\xb5\x9d\x5c\x55\x63\x13\x74\xe1\x60\xda\x9f\xb9\xf2\xcc\xa7\x1f\x1f\x39\xa4\x98\x05\x3e\x20\x4c\x9b\x07\x0c\x63\x61\x09\xd3\xd9\xa2\x22\xef\xcb\xce\x93\xb9\xb8\x7d\xbf\xbd\x9b\xcb\xaf\xd2\xc6\xae\x23\x7a\xb4\x7a\x7f\x55\xef\xaf\xaa\x5a\x2f\xb4\x75\xec\xb4\x17\xda\x7a\xa1\x6d\x53\x8b\x2f\xb4\x1d\xba\x7f\xa7\xf7\xca\x90\xde\x2b\xe3\x1f\xeb\xbd\x32\xcf\x3e\xde\x7b\x65\x7a\xaf\x4c\xef\x95\x79\xba\xf5\xf2\xab\x6b\xbd\xfc\xda\xcb\xaf\xed\xf6\xc5\xc9\xaf\xbd\x57\xa6\x67\x90\x3d\x83\xac\x5b\xcf\x20\x7b\x06\xd9\x6a\x5f\x62\x3e\x47\x6f\xe1\xee\x2d\xdc\xbd\x85\xbb\xbf\x00\xfb\x0b\xb0\xbf\x00\x9f\xeb\xb8\xb7\x70\xfb\xd6\x5b\xb8\x7b\x0b\x77\xab\xf5\x16\xee\xde\xc2\xdd\x5b\xb8\x7b\x0b\xf7\x86\xd6\xcb\xaf\x1d\x3b\xed\xe5\xd7\x5e\x7e\xdd\xd4\x7a\x0b\x77\x6f\xe1\xee\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\x85\xfb\x99\xc3\xbb\xcd\x2e\x6d\xda\xab\x9d\xd8\xec\x23\xdd\x47\xe4\x82\x72\xc2\x78\x92\x95\x29\xe0\x37\x13\xa0\xba\x94\xa0\x06\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x98\x50\x05\xca\xf5\xb1\x76\xa8\xaa\xdf\x35\xdf\x3e\xfd\x9a\x4f\xf3\x91\x27\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x99\x0c\x96\x6c\x31\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7d\xed\x4d\x5b\xf0\x89\x2d\xf7\xec\xe5\xf2\xdc\x95\x32\x24\x63\xaa\xe0\x8f\xff\xb2\x52\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\xb5\x4f\x3c\x7f\xcd\xd4\x43\x6c\xde\xe4\x5b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\x95\xed\xe3\x4e\x4b\xaa\x61\xba\x68\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x43\x09\x33\xaf\x81\xae\x1d\xe2\x71\x06\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x97\xff\xe3\xc7\x59\xf3\xf5\x73\xeb\xbb\xae\x82\x92\x6f\xdb\x5e\x90\x7e\x3e\xdf\x5b\x0f\xd9\xfb\x0a\x08\x66\x79\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xec\x7f\x69\xd9\x36\xdd\x51\x5b\xc8\x6a\xcf\xcb\x68\xc3\x06\x8e\xcd\x26\xaf\xde\x36\xa2\x99\x2b\xc6\x78\x03\x32\x67\x4a\x6d\x4a\x8a\x6a\x93\xfe\xdc\x2d\xb6\xc5\xed\xb5\x24\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x4c\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xed\xf6\xde\xe2\xee\xdb\x42\x82\xde\x56\x7e\x1e\x5a\x3a\x9f\x7d\xca\xbd\xc3\xb9\x7d\x85\xb5\x45\xb2\x9a\x6d\x7b\x79\x1b\x87\x7f\x5e\x88\xd8\x45\x32\xd9\x5a\x2e\xe9\x22\xb3\xde\x88\x8c\x25\x8b\xdb\x32\x03\x32\x13\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x01\x19\x97\x9a\xa4\x02\xac\xd9\xd0\xa1\x4b\x35\x7f\xbe\xd5\xf8\xd6\x53\xfe\x38\xb3\xc5\x08\x4d\xc7\x84\x16\x45\x86\x99\x93\xc2\x08\x1e\x8f\x33\x96\xcc\x6c\x0d\xd6\x82\x26\xb0\xee\xb1\xed\xe5\xd2\xad\x74\x35\xb2\x93\xbe\x46\xbc\xd9\x7b\xfc\xdc\xae\x23\x3b\x2a\x6e\xc4\x96\x05\xfb\x56\x8a\xb2\xd8\xf2\xf1\x6e\x7b\x80\xd8\x92\x61\x76\x20\x73\x1d\xe9\x25\x11\xcb\x7f\xe9\x9c\xe4\x76\xa9\x95\xb3\xc0\x3a\x8f\xcc\x08\xd3\x1f\xf3\x32\xd3\xac\xc8\xf0\x27\x16\x01\x4b\x11\x2a\xa1\xbe\xe0\x06\x84\xf2\x85\xf7\xb9\xbb\x12\x86\x90\x12\x3a\x35\x3d\x6a\x2c\x8f\x2a\x26\x5b\x53\x6d\x6b\x24\x96\xb9\x91\xbf\x1a\x36\x60\x85\xea\x3e\x5f\xd4\x54\x90\x47\x96\x65\x46\xf9\xa1\x59\x26\x1e\x21\x1d\x91\xa3\xa3\xe5\x0b\x28\x11\xb2\x41\x37\xb2\xba\xa3\x7f\x6e\x3d\x65\xf8\x5a\xfd\x62\xdb\x29\x72\xbb\x6a\x21\x64\x37\x4d\x84\xec\xae\x73\x11\x54\xa5\x1e\x2a\x07\xd5\x30\x63\x4a\x0f\x1d\x95\x5a\xe4\x2c\xd9\xaa\x13\x2e\xb8\x77\x44\xfc\xf9\xf6\x87\x17\xdf\xa0\xd7\xed\xe1\x5c\x4d\x4e\xd0\x66\x8f\x16\x54\x6a\x46\x33\x52\xca\x4c\xd9\x3d\x4a\x8d\xc2\x22\x7d\x15\xd4\x19\xc5\x38\x8f\x04\x14\xb2\x0b\x42\xfe\xd9\xee\x4a\xb7\x19\x2c\x2b\x13\x3c\x5b\x10\x6a\xb7\xc2\xa4\xcc\xb2\x01\x99\x30\x4e\xcd\x45\x06\x85\xcf\xe1\xdd\xc2\x34\x53\xb7\x3b\xc6\x13\x30\xd3\x34\xac\x7c\x13\x48\xb9\x19\xd9\xb0\xcc\x8a\xa7\xa5\x03\x57\xf6\xd3\x5a\xaa\x94\x23\xc5\xf0\xb7\x84\x8e\x33\x40\x4d\xc3\xc9\x9c\xb7\x22\x43\x97\x62\xe5\xf7\xc0\x5a\xa1\xb4\xf9\xf5\xff\x64\x7c\x5b\x6d\xdd\xb6\x5b\xbc\xda\x13\xca\x09\x30\x3d\x03\x89\x43\x2f\x0c\xff\x35\x9b\xbd\x3e\x54\x27\xaa\x4c\x66\x66\x8a\x8e\x0a\x91\xaa\x23\xc3\x9d\x8f\x14\x24\x12\xb4\x3a\x3a\x35\x7f\x2d\xbf\x2b\xce\x57\xf3\x77\x67\xb4\x60\x47\xa7\x03\x82\x13\x8e\x05\x4a\x85\x9e\xfd\xc2\xcf\x91\x9f\xb0\x56\x3d\xef\xe7\x5a\xeb\x14\xdd\x36\x7b\x70\x95\x35\x45\x61\x8b\x52\x9a\xfb\x53\x03\xa6\x9d\x9b\x93\x82\x7b\xae\xe1\x83\x5e\xba\x48\x09\x39\xe7\x04\xac\xd7\x10\x34\xc9\x81\x72\xf7\x34\xcc\x41\x2e\xf4\x0c\x1d\x89\xaa\xe2\xa2\xfd\xca\x6d\x11\x8d\x50\xb7\xb5\xab\xe6\x58\x99\x5f\xa1\xfa\xb8\xd9\xe2\xcf\xcb\x2b\x74\xfc\xcf\xc7\xcb\x57\x52\x7d\x07\xff\xb2\xd7\x03\x85\xb0\x4e\x6b\xf1\xc9\xfc\xb2\xbd\x0e\xf6\x23\x7b\x99\x54\xec\xf0\x87\x1f\x6c\xb1\x67\x37\xe1\xdf\x33\x9e\xaa\x0a\x58\x35\xb5\xb7\x84\x5b\xb4\xb5\x2b\x85\x14\xfe\x62\x57\x69\x55\xe9\xda\x56\x51\x7a\x86\xc6\x86\x56\x7e\x08\x8a\x34\xd6\x8b\x6e\x49\xc9\x86\xed\x0e\xac\x77\xde\x88\x95\x19\x1d\x43\xa6\x9c\x01\x11\x1a\xe4\x93\xf3\x1f\x3e\x54\xa5\xdb\x25\xd0\x67\x8c\xe2\x2f\xa0\x3e\x6f\x11\xe6\xb3\x52\x22\x7f\xb5\x6d\xaf\xe6\xe0\x54\xec\xe6\xc4\x22\x77\xa0\xed\x59\xcd\x69\x61\x8e\xaa\xed\xc3\x3a\x57\x96\x1c\x27\x3f\xe0\x4c\x3f\x7f\xe2\x76\x52\x0f\xb7\x2f\xf9\xbc\x6e\x90\xad\xce\xdb\x76\xa1\x44\x3b\x74\xf8\x94\x29\xaf\x6e\xad\x69\x5e\xda\xd0\x4e\x2f\x74\x9a\x5c\x42\x9b\x0e\x85\x14\x94\x05\xd7\xb1\x00\x47\xd2\x7f\x5e\x77\x11\x79\x09\x76\xd1\xcf\x87\x44\x41\x06\xc9\xba\x9a\xec\xeb\x1e\xd6\x90\x17\xd9\x73\x27\x8f\xec\xac\xcb\xe7\x8c\xdf\x02\x4d\x17\x77\x90\x08\x9e\x6e\xc9\xa5\xbb\x29\x4b\x1f\x18\x67\x79\x99\x13\x5e\xe6\x63\xc0\xb5\x50\x76\x50\xe4\x38\xd6\xa0\x42\x09\x87\xc7\x6c\xe1\xb8\x4c\x4a\x0a\x91\x7a\xc6\x33\x36\x5a\x3d\x4d\xb7\xbd\x74\x1e\x99\x9e\x61\xd9\x0a\xbe\x30\x43\x31\x5d\xdf\x88\x92\x24\x92\x2a\x23\x34\x0e\x70\x68\xa6\xcd\x2d\x3a\x06\x74\xb1\xb3\x14\xcc\x96\xa1\x73\xca\x32\xa3\xe5\x6c\x7b\x2d\xbe\x87\x09\x2d\x33\x8d\xf6\xa1\x37\xe4\xc4\x10\xee\x95\xfb\x75\xdd\x1a\xbd\x43\x09\xc1\xcd\x7f\x2d\xec\x12\xbe\xdc\xe9\x0e\x7e\xbe\x6d\x80\xd0\x7d\xdb\x16\x10\xdd\xb7\x82\x96\x6a\x5b\x33\x53\x6b\x37\x5c\xf1\xd4\x1c\xc2\xa6\x34\xdf\xb8\x47\x98\x72\x3d\x6f\x37\xab\x4f\x43\x79\xad\xa1\x5a\x8a\xa9\x04\xa5\xde\x03\x4d\x33\xc6\xe1\x15\x36\xf5\xfd\x0c\x48\x4e\x3f\xe3\xc6\xd6\x2c\x07\x23\x6c\x35\xb7\x35\x6d\xbe\xbe\x16\x24\xa7\x0f\x50\xd1\x49\xc6\x30\x11\x72\x8b\x90\x0e\xdf\x98\x6a\x6e\x26\xbb\x69\x27\x94\x65\x90\x8e\x90\x92\xc6\x58\x66\xb3\x4b\x91\x65\x20\xed\x3e\x34\x7f\x33\x5e\x02\xd1\x62\xcb\xc1\x0a\x29\xd0\x34\x61\x07\x68\x4a\x33\x28\x2d\x50\xd3\xa5\xbd\x71\xf0\xb0\x11\x4a\x6e\x96\xe6\xff\xf2\x73\x82\x46\xf8\x2d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x84\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x91\x6b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x5b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xfd\xde\x6d\x9d\xf5\x3f\xbe\x79\xb3\xa5\xe8\xfc\xf2\xa7\x56\x02\xda\x66\x5e\x74\xc3\x5f\x57\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xb4\x64\x6a\x46\xc6\xa0\x1f\x01\x38\x81\xcf\x16\x5e\x6e\xcb\xf1\xfe\x01\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xf6\x70\x16\x60\xce\x14\x13\xfc\x3b\xa6\xb4\x90\x8b\x1f\x58\xce\x9e\xa9\x69\xe1\x5b\x77\xee\x53\x5f\xa7\x22\x4b\xc9\xad\xdd\x02\x77\x60\x67\x46\x02\xba\x3f\xb4\xb0\xb6\x11\x62\x38\xc2\x98\x26\x0f\xdb\xde\x6a\x3b\xaf\xea\xa6\xf5\xea\x70\x8b\xbe\x7d\x73\x28\xcb\xea\x05\xb5\x97\x5c\x4a\x54\x09\xaa\x91\xf0\xee\xb0\x07\xeb\xf2\xb3\x9d\xee\xd6\xd2\x3e\xce\x84\x02\x7c\x80\x50\xf9\xbc\x4c\xd8\x7c\x0d\xef\x13\x65\xaa\xe2\xb4\x18\xaf\xc2\x41\x11\x3a\x99\xb4\x9f\x48\x77\x90\x94\x6d\xbb\xd2\x24\x2f\x95\x26\x39\xd5\xc9\xcc\x5a\xa7\x45\x5a\x49\xaf\xc7\xca\x69\x99\xbb\x2c\xed\xd6\xee\xb1\xdd\x1d\x59\xc4\xd2\x79\xf9\xb9\x30\x97\xc7\x73\x2e\xef\x76\x6b\xad\xf3\x72\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\x3f\xbf\x7e\xbf\xfd\xa9\xe9\x62\x94\xd9\xd9\x2c\xd3\xdd\x47\x62\xda\xf9\x13\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x35\x20\x94\x3c\xc0\x62\x60\x25\x8f\x06\x28\xaa\x79\x78\x27\x42\x24\x64\x4e\x3c\x05\xd3\x23\x76\x68\xc7\xd8\x7e\xb6\x3b\x6c\x4c\x3f\xf8\x2e\xfe\x5b\xdf\x86\x86\xd0\x1d\x7f\xe1\x27\x68\x87\x9f\xed\x7e\x76\x6c\x7b\x80\xc5\x6e\x3f\x58\xda\x49\x66\x15\x9c\x16\x6f\xf7\x88\xf9\xa0\xd2\x1e\xaa\x6d\xb1\x9b\x63\xbd\xd9\x3a\x18\x14\x6d\xf3\x93\x18\xf4\x7a\x3b\x1e\x94\xe6\xb8\x2d\x3b\xad\x99\x96\x63\x65\xf7\xaf\xe1\x30\x33\x56\xd8\x9c\x3e\xe7\x6d\xdc\x7d\x13\xdb\xf6\x89\x66\x2c\xad\x86\xb4\xdc\xe7\x8a\x0f\x8c\x6c\x6d\xfe\x83\xd7\x8f\x95\xf8\xdf\x0b\x50\xd7\x42\xe3\x27\xaf\xb6\x06\xf6\xb5\x5e\x7b\x05\xec\xa8\xce\x69\x85\x6c\x15\xed\x15\x36\x65\xcd\xcd\xb4\xc7\x55\xae\x23\x3d\x15\xb9\xe2\x44\x48\x37\x75\x3b\x0f\x6a\x3a\x73\x03\xdb\x21\xf1\x22\x1d\x5b\x67\x2d\xba\xbf\xd6\x8e\xe9\x56\x48\xc8\xd6\x02\x45\x1c\xde\x0d\x8d\xb2\xa0\xfd\x06\xcd\x15\x45\x86\xda\x99\x53\x9a\xa8\x0f\xad\xda\xd2\x2b\xd2\x6c\x39\xc8\x29\x7a\xb1\x93\xad\xbd\xae\x15\xd1\x1d\x2e\x3e\xdb\x76\xbe\xfe\x9a\x03\x76\xd8\xc8\x51\x7c\x49\xd1\xba\x41\x79\xc5\x9a\xa1\x3b\x4a\x3c\x3b\x9d\xaa\xc6\x70\x2d\x1b\xf9\xff\x36\x97\x3a\x6e\xba\xff\x43\x0a\xca\xa4\x1a\x91\x73\xa2\x18\x9f\x66\xd0\xfa\xce\x99\x00\x1a\xdd\xec\x34\x78\x61\x06\x35\x77\xef\x9c\x66\xce\x10\x43\x39\x01\x6b\x8e\x37\x74\x2c\x8b\x6f\x03\x27\x61\x9b\xab\xa8\x8a\x7f\x38\x7a\x80\xc5\xd1\x60\x63\x98\xf9\xfa\xd6\x3c\xa9\x47\x57\xfc\xc8\x8a\x30\x2b\x67\xad\x92\x77\x30\xc8\xe2\x08\xbf\x3b\x8a\x29\x1b\xee\x28\xab\x74\x75\x26\xb4\x07\xdd\xe1\x98\xb4\x76\x75\x4e\x8b\x5d\x37\xb5\x0f\xec\xec\xa0\xa3\xdd\x2f\x1b\x97\x5c\x04\xb4\x16\xa4\x54\x60\xd5\x68\x64\x76\x04\xbc\x2e\x86\x9a\x17\x5a\xbd\x38\x3c\xa2\xee\x74\x30\x0a\x8d\x51\xf1\x19\x9f\xfe\xb9\x48\xa9\xde\x2a\xa7\xc8\xb6\xee\x67\xfb\xd6\x0e\x48\x4a\x1c\xd1\xec\xe4\x09\x9b\x92\x82\x4a\x9a\xab\x11\xb9\x71\xe5\x06\x70\x5f\xb3\x49\xd3\x7d\xe3\xe6\xf9\x7e\x51\x00\xf9\x7f\x76\x1f\xd0\xbe\xe1\x0b\x9f\x83\x6e\x42\x71\x4e\x3f\xdf\x95\x72\xba\xc3\xf4\x93\x60\xa1\xa5\x69\x89\xae\x6d\x42\xb8\x51\x9b\x20\x42\x2a\x99\x41\x5a\x66\x90\x12\x3a\x16\x73\x68\xf9\xc9\xaa\x9f\xed\x38\x34\x1a\x2a\x76\xfc\xcd\x27\xc3\xe1\x3c\x51\x46\xc8\x1a\x2b\x91\x95\xba\xb2\x67\x9d\xc0\xe7\x77\xe4\x0f\x18\xbf\x45\x49\x01\x32\x01\xae\xe9\x14\x96\x0d\x8f\xf6\xb9\xb7\x6f\xfe\xe9\x74\x57\x02\x50\x9c\x31\xe3\x3b\x33\xf0\x1b\xb3\x3b\x3f\xd0\xcf\x7f\xe6\xb5\x93\x86\x29\xb2\xa5\x11\xaa\x6e\xe7\x4b\x2f\x82\xa3\x64\x49\x99\xa1\x89\x19\xe3\xe2\x1a\xaf\x33\x5e\x10\x29\x4a\x8c\x8c\x23\x65\xb1\xeb\x58\x4d\x73\xd9\xef\xfe\xf0\x4f\xbb\xfe\xfc\xf2\x33\xcd\x8b\x0c\xde\xf9\xba\x2f\xd6\xd6\x67\xf4\x09\x2d\xc8\xef\xdf\xfc\xd3\xc0\x46\x09\xc0\x63\xc3\xf6\x54\xef\x23\x6a\x36\x51\x59\x10\x96\xdb\x3c\x19\xc8\x16\xd8\xd1\xae\x12\x9c\xb9\xe2\xda\x2c\x44\x69\x2a\xb5\x1a\x10\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x96\xcc\x9d\x68\x68\x84\x47\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x91\x8a\xb7\xbf\x7f\xf3\x4f\xab\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x31\x00\x27\x0f\x2c\xcb\x20\xdd\x55\xc4\x7e\x6e\x22\x27\xa5\xd4\x33\x90\x03\x02\x5c\x79\x4f\x84\x79\xf7\xa5\xf7\x46\x5a\x64\xc9\xf9\xee\x12\x28\xb5\xfe\x50\x74\x6e\x34\x9c\x1d\x6e\xda\x8d\x60\xa6\x49\x2e\x94\x5e\x3f\x1d\x3b\x0d\x46\xf9\xe2\xe3\x64\x57\xf1\x7a\xd8\xc1\x98\xbb\xfa\xeb\x0e\xc2\x79\x4b\xfa\x60\x5c\x0f\x85\x1c\xda\x6e\xde\x11\x2d\xcb\x5d\x04\xbe\xbc\xc5\x42\x0e\xf0\x06\x28\x1b\x0c\x6e\x65\x13\x7c\x71\x6c\xbc\x3b\xbb\x4d\xc5\x23\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x15\x16\xde\xf6\x0c\x2d\x71\x1e\x33\x0f\xe6\xe9\xff\x7b\xf5\xc8\xef\xaa\x52\x2f\xdd\x04\x9b\x79\xbb\x63\xad\x15\xeb\x36\x6a\x0d\x06\x40\x0c\x96\x68\xdd\x91\x82\x35\x6f\x56\x71\xd5\x89\xb0\xe1\xc1\x66\x13\x98\x07\x2c\x51\x6b\xae\xb8\x9a\x01\xef\x7c\x95\x6d\xb8\xaa\xec\x3b\xd6\xb1\x1f\x1a\xc3\x2e\x0d\x1b\x56\x9b\xf8\xf0\x8e\x43\x67\x40\x95\x5e\xb7\x84\x3d\xd7\x7e\xb6\x3d\x9d\xe1\xbb\xdc\xda\xaa\xa3\xd1\x5d\x70\xc6\x2b\x3f\x19\x26\xaf\x8f\x81\x1c\xdd\x82\x8d\x62\xb2\x19\x09\x2d\xa5\xe5\xa8\xf2\x5f\x9b\xc5\x0e\xd2\x67\xb6\x9e\x36\xef\x82\x7b\x51\x7f\xb4\x1b\xa3\x91\x9d\xe7\x3c\x80\xee\x0a\xaa\x42\xa2\x6c\x7c\xd7\xf6\x6e\x68\x70\xd9\x27\xee\x08\xfb\x97\x19\xa9\x02\x92\x91\x04\xe4\x2a\x36\x69\xd0\xda\x55\xd0\xdc\x72\x9e\x3d\xd2\x85\x3a\x3a\x18\xd5\x3c\x07\x4d\x9f\x4e\x4a\x5f\x6e\xdd\x05\x82\x3b\x4d\x79\x4a\x65\xea\xde\xe8\x58\x55\xa3\xef\xc2\x11\x3e\x60\x78\x12\x9f\x88\x77\x64\xa6\x75\xa1\xde\x9d\x9d\x4d\x99\x1e\x3d\xfc\xab\x1a\x31\x71\x96\x88\x3c\x2f\x39\xd3\x8b\x33\x8c\x36\x62\xe3\x52\x0b\xa9\xce\x52\x98\x43\x76\xa6\xd8\x74\x48\x65\x32\x63\x1a\x12\x5d\x4a\x38\xa3\x05\x1b\x26\x82\xcf\x81\xa3\xff\x62\x94\xa7\xbf\xf6\x24\xbd\xac\x0e\xdf\x62\x13\xe8\x50\x91\x73\x18\x96\xfc\x81\x8b\x47\x3e\x44\xf3\x9e\xda\x89\x61\x6c\x17\xb5\xea\x5b\xc0\x1a\xee\x12\xd4\x5a\x88\x1d\x6c\x82\x2f\xbe\xb2\x66\x8a\x86\x94\xa7\x43\x1b\xaa\xf5\xb2\x0b\xdc\xc5\xad\x3a\xac\xc3\x41\xb7\xa7\xae\x9b\x35\x88\x26\x9a\xcd\xa1\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x02\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\xce\x77\x08\x1d\xf4\xed\xce\xb0\xe5\x7b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x94\x86\xdc\x5e\x05\x76\xb4\x6c\x41\xb4\x5c\xd8\xf0\x48\xf9\x40\x98\xf6\x31\x87\x46\xbd\x7f\xc0\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5b\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xff\x65\x97\x7d\x34\x41\x60\xcd\x1d\xbd\xed\xed\xf0\xdc\x49\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8c\x25\xb1\xbe\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x9e\x77\x9a\x14\xb2\x9a\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x8e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x51\xdf\xb8\xab\xde\xeb\x6a\xca\x45\xf5\xf1\xe5\x67\x48\xca\x6d\x31\xd9\x56\x5b\xa8\xdb\xdd\x36\x23\xed\x79\x33\xb5\x8b\x5e\xb6\xd4\x1b\x0e\xe1\xbf\x70\x42\xa5\xc0\xf5\x72\xd2\xa5\xa2\x9a\xa9\xc9\xae\x8e\x60\xdf\xcc\xaa\x56\xeb\x0e\x8d\x50\xae\xea\xc4\x54\x61\x71\x28\x33\xd8\xfc\x6c\xa6\x91\x73\x26\x33\x21\xd4\x2e\x66\xa2\x66\xa3\x76\xd3\xe1\x3b\xcc\x99\xb0\x01\x4a\x88\x39\x20\x49\x6e\xd8\xa6\xbb\xe2\x1b\x44\x59\xd7\x60\xfd\x33\xb6\xab\xae\xee\x1b\x9a\xfb\xaa\xcd\xe1\x03\x71\xcc\xe0\xe8\xde\x32\x7f\x4c\x51\x58\x57\x9a\xa8\x32\x37\xa4\x3c\x02\x9b\xce\xb4\x1a\x10\x36\xda\xd9\x5e\xe4\x9b\x39\x46\x40\x93\x59\xe3\x15\x72\x00\xdd\x2a\x96\xdd\x3c\x7b\x4d\x1f\xe8\xc9\x93\x90\x46\xcf\x37\x87\xef\x30\xa8\xe4\x86\xe5\x23\xb1\x76\x1b\x0c\x08\xe8\x64\x74\xba\x7b\x5c\x85\x6d\x35\x78\x9d\x99\xc5\xf1\x82\x30\x0d\xe6\x32\x46\xd5\x5f\x8a\x72\x6a\xe7\x1a\x7c\x8a\x18\xce\x41\x95\x7d\x8f\x61\x6f\x69\xba\xbb\x49\xc2\xb7\x23\xbb\x68\x47\xe6\xc4\xe0\xdc\x96\xb9\x87\x5e\xc6\x15\x40\x07\x38\x54\x88\x13\x12\x54\x21\xac\x99\x6c\xd9\x35\xfe\x3f\x76\x74\x80\x37\x9b\x19\xea\x44\x9d\xd6\x5b\x6b\xc6\xa6\x33\xbf\xb3\xa8\x93\x0f\xda\x3b\xb2\xdb\x06\xeb\x1e\x16\x62\x5b\xc7\xe0\x10\xdb\xe2\x70\xc1\x46\xd2\x7b\x7d\x3c\x1b\x47\x42\x83\xcc\xab\x65\xc3\x53\x83\xd7\x8a\x73\x4b\xfb\x22\xee\xee\xb0\x92\x37\x9d\xa9\x38\x31\xa7\x9c\x30\xa3\x41\x1a\x3e\x35\x14\xc5\xe9\x88\x9c\x13\x5e\x56\x6c\xf9\x29\xc2\xb8\xa8\xe8\x72\x1d\x19\x62\x95\xa8\xfb\xea\xca\xad\x43\xae\x52\xdb\xba\x45\x63\x36\xdb\xd0\xcd\x00\x3c\x5f\x76\xe5\xa9\x4e\xec\x1a\x75\xec\x20\x4c\x2c\xf0\x7d\xf8\xb7\xe8\xde\xc7\x32\x2c\xba\xe5\x2b\x75\x54\x2f\xc8\x7c\xd0\x94\xe3\x2b\x1e\xd0\x66\x37\x76\x2e\xba\xee\x0a\x12\x67\x67\x90\x48\xf3\x4a\x82\x02\xcc\xd7\xb7\xa5\x59\xae\x20\x34\x5a\xb3\xdd\xba\x2f\xc7\x0b\xfc\x76\xc7\xd8\xfb\xcd\x2d\x94\xb9\xd6\x2d\x88\xcd\xd6\x2d\x16\xc3\xad\xdb\xf2\xee\x8d\x13\xad\x1e\x81\x30\x1c\x2e\x4e\x0c\xfb\x86\x01\xe2\x9c\x1e\xdb\xc2\x39\x6c\xdd\x76\x8f\x82\xdf\xd4\x4f\xb4\xe5\x88\xc5\x22\x6c\xeb\x10\x47\xbf\xbe\xad\x04\xb7\xbd\x4c\x58\xfd\xfa\x16\x10\x1f\xbb\xae\x75\x0d\xc1\x5f\xdf\xe2\x33\x0a\xd3\x6e\x5f\x21\x4a\x7f\x7d\xdb\x2a\x76\x7f\xd0\x0e\xdc\x27\xdf\x6a\xcb\x98\x7e\x08\xba\x65\xeb\x16\x79\xc5\xbb\x05\xfc\xaf\x6f\x2f\xb3\xde\xe7\xaf\x97\x12\xb0\xbe\xed\x39\x51\x60\x47\xa2\x36\x13\xf4\xad\x36\xc4\xfc\xa0\x07\x8d\x1f\x47\xa2\xa6\x41\x82\x85\xd9\xf3\x51\xe5\x4e\xc1\x1e\x38\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xe6\xb6\x75\xf6\x44\x48\x36\xc4\xfa\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xd5\x3b\x47\x3d\xe1\x1b\xeb\x8c\xdc\xa3\x8a\x60\xdd\xa1\xbd\x8a\xf0\x6c\xeb\x55\x84\x5e\x45\x78\xbe\xf5\x2a\xc2\x6a\xeb\x55\x84\x5e\x45\x08\x6a\xbd\x8a\xf0\x6c\xeb\x55\x84\x67\x5b\xaf\x22\xd4\xad\x57\x11\x0e\x5f\x45\x08\xcd\x90\x5d\xdf\xac\xbf\x25\x9a\xdb\xe7\x2f\xd6\xdd\xb8\xec\xe7\x41\xe5\xc6\x87\xb9\xb7\x1d\x3e\x46\x8a\xbe\x73\xa2\xc6\x3d\x3a\x89\x5c\xb2\xb7\xa4\x7c\x0a\xe4\xed\xf0\xed\x9b\x9d\x93\x2a\x9a\x2d\x24\x36\xbd\xd9\x76\x05\x8d\x5a\x6d\xd1\x77\xc6\xa6\xf8\x85\xc3\x0b\xe9\x71\x9c\xbd\x8a\xab\x68\x29\x9f\x1b\xe2\x6b\xaa\x8a\x04\x39\xe8\xdd\x13\x22\x7c\x6b\x3a\xa6\x59\x0e\x55\xd0\x9b\x65\xeb\x2e\x8d\xa7\x4e\x8a\x15\xdc\x05\x48\x98\x6d\xd9\x75\xdb\x75\x7a\xdb\x04\xa8\x4d\x36\x1f\x83\x79\xe3\xae\xa1\x44\x9a\x28\x91\x83\x85\x6b\xf3\x57\x87\x79\x5d\xf0\xdb\x80\x9c\xc0\x68\x3a\x22\x69\x09\x0e\x06\xc1\x66\x9d\x9c\x0e\x1a\xc1\x99\x5d\x63\x89\x8c\xc0\x23\xf1\x3f\x66\x62\x5d\x4c\x27\xcc\x81\xeb\x92\x66\xd9\x82\xc0\x9c\x25\xba\x5a\x01\x4c\xce\x62\x5a\x05\xcc\x75\xb0\x2a\x1a\xaa\x7e\x0e\x57\xf8\x57\x37\xf1\x24\x5c\x4f\x5c\xa1\xa3\x3b\x4f\x5f\x2a\x08\x60\x67\x68\xb4\xd1\x92\xa4\xcd\x68\x36\x20\x0d\xff\x89\x07\xf7\xe3\x6d\xd7\xd8\x1d\x12\x49\x1e\x09\x96\x41\x62\xaa\x06\x2e\x60\x46\x48\x17\xd2\xb3\x3a\x83\x6b\x42\x66\xd6\xe0\x7f\xec\x9c\x9b\xdf\x6e\x7a\x06\x79\x17\x0c\x91\x75\xcd\xd0\x76\x2f\x0a\x91\x89\xe9\xa2\xb9\xf1\x5c\xdd\xfe\x1a\xed\x9c\x12\x55\x8e\x9d\x72\x6b\xce\xfe\xf5\xd2\x4e\xed\x83\x3d\x36\xb6\x3e\xd8\x63\xa5\xf5\x96\xdc\xde\x92\xbb\x43\x3f\xbd\x25\xb7\xb7\xe4\xf6\x96\xdc\xde\x92\xdb\xb5\xf5\x96\xdc\x9d\x88\xea\x2d\xb9\xa4\xb7\xe4\x6e\x6c\xbd\x25\xd7\xb5\x3e\xd8\x63\x6d\xeb\x55\x84\x5d\x5b\xaf\x22\x84\xf7\xd3\xab\x08\xbd\x8a\xd0\xab\x08\xbd\x8a\xd0\xb5\xf5\x2a\xc2\x4e\x44\xf5\x2a\x02\xe9\x55\x84\x8d\xad\x57\x11\x56\x3b\x8e\x16\xec\xf1\x02\xe4\xc6\x24\xb4\x10\x69\x74\x38\x97\x42\xa4\x4f\xa0\xb9\x58\x5f\x78\x22\x86\x99\x48\x28\xd6\x12\x64\xf6\x27\x2e\x06\x45\xd1\xdc\x86\x02\x0c\xc8\x3f\x04\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x01\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x7b\x34\x98\x6d\x5a\x8f\x06\xd3\xa3\xc1\xf4\x68\x30\xaf\x8b\x06\x33\xa3\xca\x95\xb8\x40\xa1\x68\x33\x38\x4c\x83\x63\xdf\x83\xcc\x7b\x6c\x98\xe7\xda\x8a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\x6f\xda\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\xa1\x3d\x3c\x82\x4c\x98\xab\x30\xb3\x74\x9a\xdd\x0c\x77\x65\x88\x07\x02\xb8\xd2\x9e\x89\x80\x9e\xf6\x8f\xba\xd2\x7e\x95\x68\xa1\x4a\xcd\x88\xad\x96\xf8\xf3\xc5\x61\xb0\xc4\xb1\x17\x0e\x89\x76\x61\x4a\xdf\x07\x59\x0c\x63\x99\xf7\xd0\xfc\x76\xb7\x53\x4d\xd9\xcd\x2d\xb6\x49\xc3\x17\xea\xfc\xef\x12\xe4\x82\x88\x39\xc8\xda\x58\xe5\x6f\x5a\xe5\x62\xb4\x11\x0b\xdf\xd5\xa1\x0d\x57\x4d\xaf\x26\x16\x65\x8a\x97\x59\x36\xb0\xbd\x2f\xb3\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\x1c\x58\xc5\xda\xcd\x2d\xae\x79\x22\xa2\x71\xe2\x85\xac\x87\x87\x52\x19\x77\x73\x7b\x49\xff\x12\x89\xed\x63\x22\x91\xfd\x4c\x24\xa2\xaf\x89\xc4\xf5\x37\x91\xe8\x3e\x27\x12\xd3\xef\x44\x5e\xbd\xd2\xef\xe6\x16\xdd\xac\x18\xdb\x15\x45\x5e\x8c\xc1\x90\xd7\xae\x28\xbc\xb9\xbd\x4e\xad\xe1\xcd\xed\x05\x76\x41\x4c\xf7\x14\x79\xd1\x3d\xb0\x97\x9a\xc6\x9b\xdb\x41\x3a\xad\x9e\x24\xec\xc5\xeb\x20\x6f\x6e\xd1\x7d\x40\xe4\x05\xfc\x40\x24\xb6\x2f\x88\xbc\xcc\x91\x7d\x61\x9f\xd0\x2b\x0c\xd0\xa9\x7a\xf3\xe6\xf6\x12\x3c\x67\xaf\x15\x9f\x9f\x22\x6b\x8f\xb5\xa0\x37\xb7\xfd\x57\x89\xde\xdc\x22\x4b\xe7\xa1\x95\xa5\x9f\x23\x34\x0a\xab\x78\x19\xf7\x2b\x69\x9d\x8b\xef\x61\x11\x37\xf8\x33\xc2\xc9\xfd\xd0\xa2\xce\xab\x9f\xda\xd5\xb0\xab\xa5\x76\xf4\xb5\x59\x81\xdd\xf9\x08\x5c\x45\xec\x2c\x0b\xa6\x61\x0c\x44\xd3\x07\xc0\x88\x0b\x81\xe5\x48\x58\x0a\xb6\x6e\x8d\xdd\xea\x38\xbe\xd9\xe2\xa5\x82\xd4\x10\x92\x09\xf1\x50\x16\xfe\xa8\x60\x5a\x71\x8c\x83\xc9\x78\x22\x72\x9f\x3f\x6d\xb3\xe9\xcc\x89\x77\xbc\x60\x68\xeb\x8c\xd9\xcf\x91\x1c\xbc\xa4\x9d\x51\xf5\xef\x2d\x23\xdf\xdf\x09\x55\xe4\xef\xa8\xfe\x70\x72\x82\x3f\x3c\xfd\x7b\x78\x68\x66\xb5\x04\xd6\x2f\x27\x4a\xe4\xb0\x4b\x45\xca\xdb\xab\xf3\xd4\xec\x06\x13\xe4\x6b\xa3\x34\x27\xee\xd8\xfa\xd3\x4f\x28\xd7\xec\xb4\x32\x45\x8f\x08\xee\x2f\xd4\xfd\x52\xc1\x8f\xb5\xa5\xda\x73\x7d\xdf\x41\x78\x44\x66\xb5\x72\x75\x64\x8f\xf5\x70\x8f\x5c\xd9\x77\x5b\x85\xaf\xaa\x19\x67\x65\xbc\xe0\x71\xef\x7d\xec\x80\x53\x79\x27\x42\x8e\x59\x9a\x02\x16\xda\xac\x5e\x75\x2c\x3c\x34\x46\x7d\xe4\x0c\xdf\x6f\xed\x9d\x70\x62\xce\x33\x25\x06\xcb\xe3\x24\x94\x7b\xf0\x03\xd0\xb6\x5a\x67\x6b\x58\xc2\x94\x59\x16\x05\xc1\xea\xd7\xc1\x85\x87\xbf\xd4\x3d\x11\x39\x45\x80\xa9\x03\xbf\x2b\x96\x09\xec\xaf\x8b\xe8\xd7\x05\x17\xba\xbf\x31\xfa\x1b\x63\xe9\xc6\x58\x39\x78\x2f\x77\x69\xac\x0c\xd5\xdf\x1b\x07\x7e\x6f\x70\x9a\x83\x2a\x68\x02\x5f\x90\x87\xd9\x9a\xff\x6d\xde\x9a\x27\x5f\x35\xca\x69\x83\xcc\xa3\x7a\x05\x3c\x54\x0d\xde\x58\xd8\x6f\xea\x43\xa1\x4a\xde\xa8\xb5\xda\x20\xc6\xf2\xcd\xe5\xa8\xbf\x60\x4a\xbc\x9a\x2f\x38\x28\x74\xbe\x42\x15\x7b\xda\x18\x1c\xc7\x0a\x7f\x6d\x84\xa0\xa9\xdd\x2c\x3c\x5d\x06\xa5\xa9\x47\x44\x3f\x70\x0e\x94\x2b\x72\xe4\x83\x62\x8f\x55\xfd\xc4\x96\x45\x95\x9f\x6a\x55\x79\xab\x8a\xa2\x93\xff\xfd\x7f\x4e\x5b\x25\xad\x6a\x82\x7a\x2f\xff\xd6\xad\xf7\xf2\x07\xb5\xde\xcb\xdf\x7b\xf9\x63\xf4\xd5\x7b\xf9\x7b\x2f\xff\xda\xd6\x7b\xf9\x7b\x2f\x7f\xef\xe5\xef\xbd\xfc\xab\xad\xf7\xf2\xf7\x5e\xfe\x46\xeb\xbd\xfc\xdd\xc9\xea\xbd\xfc\x3b\xb6\xde\xcb\x1f\xd3\xcb\x5f\x1b\x2e\x0e\xcd\xfa\xd6\x34\x69\xb9\x4c\x56\xd4\x3e\x35\xd5\x2c\xa9\xd1\xa3\xfc\x53\xf6\x5f\x87\x65\x8a\x6b\x9a\xc9\x5e\xc6\x10\xd7\x34\xf6\xad\xd8\x53\x23\xd9\xe1\x36\x5a\xdd\x2a\xbb\xdc\xca\xc8\x2f\x6a\x90\xeb\xcd\xed\xdd\xa8\xac\x53\xcb\x0e\xed\xa8\xdf\x7b\x30\x03\x35\x13\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd6\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x61\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x25\x72\xa5\xe6\x8b\x31\x85\xfb\x83\x66\x99\x78\x0c\x97\x36\xa2\x9c\xeb\xc8\x65\x6b\x02\x4f\xdb\xe3\xce\x55\x6f\x96\x72\x7f\xc3\x34\xdb\xbe\x60\xce\x96\xad\x2f\x98\xf3\x7c\xeb\x0b\xe6\x3c\x5d\x30\xa7\x11\xd9\xd4\xac\x9c\xd3\x75\xb6\xb1\xde\xce\x1e\x2a\xe7\x10\xf2\x97\x19\x20\xdf\x90\x60\xc3\x91\xca\x4c\xb3\xa2\x46\x44\x53\x76\xe5\x33\x6b\x88\x9b\x38\x64\x9d\x36\x17\x33\x34\xd2\x64\xd6\x91\x80\x25\x1e\x88\x54\x20\xee\x9a\xc2\x9b\xcd\x22\xca\xa0\x1f\xd8\x96\x95\xf1\x16\x3a\x0b\xec\xc3\xbe\x7c\xfc\x8f\x80\x5b\xe7\x3d\x8a\x3d\xed\x78\x3b\x45\x4e\x8c\xb4\x94\x2d\x5c\xd4\x59\xeb\xfa\x69\x89\x59\x9d\x87\xb5\x5e\x84\x39\x78\x15\x6d\xca\xe6\xc0\x6b\x19\xed\x44\x9d\x9e\x7a\x5d\x71\x59\xf6\xec\x3c\x66\x88\xcc\xda\xfd\x5e\xdd\x55\xd6\x5c\x92\x15\x3b\x8f\xbb\x46\xc6\xfc\xf7\x86\x2c\xf6\x1f\xcf\x4b\x99\x9d\x87\xb6\xac\xcd\xc3\x2d\x35\xb6\x55\x2d\x5d\x76\xec\xfb\x40\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\xb5\x0f\xd8\x8f\x3d\x40\x7e\xfc\x92\x0a\x46\x1d\x64\xf0\xcf\xc1\xd9\x99\x5e\x02\x2d\xfe\xa0\x83\x7d\x7a\xb8\xf8\xa0\x7e\x7e\x51\x70\xf1\x7b\x0a\xe6\xf9\x05\xa2\xc6\x1f\x40\xf0\xce\x3e\x03\x77\x7e\x71\xa8\xf1\x07\x14\xa8\x73\x90\x41\x3a\x87\x16\xa0\xd3\xc3\xb0\x07\xb5\x2f\x13\x86\x3d\x6a\x10\x4e\x6c\x3e\x72\x80\xc1\x37\x07\x18\x78\x73\xa8\x41\x37\x11\x25\xe5\x97\x09\xb6\x89\xc4\x02\x5e\x26\xc8\x26\x5e\x6a\x74\xcc\x53\xb9\x6f\xf8\x8c\x83\xc8\x85\x3e\x64\xd8\x8c\x83\x4a\x80\x3e\xac\xe4\xe7\x7d\x24\x3e\x1f\x0c\x4c\xc6\x1e\x21\x32\xe2\x88\x81\x11\x84\xbf\x97\xe0\xf7\xf1\x64\xb1\xa8\x70\x18\x51\x79\xfe\xfe\x61\x30\xbe\x5a\xb6\x1f\x11\xfe\xa2\xe7\xfc\x1b\xdb\xa1\x73\xfe\x97\x86\xbb\xd8\x2f\xd4\x45\xcf\xff\xb7\x6a\x51\x61\x2d\x5e\xd8\x73\xfa\x9a\x70\x16\x87\x01\x65\xf1\x6a\x30\x16\x87\x03\x61\xf1\x6a\xf0\x15\xbd\xc7\xba\xf7\x58\xb7\x5b\xef\xb1\xee\x3d\xd6\xbb\xf4\xd3\x7b\xac\x7b\x8f\x75\xef\xb1\xee\x3d\xd6\x81\xad\xf7\x58\x77\x24\xaa\xf7\x58\xaf\x6f\xbd\xc7\xba\xf7\x58\xf7\x1e\xeb\x95\xd6\x7b\xac\x83\x08\x3c\x50\x8f\x75\x1c\x48\x88\x98\x27\xf2\x90\xa0\x20\x0e\x01\x06\xe2\xb5\x20\x20\x0e\x0e\xfe\xa1\x37\x41\x6f\x47\x5d\x1c\xa8\x87\x98\x47\xf8\xb0\x21\x1e\x0e\x19\xde\xe1\x40\xa1\x1d\x5e\x06\xd6\xe1\x25\x21\x1d\x82\xcf\x6c\xd4\xd3\x5a\x88\xf4\x9c\x6b\xe6\x53\xc8\x76\x3f\xa7\xad\xd3\xf9\x1e\xff\x18\x83\x3d\x63\xad\x03\xd3\xcc\x93\x97\x65\x06\xca\xa5\x89\xd3\xb9\x60\x29\x29\x4a\xad\x6d\xe6\xad\x3b\x9f\x7e\xe3\xd3\xdc\x66\xca\x0f\xc8\x3f\x04\x87\x01\x01\x9d\x8c\xcc\xe6\xc6\x1c\x74\xa1\x67\x20\xcd\xe3\x27\xea\xf4\x74\xf7\x35\x09\x92\xcf\xc2\x4c\x7b\x85\x84\x09\xc8\x2f\x02\x59\x01\x3d\xcf\x0e\xbe\x40\x5a\x87\xb7\xa5\x1e\x43\x04\xdc\x17\xf6\xf8\x69\xe1\xb2\xde\xf1\xd8\xdb\xb4\xf3\xae\x37\x24\xe2\x1b\xb4\x36\x10\x34\xdc\x1c\x1b\x30\x0e\x06\x64\x5c\x6a\xc2\x34\x02\x03\x24\x33\x21\x54\x57\xee\xe2\x92\x94\xf1\x45\xe6\x4c\x58\x73\xba\xe0\x80\xa8\x03\x42\x56\x3c\xb0\x41\x94\x55\x25\xea\x9f\xb1\xae\xca\x56\x2e\x94\xae\x77\x88\x37\xce\x9a\xc1\xab\x3b\x67\x2a\xc1\x50\xa4\x89\x2a\x73\x43\x8a\x05\x54\x51\x16\x02\xa0\xe3\xb0\x13\x23\x62\xd1\x64\xd6\x78\x85\x1c\x40\x5b\xd7\x9c\xcf\x72\x6e\x1c\xe2\xa6\xce\x74\xe2\x73\x5e\x3b\x8e\x6d\x3a\x03\xa5\x07\x1b\x11\x47\x36\xef\x05\xcb\x13\x4e\xbb\x1a\xa5\x12\x91\x17\xa5\x06\x23\xc7\x97\xb9\xd9\x4d\x4c\x63\xc4\x0a\x32\x23\x29\xca\xa9\x9d\x70\x0f\xf2\x60\x27\xa2\x46\x10\xe1\x29\xea\x66\x9d\x2f\xfe\x23\xbb\x72\x47\x5e\x78\x37\x44\xb0\x49\x05\x10\x42\x66\x54\x35\x43\x6d\xea\x7b\xf5\x19\x80\x9c\xff\x11\x70\xb3\x9a\x81\x4f\x54\x43\xc2\x99\xb1\xe9\xcc\x6f\x36\xa3\x1d\xa3\x4d\xa1\xb5\x49\xbf\x74\x64\x09\x73\x72\xdd\x19\x42\x71\xa5\xde\xf1\x76\xc6\x53\xf2\x17\xfc\x16\xd2\xe5\x7c\x6b\xdc\x07\xd6\x68\x40\xd3\xd4\x08\x22\x20\x87\xf6\x04\x09\x32\x61\x4e\x45\x5a\x3a\xd2\x6e\x86\xbb\xb2\xc6\xc3\x40\x07\x58\xda\x71\x01\x3d\xd9\x99\xef\xd8\x41\x0c\x1f\xdb\xd2\xab\x44\xd3\x56\x6e\xdd\x34\x8f\xc8\xb9\x95\x88\x3c\xff\x32\xaa\xfb\x60\x05\xff\x6a\xf5\x54\xdb\x99\x39\x80\x68\x88\x38\x8e\xda\x18\x90\x12\x24\xa2\x5f\x35\x1a\xb4\x04\x79\x9d\xba\x3f\xaf\x00\x31\x41\xf6\x03\x33\x41\xfa\x9a\x33\x87\x15\xc4\x43\xfa\x9a\x33\x07\x16\xd4\x43\xfa\x9a\x33\x7d\xcd\x99\xee\xed\x10\x82\x7e\x48\x5f\x73\xe6\x00\x82\x80\x48\x5f\x73\x66\x9b\xd6\xd7\x9c\xe9\x6b\xce\xac\xb6\xbe\xe6\x4c\x5f\x73\xa6\xd1\xfa\x9a\x33\xdd\xc9\x3a\xb8\x40\x22\x72\xc0\xc1\x44\xa4\xaf\x39\x13\xb9\xe6\x4c\xbc\xf4\x68\xf2\x02\x27\x77\xdf\xd0\x18\xe4\x50\xf2\xa4\xc9\x81\x43\x64\x90\x43\x4b\x96\x26\x07\x97\x30\x4d\xf6\x94\x34\x4d\x0e\x09\x32\x83\xec\x17\x36\x83\x1c\x62\x62\xde\x97\x51\xb2\x28\x2a\x94\x06\x79\x89\xbb\x62\xff\x90\x1a\xe4\x6b\xbf\x2e\x22\x42\x6b\x90\xfe\xc6\xd8\xa6\x7d\x09\x37\xc6\x4b\x43\x6d\x90\xbd\xc3\x6d\x90\xfe\xde\xe8\xda\xa2\x42\x70\x90\xd7\xf1\x30\xbf\x26\x14\x07\x39\x18\x38\x0e\xf2\x9a\x90\x1c\xe4\xa0\x60\x39\xc8\x6b\x42\x73\x90\xde\xcb\xdf\x7b\xf9\xb7\x6e\xbd\x97\xbf\xf7\xf2\xc7\xe8\xab\xf7\xf2\xf7\x5e\xfe\xb5\xad\xf7\xf2\xf7\x5e\xfe\xde\xcb\xdf\x7b\xf9\x57\x5b\xef\xe5\xef\xbd\xfc\x8d\xd6\x7b\xf9\xbb\x93\xd5\x7b\xf9\x77\x6c\xbd\x97\x3f\xa6\x97\x3f\x0e\x8c\x08\x79\x81\x53\x7b\x48\x70\x22\xe4\x40\x20\x45\xc8\x2b\xc2\x8a\x90\x43\x84\x16\x21\xbd\xb9\xbd\x33\x95\x71\xe0\x46\xc8\x0b\x1c\xf5\xc3\x86\x1d\x21\x07\x0e\x3d\x42\x0e\x17\x7e\x84\xbc\x18\x04\x09\x79\x61\x18\x12\x12\xeb\x5c\xdb\x14\xd5\x43\x01\xf8\xb1\xd4\xac\x64\xd6\xb6\x4a\xfb\x3f\x99\x38\x1f\xa6\xd9\xba\x43\x23\x29\x9f\x02\x79\x3b\x7c\xfb\xe6\x4d\x78\xee\x2e\xe3\x1a\xa6\x10\x62\xbd\x9c\x08\x99\x53\x8d\x3d\xfd\xfe\x77\x9d\xfa\x89\xce\xb6\x37\xe1\x3c\x1c\x1e\xfe\x89\xb3\x89\xb4\xf1\x27\x5a\xd2\xff\x06\x30\x12\xd4\x0a\xcc\x69\xcd\x41\x93\xce\xbe\x81\x06\xe2\x86\x66\x39\x0c\x3c\xef\xb7\x31\x11\x3e\x00\xc0\xc1\xb0\xa4\x44\x70\x27\xb2\x19\x76\xd7\x75\xef\x75\x7f\xe5\x04\xa8\x42\xe4\x83\x31\x98\xd7\xee\x38\x3e\xd5\x16\xdf\xa7\x10\x8c\x6b\x6f\xe8\x31\xef\x0c\x7e\x43\x38\xf0\xa0\xb4\x04\x6b\x41\xad\x63\x9c\xca\x22\xa5\x1a\x4e\x43\x54\x45\xb5\x50\x1a\x72\xc4\x90\x31\x92\x1e\xc5\xe0\x1f\xa2\xe5\x02\x03\x40\xe6\xc0\x75\x49\xb3\x6c\x41\x60\xce\x5c\xfc\x8e\x19\x1e\xa3\x97\x98\x56\x41\x33\xff\x97\x19\x20\x07\x91\x60\x03\x93\xca\x4c\xb3\x22\xab\xe1\x47\xec\xf2\x67\xd6\x24\x37\x71\x68\x3b\x6d\x7e\x66\x68\xa4\xc9\xac\x23\x01\x4b\xdc\x10\xa9\x30\x0c\x48\x2a\xbc\xe3\x2c\xc0\x0c\x7a\x84\x8d\xaa\xa0\x2a\x5b\x9d\x05\xfb\x61\x5f\x3e\x12\x48\xc0\xfd\xf3\x1e\x05\xa0\x76\xe4\x9d\x22\x27\x46\x6e\xca\x16\x2e\xfe\xac\x75\x11\xb5\x04\xae\xce\xc3\x5a\x7f\xc2\x1c\xbc\xb2\x36\x65\x73\xe0\xb5\xb4\x76\xa2\x4e\x4f\xbd\xd6\xb8\x2c\x85\x76\x1e\x33\x44\x7a\xed\x7e\xc3\xee\x2a\x75\x2e\x49\x8d\x9d\xc7\x5d\x23\x6d\xfe\x7b\x43\x2a\xfb\x8f\xe7\xe5\xcd\xce\x43\x5b\xd6\xe6\xd1\x97\x1a\xdb\xaa\x96\x33\x3b\xf6\x7d\x20\x28\x32\xe1\x80\x20\x31\x3c\xb2\xd1\x80\x40\x5e\xb8\x52\xd2\x2b\x00\x80\xec\x01\xfc\xa3\xaf\xd8\xd3\x57\xec\x69\xb7\xbe\x62\x4f\x5f\xb1\x67\x97\x7e\xfa\x8a\x3d\x7d\xc5\x9e\xbe\x62\x4f\x5f\xb1\x27\xb0\x1d\x50\xc8\xce\x41\x86\xeb\x1c\x5a\xa8\x4e\x5f\xb1\x27\xa8\xf5\x15\x7b\xfa\x8a\x3d\x7d\xc5\x9e\x46\xeb\x2b\xf6\x84\x1c\xcd\x78\x49\xd2\x31\x4f\xe5\xbe\x81\x34\x0e\x22\x2b\xfa\x90\x01\x34\x0e\x2a\x15\xfa\xb0\xd2\xa0\xf7\x91\x02\x7d\x30\x80\x19\x7b\x04\xcb\xe8\x0b\x3c\x6d\xd5\xa2\x02\x63\x44\xe5\xf9\xfb\x07\xc4\xf8\x6a\xd9\x7e\x44\x20\x8c\x9e\xf3\x6f\x6c\x87\xce\xf9\x5f\x1a\xf8\x62\xbf\xa0\x17\x3d\xff\xdf\xaa\x45\x05\xb8\x78\x61\xcf\xe9\x6b\x02\x5b\x1c\x06\xa8\xc5\xab\x01\x5a\x1c\x0e\x98\xc5\xab\x01\x59\xf4\x1e\xeb\xde\x63\xdd\x6e\xbd\xc7\xba\xf7\x58\xef\xd2\x4f\xef\xb1\xee\x3d\xd6\xbd\xc7\xba\xf7\x58\x07\xb6\xde\x63\xdd\x91\xa8\xde\x63\xbd\xbe\xf5\x1e\xeb\xde\x63\xdd\x7b\xac\x57\x5a\xef\xb1\x0e\x22\xf0\x40\x3d\xd6\x71\xc0\x21\x62\x9e\xc8\x43\x02\x85\x38\x04\x40\x88\xd7\x02\x83\x38\x38\x20\x88\xde\x04\xbd\x1d\x75\x71\x40\x1f\x62\x1e\xe1\xc3\x06\x7b\x38\x64\xa0\x87\x03\x05\x79\x78\x19\x80\x87\x97\x04\x77\x08\x3e\xb3\xd1\x4e\x2b\x2d\xb5\xc8\x45\xc9\xf5\x1d\xc8\x39\x4b\xe0\x3c\x49\xcc\x5f\xf7\xe2\x01\x76\xcc\xea\x6f\x1d\xd1\xf3\x27\xba\x25\x8c\xa7\x2c\x41\xdb\xe4\xe3\x0c\xf4\xcc\xa5\xcd\xe1\x73\x84\xda\x07\x89\xc6\x27\xeb\x13\x8a\x74\x9a\x3b\x16\x33\xbb\xb1\xeb\x5d\x97\xc0\xce\xd0\x58\x88\x0c\xe8\x2e\xae\x68\x27\x33\x82\xdc\x91\x51\x87\xf1\xac\x1f\x9c\x28\x51\x8f\x4e\xc6\x90\x09\x3e\x75\x39\xe4\x8e\xeb\xec\xba\x0b\x2f\xea\xee\x9c\xab\x36\x29\xa5\x04\xae\xb3\x05\x4e\x73\x9a\x42\x4a\xd0\x3c\x95\x8b\xf9\xee\x9b\xfc\x1e\xd9\x91\xd7\xe1\xa9\x26\x19\x50\xf3\x1e\x1c\xea\x17\x31\x0c\x8d\x92\x9b\x0e\xb4\x57\xbe\x65\x0b\x22\xd0\x69\xfd\x77\xbf\xb1\x3b\xdd\xd1\xed\xd3\xe0\xf5\x32\x94\xd2\x12\x34\xf2\x35\xe6\x03\x19\xe4\x42\x94\xe4\x91\x5a\x55\x4a\x96\x1c\x59\x2a\x4e\x54\x87\x45\x0e\x50\x3a\xba\x1b\xe3\x87\x78\x2f\xed\xf8\xb3\x10\xe3\x38\x95\xd3\x4e\xa2\x53\x0c\x59\xe2\x5c\x4e\x4b\xab\x29\xba\xa3\x08\x5c\xcb\x05\xe2\x61\x74\xbb\x17\xee\x67\xad\x13\x92\xd3\x29\x1c\x2b\x72\xf1\xe1\xbd\xb9\x75\x30\x02\x89\x4d\xac\xcc\xee\x6e\xa1\x42\x8a\x39\x4b\xbb\x5e\x43\x9f\xa8\x64\x74\x9c\x19\xad\x77\x02\x12\xb8\x91\xa4\x7f\x73\xf2\xe9\xfc\xf6\x6f\xd7\xe7\x1f\x2e\x4f\x51\xff\x85\xcf\x05\xe5\x86\x1d\x94\xaa\x46\xe6\x71\x14\x1e\x2b\x02\x7c\xce\xa4\xe0\x66\x16\xd0\x6e\x48\xc9\xdc\x75\xda\x89\xa2\x3a\x70\x44\x82\x12\xd9\x1c\x52\x8b\xa5\x51\x11\x58\x87\xef\x14\xa5\xf6\x16\x54\x1f\x7b\x53\xf2\x64\x46\xf9\x14\xd2\x11\x79\x2f\x4a\xf3\x62\xbf\xf9\x0d\xbe\x84\x84\xb4\x4c\xa0\x9b\x8e\x63\x4d\xf0\xf6\xe4\xfe\x66\xe0\x65\x16\x73\xfb\x63\xec\x0d\x01\x95\xd0\xc2\x4f\x4d\x73\xf6\xd4\x82\x6b\xfa\xf9\x9d\xc5\xe2\x38\xfa\x4d\xe3\xab\xa3\xee\x81\x6b\x85\x14\xe6\x55\xac\x2c\x68\xdf\x3e\x63\x1a\x24\xcd\xc8\x51\x73\x84\x11\xb9\x34\x74\x41\xda\x5c\x5b\x0b\x46\x03\x73\x90\x68\x5b\x75\x2b\x3b\x20\x12\xa6\x54\xa6\x19\xa8\x6e\x46\x21\x31\xa9\xae\x70\x6b\x6a\x71\xbb\x0a\x2a\x9b\x31\x17\x7a\x14\xca\xb8\x7d\xfb\x20\x10\xec\x64\x22\xde\x91\x99\xd6\x85\x7a\x77\x76\x56\x4b\x41\x23\x26\xce\x52\x91\xa8\x33\x4d\xd5\x83\x3a\x63\xdc\x30\xbf\x61\x4a\x35\x1d\x36\xb8\xee\x99\x95\x8d\x87\x89\xc8\x73\xca\xd3\x21\x75\xe7\x78\x58\xed\xec\xb3\x5f\x3b\xe9\x71\x48\xab\xa7\x18\x1f\xd2\xa1\x9a\x41\xa7\x95\x0b\x53\x14\x03\x14\xc4\x40\x21\x33\xb2\x42\xe8\xe6\x72\x5f\x0c\xfb\xb2\xe2\xcf\x76\x29\x46\xe4\x5a\x68\x87\x57\xe4\x22\x2a\xf1\xb6\xc5\x55\x8e\xc9\xc2\x2f\xaf\xef\x6f\xff\x7a\xf3\xf1\xea\xfa\xbe\xe7\xe4\x3d\x27\xc7\xd6\x73\xf2\x9e\x93\x77\x18\xf8\x50\x38\x39\xf0\xf9\xbe\xb8\xb8\x57\x8a\x1b\x1c\xab\xda\xaa\x2e\x51\xa0\x0a\xf3\xae\xf6\x41\xb7\x2d\x1a\x65\xa7\xef\x6d\xc7\xb4\x26\xfb\x92\xcf\x3f\xd1\x76\xc4\x09\x5f\x3b\x85\xc4\x3d\x60\x35\xf4\x8b\xb0\x09\x0c\xf6\x7c\x85\xc6\x85\x75\x52\x48\x6d\x0b\x8f\xd9\x32\x43\x77\x37\x78\xb7\x96\xef\x9a\xe6\x95\xb9\x75\xdd\xaa\x8d\xc8\x07\x6f\x6f\x21\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\x6d\x77\x03\x65\x04\x97\x02\x1a\x89\x23\x4d\x40\x90\xbd\x7f\x17\xf9\x28\x60\x98\x5a\xb2\x2a\x24\xcc\x99\x28\x55\xb6\xa8\x0c\xf1\xeb\xd9\xd5\x32\x9f\x22\x94\x87\x50\x40\xf9\xa2\xb2\xa2\xae\x1d\x70\x49\xb6\x5b\x27\xa7\x85\x98\xb4\xf7\x2b\xe1\x39\x22\x62\xc8\x79\x01\xe3\xaf\x91\x10\xb7\x97\xf6\x02\xc6\xed\x24\x27\x6e\x92\xf9\x02\xe8\x68\x4b\x8b\x01\x1d\xbd\xb7\xe9\x53\x78\xa7\x1f\x05\x4c\x4d\x2c\x4e\xf6\x8d\x14\x79\x24\x6e\x76\x87\xb8\x80\x55\x3a\xdb\xba\xa3\x7a\xec\x62\xc4\x5b\xf2\xb6\xd3\x1c\xab\x84\x32\xf3\x79\x60\x52\x59\x94\xe0\x94\x38\xf1\xcd\x89\xe0\x13\x36\xfd\x40\x8b\xef\x61\x71\x0b\x93\x30\x97\x78\x7b\xbe\xd1\x3b\xe8\xa2\x6c\xd1\x0f\x69\x24\x1b\x3b\x58\x98\x87\x30\x5a\x6c\x4f\xac\x08\xf8\xf0\xe8\xf7\x78\xc1\xea\x51\x02\xd5\x5b\x0b\xe9\x92\x72\xeb\xac\xd4\x58\x79\x0c\x51\xe2\x1f\xc3\x04\x3e\xdf\xe2\x07\x21\x37\xa5\x47\x77\x3d\x44\x89\xe5\xbe\xaf\x41\xc5\x99\x22\x30\x99\x40\xa2\xd9\x1c\xb2\x0a\x88\x3c\x1d\x90\x71\xa9\x3d\x04\xf8\x98\x26\x0f\x8f\x54\xa6\x8a\x24\x22\x2f\xa8\x66\x63\x96\x31\xbd\x20\x2c\x46\x19\x2b\xe7\x91\x77\xb8\xe6\x3e\x94\x99\x2b\x4d\xf1\x2a\x14\xce\xde\x66\x56\xdb\x86\x2a\x50\x9f\x87\x66\xb9\xa9\xc7\xf3\x8e\x42\x4a\x2e\x94\x26\x09\x48\x23\xd4\x65\x0b\xf2\x28\x45\x8c\x52\x13\xdb\xda\x4c\x12\xc1\x13\x28\xb4\x3a\x13\x73\x23\x0b\xc2\xe3\xd9\xa3\x90\x0f\x8c\x4f\x87\xe6\xc5\x87\x96\x59\xa9\x33\x0c\x21\x39\xfb\x35\xfe\xe7\x90\x4e\x11\xf1\x89\xd3\xef\xc8\xd1\x51\x60\x5f\xa2\xb0\xd1\x92\x91\x4f\xe5\x1d\xc6\xe1\x2c\x5a\xa2\x53\x75\xa1\x18\xd1\x87\x69\x85\x7c\xca\x7b\xc1\x9d\x16\x10\x69\x9a\x77\x8f\x5f\x58\x6d\x2f\x55\xcd\x0b\xd9\x41\xdc\xdb\x3b\x98\x07\xd6\xd7\xbf\x65\x56\x8e\x15\x16\x22\x7d\x47\x54\x59\x14\x42\x6a\x45\x72\xd0\x34\xa5\x9a\x8e\xcc\x81\x18\xb4\xff\xc4\x48\xab\x01\xf9\x7b\xf5\xa1\x4d\xfb\xff\xf1\xf8\xdf\xbf\xbf\xfc\xeb\x7f\x1c\xff\xf4\xf7\xe6\x77\x28\xae\xd9\x24\x9e\xc6\x03\x81\xaf\xa0\x0a\x48\x46\x5c\xa4\x70\x8d\xd4\xe1\x9f\xaa\x15\x57\xe3\xbe\xd0\x54\x97\x6a\x34\x13\x4a\x5f\xdd\x54\x7f\x16\x22\x5d\xfe\x2b\x30\x95\xe8\x00\xe5\x1e\x5c\xdb\x1b\xaa\xbb\x03\xb9\x93\xa8\xd2\x0f\x2d\xd8\x27\x90\xaa\x73\x69\x94\x66\x6b\x9d\x07\xd7\x6b\x85\x38\x9f\xcc\x20\xa7\xf8\xcf\x6f\xfc\x14\x98\xfb\xf8\x51\x32\xad\x31\xd4\xca\xd5\x81\x10\x93\x81\x67\xad\x56\xa9\x9a\xbf\x0d\xae\x83\x16\x95\xf3\x57\x2b\x18\x79\xc2\x70\x46\xdc\x6c\x59\x0e\x50\xa3\x9a\xac\x44\x56\x9e\xdf\x5c\x91\xb9\x9d\xe1\x03\x9a\x9c\x97\x62\xd7\x1e\xa3\xfe\x9b\x83\x66\xdb\x9e\x4a\xbf\x88\x95\xbd\xec\x9d\x4d\xe2\xa8\x90\xf6\x49\xc6\x72\xe6\x32\x17\x0d\x67\x01\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\x13\x8a\x19\xe4\x20\x69\x36\x54\x5a\x48\x3a\x85\x41\x35\xb8\xfd\x59\xf5\x97\xfd\x61\x8b\xbc\xd5\x5f\x5b\x83\x64\x1d\x93\xe7\xae\xa8\xd0\x44\x94\x03\x64\xd9\x7e\xdd\x0e\x84\x63\x57\xdb\xea\x3a\xbe\x22\x77\x5c\xb9\x52\xac\x9a\x58\xcd\x22\x5a\x81\xe6\x22\x2b\x73\x50\x83\x4a\x60\xb5\xa6\x4a\x3e\x27\x73\x2a\xd5\xf1\xe1\xf0\x21\x42\x52\x36\x67\x2a\x46\x82\xf5\x1a\x89\x9a\x39\xac\x02\x51\xea\xa2\xd4\xae\x26\x5a\xe5\xf7\xf8\x5c\x08\x85\x06\xce\xaa\xac\x46\xeb\x36\x7b\x1b\xaa\x2c\x10\x52\x50\xad\x41\xf2\x77\xe4\x7f\x9d\xfc\xe7\x6f\x7f\x1e\x9e\xfe\xe9\xe4\xe4\xc7\x37\xc3\x7f\xfb\xe9\xb7\x27\xff\x39\xc2\x7f\xfc\xf3\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xf6\xf4\xf4\xe4\xe4\xc7\xef\x3f\x7c\x7b\x7f\x73\xf9\x13\x3b\xfd\xf9\x47\x5e\xe6\x0f\xf6\xaf\x9f\x4f\x7e\x84\xcb\x9f\xb6\xec\xe4\xf4\xf4\x4f\xbf\x09\x26\x9d\xf2\xc5\xc7\x40\xee\x6d\xdb\x30\x5a\x49\xbb\xe5\x1e\x23\x69\x87\xad\xab\x90\x71\x3d\x14\x72\x68\xbb\x7e\x47\xb4\x2c\x43\x35\x78\xbf\xbd\x62\x9f\xff\x5b\xcf\x35\xeb\xdb\xac\x92\x42\x0e\xe8\x80\xbf\x94\xa0\xa1\x20\x91\xa0\x5f\xc3\xb2\x6b\x47\xf2\x82\xdd\x52\xbe\xd7\xd7\x76\x83\xfe\x12\x8c\xbd\x55\x65\x2d\x5c\xd7\x5a\x74\x9f\x48\x91\x8f\x48\xc3\xf3\x3d\x47\x54\x0b\xf7\xdc\x03\x04\x42\xed\x91\xde\x38\x1c\xd2\x7a\xe3\xf0\x06\x52\x7a\xe3\x70\x50\xfb\x22\x8d\xc3\x77\x96\x27\xfd\x22\x2d\xc3\xab\xa1\x87\xa6\xd3\x87\xce\x50\xc4\x9d\x63\xba\x36\xc5\x40\xe6\xb4\xe8\x12\x00\xd9\x35\x1e\x20\x66\x10\xa4\x37\x7b\x68\x41\x0a\x51\x94\x19\xd5\x1b\x02\x7f\x22\x45\x44\x56\xa0\xc8\x3e\xac\xa9\x0e\x9a\xb7\x22\x6d\xbe\x3e\x0c\x8d\x9c\x67\x19\x61\xdc\x5e\xd0\xa6\x83\x4e\xa3\xfb\xe8\x21\x09\xd6\x1e\x42\xa8\x0d\x63\x9c\x9b\x57\x7d\x74\x65\x79\x9b\xf1\xf7\x8a\x28\x4d\xa5\x66\x7c\x3a\xb2\x65\x7b\xad\x98\xe8\x42\x54\x18\xaf\x8a\xf7\x76\x22\xa7\x52\x43\x2b\x88\x91\x95\x9a\xe6\x36\x3d\x5a\x69\x3f\x3d\xf8\x06\x9a\x3e\x60\x88\x58\x02\x29\xf0\xa4\x63\xb0\xd1\x27\x0b\x69\xe2\xd7\x61\xbc\x30\x33\x71\xc9\xe7\xee\xfe\x22\x69\x69\xc3\xa4\xad\x08\x15\x6f\xdc\xaf\x2b\x26\xd6\x9c\x61\x17\x8c\xd3\x08\x8d\x45\x69\xb3\x32\x38\x56\x10\x6c\x95\x87\x0f\xa3\x9b\x2c\x4b\xef\xb6\x91\x83\x15\x89\x70\xb1\xbd\x0a\xb6\x09\xd2\xc7\x56\xe4\xf5\xda\x0b\xda\x96\xd3\xbf\x86\xf8\xa4\x70\x09\x3e\xae\xf4\xfe\x12\x92\xfb\xa1\x48\xed\x07\x22\xb1\xbf\x8c\xb4\x7e\x98\x92\x7a\x34\x29\x3d\x8e\x84\x1e\x47\x3a\xdf\x21\x6c\x23\xa6\x44\x1e\x47\x1a\x7f\x09\x5b\x5c\x21\x61\xc2\x3e\x47\xe2\xf8\x1f\xbd\xb7\x42\xc3\x67\xb4\xcc\x14\x12\x0a\xe0\x15\x04\x15\x77\x1c\x0a\x68\x32\xfb\x72\xf2\x16\xac\x01\x29\xee\xbd\x78\xb7\xce\x78\xd5\x5f\x8a\xa4\xbf\x14\x77\x68\xfd\xa5\xd8\x5f\x8a\xaf\x72\x29\x3a\x6e\xf5\xf5\xdf\x88\x91\xd3\x62\x31\xe1\x7f\x5f\x36\xa1\x8b\x36\xee\x00\x72\xe6\x97\x4c\xcd\xae\x8e\x62\x0d\x4f\x75\x86\x23\x77\x3b\x71\x6d\x26\x5b\xc5\x41\x68\x61\xd9\x1e\x99\xb1\xa9\xd9\x9e\x19\xcc\x21\x73\xda\x2b\xc9\x29\xa7\x53\x8b\x37\xab\x45\x55\x6f\x49\x48\x2c\x27\x23\x59\x47\xa8\xbb\x25\x00\x07\x34\x14\x19\x2e\x93\x09\x9a\xe2\x97\x52\x64\x19\x48\x45\x32\xf6\x00\xe4\x3d\x14\x99\x58\x38\xc8\x58\x9e\x92\x3b\x4d\x35\x4c\xca\xec\x0e\x74\xa7\x18\xcb\x20\x8e\x83\x04\xdf\x94\x59\x76\x23\x32\x96\x74\x72\xc8\xc5\xd8\x8a\x57\xb8\x01\x8b\x32\xcb\x48\x81\x84\x74\xdb\x87\x1f\x39\x5e\xe5\xe7\xd9\x23\x5d\xa8\x01\xb9\x86\x39\xc8\x01\xb9\x9a\x5c\x0b\x7d\x63\x6d\x35\xdd\xfa\x6d\x66\x96\xd9\xce\x09\x9b\x90\x77\x58\x2b\x43\x13\x4d\xa7\x68\x39\xf4\x11\x81\x03\xb3\xa1\x9a\x83\x12\x61\x18\xe5\x23\x53\xfb\x34\xa1\x85\x9f\xd2\x5f\xe3\xe8\xe6\xea\xec\x7c\x6a\x83\xf6\x6a\xc6\x26\x90\x2c\x92\x6c\x6f\x0c\xf3\x3c\xc1\x20\xed\x1a\x99\xb7\xc1\x4e\xd4\x42\x69\xc8\x3d\xf8\x20\x5a\x4e\x19\x27\x12\x54\x21\xb8\x42\x29\xaf\xe6\x12\xd5\x8b\x58\x4b\x74\xc7\xc8\xea\x88\x86\xd5\xce\x8a\x41\xa8\x4a\x50\x08\xa5\xef\x34\x95\xba\xab\x7c\x12\x4b\x17\xb8\xf1\x84\x98\x93\x9c\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\xe4\x76\x3a\xd1\x08\x39\xd9\xf2\x15\x24\x12\x70\xde\x7d\x05\x84\x19\xe5\x69\x06\x92\x4c\x28\xcb\x54\xf7\x00\xfe\x15\x9f\x84\x06\x99\x33\x8e\x4e\x02\x1b\x08\x8a\x4e\x0a\xf3\x57\x92\x08\x99\x3a\x70\x47\xa6\x95\xff\x2a\x88\x89\x9a\xf6\x11\x25\xbb\xc6\xf6\x5e\x8e\xa3\x25\xe3\x4c\x24\x0f\x8a\x94\x5c\xb3\xcc\xbe\xbc\x10\x0f\xa8\xbf\x64\xc8\x4e\x3a\x0f\xdd\x9d\x4b\x55\xff\x1c\x56\x07\x6c\x68\xa8\x52\x67\xbf\xae\xbf\xc2\x0f\x3a\x12\x17\x41\x8b\x8e\xa1\x43\xc3\x67\x48\xa2\xe1\x22\x5f\x7e\x86\xa4\x85\x4a\xee\x50\x6f\x6c\x79\x48\x44\xba\x8a\xe4\x0a\xb4\xed\xc0\x8a\xac\x05\x20\x8c\x35\x5b\xec\x28\x9b\x0b\xb7\x08\xae\xbe\x92\x5f\x93\x8c\x71\x68\x2f\x8c\x62\x29\xb4\x17\xc7\x7a\x17\x9d\x92\x4b\x52\x26\x11\x10\x7a\xe1\x73\xc7\x83\x49\xf3\xb4\x20\x66\xb2\x10\x9a\x9c\x1c\x9f\x1d\x9f\xae\xec\x91\x63\x23\x9b\x67\x60\xaf\xc5\x91\xc3\x39\xab\x5e\x4a\xb1\xbc\xc8\x16\xf8\x1e\xc7\xe9\x80\x30\x1d\x23\x6c\xc7\xdc\x86\xb2\xe4\x7e\x56\x1c\x2e\xdb\x80\x28\x41\xb4\xa4\xbe\x0e\x82\xfd\xd4\x3c\xa4\x65\xe9\x2e\xf4\x93\xe3\x9f\x8f\x07\x04\x74\x72\x4a\x1e\xb1\xf6\xab\x99\xbe\x11\xb9\x17\xa4\x54\xe1\x33\x56\x11\xb2\x10\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x16\x78\xdd\x10\x51\x6a\x6b\x04\xa5\x3a\x04\x4f\xae\xd9\x2e\x3f\x33\xed\x52\xb8\x0c\xff\x7e\x83\xbb\xc9\x5e\x59\x84\x1a\x65\x64\x0e\x67\x33\xa0\x99\x9e\xd9\x04\x03\x2e\xf8\xf0\x1f\x20\x05\x62\xce\x71\xf7\xcd\x57\x57\xd3\x2f\x62\x6c\xd1\x0b\xc1\xdf\x9b\x6b\xef\x5b\xe8\x2c\x12\x91\x65\x7e\xf4\xdd\xfd\xfd\xcd\xb7\xa0\x9b\x5c\x9e\xe3\x87\xe4\xdb\xcb\x7b\x9f\x56\x82\xc6\x78\x90\x13\x21\xf3\x03\x60\xef\x71\xe2\x5d\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\xfd\x2d\x56\x37\xe1\x58\xb2\x5b\xb4\x73\x24\x5c\x40\x34\xb9\xba\x19\x91\xbf\x8a\xd2\x4c\xc8\x98\x8e\xb3\x45\x85\x3a\xad\x20\xbc\x96\xe3\x91\x21\xe5\xc8\xdc\x20\x66\xe7\x7f\x07\x34\x05\xa9\x90\x41\x03\x8d\x54\x4b\x27\xc2\x71\x6f\xd0\x16\x75\x29\x2f\x4a\xa5\x45\x4e\x66\xee\xb5\xdb\x78\x74\xee\x70\x8e\xec\x71\x75\xa0\x44\x12\x0a\xcb\xc4\xdd\x6f\xbe\x3a\x16\xbd\xc2\xbd\xec\xbc\xbb\xcf\xc7\x56\x4c\x6d\x4e\x9b\x73\x70\x58\xb8\x1b\xc7\xdb\xcc\x56\x8d\x16\x8a\x7a\x90\x55\x4b\x3b\x23\xd5\x2d\x77\x84\xce\x9e\xe0\x9e\xe2\xd6\x2c\x8d\x13\xfd\x4e\x5e\xac\x46\xa3\x11\x68\xdd\xe6\xb3\x36\xe8\xee\xd6\xf3\x75\x9d\x33\x55\x05\x2f\x26\x94\x0b\xce\x12\x9a\xb1\x7f\x40\x4a\xca\x42\x70\x97\xee\x86\x92\x6d\x42\x15\x0c\xd1\x3b\xce\xb5\x2b\x1c\x55\x63\xa6\x19\xee\xa0\x85\x40\x71\x0f\x63\xd4\x0c\xbb\xb7\x54\x1f\x6e\x69\xce\x17\x58\xf5\x95\xc5\x8a\xb3\xe3\xc9\x17\x21\x4e\x12\x9b\xa7\x18\x9c\x23\xbf\x9a\x21\xaf\x05\xa1\x49\x82\xa8\x70\xf6\xba\x42\xc6\xab\x40\xce\xc3\xf7\x57\xb4\x79\x35\x22\xe0\xa1\xc9\x5e\x36\xe6\x40\x12\x5e\xe6\x63\x90\x35\xbc\x88\xd4\xab\x73\x1a\xc5\xea\xe2\x86\xb5\xc3\x79\x2f\xad\x97\x31\x28\x9f\x02\x79\x6b\x46\xfe\xe3\x1f\xfe\xf0\xfb\x3f\x44\x18\xc7\xbc\x5e\x15\xd8\xcd\xc9\xd5\xf9\xf5\xf9\xdf\xee\x3e\x5d\x20\x68\x61\x68\xf7\x91\xf2\x56\x63\x67\xad\x46\xcd\x59\x7d\xd1\x8c\x55\x84\xff\x08\xe6\xb2\xb1\x8f\xc4\x1d\x52\x65\x36\x61\xa9\x2c\xd0\xa1\xd3\x49\x1a\xa5\x8b\x8c\x1a\x15\xbe\x3b\x9b\xce\x3c\xc3\xb0\x0e\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x99\xde\xda\xd5\xc2\xd3\x52\xda\x12\x42\x95\xf3\xaa\xb6\xe5\x3b\xa7\x15\xd2\xf0\x15\x29\xff\x0a\x12\xc1\xd3\x10\x15\x20\x96\x48\xeb\x28\x89\x7a\xe6\xee\x6c\x9f\xde\x44\x5c\x5f\x25\x6e\x30\xd4\x24\x43\x57\x94\x54\xab\x1a\x87\x4f\x5a\x80\x06\xec\xed\x8f\xff\xd2\xdd\x41\x96\x14\x77\x22\x79\x88\x68\x22\x0b\x64\x60\xef\xcd\x49\x4b\xac\x2f\xf0\xfe\xe2\xc6\x12\x67\x56\xe6\xfa\xe3\x7d\x8d\xc6\x82\xd9\x47\xe4\x07\xef\x9b\xfa\xce\x79\x0b\x29\x4f\xc9\x03\x14\x61\xda\xa5\x61\x98\x3e\x8c\xb0\x1d\x45\x38\x72\xf5\xd5\x10\xfd\xd5\x66\x3c\x5b\x46\xe0\xa3\xff\xac\x44\x1c\x86\x23\xdd\x70\xce\xa3\x23\xd0\x29\x21\x13\xca\x32\x42\xd1\x2a\xaf\x59\x0e\x36\xe5\x0a\x8d\xfd\x75\xb4\xc4\x57\xc4\x70\xbe\x56\x6b\xe3\xb1\x0f\xdb\x7e\xb7\xb3\xd5\x30\x14\xa8\xe2\xeb\x56\x03\x1c\xcf\x96\x55\xdc\x7b\xaf\x06\x6c\xdb\x7a\x35\xa0\xa3\x1a\x50\x48\xb8\xd3\xa2\xb3\xac\x19\x2d\xe0\xc6\x92\xb1\x21\xdc\x66\x0c\x13\x21\x61\x39\xde\xa6\x11\x07\xe3\x22\xe7\x03\x22\x83\xcf\x6f\xae\x2a\xdf\x97\x68\xc5\xba\xd8\xf4\x60\x55\x26\x33\xef\x26\xe5\xa0\xd4\x19\x46\xd6\x94\x85\x35\x2c\xe3\xd5\x56\x4a\xe8\x1e\xe5\x53\x48\x80\x1c\xe7\x71\x50\x03\xfc\x98\xd7\x05\x6e\x3f\x04\x9d\x58\xbf\xb9\x0f\x2b\x72\xf8\xed\x7e\xba\xc2\x6a\x20\xd7\x13\x9b\x48\xaa\x66\x80\x29\xaa\xf0\x99\x69\x65\x07\xbd\x41\x18\x1c\x3f\xe3\x46\x5e\x98\x4a\x9a\x00\x29\x40\x32\x61\x44\x8c\x92\xeb\x54\x3c\x72\x32\x86\x29\xe3\xca\xaf\x58\x08\x49\x7e\x4b\x60\x24\x11\x53\x55\xa1\xb5\x11\xb9\x6d\xd5\x1f\x70\x80\x5f\x89\xa8\x79\xa6\x9b\xa2\x41\xa4\x29\x41\xe1\x05\xb7\x41\x89\xa5\x83\xab\x8d\xe7\xd3\xd7\xf5\xe6\x19\xea\xbe\x21\xec\xcc\x9e\x94\x1c\x5f\x34\x85\x8c\x2e\x6c\xa2\xf6\x84\x71\xb4\xfe\x4a\x75\x3a\x0a\x0f\xcd\xea\x4c\xa0\x90\x8d\x3e\x37\xee\x0c\xa6\x88\x04\x9a\xcc\x42\x24\xbb\x3e\x06\xec\xb9\xd6\xc7\x80\xf5\x31\x60\x7d\x0c\xd8\x6a\xeb\x63\xc0\xda\xad\x8f\x01\xdb\x4c\xd0\x21\x3b\xed\xfa\x18\xb0\xde\x2a\xb3\xda\xfa\x18\xb0\x4e\xad\x8f\x01\x7b\xb6\x1d\x1c\x8b\xee\x63\xc0\xb6\x68\x7d\x0c\xd8\x96\xad\x8f\x01\xeb\x63\xc0\xfa\x18\xb0\x3e\x06\x2c\xa0\xf5\x31\x60\xbb\xbf\x5e\xef\xfc\xe9\xde\xfa\x18\xb0\x3e\x06\x6c\xc7\xd6\xc7\x80\x2d\xb5\x3e\x06\xac\x8f\x01\x7b\xaa\xf5\x31\x60\x7d\x0c\x98\x6b\xbd\xb5\x71\xa5\xf5\x31\x60\x6b\x5a\x1f\x03\xb6\xdb\x38\xbd\x1a\x10\xd6\xd9\x8b\xa8\x01\x4a\x8b\xe2\x8e\x4d\x03\x70\x21\x63\x1d\x83\xbb\x8a\x12\x07\x1a\xa9\xc8\xe3\x8c\x25\x33\xa2\xec\x87\xde\x8e\xa5\x1c\x64\x5f\x33\x22\xac\x71\x93\x8c\xc1\xa8\x08\xe6\xb5\x8a\x90\xdb\xe4\x6a\x82\x0e\xe4\x06\x92\x9b\x39\x15\x1e\x26\x90\xb5\xaa\x27\xb4\xc5\x67\x7f\xbb\x31\x6e\x74\x97\xee\x14\x34\xe6\x23\xa1\xdc\x16\x2b\xc5\xd7\xc7\xe2\x86\xe4\x46\xa4\xca\x17\x6c\xe0\x82\x0f\x2d\x58\xeb\x08\xab\x3b\x0b\x35\x0a\xb0\x06\x07\x22\xb3\xd9\x18\xb9\x1b\x29\xc6\x7b\x43\x67\xbb\xc1\xf8\x23\x96\xb8\x00\x3d\x31\x69\x21\xae\x59\x02\x3b\x22\xad\xb5\x03\xc3\xb0\xa0\x88\x87\xe0\x62\x8e\x61\x57\x41\x81\xfb\x44\x73\xdb\x39\x72\xca\xa3\x54\xaa\xb3\x42\xd8\xff\xab\xe3\xa6\x1a\x01\x53\x9d\xfd\x28\x7b\x86\x97\x0b\x89\x92\xda\x5b\x84\xd4\x81\x44\x98\x45\x88\x8a\x8a\x29\x2b\x1d\x68\x34\xd4\x61\x46\x42\x1d\x62\x14\xd4\x3e\x22\xa0\xf6\x1e\xfd\x14\xc7\xad\x1e\xc1\xa5\x1e\x49\x22\x7d\x01\xf7\x94\x0b\xa4\xbf\x9f\x49\x50\x33\x91\x75\x66\x38\xb1\x98\xcd\x07\xc6\x59\x5e\xe6\xe6\xec\x2a\xc3\x53\xd8\xbc\x0a\xf6\x57\x9e\x65\xb8\xeb\xde\x46\x1c\x98\x07\x59\x0a\x58\x99\x9b\xb2\xcc\x6c\x2d\x04\x0b\x9d\xd1\x39\x0a\xa5\x65\x92\x00\xa4\x21\x62\x69\xd3\x5a\xfd\xfb\x51\x45\xa1\xc5\xe8\x67\x8a\xbc\x0d\xbb\x6a\xc2\xf4\x9e\x86\x39\xef\xf7\xbf\xeb\xd4\xc7\x54\x16\x71\x6e\xe9\x6f\x6f\x6f\x2e\x5a\xb7\x34\x7e\xf0\x1d\x1e\xe3\x8b\x19\x24\x0f\xb7\x2e\x94\x66\x7f\x37\x73\xb8\x99\x29\xc8\xc4\x14\x43\x30\x08\xb5\xa2\xb4\x7d\xc8\x42\xea\x25\x17\xe8\x14\x57\x11\xe4\x9c\x25\x30\x7a\x05\x43\x45\x2c\xe5\x3f\xfc\x20\x10\x74\x13\xe0\x8b\x1f\x8a\xd8\x75\x67\xc9\xa9\x3c\x0c\x0d\x1b\x95\xa3\x14\x83\x46\x33\x9a\x54\x6b\x33\x5d\x7f\xe8\x82\xc8\x38\x51\x00\x95\x42\x33\x65\x7a\x56\x8e\x47\x89\xc8\xcf\x0c\xeb\xb0\xff\x37\xce\xc4\xf8\x2c\xa7\x4a\x83\x34\x3a\x8e\xbb\xd6\x87\x89\xa1\x80\xf1\xe9\x28\x4f\x4f\x47\xbf\x0a\xa2\xe1\xca\xd9\xca\x5d\x1a\xd6\x06\x23\xc1\x18\x0c\xdf\x17\x72\xc9\x5a\x60\x26\x25\x7c\x93\x06\xdf\xdf\xa1\x45\x45\x02\xc3\x92\xf7\x12\x92\xdc\x73\x6d\x12\xc1\x21\x10\x93\xa9\x1c\x46\xd8\xf1\x8b\x85\x1c\x47\x39\xab\x91\x42\x8d\x0f\x28\xcc\xf8\x60\x74\xa1\x43\x09\x2d\x8e\x16\x56\x1c\x2b\xa4\x38\x4a\x38\x71\x8c\x50\xe2\x78\x61\xc4\x71\x42\x88\xe3\x87\x0f\xbf\x58\xe8\xf0\x17\x11\x36\x1c\xd1\x3f\x16\x29\x5c\xf8\x35\x42\x85\x0f\xd7\x06\x43\x22\x84\x07\xbf\x5e\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x3d\x84\x02\xbf\x86\xff\xff\xc5\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\x2f\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x2a\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x43\x46\x17\x77\x61\x81\xa0\xb1\x56\xe2\x7a\x25\x58\xd4\x9a\xad\xdb\x71\x0d\x33\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\x0e\xcf\x73\x4d\x0e\xc6\x3c\x6e\x71\x55\x0e\x64\xd7\x7c\x27\x1e\x89\x98\x68\xe0\xe4\x84\x71\xbf\x73\x4e\x1b\x56\x9a\xda\x3d\x12\xec\xef\x30\xbd\xbe\x7d\xe3\x07\xf9\xfa\xfc\x1e\xe8\x19\x52\xea\xa0\x3d\x5f\x8e\xc6\xe7\x5d\x5f\xee\xc1\x49\x99\xb5\xdd\x5f\xd6\x25\x16\xc7\xf7\xf5\xb6\xae\xfe\xfe\x16\xe9\xa9\x58\x11\xe5\x29\x71\xf8\x5c\x5f\xdf\x3e\x09\x0e\x75\x6f\x2b\x37\x55\x6c\x7a\x3b\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\xdd\x53\x04\xf6\xd7\xa7\x6d\xbd\x7e\xc4\x75\xaf\x6d\xfd\x52\xb4\xad\x06\x2c\xde\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x75\x22\x60\x2d\xc3\x55\xec\x82\x03\xd8\xc4\xb1\x1a\xf4\x10\xf1\xfd\x26\x65\x96\x2d\xac\x0d\xb1\x85\x80\xd9\x7d\x6b\xdd\xcf\x60\x05\x3a\x10\x5d\xa9\x6b\xa8\xab\x75\x93\x42\x0a\x27\x91\xc8\x92\x73\x23\x62\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x5b\xc0\x86\x2e\x08\x1d\x03\x3d\x67\x40\xea\xfc\xa5\x36\x21\x66\xd4\x89\x90\x09\x1b\x67\x0b\x32\xa3\x99\x51\x96\x5c\x90\xf6\x03\xcb\x32\xd7\x4d\x40\x50\x38\x68\xeb\x7a\xb6\x12\x4d\x26\xf8\x14\x27\x83\x5a\x42\xe0\x73\x01\x89\x19\x33\xc9\x80\xf2\xb2\xb0\x74\x1a\xf9\x68\x21\x4a\xe9\xe9\x0c\x8a\x8a\x6f\x8c\xce\x14\xe1\x2c\x1b\xf8\x29\x6f\x43\x60\xae\xee\xf9\xda\xa4\xac\x20\x75\xe8\x95\x8f\x4c\xc1\x00\xfb\xec\x4c\x93\xa5\xc5\x57\xed\xb7\xfb\xc6\x7e\x56\x48\x31\x67\x69\x1d\xa3\x6f\xb6\x05\xc6\xc7\x77\x1e\xeb\x13\xf6\xeb\x59\x2b\x17\x7c\xc8\x61\x4a\x51\x3c\x76\x0c\xcd\x46\x74\xda\xf1\x6d\xfc\x20\x4f\x59\x42\x35\x28\xcc\x49\x68\x41\xdb\xce\x19\xed\x4c\x89\x79\x9f\xc6\x8e\x22\x27\x5c\x10\x81\x99\x85\x25\x67\x7a\x81\x1e\xbd\x59\xa9\x49\x2a\x1e\xf9\x69\xc8\xc1\xb4\x61\x0e\x94\x8c\x41\xd3\x3a\x39\xd0\x8b\x64\x8a\x00\xa7\xe3\xcc\x9c\x3d\x8c\xf8\xbf\x5f\xbb\x01\xc8\x04\xa8\x2e\x25\x90\x29\xd5\x01\x5c\x62\x8d\x34\x6f\xd7\xf3\xe9\x6d\xc7\x94\xf3\xd7\x4d\x48\xc9\x15\x04\x0a\xb2\xd1\x54\x80\x8e\x19\xaf\xe6\x44\x8b\x52\x1f\xc8\x3d\xb2\xc9\x74\x64\x33\x77\x1a\x4a\x22\xcb\x41\x11\x51\x06\x58\xf2\x5a\xea\x9f\x1b\x2e\xa6\x86\xd7\xdb\x9d\xd6\xb6\xae\x6e\xd3\x18\x3b\xec\xba\x21\x95\x37\xf0\x09\x7c\xb8\x95\xcd\xa0\x7e\x7f\x7d\xf7\xb7\x1f\xce\xff\xe7\xe5\x0f\xdd\x16\xfe\x92\x26\xb3\x26\xb6\x38\x27\x14\x2f\x0a\x64\xf2\x33\x3a\x07\x42\x49\xc9\xd9\x7f\x97\x2e\xe4\xed\xa4\x1a\xaf\x23\x5b\x8d\x92\xde\x13\x24\xf8\x9a\x5b\xa2\x13\xe7\x88\xb1\xa6\x3f\x30\x85\x40\xd5\x48\x84\x0b\xfc\x17\x0a\xc8\x44\x8a\x7c\x49\xd1\x22\xd7\x55\x70\xdd\xc2\xdc\x30\xd4\xaa\x66\x33\x90\xdd\x24\xf2\xf7\x1f\x2f\xef\x30\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x11\x39\xe7\x0b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x19\xe1\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xce\x32\xeb\x34\xb2\xd5\x5f\xd9\x38\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x94\x25\x24\x07\x39\x05\x52\x50\x9d\xcc\x48\x4e\x17\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x46\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\xef\xd6\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xec\xed\x9b\x7f\xfd\xdd\x1f\x3a\xaa\xd7\x11\x0f\x6e\xd7\xd0\xa7\x80\x90\xa7\x76\xf8\x97\xdf\x60\x18\x74\xdd\x42\x86\x71\x3b\xc4\xee\x7c\xe4\x86\x8a\xf1\x69\x16\x6c\x00\x09\x36\x03\x86\x1a\x01\x87\xf5\x1b\xdc\x74\xb5\x05\x86\x5b\x02\x5b\x34\x74\x37\xa5\xc4\xb3\x82\xd5\x12\x9c\xb7\x7b\x39\x86\x2c\x78\x43\xb1\xbb\xba\xf1\x5c\x2a\xc4\x7e\x84\xda\x44\x65\x98\xb2\xe8\x23\x76\x58\x1b\xef\x30\x20\x6f\xc8\xbf\x93\xcf\xe4\xdf\xd1\x0a\xf6\xc7\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x09\xa5\xaf\x6e\x22\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x19\x33\x67\x8e\x80\xcf\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xa5\xec\xee\xd0\xe0\x82\xab\x49\x3b\xfa\xff\x95\xf6\x37\x0e\xfc\x9d\x50\xfa\xda\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x33\x16\xc0\x1c\x0e\xe7\xc4\x86\xc5\x89\xc6\xdb\xba\x4f\x6d\xad\x25\x9b\x3e\x5a\x64\x9c\x92\xd2\x28\x4b\x53\x88\x74\x84\xfa\x4d\x00\x15\x66\x36\xd2\x86\x30\xf0\x84\x6a\x34\xb2\xfa\x5a\xe5\x1d\xc6\x03\x67\x38\x56\x42\x79\x57\x19\xd6\x36\x09\x13\x90\xd2\xe6\x09\x8f\x17\x3e\xdd\x28\x78\xb7\x05\x71\xb9\x42\x0a\x2d\x12\xd1\x19\x36\x25\xe6\x56\xb9\x71\xb4\xe0\xdc\xa3\xaf\xb6\xf2\x8e\xff\xf9\xfd\xcd\x80\xdc\x5f\xdc\x0c\x88\x90\xe4\xee\x22\x2c\xf8\xa9\x69\x82\x39\xba\xbf\xb8\x39\xda\xeb\x0a\x34\x72\x98\xee\x2f\x6e\x3a\x74\xb2\x1a\x3e\x9b\xd3\x62\xf8\x00\x8b\x8e\xd2\x5d\x0c\x09\x73\x58\x6d\xac\x28\x2f\x64\xa7\x39\xa7\xc5\xce\xbd\x49\xa0\x29\x3b\x68\x24\x17\x9f\x75\x58\x51\x1a\x0f\xd2\x25\x17\x73\x48\xad\xd6\xec\x47\x01\x9e\x16\x82\x19\x1d\xa9\xc7\x79\x79\xaa\xf5\x38\x2f\xbb\xb7\x1e\xe7\x65\x5d\xeb\x71\x5e\x76\x68\x3d\xce\x8b\x6d\x3d\xce\x4b\x9b\x90\x43\xcc\x31\xea\x71\x5e\x9e\x6d\x3d\xce\xcb\xc6\xd6\xe3\xbc\xec\xd4\x7a\x9c\x97\xd5\xd6\xe3\xbc\x3c\xd1\x7a\x9c\x97\xaa\xf5\x38\x2f\x3d\xce\xcb\x97\xcb\xb5\x7b\x9c\x97\xe5\xd6\xe3\xbc\xf4\x38\x2f\x3d\xce\x4b\xb3\xf5\x38\x2f\x1b\x5a\x8f\xf3\xd2\xe3\xbc\xf4\x38\x2f\x4f\xb7\x1e\xe7\xa5\x73\xeb\x71\x5e\x76\x6b\x7d\xe6\xe1\x8e\xad\xc7\x79\xe9\x71\x5e\x96\x5b\x8f\xf3\xf2\x6c\x3b\x0c\xf3\x78\x8f\xf3\xd2\xe3\xbc\x3c\xd9\x7a\x9c\x97\x1e\xe7\xe5\xc9\xd6\xe3\xbc\x74\x68\x07\x67\x74\xed\x71\x5e\x7a\x9c\x97\xa7\xc6\xe8\xb5\xad\xdd\x5a\x8f\xf3\xd2\xe3\xbc\xac\xb4\x1e\xe7\x65\xb5\xf5\x38\x2f\x3d\xce\x4b\x8f\xf3\xd2\xe3\xbc\x54\xad\xc7\x79\xf9\xda\xed\x4e\x12\x14\xfb\x07\xdc\x88\x8c\x25\x8b\xe0\x6c\x9f\x5b\x50\xa2\x94\x89\xb9\xb1\xb1\x5b\x52\x60\xbf\x95\x45\x21\x48\xc8\x3e\x30\x08\x85\xdb\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\x97\x98\x82\x83\x80\x53\xf0\x2f\x78\xdd\x3d\x82\x60\xe8\xcb\x67\xdb\xe9\xeb\x66\x2c\x0d\xd6\xda\x9b\x2f\x72\x08\xe9\x9c\x4d\xd8\xa3\x6a\x17\x69\x51\x31\x5b\xb6\x71\x73\xd1\xa2\xc8\x58\x48\x62\x2c\x21\x77\x25\x4a\x17\xe0\x5c\xe0\xea\x1d\x49\x8a\x72\x40\x72\xc8\x85\x0c\x48\x8c\x88\xa0\xc1\xb5\xb6\xca\x21\xac\xd3\xad\x25\xc8\x4f\xbe\x16\x38\xff\x0b\xab\x2f\xd4\x28\x55\xd5\x5a\x31\xcf\x0e\x83\x62\xcd\xae\x26\xcb\xc1\xa8\x4c\xb7\xac\x40\xd7\x42\xdf\xba\xc3\xbd\xb7\xf5\x8a\x1c\xb1\xe0\xa7\x70\x6f\xa8\x55\x17\x22\x2f\x4a\x0d\xad\x8b\xcd\x4e\xb1\x55\x3a\x98\x0a\x65\xe8\xfb\xc9\x06\x4d\x04\x9f\xb0\xa9\xd3\xbe\xcf\x72\xca\xe9\x14\x86\xd5\x6c\x0f\x6b\xa8\x87\xb3\xce\x17\xf5\xde\x52\x41\x93\x8c\xb2\xee\x81\x83\xb1\xd8\xc4\x05\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x3c\xa8\xc2\xc6\x99\xe5\x1b\x23\xff\x95\xfd\xf1\x20\x40\x7b\xa4\x1a\x6d\x15\xa8\x18\xad\xd9\xa9\xe1\x0a\x23\x27\x34\x2b\x66\x4f\xab\x8c\x21\x29\x97\xef\x17\x9c\xe6\x2c\xf1\x07\xef\x3c\xcb\x44\x62\x4d\x35\x6d\x65\x33\xec\x4d\x2c\xf5\xe6\x95\xf2\xbc\xd4\x74\x9c\xc1\x88\x5c\x59\xe4\x0a\xc1\xb3\x85\x39\x96\x0a\xb4\x8f\x5c\x70\x67\x22\x4c\xc1\x0c\x09\x8b\x0d\x0c\x89\x5d\x2b\xab\xe3\x5e\xb3\x50\x1b\xc0\x0d\x87\x13\x1c\x08\x70\x2d\x17\x66\x5b\xde\x88\xf4\xce\xec\xcc\xd6\xd3\xc1\x08\x1c\x81\x91\xb0\x31\xa2\x60\x03\x23\x60\xe3\xc4\xad\x86\xc7\xac\xc6\x8d\x57\xad\x3d\x0b\x16\x40\xa8\x99\x08\xd4\xda\x16\x85\x48\x47\x6b\x38\x16\x11\x93\x40\x0a\xcc\x88\x37\x22\x35\xb2\x94\x04\xcb\xb6\xaa\x33\x6a\xed\x8a\x57\x86\xb8\x07\x34\x04\x52\x5d\x0b\x59\x74\x4e\x59\x66\x0e\x70\x20\x01\xab\x60\x8c\x61\xce\x9a\x48\x2e\x0c\x17\xb3\x7f\x48\x9b\xc5\x65\x7b\xb5\x12\xc6\x92\x99\x50\xc0\x91\x5f\xd2\x2a\xb1\xa7\x4a\x3b\x70\x2c\x26\xb5\x57\x74\x68\x70\xf1\xd5\x84\x40\x5e\xe8\xc5\x80\xc0\x1c\xe4\x42\xcf\x30\x08\xa1\x82\x13\x45\xb6\xc6\x14\xc9\x69\xda\xd8\x1d\x03\x22\xbc\x5d\x3a\x70\x78\xbc\x1f\x9c\xaa\x56\x66\xda\x2a\x6e\x4c\x55\xd9\x15\xfb\xde\x35\xb1\x51\x6e\x48\x28\xd3\x8c\x89\x52\x43\x10\x61\x35\x67\xdd\xf0\x6c\x49\xc4\xb3\xf0\x03\x52\xd1\xc8\x28\x31\x5b\x22\xa7\x9f\xd1\x6a\x49\x73\x51\x72\x6d\xe1\x6b\xac\x22\x51\x09\x7f\x36\xef\xe6\x15\xc3\xe8\x5e\x54\xe4\x27\x71\xae\x76\x9a\x7a\xc4\x8a\x9b\x18\xe9\xcb\x54\x6b\x90\xfc\x1d\xf9\x5f\x27\xff\xf9\xdb\x9f\x87\xa7\x7f\x3a\x39\xf9\xf1\xcd\xf0\xdf\x7e\xfa\xed\xc9\x7f\x8e\xf0\x1f\xff\x7c\xfa\xa7\xd3\x9f\xfd\x1f\xbf\x3d\x3d\x3d\x39\xf9\xf1\xfb\x0f\xdf\xde\xdf\x5c\xfe\xc4\x4e\x7f\xfe\x91\x97\xf9\x83\xfd\xeb\xe7\x93\x1f\xe1\xf2\xa7\x2d\x3b\x39\x3d\xfd\xd3\x6f\xba\x3b\x25\x43\x3d\xf0\xf1\xfc\xef\x91\xbc\xef\x2f\xe2\x7b\x77\x3c\x76\xef\x87\xdf\x5d\x81\x2b\xc7\xdf\x39\x2d\x9e\x3a\xfe\x32\xd8\x54\x73\x35\xa9\xc7\x67\x8a\x88\x9c\x69\x0d\xa9\xbb\x7b\x1b\x90\x38\x4b\x66\x22\xc7\xb0\x10\xcd\x8a\xe2\xed\xdd\x80\x66\xa9\xad\x4b\x9d\xc9\xaa\xee\x57\x34\x8c\x71\xc2\xf2\x22\x83\x1c\xb8\x46\xc6\x33\xf4\x2a\x2f\x5a\x19\x47\xf5\x1b\x24\xd6\x0e\x02\x9f\x13\x80\xd4\x11\xd9\xf3\xc6\x46\xeb\x79\x63\xcf\x1b\x9f\x6b\xc1\xa6\xf2\x18\x8c\xf1\xb6\x49\x84\x33\x71\x29\x2f\x29\xa3\xe1\xbc\x42\x4e\x10\x13\x8c\x9f\x98\xb3\xb4\xa4\x59\x13\x60\xd6\x63\x8e\x76\xe3\x00\x0d\xd3\x4e\x4e\x17\x2b\x96\x1c\xc6\x59\x13\xcd\x76\x50\x45\xfd\xe0\x83\x4e\x2e\xab\x3d\xce\x47\xe7\xd9\x23\x5d\xa8\x8e\xa0\x97\xdf\x08\x89\x81\x24\x4b\x83\x12\x21\x7d\x7c\x51\x53\xc5\x6d\x5b\xf8\xbb\x79\x08\xd7\x4d\x74\x1b\xa2\xc2\x29\xd9\xc7\xaa\x7a\xd0\xfb\x91\xdc\x44\xd4\x59\x21\x66\x9f\x77\x7b\xf1\x3b\xd0\xda\x19\x01\x97\xb6\x04\xad\xe7\xb4\x72\x8b\xb6\xa7\xc7\x86\x12\x21\xd4\xac\xf9\x72\x22\xcc\x9a\x60\x91\x86\xc9\x04\x92\x8e\x5a\xb0\x85\xf4\x58\x33\x8e\x0d\x6f\xd7\x8c\x97\x34\xcb\x16\x7e\x4e\x20\x25\x82\x77\x1a\x08\x3e\x33\x4d\x4a\xae\x59\x66\x36\x13\x91\x30\x2d\x33\xda\x34\x20\xba\x37\xf3\x51\x77\xe9\x88\x7c\xe4\x09\x34\x1f\xee\x66\xf8\x5e\x1a\xc0\x08\x1d\x19\x68\x48\x07\xd8\xf5\xf2\x0e\xc4\xb8\xb5\x16\xc7\xa8\x96\xa5\xd3\xf0\x7e\x2e\xab\xb8\xa4\x91\x3d\x88\x55\xd0\x04\x49\xd9\x64\x62\x46\x46\x25\x9d\x0b\x99\xd3\x55\xaa\x28\x4f\x3b\x8d\x6e\x24\x20\xcc\x56\x69\x82\x06\x63\xa1\x98\x23\xc5\x52\x48\xa8\x3c\x6a\x96\x18\x39\xcf\xf4\x4c\x94\xd3\x59\xbd\x2b\xc2\xa6\x9c\x28\x8d\xd1\x5a\x66\x32\x95\xb7\x78\x2c\x6d\x36\x65\x64\x1d\x9e\x80\x15\xc9\x04\xd8\xe3\xfe\x48\x3b\x8e\xbd\x12\x51\x60\x43\xc4\xed\x9a\xfb\x14\x2e\x0c\x09\x84\xb4\x91\x6f\xc7\xe1\xb3\x8e\xf0\xc2\x23\x72\x65\xf1\x33\x06\xed\x5e\x5b\x53\x62\x27\xa3\x11\x12\xe7\x83\x3b\x3b\xc6\x03\x2e\x0d\xc0\xaa\x8c\x35\x84\x39\xb6\x9d\x53\xbe\xf0\x09\x22\x18\xb2\x66\x13\xdb\xaa\x9c\x95\xac\x9b\xed\xbd\x3a\x4b\xaf\x5e\xb5\x47\x41\x52\x4a\xa6\x17\x17\x82\x6b\xf8\xdc\x89\xf7\xc5\xb8\xd5\xef\xda\x64\xb4\xee\x75\x4f\x22\x11\x85\xc5\x96\x5c\x2a\xdc\x34\x13\x65\x96\x22\xc2\x6e\xc9\x91\xed\x74\xbb\x51\xae\x26\xe6\x0a\xb7\xfb\x0d\x6f\x4c\x74\xa7\x2d\x13\xe6\x23\x45\x6d\xc0\xec\x7f\x97\x6c\x4e\x33\xe0\xba\xf1\x8b\x1b\x8c\x1d\x6c\xfe\xe8\x25\x7d\xae\x9a\xaa\x87\x5a\xc3\x80\x61\x21\xd2\x5a\xa1\x38\xf3\x53\x87\x1f\xc1\x67\xfd\x05\xfa\x5b\x51\x60\xba\x91\x6c\xce\x32\x98\xc2\xa5\x4a\x68\x86\x7a\xd4\xbe\x95\xf3\xf3\x0d\x74\xe1\xce\x94\x22\x53\x46\x00\x33\xca\xaa\x11\x35\x6d\xe4\x34\x3a\xfe\xa6\x94\x71\xac\x3a\x14\xe0\x1c\x72\x83\x2a\x1b\xba\x6d\xf4\xed\x82\x4a\xb3\x0b\x7d\x88\xb6\xbd\x1a\xc7\x42\x64\x0e\xa6\x36\x5b\xd4\x74\xb1\xee\x5e\x14\xe4\xc5\xe2\x6f\x1c\x1e\xff\x66\xa8\x50\x64\x92\xd1\x69\x7d\x35\x83\x5e\xc9\x77\x09\x8f\x1a\xdf\x38\xd1\x88\xc1\x5a\x1a\xc1\xc6\x48\x15\x75\x3c\x7d\x93\x83\x77\x57\xe8\xde\x9e\x22\x3f\xa1\x8a\x54\x63\x77\x13\x1d\x4c\xfb\xdd\x29\xde\x13\x17\xe7\x37\x7f\xbb\xfb\xeb\xdd\xdf\xce\xdf\x7f\xb8\xba\xee\x1e\x35\x2b\x34\x58\xeb\x4a\x43\xba\x4f\xaa\x40\x0f\xb3\x0a\x55\xac\xd0\x48\xa8\x11\xba\x4e\x10\xcc\x85\xa7\xe2\x31\xd0\xbf\x6c\xf6\x14\xd0\x6e\x92\x2b\x2d\x8a\x73\x99\x0b\x79\x23\xc5\x84\x65\x9d\x5d\x93\xb1\x4e\xf0\x12\x39\xde\xd3\x74\xee\x3e\xae\xaf\x1b\x8b\x2f\xb0\x1a\xe7\xd0\xb8\x32\x18\x66\xb1\x9b\x6e\xba\x5b\xb6\x5a\x39\x08\x36\x23\x62\x89\xc4\xee\x87\x68\xaf\x7b\x66\xef\xd9\x9b\x86\x8c\x8e\x3f\x8f\xe1\x89\xcf\x44\x42\x33\xac\x5f\x14\xb6\xf1\x49\x64\x27\xeb\x32\x5d\x8d\x6c\x13\xea\xb7\x33\xc9\x04\x4d\x51\x59\x75\xcc\x3f\x05\x8f\xaa\xed\xc5\x2e\x74\x9c\x07\x11\x72\x6f\x23\xfd\x71\x3c\x9f\x1e\x53\x48\xa8\xa4\x9a\xa5\xe1\x05\xe9\x5e\x6d\xd0\xb7\x0f\xed\x30\x04\xf7\x96\xad\x44\xce\xd0\x33\x57\x0d\xe3\x0e\x18\x9b\xa0\x05\x04\xcd\x40\x6c\x82\x9b\x12\x0d\x40\x3f\xf8\x65\x08\x28\x7c\x12\x29\x12\x00\x3b\x39\x90\xdd\x69\xe7\xa7\xda\x91\x36\x4c\xf9\x81\x99\x19\x9c\xd4\x4c\xda\x6f\x1b\x2f\x83\xd8\x58\xe5\xc0\xfd\xf8\x09\x4b\x6c\x79\xfe\x4f\x65\x30\x2e\x58\xb5\xc4\x64\xd8\x38\x5a\x85\x84\xe1\xea\xf1\x0a\x0d\x5c\xb8\x2d\xb9\x66\x39\x78\xec\x8b\xe1\x92\x4c\x24\xed\xd7\xc7\xaa\x42\x9a\x8d\xb2\xd1\x09\xf9\x33\xc7\xf3\xca\x21\x25\x43\xc2\x45\xbd\x44\xc0\x27\x42\x26\xe8\xa4\xd9\xeb\x06\x4f\x68\x41\xc7\x2c\x63\x21\xcc\x3c\xd6\x06\xc7\xc2\x0d\x0d\x7a\xd0\x9c\x94\xa6\x67\xa9\x14\x85\xbd\x89\x7d\x52\x6a\x78\x60\x60\x3b\xf9\xa9\x89\x31\x8c\x02\xfb\xa4\x4d\xc8\x54\x52\xae\x6b\x43\xee\xca\xc6\xf9\x25\xca\x20\x31\x84\x00\x9a\xc6\x2b\x81\x72\x9e\x1a\x9e\xd1\x5c\xb6\xe0\x73\x75\x68\x70\xaa\x17\xfe\xe5\x1a\xd9\x4f\xe4\xe6\xe3\xdd\xd5\xff\xb7\x74\x6e\xba\x8b\x76\xb6\x1d\x36\x98\xa2\xe1\x07\xd1\xb6\xcd\xad\xab\x40\xd5\x6f\x9c\xaf\x7b\xe3\x54\x06\xa2\xbd\x23\x41\xdd\x96\xbc\x5d\x05\xbf\x26\x8d\xe4\x41\xb2\xce\x4d\x05\x9a\xd0\xee\xb5\xe9\xeb\x91\x40\xcc\x23\x5c\x33\xf4\xbc\x35\xac\xb5\x5a\xd8\x22\x4b\x51\xea\xb5\x36\x6f\xd7\x09\xcd\xd4\x97\x7a\x45\x86\x98\x76\x0a\x29\x92\x0f\xa2\xe4\x71\xa0\xa5\x02\x76\x5c\x45\x08\x49\x81\x0b\xed\xac\x29\xa8\x4b\x88\x09\x7e\x4b\x6c\xd8\x54\x03\x35\xb2\x25\xe7\x04\x88\x59\xf7\x0d\xd1\xaa\xf2\xef\x7b\x39\xdc\xea\x2f\xa5\x82\x65\xff\x85\x93\xab\xea\x28\xaa\x89\xe8\x1e\x3c\x22\x81\xa6\xa8\x60\x16\x54\xcf\x2c\x9c\x59\x4e\xd5\x03\xa4\xf6\x83\x40\x28\x87\x2a\x07\x07\x5d\xfc\x7e\xa6\xef\xcd\xe4\xfa\xb4\x19\x34\x08\x5b\x50\x37\x4c\xd4\x09\x51\xc5\xf6\x7a\x1a\x02\x18\xbb\x59\x84\x8f\x3c\x5b\xdc\x0a\xa1\xbf\xa9\xaa\xb5\xed\xfb\x64\xfc\xc5\xb9\x23\xda\x46\x4c\xb4\x4b\x53\x24\x79\x88\x1b\x07\xf9\x62\xa3\xc6\x5c\x28\x5b\x34\x0b\xf2\x4b\xe5\x8a\xb2\xe4\xe7\xea\x5b\x29\xca\xce\x32\x5c\x4c\x7d\xf3\xdb\xab\xf7\x78\xf1\x95\x0e\xed\x87\x6b\xb9\xc0\xe2\xa3\xde\xe2\x15\xd1\x69\xf3\x67\x87\xab\xd4\xe4\x6c\xc1\x10\x2a\x84\x7c\xa0\x0b\x42\x33\x25\x2a\x93\x1a\x5f\xe7\x6e\xf5\xbe\x5c\xf3\xf5\x58\xe8\xd9\x8a\x13\xb7\x6b\x14\x88\x69\xab\xe3\x0d\x1a\xa0\x41\x75\x7e\x36\xe3\x2b\xc3\x6a\x4c\x2c\x2a\x24\x24\x90\x02\x4f\xbe\xd4\x13\xb1\x6f\x0c\x1b\x3c\x55\xd7\x82\x1b\xf6\xba\xef\x73\x75\x55\xd9\x27\xdd\x6a\x34\x4f\x11\x9a\xb2\x9d\x13\x91\x62\x98\x1e\x32\xd7\x52\x85\x64\x7d\x5d\x4d\xd0\xeb\x69\x37\xdd\xf7\xe5\x18\x32\xb3\xd8\x2c\xcb\xcc\x0e\x64\x29\xd5\x36\x34\x81\xe5\x74\x0a\x84\xea\xea\x10\x6a\x41\x80\xab\x52\xba\x7d\xd3\x31\x40\xc7\xb4\x2a\xb6\xc8\xbd\xda\x9f\xaf\xde\x93\x37\xe4\xc4\xbc\xdb\x29\x4a\x1c\x13\xca\x32\x84\x90\xc2\xe0\xbf\x25\x97\xec\xc4\x87\x27\x05\x4d\x01\xf2\x11\x22\xa4\xbd\x5a\x06\x84\x0b\xa2\xca\x64\xe6\xe7\x80\x09\x5e\x59\x84\x1d\x9e\x70\x50\x2e\x4c\xcf\x76\xe2\xdd\x87\x7f\x56\x20\xf7\x7d\x6c\xcd\x75\xf8\xe7\x57\xbc\x0e\x9b\x2a\xa2\x39\xfe\xed\x05\xb3\x67\x35\x07\x4d\x53\xaa\xa9\xbb\x26\xfd\x03\xfd\xae\xed\x2f\xcb\x80\xcb\x52\xc1\x0f\x8c\x97\x9f\x2d\x62\xe7\x41\xb8\x3d\xee\x2e\x91\x22\x92\xf8\x85\x16\x0d\xbf\x9d\xf7\x50\x44\x48\x8f\xbe\x6a\x1d\xa3\xc1\x06\xad\x1b\x6f\x09\x6a\xe1\x1f\xc0\x28\x42\x94\xa7\x22\x5f\x21\x72\x22\x24\x01\x9a\xcc\x3a\x53\xd3\x88\x1a\xe9\x0f\xa6\x6b\xbf\x6c\x87\x50\x06\x73\xc8\xa2\xd9\xf6\x7f\x30\xbd\x99\xc9\xf1\x3b\x17\xbb\x27\x19\x1d\x43\xe6\x00\x5b\x2c\x8a\x57\xc4\x13\x16\xc9\x06\x2e\x45\xc4\x90\x98\x5b\x61\x23\xb9\x68\x35\x11\xa6\xfb\x2f\x62\x1e\xa2\x06\x5f\xdc\xbb\xe8\x92\x7a\x1e\xd0\x06\xfa\x25\xcc\x43\x19\x20\x20\x92\xe5\x79\x30\xd2\x66\x7b\x1e\x50\xfe\x3a\xf4\x79\x50\x90\x24\x22\x2f\x0e\x24\x52\xf2\xde\x46\xe1\x1b\x8a\xb6\x8d\x8a\x6c\x3f\x4c\x83\xc2\x9d\x1d\x0e\x33\xd5\xf6\x1e\xf4\x60\xcc\xff\x57\xe3\x3a\x47\x6e\xb7\x7c\xc7\xbb\xd1\x83\x23\x32\xab\x11\x5d\x87\xbf\xc4\x1b\xaf\x0f\xc3\x6c\xb5\x57\x0f\xc3\x6c\x60\xb9\x51\x34\xcf\xb7\x42\x22\xbf\x86\x60\x4c\xa3\x04\xe0\xbc\x02\xc7\x84\xb2\x82\xea\xd9\x80\x48\xc8\x2c\x42\xba\x63\xcf\x0f\xd6\xe2\x75\x8c\x1c\xc7\x13\xe4\xd9\x4d\x1d\xb3\x6a\xc1\xdc\xa2\xc6\x6e\xae\x8b\xd7\xb4\xcf\x5c\x7f\xbc\x6f\x26\x00\x53\xbe\xb0\x30\x05\x01\xe9\xad\xb6\x1d\x9e\x58\xf1\x92\x31\x9d\xcb\xab\xf8\xd2\x21\x9d\x41\xfd\xad\x8f\xe8\x7c\xbd\x53\xba\x5d\x94\xe7\x72\x8c\x67\x54\x12\x96\x03\x3e\x57\xc7\x88\xb0\x72\xc1\x47\xc0\x5d\x9d\x07\x64\x00\xf9\x8b\xa5\xc8\x6b\xd9\x89\x61\x1c\x9a\xf1\xa9\x6a\x1a\x41\x68\x96\x45\x89\x49\x58\x67\x05\xf1\xa7\xa0\x42\x33\x5b\xb5\x06\xb4\xab\x6d\x84\x8c\xfe\x8c\x05\xe3\xcb\xb6\x44\x64\x46\xa3\xf8\xc2\xed\x10\xd3\x5c\xd1\x0b\x69\x66\x50\x33\x9a\xdd\x15\x90\x1c\xca\x6d\xf1\xed\x87\xbb\xf3\x36\x65\x28\x0b\x3b\xec\x46\xc0\xef\x09\x4d\x73\xa6\x14\x3a\x7c\x60\x3c\x13\xe2\x21\x68\xc8\x13\x9f\x6a\x3b\x65\x7a\x56\x8e\x47\x89\xc8\x1b\x59\xb7\x43\xc5\xa6\xea\xcc\x71\x94\xa1\x99\xb8\x53\xc2\x78\x56\x65\x2a\xa3\xb5\x90\x6b\xe5\x3c\x08\xc1\x2f\x4f\x92\xea\xed\x71\xeb\x61\x7e\x4a\x15\x9a\xbd\x3a\x3d\x08\xb0\x89\x9b\x77\xef\x52\xc7\xea\xae\x0a\xc3\xc1\x5f\xda\x59\x1b\xde\xbd\x09\x16\xe9\xbc\x38\x6b\xe7\xd1\x2a\xaf\x7b\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\xef\x6a\x92\x48\x0a\x16\x44\x04\x10\xcf\x8b\x6e\xcc\xb9\x47\xf7\xf6\x31\xd6\x12\x74\x3f\x3d\x8e\x85\x6f\x7a\x9e\x65\x66\x21\xa9\x03\x94\x69\x44\x77\xa2\x6a\x52\x61\xb8\x28\xb3\xe2\x16\xbe\xc5\x28\x0b\xcd\xb7\x08\xaf\xb9\x7f\xc2\xb4\x47\xcf\xf1\xf0\x3d\x5a\xd8\xb1\x29\xc9\xd9\x67\x43\x61\x73\xc4\x36\xde\x08\x3a\xfe\xd7\x7f\x1d\x50\x5a\x89\x60\xf0\x41\x05\xdb\x35\x30\x2b\xd4\x1c\xc4\x27\x47\x6b\x73\x6d\x99\x2f\xae\x41\x1b\x45\xcd\xce\x5b\xd3\xfb\x60\x14\x2b\x59\x46\x38\x0c\x21\x9e\x61\xd2\xf4\x0e\x47\xe5\x14\x81\xe7\x01\x3d\xc5\x8e\x26\x23\x83\x78\xe1\xed\xb5\x3c\xc7\x64\x4d\xfa\xce\xab\x79\x90\xc9\xf6\x5e\xe4\x17\xf4\x55\x91\x43\xf1\x57\x85\x42\xad\x34\x60\x63\xf6\x86\xb3\xd2\x84\xae\x61\xab\xc1\x4b\x37\x22\x5d\x41\xb4\xf1\x45\xe7\xbb\x97\x18\x31\x9b\xa3\x56\x41\xb8\x70\xe6\x91\x46\xdd\x77\xf8\x0c\x49\xa9\x21\x75\xc0\x56\xce\xa4\x6c\x41\x71\xda\xd4\x74\xa6\xc0\x27\xe9\xbb\x8a\x93\x6a\x50\xa3\x81\x3b\x5d\xa7\x82\xe6\x1a\x90\xff\x42\x2e\xe9\x70\x2c\xeb\x52\xf5\x37\xd5\xcf\xbb\x4e\x05\xc6\x51\x27\x94\x7b\xdd\x0a\x2b\x9e\x5b\x0b\xb7\x03\xb0\x72\x38\x1e\x63\x20\x05\x95\x34\x37\x77\xb0\x22\x6e\x79\xc6\x30\x65\x36\x2d\xb0\x71\x29\x56\x08\x58\xdd\x10\xdd\x50\xb1\x61\x9a\xe4\x6c\x3a\xb3\xa7\x85\x50\x2c\x0d\x49\x7c\xdc\x58\x26\x68\x4a\x90\xb1\x08\x49\x1e\xa9\xcc\x8d\x2c\x40\x93\x19\x06\xa1\x51\x4e\xd2\xd2\x9c\x07\x82\x78\x4d\x8b\xa1\xd2\x54\x1b\x1d\x13\x64\x80\x0d\xce\x4f\xd3\x1e\x8a\x97\xbc\x74\x61\xb6\x3d\xe3\xe9\x98\x93\x16\xc5\x0a\x72\xf9\x19\x92\xa5\xd2\xdf\x79\x8e\x10\x7f\xc2\x1f\x67\x8f\x54\x16\x2c\x0c\x1e\x88\xaa\xec\xde\xf0\x50\x64\x93\x0b\x37\xe1\xcc\x6b\x9f\xf6\x4f\xa3\x8f\xb6\x17\x41\x79\x27\x56\x03\xb7\xd7\xfc\x69\xb6\xba\x39\xb9\x16\x23\x48\xc8\xaa\x8e\x5c\x10\x59\x9e\x0e\xac\x4c\x25\x84\x26\x27\xc7\x67\xc7\xa7\x2b\x7b\xe1\x58\x35\xd3\x0c\x6c\x46\x74\xfd\x42\x8a\xe5\x45\xb6\xc0\x77\x38\xb6\xc5\xa8\x02\x8a\xbc\x9a\xe6\x03\x56\xab\x0a\x0c\x6a\x06\x59\x36\x20\xca\x88\xbf\xd4\x83\xdf\xda\x4f\xcd\x43\x5a\x96\x89\x35\x93\x9d\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xb6\x0e\x0f\x72\x8f\x3a\x64\x10\x4d\x15\x11\x0b\x51\x62\xbd\x64\xbb\x6c\x15\x5e\x72\x42\x8d\xfa\x53\x5a\x19\xdd\x82\x6e\x40\x16\x50\xff\xd7\xb4\xcb\xcf\x4c\x1b\x51\x44\x97\x68\xa6\x78\x63\x35\x05\x30\xec\xd5\x5c\x78\xe6\xa6\x3b\x9b\x01\xcd\xf4\x6c\x51\x69\x2f\xb6\x14\xad\x22\x25\x77\xdf\x84\xcb\x50\x07\x90\x36\x7a\xb8\x09\x9c\xae\x22\xf6\xfd\x4c\x82\x9a\x89\x6c\xef\x69\x9c\xbe\x4c\x6a\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\xb9\x52\xad\xc2\x01\x9e\x9a\x53\x26\x21\x75\xc2\x92\x43\x4f\x9c\xd1\x39\x4a\x0a\x46\x9e\x83\x34\x44\x35\x69\xea\x44\xbf\x8f\x59\xc8\x75\xff\x35\x53\x4d\x9b\xca\x22\xce\x2d\xfd\xed\xed\xcd\x45\xeb\x96\xc6\x0f\xbe\xc3\x63\x7c\x31\x83\xe4\xe1\x36\xac\xa0\xc8\x81\x84\x16\x14\x42\xee\x53\x30\x30\xc3\x47\x93\x0a\x6e\x84\xd4\x84\x57\xa5\x91\xcd\xd9\x9a\xe2\x2a\x82\x9c\xb3\x04\x46\xbe\x6c\xb2\x77\xce\xfb\x02\x38\x94\x4f\x81\xbc\x35\x07\xe2\x8f\x7f\xf8\xc3\xef\xff\x10\xce\xa3\xc3\x91\xcc\xc3\x0f\x02\xc1\x60\x28\x7c\xf1\x43\x11\xbb\xee\x2c\x39\xeb\x8c\xcd\x8e\x52\x54\xea\x32\x9a\x54\x6b\x33\x5d\x7f\xe8\xc2\xac\x92\x0a\x80\xac\x71\x57\x18\xd6\x61\xff\x6f\x9c\x89\xf1\x59\x4e\x95\x06\x69\x74\x1c\x77\xad\x0f\x13\x43\x01\xe3\xd3\x51\x9e\x9e\x06\x54\xb8\x23\x0d\xb5\x7a\x05\x5b\xbc\x05\x33\xb3\x01\x27\xdc\x4c\xca\xde\x4d\xf0\xc4\x53\xf9\x8e\x1c\x75\x03\xa6\x36\x4b\xf0\x2d\xc4\xc9\x44\xfb\xee\xfe\xfe\xe6\x5b\xd0\x4d\x86\xcd\xf1\x43\xf2\xed\xe5\x7d\x55\xf1\xca\xec\x2e\x9b\xd4\xd4\x73\xed\x10\xae\x3d\x13\x61\x25\xcf\x62\xfb\x5d\x2c\x2b\x41\x98\x6d\xce\x21\x31\x0b\x3d\x68\x15\x57\xf1\x71\x88\x57\x37\x23\xf2\x57\x51\xa2\xc8\x45\xc7\xd9\x82\x3c\x52\x8b\x68\xa0\x20\x8c\xa7\x1c\x19\x32\x8e\x0c\xd7\x32\xbb\xfa\x3b\xa0\xa9\x2d\x97\x80\xa6\x9d\xbd\x9f\xd5\x06\x4d\xd1\x96\xed\xa2\x54\x5a\xe4\x64\xe6\x5e\xd5\xce\x61\x5d\x53\xce\xca\x46\xf6\x08\xa2\xef\x47\x11\x09\x85\xd5\x96\xdc\x6f\xbe\x0a\x5d\x68\x85\x0b\xd9\x79\x6e\x54\x1e\xa2\x24\x69\x4e\x95\x13\xf4\xd1\x84\xc9\x1c\x8f\xea\x6c\x12\xab\x5b\x94\x02\x9e\x24\x52\x11\x4f\x12\x5e\xc8\xd3\x77\x12\xee\x84\x8c\x53\x12\x94\x44\x29\x0b\x4a\xa2\x57\x7b\x24\xce\xd5\xe6\x36\x97\x0d\xc0\x31\x84\x86\xa2\x12\x12\x6f\x4c\xae\x6a\x71\x50\x2e\x38\x4b\xac\x3b\x83\x94\x85\xe0\x44\x94\xba\x28\x35\x9a\x82\x12\xaa\x60\x38\xa7\x92\x19\x86\x6a\x6b\x2a\x57\x91\x50\xdc\x9c\x76\x2d\x04\xda\x49\x2a\xa7\xb3\xa5\x38\x9c\xcc\x48\xd2\x8c\x69\xb8\xd9\x22\xaf\xf0\xca\xe2\x84\xef\x68\x72\xd0\x36\x18\x62\xcb\x58\xcd\xe2\xa9\x75\x54\xcf\x30\xb2\x0f\x7d\x59\x3e\x30\x14\x19\xa7\x51\x1b\x0e\x20\xf1\x26\xaa\x16\x1b\xc8\x12\xd0\xdf\x2e\xe4\x92\x1e\x6c\x28\x5c\x9d\xc3\x48\xb1\x26\x2f\xaf\x56\x37\x4b\x20\x8f\xc1\xc8\xf6\x57\xe7\xd7\xe7\x7f\xbb\xfb\x74\xf1\xb7\xeb\xf3\x0f\x97\x21\x5d\x07\x97\x2f\x8b\x59\xc0\x2c\x5a\x09\xb3\x17\x2a\xf0\x68\x9a\x4a\x66\x70\x38\x61\x26\x77\x48\x4d\x13\x94\xcc\xe9\x00\x8d\xd2\x3a\x61\x28\x75\x64\xc9\x68\x6a\x18\xcf\x5e\x39\x8e\x8b\x2a\x78\x0f\x19\x5d\xdc\x41\x22\x78\xba\xf7\xe8\xec\xeb\x8a\xd9\x28\x4b\x50\x55\x51\x08\x96\x10\xb3\x7c\x0d\x2f\x57\x07\xc9\xc7\x07\x34\x43\x1a\xec\xfb\x75\xf6\x5a\x93\xc3\xf3\x5c\x93\x83\x31\x8f\x17\x20\x19\x46\x04\x1d\xc2\xae\xf9\x4e\x3c\xba\xe2\x60\x27\x8c\xfb\x9d\x73\xda\xb0\xd2\xd4\xee\x91\x70\x34\x35\x2d\xc8\xdb\x37\x7e\x90\xaf\xcf\xef\xe1\x22\x7d\x0e\xda\xf3\xe5\x68\x7c\xde\xf5\x55\x87\x2d\xb5\xdd\x5f\x21\xf1\x43\x64\x89\x8d\xbf\x1d\x55\x79\x6a\x6f\x91\x9e\x8a\x15\x51\x9e\xfa\x90\xb3\xaf\x6f\x9f\xe8\xa4\xb8\x13\xc9\x43\x24\xb3\xeb\xfd\xc5\x8d\xed\x6d\x29\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\x3d\xb6\x69\x5d\x34\x7b\xb7\xb3\x01\xf5\xb8\xd7\xb6\xea\xe6\x05\x1f\xd9\xae\x80\xd2\x6b\x5b\x1b\x5a\xaf\x6d\xed\xd0\x7c\x25\x5a\x26\xf8\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x24\x75\xf5\xd9\x49\x2d\xc3\x55\xec\x82\x03\xa4\x96\x7f\xf8\xa2\xba\x64\x6a\xde\xc4\x86\x47\xa3\x0d\xb1\x0e\x2c\x2e\x65\x80\x98\x77\x3f\x73\x5d\x3b\x11\xd7\x3b\x99\xd7\x51\x57\xeb\x26\x45\x05\x86\xee\xab\x86\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x9a\xe9\xf2\xb5\x9c\x2d\x88\x96\x2f\xbd\x57\x13\x62\x46\x9d\x08\x99\xb0\x71\xb6\x20\x33\x9a\x19\x65\x09\x4b\x02\x53\xf2\x80\xa5\x6c\xb1\x9b\xee\x13\x75\x07\x2e\x57\xd3\x4a\x34\x99\xe0\x53\x9c\x0c\xea\x72\x32\x3e\x17\x90\x98\x31\x93\x0c\x28\x2f\x0b\x4b\xa7\x91\x8f\x16\xa2\x8c\x90\x96\xe1\x1d\xdf\x95\x3c\xc5\x99\x83\x1f\xb1\x85\xdb\x9e\xdc\xf3\xed\xe4\x5a\xf2\x51\xcf\x40\x3e\x32\x05\x83\xee\xa5\x6b\x89\x37\xfb\x2e\x95\x91\xb3\x9f\x55\x10\x2a\x2e\x73\xd0\x6c\x0b\x4c\x65\xed\x3c\xd6\x27\xec\xd7\xb3\x56\x2e\xf8\x90\xc3\xd4\x02\x35\x38\x86\x66\x23\x3a\xed\xf8\x36\x7e\xb0\xca\x36\x50\x5a\x14\xad\xba\xbd\x73\x46\x3b\x53\x82\xa0\x10\xf5\x8e\x22\x27\x5c\x10\x51\x98\xab\xab\xe4\x4c\x2f\xd0\xa3\xe7\x4b\x46\x07\xe4\x5b\xdd\xbb\x30\x07\x4a\xc6\xa0\xa9\xb3\x81\x9b\x43\x50\x61\xa2\x23\xdc\xb9\x39\x7b\x98\x24\x70\xbf\x76\x03\x54\x30\xe9\x53\xaa\x03\xb8\xc4\x1a\x69\xde\xae\xe7\xd3\xdb\x8e\x29\xe7\xaf\x0b\xc4\x61\x3e\x0c\x64\x43\x73\xa2\x45\xa9\x0f\xe4\x1e\xd9\x64\x3a\xb2\x10\x17\x0d\x25\x91\xe5\xa0\x88\x28\x23\xd5\x9b\x78\xeb\x86\x8b\xa9\xe1\xf5\x76\xa7\xb5\x4d\xe9\x94\x75\xaa\x3a\x1c\x63\x8b\x6d\x00\xef\x77\x79\xb8\x0d\xfc\xca\x71\x39\x99\x80\xc4\x9b\x0e\x09\x5e\x09\xbb\xaf\xea\x78\xf9\x3b\xac\x9b\xf1\xd6\x05\x7c\x81\x1e\x60\xed\x00\x07\x26\xb1\x61\x48\x07\xb2\x89\x65\x7a\x25\x28\xc4\x82\xe7\xe4\xf2\xe3\x37\xdd\xb6\x68\x8c\xca\x02\x61\x29\xab\xf8\x9e\x1f\x79\xb7\x98\xc4\xb8\xfb\x61\x1d\xea\x8b\xdb\x16\x49\x26\x94\x4b\x8f\xc6\x75\x49\x66\x94\x73\xf0\xc6\x28\xa6\xd1\x92\x3d\x06\xe0\x44\x14\x60\x83\xf2\x3a\x11\x43\x89\x62\x7c\x9a\x01\xa1\x5a\xd3\x64\x36\x32\xd4\x71\xbf\x17\xea\x3c\x64\xf7\x89\xd2\x12\x68\x6e\xf7\x84\x84\x9c\x32\x3b\x3c\xa1\x89\x14\x4a\x91\xbc\xcc\x34\x2b\xaa\xce\xba\x59\x11\x01\x11\x21\x94\x4d\x4b\xf5\x6b\x85\x69\x25\x75\xc2\xf3\xa0\xa6\xd0\xbd\xbe\x68\x16\x2b\x42\xd3\xd9\xc0\x7c\x0b\x79\xa1\x17\x55\x62\x62\x37\x1d\x68\xc2\xa4\xd2\x24\xc9\x18\x70\xed\xde\xcc\x42\x0e\x22\x0d\x03\x2f\x4e\x73\x37\x23\xca\x4d\x09\x4f\x51\xf9\x2e\xb4\xb2\xf9\x77\x15\x11\xbe\xab\x94\x29\x67\xeb\x50\xdd\xb2\xff\xa8\xaf\x4c\x63\x37\x8e\x9f\x11\xdc\x3a\x5e\xc0\xb1\x14\xb9\x8f\x1a\x24\x34\xea\x6c\xd7\xb9\x93\x61\x7c\x05\xcb\xc7\xf8\x73\x3d\x68\x61\x0e\xd4\xba\x05\xa6\xc2\xac\x70\x1d\xdc\x50\x1c\xe6\xe6\x1c\x40\x02\x46\x14\xa5\x11\x99\xcc\xab\xf3\x98\x86\x2c\xf7\x01\x94\xa2\x53\xb8\xe9\x18\x8e\x10\x83\xe1\xd4\x86\x36\x8c\x63\xa8\xb7\xcd\x0c\x2c\xd0\x95\x16\x8d\x4f\x9a\x49\x5e\x4d\xe5\x31\xb7\x2f\xd2\x89\x02\xaf\x34\x3d\x4a\xa6\x35\xe0\x2e\xc5\x4a\x4e\x18\x80\xb6\x0c\xde\xd9\x4e\x2e\xeb\x34\x9e\x9b\xf4\xe6\x78\x46\xfc\xe0\xa9\x4d\xd3\x1a\x03\x19\x4b\x06\x13\x32\x61\x98\x37\x86\x19\x55\x03\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x90\x29\x66\x71\x39\x25\xf8\x5f\xde\xfc\xdb\x1f\xc9\x78\x61\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xd4\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfd\xdd\xc3\x38\xe8\xe8\x21\x7f\x3c\x4b\x61\x7e\xd6\xd8\x42\xc3\x4c\x4c\xbb\xf5\x7a\x11\x23\x9b\x38\xc8\xce\xb6\xe6\x44\x8b\x8c\x25\x8b\x7d\x9d\x69\x5f\xbc\x84\xcc\xc4\xa3\x35\xe6\xac\x1e\xd5\x06\xd4\x4b\x21\x8a\x32\xc3\x89\x23\xdf\x54\xf8\x7c\xa5\x82\x65\xe8\xa3\x50\x23\x61\x83\xdb\xa1\x13\xd5\x0d\xbb\x74\xe7\xb8\x14\x46\x4f\xa6\x70\xc0\x13\xce\xe7\x56\xd5\x21\xe9\x6c\x8d\xfb\x86\x66\xd9\x98\x26\x0f\xf7\xe2\x07\x31\x55\x1f\xf9\xa5\x94\x42\xb6\xdf\x39\xa3\xe6\x4e\x9f\x95\xfc\x01\xab\xe8\xd6\x60\xb4\x62\xea\x62\x0a\x3d\x7e\x40\xe3\xed\x3a\x11\xe3\xdf\xd2\xc2\x83\x7a\x91\xc4\xdb\xe0\xea\x91\xe1\x33\xab\x0d\x6d\x9c\x80\xa1\xb9\x6b\x02\x3e\xb4\xde\x43\x35\x8f\xf6\xef\xde\xfc\xcb\xbf\x5a\xe6\x42\x84\x24\xff\xfa\x06\x53\x8e\xd5\xc0\x5e\x00\x78\x03\x1b\x51\x2b\xa7\x59\xd6\xd5\x4b\xd0\x64\x01\xdf\x74\x2e\x4e\x7d\x00\x47\x5e\xef\xed\x74\x6f\xad\x32\xde\xdf\xff\x15\xf5\x45\xa6\x15\x64\x93\x81\x45\x7b\xa9\xcc\x5a\xc7\x28\x5d\x1d\xbb\x2b\xaf\x3b\x52\xd0\xfe\x95\xb6\xb9\xc8\xca\x1c\xde\xc3\x9c\x25\xdd\x1c\x98\xad\x55\x69\xf5\xe6\xcd\xf4\x19\x53\x08\x02\x34\xce\x44\xf2\x40\x52\xf7\x65\x23\x54\x7e\xb9\xaa\x76\xf7\x59\xe8\x9a\x34\x10\x90\x2c\xb0\xf1\xfd\x5b\x69\x02\x39\x2d\x8a\x0a\xa1\x44\xd2\xc7\xd6\x64\x20\x6b\x42\x74\xd4\x40\x37\x62\xb0\x33\x3d\xd4\x95\x3e\x74\x6f\x64\xae\xa9\xce\x5d\x74\xce\x2d\x08\xf7\xc4\xd7\xd4\x77\xf7\x63\xb6\x36\x44\xdd\xa1\x3f\x0d\x05\xfe\xdb\xe2\x2d\xac\x20\x63\x55\x90\x43\xd5\xc6\xb0\x12\xa4\xd9\x3e\x78\xcb\x74\x37\x5f\x46\x70\x86\x86\xe5\x48\xb4\xe6\x85\x57\x4e\xe8\x9c\x6a\xa7\x1f\x79\x2f\x3b\x25\x05\x48\xc5\x94\x11\x9d\x3e\xe1\x81\xba\xc8\x28\xcb\x1b\xee\xbb\x7d\x4d\xc2\x6a\x44\x7d\x4e\x8b\xe1\x03\x2c\x3a\x6e\xb8\xc0\xe3\xb2\x29\xc0\x3f\xa7\x45\xc7\x7b\x00\x4b\xd7\x86\x5f\x03\x1d\x2f\xe7\x1b\x91\x3a\x3a\xf0\x7a\xb0\x25\x89\x5f\x44\x8d\x8d\x28\x03\xed\xfb\xca\xf9\x54\x2f\x5c\xfb\xc6\x31\x9f\x54\x57\x8e\x7d\xea\x6b\xba\x68\xf0\xfd\xbe\xd4\x7b\xa6\x22\x3e\x12\x3b\x0d\x8a\x74\xc2\xdb\xc9\xed\x8c\xf6\x75\xd4\x32\x68\xd9\x93\xd9\x50\x7d\x9d\xa1\x69\x64\x8b\x02\x04\x10\x60\x8e\xa2\x1b\x94\x1c\xbf\x3b\xde\xeb\x1d\x67\x57\x46\x8a\x82\x4e\x51\x33\x3d\x84\x05\x5a\xa6\xa9\x89\x41\x3b\x13\x8f\xf6\x7b\x1b\x5d\x52\xb8\xa7\x20\xad\x81\xcc\x67\x22\x68\x75\x6c\xe4\xa0\xdf\x11\x4e\xbb\xb6\x58\x85\x8f\x74\x41\xa8\x14\x25\x0f\x4a\x83\x46\xc7\x48\xe5\x38\xfb\xb0\xf4\xb2\xd7\x82\x83\x77\xd2\x87\x8c\x72\x5f\x63\x98\x33\x65\xe3\x15\x18\x27\x6f\x47\x6f\xdf\x04\xd3\x7e\x0b\x49\x29\x15\x9b\xc3\xad\xab\x71\xde\x70\xaa\x5c\x4d\x6e\x84\x52\x6c\x9c\x61\xe2\x96\x16\xe4\xd2\x16\x80\x5f\x7d\xd1\x2a\x70\x04\xdf\x58\xc8\x26\x5a\x69\x00\x85\x27\xf6\x04\x37\x03\x3e\xcd\x00\x01\x51\x1f\x87\x25\x49\xe2\xba\x2e\x49\x92\xd7\x95\x24\x69\xef\xbd\xbd\xbe\xab\x2f\x7c\x7f\x08\x9c\xe4\x83\xf3\x0d\xd4\x95\xed\x99\xaf\x9c\x8c\x1f\x3d\x4a\xa6\xdd\xe1\x7e\x64\x0a\xc8\x09\x5a\x25\x96\x36\x63\x10\x40\x73\xd3\x86\x15\x58\x01\x3f\x06\xc0\xb2\x5c\x3e\xba\x87\xb0\x4a\xab\xfc\xa4\x8e\xc0\x7f\x74\x06\xac\x7a\x05\x1d\xf7\xaf\xef\xe5\x19\xe5\x69\x16\xc4\x33\xaa\x59\xc9\x16\x41\x58\x38\x57\x13\xd2\x64\x89\xce\x7f\xd9\xa8\x26\x31\xa3\x8a\x70\x41\x72\xa0\x18\xa0\x69\x6e\x17\xcf\x05\x5b\x58\xcd\xf1\x68\xb0\x9b\xdd\x5e\x63\xcd\x0b\xc1\xb1\xeb\xf7\x4c\x39\xf6\x6c\xf8\x88\xd3\x40\x6c\x58\x47\x4e\xd3\x90\xd4\xee\xc6\x9c\xd6\x8b\x37\xaa\x83\x26\x97\x29\xa9\x2f\x8e\x25\x5a\x5e\x82\x8e\x81\x2b\x41\x6e\x86\x2f\x31\x4e\x70\x8d\x59\xae\x0e\x92\x09\xf2\x66\xdb\xb6\xfc\xba\xd5\xb5\xb8\xf2\xae\xeb\x29\xae\x08\x0e\xa0\xe1\xf9\x57\x1d\x34\x78\xa1\x8f\x11\xb5\x2e\x75\x57\x03\xc5\x65\x3c\x86\x21\x79\x7b\xa7\x44\x65\xee\x99\x02\x07\x49\x9d\x5f\xc1\x87\x88\x3a\xf0\x15\xaa\x04\x0f\x3d\x10\xcf\x6c\x38\xc3\xef\x9f\x17\x53\xec\xcf\x02\x08\x41\x39\xe7\x44\xc8\xa5\xd3\xee\x3c\x26\xeb\x24\x96\x98\x6f\xbd\x04\xcd\x65\x37\x7f\x03\xf3\xd3\x2c\xca\x7f\x97\x6c\x4e\x33\xb0\x18\xf6\x9e\x35\xec\x55\x98\x50\xe5\xf8\x50\xd5\x46\xa7\x1f\xa2\xda\xb1\x3e\xe8\x61\xa3\x06\x19\x49\x9e\x38\x3a\x22\x27\x76\x8c\x63\x0b\xb2\xbb\x5f\x21\xd7\xad\xd5\xe5\xe7\x22\xa0\x72\x6b\xbc\xf5\xba\xfc\x5c\x50\x8c\xd3\x28\x0e\x62\xe1\xfe\x27\xcc\xe8\x1c\x10\xd3\x98\x65\x54\x66\x18\x94\x7e\x67\xa7\x8c\x8c\x4b\x4d\x80\xcf\x99\x14\x3c\x37\xc7\x0f\xc1\x67\x0c\x67\x92\x80\x60\xf0\x09\x28\xf2\x9b\x93\x4f\xe7\xb7\x98\xb4\x74\xea\xd0\xf2\xdd\xfb\x95\x0a\xf1\x01\x96\xde\xa1\xd1\xdd\x21\xee\x37\xe2\xdf\xdd\x6c\x17\x94\x4f\xfc\x5c\x98\x77\xcb\x4b\x5d\xd2\x0c\xa1\x9f\x93\xac\x34\x77\xe1\xde\x76\x76\x7c\x1b\x78\x88\x25\x2f\xa6\x09\xdc\x01\x7f\xbf\x67\x9d\x8e\x6b\x8c\x83\x7a\xd1\xd8\xaf\x2b\x30\xe4\x9d\x6b\x3c\xac\x01\xa1\x5c\x11\x74\x8e\x55\x05\x4c\xd9\xcc\xc3\x71\x77\x71\xb7\xf0\x0c\x2c\x9d\x60\x93\xbf\x7d\x4d\xd2\x15\x0b\x23\xd6\x68\xd9\xbb\x0d\xbf\xc3\x61\x88\x77\x0c\x3a\x18\xa2\xe3\xec\xfa\x94\xab\x0b\x5c\x9a\xdd\x28\x0e\xdb\xe8\x77\x95\x26\x6b\x36\xc2\xfb\xeb\xbb\x66\x41\x0f\xeb\xfc\x13\x3b\xaf\xe4\x4d\xdd\x45\x5d\xf5\x06\x2b\xe2\x55\x0e\x54\x90\x53\x2b\x4e\x23\xf2\x6c\x25\x5f\xbf\xbf\xbe\xdb\x71\x2c\xbf\x9b\xad\x30\x3c\xa6\xca\xc6\x48\xbf\xbf\xbe\xb3\x71\x6b\xbb\xd1\xde\xd9\x91\xd2\xdd\x07\x81\x00\x6e\x88\xad\xd5\x81\x63\x87\x73\xb9\xf3\x2a\x1e\xc4\x2c\x3e\xfa\x7c\x2d\x35\xe4\xea\x86\xd0\x34\x95\x18\xce\xdc\xe5\x2c\xb7\x10\xed\x68\x51\x54\x51\xa9\x58\x24\x86\x2a\x68\xbe\x7a\x63\x0f\xa0\xe0\xd3\x71\xfd\x6c\x7b\x5f\x16\x19\xb3\xe1\xa7\xcd\x21\xea\x12\x3a\xb9\x98\x77\xe1\x4f\x21\x1e\xc6\xce\xfe\xc5\x20\xf9\x20\x2a\xe6\x9c\xe8\x5a\x9e\x36\xf6\x2e\x95\xa0\x44\x36\xaf\x8b\xe7\x07\xef\x4e\xc7\x8e\x30\x24\xb1\xda\x9d\xbe\x02\xed\x0b\xed\x4c\xe0\x5a\x32\x58\xdd\x95\xe4\xd6\xbc\x5d\x89\xec\xac\x22\x81\xcd\x01\x53\x96\x5c\x85\xe0\x0e\x23\xe3\x30\x3e\xef\x96\xe8\x99\xcd\xba\xa1\x1a\x4f\x26\x95\x5e\x14\xc0\x37\x0f\x78\xc5\xbd\x1c\x91\x25\x64\xfa\xf4\xfd\xf5\x9d\xbd\x49\xed\x74\x39\x3c\x6f\xb5\x76\xef\x74\xbe\xe4\xc8\xfe\xcb\x24\x85\xb8\x6d\xa2\xe5\x94\x56\x25\x4d\xd9\xda\x09\x3e\x56\x81\x10\xa9\xb7\x2e\x34\x21\x2c\x11\x38\xc0\x72\x10\x84\x54\xda\x8e\x0d\xf1\x69\xaf\x4f\x4c\x16\x8e\xb6\x97\x77\x8d\x7a\x57\x28\xa0\x32\x99\x75\xd9\xd8\xb1\x2f\x0b\x4b\x09\x49\x85\xcd\x10\x9b\x08\x89\x1e\xf8\x21\x8a\x3a\x99\x10\x0f\x65\xf1\x32\xd2\x8d\x1b\xb8\xa0\x7a\xf6\x62\x97\x48\x6b\x8c\x5e\xbe\xe9\xbe\x67\x53\xae\xba\xe4\xb9\x04\x2a\x5f\xa0\xad\xca\x85\x23\xd7\x48\x6d\xbb\x5f\x46\x2d\x33\xd8\x45\x56\x2a\x0d\xf2\x1b\x26\x95\x3e\xda\xb5\xa7\x4f\x34\x63\x0e\x38\xd9\x86\xb0\x1c\x37\xbb\xfb\x0b\xd3\x33\x57\xa8\xf7\x78\xd0\xfe\xca\xfc\xed\xc8\x38\x26\x42\x92\xe3\x6b\xc1\x61\xe7\xe0\xa1\x25\x0d\xb4\x12\x7c\xaa\x2b\x7d\xa3\xcc\xe6\x26\x51\x41\x66\x41\x55\xf0\x8b\xce\xe7\xec\xde\xd5\x4e\x36\xf4\x78\x49\x41\x81\x26\x14\x8b\x4e\x62\xdf\xb3\xba\x60\xb1\x2d\x8e\x66\x0b\x3d\x0b\xa7\xf3\x2e\x1a\x4b\xbb\xe3\xe0\x8d\xea\x6a\x5a\x6c\x5e\x80\x2e\xaa\xed\xce\xe7\x0c\x11\x43\xc0\x95\x93\xf9\x81\xf1\x87\x1d\x0f\x79\xd8\x09\xb9\x5c\x19\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\xb1\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xba\x2a\x6b\x0c\xe0\x6a\x60\xc3\x5c\xbc\x85\x5b\x2d\xb8\xa6\x58\x6b\xfb\xbd\x48\x1e\x40\x92\xcc\xd0\xbc\xeb\xe6\xab\xf3\x58\x5b\x55\x95\x77\x4e\x6b\xe9\x1a\x91\x01\xc5\x0c\x72\x90\x34\xab\x0c\xa0\xaf\xba\xe8\x3f\xb8\xdb\xbb\x22\xa3\x99\xc4\x69\xcb\x23\xba\x42\xb9\x22\x1d\x91\xcb\x75\x4f\xe5\x74\xe1\x0b\xbf\x33\x8e\xbe\xc3\xcf\x4c\xe9\xdd\x6f\x98\x42\xa4\x4d\x8c\xd4\x52\x81\x1c\x56\x98\xb9\x84\xba\xe2\x8b\x3e\x9f\x36\x85\x71\x39\x9d\x32\x3e\x1d\x59\xf1\x00\xc5\x90\xba\x40\x6c\x6d\x0b\x7b\x9c\xc1\xae\x11\x32\x89\x04\x8a\xf1\xc3\xa8\xac\xd8\x90\x09\xd6\xec\x3d\x17\xa9\xed\x7c\xbc\xb0\x16\x58\xbf\x27\x2b\x20\x25\x72\xc5\x89\x90\xae\x2e\x06\x4d\x53\xb2\x73\x98\xce\x9a\x15\xc1\xbe\xea\xf9\xb5\xc4\x95\xb5\x7f\xfe\x58\xd5\xbf\x6a\x2c\x90\x2a\xc7\x46\xf6\x2d\xe5\xae\xb5\xae\xbb\xca\x28\x9d\xe4\x93\x50\x59\xf4\x9c\xd7\xdb\xf3\xa2\x89\x44\x40\x89\x86\xbc\x10\x92\xca\xc5\x72\xba\x89\xb9\x49\xcc\xf6\x35\x0b\xb4\x34\xb7\x37\x22\x35\x42\xc2\xce\x64\xac\xd9\xb6\x73\x66\xd4\xce\x75\x3b\x77\xed\x79\xc2\xab\x8d\x0b\xe2\xd7\x8c\x74\xa0\x42\x25\x33\x48\x4b\x44\x9f\x9a\x96\x54\x52\xae\xc1\xf0\x4f\x17\xc2\xba\x68\x05\x72\x54\x48\x0d\x15\x6c\xdb\x02\xf3\x46\xb1\xb8\xb3\xf9\x04\xeb\x4a\x77\x09\x37\x71\xc2\xb1\xe9\xa8\x01\x07\x71\x3f\x03\x62\x24\xc9\x0c\x34\x4e\x3e\xcc\x59\xa2\xfd\x20\x13\x5c\x84\x35\x5b\x3f\xa1\xa5\x85\x7a\xd8\x3d\x00\xe8\x46\xb8\x3a\xaa\x09\x98\x3b\x49\xab\x7a\x6a\x5d\xd6\x23\xeb\x14\x57\x72\xef\x4f\xf6\x3a\x82\xeb\x83\xf9\xcc\x91\x44\xa3\x48\x67\xa6\x89\x6f\xf7\x04\x63\xae\xd6\x78\xcd\x4a\xec\x38\x54\x80\x01\xa6\x7b\xca\x43\xa7\x54\x85\x10\x5b\x0f\x95\xd3\xbd\x25\x01\x9d\xcb\x69\x99\x63\xd2\xbc\xd3\x6d\x81\x6b\xb9\x28\x04\xeb\xea\xb7\x37\x47\x0d\xdd\x8c\xc7\x8a\x5c\x7c\x78\xdf\x04\x7c\x6b\x96\xe9\xf3\x70\x80\xdd\x06\xf9\x14\x37\x40\x81\x5c\x4d\x08\xad\x84\xbe\x4e\x14\xd5\x17\xb5\xb3\xf9\x38\xd7\x6f\x45\xa0\xb7\xc0\x32\x5e\x18\x09\x16\xe5\xf4\x46\x5d\x9f\x64\x46\xf9\xd4\xb0\xaa\xf7\xa2\x34\x2f\xf6\x9b\xdf\xe0\x4b\x48\x48\xcb\xa4\x63\x70\x29\x02\x46\x3b\x54\xa4\xdf\xf8\x30\x2f\x57\x40\xcc\xe8\xa2\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x95\x72\xdf\x11\x36\x82\x11\x39\xfa\x4d\xe3\xab\x23\xa4\xb8\x13\x35\x85\x14\xe6\x55\x1c\x08\x13\xbe\x7d\xc6\x34\xf2\x8f\xa3\xe6\x08\x23\x72\x69\xe8\xc2\xa8\xe9\x6a\x6d\x1b\xb8\x3a\xe3\x7a\x65\x07\x44\xc2\x94\xca\x34\x83\x8e\x00\x22\x62\x52\x29\x19\x16\xa8\xd2\xed\x2a\x64\x8c\x88\x2b\xc0\x85\x1e\xc5\x71\x7d\x6f\x8b\x68\xa7\xa9\x7a\x50\x67\x56\x9d\x19\xa6\x54\xd3\x21\x2d\xac\x3d\x88\x09\x7e\x66\x4d\xdd\x43\x57\xa4\x7c\x48\xdd\xe9\x1d\x56\x3b\xfb\xec\xd7\x0e\x7e\x75\x48\xab\xa7\x18\x1f\xd2\x21\x96\xed\xee\x6c\xbf\xd9\x43\xda\x5d\xf4\xc0\x99\xa0\x72\x4c\x01\x65\xf7\x63\xb0\xe9\xcb\x8a\x2b\xdb\xa5\x18\x91\x6b\xa1\x7d\x75\xfd\xb4\x4e\x34\x0c\x28\xce\xde\x64\xdc\x97\xd7\xf7\xb7\x7f\xbd\xf9\x78\x75\x7d\xdf\xf3\xef\x9e\x7f\x63\xeb\xf9\x77\xcf\xbf\x3b\x0c\x7c\x28\xfc\x1b\xf8\x7c\x5f\xbc\xbb\xb2\x77\xad\x33\x30\x2e\x55\x7b\x0d\x4c\x14\xff\x8a\x12\xed\x2f\xf9\xfc\x13\x35\xaa\x63\x21\x41\xa1\x82\x62\x34\xd6\x75\x41\xca\xee\x01\xb4\x04\xd6\x31\x9d\x5f\x6c\xa6\xfd\x1e\xf3\xe4\x23\xe6\x89\x5e\x37\x6a\x78\xac\x5b\xb5\xba\x64\x10\x25\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\xed\x5e\x53\x08\x02\x8b\x96\xc6\x4b\x1e\xd8\x45\x3e\x0a\x18\xa6\x96\xac\x0a\x09\x73\x26\x4a\x95\x2d\xaa\xea\xf8\xeb\xd9\xd5\x2a\x68\x41\x60\x2e\xd6\xc2\x7b\x73\xd6\x0f\xb8\x24\xdb\xad\x93\xd3\x02\x86\xdf\xb3\x84\xe7\x88\x88\x21\xe7\x05\x8c\xbf\x46\x42\xdc\x5e\xda\x0b\x18\xb7\x93\x9c\xb8\x49\xe6\x0b\xa0\xa3\x2d\x2d\x06\x74\xd4\x4e\x56\xd9\x3f\x27\xfb\x46\x8a\x3c\x12\x37\xbb\xb3\x76\x63\x1f\xc2\xb0\xee\xa8\x56\xc1\x4d\x4d\x29\xc4\x69\x8e\x75\x89\x12\xa3\xb5\xe6\x85\xee\x98\x5e\x41\x62\x95\x67\x8f\x53\xc9\xdc\x06\xa7\x7f\xa0\xc5\xf7\xb0\xb8\x85\xc0\x62\x4c\xed\xf9\xc6\x30\x07\x45\x28\x79\x80\x85\x8d\x61\xbc\xf0\x83\x85\xd5\xa3\x3a\xc0\xea\xf6\x0f\xd0\x0d\xf3\xdd\xb7\x78\x65\xe9\x1f\x20\x00\x91\xc0\xb7\x95\x9a\xe5\x66\x09\x51\xcc\x37\x6b\x7a\x50\x55\xda\x0f\xb5\x0c\x7f\x53\x7a\x74\xd7\x43\x84\x89\x5b\x46\xa5\x81\xc9\x04\x12\xed\x33\xdd\xed\x6e\x1e\x60\x32\x64\x5a\xda\x52\x9a\x34\x79\x78\xa4\x32\x55\x24\x11\x79\x41\x35\x1b\xb3\x8c\xe9\x45\x58\x1a\xbc\x6f\x78\xc3\x57\x38\xde\x96\x29\x92\x2b\xae\x34\xc5\xab\x50\x38\x7b\x9b\x59\xed\x1a\x4c\x17\x31\x77\x2d\x37\xc5\x84\x1b\x2a\xc3\xeb\xdf\x1b\x52\x72\xa1\x34\x49\x40\x1a\xa1\x2e\x5b\x90\x47\x29\x78\x47\x88\xeb\x76\xdb\xb1\x8a\x8b\x98\x1b\x59\x10\x1e\xcf\x5c\x3a\xde\xd0\xbc\xf8\xd0\x32\x2b\x75\x86\xc9\x1e\x67\xbf\xc6\xff\x1c\xd2\x29\x22\x3e\x99\xef\x1d\x39\x3a\x0a\xec\x4b\xf8\xd8\xa0\xb8\xa7\xf2\xce\xc5\xac\x35\x45\xa7\xea\x42\x21\x16\x78\x17\xf9\x94\x87\x1b\x70\x5a\x40\xa4\x69\x0e\x43\x8d\xb1\xad\x65\x10\xca\x69\x11\x66\x0f\xaa\x1b\xb2\x83\xb8\xb7\x77\x30\x0f\xac\xaf\x7f\xcb\xac\xaa\x62\x98\xe9\x3b\x0f\xa3\xa1\x48\x0e\x9a\xa6\x54\xd3\x91\x39\x10\x83\xf6\x9f\xaa\xa0\x09\x0c\xc8\xdf\xab\x0f\x33\x3a\x86\x4c\xfd\x78\xfc\xef\xdf\x5f\xfe\xf5\x3f\x8e\x7f\xfa\x7b\xf3\x3b\x14\xd7\xd0\x3e\xd9\x7c\x20\xf0\x15\x30\x24\x89\x8b\x14\xae\x91\x3a\xfc\xd3\x69\x7a\xe7\x49\x22\x4a\xae\xdd\x17\x88\xa1\x3e\x9a\x09\xa5\xaf\x6e\xaa\x3f\x0b\x91\x2e\xff\x15\x50\x29\x8f\x1c\xa6\xdc\x83\x6b\x1b\x80\xa9\x68\x5b\x3c\xe9\x87\x16\xec\x13\x48\x15\x04\xc3\xe7\x5b\x3b\x31\xc2\xf6\xea\xb7\xb1\x4a\x66\x90\x53\xfc\xe7\x37\x7e\x0a\xcc\x7d\x5c\x55\xb9\xe0\x08\x56\x6f\xee\xc0\x76\xe9\xdc\xa3\xf9\xdb\x20\x8d\xd3\xb6\x88\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x4a\x7e\xf4\x56\x8a\x3a\xda\xf0\xfc\xe6\x8a\xcc\xed\x0c\x1f\xd0\xe4\xbc\x14\xbb\xf6\x31\x4c\xdf\x1c\x34\xdb\x6e\x46\x5a\xb5\xec\x65\xef\x08\xc2\x29\xf9\xef\x5d\x49\x03\x55\x95\x71\x04\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\xb3\x8a\x0f\x1b\x2a\x2d\x24\x9d\x22\x20\x9d\x1d\xdc\xfe\xac\xfa\xcb\xfe\xb0\x45\xde\xea\xaf\xad\x41\x32\x29\xa5\x91\xd3\xb3\x45\x8d\xf4\xf4\xd5\xb1\x6c\xbf\x6e\x07\xc2\xb1\xab\x6d\x75\x1d\x5f\x91\x3b\xae\x23\x5a\x51\x4d\xac\x66\x11\xad\x40\x0e\x38\x7a\x50\x09\xac\xd6\x54\xc9\xe7\x64\x4e\xa5\x0a\x29\x6c\x6e\x5b\x44\x26\x9d\xb2\x39\x53\x22\x00\x14\xa8\xea\x68\x55\xa2\xf6\xc8\x0a\xae\x44\x89\x4d\x54\xa8\xfc\x1e\x9f\x0b\x2c\x57\x56\x1d\xf6\xa5\xdb\xec\x6d\xa8\xb2\x40\x48\x41\xb5\x06\xc9\xdf\x91\xff\x75\xf2\x9f\xbf\xfd\x79\x78\xfa\xa7\x93\x93\x1f\xdf\x0c\xff\xed\xa7\xdf\x9e\xfc\xe7\x08\xff\xf1\xcf\xa7\x7f\x3a\xfd\xd9\xff\xf1\xdb\xd3\xd3\x93\x93\x1f\xbf\xff\xf0\xed\xfd\xcd\xe5\x4f\xec\xf4\xe7\x1f\x79\x99\x3f\xd8\xbf\x7e\x3e\xf9\x11\x2e\x7f\xda\xb2\x93\xd3\xd3\x3f\xfd\x26\x98\xf4\x08\xf5\xcb\x6d\x8b\x59\xc5\xbc\xdd\x63\x24\xed\xf0\x45\x2a\x9a\xd7\xcd\x6f\xaf\xd8\xe7\xdf\x67\xe6\xbe\xab\x6f\xb3\x4a\x0a\x39\xa0\x03\xfe\x52\x82\x86\x82\x44\x82\x7e\x0d\xcb\xae\x1d\xa9\x51\x70\xc1\x25\x55\xa3\x12\xf7\xb5\xdd\xa0\xbf\x04\x63\xaf\xd7\x73\xec\xba\xd6\xa2\xfb\x44\x8a\xdc\xe1\xb7\x5b\xcf\xf7\x1c\xb3\x31\xdd\x73\x0f\x10\xe0\x15\xf1\xad\x37\x0e\x77\x6e\xbd\x71\x78\x03\x29\xbd\x71\x38\xa8\x7d\x91\xc6\xe1\x3b\xcb\x93\x7e\x91\x96\xe1\xf8\x98\x8b\x1d\x63\xba\x62\xc2\x2d\x02\x9f\x77\x8d\x07\x88\x19\x04\xe9\xcd\x1e\xcd\xa2\x9a\xdb\x45\x1a\x75\x8f\x6a\x37\x2b\x57\x85\x35\xd5\xa1\xf2\x56\xa4\xcd\xd7\x87\xa1\x91\xf3\x2c\x23\x8c\xdb\x0b\xda\x74\xd0\x69\xf4\x1a\xb2\xc3\x21\x5f\x3b\xa4\xe3\xb9\x79\x55\x9f\xfa\xd8\x2e\x62\x8d\x99\x72\x98\xa9\xf9\x17\x9b\x08\xf9\x60\x73\x23\x95\xc6\x29\xf1\xa5\xc9\x3b\x91\x53\xa9\xa1\x36\x72\xc6\x5c\x14\x54\x29\x91\xd8\xbc\xd1\x0a\x6a\x01\x6b\x8a\xba\xe9\xc1\x37\xd0\xf4\x01\x43\xc4\x12\x48\x81\xef\x9a\xd1\xeb\xdb\x27\x8b\x39\xe1\xd7\x61\xbc\xc0\xd2\xd8\x7c\xee\xee\x2f\x92\x7a\xd8\x13\x7c\xe3\x78\xe3\x7e\x5d\x31\xb1\xe6\x0c\xbb\x60\x9c\x46\x68\x2c\x4a\x9b\x75\x6a\x27\x46\x14\x8b\x49\xed\xe1\xc3\xe8\x26\xcb\xd2\xbb\x6d\xe4\x60\x45\x22\x5c\x6c\xaf\x82\x6d\x82\xf4\xb1\x15\x79\xbd\xf6\x82\xb6\xe5\xf4\xaf\x21\x3e\x29\x5c\x82\x8f\x2b\xbd\xbf\x84\xe4\x7e\x28\x52\xfb\x81\x48\xec\x2f\x23\xad\x1f\xa6\xa4\x1e\x4d\x4a\x8f\x23\xa1\xc7\x91\xce\x77\x08\xdb\x88\x29\x91\xc7\x91\xc6\x5f\xc2\x16\x57\x48\x98\xb0\xcf\x91\x38\xbe\x87\xde\x21\x1a\x3e\xa3\x65\xa6\x90\x50\x00\xaf\x90\xdd\x7c\x51\x54\xa0\xc9\xec\xcb\xc9\x5b\xb0\x06\xa4\xb8\xf7\xe2\xdd\x3a\xe3\x55\x7f\x29\x92\xfe\x52\xdc\xa1\xf5\x97\x62\x7f\x29\xbe\xca\xa5\xe8\xb8\xd5\xd7\x7f\x23\x46\x4e\x8b\xc5\x84\xff\xbd\xd7\xdf\xb0\x64\x04\x00\x09\xef\x78\x14\x6b\xc0\xa2\x33\x1c\xb9\xcb\x89\x0b\x3a\x67\x38\xea\x4d\x99\x65\x5d\x40\x49\x6d\x8b\xb1\x00\x57\x38\xed\x45\x99\x65\x0e\xc8\xb2\xdb\xec\x7f\xe4\x78\x81\x9d\x67\x8f\x74\xa1\x06\xe4\x1a\xe6\x20\x07\xe4\x6a\x72\x2d\xf4\x8d\xb5\x50\x74\xeb\xb7\x99\x4f\x65\x3b\x27\x6c\x42\xde\x65\x54\x83\xd2\x44\xd3\x29\xda\xcb\xea\x52\x2b\x42\xb6\x06\xad\x8b\xc9\xed\xd1\x70\x14\xbe\x37\x7f\xed\xd1\xfe\x86\xfb\xd9\xab\x19\x9b\x40\xb2\x48\xb2\x70\x36\xf1\x83\xef\xc9\x67\x82\x79\xf1\x00\x43\x87\xd6\xc0\x89\x7d\x81\x98\xed\x85\x50\xfa\x4e\x53\xa9\xf7\x0d\xdc\x7e\xe3\x09\x31\x93\x9d\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\x04\x41\x3a\xd1\x20\x9b\xa5\xe9\xf1\x39\x5b\x90\x6f\x64\xeb\xf7\xf9\xda\xa6\x92\x4c\x28\xcb\x54\xf7\x88\xf0\x15\x23\xb7\xad\xa7\x4d\x5d\x2d\xc7\x06\x1c\x20\x4d\x12\x21\x53\x4c\x76\x15\x1e\x36\x0f\x5f\x22\x84\x3f\x99\xf6\x11\x45\x85\x9c\x72\x3a\x85\xdc\x95\x18\x6c\x93\x35\xce\x44\xf2\xa0\x48\xc9\x35\xcb\x5c\x21\x6f\xf1\x80\x02\x71\x86\x27\xb5\xf3\xd0\xdd\x19\x40\xf5\xcf\x61\x75\x08\x87\x86\x2a\x75\xf6\xeb\xfa\x2b\xfc\xa0\x23\x71\x11\xd4\xb2\x18\x4a\x19\x7c\x86\x24\x44\x40\x6c\x1b\xc9\x3f\x43\xd2\xa8\xe0\x4b\x3d\x74\x93\xc5\x63\x44\xc0\xa4\x48\xbe\x25\xdb\x22\xc5\xd8\xc4\x8a\x6b\x09\x00\xaa\x6a\xb6\xd8\x61\x1b\x17\x6e\x11\x98\x72\x33\x6f\xff\xcc\x18\x87\xf6\xc2\x28\x5b\xbf\x04\x9a\xb0\x96\xe6\xcf\x95\x02\x6d\x3e\x19\x39\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xd9\xf1\xe9\xca\x1e\x39\x36\x1a\x75\x06\x6a\xa1\x34\xe4\x16\x52\x34\xa9\x5f\x4a\xb1\xbc\xc0\x82\x81\x90\x1c\xfb\xfa\xa6\xc1\x94\x99\x3b\xd2\x62\x1c\xe3\xac\x38\x78\xaf\x01\x51\x82\x68\x49\x53\xe6\x6c\x59\xf8\xa9\x79\x48\xcb\xd2\x41\x16\x9f\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xc6\xe9\x1b\x91\x7b\x41\x4a\x15\x3e\x63\x15\x21\x0b\x51\x12\x0e\xe0\xce\x56\x85\x6a\x6e\xae\x1b\x22\x4a\x6d\xad\x6a\x54\x87\xc0\x92\x35\xdb\xe5\x67\xa6\x5d\x4e\x90\xe1\xdf\x6f\x96\x6a\xc8\x66\x6c\x0e\x67\x33\xa0\x99\x9e\xd9\x88\x75\x2e\xf8\xf0\x1f\x20\x05\x82\x98\x71\xf7\x4d\x28\x19\x61\xae\xc0\x66\x0b\x70\x0b\xae\x12\x14\x25\x58\x25\xb2\x76\xe9\x9b\xb9\xf6\xbe\x85\xce\x22\x11\x59\xe6\x47\xdf\xdd\xdf\xdf\x7c\x0b\xba\xc9\xe5\x39\x7e\x48\xbe\xbd\xbc\xf7\x79\x0a\x0d\x60\xef\x03\x60\xef\x71\x02\x28\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\x0d\xf8\x5a\x18\xb6\xcd\x21\x31\x9b\xa0\x1d\x74\xef\x11\xd3\xaf\x6e\x46\xe4\xaf\xa2\x34\x13\x32\xa6\xe3\x6c\x41\x1e\x29\x77\xd6\xee\xb0\x48\x59\xd3\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x3b\xa0\x29\x48\x85\x0c\x1a\x68\x60\x4e\x4c\xc4\xe3\xde\xa0\x2d\xea\x52\x5e\x94\x4a\x8b\x9c\xcc\xdc\x6b\xb7\x01\xce\xdc\xe1\x1c\xd9\xe3\xea\x50\x6e\x24\x14\x96\x89\xbb\xdf\x7c\x75\x2c\x7a\x85\x7b\xd9\x79\x77\x9f\x8f\xad\x98\xda\x9c\x36\x67\x31\xb7\xf8\x29\x8e\xb7\x99\xad\x1a\x2d\xb6\x31\x42\x4c\x38\x89\x18\x17\x4e\xc2\xa0\xcf\x96\x3b\x42\xef\x41\x70\x4f\xf1\x42\xcd\x49\xb4\x70\x6a\xf2\x22\x21\xd5\xc4\x45\xca\xb9\xcd\x67\x3d\x47\x61\x75\xdd\x96\x3b\x6f\x94\xd3\x4a\x28\x17\x9c\x25\x34\x63\xff\x80\x94\x94\x85\xe0\x2e\x7f\x0a\x25\xdb\x84\x2a\x18\xa2\xbb\x95\x5b\x76\xae\x1a\x20\x5c\x86\x3b\x68\x21\x50\xdc\xc3\xa0\x27\xc3\xee\x2d\xd5\x71\x48\x8d\x1a\xf9\x1b\x8c\x28\xd7\x6c\x2b\x1e\xda\xd6\x62\xc5\xd9\xf1\xe4\x8b\x10\x27\x89\x4d\x7c\x0b\x4e\xba\x5e\x4d\xb9\xd6\x82\xd0\x24\x41\x98\x31\x7b\x5d\x21\xe3\xb5\x05\x66\x0f\xe6\xde\x36\x22\xe0\xa1\xc9\x5e\xd6\x89\x2d\x09\x2f\xf3\x31\xc8\x1a\xaf\x42\xea\xd5\x39\x8d\x62\x75\x71\xc3\xda\xe1\xbc\xdb\xcf\xcb\x18\x94\x4f\x81\xbc\x35\x23\xff\xf1\x0f\x7f\xf8\xfd\x1f\x22\x8c\x63\x5e\xaf\x8a\x14\xe6\xe4\xea\xfc\xfa\xfc\x6f\x77\x9f\x2e\x10\x05\x2f\xb4\xfb\x48\x89\x90\xb1\xd3\x20\xa3\x26\x41\xbe\x68\x0a\x24\xe2\x49\x04\x73\xd9\xd8\x47\xe2\x0e\xa9\x32\x9b\xb0\x54\x16\x39\xcf\xe9\x24\xce\xba\x6d\x4d\xcc\x2a\x42\xea\x52\xd3\x4f\x66\x18\xd6\x41\x70\x2a\x95\x01\x14\xd1\x34\xfe\x3b\xd3\x5b\x0b\x0c\x98\xa4\xbe\x28\x3c\x5a\x98\xda\xb6\x7c\x57\x17\x0e\x69\xf8\x8a\x94\x7f\x05\x89\xe0\x69\x88\x0a\x10\x4b\xa4\x75\x94\x44\x3d\x73\x77\xb6\x4f\x6f\x22\xae\xaf\x12\x37\x18\x6a\x92\xa1\x2b\x4a\xaa\x55\x8d\xc3\x27\x6d\xc6\x3f\xf6\xf6\xc7\x7f\xe9\xee\x20\x4b\x8a\x3b\x91\x3c\x44\x34\x91\x05\x32\xb0\xf7\xe6\xa4\x25\xd6\x17\x78\x7f\x71\x63\x89\x33\x2b\x73\xfd\xf1\xbe\x86\xf7\xc0\x74\x96\xda\xad\xfb\x9d\xf3\x16\x52\x9e\x92\x07\x28\xc2\xb4\x4b\xc3\x30\x7d\x5c\x5a\x3b\x2c\x0d\x6d\xef\xd2\x39\x91\x6d\x0a\xad\x65\x04\x3e\x9c\xcc\x4a\xc4\x61\xc0\xc4\x0d\xbf\x37\x3a\x02\x9d\x12\x32\xa1\x2c\x23\x14\xad\xf2\x9a\xe5\x60\x73\x78\xd0\xd8\x5f\x07\x22\x7c\x45\x0c\xe7\x6b\xb5\x36\x1e\xd7\x25\x38\x77\xb5\x1a\x86\x22\x1f\x7c\xdd\x6a\x80\xe3\xd9\xb2\x0a\xa4\xee\xd5\x80\x6d\x5b\xaf\x06\x74\x54\x03\x0a\x09\x77\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\x36\x84\xdb\x8c\x61\x22\x24\x2c\xc7\xdb\x34\xe2\x60\x5c\x28\x76\x40\xa8\xe9\xf9\xcd\x55\xe5\xfb\x12\xad\x58\x17\x9b\x6f\xea\x8b\x81\x66\x6c\x0e\x1c\x94\x3a\xc3\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x0e\x6a\xc4\x18\xf3\xba\xc0\xed\x87\xa0\x13\xeb\x37\xf7\x61\x45\x2e\x0c\xcc\x4f\xd7\x24\xc8\x9d\xdf\xa8\xdb\x29\xa9\x9a\x01\xe6\x3c\xc2\x67\xa6\x95\x1d\xf4\x06\x71\x55\xfc\x8c\x1b\x79\x61\x2a\x69\x02\xa4\x00\xc9\x84\x11\x31\x4a\xae\x53\xf1\xc8\xc9\x18\xa6\x8c\x2b\xbf\x62\x21\x24\xf9\x2d\x81\x91\x44\x4c\x55\xf5\xba\x46\xe4\xb6\x05\x68\xef\x10\xa4\x12\x51\xf3\x4c\x37\x45\x83\x48\x53\x82\xc2\x0b\x6e\x83\x92\x66\xd9\xa2\xde\x78\x3e\x1f\x5a\x6f\x9e\xa1\xee\x1b\xc2\xce\xec\x49\xc9\xf1\x45\x53\xc8\xe8\xc2\x66\xfe\x4e\x18\x47\xeb\xaf\x54\xa7\xa3\xf0\xd0\xac\xce\x04\x0a\xd9\xe8\x73\xe3\xce\x60\x8a\x48\xa0\xc9\x2c\x44\xb2\xeb\x63\xc0\x9e\x6b\x7d\x0c\x58\x1f\x03\xd6\xc7\x80\xad\xb6\x3e\x06\xac\xdd\xfa\x18\xb0\xcd\x04\x1d\xb2\xd3\xae\x8f\x01\xeb\xad\x32\xab\xad\x8f\x01\xeb\xd4\xfa\x18\xb0\x67\xdb\xc1\xb1\xe8\x3e\x06\x6c\x8b\xd6\xc7\x80\x6d\xd9\xfa\x18\xb0\x3e\x06\xac\x8f\x01\xeb\x63\xc0\x02\x5a\x1f\x03\xb6\xfb\xeb\xf5\xce\x9f\xee\xad\x8f\x01\xeb\x63\xc0\x76\x6c\x7d\x0c\xd8\x52\xeb\x63\xc0\xfa\x18\xb0\xa7\x5a\x1f\x03\xd6\xc7\x80\xb9\xd6\x5b\x1b\x57\x5a\x1f\x03\xb6\xa6\xf5\x31\x60\xbb\x8d\xd3\xab\x01\x61\x9d\xbd\x88\x1a\xa0\xb4\x28\xee\xd8\x34\x00\x68\x30\xd6\x31\xb8\xab\x28\x71\x28\x84\x8a\x3c\xce\x58\x32\x23\xca\x7e\xe8\xed\x58\x88\x50\x66\x0e\x44\x33\x4a\xa7\xbe\x49\xc6\x60\x54\x04\xf3\x5a\x45\xc8\x6d\x72\x35\x41\x07\x72\x03\x24\xcd\x9c\x0a\xc7\xd6\xcc\x38\x0d\x38\xfe\xb6\xf8\xec\x6f\x37\xc6\x8d\xee\xd2\x9d\x82\xc6\x7c\x24\x94\xdb\xea\x97\xf8\xfa\x58\x2d\x8f\xdc\x88\x54\xf9\x0a\x00\xfc\xff\x67\xef\xdd\x7b\xdb\xc8\xb1\xbc\xe1\xff\x9f\x4f\x41\x64\x06\x8f\xed\x6d\xc9\x4e\xe6\x86\x99\xc6\xe2\x6d\x78\x1d\x77\xda\x98\xc4\x11\x6c\x27\xf3\x0c\x7a\x7a\x7b\xa9\x2a\x4a\xe2\xba\x8a\xac\x26\x59\xb2\x35\xe8\x0f\xff\x82\x87\x97\x62\x49\x72\x12\x91\xb4\x25\xa7\x55\x0b\xcc\x76\x24\xb9\x78\x3f\x3c\x97\xdf\xf9\x1d\xce\x86\x86\xfd\xf3\x18\xca\x05\x73\x79\x9c\xe0\x0d\x4e\x24\x3d\x33\x18\xb9\x91\xe0\xe3\x74\xe2\x33\x78\x8b\x84\x22\x99\x5f\x29\xed\x59\x0a\x7a\x67\x6b\xc8\x9d\x1d\x41\x3e\x65\x40\xeb\xe4\xbc\xc3\x77\x14\xa5\xb3\x9b\x08\x9d\x5d\x44\xe7\x6c\x03\x99\xb3\x75\x54\x4e\x9e\x70\x6f\x86\x50\x6f\x26\x4d\xe9\x11\xc2\x26\x16\xe0\x7d\x33\x13\x44\xce\x78\x15\x2d\x70\x72\x09\x9b\x77\x94\xd1\xba\xad\xf5\xd9\x95\x5a\xa6\xd0\xb9\x07\xa1\x4b\x27\x32\x2c\x36\xdd\x44\xc2\xf5\x0f\x69\x49\xa0\x04\x31\xa6\x95\xde\x5a\x40\x62\x39\xc3\x73\x50\x96\xda\xa2\x20\xa4\x4c\x51\x97\x42\x2f\xea\x1f\x8f\x7d\x0f\x0d\x19\x39\x95\xe8\x55\xda\x55\x93\xa6\x8f\x07\x6e\xa6\x3f\xfe\x21\xea\x1d\x53\xd1\xe4\xb9\xa5\xdf\x5c\x8d\xce\x7a\xb7\x34\x7c\xf0\x03\x1c\xe3\xb3\x19\x29\x6e\xaf\x2c\xc4\x63\x7b\x37\x73\xba\xfb\x23\xc9\xf5\x91\x43\x31\x48\xb5\xee\xfb\x3a\xa8\x36\xc0\xfb\xa1\xb9\x29\xac\x22\x11\x73\x5a\x90\xe3\x27\x30\xa0\x73\x19\xa5\xe9\x07\x01\x81\xfb\x1a\x06\xbe\x2b\x6a\xd7\xb5\xe9\x8e\xf7\x7c\x07\xbe\x13\xdb\x53\x00\x33\x56\xb8\xf0\x6b\x33\x5d\x7f\xe8\x92\xba\x71\x28\x09\xf1\x29\x0a\x53\xaa\x66\xed\xf8\xb8\xe0\xf5\x89\x16\x1d\xe6\x7f\xc6\x15\x1f\x9f\xd4\x58\x2a\x22\x4e\x4a\x5e\xd8\x6b\x7d\x58\xe8\x1e\x50\x36\x3d\xae\xcb\xa3\xe3\xff\x93\xd4\x87\x0b\xeb\xc3\xb5\xe9\x41\x0f\x18\xaf\x63\xa2\xe5\x3e\x17\x4b\x56\xac\x9e\x94\xf4\x4d\x9a\x7c\x7f\xa7\x56\x4f\x48\x84\xcb\x6e\x05\x2a\xbb\x97\xda\x28\x83\xa3\x3a\xa7\x50\xd9\x0d\x38\xec\xa3\x41\x61\xb3\x9c\xd5\x4c\x10\xd8\x1d\x82\xbf\xee\x8c\x2d\xb4\x2b\x90\xd7\x1d\x2c\x83\x9f\x01\xe6\x9a\x03\xe2\x9a\x0f\xde\xba\xab\xd5\xe2\x1f\x0d\xd2\xfa\x2c\xe0\xac\x19\xe3\x36\x99\x60\xac\x4f\x01\x61\xdd\x5d\x1f\x0c\xca\x00\x5b\x7d\x3a\xc8\x6a\x96\x79\xcc\x6a\xc5\x26\x8a\x84\x2d\x40\x54\x9f\x22\x2e\xfd\x68\x31\xe9\x0c\xf1\xe8\x9c\xb1\xe8\x6c\x71\xe8\x47\x83\xa2\xa6\xc3\x50\xb3\xfa\x14\x9e\x04\x7e\x9a\x13\x7a\x9a\xbc\xbe\x94\x51\x45\x71\xf5\x9a\x54\x78\x71\x9d\x06\x50\xcc\xb5\x12\x97\x2b\x20\x46\xe3\xb6\xee\xc7\xdb\x67\xd8\xd6\xfe\x27\xa5\xa3\x1e\x71\x41\x68\xab\x02\x43\xfc\xd8\x8c\x2f\xba\x18\x19\xda\x9c\x8b\xe2\x8e\x8b\xdb\x8a\xe3\x52\x9e\x34\xdc\xfc\x4f\xc7\x44\x11\x50\x50\x24\xa9\xe9\xbb\xe1\x1e\x37\x7c\x1f\x3b\xb2\x6b\x7e\xe0\x77\x88\x4f\x14\x61\xe8\x90\x32\xb7\x73\x8e\x02\x2f\x4d\x17\x1e\x49\x8e\x77\xe8\xb7\xbe\x7a\xe9\x1a\xf9\xfa\xe2\x1e\x10\x19\x92\x72\xa7\x23\x5f\xb6\x8f\x9f\x0f\x7d\xd9\x1f\x4e\xda\xaa\x1f\xfe\x32\x21\xb1\x3c\xb1\xaf\x57\x5d\x99\xeb\x57\xd0\x1f\x2f\x8a\x30\x2b\x91\xe5\x8d\xfa\xfa\xf6\x49\x32\x04\xbb\x6f\xdc\x78\xcc\x74\x1f\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xaf\x40\x01\xdd\x3b\x5d\x77\xc6\xe9\xba\x25\x64\xf0\xd7\x67\x6d\x3d\x3d\x12\x78\x6f\x6d\xfd\x56\xac\xad\x80\xae\xed\x8d\xc0\x05\x19\xed\x92\xf2\xe6\x04\x48\x97\xa0\xd6\xe9\x70\x5e\x5c\x30\x42\x4c\x42\x53\x47\xc6\x07\xbc\x73\x93\xb6\xaa\x16\xc6\x87\xd8\x63\x66\x8c\xdf\x5a\x37\x33\xb2\x42\x69\x07\xa1\xd4\x35\xbd\xeb\x6c\x93\x46\x70\xab\x91\x88\x96\x31\xad\x62\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\xf7\x08\xf7\x2c\x38\x1a\x80\x9e\x33\x82\xba\xbc\x9a\x7e\x47\x74\xab\x13\x2e\x0a\x3a\xae\x16\x68\x86\x2b\x6d\x2c\x59\xf0\xf0\x2d\xad\x2a\xfb\x9a\x04\xb0\x32\x51\x26\xf4\x6c\x34\x9a\x8a\xb3\x29\x4c\x06\x36\x1d\x21\xf7\x0d\x29\x74\x9b\x45\x45\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x2b\x5c\x3f\x93\xd0\xda\x41\xeb\x54\x22\x46\xab\x81\x9b\xf2\x3e\x35\xe3\xea\x9e\xef\x5c\xca\x92\x94\x96\x55\xf1\x8e\x4a\x32\x80\x77\x46\xf7\xc9\xf4\x85\xcf\x89\x10\xb4\x24\x66\xdf\x98\xcf\x1a\xc1\xe7\xb4\xec\xb0\xe3\x7a\x5b\x00\x6e\x3b\xba\xad\x8f\xf0\x5e\x27\x5a\x19\x67\x43\x46\xa6\x18\xd4\x63\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\xac\xa4\x05\x56\x44\x02\x56\xbe\x47\xb9\x3a\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x19\x6f\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x69\xcd\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\x21\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\xc4\xd4\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\xa3\x24\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\xf9\x9a\x3c\x94\x0e\x78\x65\x72\x7c\x5f\x5f\x5e\xff\xfc\xf6\xf4\xbf\xce\xdf\xc6\x6d\x01\x90\x75\x2c\xd4\x9d\x5b\x46\x7f\x69\x09\xc2\x35\x67\x53\x84\xab\x30\x05\x66\x00\x8e\xce\xe0\x03\x90\x8a\x79\x93\x65\x22\xf5\x5a\x7d\x09\x44\x09\x86\x15\x38\xe6\x53\x64\x04\xc5\xa2\x40\x12\xd0\x1f\x7d\x24\x8c\x1b\x03\xe0\x4f\x7b\xe4\x0d\x8c\x28\x7d\xc6\x8d\x41\x48\x19\xc2\x48\x52\x36\xad\x92\x6d\xc1\x64\x8f\x48\xaa\x3f\x64\xd8\x8d\x60\x14\xeb\x16\x49\x77\x8a\xf4\xfa\x10\x6f\x55\xe6\x73\x08\x74\x97\x99\x73\x01\x90\xfb\x86\x4b\xe2\x5c\x00\x46\xc7\xbd\x18\x21\x5c\x96\x22\x49\x8f\xb6\xc2\xc6\xdb\xe8\x86\x20\xc0\x34\x6b\x42\xbf\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x0e\x81\xbf\xc4\x37\x95\xc7\xdc\xce\x81\x68\x9e\x71\xa9\x2e\x46\x99\x16\xfa\x1f\x33\xac\xe0\x8d\x7a\x3d\x14\x47\x63\x6a\x2d\x33\x72\xaf\x88\xd0\x1a\xb1\x5d\xc3\xd4\x99\x4b\x72\x2e\xe8\x0e\x3e\x97\xdd\x9d\x1a\x67\xbd\x98\xf4\x81\xd0\x4f\xb4\xbf\xa1\xe1\x1f\xb8\x54\x97\x56\x5a\x87\x2c\x17\x61\x3f\x6a\xac\x8a\x59\x5f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xe0\xfa\x2f\x39\x5c\x94\x26\x9d\x6d\x46\x13\x84\xc3\xee\x9c\xd8\x34\xc8\x5c\xbe\xad\xfb\xa9\xad\xb5\xe4\xde\x04\x35\xcc\xea\x6d\x41\xe5\x88\x86\x97\xc7\xe8\x1c\x17\xb3\x84\x5e\xe8\xd9\x28\x03\x65\xa0\xe1\xa5\xe9\xc6\x0c\xcf\xf5\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4e\xc1\x8f\x09\x32\x21\x42\x98\x94\xc9\xf1\xc2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x91\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\xc3\xeb\xd1\x00\xdd\x9c\x8d\x06\x88\x0b\x74\x7d\x96\x86\x03\x09\xad\xd1\x17\x37\x67\xa3\x17\x5b\x5d\x81\x20\x9d\xe3\xe6\x6c\x14\xf1\x92\x55\x24\x61\x8d\x9b\xe1\x2d\x59\x44\x6a\x77\x39\x34\xcc\xa1\xdf\x58\x59\x06\x64\xa6\xb9\xc6\xcd\xc6\x6f\x13\x04\x97\x74\x4f\xb6\xf0\xe5\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\x76\x17\xe8\xbf\x27\x5b\xf8\xec\xb3\x27\x5b\x78\xf0\xd9\x93\x2d\x6c\xf4\xec\xc9\x16\x56\x9f\x3d\xd9\xc2\x27\x9e\x3d\xd9\x82\x7f\xf6\x64\x0b\x7b\xb2\x85\xe7\x2b\xb5\xf7\x64\x0b\xcb\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\x08\x9f\x3d\xd9\xc2\x03\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xf8\xf4\xb3\x27\x5b\x88\x7e\xf6\x64\x0b\x9b\x3d\xfb\xf4\x9f\x0d\x9f\x3d\xd9\xc2\x9e\x6c\x61\xf9\xd9\x93\x2d\x7c\xf6\xd9\x0d\xf7\xf8\x9e\x6c\x61\x4f\xb6\xf0\xc9\x67\x4f\xb6\xb0\x27\x5b\xf8\xe4\xb3\x27\x5b\x88\x78\x76\xce\xe9\xba\x27\x5b\xd8\x93\x2d\x7c\xaa\x8d\xbd\xb5\xb5\xd9\xb3\x27\x5b\xd8\x93\x2d\xac\x3c\x7b\xb2\x85\xd5\x67\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\xfc\xb3\x27\x5b\xf8\xda\xfd\x4e\x82\x48\xfa\x6f\x32\xe2\x15\x2d\x16\xc9\x79\x26\x57\x44\xf2\x56\x14\xfa\xc6\x86\xd7\xa2\x06\xde\xeb\x3d\x0a\x49\x4a\xf6\x8e\x25\xef\x5f\x05\x13\x17\x26\xf1\x0b\x3b\x07\x8f\x31\x05\x3b\x91\xc8\xef\x06\x78\x19\x8f\x20\x80\x97\x28\x2c\x94\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\x12\x09\x43\xee\x11\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x25\x13\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x23\x88\xf1\x6b\x45\x9d\x38\x4c\xc2\x9a\xad\x96\xad\xa6\xaa\xe7\x05\xba\xe4\xea\xca\x1e\xee\xad\xad\x57\x66\xc4\x82\x9b\xc2\x74\x6e\x99\xc8\x05\xef\x2e\xb4\x2f\xce\x9d\x44\xe7\x6b\x3e\x85\xf8\xa7\x6c\xf4\x4b\xfc\x98\xa2\x3a\x84\x2b\x41\x70\xb9\x80\x6e\x14\x80\xd7\xeb\xfc\x7f\xcf\x30\x6d\xb3\xa8\x30\x8d\x07\xf9\xe5\x3a\xd2\x67\xd0\x0b\xa4\xf7\x6b\x07\x7e\x87\x3c\x32\xbf\x58\x03\x0f\xf1\xa6\xe6\x8c\x1f\xbb\xaf\xcc\x1f\x0f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x6e\xdc\x31\x84\xab\x66\xf6\x69\xf3\x2e\x25\x3d\xf2\xf5\x82\xe1\x9a\x16\xee\xb0\x9c\x9a\xbd\x49\x39\x5b\x32\x0c\xd3\x46\x62\x7a\xaf\x87\x54\xd7\xad\xc2\xe3\x8a\x1c\xa3\x0b\xb5\xb6\x82\x7e\x5a\x2a\x33\xca\x02\x61\x4d\x84\xaf\xae\xd5\xab\x61\xaf\x19\x42\x06\xc2\xb4\x54\xe2\x8c\x20\xc2\x94\x58\xe8\x6d\x39\xe2\xe5\xb5\xde\x99\xbd\x5f\x27\xf3\x34\x24\xa2\x56\x73\x20\x56\x13\xd1\xaa\x79\x30\xa6\xe9\xf8\xd2\xbc\xd8\xd2\x2e\x0a\x60\x68\x66\xc2\xa4\x9d\xde\xb6\xd0\x37\xc3\x1a\x89\x85\xf8\x24\xb1\x07\xba\xc5\x11\x2f\xb5\xde\x23\x88\x11\x5b\xfe\x8c\x1a\x1f\xe0\x85\xee\xdc\x2d\x38\xed\xb0\xea\x14\x22\x3c\xc7\xb4\xd2\x07\x38\xb1\x03\x3e\xe9\x39\x53\xf0\x26\x53\xb8\xc1\xe2\xeb\x77\x69\xb3\xd8\xcc\xac\x5e\x72\x57\x31\xe3\x92\x30\x90\x97\xd8\x27\xe1\xf8\x14\x01\x2b\x62\x4a\x73\x45\xa7\x02\x81\x2f\x26\x88\xd4\x8d\x5a\x0c\x10\x99\x13\xb1\x50\x33\x00\x0c\x08\x6e\x40\x24\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x0c\x10\x77\x3e\xe4\xc4\xe6\xe1\x7e\xb0\x66\x55\x5b\x29\x63\x64\x81\x5a\x9e\x94\x25\x6a\x9e\x0c\xbb\x26\x37\x17\x0a\x4a\x15\x9a\x39\xb9\x4c\xf4\x53\xd1\x9a\xc6\x31\x44\xa2\x8c\x67\xe1\x2d\xf4\x22\xc8\xfe\xd0\x5b\xa2\xc6\xf7\xe0\x61\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x4d\xdd\x29\xfd\x4f\xe6\x7a\x2c\x38\x9b\xd0\xa9\x0d\x8e\x9d\xd4\x98\xe1\x29\x19\xfa\xee\x0c\x3b\xf5\xe6\x64\x7b\xa0\x0d\x5c\x3a\x76\x89\x51\x8e\x54\x63\xac\x14\x11\xec\x5b\xf4\xdf\x87\xff\xfa\xe6\xd7\xe1\xd1\x77\x87\x87\x3f\xbe\x1c\xfe\xed\xa7\x6f\x0e\xff\x75\x0c\xff\xf1\x1f\x47\xdf\x1d\xfd\xea\xfe\xf1\xcd\xd1\xd1\xe1\xe1\x8f\x7f\x7f\xf7\xe6\x66\x74\xfe\x13\x3d\xfa\xf5\x47\xd6\xd6\xb7\xe6\x5f\xbf\x1e\xfe\x48\xce\x7f\xfa\xc2\x97\x1c\x1d\x7d\xf7\xfb\xf8\x00\x62\x6a\xb4\x3c\x5f\xac\x3c\x53\xa4\xfc\x51\xe2\xe4\x56\xc6\x6e\xfd\xf0\xdb\x2b\x70\xe5\xf8\xdb\x00\xc3\xa7\x8e\xbf\x48\x76\xab\x5c\x4c\xba\xf6\xa9\x44\xbc\xa6\x4a\x59\x27\x02\x0e\xe9\x6b\x96\x5c\x3a\x56\x60\xd1\x89\x51\xa0\xa8\x0c\x69\x54\x3a\x4f\x50\x74\xb7\xfc\xfd\x0a\x4e\x2c\x86\x68\xdd\x54\xa4\x26\x4c\x81\xe0\x19\x3a\x93\x17\x3c\x82\xc7\xdd\x08\x0a\xcc\x18\x57\x88\xdc\x17\x84\x94\xb6\x93\x7b\xd9\x18\x3c\x7b\xd9\xb8\x97\x8d\x9f\x7b\x92\xdd\xda\x99\xfc\x9b\xa1\x2b\x7b\x25\x48\xa5\xe5\x82\x39\x62\x4e\x7d\x86\x9f\x7b\xea\x03\x3e\x41\x24\x96\xe2\xb2\x6b\xc4\xb2\x66\xe2\x58\x27\xa6\xe3\x36\xc6\x8b\x15\x4f\xd0\x12\x65\xba\x49\x30\xb7\xf2\x4b\x3a\xb0\x8d\xb1\x5a\x39\x8b\x6a\x7a\x27\x08\xd8\x25\x29\x5a\x41\xd5\xe2\x8c\x33\x45\xee\xa3\x4c\xcf\x1c\xdb\xa9\xc3\xad\x5e\xf7\x3b\x64\xbd\xa7\x36\xc1\xd4\x7e\x87\x78\x63\xa8\xc8\x1e\x24\xdb\x9f\xf1\xb6\x2a\xf5\x72\x8a\x96\xc1\x2e\x89\xdb\x1d\x17\x13\xbd\xd6\x06\xc8\x04\x6b\x0d\xbe\xdd\xe5\x2e\x3a\x88\x91\xe9\xce\x2f\x2d\x9d\xe3\x8a\x30\x15\xfc\xc5\x08\x40\x27\xe1\x1f\x3d\x43\x97\x3b\xd8\x32\x23\x41\xe7\xb4\x22\x53\x72\x2e\x0b\x5c\xc1\x55\xba\x6d\xfd\xec\xf4\x81\x7e\xc1\x7e\x10\xbc\x92\xe8\x6e\x46\xb4\xbe\xa2\xe5\x84\x01\xba\x81\xef\x77\x8a\x29\x43\x35\x17\x29\xfe\x41\xdb\xa8\x34\x48\x3b\xad\x72\x35\x58\xe8\xb5\x77\x88\x3a\x23\x60\xc6\x9c\x57\x96\x55\xb0\x5a\x74\xfd\xa2\xf1\x8e\x34\x70\xc6\xf0\x9f\x19\xb9\xfb\x59\xf7\x42\xa2\x49\x85\xa7\x1e\x48\xa7\x05\xd4\x32\x3c\x39\x1d\xe4\xf7\xe0\x44\x03\x65\x5e\x4b\x10\xae\xee\xf0\x42\x76\xf0\xc7\xae\x6d\x9a\xa0\xc5\xbc\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xc3\x11\xe4\xab\x9d\x9d\x8e\x7e\xbe\xfe\xe7\xf5\xcf\xa7\xaf\xdf\x5d\x5c\xc6\x83\x9c\xb8\x22\x46\xc1\x0e\x6e\x03\x7b\x47\xd8\x55\xf0\xa1\xdd\x63\x2e\x8f\xc1\x7b\x06\xb9\xf7\xac\xe4\x77\x89\x21\x06\xbd\xa7\x08\x8e\xbb\x7a\x70\xd3\x9c\x8a\x9a\x8b\x91\xe0\x13\x5a\x45\x7b\xa7\x73\x9d\xe0\xa5\xee\x38\x67\xe3\xa9\xfd\xb8\x13\xf7\x26\x1d\x74\x35\xd4\x15\x08\x6a\x0a\x49\x87\xfa\x35\xf1\xc6\x4d\x0f\x32\x6a\x00\xac\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\x4f\xb6\xd1\xdd\x88\xfc\xf3\x1c\xc1\x98\x8a\x17\xb8\x82\x42\x07\x69\x1b\x1f\x65\xf6\xb3\x2f\xf7\x2b\x00\x07\x63\xb7\x9d\x51\xc5\x71\x49\x4a\x27\xd7\x19\x2f\x89\x23\x41\x75\xca\x0e\xc4\x4e\x92\x3a\x72\x63\x80\x99\xd0\x9e\x43\x33\x37\x82\x38\xd3\x79\xb9\x79\x6e\xb8\x5f\x93\x9a\x7c\xd7\x8f\x44\xd9\x51\xf6\xf2\x6e\x52\xcf\x9c\x6f\xc6\x1e\x30\x3a\x81\x58\x36\xa8\xfc\x74\x02\x9b\x52\x1f\xb1\x17\x6f\xdd\x32\x24\x30\xa4\x67\x0a\x06\xc1\x4b\x76\x64\x77\x9a\xf9\xf1\x3b\xd2\xa0\xca\x6e\xa9\x9e\xc1\x49\x27\xa4\xdd\xb6\x71\x3a\x88\x81\x96\x25\xee\xc7\x8f\x50\x8b\xc3\xc9\x7f\x2c\x92\x69\x5c\xfc\x12\xa3\x61\x70\xb4\x1a\x41\x86\xab\xc7\x2b\x35\x76\x75\xd5\x32\x45\x6b\xe2\x52\x95\x87\x4b\x3a\x91\x30\x5f\x1f\x48\x4f\x0c\x98\x65\xa3\x23\xf4\x81\xc1\x79\x65\xa4\x44\x43\xc4\x78\xb7\x44\x84\x4d\xb8\x28\xc0\x4f\xb7\xd5\x0d\x5e\xe0\x06\x8f\x69\x45\x53\x84\x79\xae\x0d\x0e\x3c\xdb\x41\x7f\xc0\xa1\x59\x96\x27\xa5\xe0\x8d\xb9\x89\x5d\x0e\x51\x3a\x36\xa4\x8f\x55\x0f\x29\x21\x41\x61\x9f\xf4\x3b\x32\x15\x98\xa9\x2e\x49\x65\x65\xe3\xfc\x16\x75\x90\x1c\x4a\x00\x2e\xf3\x31\xd6\x9f\x96\x5a\x66\x84\xcb\x96\x7c\xae\x76\x8d\xfd\xee\xcc\x0d\x2e\x00\xab\xa3\xd1\xfb\xeb\x8b\xff\xb7\x74\x6e\xe2\x55\x3b\xf3\xec\x36\xf7\x95\x96\x07\xd9\xb6\xcd\x15\xa9\xf9\x7c\xbf\x71\xbe\xfa\x8d\xe3\x1d\x44\x5b\x27\xee\xb8\x6a\x59\xe8\x8e\x61\x41\xd7\x50\x9d\xa4\xeb\x8c\x7c\x8e\x6b\xff\xad\x61\xb9\x51\x41\x90\xfe\x09\x53\x14\x57\xd5\x22\xf4\x91\x2a\x6e\x6a\x62\x64\x29\xec\x16\xde\xae\x13\x5c\xc9\xe7\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\x77\xbc\x65\x79\x98\x40\x12\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x13\xf8\x16\x99\xc8\x79\x40\xf2\xd5\xd3\x73\x12\xd4\xac\x9b\x40\xb5\xf2\x09\x80\x4e\x0f\x37\xf6\x4b\x2b\x89\x5c\xaf\x57\x75\x81\xf4\x09\x8f\x8f\x1f\x0a\x82\x4b\x30\x30\x1b\xac\x66\x86\x7d\xa6\xc6\xf2\x96\x94\xe6\x83\xc4\xcc\x5b\x0f\xc3\x06\x28\xa5\x9b\xe9\x1b\x3d\xb9\x0e\x39\x0d\x0e\x61\xc3\xc1\x03\x58\xed\x14\x53\x6c\xab\xa7\x21\x41\xb0\xeb\x45\x78\xcf\xaa\xc5\x15\xe7\xea\x7b\x5f\x5c\x67\xdb\x27\xe3\x1f\x36\x1c\xd1\x77\x62\x82\x5f\x1a\x43\x97\x87\xb0\x71\x40\x2e\x06\x25\x81\x52\xc5\xa2\x5e\x90\xdf\xaa\x54\x14\x2d\x3b\x95\x6f\x04\x6f\xa3\x75\xb8\x9c\xf6\xe6\x9b\x8b\xd7\x70\xf1\xb5\x96\x9c\x81\x29\xb1\x68\x38\x65\xca\x79\xbc\x32\x06\x6d\x3e\x58\x1a\x8c\x50\xb2\x25\x67\xbc\x23\xf4\x0e\x2f\x10\xae\x24\xf7\x2e\x35\xb6\x2e\xc8\xe9\x22\xa8\xfa\xeb\x31\x57\xb3\x95\xd0\x29\x66\xf1\xa1\x9c\xd5\xf6\x06\x01\xc7\x43\x97\x4e\x47\xd9\x4a\xb3\x0a\xb0\xe5\x8d\x20\x05\x29\x09\x2b\x9e\xeb\x89\xd8\x36\xe5\x00\x9c\xaa\x4b\xce\xb4\x78\xdd\xf6\xb9\xba\xf0\xfe\x49\xbb\x1a\xe1\x29\x02\x57\xb6\x0d\x22\x62\xa0\xe7\x00\xe1\xda\xca\x14\xe0\xff\xc5\x04\xa2\x9e\x66\xd3\xfd\xbd\x1d\x93\x4a\x2f\x36\xad\x2a\x53\x41\x18\x2b\x03\x08\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\xa1\xf1\x29\x32\x25\x27\xd2\x17\x72\xc3\x12\x7d\xb8\x78\x8d\x5e\xa2\x43\x3d\xb6\x23\xd0\x38\x26\x98\x56\xc0\xf8\x01\xe0\x9b\xa5\x90\xec\x04\x40\x83\x3c\x25\xfb\xf7\xc2\xca\x11\xc4\x85\xb9\x5a\x06\x88\x71\x24\xdb\x62\xe6\xe6\x80\x72\xe6\x3d\xc2\x96\xfe\x31\x09\x0e\xbd\x17\x3b\xf9\xee\xc3\x0f\x92\x88\x6d\x1f\x5b\x7d\x1d\x7e\x78\xc2\xeb\x30\x34\x11\xf5\xf1\xef\x2f\x98\x39\xab\x35\x51\xb8\xc4\x0a\xdb\x6b\xd2\xfd\x60\xbf\x6b\xf7\x97\x65\xc2\x65\x29\xc9\x5b\xca\xda\x7b\x83\x74\xdb\x89\xb0\xc7\xf5\x39\xf4\x08\x8e\x17\x2c\x34\x0f\xe2\x76\x2e\x42\x91\x21\x43\xee\xa2\x77\x8c\x06\x0f\x58\xdd\x70\x4b\xb8\xec\x74\x6d\x08\x61\x56\xf2\x7a\xa5\x93\x90\x3e\x9f\x52\x1c\x3d\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x42\x41\xf8\xa5\x43\xf9\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x6c\xce\xbe\x21\x5d\xc9\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf0\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x6d\x26\x56\xe6\x1e\x74\xdc\x99\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x9d\x0f\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x58\x49\xd9\x14\x02\x56\x03\x24\x48\x65\x08\x6d\xad\x78\xbe\x35\x1e\xaf\x03\x90\x38\xae\x43\x4e\xdc\x74\x98\x55\xc3\xe7\x93\x15\xbb\xb9\x0e\xaf\x69\x7e\x73\xf9\xfe\x26\xcc\xe1\xc2\x6c\x61\x32\x55\xe1\x4f\xb6\x7e\x9d\x3e\x1b\x4c\xe7\xf2\x2a\x3e\x36\xa4\x33\xe9\x7d\xeb\x11\x9d\x4f\x77\x4a\xbf\x0c\xe5\xb9\x8c\xf1\xcc\xda\x85\x65\xc0\xe7\x6a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x87\x1c\x20\xff\x30\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2a\x43\x27\x08\xae\x52\x13\x34\xcd\xb3\xce\x0b\xe2\x4e\x81\x27\xb4\x59\xf5\x06\xf4\xc9\xd1\x53\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x7d\x17\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x6b\x4a\xf9\x07\xf8\x3c\x49\xa7\xf2\xc4\x4a\x94\xa1\x9e\xb8\x23\x44\x59\xe5\x33\x85\xc1\x5b\xc8\x94\xb4\x11\x84\xe4\xc1\xa3\xc2\x8f\x1e\xb6\x1e\xe4\xa7\x78\x68\xf6\xea\xf4\x00\xc7\x1a\x6c\xde\xad\x6b\x1d\xab\xbb\x2a\x8d\xb6\x78\x69\x67\x3d\x30\xf6\x90\x2f\xcc\x46\x71\xd6\xce\xa3\x31\x5e\xb7\x3e\x49\x56\xe9\x2f\x88\xcc\x57\x4a\x3d\x43\x05\x7c\xdb\x25\x54\x12\x53\xc9\x80\x00\xa5\x0b\x7e\x30\xd3\x1d\xc2\xdb\x07\x50\xfa\xc9\xfe\xe9\x41\x2e\x8a\xbb\xd3\xaa\xd2\x0b\x89\xf5\x35\x71\x20\x43\x74\x27\x98\x26\x33\x3c\x27\x5d\x11\x68\x32\x99\x90\x02\x8c\x85\x70\x14\xe9\x25\x92\x0f\x29\xa0\x98\x42\x3a\x5d\xc5\x4d\xdb\x18\xd5\xf4\x5e\xf7\x30\x6c\x31\xc4\xa0\xb2\x12\x02\xff\xeb\xbf\x4e\xa8\x84\x81\x00\x7c\xe0\x99\x5b\x06\x7a\x85\xc2\x46\x5c\x72\xb4\xd2\xd7\x96\xfe\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2a\x72\x8c\xd6\xa4\xef\x3c\x59\x04\x19\x7d\x79\x14\xf9\x11\x63\x55\x68\x57\xe2\x55\xa9\xa4\x27\xa6\x0c\x24\x14\xa6\x49\x66\x3c\x19\x75\x25\x6e\xbf\x88\xe6\x3b\xa2\xbd\x2d\x13\x7f\x90\xfb\x78\x4d\xb4\x37\x55\xe7\xf7\xa4\x58\x2a\x29\x59\xd7\x50\x39\x8b\x43\x23\xad\xf2\x85\xef\x92\x6f\xad\x1d\xd1\xe9\xed\x08\x77\x45\x88\x9e\xd9\x09\xa7\x4e\x4d\x36\xff\xd4\x8a\x73\x7f\x11\xa4\xf3\xb6\x07\x1c\x73\xfa\x9f\xfa\xe6\xa2\x6c\x6a\xc9\x4c\xb8\xf0\xd4\x4f\x49\xdd\x72\xfd\x80\x8a\x07\x9c\x2b\x74\x78\x70\x72\x70\xb4\xb2\x17\x0e\x64\x88\x87\x36\xa9\x9b\xdd\x80\x24\xad\x9b\x6a\x01\x63\x38\x30\x45\x0e\x12\x8a\x87\xe9\xc7\x21\xeb\x3c\x5b\xb0\x9c\x91\xaa\x1a\x20\xa9\xef\x69\xec\x88\xda\xcc\xa7\xfa\x47\x4a\xb4\x85\xb1\xe7\x0f\x0f\x7e\x3d\x18\x20\xa2\x8a\x23\x74\xc7\xd9\x81\x32\x9e\x59\x74\x03\xca\x6e\x52\x9f\x7c\x27\x16\xbc\x85\x3a\x7c\x66\xd9\x3c\xb7\x5f\x81\xb5\x9e\xd6\x1a\x65\xc2\xb0\x03\x90\x2a\xa1\xae\x9c\x7e\xce\xef\xa9\xd2\x32\x53\xb5\x60\x4f\xbd\x34\x2a\x0d\x81\x22\x02\x58\x42\x85\xdd\x93\x19\xc1\x95\x9a\x2d\xbc\x9a\x65\x4a\x9c\x49\xd4\x32\xfb\x4d\xba\xb0\xdf\x81\xfc\xb6\xdd\xcd\x34\xb3\x95\x16\x77\xba\x50\xb4\xed\xe3\x67\xeb\x44\x9b\x7a\xd0\xfd\x1a\xd1\x50\x3b\x9a\x94\xb9\xca\x44\xff\xf1\xeb\x2b\x01\x3d\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\x2a\x8d\xfc\x7a\x47\x62\xa0\x5b\xae\xfb\x9c\xb5\xdc\xf1\x88\x0b\x85\x98\x2f\xb9\xa7\xcf\xd6\x14\x56\x91\x88\x39\x2d\xc8\xf1\x13\x54\x17\xce\xc5\xba\x99\x7e\x10\x10\xa0\x36\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xac\xf3\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\xae\x3f\x74\x69\xee\x13\x49\x08\x5a\xe3\x57\xd5\xa2\xc3\xfc\xcf\xb8\xe2\xe3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x0f\x0b\xdd\x03\xca\xa6\xc7\x75\x79\x94\x50\x8d\x05\x05\x95\x62\xad\x1b\x67\x29\x20\xe2\xa2\x64\x9e\x27\x94\x4a\x1f\xca\x1b\x2f\x60\x52\xb6\xee\x2b\x44\xae\x97\xdf\xa2\x17\x2f\xa2\xde\xa2\x97\xe0\x4d\xa6\x5a\xfd\x3f\xdc\xdc\x8c\xde\xf4\x2b\xf5\x33\xf8\x10\xbd\x39\xbf\xf1\xd5\x19\xf4\xee\x32\xd9\x17\x7b\xa9\xbd\x33\xd5\xfa\x33\x38\x88\x37\xa9\xf0\x0f\x0c\xb6\x5a\xe5\xc2\xe3\x6a\x81\xee\xb0\x49\xbd\x96\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x12\x21\xc1\x1a\x22\x78\xfb\xc1\x8f\xa0\x4f\xd9\x96\xed\xac\x95\x8a\xd7\x68\x66\x87\x6a\xe6\xb0\xab\x7f\x62\x74\x23\x73\x04\xc1\x19\x24\x91\x20\x8d\xb1\x96\xec\xdf\x7c\x15\xb6\xd0\x8a\x14\x32\xf3\x1c\xb0\xe4\x63\x54\x84\x53\x65\x15\x7d\x53\x72\xd9\xca\xa8\xa4\x1a\xb8\xe6\xc9\x52\x6c\x0a\x65\x2a\x38\x85\xd2\x8b\x4e\xb9\x97\xa4\x47\x4b\xf2\x94\xaf\x42\x59\x4a\x58\xa1\xec\x95\x89\x90\x8d\x09\xd8\xcd\x65\x90\x02\xba\xa3\xa9\xf4\x69\xc8\x91\x2c\x38\xe4\x45\x81\x19\x67\xb4\xc0\x15\xfd\x37\x29\x51\xdb\x70\x86\x78\xab\x9a\x56\x81\x2b\xa8\xc0\x92\x0c\xe7\x58\x50\x2d\x50\x4d\xfd\x3f\x0f\xd9\x60\xfa\xb4\x2b\xce\xc1\x4f\xe2\xa3\x63\xa6\xc7\xe9\xdd\xcc\xa4\xcd\x20\x57\x2b\x3f\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\xe4\xc2\x2c\x9f\x59\x87\xd5\x0c\x20\x48\x05\x44\x12\x2d\x82\x0d\x04\xa7\x36\x1b\x76\x20\x43\x20\xab\x15\x9b\x28\x12\x4c\x15\x64\xb1\x64\x07\xeb\x1e\xae\xce\x61\xa6\xa0\xf8\xe3\x9b\xd5\x61\xb9\xbe\x31\xd1\xba\xfd\xc5\xe9\xe5\xe9\xcf\xd7\x1f\xcf\x7e\xbe\x3c\x7d\x77\x9e\xf2\xea\xe4\x52\x1b\x39\x8b\x6d\x64\x2b\xb7\xf1\x48\xc5\x88\xf4\x23\x8b\x19\xd9\x9d\x78\xf8\x35\xf4\x26\x64\x4f\xb2\x36\x00\x14\x65\xe5\x19\xe8\xb4\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\xca\xa8\xa2\xb8\x7a\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\x61\xa4\x97\x5e\xd8\x48\xd3\x21\xeb\xb6\xee\x83\x0f\x66\x58\x9a\xa0\x33\x29\xd1\x98\x4c\xb8\x20\x10\x35\x61\x5a\x22\x35\x5d\xfc\xd8\x8c\x4f\x3d\x61\xbd\xb8\x3b\x2e\x6e\x2b\x8e\x4b\x79\xd2\x70\xf3\x3f\xc3\x8a\x4e\x48\xb1\x28\x2a\xf2\x3b\xdf\xff\x61\x92\x9a\xbe\x1b\xee\xf1\x86\x08\x0a\xd0\x85\x5d\xd8\x35\x3f\xf0\x3b\xc4\x27\x8a\x30\x74\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xd3\x3e\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x88\x0c\x49\xb9\xd3\x91\x2f\xdb\xc7\xcf\x87\xbe\xec\x0f\x27\x6d\xd5\x0f\x7f\x99\x90\x58\x9e\xd8\xd7\xab\x63\x9f\x50\xf3\x0a\xfa\xe3\x45\x11\x66\xa5\xc3\xc6\x7c\x7d\xfb\x44\x15\xcd\x35\x2f\x6e\x33\xb9\x5d\x6f\xce\x46\xe6\x6d\x4b\x78\x16\x73\x03\x6b\x2d\x93\x23\xac\x7f\x05\x0a\xe8\xde\xe9\xba\x33\x4e\xd7\x83\xae\xd4\xd4\xa6\x0e\xd4\x83\xbd\xb5\xd5\x3d\x4e\xf1\x11\xfd\x52\x0d\x7b\x6b\xeb\x81\x67\x6f\x6d\x6d\xf0\x18\xb4\x3b\x64\x8e\xbe\x11\xb8\x20\xa3\x5d\x52\xde\x9c\x00\x41\xa5\xad\x25\x8a\x3a\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x53\x3d\x92\x49\x5b\x55\x0b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\xeb\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\xd7\xb6\x88\x24\x2c\xde\x9d\x8e\xc3\x15\x44\x92\x4e\xf5\x74\x01\xd0\x73\x46\x90\x61\xfb\x71\x35\xc2\xba\x8e\xe8\x56\x27\x5c\x14\x74\x5c\x2d\xd0\x0c\x57\xda\x58\xba\xa3\x6a\x86\x30\xba\xa5\x55\x65\x5f\x13\x3f\x51\xd7\xae\x6a\xa3\xd1\x68\x2a\xce\xa6\x30\x19\xd8\x82\xc7\xef\x1b\x52\x28\xa8\x5b\x4f\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x9b\x01\x3f\xee\x02\xdf\x5e\x9f\x62\xd4\xf2\x24\x98\x0a\x53\x9f\xdc\xf3\xfd\x2c\x40\xf4\xde\x95\xdf\x35\x15\xaf\xa2\xfb\x64\xfa\xd2\xaf\x77\x65\x3e\xf3\x5c\x0f\x36\xc5\x49\x6f\x0b\xc8\xb9\x8b\x6e\xeb\x23\xbc\xd7\x89\x56\xc6\xd9\x90\x91\xa9\xc9\x28\xb7\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xf3\x93\xa5\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x0b\x34\xa7\x38\xba\x27\x90\xbd\xde\xed\x28\x74\xc8\x38\xe2\x8d\xbe\xba\x5a\x46\xd5\x02\x22\x7a\xb3\x56\xa1\x92\xdf\xb1\x84\xc4\x90\x1b\x0b\x73\xc0\x68\x4c\x14\xb6\x3e\x70\x7d\x08\x3c\x79\x33\xf0\x32\xeb\xb3\x07\x18\xf2\x9b\xb5\x1b\xc0\xf3\x39\x4f\xb1\x4a\x90\x12\x6b\xb4\x79\xb3\x9e\x9f\xde\x76\x54\xda\x78\x5d\x22\x61\xec\x6e\x50\xb0\xe9\x13\xcd\x5b\xb5\x23\xf7\xc8\x43\xae\x23\x93\x8b\x1f\x18\x89\xb4\x26\x12\xf1\x36\x13\x31\xfe\x2b\xdb\x5c\x4e\x0b\x6f\xef\x77\x5a\xfb\x48\x55\xd2\xa8\xf2\xa8\x39\xb6\xd8\x03\x2c\xe3\x36\x61\x30\x20\xda\x1b\xb7\x93\x09\x11\x70\xd3\x41\x87\x57\x60\xf7\xbe\xe0\x90\xbb\xc3\xe2\x9c\xb7\x16\xf0\x45\xd4\x00\x48\xce\x6d\xd6\xfb\x03\x4d\x5a\x36\x40\xa8\x27\x2a\x88\x04\xd2\x6a\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x50\xa0\xa7\xe5\xd6\xc1\x38\xdf\xb3\x38\x4c\x62\xde\xfd\xb0\x8e\x9e\xc2\x6e\x8b\xa2\xe2\xd2\xe6\x71\xc2\xba\x14\x33\xcc\x18\x71\xce\x28\xaa\xc0\x93\x3d\x26\x84\x21\xde\x10\x03\xca\x8b\xea\x0c\x46\x92\xb2\x69\x45\x10\x56\x0a\x17\xb3\x63\xdd\x3b\xe6\xf6\x42\x97\x30\x69\x3f\x91\x4a\x10\x5c\x9b\x3d\x21\x48\x8d\xa9\x69\x1e\xe1\x42\x70\x29\x51\xdd\x56\x8a\x36\xfe\x65\x71\x5e\x44\x02\xa9\xeb\xd2\xe4\xcf\xb9\xb5\x82\xb4\x92\x2e\x33\x73\xd0\xf5\xd0\x0e\x9f\x87\x55\x55\xc0\x75\x36\xd0\xdf\x92\xba\x51\x0b\xa4\xa7\xb6\x8a\xce\x8d\x99\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\xdc\x68\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x22\xc8\x40\xf4\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x39\x88\x5b\x3b\x57\x42\xc3\x6c\x1c\x37\x23\xb0\x75\x9c\x82\x63\x7a\x64\x3f\x0a\xba\x10\x14\x04\x76\x35\xe1\xb5\x3e\x9b\x22\x57\xa0\xce\x85\x3b\xd7\x83\x5e\x72\x74\x67\x5b\x40\x2a\xcc\x8a\xd4\x81\x0d\xc5\xc8\x5c\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xc9\x65\x8c\xc2\x62\x4a\xd4\x99\x1b\x7f\x6c\xf6\x6e\x0e\x69\x13\x56\x4e\x0f\x1d\x44\xdd\xe2\xc0\x3a\x8c\x78\x09\x6c\x12\x1d\xe3\xc7\xba\x72\xee\x66\x5c\x91\xb6\xd7\xcd\x03\x35\xe2\x9d\x45\x65\x32\xbc\x7c\x47\x65\x83\x0b\x22\xd1\xe1\xc5\xe8\x6c\x80\x46\x17\xaf\x6d\x1a\x17\x9f\x2c\xb3\xeb\xc5\x4e\x8b\xbd\x04\xcd\xd9\x7d\xa8\x80\xbd\xaf\x4e\x13\x74\x29\xa0\xd9\xb2\xfd\x1d\x79\xa3\x2c\x7a\x66\x56\x6f\x02\xb0\xd0\x68\xdd\x54\x50\x27\x12\xc9\x16\x2c\x23\x1b\xb8\xd0\x5b\xdb\xd8\x23\xf6\xd0\x92\x8e\xe0\xc8\x92\xd1\x47\x06\x71\x4c\x2b\x7e\xb8\x76\xcd\x21\x96\xed\x26\xca\xea\x01\xa0\x30\x2b\xfb\x95\xe7\x88\x81\x5c\x33\x0b\x15\x8f\xbf\xdd\x23\xdd\x61\x81\x11\xf5\x8e\x48\x89\xa7\x64\x14\x89\x03\xca\x71\xf6\x3a\x0f\x37\x00\x88\x3a\x79\x3d\x23\x86\x0a\x4b\xf1\xe0\x93\x30\xbb\x32\xf4\xda\xd4\x66\x20\x51\x3d\x70\x67\xeb\x4e\x50\xa5\x08\x5c\x0f\x50\xeb\x09\xb6\xee\x32\xbd\x67\x3f\xab\x33\xaa\x3d\x3b\xe9\x61\x7b\x5a\xef\x67\xa5\xc9\x8f\x1c\x13\x34\x16\x94\x4c\xd0\x84\x42\xc2\x26\xa4\x32\x0e\x4c\x9d\x02\x0c\x80\x79\x2c\x25\x11\x30\x6c\xeb\x8f\x73\xc3\x8f\xeb\xcf\x3f\xec\xf8\x95\x68\x59\x81\x83\x22\x9e\xc0\x3e\x46\x27\x68\x0a\xe9\x93\xd6\xfb\xf4\xa7\x97\x7f\xfb\x0b\x1a\x2f\xb4\xa1\x04\x67\x52\x71\x85\x2b\xd7\x01\x54\x11\x36\xd5\xab\x08\xba\x4e\xdc\x85\xdd\x63\xb0\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\xba\xf3\x40\x31\x39\x29\xc9\xfc\x24\xd8\x42\xc3\x8a\x4f\xe3\xde\x7a\xe6\x09\x9f\xda\xa6\x8c\x05\x44\xe4\x3e\xd1\xbc\xa2\xc5\x62\x6b\xf7\xa9\x75\x85\xa1\x19\xbf\x33\x5e\xd4\xd5\xa3\x1a\x90\xc1\x34\xbc\x69\x2b\x98\x38\xf4\xbd\x67\xf0\x6b\x25\x59\x26\x47\x4a\xf5\xce\x07\xd2\x0e\xd0\x0b\xb6\xd9\xa5\xab\xde\xe6\x0e\xbb\x6e\x72\x4b\x4d\x61\x83\xdd\xbe\x52\x49\xb4\x1b\xfc\x7b\x5c\x55\x63\x5c\xdc\xde\xf0\xb7\x7c\x2a\xdf\xb3\x73\x21\xb8\xe8\x8f\xb9\xc2\x5a\x99\x9e\xb5\xec\x16\xea\xec\x76\x74\xb5\x7c\x6a\xc1\xbc\xc0\x2c\xd9\x9f\xd8\xa8\xce\xb8\x51\x1a\x02\x51\x67\x0b\x38\xe7\x77\xd7\x32\xb9\xa7\x9d\x87\x9b\x21\xa2\xfb\x1c\xaf\xe1\x84\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\xc8\xf5\x97\x03\x73\x01\x80\xea\xab\x6d\x9c\x1a\x57\x55\xac\x4e\x13\x8a\x80\xef\xa3\xcb\x57\xef\xc0\x91\x57\x5b\x3b\xdd\x5f\xec\xab\xb9\xb9\xf9\x27\x68\x62\x54\x49\x52\x4d\x06\x86\x0f\xc6\xfb\x93\x0f\xc0\xac\x39\xb0\x57\x5e\x3c\x97\xd0\xf6\xbd\x25\x73\x5e\xb5\x35\x79\x4d\xe6\xb4\x88\x43\x0e\xf4\x56\xa5\xf7\x36\x17\x1f\xab\xa8\x04\x5d\x72\x5c\xf1\xe2\x16\x95\xf6\xcb\x20\x47\x65\xb9\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x38\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x5d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x0c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\xff\x36\x44\x27\x2b\xa6\xba\xaf\xa8\xe6\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\x3e\x6e\x90\x01\x85\x90\x96\x9c\xd4\x9b\x17\xe6\xd1\x1f\x35\x56\xd6\x3e\x72\xde\x0b\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xdb\x9a\x84\xd5\x54\x96\x1a\x37\xc3\x5b\xb2\x88\xdc\x70\x89\xc7\xe5\xa1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x11\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x67\xc6\xa2\xeb\x76\x0c\x67\x0a\x7e\xfe\xb8\xf4\x60\x59\x95\xa7\x6d\xdf\x55\x1f\xbb\x15\xef\x5f\x55\xfa\x13\x7f\x57\x99\x5f\x7d\x4d\x37\x14\x8c\xef\xb9\x5e\x50\xbe\xf3\x99\xe4\x70\x12\x36\x11\xae\x35\xbb\x33\xfa\xf7\x58\xcf\x13\x66\x8e\x74\x60\x33\x5b\x0f\xd5\xb1\xa9\x37\x90\xd0\x01\x7d\x14\x6d\xa3\xe8\xe0\xdb\x83\xad\x5e\x8e\x66\x65\x04\x6f\xf0\x14\x4c\xda\x5d\x58\xa0\xe5\x3e\x85\xf4\xb6\x33\x7e\x17\x8a\xcc\xc6\xfe\x4a\x4b\x4c\xc7\x91\x3e\xe3\x49\xab\x63\xb0\xbe\x6e\x47\x58\xb3\xdc\x54\x89\xb8\xc3\x0b\x84\x05\x6f\x59\x12\x71\x01\x84\x32\x7d\xa8\xfb\xdd\xd2\x60\x2f\x39\x23\x0e\x56\x93\xd2\xca\x4d\xcf\xf5\x0d\x08\x23\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x3a\x27\x57\xb6\x7c\x7a\x10\x06\xbd\x98\x8c\xb8\x94\x74\x5c\x41\xaa\xa5\xe2\xe8\xdc\xd4\x96\x5f\x1d\xa8\x87\x7a\xc1\x88\xb9\x08\x89\x50\x13\x7a\x78\x68\x4e\x70\x08\xd1\xd6\x0d\x24\xe0\xb4\x76\x4b\x05\x85\x75\x5d\x52\x41\x2f\xbd\x0a\x6a\xee\xbd\xad\x8e\xd5\xd5\xd4\xdf\x05\x49\xf2\xce\x06\x15\xba\xa2\xf9\xd4\x15\x65\x86\x8f\xee\x04\x55\xf6\x70\xdf\x51\x49\xd0\x21\xb8\x33\x96\x36\x63\x12\xf7\x73\xe8\xfc\x4a\x2c\xae\x9f\x83\xbb\x59\x2c\x1f\xdd\x5d\x58\xa5\x55\x79\xd2\xe5\xcc\xdc\x59\xcf\x57\xb7\x82\x56\xfa\x77\xf7\xf2\x0c\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x45\x12\x7b\xd5\xc5\x04\x85\x22\xd1\x22\x0e\x82\x20\xe4\x0c\x4b\xc4\x38\xaa\x09\x06\x48\xb5\xbe\x5d\x9c\x14\xec\xd1\x40\xe7\xeb\x83\xd9\xec\xe6\x1a\x0b\x2f\x04\x2b\xae\x5f\x53\x69\xc5\xb3\x96\x23\xd6\x74\x31\x40\xac\x1a\x97\x29\x64\x0c\xc1\x9c\x76\x8b\x77\xdc\xc1\x9c\x97\x7b\xd2\x5d\x1c\x4b\x7d\x79\x8c\x7e\x0c\x6c\x75\x73\xdd\xbc\x89\x2c\xaf\xf1\xe7\x75\xb0\xb6\x24\xfc\x89\x79\x96\x87\xeb\xaf\xc5\x95\xb1\xae\xef\xb1\xef\x70\x42\x1f\x3e\x3f\xd4\x41\x20\x0b\x1d\xaa\xdb\x80\x60\x6c\x79\x15\x9b\xa3\x9c\x46\x12\xee\xa2\x19\xde\x4f\x34\x25\x8c\x08\x6c\x03\x12\x0e\xd4\x6d\x43\xfa\x58\x72\x96\x7a\x20\x3e\xb3\xe1\xb4\xbc\xff\xbc\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x74\xda\x6d\xa8\x65\x9d\xc6\x92\x73\xd4\x4b\x64\x7a\x66\xf3\x07\x2c\xbd\x7a\x51\x7e\x69\xe9\x1c\x57\xc4\xd0\xe3\x3b\xd1\xb0\x55\x65\x42\xb6\xe3\x5d\x35\x1b\xad\x7d\x08\x66\xc7\x7a\xb4\xc4\x83\x16\x64\x26\x7d\xe2\xc5\x0b\x74\x68\xda\x38\x30\xb4\xd8\xdb\x55\x72\xed\x5a\x9d\xdf\x37\x09\x45\x61\xf3\xad\xd7\xf9\x7d\x83\x01\xe0\xd1\xec\xc4\xc2\xfd\x17\x99\xe1\x39\x01\x16\x72\x5a\x61\x51\x41\x1a\xc9\xb5\x99\x32\x34\x6e\x15\x22\x6c\x4e\x05\x67\x00\xaa\x02\xba\x28\x2d\x99\x04\x99\x10\x41\x58\x41\x24\xfa\xfd\xe1\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x14\x0e\x48\x03\x50\xf6\x69\x63\x57\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x74\xa6\x2c\x5d\xc3\x12\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xed\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\x3f\xe3\x52\x9d\x56\x14\xcb\x4d\xfd\xd8\x69\x5b\xfd\x87\xae\x59\xc8\xf6\x63\xb6\xaa\x23\xae\x3c\xc4\x40\xf7\xcc\xc0\x9c\x2e\x46\x16\x8b\xee\x76\x25\x65\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd8\x13\x83\x38\x9a\xa0\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x66\xbc\xb2\x79\xd7\x0e\xcd\x30\x26\xea\x8e\x10\x86\x2e\x46\x30\xe7\x7a\x2a\x0d\x2f\xe3\xfa\x99\xb7\xca\x31\x53\x62\x61\x0f\xf4\xc6\xbd\x09\xd6\x0c\x56\x61\xd3\xa3\x9b\x10\x7f\x8a\x8f\x3c\x0d\x11\xdd\xf4\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\x7e\xf0\x0b\xea\xd8\x74\xf0\x98\xcf\x09\xac\x77\x59\x8a\xc8\x2c\xed\xad\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xe4\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x86\xc7\x2d\xdf\xad\x78\x31\x3a\x7b\xca\x1b\xf1\x83\xf5\x2e\xe9\xa6\x0f\x24\xa2\x4d\xd1\xe5\x75\x6c\xba\xf4\x5d\x2e\x43\x40\x67\x16\xe1\x68\x8f\x75\xae\xcf\xba\x82\x8d\x4f\xad\x54\x20\x66\xda\xd5\x57\x9a\xa5\x15\xb7\xc0\x11\xf0\xfc\x34\xbc\x3c\x5e\x9e\x6a\xfb\x17\xf1\xd3\xed\xdc\x4a\x46\x85\xb1\xde\xb4\x81\xa7\xf6\x59\xba\x42\x01\x26\xe9\xfd\x67\xb1\x55\x0e\xb7\xb7\xb0\xa3\x8b\xd7\x5b\x3c\x17\x0d\x2d\x9f\xf7\xb9\xf8\x20\x37\xa6\xd5\xcf\x3a\x81\x50\x7d\x33\xef\x0c\xc6\x60\xa6\x6d\xc1\x4d\xfb\xd7\xc0\x88\xc5\x15\x6a\x04\x91\x84\xf9\xb3\x53\xae\xcb\x37\x84\x6b\xb1\x3f\x8a\x81\xfe\xf7\xa4\xad\x36\x55\xfd\xb9\x08\x28\x75\x3c\xff\x10\xf6\xec\x21\x10\x63\xc0\x73\x4c\x2b\xf0\x3b\x05\xfc\xb0\x2b\x1d\xb0\x69\x51\x1b\xf6\xa0\xe2\xb8\x84\x98\x17\xba\xd5\x77\x56\x85\x6a\x5e\xb6\x95\x81\x68\xa1\xb3\xd3\xd1\xcf\xd7\xff\xbc\xfe\xf9\xdd\xfb\xd7\x1f\xde\x6e\x4c\xa3\x65\x72\xc3\x49\xb7\xc5\x07\x08\x23\x46\xee\xa0\xe7\x0c\xac\xae\xc2\x3a\xba\x3d\xbd\xa2\x16\x8e\xd7\x36\x4b\xd0\x04\x7d\x0d\xe6\x62\xd2\x56\xfa\x47\x1b\xf6\xa0\xa6\x8a\x4e\x31\xbc\xac\xb3\xf5\xc7\x82\xe0\x5b\xde\x2a\x34\x6f\x2b\x46\x04\x1e\xd3\x8a\x6a\xd5\x18\x91\x39\x61\x06\xe8\xa7\xff\x40\x77\x32\xac\x52\x4b\x37\x6d\x3c\x2c\x62\x6c\xcb\x23\xea\x49\xd5\x2d\xe3\xc2\xfa\xd1\x2c\x4d\x24\x7c\xd9\x08\x3a\xa7\x15\x99\x12\xcf\xbf\x16\x43\x03\xdc\xc7\x97\xe0\xaa\x99\xe1\x61\x45\xe6\xc4\xf0\x38\xe9\x2b\x42\xef\xa8\x19\x67\x5c\x98\x80\x93\x61\x24\xb7\x37\x04\x30\xdb\x98\xc3\xea\x6a\xf6\x9a\x2c\xd6\x6b\x97\x4e\x6a\xb3\x48\x9f\x4c\x58\x6d\x0e\xd1\x48\x93\x55\xd7\x3e\xc4\xed\x56\x20\x4c\x83\x1e\x6d\x8c\x16\x5e\xef\xf8\xea\x0c\x4f\x78\xbb\x93\x31\xf6\xb0\x60\x64\xd0\xa8\x43\x57\x42\x09\x98\x5e\x62\xe6\x7c\x63\xbd\x1b\x1c\x61\xa3\xb6\xaa\xae\x49\x21\xc8\xa6\xe0\xdd\xb4\xa9\xbf\x58\x6a\xfb\x21\xb7\x4c\xe0\x7c\x87\x22\x2e\xf6\xc7\xac\xab\xd4\x10\xa4\x23\x77\x34\xdb\x4d\x5b\x55\x26\xba\xbf\x70\xcb\x09\xa3\x95\x41\xda\x08\x95\x2e\xb5\x3d\xe6\x36\xe9\xad\xb1\x24\xbe\x6b\x6e\x79\x1b\x2c\x65\x17\x4c\x9d\xd3\xb2\xc5\x15\x74\x0b\x3c\x90\x36\x73\x1b\x9b\x52\xa4\x56\x22\xd6\x91\x95\xf6\x37\xe4\xf5\xe9\x64\xd5\x89\x99\x93\xdf\x99\xc1\x2c\x28\x9b\x0e\xe1\x13\xdd\x4d\x3b\x9e\x21\x67\x43\x3c\xdc\x14\x38\xff\xac\xdc\x54\x6f\x79\x81\xab\xf7\xe0\xd7\xb9\x72\xbb\xcd\x09\x74\x89\x08\xe3\xed\x74\x06\xd3\x2b\x6a\xec\x68\x63\x2b\xa2\xa0\xba\xab\x4d\xfa\x8a\xf1\x47\xf9\x9d\x5d\x5a\xa7\x52\x58\xd1\xb7\xbf\xb3\x9f\xd0\x55\x95\xe2\x3d\x8a\x45\xd8\xe5\x08\x63\x5c\x06\x82\xdb\xce\x6c\x64\xcc\xad\x7f\xa9\x92\xc9\x84\x14\xca\x01\x41\x8c\x1b\x6f\x00\xb1\xc2\xb2\x35\xdc\xd0\xb8\xb8\xbd\xc3\xa2\x94\xa8\xe0\x75\x83\x15\x05\x15\x63\x11\x8b\x12\x71\xb9\x07\x26\xc7\x0d\xf2\x52\x8f\xd1\x05\x93\x0a\x83\x0c\x74\x14\x17\x7a\x85\xbb\xb4\x54\xc8\x5e\x35\x0c\x61\x33\x22\x08\xc2\x22\x0e\xad\x83\xab\x5a\x2b\x9b\x05\x11\x7a\xef\x57\x0b\x74\x27\x38\x8b\x4c\x0f\xdf\x50\x28\xf1\x39\x11\x73\x4a\xee\x4e\xac\x35\x3d\xd4\x83\x1b\x9a\x2d\x2c\x4f\xe0\x24\x9c\xfc\x0e\xfe\xdf\xf3\xf1\x4b\x2d\xb9\x87\x6a\xdc\xc4\xbb\xfd\xbe\x82\xd8\x0f\x65\xb4\xe3\xbd\x79\x52\x65\xe3\xad\x55\x26\x6c\x6d\x0a\xfa\x6f\x23\xc7\x03\xa5\x7d\x4c\x2a\xce\xa6\x41\x55\x0e\x6d\x9c\x6c\xaa\x15\x30\xaa\x7a\x86\x00\x00\x04\xa0\x58\x3b\x44\x21\xb9\x28\x81\xef\x88\x1a\x50\x76\xaf\x75\x28\x9f\x1c\x30\x2d\x61\xb6\xa9\x83\x9b\xf6\x5a\x87\x5c\x7d\xd9\x19\xb6\x26\x65\xd9\x31\xd8\x2b\xae\x8d\x11\xe2\x8b\x38\x1b\x63\xc1\x62\x38\x11\x2e\x0a\x2e\xca\xcd\x8f\x8a\x56\x75\x94\xa7\x8c\x32\x54\x0c\x86\x2c\x03\xf4\x5e\xad\xe4\x60\xb6\xdc\x4f\xb0\xc4\x45\xdd\x23\xd6\xb1\xde\xaa\x0d\x9b\x6f\x19\xfd\xa5\x25\x08\xd7\x5c\xeb\x7d\x55\x4a\xc2\xd6\xf2\x4a\xd6\x78\x01\x8a\x3d\x4c\xda\x5b\xc7\x81\xa8\x2d\x3b\xad\xbe\x0d\x00\xec\x49\x83\x42\x21\x03\xf4\xb6\x5f\x39\x64\xa0\xc7\x79\x6d\x58\xfb\xed\x47\x9b\xdb\x7a\x40\xae\xc3\x5b\x51\x90\x2b\x73\x11\xd5\x96\x20\x62\xcd\xb4\xea\xbd\xa7\xf0\x2d\x61\x26\x66\xa9\x97\x14\x92\xb5\x5a\x01\x3b\xad\x98\x91\xb2\xad\x36\x5f\xe2\xf1\x02\x4d\xb4\x3a\x6b\xb1\x2e\x33\x3a\x9d\x11\xa9\x9c\xe7\xf3\x04\x28\x0d\x4c\xda\x1c\x2e\x66\xbe\xbb\x20\x7f\x03\x32\xb4\x0e\x2c\x53\xe3\xfb\xcd\x09\x2e\xc0\x78\xb5\xac\xb8\xc6\x93\x20\xdb\xda\xdd\xfd\xcb\x9b\x49\x1e\xa3\xb7\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf1\x69\x03\x7a\x3c\x80\x11\xa1\x09\x96\x33\xca\x59\xea\x2e\x2b\x0c\xb8\xa0\x68\x85\x56\x5e\xaa\x05\xb0\x9b\x97\xa5\xd6\x0f\x05\x12\xa4\xe6\xf3\xcd\xfd\xb6\xc9\x80\x85\x34\xce\x50\x3d\xc9\xc3\xc0\xde\x78\x26\x46\xc4\xa9\x67\x3e\xd4\xfb\xa5\x58\xba\x2d\xcc\x06\xd4\xda\xbf\xab\xcf\x2a\x5a\xd6\xa5\x39\x46\xdc\x1c\x5b\x0a\x2d\x47\x24\x23\xa6\x98\x07\x58\x4c\xb7\x96\x1f\x7c\x2a\xa6\xad\x11\x97\xf6\x7e\x87\x18\x67\xc3\x69\xbc\x95\xb0\x02\x29\x3a\x90\xe8\xec\xdd\xeb\x90\x8e\x39\x2c\xa2\xed\xc8\xba\xe3\x9a\xfb\x98\x17\x8c\x08\x2a\x86\x47\x38\x46\xf5\xa8\xf0\x92\x45\x8b\xf9\x6a\xee\xbc\x5d\xbe\x83\xce\x49\x43\x59\xd3\x2a\xab\x7c\x07\x55\x37\x8b\x19\x66\x53\xad\xed\xbc\xe6\xad\x1e\xd8\xef\x7f\x0f\x83\x10\xa4\x6c\x8b\xc8\x44\x12\xe3\x4d\x33\x27\xf7\xf7\x0e\xd2\x6d\xcb\xfb\xc2\xa5\x24\x0b\xdc\xb8\xa9\x09\x67\x4f\x2e\x98\xc2\xf7\xdf\x22\x7a\x4c\x8e\xd1\x8b\xdf\x07\x5f\xbd\x80\x1e\x47\xf5\xa6\x11\x5c\x0f\xc5\x52\xa4\xc2\xe8\x2b\xaa\x20\x95\xfc\x45\xd8\xc2\x31\x3a\xd7\xfd\x82\x0c\x29\xbf\xb6\x01\xeb\xe5\xb8\x5b\xd9\x01\x12\x64\x8a\x45\x59\x91\x48\x96\x31\x3e\xf1\xc9\x3c\x86\x46\xde\xee\x2a\x72\x4f\xa5\x92\x36\x2c\x72\x9c\x07\xe6\xf6\xa5\x77\x87\xc2\xf2\x56\xdf\x14\x5a\xf8\x0d\x4b\xac\xf0\x30\x90\xba\x27\xc6\x2b\x3a\x2c\x78\x5d\x63\x56\x0e\xb1\x3d\xc7\xdd\xa5\x72\xf2\x3b\x5b\x1c\x61\x88\xfd\xaf\x28\x1b\xe2\xa1\x9c\x91\xa8\x95\xdb\x63\x4c\xe0\xb1\x73\xb9\x2d\x81\x7d\xee\xe5\xb3\x59\x8a\x63\x74\xc9\x55\x67\x4e\xf9\xdb\x16\x56\x39\xa7\x08\x3f\xbf\xbc\xb9\xfa\xe7\xe8\xfd\xc5\xe5\xcd\x5e\x92\xef\x25\x39\x3c\x7b\x49\xbe\x97\xe4\x11\x0d\xef\x8a\x24\x27\x6c\xbe\x2d\x29\xee\x1c\x6f\xeb\xf2\x6a\x6c\x40\x4f\xad\x00\xf4\xb7\x0e\xcd\xdf\x36\xbd\xce\x39\x9b\x7f\xc4\xda\xe4\xb7\xf8\x14\x8b\x7d\x5e\x93\x9a\x64\x7f\x60\xdc\x11\x67\xcf\x9e\x5f\x67\x8b\xec\x38\x19\xd9\x21\xc2\x50\xd4\xba\x55\xeb\x4a\x7b\x62\x74\xf6\xf3\xc5\xeb\xf3\xcb\x9b\x8b\xef\x2f\xce\xaf\xb6\x9a\x38\x08\xfe\xb4\x5d\x48\x19\xdc\x44\x3f\x4a\x68\xa6\xd3\xac\x1a\x41\xe6\x94\xb7\xb2\x5a\x20\x07\xc1\x58\x2f\xae\x56\xa9\x8a\x12\x33\xb0\x0d\x1e\x87\x16\xeb\xb7\x89\x5c\xd2\xed\xd6\xe9\x69\x09\xcd\x6f\x59\xc3\xb3\x9d\xc8\xa1\xe7\x25\xb4\xbf\x46\x43\xfc\x72\x6d\x2f\xa1\xdd\x28\x3d\xf1\x21\x9d\x2f\xa1\x1f\x7d\x6d\x31\xe1\x45\xfd\x14\xd5\xed\x4b\xb2\xef\x05\xaf\x33\x49\xb3\x6b\x13\xc3\x70\xa8\xc5\x75\x47\xf5\xc0\x56\x0c\xec\xe9\xdb\xd6\x72\xec\x4a\x09\x6a\xfb\x15\xe2\xf9\x89\xb3\x93\x54\x6a\x38\x4f\xb5\x5f\x64\x13\x2c\xdf\xe1\xe6\xef\x64\x71\x45\x12\x8b\xa6\xf6\xe7\x9b\x54\xa4\xd0\x3a\x0f\xba\x25\x0b\xc3\xa8\x74\xe6\x1a\x4b\xab\x1b\x9b\x65\xfa\x50\x96\x7a\xcd\xe6\x19\xea\x21\x26\xbd\x23\xcf\x62\xea\xe7\x96\x24\xf0\x10\xb9\x67\x89\x25\x8b\xc0\x12\x82\x9a\xaf\xd7\x34\x6d\xf5\x50\xae\x0a\xcd\xe6\x49\x53\xf8\xdc\x93\xb3\x5a\xb3\x79\xf2\x01\x99\xfa\xcf\x76\x61\x4d\xfd\x67\xab\x20\xa7\xe5\xae\xe4\x83\x3c\xf5\x9f\x5d\x02\x40\xf5\x9f\x8c\xa7\x28\x05\x1c\xb5\xfc\x38\xec\x6f\xe6\x53\x69\x40\xde\x8b\x9e\xea\xe4\x2f\x14\x64\x78\xfa\x41\x4e\xb9\x24\x29\x6b\x05\x64\x9a\xe6\x34\xae\x38\xf3\xe4\x83\x91\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x46\x58\xf9\xa2\xf5\xe5\xb7\x8e\x3c\x4b\xa2\x9a\x28\x5c\x62\x85\x8f\xf5\x81\x18\xf4\xff\x69\x33\x64\xfe\xc7\x7f\x58\xe1\x31\xa9\xe4\x8f\x07\xff\xf9\xf7\xf3\x7f\xfe\x7f\x07\x3f\xfd\x4f\xf8\x1d\xa8\x6b\x06\x85\x1d\xfc\x20\x71\x08\x50\xee\x8b\xf1\x92\x5c\x42\xef\xe0\x9f\xd6\xd2\x3b\x35\x40\x1c\xfb\x05\x94\x5c\x39\x36\xd9\x9f\xfe\x9f\x0d\x2f\x97\xff\x95\x50\xd1\x1a\xed\xa6\xde\x03\x6b\x9b\xc0\xa4\x6c\x9e\x7c\xda\x0f\x6e\xe8\x47\x22\x64\x12\xf9\xae\x7b\xfa\x54\xd9\xe6\xad\x6e\x1b\xcb\x62\x46\x6a\x0c\xff\xf9\xbd\x9b\x02\x7d\x1f\xfb\xa2\x58\x0c\x6a\xdb\xe8\x3b\x70\xd0\x63\x23\x7b\x31\x7f\x95\x64\x71\x9a\x27\xa3\xe4\xf7\x2b\x98\x79\xc2\x60\x46\xec\x6c\x19\x09\xe0\xf5\x47\x9f\xf6\xe1\x72\x2f\xd0\xe9\xe8\x02\xcd\xcd\x0c\xef\xd0\xe4\x3c\x96\xb8\x76\x78\xba\xef\x77\x5a\x6c\x7b\xd4\xdf\x72\x89\x8a\x6f\x4d\x3a\x9a\xfb\xde\x56\x40\x92\xbe\xdc\x3a\xd9\x9c\x4d\x65\xf9\x39\x34\xaf\x3c\x2e\x9a\x76\x60\x5f\x7f\x5c\x93\x9a\x8b\x85\xff\xa7\x27\xf4\x1f\x4a\xc5\x05\x9e\x02\x0d\xad\x69\xdc\xfc\x99\xff\x97\xf9\xc3\x5e\xf7\x56\xff\xda\x38\x24\x3b\xcc\x9e\xe7\x77\xfc\xea\x44\xb6\x5b\xb7\x1d\x91\xd8\x45\x6a\x05\xd5\xfe\xd3\x3b\x0d\x07\x3e\x94\x62\xcc\x44\x3f\x8b\xe0\x05\xb2\x75\x26\x06\x5d\xb2\x1a\xb8\x2a\xd9\x1c\xcd\xb1\x90\x07\xbb\x23\x87\x10\x2a\xe9\x9c\x4a\x9e\x40\x05\xe8\x5f\xb4\xaa\x51\xbb\xb4\x49\x5b\xd1\xcc\xa4\x47\xf9\xb8\xc7\x7d\x03\x65\x85\xfd\x61\x5f\xba\xcd\x5e\xa5\x1a\x0b\x08\x35\x58\x29\x22\xd8\xb7\xe8\xbf\x0f\xff\xf5\xcd\xaf\xc3\xa3\xef\x0e\x0f\x7f\x7c\x39\xfc\xdb\x4f\xdf\x1c\xfe\xeb\x18\xfe\xe3\x3f\x8e\xbe\x3b\xfa\xd5\xfd\xe3\x9b\xa3\xa3\xc3\xc3\x1f\xff\xfe\xee\xcd\xcd\xe8\xfc\x27\x7a\xf4\xeb\x8f\xac\xad\x6f\xcd\xbf\x7e\x3d\xfc\x91\x9c\xff\xf4\x85\x2f\x39\x3a\xfa\xee\xf7\xc9\x5d\xc7\x6c\xf1\x3e\x51\x7a\x9b\x67\x98\xa5\x80\xfe\xba\x37\x66\xb2\x0e\x7b\x57\x21\x65\x6a\xc8\xc5\xd0\xbc\xfa\x5b\xc8\xc4\x4f\x6c\xc0\x6d\xaf\xdc\xe7\xff\xca\x49\xcd\x00\xc3\xee\xb4\x90\x1d\x3a\xe0\x8f\xa5\x68\x98\xdc\xcf\xa7\xf0\xec\x9a\x96\x82\xfa\x4c\x07\xb2\x4b\x7b\xfc\xda\x6e\xd0\xdf\x82\xb3\xd7\xd9\x39\x66\x5d\x3b\xd5\x7d\x22\x78\x6d\xab\xb6\x98\xc8\xf7\x1c\x57\xb4\x74\xbf\xbb\x25\x09\x51\x11\xf7\xec\x9d\xc3\xd1\xcf\xde\x39\xfc\x40\x57\xf6\xce\xe1\xa4\xe7\x59\x3a\x87\x0d\x23\xc5\x6f\xd3\x33\x9c\x9f\x69\x39\x12\xd3\x95\x93\x64\x99\xb0\x79\x2c\x1e\x20\x27\x08\xd2\xb9\x3d\xc2\x1a\xdc\x5f\x86\x34\x8a\xc7\xb7\xeb\x95\xf3\xb0\xa6\x0e\x34\x6f\x54\xda\x7a\x3d\x0c\x0d\x9d\x56\x15\xa2\xcc\x5c\xd0\xfa\x05\x51\xad\x7b\x2a\x2d\x62\xeb\x5d\x58\x0a\xd7\xb9\x1e\xaa\xa7\xc1\x0a\xf0\xf7\xd2\x24\x40\x53\x36\x3d\x36\x6c\x52\x46\x4d\xb4\x10\x15\xca\x50\xdd\x56\x8a\x36\x91\x78\x17\x6f\x86\x1a\xe4\x8c\xbe\x28\xb0\x94\xbc\xa0\xd8\x17\xf8\xf6\x25\xc8\xed\xf4\xc0\x08\x14\xbe\x05\x88\x58\x41\x4a\xc2\x36\x67\xe2\x30\xcf\x47\xdd\x5e\xb7\x0e\xe3\x85\x9e\x89\x73\x36\xb7\xf7\x17\x2a\x5b\x03\x93\x36\x2a\x54\xbe\x76\xbf\x2e\x4c\xac\x3e\xc3\x16\x8c\x13\x40\x63\x41\xdb\xf4\x0e\x47\x0c\x88\x62\x3e\xe9\x22\x7c\x80\x6e\xb2\x24\x43\xdb\xc1\xc5\xa6\xab\xed\x1e\x6c\x93\x64\x8f\xad\xe8\xeb\x5d\x14\xb4\xaf\xa7\x7f\x0d\xf8\xa4\x74\x0d\x3e\xaf\xf6\xfe\x18\x9a\xfb\xae\x68\xed\x3b\xa2\xb1\x3f\x8e\xb6\xbe\x9b\x9a\x7a\x36\x2d\x3d\x8f\x86\x9e\x47\x3b\xdf\x00\xb6\x91\x53\x23\xcf\xa3\x8d\x3f\x86\x2f\xae\x11\x64\x42\xef\x33\x49\x7c\xc7\xa5\x8a\x14\xb9\x07\xcf\x4c\x23\x48\x43\x58\xe9\x32\xe2\x1d\xf5\x21\x50\x77\x3c\x9b\xbc\x05\xe3\x40\xca\x7b\x2f\x5e\xaf\x73\x5e\xed\x2f\x45\xb4\xbf\x14\x37\x78\xf6\x97\xe2\xfe\x52\x7c\x92\x4b\xd1\x4a\xab\xaf\xff\x46\xcc\x5d\x44\xa3\xc6\xd3\xad\xd1\x55\x9e\xf5\x79\x07\x40\x32\x3f\x09\xcf\xe2\x0a\xf9\x6b\xa4\x6b\x29\x14\xb2\x1e\x07\xa1\xb8\x11\x7b\x86\x18\x4c\x20\xc3\x45\x6d\xac\x57\x54\x63\x86\xa7\xc0\x59\xa6\x7f\xe7\x2a\x7f\x71\x81\xb4\x74\x10\x34\xb2\xc0\xec\x12\x81\x03\x38\x8a\x1c\x09\x15\x7c\x29\x78\x55\x11\x21\x51\x45\x6f\x09\x7a\x4d\x9a\x8a\x2f\x6a\x9b\x53\x5b\xa2\x6b\x85\x15\x99\xb4\xd5\x35\x51\x09\xf5\x68\x22\x25\x8e\xa7\x5f\x36\x54\x79\xdb\xda\x8a\xc0\xc4\x0c\xcc\xc4\xa8\x31\x9c\x7d\x51\xaf\x79\xcf\xe0\x2a\x3f\xad\xee\xf0\x42\x0e\xd0\x25\x99\x13\x31\x40\x17\x93\x4b\xae\x46\xc6\x57\x13\xf7\xde\x30\xb3\xcc\xbc\x1c\xd1\x09\xfa\xb6\xc2\x8a\x48\x85\x14\x9e\x82\xe7\xb0\x63\x63\xe6\xa2\xd7\x68\x57\x4c\x77\x8b\x2e\xb4\x0c\x14\xcd\xd0\xba\x27\x68\x7e\x72\x12\xd4\xca\x91\x1e\x6e\x8d\xc0\xcb\x70\x2d\x1a\xee\x35\x43\x1d\xe8\xc5\x89\x21\x50\x77\xa5\x42\xc1\x73\x4a\x19\x12\x44\x36\x9c\x49\xd2\xe3\xda\xec\x06\x62\x3c\xd1\x91\xc8\xea\x8c\x8e\xd5\x68\xc3\x20\xd5\x24\x68\xb8\x54\x40\x49\x19\xab\x9f\xe4\xb2\x05\x46\xae\x23\xc0\x52\x8a\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x13\x45\x04\xc2\xfd\x58\x81\x2d\x26\x71\x6c\xaa\xe1\xb8\x02\xf4\x8e\xf7\x34\xde\x58\x5b\x8e\x49\x28\x22\x6a\xca\xb0\x2d\xb8\xed\xc8\x4d\x43\x96\xd4\x25\xde\xd3\x24\x21\xaa\x9f\xf7\xa0\xd9\x05\xdb\x7b\x19\x47\x8b\xc6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\x5c\xc0\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x7f\x0e\xfd\x01\x1b\xea\x5e\xc9\x93\xdf\x75\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x3d\x29\x52\xf4\xf9\x7e\x4c\xe3\x9e\x14\xfe\xea\x92\xb0\xc3\x81\xf5\x46\xef\x28\xcb\x74\x95\x29\x14\x68\x9e\x4c\x90\xa8\x5c\x30\xa4\x04\x86\xb1\xf0\xc9\x8d\xb2\x39\xb3\x8b\x40\xa5\x9d\x79\xf3\xcf\x8a\x32\xd2\x5f\x18\x4f\xd6\xef\x17\xc7\x44\x17\x57\xaa\xe8\xba\xdc\xf1\xe4\xae\xb9\xbe\xe8\xbe\x41\x19\x99\xc3\x83\x93\x83\xa3\x95\x3d\x72\x60\x0a\x5c\x9a\x6b\xf1\xd8\xf2\x9c\xf9\x41\x49\x5a\x37\x50\xd5\x99\x14\x07\xae\x08\x7d\x72\xcf\xf4\x6d\x68\x8a\x26\xc1\xac\x58\x5e\xb6\x01\x92\x1c\x29\x81\x4b\x6a\x0d\x04\xf8\x54\xff\x48\x89\xd6\x5e\xe8\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\xc1\xf4\x1d\xa3\x1b\xa8\x84\x91\x8e\xb4\x75\x1d\x59\xf0\x16\xea\x2d\x99\x25\x6c\x2a\x5a\x50\x55\x2d\xe0\xba\x41\xbc\x35\x95\xa1\xb4\x6a\x91\xc0\x27\x17\x3e\xe7\xf7\x54\xd9\x14\x2e\x2d\xbf\x5f\x2e\x15\xfa\xaf\xe8\x9c\x9c\xcc\x08\xae\xd4\xcc\x24\x18\x30\xce\x86\xff\x26\x82\x03\xe7\x1c\xb3\xdf\xa4\x76\x23\x2d\x72\x1b\x3e\x09\x51\xdc\xd5\x0e\x65\xc1\x16\x65\x76\x06\xb8\x47\x5f\x7b\x6f\x48\xb4\x4a\x84\x56\xca\xa0\xde\xdc\x8c\xde\x10\x15\x4a\x79\x06\x1f\xa2\x37\xe7\x37\x2e\xad\x04\x9c\xf1\x44\x4c\xb8\xa8\x77\x40\xbc\xe7\xc1\xbb\x0e\xa1\x16\xe1\x0e\xdc\x32\x33\x2e\x93\x96\x13\x3d\xc2\x15\x63\x2a\x47\xe2\xda\xd9\x26\x8c\x14\x7a\x13\xf4\x73\x24\x1c\x75\xff\xc5\xe8\x18\xfd\x93\xb7\x40\x1b\x8f\xc7\xd5\xc2\xb3\x4e\x4b\x92\x06\x6c\xd6\xcf\x0b\xdd\x95\x17\xfa\x06\xd1\x3b\xff\x07\x82\x4b\x22\x24\x08\x68\x82\x13\x53\x98\x32\x1e\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x66\x87\xdd\xe7\xa3\xb3\x87\xf3\xd8\x1c\x57\x4b\x4a\x24\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x48\x2f\x33\xef\xf6\xf3\xb1\x51\x53\xc3\x69\xb3\x01\x0e\x43\x77\x63\x65\x9b\xa9\x70\x90\xe9\xba\xc8\x00\xe1\x47\x19\x61\xfc\x28\x8d\xa9\x6e\xf9\x45\x10\xec\x49\x7e\x53\xbe\xcc\x00\x94\x0d\xfd\x8e\x1e\x05\x01\x8f\x2c\xb0\xd1\x6e\x3e\xe3\x83\x8e\xf7\x9e\xaf\x7b\x39\xed\x8a\xb8\x15\x98\x71\x46\x0b\x5c\xd1\x7f\x93\x12\xb5\x0d\x67\x36\xdd\x0d\x34\xdb\x02\x4b\x32\x84\xe8\x38\x33\xe2\x5c\x06\x9c\x69\x5a\x3a\x28\xce\x41\xdd\xf3\x15\xbd\x4c\xaf\xf3\x74\x35\x2b\x50\x3b\x99\x00\x30\x7c\x56\x02\xea\xbd\xc5\xca\xb3\xe3\xd1\xb3\x50\x27\x91\xc9\x53\x4c\xce\x91\x5f\xcd\x90\x37\x45\x5d\x80\x15\xce\x5c\x57\x20\x78\x4d\x7d\xcf\x9d\xb9\xb7\xb5\x0a\xb8\x6b\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4c\x44\x47\x2f\x22\xd4\xea\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xa6\x04\xbd\xd2\x2d\xff\xe5\xcf\x7f\xfe\xe3\x9f\x33\xb4\xa3\x87\xe7\x81\xdd\x0c\x5d\x9c\x5e\x9e\xfe\x7c\xfd\xf1\x0c\x48\x0b\x53\x5f\x9f\x29\x6f\x35\x77\xd6\x6a\xd6\x9c\xd5\x47\xcd\x58\x05\xfa\x8f\x64\x29\x9b\xfb\x48\x5c\x43\xaf\xc2\xf2\xa9\xd6\x26\x09\xea\xa1\xc5\x94\x27\x5e\x7d\xc2\x60\x9e\x16\x58\x3b\x21\xa9\x64\x45\x48\x93\xcd\xe2\xbf\xd6\x6f\xeb\x71\x37\xa3\xb2\x15\xb6\x70\xa8\x0b\x5e\x75\xbe\x7c\x1b\xb4\x82\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x82\x06\x78\xdb\x5f\xfe\x14\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x32\x9d\xd3\x2b\x73\xf9\xfe\xa6\x63\x63\x81\xec\xa3\xae\x74\xdf\x0f\x36\x5a\x88\x59\x89\x6e\x49\x93\x66\x5d\x6a\x81\xe9\x60\x84\x7d\x14\x21\xf8\xde\x85\x65\x7f\x35\x19\xcf\x46\x10\x38\xf4\x9f\xd1\x88\xd3\x78\xa4\x83\xe0\x3c\x04\x02\xad\x11\x32\xc1\xb4\x42\x18\xbc\xf2\x8a\xd6\xc4\xa4\x5c\x81\xb3\xbf\x43\x4b\x7c\x45\x02\xe7\x6b\xf5\x36\x1e\x38\xd8\xf6\xb7\x1b\x7b\x0d\x53\x89\x2a\xbe\x6e\x33\xc0\xca\x6c\x81\xc2\x92\xff\x7b\x33\xe0\x4b\x9e\xbd\x19\x10\x69\x06\x34\x82\x5c\x2b\x1e\xad\x6b\x66\x03\xdc\x98\x6e\x3c\x00\xb7\x19\x93\x09\x17\x64\x19\x6f\x13\xe0\x60\x2c\x72\x3e\x01\x19\x7c\x3a\xba\xf0\xb1\x2f\xde\xc3\xba\x98\xf4\x60\xd9\x16\x33\x17\x26\x65\x44\xca\x13\x19\x96\xce\x85\xab\xad\x15\x24\x1e\xe5\xd3\x08\x42\x6a\x98\xc7\x41\x47\xf0\xa3\x87\x4b\x98\xf9\x90\xa8\xc2\xc4\xcd\x1d\xac\xc8\xf2\xb7\xbb\xe9\x9a\x24\x85\xf3\xbb\x89\x2d\x04\x96\x33\x02\x29\xaa\xe4\x9e\x2a\x69\x1a\x1d\x01\x0d\x8e\x9b\x71\xad\x2f\x4c\x05\x2e\x08\x6a\x88\xa0\x5c\xab\x18\x2d\x53\x25\xbf\x63\x68\x4c\xa6\x94\x49\xb7\x62\x29\x5d\x72\x5b\x02\x90\x44\x54\xfa\x42\x6b\xc7\xe8\xaa\x57\x7f\xc0\x12\x7e\x15\xbc\x93\x99\x76\x8a\x06\x99\xa6\x04\x94\x17\xd8\x06\x2d\xae\xaa\x45\xb7\xf1\x5c\xfa\xba\x7a\x78\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\x85\x49\xd4\x9e\x50\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\x83\x3b\x83\x4a\x24\x08\x2e\x66\x29\x9a\xdd\x1e\x03\xf6\xb9\x67\x8f\x01\xdb\x63\xc0\xf6\x18\xb0\xd5\x67\x8f\x01\xeb\x3f\x7b\x0c\xd8\xc3\x1d\xda\xe5\xa0\xdd\x1e\x03\xb6\xf7\xca\xac\x3e\x7b\x0c\x58\xd4\xb3\xc7\x80\x7d\xf6\xd9\x39\x11\xbd\xc7\x80\x7d\xc1\xb3\xc7\x80\x7d\xe1\xb3\xc7\x80\xed\x31\x60\x7b\x0c\xd8\x1e\x03\x96\xf0\xec\x31\x60\x9b\x0f\x6f\x1f\xfc\x89\x7f\xf6\x18\xb0\x3d\x06\x6c\xc3\x67\x8f\x01\x5b\x7a\xf6\x18\xb0\x3d\x06\xec\x53\xcf\x1e\x03\xb6\xc7\x80\xd9\x67\xef\x6d\x5c\x79\xf6\x18\xb0\x35\xcf\x1e\x03\xb6\x59\x3b\x7b\x33\x20\xed\x65\x8f\x62\x06\x48\xc5\x9b\x6b\x3a\x4d\xe0\x85\xcc\x75\x0c\xae\x7d\x4f\x2c\x69\xa4\x44\x77\x33\x5a\xcc\x90\x34\x1f\x3a\x3f\x96\xb4\x94\x7d\x21\x22\x2c\xb8\x49\xc6\x44\x9b\x08\x7a\x58\x4d\xca\x6d\x72\x31\x81\x00\x72\xc0\xe4\xa6\x4f\x85\xa3\x09\xa4\xbd\xea\x09\x7d\xf5\xd9\xdd\x6e\x94\x69\xdb\x25\xbe\x07\xc1\x7c\x14\x98\x99\x62\xa5\x30\x7c\x28\x6e\x88\x46\xbc\x94\xae\x60\x03\xe3\x6c\x68\xc8\x5a\x8f\xa1\xba\x33\x97\xc7\x09\xde\xe0\x44\x66\x36\x83\x91\x1b\x09\x3e\xde\x1a\x3b\xdb\x08\xf0\x47\xb4\xb0\x00\x3d\x3e\xe9\x31\xae\x99\x0e\x46\x32\xad\xf5\x81\x61\x50\x50\xc4\x51\x70\x51\x2b\xb0\x3d\x28\x70\x9b\x6c\x6e\x1b\x23\xa7\x1c\x4b\xa5\x3c\x69\xb8\xf9\x9f\x0e\x37\x15\x00\xa6\xa2\xe3\x28\x5b\xa6\x97\x4b\x41\x49\x6d\x0d\x21\xb5\x23\x08\xb3\x0c\xa8\xa8\x9c\xba\xd2\x8e\xa2\xa1\x76\x13\x09\xb5\x8b\x28\xa8\x6d\x20\xa0\xb6\x8e\x7e\xca\x13\x56\xcf\x10\x52\xcf\xa4\x91\x3e\x42\x78\xca\x02\xe9\x6f\x66\x82\xc8\x19\xaf\xa2\x05\x4e\x2e\x61\xf3\x8e\x32\x5a\xb7\xb5\x3e\xbb\x52\xcb\x14\x3a\xf7\x60\x7f\xe9\x44\x86\xbd\xee\x0d\xe2\x40\xff\x90\x96\x04\x2a\x73\x63\x5a\xe9\xad\x05\x64\xa1\x33\x3c\x07\xa5\xb4\x2d\x0a\x42\xca\x14\xb5\x34\xf4\x56\xff\xf1\xd8\xf7\xd0\x70\xf4\x53\x89\x5e\xa5\x5d\x35\x69\x76\x4f\xe0\xce\xfb\xe3\x1f\xa2\xde\x31\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\xca\x42\x69\xb6\x77\x33\xa7\xbb\x99\x92\x5c\x4c\x39\x14\x83\x54\x2f\x4a\x3f\x86\xcc\x85\x5a\x0a\x81\x4e\x61\x15\x89\x98\xd3\x82\x1c\x3f\x81\xa3\x22\x97\xf1\x9f\x7e\x10\x10\x84\x09\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xf8\x08\x43\xe0\xa3\xb2\x3d\x05\xd0\x68\x85\x0b\xbf\x36\xd3\xf5\x87\x2e\xa9\x1b\x87\x92\x10\x6f\xd0\x4c\xa9\x9a\xb5\xe3\xe3\x82\xd7\x27\x5a\x74\x98\xff\x19\x57\x7c\x7c\x52\x63\xa9\x88\xd0\x36\x8e\xbd\xd6\x87\x85\xee\x01\x65\xd3\xe3\xba\x3c\x3a\xfe\x3f\x49\x7d\xb8\xb0\xbe\x72\x9b\x86\xf5\x80\x93\x60\x4c\xb4\xdc\xe7\x62\xc9\x5b\xa0\x27\x25\x7d\x93\x26\xdf\xdf\xa9\x45\x45\x12\x61\xc9\x5b\x81\x24\xef\xa5\x36\xca\x10\x10\xc8\x29\x54\x76\x03\x76\xfc\x68\x90\xe3\x2c\x67\x35\x13\xd4\x78\x87\x60\xc6\x3b\x63\x0b\xed\x0a\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xd1\xa0\xc3\xcf\x02\x36\x9c\x31\x3e\x96\x09\x2e\xfc\x14\x50\xe1\xdd\xf5\xc1\xa0\x0c\xf0\xe0\xa7\x83\x06\x67\x99\xc7\xac\x56\x6c\xa2\x48\xd8\x02\x14\xf8\x29\xe2\xff\x8f\x16\xfb\xcf\x10\xf7\xcf\x19\xf3\xcf\x16\xef\x7f\x34\xc8\x6f\x3a\xdc\x37\xab\x4f\xe1\x49\x60\xbe\x39\x21\xbe\xc9\xeb\x4b\x19\x55\x14\x57\xaf\x49\x85\x17\xd7\x69\x40\xd0\x5c\x2b\x71\xb9\x02\x16\x35\x6e\xeb\x3e\xae\x61\x86\x25\x72\xa1\x6e\x4b\xf1\xe2\x62\xe9\x56\x05\x46\x18\x22\xce\x7a\x7c\xd1\x51\x6b\xb4\x7b\x91\x6b\xb4\x33\xee\x71\xc3\xab\xb2\x23\xbb\xe6\x07\x7e\x87\xf8\x44\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\x77\x3a\xf2\x65\xfb\xf8\xf9\xd0\x97\xfd\xe1\xa4\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\xd5\x55\x7f\x7f\x05\xfd\xf1\xa2\x08\xb3\x12\x59\x7e\xae\xaf\x6f\x9f\x24\x43\xdd\xfb\xc6\x8d\xc7\xa6\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\xff\x0a\x14\xd0\xbd\xd3\x75\x67\x9c\xae\x5b\x42\x60\x7f\x7d\xd6\xd6\xd3\x23\xae\xf7\xd6\xd6\x6f\xc5\xda\x0a\x68\xf1\xde\x08\x5c\x90\xd1\x2e\x29\x6f\x4e\x80\x74\x89\x80\x9d\x0e\xe7\xc5\x05\x23\xc4\x24\x8e\x75\xa4\x87\xc0\xef\x37\x69\xab\x6a\x61\x7c\x88\x3d\x06\xcc\xf8\xad\x75\x33\x23\x2b\xd4\x81\x10\x4a\x5d\xd3\xbb\xce\x36\x69\x04\xb7\x1a\x89\x68\x19\xd3\x2a\x86\x3d\x4e\xba\xf3\xda\x16\x91\x84\xc5\xbb\xd3\x71\x8f\xd8\xd0\x82\xd0\x01\xe8\x39\x23\xa8\xcb\x5f\xea\x77\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x92\x05\x69\xdf\xd2\xaa\xb2\xaf\x49\x00\x85\x13\x65\x42\xcf\x46\xa3\xa9\x38\x9b\xc2\x64\x60\xd3\x11\x72\xdf\x90\x42\xb7\x59\x54\x04\xb3\xb6\x31\xfd\xd4\xfa\xd1\x82\xb7\xc2\xf5\x33\x09\x15\x1f\xb4\x4e\x25\x62\xb4\x1a\xb8\x29\xef\x53\x60\xae\xee\xf9\xce\xa5\x2c\x49\x69\xd9\x2b\xef\xa8\x24\x03\x78\x67\x74\x9f\x4c\x5f\x5c\xd5\x7e\xb3\x6f\xcc\x67\x8d\xe0\x73\x5a\x76\x18\x7d\xbd\x2d\x00\x1f\x1f\xdd\xd6\x47\x78\xaf\x13\xad\x8c\xb3\x21\x23\x53\x0c\xea\xb1\x15\x68\x06\xd1\x69\xda\x37\xf8\x41\x56\xd2\x02\x2b\x22\x21\x27\xa1\x47\x6d\x3b\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x99\x85\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x39\xd0\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\xf8\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\x78\xd5\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\x73\x27\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\x79\xc0\x4f\xe0\xe0\x56\x26\x83\xfa\xf5\xe5\xf5\xcf\x6f\x4f\xff\xeb\xfc\x6d\xdc\xc2\x9f\xe3\x62\x16\x72\x8b\x33\x84\xe1\xa2\x00\x21\x3f\xc3\x73\x82\x30\x6a\x19\xfd\xa5\xb5\x90\xb7\x43\xdf\x5e\xa4\x58\xcd\x92\xde\x93\xa4\xf8\xea\x5b\x22\x4a\x72\xe4\x58\xd3\xb7\x54\x02\x51\x35\x74\xc2\x02\xff\xb9\x24\x68\x22\x78\xbd\x64\x68\xa1\x4b\x0f\xae\x5b\xe8\x1b\x06\x1b\xd3\x6c\x46\x44\x9c\x46\xfe\xfa\xfd\xf9\x35\xe4\xe0\x37\xc2\x10\xbb\x43\x72\x01\xbc\x13\x5a\x37\xa9\x83\xa6\x3f\xe5\x31\x3a\x65\x0b\xf3\xa5\x11\x66\x91\x2a\x4a\x45\xa5\x22\xa0\x9c\x5a\x43\xd2\xc1\x03\x5f\xbc\x3c\x86\xff\x7b\x81\x70\x59\x0a\x6d\x69\xfa\x1c\x8d\x62\x39\xcb\x2c\xaa\x65\x63\xbf\xd2\x71\x15\x4c\x2e\x23\x0a\xd2\x38\xa2\x5e\xf8\x8e\x97\x76\x25\x40\x09\x04\xfc\x8e\xd1\x6e\xa5\x12\x58\x91\x29\x2d\x50\x4d\xc4\x94\xa0\x06\xab\x62\x86\x6a\xbc\x40\x05\x17\xa2\x6d\x0c\xc5\x48\x89\x15\x8e\x6b\xf9\x7b\x2e\x50\xed\xa4\xb3\x96\x66\x5a\x25\xbf\x5e\x0f\x04\xed\x44\x76\xf8\x9f\x54\xca\x96\xc8\x93\x57\x2f\xff\xfa\x87\x3f\x47\x9a\xd7\x19\x0f\x6e\x2c\xf4\x29\x01\xf2\xd4\x87\x7f\xb9\x0d\x06\xa0\xeb\x1e\x33\x8c\xdd\x21\x66\xe7\x83\x34\x94\x94\x4d\xab\x64\x07\x48\xb2\x1b\x30\xd5\x09\x38\xec\x46\x30\x8a\xf5\x05\xa6\x7b\x02\x7b\x7d\x88\x77\xa5\xe4\xf3\x82\x75\x1a\x9c\xf3\x7b\x59\x81\xcc\x59\x60\xd8\x5d\x8c\x9c\x94\x4a\xf1\x1f\x81\x35\xe1\x1d\x53\x86\x7d\xc4\x34\x6b\xf0\x0e\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x5e\xb0\xbf\xc4\x37\x95\xc7\xc7\x94\x03\xc6\x3f\xe3\x52\x5d\x8c\x32\x2d\xf4\x3f\xf4\x7d\xa5\xdf\xa8\xd7\x43\x71\x34\xa6\xd6\x1d\x41\xee\x15\x11\xda\x0c\xb4\x6b\x98\x3a\x73\x49\x1e\x35\xdd\xc1\xe7\xb2\xbb\x53\xc1\x05\x17\x93\x3e\xfa\xff\x89\xf6\x37\x34\xfc\x03\x97\xea\xd2\x4a\xeb\x90\x42\x27\xec\x47\x0d\x17\x71\x4f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xae\xc6\x06\x2a\x39\x24\x40\x98\x1c\xce\x19\x4d\x10\x0e\xbb\x73\x62\xd3\x70\xa2\xf9\xb6\xee\xa7\xb6\xd6\x92\x4f\x1f\x3c\x32\xd6\x48\x09\xca\xd2\x34\xbc\x3c\x06\xfb\x26\xa1\x17\x7a\x36\xca\x40\x19\xf8\x84\x69\x74\x6c\xec\x35\x1f\x1d\x86\x03\xa7\x25\x56\x81\x59\xac\x0e\x6b\x1e\x41\x26\x44\x08\x93\x27\x3c\x5e\xb8\x74\xa3\xe4\xdd\x96\x24\xe5\x1a\xc1\x15\x2f\x78\x34\x6d\x4a\xce\xad\x32\xb2\x7d\x81\xb9\x87\x58\xad\x8f\x8e\x7f\x78\x3d\x1a\xa0\x9b\xb3\xd1\x00\x71\x81\xae\xcf\xd2\xc0\x4f\xa1\x0b\xe6\xc5\xcd\xd9\xe8\xc5\x56\x57\x20\xc8\x61\xba\x39\x1b\x45\xbc\x64\x15\x3e\x5b\xe3\x66\x78\x4b\x16\x91\xda\x5d\x0e\x0d\x73\xe8\x37\x56\x96\x01\x99\x69\xae\x71\xb3\xf1\xdb\x04\xc1\x25\xdd\x69\x26\x17\x97\x75\xe8\x7b\x9a\x8f\xd2\xa5\xe6\x73\x52\x1a\xab\xd9\xb5\x42\x58\xd9\x70\xaa\x6d\xa4\x3d\xcf\xcb\xa7\x9e\x3d\xcf\xcb\xe6\xcf\x9e\xe7\x65\xdd\xb3\xe7\x79\xd9\xe0\xd9\xf3\xbc\x98\x67\xcf\xf3\xd2\xef\xc8\x2e\xe6\x18\xed\x79\x5e\x3e\xfb\xec\x79\x5e\x1e\x7c\xf6\x3c\x2f\x1b\x3d\x7b\x9e\x97\xd5\x67\xcf\xf3\xf2\x89\x67\xcf\xf3\xe2\x9f\x3d\xcf\xcb\x9e\xe7\xe5\xf9\x4a\xed\x3d\xcf\xcb\xf2\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\xc2\x67\xcf\xf3\xf2\xc0\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\x3e\xfd\xec\x79\x5e\xa2\x9f\x3d\xcf\xcb\x66\xcf\x3e\xf3\x70\xc3\x67\xcf\xf3\xb2\xe7\x79\x59\x7e\xf6\x3c\x2f\x9f\x7d\x76\xc3\x3d\xbe\xe7\x79\xd9\xf3\xbc\x7c\xf2\xd9\xf3\xbc\xec\x79\x5e\x3e\xf9\xec\x79\x5e\x22\x9e\x9d\x73\xba\xee\x79\x5e\xf6\x3c\x2f\x9f\x6a\x63\x6f\x6d\x6d\xf6\xec\x79\x5e\xf6\x3c\x2f\x2b\xcf\x9e\xe7\x65\xf5\xd9\xf3\xbc\xec\x79\x5e\xf6\x3c\x2f\x7b\x9e\x17\xff\xec\x79\x5e\xbe\x76\xbf\x93\x20\x92\xfe\x9b\x8c\x78\x45\x8b\x45\x72\xb6\xcf\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x63\x14\x0a\x57\xc1\xc4\x85\x54\x0a\xc2\xce\xc1\x63\x4c\xc1\x4e\xd0\x29\xb8\x01\x5e\xc6\x23\x08\x86\xae\x7c\xb6\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\xd2\x39\x43\xda\x23\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x31\x16\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x63\xa9\xf2\x6b\x45\x9d\x38\x4c\xc2\x9a\x5d\x4c\x96\xc1\xa8\x54\xf5\xbc\x40\x97\x5c\x5d\xd9\xc3\xbd\xb5\xf5\xca\x8c\x58\x70\x53\xb8\x35\xd6\xaa\x33\x5e\x37\xad\x22\xbd\x8b\xcd\x4c\xb1\x31\x3a\xa8\x4c\x15\xe8\xdb\xc9\x06\x2d\x38\x9b\xd0\xa9\xb5\xbe\x4f\x6a\xcc\xf0\x94\x0c\xfd\x6c\x0f\x3b\xaa\x87\x93\xe8\x8b\x7a\x6b\xa9\xa0\x45\x85\x69\x3c\x70\x30\x97\x98\x38\x83\x5e\x00\x0d\x58\x07\xa8\x87\xdc\x34\x3f\xcd\x03\x0f\x1b\xa7\x46\x6e\x1c\xbb\xaf\xcc\x1f\x0f\x12\xac\x47\xac\xc0\x57\x01\x86\xd1\x9a\x9d\x9a\x6e\x30\x32\x84\xab\x66\xf6\x69\x93\x31\x25\xe5\xf2\xf5\x82\xe1\x9a\x16\xee\xe0\x9d\x56\x15\x2f\x8c\xab\xa6\x6f\x6c\xa6\x8d\xc4\xf4\x5e\x0f\xa9\xae\x5b\x85\xc7\x15\x39\x46\x17\x86\xb9\x82\xb3\x6a\xa1\x8f\xa5\x24\xca\x21\x17\xec\x99\x48\x33\x30\x53\x60\xb1\x89\x90\xd8\xb5\xba\x3a\xec\x35\x43\xb5\x41\x98\x96\x70\x9c\x11\x44\x98\x12\x0b\xbd\x2d\x47\xbc\xbc\xd6\x3b\xb3\xf7\xeb\x64\x06\x8e\x44\x24\x6c\x0e\x14\x6c\x22\x02\x36\x0f\x6e\x35\x1d\xb3\x9a\x17\xaf\xda\x45\x16\x0c\x81\x50\x98\x08\xd4\xdb\x16\x0d\x2f\x8f\xd7\x48\x2c\xc4\x27\x89\x3d\xd0\x2d\x8e\x78\xa9\x75\x29\x41\x8c\xd8\xf2\x67\xd4\xf8\x15\x2f\x74\xe7\x6e\xc1\x11\x88\x55\xa7\x64\xe1\x39\xa6\x95\x3e\xc0\x89\x1d\x58\x25\x63\x4c\x0b\xd6\x64\x0a\x61\x58\xcc\xfe\x2e\x6d\x16\x9b\xed\xd5\x4b\x18\x2b\x66\x5c\x12\x06\xf2\x12\xfb\xc4\x1e\x9f\x76\x60\x45\x4c\x69\xae\xe8\x54\x70\xf1\xc5\x04\x91\xba\x51\x8b\x01\x22\x73\x22\x16\x6a\x06\x20\x04\x4f\x27\x0a\x62\x8d\x4a\x54\xe3\x32\xd8\x1d\x03\xc4\x9d\x5f\x3a\xb1\x79\xb8\x1f\xac\xa9\xd6\x56\xca\x18\x6e\x54\xfa\xec\x8a\x6d\xef\x9a\xdc\x2c\x37\x28\x55\x68\xe6\x64\xa9\x41\xc0\xb0\x5a\xd3\x38\x3e\x5b\x94\xf1\x2c\xbc\x85\x5e\x04\x19\x25\x7a\x4b\xd4\xf8\x1e\xbc\x96\xb8\xe6\x2d\x53\x86\xbe\xc6\x18\x12\x5e\xf9\x33\x79\x37\x4f\x08\xa3\x7b\x54\x95\x1f\xe5\xb9\xda\x71\xe9\x18\x2b\x46\x39\xd2\x97\xb1\x52\x44\xb0\x6f\xd1\x7f\x1f\xfe\xeb\x9b\x5f\x87\x47\xdf\x1d\x1e\xfe\xf8\x72\xf8\xb7\x9f\xbe\x39\xfc\xd7\x31\xfc\xc7\x7f\x1c\x7d\x77\xf4\xab\xfb\xc7\x37\x47\x47\x87\x87\x3f\xfe\xfd\xdd\x9b\x9b\xd1\xf9\x4f\xf4\xe8\xd7\x1f\x59\x5b\xdf\x9a\x7f\xfd\x7a\xf8\x23\x39\xff\xe9\x0b\x5f\x72\x74\xf4\xdd\xef\xe3\x83\x92\xa9\x11\xf8\x7c\xf1\xf7\x4c\xd1\xf7\x47\x89\xbd\x5b\x19\xbb\xf5\xc3\x6f\xaf\xc0\x95\xe3\x6f\x83\x16\x9f\x3a\xfe\x22\xd9\x55\x73\x31\xe9\xda\xa7\x12\xf1\x9a\x2a\x45\x4a\x7b\xf7\x06\x94\x38\x4b\x6e\x22\x2b\xb0\x80\xcd\x0a\xc3\xed\x1d\x50\xb3\x74\xde\xa5\xe8\x6e\xf9\xfb\x15\x1c\x63\x0c\xd1\xba\xa9\x48\x4d\x98\x02\xc1\x33\x74\x26\x2f\x78\x19\x8f\xbb\x11\x14\xc6\x0f\x42\xee\x0b\x42\x4a\xdb\xc9\xbd\x6c\x0c\x9e\xbd\x6c\xdc\xcb\xc6\xcf\x3d\xc9\xae\xf2\x1c\x82\xf1\x2a\xec\x84\x75\x71\x49\xa7\x29\x83\xe3\xdc\x33\x27\xf0\x09\xe0\x27\xe6\xb4\x6c\x71\x15\x12\xcc\x3a\xce\xd1\x38\x09\x10\xb8\x76\x6a\xbc\x58\xf1\xe4\x50\x46\x43\x36\xdb\x81\x47\xfd\xc0\x0f\xad\x5e\xd6\x45\x9c\x5f\x9c\x56\x77\x78\x21\x23\x49\x2f\xbf\xe7\x02\x80\x24\x4b\x8d\x22\x2e\x1c\xbe\x28\x34\x71\xfb\x1e\xfe\xb8\x08\xe1\xba\x89\xee\x53\x54\x58\x23\xfb\x40\xfa\x1f\xba\x38\x92\x9d\x88\x2e\x2b\x44\xef\xf3\xb8\x81\x5f\x13\xa5\xac\x13\x70\x69\x4b\xe0\x6e\x4e\x7d\x58\xb4\x3f\x3d\x06\x4a\x04\x54\xb3\xfa\xcb\x09\xd7\x6b\x02\x45\x1a\x26\x13\x52\x44\x5a\xc1\x86\xd2\x63\x4d\x3b\x06\xde\xae\x28\x6b\x71\x55\x2d\xdc\x9c\x90\x12\x71\x16\xd5\x10\xb9\xa7\x0a\xb5\x4c\xd1\x4a\x6f\x26\x24\xc8\xb4\xad\x70\xe8\x40\xb4\x23\x73\xa8\xbb\xf2\x18\xbd\x67\x05\x09\x7f\x1c\xe7\xf8\x5e\x6a\x40\x2b\x1d\x15\x51\xa4\x1c\xc0\xab\x97\x77\x20\xe0\xd6\x7a\x12\xc3\x2f\x4b\x54\xf3\x6e\x2e\x3d\x2e\xe9\xd8\x1c\x44\x0f\x9a\x40\x25\x9d\x4c\x74\xcb\x60\xa4\x33\x2e\x6a\xbc\xda\x2b\xcc\xca\xa8\xd6\xb5\x06\x04\xd9\x2a\x21\x69\x30\x14\x8a\x79\x21\x69\x49\x0a\x2c\x5e\x84\x25\x46\x4e\x2b\x35\xe3\xed\x74\xd6\xed\x8a\xb4\x29\x47\x52\x01\x5a\x4b\x4f\xa6\x74\x1e\x8f\xa5\xcd\x26\xb5\xae\xc3\x0a\x62\x54\x32\x4e\xcc\x71\xbf\xc3\x91\x6d\xaf\x20\x0a\x0c\x44\xdc\xac\xb9\x4b\xe1\x02\x48\x20\x29\x83\x7c\x3b\x46\xee\x55\x86\x01\x1f\xa3\x0b\xc3\x9f\x31\xe8\xbf\xb5\x37\x25\x66\x32\x02\x48\x9c\x03\x77\x46\xe2\x01\x97\x1a\xa0\x3e\x63\x0d\x68\x8e\xcd\xcb\x31\x5b\xb8\x04\x11\x80\xac\x99\xc4\x36\x9f\xb3\x52\xc5\xf9\xde\xfd\x59\x7a\xf2\xaa\x3d\x92\x14\xad\xa0\x6a\x71\xc6\x99\x22\xf7\x51\xb2\x2f\xc7\xad\x7e\xdd\xef\x46\xef\x5e\x77\x5d\x44\xbc\x31\xdc\x92\x4b\x85\x9b\x66\xbc\xad\x4a\x60\xd8\x6d\x19\x88\x9d\xb8\x1b\xe5\x62\xa2\xaf\x70\xb3\xdf\xe0\xc6\x84\x70\xda\x72\xc7\x1c\x52\xd4\x00\x66\x7f\x69\xe9\x1c\x57\x84\xa9\xe0\x2f\x46\x80\x1d\x0c\xff\xe8\x31\x63\xae\x0a\xcb\xdb\xce\xc2\x20\xc3\x86\x97\x9d\x41\x71\xe2\xa6\x0e\x3e\x22\xf7\xea\x19\xc6\x5b\x41\x61\x1a\x09\x3a\xa7\x15\x99\x92\x73\x59\xe0\x0a\xec\xa8\x6d\x1b\xe7\xa7\x0f\xf4\x0b\x76\xa6\xe0\x95\xd4\x0a\x98\x36\x56\xb5\xaa\x69\x90\xd3\x10\xf8\x9b\x62\xca\xa0\xea\x50\x42\x70\xc8\x36\x2a\x0d\x74\x5b\xdb\xdb\x0d\x16\x7a\x17\x3a\x88\xb6\xb9\x1a\xc7\x9c\x57\x96\xa6\xb6\x5a\x74\xfd\xa2\xf1\x51\x14\x90\xc5\xfc\x67\x46\xee\x7e\xd6\xbd\x90\x68\x52\xe1\x69\x77\x35\x13\xb5\x92\xef\x92\x8e\x1a\x7f\x70\xa2\x81\x83\xb5\xd5\x8a\x8d\xd6\x2a\x3a\x3c\x7d\x28\xc1\xe3\x0d\xba\x57\x47\x20\x4f\xb0\x44\xbe\xed\x38\xd5\x41\x3f\x7f\x38\x82\x7b\xe2\xec\x74\xf4\xf3\xf5\x3f\xaf\x7f\x3e\x7d\xfd\xee\xe2\x32\x1e\x35\xcb\x15\x31\xde\x95\x40\xbb\x2f\x3c\xd0\x43\xaf\x82\xc7\x0a\x1d\x73\x79\x0c\xa1\x13\x20\x73\x61\x25\xbf\x4b\x8c\x2f\xeb\x3d\x45\x70\x9c\xe6\x8a\x9b\xe6\x54\xd4\x5c\x8c\x04\x9f\xd0\x2a\x3a\x34\x99\xeb\x04\x2f\x75\xc7\x45\x9a\x4e\xed\xc7\xdd\x75\x63\xf8\x05\x56\x71\x0e\xc1\x95\x41\x21\x8b\x5d\xbf\x26\xde\xb3\xd5\xcb\x41\x30\x19\x11\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\xcf\xde\xd4\xdd\x88\xfc\xf3\x1c\x91\xf8\x8a\x17\xb8\x82\xfa\x45\x69\x1b\x1f\x65\x0e\xb2\x2e\xf7\x2b\xc8\x36\xc1\x6e\x3b\xa3\x8a\xe3\x12\x8c\x55\x2b\xfc\x4b\xe2\x58\xb5\x9d\xda\x05\x81\xf3\xa4\x8e\xdc\x18\xa4\x3f\xb4\xe7\xd2\x63\x1a\x41\xbc\x56\xb3\xd4\x3c\x47\xf1\xd5\x06\xdd\xf3\xae\x0f\x43\xb0\xa3\xec\x25\x72\xa6\x9e\x39\xdf\x8c\x3d\x60\x74\x02\x1e\x10\x70\x03\xd1\x09\x6c\x4a\x70\x00\xbd\x75\xcb\x90\x50\xf8\x24\x13\x12\x00\x5e\xb2\x23\xbb\xd3\xcc\x8f\xdf\x91\x06\xa6\x7c\x4b\xf5\x0c\x4e\x3a\x21\xed\xb6\x8d\xd3\x41\x0c\x56\x39\x71\x3f\x7e\x84\x12\x5b\x4e\xfe\x63\x91\xcc\x0b\xe6\x97\x18\x0d\x83\xa3\xd5\x08\x32\x5c\x3d\x5e\xa9\xc0\x85\xab\x96\x29\x5a\x13\xc7\x7d\x31\x5c\xd2\x89\x84\xf9\xfa\x40\x7a\xa6\xd9\x2c\x1b\x1d\xa1\x0f\x0c\xce\x2b\x23\x25\x1a\x22\xc6\xbb\x25\x22\x6c\xc2\x45\x01\x41\x9a\xad\x6e\xf0\x02\x37\x78\x4c\x2b\x9a\x22\xcc\x73\x6d\x70\x28\xdc\x10\xf4\x07\xdc\x49\x65\x79\x52\x0a\xde\x98\x9b\xd8\x25\xa5\xa6\x03\x03\xfb\xc9\x4f\x21\xc7\x30\x28\xec\x93\x7e\x47\xa6\x02\x33\xd5\x39\x72\x57\x36\xce\x6f\x51\x07\xc9\xa1\x04\xe0\x32\x5f\x09\x94\xd3\x52\xcb\x8c\x70\xd9\x92\xcf\xd5\xae\xd1\xa9\x9e\xb9\xc1\x05\xd9\x4f\x68\xf4\xfe\xfa\xe2\xff\x2d\x9d\x9b\x78\xd5\xce\x3c\xbb\x4d\xa6\xa8\xe5\x41\xb6\x6d\x73\x65\x2b\x50\xed\x37\xce\xd7\xbd\x71\xbc\x83\x68\xeb\x4c\x50\x57\x2d\xeb\x57\xc1\xef\xba\x86\xea\x24\x5d\x67\xe4\x49\x13\xfa\x6f\x0d\x63\x3d\x82\x20\xfd\x13\xa6\x28\x44\xde\x02\x6f\xad\xe2\xa6\xc8\x52\x96\x7a\xad\xe1\xed\x3a\xc1\x95\x7c\xae\x57\x64\x8a\x6b\xa7\x11\xbc\x78\xc7\x5b\x96\x87\x5a\x2a\x61\xc7\xf9\x8e\xa0\x92\x30\xae\xac\x37\x05\x6c\x09\x3e\x81\x6f\x91\x81\x4d\x05\xac\x91\x3d\x3d\x27\x41\xcd\xba\x09\x54\x2b\x1f\xdf\x77\x7a\xb8\xb1\x5f\x5a\x49\x96\xe3\x17\x56\xaf\xea\x50\x54\x13\x1e\x0f\x1e\x11\x04\x97\x60\x60\x36\x58\xcd\x0c\x9d\x59\x8d\xe5\x2d\x29\xcd\x07\x89\x54\x0e\x3e\x07\x07\x42\xfc\x6e\xa6\x6f\xf4\xe4\xba\xb4\x19\x70\x08\x1b\x52\x37\x48\xd4\x49\x31\xc5\xb6\x7a\x1a\x12\x04\xbb\x5e\x84\xf7\xac\x5a\x5c\x71\xae\xbe\xf7\xd5\xda\xb6\x7d\x32\xfe\x61\xc3\x11\x7d\x27\x26\xf8\xa5\x31\x74\x79\x08\x1b\x07\xe4\x62\x50\x63\x2e\x55\x2c\xea\x05\xf9\xad\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xd9\x7e\x98\x12\x0b\x28\x3e\xea\x3c\x5e\x19\x83\x36\x1f\x2c\xaf\x52\x28\xd9\x92\x29\x54\x10\x7a\x87\x17\x08\x57\x92\x7b\x97\x1a\x5b\x17\x6e\x75\xb1\x5c\xfd\xf5\x98\xab\xd9\x4a\x10\x37\x16\x05\xa2\x9f\xd5\xf6\x06\x01\x69\x50\x97\x9f\x4d\xd9\x4a\xb3\x0a\x12\x8b\x1a\x41\x0a\x52\x12\x56\x3c\xd7\x13\xb1\x6d\x0e\x1b\x38\x55\x97\x9c\x69\xf1\xba\xed\x73\x75\xe1\xfd\x93\x76\x35\xc2\x53\x04\xae\x6c\x1b\x44\xc4\x00\xd3\x03\xe1\xda\xca\x94\xac\xaf\x8b\x09\x44\x3d\xcd\xa6\xfb\x7b\x3b\x26\x95\x5e\x6c\x5a\x55\x7a\x07\xd2\x12\x2b\x03\x4d\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\x89\x04\xe8\xe8\xc7\x63\x8b\xec\xd0\x3e\x5c\xbc\x46\x2f\xd1\xa1\x1e\xdb\x11\x68\x1c\x13\x4c\x2b\xa0\x90\x02\xf0\xdf\x52\x48\x76\xe2\xe0\x49\x49\x53\x00\x72\x04\x71\x61\xae\x96\x01\x62\x1c\xc9\xb6\x98\xb9\x39\xa0\x9c\x79\x8f\xb0\xe5\x13\x4e\xca\x85\xd9\x8b\x9d\x7c\xf7\xe1\x07\x49\xc4\xb6\x8f\xad\xbe\x0e\x3f\x3c\xe1\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\x7e\xb0\xdf\xb5\xfb\xcb\x32\xe1\xb2\x94\xe4\x2d\x65\xed\xbd\x61\xec\xdc\x89\xb0\xc7\xf5\x39\xf4\x08\x15\x6e\xa1\x79\x10\xb7\x73\x11\x8a\x0c\xe9\xd1\x17\xbd\x63\x34\x78\xc0\xea\x86\x5b\x02\x1b\xfa\x07\xa2\x0d\x21\xcc\x4a\x5e\xaf\x74\x72\xc2\x05\x22\xb8\x98\x45\xf7\x26\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x95\xcd\xb7\xff\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x2c\x61\x8b\x61\xf1\xca\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf8\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x0f\x33\x56\xe6\x1e\x74\x64\xcc\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x97\x1b\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x18\x24\x94\x35\x58\xcd\x06\x48\x90\xca\x30\xa4\x5b\xf1\x7c\x6b\x3c\x5e\x07\x20\x71\x5c\x87\x9c\xb8\xe9\x30\xab\x86\xcc\x2d\x2b\x76\x73\x1d\x5e\xd3\xfc\xe6\xf2\xfd\x4d\x98\x00\x8c\xd9\xc2\xd0\x14\x24\xa4\xb7\x9a\x67\xf7\xd4\x8a\xc7\xc4\x74\x2e\xaf\xe2\x63\x43\x3a\x93\xde\xb7\x1e\xd1\xf9\x74\xa7\xf4\xcb\x50\x9e\xcb\x18\xcf\xac\x5d\x58\x06\x7c\xae\xb6\x91\x61\xe5\x92\x8f\x80\xbd\x3a\x77\xc8\x01\xf2\x0f\xd3\x23\x67\x65\x17\x5a\x70\x28\xca\xa6\x32\x74\x82\xe0\xaa\xca\x82\x49\x58\xe7\x05\x71\xa7\xc0\xb3\x99\xad\x7a\x03\xfa\xd5\x36\x52\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x77\x23\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x2e\xd5\x76\x4a\xd5\xac\x1d\x1f\x17\xbc\x0e\xb2\x6e\x87\x92\x4e\xe5\x89\x95\x28\x43\x3d\x71\x47\x88\xb2\xca\x67\x2a\x83\xb7\x90\x29\x69\x23\x08\xc9\x83\x47\x85\x1f\x3d\x6c\x3d\xc8\x4f\xf1\xd0\xec\xd5\xe9\x01\x82\x4d\xd8\xbc\x5b\xd7\x3a\x56\x77\x55\x1a\x0f\xfe\xd2\xce\x7a\x60\xec\x21\x59\xa4\x8d\xe2\xac\x9d\x47\x63\xbc\x6e\x7d\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\x7e\xe8\xba\x84\x4a\x62\x48\x44\x08\xf0\x79\xe1\x07\x73\xee\x21\xbc\x7d\x00\xb5\x04\xed\x9f\x1e\xe4\xe2\x37\x3d\xad\x2a\xbd\x90\xd8\x12\xca\x04\xe8\x4e\x30\x4d\x3c\x87\x8b\xd4\x2b\x6e\xe8\x5b\xb4\xb1\x10\x8e\x22\xbd\xe6\xfe\x21\x55\x8e\x3d\xc7\xd1\xf7\x28\x6e\xda\xc6\xa8\xa6\xf7\xba\x87\x61\x8b\x7d\xbe\x11\x08\xfc\xaf\xff\x3a\xa1\xb4\x12\x02\xf0\x81\xa7\xed\x1a\xe8\x15\x0a\x1b\x71\xc9\xd1\x4a\x5f\x5b\xfa\x8b\x4b\xa2\xb4\xa1\x66\xe6\x2d\x8c\x3e\x68\xc3\x4a\xb4\x19\x0e\x43\x4a\x64\x18\x85\xd1\xe1\xac\x92\x22\xf1\x3c\x40\xa4\xd8\xf6\x49\xeb\x20\x4e\x79\x7b\xaa\xc8\x31\x5a\x93\xbe\xf3\x64\x11\x64\xf4\xe5\x51\xe4\x47\x8c\x55\xa1\x5d\x89\x57\xa5\x52\xad\x04\xb4\x31\x5b\xe3\x59\x09\xa9\x6b\xe8\x2a\x78\x69\xc4\xcb\x15\x46\x1b\x57\x74\x3e\xbe\xc4\x88\xde\x1c\x9d\x09\xc2\xb8\x75\x8f\x04\x75\xdf\xc9\x3d\x29\x5a\x45\x4a\x4b\x6c\x65\x5d\xca\x86\x14\xa7\xdf\x9b\xe8\x1e\xb8\x24\x7d\x5b\x71\x52\x0e\x3a\x36\x70\x6b\xeb\x78\x6a\xae\x01\xfa\x5f\x90\x92\x96\xc7\xb2\x2b\x55\x3f\xf2\x7f\x1e\x3b\x15\x80\xa3\x2e\x30\x73\xb6\x15\x54\x3c\x37\x1e\x6e\x4b\x60\x65\x79\x3c\xc6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x19\x93\x29\x35\x69\x81\xc1\xa5\xe8\x19\xb0\xe2\x18\xdd\xc0\xb0\xa1\x0a\xd5\x74\x3a\x33\xa7\x05\x61\x28\x0d\x89\x1c\x6e\xac\xe2\xb8\x44\x20\x58\xb8\x40\x77\x58\xd4\x5a\x17\xc0\xc5\x0c\x40\x68\x98\xa1\xb2\xd5\xe7\x01\x01\x5f\xd3\x62\x28\x15\x56\xda\xc6\x24\x22\xc1\x07\xe7\xa6\x69\x0b\xc5\x4b\x1e\xbb\x30\xdb\x96\xf9\x74\xf4\x49\xcb\xe2\x05\x39\xbf\x27\xc5\x52\xe9\xef\xba\x06\x8a\x3f\xee\x8e\xb3\x63\x2a\x4b\x56\x06\x77\xc4\x54\xb6\x23\xdc\x15\xdd\xe4\xcc\x4e\x38\x75\xd6\xa7\xf9\xa7\xb6\x47\xfb\x8b\x20\x5d\x10\x2b\xe0\xed\xd5\xff\xd4\x5b\x5d\x9f\x5c\xc3\x11\xc4\x85\xaf\x23\x97\xd4\x2d\xd7\x0f\xa8\x4c\xc5\xb9\x42\x87\x07\x27\x07\x47\x2b\x7b\xe1\x40\x86\x69\x06\x26\x23\xba\x1b\x90\xa4\x75\x53\x2d\x60\x0c\x07\xa6\x18\x55\x42\x91\x57\xfd\x38\xc0\xaa\xaf\xc0\x20\x67\xa4\xaa\x06\x48\x6a\xf5\x17\x3b\xf2\x5b\xf3\xa9\xfe\x91\x12\x6d\x61\xdc\x64\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\x99\x80\x07\xba\x01\x1b\x32\xa9\x4f\xbe\x13\x0b\xde\x42\xbd\x64\xb3\x6c\x9e\x2f\xb9\xc0\xda\xfc\x69\x8d\x8e\x6e\x48\x37\x48\x95\x50\xff\x57\x3f\xe7\xf7\x54\x69\x55\x44\xb5\xe0\xa6\x78\x69\x2c\x05\xa2\xc5\xab\xbe\xf0\xf4\x4d\x77\x32\x23\xb8\x52\xb3\x85\xb7\x5e\x4c\x29\x5a\x89\x5a\x66\xbf\x49\xd7\xa1\x76\x20\x6d\x74\x77\x13\x38\x6d\x45\xec\x9b\x99\x20\x72\xc6\xab\xad\xa7\x71\xba\x32\xa9\x05\x67\x52\xcb\x14\x6d\x62\xdb\x3e\x4a\x9f\x41\x67\x4b\xb5\x72\x4b\x78\xaa\x4f\x99\x20\xa5\x55\x96\x2c\x7b\xe2\x0c\xcf\x41\x53\xd0\xfa\x1c\x29\x53\x4c\x93\xd0\x26\xfa\x63\xce\x42\xae\xdb\xaf\x99\xaa\x9f\xa9\x68\xf2\xdc\xd2\x6f\xae\x46\x67\xbd\x5b\x1a\x3e\xf8\x01\x8e\xf1\xd9\x8c\x14\xb7\x57\x69\x05\x45\x76\x04\x5a\xd0\x70\xb1\x4d\xc5\x40\x37\x9f\x4d\x2b\x18\x71\xa1\x10\xf3\xa5\x91\xf5\xd9\x9a\xc2\x2a\x12\x31\xa7\x05\x39\x76\x65\x93\x5d\x70\xde\x15\xc0\xc1\x6c\x4a\xd0\x2b\x7d\x20\xfe\xf2\xe7\x3f\xff\xf1\xcf\xe9\x32\x3a\x9d\xc9\x3c\xfd\x20\x20\x00\x43\xc1\xc0\x77\x45\xed\xba\x36\xdd\x59\xe7\x6c\xb6\x3d\x05\xa3\xae\xc2\x85\x5f\x9b\xe9\xfa\x43\x97\xe6\x95\x94\x84\xa0\x35\xe1\x0a\x2d\x3a\xcc\xff\x8c\x2b\x3e\x3e\xa9\xb1\x54\x44\x68\x1b\xc7\x5e\xeb\xc3\x42\xf7\x80\xb2\xe9\x71\x5d\x1e\x25\x54\xb8\x43\x81\x59\xbd\xc2\x2d\xde\xa3\x99\x79\x80\x27\x5c\x4f\xca\xd6\x5d\xf0\xc8\xf5\xf2\x5b\xf4\x22\x8e\x98\x5a\x2f\xc1\x1b\x92\x27\x13\xed\x87\x9b\x9b\xd1\x1b\xa2\x42\x81\xcd\xe0\x43\xf4\xe6\xfc\xc6\x57\xbc\xd2\xbb\xcb\x24\x35\xed\xa5\x76\x8a\xd4\x9e\xf1\xb4\x92\x67\xb9\xe3\x2e\x46\x94\x00\xcd\x36\x63\xa4\xd0\x0b\x3d\xe8\x15\x57\x71\x38\xc4\x8b\xd1\x31\xfa\x27\x6f\x41\xe5\xc2\xe3\x6a\x81\xee\xb0\x61\x34\x90\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x9a\x72\x09\xe0\xda\xd9\xfa\x59\x0d\xfa\x94\x6d\xd9\xce\x5a\xa9\x78\x8d\x66\x76\xa8\x66\x0e\xbb\x9a\x72\x46\x37\x32\x47\x10\x62\x3f\x12\x09\xd2\x18\x6b\xc9\xfe\xcd\x57\x61\x0b\xad\x48\x21\x33\xcf\x41\xe5\x21\x8c\x8a\x70\xaa\xac\xa2\x0f\x2e\x4c\x6a\x65\x54\xb4\x4b\xac\x7b\xb2\x14\xf0\x44\x99\x8a\x78\xa2\xf4\x42\x9e\xee\x25\xe9\x41\xc8\x3c\x25\x41\x51\x96\xb2\xa0\x28\x7b\xb5\x47\x64\x43\x6d\x76\x73\x19\x00\x8e\xee\x68\x2a\x2b\x21\x72\xce\x64\x5f\x8b\x03\x33\xce\x68\x61\xc2\x19\xa8\x6d\x38\x43\xbc\x55\x4d\xab\xc0\x15\x54\x60\x49\x86\x73\x2c\xa8\x16\xa8\xa6\xa6\xb2\x47\x42\x31\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\xf4\x03\x9b\x2d\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\x8c\xd5\x2c\x9f\x59\x87\xd5\x0c\x90\x7d\x10\xcb\x72\xc0\x50\x10\x9c\xda\x6c\xd8\x81\xc4\x9b\xac\x56\x6c\xa2\x48\x80\x78\x3b\x17\x4b\x76\xb0\xee\xe1\xea\x1c\x66\xc2\x9a\x3c\xbe\x59\x1d\x96\x40\x1e\x13\xad\xdb\x5f\x9c\x5e\x9e\xfe\x7c\xfd\xf1\xec\xe7\xcb\xd3\x77\xe7\x29\xaf\x4e\x2e\x5f\x96\xb3\x80\x59\xb6\x12\x66\x8f\x54\xe0\x51\x3f\xb2\x98\x91\xdd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xa5\x75\xd2\x58\xea\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x51\x88\x2c\x31\x66\xb9\x1a\x5e\xb6\x0e\x92\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbd\xc8\x35\xda\x19\xf7\x78\x43\x04\x05\x44\xd0\x2e\xec\x9a\x1f\xf8\x9d\x2d\x0e\x76\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xb3\xa9\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x8b\xf4\xd9\xe9\xc8\x97\xed\xe3\xe7\x43\x5f\x1d\x6c\xa9\x1f\xfe\x4a\xc1\x0f\xa1\x25\x31\xfe\xea\xd8\xe7\xa9\xbd\x82\xfe\x78\x51\x84\x59\xe9\x20\x67\x5f\xdf\x3e\x51\x45\x73\xcd\x8b\xdb\x4c\x6e\xd7\x9b\xb3\x91\x79\xdb\x12\x9e\xc5\xdc\xc0\x5a\xcb\xe4\x08\xeb\x5f\x81\x02\xba\x77\xba\xee\x8c\xd3\xf5\xc0\xa4\x75\xe1\xea\xdb\x8d\x1d\xa8\x07\x7b\x6b\xab\x7b\x9c\xe2\x23\xfa\x15\x50\xf6\xd6\xd6\x03\xcf\xde\xda\xda\xe0\x71\x95\x68\x29\x67\x6f\x04\x2e\xc8\x68\x97\x94\x37\x27\x40\x50\x69\xeb\xb3\xa3\x4e\x87\xf3\xe2\x82\x11\x52\x1a\xf9\xe1\x8a\xea\xa2\xa9\x1e\x89\x81\x47\x83\x0f\xb1\x03\x16\xb7\x22\x41\xcd\xbb\x99\xd9\x57\x5b\x15\xd7\x05\x99\xd7\xf5\xae\xb3\x4d\x1a\x4f\x86\xee\xaa\x86\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\x87\x2b\x88\x24\x9d\xea\xe9\x72\xb5\x9c\x0d\x89\x96\x2b\xbd\xd7\x75\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x12\x94\x04\xc6\xe8\x16\x4a\xd9\xc2\x6b\xe2\x27\xea\x9a\xd8\x5c\x4d\xa3\xd1\x54\x9c\x4d\x61\x32\xb0\xcd\xc9\xb8\x6f\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc1\xdb\x0c\x69\x19\x2e\xf0\xed\xf5\x29\x46\x2d\xfd\x88\x29\xdc\xf6\xc9\x3d\xdf\x4f\xae\x45\xef\xd5\x8c\x88\x3b\x2a\xc9\x20\xbe\x74\x2d\x72\x6e\xdf\xa5\x32\x72\xe6\x33\x4f\xa1\x62\x33\x07\xf5\xb6\x80\x54\xd6\xe8\xb6\x3e\xc2\x7b\x9d\x68\x65\x9c\x0d\x19\x99\x1a\xa2\x06\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\x3e\xdb\x40\x2a\xde\xf4\xea\xf6\xce\x29\x8e\xee\x09\x90\x42\x74\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x80\x88\x9e\x2b\x19\x9d\x90\x6f\x75\x63\x61\x0e\x18\x8d\x89\xc2\xd6\x07\xae\x0f\x81\xe7\x44\x07\xba\x73\x7d\xf6\x20\x49\xe0\x66\xed\x06\xf0\x34\xe9\x53\xac\x12\xa4\xc4\x1a\x6d\xde\xac\xe7\xa7\xb7\x1d\x95\x36\x5e\x97\xc8\xc3\xbc\x1b\xcc\x86\xfa\x44\xf3\x56\xed\xc8\x3d\xf2\x90\xeb\xc8\x50\x5c\x04\x46\x22\xad\x89\x44\xbc\xcd\x54\x6f\xe2\x95\x6d\x2e\xa7\x85\xb7\xf7\x3b\xad\x7d\xa4\x2a\x69\x54\xd5\xe1\x1c\x5b\xec\x01\xf2\x7e\x9b\x87\x1b\xf0\x57\x8e\xdb\xc9\x84\x08\xb8\xe9\xa0\xc3\x2b\xb0\x7b\x5f\xc7\xcb\xdd\x61\x71\xce\x5b\x0b\xf8\x22\x6a\x00\xb5\x03\x2c\x99\xc4\x03\x4d\x5a\x92\x4d\x28\xd3\x2b\x88\x04\x2e\x78\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x54\x16\x48\x4b\x59\x85\x71\xbe\x67\x71\x98\xc4\xbc\xfb\x61\x1d\xeb\x8b\xdd\x16\x45\xc5\xa5\x4d\x8f\x86\x75\x29\x66\x98\x31\xe2\x9c\x51\x54\x81\x27\x7b\x4c\x08\x43\xbc\x21\x06\x94\x17\xd5\x19\x8c\x24\x65\xd3\x8a\x20\xac\x14\x2e\x66\xc7\xba\x77\xcc\xed\x85\x2e\x0f\xd9\x7e\x22\x95\x20\xb8\x36\x7b\x42\x90\x1a\x53\xd3\x3c\xc2\x85\xe0\x52\xa2\xba\xad\x14\x6d\xfc\xcb\xe2\xbc\x88\x04\x18\x21\xa4\x49\x4b\x75\x6b\x05\x69\x25\x5d\xc2\xf3\xa0\xeb\xa1\x1d\x3e\x0f\x8b\x15\x81\xeb\x6c\xa0\xbf\x25\x75\xa3\x16\x3e\x31\x31\xce\x06\x9a\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\x94\x83\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x9a\xfc\x3b\xdf\x09\xf7\xaa\x92\x4a\xeb\xeb\x90\x71\xd9\x7f\xd8\x55\xa6\x31\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x75\xb6\xbb\xdc\xc9\x34\xb9\x02\xe5\x63\xdc\xb9\x1e\xf4\x38\x07\x3a\xdb\x02\x52\x61\x56\xa4\x0e\x6c\x28\x46\xe6\xfa\x1c\x90\x82\x68\x55\x14\x67\x14\x32\x4f\x2e\x63\x02\x5d\xee\x1d\x91\x12\x4f\xc9\x28\x12\x8e\x90\x43\xe0\x74\x8e\x36\xc0\x31\x74\xdb\x66\x46\x0c\xd1\x95\xe2\xc1\x27\x61\x92\x57\x68\x3c\xd6\x66\x20\x51\x3d\x70\x46\xd3\x9d\xa0\x4a\x11\xd8\xa5\x50\xc9\x09\x00\x68\xcb\xe4\x9d\xfd\xe4\xb2\xa8\xf6\xec\xa4\x87\xed\x69\xf5\x83\x95\x26\x4d\x6b\x4c\xd0\x58\x50\x32\x41\x13\x0a\x79\x63\x90\x51\x35\x30\x55\x08\x30\xe0\x76\xb1\x94\x44\xc0\xb0\xad\x5b\xc0\x0d\x3f\xae\x3f\xff\xb0\xe3\x57\xa2\x65\x05\x0e\x4a\x74\x02\xb7\x18\x9d\xa0\x29\x64\x71\x59\x23\xf8\x4f\x2f\xff\xf6\x17\x34\x5e\x68\x7d\x0d\x0c\x31\xc5\x15\xae\x5c\x07\x50\x45\xd8\x54\xaf\x22\x88\xdc\x38\xb9\xd1\xe3\xa7\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\x3a\x7a\x20\x1f\x4f\x4a\x32\x3f\x09\xb6\xd0\xb0\xe2\xd3\xb8\xb7\x9e\xe5\xc8\x26\x4e\xf2\xb3\xad\x39\xd1\xbc\xa2\xc5\x62\x5b\x67\xda\x15\x2f\x41\x33\x7e\x67\x9c\x39\xab\x47\x35\xa0\x7a\x69\x78\xd3\x56\x30\x71\xe8\x7b\xcf\xcf\xd7\x4a\xb2\x4c\x7d\x94\xea\x24\x0c\xa4\x1d\x04\x51\x6d\xb3\x4b\x77\x8e\x4d\x61\x74\xdd\xe4\x96\x78\xc2\xc6\xdc\x7c\x1d\x92\x68\x6f\xdc\xf7\xb8\xaa\xc6\xb8\xb8\xbd\xe1\x6f\xf9\x54\xbe\x67\xe7\x42\x70\xd1\x1f\x73\x85\xf5\x9d\x3e\x6b\xd9\x2d\x54\xd1\xed\xc8\x68\xf9\xd4\x62\x0a\x1d\x7f\x40\x30\xba\xa8\xce\xb8\x51\x1a\x7a\x50\xa7\x92\x38\x1f\x5c\xd7\x32\xb9\xa7\x9d\xa3\x8d\x21\xa2\xfb\x1c\x9b\x80\x4f\x7a\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\x48\x39\x96\x03\x73\x01\xc0\x0d\xac\x55\xad\x1a\x57\x55\x6c\x94\x20\x14\x01\xdf\x47\x17\xa7\xde\x81\x23\xaf\xb6\x76\xba\xbf\xd8\x64\xbc\xb9\xf9\x27\xd8\x8b\x54\x49\x52\x4d\x06\x86\xed\xc5\xbb\xb5\x0e\x40\xbb\x3a\xb0\x57\x5e\x3c\x53\xd0\xf6\x8d\xb6\x39\xaf\xda\x9a\xbc\x26\x73\x5a\xc4\x05\x30\x7b\xab\xd2\x7b\x9b\x73\xd3\x57\x54\x02\x09\xd0\xb8\xe2\xc5\x2d\x2a\xed\x97\x01\x54\x7e\xb9\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x38\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xd7\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\x87\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\x7f\x1b\xbe\x85\x15\x66\x2c\x4f\x39\xe4\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\xde\x7d\x99\x21\x18\x9a\x96\x23\xd1\x9b\x17\xe6\x83\xd0\x35\x56\xd6\x3e\x72\x51\x76\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xdb\x9a\x84\x55\x44\x7d\x8d\x9b\xe1\x2d\x59\x44\x6e\xb8\xc4\xe3\xf2\x10\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc4\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x47\x31\x63\x33\xea\x40\xdb\xbe\x72\x3e\x76\x0b\xd7\xbf\x71\xf4\x27\xfe\xca\x31\xbf\xfa\x9a\x2e\x1a\x18\xdf\x73\xbd\x67\x7c\xe7\x33\x89\xd3\x24\xa4\x13\xdc\x4e\x76\x67\xf4\xaf\xa3\x9e\x43\xcb\x9c\xcc\xc0\xf4\xb5\x8e\xa6\x63\x53\x14\x20\xa1\x03\xfa\x28\xda\x46\xd1\xc1\xb7\x07\x5b\xbd\xe3\xcc\xca\x08\xde\xe0\x29\x58\xa6\xbb\xb0\x40\xcb\x7d\x0a\x39\x68\x67\xfc\xce\x7c\x6f\xd0\x25\x8d\xfd\x15\x29\x3b\x22\xf3\x19\x4f\x5a\x1d\x83\x1c\x74\x3b\xc2\x5a\xd7\x86\xab\xf0\x0e\x2f\x10\x16\xbc\x65\x49\x69\xd0\x10\x18\xf1\x81\xb3\x77\x4b\x83\xbd\xe4\x8c\xb8\x20\x7d\x4a\x2b\x37\x1d\x87\x39\x95\x06\xaf\x40\x19\x7a\x75\xfc\xea\x65\x72\xdf\xaf\x48\xd1\x0a\x49\xe7\xe4\xca\xd6\x38\x0f\x82\x2a\x17\x93\x11\x97\x92\x8e\x2b\x48\xdc\x52\x1c\x9d\x9b\x02\xf0\xab\x03\xf5\xc0\x11\x18\x31\x17\x21\x5b\x69\x42\x0f\x0f\xcd\x09\x0e\x01\x9f\xba\x81\x04\xd4\xc7\x6e\x69\x92\xb0\xae\x4b\x9a\xe4\xa5\xd7\x24\xcd\xbd\xb7\xd5\xb1\xba\xc2\xf7\xbb\x20\x49\xde\xd9\xd8\x40\x57\xd9\x9e\xba\xca\xc9\xf0\xd1\x9d\xa0\xca\x1e\xee\x3b\x2a\x09\x3a\x04\xaf\xc4\xd2\x66\x4c\x22\x68\x0e\x7d\x58\x89\x15\xf0\x73\x10\x2c\x8b\xe5\xa3\xbb\x0b\xab\xb4\x2a\x4f\x3a\x04\xfe\x9d\x75\x60\x75\x2b\x68\xa5\x7f\x77\x2f\xcf\x30\x2b\xab\x24\x99\xe1\x67\xa5\x5a\x24\x71\xe1\x5c\x4c\x50\x28\x12\x6d\xfc\x32\xa8\x26\x31\xc3\x12\x31\x8e\x6a\x82\x01\xa0\xa9\x6f\x17\x27\x05\x7b\x5c\xcd\xf9\xfa\x60\x36\xbb\xb9\xc6\xc2\x0b\xc1\x8a\xeb\xd7\x54\x5a\xf1\xac\xe5\x88\xb5\x40\x0c\xac\xa3\xc6\x65\x4a\x6a\x77\x30\xa7\xdd\xe2\x1d\x77\xa0\xc9\xe5\x9e\x74\x17\xc7\x52\x5f\x1e\xa3\x1f\x03\x5b\x82\x5c\x37\xdf\x02\x4e\x70\x8d\x5b\xae\x03\xc9\x24\x45\xb3\xcd\xb3\x3c\x5c\x7f\x2d\xae\x8c\x75\x7d\x8f\x7d\x87\x13\xfa\xf0\xf9\xa1\x0e\x02\x59\xe8\x30\xa2\x26\xa4\x6e\x6b\xa0\xd8\x8c\xc7\x34\x26\x6f\x17\x94\xf0\xee\x9e\x29\x61\x44\x60\x1b\x57\x70\x10\x51\x4b\xbe\x82\x25\x67\xa9\x07\xe2\x33\x1b\x4e\xcb\xfb\xcf\xab\x29\xe6\xcf\x12\x3a\x02\x7a\xce\x21\x17\x4b\xa7\xdd\x46\x4c\xd6\x69\x2c\x39\x47\xbd\x44\xcd\x65\x36\x7f\xc0\xf9\xa9\x17\xe5\x97\x96\xce\x71\x45\x0c\x87\xbd\x13\x0d\x5b\x55\x26\x64\x3b\xde\x55\xb3\xd1\xda\x87\x60\x76\xac\x07\x3d\x3c\x68\x41\x66\xd2\x27\x5e\xbc\x40\x87\xa6\x8d\x03\x43\xb2\xbb\x5d\x25\xd7\xae\xd5\xf9\x7d\x93\x50\xb9\x35\xdf\x7a\x9d\xdf\x37\x18\x70\x1a\xcd\x4e\x2c\xdc\x7f\x91\x19\x9e\x13\xe0\x34\xa6\x15\x16\x15\x80\xd2\xaf\xcd\x94\xa1\x71\xab\x10\x61\x73\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xfb\xc3\x8f\xa7\x57\x90\xb4\x74\x64\xd9\xf2\xed\xf8\x5a\x09\xfc\x00\x4b\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xfa\xb9\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\xf7\x81\xa7\x78\xf2\x72\xba\xc0\x2d\xf1\xf7\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\xd0\x90\x47\xd7\x78\x58\x43\x42\xb9\xa2\xe8\x1c\x48\x4f\x4c\x19\xe6\xe1\xd8\xbb\x38\x0e\x9e\x01\xa5\x13\x4c\xf2\xb7\xab\x49\xba\xe2\x61\x84\x1a\x2d\x5b\xf7\xe1\x47\x1c\x86\x7c\xc7\x20\xc2\x11\x9d\x67\xd7\x33\x5e\x92\xcd\xab\x0a\xa5\xed\xf3\x4b\xdb\x66\x90\xf8\x44\x99\xbd\x75\x4c\xe9\x5c\x28\x48\x62\x72\xfc\x64\x31\x23\x65\x1b\xa1\x72\x5d\x4c\x0c\x18\x68\xd0\x7b\x1d\x46\x05\x66\x25\xd5\x7b\xc5\xa4\x02\x98\xd7\xeb\x43\x66\xf5\x7f\xd7\xa0\x08\x6b\x96\xfa\x0f\x2f\x23\x98\xd7\x00\x62\xbd\xa2\x6e\x0f\xc2\xaa\xbd\x96\x30\x01\x54\xd2\x92\xa0\x31\x29\x78\x4d\x00\x3b\xdc\x70\x66\xf4\x71\x47\xa9\xe0\x13\x48\x4c\xe4\xd8\x0c\x6d\xd3\x2e\x05\x8e\x50\x7b\xa1\xbb\x63\x24\x3d\xd7\xbe\x00\xb4\x98\x5e\x6b\x2a\xba\xe6\xf5\x3c\x1a\xd8\x86\x5f\x19\xc4\x19\xc2\x5d\xd1\x4e\x3d\x82\x4d\xfb\xf3\x25\xc9\x34\xdd\x52\x0d\xc9\x9c\x02\xfd\xc0\x09\x96\x92\x4e\xd9\xb0\xe1\xe5\x50\x37\x7b\xf2\x3b\xfd\xbf\x1b\x1f\xa5\x48\x01\xa0\xdb\xba\x26\x15\x48\xe6\xa7\x3e\x3f\xae\x5d\xb3\xa7\xa5\xfb\x97\x39\x44\xce\x3a\x83\xfc\x82\xa5\x85\x9b\x50\x65\xd6\x2b\x66\x99\xae\xd7\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4c\x2a\xf9\xb9\xed\x02\x18\x87\x98\x1e\x6c\x98\x80\xe5\xae\x1d\xbc\x76\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x51\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x61\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xfe\x7a\x05\x24\x23\x03\x20\xc8\xc6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xcd\x2f\x21\x3b\x82\x65\x4f\x0b\x14\xc8\x35\x77\xc0\x84\x57\x15\xbf\x03\xfe\x1b\xd3\x87\xc0\xfd\xb9\x39\x8f\xcb\x50\x2e\x55\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x41\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x46\x67\xf1\x7f\xfc\x41\x12\xb1\xa9\x57\xd1\xfe\xf9\xf2\xf4\xe3\xa6\x39\x15\x35\x17\x23\x53\x04\x3c\xcf\x4b\x25\x79\xab\xf7\x8f\x5b\xd3\x4c\xef\x84\x2a\xf3\x59\xfb\x39\x91\x6f\x04\x6f\x37\x35\xc3\x3e\xfd\xb2\xb3\x19\x66\x2e\x41\x20\xd3\xc8\x17\xb2\x50\x55\xec\x34\xce\xb0\x20\xb6\xb8\xa8\xd6\x0e\x65\x83\x8b\x4c\xb3\xe7\xeb\x7e\x66\x7c\x5d\xc6\xf5\x90\x6d\xd3\x54\xa4\x26\x4c\xe1\x0a\x5e\x9b\x6b\x23\xae\xbc\x37\x65\xb1\xbb\x3b\xe3\xc7\xff\xf8\xe9\x71\x4e\xe7\xa7\x9b\xc8\x71\x56\x3f\xd7\x42\xfa\xc9\xfd\x74\x0b\x05\x6e\xf0\x98\x56\x54\xeb\x2e\x8f\xf1\x7e\x17\x1f\xbf\xe2\x5c\x7d\xef\x71\x7d\x8f\xd1\x52\x23\xe8\x9c\x56\x64\xba\x71\x6c\xf4\xcb\xb6\x93\xbe\x09\x47\xae\x89\x73\x59\xe0\x2a\x26\xb7\xe5\x0b\x47\xc2\x0b\x08\xcc\x3c\xca\x82\xa4\x89\x9e\x2f\x78\xf9\xe6\x82\x28\x5a\x03\x8f\x05\x1a\x46\x78\x65\xe2\x61\x81\x71\x70\x98\x74\x8f\xe3\x43\xe5\xe1\x6d\x9d\x52\x36\x45\xbd\x42\x84\xad\x10\x84\xa9\x6a\x11\x04\x4e\x81\x58\xc3\x68\xce\xa0\xd5\x82\x62\x6d\xb5\xc3\x18\x7f\xdc\xa9\x37\x98\x2c\x67\x47\x8d\x17\x5a\x9d\x0c\xfc\x31\x93\x16\xc8\x62\x40\x83\x37\x25\x63\x01\x2f\x15\xc5\x3c\xb6\xa6\x52\x10\x6f\x08\xeb\xb6\xf0\x89\xf5\x8f\x0e\xf5\xd6\xee\xd5\x0e\x32\xe6\xe5\x71\x5d\xfe\xae\xa9\xb0\x9a\x70\x51\x0f\x9d\x1b\x64\xd8\x33\x3d\x23\xba\x75\x06\x79\xec\x1e\xd3\x61\x78\x9b\x4c\x79\x75\x56\x56\x24\x30\x2b\xfd\x02\xb0\xd2\x04\x2f\x51\xcb\x04\x29\xf8\x94\x01\x93\xbf\xfd\x16\x0c\x26\xef\xf5\xc1\x52\x9b\x74\x88\xb5\x55\xb5\x71\xdf\x22\x8d\x51\x3e\x27\x62\x46\xf0\x86\xa7\x30\x6d\x83\xbf\xb7\x6d\x22\x41\x1a\x41\x24\x4c\xa8\x09\xa1\x4b\xde\x8a\x82\xf8\x4e\x21\x2c\x25\x2f\x80\x95\xd8\x24\x09\x3a\xbe\x30\x0c\xa6\xe2\x84\x0b\x84\xd1\x94\xce\x09\x43\x57\x66\x37\x9c\x55\x78\x73\x9e\xac\xc0\xef\xe6\x5c\xec\xb8\x55\xdc\x27\x90\x22\xac\x10\x2e\x6b\x0a\x2c\x0d\x86\x79\xc0\xba\x25\xc3\x56\x83\x9f\xe8\x5d\x2a\x38\xa4\x13\xa2\x8b\x4d\x13\x4c\xbf\xe8\xbd\x90\x55\xe9\x80\x00\x7e\xba\xc0\xc4\x73\x00\x08\x5f\xfc\x1c\x15\x10\x3b\x77\xe5\x61\x22\xa6\xe7\x4b\x3a\x64\x09\x32\xf4\x35\xb0\xae\x51\xeb\x9c\x9a\xe1\xb9\x81\x4b\x74\x4b\x5c\x69\x35\x63\x53\x35\x52\x9b\xfd\x00\x20\x0a\xfb\x65\x12\x07\x5d\x44\x03\x08\x65\xc1\x35\xd6\x85\x37\x46\xbc\xbc\x6e\x48\x31\xe8\xb6\xa0\x5b\x70\xc7\xb4\xe1\x48\xc0\x36\xec\x4f\x20\x05\x8d\x4b\x44\x18\x2f\x71\xa9\x77\x6b\xd8\xc9\x10\xb7\x42\x55\x8f\x56\x04\x0c\xf3\x4e\x5e\x18\xb0\xc3\xbf\x89\xd8\x38\xb5\x68\x8d\x3b\x6e\x4a\xd5\xf1\xed\x5f\xc1\x17\x47\xd8\x0c\xb3\x02\x34\x79\x79\x72\x4b\x1a\x79\x22\xe9\xd4\xb8\xde\xfe\xf2\xd7\xbf\x82\x1f\xce\x2d\xce\xc9\xd5\xf9\xe9\xeb\x77\xe7\xc7\xf5\x66\x6a\xd9\x56\x9d\x72\x0d\x56\x8a\x08\xf6\x2d\xfa\xef\xc3\x7f\x7d\xf3\xeb\xf0\xe8\xbb\xc3\xc3\x1f\x5f\x0e\xff\xf6\xd3\x37\x87\xff\x3a\x86\xff\xf8\x8f\xa3\xef\x8e\x7e\x75\xff\xf8\xe6\xe8\xe8\xf0\xf0\xc7\xbf\xbf\x7b\x73\x33\x3a\xff\x89\x1e\xfd\xfa\x23\x6b\xeb\x5b\xf3\xaf\x5f\x0f\x7f\x24\xe7\x3f\x7d\xe1\x4b\x8e\x8e\xbe\xfb\xfd\x86\x1d\x8d\x24\xe5\x4c\x25\xe2\x4c\x22\xdf\xcc\x48\xb8\xd9\x08\x42\x6a\xb8\x41\x62\x58\x05\xd2\x2e\xa0\xd1\x52\xdb\x4e\xd3\xb2\xff\xd2\xf7\x8a\xeb\x1e\x9b\xea\xab\x46\x9a\xeb\xa7\xe2\x77\xc0\xec\x42\xb9\x56\x9c\x37\x8f\x38\x81\x1a\x77\x49\xe6\x44\x0c\x5c\x1f\xde\xea\x57\x8e\x22\xdf\x18\x42\x1e\xd6\xbd\x2f\x92\x3a\x2f\x72\x83\xb8\x79\x79\xca\x95\xbc\x01\xa6\x3a\x3b\x5a\x10\xdc\xc7\xe8\x23\x16\x94\xb7\xd2\x6a\xc8\x48\x1b\xe1\x9c\x81\x92\x61\x98\x10\xfc\x65\x0f\x81\x17\x93\x36\xb1\xa9\x90\x71\x4d\x7a\xea\xe1\xd2\xd2\x48\xf9\xa9\x3f\xf5\x97\xe4\xd9\xfa\x5b\x9b\x6e\x6a\x22\x36\x82\xcc\xdd\x30\x84\xe3\x12\x22\xca\xd4\xdc\xf0\xa3\x32\x16\xc1\xda\x2b\xda\x29\x34\x9b\x3a\x0b\x82\x29\x83\x46\xdd\x18\xe1\x42\x8b\x89\xbd\x42\x75\x26\x3a\x75\x8c\x60\xb0\x6e\xc6\xeb\x1e\x7c\x1a\x77\xcc\xe2\x85\x63\x2c\xdd\x5e\xb3\x3c\x1b\x4f\xb9\xff\x2f\x26\x3d\xa8\xa4\x0f\xdd\x77\xd4\xae\x7e\x1a\xd1\x0b\x73\x20\xe0\xaa\x1f\x16\x82\x2a\x5a\xe0\xea\x45\x04\x42\xd6\xbd\xa8\xa8\x5a\x6d\x70\x85\xef\x12\x04\xa9\x3b\x6e\xfa\x84\x2b\x74\x4b\x16\x77\x5c\x94\x4e\xfb\x0b\x01\xb3\x9b\xc6\xa2\xf5\xc6\x90\xca\x0d\x07\x00\xf7\x5a\x24\x9b\x50\x8d\xa8\x89\x40\x63\xe2\xd0\x65\x4b\x3f\x5e\x1c\xa3\x53\xb6\x30\x8a\x57\x84\xfd\xef\x23\x27\x41\x31\x58\xd0\x6e\x8d\x25\xd2\x3b\x0d\x56\xeb\x71\x7d\xc3\x2a\xaa\x2a\xdc\x7a\x68\x90\x36\x79\xbc\xe0\x71\x7a\xab\xc3\x06\x71\x61\x69\x6b\x41\x20\x09\x43\xf2\xbb\x29\x06\xd8\xbe\xec\x49\x6e\x0b\xad\xf5\x53\x46\xa4\x7c\xa3\x37\xec\xf6\xce\x0c\x06\x05\xdc\xf6\x05\x88\x6e\x3b\x7a\x28\xa2\x25\x93\x49\xd9\xd3\x2a\x01\x2f\xbb\x5f\x6e\xba\xa4\xa7\x0e\xeb\x02\xd6\x8e\xa1\xa0\xd6\x4d\x53\x25\xc3\x00\xaa\x09\x74\xea\x5f\x9c\x5e\x6e\x1a\x66\xb3\x1c\x57\x46\x85\x96\xdd\x18\xbb\xf2\xa0\xfd\x51\x82\x2d\x66\x79\x89\xc8\x2f\x2d\xae\x00\x39\x79\x23\x5a\xb2\x69\x65\xe1\x28\x83\x83\xa8\x3b\x2e\x6e\x4f\xfe\xfc\xd7\x97\x60\x73\xf8\xde\x0d\xa7\x1b\x5f\x51\xb1\xf9\xde\x51\x99\xde\x4b\xc5\xcf\xcb\xab\x70\x23\xbb\xb5\x74\x0e\x0d\x8b\x89\x35\x15\x39\xf4\x0e\xf0\x0b\x14\x85\x35\x88\xca\xeb\x8e\xcf\xe8\x1e\x76\xdd\xbd\x59\x34\x9b\x2b\x49\xf1\xc9\xd8\xbd\x76\x93\x41\x9f\x67\xe1\xdb\xcc\xaa\x48\xb3\x24\xbe\x9d\x00\xba\x70\x20\x83\x8f\x81\x22\x07\xa4\x39\x40\x6a\xe0\x86\x59\x34\x09\x74\x40\x59\x10\x8d\x91\x78\x11\xe7\x60\x03\xd6\x8e\x27\x95\xb9\x57\xbd\x96\xed\x4d\xea\xd4\x82\xa5\x2f\x7d\x05\x0c\xcb\xf9\xb4\xa9\x7a\x62\x58\x40\xa1\x48\xa5\xaf\x78\x66\x9d\x3f\x00\xcc\xaa\xb4\x19\x57\x1a\x36\x53\x2c\x94\x51\x98\xdd\xd4\x6c\xaa\x1b\x77\x3c\x30\x25\x41\x78\x8e\x69\x05\x68\x78\x70\x25\x71\xd9\x03\xc7\x98\xc1\x16\x9c\xc9\xb6\x86\x1e\x6d\x1a\x4a\x1b\x2f\xac\x36\x11\xe3\xdf\xa4\x86\xe4\xb1\x6a\x66\x9f\xa6\x83\xdf\x5c\x35\x7b\xbd\x60\xb8\xa6\x85\x5b\xc5\x53\xb3\x6c\x40\x24\xd9\xa3\x8f\x8f\xf7\xca\xea\xee\xd7\x75\xab\xf4\xd4\xc6\x28\x27\xdb\xb8\x19\x22\xc2\x3e\x70\x99\x04\x47\x21\xcc\xa9\x20\xf7\xb8\x50\xd5\x02\x22\x2a\xbd\x1f\x0d\x10\xa1\x90\x77\x6a\xe0\xe8\xd5\xe6\x8c\x27\x5c\xd8\x9d\x65\xf4\xd9\xde\xdb\x6f\x48\xdd\x00\x9b\xa1\x55\xe0\xa5\xa1\xfd\x55\xad\x60\x8e\xc8\x74\xe9\x2f\x36\x6e\x3e\x00\x25\x46\xe4\x91\x5d\x28\x84\xcb\x52\x22\xec\x8b\x29\x51\x65\x14\xef\x96\xd1\x5f\x5a\x52\x2d\x10\x2d\x09\x53\x1d\x70\xad\x3f\xc5\x96\xef\xc9\xca\x87\xcd\xc5\xfa\x59\x77\xbe\x8d\xba\x4f\x48\xe9\x2a\x10\x59\x7f\xf2\x03\x6b\x6a\xdc\xbf\x60\x26\x68\x5d\x3d\xc2\x4c\xd8\x92\x4e\x10\xc1\xce\x92\xa2\x0a\xc4\x32\x12\xe4\x48\xfb\x80\x30\xec\xfa\x8d\x64\x48\xa4\x4d\xbc\xaa\x58\xde\x4a\x11\x00\x48\xf3\x74\x9c\x09\xfa\x02\x44\xaf\x2f\xaf\x7f\x7e\x7b\xfa\x5f\xe7\x6f\x9f\x9c\x09\xb2\xa7\x2a\x6c\xee\xd5\x30\x4f\x8e\x25\xb8\x5a\xee\xc8\x72\x58\x7c\x49\xfe\x38\x0b\xdc\xea\x73\x32\x96\x4a\x88\x39\xd4\x98\x29\x9f\xee\x10\xfd\x51\xef\x3a\x0f\x84\x37\x9f\xac\x19\x92\xbe\x8a\xd7\xca\x5d\x5f\x12\x2c\xaa\x5d\x13\xd7\xda\xee\xde\x09\x47\xb2\x13\x7b\xa8\x37\xb5\x9f\xde\x4b\xee\xa7\x51\x8d\xae\xee\xc3\xac\x7b\x0a\x58\xb2\xfd\xed\x1c\x64\x86\x01\x2d\x90\x09\xbe\x62\xc4\xc8\xdd\xb2\xba\x60\x6e\x72\xfd\x17\xb1\x7b\x6a\xcc\x5b\x56\x9a\xdb\xcd\x0e\xc1\xf8\xbe\xc3\x94\x9e\x92\x54\x44\x39\xcf\x55\x9a\x82\x80\x9c\x9a\x0d\x4c\xaf\xe0\xf3\x82\x77\x1b\xc5\x1d\x0a\x9e\xb9\x33\xe4\x25\xb2\xfe\x64\x80\x70\xc5\xd9\xd4\xd2\x0b\x47\x35\xdb\xa5\xfb\xfb\x28\xc2\x60\x65\xb2\xa1\x66\x2e\xb6\xd7\x84\xe9\x8b\xd5\x69\xd2\x37\x6b\xb8\x5c\xba\x4d\x41\x0a\x2e\x4a\xe3\xd3\xd1\x13\x6f\xdc\x37\xc7\xbd\x13\x77\x0d\x9f\x11\x19\xbd\xb1\xd6\xea\xdd\x30\xbf\x8c\x43\x55\x8e\x69\xe0\x23\x03\xc3\xc7\x68\x3a\x51\xcd\x2d\x85\xca\x7b\xa2\x3c\x20\x7f\x10\xbc\x42\x4d\x85\x19\xb1\xe5\x40\xbc\x03\x36\xcb\x34\xef\xe5\xfa\xe7\x9e\xaf\x20\xab\xd2\x9b\xf8\xdb\x70\x7c\x78\xce\x65\x53\xd9\x00\x1b\x22\x15\x3e\x41\x67\xa3\x0f\xb0\x4d\xde\x91\x9a\x8b\x45\xd7\x49\xaf\xa2\xeb\x53\x80\x37\x16\xd6\xeb\x93\x72\xb4\xb9\x64\x21\x82\xce\x41\xbc\x30\xc7\xce\xa2\x74\x74\x4f\xde\xd2\x9a\x2a\x48\x16\xdb\x34\x2e\x54\x34\x2d\xc4\x93\xd0\x8b\x1a\x46\xf3\xa2\x2f\x90\x25\x32\xcc\x3a\x4b\xfe\x1e\x2c\x88\x09\x77\x38\xec\x62\x8a\xab\xc0\x84\x57\xf5\xbf\x18\x19\x4e\x05\x86\x80\x8d\x13\x20\xdc\x54\x5b\xb1\x5d\xc2\x81\xa3\x22\x4a\x5e\x6b\x6b\x40\xc0\xc4\x0e\x8c\x57\x49\x4f\xa5\x7f\xbd\x9c\x61\x01\x16\x75\xad\x2f\xa1\xfe\x7a\xe0\xa8\x8b\x7f\x53\x3f\x8e\xb6\x68\xdf\x92\x39\xa9\xba\x4d\x68\x3d\x32\x1b\x36\xbc\x79\xf9\xbf\x68\xd3\x34\xde\x52\x2c\x22\x9c\x9a\x28\x8b\x82\x69\xf7\xb1\x16\x4c\x9d\x3a\x29\xf5\xe1\xf6\xa7\x79\xd0\xcb\x5b\x6e\x48\xd1\xbf\xb2\xa3\xaa\x21\x81\xbf\x41\x1f\x9e\x8e\xaa\x3d\xa4\xce\x8f\xba\xd3\x1e\xd9\x55\x88\x1e\xcf\x5d\x88\x3e\xe1\x32\xd4\x62\xaf\xc0\x0c\xc4\x8f\x03\xfb\xe9\x23\xdf\x1d\xca\xcd\xef\xd2\x14\x8e\xe1\x68\x86\xe1\xde\x5e\x7d\xd0\x57\xa8\xd5\x11\xc2\x94\x58\x58\x00\xe8\xb5\xde\x6f\x7d\xa1\x1b\xaf\x3b\x44\x53\x0b\xa7\x11\x0b\x47\x93\x02\xa7\x52\x02\xa7\x10\x62\x66\xab\xd6\xf9\x09\x4e\xf6\xde\x62\x83\x49\xb0\x2a\x5d\x62\xab\xdc\x20\x0b\x47\x1e\xf1\x12\xdd\x01\xaa\xa0\x4f\x98\x60\x0a\x02\x5f\xe8\x6e\xdd\x76\x85\xce\xdc\xf5\xea\x82\x21\xd1\x4d\x5b\x87\x5a\x32\x27\x76\x06\xce\x28\x0b\x63\xde\xf6\x46\xb0\x7a\x5a\xcf\x6d\x51\xcc\xb8\x24\xcc\x82\xe1\x85\xfb\x01\xeb\x07\xa0\x4b\x73\x3d\x26\x55\x90\xb6\xc4\x1d\x64\x4e\xc4\x42\x41\x24\xd4\x13\x19\x5b\x07\xa8\x5c\x0a\x83\x05\x60\xe7\xe8\x86\x41\x66\xdb\xec\x00\x00\xba\x4c\x9c\xf3\x15\x46\xba\x95\x1d\x91\x97\x69\x29\x52\xb4\xe5\x23\x58\x82\x52\x49\x5b\xd1\x9c\xac\xa9\xd1\xb1\xe3\x03\xc7\x24\xbe\x87\xd2\xc0\x9d\x8d\x54\xf0\xba\x69\x55\x10\xa4\x75\x41\xdc\x98\xd5\x4f\x22\xab\xa8\x31\xc3\x53\x32\xf4\x1d\x19\x06\x09\x49\x91\x2a\x44\xe4\x85\x9a\x03\x2b\x8f\x9e\x13\x5e\x1e\xc5\x63\xe6\x51\x06\xdc\x3c\x4a\xc5\xce\xa3\xbc\xf8\x79\xd4\xdd\x4a\x5b\x39\xba\xde\x65\xb0\x74\x78\x6d\x5d\xef\x4f\x1d\x5e\xa7\x09\xc6\x9c\x5e\x20\x0d\xb6\x2d\x53\x89\x78\x4d\x95\xc3\xe7\x05\x7a\x02\xb0\x86\x86\x34\xa5\x56\xd0\x00\x3a\x12\xc3\xfd\x49\xee\x9b\x8a\x16\x54\x05\x1c\xce\x65\x8c\x15\x16\xd0\xd0\x72\x6d\x36\xd1\xda\xa5\xc9\x43\xfd\x47\x67\xf6\x59\x6c\xba\xef\x7b\x61\x38\xd2\xc8\x7d\x41\x88\x73\xb9\xec\xa5\xd9\x5e\x9a\x7d\xe1\xf3\xb5\x49\x33\x5b\x8f\xf9\xe9\x53\x81\xae\x4c\xc3\xa8\xe9\x52\x7f\x56\x6a\xc5\x7a\x3e\xd6\x88\xb0\xbe\x4d\xfa\x39\x85\x6a\xf2\x03\xf4\x9e\x7d\x6f\xaa\x7c\x0e\x4c\x1e\xd0\x31\xba\x60\x48\xf2\xda\x56\x24\xbd\x57\x72\x60\x34\x5e\x8c\x64\x3b\x96\xc4\xea\xbb\x5c\x12\x97\x31\x6c\xd3\xae\x1b\x22\x8c\xe8\x8b\xcc\x19\xd2\xd2\xca\x74\xea\x91\xc9\xbe\xee\xb8\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\xff\x0c\x3d\x59\xde\xc9\xef\xec\xba\x0f\x9b\xcd\xb9\x44\x62\x71\xe7\x41\x32\xe6\x53\x67\x6b\x5c\x2d\xb5\xdd\x83\xa2\xf6\x52\x59\xfb\xc1\x63\xe0\x64\x33\x68\x6a\x34\x15\xbc\x6d\x5c\x58\xb0\xe3\xfd\xd5\xa6\xf8\xa6\xf0\x21\xae\x27\x23\x08\xe2\x9a\xbc\x83\x7e\x47\xbc\x39\x0f\x9e\x07\xd2\xd9\x9d\x60\x51\x4a\x39\x58\xcb\xbe\x2e\x5a\x16\x91\xf3\x60\x12\x60\xb9\xe8\x28\x22\x09\x7a\x51\x91\x29\x2e\x16\x2f\xfa\xbd\x5a\xc3\x84\x6a\xbd\x96\xfa\xfa\xd5\xd7\xba\xe9\x9d\x2b\x2d\xbb\xa9\x63\x1f\xea\xd5\xc2\xd5\x6d\x50\xc0\x06\x50\x26\xed\xf0\x5d\xce\x85\xdd\x4a\x36\xf7\x7f\x63\xe7\x44\x74\x9a\xee\x9f\xff\xfa\xe7\xa1\x63\x3f\x80\x61\x3e\xc5\xb9\xe9\x91\x6d\x6e\x2f\x5d\xa3\xb7\xdb\xc6\x04\x95\x54\x36\xb0\x33\xc1\x03\xde\xe5\x3c\xf8\xee\xe6\xcb\xbd\x59\xdf\xa4\xdb\x0c\x91\x0d\xa6\xad\x06\x65\xd3\x27\x4f\x9f\xb9\xee\x37\x6d\xcf\x1d\x6f\xf0\x2f\x6d\x57\x51\xd6\x5e\x56\x46\xd9\x0e\x16\xd0\x4e\x22\x94\x58\x0d\x58\x5e\x23\x2f\x57\xbd\x35\x56\x7b\x03\x7a\x75\x27\x41\xfc\xd2\x49\x85\x17\x4e\xa2\xf6\x07\x51\x42\x1a\x0c\x71\x35\xb4\x36\xec\x45\xc7\x4d\xeb\x45\xa0\xd6\x42\xeb\x06\x2e\x59\xf7\x6d\x34\xc6\x75\x79\xbe\x97\x03\x19\x58\x99\xc4\x12\x00\x44\x58\x7e\x0a\x53\x47\x05\xf0\x22\x35\x9f\x03\xbb\xa7\xd6\x29\x26\x8a\x88\x3b\x2c\xca\x0d\xef\xfc\xad\xa6\xd7\xf4\x87\x0f\xbb\xad\x23\x05\x81\x8b\x73\x64\xd8\x4c\xa7\x2d\x16\x25\xe4\x53\x75\x7b\x62\x8f\xa8\x5d\xf7\x6c\x1d\x51\x6b\xb3\xa6\x03\x01\xb0\x79\x84\xd9\x3d\xe7\x58\xeb\x41\xfd\x37\x99\x58\x09\xe4\xb7\x2d\xe1\xb2\x20\x43\x7a\x8f\x9b\xd9\xc8\x45\xbc\x44\x14\xf6\xa4\x77\x4d\xbf\x69\x34\xe3\x55\x09\xca\xea\xb0\x22\x73\x52\xf9\xae\x69\x81\x2b\xe8\xb8\x55\x96\x70\xa9\xe0\x75\x6d\x73\xdf\x6d\x19\x79\x93\x27\xbf\xb1\xb1\x63\xf8\x01\x71\xf5\x6d\x8f\x6b\x01\x6e\x97\x63\xdd\x3d\x02\x3b\x23\x1c\x25\x98\x90\x4e\x29\xb0\xd7\x20\x9f\x20\xa2\xb7\x69\xc4\xf6\xdb\x02\x90\x62\x89\x7d\x71\x1b\xce\xc5\xa5\x2e\xb8\x78\xd7\xa9\xfd\x18\x71\x43\xdb\xa8\xd7\xa2\x95\x64\xa5\x48\x54\xc7\xab\x15\x09\xc4\xbf\xe4\x90\xa4\x0e\x25\xbf\x7d\xc0\xb3\xf0\x65\x0d\xf4\xb5\x0b\x19\xbc\x10\x6b\xe5\xf2\x98\x59\x2c\x71\x34\xbf\x5a\x92\xf3\x2c\x25\xb2\x6e\x9c\x40\x1b\xff\x61\x5a\x54\xbd\xe2\x05\xae\x80\x4b\x38\x76\x8b\xa1\x6c\x41\xd5\xe5\xbe\x04\x24\x0a\x58\x0f\x13\x3e\xab\x38\x2e\x1d\x47\x3a\x71\xe5\x10\xb0\x5a\xb2\xbf\x63\x63\x91\x86\xc4\xc4\xb4\xe4\x72\x3f\x1a\x41\x02\x2e\xab\x5e\xc3\x1c\x2a\x90\xc4\x36\xf6\xae\x0f\x23\xb0\x23\x0b\x39\x06\x6d\x57\x92\x1a\x70\x04\x64\x13\x10\xc7\xbe\x9e\xa5\x96\x95\x54\xa2\x17\x6f\xdd\xa4\xbf\x48\xa9\x72\x1d\xed\xb8\x54\x91\x49\xc5\xb9\xf6\x9c\x99\x07\xbf\xcf\x8c\xff\xe2\x96\xea\x99\x9a\x74\x42\xce\x6d\x09\xcf\x49\xd7\x34\x15\x8d\xdf\x65\x1f\x71\x45\x4b\x2f\x39\xb1\x48\x28\xf3\xea\x97\x0f\x0d\x83\x43\xd2\x08\x32\x5c\x3d\x28\xf1\x90\x03\xeb\xf1\x71\x0e\xcb\xe1\x67\xeb\xe3\x24\x6e\x5c\x84\x3e\x30\x38\x73\x8c\x94\x5a\xdb\xe2\xdd\x52\x10\x36\xe1\xc2\x38\x63\x9e\x7c\xc3\x5a\x82\xed\x6d\x5c\xc3\xa7\x9e\xc8\x25\x64\x7f\x36\x2e\x48\x0b\x3f\x84\x3d\x69\x3c\x98\x7d\xb7\x79\x87\x72\xdd\xbc\x5d\x28\x06\x60\x4b\x9b\xe9\x99\xb3\xf1\x7e\xd8\x00\x7f\xb7\xb5\x59\x94\x4b\x45\x30\x74\x82\x77\xba\xd1\x19\x6d\x8c\x10\xc3\xca\xfe\x79\x8c\x70\x80\x1c\x13\xfd\x42\x5f\x7d\xb2\xe1\xe5\xb7\x31\x78\xc4\x57\x26\x45\x85\xdf\x01\x69\xe5\x9b\x8b\xd7\xfe\x2c\xeb\xb7\x7e\x7f\x1d\x43\xfb\xad\x9f\x3f\x98\xf7\x4a\xa2\xa6\xb4\x44\x63\x5b\x1e\x94\x28\x74\xc8\xc8\x1d\xd2\x67\x40\xda\x14\x20\x4f\xfe\x61\x67\xd3\xb5\xef\x87\x67\x3b\x71\x14\xd1\x8b\x3f\xda\x04\x1c\x22\x1c\xd7\xd4\x98\xda\x62\xe7\xef\xaf\x0e\x1c\x63\xe7\xdd\x50\xdc\x0d\x87\xc3\x61\xcc\xfc\x39\x9f\xf0\xa0\xb7\xf2\xde\xcb\x52\xf3\x92\x4e\x16\x4b\xeb\xaf\xef\x9b\xae\x4b\xa0\x7b\x63\xb6\xb0\xe3\x7f\x46\xba\x60\x6c\x64\x2f\xa0\xb1\xfa\xcb\x9f\xe2\x44\x4d\xc8\xe5\xbf\x0d\xb1\xb3\xa6\x1b\x9e\x31\x62\x4c\x66\x78\x4e\xb5\x09\x30\x31\xe7\x5f\x9f\xac\x87\x56\xdf\x69\x34\xd1\xb2\xc0\xb2\x47\x18\x66\x29\x72\xdf\x70\x09\x27\x0a\x60\x89\x23\x0e\x19\x68\x7d\xea\x58\xe3\x67\x6b\x1a\x28\x9a\x18\xd1\x60\x4f\xe8\xd9\x18\x8f\x49\x8b\x70\xb3\x82\xc6\x58\x77\xc2\x0f\xf9\x70\x69\xc3\x47\x55\x3a\xbc\xb0\xa7\x0a\x5c\x26\x8c\x23\x32\x99\x90\x02\x4a\x12\x91\x66\x46\x6a\x22\x70\xd5\xef\x9a\x6c\x8b\x19\xc2\xf2\x5b\x6d\x81\x0b\x7d\x40\x8d\xb2\x5a\xe3\x8d\xcb\x0d\x20\xcb\xd8\x01\x36\x75\x49\xa3\x20\x9e\x46\xb5\x09\x18\xaf\x5f\xbc\x67\x57\x9c\xab\x77\x54\x82\xa6\x6b\x93\x52\x4c\xbc\xf3\xc5\xf1\x1a\x1f\xbf\xfb\xce\xa3\x5a\x9f\x8f\xa0\x88\x52\x2a\x3a\xb2\xf7\x6d\x1c\x70\x7d\x6d\xe8\xdb\xd0\x47\x20\x2d\x84\xb9\xe1\x94\xa9\x95\xb2\x42\x5a\xaf\x2b\x22\x28\xb7\xf4\xf3\x41\x12\xe9\xe3\x74\x4e\x4f\x8c\x63\xc5\x34\xcf\x3b\xbc\xf0\x79\xa8\x96\x62\x79\xc9\x49\x65\xe2\xa8\xf6\xbb\x31\x57\xb3\x15\x2f\x56\x5c\x4d\xea\x11\x2f\x97\x5e\x34\xe8\xd8\x13\xfb\x6c\x5f\xcb\x0d\x2a\x80\x67\x6b\x93\x92\x94\x84\x6d\x5c\x08\x05\x79\x96\x0e\xac\xd2\xb0\xd8\xbf\xa1\xbb\x14\x4e\xd8\x25\x07\x39\xb4\x8d\x33\x76\x11\x70\x41\xc2\x7c\x87\x27\x0a\xbc\x0c\xfa\xe8\x61\x60\x4e\xe1\x6c\x28\x38\x87\x08\x77\xd4\xb2\x5e\x4c\x6c\xf5\xfe\x15\x35\x6d\xae\x25\xb3\x2b\x91\x0e\x25\x45\x11\xee\x02\xe7\x8a\x23\xc2\x64\x2b\xec\x9e\xd8\x98\x11\x55\x3f\x25\x27\x26\xe4\x67\x87\xf3\xe1\xe2\x35\x7a\x89\x0e\xa1\xe8\x2f\x88\xfd\x09\xa6\x95\x27\x7b\x5a\x2e\x72\x0a\xa5\xea\xf5\x2b\x22\x87\xed\x21\x0b\x13\x5c\x49\x32\xd0\x77\x27\x5c\x8d\x76\xdc\x5a\x07\x71\x2a\x77\x43\x04\x10\x55\xc6\x81\x96\xbf\x06\xb1\x13\x7b\x7c\xc7\x9c\x57\x64\x63\x10\x87\x2f\x96\xb2\xad\x1b\xee\xc3\x93\xdc\x70\x61\x5c\x42\x9f\xdf\xfe\x92\x98\x23\x57\x13\x85\x4b\xac\xb0\xbd\xf9\xdc\x0f\x7e\xb3\x1b\x71\x7f\xff\x7d\xd9\x93\x72\xff\xd9\x02\x5b\xdb\xb6\x25\xd7\x74\xc3\xdb\x92\x33\xeb\x52\x0a\x8b\xd1\x5f\x9f\xc3\xef\x4d\xc5\x54\x40\x1b\x18\xaf\xab\xf3\x70\x19\x2b\x48\x06\x39\xb7\x91\xc4\x61\x60\x74\xcd\xb0\xec\x9b\x5b\x8c\x97\xee\xc6\x2e\x79\x98\x15\xef\x3b\xa6\xf7\x21\xf7\xdd\xf0\xb7\xdf\xd2\xcf\xf2\x58\x51\x50\xc8\xca\x84\x40\xad\x09\x75\xa5\x4f\x96\xa4\x73\xf2\x22\x2a\x41\x37\xf8\x7b\x54\x13\xcc\x24\x12\x04\x66\x1a\xac\xf8\x09\xcc\xb0\x71\x5f\x71\x43\x8f\x3b\xe2\xa5\x1f\xeb\x72\x94\xcf\xa9\x11\x31\x63\x35\x3c\x5b\x06\x4a\x2b\x2b\x7e\x07\xe7\xbb\xc2\x62\xea\x9c\x05\x72\x80\xc6\xad\x32\x7e\x47\x89\x6a\x7a\x0f\x95\x00\x7c\x99\x32\x98\x8d\x96\x05\x1f\x8c\x78\x29\x7d\xce\xbf\x67\xfc\xb1\x46\x33\x0f\x49\x80\xc0\x29\x1e\x33\x79\xbd\xe5\x80\xfc\x0a\x70\x8c\x22\x52\xd1\x29\x54\xa3\x0e\x67\x0b\xbc\x6f\xff\x33\xe4\x0e\x58\xfc\x3f\xc8\x66\x64\xc0\xdf\x47\xcf\x99\xcf\x02\xb7\xab\x23\x5d\x20\x0c\x5b\x96\xcd\x70\xd8\x36\x3c\xeb\x3f\xee\x1d\xae\xc8\x23\x63\x01\x5e\x0d\x97\xa6\x02\xb7\xd6\xec\xd6\x36\x6e\x78\x17\x3e\xb7\x64\x31\xbd\x38\x77\xf3\xed\xe6\x1a\x03\x90\x73\xa8\x04\x21\xe8\x7b\x3a\x16\x44\x8b\x1b\x46\x2a\x68\x92\x5e\x9f\x5d\x5f\x74\xbb\x4a\x7f\xa4\xe7\x2e\xf8\x30\xa2\x0b\x77\x00\x09\xd7\xef\x28\x05\x9d\x13\x81\xf4\x1d\xd2\x42\xf6\xb7\x9b\x64\x27\x11\xc6\x0b\x5f\x25\xc0\x16\x76\x84\xef\x61\x33\x19\x9c\xbe\xf5\x11\xd3\x98\x34\x82\xb3\xeb\x8b\xd7\xa6\x07\x94\x49\x85\xb5\x96\x87\xde\x03\x1f\x65\x38\x39\x18\xbc\x2b\x48\x90\x21\x2c\x7d\x45\x4a\x24\x9c\x24\xa8\x36\x2e\x7b\x81\x56\x0e\x83\xd1\x01\x02\x72\x57\xf0\xc3\xc1\x55\x6a\xa7\x03\x7e\xde\x63\x18\x08\x8a\x31\x44\x1d\xc7\x65\x27\x12\xac\xec\x97\xb4\x36\x58\xea\x7c\x82\xcb\x69\xf3\x3e\x94\x54\x7e\xaa\x13\x20\x07\xaf\x08\x2e\xff\x21\xa8\x22\xef\x59\x41\x02\x99\x12\xe9\xd9\x0b\x85\xbe\xcb\xaf\xe0\xe1\x16\x49\xe5\x7a\xc0\x70\x7d\x1a\x76\x99\x40\x26\x81\x33\xb3\x7f\x9f\x43\x2c\xc1\xf2\xa5\x5a\x6e\x84\x25\x55\x91\x8b\x75\x0a\xa4\xbd\x9a\x42\xbe\x88\x98\x70\x5a\x4f\x64\xf6\x24\xa3\x95\x59\x16\x4f\xd0\xfb\x6a\x8d\x06\x13\x16\x91\x92\xb6\x70\xb6\x01\x86\x4e\x89\x42\x52\xb5\xc5\xad\x1e\x85\xe7\x26\x3d\x73\x64\x59\x00\x73\x7d\x46\x8a\x6b\x94\x6f\xb3\x5f\xda\x75\x5b\xd6\x9f\xdb\x78\x85\xb3\x41\x78\x10\xc3\x5f\x8d\x97\xc6\xfb\x1f\xfa\x40\xf5\x15\xed\xc8\x51\xe7\x19\x2e\x6d\x84\x91\xc0\xac\xe4\xf5\x4a\xff\xf4\xc9\x24\xb8\x98\x45\xf4\xa3\x33\x89\x36\xb5\x0f\x63\x42\x32\x0f\x58\x94\x09\xf6\x61\x4c\x90\x78\xc9\xa2\x7c\xde\xf6\x61\x24\xee\x2c\x11\x04\x46\xe6\xa4\xca\x80\xc2\x01\x86\x2b\x3d\x09\x5e\xd4\xc3\x07\x46\xe0\x2f\x83\x14\x7a\x47\x64\x2b\xd8\x23\xc1\xb3\xe0\xdd\xae\xb8\x81\x45\x62\x3f\x6c\xfd\xe2\x9d\x1d\x75\x26\xc4\xd5\x8d\x05\x90\x75\xa3\x06\x28\xd5\xae\x8e\xba\x8d\xf2\x3e\xa2\xe5\x51\x7f\x90\xa6\x74\x58\x37\x6a\x70\xf4\xed\xe2\xa8\xfb\x45\xcf\xb7\x75\xf7\xda\x5e\xec\x61\xc2\xbd\x67\x0f\x13\x7e\x6c\x98\x70\xc0\xf1\x87\xc1\x8f\xd5\x03\xee\x3e\x57\xb0\x30\x30\xd1\xeb\x59\x24\x86\xa3\xb7\xc1\x6a\x36\x00\xc7\x9d\xa2\x73\xc7\xfd\x8b\x6e\x4d\xd8\xef\xa0\x57\x83\xd7\x1d\xc4\x0e\x47\x6d\xa8\xfe\x32\x61\x8b\xd7\xe1\x89\xcd\x6f\x2e\xdf\xdf\x84\x44\x7f\xd8\x95\x7f\x8b\x2e\xde\xb3\x2b\x37\xe0\xe3\x60\x8e\x97\xd7\xe9\xf1\x20\xc7\x91\x6f\x5a\x8f\x38\x7e\x8a\xf3\xf6\x65\x28\xe4\x65\x0c\x72\xa6\xc6\x97\x01\xc9\xab\x6f\x4f\x5a\xa1\x94\x8b\x3e\x00\x04\x03\x8e\x68\x2b\x86\xf6\xa9\x4f\x38\x06\x4c\x72\x2f\x5a\x03\x95\x21\xa9\x80\x32\x90\x10\x5d\x85\x48\x2c\x65\x26\x15\x2b\xa4\x0a\x8a\x31\x43\x1d\x61\xcd\x8a\xca\x65\x4a\x6e\xd6\x58\x2c\x00\xe2\x04\x08\x04\x8b\xdc\x3b\x0c\x33\xa1\x8f\xc0\x0e\x8e\x11\x24\x33\x82\xae\x57\x66\xdf\x95\x2e\xb6\xee\xbe\xd0\xdb\x18\x47\xd3\xba\xba\xc0\xae\x09\xd0\x72\x4a\xa2\x88\xa8\x6d\x11\x2f\xa2\x6c\xd1\x56\x49\xac\x2f\xdc\xcf\x4f\x1c\x00\x9b\x1b\x77\x32\xc1\xa5\xc3\xef\x1a\xcc\x79\x4d\xea\xb1\x81\x3d\xca\xd5\x92\xeb\x1e\xd4\x51\xe3\x69\x94\x8c\x5f\xf6\xa7\x30\x1e\xf0\x12\xf9\x1d\x26\x88\xfe\xd4\x4c\x2c\x6f\xa7\xb3\xd5\xae\xc5\xa0\x58\x3e\x39\x18\x88\x54\x49\xd5\x23\xbd\x28\x49\x63\xef\x63\x23\xf3\xb2\x2f\xf1\x33\x52\x88\x9f\x98\x85\x37\x95\x7a\x29\x25\xac\x9e\xb1\x1a\x20\xfa\xc4\x16\xd8\x86\x30\x7f\x1d\x84\xe5\x57\xf3\x4d\xa4\x43\xcd\x18\x99\xbe\x82\x9d\xb1\x91\xa6\x02\x57\x05\x14\xb9\x8e\xda\xbf\x6b\x42\xe0\x44\x4c\x89\x0d\x7e\x5f\x2b\x41\x0b\xb5\x1e\x3f\x6c\x7f\x97\x10\xcb\x39\x3c\xad\x9a\x19\x3e\x42\x1f\xa4\x8b\x20\x9b\xe3\xe3\x23\xae\x5f\x24\xf8\x21\xce\x63\x7c\xcd\xf6\x02\x88\x8c\xda\xac\x57\x73\xc0\xe2\xf0\x14\x77\x1d\x36\x1d\xbc\x9f\xd4\xf3\xcb\x3f\x23\xd9\x11\xa7\xfd\x2c\x64\xa1\xaa\xad\xa8\x3c\xd7\xa6\x69\x48\x85\x47\xd8\xeb\x3f\xbe\xb4\x50\xe9\x3a\xd7\xc5\xf3\x7c\xf5\x07\x08\x3e\x01\x30\xa0\x65\xbe\xda\x42\xcc\xc5\x61\x5b\x38\x7c\x08\x92\x71\x84\x6a\x3a\x9d\x29\x8f\xbd\xac\x70\xcb\x8a\xd9\x33\xda\x15\xdb\xe4\x75\x37\x2b\xec\x51\x4a\x18\xdd\x6a\x69\x5f\xa1\x06\x0b\x5c\x6b\xb5\xcb\x9e\x6f\x49\xa2\x22\x17\xcf\x92\xc5\x5d\xff\x29\x88\xe5\x88\xbf\xdd\x19\x06\xf8\x4b\x5f\x65\xcc\x76\x69\x01\xe8\x95\xa8\x65\x44\x39\x58\xcd\x61\x46\xb3\x0c\xed\x23\x04\xd9\x76\x65\x6c\x59\x55\x24\x2b\x49\xb6\x1c\x4e\xfe\x87\xe9\x85\xd3\x39\x0a\xcf\x68\xf2\xf8\x21\x65\xe7\xbf\xb1\x44\x98\xb8\x8f\x97\x5c\x8a\xc4\x86\xcc\x7c\x91\x1d\xf8\x0c\x74\x78\xbb\x88\xf4\xf8\x1b\xa9\x8a\xc3\x65\x6e\x31\x42\x3b\xad\x25\x3e\x13\x04\xaa\x9e\xe2\xea\xba\x21\xc5\x36\x1d\x98\x6f\xde\x5d\x9f\xf6\x7b\x03\xf7\xbc\x2d\x4b\x41\xe0\x7b\x84\x4b\x97\xfa\x79\x47\xc6\x33\xce\x6f\x23\x1b\x3b\x0c\x18\x19\x67\xed\xf8\xb8\xe0\x75\xc0\x72\x3a\x94\x74\x2a\x4f\xac\x60\x18\xea\x69\x3a\x42\x94\x55\x70\x5d\x3b\x7d\x88\x30\xe5\x4c\x96\x84\x01\xa3\xc2\x8f\x18\x36\x94\xa5\xde\xb4\x7a\xd7\xea\x94\x5c\x26\xb1\x5c\x25\x5f\x29\xab\x3b\x26\xb6\xec\xe7\xd2\xae\x79\x60\xa4\x4b\xe5\x3b\xfd\x36\x58\x9e\x35\x13\x00\xdc\xca\x94\xd8\x98\x91\x36\x51\xb7\x79\x7a\x7e\xe8\xba\x11\xfa\xee\xe8\x24\x94\xe7\x81\x5f\xd9\x27\x87\x1d\xe8\xbf\x44\xf6\x4f\x0f\xd2\x4b\xb1\x9c\x56\x95\xd1\x13\x46\xbc\x3c\x90\x61\x30\xb6\x23\x6d\xf3\xd8\x37\x03\x8c\xa7\x73\xd2\xeb\x7f\xac\x22\xa8\x9f\x43\xea\x21\xc4\x0e\x2b\xaa\xb8\xa3\x8a\xab\xe9\xbd\xee\x5b\xd8\x56\xd0\x3f\x53\x00\x93\x0d\xd7\x7f\x1d\x95\x77\x8d\x20\x51\xcf\x7b\x19\x07\x7a\x3d\xc2\xd7\xeb\xfd\x2d\x5a\x62\x8a\xae\xeb\x2f\x2e\x89\xba\xe3\xe2\xd6\xcc\x55\x88\xb3\x52\x1c\x7e\x99\xb2\xc5\xe3\xd2\xac\x50\x98\x6a\x95\xe9\xb4\x47\xef\x72\x48\xbb\xb2\xfd\xd0\xf7\xbf\xd3\x9a\x1e\x3f\x0d\x0b\x2d\xa5\x62\xfd\xff\xec\xbd\x7b\x73\x23\xb7\xb5\x20\xfe\xff\x7e\x0a\x94\xb2\x55\x92\x1c\x92\x33\x63\xe7\xb5\xb3\xf9\x25\x25\x4b\x9a\x44\xeb\x19\x8d\xee\x68\x6c\xd7\xfd\xc5\xd9\x1b\xb0\x1b\x24\x71\xd5\x0d\xb4\x01\xb4\x24\xfa\xe6\x7e\xf7\x2d\x9c\x03\xa0\xd1\x14\x45\x91\xdd\x90\x48\x4d\x84\x54\x65\x2c\xb2\x09\x9c\x06\x0e\xce\xfb\x61\x27\x7e\x82\x74\x2c\xb2\x3c\x25\xeb\xae\x88\x34\x7a\x9c\xa4\x2c\xb2\xed\x0c\x41\xd2\xa3\x86\x2e\x53\xd7\x3c\x63\x47\x59\x06\xa1\xf0\x1b\x2d\xdd\x0f\x5d\x4f\x98\x7d\x65\x6a\x58\x7e\xd9\x82\x01\x83\x7c\xf2\xf0\x2d\xa1\x05\xa7\xd0\x89\x93\xb4\x1f\xb4\xf8\xbd\x79\xe1\x77\x3f\x2d\x44\x14\x2d\xbc\xbe\xbb\x31\xe0\x73\x79\x9a\x0a\xc6\x77\x96\x7f\xda\xc2\x92\x77\x5f\xfe\xae\x2c\xb1\x70\x3a\x3e\x9d\x65\xa1\x6e\xfa\x86\x4b\xaf\x57\x3f\xdf\x50\x7d\xd5\xb4\xeb\x60\xc3\x4a\xe6\x4d\x77\x8e\xe8\x73\xb7\x8d\x43\x8a\x30\x6e\xd6\xb6\xa3\xf3\xd1\x19\xcb\x8b\xec\x4e\x1d\xe9\x77\xff\x76\x72\xfe\xc4\xe5\xc0\x3d\x4b\xb4\xbb\xbf\xaf\x41\xc2\x82\x53\xf3\xba\x67\x14\x80\x42\x75\xf4\xa0\x05\x75\x40\x14\x75\xde\x4a\x8a\x0c\xa1\x60\x14\xcd\xa7\xe4\x20\x2a\xee\xbe\x31\x3b\x3f\x13\xa4\x09\xa8\x46\x91\x60\x80\x38\x82\x89\x6e\x3e\x07\x07\x2a\x3f\xfd\xdb\xc9\xb9\x77\xf5\x05\xe8\x51\x91\x74\x98\xe7\x4c\x7e\x07\x3e\x98\xa1\xfd\x84\x36\xaa\xce\x0c\xa9\x8d\xb6\x9f\x77\x01\xd5\x33\xc6\x35\x80\x55\x6c\xca\xb5\x51\x73\x47\xcf\xe5\x24\x02\xd9\x19\x97\xc3\x23\x57\x6c\x4e\xfe\xfa\xdd\xe9\xbf\xff\xc7\xfb\x8f\xc7\x47\xef\xff\xe3\xc3\xd1\xf1\x5f\xcf\xce\x4f\x7f\xfa\xe9\xf2\xdf\x2f\x3f\x9f\x7e\xf8\xe9\xa7\xe3\x5a\x29\x26\xcc\x31\xf6\xe3\xbd\x64\xe6\xa7\x9f\xdc\x1d\xd3\x3f\xfd\xf4\x39\xab\x78\xf5\xd3\x4f\x17\xde\xcc\x09\x7c\xd4\x6e\x55\x87\xb2\xe0\x50\x7a\xac\xc9\x8e\x04\xf9\x0e\x8f\x1f\xde\xb2\x95\x77\xd9\xa3\x83\x06\x64\xfd\x77\x21\x97\x9b\xcb\x5a\x90\xe4\xe6\xe4\xc2\x73\x6f\xec\x7f\x52\x92\x09\x59\x76\x94\x68\x2e\xa6\x50\xed\x0f\x45\xd4\xe0\x78\x20\x63\x66\x6e\x18\xc3\xbc\xcd\x45\xd1\xaa\x7b\x3d\xb8\x1f\xad\xe8\x6b\x5c\x5b\x5a\x2b\xc0\xb4\x5a\xb3\xb8\x30\x25\x97\x08\x78\xcd\xd9\x0d\x88\xe9\x9a\x4f\x05\x2d\x22\xd7\x20\x74\x2a\xc4\x08\xb0\xe6\xf7\x1b\x42\xc2\xa3\x24\x4e\xec\xf9\xec\xdc\x64\xed\x28\x93\x3b\x11\x26\xad\xce\x18\x54\x5b\xd8\x58\x4e\x2e\xce\x4e\xc8\x9b\x4d\x37\x03\x74\x03\x17\x55\x72\xb9\x0c\x21\x82\x21\xca\x8a\x78\xdd\xda\xc4\xdf\x29\x79\xfc\xd4\x88\x5e\x8f\x73\x59\x52\x2e\xb6\xdb\x64\x62\x52\x17\xc5\x9c\xfc\x5c\xd3\x02\xa5\xd7\x0b\x99\xdf\xe5\x34\x7b\x7f\xf4\x1f\xfd\x69\xf4\xc7\x00\xf8\x9f\x46\x7f\xb4\xd4\x27\xdc\x8c\x3f\x8d\xf4\x75\x36\xfa\x63\x56\xd4\xda\x30\x45\xdc\x43\x1b\x97\x3e\x7d\xa0\x33\x45\xa0\x73\xd4\xad\x00\x90\x52\xd0\x73\x9f\x44\xa2\x43\xa3\x02\xc4\x77\xfe\x45\xd1\x8c\x5d\x30\xc5\x41\x35\x90\x22\x7f\xd2\x0e\x15\x1e\x83\x49\xee\x1a\x9d\x41\xd3\x6d\x84\x23\xec\x99\x60\x2c\x47\x4d\xcd\x81\xcd\xc8\xd4\x42\x0d\xe7\x3e\x02\xa5\x6a\x6c\xa5\x81\x4c\x31\x8a\x55\xdf\x48\xce\x0a\x06\x8d\xec\x3a\x75\x1e\x45\x17\x89\x0f\xd9\x15\x52\x0c\x05\x9b\x62\x08\xad\x0b\x25\xc1\x7a\x8a\xc8\x66\x7f\x61\x4a\x46\xe1\x9a\xda\xc8\x8a\xf0\xb2\x64\x39\xa7\x86\x15\x73\x72\xcd\xe9\x86\xeb\x83\x58\x01\x7d\x30\x90\x38\x1e\x08\x49\x24\xf8\x80\x6b\xc1\x9d\xbb\x66\x56\x1b\x92\xcb\x1b\xb1\xb9\x48\xe1\xba\xb2\x86\x44\x5c\xc1\x8b\x41\xab\x59\x0e\x6c\x2e\xa9\x00\x27\x5a\x5e\x82\x6e\x5a\x07\xea\xfa\xad\x49\x9d\x00\xbf\xec\xd0\xa1\xf3\x85\x2f\x6e\xec\x58\x82\xaa\x05\x94\xe5\x6c\x7a\x7b\x41\xc4\x87\x66\x62\x53\x3b\x3b\x8d\x51\xdf\x6f\xaf\x67\x0e\x98\x83\x87\x4c\x8c\x2d\x04\xab\x4c\xa4\xca\xf8\xb8\x98\x93\x19\x2d\x0c\x73\x15\x33\x69\x7c\x4a\x9b\x6e\xca\x25\x33\xf1\x41\x14\x52\x4c\x63\x59\x97\xdd\x56\x2c\x33\xd0\xbb\x89\x51\x51\x57\x08\x9d\x15\xe3\xe6\xb2\xee\x6c\xff\x88\xed\x1e\xdf\xbc\xf6\x9b\xde\x85\xe6\x74\x89\xa9\xea\x1a\x4d\x65\x64\xc1\x10\x53\xfa\x10\xa7\xa5\xdd\x89\xf6\x75\x3c\xfb\x73\x69\xb6\xd2\xc1\xea\xf6\xd9\x5d\x1c\x40\xb9\xcf\xe1\x95\xc1\x8e\x61\x0c\x85\x1e\x49\x96\xc4\xe2\x37\xd0\x9c\x61\x4e\xac\x54\x64\xd0\x83\xe6\x9a\x8a\x6d\xee\x14\xb3\x17\x4b\xf1\xaa\x60\xe4\x8f\x57\x6c\x3e\x00\x6c\x1f\xa0\x38\xff\x27\x52\x87\x08\x2a\x98\x1f\x62\x24\x2b\x0b\x80\x54\xe4\x8f\xfe\xbf\xfe\xf4\x84\xbd\x61\xfa\xb8\xe1\xf0\xa5\xb6\xd5\xae\xe5\x14\x2b\xd3\xf0\xa8\x98\x1c\x73\x07\xe8\x8a\xd6\x18\x89\xbb\x3c\x22\xa7\xd0\x35\x0d\x15\x48\x2c\x30\x6f\x35\x81\xf8\xe1\x8e\x96\xd5\x1f\xbd\x3b\xd5\xdd\x32\x6f\xb8\x8f\xe2\xf4\xce\xa5\xeb\x13\xc4\x06\xe4\x02\xba\xea\x35\x9f\x00\x29\x3e\x97\xa7\xb7\x2c\xab\xbb\x65\xbf\xf7\x72\x01\x5d\xb1\x0e\xd1\x94\x69\x4e\xef\x3b\x36\xf7\x5c\x11\x8f\xc1\xea\xe7\xa1\x1c\x60\x43\xa2\xa2\xfc\xc1\xd5\xc7\x78\xc5\x36\xef\x17\x89\xe3\xcc\xdb\x35\x00\x22\xd7\x9e\x2b\xdc\x4a\x2f\x15\x9d\xde\x72\x6d\xf4\xff\x46\x7a\x92\xc9\x72\xec\x99\x2a\x82\xe3\x71\x0d\x2b\x31\xb9\xd3\x77\xf5\x54\xba\x82\xd6\xeb\x6c\xfd\x0b\x6c\xeb\x80\x3f\xfa\x0d\x54\xac\x52\x4c\x83\xcf\x99\xda\xad\xd8\xd7\x2e\x41\x4b\x0a\xa8\x8b\xec\x3c\x12\xd8\x85\xb8\xd3\x52\x3e\x97\x07\x17\xc4\x5b\x87\xc7\x05\x47\x70\x6a\x35\xa5\x51\x4b\x14\xc0\x8f\xba\x91\x1d\x9c\xd8\x62\xca\xcf\x35\xbf\xa6\x05\x43\xf3\xeb\x0d\x2f\xf2\x8c\x2a\x0c\x6b\x44\xa2\x4f\xb4\x74\x39\xb0\xd8\x06\xad\x93\x03\x2b\x48\x03\xac\x41\x76\xed\xc2\x99\xa8\x32\x3c\xab\x0b\xaa\x88\xa5\x80\x53\xa9\x3a\xd5\xab\xe9\x85\x66\xcd\x4d\xed\xa4\x4d\xe1\x48\x81\x6f\x9f\x17\x01\x89\x11\xcf\xcc\x82\x28\x2e\x27\x28\x59\x2e\x90\x99\x03\xcc\x3a\x73\xb7\xbd\x13\x04\x72\xe2\x19\x4f\xa0\xe8\x71\x35\x94\x28\x24\x87\x6b\xc2\xa7\x42\x2a\x96\x1f\x46\x02\x48\xa0\x85\x23\xf2\x6d\x68\xde\xd8\xa5\xef\xb7\x95\xb8\xbc\x27\x19\xca\xca\xb8\x77\x73\x84\xca\x61\x53\x43\x7a\x27\x52\xb1\x6b\xa6\xc8\x81\xab\xeb\xc6\xae\x79\x66\x0e\x47\xe4\xff\xb7\x8a\x5e\x57\xe7\x5b\xd0\x20\x1d\x31\x0c\xed\x05\x5c\xf1\x7f\xaa\xc9\x6b\x72\x00\x4b\xc5\xda\xe3\xa1\x0f\x20\xd1\x73\x6d\x58\xd9\x1d\x9f\xb7\x95\x03\xd1\x39\x70\x31\xc5\x25\xf8\xc1\xeb\xb8\xcd\xe1\xa2\xb6\xb5\x80\xed\xa1\x63\xae\xec\xc5\x32\x03\x93\xe4\xda\xd1\xc5\x96\x7b\x35\x44\x6c\x78\x9e\x1a\xee\xc2\x7f\x42\x8c\x00\x51\x6c\x0a\xd4\x0b\x69\xcf\x96\x9b\xdf\x75\x8c\xc3\x34\xb2\x92\x85\x9c\xce\x2f\x2b\xc5\x68\x7e\x2c\x85\x36\x0a\x68\xf4\x53\x9a\x95\x3e\xdf\x07\x84\x9b\x77\xec\x72\x57\xa8\xcb\x08\x93\x13\xac\xcb\x24\xeb\xe9\x0c\x5b\x81\xc2\x0f\x09\xcd\x94\xd4\x3a\xbc\xd3\xa6\x2a\x1b\xd8\xf6\xf4\xc8\xf7\x05\xf5\xf6\xe5\xd0\x67\x14\xd6\x04\x6b\xfb\x0d\x9d\x3b\xaa\x44\xc7\x3c\x6f\x55\x50\xf4\xa0\x6f\x8a\x0e\x47\x96\x3b\xde\xbb\x0f\x56\x26\x38\x3a\x3f\xd9\x34\x94\x61\x7b\x2a\xef\x7d\x47\x1a\xb4\x0d\x57\x24\x34\x9c\x5d\x50\x28\x61\x97\xb1\xc4\xa0\xdd\xd2\x29\xbf\x66\x22\xec\xcc\x33\x69\x3b\x5a\xd2\xdb\xcb\x2b\x76\xd3\xe1\x97\xfe\x45\xbf\x63\x9b\x27\x49\x0c\xc1\x1a\xf6\xbd\xd0\xd4\x70\x3d\xe1\x74\x5c\x3c\x65\xef\x53\x28\x9a\x72\xc9\x0a\x96\x6d\x51\x6c\x7f\x1f\x03\x11\x4a\xef\x19\x49\x26\x5c\x2c\xe0\x58\x37\xd6\xd1\x54\x99\xf3\x9d\xde\xb8\x0e\x25\xf0\xdc\xb2\x90\x2d\x27\x6b\xe1\xfa\xe8\x86\xa0\x40\x8c\x82\xa8\xcb\x31\x53\x9e\x84\x75\x13\x8f\x5c\x51\x49\x92\x49\xa5\x98\xae\x24\x66\xab\x7a\xd4\x71\x84\xac\x3b\x3f\xea\x9c\xc2\xd2\x37\x1f\x04\xb6\xf4\xf4\xd6\xca\xbd\xba\x5b\x4a\x00\x8e\x16\x26\x2d\x4e\x8a\xa1\x40\x3e\xbb\x6b\xe1\xe8\xdc\xa5\x87\xde\xf0\xe8\x34\x88\x3f\xe9\x4a\x86\x9b\xd1\x27\x07\x0a\x47\xe7\x4c\x28\x1c\x69\xa2\x01\x09\x56\x08\xb8\x77\xef\x70\x8f\xc3\x37\x71\xf9\x36\x67\x40\xd7\x03\x54\xa7\x5d\xd9\x56\xd1\x08\x63\xf6\xe1\x1e\x60\x81\x72\xee\xd4\x91\x2b\x36\x87\xe9\x71\xc5\xee\xdd\xeb\x7a\x5e\x0b\x0f\x58\x9f\xfc\x2e\x1c\x43\xfb\x4a\xbd\x7e\xef\xb7\xb9\xf3\x24\x7d\xef\x38\x8e\x8e\xa6\xbb\x66\xb4\xf0\xf8\xaa\xb1\xc6\x21\x4e\xb6\xac\x71\x0d\x5d\x6e\x6c\x71\xbd\xd6\xee\x9d\x1d\x86\xa3\x8f\x89\xab\x19\xe9\x2e\x74\x0c\xd3\x3a\x66\x2f\x0a\x41\x23\x72\xd2\xfb\x7a\xe1\x58\x66\x06\x3b\x13\x03\x72\x2e\x8d\xfd\x27\xb2\x88\x9d\x48\xa6\xcf\xa5\x81\x4f\x76\xe2\x24\x71\x03\x76\xe9\x1c\x9d\xd5\xc2\x92\x61\x81\xec\xc6\x45\xb7\x59\x41\xc1\x9d\xd7\x32\x35\xf8\x4c\x10\xa9\xdc\x96\xf7\x04\x21\x68\xd2\xda\x01\x10\x3b\xe8\x5d\x9f\xef\x7b\x15\x71\x0b\x45\x7c\xcc\x8f\x06\x8c\x03\x04\x6a\x1e\xe3\x37\x50\x8a\xbd\x2a\x20\xe1\x3b\xaf\x61\xc3\xa8\xdd\x39\x6a\xd8\x74\xe3\x14\xc7\xc5\x51\x32\x35\x65\xa4\x02\xb7\x4e\x02\xcc\xed\x23\x48\xe0\xe8\x29\x4e\xc4\xc0\xf4\xbe\x46\x89\xd3\x4b\x1f\x71\x52\x90\x29\x41\xd7\x48\x23\xa3\xf6\xb8\xef\x11\x28\x28\x75\x95\x14\x0c\x24\xff\x15\xbc\xb7\xff\x4d\x2a\xca\x95\x1e\x91\x23\x1f\x61\x18\x7f\xe7\x82\x34\xa2\x69\x7a\x80\x52\xdd\x75\x2c\x50\x41\x98\xab\x69\x21\x27\x77\x84\xf1\x81\xab\xb7\x6f\x19\x76\x30\x2e\xef\x5d\xb1\xf9\x5e\xd7\xea\x4a\x38\x62\x8a\xb2\x77\x26\xf6\x9a\x90\xc2\x16\x15\x08\x32\x29\x14\x38\xdf\x83\xef\xf6\x1e\x4f\xee\xef\x25\x41\x36\x05\x93\x2e\x12\x88\x60\x3d\xaf\x6c\xeb\x4e\x95\xb4\xea\x77\xa5\x1a\xe4\xfb\x8e\xcd\xb7\xe6\x82\xf9\xd0\x82\xc2\xab\x30\xc6\xa9\xea\x8d\x64\xa9\x31\xff\xbe\x00\x1f\xfd\xcc\x99\x05\xe5\x35\x53\x68\x12\xec\xb4\x36\x1a\xc1\x2c\xaf\x09\xa1\xf6\x4d\xb9\x1d\xc0\x47\x58\xd8\xe2\xa1\xb7\x68\x14\x52\x5e\xd5\x95\xc7\x67\x08\xc3\xed\x7a\x63\xb8\xc8\x64\xe9\xec\x22\xf8\x9e\x60\x09\x77\x17\x73\xe8\x22\x9e\x90\xc6\x84\xab\x80\x31\x55\x2d\xab\x4f\x47\xff\x60\xbc\x99\xc1\xc0\xcb\x2c\xdb\x0f\xf6\xc0\x66\x7b\x57\x6e\x55\x27\x00\x7c\xac\x7d\xbc\x0b\xae\x0d\x34\x2d\x83\x63\x7d\x22\xd5\x98\xe7\x39\xd8\x22\x11\xb8\x90\xf0\xb5\x80\x38\x96\xd2\xb4\xec\x50\xdd\x88\xc6\xc2\xac\x4b\xf2\xe0\x17\x8d\x5d\x62\xdf\x74\x09\x4b\xc6\x01\x8b\xb8\xf6\x48\x76\xa2\xf0\x8a\x8b\x5b\xe3\x11\xc1\xee\x7e\xa7\x95\xc6\xcc\xbb\x0f\x2d\x4b\x12\x75\x51\x58\x69\x0f\x04\x31\x34\xcb\xa0\xa7\x0f\x48\xb2\x0b\x4a\x98\x5a\x22\x6d\xda\xc8\xd6\xa9\x51\x84\xeb\x6e\x01\x77\x7b\xcc\x0c\xf5\x7d\x2e\xc4\x42\x35\xa8\xf6\xe6\x9f\x89\x0b\x99\xb7\x2d\xda\x2b\xca\x42\x91\x03\xff\x1f\xe3\x79\xe7\xa4\x17\xd2\x5b\xc6\xeb\x21\xd9\xa5\x64\x0e\xfd\x05\x2e\x67\x4c\xdf\x1e\x5b\x80\xe5\x23\x57\x14\x06\xdf\x4e\x15\xc3\x2a\xc0\x40\x95\x80\x4a\xb9\xb6\x57\xb5\x60\xd7\xcc\x62\x6f\xce\xed\x1e\x8e\xeb\x8e\x35\xd3\x5c\x7c\xd6\x3f\xee\x58\xf5\xff\xbf\x13\x79\x2e\x8d\x77\x53\xfd\x63\xe0\x1c\xe6\x28\xc7\xdd\xf2\xb2\x2e\xb1\x6f\xb5\x31\x56\x87\xe1\x93\x09\x53\x1d\x9b\xf3\x91\x90\x7b\xd2\xb6\x5d\xb7\xbd\x35\x8e\x4a\x18\xaa\xa6\x90\x30\xed\xec\xd0\x5e\xe4\x9a\x16\x72\x4c\x0b\x52\x72\x61\x41\xeb\xb6\x13\x9f\xef\xcc\x13\xde\xd8\xfd\xb9\x02\x38\x90\x41\x5d\x67\x29\x34\x8e\x77\x8b\x90\x50\x2e\x78\x7c\xb2\xb0\x1b\x0b\x93\x03\x7d\x29\x98\xd6\x18\x1e\xfc\x81\x8b\x13\xe7\x5a\xec\xb4\xec\x3b\x4b\x1d\x6f\x69\x59\x15\x6c\x80\xee\xc7\x6f\x86\xbf\x48\xc1\x88\x4b\x7b\x18\x04\x14\x75\x79\x3c\x46\x92\x37\x28\xf0\x56\xa1\x2c\x99\xcf\xaf\xe9\x04\x41\x8b\xee\x06\x67\xab\x26\x5f\xbf\xfa\xfa\xd5\x9b\x6e\x24\xe6\xcc\xa5\x1e\x65\x54\xbb\xee\xb6\x77\x4f\x77\xe3\x24\x1e\x1c\xff\x24\x76\x77\xde\xb8\x7f\xbf\x76\xff\x7e\x43\xfe\xd9\x71\x36\x72\x41\x2e\x5a\xff\xda\x7f\x3a\xce\x36\xb4\xc8\x13\x1d\xd7\x9b\x41\x9b\xb7\x66\x54\x20\xe3\xb3\x7c\xde\xdd\x6f\x90\xf6\xf0\x15\x80\xcf\x64\xb2\x64\xb0\xf5\x5f\xff\xef\x6e\xb2\x26\xce\x0b\x11\xfa\x86\x48\xe1\x66\x7f\x73\x00\xdb\x75\x48\x6e\x20\xee\xa1\xa4\x57\xe8\xb0\x3a\xca\x4c\x4d\x0b\x0b\xf0\xc1\x37\xc3\x37\x87\x44\x8a\xd6\xe3\x9d\x40\xb8\xe6\xd2\xca\x6b\x7e\x27\x0e\xde\x74\xac\xf1\xb0\xb8\x9d\x5f\x2f\xd9\xce\xd6\x4e\xc2\xdb\x52\x31\x87\x57\x48\x4b\x93\x3d\x39\x3e\x12\xf3\x1b\x3a\x0f\x44\xd9\x8b\xeb\x53\x7e\xcd\xc8\x8c\x4f\x67\x50\x0d\xa1\x47\xbf\x54\x82\x71\xdf\x40\x63\xb9\x6f\x69\x89\x80\xcc\x09\xef\x28\xfd\x9d\x99\x7d\x0d\x11\x2d\xe8\xa3\x70\x85\x6e\x42\x9e\x5a\x48\x3e\x79\x03\x64\xe5\xf5\x42\xa1\x8f\x2d\x87\x39\x7d\xf3\xf5\xe6\x32\x45\xa0\xc9\x5b\x13\x2b\x02\x04\xad\x86\x07\x77\xb9\xd9\x22\x73\xe9\x81\xb5\x0f\x70\x2d\x60\x14\x81\x79\x06\x36\x7e\xe5\xb4\xe1\x86\xa3\x35\xbb\xd7\xcd\x2e\x7b\x21\xf3\x10\x20\x42\x9c\x3c\x0d\x81\x75\x9a\xec\xb5\xd9\xc0\x1e\x04\xda\x05\xeb\x8d\xab\xe1\xec\xf4\x3d\x2e\x85\x7d\x0f\x7f\xf9\x7b\xb5\x01\x27\xe4\x48\xe4\x4d\x36\x51\xc7\x5d\x62\x3f\xd7\xb4\x00\xe3\xf5\x14\xe2\x04\x55\x9a\xfd\x8a\xf2\x8e\xee\xf4\xb5\x6d\xa8\x79\xc7\xd7\xc6\x7b\xaf\xeb\x02\x22\x2d\x1f\x7e\xff\xa4\x98\xa0\x9b\x50\x2b\xd0\x3a\x43\xac\x55\x29\xb1\x77\xbd\xf0\xe2\xbf\x8b\xbc\x90\xce\x2e\xd1\xeb\x32\x9c\x4d\x96\xa4\xd3\x35\xb1\x5b\x64\xcc\x66\xf4\xda\x5e\x47\x28\xe3\x14\xdf\x54\x77\xc4\x20\x62\xf5\x89\xf6\x8e\x12\x2c\x1c\x09\xd4\x6d\x94\x79\xdd\xe3\x9a\x37\xef\x26\x0d\xbe\xdf\x8f\x8b\xdc\x2a\xf8\x3f\x5a\x9a\x44\x47\x95\xba\x8b\x80\xfa\xf5\x60\x61\x5f\xdd\xe7\xbf\x7d\x2a\xb9\xf5\xeb\x6e\x72\xeb\xa3\x0b\x97\xf8\x6f\x67\x1d\xa9\xb9\xb8\x4b\xef\xeb\x6f\x0f\x9a\x5d\x3f\x84\x08\xff\x3b\x04\x17\x2a\x63\x35\x41\xce\x1d\x6f\x98\x13\xef\x35\x37\x35\xc5\x02\x5c\x82\xdd\xb8\x94\xea\xe8\x58\x17\x8e\x28\x32\x72\x79\x91\xad\x1b\x5d\x19\xb3\x8c\xd6\xda\x5e\xea\xb2\xb2\xea\x37\xd1\x16\xfd\xbc\xc1\xf0\x9b\x83\x6f\xc8\x90\xbc\x3e\xb4\xb7\x5b\x20\x69\x01\x14\x8c\x05\x6e\x68\x6c\x83\x8a\x9e\x99\x59\x55\xdf\x9e\x73\x47\x2a\xc7\x5d\xf5\xce\x05\xb1\xf7\xf9\x89\x4d\x42\xe6\xec\x68\x32\xe1\x82\x9b\x79\xd7\x72\xf6\x69\xc4\xa7\xf3\x3b\x90\x44\x62\xd4\x4c\xde\x90\x1b\x57\x4b\x00\x70\xd9\x95\xc4\x8b\xc1\x7f\x65\xff\xe8\x65\xb8\x06\x66\x19\x64\x11\xa7\x71\x04\x79\xc0\x51\x1b\x8b\x77\x23\x97\x37\xef\x1a\xf5\x74\x59\x6b\x48\xfe\x2a\x85\x54\x6f\x51\x39\xc4\x5e\xf6\x41\x06\xb9\xf7\xb5\x1c\x7f\xc9\x8a\x3a\x8f\x3a\x60\x34\xd2\x53\x47\xf6\x39\x24\x67\x60\xbf\x7d\xfb\xd0\xca\xc1\xca\x0b\x45\x14\xf2\xc0\xf0\x56\x01\xd4\x3d\xa0\x7f\x69\x92\x3c\xb0\x72\x8e\x8e\xc0\xb6\x63\xd2\x7e\x0b\x9b\x4a\x2a\xc0\x9f\x27\xcf\x3d\xb2\x3b\xf2\x19\xc2\xbb\xb7\x7f\x95\x62\x38\x56\x5e\x24\xec\x7d\x86\x41\xe9\x8b\x17\xa0\xd3\xea\x4f\x71\x69\x10\xf7\x2c\xe3\x91\xb5\x71\xd0\x0f\x08\x2d\x24\x38\x91\x2c\x3b\xb2\x1f\xb1\xdc\x3d\x38\x91\xde\xd7\xb4\xe8\xfb\xe8\x04\xc6\x0c\xaa\x7d\x36\xe9\x2b\x83\xd6\x2d\x48\x71\x05\xfd\x81\xac\x71\xe9\x9e\xf8\x82\x21\x94\xdb\xba\x61\x51\x30\xfd\xf6\xf2\xfa\x02\x08\xde\x60\x7d\xc5\x40\xb2\x80\x83\x43\x5f\xda\x08\xee\x60\xdc\x5c\x9d\x3a\x77\xb3\x13\x96\xb8\xee\x1c\xf8\x69\xc5\x69\x0e\x25\x7b\x33\x5a\xc4\x7a\x87\xd5\x77\x78\xce\x14\x8a\x3b\x63\xd6\xaa\xc2\xd4\x35\xdf\x02\xc7\x8f\xcd\xec\x58\xb1\x09\x4a\x09\xe0\xe2\x7f\xc2\xe2\xb7\x7b\xe3\x3a\xbb\x62\xc6\x07\x66\x28\xa8\x92\x52\xd5\x86\x8c\x69\x41\x45\x66\xef\x22\x48\xb2\xdd\x0c\xf5\x13\x6f\xfa\x37\x12\x01\xc0\xd5\x3a\xbf\x0d\x76\x8c\x08\xf5\x7f\xf0\x15\xa2\xfc\x55\x2e\xb4\xb1\x50\x63\x62\x6b\xbf\xcd\x3b\x2a\xb4\x1c\x58\xaa\xeb\x17\xbd\xe3\xbc\xc0\xe5\xdd\x7f\x63\xfc\x8c\x93\x08\x18\x33\xae\x6c\x5c\x14\xbc\x22\xbb\xf4\x42\x5b\x26\xeb\xb9\x3a\xbd\x6d\x6e\xd1\xed\x25\xd9\x68\x0a\xd1\x7f\x0b\xd7\x63\xaf\x5d\xaf\xd1\x97\x80\xda\x1b\xe0\x29\xda\x5b\xe2\x2a\x79\xe2\xcb\x83\x80\x4e\x4d\xdf\x1d\x17\x39\xd4\x07\x5e\x04\x26\xcc\xda\x86\xca\x2a\x02\x1e\x22\x50\x73\xd3\x43\xb4\xdc\x1c\xfb\xd4\xe4\xf3\x8e\x8d\x7b\x5b\x44\xf4\xae\xf9\xa2\x2d\xa2\x40\x92\x0d\x2d\x7c\x95\x1f\x2b\x52\xf0\x89\xd5\xba\x72\xc9\x30\x2a\x02\xcd\xe3\x1d\x8d\x6f\xcc\xcb\x25\x8d\x89\xa8\x2b\xd7\x6e\x99\x5b\xc8\x81\x8f\x0e\x20\x86\x15\x05\x72\x87\xc6\x22\x66\x35\x61\x23\x1b\x93\x58\x57\xdb\xfe\x90\xb4\x5d\x13\x4b\x17\x8b\x17\xf2\x45\x9b\xc0\x73\x3a\x0f\xad\x65\xbb\xc6\xe0\x8e\x6b\x43\xa6\xfc\xda\x8a\x50\x77\xfc\x1f\xcb\x7c\x19\xe8\x7f\x9a\xb1\xa2\x22\x8a\xe5\x75\xc6\x7a\x44\x02\xea\x8e\x6a\x36\x21\x47\xb1\x41\x10\x6a\x66\x04\x76\xb9\xd7\xc2\xc5\x3d\xd7\x07\xb7\xbf\xa0\xc8\x27\x40\x61\x41\xc5\xe3\x13\xc2\xae\x99\x9a\x93\x4a\x6a\x0d\xb4\x1f\xe4\x05\x2c\x72\x08\xd1\x94\x13\x9f\x58\x03\x46\x15\xd8\x33\x67\x5f\xe8\xb4\xf8\x9e\x33\x4a\xec\x81\x51\x59\xf6\x96\x01\x76\xd7\x6b\xfd\xcd\xab\x37\x5d\xbd\xd6\xa9\xad\x7f\x17\xf0\xbf\xe0\x52\xee\xe5\x5a\x3e\x9b\x2c\xa3\x93\x61\x6f\x5b\x94\x67\x1d\xaf\x73\x57\xd7\x24\xec\x0c\x38\x87\xbf\x39\x8c\x1c\xd6\xdf\xbc\xfa\xfa\xd5\x9b\x03\xbb\xf7\x5f\x1f\xda\x53\x88\xdc\xca\x5f\x47\x6e\xe5\xf0\x4b\xf7\x16\x1d\x4a\x58\x91\x26\x68\xe7\xe0\xcd\xe1\x08\x72\x1a\xa0\x3e\xe9\x8d\x54\xb9\x4b\xf1\xf7\x15\x23\xed\x9b\x87\xf6\x9f\xbc\xf4\xc2\xe7\x00\x88\x56\xa0\x8e\xdd\xcc\x43\xe0\xd0\x00\x37\x3a\x37\xe4\xab\x52\x2a\xf6\x55\xb4\xc4\x73\x15\x0c\xee\x06\x77\x95\xb4\x1a\x5e\x75\x88\xdb\xed\x93\xec\xdc\x37\xd5\xf9\xbe\x10\xb5\x92\x56\x1b\xcc\x73\x2d\x8b\xba\xdc\x34\x0a\xbb\x9f\x40\xf4\xde\xe5\xad\xba\xa5\x5d\x6a\x25\x86\x39\x94\x2e\xe7\x78\x3c\x8f\x4b\xf9\x8e\x59\x21\xc5\x14\x7d\x95\xa1\x61\xe1\x86\xab\xae\x57\x59\x3d\x93\x22\x63\x95\xd1\xaf\xb4\x91\x8a\x4e\xd9\x2b\x07\xe4\x46\x8b\x6d\xaf\x64\xc1\x0f\x00\x6d\x3b\xf3\x0d\x9b\x02\xe1\x7b\x84\x42\xcb\x3e\xff\x1b\xe8\x25\xcd\xa0\xec\x24\xec\xba\x95\x96\xa2\x06\xc3\xa2\xeb\x76\x6f\xa9\x6a\x41\x87\x0e\x82\x7d\xb2\x41\xe9\x8d\x3e\x2d\xa8\x36\x3c\xfb\xb6\x90\xd9\xd5\xa5\x91\xdd\x0c\x7d\x29\x34\x8c\x65\xb0\xb4\x30\x41\x90\xa3\x1f\x2f\xc9\x09\xd7\x57\x44\x31\x2d\x6b\x95\xb9\x56\x65\x0b\x05\x19\x37\xad\x1d\x8b\xc3\x5e\xa6\x82\x19\x57\x72\x9f\x94\x34\x9b\xa1\xea\xef\xa2\x1e\xd8\x6d\x25\x75\xd3\x7c\xbd\x03\x4a\xe1\x88\x3b\x55\x1c\xfd\x78\x79\xf7\x95\xb9\x8e\x9a\x64\xa0\x0d\x11\x53\x69\xc0\x12\xdb\x44\xca\x0f\x8d\x62\xdd\xa4\xb2\xa5\x3b\x6d\x11\x1e\x8c\x52\x8a\xe5\x5c\x61\x21\x55\xf7\xae\x6c\xac\x47\x99\xe6\x23\x7a\xa3\x47\x99\x2c\xc9\xf1\xe5\x19\xc9\x15\xbf\xee\xda\x27\xa9\x1f\x29\xfb\x15\xbd\xd1\x0c\xc1\x1f\x5b\xf0\xed\xd7\x5d\xf6\x61\xcb\xbd\x42\xf1\x6d\xce\x4e\x3a\xfc\xbc\x6f\xfe\xf7\x44\x7f\xb6\xef\xde\x51\x9f\x4b\x95\x35\x87\x50\x78\x8b\xec\x84\x17\x0c\x0b\x76\x21\x26\x3a\xbf\xaf\x23\xfb\x70\xcd\xe7\xb2\x26\x37\x14\x0d\xdb\xc0\x67\xbb\xa7\x6f\x7e\xe6\xd5\x5b\x72\x2a\x74\xad\x58\x93\xa4\xbe\x08\x82\x15\xdc\x7d\x1f\x61\x5f\x5d\x08\x68\x83\xbb\x8e\x62\xda\xa3\xc4\x18\x8e\x53\xd4\xce\xf4\x5b\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x55\xc1\x33\x6e\xac\x3a\x2a\x26\x4c\x35\xa6\x62\xfc\x41\xa2\x2e\x4b\xbb\x72\x27\x49\x8a\x4c\x56\x30\x0a\x03\x7a\x6e\x19\xc3\x03\x20\x1e\xc9\xa3\x0f\xc4\x63\xa2\xf7\xd9\x84\x48\x4c\x3d\x68\x97\x29\xe7\x3a\x4c\x6e\x11\xda\xad\x2e\x3a\xf4\x5b\x6a\x46\x83\xc2\xef\xa4\xf2\x53\xbe\xca\xd9\xf5\x2b\x9d\xd3\x37\x03\x78\x2d\xc4\xcf\xf9\xc2\x1e\x50\x4d\xf6\xde\x6c\xdc\x28\xa0\x19\x97\xbc\xe4\x05\x55\xc5\x7c\x10\xef\x65\x33\xbf\x65\x95\x1e\x10\x30\x26\xbf\xde\x23\x07\x58\x0d\x1c\xc4\xf5\x82\xf9\x76\x7c\xa1\xab\x2f\x64\x40\x75\x6e\x76\xd7\x37\x30\x84\xf4\x0e\x0e\x21\xc0\x98\x68\xfe\x51\x14\x9d\x8b\x7b\xa4\xc2\x7e\x0f\x87\xaf\x1f\xa8\x6a\xe7\xc5\x9e\x48\x94\xdc\x58\xf3\x88\x6f\xc9\xc3\x85\x53\x01\x3e\x58\x1c\xed\x51\xcf\x62\xd7\xc8\x59\xf7\xf6\x83\x24\x48\x0a\xdb\x3e\x50\x0f\x07\x84\xd4\x0b\xfe\x73\xcd\xc8\xd9\x89\x67\xd4\x15\x53\x9a\x6b\xc3\x84\x21\x79\x4b\x42\xe7\x28\xb6\x1f\x1c\x95\xf4\x17\x29\xc8\xe9\xb7\x97\x6e\xa2\xce\xd7\x6c\xf7\x4e\xb7\x23\xb3\xa2\xbf\xd4\x8a\x59\x7d\x66\x6b\x2a\x97\x07\x60\x51\xcf\xb2\x9f\x93\x13\x6a\x28\xaa\x5b\xc8\x31\x64\xd3\xd3\x0b\xd4\xa2\x31\xd4\x73\xf3\xcd\xe3\xd2\x29\x45\x01\xa8\x8d\x34\xa1\xe8\x65\xec\xa1\x74\xdb\x8f\xa5\xea\x8f\xc5\x67\xd4\x7f\xec\x0a\x09\x34\xa0\x2d\x6b\x1e\xf6\x7d\xce\xbb\x5a\xf4\xf1\xe7\xdf\x7f\x3a\xdb\x82\xde\x92\x81\x4e\x3e\xfd\x20\xf3\x34\xca\xcb\x7e\x34\xa1\x17\xd1\xa0\x21\xf0\x31\x7e\x4e\x4a\xbb\x12\x39\x97\x82\x0d\xc8\x27\x46\x73\x62\x99\x95\xfb\xcf\x1f\x15\x37\x6c\xb4\xbf\x2d\x21\xd7\x1f\x62\x92\x8d\xf0\x93\xf9\x4d\x38\x8f\xda\x44\x42\x2f\x57\x20\xe9\x4e\x66\x1d\x17\x72\x4c\x1c\x49\xdd\xe6\xdb\x7f\xff\xe9\x2c\xd9\xcb\x7f\xff\xe9\xcc\xbf\xbb\xfd\x4f\x39\xd9\xcd\xd7\xde\x35\xc5\xfd\xdd\x82\xc6\xdc\x5f\x73\xf9\xe0\x72\x22\xe8\x1d\x6d\xfc\xf1\x55\xf1\xd1\x96\x95\xf0\x04\x25\x9c\x9c\xa2\xf7\x96\x58\xb8\xba\x99\x41\xb9\xe8\x5c\x1e\xb1\x4d\x5c\xed\x4c\x4d\x4f\xa6\x28\xea\x0d\x7a\xfb\xe5\x6f\x49\x59\x17\x06\xba\xdc\xc0\xd5\xb2\x77\x0d\x12\xc8\xfc\x25\x23\xae\xeb\xab\x95\x0e\x30\xd2\x24\x7f\xeb\xab\x27\x85\x5f\x2c\xff\xc1\x07\x2a\xe8\xd4\x3e\x0e\x1c\x9b\x94\xf8\x67\x74\xa7\x0f\xd0\xc1\x2f\xc2\x57\xf4\x9a\xf2\x82\x8e\x79\xc1\x0d\x68\x23\x87\x23\xbf\x97\x58\x6a\x06\x40\xde\x1a\xb1\xdf\x39\x95\x2e\xee\x84\x01\xdd\x13\xc9\x81\xfd\xee\xd5\x8d\x65\x8a\x87\x23\xe0\x90\xf0\xe0\x8c\xa9\x58\xeb\xeb\xbc\xb2\xbd\xf0\x9f\x1e\x49\x5b\xec\xaf\xa1\x45\x17\x0f\x76\xa3\x9b\x26\x60\xa9\xe9\x56\x35\x01\x0b\xc0\x52\x4d\x00\xbe\x70\xbd\x6c\xb7\xa0\x0c\xc0\xf2\x1d\x94\x01\xf8\x5d\x62\x65\xc0\xb2\xa5\x2f\x49\x19\xd0\x2c\x53\xcc\xf4\x50\x07\x80\x34\x76\xfc\x7d\x5f\x85\x60\xe7\xe8\x62\xfe\x42\x17\xe3\xd1\x20\x57\x92\x13\x6a\xa6\xf3\xc2\x7a\x68\x68\x8f\x5f\x2d\x54\xb9\x46\xe2\x75\xe9\xa4\x03\xdf\xe8\x1e\x7e\x6f\x49\x56\x97\xfa\xfe\x38\x7a\x33\xf4\x70\x69\xd2\xec\x8b\x9f\xcd\x6f\x0b\x8a\x3d\xf0\x31\xe9\x7c\xb5\x7b\xbe\x66\xc6\xaa\xd9\x64\x6b\xa5\x1d\xec\xea\xef\x2e\xdb\x81\x24\xc7\xac\x9a\x91\x77\x97\x4b\x18\x18\xd6\xef\xb0\xdb\xa5\x31\xbc\x64\x5f\x93\x82\x4f\x98\xe1\x5d\x3d\x23\x31\x0f\x3b\x46\x58\x5a\x0c\x2c\x14\x66\xf2\x0c\x0b\xb7\x2b\x38\x1e\x85\xf4\xed\x4d\x83\xde\xf3\x0c\x99\x4b\x29\x05\x37\x72\xe3\x5e\xe4\x24\x45\x1f\x03\xb7\xf4\xb6\x59\x83\x87\xc3\x1e\xea\x27\xbf\x9d\xe4\x43\xf4\x29\x25\x99\x2c\x0a\x96\xf9\x5a\x1a\x80\xa6\x3d\x76\x0e\xc7\x12\x13\xb9\x0b\x05\xd6\xa3\xab\x3f\x80\x91\xdc\x99\xc3\x5f\x21\xea\xbd\xfa\x74\x7a\x74\xf2\xe1\x74\x54\xe6\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\x5a\x2a\x75\xeb\x5d\x16\x12\x68\xd3\x8f\x50\xb5\xb8\xa2\x66\x96\x46\xbd\xb6\x33\x59\xf4\x69\x3a\xda\x7f\xaf\xb1\x5e\x00\x54\x64\x73\x71\x88\x4a\x4a\x33\x20\x8a\x42\xf0\x6d\xe8\x94\x3c\xa9\x8b\x02\xf1\xcc\xd2\x9e\x41\xec\x1f\x7e\xf5\xa2\xe4\x7a\x71\xaa\xb5\xb9\x5f\x94\xc6\xbb\x2b\xe4\xa1\xbf\x6c\xd9\x55\x67\x26\x09\x11\xa6\x81\xa4\x8d\x32\x97\xad\xcf\x31\xf6\xc1\xcc\x2c\x02\x5d\xb1\x39\x81\xaa\xf6\x56\x6d\xfd\x5e\x33\xd5\xbe\x82\xcc\x64\xb0\xeb\xaf\x6a\xcd\xd4\x08\xa7\x7f\xe6\x27\xdd\x47\x56\x86\xf7\xff\xc4\x26\xbb\x71\xce\x9f\xd8\x64\xd9\x31\xbb\x8f\xa1\x3b\x73\xc8\xaa\xb2\xa2\x78\x6d\x66\x98\xf9\x8b\xfd\xf3\x51\x4f\x59\x7a\xee\xd8\x07\xe1\x99\x1f\x74\xaf\xfa\xea\x29\x1a\xdb\x88\x1e\x5a\x15\x49\xdc\x04\x24\xf6\xa3\x39\xcc\xe8\xd9\x2d\xe5\x73\xab\x05\x2c\x96\x20\xe3\xd7\xac\x98\x07\x59\x1d\xf3\x66\xf2\x1a\x2b\x22\xd3\xec\xea\x86\xaa\x1c\xfa\x4d\x57\xd4\x70\x67\xe1\xe6\xdd\x05\x4b\x3b\x7c\x8f\x72\x57\x73\xd9\x35\x12\x71\x09\xd8\x1a\xdf\x98\x3b\x65\x06\x13\x42\x85\x2b\x2e\xed\x2a\xa8\x59\x1e\x49\x3b\x07\x5d\x78\x20\x4a\xab\xbb\x65\x4c\x59\x6d\xbf\x98\x93\x1b\x25\xbb\x56\x60\xf3\x63\xc3\xc0\x12\x79\xcd\xd4\x35\x67\x37\xaf\x6e\xa4\xba\xe2\x62\x3a\xb4\x2f\x3b\xc4\x2b\xa0\x5f\x59\x4c\xd4\xaf\x7e\x05\xff\xf4\x80\x2a\x51\x67\x8f\x60\xa1\xde\xdb\x4b\x21\x0e\xf7\x6e\x38\x60\x87\xe5\x6f\xdb\xa6\xea\x16\x06\x7b\x97\x64\x2c\x47\x2b\xcf\xb1\x15\xcd\xa5\xc6\x67\xec\x39\xb6\xe8\x35\xcd\xcb\x8e\x55\x8c\xc9\xce\x90\xeb\xae\xc6\x1d\x2e\xf2\x6e\x47\x97\xc4\xb8\x03\xab\xb7\x8d\x3b\xee\x33\x17\x04\x1a\xd2\x41\xa8\xf7\x4a\x40\xe1\x59\x9f\xe4\xd1\xce\xf1\x48\x60\xe1\xc1\xc5\x37\x73\x51\x38\x88\x13\xfb\x27\x70\x56\xf0\x50\xc8\x8a\x59\x92\x9c\x5d\x8d\xa4\x9a\x3e\x46\xd2\xc6\x22\xbe\x96\x73\xfd\x73\x31\x44\x08\x86\x55\xde\x20\xec\xf3\xb3\x5c\xbd\x64\x67\xac\xcc\xce\x78\xde\x81\x1e\x3b\x9c\x73\xf1\x98\x57\x8a\x7c\x91\x56\x9a\x2f\xca\xe5\xb6\x45\x9c\xe8\x6f\x8b\xd9\x35\x15\xbd\x91\xe8\x2a\x09\xb5\xd9\x5c\xc3\x4c\xd0\xc0\x91\xb3\x78\x5f\x21\x54\x61\xa0\x8a\x96\xcc\x30\xd5\x14\x8c\xcf\xa4\x10\x7d\xfa\xcd\x1a\x49\x3e\x56\x4c\x5c\x02\x13\x7e\x51\xab\x5f\xd4\xea\xd5\xe3\x45\xad\x7e\x51\xab\x53\xa8\xd5\x3b\x97\x30\xe4\xe9\x29\x16\x41\x74\x89\x80\x4d\x45\x07\xa7\xb3\x3c\x3f\x9e\xd9\x55\x7b\x96\x62\xc2\xa7\x1f\x68\xd5\x5b\x81\x0e\x33\x2d\x28\xc3\xe1\x63\x17\xd9\x00\xa5\xa9\x2a\x59\x41\x8b\x3e\x57\x46\x14\xb6\xff\xe9\x35\xb3\xbe\xcc\xc8\x5d\xb8\x64\x49\x20\x3d\xf0\x3b\x02\xa5\x2d\x6f\x94\xf6\x93\x31\x37\x8d\x24\xa1\x99\xc1\x7e\x60\xd8\x73\x95\x48\x41\x32\x57\xe1\x1d\xf4\x9f\xa8\x4f\x5d\x02\x9d\x4a\x10\x99\x19\x5f\x6a\x34\xb4\x0f\x7b\xfd\xfa\xf5\x6b\xec\x1d\xf3\xfb\xdf\xff\x9e\x48\x45\x28\xc9\x59\xc6\xcb\xbb\x0f\xc2\x53\xbf\x7d\xd3\xb1\xbd\x82\x1d\xff\x7e\xf4\xe1\x3d\xd4\x65\xa9\x8c\xc6\x0e\x8d\x08\x91\x9d\xb8\xb5\xa8\x1e\x90\xff\x73\xf9\xf1\xbc\x69\xfd\xd7\xfe\x16\xac\x26\x61\x3b\xbb\xc3\x13\xbb\x6f\x5f\xff\xee\x37\xbf\xe9\x31\x13\x18\x5c\xa4\xe2\xae\x9c\xb1\x2f\x31\x43\x2d\x3f\x56\x0c\x7b\xf2\x80\x00\xe1\x35\x58\x2c\x00\x66\x3a\xb7\x07\x21\x5e\x40\x29\xf9\x74\x66\x5c\x99\x58\x7b\xc5\x0b\x9e\x19\x14\x04\xb0\xb8\x96\x74\xd5\x9a\xe1\xd2\x23\x0c\x41\x7b\xef\x11\xc0\x92\xb3\x01\x29\xf8\x15\x23\x13\xfd\x17\x25\xeb\xaa\x69\xe4\x8b\x3d\x4b\x7c\xed\x23\x04\xa2\xc1\xfd\xce\x7d\x30\x77\x25\x93\xba\x57\x04\x4a\x2a\x22\x03\x40\x2c\x98\x1c\x5c\xe5\xd3\xa6\x31\x6c\x45\x79\x28\x76\x04\x69\x9b\x28\xcb\xb6\x65\xe4\xac\x63\x41\x39\x3b\x8e\x03\x47\xf1\x0d\x1c\x2a\x25\xff\x13\x91\x1c\x4a\xfc\x46\x1c\x1d\x4a\xe3\x5a\x9c\xf3\x85\x71\x9b\xc8\xc4\xce\xeb\x5f\x31\x2c\x7d\x6b\xf5\x35\x26\x42\xab\x45\x78\x7b\xa8\x62\x1b\xed\x8d\xfd\xa2\xe0\xda\x82\x06\x1d\x81\x1c\xc4\x9d\xd7\x5e\xf2\xa6\x61\x35\xb8\xf7\x1a\x6f\x44\x2d\xee\xac\x8a\x9d\x34\x7a\xac\x0c\x2c\x1d\x5e\x90\xfa\x2e\xb8\xcd\xda\x58\x20\xdd\x35\x99\x71\xcf\x7a\x2c\x08\x07\xd6\xbd\x6d\x7f\x74\xa4\x9a\x99\xda\x1d\x3d\x53\x4a\x2a\xfb\xae\x4c\x6b\xd7\x5f\xad\xa4\xea\x8a\xe5\x81\xff\x8d\xc8\x85\xdd\x14\xdf\xdf\xa6\x87\x89\xa7\xa0\x56\x0b\x43\x23\x3e\x9d\xc3\x6b\x3a\x85\x1d\x80\xdb\x1f\x8d\xf6\x91\xf0\x4a\x45\xb4\xa1\xca\x51\x43\xfb\x79\x3f\xca\xb3\xc5\xb8\xb5\x16\xdd\xf8\x40\x2b\x68\x81\x0d\x72\x26\x20\x00\xd8\x30\xe0\x9d\x1d\xf3\xa1\xee\x8c\xba\xf3\x96\x04\x16\x86\xbe\x06\x77\x1c\xc3\xce\x15\xd6\xfd\xef\xed\xc6\xf4\xb9\xe7\xbd\xcd\x24\x40\xa9\xfa\xfc\x7c\x01\x01\xae\xda\x35\xeb\x8d\xf4\xd4\xa8\x9f\x42\x9e\x48\xf9\x2d\x7b\x08\xe1\x38\x52\x9a\x85\x10\x9e\x76\x70\xce\x5a\x92\xb8\x41\xeb\x4f\xd1\xe3\x0e\xe1\xd8\x21\x01\x1c\xc7\xae\x89\xe1\x38\xce\x26\x40\xca\x17\x58\xb6\x63\x35\xb1\x52\xe5\x65\x0d\x7b\x76\x7d\x17\xdd\x9e\x04\x8d\x63\x2b\x72\x34\x8e\x14\xd2\x34\x8e\xfe\x32\x35\x8e\x3e\x61\xd0\x38\xd2\x12\x0e\x1f\x4c\x8d\x87\xe1\xc4\x0e\x94\x2c\x26\x01\x01\xc0\xeb\x09\x36\x15\x4f\x8c\x7b\xd3\x0b\x27\xd4\x20\xc9\xa0\x63\x2d\x8b\xda\xe0\xc2\xa9\xa6\x8e\xe5\x25\x78\x21\x56\x40\x4f\x8a\x5e\x42\xd2\xe2\x22\x91\xec\x05\xd2\x31\x8a\x2b\xfd\x57\xd8\xcd\x18\xfe\x3e\xae\x90\x54\x68\x9b\xd6\x05\xb2\x7d\xf7\xc7\xd6\x5d\x1f\xa9\xdd\x1e\xbb\xe6\xf2\x48\x59\x5c\xa2\xa3\xab\x23\xd8\x47\x53\xdc\x1d\x3f\x59\xa8\x2d\x78\x33\x63\x2e\xc9\x25\x52\x7e\xad\x90\x65\x59\x28\x68\xe4\xbe\xdf\x2a\x36\xf5\xd9\x96\xb7\x3c\xad\xbb\x27\xd3\xbc\xbf\x13\x41\x73\x72\x70\x1c\x6a\x66\xfb\x7c\xd9\x33\x61\x98\x9a\xd0\x8c\x1d\xc6\xce\x05\x56\xcd\x58\xc9\x94\xdd\x78\xf7\x9c\x2f\xc1\x3c\xa3\x22\x2f\x5c\xe9\x73\xbc\x45\x84\xdd\x1a\xa6\xec\x21\x35\xc1\x67\x9d\x84\xc7\x6d\x17\xcc\x02\xc8\xb7\xe1\xeb\x80\x85\xb7\xcd\x6b\x10\x0a\x2f\x1e\x89\x88\xf3\x34\xc7\xea\xfb\xa6\x59\x14\xd0\xb1\x83\xa9\x3b\x05\x3d\x96\x02\xa4\x62\x20\xf7\x73\x59\x2b\x0c\xb8\x0d\x71\x94\x99\x54\xca\xca\xe7\x00\x10\xd5\x44\xb1\x29\xd7\x06\xba\xc3\xf8\xae\x96\xd8\x61\x62\x6b\xf5\x78\x76\x2a\x92\x2f\x84\xec\xad\xa8\x74\xd4\x79\x0d\xa7\xd1\x55\x4a\x5e\xf3\xdc\x2b\x74\x31\x7f\xe6\x9a\x54\x54\x47\xf5\xd3\xa9\xd6\x32\xe3\xe0\x00\x6b\xb0\xa8\xf3\xfa\x68\x09\x05\x75\x31\x67\xc6\x6a\xf7\x82\xb5\x2a\xdf\xc6\x41\x86\x92\xd0\xaa\x2a\x3a\x67\xda\xf4\x46\x0b\x21\x73\x76\x51\x8f\x0b\xae\x67\x97\xbb\x12\x38\xb5\x0c\x26\x4c\x4e\xbe\x93\xd1\x74\x5f\x00\x55\x8f\xa0\x2d\xa1\x39\x68\x5c\x56\x5e\xb2\x0a\x26\x97\x02\x4c\x5d\x54\x6b\xbf\x6a\x4c\x6a\x24\xc8\x9d\x05\x33\xcc\x7f\xd5\x5d\x8e\x6e\xde\xdb\xf5\x9e\xb0\x3a\xb9\xfd\xf4\x7b\x51\xb5\x3e\xcf\x68\x51\xf4\xb0\x7c\xb4\x45\x6c\x2f\xbd\xa0\x09\xc0\xf7\xb1\xc0\x0b\xc3\xed\x5d\xf2\xbb\x0c\x29\x65\xc8\xbd\x46\xd8\x01\xb4\xbb\x88\xbb\xf4\xe0\x74\xd4\xe6\x5f\x0a\x7f\xba\x03\x2b\x90\xfb\x1f\x04\x0c\xc0\xf2\x5d\x78\x8f\x5f\xc2\xd9\x5e\xc2\xd9\x1e\x18\x5b\xd7\xe9\xc8\x4b\x38\xdb\xa6\x63\x17\xc3\xd9\x76\x2e\xe4\xdc\x1b\xae\x91\x3d\xd2\x7c\x08\xd5\x04\x31\xe8\xaa\xc6\x74\x9f\x20\xa5\xf6\x95\x82\x1f\xa8\x3b\xb0\xb5\x90\x6f\x7c\xaf\x23\x63\x14\x1f\xd7\xa6\x3b\x29\x4e\x1b\x6b\xd8\xc0\x03\xea\x29\xd3\x4e\x66\x18\xba\x23\xcb\x22\xe6\xe1\x8c\xfc\x81\xa3\x45\x92\x46\x4f\x55\x69\x14\x74\x17\x50\x5b\xf0\xc3\x7d\x4d\x72\x99\xd5\x25\x13\xa6\xc1\x90\x26\xd7\x05\xfd\x2c\x5b\xe4\xaa\x34\xcf\x39\x0a\x25\x17\x09\xf8\x6b\x2f\x72\x94\xcb\x1b\x61\xf9\xd1\xd1\x45\xa7\x0a\xbf\xed\xea\xbe\xcd\x5c\xb1\x19\xc3\x7f\x4c\xec\xe7\x74\x0c\x3d\xe9\x5d\xcb\xd5\x97\x90\xc9\xa5\x53\xa4\xb9\xa6\xcb\x3c\xb3\x46\x92\x5a\xb3\x95\x21\x91\x8d\x67\x35\xe9\xca\x2f\xd1\x99\xbb\xe1\x16\x7e\x89\xce\xec\xba\xf2\x4b\x74\x66\xb7\xe5\x5b\xf4\xec\x0c\x43\x2c\xad\x38\x57\xb8\xde\x9e\x2d\xfe\xe0\x22\x13\x7a\x1c\xd4\x6e\x45\x95\x9d\x34\x3c\x11\x8d\x1b\x8b\x85\x7f\x17\xec\x30\x48\x0b\x1b\x3f\x78\x94\x34\xe7\x99\x26\x28\x9b\x5f\x42\x04\xda\x0e\x44\x90\xc1\x5e\xf6\xb0\x09\xe2\x68\x57\x8b\x6b\x4a\x0f\x62\x37\x6e\x0c\xd1\x8d\x62\x84\x2b\x99\xbf\xc5\x06\xd4\x54\x08\x89\x22\xaa\x1e\x60\x03\x6f\x3d\x70\xc5\x2f\x40\x49\xad\x68\x86\x56\xb2\x9a\xe7\x40\x53\x9b\x0a\x95\x5d\x6b\xc7\xe1\x48\x82\x05\x24\x11\x26\x10\xc0\x06\xd8\xa2\x8b\x3e\x28\x41\x92\xa1\x85\x1d\xb4\xe2\x3f\x30\xa5\x7b\xf4\xb6\x6b\x46\xbb\xf1\x2e\xce\xea\xb1\x41\x67\x33\x56\x52\xf8\xcf\x77\x7e\x0b\x2c\x81\xb4\x5a\xa7\x61\xd8\xbe\x8e\xa9\x52\x13\x39\x19\xb4\x32\xb0\xf7\xae\xfb\x74\x74\xf3\x23\x91\x31\x83\xf8\xcb\x74\xd1\x3b\xdc\x88\x2c\x6e\xd8\x45\x2b\x38\xc8\x5e\x24\x90\x23\xed\xdd\xf2\xee\xa7\x26\x50\x1b\x98\x08\xee\xf0\x0e\x6d\x4e\x7a\x4b\x0d\x8e\x5d\x8b\x0a\xed\x1a\x0d\x3a\x08\x11\x03\x6d\x91\xbd\x27\x38\x2f\xd1\xa0\xed\xf1\x12\x0d\xfa\x12\x0d\x9a\x34\x1a\x34\x12\x76\x3c\xdf\x5a\x12\xd8\x19\xc7\x31\xf8\xe8\xce\x31\xf3\x7a\xbf\xb3\x38\xf8\xe0\x4c\x1f\x99\x29\x55\x3b\x01\x65\x7f\x34\xda\xc7\x14\x94\xc6\x44\x51\x9b\xc9\xf0\x0f\x84\x89\x4c\xe6\x76\x9e\xcf\x30\xbf\xd2\x06\x44\xf8\xc6\xcf\x13\xc3\x52\xfa\xb5\xe2\x24\x16\x98\x3b\x85\x44\xd5\x9b\x55\xf8\x5e\x8e\xef\xd2\x0b\xa6\xbd\x89\x7b\x23\xce\x86\x8e\x93\x6e\x8b\x33\x1f\xd1\xe4\xe4\x5a\xff\xbd\x26\x05\x2f\x39\xb4\x37\xc9\x81\xc2\x31\x6d\xfa\x39\xba\x08\x39\xc0\x29\x47\x59\x55\x0f\xdc\xf4\xa3\x92\x95\x52\xcd\x07\x61\x09\xfb\x65\x6b\x4d\xf7\xc4\x21\x08\xd1\x59\xad\x14\x13\xa6\x98\xf7\x2b\xf8\xde\x8c\x1d\x94\xa6\xfd\x09\xec\x88\x30\x1d\x10\xa4\x4f\x23\x86\x66\xb4\x69\x50\x13\x4f\x07\xae\xe6\xb0\x8b\xc0\x3b\x5d\x61\xbf\x41\x13\xc5\x68\x3f\x65\xe2\x9a\x5c\x53\xa5\xfb\xdd\x79\x92\x56\x7e\xce\xf9\x35\xd7\xb2\x73\x0c\x5a\x34\x51\xbc\x3d\x97\xc1\x83\x66\x6f\xaa\xac\x4d\x55\x1b\xc7\x4e\xfc\xf5\x65\xb7\x95\xb4\x42\x5a\xb8\xb6\x0b\x8a\xc6\x9b\xae\x0e\xca\x66\x54\xd4\x18\xa6\xc4\x5b\xf2\x7f\x0f\x7e\xfa\xf5\x3f\x87\x87\x7f\x3e\x38\xf8\xdb\xeb\xe1\xff\xfa\xfb\xaf\x0f\x7e\x1a\xc1\x7f\x7c\x75\xf8\xe7\xc3\x7f\xfa\x3f\x7e\x7d\x78\x78\x70\xf0\xb7\xef\x3e\xfc\xe5\xf3\xc5\xe9\xdf\xf9\xe1\x3f\xff\x26\xea\xf2\x0a\xff\xfa\xe7\xc1\xdf\xd8\xe9\xdf\xd7\x9c\xe4\xf0\xf0\xcf\xff\xb3\x37\xe8\x54\xcc\x3f\xf6\xa4\xc3\x38\x86\x09\xe5\x81\xf6\x8c\x49\xd0\x6f\x41\x4b\xe1\xc2\x0c\xa5\x1a\xe2\xd4\x6f\xa1\xa7\x74\xcf\x05\x3c\x7a\xa5\xbe\xff\x8d\x0c\x12\xf8\x52\x50\x10\x77\xe8\x82\x3f\x86\x0e\x98\x38\xe5\x02\x42\x42\x4e\xf8\xd6\xaa\x8d\xfa\xf5\xdb\x25\x56\x0c\x2b\x2b\xa9\xa8\x9a\x93\xdc\xb9\x1c\xe6\x8f\xd0\x46\xa6\x67\xa3\x6b\x00\x3d\xe7\x5d\x6e\xf5\x96\x5d\x96\x25\xcb\x79\x5d\x6e\xdb\x5b\x89\x50\xc4\x07\x7f\x63\x8f\x18\x22\x96\xe4\x24\x44\xc0\xbb\xc7\x9c\xcf\x78\x4c\xb3\x2b\x34\x22\x04\xcc\xe8\xe3\x59\x62\x71\xc9\xe1\xbd\x3d\x17\xea\x5a\x32\x2a\x82\xe7\x14\xc2\xb2\x65\xce\xf6\x75\x78\x16\x41\x4a\xe2\xac\xc4\x90\x2c\x97\xd3\x75\xe0\x16\x38\xb4\xaa\xd0\x07\x90\x5f\xb7\xd6\xc6\xbd\x07\x76\x93\x24\x8d\x09\xf8\x2f\xec\xbd\x95\xf5\xb7\x8d\xa6\x01\x10\x1f\xa3\x6f\x24\x98\x75\x5c\xa3\xab\x09\x29\x64\x16\x25\x6c\xb4\x44\x51\x40\xd4\x53\x4f\xe2\xfa\x46\x2b\x59\x74\xb5\xd0\xa0\x0e\x04\x2e\xb5\x42\x63\xbc\x35\xcf\xe8\xb8\x60\x68\x3a\x02\xbc\xe9\x8d\xa3\x76\xb1\x92\xde\xf2\xb2\x2e\x49\xad\xed\x9b\x49\xd1\x9e\xbb\x79\xb1\x1b\xbc\x9a\x78\x57\x4a\x2e\xe0\x47\x2d\x33\x5b\x77\xe7\xd5\x8c\x91\xcb\x70\x02\x8d\xd1\x17\xc3\x17\x9d\x4d\x47\xd7\xa0\xfa\x3b\xe8\x9c\x02\x2a\x27\x10\x66\x1b\xf4\x10\x4d\xa0\x9e\x43\xe7\xc6\x99\xe4\x2e\xc1\x10\xbc\x68\x53\x0c\xa0\x5f\xb3\xe8\x80\x6a\xe1\xf2\xa1\x9e\xeb\x3d\x7e\x76\x52\x7c\x4f\xd9\x3d\x95\xc4\x9e\x44\x4e\x4f\x2e\x9d\x87\xfc\xb2\xad\x89\x7b\x21\xc1\xad\x25\xef\x39\x7b\xf4\x92\x64\x37\xea\xf3\x8c\x02\x81\xed\x53\x66\xfd\x73\xb0\x7d\x3b\xe1\x31\x9b\x67\xae\x81\x10\x6f\x62\x14\x43\x9c\x1a\xde\x5d\x28\xc4\x33\xb4\xff\xe7\x6d\xe4\x3e\x7c\x69\xcc\x26\x18\xde\x8f\xbf\x01\xfb\xa2\xee\x56\x12\x08\xbd\x04\x05\x33\x50\x79\x88\x89\x30\x29\xe4\x28\x94\xf2\xda\x92\x90\x4e\x33\x7f\xaf\x5d\x80\x1d\xef\x78\x2d\xe8\x61\xab\xa2\xa4\x46\x83\x9f\x60\x2c\xc7\x2a\x49\x45\xb3\x03\xaa\x16\x1d\xdf\x7f\x7c\x48\x26\x8c\x9a\x5a\x61\xec\xba\x90\x0a\x3c\x22\x48\xc4\xd0\x94\xaf\x98\x45\x01\x68\xec\xa4\x64\x49\xb4\xa0\x95\x9e\x49\x03\x66\x63\x5a\xd1\x8c\x9b\xce\xe5\x6d\x8c\xa2\xd9\x95\x9d\x19\xa2\x98\xe0\xcd\xba\xbd\x46\x76\xe8\x72\xf4\x63\x5c\x6d\xd7\x95\x32\x33\x25\xeb\xe9\x0c\x0a\x0f\xe1\x53\x59\x41\x35\x56\xb9\xea\x16\x80\xb8\x74\x4d\x67\xe8\xd4\x24\x9f\x0b\x5a\xf2\xcc\x9f\x1f\x64\x91\x69\x2e\x5d\x80\x09\xc0\xd2\x75\xdb\x28\xb9\x60\x4a\x73\x6d\x98\x30\x18\xeb\x72\x5c\x50\x5e\x92\x03\xcd\x18\x39\xf5\x57\x1d\xbf\xb9\x44\x35\x1d\x9d\x5b\xdd\xd3\x0e\xe2\xe0\x19\xd7\x64\xd4\xd5\x91\xb6\x9f\x78\xa7\x5e\x14\x50\xda\xbd\x05\x84\xbb\x95\x4b\x5f\xf1\xb0\xc7\x65\x5c\xbe\x67\x52\x41\x86\x90\xb3\xcf\x5d\x33\x91\xcb\x26\xb0\xba\xd3\x5a\x47\x17\x67\x3a\x36\x88\x22\x4d\xab\x70\x75\xf8\xc2\x35\x41\x0d\x9d\x0b\x03\x45\xec\xb4\x9e\x15\xb8\x04\xe1\x22\xe7\xd7\x3c\xaf\x69\x81\xa2\x56\xe7\x6d\x3a\xbe\x3c\x43\x20\xf9\x74\x66\x86\x37\x0c\xdc\x89\x28\x6b\x37\x5c\xc4\xbf\x1a\xbf\x93\x32\xcb\x35\x08\x65\x86\x18\xd9\x8d\x20\x31\xe7\xc6\xb6\x9b\x76\x43\xe7\xd0\xcd\xdb\xa5\x3d\xb6\x22\xcd\xdd\x89\xb9\x65\x27\xb2\x9b\xcc\x50\x7a\x29\xcf\x21\x77\xc7\x8d\x3b\x02\x32\x9c\x51\x01\xaa\x2b\x78\xa1\x2d\xfe\x03\x4d\xbd\xbb\x6b\x5d\x29\x4e\x15\x30\xb8\x99\x0a\x05\x5f\x4d\xed\x8d\xeb\x68\x91\xd9\xb2\x55\xe4\xba\xb9\x8d\x9f\x59\x59\x15\xd4\x6c\x3d\xa0\xfb\xc7\xc8\x29\x1f\xc5\x0a\x5a\xd6\x41\x45\x3e\xa4\x85\x25\x19\x17\x3f\x1c\xbb\xd2\x65\x48\xd8\x93\x64\xc6\x7c\xf6\xe2\x87\x70\x1a\x0e\xaa\xb2\x4b\x69\x3a\x74\xd7\x1b\xb3\x1c\xe4\x01\x07\x71\x9f\x54\x4a\x79\x23\x98\xf2\xf7\xea\xe2\x87\xe3\x01\xe1\x23\x36\xf2\x7f\x85\x25\xbc\xb8\x64\xe4\x14\x8b\x53\xf8\x12\x39\xdd\x23\x0c\x65\x3e\xc2\x57\x8f\xfd\xd7\xf1\x9a\xff\xf8\xa3\xdd\x14\xfb\xed\x9f\x86\x7f\x74\x0c\x06\xfe\xfa\x87\x95\xda\x7a\x64\xd3\xfd\x63\x61\xb6\xb8\x1e\x00\x88\x3b\xf6\xaf\x7f\x5c\xc8\xfc\xb2\x62\xd9\x08\xb7\x5f\xff\xa3\x57\xd0\x2b\x21\x4c\x18\x35\x1f\x91\x0b\x09\x19\x32\x3c\x47\x82\x06\xef\xaa\xd8\x7f\xfa\x80\x0c\x40\x83\xe0\xf5\xcd\xa8\x61\x02\xa4\x5f\xd1\xbd\xf7\x39\xf1\x75\x35\x61\x59\x20\xf3\x14\xf6\xf9\x00\x5c\x75\x58\x5e\x7c\x40\x8c\xc4\x46\xdd\x5d\xb9\xad\x1d\x47\x82\xb0\x5b\xae\xa1\x8f\x08\x9e\x24\x20\x09\x75\xa5\x0d\xbc\xca\x61\x81\xb1\x78\x17\xfa\xe2\x54\xb2\x7b\xc4\x2d\xec\xe0\x57\x42\x9a\xaf\xc2\xe5\xf5\x19\x6b\xa0\x5b\x48\x42\xaf\x25\xcf\x49\xad\x41\xe6\x14\xa4\x16\x10\xb2\xd0\xa3\x84\xac\xc3\x9e\xf1\x9c\x94\x5c\x1b\x7a\xc5\x46\xe4\xd2\xaa\x23\x71\x18\x31\xe2\x94\x20\xe3\x42\x66\x57\x2c\x27\xb5\x30\xbc\xe8\x65\x99\x09\x70\xc3\xd6\x46\xaa\x0a\x14\x8d\xad\x33\x2b\xe5\x56\x8a\x0d\xbd\xc2\x84\x4f\xf5\xb0\x18\x23\x43\x0f\xbb\xda\x9c\xd5\x20\x5c\xd5\x19\x45\xd3\x6d\x95\xc3\x92\x2e\xf7\xb5\x27\x31\xba\x93\xa7\x6f\xf7\x53\xc2\xdf\xee\x0f\x40\x32\x3d\x22\xe7\xa0\xb9\x14\xdd\x2f\x25\x26\x4d\xa0\xb5\xdb\x45\xc8\x08\x96\x31\xad\xa9\x9a\x63\x62\x31\x37\x3e\xa7\xbd\xd6\x6c\x52\x17\xa0\x30\x76\xdf\x54\x2a\x6a\x0b\x30\x51\x2c\x93\x42\x1b\x55\x67\x80\x35\x94\x8c\x95\xbc\x62\xa2\x29\xf4\xd1\x83\x99\xc4\x19\xd3\x4d\x52\xa7\x15\xaf\x85\x24\xd9\x8c\x8a\x29\x0b\xa5\x84\x49\x49\x73\xc0\xe4\xef\x82\xf1\xa3\xfb\x66\xca\x80\x17\x74\x62\xac\x58\x68\x00\x41\xc6\x56\x4b\xf0\xd1\x48\xdd\x5f\xec\x53\x48\xf8\x2e\xa3\x80\x26\xc1\x8b\x2d\xa6\x1a\xf6\x8f\x28\x19\x82\xb6\xda\xd5\x60\x98\x20\x82\xa4\x64\x86\xe6\xd4\xd0\x5d\xa9\x21\xf0\x81\xce\x43\x64\x1a\xc6\xec\x03\xea\x46\xb1\xfc\x4e\x4d\xf0\xf6\x21\x59\xf1\xb8\xa0\xf5\xc5\x0f\xc7\xbd\xd6\x07\x83\x10\x60\x2b\x74\xc3\x32\x96\xca\xb8\xd0\x45\xb8\x55\x58\x3a\xc2\x57\x04\xb0\xa0\x79\x48\x90\x8d\xb3\x9c\xe4\x75\x6f\x6f\x76\x23\x22\xf4\x89\x9d\x4a\x12\x39\x65\xf1\x73\x57\x90\xe3\x73\x13\x8c\x9e\xb5\xb3\xd3\x97\x2a\xfa\x18\xb3\xc8\x84\xe1\x8a\x45\x05\xd7\x7b\x81\xe0\xf0\xad\x16\x48\x49\xdb\x98\x87\xa8\x39\x65\x46\x37\x69\x97\x28\x50\xf6\x5c\xd5\x38\x25\x09\xdf\x08\x34\x3f\x8f\x8d\xce\xd7\xb2\x74\x03\x7a\xad\x89\x78\xae\xa5\x13\x1c\xad\xc8\xbd\x75\x64\x4c\x17\x35\x47\x33\xcb\xe7\x3f\xc8\xbc\x7f\xf8\x5d\xda\x38\xd0\x16\x68\x4d\x71\x1b\xac\x01\xa5\xc1\xdd\x89\x0f\x40\x28\xb5\x6e\x15\xb7\x47\x49\x66\x46\xaf\x7b\x17\x80\xee\xec\x0b\x6b\xec\x15\x43\xef\x16\x43\x70\x87\x00\xee\xf0\x4d\x4f\xc0\xfa\x27\x20\xfa\xd1\x33\x11\xb1\x0d\x50\x92\x18\xb1\x47\x28\xf1\xea\x87\x65\xf1\x97\x49\xe2\xc3\x52\x63\x7b\x03\x99\x13\x5b\x5d\xba\x40\x48\x6c\x71\x65\x31\x19\xb7\x4c\xb8\xff\x79\x7d\xd5\x52\x53\x9d\x71\x25\xf8\x37\xb0\xa4\xd4\x81\x77\x78\x8c\x1c\x5a\xfb\xee\x5b\xed\xc7\x0f\x13\x03\x03\x5a\xf9\x72\x1b\x78\xef\x95\xce\x5c\x76\xa4\xb7\x5c\x31\x05\x99\x3a\x51\x69\x4b\x4b\x6a\x94\x2c\x0a\xa6\xe0\x08\x9c\x53\x63\x21\x01\xcc\x9e\x16\xc1\x30\xc0\xee\xfd\x38\xfc\xf0\x6e\xbe\x60\x6a\x13\xec\x26\x68\xd7\x54\x63\xa7\x6b\x1f\x01\x0f\xee\x4b\x9f\xd5\xb7\x0c\x9e\xfe\x24\xef\x47\xef\x0c\x3c\x12\x73\xdc\xfc\x93\x08\x39\xd1\x65\x46\xa6\x16\x54\xae\x09\x13\x74\x5c\x58\x75\x24\x42\xe0\x00\xe7\x82\x74\x6a\x64\xf4\xd4\x27\x36\xe9\xbf\x75\xe0\xc3\x8c\xa7\x5c\x6f\x6d\x14\x6f\x5b\x3f\x1c\x35\xb9\xb0\xce\x36\x93\xa0\x21\xb0\x1f\x0e\xeb\x5a\x4b\xb4\xf3\xa3\x16\xa0\x89\xbb\xcd\x2c\x7d\x83\xbe\x30\x25\xcb\x26\x48\x97\x4f\x00\xfd\x42\x78\x47\xff\x40\x7b\x9a\x5e\x76\x42\x1c\xe9\xd2\x12\x20\xcb\x17\x52\xc2\x52\xc4\x77\xa7\xe6\x3b\x04\xdd\x76\x00\x9f\x37\x01\x4f\xe1\x0f\xaf\x53\x84\x78\xe7\x31\xb3\xd4\xb9\x69\x3e\xd5\xff\x5e\x10\xbc\x1b\xf1\xfa\x4b\x52\x07\x1b\x32\xf7\x1d\x17\x79\x48\xe2\xf4\x45\x61\xad\x80\x76\x74\x71\x86\x50\xa7\x81\xe9\x1d\xf0\x84\xb9\x53\x78\xcd\x8c\xab\x7c\x58\x51\x65\xe6\xe8\xda\x1a\xb4\x20\x0e\xf5\x1c\x13\x2c\x9d\x34\xd2\xde\x5e\xa6\xe4\x28\x07\x47\xe0\xc3\x12\x5d\xdc\xec\xbd\x18\xb2\x6b\x3b\xd2\xb7\x4a\xa4\x1f\xad\x1d\x39\x6f\xda\xa1\x05\x27\xce\x33\xd9\x91\xc7\xca\x18\x27\x6d\x6e\xb6\xbb\xb2\xb6\x65\xb5\xba\x9d\xbb\x84\xa2\x2f\xd8\x2b\x9c\x1b\x52\xc6\x65\xc3\x82\x96\x09\x56\x7e\x3b\xd3\x80\xf0\x89\x15\xda\xa4\x18\x42\xe4\x63\x6f\xf0\x9a\xb0\x27\xa7\xe9\x8e\x5c\x7a\x33\x5a\xe0\x81\x30\x45\x50\x46\x4b\x37\x74\x90\x1c\x08\xd9\xdd\x40\xef\x07\xd0\x56\x5c\xeb\x10\x33\xda\xef\x89\x24\x19\xf7\x6f\x61\x45\x1a\xc9\x33\x36\xdd\x47\xbc\xc0\x8b\xc4\x5c\xe4\xf6\x52\x81\x88\x04\x46\x7d\x5d\x67\x19\x63\xc1\x65\xe8\xc8\x52\x7f\x95\xb6\xc5\x7b\xdc\x96\x97\xd4\x64\x33\xa6\x89\x96\xd0\xeb\x58\x1b\x5a\x14\x2c\x0f\xa1\x4e\x88\x28\x12\xb4\x0a\x17\x06\xd5\x1b\x8e\x48\x59\xe9\xbf\xc5\x91\x63\xc4\x79\x5d\xab\x82\x3a\xa7\xd2\xa4\x16\x19\xe6\x2f\x72\x33\x0f\x51\x26\x8b\x8a\x29\xd8\xa1\x35\xf8\xda\xfa\xab\x3e\x13\x8c\x18\x89\x6c\xca\x01\x99\x81\xf9\xcf\x91\xdd\xcf\xe8\x35\x6b\xa2\x3d\x5c\x97\x48\xcb\xa5\x43\xa9\xdb\x04\xb8\x1e\x95\xca\x1d\xa0\x86\x10\x0b\xec\x62\x3f\x0e\x06\xe7\x22\xb5\x2a\x13\xef\xc3\x41\xb4\xe9\x77\x54\x9c\xc3\xa0\xda\x68\x66\x42\x11\xef\xfe\x12\x2f\x71\xf1\xf3\xb4\x36\xb2\xa4\x86\x67\xe0\xa2\xe3\x93\x28\x48\xac\xc4\xc0\x0b\x4b\x69\x7c\x20\x3c\x8a\x48\x20\xb8\xb9\x73\x4b\x44\x06\x96\x2b\x4b\x8f\xb0\xf1\xd1\x5e\xbb\x53\x6e\x6f\xab\xdf\x96\x48\xf4\x4c\xf4\x9e\x9f\x7d\x45\x64\x62\x66\x8a\x31\xc2\xcb\x4a\x2a\x43\x85\x21\x39\x9f\x84\x1a\xdd\x3e\xc2\x70\x15\x4e\xa4\xb0\x07\xfd\x08\x71\xb5\xd1\x2a\xe8\x30\x2d\x0a\x79\xa3\x89\xb9\x91\xc1\xe5\xd0\xc4\x77\xb9\x9a\xc7\x83\x36\x30\x09\x64\x1c\xb7\xaa\x65\x75\x16\xaf\x22\x3e\x34\xb0\xb4\xe7\x86\x15\x85\xfd\x77\x15\x37\xea\x5d\xc7\x64\xe9\x9e\xf0\xa9\xc0\x32\xb4\x5c\x7b\xe7\x97\xab\xa1\x72\x90\x2b\x59\x55\x2e\xf8\xa1\x3c\x4c\xbf\x27\x10\xbc\xae\xae\x99\x86\x24\x13\x5f\xd7\xc5\xa2\xc2\x94\x09\xa6\xa8\x81\xf0\x3a\xd7\xcf\x15\x44\x92\x45\x20\xfb\x3a\x7d\x70\x24\xb4\x8b\x3c\x80\x74\x18\x7a\xb9\x1c\xc9\xfc\x33\xee\xdb\x04\xef\xc5\x05\xe2\x9b\xa7\x3b\x09\x10\xe8\xe0\x5b\x66\xe8\x21\xf9\x5e\x23\x5a\x04\xce\x1b\xea\xf0\xac\x65\x65\x73\xf5\xd6\xd1\xd0\x96\x00\xa8\xa3\xa2\x9a\x45\x50\xc5\x76\xa9\x50\x42\xae\xbd\xd7\x2d\x78\x8f\x95\xd4\xfa\xdc\xff\xe4\x09\x41\x7f\xb1\x59\x3d\x30\x5e\x6c\x56\x2f\x36\xab\x17\x9b\x15\x8c\x17\x9b\xd5\xe2\xf8\x52\x6c\x56\xa4\x61\x57\xbb\x4a\x9b\xce\x63\xd5\xa5\xcd\x60\x1f\x79\x9f\x09\x39\x97\xc6\x85\x18\x83\x06\x4b\xef\x75\x3a\x51\xe0\xd0\x37\x74\x3e\x12\xcc\xb8\x4e\x26\xde\xbf\xfb\xc9\xc3\xf4\x17\x65\xb5\x11\x67\xfa\x88\xe8\x86\x27\x64\xbe\xbd\x4d\xb4\x8a\x91\x28\x9a\x35\x11\xcf\xf0\xf9\xbe\x76\x71\xad\xf6\x7b\x28\x59\x18\x4f\x90\xb1\x11\xb9\x74\xb9\x2e\x0b\x8b\xdf\x6d\xb2\x90\x33\x43\x79\x9f\xde\x4d\xf1\xf0\xd2\xd0\xe7\x7b\xa4\xb3\xad\x49\x3b\x24\xe5\xb5\x09\x45\x97\x76\xcd\x14\xdb\x14\x71\x8b\xb2\x73\xe3\x9c\xfe\xe6\x81\xc7\x8a\xf0\x39\x9b\x90\x4f\x2c\x93\xd7\x4c\xe1\xe9\x9e\xde\x56\x54\x68\x2e\xc5\x3b\xca\x0b\x7b\xb6\xfe\x8c\x1b\x6f\x37\xa9\x35\x53\xed\x10\xc8\x28\x44\x23\x5c\x70\x87\x48\x16\x7b\xfb\x2b\x28\xa1\xbb\x89\x5d\xcf\x65\xd0\x55\x8a\x5d\x73\x59\x6b\x5f\xf9\xa0\x36\x28\x69\x68\xe3\x2c\x44\x33\x3e\x9d\xf9\x87\x7d\xc6\x2a\x44\x5d\xab\x3c\x5c\xe2\xde\x90\x69\x43\x4d\xad\xdb\xe5\xa7\x33\x08\x3c\xdc\xa1\xe8\xab\x80\x47\xbb\xa3\x84\xa4\x14\xd7\xb1\x02\xc5\xae\x32\xc4\xf7\x58\x1f\x03\xa7\x1e\xbb\xbb\xec\x4b\x7d\x34\x65\x4d\x32\x59\x56\xb5\x61\xd1\x9d\x77\xb7\x2b\x0d\xa9\xdf\x10\x99\x5a\xfd\x9f\x5e\x95\x54\xd0\x29\x1b\x06\xd0\x86\x4d\x95\x8f\x57\xc9\x28\x7d\x12\xb4\x22\xc9\x9b\xff\xc4\xe3\xd9\x55\xe7\x68\x8f\x64\x75\xf6\xc8\xa3\xd4\xda\x23\xe9\xeb\xed\x91\xc7\xaf\xb9\x47\x42\x09\xd4\x5d\x25\x40\x9f\x1c\x7c\x8b\x24\xc8\x09\x19\xab\x48\x50\x4a\x55\xd9\x09\x1b\x0e\x16\xae\x89\x2c\xb9\x31\xcc\xa7\x23\x06\x92\x32\x20\xdc\xb4\xaa\x63\x3a\x02\x0a\x0e\x4e\xcc\x1e\x64\xb7\x55\xc1\x33\x6e\xa2\xf6\x75\x1d\x0b\x48\x2c\x0e\x30\x20\xdc\x70\x8d\xa2\xbc\x20\xbc\xac\x0a\x16\x24\xf0\xa1\xab\x2e\xe4\x9d\x70\xe1\x6d\x32\xc8\x4d\x21\xec\x16\x5c\xb1\x08\xf0\x0b\xdd\xde\x70\xbc\xd0\xed\x7b\xc6\x0b\xdd\x4e\x4e\xb7\xb1\x76\x69\xff\x52\xc0\x2d\x7a\xed\x27\x75\xdd\x97\xe8\x98\x15\xe4\xe7\x9a\xa9\x39\xb1\x0a\x56\x53\x17\x44\x5a\x62\xa7\x79\x8e\xf5\x2b\x7c\x4c\xc7\x0e\x79\x08\x52\x0a\xe7\x10\x33\x72\x7a\x6b\xf5\x5b\xe8\x4a\x91\x9c\x4b\x2e\x2e\xd0\xee\x7d\x85\xa7\x10\x4e\x26\xd6\x4a\x31\x91\x2a\xfe\x04\x54\xcc\xa3\xf3\x93\x94\x06\x8c\x14\x69\x2a\x24\x5d\xaa\x0a\x79\x24\x21\x83\x90\xa3\x15\x7b\x8d\x67\x12\xbe\x01\x3e\x1e\xd2\x9a\x82\x37\x97\x5c\xb1\xf9\xc0\xa5\x7a\x12\x8b\x81\xd4\x3f\x9c\x08\x44\xcc\x9e\x47\xf1\xe7\x8a\x61\x1c\x47\xbf\x5e\xa5\xed\x91\x98\x21\xa6\x74\xd5\xe1\x18\xda\xd7\x4e\x36\x97\x3f\xa2\x34\x3c\x3a\x31\xcf\x27\xf6\x55\x53\x4d\xb5\x70\x67\x2c\xee\x38\xeb\x36\xe2\xbc\xfd\x20\x54\xa3\x0c\x68\x0e\x95\x42\x81\xe0\xa7\x41\x2f\x92\xda\x99\x80\xc3\x1f\xe3\x23\x6d\x56\x32\x02\x43\x22\x58\xdb\xf5\x0c\xaf\xd8\x7c\x5f\xbb\x36\x24\x52\xe8\x19\xaf\x40\x7c\x87\x60\x26\x39\x49\x7a\xc5\x71\xfc\x00\xe9\xb0\x1e\x18\xe4\x1b\x67\x62\x40\xce\xa5\xb1\xff\x9c\x42\x71\x0a\x20\x2f\x27\x92\xe9\x73\x69\xe0\x93\x9d\xc6\x02\xdc\xa4\xe7\x80\x03\x2e\xe6\x88\x43\xc4\x0f\xb0\x57\xac\x5f\x0d\xb5\x0a\xdd\x59\xfb\xac\xa3\x80\x2f\x5c\x93\x33\x41\xa4\x72\x47\x94\x10\x1c\x30\xcd\x23\x48\x08\x8c\xf7\x77\x37\x41\x81\xcb\xa0\x71\x38\x22\x55\x0b\x45\x9e\x04\x30\x07\x14\x78\x7d\xf0\x1b\xf0\x6e\x41\x2c\xac\x2f\x5d\x00\x45\xaf\x14\x35\x6c\x9a\x20\x88\xb7\x19\x25\x53\x53\xe8\x13\x94\xcd\x52\xdf\x86\x54\x82\x16\x8e\x84\xe2\x16\x8e\x47\xb8\xb2\x8f\x9a\x2d\xfc\x24\x0b\x80\xec\xfe\x1e\x4a\x7c\xec\xaa\xf5\x2c\x02\x11\xa5\xd8\x92\x56\x96\xde\xfc\x97\x15\x56\xe1\x7a\xfd\x37\xa9\x28\x57\x7a\x44\x8e\x88\xe6\x62\x5a\xb0\xd6\x77\xce\x59\x1c\x4d\x93\x08\x2c\x88\x65\xb1\xf2\xe1\x35\x2d\x18\xd6\x69\xa2\x82\x30\x34\x57\x41\x7d\xee\x05\xc5\x68\x40\x6e\x66\x52\xa3\xe4\x1b\x52\x0c\xf6\xae\xd8\x7c\x6f\x90\xc4\x15\x46\x62\xfe\x6c\xa7\x3e\x13\x7b\x4d\x23\xb8\x16\x25\x0a\xb2\x3f\x44\x3c\xee\xc1\x77\x7b\x4f\xa3\x8f\x3d\x03\x73\xd5\xb3\x48\x72\x72\xee\xc6\xe3\x82\x62\x88\xc0\xae\x39\xd7\x17\xe1\x5b\x8c\xf8\x81\x4a\xf7\xd1\x33\x4d\x78\x87\xab\x72\xb6\x73\x5e\x5c\xa8\x5b\x9c\xa8\x78\x46\x02\xe4\x42\xb0\x8e\x8c\x51\x7c\x5c\x1b\xa6\x77\x16\x13\xee\x05\x34\x2a\xeb\x16\xfa\xa7\xda\x93\xff\x61\xd9\x0f\xa2\x0a\x78\x5c\xa7\x42\x8e\xb3\xc9\x62\xec\x64\x54\x52\x37\xae\x8b\x20\x95\xab\xb0\x77\x27\x0b\xcf\xfe\x4d\x03\xa8\xae\x86\x7a\xff\x70\xaa\x26\x58\x53\x31\x5d\x49\xcc\x3a\x5b\xba\x31\x4e\x90\x9c\x51\x0d\x51\xf7\x13\x17\x14\x55\xd5\xaa\x92\x50\x0b\x9d\x8a\x3b\x97\x31\x49\xdd\x08\x57\x24\xc4\x17\x61\xc2\x82\x73\xe1\xe6\xda\xfb\x1e\xfa\x5f\x1e\x2d\x74\x7e\xc1\x90\x91\xa8\x8b\x84\x90\xcb\x5f\xae\x37\x9c\x3e\x5d\x09\x6d\x01\xa1\xe6\x3d\x82\x88\xd5\x05\xf7\x31\x88\x36\x0a\xa6\xb1\x9a\xad\x89\x63\xe6\x8d\x6c\xc3\x0f\xa5\x10\xb1\xe5\x45\xef\x16\xaa\x04\xf1\xb0\x16\x4d\xd8\xae\xe7\xd9\xcb\x53\x4c\xa0\xcf\xc6\x58\xd6\xc2\xa1\xac\xef\xd0\xf1\xb8\x1b\x68\x77\xc4\xd7\x9f\x0c\x60\xb9\x8b\x10\x95\x2d\xe1\x13\xbb\x2f\xae\x3a\x64\x8a\x7d\x69\x45\x54\x43\xc4\x9e\xc2\x43\x1a\xcf\x97\x53\x16\x92\x4b\x86\x27\x0a\x50\x0c\xf0\x1c\x97\x6f\xa5\x7b\xb9\xfe\xcc\x0e\xb3\xb6\x28\xb9\x60\x78\x53\xb5\xa1\x86\x41\xba\x90\x62\x93\x02\x6b\xd2\xb9\xdd\x2b\x65\xce\x27\x2e\xeb\xe2\x32\x8a\x5e\x1a\x60\x81\x52\x57\x47\x34\x6e\x42\xda\x1b\xbc\x54\xc7\xd1\xab\x37\xcb\xb0\xa1\x92\x43\x60\xa5\x2c\x81\x13\x74\xad\x24\x97\xe5\xfc\xe4\xfe\xe8\x49\x72\x20\x27\x13\x7b\x5c\xbe\x3f\x55\x1a\xd7\x50\x32\x9e\xff\xa1\x77\x4f\xf4\xc7\x62\xf2\xd0\x5a\xdb\xb7\x11\x69\xb5\x37\x6b\xf2\xca\x1f\x49\xce\xfb\x01\x58\x8a\x9c\x90\x77\xbc\x60\x7a\xae\x0d\x26\x8c\xf2\x12\xe9\x3e\xa6\xd4\x4a\x43\xb8\xc8\x8a\xda\x05\x20\x22\x17\xb0\x74\x77\xc7\x4e\x38\xb9\x18\xd7\x4c\xeb\xe5\x70\x9f\xc9\x7e\xa7\xd4\xef\x22\xa5\x84\x34\xe7\x70\xbd\x92\x9c\x56\xaf\xdd\x9a\x74\x2a\x85\xd9\xda\x8d\x49\xd6\xb6\x5f\xbf\xe3\x63\xc5\xc8\xf1\x8c\x0a\xc1\x8a\xa8\xc7\xa6\x0b\x77\xa1\xc6\xd0\x6c\x86\x5c\x87\x12\x4b\xf1\x0a\x66\xa5\x86\x99\xd4\x86\x94\x34\x9b\x71\x11\x9a\x73\x89\xd0\x6b\xb6\xa9\x9c\xfc\x0c\x9b\x03\x4c\xf4\x67\x0b\x40\xc7\x73\x4e\x45\x5c\x10\x0a\x8f\xb1\x93\xe6\x62\x03\x55\x31\x92\x40\xe8\x54\x82\xc6\x84\x77\xe6\x0e\x7d\xb3\x3d\x95\x82\xb3\x46\xeb\x0a\xf0\x77\x78\xb6\xfb\xca\xa7\xb7\x23\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x21\xb8\x8a\x8b\x48\xdc\x61\xee\x07\x56\xc4\x8a\x84\xc5\x7e\xa5\x97\x7b\x50\xac\xa2\x16\x49\xf0\x63\xbf\xa8\x85\x3d\xe2\x8f\xae\x7d\xf5\x5b\xf2\xee\x98\x18\xaa\xa6\xcc\xd8\x35\x88\xa8\xcb\x31\x53\x5d\xdb\xdc\xa6\x08\xb6\xc1\x2e\x25\x30\xcb\x37\x5f\x77\x9a\x43\x31\x9a\x7f\x14\x45\x67\x7f\x68\xaa\x0b\xe5\xe1\x68\xef\xf7\x49\x14\xec\x37\xa1\x85\x66\xe4\xc0\x3e\xf8\xea\x46\x71\xc3\x0e\x47\xe4\x93\xff\x15\x94\x0c\x00\x99\x79\x22\xfb\xc8\xa5\x98\x69\xe3\x26\xd5\xcc\x60\x9d\x67\xe1\x04\xb5\x0f\xf6\x52\x77\x96\x56\xf1\xc0\xc7\x52\x16\xac\x63\x19\x7c\xc4\xbd\x1f\x7f\x3c\xef\x6c\x4e\x6c\xe3\x77\x33\xdf\x7d\x68\x7e\x23\x55\x91\xdf\xf0\xdc\x25\x6b\x91\x03\xfb\xf0\x61\x3f\x94\xef\xe3\x8e\xe9\xe9\x7c\x49\xdd\x0a\x30\x8d\xdf\xe3\xe6\x86\xe7\x69\x4e\xb4\xc7\x05\x04\x20\xda\x38\xe0\x8d\x49\x16\x07\x08\x20\x01\xcf\x99\x30\x96\xb8\x2b\x4d\x0e\xe0\x17\xdd\x6b\x8f\x9e\x72\xec\x15\x03\xeb\x4a\x45\x32\x59\x8e\xb9\x68\x5a\x39\x35\xb8\x69\x05\x18\x4b\x6f\xbd\x97\x52\x33\x83\xfd\x17\xa0\x12\xa4\x34\x33\xa2\x79\x59\x17\x86\x0a\x26\x6b\x5d\x74\x2e\x41\xf2\x82\x9e\x77\xc6\xa4\x60\xb7\x48\xfb\xb6\xd5\xa8\xb2\x81\xa0\x2d\x19\x43\x75\x8f\xa6\x9b\xde\xa2\x68\xdc\x69\xad\xa6\xa4\x54\xfe\x2a\x88\xd6\xa1\x37\x0c\xbb\x65\x99\xab\x3c\x5b\x15\xf5\x94\x77\xac\xbe\x7f\x62\xdf\x22\xa3\x86\xe5\x6f\xc9\xbb\xe6\xe5\xa0\xae\x99\xff\x66\x44\x8e\x7d\x1c\xa8\x5b\x9e\x1c\x5f\x9e\x9d\xb8\x86\x6a\x42\x1b\x46\xb7\x21\xbb\xf7\x0b\x3a\x1b\x3a\xf3\xf5\x16\x94\x06\x5c\x38\x09\x89\x6d\xba\xda\x2d\xfa\x8c\xdc\x37\xae\x5b\x79\xe8\x3a\xdd\xaf\x01\x58\x6f\x92\xf0\xa2\x2f\x6d\x4d\x5f\x8a\x9b\x54\x47\x60\xe5\xac\x62\xc2\xf2\x3c\x11\xdf\x7f\xdc\xe7\xad\xa1\x89\x84\x33\x4e\x24\x57\xba\xc9\xda\x42\x65\x64\x03\x9d\xc9\x22\xd7\x84\xdd\x1a\x45\x2d\xdb\x2f\x2d\x83\x0f\xbf\x99\x10\x2a\xe6\xa3\x7e\x22\x66\x2f\x57\x7e\x5a\xf7\x7d\xef\x93\xd9\x6d\x0d\x2d\x7f\xd1\xd0\xe2\xa1\x59\xa6\x98\xe9\x51\x7a\x2e\xd5\x69\x05\x40\xda\xc7\xd5\xfa\xf8\x8e\x81\x15\xbf\xf5\x85\x2d\x5c\x28\x4e\x1f\xbb\xb1\x66\x42\x73\xc3\xaf\x5b\x1d\x55\xa1\x74\x2c\xd5\x3a\xd8\x21\x41\x98\x72\x04\x50\xb7\xaa\xba\x76\x5e\x18\x7d\xa2\x7c\x42\x84\x5c\x78\xab\xb8\xdc\x47\x08\xbf\x6c\x3d\xd2\x79\xd1\x10\xbb\x54\x62\x33\x72\x2a\xa0\x48\x24\x4e\x3e\x80\xfa\x74\xf8\xdf\x18\xbe\x64\xf7\x20\xb2\xc6\xc2\x2e\x74\xdf\x69\xb7\x7b\xdb\x23\x9b\x29\xc2\xf4\xfb\x56\xf5\x49\xe9\x3b\x3a\x8f\x44\x3b\x5f\xd0\xa5\x9f\x7b\xa1\xdd\x7d\x8f\x4d\x26\x2c\xb3\x77\x03\x3a\xfe\xf9\xf6\x75\x56\xad\xcd\x6b\x74\xfb\xf9\x22\xae\xed\x22\xac\x7d\xcb\x15\x46\xd1\x04\x4d\xc4\xef\x99\xd0\x86\x42\x5d\x4d\x78\x63\x2b\xa7\x59\xe1\xc9\xf5\x6c\x74\xd7\x09\x63\x23\x7c\x75\xce\x9e\x40\x94\x56\x0c\xcb\x98\xb2\x37\xa6\x98\x93\x1b\x25\xfb\x26\xba\x6d\xe8\x03\x96\xd7\x4c\x5d\x73\x76\xf3\xca\x55\xf9\x19\xda\x97\x1d\xba\xc2\x89\xaf\xc0\xdc\xf5\xea\x57\xf0\x4f\x0f\xa8\x12\x79\xdf\x1c\x97\x7d\x4b\xf6\xf6\x52\xd8\x05\x7a\x87\xfb\x4d\xa0\x71\x69\x27\x85\x2a\x8d\x4d\x00\x96\x5f\x70\x95\xb9\x0f\x9d\x41\x60\x1d\xd7\x98\xe3\x35\x91\x40\x6e\x2f\xbb\x9f\xc8\xc5\x8e\x10\x6d\xf1\xa4\x29\x4c\x55\x0b\xd1\x39\x27\xb3\xad\xfb\xe3\x32\x2d\xc5\x3f\x04\xd8\x70\x31\x34\x8a\xb1\xf0\xaa\xc6\xa9\x4f\x42\xfa\x66\xf1\x41\xb1\x79\x86\x4e\xbc\x9c\x1a\xaa\x99\xe9\xe3\x4c\x4e\x45\xea\x23\x50\xec\xfe\xc6\x54\xdf\x7d\x05\x31\x6a\x0c\xaa\x7b\xfb\x7e\x98\x64\xf8\x27\xa7\xfa\x8b\xd6\x93\x56\xe9\x77\xe7\xda\x9d\x93\x63\x15\x27\xe8\x70\x83\x36\x20\x5c\xbb\x41\x92\x6d\xe9\x88\xee\x2d\xbf\xff\xfe\xec\x24\x8d\x29\xa5\x99\xcf\x5b\x06\xe0\xbf\xdb\xdb\xef\x2e\x29\xc4\x96\xf1\x9f\xeb\xd8\x08\x6d\x9f\x6c\x2e\xbe\x7b\x7e\x1b\xbb\x33\xcd\x58\x13\x9c\x70\xc2\xf5\xd5\xb6\x28\xe3\x1d\x40\xda\x34\xf2\x2f\xc7\xa7\xc4\x7d\xba\x2a\x92\xa0\xd3\xd2\x4f\x13\x7d\xd0\xa6\xa1\x7f\x39\x3e\x5d\x78\xdd\x05\x33\xea\x51\x51\x78\x5b\x8f\x14\x3a\x14\x42\x75\xd4\x35\xd1\x16\x03\x6d\xb6\x12\xbd\x62\x39\x57\x18\x52\xe7\xdf\x32\x1f\x65\x9a\x87\x46\x71\xd3\x2b\x36\xe2\x32\x0a\xe5\xed\xb6\x05\xbd\xa2\xdd\xf4\xaf\xa6\x19\x6b\x02\x25\x73\xae\xaf\x9e\x9f\x25\xb9\xca\xcf\xbb\x15\x06\xfe\xd2\xc2\x4f\x16\xcd\x9d\x8e\x76\x3a\x21\x08\x6e\xf7\x5c\xd6\xe4\xc6\xf5\x6b\xef\x69\x66\xfd\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\x26\xab\x79\x11\x04\xab\x61\x3f\xba\xd1\x95\x96\x55\xc1\xf4\xdb\x2d\x87\xaa\xec\xc4\x55\x24\x29\x78\x7b\x45\x95\x01\xab\xe7\xb6\x51\x3b\x00\xe2\x45\x82\xe8\x03\xf1\x98\xb8\x7d\x36\xf1\x75\xa7\xda\xc1\xeb\x5c\x87\xc9\x9b\xc8\x6e\x90\xfe\x52\xe0\xef\x3b\x19\x34\x96\x57\x39\xbb\x7e\xa5\x73\xfa\x66\x00\xaf\xe5\xeb\x66\xb6\xf7\x80\x6a\xb2\xf7\x66\xaf\xfb\xca\x97\xbc\xe4\x05\x55\x05\xf6\x91\x09\x0d\x7a\xc2\xfc\x96\x43\x7a\x40\x20\x55\xef\xf5\x1e\x39\x90\x0a\x20\xca\xa8\x20\x05\xf3\x3d\x67\x1c\x25\x9d\xa3\x71\xa0\x47\x24\xf2\x4e\x5d\xa1\x6d\xc7\x63\x21\x63\xdb\xfa\x25\xcc\xbd\x3e\xe4\x64\xee\xd8\xcf\x79\x71\xd2\x88\x8f\x5c\x58\x19\x6c\x44\xbe\x77\x92\x9d\x93\xcd\x11\x6b\x73\x10\xc8\xf0\x89\x2f\x03\x3b\xbe\x24\x37\xce\x82\x43\xe6\x51\x1d\x2b\xe4\x6e\x24\xdf\x17\x82\x11\x5d\x9d\x45\x53\x6e\x3e\xb1\x4a\x6e\x4d\x4f\xc4\xe5\x17\x42\x6a\xb8\xb1\x1f\x48\xcd\x8d\x54\x73\x42\x0d\xa1\xc8\x19\xb2\xba\xa0\x8a\x28\x86\xc1\x31\x09\xd4\x36\xb7\xfa\x82\xb2\xf6\x59\x36\x11\x38\x71\xdd\x47\x67\x86\x0e\xf0\x0d\x1c\x37\xee\xe8\xa3\x3b\xb5\xfc\xea\x84\x2b\x4b\xa5\x21\x33\xfe\x4c\x70\x73\x1c\x16\xc3\x12\x54\x85\x14\x2e\x47\xc7\xae\xe8\xa2\x70\xa6\xdc\xb8\xb6\xc4\x08\x80\xfd\xda\xcf\xd6\x09\x14\x80\x00\x68\xaa\xcc\xf7\x75\xf3\xc6\xcf\x30\xb6\xa7\x41\x9c\x6d\xd8\x13\x41\xed\x96\x6a\xeb\xd4\x35\x00\x12\x1a\x6b\x60\x1c\x6d\xf3\x79\x3f\xc1\x11\xe2\x5c\x84\x0c\xce\x59\x22\x15\xd1\x86\x2a\x83\x77\x64\x7f\x34\xda\x1f\x81\x28\xbb\x3f\xda\xf7\x8a\x58\x11\x52\x88\x9d\xb4\xd7\x00\xe3\x53\x28\xfb\x14\x79\x68\x53\x8d\x11\x21\x1f\x7d\xa5\x54\x68\x01\xba\x90\xc5\x1c\x12\x94\x8b\x22\xbc\x03\x34\xaa\x69\xd3\x9e\x1e\x9e\x50\xf0\xe7\xd6\xe3\xf8\x25\x5d\x32\xf4\x94\x5f\xbb\x0e\x7a\x5b\x0b\xb3\x69\x5e\x31\x09\xa6\xc6\x3b\xe6\x0c\xa8\x9f\xde\x6f\xef\xdd\x90\x74\x27\x7a\x33\xc7\x07\xdc\x7b\x65\xb2\x2c\xb9\x21\x33\xaa\x67\xc1\x8a\xd7\xa4\x25\xf7\x63\x4d\x7d\x8d\xbf\x45\xad\x0d\x53\x93\x4e\xb4\x2b\x09\x33\xf7\x00\x2c\x18\x7b\xc3\xc7\xae\x8e\xb3\x68\x4c\x31\xc0\xe4\xf4\x8c\x2a\x66\x9f\xac\x80\xfb\x14\x7c\xc2\x0c\xef\x7a\x39\x5a\xfc\x3d\xac\xbc\xda\xb9\xd5\x00\x9e\xd8\xbd\xb5\x54\x48\x64\x4e\xe9\xf6\xed\x5c\x9c\x40\xf8\x2a\x40\xf1\xea\xd3\xe9\xd1\xc9\x87\xd3\x51\xd9\xc5\xc3\xb2\x65\xf6\xcb\x44\x5e\x49\xde\xb5\xa3\xc6\x90\x54\xd4\x74\xe9\x5b\xdb\x97\x71\x07\xb0\xb7\xcd\xb8\x03\x20\x9e\xe0\xf8\x0f\x50\xf5\x85\xfb\xe2\x3a\xec\x44\xe8\x6d\x64\x25\x0b\x39\xed\xd1\xf4\xb4\x1f\x9e\xfe\x0a\xeb\x58\x0c\xe9\xb0\x92\x5b\x73\x0b\x5a\xd4\xd9\xf6\xf1\x59\x18\xfc\xc9\x35\xc7\x13\xac\x5b\xa6\x47\x4d\xb9\x2f\xe0\x84\x9e\x85\xed\xe1\xce\xb1\xa1\xbd\x1e\x78\x17\xcb\x51\x8a\xb3\x13\x0c\xa1\x32\x58\xc5\x54\xc9\xb1\x7a\xd9\xae\x1a\x25\xb6\x82\x25\x5d\xed\x11\x56\x2a\xb8\xe8\x78\x91\x53\xa0\x87\x5f\xbf\x2d\xc2\x54\x8a\x0d\xa1\x44\x88\xd5\xbe\x27\xbc\x80\x72\x47\x8d\x64\x1f\x49\x34\x9d\x16\xf5\x3e\x6a\xef\x04\xc7\x99\x8b\xf9\xa2\xaf\xba\xd1\xcb\x43\x2c\x02\x36\x17\x2e\x8a\x6e\x99\x62\x50\x31\xca\x8a\xb1\xce\x6f\x46\xa7\xf0\xc2\x52\xb9\x3e\x95\x95\xe2\xd7\xbc\x60\x53\x0b\xc2\x8c\x8b\xa9\x6e\xfa\x5c\xb9\xf0\xbd\x4e\xcb\x42\x25\x2b\xd6\x48\x81\x21\x0c\xea\x03\x04\xe3\x85\x16\x10\x78\x35\xcf\x3f\x7e\x26\x82\x21\x08\x1d\x2f\x59\x4f\x53\x9d\x05\xb2\xa3\x60\xb2\x6d\xff\xf4\x76\xc4\xa9\x9d\x61\xc5\x3e\x84\x67\xd9\x55\xed\xe5\xa2\x43\x6f\x18\x32\x7b\x4a\xf4\xbc\x2c\xb8\xb8\x82\xc6\x30\x8e\x9d\xb8\x26\x8b\x8c\xd8\x2f\xfc\x05\x56\x8c\x16\xe9\xc5\x80\x27\x42\x65\x92\x42\x04\x30\x3b\x10\xb5\x00\x4a\x9e\xa5\x7a\x7f\xf5\xc4\x1e\x7d\x0b\x49\xf8\x77\xe7\xc8\xd8\x67\x7d\xb4\xbc\xa4\xd3\xad\xa5\xe6\xc2\xe2\x2d\x86\x2d\xc8\xc7\xe3\x33\x9f\x69\x71\x10\x9b\xf0\xf1\x59\xa9\x08\x55\x86\x4f\x68\x66\x0e\x49\x55\x17\x85\x33\x0a\x78\x21\xcf\x51\x89\x7b\xa2\x75\x3b\x01\xf9\xb9\x31\x3a\x42\xca\x8b\x96\xc5\xb5\x5d\xd5\x90\x4a\xe6\x68\x3b\xad\x2b\x17\x02\x8c\x05\xf4\xc8\xcd\x8c\x67\x33\x72\x51\x17\xc5\x85\x2c\x78\xe6\x03\xdf\xb9\x46\xf7\x44\x6e\xd9\x42\x47\xbe\x70\x54\xdc\xd0\xb9\x7e\x1b\xbf\x25\xa1\xf0\x19\xa1\xc6\xb0\xb2\x42\x64\xb6\x5b\xb3\xd8\x08\xb6\xf1\x50\x80\xb0\xc8\x2d\xa0\x40\xf2\x28\x2f\x02\x65\xac\xdd\x07\x1d\xf9\xf5\x90\x9c\xb3\x6b\xa6\xda\xf0\x09\xfb\x11\x4c\xad\xdb\x30\xc1\xd1\x81\x34\x5e\x6b\xb0\x23\x15\x32\xa3\xc5\xdd\xa3\x7e\x00\x76\x3e\x59\x98\x96\x6b\xb1\x6f\x88\xc3\xaa\xae\x2f\x72\x36\x39\x97\xe6\x02\xe7\x68\xbf\x0f\xbe\xc9\x3d\xab\xd2\xc2\xea\x18\x73\xbf\xba\x45\x87\x9c\xeb\xab\x5e\xaf\x10\xec\x5e\xf1\xf1\xf4\x45\xe6\x29\x33\x16\x9d\x87\x01\xa3\x1d\x0c\x16\xab\xe1\xbb\xdc\xbe\xac\xbb\x5f\x8a\xb9\x82\x97\x03\x87\xdc\x71\x81\x4b\x76\x43\x14\x2b\xa5\x41\x39\xd7\xc2\xeb\xdc\x02\x99\x2c\x19\xa1\xd7\x94\x17\x74\x5c\x40\xac\xb3\x9d\xdc\xcd\xd5\xd9\xda\x7a\x04\x3b\x00\x11\x64\xd2\xdf\x47\x8b\x2d\x01\xe7\x11\x7f\x5c\xb1\xf9\xf8\x92\x22\x58\x85\xcc\xae\x62\x59\x75\xa2\x64\x89\x8f\x60\x9e\x7e\x0e\xb9\x63\x34\xcf\x89\xe6\x53\xc1\x27\x3c\xa3\xc2\x90\x82\x1a\x26\xb2\xf9\x88\xb8\xf6\xb5\x3a\xf8\x3e\x14\x33\x8a\x87\x3c\x7f\x21\x55\x49\x0b\xbf\xc9\x63\x9a\x5d\xc9\xc9\x04\x66\x6d\x9e\x77\xa1\x6d\x8e\x58\xe1\x9e\x50\x2d\x05\x2e\xce\xb4\xa6\xd3\x1e\xc4\x0a\xfa\xd2\x5b\x01\xca\xa5\xa2\xe0\x29\xb9\x82\xb4\x9e\x50\xfa\x6a\xb3\x3e\xd9\x41\xf9\xe2\x76\x4d\xf1\xba\x80\xaf\xaa\x16\x86\x5b\xf2\xd7\xea\x58\x47\xc0\xc7\x7a\x27\x54\xd7\x2e\xe5\xda\xff\x41\xb9\x0d\x57\x94\x0e\x92\xd7\xae\xa1\xb7\x05\xc2\x77\x27\xc2\x6f\x91\xd4\x43\x9e\x53\xf7\x5d\x88\xf8\x08\x60\xb3\x7f\x71\x6e\xa1\x76\xc5\xd4\x1b\xe9\xf2\x00\x2a\xe5\x35\x48\xf1\xb7\xaf\xfe\x3e\xba\x8e\xe3\x16\xe0\xe7\x56\xe4\x38\xb4\xf0\x96\x4c\x4d\xb1\x6e\x1c\x23\x25\x15\x7c\xc2\xb4\xc5\x90\xb9\x45\x27\xe7\x8f\xd2\xb4\x64\xe4\xc6\x22\x12\x46\x0d\x2f\xbc\x5e\x47\xfa\xfa\x79\xc1\x03\x16\x9d\x68\x63\xda\x38\x50\xf2\x10\xce\x02\xda\x44\xdc\xb2\xac\x36\x70\xff\x20\xce\x92\x1c\x08\x69\x3f\xeb\x18\x6f\x75\x59\x8f\x51\x7c\x86\x65\x17\x5e\x0d\xd3\x12\x85\x34\xd1\xe9\x3e\xb8\xb3\xba\x1e\x57\xb8\xaf\x6c\x62\xe5\xa8\x37\xa3\x6f\xbe\xe9\xbe\x39\x98\x1d\x07\x6b\x6a\x96\xd5\x8a\x9b\xb9\x25\xbc\xec\xd6\x8c\x26\xfa\x2f\x4a\xd6\xd5\x31\x14\xf5\x75\x8c\x79\x46\xc1\x65\x80\xa9\x74\x78\x21\x9b\x4b\x61\x11\xf5\x19\xe6\xc6\x54\x41\xee\xd8\xb6\xbc\xee\x36\x79\xe2\x88\xb3\xbd\x31\xcd\xb5\xd4\x23\x72\x21\xb5\xe6\x16\x33\x43\x05\xff\x1e\xc9\x9b\x3b\x2e\x19\xd9\xf1\x85\xc8\x46\x04\x34\xe9\xdd\x96\x8e\xba\xbe\x57\xac\x11\x22\x46\xd9\xd5\xdf\x42\x73\x37\x43\x0c\x9d\xb6\xf2\xbf\x07\xf6\x24\xe2\xad\x68\xba\xbc\x6e\x31\x42\xc0\xed\xd2\xb6\x6f\xff\x27\x6f\x02\x23\x67\x8b\x48\xdb\xae\x1c\xe0\xea\xe4\x77\x3f\xb4\x6f\xd9\x8c\x5e\xb3\xa5\xac\xb7\x92\xf9\x68\x09\x07\x82\x6b\xd4\x7d\x41\xab\xda\x85\x54\xfc\x50\x87\x5d\x6b\x56\x42\x91\xe5\x7b\x44\x80\x65\x52\xce\x78\x4e\x0a\x29\xa1\x08\x6d\x5d\x11\x21\x73\x66\x2f\x00\x04\xc1\xd2\x42\x0f\xc8\xe5\x91\x7b\xb0\x8a\x96\xc4\xd6\x27\x20\xd9\x56\x2c\x5b\xf2\xc0\x93\x59\xa9\xa2\xae\xbf\x28\xd6\x74\xcf\x0c\x69\xe5\xb6\x4b\x57\x70\x02\xb2\xc9\xc0\x22\x37\xe3\xd3\x19\x53\xa4\x60\xd7\x0c\x02\x7f\x26\x7c\x4a\xb0\x09\x71\xe9\x5a\xd4\xf8\x78\x7b\xa9\xa0\x29\xaa\xe2\x79\x77\xc3\xd0\xa2\xb4\x66\x8f\xf4\x46\xaa\xab\x42\xd2\x3c\xaa\x09\xaf\x49\xc1\xaf\x18\x39\x61\x55\x21\xe7\xae\xaf\x8c\xc8\xc9\xa5\xa1\x86\x4d\xea\xe2\xb2\xc7\x51\xf4\xb3\xea\xe8\x4c\xf3\xad\x59\x75\xec\xe2\x0b\x56\x9d\xb3\xcb\xe3\xcb\xb3\x67\x9f\x39\xb8\x81\x8f\x0e\x36\xe1\x39\xc7\x83\xf0\x9f\xbb\x45\xd0\x0d\x49\x51\x77\xfd\x25\xc6\x3a\x5e\x48\x65\x68\xb1\x05\xc1\x39\x9b\xd1\xea\xa8\x36\xb3\x13\xae\x33\x4b\x41\xd2\xc8\xcf\x77\x66\x8d\xaa\xc8\x33\x70\xd6\x39\x65\x89\x70\x7f\x49\xdc\x73\xc7\x7f\x3d\xba\x20\xb4\xb6\x28\x6c\x78\x06\x42\xd1\x56\x5c\xbb\x24\xda\x9b\x4b\xec\xf8\x95\x74\x67\xdc\x9c\x0f\xec\x8b\x7f\x6a\x97\x76\x65\xd7\x92\x39\x97\x65\x53\xbe\x24\x74\x3e\xab\x84\x4e\x60\x1c\xdb\xd2\x1d\xb8\xe0\x86\x53\x23\xd5\x2e\xe4\x90\xb5\x80\x09\x61\xbc\xb5\x36\xb2\x74\x24\xe1\xcc\x3f\x01\x55\x37\x7a\xb9\x85\xef\x2c\xd6\xc4\x06\x43\xe0\x10\x1c\xcb\x99\x30\x4c\x4d\x68\xc6\x16\xea\x05\x0f\xc0\x06\x8e\x30\x71\xff\x4c\x67\x68\xfe\xe8\x42\xfe\x2b\xe0\x83\x7f\x7a\xfb\xc7\x28\x63\xf4\x4f\x41\xdb\x70\xf6\xf8\x58\xb1\x10\x2c\xeb\x6e\x55\x4f\x81\x3d\x3f\xa7\xe1\x0b\xfc\x67\xb1\x90\xfd\x80\x5b\xfb\x6f\x35\x2d\xf0\x48\xfa\x1c\x77\xff\xd7\x6c\xa1\xc2\xd6\x6f\x49\x1b\x31\xdd\xbe\x05\x2c\xc4\x7a\x34\x40\x99\xd1\x8e\x24\xdc\x66\x1a\x45\x85\xb6\x28\x96\xc6\x56\xb2\xef\xb4\xaf\x7d\x72\x60\xb2\xaa\x73\x32\x6f\x82\x72\x57\xa1\xd4\x95\xfb\x8f\x4e\xd3\xa4\xea\x00\x51\xd4\x22\xd6\x84\x70\xeb\x3f\x23\x52\xbf\x0f\x1d\x20\xfa\xed\xd6\xd6\x33\x8e\x81\x4e\x6d\x3d\x00\xdb\x81\x11\x6e\x40\xbc\xd5\xa8\x52\x90\xf7\x5c\x1b\xac\xaa\x8b\x0f\x43\x15\x3d\xac\x22\x6f\x75\xd4\x0b\x22\x15\xe1\xd5\x7f\xd0\x3c\x57\x6f\x51\xf2\xf4\x2e\x51\xd5\xbd\xa8\x23\xd7\x2e\x26\x0f\xea\x39\x7a\x23\xc5\x81\x99\x57\x3c\xa3\x45\x31\x27\x9f\x8f\x2f\x60\x05\x4d\xfe\xf0\xbb\xd7\xa0\xb4\x7e\xf3\xf5\xef\x5e\xf7\xbc\x42\x2f\x45\xe8\x17\xc6\xb3\x08\x61\x7e\x06\xe9\xd3\xbb\x56\xe2\xb6\x55\x90\x16\xda\x9c\x5a\xfd\xf0\x12\xeb\xb1\x5a\xe1\xc8\xb1\x3b\x24\x04\xf6\x76\x05\x51\x2f\xa5\x16\xf9\x52\xf9\x34\x1a\x2f\x95\x4f\x5f\x2a\x9f\xbe\x54\x3e\xbd\x7f\xc4\x76\xce\x6d\xf3\xa3\x18\x16\xe8\x2a\x79\x57\x6e\x42\x91\xe9\xe2\x4b\x17\x99\x3a\xa2\x5a\x57\xc2\x9b\xe2\x00\xe3\xaa\x3a\x7d\xda\x84\x34\xdd\x2f\x4e\xce\x2f\xff\xe3\xfd\xd1\xb7\xa7\xef\x61\x57\x5d\xf1\x1e\x7b\xbd\xb9\x48\xee\x3b\xd9\x1a\x89\xe9\x77\xde\xdb\xcb\xd3\x16\x0b\x19\xda\x82\x9c\xbf\xbb\xdc\x30\x39\xfb\x29\x0e\x6f\xd1\xa6\x29\x26\xdd\x4f\xe9\xb9\x65\xe0\xd8\x9f\x6a\xa6\xb6\xd3\xa6\x68\x67\xd2\x77\xbc\x6f\x97\xdd\xb6\xad\xfe\x16\x5f\x71\x77\xb6\x66\x60\xef\x86\x8c\xe4\x5f\x26\x8d\xd6\x1e\x11\x1e\xdb\xb3\x4f\xa0\x7d\x4a\xb4\xe8\xa7\x11\xab\x54\xdd\xc5\x7a\x75\x7c\x51\x51\x63\x32\xcb\x48\x50\xbc\x50\x56\xcc\xb3\x02\x1e\xd3\xda\x0b\x1b\xff\xba\xf7\xb8\x5a\xe8\x21\x7e\x5c\x50\x5e\x6e\x4b\x20\x58\x0a\x0c\xfe\xe7\x25\x06\xd9\xb4\xb2\xa1\x5b\x51\x77\xdd\x42\x6d\x16\x5b\xa8\xc3\x8a\xad\x80\x37\x10\xca\x2a\x9a\x75\x15\x45\xbb\x61\x45\xb3\x13\x43\x8f\x20\xcd\x47\xf8\x09\xf4\x77\x7f\x86\x82\x08\xc0\xbd\xa5\x6a\xd5\x61\xed\x6d\x13\xa7\x00\xc8\x62\xe3\x44\xba\x09\x4a\x12\xaa\x43\xca\x0d\xa6\xeb\x24\xe8\xb0\xb8\x93\x38\x4b\xbe\x48\x79\xe5\xc7\x27\x36\x97\x6f\xd3\x54\x5e\xcd\xa4\x91\x62\x37\xba\x42\x2c\x83\xa5\xcd\x5a\x2e\xe0\x89\xe3\x10\x19\x1b\xb1\x26\x2c\xe3\x1b\xa2\x3c\x17\xd2\x75\x5d\xec\x66\x8a\x4c\xdd\xb8\x82\xd8\xc5\x32\x88\x57\x17\x13\x5b\xfa\x92\xbb\xd5\x36\xa7\x7f\xd7\x83\xb3\x93\x2d\x70\x91\xe7\x10\x26\xf7\x85\xb6\x90\x7d\xa2\xb0\xb7\xfe\x35\xc0\xf2\x44\x3d\x81\xec\x44\xfe\x8c\xcf\x4e\x9c\x21\xc2\x37\xfc\xd1\x8e\x2e\x90\xfb\x09\xd5\x56\x74\x0a\xa9\xcc\x8d\x54\x5b\x6e\x94\xde\x86\x62\xa1\x8e\x92\xfb\xee\x4e\x73\xb4\x27\xa2\xe6\x6d\xd0\x36\xea\xd1\xb3\xf8\x5e\xf6\xa4\x3a\x01\x74\x4f\x83\x9e\xdb\x7c\xe4\x57\x18\x65\xb2\x8c\x7a\xf3\x90\x9b\x19\x43\x29\xf4\xf8\xf2\xec\x03\x9f\x22\x80\xfe\x5d\xc8\x84\x51\x53\x2b\x36\x9c\x52\xd3\x0d\x20\xae\x49\xb7\x68\xbf\x2d\x73\x21\xc4\xa1\x7f\x65\x4e\x74\x09\x9c\x28\xba\x61\xab\x38\xd2\x97\xc0\x90\x9e\x0f\x23\xda\x39\x9d\xe7\xa5\x41\x76\x6b\x78\xe2\x91\xe4\x7c\xfc\x64\xce\xd1\x69\x71\xb3\x11\x15\x68\x60\x3b\xee\xb9\xad\x88\x06\x4a\xfe\x27\xf0\x9b\xde\x52\x41\x98\x09\xe3\xfb\x80\x4d\xd2\xa2\xb0\x27\x2b\x05\x0b\x69\x79\xba\x49\x32\xc5\x2c\xcb\x92\x56\x2e\xe1\x34\x97\x37\xe2\x86\xaa\x9c\x1c\x5d\x9c\x3d\x3d\xd7\xe9\x5d\xe2\x1f\xef\xd1\x07\x99\x6f\x9d\xfe\x47\xa0\x80\x54\x01\x65\x44\xec\x1f\x63\x6e\x34\xd6\x76\x84\x4a\x8b\x26\x76\xb2\x58\xf1\x2a\x04\xfd\x43\x25\x8f\x71\x20\x0e\x09\x94\x16\x41\x64\x66\x68\xe1\x22\x95\xc6\xcc\xdc\x30\x26\xc8\xeb\xd7\xaf\x31\xbe\xe2\xf5\xef\x7f\xff\x7b\xc8\xe0\x26\x39\xcb\x78\x79\xf7\x41\x78\xea\xb7\x6f\xde\x74\x07\xe5\xdf\x8f\x3e\xbc\x27\x34\x03\x1b\x19\x19\x4b\x33\x73\x10\x01\xea\xc5\x8b\xea\x01\xf9\x3f\x97\x1f\xcf\xbd\x1c\xa2\x17\xbe\x05\xcc\x0e\xdb\xd9\xc3\x06\xe4\xaa\xc3\x70\xa8\xf5\xd3\x44\x40\x50\x33\x0b\x75\x4e\x28\x44\xa2\x45\xf5\x74\x1c\xbd\xec\x91\x50\x05\xcd\xeb\xf9\x74\x06\xc7\xc2\x05\xdc\xc2\x82\x67\xae\x41\x03\xc6\xc5\x60\x7a\xb4\x2f\xea\x89\xc5\x4b\xbc\x08\xd1\x79\x65\xbb\x65\x03\x4c\x68\x76\xa5\x52\x06\xc1\x46\xa2\x98\xae\x0b\x03\x0d\xbc\xc6\xcc\x01\xd1\x60\xac\x66\x9d\x31\x70\x37\x42\xd8\x1d\xe9\xdb\x36\x5d\xf0\x14\xd8\xa9\xaf\x05\xb7\x42\xd9\x24\x54\xa1\x46\x02\x0e\x0e\x57\x72\x4a\xb3\x19\x61\xc2\x40\xab\x0b\x44\x3d\xfb\x78\xe7\xa5\x67\x54\xe4\x96\xa6\x58\x56\x80\x60\x3c\xdb\xf8\xf3\x74\x91\xac\x17\x61\xc7\x5b\x35\xb4\x1a\x4e\x4a\x0b\x29\xa6\xf1\xc5\x6c\x04\xeb\xa8\x86\x50\x0f\x1a\x04\x89\x8d\x50\x51\xd8\x1e\x0c\x3a\x5f\xb5\xab\x72\xa4\xb1\xc0\xd6\x98\xf5\xb9\x7f\x49\xe2\x97\xd3\x44\x30\x13\x92\x61\x61\xeb\xcf\xaa\xd6\xe6\xdb\xda\x22\x64\x9f\xd9\xd2\xc6\x34\x13\x72\x7c\x07\x3a\x0c\x08\x76\x31\x56\xe0\x53\xcd\x32\xa6\xf1\xf2\xfe\x03\xcb\x8e\x98\xe6\xe9\x7f\xe0\xb1\xf5\x84\x42\x4e\x96\x01\xe2\x4b\xbd\x71\x61\x39\x39\xad\x8d\x1c\xd6\x55\x4e\x43\xd9\xeb\x8e\xe5\x02\x9b\x71\x54\x54\x33\x3a\x20\x53\x1a\x29\x8d\x77\xe1\x88\x2e\x8c\xb3\x6e\xc0\x2f\x7a\xaf\xbe\xe2\x8d\x2d\x4b\x72\x01\xa9\x70\x13\x8a\xc0\x8f\x05\x2d\x19\x14\xe8\x41\x70\x7b\x82\x90\xc9\x72\xcc\x85\xab\x7c\x37\x81\xd2\x80\x4c\xa1\x17\x12\xca\xde\x91\x82\x8e\x59\xe1\x00\x90\xaa\xf7\x2b\x7f\xe7\xcb\x29\x31\x65\xf9\x9b\x26\x74\x3a\x55\x4c\x6b\x7e\xcd\x5c\x8d\x41\xfe\x4b\x80\x06\x3a\x80\x9d\x7e\xf0\xf5\x17\x35\xb1\xca\xa1\x61\xdd\x7b\x20\xe1\x08\xdd\xc5\x2c\x7a\x37\x36\x84\x11\x21\xa7\x5a\x1a\xa6\x78\x06\xab\xba\xa3\xd6\x44\xd7\xd9\x8c\x50\x8d\xd9\x87\x43\x28\xb4\xd8\x7f\xd7\x9b\xb2\x2a\x58\xb9\x71\xc6\x68\xee\x4b\xcd\x59\xa5\xaa\xaa\x58\x3e\x22\xe4\xd8\x92\x9f\x09\xcf\xa8\xc1\x42\x62\x24\x67\x79\x5d\x15\x1c\x6d\x84\x3d\xc1\xf8\x3c\x63\x44\xaa\x9c\x41\x45\x49\x39\x81\xe0\xfb\xb0\x58\x24\x1b\x42\x85\x79\x6e\xd7\x1f\x73\xa3\xa8\x9a\xa3\x04\xe5\xce\xb2\x27\x10\x96\xfb\x64\x50\xbc\x0e\xd6\x02\x78\xa0\xd2\x0d\xe9\xde\x74\xc7\x8f\x24\x4c\x80\xf4\xb6\x0d\x36\xa3\x47\xfc\xa5\x1f\x69\x78\x92\x1d\x70\xb5\x2f\xdd\xcd\xee\x3b\x59\x6a\xb6\x64\x07\xc2\x06\xea\xfc\x5d\x52\x19\x0a\x80\x9a\x6c\xe6\x24\xc5\x36\xa9\x22\x04\xed\x47\xb4\x5f\x76\x0c\x0e\x57\x4a\x91\x7b\x12\x19\xf2\xe9\x99\x19\x59\x75\xd3\xd4\xb4\x28\xe6\x43\x76\x6b\x99\xbd\x25\x66\x20\x3d\x41\x4f\x35\x48\xc4\xaf\x85\x66\x66\x90\x00\x10\x20\x42\x95\xc2\x12\xb6\x9a\xec\xe1\xfb\x0b\x09\xfd\x10\xf6\x70\x31\xab\x62\x8f\x6b\x83\x49\x3a\x83\xe5\x3f\x49\xb1\x27\xd7\x4c\xcd\xdd\xba\xbd\xa7\x4b\x76\x55\x49\xd2\x3b\x42\x80\x42\x99\x6c\x76\x7a\x5b\x29\x2c\xd5\x92\x64\xce\x85\xeb\xb2\xb8\x04\x96\xf1\xf7\x9a\x52\x1b\xb1\x3d\x31\x02\x0e\x82\x49\x2c\xf1\x27\xc0\x25\x8e\xce\x4f\xfa\xb3\x07\x1c\xfd\x15\x9f\xf6\xe8\xa9\x06\xb5\x47\x7a\x9a\x83\xe3\x68\xc5\x9e\xbb\x16\x0b\xfe\x1b\xec\x8b\x8a\x85\xd5\x74\xb0\xe4\x50\x72\xc5\x1c\x9b\xa4\xc2\xb9\x20\xdc\xc3\xc9\x80\x54\x0c\xea\x37\x62\x99\x4a\x36\x87\xc5\x70\xfd\x34\x27\x9f\xf8\x52\xe2\x48\xc5\x49\x9b\x31\xb4\x2f\x9f\x70\x36\x7f\x58\x89\xa6\x4c\x4b\x8b\x70\x5c\xb1\xce\x8e\x9c\x65\xa3\x75\x8b\x2c\x26\x79\x4b\x0d\xdc\x01\xfb\x41\xa8\x81\x14\xd0\x9e\x42\x03\x55\x4d\x8c\x4c\x85\x6c\x24\x5d\x76\x64\x7b\xf8\x03\x7d\xb4\x2d\x4b\x48\x78\x48\x04\x6f\x3b\x56\xe1\x8a\xcd\xf7\x35\xde\x79\xcb\x21\x66\xbc\x02\xd5\x1c\x98\xbd\x9c\x24\xbe\xf8\x38\x7e\x80\xc2\xe6\x1e\x1c\xe4\x2c\x67\x62\x40\xce\xa5\xb1\xff\x9c\xde\x72\xed\x74\x98\x13\xc9\xf4\xb9\x34\xf0\xc9\xce\xe3\x03\x6e\xd5\x73\xc1\x06\x67\xfd\xe7\x90\x18\x07\x6c\x18\x14\x75\xd8\x12\x7f\xea\xbe\x9a\x73\xc0\x1c\xae\xc9\x19\x34\x41\xc6\xa3\x4a\x0a\x10\x64\x65\xfa\xca\xd6\x16\x1c\x6f\xaf\x83\xba\xec\x2e\x7b\xfc\x2e\x3c\x0e\x5b\xa4\x6a\x21\xcb\x13\x81\xe6\xc0\x02\x2f\x04\x7e\x03\x4d\x4f\xaa\x82\x66\x2c\xf7\x3d\x15\xa8\xdd\x55\x6a\xd8\xb4\x63\xfe\xf3\x7d\xa3\x64\x6a\x0a\x0e\x96\xac\x47\x9f\xa5\xbb\x23\xb5\x60\x86\x23\xa9\x78\x86\xe3\x51\x2e\xf1\xa3\x54\x53\x79\xf2\x25\x40\xee\x7f\x6f\xd9\xec\x63\x68\x15\xc9\x28\x51\x04\x26\x4a\xbf\x25\xad\x2c\x15\xfa\x2f\x2b\xe4\xc2\x85\xfb\x6f\x52\x51\xae\xf4\x88\x1c\xf9\x2e\x14\xf1\x77\xce\x8e\x14\x4d\x93\x0c\xb0\x0a\xf2\x31\x7f\xae\xf9\x35\x2d\x5c\xc5\x64\x2a\x08\xc3\x8e\x1e\x16\xc6\x45\xd5\x6a\x40\x6e\x66\x52\xa3\xc4\x1c\x4a\x6f\xec\x5d\xb1\xf9\xde\x20\x81\x3d\xd5\x8f\x98\xf2\xed\x9d\x89\xbd\xc6\xe7\xd8\xa2\x4f\x41\x6f\x80\xdc\xc3\x3d\xf8\x6e\xef\xa9\x74\xba\x84\x72\x3d\xcd\x73\x8e\xa5\xad\x2f\x92\x8b\xbb\x49\xc9\x47\xfa\xaa\x17\xcd\xe8\x5b\xab\x06\xc7\xe3\x99\xd1\xfc\xcd\x5c\xe2\x76\x18\xcf\x7d\x57\x19\x67\xb2\xba\x6b\xd1\x4a\x00\x08\xd8\xc4\x22\xfb\x99\xbd\x12\x2d\x23\x64\x2a\x33\x52\x12\x64\xf1\xc5\xda\x77\xf1\x48\xad\x7c\xa5\x6a\x36\x20\xb9\x14\xfb\xc6\xb9\x10\xe2\x9e\x50\x8b\xbd\x25\xf2\x25\xa7\x7e\xa0\x0f\x13\x80\x42\x15\x83\x16\x18\xbe\x1f\x96\xb3\x77\x62\xd7\x28\xf0\x55\x19\x1f\x2f\x6c\xff\x5c\x06\x48\xdf\x02\x46\x0e\x10\x57\xc6\x48\x48\xe0\x02\xd0\x1f\x37\x06\xa6\x41\xbc\x08\xa4\xb6\xff\x2b\x01\x14\xab\xd0\x1b\x78\x67\x53\x6c\x09\x4d\xb7\xbf\x30\x25\x13\xac\xbb\xc4\x40\x9e\xea\x36\xf5\x89\x6b\x6c\x46\x9f\x22\x0e\xcd\x68\x5d\xa5\x4f\xa0\x0c\x5f\xbb\xe0\x25\x68\x78\x16\xd5\x84\x56\x12\x11\x01\x22\x4a\xe1\x8b\x31\xec\xcb\x4e\x11\x99\x06\x5d\x76\x91\xcc\x6c\xe8\x80\x89\xbc\xc7\x29\xe4\x94\x07\xbc\x2a\x9f\x67\xac\xf1\x0c\xcb\x09\x40\xe9\x1d\xe5\x8f\x73\xa1\x42\x95\xe2\x5a\x60\xc1\x5e\x8c\xe1\x4b\xe7\x90\x4d\x86\x5a\x18\xe3\xfa\x81\x56\x09\x23\x4d\xc2\x9c\x90\x13\xac\x4a\x24\x9a\x74\x2c\x6b\xe3\x4b\x35\xbb\xef\x73\x6a\x28\x34\xa5\xc2\xb8\x89\xdd\x70\xe1\xa6\xb3\xc3\x26\x52\x91\xd3\x5f\x57\x8c\x80\x6e\x67\x1c\x0c\x08\xa3\xd9\xcc\x6a\x3b\x43\x0c\x6d\xb5\x7a\x9a\x57\xc8\x4e\xec\x41\xa1\x12\x24\x17\x05\x86\x14\x57\x28\x60\x84\xbf\x38\x51\xb4\xb6\x0f\xc2\xf0\xa9\x57\xda\x25\x74\x38\xf5\x4c\x34\x49\xf1\x09\x20\xf1\xee\x11\xdf\xc9\xd3\x19\xb8\x61\x47\xc0\x5a\x15\xed\x97\x8f\x51\x64\xb9\xfd\x59\xb8\xf4\x09\xa0\x58\xf2\xf6\x4d\x3d\x76\xcb\xc3\x5c\x44\x7a\x2d\xee\xac\x6f\x85\x9a\x44\x30\x60\x8b\x34\xfb\xd2\xd4\x1b\xfb\xa3\xaa\xf0\xd0\x06\x15\x32\x83\x9b\x4e\x64\x0e\x5b\xc2\x71\xa6\x30\xda\x45\x47\xaf\x59\xe8\x62\xca\x94\x92\xca\xbe\x3f\xd3\x9a\x70\x38\xa7\x92\xaa\x2b\x96\x07\x69\x7c\x44\x2e\xec\x46\x79\xcb\x5e\x02\x48\x94\x97\x22\x7c\x8f\x54\xfb\xea\x4e\x31\x07\x30\xf7\x47\xa3\x7d\xd7\xbe\x5d\xa1\x80\x8d\x7c\xc8\x7e\x9e\x8a\xe2\xa7\x31\xe3\x25\x33\xde\xb5\x68\xd3\x07\x5a\x69\x34\x8e\x5a\x31\x1a\xdc\x41\x92\x50\xdc\x11\x17\x25\x44\x7b\x17\x9b\x68\x46\x62\xe3\x44\x5a\x87\x63\x3a\x67\x63\x82\x50\x20\x1c\xa9\x1d\x8c\x09\x9d\x8b\xf7\x39\x16\x1d\x0e\x39\x7a\x98\xd6\x5b\x9d\xd0\xce\x5c\xf6\x48\xaa\x59\x1c\x8f\xe5\x22\x82\x74\x05\xae\xc9\x47\x6f\xad\x58\x2f\xe5\xc6\x60\xe5\xe1\x14\xda\x90\x1f\x3b\x94\x73\xb3\x38\x76\x2d\x07\x67\x71\x9c\x4d\xb0\xbd\x70\x5b\x08\x71\xec\x31\x4e\xab\x0a\x0a\x48\xaf\xc6\x92\x8b\x63\x7b\xc9\x39\x8b\x63\x2b\xc9\x3a\x8b\x23\x45\xf2\xce\xe2\xe8\x9f\xcc\xb3\x38\xd2\xd8\x53\x70\x3c\x16\x71\x02\x11\x81\xfb\x16\xc0\xb1\xb1\xc6\xa9\x1b\x20\xf0\x83\x29\xac\x8a\x18\x43\x42\x9a\xe4\xc4\x39\x24\x4b\x74\xac\x65\x51\x1b\x04\x21\xfd\x22\xb1\xcc\x08\x2f\xe9\xbd\x50\x69\x04\xc5\xc5\xe5\x22\x49\x14\x34\x09\x14\xcf\x52\xae\xf5\x78\x9e\x97\xd4\xbe\xd4\x5d\x75\xbd\xa4\x6f\x19\x80\x63\x37\x1a\x07\xe0\xd8\x89\xf6\x01\x1e\x94\xf4\x4d\x04\x70\xec\x52\x9d\xef\xf6\x48\x7a\x49\xfb\xb7\x15\xf0\xe3\x91\xbc\x67\xa1\x83\x32\xca\x4a\xf3\xd0\x55\xb3\x65\xa0\x80\xf2\xfd\x46\xa3\xfd\xc4\xc7\x00\x61\x1f\xce\xfe\x76\xad\x74\x4e\x91\xc7\x72\x46\xfb\x8a\x06\x47\x17\x67\x09\xed\xbf\xd1\xac\xf7\x58\x80\xe3\x27\x5e\x6c\xc0\xeb\x8c\xd6\x06\x9f\xa1\xf9\x36\x8e\xfc\x3f\x69\x76\xd4\xd5\x79\x4a\x22\x6e\xef\xbe\xcd\xe9\xce\x8b\xbf\xb3\x92\x62\xdc\x73\x2e\xc2\x40\x23\x5d\x09\x89\x46\xa6\x74\xb2\x18\xd6\x42\xf5\x99\x7e\xfd\xd3\x54\xc9\xee\xdb\xa7\x76\xd4\xaa\x04\xbb\xdf\xa3\x3b\xd6\xe2\x68\x61\xcb\xfe\x27\xbf\x89\xce\x65\x89\xce\x84\xc8\xaf\x51\xc9\xfc\x2d\x06\x59\x51\x21\xa4\xc1\x18\xea\x01\xba\xe7\xf5\xc0\x05\x2a\x44\x05\x75\x45\x4e\x6a\x9e\x63\x36\x66\xa8\x8c\xb9\xff\xaf\x95\x56\x01\x1b\x78\x91\x06\x9d\xc8\x23\x65\x42\xd0\x8a\xff\xc0\x54\x9f\xde\xdd\xcb\x46\x0b\xb9\xdc\xfc\x1e\x93\x74\x36\x63\x25\x85\xff\x7c\xe7\x37\xc8\x12\x6d\x97\x9b\x0c\xce\x12\xa6\x4a\x2b\xf8\x0e\x5a\x55\xae\xf6\xae\xdf\x24\xc8\x93\x6b\xc6\xa3\x84\xd5\x86\x33\x7f\xb4\xed\xbc\x68\xa9\xff\xf6\x8a\x82\x85\x12\x02\x0d\x7c\x75\xeb\xe0\x8e\xb2\x92\xc4\x35\xee\xff\x8e\x6f\xdd\x63\x06\x16\xe2\x78\x0e\xd6\xe8\xae\x56\xe8\x41\x90\xd2\xdb\xd6\xe3\x64\x80\xbd\x58\xa1\x1f\x1e\x2f\x56\x68\x37\x5e\xac\xd0\x6b\x8f\x47\xb3\x42\x47\x22\x9d\xe7\xb0\x4b\xcc\xc8\x71\xa7\x38\x6f\x4b\x6e\xba\xc8\x8f\xd0\x27\xe5\x0d\xc0\xde\xfa\x2b\x55\xdb\xbd\xbf\x3f\x1a\xed\xa3\x83\x7f\x14\x9c\x58\xb5\x99\x0c\xff\x40\x98\xc8\x64\x6e\xe7\xf9\x0c\xf3\x2b\x6d\x40\xdd\x69\x2c\x7a\x31\x2c\xa5\x5f\x2b\x0e\x11\x80\xb9\xd3\xca\x8d\x09\xd9\x96\xaf\x8e\xf8\xee\x31\x85\xf3\x84\xec\xa5\x11\xee\x3d\xe4\xfe\x28\xdc\x81\x32\xe5\xa4\xfc\xa6\xee\x63\xc1\x4b\xee\xb2\x14\x2d\x3d\x65\xda\xa4\x4a\x3e\x21\xe4\x00\x27\x1f\x65\x55\x3d\x70\x0b\x8d\x4a\x56\x4a\x35\x1f\x84\xc5\xec\x97\xad\xd5\xdd\x13\x87\xa0\x5c\x64\xb5\x52\x4c\x98\x62\xde\xaf\x00\xff\xb2\xf1\x4c\xb4\x0c\x7f\x52\x3b\xac\x64\x04\xe4\x4a\x13\xa7\xdb\x8c\x36\xc5\x3b\xf6\xcb\xa0\x3b\x23\xec\x36\xf0\x7b\xd7\x4a\x65\xd0\x58\x40\xed\xa7\x4c\x5c\x93\x6b\xaa\x74\x2a\x0a\x43\x1e\x4b\xaf\xc8\xf9\x35\xd7\x8f\x98\x82\x7d\xe9\x84\x16\xf4\x35\xca\xda\x54\xb5\x71\xec\xce\x93\x08\x76\x5b\x49\x2b\x8a\x06\xd2\xb0\xa0\x9e\xbd\xe9\x6b\xf2\x8e\x47\x45\x8d\x61\x4a\xbc\x25\xff\xf7\xe0\xa7\x5f\xff\x73\x78\xf8\xe7\x83\x83\xbf\xbd\x1e\xfe\xaf\xbf\xff\xfa\xe0\xa7\x11\xfc\xc7\x57\x87\x7f\x3e\xfc\xa7\xff\xe3\xd7\x87\x87\x07\x07\x7f\xfb\xee\xc3\x5f\x3e\x5f\x9c\xfe\x9d\x1f\xfe\xf3\x6f\xa2\x2e\xaf\xf0\xaf\x7f\x1e\xfc\x8d\x9d\xfe\x7d\xcd\x49\x0e\x0f\xff\xfc\x3f\x13\xbe\x04\x15\xf3\x8f\xc9\x78\x02\x8e\xe1\xa3\xc8\x35\xed\xb9\x1f\x37\xd3\x94\x0b\x33\x94\x6a\x88\x8b\xbc\x85\x34\x9c\x64\x4b\x79\xd4\x7c\x3c\x1a\xd3\x48\x55\x81\x83\x06\xf5\x7b\xc7\x89\xc8\xe3\x6a\xd8\x8f\xe6\x9e\xc6\xba\xd3\x09\xfd\x30\x38\xe1\x3d\x2e\x18\xf7\xe5\x8b\xf7\x65\x9d\xf1\xe5\x47\xe0\x5f\x22\x3a\xbc\x84\xdf\x93\xe7\x1f\x7e\x8f\x67\xf9\x12\x7b\xff\x12\x7b\xff\x12\x7b\xdf\x7b\xa6\x1d\xf5\x92\xbe\xc4\xde\xfb\xf1\x1c\xbc\x1d\x2f\xb1\xf7\x6b\x8c\x17\xaf\xc7\xca\xf1\xe2\xf5\x68\x8d\x7f\x71\xaf\xc7\x4b\xec\x7d\xc7\x45\x5e\x62\xef\x57\x8d\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x0e\x30\x2d\x8b\xbd\x47\xe4\x5f\x16\x81\xef\xec\x4d\x4d\xf8\xfd\xbf\x60\xf4\xbd\xb6\xe8\x97\xb1\xa3\x2c\x93\xb5\x30\x9f\xe5\x15\xeb\x19\x9b\xb8\x60\xfd\xbd\x33\xbb\x25\x43\xf7\x59\x83\xef\x3e\xbc\x93\xa6\xe1\x2f\xb2\xbf\x06\xad\x73\xce\x44\x0a\x6f\x4e\x7a\xe6\xe8\x61\xf3\x12\xa2\x95\xb8\x45\xce\xf2\xe6\x0b\xc7\x39\x8d\x45\x9a\x11\x39\x22\x8a\x65\xbc\xe2\xae\xa8\x26\xc5\xcf\x13\x00\x02\xf4\xc1\xb5\x27\x9d\x5b\xaa\xc1\x8a\x49\x60\x55\xa1\x6d\xa9\x8a\x6c\xa4\x4e\xca\x5b\x00\x34\x85\xf1\xcb\xbe\x12\xea\x3c\xa0\xe1\xdc\x70\xcd\x88\x9e\xc9\xba\xc8\x89\x62\xff\xe9\x95\x2e\xb7\x23\x9f\x63\x18\x62\x47\x72\x1a\x60\xa2\x57\x77\x27\x41\x2b\x6e\xef\x33\xdb\xad\x2a\x89\xec\xb6\xe2\xd8\x01\xfc\x92\x65\x52\xe4\x3b\xe9\x96\xb9\x03\x64\xa3\x18\x41\x4c\x0e\xd6\x80\x0e\x7d\xa7\xae\x69\xc1\x73\x2b\xa3\xf9\x90\x6f\x24\xa3\x29\xae\x1d\x52\xe2\x70\xab\x74\x83\x51\x84\x56\x95\x92\x34\x9b\x31\x1d\xc1\x8b\xd6\x08\xd7\x7f\xbe\x5f\xc3\xde\x78\x54\x45\x3d\xe5\x02\x4d\x1a\xb0\xaa\x97\x60\xa5\xf1\x69\x34\xee\xa5\x17\x41\xfe\x1c\x81\x63\x7f\x9e\x00\x18\x54\xa6\x8c\x9a\x43\xb6\x8e\x8c\x81\xc0\x9d\xe1\x93\xf8\x0f\x4d\x64\x91\x83\xbc\x41\x05\xf9\xc3\x6b\x52\x31\x95\x21\x59\x4a\xe2\xc0\xd3\xd0\x77\xca\xc2\x51\x58\x8d\xd9\x8a\x32\xf7\x2f\xff\xf5\x6f\xc8\x4c\xd6\x4a\x8f\x4e\x22\x02\xf0\x06\x3e\x4b\x81\x2d\x22\x6f\xe2\xa2\x0d\x29\x18\xd5\x86\xbc\x79\x4d\x4a\x2e\x6a\x93\xae\xbe\x63\x2a\x6b\x4b\x64\x67\xf9\xdd\x6f\x7a\xce\xf6\x08\xd5\x22\x93\x50\x92\xd8\xaa\x02\xff\x1d\x4c\x2b\xce\xa3\x08\xbd\xed\x49\x25\xb9\x30\x8b\x86\x16\x27\x71\xa5\xe4\x56\xe0\xc9\xdc\x09\x7e\x90\xd8\xc4\xf0\x73\x2d\xc7\x73\xd3\x49\x74\x4a\x71\xe8\x6e\xf9\x76\x07\x8e\x7f\x73\x1f\xe2\x11\x4b\x14\x43\x66\x56\xe9\x05\xbb\xac\x9e\x51\xc5\x5c\xd7\xcc\x7d\x4d\x0a\x3e\x61\xdd\x3b\xd8\x9d\xd8\x85\xa1\xa6\xe4\xdb\xb0\x2e\xd7\x24\x0f\x1f\x07\xd3\x2c\x17\x43\xa3\x18\x0b\x20\x83\xae\x0f\x1e\x64\x52\x48\x31\x8d\xbb\xb7\x76\x01\xa5\xa7\x88\xdf\x4f\xb0\x1f\x12\xc5\xa6\x5c\x1b\xd5\xcd\xed\x37\xec\xce\x30\xfb\x6a\x01\x53\x25\xeb\xce\xc5\x37\x53\x91\x2d\x00\xc2\x9b\x78\x7d\xa0\x87\xeb\xe5\xda\xbd\xe6\xb0\x63\x75\x0e\xc7\x60\x8d\x8e\x73\xf5\x26\x3b\x8a\xd1\xfc\xa3\x28\x3a\xfb\x4c\x53\x6d\xb4\x87\x03\xed\x69\x20\x55\x4d\x24\xc4\xd6\xcd\x58\xb8\xbe\xbe\x75\x32\x98\xea\x80\x86\xb0\x1c\x35\x1d\xfb\xf3\x21\x84\xad\x47\x9e\xc2\x1e\x1d\xde\x23\x59\x64\x42\x0b\xdd\xb3\xe7\x75\x1f\x5b\x8b\xbf\xbe\xdb\x3f\x20\x84\xa3\x4d\xd0\x5d\x3d\x7c\xa9\x48\x59\x17\x86\x57\x45\x73\x58\x9f\xfc\x0f\x9c\x18\xdc\xdd\x56\xd8\x28\xae\x34\x8a\xe4\xa0\x1a\x38\xc7\x5b\x4b\x98\x31\x20\xec\x20\xc0\xc0\x84\x81\xee\xfc\x90\x7c\xcc\x2a\xaa\x68\xc0\x94\x4c\x96\x25\xed\x51\xb6\x1d\xe3\x8b\x28\xe4\x50\xa0\x10\x63\x45\x67\x45\x8b\x66\x87\xa2\x60\xf3\x6d\x5d\x6b\xc3\x04\x15\x9d\x43\x26\x53\xe1\x0c\x42\x41\xe4\x4d\xa8\x22\x30\xe5\xd7\x4c\x2c\xde\x67\x67\x8e\xf8\x96\x66\x57\x4c\x74\xb7\x6f\x7e\xaf\xfd\x19\xe7\x73\x41\x4b\x9e\xd1\xc2\xd2\x03\x25\xaf\xb9\x25\x07\x2c\x5f\x58\x57\x0f\x9c\x09\x1f\x9b\x90\xfa\xe6\xd5\xa8\xd8\x6d\xeb\xe0\x6a\xcd\x3a\x87\xf8\xa7\x3a\x36\x0b\xc3\x63\xf1\x3c\x8d\x11\x1d\x8a\x5f\x67\xcc\xeb\xc5\x76\xbd\x6d\xed\x37\xbe\x5f\x92\x1d\xf7\xd8\x1c\xd1\x28\x90\x6a\x43\x38\x2a\xf6\x1f\x2b\x2c\xaf\x9a\xfb\x04\xbb\xc5\xbb\xe0\xda\x93\xf7\xe3\x37\x1d\xf7\x43\x8d\x3b\x09\x99\x29\xd0\x4e\x8d\xf3\x36\x63\xf9\x44\x73\xa9\xc9\xb7\xd0\x95\xe3\x84\x81\x19\xe5\xa9\x95\x86\x4f\xdf\x9e\x3c\xa0\x30\x58\xa8\x13\x2b\x0b\x4b\x7d\x75\xec\x96\x96\x55\xc1\xf4\xe8\xea\x0f\xe0\xad\x73\xf4\xeb\x95\x1a\xe7\xaf\x3e\x9d\x1e\x9d\x7c\x38\x1d\x95\x5d\xe8\xe6\x96\x35\x13\x5e\xd2\x69\x37\x3d\x7e\x48\x4a\x29\xb8\x91\xaa\x0b\x83\xed\xab\x98\x4c\xf4\x67\xbb\x6f\x5b\x26\xd2\x08\x85\x37\xa4\x34\x3d\xf8\x11\x21\x9d\xdd\xc4\x0b\xcc\xf6\x9e\xcc\x65\x4d\x6e\x28\xf6\xf7\x82\xab\xd4\x5d\x3c\xfe\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\xa6\xaf\xe9\x22\x08\x96\xab\xfa\x9b\xe0\x79\x2b\xdc\x5a\x6c\xec\x05\xfd\x64\xe0\xf1\xee\x70\x9c\xba\x7b\xf1\x96\xec\xb1\x5b\xf3\x9b\xbd\x01\xd9\xbb\x9d\x68\xfb\x8f\x30\x13\xbd\x37\x22\x67\x65\x55\xf0\x8c\x9b\x62\x6e\x6f\x14\x53\x2a\x38\xfa\xf1\x07\x0b\x79\x06\xdd\x21\xd9\xd0\xc1\xae\x8d\x54\x74\xca\xfc\x45\xfe\x95\x1a\x77\x15\x7b\x7a\x33\x40\xb8\x84\xdb\x46\x66\x00\x22\x78\x14\x80\xf4\xe3\x47\xfd\x1a\xa1\x74\x25\xa5\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\xea\x96\xed\x7d\x32\x57\x6c\x0e\x09\x72\x5b\x3e\x1b\x07\x46\xcb\x64\x6b\x24\x44\x26\xc0\xe7\x56\xdb\xf9\xf4\xed\xc9\xf7\xba\x8f\x5b\x2d\xb2\x88\xbc\x62\x26\x7b\x95\xb1\x6a\xf6\xca\xad\xfc\xaf\x7a\xfe\x51\x3c\xcb\x9d\x3d\xe9\x34\xa1\xe7\x99\xdb\xc6\x28\x0f\x07\x8a\xca\x99\x2c\x0a\x96\x79\xc7\xe1\x31\xab\x66\xe1\x81\x67\x7d\xf2\x7d\x72\x62\x7a\x66\xc2\xec\x9e\x33\xc2\x8e\x4a\xca\xce\xf1\x54\xa9\x50\xcf\xc2\xd0\xe6\x33\xf0\x49\x3f\x36\x13\x11\x2f\x35\x4e\x2b\x44\x3c\x4f\x72\xd5\x55\x9c\x79\x16\xc6\xe8\x4f\xfe\x4b\xcd\x0c\x48\xb1\x5c\x10\x2c\xb0\xf9\xc1\x4a\xd5\xbb\x60\x75\xde\x09\x54\xea\x63\xf4\xc6\x1c\xec\x1e\xe5\x74\x52\x61\x42\x00\x04\x54\xfc\x28\x1c\x9a\xd6\x66\xc6\x84\xe1\x19\x86\xbc\xb8\xa4\xf1\x58\x16\x22\x67\x13\x34\x3e\xe6\x3d\x62\x36\xe5\x35\x53\x8a\xe7\x4c\x93\xde\xc2\x50\xec\x74\xe2\xc5\xb3\x46\xad\x5e\xe1\x92\x29\xa2\x13\xfb\x06\xec\xa7\x8c\xaa\x48\x1f\xa4\xbf\x1b\xe1\xf9\x3b\x11\x98\xff\x18\x21\xf9\xbb\x18\x8c\x9f\x28\x9c\xb1\x7f\x00\x7e\xfa\x90\xf2\x9d\xf1\xa8\xb4\xc4\x4e\xf8\x24\x99\xd8\x49\xf3\x92\xf7\x28\xef\xba\x03\x24\x3d\x8d\xe0\x09\xfb\xb0\xf1\x24\x3a\xa3\x05\x3b\xfb\xb8\x2d\xdf\x87\x5b\xbe\xed\xff\xb8\x74\x1f\x56\x4c\x69\xae\xa1\xe4\x87\x77\xc5\x19\x43\xb3\x99\xf3\x46\xf8\x20\x08\x29\xc8\x77\xe1\xde\x10\x21\xf3\xae\xb1\x8d\xb1\x03\xc4\xc3\xb0\xda\x09\xe2\xc1\xff\xb2\xa2\xa6\xa6\xd4\xb0\x9b\x8e\xfa\xfb\xb0\x11\x1b\xbb\xfe\x1e\x0c\xe3\x2f\xbe\x8d\xa5\x8e\x85\xfe\xfe\x8b\x90\xeb\x7f\x67\xee\xc7\xf7\x58\x8c\xee\xf1\x55\xa4\x60\x03\x30\xe3\x56\x5c\xc7\x38\x02\x1d\xbe\x9d\x74\x13\x46\xdc\xad\x4b\x82\x7f\x6e\x2e\x8f\x45\x70\x90\x34\xcf\x15\xd3\xda\x8b\xcb\x9e\xc0\x1d\x5d\x9c\x91\xbf\xe0\xe3\x5b\xdb\xbd\x4a\x49\x83\x66\xd0\x13\x59\x52\xde\x39\xe1\xad\xb5\x07\x8b\x93\xfa\xcd\x88\x35\x59\xbf\x09\x17\xe1\x59\xe2\x1e\xb6\xda\x6c\xd3\x96\xbc\x56\x2c\x27\xce\x71\xb5\xb5\x5d\xda\x39\x0b\xd1\x1d\x9b\x0d\x39\xb0\xdf\xbd\xba\x51\xdc\xb0\xc3\x51\x63\x2d\x5a\x30\x25\x75\xb7\xed\x3e\xa2\x09\xea\x8b\x34\xdc\x44\xe1\x37\xbe\x64\x59\x63\xac\xf1\xc8\x0f\xe2\x78\x48\x5b\xeb\xb1\xaa\xd0\x1c\x72\x19\xa2\x6c\x52\xb0\x04\x81\xae\x1a\xaa\x92\xa1\x55\x68\x40\xde\xcb\x29\x17\x9e\xbd\x48\x97\x4d\x34\xa1\xdd\xcd\x33\x2f\xf6\x91\x3b\xe3\xc5\x3e\xf2\x62\x1f\x79\xb1\x8f\xdc\x3f\xb4\x2e\x4e\x05\x1d\x17\xdd\x53\xc7\xdb\xd9\xf5\x61\x3a\xf2\xae\xa0\x53\xc2\xe0\x8f\x57\x39\xd7\xf6\x5f\x72\x79\xf9\x1e\x42\xb0\x6b\xe1\x4d\xe7\x80\x9b\x4e\xfa\x0a\xf5\xa4\x91\x97\x6e\x8f\x8d\xa1\x98\xf3\xa1\x47\x05\xb5\x64\x8c\xac\x01\x85\x70\x91\xdb\x5d\x63\xba\x55\x31\xc2\x3d\x01\xfc\x8c\x86\xaa\x94\x98\x74\x3d\x66\x96\x5a\x65\x57\x17\x51\x14\xb4\x54\xf6\x33\x11\x7d\x94\x44\xf9\x48\x34\x67\x4a\x35\x64\x01\xa4\x3e\xa8\x70\x91\xca\x79\x1d\xcd\xe7\xa5\x71\x2f\x84\x5c\xba\x83\x84\xef\xa8\xd6\x32\xe3\x4d\xde\x02\xc4\xde\x34\x22\x7a\x0e\x22\xfa\xd6\x36\x19\xf5\xe0\x34\x1b\x82\xea\xf7\x12\xcd\xc4\x23\xb6\x7b\x82\xea\x58\x13\xe1\xc2\xef\xdb\xd6\x36\x01\xaf\x5a\x9f\x8e\x06\xa9\x88\x44\x03\xc9\xe2\x3e\x06\x82\xb0\x18\x77\xee\x4b\xe2\x3a\xdc\xeb\x6c\x71\xc2\x01\x51\xa0\x5c\x2f\xc1\x5a\xae\x03\x49\x82\x62\xe9\x5b\x39\xad\xee\x15\xc4\x93\x18\x78\x51\xdf\x68\x27\x4e\xe1\x67\x2e\x82\x1d\x68\x75\x25\xab\xba\xc0\xb4\xfd\xb0\x69\xc9\x42\xc8\x37\x89\x46\x45\xd8\x9e\xde\x66\xdb\x57\xf3\x88\x4a\x4d\x6e\xfb\x42\xc6\x55\x2f\x37\x2f\x6f\xea\xef\x28\x58\x27\xc9\x78\xee\xa7\x4b\x60\xf1\xdc\x7e\x75\xd3\x54\xd5\x4c\xbb\x5b\x97\x5b\x55\x50\x5b\x16\x9c\xd7\xbf\xfb\xcd\x6f\x7a\x08\x43\x5c\xb1\xcc\x48\xc8\x3c\x74\x95\xa5\x43\xc4\x2c\x55\x0c\x74\x7f\x2c\x3d\xea\xed\xcb\x98\x79\x66\x7a\xc5\x75\x6c\xaf\xfc\xe9\x56\xca\x9d\xa6\x28\xb8\xd1\xbf\x9c\x69\xaf\x00\xcd\x64\x51\xf3\xd0\x2a\xe1\x6c\xcb\xad\x12\xb6\xda\x20\x61\x9b\x6d\x11\xb6\xd7\x0c\x61\x8b\x2d\x10\xb6\xdd\xf8\x60\x2b\xed\x0e\xb6\x1e\xd0\xfd\xf4\x0d\x0d\x92\xd4\x25\x4c\x51\x93\xb0\x6f\xcb\x82\x9e\xf5\x0c\xd3\xd4\x32\xec\xdd\x94\xe0\x29\x5a\x11\x24\xb2\x71\xf6\x6f\x3b\x90\xb6\xe6\xd4\xb6\x5b\x0c\xec\x90\xe8\x8d\x63\x37\xdb\x09\x6c\xa5\x89\xc0\xb6\x5b\x07\x6c\xb1\x61\x40\xba\xc2\x75\xa9\x9a\x03\xf4\x2f\x58\x97\x96\x70\x6c\xa9\xfc\xff\x23\x16\xfd\x7f\x92\x52\xff\x8f\x5d\xe0\x7f\x37\x93\xdb\xfa\x16\x0c\xef\x5d\x26\x5c\x27\xaa\x13\x9e\x2a\x06\x64\x17\xcc\xe2\x0d\x24\x4b\xdd\x0b\xbe\x0b\x24\xde\x03\xa8\x1e\x02\x7e\xe2\x8a\x62\x4f\xcf\x3a\x71\x06\xd6\x93\xd8\x60\x49\x6f\x5b\x39\x42\x22\x3b\x09\xbc\x49\xcc\xe5\x08\xc0\xc7\xcb\x85\x88\xe8\xf0\xf1\xd3\x07\x42\x87\xa5\x1f\x08\x85\xf6\x5b\xb7\x63\xc1\xd0\x2f\x51\xc1\xeb\x8c\x5d\x8c\x0a\x7e\xaa\x0a\x26\x5f\x5e\x60\x66\xfe\x12\x98\x19\x8f\x1d\x0c\xcc\xd4\xad\x86\xf3\xde\x21\x0a\x6c\x17\x54\x4b\x39\xb6\x42\xaa\xaf\x1c\xd8\xd0\xe0\xa3\x8b\xb3\xce\xab\x67\x8a\x41\x57\x00\x5a\xe8\xd1\x32\x9d\xd3\x87\x1f\x39\x0d\xd7\xeb\x9a\xd4\x18\x56\x56\x9d\x4b\x7a\xbd\xc4\x65\x2e\x19\x2f\x71\x99\x2f\x71\x99\x2f\x71\x99\xf7\x8f\x5d\x8e\x2e\x9a\xd5\x25\x15\x43\xcb\x4f\x21\xa8\xb3\x95\x4e\xb2\x20\xa6\x8f\x88\xe3\x80\xbd\x88\x16\x96\xf2\x85\x02\xcf\xb5\xe0\x3f\xd7\xac\xf1\x74\x04\x95\x6d\x07\xe2\xc0\x00\x8e\xdd\x39\x2e\xd4\x64\x17\xf8\x6c\x26\xef\xd4\x07\x74\x7b\x19\x8e\xce\xb3\xc6\x7e\x47\x06\x8b\xb7\x1c\x93\x66\xc6\x50\xd9\xbe\x58\x50\xb6\x5b\x36\x5d\x47\xc8\x81\x8e\xf6\xf3\x0e\xc7\x9a\xa0\x45\x51\xfb\xee\xae\x43\xca\x98\x91\x92\x2b\x25\x95\x8b\x54\x8b\x5f\x1f\x13\x9f\xf8\x74\x66\x98\x42\x0b\x29\xa6\x67\x74\x27\x9f\x97\xcc\xb8\x5b\x00\xb7\xc8\x48\x42\x05\x16\x7a\xb5\xff\xed\x8b\x7c\xc0\xd6\x78\x09\x64\xcc\x66\xf4\x9a\xcb\xba\x47\x51\xb5\x4b\x94\xa7\xf6\xdc\x94\xa0\x2b\xcc\x65\x1d\x62\x51\x6a\x6d\x37\x23\x9c\x82\xbe\x8b\x07\x9d\x97\x3e\x6f\x26\x05\xb3\x79\x2e\xbd\x33\x7a\xc8\x6e\xb9\x36\x77\xf7\xdc\xa3\x80\x8b\x7d\xda\xca\x65\xbe\xd6\x95\xe5\xbe\x3f\x74\xae\x09\x9c\xe2\x0a\xb7\x80\x68\x9b\x40\xae\x2f\xe1\xab\x87\x0c\x20\xae\xb9\x10\xd6\x47\x27\x25\xcd\x66\x5c\x24\xa8\x87\xfb\x43\x0b\xb0\x96\x25\x64\x44\x8e\x8a\xa2\xc9\x63\xd2\x21\x75\xd0\x5b\x46\xda\x2f\x65\x0f\xa9\x13\x38\x16\x73\x15\xcb\x21\xce\x0a\x45\x2c\xc8\x4f\xd4\x7c\xe4\x16\x18\x5d\x97\x37\x54\xb1\x51\x26\x4b\x72\x7c\x79\x46\x72\xc5\x3b\xb6\xfb\xda\x72\xfe\x39\x1e\xf1\x45\x37\xd7\xf5\x97\x66\xef\x79\xb1\xf5\xec\x94\xad\x27\xa4\x30\x14\x3c\x9b\x9f\x9d\xa4\x4d\x8b\xc0\x39\xbd\xa0\xa9\x43\x4a\x84\xfd\x9c\x7c\x4b\x35\xcb\xc9\x07\x2a\xe8\x14\x1d\x56\x07\x97\x17\xdf\x7e\x38\xb4\x08\x0f\xce\xb8\xb3\x93\xa5\x79\x13\x97\xf1\xe4\xe7\xdb\x2a\xaf\x4e\x16\xb7\x2e\x99\x6c\x7f\x67\xd6\x8e\xdb\xb7\xb5\xca\xf3\x24\x88\xad\x17\x3d\x9c\xc0\x4b\xaa\xf1\x5f\x2c\x36\x1b\xc3\x44\x05\xdf\x19\x52\x2f\xb2\xd4\xeb\x32\xbf\x7a\xea\x0d\xb8\xeb\x8d\xb4\xfa\xe3\x15\x9b\x6f\x4c\xbd\x87\x70\x82\x3d\x17\xc7\xf7\x28\xe9\xfd\x2d\x89\xa2\x48\x99\x55\x10\xae\x17\x35\xb7\x46\x64\x5c\xeb\x5c\x2f\x8d\xa2\x86\x4d\xe7\x27\xac\x2a\xe4\xdc\x62\xf1\x45\x14\xb8\x83\x8f\x8e\x51\x94\x56\x63\x9a\x11\x55\x17\xd0\x78\x21\xbf\xd3\x8e\x51\x30\x96\x37\x64\x9e\x0b\x6d\x68\x51\xd8\x03\x84\xf9\x57\x42\xb4\xb6\x70\xb0\xae\x18\x30\x44\x38\x1f\x7c\xaa\xdd\x8e\xf8\xfc\xa1\xd3\x5e\x5f\x10\x80\xe5\x1f\xc6\xb7\x4d\x22\x21\xd7\x8e\x79\xec\x22\x30\x20\x45\xfb\x54\x17\x96\x41\x17\x79\xbb\x7d\x33\xaa\x1c\x0e\x15\xb0\x35\x04\xd0\x3f\xfb\x92\xce\x04\x28\x99\x6e\x85\x42\x44\x3f\x5f\x6b\x7d\xec\x10\x7d\x33\x43\x09\xd4\x4e\x4c\x68\x55\x15\x1c\xab\x0c\x48\xe5\x82\x70\x23\x7f\xf2\xdd\xc7\xd6\x21\xb5\x1b\x8a\xa1\x9b\x89\x9d\x43\x72\xcd\xd4\x78\x1d\xfb\xdb\xa6\x12\x25\xad\x38\x84\x33\xad\x4d\xc2\xba\x0a\x8d\x47\x17\x67\xb8\xd0\x32\x0f\xbf\xff\x12\x11\xc2\x1d\xb5\x0f\xe8\xc1\x74\x34\xe7\x06\x08\x9d\xa3\x8e\x2e\xce\xb0\x21\x9b\x6b\x1e\xd5\xb8\x06\xac\xc6\x4e\x31\xf9\xb2\xe9\x79\x4b\xa7\x76\x46\x43\xa4\x60\x9b\x74\x4f\xb5\x10\x30\x51\x97\x0c\x1b\x53\x05\x60\x08\x17\xb0\x4e\x80\xa2\xf1\x40\xa0\x55\x79\x44\xf6\xf6\x62\x9d\x10\xcb\xb3\xa8\x08\x6e\x20\x75\x7b\x5f\xb5\x9e\xb2\x74\xad\x79\xb1\x75\x39\xfc\xe6\x51\xcf\x1b\x46\x39\x77\xe0\x98\x09\x22\x77\x84\x14\x9f\xdc\x7e\x7f\xff\xe9\xfd\xa3\x23\xe8\x79\x7b\x39\xd7\x1e\x88\x41\x6b\xd3\x8a\x2a\xc3\x69\x41\x6a\x55\xf8\xf0\x42\xac\x44\xe2\x32\x02\x67\xf4\x3a\x6a\xbd\x34\x22\xe4\x2b\xc4\x4a\x87\x0c\x48\xca\xc0\x28\xea\x5a\x91\x4d\xea\xa2\x18\x90\x09\x17\xd4\x32\x32\x56\x91\x28\xc8\x6b\x6d\x88\x2f\xb9\xc8\x98\xdd\xa6\xa1\xc7\x4b\x02\x90\x7b\xb3\x51\xa0\x69\x10\xa3\x19\xbb\x5c\x10\x14\x4b\xdf\x32\xb0\x0b\x4f\xa4\x22\xc7\x45\xad\x0d\x53\x9f\xa4\x65\xc3\x4d\xba\x09\x99\x28\x59\x12\x1a\x7f\xfd\x2d\x17\xf9\x46\x99\x50\x9f\x80\xb5\x67\x54\x10\xc6\x21\x30\xca\x2e\x0d\xf1\xd0\x16\xd9\x9b\x4b\x75\xa0\xeb\x6c\x66\xb7\x68\xaf\x92\xb9\xde\xb3\xd4\x79\x0f\xdd\x8d\x7a\xef\xd0\xfe\xb5\xf8\xae\x98\xbd\x11\xfd\xee\x15\xad\xf8\xde\xe1\x80\xc0\x86\x43\x70\x9e\x5c\x3f\x1a\xef\x0b\xbd\x47\x7e\xc3\xc0\xd4\xd7\xe9\x16\x7d\x8a\x67\x80\x8b\x21\x9a\xd0\xb7\x9b\x19\x37\x98\xaf\x63\x6f\x0a\xfa\x00\x42\xaf\x99\x45\x46\x4a\xc8\x91\x77\xa2\xd9\xab\x55\x32\xea\xe3\x75\xd9\x35\x53\x73\x33\x73\x0d\x2c\x3c\x15\x7d\x39\x39\xb8\x19\xbd\x4e\xcd\x91\x32\x7f\x42\xcd\x75\x03\x9a\x70\xe7\x84\xf6\xbf\xda\x5f\x64\x49\x0d\x0f\xfe\xd7\x3e\x0f\x10\xc2\x3a\x9d\xc5\x0f\xf6\x97\xed\x73\xc0\x8f\x90\x99\x04\x72\xf8\xfe\xbd\x0b\x4f\xc1\x0d\xff\x8e\x0b\xf0\x7a\x83\x3c\xe4\x6b\x01\xb8\x43\x5b\x7a\x52\x00\xe1\xbf\xec\x29\xdd\x55\xba\xd6\x55\x94\x56\xc0\xe8\xf5\xcc\xfb\xa6\x5a\x39\x81\x53\x56\x3f\xc8\x7c\xf9\x25\x6e\x21\xc9\x59\xf4\x70\x88\x25\x6e\xcc\x9c\x6e\x2e\xa7\x39\xcd\xab\xa5\x5a\xe8\xea\x33\x5d\x71\x7e\xf7\x41\xd2\xd8\xe9\x80\xec\x47\xdf\x7c\x6e\x02\x23\xc8\xa4\xa0\xd3\x06\x17\x81\x88\xa3\x64\x7f\x7c\xf9\x83\x7f\x05\x4d\xee\x29\x3d\xfc\xa0\xea\xf4\x90\xb2\x34\x6c\x76\xe9\xde\x27\xee\x75\x65\x3c\xac\x31\x85\xc9\xef\xc7\xa6\x75\xe2\xbe\xcc\x4a\x53\xfd\x7d\xfb\xef\x4d\xeb\x34\xc2\x04\xdf\x39\xce\x9b\x42\x20\xdb\x04\x64\xb8\xcb\x1f\x5a\x68\xf2\x00\xbc\xf7\x20\xed\x15\x9b\xdf\x48\x95\x3f\x8c\xb0\x47\x81\x98\xf9\x9f\x78\x65\xde\x07\x83\xa1\x39\x5e\x2e\x75\xec\x74\x46\xd5\x95\xc0\x17\x74\xcc\x8a\x87\x41\xbf\x47\x31\xf8\x40\x2b\xfb\x3a\x4d\xca\x26\x5a\xa4\x5c\x94\x19\x6a\xa7\x98\xe7\xe3\x33\xd2\xa4\x9a\x52\xc1\x7f\xc1\x3c\xd7\xcc\x52\x0a\xa9\xf8\x2f\xcb\x51\xed\x00\x7d\xfa\x68\xe3\x2a\x58\x66\x0e\x1d\xd6\x2f\x25\xd9\x0f\x5c\x0b\x9a\xe7\x1c\x45\xb0\x8b\x07\x30\x78\xf5\x7e\x71\x71\xb5\xc9\x49\xc3\xf3\x98\x66\xd3\x38\xf6\x1e\xf1\x98\x57\x90\x85\x87\x6f\xee\xea\x30\xba\x35\xd8\x53\xad\x56\x24\x8a\xac\xfc\x7d\x49\x39\x72\xed\xe5\x6d\xbc\xee\xd9\x5d\x87\x4d\xd4\xc9\xd6\x96\x96\xda\xf7\x0b\xb3\x3d\xc1\xbd\xea\xb5\xe1\xac\xa4\xbc\xeb\x8e\xe1\xe8\x71\x64\x25\x35\xb5\xe2\x66\x29\xa7\x5e\xfd\x43\x2e\xbe\xab\xc7\xec\x07\xa6\xb4\x3d\x8f\x4d\x7f\x2e\x20\xe3\xec\xe8\xe2\x6c\xe9\xb6\xa4\xe1\xc8\xf7\x1a\x32\xc0\x6e\xe6\x20\xb7\xe2\x22\xa9\x05\x2d\xc7\x7c\x5a\xcb\x5a\x17\xf3\xd8\x83\x42\xc9\x15\x17\xf9\x88\x90\x33\x34\xab\x8a\x7d\x43\xa8\x90\x62\x5e\xba\x47\x45\x56\xd4\x39\x6b\xcd\x78\x1f\x2b\x93\x84\x5e\x4b\x9e\x13\x5a\x1b\x59\x52\xc3\x33\x92\x49\xa6\x32\x28\xa2\x1a\xcf\x5f\x6b\x46\x68\x6b\xc6\xe6\xb7\x59\xad\x8d\x2c\x49\x49\x95\x9e\xd1\xa2\xb8\x0f\x25\x12\x48\x07\x60\x4e\xbb\xf7\x5b\xbb\x2b\xf7\x7e\x79\xbd\x62\x1f\x1e\xbe\x0e\xb0\x70\xaf\xeb\x60\x81\xeb\x35\xc1\xf5\xfd\x48\xbd\xc6\x1c\xae\x02\xee\xd2\xbe\x1c\x2d\xfc\xfc\x3c\x63\xa4\xaa\xc7\x05\xd7\xa0\xc2\x03\xe1\x9a\x93\x31\x9b\x71\x97\x7a\xf3\x30\xc5\xba\xf7\x88\x1f\xda\xe7\x55\x24\xe3\xc1\x1d\x5a\x41\xe1\x57\xfe\xd6\x71\xc0\xb3\x92\x4e\xd7\x10\xed\xef\xb9\xbe\xef\x2d\xd9\xa7\x62\x1e\xf8\x29\x34\x53\xd5\x03\x22\x95\x4b\x24\xf6\xba\x9f\x72\x5f\x85\x16\xc1\x8a\x7c\x74\x3b\xea\xf2\xa2\xdd\x35\x80\x2a\x03\x4c\x4d\xa4\x2a\xed\xbe\x73\x45\x26\xb5\x00\x6b\xf8\x3d\x7a\x21\xc4\xf0\x01\xff\x71\xc6\x4c\x5a\x68\x19\x88\x01\x1c\x9b\xf0\x80\x11\xaa\xc9\x0d\x2b\x0a\x0c\x23\xc2\xce\xaf\x51\xd9\xe6\xa6\x96\x65\x13\x4a\x38\x5e\xae\x5b\xe6\x7c\xca\xb4\x21\x07\x97\x7f\x3d\x3a\x04\x81\x08\x8c\x75\x73\x62\xe8\x74\xb4\x10\x1f\x8e\xc1\xa4\x56\xdc\xca\x6b\x10\xcb\x32\x6a\x68\x21\xa7\x18\x81\x66\x49\x8a\xfd\x7d\x55\xd0\x39\xa4\x71\x55\x54\x41\xae\x60\x86\x06\x4b\xa2\x6a\x71\x5f\x9b\xf1\xc7\xe3\x94\x0f\xd3\xa4\x55\x3d\xb5\x57\xb8\x87\x1f\xa6\x39\x0f\xf4\x09\x7e\x5c\x16\xac\x58\x55\xd0\x7b\x0c\x56\x77\xe8\x45\x53\xfa\xd0\xea\x2d\x60\xd8\x90\x82\x85\x39\x46\xe4\x12\xf1\xa9\xa4\x26\xc3\xf8\x90\x7f\x94\xcc\xd0\x9c\x1a\x3a\xb2\xca\xfd\x3f\xda\x25\x92\x64\x91\xdb\x89\xee\x3f\xe8\x7b\x60\x46\x51\x5c\x3e\x4c\xe3\xde\x5b\xd5\x22\x3c\x0e\x0a\x97\xbf\xb7\x2b\x2d\x64\x3d\xc9\x1b\xbc\xfe\xe9\xad\xd5\xad\x57\xba\xf2\x5b\xb0\x2e\xfe\xa8\x6d\x7b\x2a\xda\x6f\xe2\xb0\xb5\x64\xc2\xe8\x11\x1c\x4d\xfc\x09\xf8\x13\x8e\xce\x4f\xee\x37\xc7\x3e\x6c\x48\x7a\xc0\x70\xb4\xbe\xcf\xe6\x68\x05\xec\xde\x65\xe3\xbe\x69\xfb\x12\x7d\xa1\x0c\x28\xc3\x84\xc5\x1b\xa8\x08\x5c\x09\x1e\x5e\xb1\x2c\x9e\x73\x53\xca\xa5\x51\x0a\xef\x37\xb6\xad\xe5\x11\x5e\xc7\x0f\xfc\x50\x65\x9d\x61\x78\x8d\x7b\x1f\x5a\xcf\x2d\xfc\x60\xf5\x9b\xfb\xaa\xdb\xe0\x99\x40\x59\x05\x6f\xf9\x0f\xc7\xb0\xae\x1b\x7d\x4d\x63\xa1\x7f\xd5\x0d\x00\x7d\xd0\x09\x18\xb0\xa0\x15\xc4\x7b\xc5\xe6\xfb\x4e\xd3\xb5\x37\x68\xc6\x2b\xac\xdf\xe4\x7c\x82\x0f\x1d\x3f\x8e\x1f\x68\xc1\xf3\xb0\x00\xde\xa5\x33\x31\x20\xe7\xd2\xd8\x7f\x4e\x6f\xb9\x36\x68\x63\x38\x91\x4c\x9f\x4b\x03\x9f\x24\xd9\x29\x04\x30\xe5\x3e\x39\x33\x08\x3a\x80\xe0\xba\x47\xc6\x12\xb7\x1f\xd8\x43\xa1\x91\xf7\xec\xd3\x67\xc2\x0a\x34\xf8\xca\x0f\x2c\x11\x8a\xc2\x69\xb7\x80\x2f\x96\x20\xa4\x18\xfa\x1c\xad\xbb\x2b\xb8\x7d\x94\xaa\xb5\x8d\x9d\x17\x73\x0b\x61\x7a\x03\x7c\xc3\xb5\xe7\x4b\x41\x0c\xa1\xde\x34\xfc\xa0\x5d\xba\x64\x6a\x0a\xbe\xdd\xec\x01\x5f\xe4\xba\x16\xf9\xb5\xec\xf0\x6b\x5b\xdf\x3b\xd9\xdc\x3b\xfc\x08\x78\xd2\xfb\x7b\xed\x73\x64\x03\x7c\x8c\xa6\x42\xaa\x5f\xa2\xe1\xee\xbf\x2c\x71\x87\x23\xfd\x6f\x28\xa8\xa8\x47\xe4\x88\x68\x2e\xa6\x05\x6b\x7d\xe7\xdc\xed\xd1\x34\x2b\x96\xaa\x20\x4b\xf1\xe7\x9a\x5f\xd3\xc2\xb2\x19\xc8\x0a\x09\xa5\x58\xe4\xe4\x0e\xb3\x1d\xb8\xc2\x89\x96\x20\x06\x31\x76\xef\x8a\xcd\xf7\x06\x2b\xd3\x64\x62\x8c\xde\x3b\x13\x7b\x4d\x8d\xa1\x16\x96\x06\x9e\x06\x92\xf1\x1e\x7c\xb7\xd7\x9d\x6f\xaf\xe4\x50\xeb\x5b\x19\xc9\xc3\x28\xb7\x59\xee\x9d\xbe\xe2\xcb\xc3\x92\xd6\x41\x12\x2f\x5f\x1e\xe8\x43\xb0\xab\x09\x46\xa0\x08\x96\x02\x97\x84\xfd\x34\xae\xe8\x6c\x35\x96\x2b\x5e\x55\x4d\xb9\xed\xba\x9a\x2a\x9a\x33\x32\x55\xb4\xba\xe7\xd2\x6e\x26\x9d\xa2\x88\xbb\x6c\xc9\x15\x6a\xd9\xee\xeb\x40\xf7\x9c\xf5\x0a\xab\xc3\xca\xdf\xdd\xb0\xf1\x4c\xca\x2b\xa8\x8c\x03\x78\xf7\x88\x26\xb5\x1f\x71\xad\x93\xe6\x33\x6f\xee\xd0\x24\x67\x86\xf2\x02\x42\x04\x3f\xbe\xff\xe0\x82\x08\xbd\xac\xe6\xa1\x5c\x4e\x33\x12\xe8\x86\x34\x77\x71\xb2\x9f\xd8\x35\x67\x37\xce\x72\x76\x1f\x89\x1a\x92\x29\x13\x10\xa0\xb6\x22\xcc\x74\x48\x34\xcf\xd9\x29\xa4\x5a\xdf\x3f\x51\x0f\x27\xd9\x3d\x30\x3f\x44\x2b\x56\xf3\xba\x07\xf9\xdc\x1a\x3c\x2e\x58\x50\x2e\xa4\x5a\x51\x59\x7e\xbd\x32\x6b\xeb\x95\x50\x0b\x59\xca\xbf\xf9\xcd\x37\x2b\xf8\xca\x2d\x2f\xeb\xf2\x2d\xf9\xdd\x6f\x7f\xfb\xcd\x6f\xef\x7f\x8c\x0b\x7c\xec\xcd\xfd\xef\xe7\x6e\xdb\xf1\xa7\x93\x1d\xd8\xef\x3c\xc4\x7b\xaf\x76\xc0\xaf\x31\xd5\x84\xf2\xa2\x56\x2e\x5d\x62\x4d\xed\xf1\x5d\xfc\x1b\x70\x9e\x36\x69\xb5\xd4\xcf\xe8\xe3\x8c\x5d\xfc\xf1\x84\x0b\xa6\xc9\x4c\xde\x90\x5a\x28\x96\xc9\xa9\xe0\xbf\xb0\x1c\x8b\xe5\x6a\x0c\x80\x83\x56\xf2\x1e\xc5\x09\x13\x79\x25\xb9\x30\xc0\x62\x67\x54\xe4\xc5\xaa\x58\xa5\x35\xde\x34\xbe\xc1\xbd\xb6\x0c\xb8\xd1\x46\x1b\xf6\xa1\xf9\xc5\xc2\x76\xd9\x77\xf6\xae\x66\xe4\x72\xb8\x6d\xbd\xde\x14\x09\xe3\xe5\x0a\x9b\xcb\x12\x18\x37\x33\x09\xa0\xa9\x03\x3e\xfb\xb9\x66\x6a\x0e\x79\xbb\x8d\xe2\x16\x45\x14\x7f\x6e\xca\x37\xfa\x77\x74\x42\x25\xbd\xd7\x27\x40\x96\x98\x64\x22\x51\xab\x09\x70\x5b\x80\x0a\x7e\xc3\x30\x4c\xc7\x7b\x7d\xc9\x11\x11\x75\x51\xac\x58\xe9\x9e\x49\x84\x5c\xe5\x39\xc6\xb1\x96\xfd\x61\x3d\xc3\xc0\xba\x26\x28\x1c\xdb\x33\x44\xc5\x2f\x9e\x48\x8b\xda\x34\x9c\x78\x4b\x06\x2a\x1c\x5d\xcc\x54\x38\x36\x48\x5f\x58\x3f\x75\x61\xbd\x92\xd0\x6b\x98\xaf\x70\x6c\x92\xdb\xb0\x66\x21\xe7\xc7\x34\x68\xe1\xd8\x28\x06\x6e\x3d\xe3\xd6\x12\xd0\xd7\x8c\x73\x7f\x44\x43\x17\x8e\xc7\x30\x77\xe1\xd8\x68\x1f\xd7\x31\x7d\xe1\xe8\xb2\x8b\x4f\x60\x06\x73\xef\xfc\x94\xc6\xb0\x07\x96\x4c\x6c\x12\xc3\xb1\xb6\x61\xcc\x01\xb7\x51\xc0\xea\x06\xc1\xaa\x1b\x06\xaa\xf6\x08\x52\xed\xfc\xd3\x35\x8c\x67\x38\x36\xc3\xe8\x27\x34\xa4\xf9\x05\x9f\xcc\x9c\x86\xe3\xa9\x8d\x6a\x38\xd6\xe6\xa7\x9b\x19\xd8\xe2\xc9\x1f\x40\xd7\x2e\x85\xae\x14\xe3\xe2\x5a\x62\xbf\xcf\x8d\x94\x88\x4f\x77\x7e\xb8\xa0\x4b\xdc\x00\x1b\x75\xca\x44\xd0\xbe\x62\x9d\x6a\x26\xe5\x15\xa9\xf5\xc3\x1e\xb5\x95\xef\xfd\x40\x7a\x6c\x12\x25\x78\x93\x1b\xf6\xa9\x2e\xd8\x8f\xdc\xcc\x3e\x36\x25\x57\xe0\x9a\x99\xba\x2a\x60\x2f\xa2\x2f\x2c\x5e\x7e\x6a\x94\x93\x33\x83\x24\x36\x93\x65\xc9\x44\x8e\xd1\x96\x25\xbd\x5a\x8d\xf0\xda\xaa\xb7\x98\x55\x50\x14\xa8\xc2\xc1\x52\xec\xb6\xa2\xa2\x51\x56\xae\x2d\xa3\x5e\x85\xc2\x6b\x22\xf0\xba\x32\xd9\xda\x79\xa6\x1b\xcb\xdb\x8b\x79\xa5\x51\x62\x68\x2b\x7f\x94\x8c\x59\x21\xa1\xa6\x14\x66\x4e\x60\x96\xd1\xda\xa9\x96\x67\x13\xff\x2b\x27\x39\xb9\x3e\x45\x4c\x4c\x9b\x42\xf3\xba\xe0\x19\x0b\x2c\x53\xae\x53\xcc\xe7\x93\x93\xa6\xd7\x13\xd0\xd7\xe1\x7d\x6b\xf2\xbd\x0d\x78\x5e\x0f\x7e\x47\x2b\xfe\xb0\x29\x10\x47\x87\x93\xf7\x53\xc7\x67\x7f\xed\x3f\x5b\xe7\xf4\xfd\xc3\x2f\xe7\xbf\x6a\xf4\x38\xff\xa6\xd4\x54\xea\xe3\x6f\x53\xd4\x46\x06\x0e\x67\xbf\xc0\x5a\x32\xaa\x2c\xb3\x07\x4b\xfe\x90\x1c\x7f\x3a\x3d\xfa\x7c\x3a\x20\xdf\x5f\x9c\xc0\xbf\x27\xa7\xef\x4f\xed\xbf\xc7\x1f\xcf\xcf\x4f\x8f\x3f\x5b\xe1\xf9\xab\x07\x41\x80\x46\xce\x45\x81\xa7\x6f\x25\x14\xd9\x26\xe6\x54\xcc\xc9\xa4\x36\x96\x22\x37\xc0\xb4\xa0\xa4\x68\x42\xa4\x79\xbe\x4e\xb2\xe3\x17\x87\x83\xad\x33\x0f\x07\xba\x68\xb5\x8d\xf6\xcc\xf5\xce\x76\x79\xfd\x0f\xbf\xd9\xd3\x20\xf9\xda\x79\x9a\x9b\xe2\x78\xb7\x14\xce\xff\xf1\xe0\xbc\xef\xa4\x22\xec\x96\x96\x55\xb1\x46\x86\xdc\x7e\x25\x73\xbd\xef\x72\x75\xed\x7f\x3f\xbc\xed\xf0\x93\x57\x85\x9c\xee\x87\x14\x5f\x46\x0a\x39\x25\xba\x1e\x87\xfc\x6d\x10\x04\xd7\x9a\xed\x2b\x3f\x4d\x2b\x19\x75\x10\x92\xbc\xa3\x59\xd7\x06\xae\x35\x67\x3c\xc1\x26\x70\xbd\xd2\x19\x2d\x58\x6b\x26\xfb\xc1\xa6\x00\x7d\xf5\x6a\xf9\x1b\x7a\x4d\x85\xab\x85\x19\xd7\xa1\x14\x37\xbc\xc8\x33\xaa\xf2\x3b\xe4\x02\x44\x3f\xbc\x4d\x80\x39\xd8\x18\x50\x80\xe0\xd8\x2c\x8d\x85\x20\x1f\xb6\x58\x5d\x33\x55\xd0\x0a\xf3\x00\xa1\xa3\x25\xc4\x2d\xaf\x01\xe2\x09\xab\x18\xd4\x11\xc0\x26\x5e\x8c\x30\x91\x15\x12\x2a\x5d\xa2\xd4\x39\x68\x1f\x0b\x46\x39\xfb\x86\x3b\xeb\xe6\x87\x7f\xe1\xec\x15\x12\xca\x52\x53\x1d\xcc\x52\xbb\xb7\x1a\xad\xcf\x3f\x7e\x70\x1e\x34\x06\x06\x2d\x9b\x91\x3d\x57\x44\x62\x6f\x40\xf6\x42\xe1\xd1\xdc\x69\xe4\x7b\x5f\x3d\x5c\xd2\x39\x4c\x10\x57\x0e\x00\x85\xdd\x45\x3a\x0c\x01\xce\xb8\x50\x0b\x60\xb7\x8f\xd1\x58\x1b\xf4\xa6\x28\xaf\x15\x29\x9d\xab\x05\xde\xa1\xbd\xd0\xc3\x33\xc5\x2f\x7a\x07\xea\xa6\x42\x47\x6f\x88\xf7\xbe\x6a\x4d\x6f\x7c\x75\x72\x22\xa4\x3b\x3c\xc5\x2c\x36\xae\x4a\x05\x88\xc7\x65\xeb\xee\x85\x18\x97\xb8\x2a\x31\x57\xa4\xa2\x8a\x09\x13\x80\x7f\x78\x5a\xd7\xc4\x19\x8c\x31\x5f\xed\xad\x77\x2b\x57\x5e\xa2\x28\xac\x61\x4d\x5b\xc5\x65\xf8\xc5\x71\x41\xb5\x5e\xe2\xf0\x04\x1e\x60\x27\x76\xb5\xe9\x2d\xef\x75\x31\x1f\xd0\xca\x74\x46\xaf\x57\xbc\xea\x1a\x40\x1b\xaa\xa6\xcc\xac\x0e\x48\xa0\x62\xfe\x71\x65\x13\x88\xe1\xda\xad\xe1\x86\x1d\x2c\x46\x5c\x98\xa1\x54\x43\xfc\xc9\x5b\x62\x54\x7d\x9f\xdd\xc1\xf0\x92\xc9\xda\x5c\xb2\x4c\x8a\xe5\x49\xc3\xee\xb9\x64\x11\x16\x1b\x64\x52\xbb\x20\x9f\x23\x2f\x7e\xc7\x9d\x69\xbc\x39\xaa\x91\xcd\x7d\x60\x4f\xbb\xb8\xe8\xc7\xf7\x1f\xfa\x1c\x36\x81\x0a\x52\xab\x4f\xf2\x07\xc7\x93\xc5\x34\x40\xea\x20\x5f\xf9\xb3\x0f\xb5\xd9\xfc\x47\xc7\x21\x60\x64\xf5\xd3\x6e\x33\x56\x17\x7a\xbc\xf7\xfd\xb5\xa1\xa6\xbe\x83\x0d\x0f\xb1\x22\x47\xdf\x2f\xb1\x90\x83\x53\xef\x2f\x61\xaa\xd8\x67\x15\xd7\x90\x43\x8d\x0e\x8b\x68\xc2\x73\x3e\xa3\x64\x44\xdc\x0f\xed\x95\x35\x8a\x72\x34\x87\xd1\xcc\xd4\xf4\xae\xcb\xdd\xfe\xd8\x65\xa3\x2c\xaf\x1c\xbb\xc2\x20\xb6\xca\x08\x96\x31\x65\xf4\x7b\xaa\xcd\xf7\x55\x4e\xef\xa9\x21\xb0\x90\x65\xa2\x0d\xdc\x29\xd4\x69\x6f\x04\xcb\x2d\x13\x72\x5b\x82\xf3\x91\x1b\x4b\xdd\x6b\x9c\x71\xc9\x84\x0f\x60\xa5\xbf\x63\xf6\xe7\x43\xbb\xd4\x72\xa8\x3f\x49\xbb\x27\x47\x4b\x69\x54\x3b\x99\xe7\x21\x68\x2d\x47\x53\x30\x1b\x11\xec\x76\x99\x54\xd9\x1f\xe2\x82\x51\xb1\x3c\xd9\xb2\x05\xeb\x31\x3e\xb7\x39\x4e\xb9\x05\xc8\xcd\x8c\x5b\x75\x0b\x6b\x2d\x68\xe2\x85\xd8\x9c\x15\xec\x9e\x92\x0b\x3d\xf3\x7f\xdc\x0a\x27\x6e\x81\xbe\xa1\xd3\x17\xed\xe9\x82\xc7\xdb\xe9\x96\x2e\x2b\xb7\xd1\xd2\x9c\xec\x13\x6c\x15\x8b\x2f\x0c\xc2\xdb\xb8\x90\xd9\x15\x16\x35\x87\xa2\x66\xfc\x17\xa6\x56\x08\x19\xe0\x45\xe4\x22\xe7\x59\x08\x57\xa8\x94\x9c\x2a\xa6\x5b\x5b\x8d\x35\x60\x35\xce\x6e\xd7\xb4\x7b\x1e\xd6\x95\xaa\xf1\xed\xd4\xc2\x95\xbd\x78\x9a\x14\x25\xaf\x97\x43\xfe\x66\xcb\x97\x7e\x57\x45\xc7\xfa\x92\xd0\x15\xc3\x19\x68\x68\xe9\x92\xac\x5f\x7d\x77\x7f\xea\x71\xd2\xfc\xa1\x55\x09\xd0\xf8\x04\xf7\x7d\x6f\x56\x3e\xb5\x22\x55\x7a\x5d\x57\xc0\x03\x29\xd1\x64\x7d\xd5\x29\x80\xbc\xce\x6c\x49\x73\x2a\x92\x87\xc9\xac\x51\x0d\x78\x93\xe0\x97\x75\xbb\x47\x6d\xe4\xf6\x16\x9b\xb4\x4d\x69\xdd\x96\x46\x99\x72\xb5\x53\x30\x3e\x6e\x22\xd5\xbd\x6a\x5b\x3a\xe0\x57\x27\xd0\x3f\x38\x91\x95\x69\xef\x0f\x44\x6f\x33\x6e\x4f\x41\xc3\x4f\x06\x84\x92\x19\xd7\x46\x2a\x17\x21\x62\x19\xa0\x51\x54\x68\xfc\xfe\x5e\x5e\xd1\x37\xb4\xfd\x38\x80\x40\x68\x55\x31\xaa\xbc\x9f\xde\xb1\x33\xaa\xc1\x88\x9a\x49\x95\x2f\x05\xcc\x9b\x64\x96\x8a\x63\x4b\x97\x4f\x50\x3b\xa4\xa0\xda\x7c\x0e\x30\x58\x99\x62\x4d\x6a\xdc\x96\x98\xdc\x2b\x36\x6f\xe3\x6b\x58\x4a\xd1\x7c\x29\x09\x15\xce\x50\x75\xdf\x12\x6b\xe1\xd7\xc3\x72\x49\xf3\x6e\x28\x00\x76\x7a\xaf\x9b\x20\xec\x45\xaf\xf8\x34\x90\x97\x4c\xeb\x95\x09\xe5\x0b\x95\x6c\xa0\xe3\x14\x09\x1d\xa7\xdc\xcf\x3d\xb3\x47\xc1\x01\x73\x2b\x7c\x65\xe6\xf9\xfd\xa8\x46\x40\x4c\x40\x33\x48\xb8\x56\xbd\x8e\xac\x9a\x51\xbd\xee\xcb\x84\x5b\x14\x72\x78\xd6\xbe\x0e\x6b\x42\xa3\x18\xd5\xab\x6a\x73\x6c\x12\x04\x3d\x56\x9c\x4d\xc8\x31\x2d\x59\x71\x4c\x75\xca\x9d\x07\xf2\xb0\xca\x54\xc3\x46\xd3\x11\xd9\xff\x14\x85\xc9\x9c\x4b\xf3\x81\x99\xfd\x6e\x7b\xb3\x1e\x21\x78\x54\x12\xd0\x5b\x1d\x79\xf8\xc2\xf7\xbc\xea\xbd\x21\x5c\x71\xb1\x77\xe2\x4a\xaf\xae\x4b\x73\xdf\x35\x6e\x5f\xe0\x5a\x81\x79\x32\xeb\x7a\x91\x1f\xa8\x75\x71\xdf\xe5\x5d\xe7\xda\x6e\xe9\xc2\x6e\x72\x55\x1f\x78\xfb\x30\xc5\xe5\x52\x53\xcf\x9d\x8d\xf8\xdc\x52\xa7\xc1\x57\x14\xc7\xc6\x63\x27\x2a\xae\xad\x92\x97\x52\x30\xda\x6e\xfd\x28\x77\xa8\xf7\x7e\xbf\x42\xf2\x1f\xae\xe6\xf3\x7d\x6b\x53\xe5\xe0\x7f\xb3\x18\xf0\x94\xe1\x72\x27\x7e\x55\x67\x80\x09\xfd\x6f\xe0\x2f\xf4\xee\x07\xc8\x5a\xf8\x71\x60\x24\xa9\x14\xbb\x86\x3c\x0a\x01\xf9\xa1\x8c\x08\xa6\xed\x45\x39\x5c\xb1\xfc\x9a\x2a\xdb\x7a\xea\xda\xc3\xaa\xf4\x83\x6a\x32\x79\xf8\x68\xfd\x43\xab\x0e\x18\xc7\xba\x5a\xe1\x1a\x5a\xf7\x06\xea\xe0\xc3\x3a\xd5\x06\x93\x3d\x28\x60\x6e\x38\xdf\x72\xc3\xf3\xe2\x58\x68\x55\x63\x7f\xf2\x09\xe8\x39\x46\x5a\x64\x96\x2a\x67\xd0\x85\x09\xc9\x7c\x68\x94\x17\x1b\x99\x3f\x2d\xd2\x40\x88\xb9\x6f\x63\x78\xaa\xd7\xaa\x6b\x9e\x6e\xcf\x1f\x2c\x0a\xb7\xf6\x7c\x3b\x50\xe1\xee\x41\x04\x7a\xdc\x92\x57\x38\x1e\xc2\xba\xed\xe3\xdb\x3a\xd5\x4e\x57\xe2\xd8\x23\x15\x1b\xd4\x4c\x5d\xb3\xbc\xe5\x61\x74\xdd\xd0\xda\x9f\x45\xfe\xe8\x66\x7e\xb7\xed\xe4\xbf\xfe\xfb\x7f\xfc\xbf\x00\x00\x00\xff\xff\xe0\x67\x7b\x8a\xc4\xcb\x0b\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x23\xb9\x95\x27\x0c\xff\xef\x4f\x81\x90\x7b\x5e\x49\x63\x91\xaa\xb2\xc7\x7e\x3d\xb5\xb3\xe3\xd0\x56\x55\x77\xeb\xe9\x2e\x95\x42\x92\xdb\x8f\xa3\xdd\x6b\x83\x99\x87\x24\x46\x99\x40\x0e\x80\xa4\x8a\xde\xde\xef\xfe\x04\x0e\x80\xbc\xf0\x22\x91\x09\x48\xcc\xaa\x4e\x38\xc2\x5d\x22\x93\xc0\x49\x5c\x0e\xce\xf5\x77\x68\xc1\x7e\x00\xa9\x98\xe0\x6f\x08\x2d\x18\x7c\xd2\xc0\xcd\x5f\x6a\x7c\xff\x47\x35\x66\xe2\x7c\xf1\xfa\x57\xf7\x8c\xa7\x6f\xc8\xdb\x52\x69\x91\xdf\x80\x12\xa5\x4c\xe0\x1d\x4c\x19\x67\x9a\x09\xfe\xab\x1c\x34\x4d\xa9\xa6\x6f\x7e\x45\x08\xe5\x5c\x68\x6a\x3e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x34\x03\x3e\xbe\x2f\x27\x30\x29\x59\x96\x82\xc4\xce\xfd\xd0\x8b\x57\xe3\xd7\x7f\x1c\xbf\xfa\x15\x21\x9c\xe6\xf0\x86\x24\x59\xa9\x34\x48\x05\x72\xc1\x12\x70\x8f\xa9\xb1\x28\x40\x52\x2d\xa4\x1a\x27\x42\x82\x30\xff\xc9\x7f\xa5\x0a\x48\xcc\x60\x33\x29\xca\xe2\x0d\xd9\xf8\x8c\xed\xd7\xd3\x44\x35\xcc\x84\x64\xfe\x6f\x42\x46\x44\x64\x39\xfe\xdb\xbd\xab\x1d\xfe\xd6\x0e\xef\x26\x08\xbf\xcf\x98\xd2\xdf\x6d\x7f\xe6\x7b\xa6\x34\x3e\x57\x64\xa5\xa4\xd9\xb6\x17\xc1\x47\xd4\x5c\x48\x7d\x55\x93\x65\xc8\x48\xd4\xa2\xf9\x6f\xf7\x20\xe3\xb3\x32\xa3\x72\x4b\x6f\xbf\x22\x44\x25\xa2\x80\x37\x04\x3b\x2b\x68\x02\xe9\xaf\x08\xf1\x63\xd9\xce\x47\x84\xa6\x29\xae\x17\xcd\xae\x25\xe3\x1a\xe4\x5b\x91\x95\x39\xaf\x06\x37\xcf\xa4\xa0\x12\xc9\x0a\x8d\x6b\x72\x37\x07\x9c\x35\x22\xa6\x44\xcf\x81\xbc\xbd\xfd\xa1\x7a\x94\x90\xff\x52\x82\x5f\x53\x3d\x7f\x43\xc6\x66\x01\xc6\x29\x53\x45\x46\x97\x86\x84\xc6\x53\x76\x35\xdf\xd9\xef\x1a\x9f\xeb\xa5\xa1\x57\x69\xc9\xf8\xec\xb1\xf1\xdd\x4b\xec\x46\xc2\xa2\xb1\x4e\xcd\xe1\x7f\x58\xfb\x7c\xd7\xe1\xfd\xeb\x53\x33\x32\xd1\x73\xaa\x89\x9e\x33\x45\x04\x07\x22\xa1\xc8\x68\x02\xea\x11\x82\x36\x3c\x62\x29\xba\x59\xff\x62\x0b\x49\xcd\x2e\x35\xd5\xa5\x1a\x17\x73\xaa\xd6\xa7\xf8\x7a\xe5\xd3\x0d\xdd\xd9\x07\x17\xaf\x69\x56\xcc\xe9\x6b\xf7\xa1\x4a\xe6\x90\xd3\x7a\x0f\x88\x02\xf8\xc5\xf5\xe5\x0f\xbf\xbb\x5d\xf9\x82\xb4\x67\x67\xe3\xee\x27\x4c\x99\xa9\x42\x46\x41\x3c\xa7\xc0\xb5\x5b\x16\x40\xfe\xb1\xf1\x37\xb7\x05\x24\xff\x18\xaf\x51\x2e\x26\xff\x05\x89\x6e\x7c\x2c\xe1\xbf\x4b\x26\x21\x6d\x52\x64\x26\xc8\x73\x9f\x95\x8f\xcd\xfc\x37\x3e\x2a\xa4\x61\x0b\xba\x71\xe4\x6d\x6b\xb0\xbf\xd6\xe7\x2b\x6f\xfb\xf3\x68\xe5\x5b\x42\xcc\x24\xb9\xb7\x4e\x0d\x2f\x04\x85\x3b\xd4\xed\x41\x48\xdd\xcc\xda\x9d\xcb\x94\xd9\x2e\x12\x14\x70\xcb\x1d\x71\x53\x71\xf7\x96\xe3\xb5\xce\xcd\x14\x81\x54\x86\x45\x94\x59\x6a\x98\xe8\x02\xa4\x26\x12\x12\x31\xe3\xec\x9f\x55\xef\x8a\x68\x81\xc3\x66\x54\x83\xd2\x04\xcf\x35\xa7\x19\x59\xd0\xac\x84\x33\x42\x79\xba\xd6\x77\x4e\x97\x44\x82\x19\x97\x94\xbc\xd1\x23\xfe\x44\xad\xd3\xf2\x41\x48\x20\x8c\x4f\xc5\x1b\x32\xd7\xba\x50\x6f\xce\xcf\x67\x4c\xfb\xeb\x21\x11\x79\x5e\x72\xa6\x97\xe7\xc8\xe9\xd9\xa4\x34\xac\xf7\x3c\x85\x05\x64\xe7\x8a\xcd\x46\x54\x26\x73\xa6\x21\xd1\xa5\x84\x73\x5a\xb0\x11\xbe\x0c\xc7\x2b\x62\x9c\xa7\xbf\x96\x6e\x9b\xa8\x95\x81\x37\x9e\x07\xe2\x39\xf4\x9e\x8b\x65\x38\xb6\xdd\x9c\xb6\x43\xfb\xb2\xf5\x9a\x98\x8f\xcc\x34\xde\xbc\xbf\xbd\x23\x9e\x22\x77\xd4\x71\x89\xea\x47\x37\xcc\x90\x5f\x2d\x33\xb3\x8c\x4f\x41\xda\x5f\x4e\xa5\xc8\xb1\x57\xe0\x69\x21\x18\xd7\xf8\x47\x92\x31\xe0\x9a\xa8\x72\x92\x33\xad\x70\x5b\x83\xd2\x66\x21\xd7\x3b\x7e\x8b\xd7\x29\x99\x00\x29\x8b\x94\x6a\x48\xd7\x1f\xb9\xe4\xe4\x2d\xcd\x21\x7b\x4b\x15\xbc\xf8\xda\x99\x35\x52\x23\xb3\x20\x3b\xaf\x5e\x53\x58\x58\xff\xc1\xda\xa9\x27\xc4\xdf\xee\xfb\x2c\xf7\x56\x46\x43\x52\x48\x32\x2a\xad\x80\x42\x34\x64\x19\xf9\xf8\xfd\x07\x32\x17\x0f\xe6\x20\x31\xae\x34\xcd\x32\x3c\x98\x4e\x88\x58\xeb\x1a\xef\x80\x84\x72\x92\x53\x4e\x67\x40\x68\x51\x28\x32\x15\x92\x50\x32\x63\x0b\xe0\x9e\x01\xac\xae\xc5\xd6\xf7\xdb\xc6\xd9\x88\xbd\x91\x36\xde\xaa\xfe\x5b\x47\xf0\xca\x37\xdb\x78\x9d\x69\x6b\xf2\xd9\x7e\x13\x6b\xda\x45\xdd\x05\x1e\x29\x4e\x4a\xae\xb4\x2c\x71\x97\xa4\xe4\x1e\x96\xee\x74\xe5\xb4\x20\x4a\x0b\xf3\xe1\x03\xd3\x73\x42\x9b\x27\x8b\x6a\x3c\x2e\x93\xf5\xd7\x32\x4d\x81\x26\x93\x25\x31\xd2\x28\xb2\x33\x2d\x44\x86\xbc\x0e\xfb\x33\x6c\x8d\x48\xd0\x92\xc1\x02\x08\x95\x13\xa6\x25\x95\xcb\x6a\x6f\xad\x9f\x83\x47\xe7\x1f\xe7\xa5\x21\x1c\x6d\x9f\x3d\xf2\xd8\xce\x26\xf6\x3a\x71\xb2\x59\x5a\xc9\xc7\xdd\x27\xfa\xfa\xd2\xed\xe0\x5a\xd8\x56\x6e\x07\x83\x22\x66\xa7\x3a\xb1\xa8\x92\xda\x91\x00\xb7\x35\x53\x22\x64\xb5\xb7\xc8\x64\xb9\x71\x8c\xc6\x56\x27\x13\x30\x6c\x50\x52\x6e\xa6\x7e\xe3\x11\xea\x30\xb1\x8f\x6d\x46\xd3\xc4\x03\xdf\xb4\xf3\x9b\x7d\x53\x29\xe9\x66\xea\x09\x61\x1a\xf2\x2d\x3d\x93\xd5\x69\x6e\xce\x67\xf5\xb1\x21\x70\xc1\x52\x30\x13\xab\x29\xb3\xbb\xcc\xf0\x04\x3a\x11\xa5\xb6\xf3\xe9\x1e\x49\xc9\x82\x51\x42\x67\x33\x09\x33\xdc\xff\x5b\x87\x7d\x62\x4e\x6c\xdb\x7e\xec\xeb\x36\xb2\x4a\xcd\xa3\x4f\x18\xf6\xfb\xe8\x03\x7c\x13\xf3\x68\x3e\xb0\x2e\x37\xb7\xdb\x53\x6b\x68\x1b\x4d\xcc\x9c\xf8\xa9\x15\xf2\xd1\x87\x77\x59\x5b\xdb\x9e\x58\x61\xdb\xda\xeb\xbc\x42\x88\xfb\x76\x62\xce\x4c\x7d\x01\x18\xce\x81\x0f\xd6\x2c\x7d\x02\xa4\x00\x39\x15\x32\x37\x87\x87\x13\x4a\x12\x2b\xca\x56\x7c\x0b\x19\x2e\x4f\x1e\x9b\x4e\xb2\xeb\xfa\xdb\xb6\xcb\x2e\xb0\x6d\x44\x0a\xaa\xe7\x4f\x3c\xb6\xdb\x52\xd9\xd6\x9c\xb4\x27\x1f\x7e\x82\xf1\xad\xf5\x5d\xdf\x5b\xd1\xfb\x36\xd3\x10\xbd\x53\xbc\xb2\x76\xe9\x75\x17\xce\xbd\xda\x6e\xe8\xc3\x07\x50\xca\xc8\x0b\x28\x84\x4a\xfa\x40\x80\x27\xc2\xf0\x94\xff\xe7\xf6\xe3\x95\x1d\x7d\x13\x77\x5d\x6f\x97\x9a\xb0\xbc\xc8\x20\x37\xb2\x28\xf9\xf1\x03\x95\x6a\x4e\x33\x90\x3f\xe1\xad\xf8\xe3\x9f\x79\xde\xfe\x24\xa1\xdb\x0f\x76\xb3\x19\x21\x53\x41\x6a\xd8\x5f\x0a\x19\x5d\x5a\xc2\x52\x48\x44\x6a\xae\x05\x21\x49\x61\x94\x85\xbc\x28\x35\x10\x6a\xbf\xc5\x77\x60\x7c\xb6\x0b\xe5\x7b\xad\x06\x31\x22\x55\x4e\xf5\x1b\x32\x59\xea\xa7\x4e\x1b\x21\x9f\x46\xe9\xae\x6c\xa7\x49\xcc\xd3\xcc\xc7\xb6\x9d\x58\x50\xb3\xe3\x27\xdf\xd2\xc8\xdb\x94\x71\x90\xd7\x42\xea\x5d\xf8\xa4\x51\xec\x66\xb0\x2e\x8e\x36\x9b\x9f\x32\xc6\xf5\xef\x7e\xfb\xc8\x93\x29\x14\x99\x58\x9a\xfd\xf3\xf4\xf1\xdc\xf1\x7d\x76\x66\x25\xbb\xf6\xb7\x2b\xfb\xd8\xb1\x3f\x6b\x1a\x8c\xd1\xd3\x26\xed\xb3\x53\x47\x3c\xd6\xbb\x55\x0a\xf4\xc1\xee\xdb\xeb\x4b\x6f\xeb\xb9\x81\x29\x48\xe0\x89\xe7\x73\xd5\x9f\x5a\x10\x4a\xbe\x2b\x27\x20\x39\x68\x50\x0d\x4d\x60\x59\x80\x37\xac\x81\xfd\x81\x04\x49\x4a\xcd\x32\xf6\xcf\x4d\xe6\x88\x4d\x6f\x15\xfd\xa6\x7d\x42\xa6\xf2\x8f\x3d\x21\x59\xf9\xc7\x9e\x92\xaf\x6c\xdb\xe7\xea\x7e\x7a\x17\xda\xd6\x5a\x27\x34\x82\x38\x8d\xa1\x5a\x99\xb4\xbd\x14\xd1\x39\xf9\xd3\xdb\x7c\x03\xa5\xd7\x68\x3c\x6f\x19\x9f\xb7\x11\x4c\x4e\xb6\xf9\x25\xc6\x46\xe1\x1f\xa3\x49\xfc\xc7\x9f\xc6\xb6\xcb\xd3\x31\x79\x9f\x17\x7a\xe9\xcd\x40\xec\x89\xce\x99\x22\x5c\xe8\x75\x41\x30\xfa\x34\x2d\x36\x1b\x21\x9f\x9c\xa9\x8b\xeb\x4b\x6f\xde\x7e\xc1\xa5\x55\x05\x24\x3d\x10\xf4\x6f\x5b\x64\xb4\xc4\xfc\x29\x83\x2c\x25\xcc\xc8\xf0\x86\x58\x32\xc9\x44\x72\xef\x2c\xf9\x37\xef\x88\x12\x96\xe7\x18\x45\xcf\x48\xfe\x89\xe0\xaa\xcc\x81\xb0\xa7\x98\xc8\x20\xd9\x0f\x92\x7d\xb3\x0d\x92\xfd\x20\xd9\xb7\x9a\x75\xd2\xf5\x81\x39\xae\x10\xb2\x95\x3d\xe2\x73\x03\x83\x7c\xac\x0d\x0c\x12\xdb\xc0\x20\x07\x06\xf9\x54\xc7\x4f\xbe\xe5\x4e\x92\xee\x93\x7d\x3d\xc5\x3b\x06\xcf\xc1\xe0\x39\x18\x3c\x07\xae\x0d\xd7\xa7\x6b\xc3\xf5\x39\x5c\x9f\xed\xf6\xd9\x5d\x9f\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xd0\x6c\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xb0\xa5\x0d\x92\x7d\xc7\x4e\x07\xc9\x7e\x90\xec\xb7\xb5\xc1\x73\x30\x78\x0e\x06\x06\x39\x30\xc8\x81\x41\x6e\x69\x7d\xf4\x1c\x24\x19\x50\xbe\x59\x9d\x5f\x49\x6e\xc4\xe7\x50\x00\x64\x53\xe6\x52\xfb\xdc\xaf\xc9\x04\xe6\x74\xc1\x44\x29\xc9\xc3\x1c\xb8\xcf\x4b\x25\x33\xd0\xca\xec\x02\xd0\xb0\x49\x03\x7c\x82\xbd\x3d\xce\xd2\x46\x04\x38\x9d\x64\x1b\x3b\x7e\x8a\x7b\xb9\x5f\x3e\xee\x29\x99\x08\x61\xde\x6e\x7d\xc6\x50\x7b\xf1\xda\x40\x84\xa4\x96\x6d\x3a\xd7\xe6\xc4\x96\xb7\x37\xef\x9e\x35\x9d\x65\x63\x27\x97\xd5\xd8\x04\x5d\x38\x98\xf6\x67\xae\x3c\xf3\xe9\xc7\x07\x0e\x29\x66\x81\x9f\x11\xa6\xcd\x03\x86\xb1\xb0\x84\xe9\x6c\x59\x91\xf7\x79\xe7\xc9\xbc\xbd\x79\xb7\xbb\x9b\xcb\xaf\xd2\xd6\xae\x23\x7a\xb4\x06\x7f\xd5\xe0\xaf\xaa\xda\x20\xb4\x75\xec\x74\x10\xda\x06\xa1\x6d\x5b\x8b\x2f\xb4\xf5\xdd\xbf\x33\x78\x65\xc8\xe0\x95\xf1\x8f\x0d\x5e\x99\x27\x1f\x1f\xbc\x32\x83\x57\x66\xf0\xca\x3c\xde\x06\xf9\xd5\xb5\x41\x7e\x1d\xe4\xd7\x76\xfb\xec\xe4\xd7\xc1\x2b\x33\x30\xc8\x81\x41\xd6\x6d\x60\x90\x03\x83\x6c\xb5\xcf\x31\x9f\x63\xb0\x70\x0f\x16\xee\xc1\xc2\x3d\x5c\x80\xc3\x05\x38\x5c\x80\x4f\x75\x3c\x58\xb8\x7d\x1b\x2c\xdc\x83\x85\xbb\xd5\x06\x0b\xf7\x60\xe1\x1e\x2c\xdc\x83\x85\x7b\x4b\x1b\xe4\xd7\x8e\x9d\x0e\xf2\xeb\x20\xbf\x6e\x6b\x83\x85\x7b\xb0\x70\x0f\x0c\x72\x60\x90\x03\x83\xdc\xd2\xfa\x68\xe1\x7e\xe2\xf0\xee\xb2\x4b\x9b\xf6\x6a\x27\x36\xfb\x48\xf7\x31\x79\x4b\x39\x61\x3c\xc9\xca\x14\xf0\x9b\x29\x50\x5d\x4a\x50\x67\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x94\x50\x05\xca\xf5\xb1\x71\xa8\xaa\xdf\x0d\xdf\x3e\xfe\x9a\x8f\xf3\x91\x47\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x9b\x0c\x96\xec\x30\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7c\xed\x6d\x5b\xf0\x91\x2d\xf7\xe4\xe5\xf2\xd4\x95\x32\x22\x13\xaa\xe0\x0f\xff\xb6\x56\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\x8d\x4f\x3c\x7d\xcd\xd4\x43\x6c\xdf\xe4\x3b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\xa5\xed\xe3\x56\x4b\xaa\x61\xb6\x6c\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x4b\x09\x33\xaf\x81\x6e\x1c\xe2\x61\x0e\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x95\xff\xe3\xc7\xd9\xf0\xf5\x53\xeb\xbb\xa9\x82\x92\x6f\xbb\x5e\x90\x7e\x3e\xdf\x59\x0f\xd9\xbb\x0a\x08\x66\x75\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xed\x7f\x65\xd9\xb6\xdd\x51\x3b\xc8\x6a\x4f\xcb\x68\xa3\x06\x8e\xcd\x36\xaf\xde\x2e\xa2\x99\x2b\xc6\x78\x0d\x32\x67\x4a\x6d\x4b\x8a\x6a\x93\xfe\xd4\x2d\xb6\xc3\xed\xb5\x22\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x42\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xe3\xf6\xde\xe1\xee\xdb\x41\x82\xde\x55\x7e\x1e\x59\x3a\x9f\x7c\xca\xbd\xc3\x85\x7d\x85\x8d\x45\xb2\x9a\x6d\x77\x79\x1b\x87\x7f\x5a\x88\xd8\x47\x32\xd9\x59\x2e\xe9\x22\xb3\x5e\x8b\x8c\x25\xcb\x9b\x32\x03\x32\x17\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x33\x32\x29\x35\x49\x05\x58\xb3\xa1\x43\x97\x6a\xfe\x7c\xa7\xf1\xad\xa7\xfc\x61\x6e\x8b\x11\x9a\x8e\x09\x2d\x8a\x0c\x33\x27\x85\x11\x3c\x1e\xe6\x2c\x99\xdb\x1a\xac\x05\x4d\x60\xd3\x63\xbb\xcb\xa5\x3b\xe9\x6a\x64\x2f\x7d\x8d\x78\xb3\xf7\xe4\xa9\x5d\x47\xf6\x54\xdc\x88\x2d\x0b\xf6\x8d\x14\x65\xb1\xe3\xe3\xdd\xf6\x00\xb1\x25\xc3\xec\x40\xe6\x3a\xd2\x2b\x22\x96\xff\xd2\x39\xc9\xed\x52\x2b\x67\x81\x75\x1e\x99\x31\xa6\x3f\xe6\x65\xa6\x59\x91\xe1\x4f\x2c\x02\x96\x22\x54\x42\x7d\xc1\x9d\x11\xca\x97\xde\xe7\xee\x4a\x18\x42\x4a\xe8\xcc\xf4\xa8\xb1\x3c\xaa\x98\xee\x4c\xb5\xad\x91\x58\xe6\x46\xfe\x6a\xd8\x80\x15\xaa\xfb\x7c\x59\x53\x41\x1e\x58\x96\x19\xe5\x87\x66\x99\x78\x80\x74\x4c\x8e\x8e\x56\x2f\xa0\x44\xc8\x06\xdd\xc8\xea\x8e\xfe\xb5\xf5\x94\xe1\x6b\xf5\x8b\xed\xa6\xc8\xed\xab\x85\x90\xfd\x34\x11\xb2\xbf\xce\x45\x50\x95\xba\xaf\x1c\x54\xa3\x8c\x29\x3d\x72\x54\x6a\x91\xb3\x64\xa7\x4e\xb8\xe0\xde\x11\xf1\xe7\x9b\xef\x9f\x7d\x83\x5e\xb5\x87\x73\x35\x39\x41\x9b\x3d\x5a\x50\xa9\x19\xcd\x48\x29\x33\x65\xf7\x28\x35\x0a\x8b\xf4\x55\x50\xe7\x14\xe3\x3c\x12\x50\xc8\x2e\x08\xf9\x57\xbb\x2b\xdd\x66\xb0\xac\x4c\xf0\x6c\x49\xa8\xdd\x0a\xd3\x32\xcb\xce\xc8\x94\x71\x6a\x2e\x32\x28\x7c\x0e\xef\x0e\xa6\x99\xba\xdd\x32\x9e\x80\x99\xa6\x51\xe5\x9b\x40\xca\xcd\xc8\x86\x65\x56\x3c\x2d\x3d\x73\x65\x3f\xad\xa5\x4a\x39\x52\x0c\x7f\x4b\xe8\x24\x03\xd4\x34\x9c\xcc\x79\x23\x32\x74\x29\x56\x7e\x0f\xac\x15\x4a\x9b\x5f\xff\x2f\xc6\x77\xd5\xd6\x6d\xbb\xc1\xab\x3d\xa1\x9c\x00\xd3\x73\x90\x38\xf4\xd2\xf0\x5f\xb3\xd9\xeb\x43\x75\xa2\xca\x64\x6e\xa6\xe8\xa8\x10\xa9\x3a\x32\xdc\xf9\x48\x41\x22\x41\xab\xa3\x53\xf3\xd7\xea\xbb\xe2\x7c\x35\x7f\x77\x4e\x0b\x76\x74\x7a\x46\x70\xc2\xb1\x40\xa9\xd0\xf3\x5f\xf8\x39\xf2\x13\xd6\xaa\xe7\xfd\x54\x6b\x9d\xa2\x9b\x66\x0f\xae\xb2\xa6\x28\x6c\x51\x4a\x73\x7f\x6a\xc0\xb4\x73\x73\x52\x70\xcf\x35\x7c\xd0\x2b\x17\x29\x21\x17\x9c\x80\xf5\x1a\x82\x26\x39\x50\xee\x9e\x86\x05\xc8\xa5\x9e\xa3\x23\x51\x55\x5c\x74\x58\xb9\x1d\xa2\x11\xea\xb6\x71\xd5\x1c\x2b\xf3\x2b\x54\x1f\x37\x5b\xfc\x79\x75\x85\x8e\xff\xf5\x78\xf5\x4a\xaa\xef\xe0\x5f\xf6\x7a\xa0\x10\xd6\x69\x2d\x7e\x30\xbf\x6c\xaf\x83\xfd\xc8\x5e\x26\x15\x3b\xfc\xfe\x7b\x5b\xec\xd9\x4d\xf8\x77\x8c\xa7\xaa\x02\x56\x4d\xed\x2d\xe1\x16\x6d\xe3\x4a\x21\x85\xbf\xd8\x55\x5a\x57\xba\x76\x55\x94\x9e\xa0\xb1\xa1\x95\xf7\x41\x91\xc6\x7a\xd1\x2d\x29\xd9\xb0\xdd\x33\xeb\x9d\x37\x62\x65\x46\x27\x90\x29\x67\x40\x84\x06\xf9\xe4\xe2\xfb\x0f\x55\xe9\x76\x09\xf4\x09\xa3\xf8\x33\xa8\xcf\x3b\x84\xf9\xac\x95\xc8\x5f\x6f\xbb\xab\x39\x38\x15\xfb\x39\xb1\xc8\x2d\x68\x7b\x56\x73\x5a\x98\xa3\x6a\xfb\xb0\xce\x95\x15\xc7\xc9\xf7\x38\xd3\x4f\x9f\xb8\xbd\xd4\xc3\xdd\x4b\x3e\x6f\x1a\x64\xa7\xf3\xb6\x5b\x28\xd1\x1e\x1d\x3e\x66\xca\xab\x5b\x6b\x9a\x57\x36\xb4\xd3\x0b\x9d\x26\x97\xd0\xa6\x43\x21\x05\x65\xc1\x75\x2c\xc0\x91\xf4\x9f\xd7\x5d\x44\x5e\x82\x7d\xf4\xf3\x11\x51\x90\x41\xb2\xa9\x26\xfb\xa6\x87\x35\xe4\x45\xf6\xd4\xc9\x23\x7b\xeb\xf2\x39\xe3\x37\x40\xd3\xe5\x2d\x24\x82\xa7\x3b\x72\xe9\x6e\xca\xd2\x07\xc6\x59\x5e\xe6\x84\x97\xf9\x04\x70\x2d\x94\x1d\x14\x39\x8e\x35\xa8\x50\xc2\xe1\x21\x5b\x3a\x2e\x93\x92\x42\xa4\x9e\xf1\x4c\x8c\x56\x4f\xd3\x5d\x2f\x9d\x07\xa6\xe7\x58\xb6\x82\x2f\xcd\x50\x4c\xd7\x37\xa2\x24\x89\xa4\xca\x08\x8d\x67\x38\x34\xd3\xe6\x16\x9d\x00\xba\xd8\x59\x0a\x66\xcb\xd0\x05\x65\x99\xd1\x72\x76\xbd\x16\xdf\xc1\x94\x96\x99\x46\xfb\xd0\x2b\x72\x62\x08\xf7\xca\xfd\xa6\x6e\x8d\xde\xa1\x84\xe0\xe6\xbf\x16\x76\x09\x5f\xee\x74\x0f\x3f\xdf\x2e\x40\xe8\xbe\xed\x0a\x88\xee\x5b\x41\x4b\xb5\xab\x99\xa9\xb5\x1b\x2e\x79\x6a\x0e\x61\x53\x9a\x6f\xdc\x23\x4c\xb9\x9e\x77\x9b\xd5\xc7\xa1\xbc\x36\x50\x2d\xc5\x4c\x82\x52\xef\x80\xa6\x19\xe3\xf0\x02\x9b\xfa\x6e\x0e\x24\xa7\x9f\x70\x63\x6b\x96\x83\x11\xb6\x9a\xdb\x9a\x36\x5f\x5f\x0b\x92\xd3\x7b\xa8\xe8\x24\x13\x98\x0a\xb9\x43\x48\x87\x6f\x4c\x35\x37\x93\xdd\xb4\x53\xca\x32\x48\xc7\x48\x49\x63\x2c\xb3\xd9\xa5\xc8\x32\x90\x76\x1f\x9a\xbf\x19\x2f\x81\x68\xb1\xe3\x60\x85\x14\x68\x9a\xb0\x03\x34\xa5\x19\x94\x16\xa8\xe9\xd2\xde\x38\x78\xd8\x08\x25\xd7\x2b\xf3\xff\xfe\x53\x82\x46\xf8\x1d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x94\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x93\x2b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x3b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xf3\xde\x6d\x9d\xf5\x3f\xbc\x7a\xb5\xa3\xe8\xfc\xfc\xa7\x56\x02\xda\x66\x9e\x75\xc3\x5f\x55\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xac\x64\x6a\x4e\x26\xa0\x1f\x00\x38\x81\x4f\x16\x5e\x6e\xc7\xf1\xfe\x09\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xba\x3f\x0b\xb0\x60\x8a\x09\xfe\x2d\x53\x5a\xc8\xe5\xf7\x2c\x67\x4f\xd4\xb4\xf0\xad\x3b\xf7\xa9\xaf\x53\x91\xa5\xe4\xc6\x6e\x81\x5b\xb0\x33\x23\x01\xdd\x1f\x5a\x58\xdb\x08\x31\x1c\x61\x42\x93\xfb\x5d\x6f\xb5\xbd\x57\x75\xdb\x7a\x75\xb8\x45\x5f\xbf\xea\xcb\xb2\x7a\x41\xed\x39\x97\x12\x55\x82\x6a\x24\xbc\x3b\xec\xc1\x7a\xff\xc9\x4e\x77\x6b\x69\x1f\xe6\x42\x01\x3e\x40\xa8\x7c\x5a\x26\x6c\xbe\x86\xf7\x89\x32\x55\x71\x5a\x8c\x57\xe1\xa0\x08\x9d\x4e\xdb\x4f\xa4\x7b\x48\xca\xb6\x5d\x6a\x92\x97\x4a\x93\x9c\xea\x64\x6e\xad\xd3\x22\xad\xa4\xd7\x63\xe5\xb4\xcc\x7d\x96\x76\x67\xf7\xd8\xfe\x8e\x2c\x62\xe9\x7c\xff\xa9\x30\x97\xc7\x53\x2e\xef\x76\x6b\xad\xf3\x6a\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\xbf\xb8\x7a\xb7\xfb\xa9\xe9\x62\x94\xd9\xdb\x2c\xd3\xdd\x47\x62\xda\xc5\x23\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x75\x46\x28\xb9\x87\xe5\x99\x95\x3c\x1a\xa0\xa8\xe6\xe1\xbd\x08\x91\x90\x39\xf1\x14\x4c\x8f\xd8\xa1\x1d\x63\xf7\xd9\xee\xb0\x31\xfd\xe0\xfb\xf8\x6f\x7d\x1b\x19\x42\xf7\xfc\x85\x9f\xa0\x3d\x7e\xb6\xff\xd9\xb1\xed\x1e\x96\xfb\xfd\x60\x65\x27\x99\x55\x70\x5a\xbc\xdd\x23\xe6\x83\x4a\x7b\xa8\xb6\xc5\x7e\x8e\xf5\x66\xeb\x60\x50\xb4\xcd\x4f\x62\xd0\xeb\xed\x79\x50\x9a\xe3\xb6\xec\xb4\x66\x5a\x8e\x95\xdd\xbf\x86\xc3\xcc\x59\x61\x73\xfa\x9c\xb7\x71\xff\x4d\x6c\xdb\x0f\x34\x63\x69\x35\xa4\xe5\x3e\x97\xfc\xcc\xc8\xd6\xe6\x3f\x78\xfd\x58\x89\xff\x9d\x00\x75\x25\x34\x7e\xf2\x62\x6b\x60\x5f\xeb\xa5\x57\xc0\x8e\xea\x9c\x56\xc8\x56\xd1\x5e\x61\x53\xd6\xdc\x4c\x7b\x5c\xe5\x3a\xd2\x53\x91\x4b\x4e\x84\x74\x53\xb7\xf7\xa0\xa6\x33\x37\xb0\x1d\x12\x2f\xd2\x89\x75\xd6\xa2\xfb\x6b\xe3\x98\x6e\x85\x84\x6c\x2d\x50\xc4\xe1\xdd\xd0\x28\x0b\xda\x6f\xd0\x5c\x51\x64\xa8\x9d\x39\xa5\x89\xfa\xd0\xaa\x1d\xbd\x22\xcd\x96\x83\x9c\xa1\x17\x3b\xd9\xd9\xeb\x5a\x11\xdd\xe1\xe2\xb3\x6d\xef\xeb\xaf\x39\x60\x87\x8d\x1c\xc5\x97\x14\xad\x1b\x94\x57\xac\x19\xba\xa3\xc4\xb3\xd7\xa9\x6a\x0c\xd7\xb2\x91\xff\x1f\x73\xa9\xe3\xa6\xfb\xbf\xa4\xa0\x4c\xaa\x31\xb9\x20\x8a\xf1\x59\x06\xad\xef\x9c\x09\xa0\xd1\xcd\x5e\x83\x17\x66\x50\x73\xf7\x2e\x68\xe6\x0c\x31\x94\x13\xb0\xe6\x78\x43\xc7\xaa\xf8\x76\xe6\x24\x6c\x73\x15\x55\xf1\x0f\x47\xf7\xb0\x3c\x3a\xdb\x1a\x66\xbe\xb9\x35\x4f\xea\xd1\x25\x3f\xb2\x22\xcc\xda\x59\xab\xe4\x1d\x0c\xb2\x38\xc2\xef\x8e\x62\xca\x86\x7b\xca\x2a\x5d\x9d\x09\xed\x41\xf7\x38\x26\xad\x5d\x9d\xd3\x62\xdf\x4d\xed\x03\x3b\x3b\xe8\x68\x77\xab\xc6\x25\x17\x01\xad\x05\x29\x15\x58\x35\x1a\x99\x1d\x01\xaf\x8b\xa1\xe6\x85\x56\x2f\x0e\x0f\xa8\x3b\xf5\x46\xa1\x31\x2a\x3e\xe3\xb3\x3f\x17\x29\xd5\x3b\xe5\x14\xd9\xd6\xfd\x6c\xdf\xd8\x01\x49\x89\x23\x9a\x9d\x3c\x65\x33\x52\x50\x49\x73\x35\x26\xd7\xae\xdc\x00\xee\x6b\x36\x6d\xba\x6f\xdc\x3c\xdf\x2d\x0b\x20\xff\x73\xff\x01\xed\x1b\x3e\xf3\x39\xe8\x26\x14\xe7\xf4\xd3\x6d\x29\x67\x7b\x4c\x3f\x09\x16\x5a\x9a\x96\xe8\xda\x26\x84\x1b\xb5\x09\x22\xa4\x92\x39\xa4\x65\x06\x29\xa1\x13\xb1\x80\x96\x9f\xac\xfa\xd9\x9e\x43\xa3\xa1\x62\xcf\xdf\xfc\x60\x38\x9c\x27\xca\x08\x59\x13\x25\xb2\x52\x57\xf6\xac\x13\xf8\xf4\x86\xfc\x1e\xe3\xb7\x28\x29\x40\x26\xc0\x35\x9d\xc1\xaa\xe1\xd1\x3e\xf7\xfa\xd5\xbf\x9c\xee\x4b\x00\x8a\x33\x66\x7c\x67\x06\x7e\x65\x76\xe7\x07\xfa\xe9\xcf\xbc\x76\xd2\x30\x45\x76\x34\x42\xd5\xed\x62\xe5\x45\x70\x94\x2c\x29\x33\x34\x31\x63\x5c\x5c\xe3\x75\x26\x4b\x22\x45\x89\x91\x71\xa4\x2c\xf6\x1d\xab\x69\x2e\xfb\xed\xef\xff\x65\xdf\x9f\xbf\xff\x44\xf3\x22\x83\x37\xbe\xee\x8b\xb5\xf5\x19\x7d\x42\x0b\xf2\xbb\x57\xff\x72\x66\xa3\x04\xe0\xa1\x61\x7b\xaa\xf7\x11\x35\x9b\xa8\x2c\x08\xcb\x6d\x9e\x0c\x64\x4b\xec\x68\x5f\x09\xce\x5c\x71\x6d\x16\xa2\x34\x95\x5a\x9d\x11\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x56\xcc\x9d\x68\x68\x84\x07\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x93\x8a\xd7\xbf\x7b\xf5\x2f\xeb\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x09\x00\x27\xf7\x2c\xcb\x20\xdd\x57\xc4\x7e\x6a\x22\xa7\xa5\xd4\x73\x90\x67\x04\xb8\xf2\x9e\x08\xf3\xee\x2b\xef\x8d\xb4\xc8\x92\xf3\xfd\x25\x50\x6a\xfd\xa1\xe8\xdc\x68\x38\x3b\xdc\xb4\x1b\xc1\x4c\x93\x5c\x28\xbd\x79\x3a\xf6\x1a\x8c\xf2\xe5\xc7\xe9\xbe\xe2\xf5\xa8\x83\x31\x77\xfd\xd7\x1d\x84\xf3\x96\xf4\xc1\xb8\x1e\x09\x39\xb2\xdd\xbc\x21\x5a\x96\xfb\x08\x7c\x79\x8b\x85\xf4\xf0\x06\x28\x1b\x0c\x6e\x6d\x13\x7c\x76\x6c\xbc\x3b\xbb\x4d\xc5\x03\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x11\x16\xde\xf6\x0c\xad\x70\x1e\x33\x0f\xe6\xe9\xff\xff\xfa\x91\xdf\x57\xa5\x5e\xb9\x09\xb6\xf3\x76\xc7\x5a\x2b\xd6\x6d\xd4\x1a\x0c\x80\x38\x5b\xa1\x75\x4f\x0a\x36\xbc\x59\xc5\x55\xa7\xc2\x86\x07\x9b\x4d\x60\x1e\xb0\x44\x6d\xb8\xe2\x6a\x06\xbc\xf7\x55\xb6\xe5\xaa\xb2\xef\x58\xc7\x7e\x68\x0c\xbb\x34\x6c\x58\x6d\xe3\xc3\x7b\x0e\x9d\x01\x55\x7a\xd3\x12\x0e\x5c\xfb\xc9\xf6\x78\x86\xef\x6a\x6b\xab\x8e\x46\x77\xc1\x19\xaf\xfc\x64\x98\xbc\x3e\x01\x72\x74\x03\x36\x8a\xc9\x66\x24\xb4\x94\x96\xa3\xca\x7f\x6d\x16\x3b\x48\x9f\xd9\x79\xda\xbc\x0b\xee\x59\xfd\xd1\x6e\x8c\x46\x76\x9e\xf3\x00\xba\x2b\xa8\x0a\x89\xb2\xf1\x5d\xbb\xbb\xa1\xc1\x65\x9f\xb8\x23\xec\x5f\x66\xac\x0a\x48\xc6\x12\x90\xab\xd8\xa4\x41\x6b\x57\x41\x73\xcb\x45\xf6\x40\x97\xea\xa8\x37\xaa\x79\x0e\x9a\x3e\x9e\x94\xbe\xda\xba\x0b\x04\xb7\x9a\xf2\x94\xca\xd4\xbd\xd1\xb1\xaa\x46\xdf\x87\x23\x7c\xc0\xf0\x24\x3e\x15\x6f\xc8\x5c\xeb\x42\xbd\x39\x3f\x9f\x31\x3d\xbe\xff\xa3\x1a\x33\x71\x9e\x88\x3c\x2f\x39\xd3\xcb\x73\x8c\x36\x62\x93\x52\x0b\xa9\xce\x53\x58\x40\x76\xae\xd8\x6c\x44\x65\x32\x67\x1a\x12\x5d\x4a\x38\xa7\x05\x1b\x25\x82\x2f\x80\xa3\xff\x62\x9c\xa7\xbf\xf6\x24\x3d\xaf\x0e\xdf\x62\x13\xe8\x50\x91\x0b\x18\x95\xfc\x9e\x8b\x07\x3e\x42\xf3\x9e\xda\x8b\x61\xec\x16\xb5\xea\x5b\xc0\x1a\xee\x13\xd4\x5a\x88\x3d\x6c\x82\xcf\xbe\xb2\x66\x8a\x46\x94\xa7\x23\x1b\xaa\xf5\xbc\x0b\xdc\xc5\xad\x3a\xaa\xc3\x41\x77\xa7\xae\x9b\x35\x88\x26\x9a\x2d\xa0\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x12\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\x2e\xf6\x08\x1d\xf4\xed\xd6\xb0\xe5\x3b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x95\x86\xdc\x5e\x05\x76\xb4\x6c\x49\xb4\x5c\xda\xf0\x48\x79\x4f\x98\xf6\x31\x87\x46\xbd\xbf\xc7\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5f\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xfe\x6d\x9f\x7d\x34\x45\x60\xcd\x3d\xbd\xed\xed\xf0\xdc\x69\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8e\x25\xb1\xb9\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x5e\x74\x9a\x14\xb2\x9e\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x9e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x50\xdf\xb8\xad\xde\xeb\x72\xc6\x45\xf5\xf1\xfb\x4f\x90\x94\xbb\x62\xb2\xad\xb7\x50\xb7\xbb\x6d\x46\xda\xf3\x66\x6a\x17\xbd\x6c\xa9\x37\x1c\xc2\x7f\xe1\x84\x4a\x81\xeb\xe5\xa4\x4b\x45\x35\x53\xd3\x7d\x1d\xc1\xbe\x99\x55\xad\xd6\x1d\x1a\xa1\x5c\xd5\x89\xa9\xc2\xe2\x50\x66\xb0\xf9\xd9\x4c\x23\xe7\x4c\xe6\x42\xa8\x7d\xcc\x44\xcd\x46\xed\xa6\xc3\x77\x58\x30\x61\x03\x94\x10\x73\x40\x92\xdc\xb0\x4d\x77\xc5\x37\x88\xb2\xae\xc1\xfa\x67\x6c\x5f\x5d\xdd\x37\x34\xf7\x55\x9b\xc3\x07\xe2\x98\xc1\xd1\xbd\x65\xfe\x98\xa1\xb0\xae\x34\x51\x65\x6e\x48\x79\x00\x36\x9b\x6b\x75\x46\xd8\x78\x6f\x7b\x91\x6f\xe6\x18\x01\x4d\xe6\x8d\x57\xc8\x01\x74\xab\x58\x76\xf3\xec\x35\x7d\xa0\x27\x8f\x42\x1a\x3d\xdd\x1c\xbe\xc3\x59\x25\x37\xac\x1e\x89\x8d\xdb\xe0\x8c\x80\x4e\xc6\xa7\xfb\xc7\x55\xd8\x56\x83\xd7\x99\x59\x9c\x2c\x09\xd3\x60\x2e\x63\x54\xfd\xa5\x28\x67\x76\xae\xc1\xa7\x88\xe1\x1c\x54\xd9\xf7\x18\xf6\x96\xa6\xfb\x9b\x24\x7c\x3b\xb2\x8b\x76\x64\x4e\x0c\xce\x6d\x99\x7b\xe8\x65\x5c\x01\x74\x80\x43\x85\x38\x21\x41\x15\xc2\x9a\xc9\x56\x5d\xe3\xff\x63\x4f\x07\x78\xb3\x99\xa1\x4e\xd4\x69\xbd\xb5\xe6\x6c\x36\xf7\x3b\x8b\x3a\xf9\xa0\xbd\x23\xbb\x6d\xb0\xee\x61\x21\xb6\x75\x0c\x0e\xb1\x2d\x0e\x17\x6c\x24\xbd\xd7\xc7\xb3\x71\x24\x34\xc8\xbc\x5a\x36\x3c\x35\x78\xad\x38\xb7\xb4\x2f\xe2\xee\x0e\x2b\x79\xd5\x99\x8a\x13\x73\xca\x09\x33\x1a\xa4\xe1\x53\x23\x51\x9c\x8e\xc9\x05\xe1\x65\xc5\x96\x1f\x23\x8c\x8b\x8a\x2e\xd7\x91\x21\x56\x89\xba\xaf\xae\xdc\x3a\xe4\x2a\xb5\xad\x5b\x34\x66\xb3\x8d\xdc\x0c\xc0\xd3\x65\x57\x1e\xeb\xc4\xae\x51\xc7\x0e\xc2\xc4\x02\xdf\x87\x7f\x8b\xee\x7d\xac\xc2\xa2\x5b\xbe\x52\x47\xf5\x82\xcc\xcf\x9a\x72\x7c\xc5\x03\xda\xec\xc6\xce\x45\xd7\x5d\x41\xe2\xec\x0c\x12\x69\x5e\x49\x50\x80\xf9\xe6\xb6\x32\xcb\x15\x84\x46\x6b\xb6\x5b\xf7\xe5\x64\x89\xdf\xee\x19\x7b\xbf\xbd\x85\x32\xd7\xba\x05\xb1\xd9\xba\xc5\x62\xb8\x75\x5b\xdd\xbd\x71\xa2\xd5\x23\x10\x86\xc3\xc5\x89\x61\xdf\x32\x40\x9c\xd3\x63\x5b\x38\x87\xad\xdb\xfe\x51\xf0\xdb\xfa\x89\xb6\x1c\xb1\x58\x84\x6d\x1d\xe2\xe8\x37\xb7\xb5\xe0\xb6\xe7\x09\xab\xdf\xdc\x02\xe2\x63\x37\xb5\xae\x21\xf8\x9b\x5b\x7c\x46\x61\xda\xcd\x0b\x44\xe9\x6f\x6e\x3b\xc5\xee\x9f\xb5\x03\xf7\xc9\x37\xda\x32\xa6\xef\x83\x6e\xd9\xba\x45\x5e\xf1\x6e\x01\xff\x9b\xdb\xf3\xac\xf7\xc5\xcb\xa5\x04\x6c\x6e\x07\x4e\x14\xd8\x93\xa8\xed\x04\x7d\xa3\x0d\x31\xdf\xeb\xb3\xc6\x8f\x23\x51\xd3\x20\xc1\xc2\xec\xf9\xa8\x72\xa7\x60\x9f\x39\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xf6\xb6\x73\xf6\x44\x48\x36\xc4\xe6\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xc5\x3b\x47\x3d\xe1\x6b\xeb\x8c\x3c\xa0\x8a\x60\xdd\xa1\x83\x8a\xf0\x64\x1b\x54\x84\x41\x45\x78\xba\x0d\x2a\xc2\x7a\x1b\x54\x84\x41\x45\x08\x6a\x83\x8a\xf0\x64\x1b\x54\x84\x27\xdb\xa0\x22\xd4\x6d\x50\x11\xfa\xaf\x22\x84\x66\xc8\x6e\x6e\xd6\xdf\x12\xcd\xed\xf3\x17\xeb\x6e\x5c\xf5\xf3\xa0\x72\xe3\xc3\xdc\xdb\x0e\x1f\x23\x45\xdf\x3a\x51\xe3\x0e\x9d\x44\x2e\xd9\x5b\x52\x3e\x03\xf2\x7a\xf4\xfa\xd5\xde\x49\x15\xcd\x16\x12\x9b\xde\x6c\xfb\x82\x46\xad\xb7\xe8\x3b\x63\x5b\xfc\x42\xff\x42\x7a\x1c\x67\xaf\xe2\x2a\x5a\xca\xe7\x96\xf8\x9a\xaa\x22\x41\x0e\x7a\xff\x84\x08\xdf\x9a\x8e\x69\x96\x43\x15\xf4\x66\xd9\xba\x4b\xe3\xa9\x93\x62\x05\x77\x01\x12\x66\x5b\x76\xdd\x76\x9d\xde\x36\x01\x6a\x93\xcd\x27\x60\xde\xb8\x6b\x28\x91\x26\x4a\xe4\x60\xe1\xda\xfc\xd5\x61\x5e\x17\xfc\x36\x20\x27\x30\x9e\x8d\x49\x5a\x82\x83\x41\xb0\x59\x27\xa7\x67\x8d\xe0\xcc\xae\xb1\x44\x46\xe0\x91\xf8\x1f\x33\xb1\x2e\xa6\x13\x16\xc0\x75\x49\xb3\x6c\x49\x60\xc1\x12\x5d\xad\x00\x26\x67\x31\xad\x02\xe6\x3a\x58\x15\x0d\x55\x3f\x47\x6b\xfc\xab\x9b\x78\x12\xae\x27\xae\xd1\xd1\x9d\xa7\xaf\x14\x04\xb0\x33\x34\xde\x6a\x49\xd2\x66\x34\x1b\x90\x86\xff\xc4\x83\xfb\xf1\xa6\x6b\xec\x0e\x89\x24\x8f\x04\xcb\x20\x31\x55\x03\x17\x30\x23\xa4\x0b\xe9\x59\x9f\xc1\x0d\x21\x33\x1b\xf0\x3f\xf6\xce\xcd\x6f\x37\x3d\x87\xbc\x0b\x86\xc8\xa6\x66\x68\xbb\x13\x85\xc8\xc4\x6c\xd9\xdc\x78\xae\x6e\x7f\x8d\x76\x4e\x89\x2a\x27\x4e\xb9\x35\x67\xff\x6a\x65\xa7\x0e\xc1\x1e\x5b\xdb\x10\xec\xb1\xd6\x06\x4b\xee\x60\xc9\xdd\xa3\x9f\xc1\x92\x3b\x58\x72\x07\x4b\xee\x60\xc9\xed\xda\x06\x4b\xee\x5e\x44\x0d\x96\x5c\x32\x58\x72\xb7\xb6\xc1\x92\xeb\xda\x10\xec\xb1\xb1\x0d\x2a\xc2\xbe\x6d\x50\x11\xc2\xfb\x19\x54\x84\x41\x45\x18\x54\x84\x41\x45\xe8\xda\x06\x15\x61\x2f\xa2\x06\x15\x81\x0c\x2a\xc2\xd6\x36\xa8\x08\xeb\x1d\x47\x0b\xf6\x78\x06\x72\x63\x12\x5a\x88\x34\x3a\x9c\x4b\x21\xd2\x47\xd0\x5c\xac\x2f\x3c\x11\xa3\x4c\x24\x14\x6b\x09\x32\xfb\x13\x17\x83\xa2\x68\x6e\x43\x01\xce\xc8\x3f\x05\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x03\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x07\x34\x98\x5d\xda\x80\x06\x33\xa0\xc1\x0c\x68\x30\x2f\x8b\x06\x33\xa7\xca\x95\xb8\x40\xa1\x68\x3b\x38\x4c\x83\x63\xdf\x81\xcc\x07\x6c\x98\xa7\xda\x9a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\xaf\xdb\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\x91\x3d\x3c\x82\x4c\x99\xab\x30\xb3\x72\x9a\xdd\x0c\x77\x65\x88\x3d\x01\x5c\x69\xcf\x44\x40\x4f\x87\x47\x5d\x69\xbf\x4a\xb4\x50\xa5\x66\xc4\x56\x4b\xfc\xf9\xec\x30\x58\xe2\xd8\x0b\x47\x44\xbb\x30\xa5\xef\x82\x2c\x86\xb1\xcc\x7b\x68\x7e\xbb\xdd\xab\xa6\xec\xf6\x16\xdb\xa4\xe1\x0b\x75\xfe\x77\x09\x72\x49\xc4\x02\x64\x6d\xac\xf2\x37\xad\x72\x31\xda\x88\x85\xef\xea\xd0\x86\xab\xa6\x97\x53\x8b\x32\xc5\xcb\x2c\x3b\xb3\xbd\xaf\xb2\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\xf4\xac\x62\xed\xf6\x16\xd7\x3c\x11\xd1\x38\xf1\x4c\xd6\xc3\xbe\x54\xc6\xdd\xde\x9e\xd3\xbf\x44\x62\xfb\x98\x48\x64\x3f\x13\x89\xe8\x6b\x22\x71\xfd\x4d\x24\xba\xcf\x89\xc4\xf4\x3b\x91\x17\xaf\xf4\xbb\xbd\x45\x37\x2b\xc6\x76\x45\x91\x67\x63\x30\xe4\xa5\x2b\x0a\x6f\x6f\x2f\x53\x6b\x78\x7b\x7b\x86\x5d\x10\xd3\x3d\x45\x9e\x75\x0f\x1c\xa4\xa6\xf1\xf6\xd6\x4b\xa7\xd5\xa3\x84\x3d\x7b\x1d\xe4\xed\x2d\xba\x0f\x88\x3c\x83\x1f\x88\xc4\xf6\x05\x91\xe7\x39\xb2\xcf\xec\x13\x7a\x81\x01\x3a\x55\x6f\xde\xde\x9e\x83\xe7\x1c\xb4\xe2\xf3\x63\x64\x1d\xb0\x16\xf4\xf6\x76\xf8\x2a\xd1\xdb\x5b\x64\xe9\x3c\xb4\xb2\xf4\x53\x84\x46\x61\x15\xcf\xe3\x7e\x25\xad\x73\xf1\x1d\x2c\xe3\x06\x7f\x46\x38\xb9\x1f\x5a\xd4\x79\xf5\x53\xbb\x1a\x76\xb5\xd4\x8e\xbe\x36\x2b\xb0\x3b\x1f\x81\xab\x88\x9d\x65\xc1\x34\x4c\x80\x68\x7a\x0f\x18\x71\x21\xb0\x1c\x09\x4b\xc1\xd6\xad\xb1\x5b\x1d\xc7\x37\x5b\xbc\x54\x90\x1a\x42\x32\x21\xee\xcb\xc2\x1f\x15\x4c\x2b\x8e\x71\x30\x19\x4f\x44\xee\xf3\xa7\x6d\x36\x9d\x39\xf1\x8e\x17\x8c\x6c\x9d\x31\xfb\x39\x92\x83\x97\xb4\x33\xaa\xfe\xa3\x65\xe4\xfb\x07\xa1\x8a\xfc\x03\xd5\x1f\x4e\x4e\xf0\x87\xa7\xff\x08\x0f\xcd\xac\x96\xc0\xfa\xe5\x44\x89\x1c\x76\xa5\x48\x79\x7b\x75\x1e\x9b\xdd\x60\x82\x7c\x6d\x94\xe6\xc4\x1d\x5b\x7f\xfa\x09\xe5\x9a\x9d\x56\xa6\xe8\x31\xc1\xfd\x85\xba\x5f\x2a\xf8\xb1\xb6\x54\x7b\xae\xef\x3b\x08\x8f\xc8\xac\x56\xae\x8e\xec\xb1\x1e\xee\xb1\x2b\xfb\x6e\xab\xf0\x55\x35\xe3\xac\x8c\x17\x3c\xee\x9d\x8f\x1d\x70\x2a\xef\x54\xc8\x09\x4b\x53\xc0\x42\x9b\xd5\xab\x4e\x84\x87\xc6\xa8\x8f\x9c\xe1\xfb\xad\xbd\x13\x4e\xcc\x45\xa6\xc4\xd9\xea\x38\x09\xe5\x1e\xfc\x00\xb4\xad\xd6\xd9\x1a\x96\x30\x65\x96\x45\x41\xb0\xfa\xd5\xbb\xf0\xf0\xe7\xba\x27\x22\xa7\x08\x30\xd5\xf3\xbb\x62\x95\xc0\xe1\xba\x88\x7e\x5d\x70\xa1\x87\x1b\x63\xb8\x31\x56\x6e\x8c\xb5\x83\xf7\x7c\x97\xc6\xda\x50\xc3\xbd\xd1\xf3\x7b\x83\xd3\x1c\x54\x41\x13\xf8\x8c\x3c\xcc\xd6\xfc\x6f\xf3\xd6\x3c\xf9\xaa\x51\x4e\x1b\x64\x1e\xd5\x2b\xe0\xa1\x6a\xf0\xc6\xc2\x7e\x53\x1f\x0a\x55\xf2\x46\xad\xd5\x06\x31\x96\x6f\xae\x46\xfd\x05\x53\xe2\xd5\x7c\xc1\x41\xa1\xf3\x15\xaa\xd8\xd3\xc6\xe0\x38\x56\xf8\x6b\x23\x04\x4d\xed\x66\xe1\xe9\x2a\x28\x4d\x3d\x22\xfa\x81\x73\xa0\x5c\x91\x23\x1f\x14\x7b\xac\xea\x27\x76\x2c\xaa\xfc\x58\xab\xca\x5b\x55\x14\x9d\xfc\x9f\xff\x7b\xda\x2a\x69\x55\x13\x34\x78\xf9\x77\x6e\x83\x97\x3f\xa8\x0d\x5e\xfe\xc1\xcb\x1f\xa3\xaf\xc1\xcb\x3f\x78\xf9\x37\xb6\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\xe0\xe5\x5f\x6f\x83\x97\x7f\xf0\xf2\x37\xda\xe0\xe5\xef\x4e\xd6\xe0\xe5\xdf\xb3\x0d\x5e\xfe\x98\x5e\xfe\xda\x70\xd1\x37\xeb\x5b\xd3\xa4\xe5\x32\x59\x51\xfb\xd4\x54\xb3\xa4\x46\x8f\xf2\x4f\xd9\x7f\xf5\xcb\x14\xd7\x34\x93\x3d\x8f\x21\xae\x69\xec\x5b\xb3\xa7\x46\xb2\xc3\x6d\xb5\xba\x55\x76\xb9\xb5\x91\x9f\xd5\x20\x37\x98\xdb\xbb\x51\x59\xa7\x96\xf5\xed\xa8\xdf\x79\x30\x03\x35\x17\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd5\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x65\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x7b\xe4\x4a\xcd\x17\x63\x0a\xf7\x07\xcd\x32\xf1\x10\x2e\x6d\x44\x39\xd7\x91\xcb\xd6\x04\x9e\xb6\x87\xbd\xab\xde\xac\xe4\xfe\x86\x69\xb6\x43\xc1\x9c\x1d\xdb\x50\x30\xe7\xe9\x36\x14\xcc\x79\xbc\x60\x4e\x23\xb2\xa9\x59\x39\xa7\xeb\x6c\x63\xbd\x9d\x03\x54\xce\x21\xe4\x2f\x73\x40\xbe\x21\xc1\x86\x23\x95\x99\x66\x45\x8d\x88\xa6\xec\xca\x67\xd6\x10\x37\x75\xc8\x3a\x6d\x2e\x66\x68\xa4\xc9\xbc\x23\x01\x2b\x3c\x10\xa9\x40\xdc\x35\x85\x37\x9b\x45\x94\x41\x3f\xb0\x2d\x2b\xe3\x2d\x74\x16\xd8\x87\x7d\xfe\xf8\x1f\x01\xb7\xce\x3b\x14\x7b\xda\xf1\x76\x8a\x9c\x18\x69\x29\x5b\xba\xa8\xb3\xd6\xf5\xd3\x12\xb3\x3a\x0f\x6b\xbd\x08\x0b\xf0\x2a\xda\x8c\x2d\x80\xd7\x32\xda\x89\x3a\x3d\xf5\xba\xe2\xaa\xec\xd9\x79\xcc\x10\x99\xb5\xfb\xbd\xba\xaf\xac\xb9\x22\x2b\x76\x1e\x77\x83\x8c\xf9\x1f\x0d\x59\xec\x3f\x9f\x96\x32\x3b\x0f\x6d\x59\x9b\x87\x5b\x6a\x6c\xab\x5a\xba\xec\xd8\x77\x4f\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\x75\x08\xd8\x8f\x03\x40\x7e\xfc\x92\x0a\x46\xf5\x32\xf8\xa7\x77\x76\xa6\xe7\x40\x8b\xef\x75\xb0\xcf\x00\x17\x1f\xd4\xcf\x2f\x0a\x2e\xfe\x40\xc1\x3c\xbf\x40\xd4\xf8\x1e\x04\xef\x1c\x32\x70\xe7\x17\x87\x1a\xdf\xa3\x40\x9d\x5e\x06\xe9\xf4\x2d\x40\x67\x80\x61\x0f\x6a\x9f\x27\x0c\x7b\xd4\x20\x9c\xd8\x7c\xa4\x87\xc1\x37\x3d\x0c\xbc\xe9\x6b\xd0\x4d\x44\x49\xf9\x79\x82\x6d\x22\xb1\x80\xe7\x09\xb2\x89\x97\x1a\x1d\xf3\x54\x1e\x1a\x3e\xa3\x17\xb9\xd0\x7d\x86\xcd\xe8\x55\x02\x74\xbf\x92\x9f\x0f\x91\xf8\xdc\x1b\x98\x8c\x03\x42\x64\xc4\x11\x03\x23\x08\x7f\xcf\xc1\xef\xe3\xc9\x62\x51\xe1\x30\xa2\xf2\xfc\xc3\xc3\x60\x7c\xb1\x6c\x3f\x22\xfc\xc5\xc0\xf9\xb7\xb6\xbe\x73\xfe\xe7\x86\xbb\x38\x2c\xd4\xc5\xc0\xff\x77\x6a\x51\x61\x2d\x9e\xd9\x73\xfa\x92\x70\x16\xfd\x80\xb2\x78\x31\x18\x8b\xfe\x40\x58\xbc\x18\x7c\xc5\xe0\xb1\x1e\x3c\xd6\xed\x36\x78\xac\x07\x8f\xf5\x3e\xfd\x0c\x1e\xeb\xc1\x63\x3d\x78\xac\x07\x8f\x75\x60\x1b\x3c\xd6\x1d\x89\x1a\x3c\xd6\x9b\xdb\xe0\xb1\x1e\x3c\xd6\x83\xc7\x7a\xad\x0d\x1e\xeb\x20\x02\x7b\xea\xb1\x8e\x03\x09\x11\xf3\x44\xf6\x09\x0a\xa2\x0f\x30\x10\x2f\x05\x01\xd1\x3b\xf8\x87\xc1\x04\xbd\x1b\x75\x71\xa0\x1e\x62\x1e\xe1\x7e\x43\x3c\xf4\x19\xde\xa1\xa7\xd0\x0e\xcf\x03\xeb\xf0\x9c\x90\x0e\xc1\x67\x36\xea\x69\x2d\x44\x7a\xc1\x35\xf3\x29\x64\xfb\x9f\xd3\xd6\xe9\x7c\x87\x7f\x4c\xc0\x9e\xb1\xd6\x81\x69\xe6\xc9\xcb\x32\x03\xe5\xd2\xc4\xe9\x42\xb0\x94\x14\xa5\xd6\x36\xf3\xd6\x9d\x4f\xbf\xf1\x69\x6e\x33\xe5\xcf\xc8\x3f\x05\x87\x33\x02\x3a\x19\x9b\xcd\x8d\x39\xe8\x42\xcf\x41\x9a\xc7\x4f\xd4\xe9\xe9\xfe\x6b\x12\x24\x9f\x85\x99\xf6\x0a\x09\x53\x90\x9f\x05\xb2\x02\x7a\x9e\x1d\x7c\x81\xb4\x0e\x6f\x4b\x3d\x86\x08\xb8\x2f\xec\xf1\xd3\xc2\x65\xbd\xe3\xb1\xb7\x69\xe7\x5d\x6f\x48\xc4\x37\x68\x6d\x20\x68\xb8\x39\xb6\x60\x1c\x9c\x91\x49\xa9\x09\xd3\x08\x0c\x90\xcc\x85\x50\x5d\xb9\x8b\x4b\x52\xc6\x17\x59\x30\x61\xcd\xe9\x82\x03\xa2\x0e\x08\x59\xf1\xc0\x06\x51\x56\x95\xa8\x7f\xc6\xba\x2a\x5b\xb9\x50\xba\xde\x21\xde\x38\x6b\x06\xaf\xee\x9c\x99\x04\x43\x91\x26\xaa\xcc\x0d\x29\x16\x50\x45\x59\x08\x80\x8e\xc3\x4e\x8d\x88\x45\x93\x79\xe3\x15\x72\x00\x6d\x5d\x73\x3e\xcb\xb9\x71\x88\x9b\x3a\xd3\x89\xcf\x79\xed\x38\xb6\xe9\x0c\x94\x3e\xdb\x8a\x38\xb2\x7d\x2f\x58\x9e\x70\xda\xd5\x28\x95\x88\xbc\x28\x35\x18\x39\xbe\xcc\xcd\x6e\x62\x1a\x23\x56\x90\x19\x49\x51\xce\xec\x84\x7b\x90\x07\x3b\x11\x35\x82\x08\x4f\x89\x2a\x27\x5a\xd2\x44\x77\xbf\xfd\x8f\xec\xf2\x1d\x55\x81\x45\x48\x0b\x9b\x56\x38\x21\x64\x4e\x55\x33\xe2\xa6\xbe\x5e\x9f\xc0\xc9\xf9\x1f\x01\x17\xac\x19\xf8\x44\x35\x04\x9d\x39\x9b\xcd\xfd\x9e\x33\x4a\x32\x9a\x16\x5a\x7b\xf5\x73\x07\x98\x30\x07\xd8\x1d\x25\x94\x5a\xea\x8d\x6f\x67\x3c\x25\x7f\xc1\x6f\x21\x5d\x4d\xbb\xc6\xed\x60\x6d\x07\x34\x4d\x8d\x3c\x02\x72\x64\x0f\x92\x20\x53\xe6\x34\xa5\x95\x93\xed\x66\xb8\x2b\x87\xec\x07\x48\xc0\xca\x8e\x0b\xe8\xc9\xce\x7c\xc7\x0e\x62\xb8\xda\x56\x5e\x25\x9a\xd2\x72\xe3\xa6\x79\x4c\x2e\xac\x60\xe4\xd9\x98\xd1\xe0\xcf\xd6\x60\xb0\xd6\x4f\xb5\x9d\x99\x1e\x04\x45\xc4\xf1\xd7\xc6\x40\x96\x20\x11\xdd\xab\xd1\x10\x26\xc8\xcb\x94\xff\x79\x01\xa4\x09\x72\x18\xb4\x09\x32\x94\x9e\xe9\x57\x2c\x0f\x19\x4a\xcf\xf4\x2c\xb6\x87\x0c\xa5\x67\x86\xd2\x33\xdd\x5b\x1f\x62\x7f\xc8\x50\x7a\xa6\x07\xb1\x40\x64\x28\x3d\xb3\x4b\x1b\x4a\xcf\x0c\xa5\x67\xd6\xdb\x50\x7a\x66\x28\x3d\xd3\x68\x43\xe9\x99\xee\x64\xf5\x2e\x9e\x88\xf4\x38\xa6\x88\x0c\xa5\x67\x22\x97\x9e\x89\x97\x25\x4d\x9e\xe1\xe4\x1e\x1a\x21\x83\xf4\x25\x5d\x9a\xf4\x1c\x29\x83\xf4\x2d\x67\x9a\xf4\x2e\x6f\x9a\x1c\x28\x77\x9a\xf4\x09\x39\x83\x1c\x16\x3d\x83\xf4\x31\x3f\xef\xf3\xa8\x5c\x14\x15\x51\x83\x3c\xc7\x5d\x71\x78\x64\x0d\xf2\xa5\x5f\x17\x11\x11\x36\xc8\x70\x63\xec\xd2\x3e\x87\x1b\xe3\xb9\x11\x37\xc8\xc1\x51\x37\xc8\x70\x6f\x74\x6d\x51\x91\x38\xc8\xcb\x78\x98\x5f\x12\x91\x83\xf4\x06\x95\x83\xbc\x24\x32\x07\xe9\x15\x3a\x07\x79\x49\x84\x0e\x32\x78\xf9\x07\x2f\xff\xce\x6d\xf0\xf2\x0f\x5e\xfe\x18\x7d\x0d\x5e\xfe\xc1\xcb\xbf\xb1\x0d\x5e\xfe\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\x7a\x1b\xbc\xfc\x83\x97\xbf\xd1\x06\x2f\x7f\x77\xb2\x06\x2f\xff\x9e\x6d\xf0\xf2\xc7\xf4\xf2\xc7\x41\x13\x21\xcf\x70\x6a\xfb\x84\x2a\x42\x7a\x82\x2c\x42\x5e\x10\x5d\x84\xf4\x11\x61\x84\x0c\xe6\xf6\xce\x54\xc6\x41\x1d\x21\xcf\x70\xd4\xfb\x8d\x3e\x42\x7a\x8e\x40\x42\xfa\x8b\x42\x42\x9e\x0d\x89\x84\x3c\x33\x1a\x09\x89\x75\xae\x6d\x8a\x6a\x5f\x70\x7e\x2c\x35\x6b\x99\xb5\xad\x0a\xff\x8f\x26\xce\x87\x69\xb6\xee\xd0\x48\xca\x67\x40\x5e\x8f\x5e\xbf\x7a\x15\x9e\xbb\xcb\xb8\x86\x19\x84\x58\x2f\xa7\x42\xe6\x54\x63\x4f\xbf\xfb\x6d\xa7\x7e\xa2\xb3\xed\x6d\x70\x0f\xfd\x83\x41\x71\x36\x91\x36\x0c\x45\x4b\xfa\xdf\x82\x49\x82\x5a\x81\x39\xad\x39\x68\xd2\xd9\x37\xd0\x00\xde\xd0\x2c\x87\x33\xcf\xfb\x6d\x4c\x84\x0f\x00\x70\x68\x2c\x29\x11\xdc\x89\x6c\x86\xdd\x75\xdd\x7b\xdd\x5f\x39\x01\xaa\x10\xf9\x60\x02\xe6\xb5\x3b\x8e\x4f\xb5\x85\xf9\x29\x04\xe3\xda\x1b\x7a\xcc\x3b\x83\xdf\x10\x0e\x43\x28\x2d\xc1\x5a\x50\xeb\x18\xa7\xb2\x48\xa9\x86\xd3\x10\x55\x51\x2d\x95\x86\x1c\xa1\x64\x8c\xa4\x47\x31\xf8\x87\x68\xb9\xc4\x00\x90\x05\x70\x5d\xd2\x2c\x5b\x12\x58\x30\x17\xbf\x63\x86\xc7\xe8\x25\xa6\x55\xd0\xcc\xff\x65\x0e\xc8\x41\x24\xd8\xc0\xa4\x32\xd3\xac\xc8\x6a\x14\x12\xbb\xfc\x99\x35\xc9\x4d\x1d\xe8\x4e\x9b\x9f\x19\x1a\x69\x32\xef\x48\xc0\x0a\x37\x44\x2a\x0c\x03\x92\x0a\xef\x38\x8b\x33\x83\x1e\x61\xa3\x2a\xa8\xca\x56\x67\x31\x7f\xd8\xe7\x8f\x04\x12\x70\xff\xbc\x43\x01\xa8\x1d\x79\xa7\xc8\x89\x91\x9b\xb2\xa5\x8b\x3f\x6b\x5d\x44\x2d\x81\xab\xf3\xb0\xd6\x9f\xb0\x00\xaf\xac\xcd\xd8\x02\x78\x2d\xad\x9d\xa8\xd3\x53\xaf\x35\xae\x4a\xa1\x9d\xc7\x0c\x91\x5e\xbb\xdf\xb0\xfb\x4a\x9d\x2b\x52\x63\xe7\x71\x37\x48\x9b\xff\xd1\x90\xca\xfe\xf3\x69\x79\xb3\xf3\xd0\x96\xb5\x79\x10\xa6\xc6\xb6\xaa\xe5\xcc\x8e\x7d\xf7\x04\x45\x26\x1c\x10\x24\x86\x47\x36\x1a\x10\xc8\x33\x17\x4c\x7a\x01\x00\x90\x03\x80\x7f\x0c\x85\x7b\x86\xc2\x3d\xed\x36\x14\xee\x19\x0a\xf7\xec\xd3\xcf\x50\xb8\x67\x28\xdc\x33\x14\xee\x19\x0a\xf7\x04\xb6\x1e\x85\xec\xf4\x32\x5c\xa7\x6f\xa1\x3a\x43\xe1\x9e\xa0\x36\x14\xee\x19\x0a\xf7\x0c\x85\x7b\x1a\x6d\x28\xdc\x13\x72\x34\xe3\x25\x49\xc7\x3c\x95\x87\x06\xd2\xe8\x45\x56\x74\x9f\x01\x34\x7a\x95\x0a\xdd\xaf\x34\xe8\x43\xa4\x40\xf7\x06\x30\xe3\x80\x60\x19\x43\x9d\xa7\x9d\x5a\x54\x60\x8c\xa8\x3c\xff\xf0\x80\x18\x5f\x2c\xdb\x8f\x08\x84\x31\x70\xfe\xad\xad\xef\x9c\xff\xb9\x81\x2f\x0e\x0b\x7a\x31\xf0\xff\x9d\x5a\x54\x80\x8b\x67\xf6\x9c\xbe\x24\xb0\x45\x3f\x40\x2d\x5e\x0c\xd0\xa2\x3f\x60\x16\x2f\x06\x64\x31\x78\xac\x07\x8f\x75\xbb\x0d\x1e\xeb\xc1\x63\xbd\x4f\x3f\x83\xc7\x7a\xf0\x58\x0f\x1e\xeb\xc1\x63\x1d\xd8\x06\x8f\x75\x47\xa2\x06\x8f\xf5\xe6\x36\x78\xac\x07\x8f\xf5\xe0\xb1\x5e\x6b\x83\xc7\x3a\x88\xc0\x9e\x7a\xac\xe3\x80\x43\xc4\x3c\x91\x7d\x02\x85\xe8\x03\x20\xc4\x4b\x81\x41\xf4\x0e\x08\x62\x30\x41\xef\x46\x5d\x1c\xd0\x87\x98\x47\xb8\xdf\x60\x0f\x7d\x06\x7a\xe8\x29\xc8\xc3\xf3\x00\x3c\x3c\x27\xb8\x43\xf0\x99\x8d\x76\x5a\x69\xa9\x45\x2e\x4a\xae\x6f\x41\x2e\x58\x02\x17\x49\x62\xfe\xba\x13\xf7\xb0\x67\x56\x7f\xeb\x88\x5e\x3c\xd2\x2d\x61\x3c\x65\x09\xda\x26\x1f\xe6\xa0\xe7\x2e\x6d\x0e\x9f\x23\xd4\x3e\x48\x34\x3e\x59\x9f\x50\xa4\xd3\xdc\xb1\x98\xd9\x8d\x5d\xef\xbb\x04\x76\x86\x26\x42\x64\x40\xf7\x71\x45\x3b\x99\x11\xe4\x9e\x8c\x3a\x8c\x67\x7d\xef\x44\x89\x7a\x74\x32\x81\x4c\xf0\x99\xcb\x21\x77\x5c\x67\xdf\x5d\xf8\xb6\xee\xce\xb9\x6a\x93\x52\x4a\xe0\x3a\x5b\xe2\x34\xa7\x29\xa4\x04\xcd\x53\xb9\x58\xec\xbf\xc9\xef\x90\x1d\x79\x1d\x9e\x6a\x92\x01\x35\xef\xc1\xa1\x7e\x11\xc3\xd0\x28\xb9\xee\x40\x7b\xe5\x5b\xb6\x20\x02\x9d\xd6\x7f\xff\x1b\xbb\xd3\x1d\xdd\x3e\x0d\x5e\x2f\x43\x29\x2d\x41\x23\x5f\x63\x3e\x90\x41\x2e\x45\x49\x1e\xa8\x55\xa5\x64\xc9\x91\xa5\xe2\x44\x75\x58\xe4\x00\xa5\xa3\xbb\x31\x7e\x84\xf7\xd2\x9e\x3f\x0b\x31\x8e\x53\x39\xeb\x24\x3a\xc5\x90\x25\x2e\xe4\xac\xb4\x9a\xa2\x3b\x8a\xc0\xb5\x5c\x22\x1e\x46\xb7\x7b\xe1\x6e\xde\x3a\x21\x39\x9d\xc1\xb1\x22\x6f\x3f\xbc\x33\xb7\x0e\x46\x20\xb1\xa9\x95\xd9\xdd\x2d\x54\x48\xb1\x60\x69\xd7\x6b\xe8\x07\x2a\x19\x9d\x64\x46\xeb\x9d\x82\x04\x6e\x24\xe9\xaf\x4e\x7e\xb8\xb8\xf9\xfb\xd5\xc5\x87\xf7\xa7\xa8\xff\xc2\xa7\x82\x72\xc3\x0e\x4a\x55\x23\xf3\x38\x0a\x8f\x15\x01\xbe\x60\x52\x70\x33\x0b\x68\x37\xa4\x64\xe1\x3a\xed\x44\x51\x1d\x38\x22\x41\x89\x6c\x01\xa9\xc5\xd2\xa8\x08\xac\xc3\x77\x8a\x52\x7b\x0b\xaa\x8f\xbd\x29\x79\x32\xa7\x7c\x06\xe9\x98\xbc\x13\xa5\x79\xb1\xaf\xbe\xc2\x97\x90\x90\x96\x09\x74\xd3\x71\xac\x09\xde\x9e\xdc\xaf\xce\xbc\xcc\x62\x6e\x7f\x8c\xbd\x21\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x5a\x72\x4d\x3f\xbd\xb1\x58\x1c\x47\x5f\x35\xbe\x3a\xea\x1e\xb8\x56\x48\x61\x5e\xc5\xca\x82\xf6\xed\x33\xa6\x41\xd2\x8c\x1c\x35\x47\x18\x93\xf7\x86\x2e\x48\x9b\x6b\x6b\xc1\x68\x60\x01\x12\x6d\xab\x6e\x65\xcf\x88\x84\x19\x95\x69\x06\xaa\x9b\x51\x48\x4c\xab\x2b\xdc\x9a\x5a\xdc\xae\x82\xca\x66\xcc\x85\x1e\x87\x32\x6e\xdf\x3e\x08\x04\x3b\x99\x8a\x37\x64\xae\x75\xa1\xde\x9c\x9f\xd7\x52\xd0\x98\x89\xf3\x54\x24\xea\x5c\x53\x75\xaf\xce\x19\x37\xcc\x6f\x94\x52\x4d\x47\x0d\xae\x7b\x6e\x65\xe3\x51\x22\xf2\x9c\xf2\x74\x44\xdd\x39\x1e\x55\x3b\xfb\xfc\xd7\x4e\x7a\x1c\xd1\xea\x29\xc6\x47\x74\xa4\xe6\xd0\x69\xe5\xc2\x14\xc5\x00\x05\x31\x50\xc8\x8c\xac\x10\xba\xb9\x3c\x14\xc3\x7e\x5f\xf1\x67\xbb\x14\x63\x72\x25\xb4\xc3\x2b\x72\x11\x95\x78\xdb\xe2\x2a\xc7\x64\xe1\xef\xaf\xee\x6e\xfe\x7a\xfd\xf1\xf2\xea\x6e\xe0\xe4\x03\x27\xc7\x36\x70\xf2\x81\x93\x77\x18\xb8\x2f\x9c\x1c\xf8\xe2\x50\x5c\xdc\x2b\xc5\x0d\x8e\x55\x6d\x55\x97\x28\x50\x85\x79\x57\xfb\xa0\xdb\x16\x8d\xb2\xd3\x0f\xb6\x63\x5a\x93\xfd\x9e\x2f\x7e\xa0\xed\x88\x13\xbe\x71\x0a\x89\x7b\xc0\x6a\xe8\x6f\xc3\x26\x30\xd8\xf3\x15\x1a\x17\xd6\x49\x21\xb5\x2d\x3c\x66\xcb\x0c\xdd\xdd\xe0\x1d\xcf\xdc\x7d\x45\xf3\xca\x56\xbb\x69\xc9\x43\xac\x98\x1f\xac\x43\x55\xb9\x43\x49\xf9\x92\x14\x92\x71\x8d\x5b\xe9\xe2\xf6\xed\xe5\x25\x49\xe6\x54\xd2\x44\x83\x54\x04\x3e\x25\x50\x68\x72\xfc\x3f\x8f\xbb\x8f\x19\xc1\xd7\x81\xd6\xeb\x3e\xac\xcc\x3e\x82\x5b\xc0\x30\xb5\xc8\x57\x48\x58\x30\x51\xaa\x6c\x59\x79\x08\x36\xf3\xd1\x55\x06\x4a\x28\x0f\xa1\xc0\xec\x0b\x6f\xde\xdd\x38\xe0\x8a\xd0\xb9\x49\x80\x0c\xb1\xb5\x1f\x56\xf4\x74\x44\xc4\x10\x40\x03\xc6\xdf\x20\xba\xee\x2e\x86\x06\x8c\xdb\x49\x80\xdd\x26\x8c\x06\xd0\xd1\x16\x63\x03\x3a\x7a\x67\xf3\xba\x50\xd8\x38\x0a\x98\x9a\x58\x9c\xec\x6b\x29\xf2\x48\xdc\xec\x16\x01\x0b\xab\x3c\xbb\x4d\x47\xf5\xd8\x05\xaf\xb7\x14\x01\xa7\xd2\x56\x99\x6e\xe6\xf3\xc0\x6c\xb7\x28\x51\x33\x71\x02\xaf\x13\xc1\xa7\x6c\xf6\x81\x16\xdf\xc1\xf2\x06\xa6\x61\xbe\xfa\xf6\x7c\xa3\xdb\xd2\x85\xff\xe2\x05\x6a\x44\x2e\x3b\x58\x98\xeb\x32\x5a\xd0\x51\xac\xd0\xfc\xf0\xb0\xfc\x78\x51\xf4\x51\x22\xe8\x5b\x0b\xe9\xb2\x85\xeb\x74\xd9\x58\x09\x16\x51\x02\x33\xc3\x24\x51\xdf\xe2\x47\x47\x37\x25\x53\x77\x3d\x44\x09\x32\xbf\xab\xd1\xce\x99\x22\x30\x9d\x42\xa2\xd9\x02\xb2\x0a\x21\x3d\x3d\x23\x93\x52\x7b\x6c\xf2\x09\x4d\xee\x1f\xa8\x4c\x15\x49\x44\x5e\x50\xcd\x26\x2c\x63\x7a\x49\x58\x8c\xfa\x5a\x2e\x54\xc0\x01\xae\xfb\x18\x6b\xae\x34\xc5\xab\x50\x38\x43\xa0\x59\x6d\x1b\x43\x41\x7d\x82\x9c\xe5\xa6\x1e\x68\x3c\x0a\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\x31\x6a\x60\xec\x6a\xcc\x49\x04\x37\xf2\xbf\x3a\x17\x0b\x23\x0b\xc2\xc3\xf9\x83\x90\xf7\x8c\xcf\x46\xe6\xc5\x47\x96\x59\xa9\x73\x8c\x6d\x39\xff\x35\xfe\xa7\x4f\xa7\x88\xf8\x8c\xee\x37\xe4\xe8\x28\xb0\x2f\x51\xd8\x30\xce\xc8\xa7\xf2\x16\x03\x84\x96\x2d\xd1\xa9\xba\x50\x8c\xe8\xc3\xb4\x42\x3e\xe5\xdd\xf3\x4e\x0b\x88\x34\xcd\xfb\x07\x56\xac\xb7\xe7\x2a\x33\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\x2b\xc7\x0a\x0b\x91\xbe\x21\xaa\x2c\x0a\x21\xb5\x22\x39\x68\x9a\x52\x4d\xc7\xe6\x40\x9c\xb5\xff\xc4\x10\xb0\x33\xf2\x8f\xea\x43\x8b\x47\xf0\xe3\xf1\x7f\x7c\xf7\xfe\xaf\xff\x79\xfc\xd3\x3f\x9a\xdf\xa1\xb8\x66\xb3\x8b\x1a\x0f\x04\xbe\x82\x2a\x20\x19\x73\x91\xc2\x15\x52\x87\x7f\xaa\x56\xc0\x8f\xfb\x42\x53\x5d\xaa\xf1\x5c\x28\x7d\x79\x5d\xfd\x59\x88\x74\xf5\xaf\xc0\x1c\xa7\x1e\xca\x3d\xb8\xb6\xd7\x54\x77\x47\x98\x27\x51\xa5\x1f\x5a\xb0\x1f\x40\xaa\xce\x35\x5b\x9a\xad\x75\x1e\x5c\xaf\x15\x14\x7e\x32\x87\x9c\xe2\x3f\xbf\xf6\x53\x60\xee\xe3\x07\xc9\xb4\xc6\x18\x30\x57\xa0\x42\x4c\xcf\x3c\x6b\xb5\x4a\xd5\xe2\x75\x70\x81\xb6\xa8\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x1a\x6e\x65\x2d\xe4\xf3\xe2\xfa\x92\x2c\xec\x0c\xf7\x68\x72\x9e\x8f\x5d\x67\x10\x5d\xdd\x0a\x66\xd8\x5f\x57\x54\xb9\x65\x6a\xa8\x6e\x4e\x61\x46\xca\x43\x17\xe8\xc6\x32\x1f\x9b\x8e\xfb\x9e\x2f\xcc\xb8\x8a\x4c\x81\xea\x52\x02\x99\x51\xed\x0b\xf8\x00\x37\x3a\x79\x60\x8a\x4a\x0f\x79\x66\x78\x0a\xf7\x88\x14\xa1\x2c\xd7\x74\xb2\x10\x59\x99\xe3\xe5\xd6\x13\xee\x1d\x5f\x77\x8d\xa2\xca\x79\x05\xd8\x45\x51\xb4\x0e\x03\xb9\x30\xcc\x7e\x81\x39\xc7\xf6\x19\x34\x3d\x62\x99\xa6\x76\x6d\x26\xa5\xa9\xd4\x51\xea\xf2\x91\x1a\xc0\xcb\x5b\xba\xeb\x00\x0f\x6b\xe5\xca\x5f\xdc\x77\x51\x37\x5b\x3c\x8d\x5c\x64\xc5\x1c\x33\x87\x66\x95\x1e\xbc\xf1\xb4\x9f\x55\x10\x0e\x8a\xfd\x13\x2d\x6c\x19\xcb\x99\xb6\x6a\xe5\xeb\xdf\xfe\xb1\x41\x68\x8f\xee\x86\x67\x53\x73\xa2\xec\xd8\x4d\xba\x92\xd9\xae\x8f\xa8\x49\x55\x72\xb4\x7f\x2e\x0e\xd2\x44\x2a\xc0\x99\x4c\x31\xad\xda\x8c\x50\x9f\xa0\x05\x95\x55\x94\x50\x39\xc9\x98\x9a\xc7\x29\x61\x7d\x39\xad\x56\xc7\xf4\xaf\x00\xc3\x8e\xb5\x2c\xa1\x4a\xe8\xaa\x65\x0f\x33\x17\x2b\x54\x46\x20\x61\x9b\x89\xb9\x5d\x37\xaf\x76\xe7\x5f\x63\xee\x56\x1d\x0d\x3f\xfe\xd5\xb3\xcd\xc3\x94\x66\xea\xe5\x26\x82\x72\x02\x52\x0a\x59\xb9\xa1\x24\xe8\x52\xf2\x3a\xc9\xfd\x5a\xa4\x24\x91\x60\xa1\x09\x7b\xa4\xac\x93\xa6\x51\x04\xe7\x2c\xb0\xbb\x22\xbe\x90\x1d\xed\x7a\x33\xb4\x35\xef\x37\x2b\x1a\xd8\x8b\xcb\x7a\xf3\xda\x60\x89\x31\x04\x41\xd3\x3e\x38\x26\x54\x15\x91\x33\xdb\xd2\x97\x3c\x74\xa7\x01\x07\x3c\x1e\x8f\x8f\x2d\x95\x42\xda\xab\xd4\x5a\x14\xcd\xe7\xbd\xba\x16\x6a\xa1\xea\x19\xcc\xf0\xbc\x61\x54\x76\x4b\x84\xb9\x42\x7e\xaa\xbc\x8b\x35\x96\xac\xfe\x19\x28\x53\xbe\x12\xd9\xd7\xbd\xb6\x81\x79\x2a\xfd\xe2\x55\x8c\xfe\x8d\x4d\xd5\xaf\xea\xa9\x59\xe1\xc7\xe2\xd3\x18\x95\x03\x94\x0e\x35\x14\x9f\xd8\x2e\xc7\x49\x51\x9e\xb9\xee\xc7\x39\xe4\x42\x2e\xab\x3f\xa1\x98\x43\x0e\x92\x66\x23\xa5\x85\xa4\x33\x38\xab\x06\xb7\x3f\xab\xfe\xb2\x3f\x6c\x91\xb7\xfe\x6b\x1b\xdd\x51\x67\x5e\x39\x7b\xdf\x17\xa8\xcb\xf9\x75\xeb\x89\x02\x55\x6d\xab\x67\xe0\x3f\xc7\x55\xc0\x9c\xf5\xb9\x55\xb3\x88\x2e\x75\xcb\x8d\xd4\x59\x2d\x70\x60\xdc\x87\x15\xf2\xd4\x71\x7f\xf8\x10\x21\x29\x5b\x30\x15\x03\x46\x6b\x83\x7b\x82\x39\xbb\x86\x28\x75\x51\x6a\x57\xf9\xba\xb2\xa0\x7c\x2a\x84\xc2\x68\x91\xaa\x78\x62\xcb\x34\xf8\x3a\xd4\xf3\x82\x32\x86\x06\xc9\xdf\x90\xff\x7d\xf2\xb7\xdf\xfc\x3c\x3a\xfd\xd3\xc9\xc9\x8f\xaf\x46\xff\xfe\xd3\x6f\x4e\xfe\x36\xc6\x7f\xfc\xeb\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xc7\xef\x3e\x7c\x73\x77\xfd\xfe\x27\x76\xfa\xf3\x8f\xbc\xcc\xef\xed\x5f\x3f\x9f\xfc\x08\xef\x7f\xda\xb1\x93\xd3\xd3\x3f\x7d\x15\x4c\x3a\xe5\xcb\x8f\x81\xdc\xdb\xb6\x51\xb4\xc2\xe5\xab\x3d\x46\x72\xb5\xb5\xae\x42\xc6\xf5\x48\xc8\x91\xed\xfa\x0d\x2a\x29\x81\x03\xf8\xed\x15\xfb\xfc\xdf\x78\xae\x59\xdf\x66\x95\x50\xd8\xa3\x03\xfe\x5c\x82\x86\x82\x44\x82\x7e\x89\x30\x19\x3b\x92\xd7\x0c\x57\x50\x3d\xbe\xb4\x1b\xf4\x97\x10\x39\x53\xd5\x4f\xc6\x75\xad\x35\x29\xa3\x5e\x8d\x6b\x25\x88\x12\x6b\x47\x74\xcf\xdd\x43\x20\xa0\x3a\x19\x22\x6d\x42\xda\x10\x69\xb3\x85\x94\x21\xd2\x26\xa8\x7d\x96\x91\x36\xb7\x96\x27\xfd\x22\xc3\x6c\xd6\x13\xcc\x4c\xa7\xf7\x9d\x0b\xce\x74\xce\xdc\xd9\x96\xe9\x96\xd3\x62\xef\xde\x80\x2f\xba\x06\x57\xc7\x4c\x75\xf3\x66\x0f\x2d\x48\x21\x8a\x32\xa3\x7a\x4b\x16\x45\xa4\xbc\xb7\x9e\x79\xce\xfe\x32\x07\xee\x44\x3f\x17\xc3\xcf\x38\xc9\xcb\x4c\xb3\xa2\x63\x42\x40\xa5\x5a\x56\xe0\x90\x84\x2a\x25\x12\x46\x7d\x22\xb8\x03\xb6\x52\xda\xbf\x32\x5a\xe6\x35\xbd\xc7\x1c\x9a\x04\x52\xe0\x49\x47\xcb\xe1\x0f\x16\x8c\xd2\xcf\xed\x64\x69\xee\xa1\xf7\x7c\xe1\xee\x24\x92\x96\x36\xc1\x15\x6a\x5f\x69\x94\x71\xbf\xac\x6c\x46\x73\x2e\x5d\xb6\x42\x23\xa9\x11\x25\xc8\xca\x88\x58\x81\x67\x57\x21\x90\x98\xfe\x61\xd9\x74\xb7\x0b\x2f\x58\x39\x08\x17\xc5\xab\x6c\x84\x20\x1d\x6b\x4d\x06\xaf\xc3\x44\xdb\xb2\x77\xe7\x11\x7a\x94\xc0\x11\x2e\x95\xc7\x95\xc8\x9f\x43\x1a\xef\x8b\x24\xde\x13\x29\xfc\x79\x24\xf0\x7e\x4a\xdf\xd1\x24\xef\x38\x52\x77\x1c\x89\x7b\x8f\xb8\xf6\x98\x52\x76\x1c\x09\xfb\x39\xec\x6b\x85\x84\x29\xfb\xd4\x87\xb4\xe5\x8f\xde\x7d\xa1\xe1\x13\x9a\x6a\x0a\x09\x05\xf0\x0a\x79\xd8\x7b\x60\x81\x26\xf3\x21\xe3\x9c\x54\x76\xd1\xb8\x17\xf6\xed\x26\x4b\xd9\x70\x5b\x93\xe1\xb6\xde\xa3\x0d\xb7\xf5\x70\x5b\xbf\xc8\x6d\xed\xb8\xd5\x97\x7f\x55\x47\x46\x5a\x42\x0c\xb9\x43\x19\xa0\xde\xb6\xa1\xec\x90\x33\x3f\x27\xda\x57\x75\x14\xeb\x18\xcf\x73\x1c\xb9\xdb\x89\x6b\x33\xd9\x2a\xe8\x42\x0b\xcb\xf6\xc8\x9c\xcd\xcc\xf6\xcc\x60\x01\x99\x53\xab\x49\x4e\x39\x9d\xd9\x12\x26\x5a\x54\x25\x7c\x85\xc4\x0a\xa5\x92\x75\x44\x4f\x5f\xc1\x04\x44\x0b\x96\xe1\x32\x99\xa0\x29\x7e\x29\x45\x96\x19\x79\x25\x63\xf7\x40\xde\x41\x91\x89\xa5\xab\x42\xc2\x53\x72\xab\xa9\x86\x69\x99\xdd\x82\xee\x14\xde\x1d\xc4\x71\x90\xe0\xeb\x32\xcb\xae\x45\xc6\x92\x4e\xde\xbf\x18\x5b\xf1\x12\x37\x60\x51\x66\x19\x29\x90\x90\x6e\xfb\xf0\x23\xc7\xab\xfc\x22\x7b\xa0\x4b\x75\x46\xae\x60\x01\xf2\x8c\x5c\x4e\xaf\x84\xbe\xb6\x46\xa4\x6e\xfd\x36\x31\x41\x6c\xe7\x84\x4d\xc9\x1b\x2c\xbf\xa8\x89\xa6\x33\x8c\x2d\xf6\x61\xc4\x67\x66\x43\x35\x07\x25\xc2\x30\xca\x07\xa6\x0e\x69\xdb\x0b\x3f\xa5\xbf\xc6\xd1\xcd\xd5\xd9\xf9\xd4\x06\xed\xd5\x8c\x4d\x21\x59\x26\xd9\xc1\x18\xe6\x45\x82\xe9\xb5\x75\xb1\x97\x06\x3b\x51\x4b\xa5\x21\xf7\x78\xf6\x68\xd2\x65\x9c\x48\x50\x85\xe0\x0a\xa5\xbc\x9a\x4b\x54\x2f\x42\x30\x49\xa6\x63\x52\x47\x44\x8b\x6f\x67\xc5\x20\x54\x25\x28\x84\xd2\xb7\x9a\x4a\xdd\x55\x3e\x89\xa5\x0b\x5c\x7b\x42\xcc\x49\x4e\x68\x96\x41\x4a\x58\x9e\x43\xca\xa8\x36\x72\x3b\x9d\x6a\xac\x62\xd0\x60\xf5\xca\xc6\xec\x37\xf2\x46\xe6\x94\xa7\x19\x48\x32\xa5\x2c\x53\xdd\x33\x07\xda\xd0\x5c\x46\x3e\x07\x99\x33\x8e\xde\x0b\x1b\x75\x8a\xd1\xdf\xe6\xaf\x24\x11\x32\x75\xf5\x02\x98\x56\xfe\xab\x20\x26\x6a\xda\x47\x94\xec\x1a\xdb\x7b\x35\x68\x97\x4c\x32\x91\xdc\x2b\x52\x72\xcd\x32\xfb\xf2\x42\xdc\xa3\xfe\x92\x21\x3b\xe9\x3c\x74\x77\x2e\x55\xfd\x73\x54\x1d\xb0\x91\xa1\x4a\x9d\xff\xba\xfe\x0a\x3f\xe8\x48\x5c\x04\x2d\x3a\x86\x0e\x0d\x9f\x20\x89\x56\x6a\xe7\xfd\x27\x48\x5a\x85\xae\x1c\x90\xaa\xd9\x51\x0e\x3c\x39\x92\xdf\xd1\xb6\x9e\xd5\xed\x0e\x00\xad\x6e\xb6\xd8\x21\x3d\x6f\xdd\x22\xb8\x92\xbd\x7e\x4d\x32\xc6\xa1\xbd\x30\x8a\xa5\xd0\x5e\x1c\xeb\xf6\x74\x4a\x2e\x49\x99\xc4\x1a\x43\x4b\x8f\xfa\x15\x4c\x9a\xa7\x05\xcb\xf0\x08\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\x56\x98\x7e\x61\xaf\xc5\xb1\x83\xce\xae\x5e\x4a\xb1\xbc\xc8\x96\xf8\x1e\xc7\xe9\x19\x61\x3a\x46\x8c\x90\xb9\x0d\x65\xc9\xfd\xac\x38\xa8\xef\x33\xa2\x04\xd1\x92\xfa\xd2\x7a\xf6\x53\xf3\x90\x96\xa5\xbb\xd0\x4f\x8e\x7f\x3e\x3e\x23\xa0\x93\x53\xf2\x20\xf8\xb1\xc6\xe9\x1b\x93\x3b\x41\xca\xe0\x9c\x27\x52\x13\xb2\x14\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x96\x78\xdd\x10\x51\xda\x0c\x3d\x23\x5a\x04\x40\x94\x37\xdb\xfb\x4f\x4c\x3b\xf0\x0d\xc3\xbf\x5f\xe1\x6e\xb2\x57\x16\xa1\x46\x19\x59\xc0\xf9\x1c\x68\xa6\xe7\x36\x9b\x81\x0b\x3e\xfa\x27\x48\x81\x30\xe6\xdc\x7d\xf3\xc5\x95\x89\x8f\x18\xc8\xf4\x4c\x15\xd5\xcc\xb5\xf7\x0d\x74\x16\x89\xc8\x2a\x3f\xfa\xf6\xee\xee\xfa\x1b\xd0\x4d\x2e\xcf\xf1\x43\xf2\xcd\xfb\x3b\x9f\xc3\x82\x86\x7e\x90\x53\x21\xf3\x1e\xb0\xf7\x38\xc1\xb5\x23\x52\x08\xd9\x87\x5b\x66\x2e\x54\xd0\x72\x92\x67\xb8\x62\xbe\x15\x4a\x5b\x5f\x8e\xd5\x4d\x38\x26\x36\x8a\x76\x42\x86\x4f\xdf\xbf\xbc\x1e\x93\xbf\x8a\xd2\x4c\xc8\x84\x4e\xb2\x65\x55\xc8\x48\x41\x68\xd1\x53\x42\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x5b\xa0\x29\x48\x85\x0c\x1a\x68\xa4\xf2\xac\x11\x8e\x7b\x83\xb6\xa8\x4b\xf9\xb6\x54\x5a\xe4\x64\xee\x5e\xbb\x0d\x71\xee\x0e\xe7\xd8\x1e\x57\x07\x27\x2b\xa1\xb0\x4c\xdc\xfd\xe6\x8b\x63\xd1\x6b\xdc\xcb\xce\xbb\xfb\x7c\x62\xc5\xd4\xe6\xb4\x39\x07\x87\x05\x2a\x75\xbc\xcd\x6c\xd5\x68\x71\xaf\x51\xca\xfb\xc6\xcb\x19\x20\x61\xe0\xe7\xab\x1d\xa1\xb3\x27\xb8\xa7\x78\x69\x08\x24\x5a\xa8\x3d\x79\xb6\xb2\xff\x46\xa0\x75\x9b\xcf\xda\xa0\xbb\x5b\xcf\x37\x75\xce\x54\x85\x16\x90\x50\x2e\x38\x4b\x68\xc6\xfe\x09\x29\x29\x0b\xc1\x5d\x6e\x1d\x4a\xb6\x09\x55\x30\x42\xcf\x3b\xd7\xae\x16\x71\x8d\x76\x6d\xb8\x83\x16\x02\xc5\x3d\x0c\x9e\x33\xec\xde\x52\x1d\xb3\xf6\x7d\xb4\xf2\xf2\x81\xd0\xed\xcd\xb6\xe6\x50\x6f\x2d\x56\x9c\x1d\x4f\x3e\x0b\x71\x92\x44\x02\x5e\x58\xc7\x36\xd3\x82\xd0\x24\x41\x3c\x6f\x7b\x5d\x21\xe3\x55\x20\x17\xe1\xfb\x2b\xda\xbc\x1a\x11\xb0\x6f\xb2\x97\x8d\x39\x90\x84\x97\xf9\x04\x64\x0d\x0c\x29\xf5\xfa\x9c\x46\xb1\xba\xb8\x61\xed\x70\xde\x4b\xeb\x65\x0c\xca\x67\x40\x5e\x9b\x91\xff\xf0\xfb\xdf\xff\xee\xf7\x11\xc6\x31\xaf\x57\x95\x08\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\x45\xb8\xf9\xd0\xee\x23\x25\xc9\xc6\x4e\x91\x8d\x9a\x20\xfb\xac\xe9\xb1\x08\xdc\x18\xcc\x65\x63\x1f\x89\x5b\xa4\xca\x6c\xc2\x52\x59\x88\x7a\xa7\x93\x34\xaa\xe1\x1a\x35\x2a\x7c\x77\x36\x9d\x79\x86\x61\xf5\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x9a\xde\x5a\xe5\x80\x48\x5a\x4a\x5b\x95\xb6\x72\x5e\xd5\xb6\x7c\xe7\xb4\x42\x1a\xbe\x20\xe5\x5f\x41\x22\x78\x1a\xa2\x02\xc4\x12\x69\x1d\x25\x51\xcf\xdc\xad\xed\xd3\x9b\x88\xeb\xab\xc4\x0d\x86\x9a\x64\xe8\x8a\x92\x6a\x55\xe3\xf0\x49\x8b\x06\x81\xbd\xfd\xe1\xdf\xba\x3b\xc8\x92\xe2\x56\x24\xf7\x11\x4d\x64\x81\x0c\xec\x9d\x39\x69\x89\xf5\x05\xde\xbd\xbd\xb6\xc4\x99\x95\xb9\xfa\x78\x57\x43\xbf\x18\x29\x9c\x92\xef\xbd\x6f\xea\x5b\xe7\x2d\xa4\x3c\x25\xf7\x50\x84\x69\x97\x86\x61\xfa\x30\xc2\x76\x14\xe1\xd8\x95\xec\x46\x94\x39\x9b\x5e\x6d\x19\x81\x8f\xfe\xb3\x12\x71\x58\x05\xa0\x86\x73\x1e\x1d\x81\x4e\x09\x99\x52\x96\x11\x8a\x56\x79\xcd\x72\x20\x0f\x73\xe0\xd6\xd8\x5f\x47\x4b\x7c\x41\x0c\xe7\x4b\xb5\x36\x1e\xfb\x90\xf0\x37\x7b\x5b\x0d\x43\x51\x31\xbe\x6c\x35\xc0\xf1\x6c\xd9\x42\x35\x1b\xd4\x80\x5d\xda\xa0\x06\x74\x54\x03\x0a\x09\xb7\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\xb6\x84\xdb\x4c\x60\x2a\x24\xac\xc6\xdb\x34\xe2\x60\x5c\xe4\x7c\x40\x64\xf0\xc5\xf5\x65\xe5\xfb\x12\xad\x58\x17\x8b\x5c\xac\xca\x64\xee\xdd\xa4\x1c\x94\x3a\xc7\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x9e\xd5\x68\x42\xe6\x75\x81\xdb\x0f\x41\x27\xd6\x6f\xee\xc3\x8a\x1c\x4e\xac\x9f\xae\x69\x90\x3b\xbf\x9e\xd8\x44\x52\x35\x07\xcc\x9d\x85\x4f\x4c\x2b\x3b\xa8\x45\x63\xf5\x33\x6e\xe4\x85\x99\xa4\x09\x90\x02\x24\x13\x46\xc4\x28\xb9\x4e\xc5\x03\x27\x13\x98\x31\xae\xfc\x8a\x85\x90\xe4\xb7\x04\x46\x12\x31\x55\xd5\xee\x1e\x93\x9b\x56\xe5\x38\x87\x2e\x96\x88\x9a\x67\xba\x29\x3a\x8b\x34\x25\x28\xbc\xe0\x36\x28\x69\x96\x2d\xeb\x8d\xd7\x04\x08\xdd\x32\x43\xdd\x37\x84\x9d\xd9\x93\x92\xe3\x8b\xa6\x90\xd1\xa5\xcd\x20\x9f\x32\x8e\xd6\x5f\xa9\x4e\xc7\xe1\xa1\x59\x9d\x09\x14\xb2\xd1\xe7\xd6\x9d\xc1\x14\x91\x40\x93\x20\x1c\xe3\x21\x06\xec\xa9\x36\xc4\x80\x0d\x31\x60\x43\x0c\xd8\x7a\x1b\x62\xc0\xda\x6d\x88\x01\xdb\x4e\x50\x9f\x9d\x76\x43\x0c\xd8\x60\x95\x59\x6f\x43\x0c\x58\xa7\x36\xc4\x80\x3d\xd9\x7a\xc7\xa2\x87\x18\xb0\x1d\xda\x10\x03\xb6\x63\x1b\x62\xc0\x86\x18\xb0\x21\x06\x6c\x88\x01\x0b\x68\x43\x0c\xd8\xfe\xaf\x37\x38\x7f\xba\xb7\x21\x06\x6c\x88\x01\xdb\xb3\x0d\x31\x60\x2b\x6d\x88\x01\x1b\x62\xc0\x1e\x6b\x43\x0c\xd8\x10\x03\xe6\xda\x60\x6d\x5c\x6b\x43\x0c\xd8\x86\x36\xc4\x80\xed\x37\xce\xa0\x06\x84\x75\xf6\x2c\x6a\x80\xd2\xa2\xb8\x65\xb3\x00\x5c\xc8\x58\xc7\xe0\xb6\xa2\xc4\x81\x46\x2a\x57\x6c\x57\xd9\x0f\xbd\x1d\x4b\x39\xc8\xbe\x66\x44\x58\xe3\x26\x99\x80\x51\x11\xcc\x6b\x15\x21\xb7\xc9\xe5\x14\x1d\xc8\x0d\x24\x37\x73\x2a\x3c\x4c\x20\x6b\x95\x75\x68\x8b\xcf\xfe\x76\x63\xdc\xe8\x2e\xdd\x29\x68\xcc\x47\x42\xb9\xad\x8c\xea\xca\x64\x9b\xeb\xfd\x5a\xa4\xca\x57\x92\xe0\x82\x8f\x2c\x58\xeb\xd8\x10\x3c\x16\x6a\x1c\x60\x0d\x0e\x44\x66\xb3\x31\x72\xd7\x52\x4c\x0e\x86\xce\x76\x8d\xf1\x47\x2c\x71\x01\x7a\x62\xda\x42\x5c\xb3\x04\x76\x44\x5a\x6b\x07\x86\x61\xb1\x66\x0f\xc1\xc5\x1c\xc3\xae\x82\x02\x0f\x89\xe6\xb6\x77\xe4\x94\x47\xa9\x54\xe7\x85\xb0\xff\x57\xc7\x4d\x35\x02\xa6\x3a\xfb\x51\x0e\x0c\x2f\x17\x12\x25\x75\xb0\x08\xa9\x9e\x44\x98\x45\x88\x8a\x8a\x29\x2b\xf5\x34\x1a\xaa\x9f\x91\x50\x7d\x8c\x82\x3a\x44\x04\xd4\xc1\xa3\x9f\xe2\xb8\xd5\x23\xb8\xd4\x23\x49\xa4\xcf\xe0\x9e\x72\x81\xf4\x77\x73\x09\x6a\x2e\xb2\xce\x0c\x27\x16\xb3\xf9\xc0\x38\xcb\xcb\x1c\xab\x50\x18\x9e\xc2\x16\x55\xb0\xbf\xf2\x2c\xc3\x5d\xf7\x36\xe2\x00\xcb\x55\xa4\x80\x65\xc0\x29\xcb\xcc\xd6\x42\xb0\xd0\x39\x5d\xa0\x50\x5a\x26\x09\x40\x1a\x22\x96\x36\xad\xd5\xbf\x1b\x57\x14\x5a\x8c\x7e\xa6\xc8\xeb\xb0\xab\x26\x4c\xef\x69\x98\xf3\x7e\xf7\xdb\x4e\x7d\xcc\x64\x11\xe7\x96\xfe\xe6\xe6\xfa\x6d\xeb\x96\xc6\x0f\xbe\xc5\x63\xfc\x76\x0e\xc9\xfd\x8d\x0b\xa5\x39\xdc\xcd\x1c\x6e\x66\x0a\x32\x31\xc5\x10\x0c\x42\xad\x28\x6d\x1f\xb2\x90\x7a\xc5\x05\x3a\xc3\x55\x04\xb9\x60\x09\x8c\x5f\xc0\x50\x11\x4b\xf9\x0f\x3f\x08\x04\xdd\x04\xf8\xe2\x7d\x11\xbb\x6e\x2d\x39\x95\x87\xa1\x61\xa3\x72\x94\x62\xd0\x68\x46\x93\x6a\x6d\x66\x9b\x0f\x5d\x10\x19\x27\x0a\xa0\x52\x68\x66\x4c\xcf\xcb\xc9\x38\x11\xf9\xb9\x61\x1d\xf6\xff\x26\x99\x98\x9c\xe7\x54\x69\x90\x46\xc7\x71\xd7\xfa\x28\x31\x14\x30\x3e\x1b\xe7\xe9\xe9\xf8\x57\x41\x34\x5c\x3a\x5b\xb9\x4b\xc3\xda\x62\x24\x98\x80\xe1\xfb\x42\xae\x58\x0b\xcc\xa4\x84\x6f\xd2\xe0\xfb\x3b\xb4\xa8\x48\x60\x58\xf2\x41\x42\x92\x07\xae\x4d\x22\x38\x04\x62\x32\x95\x7e\x84\x1d\x3f\x5b\xc8\x71\x94\xb3\x1a\x29\xd4\xb8\x47\x61\xc6\xbd\xd1\x85\xfa\x12\x5a\x1c\x2d\xac\x38\x56\x48\x71\x94\x70\xe2\x18\xa1\xc4\xf1\xc2\x88\xe3\x84\x10\xc7\x0f\x1f\x7e\xb6\xd0\xe1\xcf\x22\x6c\x38\xa2\x7f\x2c\x52\xb8\xf0\x4b\x84\x0a\xf7\xd7\x06\x43\x22\x84\x07\xbf\x5c\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x03\x84\x02\xbf\x84\xff\xff\xd9\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\xcf\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x22\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x41\x46\x97\xb7\x61\x81\xa0\xb1\x56\xe2\x6a\x2d\x58\xd4\x9a\xad\xdb\x71\x0d\x73\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\xfa\xe7\xb9\x26\xbd\x31\x8f\x5b\x5c\x95\x9e\xec\x9a\x6f\xc5\x03\x11\x53\x0d\x9c\x9c\x30\xee\x77\xce\x69\xc3\x4a\x53\xbb\x47\x82\xfd\x1d\xa6\xd7\xd7\xaf\xfc\x20\x5f\x9e\xdf\x03\x3d\x43\x4a\xf5\xda\xf3\xe5\x68\x7c\xda\xf5\xe5\x1e\x9c\x96\x59\xdb\xfd\x65\x5d\x62\x71\x7c\x5f\xaf\xc7\xe4\x83\x13\x27\x5e\x23\x3d\x15\x2b\xa2\x3c\x25\x0e\x9f\xeb\xcb\xdb\x27\xc1\xa1\xee\x6d\xe5\xa6\x8a\x4d\x6f\xc7\xb3\xd8\x1b\xd8\x48\x99\x82\x50\xf3\x14\x0a\xa0\x83\xd1\xb5\x37\x46\xd7\x03\x45\x60\x7f\x79\xda\xd6\xcb\x47\x5c\x0f\xda\xd6\x2f\x45\xdb\x6a\xc0\xe2\x7d\x23\x69\x02\xd7\x7d\x12\xde\x3c\x03\xa9\x13\x01\x6b\x19\xae\x62\x17\x1c\xc0\x26\x8e\xd5\xa0\x87\x88\xef\x37\x2d\xb3\x6c\x69\x6d\x88\x2d\x04\xcc\xee\x5b\xeb\x6e\x0e\x6b\xd0\x81\xe8\x4a\xdd\x40\x5d\xad\x9b\x14\x52\x38\x89\x44\x96\x9c\x1b\x11\xc3\x1d\x27\x43\xbc\xd1\x45\x14\xf0\xee\xe6\x74\xda\x02\x36\x74\x41\xe8\x18\xe8\x39\x07\x52\xe7\x2f\xb5\x09\x31\xa3\x4e\x85\x4c\xd8\x24\x5b\x92\x39\xcd\x8c\xb2\xe4\x82\xb4\xef\x59\x96\xb9\x6e\x02\x82\xc2\x41\x5b\xd7\xb3\x95\x68\x32\xc1\x67\x38\x19\xd4\x12\x02\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x4a\x4f\x67\x50\x54\x7c\x63\x74\xa6\x08\x67\xd9\x99\x9f\xf2\x36\x04\xe6\xfa\x9e\xaf\x4d\xca\x0a\x52\x87\x5e\xf9\xc0\x14\x9c\x61\x9f\x9d\x69\xb2\xb4\xf8\xaa\xfd\x76\xdf\xd8\xcf\x0a\x29\x16\x2c\xad\x63\xf4\xcd\xb6\xc0\xf8\xf8\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x51\x14\x8f\x1d\x43\xb3\x11\x9d\x76\x7c\x1b\x3f\xc8\x53\x96\x50\x0d\x0a\x73\x12\x5a\xd0\xb6\x0b\x46\x3b\x53\x62\xde\xa7\xb1\xa3\xc8\x09\x17\x44\x60\x66\x61\xc9\x99\x5e\xa2\x47\x6f\x5e\x6a\x92\x8a\x07\x7e\x1a\x72\x30\x6d\x98\x03\x25\x13\xd0\xb4\x4e\x0e\xf4\x22\x99\x22\xc0\xe9\x24\x33\x67\x0f\x23\xfe\xef\x36\x6e\x00\x32\x05\xaa\x4b\x09\x64\x46\x75\x00\x97\xd8\x20\xcd\xdb\xf5\x7c\x7c\xdb\x31\xe5\xfc\x75\x53\x52\x72\x05\x81\x82\x6c\x34\x15\xa0\x63\xc6\xab\x39\xd1\xa2\xd4\x3d\xb9\x47\xb6\x99\x8e\x6c\xe6\x4e\x43\x49\x64\x39\x28\x22\xca\x00\x4b\x5e\x4b\xfd\x73\xc3\xc5\xd4\xf0\x06\xbb\xd3\xc6\xd6\xd5\x6d\x1a\x63\x87\x5d\x35\xa4\xf2\x06\x3e\x81\x0f\xb7\xb2\x19\xd4\xef\xae\x6e\xff\xfe\xfd\xc5\xff\x7a\xff\x7d\xb7\x85\x7f\x4f\x93\x79\x13\x5b\x9c\x13\x8a\x17\x05\x32\xf9\x39\x5d\x00\xa1\xa4\xe4\xec\xbf\x4b\x17\xf2\x76\x52\x8d\xd7\x91\xad\x46\x49\xef\x09\x12\x7c\xcd\x2d\xd1\x89\x73\xc4\x58\xd3\xef\x99\x42\xa0\x6a\x24\xc2\x05\xfe\x0b\x05\x64\x2a\x45\xbe\xa2\x68\x91\xab\x2a\xb8\x6e\x69\x6e\x18\x6a\x55\xb3\x39\xc8\x6e\x12\xf9\xbb\x8f\xef\x6f\x31\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x31\xb9\xe0\x4b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x1a\xe3\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xcd\x32\xeb\x34\xb2\xd5\x5f\xd9\x24\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x8c\x25\x24\x07\x39\x03\x52\x50\x9d\xcc\x49\x4e\x97\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x5a\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\x6f\x37\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xfc\xf5\xab\x3f\xfe\xf6\xf7\x1d\xd5\xeb\x88\x07\xb7\x6b\xe8\x53\x40\xc8\x53\x3b\xfc\xcb\x6f\x30\x0c\xba\x6e\x21\xc3\xb8\x1d\x62\x77\x3e\x72\x43\xc5\xf8\x2c\x0b\x36\x80\x04\x9b\x01\x43\x8d\x80\xa3\xfa\x0d\xae\xbb\xda\x02\xc3\x2d\x81\x2d\x1a\xba\x9b\x52\xe2\x59\xc1\x6a\x09\xce\xdb\xbd\x1c\x43\x16\xbc\xa1\xd8\x5d\x5e\x7b\x2e\x15\x62\x3f\x42\x6d\xa2\x32\x4c\x59\xf4\x11\x3b\xac\x8d\x77\x38\x23\xaf\xc8\x7f\x90\x4f\xe4\x3f\xd0\x0a\xf6\x87\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x0b\xa5\x2f\xaf\x23\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x99\x30\x67\x8e\x80\x4f\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xb9\xec\xee\xd0\xe0\x82\xcb\x69\x3b\xfa\xff\x85\xf6\x37\x0e\xfc\xad\x50\xfa\xca\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x73\x16\xc0\x1c\xfa\x73\x62\xc3\xe2\x44\xe3\x6d\xdd\xc7\xb6\xd6\x8a\x4d\x1f\x2d\x32\x4e\x49\x69\x94\xa5\x29\x44\x3a\x46\xfd\x26\x80\x0a\x33\x1b\x69\x43\x18\x78\x44\x35\x1a\x5b\x7d\xad\xf2\x0e\xe3\x81\x33\x1c\x2b\xa1\xbc\xab\x0c\x6b\x9b\x84\x29\x48\x69\xf3\x84\x27\x4b\x9f\x6e\x14\xbc\xdb\x82\xb8\x5c\x21\x85\x16\x89\xe8\x0c\x9b\x12\x73\xab\x5c\x3b\x5a\x70\xee\xd1\x57\x5b\x79\xc7\xff\xfc\xee\xfa\x8c\xdc\xbd\xbd\x3e\x23\x42\x92\xdb\xb7\x61\xc1\x4f\x4d\x13\xcc\xd1\xdd\xdb\xeb\xa3\x83\xae\x40\x23\x87\xe9\xee\xed\x75\x87\x4e\xd6\xc3\x67\x73\x5a\x8c\xee\x61\xd9\x51\xba\x8b\x21\x61\x8e\xaa\x8d\x15\xe5\x85\xec\x34\xe7\xb4\xd8\xbb\x37\x09\x34\x65\xbd\x46\x72\xf1\x59\x87\x15\xa5\xf1\x20\x5d\x72\xb1\x80\xd4\x6a\xcd\x7e\x14\xe0\x69\x21\x98\xd1\x91\x06\x9c\x97\xc7\xda\x80\xf3\xb2\x7f\x1b\x70\x5e\x36\xb5\x01\xe7\x65\x8f\x36\xe0\xbc\xd8\x36\xe0\xbc\xb4\x09\xe9\x63\x8e\xd1\x80\xf3\xf2\x64\x1b\x70\x5e\xb6\xb6\x01\xe7\x65\xaf\x36\xe0\xbc\xac\xb7\x01\xe7\xe5\x91\x36\xe0\xbc\x54\x6d\xc0\x79\x19\x70\x5e\x3e\x5f\xae\x3d\xe0\xbc\xac\xb6\x01\xe7\x65\xc0\x79\x19\x70\x5e\x9a\x6d\xc0\x79\xd9\xd2\x06\x9c\x97\x01\xe7\x65\xc0\x79\x79\xbc\x0d\x38\x2f\x9d\xdb\x80\xf3\xb2\x5f\x1b\x32\x0f\xf7\x6c\x03\xce\xcb\x80\xf3\xb2\xda\x06\x9c\x97\x27\x5b\x3f\xcc\xe3\x03\xce\xcb\x80\xf3\xf2\x68\x1b\x70\x5e\x06\x9c\x97\x47\xdb\x80\xf3\xd2\xa1\xf5\xce\xe8\x3a\xe0\xbc\x0c\x38\x2f\x8f\x8d\x31\x68\x5b\xfb\xb5\x01\xe7\x65\xc0\x79\x59\x6b\x03\xce\xcb\x7a\x1b\x70\x5e\x06\x9c\x97\x01\xe7\x65\xc0\x79\xa9\xda\x80\xf3\xf2\xa5\xdb\x9d\x24\x28\xf6\x4f\xb8\x16\x19\x4b\x96\xc1\xd9\x3e\x37\xa0\x44\x29\x13\x73\x63\x63\xb7\xa4\xc0\x7e\x2b\x8b\x42\x90\x90\xdd\x33\x08\x85\x9b\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\xe7\x98\x82\x5e\xc0\x29\xf8\x17\xbc\xea\x1e\x41\x30\xf2\xe5\xb3\xed\xf4\x75\x33\x96\x06\x6b\xed\xcd\x17\xe9\x43\x3a\x67\x13\xf6\xa8\xda\x45\x5a\x54\xcc\x96\x6d\xdd\x5c\xb4\x28\x32\x16\x92\x18\x4b\xc8\x6d\x89\xd2\x05\x38\x17\xb8\x7a\x43\x92\xa2\x3c\x23\x39\xe4\x42\x06\x24\x46\x44\xd0\xe0\x5a\x5b\xa5\x0f\xeb\x74\x63\x09\xf2\x93\xaf\x05\xce\xff\xd2\xea\x0b\x35\x4a\x55\xb5\x56\xcc\xb3\xc3\xa0\x58\xb3\xcb\xe9\x6a\x30\x2a\xd3\x2d\x2b\xd0\x95\xd0\x37\xee\x70\x1f\x6c\xbd\x22\x47\x2c\xf8\x29\x3c\x18\x6a\xd5\x5b\x91\x17\xa5\x86\xd6\xc5\x66\xa7\xd8\x2a\x1d\x4c\x85\x32\xf4\xc3\x64\x83\x26\x82\x4f\xd9\xcc\x69\xdf\xe7\x39\xe5\x74\x06\xa3\x6a\xb6\x47\x35\xd4\xc3\x79\xe7\x8b\xfa\x60\xa9\xa0\x49\x46\x59\xf7\xc0\xc1\x58\x6c\xe2\x2d\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x7c\x56\x85\x8d\x33\xcb\x37\xc6\xfe\x2b\xfb\xe3\xb3\x00\xed\x91\x6a\xb4\x55\xa0\x62\xb4\x61\xa7\x86\x29\x8c\x56\x4d\x4c\xa1\x00\xa3\x11\x58\x03\x6a\x77\xb9\x7f\xc9\x69\xce\x12\x7f\xc2\x2e\xb2\x4c\x24\xd6\x26\xd3\xd6\x2a\x63\x90\x6c\x94\xdd\x3c\x2f\x35\x9d\x64\x30\x26\x97\x16\xa2\x42\xf0\x6c\x69\xce\x9f\x02\xed\x43\x14\xdc\xe6\x0f\xd3\x24\x43\xe2\x5f\x03\x63\x5f\x37\x0a\xe5\xb8\xa9\x2c\xa6\x06\x70\xc3\xca\x04\x07\x02\x5c\xcb\xa5\xd9\x7f\xd7\x22\xbd\x35\x5b\xb0\xf5\x74\x30\xd4\x46\x60\xc8\x6b\x8c\x70\xd7\xc0\x50\xd7\x38\x01\xaa\xe1\xc1\xa9\x71\x03\x53\x6b\x17\x82\x45\x0a\x6a\x66\xfc\xb4\xb6\x45\x21\xd2\xf1\x06\xd6\x44\xc4\x34\x90\x02\x33\xe2\xb5\x48\x8d\xd0\x24\xc1\xf2\xa7\xea\x8c\x5a\x03\xe2\xa5\x21\xee\x1e\x2d\x7e\x54\xd7\xd2\x14\x5d\x50\x96\x99\x03\x1c\x48\xc0\x3a\xea\x62\x98\x57\x26\x92\xaf\xc2\x05\xe7\xf7\x69\xb3\xb8\xb4\xae\x56\x66\x58\x32\x17\x0a\x38\xf2\x4b\x5a\x65\xf0\x54\xf9\x05\x8e\xc5\xa4\xf6\x2e\x0e\x8d\x22\xbe\x9c\x12\xc8\x0b\xbd\x3c\x23\xb0\x00\xb9\xd4\x73\x8c\x36\xa8\x70\x43\x91\xad\x31\x45\x72\x9a\x36\x76\xc7\x19\x11\xde\x00\x1d\x38\x3c\xde\x0f\x4e\x27\x2b\x33\x6d\x35\x34\xa6\xaa\x34\x8a\x43\xef\x9a\xd8\x70\x36\x24\x94\x69\xc6\x84\xa3\x21\x08\xa5\x9a\xb3\x6e\xc0\xb5\x24\xe2\x59\xf8\x1e\xa9\x68\xa4\x8e\x98\x2d\x91\xd3\x4f\x68\x9e\xa4\xb9\x28\xb9\xb6\x38\x35\x56\x63\xa8\xa4\x3c\x9b\x60\xf3\x82\xf1\x72\xcf\x2a\xdb\x93\x38\x57\x3b\x4d\x3d\x34\xc5\x75\x8c\x3c\x65\xaa\x35\x48\xfe\x86\xfc\xef\x93\xbf\xfd\xe6\xe7\xd1\xe9\x9f\x4e\x4e\x7e\x7c\x35\xfa\xf7\x9f\x7e\x73\xf2\xb7\x31\xfe\xe3\x5f\x4f\xff\x74\xfa\xb3\xff\xe3\x37\xa7\xa7\x27\x27\x3f\x7e\xf7\xe1\x9b\xbb\xeb\xf7\x3f\xb1\xd3\x9f\x7f\xe4\x65\x7e\x6f\xff\xfa\xf9\xe4\x47\x78\xff\xd3\x8e\x9d\x9c\x9e\xfe\xe9\xab\xee\xde\xc7\x50\x57\x7b\x3c\x47\x7b\x24\x37\xfb\xb3\x38\xd9\x1d\x8f\x3d\xf8\xe1\x77\x57\xe0\xda\xf1\x77\xde\x89\xc7\x8e\xbf\x0c\xb6\xc9\x5c\x4e\xeb\xf1\x99\x22\x22\x67\x5a\x43\xea\xee\xde\x06\xf6\xcd\x8a\x3d\xc8\x31\x2c\x84\xad\xa2\x78\x7b\x37\x30\x58\x6a\x33\x52\x67\xb2\xaa\xfb\x15\x2d\x60\x9c\xb0\xbc\xc8\x20\x07\xae\x91\xf1\x8c\xbc\x6e\x8b\xe6\xc4\x71\xfd\x06\x89\x35\x78\xc0\xa7\x04\x20\x75\x44\x0e\xbc\xb1\xd1\x06\xde\x38\xf0\xc6\xa7\x5a\xb0\x4d\x3c\x06\x63\xbc\x69\x12\xe1\x6c\x59\xca\x4b\xca\x68\x21\xaf\x20\x12\xc4\x14\x03\x25\x16\x2c\x2d\x69\xd6\x44\x92\xf5\xe0\xa2\xdd\x38\x00\x9a\x76\xda\xa1\x21\xe8\xa6\x85\x05\x64\x15\x11\xd6\x4c\x3f\x26\x7f\xb1\xe1\x3c\x4d\x45\xb3\x6d\x50\xef\xe6\x90\xdb\xf4\xba\x6d\x44\x08\xa7\xea\x1e\xab\x15\x92\xaa\x68\xa3\x3a\x09\xc3\xec\xb6\x6e\x53\x71\x51\x71\x8d\x6c\x79\x46\x14\x68\x9b\x63\x33\x87\x95\x65\xa2\x8a\x1c\x5d\x64\x0f\x74\xa9\x8e\x2a\x9f\x24\xe3\x4c\xaf\x14\x1f\xe8\x44\x03\x62\xc3\x9a\x0e\xa7\xc2\xc8\xbc\x58\x55\x61\x3a\x85\xa4\xa3\x36\x6b\x31\x38\xd6\x69\x73\xf1\xe8\x9a\xf1\xd2\xbc\xad\x9f\x55\x48\x89\xe0\x9d\x06\x82\x4f\x4c\x93\x92\x6b\x96\x19\x61\x9d\x48\x98\x95\x19\x6d\x1a\x02\xdd\x9b\xf9\x30\xb9\x74\x4c\x3e\xf2\x04\x9a\x0f\x77\xb3\x54\xaf\x0c\x60\x84\x87\x0c\x34\xa4\x67\xd8\x75\xfb\xd5\x95\x0d\x34\x6b\x9d\xfc\x6a\x29\x3b\x0d\xef\xe7\xb2\x0a\x24\x1a\xdb\x03\x55\x45\x39\x90\x94\x4d\xa7\x66\x64\x54\xb6\xb9\x90\x39\x5d\xa7\x8a\xf2\xb4\xd3\xe8\xe6\xe4\x62\x7a\x49\x13\xe5\x17\x2b\xbb\x1c\x29\x96\x42\x42\xe5\x51\xb3\x26\xc8\x45\xa6\xe7\xa2\x9c\xcd\xeb\x5d\x11\x36\xe5\x44\x69\x0c\xaf\x32\x93\xa9\xbc\xe5\x62\x65\xb3\x29\x23\xb3\xf0\x04\xac\x68\x25\xc0\x32\x8c\x07\xda\x71\xec\xb5\x10\x00\x1b\xd3\x6d\xd7\xdc\xe7\x5c\x61\x0c\x1f\xa4\x8d\x04\x39\x0e\x9f\x74\x84\x17\x1e\x93\x4b\x0b\x78\x71\xd6\xee\xb5\x35\x25\x76\x32\x1a\x31\x6c\x3e\x1a\xb3\x63\x00\xdf\xca\x00\xac\x4a\x31\x43\x5c\x62\xdb\x39\xe5\x4b\x9f\xd1\x81\x31\x66\x36\x13\xad\x4a\x32\xc9\xba\xd9\xd0\xab\xb3\xf4\xe2\x65\x76\x5a\x27\xf4\xa6\xcc\x0e\xe7\xbd\xbc\x69\x16\xf8\xc8\x5c\x01\x1e\x69\x28\xf2\x59\x3d\x73\x48\xee\xed\xc9\x4b\xc1\xb2\x37\x70\x38\xb7\xa1\xa7\x6b\x2e\xca\x2c\xb5\xa8\xba\x35\x77\x46\x4e\x6b\x43\x28\x2d\x19\x54\x02\x01\xa3\x21\x20\xf4\x08\xeb\xc6\xbe\x85\x4c\xcd\xf6\xb6\x2c\x19\x3b\xb6\x56\x6d\x9f\xee\xe2\x48\x42\x2e\x9f\x08\x6e\xef\xc9\x33\x77\x73\xe7\x94\xf1\xae\xa2\x5d\xfd\x0e\x6c\xc6\x85\x44\xa3\xf5\x94\x70\xd1\xa6\xa1\x7d\xe4\x57\xa8\xe8\x2c\x73\x54\x71\x48\x1b\xa5\x9d\x7a\x39\xed\xf8\x0f\x73\x30\xda\x5a\x9b\x96\xae\x6c\xbb\xb1\xa2\xd2\x70\xc4\xb1\x21\x46\x69\x49\x11\x26\xd9\xe5\x53\xc8\xae\x1b\xdf\x08\xdd\x17\x9a\xe4\x42\x69\xf2\xdb\x57\x8d\x39\x0e\xb2\xa3\x8d\x08\x9e\x44\x74\xf8\x55\x62\x0a\x22\x5d\x50\xcc\x85\xea\xda\xeb\x65\x0a\x5c\xb3\x84\x66\x0d\x42\xcd\x25\x31\x15\x72\xc2\xd2\x14\x30\xb4\x1d\x0b\x42\xa0\xca\xd9\x51\xd3\x45\xd1\xb5\x1e\xa0\x11\x03\x52\x6f\xac\x0f\x7f\xbe\xbd\x43\x1f\x66\x5b\xde\xab\x75\xfe\x6e\xa2\xd1\xc2\xbc\x82\x36\x4c\xa1\xb9\x9f\xad\x38\xdb\x1a\xe9\xcb\x08\xe9\x33\xef\x63\x76\x4a\xc3\xd0\x33\x17\x0f\xeb\x7c\x84\x19\x91\x8d\xa7\x9d\x13\x1e\x7b\x10\xc7\x67\x37\xfe\x81\x62\xef\xec\xe0\x7d\x88\xe6\xba\xad\x72\x23\xcd\xc6\xa6\x2e\x33\x92\xde\x03\x37\xac\x6c\x7d\xe1\xa7\x15\x86\x16\x93\x68\xee\x0a\x81\x86\xc2\xd3\x4c\x35\x53\xe6\x34\xdb\x8b\x11\xdd\x4d\x85\x70\x15\xdc\xaa\xb8\xe7\x23\xb7\x39\x8f\xcc\x65\xed\x99\x7d\x18\xa6\x75\x04\xc7\x67\x04\xeb\x88\x99\xd5\xb7\x22\x0d\xb1\x71\xad\x84\x3b\x54\x42\x8f\x4d\x99\xc1\xfb\x36\xb5\x32\x0f\x0a\x3c\x66\x5d\xdb\xab\xfa\x65\xc4\x39\x98\x33\x49\xb5\xe8\x6e\xef\x8a\x13\xeb\xe0\xc9\xe8\x97\x0b\xbb\xb5\x29\x24\x64\xf6\x3a\x9e\xb3\x82\x4c\x40\x3f\x00\xf0\xcd\x72\x5a\x0a\x27\xea\xd4\x1b\x6a\x02\x89\xa8\x43\x43\x6d\x88\xed\x98\x5c\xb7\x8e\x39\x5e\xee\xe1\xc8\x6e\x97\xfc\xcd\x2a\x8b\x42\xc5\xcb\xb3\x19\xcf\xc2\x36\xbc\x2b\x06\x48\x85\x85\x73\x55\x2f\x0b\xa8\x6d\xac\xbd\x73\xf0\xeb\x5d\x09\x1d\xf6\x86\xc1\xaf\x66\xe4\x3b\x67\x30\x78\x96\xb7\x8c\x14\x49\xe2\xe2\xb8\x7b\x74\x0a\xdb\x57\xad\x9b\x3b\xb7\xf5\x2b\xe6\xdc\x0a\xc1\x6b\xb0\xef\xd0\x9d\x53\xe9\x14\xbf\xff\x3d\x01\xeb\xa8\x8a\xa0\x57\xf8\x16\x07\xf2\x32\x0a\xe8\x65\x3c\x9c\x6b\x12\x0d\xeb\x9a\x3c\x12\x16\xd2\x0d\xdd\x35\x72\xa4\xb9\x82\xa4\x94\x4c\x2f\x8d\x2e\x00\x9f\x3a\x19\xac\x63\x9c\x95\xdb\x36\x19\x2d\xa7\x8a\x27\x91\x88\xc2\x56\xf0\x58\x29\x8f\x5d\x5b\x5c\x4a\x8e\xb6\xe2\x6e\x3b\xfa\x72\x6a\x56\xc4\x9a\x47\xd0\x51\x82\x41\xcb\xab\x84\x79\xa7\x8b\x95\xb1\xfe\xbb\x64\x0b\x9a\x19\x36\x5c\xff\xe2\x1a\x33\x34\x9b\x3f\x7a\xce\xc8\x76\x4d\xd5\x7d\xed\xde\x85\x51\x21\xd2\xda\x9b\x7b\xee\xa7\x0e\x3f\x82\x4f\xfa\x33\x8c\x6a\x47\x2e\x75\x2d\xd9\x82\x65\x30\x83\xf7\x2a\xa1\x56\x84\x39\x74\x64\xc4\xc5\x16\xba\x70\x67\x4a\x91\xa9\xca\xf6\x44\x7d\x7e\x3a\x1a\x61\x66\x94\x71\xac\xed\x1c\x20\xad\xba\x41\x95\x4d\x90\x67\x5a\x91\x82\x4a\xb3\x0b\x7d\x22\xbc\xf5\x67\x4c\x84\xc8\x5c\x31\xa0\x6c\x59\xd3\xc5\xba\x87\xb0\xa2\x01\x5d\xfc\x9d\xc3\xc3\xdf\x0d\x15\x8a\x4c\x33\x3a\xab\xfd\x29\xe6\x62\x5b\x95\x27\x83\x73\xf3\xb7\x4e\x34\x56\xba\x29\xcd\x3d\xf6\x40\x97\xaa\x46\x2d\x68\x9a\xdd\xbb\xdf\x28\xaf\x4f\x91\x9f\x50\x45\xaa\xb1\xbb\xf9\x7b\x4c\xfb\xed\x29\x1a\xf7\xdf\x5e\x5c\xff\xfd\xf6\xaf\xb7\x7f\xbf\x78\xf7\xe1\xf2\xaa\x73\x67\x57\x42\x83\x0d\x6d\x69\x38\x75\x93\x2a\x9d\xc6\xac\x42\x95\x91\x35\x16\x6a\x8c\x71\xab\x08\x99\xcb\x53\xf1\x10\x18\xdc\x6f\xf6\x14\xd0\x6e\xd6\x13\x5a\x14\x17\x32\x17\xf2\x5a\x8a\x29\xcb\x3a\x4b\xfc\xb1\x4e\xf0\x0a\x39\x3e\xcc\xf7\xc2\x7d\x5c\x5f\x37\x16\xc5\x71\x3d\x9b\xa4\x71\x65\x30\xc4\x0a\x34\xdd\x74\x0f\x2b\x5a\x75\xe7\x1f\xab\x55\x12\xbb\x1f\xa2\x83\xee\x99\x83\x63\x64\x19\x32\x3a\xfe\x3c\x86\x69\x20\x13\x09\xcd\xb0\x4a\x74\xd8\xc6\x27\x91\x15\x93\x55\xba\x1a\x98\x1e\xd4\x6f\x67\x92\x09\x9a\x5a\x1f\x96\x65\xfe\x29\xf8\xda\x65\x5e\xec\xc2\xac\x85\x20\x42\xee\x2c\x9e\x02\x8e\xe7\x41\x48\x0a\x09\x95\x54\xb3\x32\xbc\xb0\x25\xdb\x82\x86\xfc\xd0\xce\x01\x71\x6f\xd9\x82\xcb\x0a\x3d\x73\xd5\x30\xee\x80\xb1\x29\xda\x53\xd0\xce\x69\x14\xf5\x65\x61\x0d\x9c\xdf\xfb\x65\x08\x28\x2f\x1b\x49\x79\xc6\x4e\x7a\xb2\x3b\xed\xfc\x54\x3b\xd2\x26\x83\xdf\x33\x33\x83\xd3\x9a\x49\xfb\x6d\xe3\x65\x10\x9b\x11\x1e\xb8\x1f\x7f\xc0\x42\xe6\x9e\xff\x47\x30\x4e\x55\x4b\x4c\x46\x8d\xa3\x55\x48\x18\xad\x1f\xaf\x50\x7d\xff\xa6\xe4\x9a\xe5\xe0\x11\x46\x47\x2b\x32\x91\xb4\x5f\x1f\xab\xaa\x9e\x4f\x94\x8d\x4e\xc8\x9f\x39\x9e\x57\x0e\x29\x19\x11\x2e\xea\x25\x02\x3e\x15\x32\x41\xc3\xc3\x41\x37\x78\x42\x0b\x3a\x61\x19\x0b\x61\xe6\xb1\x36\x38\x96\xc7\x6c\xd0\x83\x31\x40\x69\x7a\x9e\x4a\x51\xd8\x9b\xd8\x43\x7f\x85\x67\x65\xb6\x21\x66\x9a\x95\x9c\x9c\x25\xaa\x45\xc8\x4c\x52\xae\xeb\xf8\xbd\xb5\x8d\xf3\x4b\x94\x41\x62\x08\x01\x34\x8d\x57\x68\xf6\x22\x35\x3c\xa3\xb9\x6c\xc1\xe7\xaa\x6f\x45\x6b\xde\xfa\x97\x6b\x60\xcc\x90\xeb\x8f\xb7\x97\xff\xef\xca\xb9\xe9\x2e\xda\xd9\xd6\xef\x92\x15\x86\x1f\x44\xdb\x36\x37\xae\xce\xf7\xb0\x71\xbe\xec\x8d\x53\x19\x88\x0e\x8e\xb7\x7d\x53\x36\x3d\xce\x8c\x37\x48\x23\x79\x90\xac\x73\x5d\x41\x53\xb6\x7b\x6d\x06\xe8\x4a\x20\xe6\x11\xae\x19\x86\x4b\x37\xac\xb5\x5a\xd8\x52\xd6\x4e\xec\x0a\x2b\xc5\xd0\xbc\x5d\xa7\x34\x53\x9f\xeb\x15\x19\x62\xda\x29\xa4\x48\x3e\x88\x92\xc7\x01\xf0\x0e\xd8\x71\x15\x21\x24\x05\x2e\xb4\xb3\xa6\xa0\x2e\x21\xa6\xf8\x2d\xb1\x39\x6b\x8d\xda\x1c\x2d\x39\x27\x40\xcc\xba\x6b\x88\x56\x55\xfc\x8a\x97\xc3\xad\xfe\x52\xaa\xb5\xc0\x48\x27\x57\xd5\x29\x6c\xd3\x80\x48\x06\x09\x34\xb5\x81\x34\x54\xcf\x2d\x68\x7c\x4e\xd5\x3d\xa4\xf6\x83\x40\xc0\xcc\x0a\x1c\x13\x43\xe1\xfc\x4c\xdf\x99\xc9\xf5\x98\x25\x68\x10\xb6\x41\xb6\x88\xa0\x19\xa2\x8a\x1d\xf4\x34\x04\x30\x76\xb3\x08\x1f\x79\xb6\xbc\x11\x42\x7f\x5d\xd5\xc4\x3f\xf4\xc9\xf8\x4b\x15\x0a\xdb\x34\x62\xa2\x5d\x9a\x22\xc9\x23\xdc\x38\xc8\x17\xa7\x15\xd5\xe1\x25\x2e\xcc\xca\xfd\x42\xb9\xa2\x2c\xf9\x85\xfa\x46\x8a\xb2\xb3\x0c\x17\x53\xdf\xfc\xe6\xf2\x1d\x5e\x7c\xa5\xc3\x54\xe6\x5a\x2e\x0b\xc1\xb8\xf6\x16\xaf\x88\x4e\x9b\x3f\x3b\xf4\xea\x26\x67\x0b\x06\xaa\x25\xe4\x03\x5d\x12\x9a\x29\x51\x99\xd4\xf8\x26\x77\xab\xf7\xe5\x9a\xaf\x27\x42\xcf\xd7\x9c\xb8\x5d\x53\x77\x4c\x5b\x1f\xef\xac\x01\xcd\x5c\x07\xc4\x30\xbe\x36\xac\x46\x54\x97\x42\x42\x02\x29\xf0\xe4\x73\x3d\x11\x87\x46\x0a\xc6\x53\x75\x25\xb8\x61\xaf\x87\x3e\x57\x97\x95\x7d\xd2\xad\x46\xf3\x14\xa1\x29\xdb\x39\x11\x29\xa2\x6a\x23\x73\x2d\x55\x48\xe4\xe9\xe5\x14\xbd\x9e\x76\xd3\x7d\x57\x4e\x20\x33\x8b\xcd\xb2\xcc\x47\xdb\xdb\xd0\x04\x96\xd3\x19\x10\xaa\xab\x43\xa8\x05\x01\xae\x4a\xe9\xf6\x4d\xc7\xac\x2a\xd3\xaa\x84\x30\xf7\x6a\x7f\xbe\x7c\x47\x5e\x91\x13\xf3\x6e\x36\x62\x70\x4a\x59\x86\x40\xdd\x3e\x56\xb7\xa9\x03\x4c\x7d\x4e\x59\xd0\x14\x20\x1f\x21\x42\xda\xab\xe5\x8c\x70\x41\x54\x99\xcc\x1b\x19\x07\x95\x45\xd8\x55\x6d\x0a\x02\x22\x19\xd8\x4e\xbc\xfb\xf0\xcf\x0a\x3a\x87\xc8\xc6\xbc\x0e\xff\xfc\x82\xd7\x61\x53\x45\x34\xc7\xbf\xbd\x60\xf6\xac\xe6\xa0\x69\x4a\x35\x75\xd7\xa4\x7f\x60\xd8\xb5\xc3\x65\x19\x70\x59\x2a\xf8\x9e\xf1\xf2\x93\xad\x8b\xd2\x0b\xb7\xc7\xed\x7b\xa4\x88\x24\x7e\xa1\x45\xc3\x6f\xe7\x3d\x14\x11\x52\x34\x2e\x5b\xc7\xe8\x6c\x8b\xd6\x8d\xb7\x04\xb5\xd8\x9b\x98\x45\x49\x79\x2a\xf2\x35\x22\xa7\x42\x12\xa0\xc9\xbc\x33\x35\x8d\xa8\x91\xe1\x60\xba\xf6\xcb\x76\x08\x61\xfa\x6a\x34\xdb\xfe\xf7\x98\x0c\xcb\x54\xb5\x73\x6d\x76\x6c\x46\x27\x90\x39\x58\x5c\x8b\x95\x1e\xf1\x84\x45\xb2\x81\x4b\x11\x31\x24\xe6\x46\xd8\x48\x2e\x5a\x4d\x84\xe9\xfe\xb3\x98\x87\xa8\xc1\x17\x77\x2e\xba\xa4\x9e\x07\xb4\x81\x7e\x0e\xf3\x50\x06\x08\x88\x64\x75\x1e\x8c\xb4\xd9\x9e\x07\x94\xbf\xfa\x3e\x0f\x0a\x92\x44\xe4\x45\x4f\x22\x25\xef\x6c\x14\xbe\xa1\x68\xd7\xa8\xc8\xf6\xc3\x34\x28\xdc\xd9\x55\xbb\xa2\xda\xde\x83\xbe\xe4\xd5\xff\xaf\x71\x9d\x23\xb7\x5b\xbd\xe3\xdd\xe8\xc1\x11\x99\xd5\x88\xae\xc3\x5f\xe2\x8d\x37\x84\x61\xb6\xda\x8b\x87\x61\x36\x10\xf3\x29\x9a\xe7\x5b\x21\x91\x5f\x42\x30\xa6\x51\x02\x70\x5e\x81\x23\x0a\x50\x41\xf5\xfc\xcc\x65\xac\x2e\xc0\xb3\xe7\x7b\x6b\xf1\x3a\x46\x8e\xe3\x09\xf2\xec\xa6\x8e\x59\xb5\x48\xfa\x51\x63\x37\x37\xc5\x6b\xda\x67\xae\x3e\xde\x35\x71\xf4\x29\x5f\x5a\x8c\xc8\x00\x54\x33\xdb\xfa\x27\x56\x3c\x67\x4c\xe7\xea\x2a\x3e\x77\x48\x67\x50\x7f\x9b\x23\x3a\x5f\xee\x94\xee\x16\xe5\xb9\x1a\xe3\x19\x95\x84\xd5\x80\xcf\xf5\x31\x22\xac\x5c\xf0\x11\x70\x57\x67\x8f\x0c\x20\x7f\xb1\x14\x79\x2d\x3b\xf1\xa0\x85\xaa\x69\x04\xa1\x59\x16\x25\x26\x61\x93\x15\xc4\x9f\x82\x0a\x4a\x7e\xdd\x1a\xd0\xae\x69\x1a\x32\xfa\x13\x16\x8c\xcf\xdb\x12\x91\x19\x8d\xe2\x33\xb7\x43\xcc\x72\x45\xdf\x4a\x48\x6d\x9c\xd4\x6d\x01\x49\x5f\x6e\x8b\x6f\x3e\xdc\x5e\xb4\x29\x43\x59\xd8\x15\xce\x00\xfc\x9e\xd0\x34\x67\x4a\xa1\xc3\x07\x26\x73\x21\xee\x83\x86\x3c\xf1\xa9\xb6\x33\xa6\xe7\xe5\x64\x9c\x88\xbc\x91\x75\x3b\x52\x6c\xa6\xce\x1d\x47\x19\x99\x89\x3b\x25\x8c\x67\x55\xa6\x32\x5a\x0b\x11\x0b\xac\x3b\x94\x5c\xf3\xe5\x49\x52\xbd\x3d\x6e\x3d\xcc\x4f\xa9\x42\xb3\xd7\xa7\x07\xab\x9b\xe0\xe6\x3d\xb8\xd4\xb1\xbe\xab\xc2\xaa\x0d\xae\xec\xac\x2d\xef\xde\xac\xd4\xe1\xbc\x38\x1b\xe7\xd1\x2a\xaf\x07\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\x6f\x6b\x92\x9a\x58\x7a\x6c\xda\x42\x84\x6a\xe7\xdc\xa3\x7b\xfb\xd8\xfc\xd2\x87\x65\x1e\xc7\x2a\x2e\x73\x91\x65\x66\x21\xa9\x03\x5e\x6b\x44\x77\xa2\x6a\xd2\x46\xb4\xb3\x98\xbb\x46\x59\x68\xbe\x05\x5e\x24\x61\x4c\xc1\xe2\x9e\x99\xcb\xc0\x61\x66\x98\x0d\x84\x63\x53\x92\xb3\x4f\x86\xc2\xe6\x88\x6d\x90\x58\x74\xfc\x6f\xfe\x3a\xa0\x80\x35\xc1\xe0\x83\x0a\x33\xfd\xcc\xac\x50\x73\x10\x9f\x1c\xad\xcd\xb5\x65\xbe\xb8\x02\x6d\x14\x35\x3b\x6f\x4d\xef\x83\x51\xac\x64\x19\xe1\x30\x84\x78\x86\x49\xd3\x3b\x1c\x95\x53\x04\x9e\x07\xf4\x14\x3b\x9a\x8c\x0c\xe2\x85\xb7\x97\xf2\x1c\x93\x0d\xe9\x3b\x2f\xe6\x41\x26\xbb\x7b\x91\x9f\xd1\x57\x45\xfa\xe2\xaf\x0a\xe4\xfa\x4d\xac\xdf\x83\xe1\xac\x34\xf1\x86\xd9\x7a\xf0\xd2\xb5\x48\xd7\x60\x88\x11\xcc\x98\xd1\xac\x7b\x21\xd7\xcb\x69\x13\xba\x93\x0b\x67\x1e\xb1\x15\xc4\x6d\x9c\xfe\x27\x48\x4a\x0d\xa9\x43\x23\x77\x26\x65\x8b\x64\xdc\xa6\xa6\x33\x05\x3e\x49\x7f\x02\x18\xa0\xa4\xce\xea\x52\x6c\x4e\xd7\xa9\xf0\x5d\xcf\xc8\x7f\x21\x97\x54\x1e\x50\x2b\x63\x0b\xe0\xa0\xd4\x75\xf5\xf3\xae\x53\x81\x71\xd4\x09\xe5\x5e\xb7\x32\x67\xda\x59\xb8\x1d\xea\xb8\xc3\xf1\x98\x00\x29\xa8\xa4\xb9\xb9\x83\x15\x71\xcb\x33\x81\x19\xb3\x69\x81\x8d\x4b\xb1\x82\x2d\xef\x06\xaa\x8b\x8a\x0d\xd3\x24\x67\xb3\xb9\x3d\x2d\x84\x92\x4c\xf0\x19\xf1\x71\x63\x99\xa0\x29\x41\xc6\x22\x24\x79\xa0\x32\x37\xb2\x00\x4d\xe6\x18\x84\x46\x39\x49\x4b\x73\x1e\x08\x82\x6c\x2f\x47\x4a\x53\x0d\x0e\x0c\xaf\xb3\x0d\xce\x4f\xd3\x01\x4a\xc4\x3e\x77\xf9\xfb\x03\xe3\xe9\x98\x93\x16\xc5\x0a\xf2\xfe\x13\x24\xd5\xb1\xb6\x88\xd3\x79\x8e\x80\x81\xc2\x1f\x67\x8f\x16\x17\x2c\x0c\xf6\x44\x55\x76\x6f\xd8\x17\xd9\xe4\xad\x9b\x70\xe6\xb5\x4f\xfb\xa7\xd1\x47\xdb\x8b\xa0\xbc\x13\xab\x51\x34\x09\xd1\xb1\x85\xbc\x37\x27\xd7\x62\x04\x09\x59\x55\xeb\x0f\x22\xcb\xd3\x81\x90\xd9\x42\x68\x72\x72\x7c\x7e\x7c\xba\xb6\x17\x8e\x55\x33\xcd\xc0\x66\x44\xd7\x2f\xa4\x58\x5e\x64\x4b\x7c\x87\x63\x5b\xf2\x3b\x10\xc0\xd0\x07\xac\x56\xe5\x2f\xd5\x1c\xb2\xec\x8c\x28\x23\xfe\x52\x5f\x43\xc4\x7e\x6a\x1e\xd2\xb2\x4c\xac\x99\xec\xe4\xf8\xe7\xe3\x33\x02\x3a\x39\x25\x0f\x82\x1f\x6b\xeb\xf0\x20\x77\xa8\x43\x06\xd1\x54\x11\xb1\x14\x25\xe1\x00\xee\xec\x54\xc5\xaa\x12\x6a\xd4\x9f\xd2\xca\xe8\x16\x74\x03\xb2\x2c\x4c\x9e\x7b\xff\x89\x69\x23\x8a\xe8\x12\xcd\x14\xaf\xac\xa6\x00\x88\x43\x4f\x15\xde\x74\xe7\x73\xa0\x99\x9e\x2f\x2b\xed\xe5\x9f\x20\x05\xd6\x27\xe5\xee\x9b\x70\x19\xaa\x07\x69\xa3\xfd\x4d\xe0\x34\x02\x46\x29\xe1\x6e\x2e\x41\xcd\x45\x76\xf0\x34\xce\x0f\xae\xdc\x5b\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\x59\x99\xc5\xd5\x57\x10\x78\xca\x24\xa4\x4e\x58\x72\x25\x2f\xe6\x74\x81\x92\x82\x91\xe7\x20\x0d\x51\x4d\x9a\x3a\xd1\xef\xc6\x15\x85\x55\xda\xdd\xeb\x9e\x84\x6d\x76\xc4\x8e\x9c\xc9\x22\xce\x2d\xfd\xcd\xcd\xf5\xdb\xd6\x2d\x8d\x1f\x7c\x8b\xc7\xf8\xed\x1c\x92\xfb\x9b\xb0\x6a\xae\x3d\x09\x2d\x28\x84\x3c\xa4\x60\x60\x86\x8f\x26\x15\x5c\x0b\xa9\x09\x2f\xf3\x09\x48\x6f\x50\x98\xe1\x2a\x82\x5c\xb0\x04\xc6\xe4\xca\x7e\xe7\x9d\xf3\xbe\xfa\x30\xe5\x33\x20\xaf\xcd\x81\xf8\xc3\xef\x7f\xff\xbb\xdf\x87\xf3\xe8\x70\x20\xd5\x38\x20\xaa\xee\xc5\xfb\x22\x76\xdd\x5a\x72\x36\x19\x9b\x1d\xa5\xa8\xd4\x65\x34\xa9\xd6\x66\xb6\xf9\xd0\x85\x59\x25\x15\x00\xd9\xe0\xae\x30\xac\xc3\xfe\xdf\x24\x13\x93\xf3\x9c\x2a\x0d\xd2\xe8\x38\xee\x5a\x1f\x21\xdc\x30\xe3\xb3\x71\x9e\x9e\x8e\xc3\xbc\xe0\x5e\xad\x5e\x2b\x29\xd7\x82\x99\xd9\x52\x1e\xce\x4c\xca\xc1\x4d\xf0\xc4\x53\xf9\x86\x1c\x75\xab\x26\x66\x96\xe0\x1b\x88\x93\x89\xf6\xed\xdd\xdd\xf5\x37\xa0\x9b\x0c\x9b\xe3\x87\xe4\x9b\xf7\x77\x55\xb9\x71\xb3\xbb\x6c\x52\xd3\xc0\xb5\x43\xb8\xf6\x5c\x84\xd5\x9b\x8f\xed\x77\xb1\xac\x04\x6b\xa3\x71\x0e\x89\x59\xe8\xb3\x56\x65\x5b\x1f\x87\x78\x79\x3d\x26\x7f\x15\x25\x8a\x5c\x74\x92\x2d\xc9\x03\xb5\x88\x06\xdd\x20\xa5\xeb\x76\x64\xc8\x38\x32\x5c\xcb\xec\xea\x6f\x81\xa6\xb6\x56\x25\x9a\x76\x0e\x7e\x56\x1b\x34\x45\x5b\xb6\xb7\xa5\xd2\x22\x27\x73\xf7\xaa\x76\x0e\xeb\x82\xfe\x56\x36\xb2\x47\x10\x7d\x3f\x8a\x48\x28\xac\xb6\xe4\x7e\xf3\x45\xe8\x42\x6b\x5c\xc8\xce\x73\xa3\x1a\x10\x25\x49\x73\xaa\x9c\xa0\x8f\x26\x4c\xe6\x78\x54\x67\x93\x58\xdd\xa2\x54\x15\x21\x91\x2a\x8b\x10\x64\x52\xe6\x50\x06\x77\x12\xee\x84\x8c\x53\xa3\xc4\x34\x1e\xe8\x5e\xb3\x2d\x6e\x85\x04\xe2\x5c\x6d\x6e\x73\xd9\x00\x1c\x43\x68\x28\x2a\x21\xf1\xc6\xe4\xaa\x80\x2a\xe5\x82\xb3\xc4\xba\x33\x48\x59\x08\x4e\x44\xa9\x8b\x52\xa3\x29\x28\xa1\x0a\x46\x0b\x2a\x99\x61\xa8\x66\xfc\xfa\x87\x25\x37\xa7\x5d\x0b\x81\x76\x92\xca\xe9\x6c\x29\x0e\x27\x33\x92\x34\x43\x7c\x01\x8c\xc8\x2b\xbc\xb6\x38\xe1\x3b\x9a\xf4\xda\x06\x43\x6c\x0d\xf1\x79\x3c\xb5\x8e\xea\x39\x46\xf6\xa1\x2f\xcb\x07\x86\x22\xe3\x34\x6a\x43\x0f\x12\x6f\xa2\x6a\xb1\x81\x2c\x01\xfd\xed\x42\xae\xe8\xc1\x86\xc2\xf5\x39\x8c\x14\x6b\xf2\xfc\x6a\xb5\x7b\x2d\x3f\x02\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\xfd\xfb\xd5\xc5\x87\xf7\x21\x5d\x07\xd7\x8e\x8f\x59\x3d\x3e\x5a\xfd\xf8\x67\xa8\x20\xef\x9b\x4a\xe6\xd0\x9f\x30\x93\x5b\xa4\xa6\x09\x4a\xe6\x74\x80\x46\x3d\xe4\x30\x94\x3a\xb2\x62\x34\x35\x8c\xe7\xa0\x1c\xc7\x45\x15\xbc\x83\x8c\x2e\x6f\x21\x11\x3c\x3d\x78\x74\xf6\x55\xc5\x6c\x94\x25\xa8\x2a\x03\x0d\x2b\x88\x59\xbe\x10\xac\x2b\x5e\xed\xe3\x03\x9a\x21\x0d\xf6\xfd\x3a\x7b\xad\x49\xff\x3c\xd7\xa4\x37\xe6\xf1\x02\x24\xc3\x88\xa0\x3e\xec\x9a\x6f\xc5\x83\xab\xe8\x7e\xc2\xb8\xdf\x39\xa7\x0d\x2b\x4d\xed\x1e\x09\x47\x53\xd3\x82\xbc\x7e\xe5\x07\xf9\xf2\xfc\x1e\x2e\xd2\xa7\xd7\x9e\x2f\x47\xe3\xd3\xae\xaf\x3a\x6c\xa9\xed\xfe\x0a\x89\x1f\x22\x2b\x6c\xfc\xf5\xb8\xca\x53\x7b\x8d\xf4\x54\xac\x88\xf2\xd4\x87\x9c\x7d\x79\xfb\x44\x27\xc5\xad\x48\xee\x23\x99\x5d\xef\xde\x5e\xdb\xde\x56\xe2\x59\xec\x0d\x6c\xa4\x4c\x41\xa8\x79\x0a\x05\xd0\xc1\xe8\xda\x1b\xa3\xeb\xb1\x4d\xeb\xa2\xd9\x9b\xbd\x0d\xa8\xc7\x83\xb6\x55\x37\x2f\xf8\xc8\x76\x05\x94\x41\xdb\xda\xd2\x06\x6d\x6b\x8f\x66\x93\x48\x30\x18\xf4\x1b\x49\x13\xb8\xee\x93\xf0\xe6\x19\x08\x49\x4b\xe9\xca\xca\x55\x32\x5c\xc5\x2e\x38\x40\x6a\xf9\x87\x7b\x15\x20\x33\xf3\x26\x36\x3c\x1a\x6d\x88\x75\x60\x71\x29\x03\xc4\xbc\xbb\xb9\xeb\xda\x89\xb8\xde\xc9\xbc\x89\xba\x5a\x37\x29\x2a\x30\x74\x5f\x35\xc4\x1d\x27\x43\x3c\x96\x5a\x07\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x99\xe9\x72\x95\xa1\x6d\x8c\x70\x55\x7a\xaf\x26\xc4\x8c\x3a\x15\x32\x61\x93\x6c\x49\xe6\x34\x33\xca\xd2\x03\xd3\x73\x42\xc9\x3d\xcb\x32\xd7\x4d\xf7\x89\xba\x05\x97\xab\x69\x25\x9a\x4c\xf0\x19\x4e\x06\x75\x39\x19\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x46\x48\xcb\xf0\x8e\xef\x4a\x9e\xe2\xcc\xc1\x8f\xd8\xc2\x6d\x8f\xee\xf9\x76\x72\x2d\xf9\xa8\xe7\x20\x1f\x98\x02\x5b\x48\xae\x33\x4d\x96\x96\x76\x19\x39\xfb\x59\x05\xa1\xe2\x32\x07\xcd\xb6\xc0\x54\xd6\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x59\xa0\x06\xc7\xd0\x6c\x44\xa7\x1d\xdf\xc6\x0f\x56\xd9\x06\x4a\x8b\x82\xb0\x3c\x87\xd4\xe8\xc7\xd9\x92\x2c\x18\xed\x4c\x09\x82\x42\xd4\x3b\x8a\x9c\x70\x41\x44\x61\xae\xae\x92\x33\xbd\x44\x8f\xde\xbc\xd4\x24\x15\x0f\x3c\x20\xdf\xea\xce\x85\x39\x50\x32\x01\x4d\x9d\x0d\xdc\x1c\x82\x0a\x13\x1d\xe1\xce\xcd\xd9\xc3\x24\x81\xbb\x8d\x1b\xa0\x82\x49\x9f\x51\x1d\xc0\x25\x36\x48\xf3\x76\x3d\x1f\xdf\x76\x4c\x39\x7f\x5d\x20\x0e\x73\x3f\x90\x0d\xcd\x89\x16\xa5\xee\xc9\x3d\xb2\xcd\x74\x64\x21\x2e\x1a\x4a\x22\xcb\x41\x11\x51\x46\xaa\x37\xf1\xda\x0d\x17\x53\xc3\x1b\xec\x4e\x1b\x9b\xd2\x29\xeb\x54\x75\x38\xc6\x16\xdb\x02\xde\xef\xf2\x70\x1b\xf8\x95\x93\x72\x3a\x05\x89\x37\x1d\x12\xbc\x16\x76\x5f\xd5\xf1\xf2\x77\x58\x37\xe3\xad\x0b\xf8\x02\x7d\x86\xb5\x03\x1c\x98\xc4\x96\x21\x1d\xc8\x26\x96\xe9\x95\xa0\x10\x0b\x9e\x93\xf7\x1f\xbf\xee\xb6\x45\x63\x54\x16\x08\x4b\x59\xc5\xf7\xfc\xc8\xbb\xc5\x24\xc6\xdd\x0f\x9b\x50\x5f\xdc\xb6\x48\x32\xa1\x5c\x7a\x34\xae\x4b\x32\xa7\x9c\x83\x37\x46\x31\x8d\x96\xec\x09\x00\x27\xa2\x00\x1b\x94\xd7\x89\x18\x4a\x14\xe3\xb3\x0c\x08\xd5\x9a\x26\xf3\xb1\xa1\x8e\xfb\xbd\x50\xe7\x21\xbb\x4f\x94\x96\x40\x73\xbb\x27\x24\xe4\x94\xd9\xe1\x09\x4d\xa4\x50\x8a\xe4\x65\xa6\x59\x51\x75\xd6\xcd\x8a\x08\x88\x08\xa1\x6c\x5a\xaa\x5f\x2b\x4c\x2b\xa9\x13\x9e\xcf\x6a\x0a\xdd\xeb\x8b\x66\xb1\x22\x34\x9d\x9d\x99\x6f\x21\x2f\xf4\xb2\x4a\x4c\xec\xa6\x03\x4d\x99\x54\x9a\x24\x19\x03\xae\xdd\x9b\x59\xc8\x41\xa4\xe1\xcc\x8b\xd3\xdc\xcd\x88\x72\x53\xc2\x53\x54\xbe\x0b\xad\x6c\xfe\x5d\x45\x84\xef\x2a\x65\xca\xd9\x3a\x54\xb7\xec\x3f\xea\x2b\xd3\xd8\x8d\xe3\x67\x04\xb7\x8e\x17\x70\x2c\x45\xee\xa3\x06\x09\x8d\x3a\xdb\x75\xee\x64\x18\x5f\xc1\xf2\x31\xfe\x5c\x9f\xb5\x30\x07\x6a\xdd\x02\x53\x61\xd6\xb8\x0e\x6e\x28\x0e\x0b\x73\x0e\x20\x01\x23\x8a\xd2\x88\x4c\xe6\xc5\x79\x4c\x43\x96\xfb\x00\x4a\xd1\x19\x5c\x77\x0c\x47\x88\xc1\x70\x6a\x43\x1b\xc6\x31\xd4\xdb\x66\x0e\x16\xe8\x4a\x8b\xc6\x27\xcd\x24\xaf\xa6\xf2\x98\xdb\x17\xe9\x44\x81\x57\x9a\x1e\x24\xd3\x1a\x70\x97\x62\x25\x27\x0c\x40\x5b\x05\xef\x6c\x27\x97\x75\x1a\xcf\x4d\x7a\x73\x3c\x23\x7e\xf0\xd4\xa6\x69\x4d\x80\x4c\x24\x83\x29\x99\x32\xcc\x1b\xc3\x8c\xaa\x33\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x92\x19\x66\x71\x39\x25\xf8\xdf\x5e\xfd\xfb\x1f\xc8\x64\x69\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xcc\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfe\xed\xfd\x24\xe8\xe8\x21\x7f\x3c\x4f\x61\x71\xde\xd8\x42\xa3\x4c\xcc\xba\xf5\xfa\x36\x46\x36\x71\x90\x9d\x6d\xc3\x89\x16\x19\x4b\x96\x87\x3a\xd3\xbe\x78\x09\x99\x8b\x07\x6b\xcc\x59\x3f\xaa\x0d\xa8\x97\x42\x14\x65\x86\x13\x47\xbe\xae\xf0\xf9\x4a\x05\xab\xd0\x47\xa1\x46\xc2\x06\xb7\x43\x27\xaa\x1b\x76\xe5\xce\x71\x29\x8c\x9e\x4c\xe1\x80\x27\x9c\xcf\xad\xaa\x43\xd2\xd9\x1a\xf7\x35\xcd\xb2\x09\x4d\xee\xef\xc4\xf7\x62\xa6\x3e\xf2\xf7\x52\x0a\xd9\x7e\xe7\x8c\x9a\x3b\x7d\x5e\xf2\x7b\xac\xa2\x5b\x83\xd1\x8a\x99\x8b\x29\xf4\xf8\x01\x8d\xb7\xeb\x44\x8c\x7f\x4b\x0b\x0f\xea\x45\x12\x6f\x83\xab\x47\x86\x4f\xac\x36\xb4\x71\x02\x86\xe6\xae\x09\xf8\xd0\x7a\x0f\xd5\x3c\xda\xbf\x7d\xf5\x6f\x7f\xb4\xcc\x85\x08\x49\xfe\xf8\x0a\x53\x8e\xd5\x99\xbd\x00\xf0\x06\x36\xa2\x56\x4e\xb3\xac\xab\x97\xa0\xc9\x02\xbe\xee\x5c\x9c\xba\x07\x47\x5e\x1f\xec\x74\xef\xac\x32\xde\xdd\xfd\x15\xf5\x45\xa6\x15\x64\xd3\x33\x8b\xf6\x52\x99\xb5\x8e\x51\xba\x3a\x76\x57\x5e\x77\xa4\xa0\xc3\x2b\x6d\x0b\x91\x95\x39\xbc\x83\x05\x4b\xba\x39\x30\x5b\xab\xd2\xea\xcd\x9b\xe9\x33\xa6\x10\x04\x68\x92\x89\xe4\x9e\xa4\xee\xcb\x46\xa8\xfc\x6a\x55\xed\xee\xb3\xd0\x35\x69\x20\x20\x59\x60\xeb\xfb\xb7\xd2\x04\x72\x5a\x14\x15\x42\x89\xa4\x0f\xad\xc9\x40\xd6\x84\xe8\xa8\x81\x6e\xc4\x60\x67\x7a\xa8\x2b\x7d\xe4\xde\xc8\x5c\x53\x9d\xbb\xe8\x9c\x5b\x10\xee\x89\xaf\xa9\xef\xee\xc7\x6c\x6d\x88\xba\x43\x7f\x1a\x0a\xfc\xb7\xc5\x5b\x58\x43\xc6\xaa\x20\x87\xaa\x8d\x61\x25\x48\xb3\x7d\xf0\x96\xe9\x6e\xbe\x8c\xe0\x0c\x0d\xcb\x91\x68\xcd\x0b\xaf\x9c\xd0\x39\xd5\x4e\x3f\xf2\x5e\x76\x4a\x0a\x90\x8a\x29\x23\x3a\xfd\x80\x07\xea\x6d\x46\x59\xde\x70\xdf\x1d\x6a\x12\xd6\x23\xea\x73\x5a\x8c\xee\x61\xd9\x71\xc3\x05\x1e\x97\x6d\x01\xfe\x39\x2d\x3a\xde\x03\x58\xba\x36\xfc\x1a\xe8\x78\x39\x5f\x8b\xd4\xd1\x81\xd7\x83\x2d\x49\xfc\x2c\x6a\x6c\x44\x19\xe8\xd0\x57\xce\x0f\xf5\xc2\xb5\x6f\x1c\xf3\x49\x75\xe5\xd8\xa7\xbe\xa4\x8b\x06\xdf\xef\x73\xbd\x67\x2a\xe2\x23\xb1\xd3\xa0\x48\x27\xbc\x9d\xdc\xce\x68\x5f\x47\x2d\x83\x96\x3d\x99\x0d\xd5\xd7\x19\x9a\xc6\xb6\x28\x40\x00\x01\xe6\x28\xba\x41\xc9\xf1\x9b\xe3\x83\xde\x71\x76\x65\xa4\x28\xe8\x0c\x35\xd3\x3e\x2c\xd0\x2a\x4d\x4d\x0c\xda\xb9\x78\xb0\xdf\xdb\xe8\x92\xc2\x3d\x05\x69\x0d\x64\x3e\x17\x41\xab\x63\x23\x07\xfd\x8e\x70\xda\xb5\xc5\x2a\x7c\xa0\x4b\x42\xa5\x28\x79\x50\x1a\x34\x3a\x46\x2a\xc7\xd9\x87\x95\x97\xbd\x12\x1c\xbc\x93\x3e\x64\x94\xbb\x1a\xc3\x9c\x29\x1b\xaf\xc0\x38\x79\x3d\x7e\xfd\x2a\x98\xf6\x1b\x48\x4a\xa9\xd8\x02\x6e\x5c\x8d\xf3\x86\x53\xe5\x72\x7a\x2d\x94\x62\x93\x0c\x13\xb7\xb4\x20\xef\x6d\x01\xf8\xf5\x17\xad\x02\x47\xf0\x8d\x85\x6c\xa2\x95\x06\x50\x78\x62\x4f\x70\x33\xe0\xd3\x0c\x10\x10\xf5\xd1\x2f\x49\x12\xd7\x75\x45\x92\xbc\xaa\x24\x49\x7b\xef\x1d\xf4\x5d\x7d\xe1\xfb\x3e\x70\x92\x0f\xce\x37\x50\x57\xb6\x67\xbe\x72\x32\x7e\xf4\x20\x99\x76\x87\xfb\x81\x29\x20\x27\x68\x95\x58\xd9\x8c\x41\x00\xcd\x4d\x1b\x56\x60\x05\xfc\x18\x00\xcb\x72\xf5\xe8\xf6\x61\x95\xd6\xf9\x49\x1d\x81\xff\xe0\x0c\x58\xf5\x0a\x3a\xee\x5f\xdf\xcb\x73\xca\xd3\x2c\x88\x67\x54\xb3\x92\x2d\x83\xb0\x70\x2e\xa7\xa4\xc9\x12\x9d\xff\xb2\x51\x4d\x62\x4e\x15\xe1\x82\xe4\x40\x31\x40\xd3\xdc\x2e\x9e\x0b\xb6\xb0\x9a\xe3\xd1\x60\x37\xbb\xbd\xc6\x9a\x17\x82\x63\xd7\xef\x98\x72\xec\xd9\xf0\x11\xa7\x81\xd8\xb0\x8e\x9c\xa6\x21\xa9\xdd\x8d\x39\xad\x17\x6f\x5c\x07\x4d\xae\x52\x52\x5f\x1c\x2b\xb4\x3c\x07\x1d\x67\xae\x04\xb9\x19\xbe\xc4\x38\xc1\x0d\x66\xb9\x3a\x48\x26\xc8\x9b\x6d\xdb\xea\xeb\x56\xd7\xe2\xda\xbb\x6e\xa6\xb8\x22\x38\x80\x86\xa7\x5f\xf5\xac\xc1\x0b\x7d\x8c\xa8\x75\xa9\xbb\x1a\x28\x2e\xe3\x31\x0c\xc9\xdb\x3b\x25\x2a\x73\xcf\x0c\x38\x48\xea\xfc\x0a\x3e\x44\xd4\x81\xaf\x50\x25\x78\xe8\x81\x78\x62\xc3\x19\x7e\xff\xb4\x98\x62\x7f\x16\x40\x08\xca\x39\x27\x42\xae\x9c\x76\xe7\x31\xd9\x24\xb1\xc4\x7c\xeb\x15\x68\x2e\xbb\xf9\x1b\x98\x9f\x66\x51\xfe\xbb\x64\x0b\x9a\x81\xc5\xb0\xf7\xac\xe1\xa0\xc2\x84\x2a\x27\x7d\x55\x1b\x9d\x7e\x88\x6a\xc7\xe6\xa0\x87\xad\x1a\x64\x24\x79\xe2\xe8\x88\x9c\xd8\x31\x8e\x2d\xc8\xee\x61\x85\x5c\xb7\x56\xef\x3f\x15\x01\x95\x5b\xe3\xad\xd7\xfb\x4f\x05\xc5\x38\x8d\xa2\x17\x0b\xf7\xbf\x60\x4e\x17\x80\x98\xc6\x2c\xa3\x32\xc3\xa0\xf4\x5b\x3b\x65\x64\x52\x6a\x02\x7c\xc1\xa4\xe0\xb9\x39\x7e\x08\x3e\x63\x38\x93\x04\x04\x83\x4f\x40\x91\xaf\x4e\x7e\xb8\xb8\xc1\xa4\xa5\x53\x87\x96\xef\xde\xaf\x54\x88\x0f\xb0\xf2\x0e\x8d\xee\xfa\xb8\xdf\x88\x7f\x77\xb3\x5d\x50\x3e\xf1\x73\x61\xde\x2d\x2f\x75\x49\x33\x84\x7e\x4e\xb2\xd2\xdc\x85\x07\xdb\xd9\xf1\x6d\xe0\x21\x96\xbc\x98\x26\x70\x07\xfc\xfd\x8e\x75\x3a\xae\x31\x0e\xea\xdb\xc6\x7e\x5d\x83\x21\xef\x5c\xe3\x61\x03\x08\xe5\x9a\xa0\x73\xac\x2a\x60\xca\x66\x1e\x8e\xbb\x8b\xbb\x85\x67\x60\xe9\x04\x9b\xfc\xed\x6b\x92\xae\x59\x18\xb1\x46\xcb\xc1\x6d\xf8\x1d\x0e\x43\xbc\x63\xd0\xc1\x10\x1d\x67\xd7\xa7\x5c\xbd\xc5\xa5\xd9\x8f\xe2\xb0\x8d\x7e\x5b\x69\xb2\x66\x23\xbc\xbb\xba\x6d\x16\xf4\xb0\xce\x3f\xb1\xf7\x4a\x5e\xd7\x5d\xd4\x55\x6f\xb0\x22\x5e\xe5\x40\x05\x39\xb3\xe2\x34\x22\xcf\x56\xf2\xf5\xbb\xab\xdb\x3d\xc7\xf2\xbb\xd9\x0a\xc3\x13\xaa\x6c\x8c\xf4\xbb\xab\x5b\x1b\xb7\xb6\x1f\xed\x9d\x1d\x29\xdd\x7d\x10\x08\xe0\x86\xd8\x5a\x1d\x38\x76\x38\x97\xbb\xa8\xe2\x41\xcc\xe2\xa3\xcf\xd7\x52\x43\x2e\xaf\x09\x4d\x53\x89\xe1\xcc\x5d\xce\x72\x0b\xd1\x8e\x16\x45\x15\x95\x8a\x45\x62\xa8\x82\xe6\xab\x37\xf6\x00\x0a\x3e\x1d\xd7\xcf\xb6\x77\x65\x91\x31\x1b\x7e\xda\x1c\xa2\x2e\xa1\x93\x8b\x45\x17\xfe\x14\xe2\x61\xec\xec\x5f\x0c\x92\x0f\xa2\x62\xce\x89\xae\xe5\x69\x63\xef\x52\x09\x4a\x64\x8b\xba\x78\x7e\xf0\xee\x74\xec\x08\x43\x12\xab\xdd\xe9\x2b\xd0\x3e\xd3\xce\x04\xae\x25\x83\xf5\x5d\x49\x6e\xcc\xdb\x95\xc8\xce\x2a\x12\xd8\x02\x30\x65\xc9\x55\x08\xee\x30\x32\x0e\xe3\xf3\x6e\x89\x9e\xdb\xac\x1b\xaa\xf1\x64\x52\xe9\x45\x01\x7c\xf3\x80\x57\x3c\xc8\x11\x59\x41\xa6\x4f\xdf\x5d\xdd\xda\x9b\xd4\x4e\x97\xc3\xf3\x56\x1b\xf7\x4e\xe7\x4b\x8e\x1c\xbe\x4c\x52\x88\xdb\x26\x5a\x4e\x69\x55\xd2\x94\x6d\x9c\xe0\x63\x15\x08\x91\x7a\xe3\x42\x13\xc2\x12\x81\x03\x2c\x07\x41\x48\xa5\xed\xd8\x10\x9f\xf6\xfa\xc8\x64\xe1\x68\x07\x79\xd7\xa8\x77\x85\x02\x2a\x93\x79\x97\x8d\x1d\xfb\xb2\xb0\x94\x90\x54\xd8\x0c\xb1\xa9\x90\xe8\x81\x1f\xa1\xa8\x93\x09\x71\x5f\x16\xcf\x23\xdd\xb8\x81\x0b\xaa\xe7\xcf\x76\x89\xb4\xc6\x18\xe4\x9b\xee\x7b\x36\xe5\xaa\x4b\x9e\x4b\xa0\xf2\x05\xda\xaa\x5c\x38\x72\x8d\xd4\xb6\xff\x65\xd4\x32\x83\xbd\xcd\x4a\xa5\x41\x7e\xcd\xa4\xd2\x47\xfb\xf6\xf4\x03\xcd\x98\x03\x4e\xb6\x21\x2c\xc7\xcd\xee\xfe\xc2\xf4\xdc\x15\xea\x3d\x3e\x6b\x7f\x65\xfe\x76\x64\x1c\x13\x21\xc9\xf1\x95\xe0\xb0\x77\xf0\xd0\x8a\x06\x5a\x09\x3e\xd5\x95\xbe\x55\x66\x73\x93\xa8\x20\xb3\xa0\x2a\xf8\x45\xe7\x73\x76\xe7\x6a\x27\x1b\x7a\xbc\xa4\xa0\x40\x13\x8a\x45\x27\xb1\xef\x79\x5d\xb0\xd8\x16\x47\xb3\x85\x9e\x85\xd3\x79\x97\x8d\xa5\xdd\x73\xf0\x46\x75\x35\x2d\xb6\x2f\x40\x17\xd5\x76\xef\x73\x86\x88\x21\xe0\xca\xc9\x7c\xcf\xf8\xfd\x9e\x87\x3c\xec\x84\xbc\x5f\x1b\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\x89\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xbb\x2a\x1b\x0c\xe0\xea\xcc\x86\xb9\x78\x0b\xb7\x5a\x72\x4d\xb1\xd6\xf6\x3b\x91\xdc\x83\x24\x99\xa1\x79\xdf\xcd\x57\xe7\xb1\xb6\xaa\x2a\xef\x9d\xd6\xd2\x35\x22\x03\x8a\x39\xe4\x20\x69\x56\x19\x40\x5f\x74\xd1\xbf\x77\xb7\x77\x45\x46\x33\x89\xd3\x96\x47\x74\x85\x72\x45\x3a\x26\xef\x37\x3d\x95\xd3\xa5\x2f\xfc\xce\x38\xfa\x0e\x3f\x31\xa5\xf7\xbf\x61\x0a\x91\x36\x31\x52\x4b\x05\x72\x54\x61\xe6\x12\xea\x8a\x2f\xfa\x7c\xda\x14\x26\xe5\x6c\xc6\xf8\x6c\x6c\xc5\x03\x14\x43\xea\x02\xb1\xb5\x2d\xec\x61\x0e\xfb\x46\xc8\x24\x12\x28\xc6\x0f\xa3\xb2\x62\x43\x26\x58\xb3\xf7\x5c\xa4\xb6\xf3\xc9\xd2\x5a\x60\xfd\x9e\xac\x80\x94\xc8\x25\x27\x42\xba\xba\x18\x34\x4d\xc9\xde\x61\x3a\x1b\x56\x04\xfb\xaa\xe7\xd7\x12\x57\xd6\xfe\xf9\x63\x55\xff\xaa\xb1\x40\xaa\x9c\x18\xd9\xb7\x94\xfb\xd6\xba\xee\x2a\xa3\x74\x92\x4f\x42\x65\xd1\x0b\x5e\x6f\xcf\xb7\x4d\x24\x02\x4a\x34\xe4\x85\x90\x54\x2e\x57\xd3\x4d\xcc\x4d\x62\xb6\xaf\x59\xa0\x95\xb9\xbd\x16\xa9\x11\x12\xf6\x26\x63\xc3\xb6\x5d\x30\xa3\x76\x6e\xda\xb9\x1b\xcf\x13\x5e\x6d\x5c\x10\xbf\x66\xa4\x03\x15\x2a\x99\x43\x5a\x22\xfa\xd4\xac\xa4\x92\x72\x0d\x86\x7f\xba\x10\xd6\x65\x2b\x90\xa3\x42\x6a\xa8\x60\xdb\x96\x98\x37\x8a\xc5\x9d\xcd\x27\x58\x57\xba\x4b\xb8\x89\x13\x8e\x4d\x47\x0d\x38\x88\xbb\x39\x10\x23\x49\x66\xa0\x71\xf2\x61\xc1\x12\xed\x07\x99\xe2\x22\x6c\xd8\xfa\x09\x2d\x2d\xd4\xc3\xfe\x01\x40\xd7\xc2\xd5\x51\x4d\xc0\xdc\x49\x5a\xd5\x53\xeb\xb2\x1e\x59\xa7\xb8\x92\x3b\x7f\xb2\x37\x11\x5c\x1f\xcc\x27\x8e\x24\x1a\x45\x3a\x33\x4d\x7c\xbb\x47\x18\x73\xb5\xc6\x1b\x56\x62\xcf\xa1\x02\x0c\x30\xdd\x53\x1e\x3a\xa5\x2a\x84\xd8\x7a\xa8\x9c\x1d\x2c\x09\xe8\x42\xce\xca\x1c\x93\xe6\x9d\x6e\x0b\x5c\xcb\x65\x21\x58\x57\xbf\xbd\x39\x6a\xe8\x66\x3c\x56\xe4\xed\x87\x77\x4d\xc0\xb7\x66\x99\x3e\x0f\x07\xd8\x6d\x90\x1f\xe2\x06\x28\x90\xcb\x29\xa1\x95\xd0\xd7\x89\xa2\xfa\xa2\x76\x36\x1f\xe7\xfa\xad\x08\xf4\x16\x58\xc6\x0b\x23\xc1\xa2\x9c\xde\xa8\xeb\x93\xcc\x29\x9f\x19\x56\xf5\x4e\x94\xe6\xc5\xbe\xfa\x0a\x5f\x42\x42\x5a\x26\x1d\x83\x4b\x11\x30\xda\xa1\x22\x7d\xe5\xc3\xbc\x5c\x01\x31\xa3\x8b\x82\x4a\x68\xe1\xa7\xa6\x39\x7b\x56\xca\x7d\x43\xd8\x18\xc6\xe4\xe8\xab\xc6\x57\x47\x48\x71\x27\x6a\x0a\x29\xcc\xab\x38\x10\x26\x7c\xfb\x8c\x69\xe4\x1f\x47\xcd\x11\xc6\xe4\xbd\xa1\x0b\xa3\xa6\xab\xb5\x6d\xe0\xea\x4c\xea\x95\x3d\x23\x12\x66\x54\xa6\x19\x74\x04\x10\x11\xd3\x4a\xc9\xb0\x40\x95\x6e\x57\x21\x63\x44\x5c\x01\x2e\xf4\x38\x8e\xeb\x7b\x57\x44\x3b\x4d\xd5\xbd\x3a\xb7\xea\xcc\x28\xa5\x9a\x8e\x68\x61\xed\x41\x4c\xf0\x73\x6b\xea\x1e\xb9\x22\xe5\x23\xea\x4e\xef\xa8\xda\xd9\xe7\xbf\x76\xf0\xab\x23\x5a\x3d\xc5\xf8\x88\x8e\xb0\x6c\x77\x67\xfb\xcd\x01\xd2\xee\xa2\x07\xce\x04\x95\x63\x0a\x28\xbb\x1f\x83\x4d\xbf\xaf\xb8\xb2\x5d\x8a\x31\xb9\x12\xda\x57\xd7\x4f\xeb\x44\xc3\x80\xe2\xec\x4d\xc6\xfd\xfe\xea\xee\xe6\xaf\xd7\x1f\x2f\xaf\xee\x06\xfe\x3d\xf0\x6f\x6c\x03\xff\x1e\xf8\x77\x87\x81\xfb\xc2\xbf\x81\x2f\x0e\xc5\xbb\x2b\x7b\xd7\x26\x03\xe3\x4a\xb5\xd7\xc0\x44\xf1\x2f\x28\xd1\xfe\x3d\x5f\xfc\x40\x8d\xea\x58\x48\x50\xa8\xa0\x18\x8d\x75\x53\x90\xb2\x7b\x00\x2d\x81\x75\x4c\xe7\x67\x9b\x69\x7f\xc0\x3c\xf9\x88\x79\xa2\x41\xb1\xf3\x57\x8d\x02\x20\x9b\x96\x3c\x24\xee\xfb\x03\x5d\xda\xfa\x48\xf6\x50\x52\xbe\x24\x85\x64\x5c\xe3\x56\xba\xb8\x7d\x7b\x79\x49\x92\x39\x95\x34\x41\x07\x15\x7c\x4a\xa0\xd0\xe4\xf8\x7f\x1e\x36\x4d\x3e\xb0\x9a\x6a\xbc\x95\xd9\x47\x70\x0b\x18\xa6\x16\xf9\x0a\x09\x0b\x26\x4a\x95\x2d\xab\xb2\xfd\x9b\xf9\xe8\x3a\x9a\x42\x60\x92\xd8\xd2\xbb\x99\x36\x0f\xb8\x22\x74\x6e\x12\x20\x03\x86\x3f\xb0\xe8\xe9\x88\x88\x21\x80\x06\x8c\xbf\x41\x74\xdd\x5d\x0c\x0d\x18\xb7\x93\x00\xbb\x4d\x18\x0d\xa0\xa3\x2d\xc6\x06\x74\xd4\xce\xa2\x39\x3c\x27\xfb\x5a\x8a\x3c\x12\x37\xbb\xb5\x06\x6d\x1f\x5b\xb1\xe9\xa8\x56\x51\x57\x4d\xf1\xc8\xa9\xb4\x75\xed\x14\xa3\x4e\xe7\x85\xee\x98\xf7\x41\x62\xd5\x8d\x8f\x53\x62\xdd\x46\xcd\x7f\xa0\xc5\x77\xb0\xbc\x81\xc0\x2a\x51\xed\xf9\xc6\xf8\x0b\x45\x28\xb9\x87\xa5\x0d\xae\x7c\xeb\x07\x0b\x2b\x94\xd5\xc3\xb2\xfb\xf7\xd0\x0d\x8c\xde\xb7\x78\xf5\xf2\xef\x21\x00\x2a\xc1\xb7\xb5\x62\xea\x66\x09\x51\xff\x30\x6b\xda\xab\xf2\xf1\x61\x92\xa8\x6f\x31\xcb\xd3\xd9\xd6\x94\x4c\xdd\xf5\x10\x61\xe2\x56\xe1\x72\x60\x3a\x85\x44\xfb\x14\x7c\xbb\x9b\xcf\x30\x4b\x33\x2d\x6d\x8d\x4f\x9a\xdc\x3f\x50\x99\x2a\x92\x88\xbc\xa0\x9a\x4d\x58\xc6\xf4\x32\x2c\x3f\xdf\x37\xbc\xe1\x2b\x80\x71\xcb\x14\xc9\x25\x57\x9a\xe2\x55\x28\x9c\x21\xd0\xac\x76\x8d\xf2\x8b\x60\xc0\x96\x9b\x62\x26\x10\x95\xe1\x85\xf9\x0d\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\xbc\x23\xf6\x76\xbb\xed\x59\x5e\x46\x2c\x8c\x2c\x08\x0f\xe7\x2e\x4f\x70\x64\x5e\x7c\x64\x99\x95\x3a\xc7\x2c\x94\xf3\x5f\xe3\x7f\xfa\x74\x8a\x88\xcf\x32\x7c\x43\x8e\x8e\x02\xfb\x12\x3e\x68\x29\xee\xa9\xbc\x75\xc1\x74\x4d\xd1\xa9\xba\x50\x88\x45\x04\x46\x3e\xe5\x71\x10\x9c\x16\x10\x69\x9a\xc3\xe0\x6c\x6c\x6b\x59\xaa\x72\x5a\x84\x19\xaa\xea\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\xab\xaa\x4a\x67\xfa\xc6\xe3\x7b\x28\x92\x83\xa6\x29\xd5\x74\x6c\x0e\xc4\x59\xfb\x4f\x55\xd0\x04\xce\xc8\x3f\xaa\x0f\x33\x3a\x81\x4c\xfd\x78\xfc\x1f\xdf\xbd\xff\xeb\x7f\x1e\xff\xf4\x8f\xe6\x77\x28\xae\xa1\xe1\xb4\xf9\x40\xe0\x2b\x60\xac\x14\x17\x29\x5c\x21\x75\xf8\xa7\xd3\xf4\x2e\x92\x44\x94\x5c\xbb\x2f\x10\xdc\x7d\x3c\x17\x4a\x5f\x5e\x57\x7f\x16\x22\x5d\xfd\x2b\xa0\x84\x1f\xe9\xa7\xdc\x83\x6b\x1b\x00\xf6\x68\x5b\x3c\xe9\x87\x16\xec\x07\x90\x2a\x08\x1f\xd0\xb7\x76\xc6\x86\xed\xd5\x6f\x63\x95\xcc\x21\xa7\xf8\xcf\xaf\xfd\x14\x98\xfb\xb8\x2a\xbf\xc1\x11\x45\xdf\xdc\x81\xed\x9a\xbe\x47\x8b\xd7\x41\x1a\xa7\x6d\x11\x39\x7f\xb5\x82\x91\x27\x0c\x67\xc4\xcd\x96\xe5\x00\x95\xfc\xe8\xad\x14\x75\x18\xe4\xc5\xf5\x25\x59\xd8\x19\xee\xd1\xe4\x3c\x1f\xbb\xce\x20\xba\xba\x15\xcc\xb0\xbf\xae\xa8\x72\xcb\xd4\x50\xdd\x9c\xc2\x8c\x94\x87\x2e\xd0\x8d\xc7\xea\x37\x9d\xbe\xe7\x0b\x33\xae\x6a\x95\x9a\xf4\xf2\x24\x0f\x84\xf5\x21\xfd\xe4\x99\xa1\xba\x22\x96\x45\x0f\x65\xb9\xa6\x13\x0b\x91\x72\xd5\xd5\x8b\xe0\x5b\x9f\x75\xd7\x28\xaa\x9c\x57\x80\x1b\xd0\x3c\xd5\x61\x20\x17\x86\xd9\x2f\x30\x57\xe6\xde\xc7\xae\x16\x12\x16\xc0\x75\x15\x74\xed\xea\x7e\x51\xa9\x59\x1c\x9d\xc4\x51\xa4\x2a\x4b\x77\x1d\xd6\x61\xad\x5c\xf9\x8b\xfb\x2e\xea\xf6\xae\x44\x63\xeb\x45\x56\xcc\xa9\x79\xeb\x59\xa5\x07\x6f\x3c\xed\x36\x7a\xc2\xcc\x9d\x62\xff\x84\x95\xda\x2d\xaf\x7f\xfb\xc7\x06\xa1\x3d\xba\x1b\x9e\x4d\xcd\x89\xb2\x63\x37\xe9\x4a\x58\x8d\x67\xbb\x9a\xe4\x2a\xe1\xd5\xcf\x85\xb3\x29\x7c\x37\x01\xce\x64\xfa\x89\x29\x7d\x66\xcb\x06\xfa\x13\xb4\xa0\xb2\x8a\x12\x2a\x27\x19\x53\xf3\x50\x76\x6f\xdb\xe5\xb4\x5a\x9d\x95\x32\x8a\x15\x4e\x72\x2d\x7b\x98\xb9\x58\xa1\x32\x02\x09\xdb\x4c\xcc\x6d\x94\xc2\xda\x9d\x7f\x8d\x09\x12\x75\x7c\x74\x10\xa6\xde\xe3\xf3\x60\xa1\x63\x5f\x6a\x22\xd6\x30\x14\x25\xe8\x52\x1a\x9e\x95\x5a\x3e\x71\x2d\x52\x97\xd3\x12\x4f\xf8\x8b\xa1\xac\x93\xa6\x51\xa4\x6b\x51\xc5\x66\x2b\xe2\x0b\xd9\xd1\xae\xb7\x1d\xa0\xe7\x2a\xe9\xdd\x33\x89\x28\xc6\x35\xc7\x84\x24\x64\xb6\x1e\x3b\x22\xcd\xba\xd4\x00\x0f\x3d\x6f\x06\x3c\x1e\x8f\x8f\x2d\x95\xc2\x55\x3b\xb5\x16\x45\xf3\x79\xaf\xae\x85\x5a\xa8\x7a\x06\x33\x3c\x6f\x18\x95\xdd\x12\x59\x48\x56\x37\x55\xde\xc5\x1a\x4b\x56\xff\x0c\x94\x29\x9f\xa9\xf2\x75\xaf\x6d\x60\xcd\x7c\x9a\x56\xf0\xc1\x1b\x82\xa0\xb9\xfe\x7b\x27\xfc\xa8\xaa\x58\x3f\x28\x1d\x6a\x28\x3e\xb1\x5d\x8e\x93\xa2\x3c\x73\xdd\x8f\x73\xc8\x85\x5c\x56\x7f\x56\x59\x40\x23\xa5\x85\xa4\x33\x84\x1d\xb7\x83\xdb\x9f\x55\x7f\xd9\x1f\xb6\xc8\x5b\xff\xb5\x8d\xee\x48\x4a\x29\x81\xeb\x6c\x59\xe3\xf9\x7e\x71\xba\x9c\x5f\xb7\x9e\x28\x50\xd5\xb6\x7a\x06\xfe\x73\x5c\xe7\x2d\xa2\xcf\xad\x9a\x45\x74\xa9\xbb\xf2\x40\x67\xb5\xc0\x81\x71\x1f\x56\xc8\x53\xc7\xfd\xe1\x43\x84\xa4\x6c\xc1\x94\x08\x80\x7e\xad\x3a\x5a\x77\x4f\x78\xfc\x3c\x57\x88\xd2\xa6\xa3\x57\x16\x94\x4f\x05\x16\xa5\xae\x0e\xfb\x8a\x69\xf0\x75\xa8\xe7\x05\x65\x0c\x0d\x92\xbf\x21\xff\xfb\xe4\x6f\xbf\xf9\x79\x74\xfa\xa7\x93\x93\x1f\x5f\x8d\xfe\xfd\xa7\xdf\x9c\xfc\x6d\x8c\xff\xf8\xd7\xd3\x3f\x9d\xfe\xec\xff\xf8\xcd\xe9\xe9\xc9\xc9\x8f\xdf\x7d\xf8\xe6\xee\xfa\xfd\x4f\xec\xf4\xe7\x1f\x79\x99\xdf\xdb\xbf\x7e\x3e\xf9\x11\xde\xff\xb4\x63\x27\xa7\xa7\x7f\xfa\x2a\x98\x74\xca\x97\x1f\x03\xb9\xb7\x6d\x23\xb7\x59\x18\xd7\x30\x83\xfd\xd3\x53\xb7\xf7\x18\xc9\xd5\xd6\xba\x0a\x19\xd7\x23\x21\x47\xb6\xeb\x37\xa8\xa4\x04\x0e\xe0\xb7\x57\xec\xf3\xef\xf1\x97\xde\xd4\xb7\x59\x25\x14\xf6\xe8\x80\x3f\x97\xa0\xa1\x20\x91\xa0\x5f\x22\x4c\xc6\x8e\xd4\x28\xab\xe7\xa0\xb3\xd0\x23\xf6\xa5\xdd\xa0\xbf\x84\xc8\x19\xef\x34\xb2\xeb\x5a\x6b\x52\x46\xbd\x1a\xd7\x4a\x10\x25\xd6\x8e\xe8\x9e\xbb\x87\x80\x10\x33\xdf\x86\x48\x9b\xce\x6d\x88\xb4\xd9\x42\xca\x10\x69\x13\xd4\x3e\xcb\x48\x9b\x5b\xcb\x93\x7e\x91\x61\x36\xf1\x91\xf5\x3b\x66\xee\xc4\x04\xd5\x07\xbe\xe8\x1a\x5c\x1d\x33\xd5\xcd\x9b\x3d\x10\x8a\xab\x28\x33\xaa\xb7\x64\x51\x44\xca\x7b\xeb\x99\xe7\xec\x2f\x16\xc2\xe6\xde\xa2\xda\x28\x8d\xaf\x99\x97\x99\x66\x45\xc7\x84\x80\x4a\xb5\xb4\xa9\x05\x86\xf9\x53\xa5\x44\x62\x11\x7f\x2a\x90\xbc\x8c\x2a\xed\x5f\x19\x2d\xf3\x9a\xde\x63\x0e\x4d\x02\x29\xf0\x7d\xb1\x98\x7c\xfb\xc1\xa2\x05\xfa\xb9\x9d\x2c\xcd\x3d\xf4\x9e\x2f\xdc\x9d\x44\x52\x0f\x58\x59\xfb\x4a\xa3\x8c\xfb\x65\x65\x33\x9a\x73\xe9\xb2\x15\x1a\x49\x8d\x28\x41\xd6\xa0\x3c\xe8\xcd\x11\xd3\x3a\x04\x12\xd3\x3f\x2c\x9b\xee\x76\xe1\x05\x2b\x07\xe1\xa2\x78\x95\x8d\x10\xa4\x63\xad\xc9\xe0\x75\x98\x68\x5b\xf6\xee\x3c\x42\x8f\x12\x38\xc2\xa5\xf2\xb8\x12\xf9\x73\x48\xe3\x7d\x91\xc4\x7b\x22\x85\x3f\x8f\x04\xde\x4f\xe9\x3b\x9a\xe4\x1d\x47\xea\x8e\x23\x71\xef\x11\xd7\x1e\x53\xca\x8e\x23\x61\x3f\x87\x7d\xad\x90\x30\x65\x9f\xfa\x90\xb6\xec\x11\x57\x89\x86\x4f\x68\xaa\x29\x24\x14\xc0\x2b\x40\x6f\xef\x81\x05\x9a\xcc\x87\x8c\x73\x52\xd9\x45\xe3\x5e\xd8\xb7\x9b\x2c\x65\xc3\x6d\x4d\x86\xdb\x7a\x8f\x36\xdc\xd6\xc3\x6d\xfd\x22\xb7\xb5\xe3\x56\x5f\xfe\x55\x1d\x19\x69\x09\x31\xe4\x0e\x5e\xd2\xd1\x92\x11\x50\x9b\x66\xcf\xa3\x58\xc7\x78\x9e\xe3\xc8\x5d\x4e\x5c\xd0\x39\xc3\x51\xaf\xcb\x2c\xeb\x52\xe7\xc2\xb6\x18\x0b\x70\x89\xd3\x5e\x94\x59\xe6\x6a\x23\x74\x9b\xfd\x8f\x1c\x2f\xb0\x8b\xec\x81\x2e\xd5\x19\xb9\x82\x05\xc8\x33\x72\x39\xbd\x12\xfa\xda\x9a\x4e\xba\xf5\xdb\x44\xc2\xb0\x9d\x13\x36\x25\x6f\x32\xaa\x41\x69\xa2\xe9\x0c\x23\x6a\xeb\xea\x9d\x42\xb6\x06\xad\xeb\x93\x1f\xd0\xa2\x15\xbe\x37\x7f\xed\x01\xe4\x47\x87\xd9\xab\x19\x9b\x42\xb2\x4c\xb2\x70\x36\xf1\xbd\xef\xc9\x47\x9c\x7b\xf1\x00\xe3\x94\x36\x20\x54\x7f\x86\x65\xc0\x0a\xa1\xf4\xad\xa6\x52\x1f\xba\x16\xd8\xb5\x27\xc4\x4c\x76\x42\xb3\x0c\x52\xc2\xf2\x1c\x52\x46\xb5\x11\x04\xe9\x54\x83\x24\xb4\x59\x6f\x56\xd9\x20\xf0\x46\x22\xc2\x9c\xf2\x34\x03\x49\xa6\x94\x65\xaa\x7b\x28\xfa\x4a\x5d\x5b\x85\x89\x99\x8c\x5b\x00\x7c\x0c\x63\xf4\x08\xf3\x34\x49\x84\x4c\x31\x86\x56\x78\x24\x76\x7c\x89\x10\xfe\x64\xda\x47\x14\x15\x72\xca\xe9\x0c\x72\x57\xb5\xbe\x4d\xd6\x24\x13\xc9\xbd\x22\x25\xd7\x2c\xb3\x2f\x2f\xc4\x3d\x0a\xc4\x19\x9e\xd4\xce\x43\x77\x67\x00\xd5\x3f\x47\xd5\x21\x1c\x19\xaa\xd4\xf9\xaf\xeb\xaf\xf0\x83\x8e\xc4\x45\x50\xcb\x62\x28\x65\xf0\x09\x92\x10\x01\xb1\x6d\xbd\xff\x04\x49\x75\x2b\x28\xdc\xe1\x88\xcc\x69\x21\xfe\x11\x83\x37\x92\x23\xcb\xb6\x48\x01\x3d\xb1\x82\x68\x02\xb0\x8f\x9b\x2d\x76\x8c\xc8\x5b\xb7\x08\x4c\xb9\x99\xb7\x7f\x66\x8c\x43\x7b\x61\x94\x2d\x89\x09\xcd\x4a\x09\xe6\xcf\xb5\x9a\xdf\x1e\x46\x2a\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\xfe\xff\xd8\x7b\xf7\xe6\x36\x72\x6b\x5f\xf4\xff\xf3\x29\x50\x4e\xea\x48\xda\x21\x25\x7b\x92\x49\x65\x4f\xed\x7b\x53\xda\xb2\xc6\x56\xc5\x96\x79\x25\xcd\xe4\xa4\x26\xb3\x27\x60\x37\x48\xe2\xa8\x1b\xe8\x00\x68\x49\x4c\xcd\x87\xbf\x85\x85\x47\xa3\x49\xca\x36\x01\x48\xa4\x9d\xee\x54\x4d\x2c\x8a\x6a\xbc\x17\xd6\xe3\xb7\x7e\x4b\x02\x9e\x5f\x2e\xa5\x22\xb5\xa9\x52\x51\x74\x83\x92\xb4\x6e\xa0\x06\x3d\x29\x0e\xca\x11\xa2\x2a\x07\xe8\x44\xdf\x91\xa6\x6c\x0e\xcc\x8a\x65\x8c\x1e\x21\xc9\x91\x12\xb8\xa4\xd6\x4f\x06\x9f\xea\x2f\x29\xd1\xda\x2a\x38\x87\x07\xbf\x1e\x8c\x10\x51\xc5\x11\xba\xe7\xec\x40\xc1\xf4\x1d\xa3\x1b\x8e\xda\xe4\x24\x1a\xd4\x75\x64\xc9\x5b\xc4\x08\xb1\x67\xcb\x17\xca\xd2\xd7\x0d\xe2\xad\x49\xf9\x5a\x60\x95\xc2\x74\x1d\x3e\xe7\x0f\x54\x59\x36\x07\x2d\xbf\x5f\xc2\x6e\x32\x57\x16\xc2\x12\x55\xf4\x8e\x9c\x2c\x08\xae\xd4\xc2\xc0\xe3\x19\x67\xe3\x7f\x11\xc1\x81\x17\x9b\xd9\xdf\xa4\x76\x23\x2d\x46\x19\x3e\x09\xf1\xca\xf5\x0e\x65\x41\xc6\x64\xb6\x2e\xdd\xa3\xaf\xbd\x37\x24\x5a\x25\x42\xab\xf2\xe8\xed\xcd\xcd\xe4\x0d\x51\xa1\x94\x67\xf0\x21\x7a\x73\x7e\xe3\x92\x22\x82\x5a\x51\x7b\x20\xde\xf3\xa0\x35\xc7\xa8\xe1\x62\x1f\x6e\x99\x05\x97\x49\xcb\x89\x9e\xe0\x8a\x79\xcb\xa5\x32\xc1\x01\xc5\xb5\xd8\x66\x90\x29\xc7\xfb\x08\x7f\x97\x0f\x7e\x31\x39\x46\x7f\xe3\xad\x9e\x90\x29\x9e\x56\x4b\x74\x8f\x99\xf5\x76\xa7\xc1\x72\xf5\xf3\x42\x77\xe5\x85\xbe\x41\xf4\xce\x7f\x4b\x70\x49\x84\x04\x01\x4d\x70\x72\x76\x6d\xb6\xe3\x1e\xf4\x2d\xeb\x52\x9e\xb5\x52\xf1\x1a\x2d\xec\xb0\xfb\x9c\xd9\xf6\x70\x1e\x9b\xe3\x6a\xf9\x49\x05\x69\x8c\x10\xb7\x7f\xf3\xd5\x89\xe8\x35\xe9\x65\xe6\xdd\x7e\x3e\x35\x6a\x6a\x38\x6d\xd6\x63\x6e\x98\x2f\xad\x6c\xd3\x5b\x35\x1b\x90\x32\x03\x00\x1d\x65\x04\xa1\xa3\x34\x36\xed\xd5\x17\x41\xf4\x20\xf9\x4d\xf9\x70\xed\x28\x1b\x76\x1b\x3d\x09\x7e\x1b\x59\x58\x9e\xdd\x7c\x26\x72\x94\x56\x2a\x7c\xf5\xe5\x41\x85\xe6\x02\x33\xce\x68\x81\x2b\xfa\x2f\x52\xa2\xb6\xe1\xcc\x26\x6b\x81\x66\x5b\x60\x49\xc6\x10\xca\x65\x46\x9c\xcb\x80\x3e\x59\x4b\x07\xc5\x39\xa8\x7b\x80\xc6\xd2\xe2\xde\xf4\x3a\x4f\x57\xb3\xc2\x8c\x93\xb9\xc0\xc3\x67\x2d\x42\xdb\x5b\xac\x3c\x3b\x1e\x7d\x11\xea\x24\xca\x94\xc9\xbf\x4e\x96\xa5\x38\xc2\x45\x01\x04\xd1\xe6\xba\x02\xc1\x2b\x89\xb8\x4b\xdf\x5f\xd9\xe6\x55\xab\x80\xfb\xa6\x7b\x99\x20\xb6\x40\xac\xad\xa7\x44\x74\x4c\x83\x42\xad\xcf\x69\x16\xaf\x8b\x6d\xd6\x34\xe7\xc2\x7e\x4e\xc7\xc0\x6c\x4e\xd0\x2b\xdd\xf2\x1f\xbf\xfd\xf6\xf7\xdf\x66\x68\x47\x0f\xcf\xb5\x82\x19\xba\x38\xbd\x3c\xfd\xe5\xfa\xc7\x33\xe0\x2f\x4f\x7d\x7d\xa6\xac\xcb\xdc\x39\x97\x59\x33\x2e\x9f\x34\xdf\x12\x98\x00\x93\xa5\x6c\xee\x23\x71\x0d\xbd\xd2\x9b\xb0\x95\x86\xf3\xdc\xda\x24\xd6\xbb\x6d\x5c\xcc\x32\x43\x9e\x54\x18\x27\xd3\x02\x6b\x2f\x24\x95\xac\x08\x69\xb2\x59\xfc\xd7\xfa\x6d\xbd\xfa\x32\xa8\x6c\x85\x29\x33\x0e\x1e\xa6\xbe\x2f\xdf\x96\x1a\x87\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x7a\x01\x78\xdb\x1f\xff\x10\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x31\x9d\xd3\x2b\x73\xf9\xe1\xa6\xe3\x12\xd1\x5a\x38\xee\xc2\xba\x6f\x6d\xb4\x10\xb3\x12\xdd\x92\x26\xcd\xba\xd4\x02\xd3\xe1\xd2\xfa\xb0\x34\xf0\xbd\x0b\x1b\x44\x36\xf9\xba\x46\x10\x38\x38\x99\xd1\x88\xd3\x4a\xca\x04\x71\x6f\x08\x04\x5a\x23\x64\x86\x69\x85\x30\x78\xe5\x15\xad\x89\xa9\x7f\x0d\xce\xfe\x0e\x88\xf0\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x30\xc6\xdf\x6d\xed\x35\x4c\xa5\x59\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\x26\x6b\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\xa1\xd8\x09\x50\xd3\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x50\xe1\xca\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x3d\x8d\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\x0b\x03\x73\xd3\x35\x4b\x0a\xe7\x77\x13\x5b\x08\x2c\x17\x04\x92\x31\xc9\x03\x55\xd2\x34\x6a\xe8\x3d\xdd\x8c\x6b\x7d\x61\x2e\x70\x41\x50\x43\x04\xe5\x5a\xc5\x68\x99\x2a\xf9\x3d\x43\x53\x32\xa7\x4c\xba\x15\x4b\xe9\x92\xdb\x12\x80\x24\xa2\xd2\x97\x80\x3e\x46\x57\xbd\x52\x64\x96\xae\xaa\xe0\x9d\xcc\xb4\x53\x34\xca\x34\x25\xa0\xbc\xc0\x36\x68\x71\x55\x2d\xbb\x8d\x17\x32\x4e\x3e\x32\x43\xf1\x1b\xc2\xcc\xec\x61\xcb\x60\xa0\x25\xa9\xf0\xd2\xa4\x24\xcf\x28\x03\xef\xaf\x90\x47\xc7\xe9\xd0\xac\xe8\x0e\x72\x11\xbc\xf3\xd1\x9d\x41\x25\x12\x04\x17\x49\xc4\xb8\x03\x06\xec\x53\xcf\x80\x01\x1b\x30\x60\x03\x06\x6c\xfd\x19\x30\x60\xfd\x67\xc0\x80\x3d\xde\xa1\x7d\x0e\xda\x0d\x18\xb0\xc1\x2b\xb3\xfe\x0c\x18\xb0\xa8\x67\xc0\x80\x7d\xf2\xd9\x3b\x11\x3d\x60\xc0\x3e\xe3\x19\x30\x60\x9f\xf9\x0c\x18\xb0\x01\x03\x36\x60\xc0\x06\x0c\x58\xc2\x33\x60\xc0\xb6\x1f\xde\x10\xfc\x89\x7f\x06\x0c\xd8\x80\x01\xdb\xf2\x19\x30\x60\x2b\xcf\x80\x01\x1b\x30\x60\x1f\x7b\x06\x0c\xd8\x80\x01\xb3\xcf\xe0\x6d\x5c\x7b\x06\x0c\xd8\x86\x67\xc0\x80\x6d\xd7\xce\x60\x06\xa4\xbd\xec\x49\xcc\x00\xa9\x78\x73\x4d\xe7\x09\x44\x83\xb9\x8e\xc1\xb5\xef\x89\x65\x21\x94\xb6\x7a\xab\x34\x1f\x3a\x3f\x16\x30\x94\xe9\x03\x11\xa2\x74\xba\x9b\x64\x4a\xb4\x89\xa0\x87\xd5\xa4\xdc\x26\x17\x33\x08\x20\x07\x24\x69\xfa\x54\x58\xb1\xa6\xdb\x09\xea\x04\xf4\xd5\x67\x77\xbb\x51\xa6\x6d\x97\xf8\x1e\x04\xf3\x51\x60\x66\x4a\x6d\xda\xba\xcb\xfa\x7a\x9f\xf0\x52\xba\xd2\x04\x8c\xb3\xb1\x61\xff\x3c\xd6\x1d\x3e\xe6\xf2\x38\xc1\x1b\x9c\x48\x7a\x66\x30\x72\x13\xc1\xa7\xe9\xc4\x67\xf0\x16\x09\x15\x39\xbf\x52\xda\xb3\x14\xf4\xce\xce\x90\x3b\x7b\x82\x7c\xca\x80\xd6\xc9\x79\x87\xef\x29\x4a\x67\x3f\x11\x3a\xfb\x88\xce\xd9\x05\x32\x67\xe7\xa8\x9c\x3c\xe1\xde\x0c\xa1\xde\x4c\x9a\xd2\x13\x84\x4d\x2c\xc0\xfb\x66\x21\x88\x5c\xf0\x2a\x5a\xe0\xe4\x12\x36\xef\x29\xa3\x75\x5b\x03\xdd\xbe\x96\x29\xf4\xce\x83\xd0\xa5\x13\x19\x16\x9b\x6e\x22\xe1\xc0\xcb\x5f\x12\xa8\x77\x8c\x69\xa5\xb7\x16\x90\x58\x2e\xf0\x1d\x28\x4b\x6d\x51\x10\x52\xa6\xa8\x4b\xa1\x17\xf5\xf7\xc7\xbe\x87\x86\x8c\x9c\x4a\xf4\x2a\xed\xaa\x49\xd3\xc7\x03\x37\xd3\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\x78\xec\xee\x66\x4e\x77\x7f\x24\xb9\x3e\x72\x28\x06\xa9\xd6\x7d\x5f\x07\xd5\x06\x78\x3f\x34\x37\x87\x55\x24\xe2\x8e\x16\xe4\xf8\x19\x0c\xe8\x5c\x46\x69\xfa\x41\x40\xe0\xbe\x86\x81\xef\x8b\xda\x75\x6d\xba\xe3\x3d\xdf\x81\xef\xc4\xf6\x14\xc0\x8c\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\x7c\x8a\xc2\x9c\xaa\x45\x3b\x3d\x2e\x78\x7d\xa2\x45\x87\xf9\xcf\xb4\xe2\xd3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xb8\x36\x3d\xe8\x11\xe3\x75\x4a\xb4\xdc\xe7\x62\xc5\x8a\xd5\x93\x92\xbe\x49\x93\xef\xef\xd4\xea\x09\x89\x70\xd9\x9d\x40\x65\x07\xa9\x8d\x32\x38\xaa\x73\x0a\x95\xfd\x80\xc3\x3e\x19\x14\x36\xcb\x59\xcd\x04\x81\xdd\x23\xf8\xeb\xde\xd8\x42\xfb\x02\x79\xdd\xc3\x9a\xfb\x19\x60\xae\x39\x20\xae\xf9\xe0\xad\xfb\x5a\x9a\xfe\xc9\x20\xad\x5f\x04\x9c\x35\x63\xdc\x26\x13\x8c\xf5\x39\x20\xac\xfb\xeb\x83\x41\x19\x60\xab\xcf\x07\x59\xcd\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x88\xea\x73\xc4\xa5\x9f\x2c\x26\x9d\x21\x1e\x9d\x33\x16\x9d\x2d\x0e\xfd\x64\x50\xd4\x74\x18\x6a\x56\x9f\xc2\xb3\xc0\x4f\x73\x42\x4f\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x00\x8a\xb9\x56\xe2\x72\x0d\xc4\x68\xdc\xd6\xfd\x78\xfb\x02\x4b\xe4\xaa\x20\x59\xea\x11\x17\x84\xb6\x2a\x30\xc4\x8f\xcd\xf8\xa2\x8b\x91\xa1\xed\xb9\x28\xee\xb9\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\x7f\x3a\x26\x8a\x80\x82\x22\x49\x4d\xdf\x0f\xf7\xb8\xe1\xfb\xd8\x93\x5d\xf3\x96\xdf\x23\x3e\x53\x84\xa1\x43\xca\xdc\xce\x39\x0a\xbc\x34\x5d\x78\x24\x39\xde\xa1\xdf\xfa\xea\xa5\x6b\xe4\xeb\x8b\x7b\x40\x64\x48\xca\xbd\x8e\x7c\xd9\x3e\x7e\x3a\xf4\x65\xbf\x38\x6b\xab\x7e\xf8\xcb\x84\xc4\xf2\xc4\xbe\x5e\x1d\xa3\xf7\x56\x9d\x78\x05\xfd\xf1\xa2\x08\xb3\x12\x59\xde\xa8\xaf\x6f\x9f\x24\x43\xb0\xfb\xc6\x8d\xc7\x4c\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\x7f\x0b\x14\xd0\xc1\xe9\xba\x37\x4e\xd7\x1d\x21\x83\xbf\x3e\x6b\xeb\xf9\x91\xc0\x83\xb5\xf5\xef\x62\x6d\x05\x74\x6d\x6f\x04\x2e\xc8\x64\x9f\x94\x37\x27\x40\xba\x04\xb5\x4e\x87\xf3\xe2\x82\x11\x62\x12\x9a\x3a\x32\x3e\xe0\x9d\x9b\xb5\x55\xb5\x34\x3e\xc4\x1e\x33\x63\xfc\xd6\xba\x59\x90\x35\x4a\x3b\x08\xa5\x6e\xe8\x5d\x67\x9b\x34\x82\x5b\x8d\x44\xb4\x8c\x69\x15\xc3\x1e\x27\xdd\x79\x6d\x8b\x48\xc2\xe2\xdd\xe9\xb8\x47\xb8\x67\xc1\xd1\x00\xf4\x5c\x10\xd4\xe5\xd5\xf4\x3b\xa2\x5b\x9d\x71\x51\xd0\x69\xb5\x44\x0b\x5c\x69\x63\xc9\x82\x87\x6f\x69\x55\xd9\xd7\x24\x80\x95\x89\x32\xa1\x67\xa3\xd1\x54\x9c\xcd\x61\x32\xb0\xe9\x08\x79\x68\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc9\x5b\xe1\xfa\x99\x84\xd6\x0e\x5a\xa7\x12\x31\x5a\x8d\xdc\x94\xf7\xa9\x19\xd7\xf7\x7c\xe7\x52\x96\xa4\xb4\xac\x8a\xf7\x54\x92\x11\xbc\x33\xba\x4f\xa6\x2f\xfc\x8e\x08\x41\x4b\x62\xf6\x8d\xf9\xac\x11\xfc\x8e\x96\x1d\x76\x5c\x6f\x0b\xc0\x6d\x47\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\x39\x06\xf5\xd8\x0a\x34\x83\xe8\x34\xed\x1b\xfc\x20\x2b\x69\x81\x15\x91\x80\x95\xef\x51\xae\xde\x51\x1c\xdd\x13\x3d\x9e\x60\x47\xa1\x43\xc6\x11\x87\x8c\xb7\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\xec\x28\xe5\x60\x1a\x98\x03\x46\x53\xa2\x70\x97\xb4\xe6\x54\x32\x89\x08\xc3\xd3\x4a\x9f\x3d\xc0\x90\xdf\x6c\xdc\x00\x68\x46\xb0\x6a\x05\x41\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x37\x43\x2d\x93\x24\x51\x91\xcd\x66\x02\x44\x66\x62\xea\x13\xcd\x5b\xb5\x27\xf7\xc8\x63\xae\x23\x93\x51\x12\x18\x89\xb4\x26\x12\xf1\x36\xc1\x93\xd7\x33\xff\x6c\x73\x39\x2d\xbc\xc1\xef\xb4\xf1\x89\x0d\x9b\xe6\xd8\x61\x97\x81\x56\xbe\x21\x0f\xa5\x03\x5e\x99\x1c\xdf\xd7\x97\xd7\xbf\xbc\x3b\xfd\xef\xf3\x77\x71\x5b\x00\x64\x1d\x0b\x75\xe7\x96\xd1\x7f\xb6\x04\xe1\x9a\xb3\x39\xc2\x55\x98\x02\x33\x02\x47\x67\xf0\x01\x48\xc5\xbc\xc9\x32\x91\x7a\xad\xbe\x04\xa2\x04\xc3\x1a\x1c\xf3\x39\x32\x82\x62\x51\x20\x09\xe8\x8f\x3e\x12\xc6\x8d\x01\xf0\xa7\x3d\xf2\x06\x46\x94\x3e\xe3\xc6\x20\xa4\x0c\x61\x24\x29\x9b\x57\xc9\xb6\x60\xb2\x47\x24\xd5\x1f\x32\xee\x46\x30\x89\x75\x8b\xa4\x3b\x45\x7a\x7d\x88\xb7\x2a\xf3\x39\x04\xba\xcb\xcc\xb9\x00\xc8\x43\xc3\x25\x71\x2e\x00\xa3\xe3\x5e\x4c\x10\x2e\x4b\x91\xa4\x47\x5b\x61\xe3\x6d\x74\x43\x10\x60\x9a\x35\xa1\xdf\x11\x7a\x89\xfe\x0b\x3d\xa0\xff\x02\x87\xc0\x1f\xe3\x9b\xca\x63\x6e\xe7\x40\x34\x2f\xb8\x54\x17\x93\x4c\x0b\xfd\xd7\x05\x56\xf0\x46\xbd\x1e\x8a\xa3\x29\xb5\x96\x19\x79\x50\x44\x68\x8d\xd8\xae\x61\xea\xcc\x25\x39\x17\x74\x07\xbf\x94\xdd\x9d\x1a\x67\xbd\x98\xf5\x81\xd0\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x96\x8b\xb0\x1f\x35\x56\xc5\xa2\x2f\xee\x53\x5a\x7d\xaf\xf7\x5e\x70\xfd\x97\x1c\x2e\x4a\x93\xce\xb6\xa0\x09\xc2\x61\x7f\x4e\x6c\x1a\x64\x2e\xdf\xd6\xfd\xd8\xd6\x5a\x71\x6f\x82\x1a\x66\xf5\xb6\xa0\x72\x44\xc3\xcb\x63\x74\x8e\x8b\x45\x42\x2f\xf4\x6c\x94\x81\x32\xd0\xf0\xd2\x74\x63\x81\xef\xf4\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4d\xc1\x8f\x09\x32\x23\x42\x98\x94\xc9\xe9\xd2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x89\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\x87\xd7\x93\x11\xba\x39\x9b\x8c\x10\x17\xe8\xfa\x2c\x0d\x07\x12\x5a\xa3\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x3a\xc7\xcd\xd9\x24\xe2\x25\xeb\x48\xc2\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x40\xb6\xf0\xf9\xcf\x40\xb6\x30\x90\x2d\x0c\x64\x0b\x03\xd9\xc2\x40\xb6\xb0\xbf\x40\xff\x81\x6c\xe1\x93\xcf\x40\xb6\xf0\xe8\x33\x90\x2d\x6c\xf5\x0c\x64\x0b\xeb\xcf\x40\xb6\xf0\x91\x67\x20\x5b\xf0\xcf\x40\xb6\x30\x90\x2d\x7c\xb9\x52\x7b\x20\x5b\x58\x7d\x06\xb2\x85\x81\x6c\x61\x20\x5b\x08\x9f\x81\x6c\xe1\x91\x67\x20\x5b\x18\xc8\x16\x06\xb2\x85\x8f\x3f\x03\xd9\x42\xf4\x33\x90\x2d\x6c\xf7\x0c\xe9\x3f\x5b\x3e\x03\xd9\xc2\x40\xb6\xb0\xfa\x0c\x64\x0b\x9f\x7c\xf6\xc3\x3d\x3e\x90\x2d\x0c\x64\x0b\x1f\x7d\x06\xb2\x85\x81\x6c\xe1\xa3\xcf\x40\xb6\x10\xf1\xec\x9d\xd3\x75\x20\x5b\x18\xc8\x16\x3e\xd6\xc6\x60\x6d\x6d\xf7\x0c\x64\x0b\x03\xd9\xc2\xda\x33\x90\x2d\xac\x3f\x03\xd9\xc2\x40\xb6\x30\x90\x2d\x0c\x64\x0b\xfe\x19\xc8\x16\xbe\x76\xbf\x93\x20\x92\xfe\x8b\x4c\x78\x45\x8b\x65\x72\x9e\xc9\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x67\xc9\xfb\x57\xc1\xc4\x85\x49\xfc\xc2\xce\xc1\x53\x4c\xc1\x5e\x24\xf2\xbb\x01\x5e\xc6\x23\x08\xe0\x25\x0a\x0b\x65\xa6\x2f\xce\x59\x9a\x6c\xb5\x87\x03\xd9\x87\x44\xc2\x90\x7b\xc4\xef\x22\xc5\xbd\xb0\xa5\x8f\x6e\x2e\xdc\x34\x15\x4d\x49\xc9\x44\xe8\xba\x05\xed\x82\xd8\x10\xb8\xfc\x0e\x15\x4d\x3b\x42\x35\xa9\xb9\x48\x48\x8c\xc8\x60\xc1\xf5\xb6\xca\x3e\xac\xd3\x95\xe9\x90\x9b\x7c\xc5\x61\xfe\x97\xc6\x5e\xe8\x08\x62\xfc\x5a\x51\x27\x0e\x93\xb0\x66\xeb\x65\xab\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x30\x9d\x5b\x26\x72\xc1\xbb\x0b\xed\xb3\x73\x27\xd1\xf9\x86\x4f\x21\xfe\x29\x1b\xfd\x12\x3f\xa6\xa8\x0e\xe1\x4a\x10\x5c\x2e\xa1\x1b\x05\xe0\xf5\x3a\xff\xdf\x17\x98\xb6\x59\x54\x98\xc6\x83\xfc\x72\x1d\xe9\x33\xe8\x05\xd2\xfb\xb5\x03\xbf\x43\x1e\x99\x5f\xac\x91\x87\x78\x53\x73\xc6\x8f\xdd\xaf\xcc\x1f\x8f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x66\xdc\x19\x93\xae\x24\x0d\xd1\xda\xbb\x71\x76\xc6\xeb\xe8\x4b\x86\x6b\x5a\xb8\x53\x71\x6a\x36\x21\xe5\x6c\xc5\x02\xcc\xd1\x65\x6d\x98\xd6\x75\xab\xf0\xb4\x22\xc7\xe8\x42\x6d\x2c\x95\x9f\x96\xb3\x8c\xb2\x60\x55\x13\x71\xaa\x1b\x15\x68\xd8\x54\x86\x79\x81\x30\x2d\x7e\x38\x23\x88\x30\x25\x96\x7a\xff\x4d\x78\x79\xad\xb7\x60\xef\xdb\xc9\x84\x0c\x89\xf0\xd4\x1c\xd0\xd4\x44\x58\x6a\x1e\x30\x69\x3a\x90\x34\x2f\x88\xb4\x73\xf7\x1b\x3e\x99\x30\x3b\xa7\xb7\x2d\xf4\x15\xb0\x41\x34\x21\x3e\x4b\xec\x81\x6e\x71\xc2\x4b\xad\xe0\x08\x62\xe4\x93\x3f\xa3\xc6\xd9\x77\xa1\x3b\x77\x0b\xde\x39\xac\x3a\xcd\x07\xdf\x61\x5a\xe9\x03\x9c\xd8\x01\x9f\xdd\x9c\x29\x4a\x93\x29\xae\x60\x81\xf4\xfb\xb4\x59\x6c\x0a\x56\x2f\x8b\xab\x58\x70\x49\x18\xc8\x4b\xec\xb3\x6d\x7c\x2e\x80\x15\x31\xa5\xb9\x8b\x53\x11\xbf\x17\x33\x44\xea\x46\x2d\x47\x88\xdc\x11\xb1\x54\x0b\x40\x06\x08\x6e\xd0\x22\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x8c\x10\x77\xce\xe2\xc4\xe6\xe1\x7e\xb0\xf6\x53\x5b\x29\x63\x4d\x81\xfe\x9d\x94\x0e\x6a\x9e\x0c\xbb\x26\x37\xe9\x09\x4a\x15\x9a\x39\x49\x4b\xf4\x53\xd1\x9a\xc6\x51\x41\xa2\x8c\x67\xe1\x1d\xf4\x22\x48\xf3\xd0\x5b\xa2\xc6\x0f\xe0\x4a\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x95\xdc\x69\xf7\xcf\xe6\x63\x2c\x38\x9b\xd1\xb9\x8d\x82\x9d\xd4\x98\xe1\x39\x19\xfb\xee\x8c\x3b\xf5\xe6\x64\x77\xe8\x0c\x5c\x3a\x1a\x89\x49\x8e\x9c\x62\xac\x14\x11\xec\x3b\xf4\x3f\x87\x7f\xff\xdd\xaf\xe3\xa3\x3f\x1f\x1e\xfe\xf4\x72\xfc\x9f\x3f\xff\xee\xf0\xef\xc7\xf0\x8f\xff\x38\xfa\xf3\xd1\xaf\xee\x87\xdf\x1d\x1d\x1d\x1e\xfe\xf4\x97\xf7\x6f\x6e\x26\xe7\x3f\xd3\xa3\x5f\x7f\x62\x6d\x7d\x6b\x7e\xfa\xf5\xf0\x27\x72\xfe\xf3\x67\xbe\xe4\xe8\xe8\xcf\xbf\x8d\x8f\x14\xa6\x86\xc5\xf3\x05\xc5\x33\x85\xc4\x9f\x24\x20\x6e\x65\xec\xce\x0f\xbf\xbd\x02\xd7\x8e\xbf\x8d\x24\x7c\xec\xf8\x8b\x64\xff\xc9\xc5\xac\x6b\x9f\x4a\xc4\x6b\xaa\x94\xf5\x16\xe0\x90\xa7\x66\xc5\x77\x63\x05\x16\x9d\x19\x05\x8a\xca\x90\x2f\xa5\x73\xf9\x44\x77\xcb\xdf\xaf\xe0\xad\x62\x88\xd6\x4d\x45\x6a\xc2\x14\x08\x9e\xb1\xb3\x6d\xc1\xf5\x77\xdc\x8d\xa0\xc0\x8c\x71\x85\xc8\x43\x41\x48\x69\x3b\x39\xc8\xc6\xe0\x19\x64\xe3\x20\x1b\x3f\xf5\x24\xfb\xaf\x33\x39\x32\x43\x9f\xf5\x5a\x34\x4a\xcb\x05\x73\xc4\x9c\xfa\x0c\x5f\xf7\x1c\x07\x7c\x86\x48\x2c\x97\x65\xd7\x88\xa5\xc7\xc4\xb1\xde\x4a\x04\xf9\xe1\x56\x2a\x49\x87\x95\x31\xb6\x28\x67\xfb\xc1\x85\xde\x5b\xee\xab\xb6\xda\xa5\xf3\x3a\x60\x16\xd7\xba\x3d\x78\x34\x75\x8f\x1c\xa8\x7b\x41\x8a\x5b\xe3\x42\x2e\x89\x01\x59\x10\x73\x07\xc5\x69\x00\x01\x4d\xfe\x82\xb7\x55\xa9\xdb\xb0\xd3\x41\xcc\x02\x3d\x50\x75\xfc\xd1\x35\x8c\x6a\xf7\x2b\xa5\x87\xb7\x67\x56\xef\xa1\x40\x97\x59\xf0\xfb\x50\x95\x80\x39\xd5\x0a\xc3\x02\xb3\x32\x1a\x7f\xbf\x07\x61\x65\x0c\x98\xf4\x1d\x85\x82\x4d\xe3\xfb\x10\x5c\xbc\xf6\x50\x7d\x2d\x87\xb1\x05\xea\xe3\x5b\xc2\xf4\x01\x5a\x5f\xf8\x99\xa7\x74\xa0\x02\x34\xba\x14\xa6\x02\x00\x55\x62\x45\xa5\xd6\x36\x0d\xd4\x0d\x3c\x2a\x0d\x97\x92\x4e\x2b\xd2\xc1\x70\x5e\xd8\xcd\xf9\x42\x0b\x0f\x77\x5b\xa4\x51\x2c\x66\xf0\xed\x65\x50\x00\xf4\xac\x9e\xf1\x32\x45\x8d\x5b\xf1\xe8\x7b\x21\x6c\x10\x9c\x50\xc2\xa3\x34\x32\x18\x04\xb0\x5e\xd7\xfe\xaa\x7e\x1d\xae\x7c\x7d\x26\xb1\xe2\xf1\x2a\x5d\x1e\x77\xbe\xeb\xc6\x7e\x79\x69\x7b\x9b\x42\x90\x0a\x8c\x1c\xb9\xa0\x0d\x9a\x12\x75\x4f\xc8\x4a\x52\x42\xb7\x6f\x0e\xe5\x91\x43\x29\x27\x76\xa2\x43\x2a\x18\xc4\xc7\x31\x9a\xf4\x8e\x39\xc4\xbc\xd3\x89\x46\x2e\xd8\x77\xab\x22\x0a\x98\x50\x9d\x98\x71\x22\x6c\xc3\x58\x21\x06\x98\x16\xb1\xf4\x83\x25\xa0\xfd\xac\x8d\x39\x79\x78\x97\x5c\xa5\x8d\x30\x79\x68\x5a\x8f\xb2\xde\xfc\x27\x19\x65\xa6\x60\x89\x85\x15\xed\xd1\x29\xec\x5f\xb5\x76\xee\xec\xd6\xf7\xc2\xb9\x17\x65\x0e\xc4\x77\xea\xce\x39\x55\xa8\xe6\x52\xa1\x6f\xbe\xfd\x16\x11\xe3\x8b\x31\x20\x93\x64\x17\x34\xca\xc6\xc0\x94\x85\x83\x29\x1f\xed\x22\xca\x46\xbd\x88\x3e\x12\xf9\x88\x23\x1b\xcb\x0c\x7c\x92\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\xa8\x08\x63\x8e\xb3\xd2\xe5\x21\x5e\xf7\x3b\x64\xd1\x30\xee\xe4\x98\xdf\x21\xde\x18\x6a\xe9\x47\x8b\xa7\x75\x56\x61\xcb\xc0\x19\x10\xb7\xcb\x2f\x66\x7a\x95\x4c\x62\x0a\x18\x8e\x80\xd5\x59\xed\xa2\x4b\x19\x31\xdd\xf9\x67\x4b\xef\x70\xa5\x45\x73\xf7\x17\x13\x48\x22\x08\xff\xe8\x0b\x84\x50\x81\xbc\x98\x08\x7a\x47\x2b\x32\x27\xe7\xb2\xc0\x46\x99\xd8\xb5\x1b\xfe\xf4\x91\x7e\xc1\x7e\x10\xbc\x92\xe8\x7e\x41\xd4\x82\x08\x84\x5d\xe2\x12\x40\x7c\xe6\x98\x32\x54\x73\x91\x02\x03\xb1\x8d\x4a\x93\x39\x45\x95\x44\x0d\x16\x7a\xed\x5d\x86\x94\x01\x1a\x4d\x39\xaf\x2c\x4b\x7c\xb5\xec\xfa\x45\xe3\xf1\x12\x10\x73\xe7\xbf\x30\x72\xff\x8b\xee\x85\x44\xb3\x0a\xcf\x7d\x62\x14\x5c\x31\xab\x9a\x5d\x72\xd2\xd6\xa3\x13\x0d\x14\xe8\xad\xbe\x51\xee\xf1\x52\x76\xe9\x6c\x5d\xdb\x34\x41\xb6\xbf\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xe6\x08\xf8\x47\xce\x4e\x27\xbf\x5c\xff\xed\xfa\x97\xd3\xd7\xef\x2f\x2e\xa3\x5f\x76\xc9\x15\x31\x71\x94\xc0\xb5\x64\x1d\x4e\x76\x15\x3c\x54\xf7\x98\xcb\x63\x00\x49\x00\x97\x1a\x2b\xf9\x7d\x22\x92\x4c\xef\x29\x82\xe3\xfc\x18\xb8\x69\x4e\x45\xcd\xc5\x44\xf0\x19\xad\xa2\x75\xef\x5c\x27\x78\xa5\x3b\x0e\x53\x72\x6a\x3f\xee\xc4\xbd\xa1\xf7\x59\x87\x2e\x06\x82\x9a\x02\x89\x8c\x7e\x4d\x7c\x0c\xab\x97\x02\x68\x12\x12\x57\xba\x18\x7f\x88\x76\xba\x67\x76\x4e\x9e\xa0\xbb\x11\xf9\xe7\x39\x8c\xf4\x8a\x17\xb8\x82\xc2\x75\x69\x1b\x1f\x65\x36\x11\x56\xfb\x15\x24\x7b\x62\xb7\x9d\x51\xc5\x71\x69\xbc\xdb\x46\xf8\x97\xc4\x15\xb5\x70\xca\x0e\x40\xe4\x92\x3a\x72\x63\x12\xed\xa0\x3d\x97\x9d\xda\x08\xe2\x22\xa4\xab\xcd\x73\x53\xcb\x23\xa9\xc9\xf7\x7d\xc0\xa1\x1d\x65\x8f\x47\x21\xf5\xcc\xf9\x66\xec\x01\xa3\x33\xf0\x6c\x80\xc7\x51\x9b\xcc\xcb\xc6\xb8\x1a\xdf\xb9\x65\x48\xa8\x78\x95\xc9\x8c\x85\x97\xec\xc9\xee\x34\xf3\xe3\x77\xa4\xc9\x12\xba\xa5\x7a\x06\x67\x9d\x90\x76\xdb\xc6\xe9\x20\x26\x55\x28\x71\x3f\xfe\x08\xb5\x15\x9d\xfc\xcf\xe0\x26\xf2\x4b\x8c\xc6\xc1\xd1\x6a\x04\x19\xaf\x1f\xaf\x54\xcb\xfb\xaa\x65\x8a\xd6\xc4\x51\x4f\x8d\x57\x74\x22\x61\x7e\x7d\x20\x3d\xd1\x7b\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x2e\x80\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\xa8\x9b\x14\xf4\x07\x70\x2b\x65\x79\x52\x0a\xde\x98\x9b\xd8\x71\x42\xa4\xa7\x00\xf4\x73\x8f\x43\x8a\x7f\xeb\x13\xea\x75\x64\x2e\x30\x53\x1d\xe9\xc0\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x81\xec\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x6c\xe6\x67\x6e\x70\x41\xf2\x31\x9a\x7c\xb8\xbe\xf8\x3f\x2b\xe7\x26\x5e\xb5\x33\xcf\x7e\x73\x19\x6b\x79\x90\x6d\xdb\x5c\x91\x9a\xdf\x0d\x1b\xe7\xab\xdf\x38\xde\x41\xb4\x73\x22\xc6\xab\x36\x8c\xfd\x52\x16\x74\x0d\xd5\x49\xba\xce\xc4\x73\x16\xf5\xdf\x1a\xe4\xa4\x62\x41\x90\xfe\x0a\x53\x14\x57\xd5\x32\xf4\x91\x2a\x6e\x6a\x1c\x66\x29\xd4\x1d\xde\xae\x33\x5c\xc9\x2f\xf5\x8a\x4c\x71\xed\x34\x82\x17\xef\x79\xcb\xf2\x30\x3b\x26\xec\x38\xdf\x11\x54\x12\xc6\x95\xf5\xa6\x80\x2d\xc1\x67\xf0\x5b\x64\x00\xd2\x01\x69\x73\x4f\xcf\x49\x50\xb3\x6e\x02\xd5\xca\x23\x49\x9c\x1e\x6e\xec\x97\x56\x12\xb9\x59\xaf\xea\xf0\xd2\xb3\x04\x4c\x81\x20\xb8\x34\x90\x16\xac\x16\x86\x4d\xb4\xc6\xf2\x96\x94\xe6\x83\x44\x26\x25\xcf\x9a\x04\x19\x73\x6e\xa6\x6f\xf4\xe4\xba\x04\x59\x70\x08\x1b\xf8\x1d\x50\x2b\xa5\x98\x62\x3b\x3d\x0d\x09\x82\x5d\x2f\xc2\x07\x56\x2d\xaf\x38\x57\xdf\xfb\x62\xa9\xbb\x3e\x19\x7f\xb5\xe1\x88\xbe\x13\x13\xfc\xd2\x18\xba\x3c\x86\x8d\x03\x72\x31\x28\xf1\x9a\x2a\x16\xf5\x82\xfc\xbb\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xc9\xf6\x98\x12\xcb\x86\x53\xa6\x9c\xc7\x2b\x63\xd0\xe6\x07\x4b\x6b\x18\x4a\xb6\x64\x06\x33\x84\xde\xe3\x25\xc2\x95\xe4\xde\xa5\xc6\x36\x05\x39\x5d\x04\x55\xff\x7a\xca\xd5\x62\x2d\x74\x8a\x59\x7c\x28\x67\xbd\xbd\x51\xc0\xd9\xd7\x41\x53\x28\x5b\x6b\x56\x41\x0a\x71\x23\x48\x41\x4a\xc2\x8a\x2f\xf5\x44\xec\x9a\x42\x0e\x4e\xd5\x25\x67\x5a\xbc\xee\xfa\x5c\x5d\x78\xff\xa4\x5d\x8d\xf0\x14\x81\x2b\xdb\x06\x11\x31\xd0\x2d\x82\x70\x6d\x65\x0a\x06\xf4\x62\x06\x51\x4f\xb3\xe9\xfe\xd2\x4e\x49\xa5\x17\x9b\x56\x95\xde\x81\xb4\xc4\xca\x00\x02\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x68\x3c\x7c\xb2\xe4\x44\xfa\xc2\xdc\x58\xa2\x1f\x2e\x5e\xa3\x97\xe8\x50\x8f\xcd\x60\xf7\x66\x98\x56\xc0\xe0\xe8\x50\xb3\xa1\x0d\x30\x83\xdc\x30\x9e\x82\x30\xba\xb0\x72\x04\x71\x61\xae\x96\x11\x62\x1c\xc9\xb6\x58\xb8\x39\xa0\x9c\x79\x8f\xb0\xa5\xf3\x4f\xca\x7a\x1d\xc4\x4e\xbe\xfb\xf0\x07\x49\xa2\xc1\xaa\x39\xaf\xc3\x1f\x9e\xf1\x3a\x0c\x4d\x44\x7d\xfc\xfb\x0b\x66\xce\x6a\x4d\x14\x2e\xb1\xc2\xf6\x9a\x74\x5f\x18\x76\xed\x70\x59\x26\x5c\x96\x92\xbc\xa3\xac\x7d\x30\x48\xb7\xbd\x08\x7b\x5c\x9f\x43\x8f\xe0\x78\xc1\x42\xf3\x20\x6e\xe7\x22\x14\x19\x92\x25\x2e\x7a\xc7\x68\xf4\x88\xd5\x0d\xb7\x84\x63\x1b\xd3\x86\x10\x66\x25\xaf\xd7\x3a\x09\x74\x68\xb1\x09\x82\xa8\x97\xfd\x31\x1c\x4c\xf7\xfc\x7b\x07\x84\x2a\x72\x47\xaa\x6c\xbe\xfd\x77\xfa\x6d\x7a\x72\xdc\xce\x85\xd7\xa3\x0a\x4f\x49\x65\x39\xd8\x0c\x89\x66\xc6\x13\x96\xc9\x07\x2e\x78\x46\x48\xcc\x15\x37\x48\x2e\xec\x27\x42\xbf\xfe\x8b\x98\x87\xac\xe0\x8b\x1b\x8b\x2e\xe9\xe6\x01\x7c\xa0\x5f\xc2\x3c\xb4\x09\x0a\x22\x5a\x9d\x07\xad\x6d\xf6\xe7\x01\xf4\xaf\x7d\x9f\x07\x49\x8a\x82\xd7\xcd\x9e\x20\x25\x6f\x0c\x0a\x5e\xf7\xe8\x73\x51\x91\xfd\x2f\xe3\x24\xb8\xb3\x2d\x83\x80\x95\xb9\x07\x5d\x2d\x84\xff\x1d\x5c\xe7\x20\xed\x56\xef\x78\xdb\x7a\x32\x22\xd3\xb7\x68\x5f\xf8\xef\x78\xe3\x0d\x30\xcc\xde\xf3\xec\x30\xcc\x80\x9e\x15\x83\x7b\xbe\x07\x89\xfc\x1a\xc0\x98\xda\x08\x80\x79\x25\xac\xa4\x6c\x0e\x01\xab\x91\xcd\x1d\xbd\x23\x4e\x3c\xdf\x1a\x8f\xd7\x01\x48\x1c\xd7\x21\x27\x6e\x3a\xcc\xaa\xa1\x6d\xcd\x8a\xdd\xdc\x84\xd7\x34\xdf\xb9\xfc\x70\x13\x92\xb6\x62\xb6\x34\x84\x44\xf0\x27\x3b\xbf\x4e\xbf\x18\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2e\x43\x27\x08\xae\x52\xd9\x5e\xcc\xb3\xc9\x0b\xe2\x4e\x81\xe7\x2d\x5d\xf7\x06\xf4\x8b\x5d\xa5\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x42\xcf\xa0\xa2\xb8\xba\x6e\x48\xb1\x2f\xb7\xc5\x9b\xf7\xd7\xa7\xfd\x9e\x81\x2e\x6c\x59\x9a\x09\xfc\x1e\xe1\xb2\xa6\x52\x42\xc0\x87\x4c\x17\x9c\xdf\x26\x35\x79\xe8\x98\xfb\xe6\x54\x2d\xda\xe9\x71\xc1\xeb\x80\xc4\x6f\x2c\xe9\x5c\x9e\x58\x89\x32\xd6\x13\x77\x84\x28\xab\x7c\xa6\x30\x78\x0b\x99\x92\x36\x82\x90\x3c\x78\x54\xf8\xd1\xc3\xd6\x83\xfc\x14\x0f\xcd\x5e\x9f\x1e\xa0\xd2\x86\xcd\xbb\x73\xad\x63\x7d\x57\xa5\x95\xa1\x59\xd9\x59\x8f\x8c\x3d\xa4\x85\xb6\x51\x9c\x8d\xf3\x68\x8c\xd7\x9d\x4f\x92\x55\xfa\x0b\x22\x93\x10\xb0\x39\xcf\xdc\xdb\xae\x4b\x1d\x69\x1a\x30\x77\xe2\x47\x33\xdd\x21\xbc\x7d\x00\xa5\x7c\xed\x9f\x1e\xe4\x62\x32\x3f\xad\x2a\xbd\x90\x58\x5f\x13\x07\x32\x44\x77\x82\x69\xb2\xc0\x77\x46\x14\x48\xbd\xe2\x64\x36\x23\x05\x18\x0b\xe1\x28\xe0\x22\x49\x13\x0a\x86\x81\x2c\x2c\x8f\xa2\xb8\x69\x1b\xa3\x9a\x3e\xe8\x1e\x86\x2d\x86\x18\x54\x56\x42\xe0\x7f\xf3\xaf\x13\x2a\x1b\x22\x00\x1f\x78\x82\xce\x91\x5e\xa1\xb0\x11\x97\x1c\xad\xf4\xb5\xa5\x7f\x71\x49\x94\x36\xd4\xcc\xbc\x85\xd1\x07\x6d\x58\x89\x36\xc3\x61\x48\x89\x0c\xa3\x30\x3a\x9c\x55\x52\x24\x9e\x07\x88\x14\xdb\x3e\x69\x1d\xc4\x29\x6f\xcf\x15\x39\x46\x1b\xd2\x77\x9e\x2d\x82\x8c\x3e\x3f\x8a\xfc\x84\xb1\x2a\xb4\x2f\xf1\xaa\x44\xa9\x6f\xcb\xfa\x43\xa1\xd1\x64\xc6\x13\x78\xcb\x16\x65\x9b\x22\xda\xdb\x31\xf1\x07\x79\x88\xd7\x44\x7b\x53\x75\xfe\x40\x0a\xbf\x45\x24\xdc\x63\x75\x0d\x1c\x63\x1c\x1a\x69\x95\x2f\x64\x9e\x7c\x6b\xed\x89\x4e\x6f\x47\xb8\x2f\x42\xf4\xcc\x4e\x38\x75\x6a\xb2\xf9\x51\x2b\xce\xfd\x45\x90\xce\xdb\x1e\x50\x89\xeb\x1f\xf5\xcd\x45\xd9\xdc\x92\x99\x70\xe1\x19\x7e\x93\xba\xe5\xfa\x01\x15\xec\x38\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x10\x0f\x6d\x52\x37\xbb\x01\x49\x5a\x37\xd5\x12\xc6\x70\x60\x8a\xd6\x25\x72\x9e\x39\x64\x9d\x2f\x0a\x23\x17\xa4\xaa\x46\x48\xea\x7b\x1a\x3b\x3e\x6e\xf3\xa9\xfe\x92\x12\x6d\x61\xec\xf9\xc3\x83\x5f\x0f\x46\x88\xa8\xe2\x08\xdd\x73\x76\xa0\x8c\x67\x16\xdd\x80\xb2\x9b\xd4\x27\xdf\x89\x25\x6f\xa1\xae\xba\x59\x36\x4f\xe1\x5e\x60\xad\xa7\xb5\x46\x99\x30\xec\x00\xa4\x4a\xa8\x13\xae\x9f\xf3\x07\xaa\xb4\xcc\x54\x2d\xd8\x53\x2f\x8d\x4a\x43\xa0\x28\x1c\xd6\xa6\xf7\x1d\x39\x59\x10\x5c\xa9\xc5\xd2\xab\x59\xa6\x64\xb5\x44\x2d\xb3\xbf\x49\x17\xf6\x7b\x90\xdf\xb6\xbf\x99\x66\xb6\x72\xfe\xcd\x42\x10\xb9\xe0\xd5\xce\xf3\xcd\x5c\x39\xe5\x82\x33\xa9\x65\x8a\xb6\x05\x6c\x1f\xa5\x4f\xf5\xb1\x25\x9d\x0d\x45\x34\x87\x53\x26\x88\x41\xad\xea\xad\x05\x05\xa0\x17\xf8\x4e\xcb\x1b\xd9\x16\x05\x21\x65\x8a\x0e\x15\x2a\x6f\xbf\xcf\x59\xf0\x79\xf7\xb5\x95\xf5\x33\x17\x4d\x9e\x5b\xfa\xcd\xd5\xe4\xac\x77\x4b\xc3\x07\x6f\xe1\x18\x9f\x2d\x48\x71\x7b\x95\x56\xe3\x68\x4f\x62\xa0\x0d\x17\xbb\x54\x0c\x74\xf3\xd9\xb4\x82\x09\x17\x0a\x31\x5f\x42\x5d\x9f\xad\x39\xac\x22\x11\x77\xb4\x20\xc7\xae\xbc\xba\x8b\x22\xba\x9a\x5c\x98\xcd\x09\x7a\xa5\x0f\xc4\x1f\xbf\xfd\xf6\xf7\xdf\xa6\xcb\xe8\x74\xee\xc5\x3c\xbc\x8b\x76\xe0\xfb\xa2\x76\x5d\x9b\xee\x6c\xf2\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\xee\x13\x49\x08\xda\xe0\x57\xd5\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\xe2\xa4\xe4\x85\xbd\xd6\xc7\xc0\x50\x4a\xd9\xfc\xb8\x2e\x8f\x12\x8a\x6e\x22\x9b\x35\xb1\xa0\xd2\xb9\x71\x56\x02\x22\x2e\x4a\xe6\xcb\x41\x50\xe9\x43\x79\xd3\x25\x4c\xca\xce\x7d\x85\xc8\xf5\xf2\x3b\xf4\xe2\x45\xd4\x5b\xf4\x12\xbc\x21\x79\x52\x66\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\x08\x9f\xde\x5d\x26\xfb\x62\x90\xda\x29\x52\x7b\xc1\xd3\xaa\x30\xe6\x76\x10\x1b\x51\xa2\xb8\x56\x9f\x18\x29\xf4\x42\x8f\x7a\xf5\x9e\x1c\x60\xea\x62\x62\xca\x61\x68\x95\x0b\x4f\xab\x25\xba\xc7\x26\xf5\x3a\x8e\x85\xb6\x7b\x5e\xe8\x6e\xbc\xd0\x52\x4b\xef\xea\xb7\x04\x97\x44\x48\xb0\x86\x08\xde\x7d\xf0\x23\xe8\x53\xb6\x65\x3b\x6b\xa5\xe2\x35\x5a\xd8\xa1\x9a\x39\xec\xca\x5c\x1a\xdd\xc8\x1c\x41\x70\x06\x49\x24\x48\x63\xac\x25\xfb\x37\x5f\x85\x2d\xb4\x26\x85\xcc\x3c\x07\x05\x44\x30\x2a\xc2\xa9\xb2\x8a\x3e\x54\x9f\xa6\x56\x46\x81\x05\x90\x66\xa5\x67\x29\x44\x80\x32\x15\x23\x40\xe9\xb5\x85\xdd\x4b\xd2\xa3\x25\x79\xca\x1a\xa0\x2c\x95\x8a\x51\x76\x52\x75\x64\x63\x02\x76\x73\x19\xa4\x80\xee\x68\x2a\x7d\x1a\x72\x24\x0b\x0e\x79\x51\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\x21\xde\xaa\xa6\x55\xe0\x0a\x2a\xb0\x24\xe3\x3b\x2c\xa8\x16\xa8\xa6\x9e\xbb\x87\x6c\x30\x7d\xda\x15\xe7\xe0\x27\xf1\xd1\x31\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\xe3\xcc\xcf\xbc\xc2\x6b\x8b\x93\xbe\xa3\xd1\x5e\xfb\x60\x90\xa9\xac\xb7\xc8\x67\xd6\x61\xb5\x00\x08\x52\x01\x91\x44\x8b\x60\x03\xc1\xa9\xcd\x86\x3d\xc8\x10\xc8\x6a\xc5\x26\x8a\x04\x08\x0c\x72\xb1\x62\x07\xeb\x1e\xae\xcf\x61\xa6\xa0\xf8\xd3\x9b\xd5\x61\x55\xf6\x29\xd1\xba\xfd\xc5\xe9\xe5\xe9\x2f\xd7\x3f\x9e\xfd\x72\x79\xfa\xfe\x3c\xe5\xd5\xc9\x15\x15\x73\xd6\x54\xcc\x56\x55\xf1\x89\x6a\xce\xea\x47\x16\x0b\xb2\x3f\xf1\xf0\x6b\xe8\x4d\xc8\x9e\x64\x6d\x00\xca\xe6\x4e\xf3\x4f\xa3\xd3\x42\x2b\x4e\x53\x2d\x78\x76\x2a\x71\x28\xa3\x8a\xe2\xea\x35\xa9\xf0\xf2\x9a\x14\x9c\x95\x3b\x87\x91\x5e\x7a\x61\x23\x4d\x87\xac\xdb\xba\x0f\x3e\x58\x60\x89\x5c\x75\xc2\x29\x99\x71\x41\x20\x6a\xc2\xb4\x44\x6a\xba\xf8\xb1\x19\x9f\x7a\xc6\xb2\xe0\xf7\x5c\xdc\x56\x1c\x97\xf2\xa4\xe1\xe6\x3f\xe3\x8a\xce\x48\xb1\x2c\x2a\xf2\x1b\xdf\xff\x71\x92\x9a\xbe\x1f\xee\xf1\x86\x08\x0a\xd0\x85\x7d\xd8\x35\x6f\xf9\x3d\xe2\x33\x45\x18\x3a\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\x69\x9f\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x07\x44\x86\xa4\xdc\xeb\xc8\x97\xed\xe3\xa7\x43\x5f\xf6\x8b\xb3\xb6\xea\x87\xbf\x4c\x48\x2c\x4f\xec\xeb\xd5\xb1\x4f\xa8\x79\x05\xfd\xf1\xa2\x08\xb3\xd2\x61\x63\xbe\xbe\x7d\xa2\x8a\xe6\x9a\x17\xb7\x99\xdc\xae\x37\x67\x13\xf3\xb6\x15\x3c\x8b\xb9\x81\xb5\x96\xc9\x11\xd6\xdf\x02\x05\x74\x70\xba\xee\x8d\xd3\xf5\xa0\x2b\x35\xb5\xad\x03\xf5\x60\xb0\xb6\xba\xc7\x29\x3e\xa2\x5f\xaa\x61\xb0\xb6\x1e\x79\x06\x6b\x6b\x8b\xc7\xa0\xdd\x21\x73\xf4\x8d\xc0\x05\x99\xec\x93\xf2\xe6\x04\x08\x2a\x5b\x61\xeb\x5f\x79\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x73\x3d\x92\x59\x5b\x55\x4b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\x9b\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\x87\xea\xcc\x84\xc5\xbb\xd3\x71\xb8\x82\x48\xd2\xb9\x9e\x2e\x5b\x4c\x16\x19\xb6\x1f\x57\x23\xac\xeb\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\xa5\x7b\xaa\x16\x08\xa3\x5b\x5a\x55\xf6\x35\xf1\x13\x75\xed\x4a\xc0\x1b\x8d\xa6\xe2\x6c\x0e\x93\x81\x2d\x78\xfc\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x33\xe0\xc7\x5d\xe0\xdb\xeb\x53\x8c\x5a\x9e\x04\x53\x61\xea\xa3\x7b\xbe\x9f\x05\x88\x3e\xa8\x05\x11\xf7\x54\x12\x53\xf1\x2a\xba\x4f\xa6\x2f\xfd\x7a\x57\xe6\x33\xcf\xf5\x60\x53\x9c\xf4\xb6\x80\x9c\xbb\xe8\xb6\x7e\x84\xf7\x3a\xd1\xca\x38\x1b\x33\x32\x37\x19\xe5\x56\xa0\x19\x44\xa7\x69\xdf\xe0\x07\x7d\x7e\xb2\x54\xbc\x41\xb4\xae\x49\xa9\xed\xe3\x6a\x89\xee\x28\x8e\xee\x09\x64\xaf\x77\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\x2c\x21\x31\xe4\xc6\xc2\x1c\x30\x9a\x12\x85\xad\x0f\x5c\x1f\x02\x4f\xde\x0c\xbc\xcc\xfa\xec\x01\x86\xfc\x66\xe3\x06\xf0\x7c\xce\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x97\x48\x18\xbb\x1f\x14\x6c\xfa\x44\xf3\x56\xed\xc9\x3d\xf2\x98\xeb\xc8\xe4\xe2\x07\x46\x22\xad\x89\x44\xbc\xcd\x44\x8c\xff\xca\x36\x97\xd3\xc2\x1b\xfc\x4e\x1b\x1f\xa9\x4a\x1a\x55\x1e\x35\xc7\x16\x7b\x84\x65\xdc\x26\x0c\x06\x44\x7b\xd3\x76\x36\x23\x02\x6e\x3a\xe8\xf0\x1a\xec\xde\x17\x1c\x72\x77\x58\x9c\xf3\xd6\x02\xbe\x88\x1a\x01\xc9\xb9\xcd\x7a\x7f\xa4\x49\xcb\x06\x08\xf5\x44\x05\x91\x40\x5a\xcd\xd0\xf9\x87\xef\xe3\xb6\x68\x0e\x0a\xf4\xb4\xdc\x3a\x18\xe7\x07\x16\x87\x49\xcc\xbb\x1f\x36\xd1\x53\xd8\x6d\x51\x54\x5c\xda\x3c\x4e\x58\x97\x62\x81\x19\x23\xce\x19\x45\x15\x78\xb2\xa7\x84\x30\xc4\x1b\x62\x40\x79\x51\x9d\xc1\x48\x52\x36\xaf\x08\xc2\x4a\xe1\x62\x71\xac\x7b\xc7\xdc\x5e\xe8\x12\x26\xed\x27\x52\x09\x82\x6b\xb3\x27\x04\xa9\x31\x35\xcd\x23\x5c\x08\x2e\x25\xaa\xdb\x4a\xd1\xc6\xbf\x2c\xce\x8b\x48\x20\x75\x5d\x9a\xfc\x39\xb7\x56\x90\x56\xd2\x65\x66\x8e\xba\x1e\xda\xe1\xf3\xb0\xaa\x0a\xb8\xce\x46\xfa\xb7\xa4\x6e\xd4\x12\xe9\xa9\xad\xa2\x73\x63\x66\x54\x48\x85\x8a\x8a\x12\xa6\xec\xc8\x0c\x37\x1a\xf4\x61\xe4\xd4\x69\x66\x67\x44\xda\x29\x61\x25\x18\xdf\x8d\x92\x08\x32\x10\x7d\x27\xdc\xab\x4a\x2a\xad\xaf\x43\x8e\xe2\xd6\xce\x95\xd0\x30\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x05\x81\xf5\xb1\x36\x21\x91\x34\xb9\x02\x75\x2e\xdc\xb9\x1e\xf5\x92\xa3\x3b\xdb\x02\x52\x61\xd6\xa4\x0e\x6c\x28\x46\xee\xf4\x39\x20\x05\xd1\xaa\x28\xce\x28\x64\x9e\x5d\xc6\x28\x2c\xe6\x44\x9d\xb9\xf1\xc7\x66\xef\xe6\x90\x36\x61\xe5\xf4\xd0\x41\xd4\x2d\x0e\xac\xc3\x84\x97\xc0\x26\xd1\x31\x7e\x6c\x2a\xe7\x6e\xc6\x15\x69\x7b\xdd\x3c\x52\x23\xde\x59\x54\x26\xc3\xcb\x77\x54\x36\xb8\x20\x12\x1d\x5e\x4c\xce\x46\x68\x72\xf1\xda\xa6\x71\xf1\xd9\x2a\xbb\x5e\xec\xb4\xd8\x4b\xd0\x9c\xdd\xc7\x0a\xd8\xfb\xea\x34\x41\x97\x02\x9a\x2d\xdb\xdf\x89\x37\xca\xa2\x67\x66\xfd\x26\x00\x0b\x8d\xd6\x4d\x05\x75\x22\x91\x6c\xc1\x32\xb2\x81\x0b\xbd\xb5\x8d\x3d\x62\x0f\x2d\xe9\x08\x8e\x2c\x19\x7d\x64\x10\xc7\xb4\xe2\x87\x6b\xd7\x1c\x62\xd9\x6e\xa2\xac\x1e\x00\x0a\xb3\xb2\xbf\xf2\x1c\x31\x90\x6b\x66\xa1\xe2\xf1\xb7\x7b\xa4\x3b\x2c\x30\xa2\xde\x13\x29\xf1\x9c\x4c\x22\x71\x40\x39\xce\x5e\xe7\xe1\x06\x00\x51\x27\xaf\x17\xc4\x50\x61\x29\x1e\x7c\x12\x66\x57\x86\x5e\x9b\xda\x0c\x24\xaa\x07\xee\x6c\xdd\x0b\xaa\x14\x81\xeb\x01\x6a\x3d\xc1\xd6\x5d\xa5\xf7\xec\x67\x75\x46\xb5\x67\x27\x3d\x6c\x4f\xeb\xfd\xac\x34\xf9\x91\x53\x82\xa6\x82\x92\x19\x9a\x51\x48\xd8\x84\x54\xc6\x91\xa9\x53\x80\x01\x30\x8f\xa5\x24\x02\x86\x6d\xfd\x71\x6e\xf8\x71\xfd\xf9\xab\x1d\xbf\x12\x2d\x2b\x70\x50\xc4\x13\xd8\xc7\xe8\x0c\xcd\x21\x7d\xd2\x7a\x9f\xfe\xf0\xf2\x3f\xff\x88\xa6\x4b\x6d\x28\xc1\x99\x54\x5c\xe1\xca\x75\x00\x55\x84\xcd\xf5\x2a\x82\xae\x13\x77\x61\xf7\x18\xac\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x77\x1e\x28\x26\x27\x25\xb9\x3b\x09\xb6\xd0\xb8\xe2\xf3\xb8\xb7\x9e\x79\xc2\xa7\xb6\x29\x63\x01\x11\xb9\x4f\x34\xaf\x68\xb1\xdc\xd9\x7d\x6a\x5d\x61\x68\xc1\xef\x8d\x17\x75\xfd\xa8\x06\x64\x30\x0d\x6f\xda\x0a\x26\x0e\x7d\xef\x19\xfc\x5a\x49\x56\xc9\x91\x52\xbd\xf3\x81\xb4\x03\xf4\x82\x6d\x76\xe5\xaa\xb7\xb9\xc3\xae\x9b\xdc\x52\x53\xd8\x60\xb7\xaf\x54\x12\xed\x06\xff\x1e\x57\xd5\x14\x17\xb7\x37\xfc\x1d\x9f\xcb\x0f\xec\x5c\x08\x2e\xfa\x63\xae\xb0\x56\xa6\x17\x2d\xbb\x85\x3a\xbb\x1d\x5d\x2d\x9f\x5b\x30\x2f\x30\x4b\xf6\x27\x36\xaa\x33\x6e\x94\x86\x40\xd4\xd9\x02\xce\xf9\xdd\xb5\x4c\x1e\x68\xe7\xe1\x66\x88\xe8\x3e\xc7\x6b\x38\xe1\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\xb9\xfe\x72\x64\x2e\x00\x50\x7d\xb5\x8d\x53\xe3\xaa\x8a\xd5\x69\x42\x11\xf0\x7d\x74\xf9\xea\x3d\x38\xf2\x6a\x67\xa7\xfb\xb3\x7d\x35\x37\x37\x7f\x03\x4d\x8c\x2a\x49\xaa\xd9\xc8\xf0\xc1\x78\x7f\xf2\x01\x98\x35\x07\xf6\xca\x8b\xe7\x12\xda\xbd\xb7\xe4\x8e\x57\x6d\x4d\x5e\x93\x3b\x5a\xc4\x21\x07\x7a\xab\xd2\x7b\x9b\x8b\x8f\x55\x54\x82\x2e\x39\xad\x78\x71\x8b\x4a\xfb\xcb\x20\x47\x65\xb5\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x3a\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x7d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x8c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\x7f\x1b\xa2\x93\x35\x53\xdd\x57\x54\xf3\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\x1f\x37\xc8\x80\x42\x48\x4b\x4e\xea\xcd\x0b\xf3\xe8\x8f\x1a\x2b\x6b\x1f\x39\xef\x05\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xbb\x9a\x84\xf5\x54\x96\x1a\x37\xe3\x5b\xb2\x8c\xdc\x70\x89\xc7\xe5\xb1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x09\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x65\xc6\xa2\xeb\x76\x0a\x67\x0a\xbe\xfe\xb4\xf4\x60\x59\x95\xa7\x5d\xdf\x55\x3f\x76\x2b\xde\xbf\xaa\xf4\x27\xfe\xae\x32\xdf\xfa\x9a\x6e\x28\x18\xdf\x97\x7a\x41\xf9\xce\x67\x92\xc3\x49\xd8\x44\xb8\xd6\xec\xce\xe8\xdf\x63\x3d\x4f\x98\x39\xd2\x81\xcd\x6c\x3d\x54\xc7\xa6\xde\x40\x42\x07\xf4\x51\xb4\x8d\xa2\x83\xef\x0e\x76\x7a\x39\x9a\x95\x11\xbc\xc1\x73\x30\x69\xf7\x61\x81\x56\xfb\x14\xd2\xdb\x2e\xf8\x7d\x28\x32\x1b\xfb\x2d\x2d\x31\x1d\x47\xfa\x82\x27\xad\x8e\xc1\xfa\xba\x1d\x61\xcd\x72\x53\x25\xe2\x1e\x2f\x11\x16\xbc\x65\x49\xc4\x05\x10\xca\xf4\xa1\xee\xf7\x2b\x83\xbd\xe4\x8c\x38\x58\x4d\x4a\x2b\x37\x3d\xd7\x37\x20\x8c\x28\x43\xaf\x8e\x5f\xbd\x4c\xee\xfb\x15\x29\x5a\x21\xe9\x1d\xb9\xb2\xe5\xd3\x83\x30\xe8\xc5\x6c\xc2\xa5\xa4\xd3\x0a\x52\x2d\x15\x47\xe7\xa6\xb6\xfc\xfa\x40\x3d\xd4\x0b\x46\xcc\x45\x48\x84\x9a\xd0\xc3\x43\x73\x82\x43\x88\xb6\x6e\x20\x01\xa7\xb5\x5f\x2a\x28\xac\xeb\x8a\x0a\x7a\xe9\x55\x50\x73\xef\xed\x74\xac\xae\xa6\xfe\x3e\x48\x92\xf7\x36\xa8\xd0\x15\xcd\xa7\xae\x28\x33\x7c\x74\x2f\xa8\xb2\x87\xfb\x9e\x4a\x82\x0e\xc1\x9d\xb1\xb2\x19\x93\xb8\x9f\x43\xe7\x57\x62\x71\xfd\x1c\xdc\xcd\x62\xf5\xe8\xee\xc3\x2a\xad\xcb\x93\x2e\x67\xe6\xde\x7a\xbe\xba\x15\xb4\xd2\xbf\xbb\x97\x17\x98\x95\x55\x92\xcc\xf0\xb3\x52\x2d\x93\xd8\xab\x2e\x66\x28\x14\x89\x16\x71\x10\x04\x21\x17\x58\x22\xc6\x51\x4d\x30\x40\xaa\xf5\xed\xe2\xa4\x60\x8f\x06\x3a\x5f\x1f\xcc\x66\x37\xd7\x58\x78\x21\x58\x71\xfd\x9a\x4a\x2b\x9e\xb5\x1c\xb1\xa6\x8b\x01\x62\xd5\xb8\x4c\x21\x63\x08\xe6\xb4\x5b\xbc\xe3\x0e\xe6\xbc\xda\x93\xee\xe2\x58\xe9\xcb\x53\xf4\x63\x64\xab\x9b\xeb\xe6\x4d\x64\x79\x83\x3f\xaf\x83\xb5\x25\xe1\x4f\xcc\xb3\x3a\x5c\x7f\x2d\xae\x8d\x75\x73\x8f\x7d\x87\x13\xfa\xf0\xe9\xa1\x8e\x02\x59\xe8\x50\xdd\x06\x04\x63\xcb\xab\xd8\x1c\xe5\x34\x92\x70\x17\xcd\xf0\x7e\xa2\x39\x61\x44\x60\x1b\x90\x70\xa0\x6e\x1b\xd2\xc7\x92\xb3\xd4\x03\xf1\x89\x0d\xa7\xe5\xfd\xa7\xd5\x14\xf3\x67\x09\x1d\x01\x3d\xe7\x90\x8b\x95\xd3\x6e\x43\x2d\x9b\x34\x96\x9c\xa3\x5e\x21\xd3\x33\x9b\x3f\x60\xe9\xd5\x8b\xf2\xcf\x96\xde\xe1\x8a\x18\x7a\x7c\x27\x1a\x76\xaa\x4c\xc8\x76\xba\xaf\x66\xa3\xb5\x0f\xc1\xec\xd8\x8c\x96\x78\xd4\x82\xcc\xa4\x4f\xbc\x78\x81\x0e\x4d\x1b\x07\x86\x16\x7b\xb7\x4a\xae\x5d\xab\xf3\x87\x26\xa1\x28\x6c\xbe\xf5\x3a\x7f\x68\x30\x00\x3c\x9a\xbd\x58\xb8\xff\x26\x0b\x7c\x47\x80\x85\x9c\x56\x58\x54\x90\x46\x72\x6d\xa6\x0c\x4d\x5b\x85\x08\xbb\xa3\x82\x33\x00\x55\x01\x5d\x94\x96\x4c\x82\xcc\x88\x20\xac\x20\x12\xfd\xf6\xf0\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8f\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\xee\x6c\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x15\x0e\x48\x03\x50\xf6\x69\x63\xd7\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x7c\xa1\x2c\x5d\xc3\x0a\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xdd\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\xbf\xe0\x52\x9d\x56\x14\xcb\x6d\xfd\xd8\x69\x5b\xfd\x6d\xd7\x2c\x64\xfb\x31\x5b\xd5\x11\x57\x1e\x62\xa0\x7b\x66\x60\x4e\x17\x13\x8b\x45\x77\xbb\x92\xb2\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd9\x13\x83\x38\x9a\xa1\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x16\xbc\xb2\x79\xd7\x0e\xcd\x30\x25\xea\x9e\x10\x86\x2e\x26\x30\xe7\x7a\x2a\x0d\x2f\xe3\xe6\x99\xb7\xca\x31\x53\x62\x69\x0f\xf4\xd6\xbd\x09\xd6\x0c\x56\x61\xdb\xa3\x9b\x10\x7f\x8a\x8f\x3c\x8d\x11\xdd\xf6\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\xde\xfa\x05\x75\x6c\x3a\x78\xca\xef\x08\xac\x77\x59\x8a\xc8\x2c\xed\x9d\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xec\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x96\xc7\x2d\xdf\xad\x78\x31\x39\x7b\xce\x1b\xf1\x07\xeb\x5d\xd2\x4d\x1f\x48\x44\x9b\xa2\xcb\xeb\xd8\x76\xe9\xbb\x5c\x86\x80\xce\x2c\xc2\xd1\x1e\xeb\x5c\x5f\x74\x05\x1b\x9f\x5b\xa9\x40\xcc\xb4\xab\xaf\x34\x4b\x2b\x6e\x81\x23\xe0\xf9\x69\x78\x79\xbc\x3a\xd5\xf6\x2f\xe2\xa7\x1b\xe2\x7f\xc6\xe0\x0c\x4b\x55\x2e\x79\xeb\xac\x65\xa3\x5c\x2c\x81\xe9\x47\x42\x29\xac\x05\x01\x66\xcc\xb2\xad\x0c\x98\x18\xdf\xe3\xed\x81\xdc\xd0\xf0\x3f\x82\xd9\xfe\x47\xe7\xdd\xee\x8a\x0a\xc2\x17\x26\x5c\xa8\x7f\x18\xc7\x97\xd4\x17\x36\x24\x0e\x41\xe6\x0f\x35\xd5\xb7\x82\xe8\xd9\x3f\xbc\x6a\x0e\x7f\xb5\x6d\xc2\xa3\x56\x1f\x02\x57\xde\x67\xb6\xaf\x2d\x5c\x2b\x6f\x8c\xcb\x73\x63\x5f\xb6\x9d\xa1\xdd\xed\xff\xc9\xc5\xeb\x1d\x8a\x8f\x86\x96\x5f\xb6\xf8\xf8\x41\x6e\x5d\x7d\x20\xeb\x04\x42\x91\xd2\xbc\x33\x18\x03\x2d\xb7\x75\x49\xed\x5f\x03\x71\x18\x57\xa8\x11\x44\x12\xa6\x46\xfd\x70\x44\x3f\x2d\x13\xb4\x87\xfe\x28\x46\xfa\xe7\x59\x5b\x6d\x6b\x21\x71\x11\x30\x0f\x79\x9a\x26\xec\x49\x56\x20\x14\x83\xef\x30\xad\xc0\x3d\x17\xd0\xe8\xae\x75\xc0\x66\x8f\x6d\xd9\x83\x8a\xe3\x12\x42\x83\xe8\x56\x5f\xed\x15\xaa\xb9\x16\x9c\x26\x0d\xe4\xec\x74\xf2\xcb\xf5\xdf\xae\x7f\x79\xff\xe1\xf5\x0f\xef\xb6\x66\x1b\x33\x29\xf4\xa4\xdb\xe2\x23\x84\x11\x23\xf7\xd0\x73\x06\xc6\x69\x61\xe3\x01\x9e\x85\x52\xdf\x21\xd7\x36\x99\xd2\xc4\xc6\x0d\x34\x65\xd6\x56\xfa\x4b\x5b\xf6\xa0\xa6\x8a\xce\x31\xbc\xac\x73\x89\x4c\x05\xc1\xb7\xbc\x55\xe8\xae\xad\x18\x11\x78\x4a\x2b\xaa\x2d\x08\x44\xee\x08\x33\x78\x48\xfd\x07\xba\x93\x61\x31\x5f\xba\x6d\xe3\x61\xad\x67\x5b\x45\x52\x4f\xaa\x6e\x19\x17\xd6\xdd\x68\xd9\x34\xe1\x97\x8d\xa0\x77\xb4\x22\x73\xe2\x69\xea\x62\xd8\x92\xfb\x30\x1c\x5c\x35\x0b\x3c\xae\xc8\x1d\x31\x74\x57\x54\x9a\x1d\xb5\xe0\x8c\x0b\x13\x97\x33\xc4\xed\xd6\x16\x05\x02\x20\x73\x58\x5d\x69\x63\x93\xec\x7b\xed\xb2\x6e\x6d\xb2\xed\xb3\x09\xab\xed\x91\x2c\x69\xb2\xea\xda\x23\x01\xdc\x0a\x84\xd9\xe2\x93\xad\x41\xd5\x9b\xfd\x83\x9d\x7d\x0e\x6f\x77\x32\xc6\x1e\x16\x8c\x0c\x68\x77\xec\x2a\x4d\x01\x21\x4e\xcc\x9c\x6f\x6d\x9e\xb8\x2e\x7d\xb0\x14\x5c\xcf\xad\x63\x86\x6d\xf7\x4b\x48\xb9\x9a\xa2\x9e\x1d\x2c\x14\x1a\xe1\x64\x62\x89\x1a\x22\x80\x3d\x21\x64\x0b\x4b\x38\x48\xbc\x0f\x11\xd9\xd4\x26\x2b\x7d\xbe\x39\xc2\x50\x6c\x1e\x51\x25\xd1\xeb\xcb\x6b\x24\x48\xc1\x45\xb9\xb5\x0b\xe0\xaf\xe6\x5a\xd8\x10\x48\xc6\x40\x56\x66\xd2\xf8\x2c\xb3\xe1\xd6\xa6\xdf\xc5\x7a\xf5\x6b\x98\xd8\x8e\x71\x4d\xba\x2a\x42\xff\x70\xa3\xfc\x07\x0c\xf3\x1f\xb2\x9d\x96\xbc\xc6\x94\x6d\xad\x31\x8e\x21\x33\x70\xf2\xd1\xbd\xdf\x51\xd2\x6d\xff\xf6\x7f\x48\xa2\xdc\x26\x3a\x95\xdf\xff\x7f\xaf\x2f\xff\xd1\xf1\xbb\xd1\x4a\x5f\xf1\xe1\x75\x14\xd1\x40\xcf\x1e\xe8\x07\xea\xdd\x3b\xe3\xb7\x99\x67\xf9\xd4\xe3\xa7\x25\x6c\x1e\x3f\xd9\x7a\x5b\x3b\x71\x40\x19\xba\xfa\xfe\x0c\xbd\x7a\xf5\xcd\xef\x61\x49\x1c\xb6\x17\x2b\x54\x6b\xcd\xe0\x8f\x7f\x40\xc5\x02\x0b\x5c\xa8\x08\x00\xff\x95\x4b\xde\x83\xd2\x1e\xab\x47\x32\x24\x7f\xb3\xb9\x69\xe6\xce\x88\xf2\xed\x6e\x2d\x9e\x20\x9c\x31\x69\xab\xea\x9a\x14\x82\x6c\x9b\x82\x91\x26\x9e\x2e\x56\xda\x7e\xcc\xb9\x1e\x84\x50\xa1\x14\x97\xfd\x32\xeb\xea\xed\x04\xa4\x12\x5d\xb1\x84\xa6\xad\x2a\x83\xd1\x5a\xba\xdb\x06\x46\x2b\x83\xe4\x3f\x2a\x1d\x41\x49\x8c\xb2\xdb\xbb\x82\x24\xf1\x5d\x73\x27\xb0\xc1\x52\x76\x90\x98\x3b\x5a\xb6\xb8\x82\x6e\x41\x1c\xc9\xf2\x6f\x60\x63\x52\x5a\xd9\x5b\xdb\x11\x6c\xdb\x9d\x2d\xd9\xd9\x3a\x55\xea\xc4\xcc\xc9\x6f\xac\xd5\x4f\xd9\x7c\x0c\x9f\xe8\x6e\xda\xf1\x8c\x39\x1b\xe3\xf1\xb6\xe9\x4f\x5f\x54\xb0\xe1\x1d\x2f\x70\xf5\x01\xbc\xf3\x57\x6e\xb7\x39\x29\x20\x11\x61\xbc\x9d\x2f\x60\x7a\x45\x8d\x1d\xf9\x77\x45\x14\xb8\x4d\x6c\xea\x6e\x4c\x54\xc1\xef\xec\xd2\x86\x06\xc2\xba\xec\xfd\x9d\xfd\x8c\x01\x87\x94\x18\x40\x2c\x4e\x3a\x47\x30\xfa\x32\xd0\x2b\xed\xcc\x46\x22\x27\xfa\x3a\x3f\x01\xf5\xc3\xc1\xf9\x4c\x30\x66\x04\x88\x8f\xb2\x35\x32\x1b\x17\xb7\xf7\x58\x94\x12\x15\xbc\x6e\xb0\xa2\x60\x01\x2d\x63\xb1\x7e\x2e\x83\xcc\xde\x06\x5a\x2d\x39\x46\x17\x4c\x2a\x0c\x32\xd0\x11\x15\xe9\x15\xee\xc8\x05\x40\x79\x31\x3c\x8f\x0b\x22\x08\xc2\x22\x0e\x73\x89\x2b\xb8\xf1\x0a\x22\xf4\xde\xaf\x96\xe8\x5e\x70\x16\x49\xf2\xb1\xa5\x50\xd2\xea\xd2\x1d\x25\xf7\x27\xd6\x27\x3a\xd6\x83\x1b\x9b\x2d\x2c\x4f\xe0\x24\x9c\xfc\x06\xfe\xef\xcb\x89\x2e\xac\x38\xf9\x6b\xdc\xc4\x07\x6f\xbe\x82\x08\x3e\x65\xb4\x63\x2f\x7b\x56\x65\xe3\x9d\x55\x26\x6c\x85\x21\xfa\x2f\x23\xc7\x03\x9f\xc2\x94\x54\x9c\xcd\x83\xda\x4a\x11\x36\xce\x05\xa3\xaa\xe7\xa7\x00\x98\x17\x29\x5a\x03\x00\x40\x5c\x94\xc0\x5a\x47\x4d\x6a\x4d\xaf\x75\x28\x82\x1f\xf0\xe5\x61\xb6\x6d\x98\x92\xf6\x5a\x07\xc6\x15\xd9\xf9\xdd\x0c\xf1\x84\xab\x43\xa2\x38\x5a\x60\x5b\xb2\xdf\x92\xfa\x51\xe9\x90\xf8\x08\x17\xda\xc4\xda\xfe\xa8\x68\x55\x47\x79\xe2\x3f\x43\xa8\x63\x28\x8f\xc0\x34\xd1\x4a\x0e\x66\xab\xfd\x04\x47\xa1\xa8\x7b\xf4\x68\x56\x75\xdf\xb2\xf9\x96\xd1\x7f\xb6\x04\xe1\x9a\x6b\xbd\xaf\x4a\x49\xbb\x5d\x5d\xc9\x1a\x2f\xc1\x16\x85\x49\x7b\xe7\x98\x6c\x11\x86\x5a\x20\x72\x04\x90\x7d\x1a\x94\x7b\x1a\xa1\x77\xfd\xfa\x4f\x23\x3d\xce\x6b\x53\x7b\xc5\x7e\xb4\xbd\x05\x0d\x14\x69\xbc\x15\x05\xb1\x56\x45\x6d\x69\x7e\x36\x4c\xab\xde\x7b\xda\x24\x65\x06\x79\xa2\x97\x14\x52\x6e\x5b\x01\x3b\xcd\x04\x74\xb6\x5f\xe2\xe9\x12\xcd\xb4\x3a\x6b\x11\x8b\x0b\x3a\x5f\x10\xa9\x5c\xfc\xea\x04\x88\x69\x4c\xf2\x33\x2e\x16\xbe\xbb\x20\x7f\x03\x4a\xcb\x0e\xf2\x58\xe3\x87\xed\x69\x8a\xc0\xb7\x66\xb9\xcd\x8d\x89\x2d\xdb\xda\xdd\xfd\xab\x9b\x49\x1e\xa3\x77\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf5\x69\x03\x92\x53\x00\x83\xa2\x19\x96\x0b\xca\x59\xea\x2e\x2b\x0c\x44\xac\x68\x85\x56\x5e\xaa\x25\x58\xaf\x65\xa9\xf5\x43\x81\x04\xa9\xf9\xdd\xf6\xa8\xb1\x64\xd8\x59\x1a\xf3\xb3\x9e\xe4\x71\x60\x6f\x7c\x21\x46\xc4\xa9\xe7\xaf\xd5\xfb\xa5\x58\xb9\x2d\xcc\x06\xd4\xda\xbf\xab\xb2\x2d\x5a\xd6\x25\xab\x47\xdc\x1c\x3b\x02\x08\x45\xa4\x94\xa7\x98\x07\x58\xcc\x77\xc6\xf2\x70\x2a\xe6\xad\x11\x97\xf6\x7e\x07\xa4\x4a\xc3\x69\xbc\x95\xb0\x06\x0c\x3d\x90\xe8\xec\xfd\xeb\x90\x54\x5f\xd9\x1a\x01\x26\x14\x66\x4a\x2e\xc4\x35\xf7\x63\x5e\x48\x39\xa8\x18\x1e\xa7\x1e\xd5\xa3\xc2\x4b\x16\x2d\xe6\xab\x3b\xe7\x8c\xf7\x1d\x74\x4e\x1a\xca\x9a\x56\x59\xe5\x3b\xa8\x9d\x5c\x2c\x30\x9b\x6b\x6d\xe7\x35\x6f\xf5\xc0\x7e\xfb\x5b\x18\x84\x20\x65\x5b\x44\xa6\x03\x1a\x67\xbf\x39\xb9\xbf\x75\x89\x39\xb6\x48\x3b\x5c\x4a\xb2\xc0\x8d\x9b\x9a\x70\xf6\xe4\x92\x29\xfc\xf0\x1d\xa2\xc7\xe4\x18\xbd\xf8\x6d\xf0\xab\x17\xd0\xe3\xa8\xde\x34\x82\xeb\xa1\x58\xa2\x6b\x18\x7d\x45\x15\x10\x82\xbc\x08\x5b\x38\x46\xe7\xba\x5f\x90\xe7\xea\xd7\x36\xe0\x2e\x9e\x76\x2b\x3b\x42\x82\xcc\xb1\x28\x2b\x12\xc9\x15\xc9\x67\x3e\x25\xd3\xb8\xa6\xed\xae\x22\x0f\x54\x2a\x69\xa3\xb6\xc7\x79\xc0\xca\x9f\x7b\x77\x28\x2c\x6f\xf5\x4d\xa1\x85\xdf\xb8\xc4\x0a\x8f\x03\xa9\x7b\x62\xbc\xb4\xe3\x82\xd7\x35\x66\xe5\x18\xdb\x73\xdc\x5d\x2a\x27\xbf\xb1\x25\x6e\xc6\xd8\x7f\x8b\xb2\x31\x1e\xcb\x05\x89\x5a\xb9\x01\x29\x08\x8f\x9d\xcb\x5d\x09\xec\x73\x2f\x9f\xcd\x52\x1c\xa3\x4b\xae\x3a\x73\xca\xdf\xb6\xb0\xca\x39\x45\xf8\xf9\xe5\xcd\xd5\xdf\x26\x1f\x2e\x2e\x6f\x06\x49\x3e\x48\x72\x78\x06\x49\x3e\x48\xf2\x88\x86\xf7\x45\x92\x13\x76\xb7\x2b\x29\xee\x1c\x6f\x9b\xb2\x23\x6d\x40\x4f\xad\xa5\x59\xed\x3c\xc1\x6a\xd7\x24\x69\xe7\xec\xee\x47\xac\x4d\x7e\x0b\x9f\xb3\x19\x2c\x1b\x12\x4c\xed\x17\x8c\x3b\xe2\xec\x8b\x67\x49\xdb\x21\xc7\x59\x46\x8e\x9f\xa4\xbc\xe7\x30\x8e\xb5\x69\xc9\x53\x72\x76\xdf\xe3\xa5\xf1\x02\x9b\x43\x89\xd9\x12\x35\x82\x32\x05\x5b\xe9\xf4\xfa\xec\xe2\x22\x40\x3a\x20\xf2\x50\x90\x46\xa1\x83\xff\x67\xb7\x14\x67\xe0\xe8\xdb\x87\x95\xd9\x46\x71\x4b\x68\xa6\x53\xf9\x1a\x41\xee\x28\x6f\x65\xb5\xf4\x58\x95\xcd\x72\x74\x9d\x09\x2f\x91\xe0\xc3\xe0\x18\x69\xb1\x79\x0b\xca\x15\xa5\x73\x93\x02\x99\xd0\xfc\x8e\x55\x4f\xdb\x89\x1c\x0a\x68\x42\xfb\x1b\x54\xd7\xcf\x57\x43\x13\xda\x8d\x52\x60\x1f\x53\x46\x13\xfa\xd1\x57\x63\x13\x5e\xd4\x67\x40\xd8\xbd\x24\xfb\x5e\xf0\x3a\x93\x34\xbb\x36\xc1\x15\x07\xdc\xdc\x74\x54\x0f\x1c\xfa\x2f\x54\x8f\xac\x49\xdb\x55\xaa\xd5\x86\x35\x00\x0d\x12\x67\x27\xa9\x92\x7d\x9e\x62\xf2\xc8\xe6\xef\xbf\xc7\xcd\x5f\xc8\xf2\x8a\x24\xd6\xe4\xee\xcf\x37\xa9\x48\xa1\x95\x31\x74\x4b\x96\x86\xb0\xef\xcc\x35\x96\x56\x96\x3c\xcb\xf4\xa1\x0c\x2a\x98\x7b\xc6\x7a\x88\x49\xef\xc8\xb3\x98\xfa\xb9\x25\x09\x34\x77\xee\x59\x21\x61\x24\xb0\x84\x60\x7f\xe8\x35\x4d\x5b\x3d\x94\x47\x3c\xb8\x27\x4d\x13\x75\x4f\x3e\xbd\xc7\x3d\xf9\x10\x56\xfd\x67\xb7\x78\xab\xfe\xb3\x53\xf4\xd5\x6a\x57\xf2\x61\xb1\xfa\xcf\x3e\x21\xb3\xfa\x4f\xc6\x53\x94\x82\xda\x5a\x7d\x1c\x28\x39\xf3\xa9\xbc\xb6\xb9\xb6\xa1\xea\xe4\x2f\x14\x64\xca\xc0\x80\x9c\x72\x50\x76\x6b\x05\x64\x9a\xe6\x34\x2a\x52\xf3\xe4\xc3\xb7\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x36\x8f\x65\xe6\xd0\x55\xdf\x39\x6e\x46\x89\x6a\xa2\x70\x89\x15\x3e\xd6\x07\x62\xd4\xff\xd1\x66\x16\xfe\xc3\x7f\x58\xe1\x29\xa9\xe4\x4f\x07\xff\xf5\x97\xf3\xbf\xfd\xbf\x07\x3f\xff\x23\xfc\x1d\xa8\x6b\x06\x1e\x1e\x7c\x21\x71\x08\x50\x4d\x92\xf1\x92\x5c\x42\xef\xe0\x47\x6b\xe9\x9d\x1a\x84\x90\xfd\x05\x54\xf4\x3a\x36\xe4\x02\xfe\xc7\x86\x97\xab\x3f\x45\x16\x34\x70\xcf\x1e\xea\x3d\xb0\xb6\x09\x44\xfd\xe6\xc9\xa7\xfd\xe0\x86\xfe\x48\x84\x4c\xe2\x76\x77\x4f\xbf\x12\x83\x79\xab\xdb\xc6\xb2\x58\x90\x1a\xc3\x3f\xbf\x77\x53\xa0\xef\x63\x5f\x73\x91\x41\xe9\x34\x7d\x07\x8e\x7a\x64\x97\x2f\xee\x5e\x25\x59\x9c\xe6\xc9\x28\xf9\xfd\x0a\x66\x9e\x30\x98\x11\x3b\x5b\x46\x02\x78\xfd\xd1\xe7\xa3\x78\x2a\x81\xd3\xc9\x05\xba\x33\x33\xbc\x47\x93\xf3\x74\xe2\xba\x22\xd9\xcd\xad\x64\x81\xfd\xbd\xef\x95\x5d\xa6\xc0\x74\xb3\x06\x73\x14\x9d\xd3\xea\xd3\xcb\xf1\x3a\x67\x77\xba\x5d\x99\x2d\xb7\x6b\xf5\xd9\x43\x99\x99\x6a\x2b\xea\x77\x34\xa9\x22\x57\xbf\xc4\xd0\x5b\x5e\xc6\x46\x11\xdc\xb3\xcf\xb6\x6b\x16\x53\xce\x19\xc0\x01\xad\xaa\x3f\x0c\xe8\x54\x0b\x7b\x93\x33\x69\xbe\x03\xae\x47\x72\x47\x98\xf2\x70\x72\x5b\x65\x1d\x0b\x45\xf3\xd8\x24\xb6\x47\x5d\x56\x66\x07\xf0\x30\x5e\xae\xfa\xd9\x63\x17\xdd\xf3\xda\xa0\xa6\x4f\xab\x66\x81\xf5\xa8\xe7\xde\x0e\xde\x78\xda\x0d\x7a\x42\xcf\x9d\xa4\xff\x22\x2b\x05\x3b\x5f\x7d\xf3\xa7\x84\x74\xd2\xf5\x27\xe3\xc5\xf9\x44\x66\x4e\x96\x1d\xbb\xc9\x56\x02\xc6\xb1\xc7\xcd\x24\x5f\xc2\xdc\x7d\x2f\x5d\x4c\xc1\xd8\x5c\x62\x3a\xb8\xa8\x47\x41\xa1\x77\x76\x87\xee\xb0\xf0\x28\xa1\x76\x5a\x51\xb9\x48\x15\xf7\xe6\xb9\x98\x75\x99\xb1\x5d\xea\x3a\x30\xad\xb8\x1a\x37\x9d\xee\xa1\xe7\x62\xa5\x97\x19\xba\xf0\x98\x8b\xb9\xcf\x30\xdf\x85\xf3\x4d\x62\x7a\x98\x83\xf1\x64\xf3\x60\xa8\x4d\x9e\x6b\x22\xd6\xf8\xef\x05\x51\xad\xd0\x32\xcb\x66\x57\x4c\x78\x69\xa8\x58\x32\x2a\x7f\x39\x8c\x75\x14\x3a\x45\x60\xce\x12\x5f\xd7\xe4\x57\xb2\xb3\x5d\x6f\x9f\x41\x1b\xee\xb5\x77\x27\x24\xb2\x38\xd7\xac\x10\x12\xa4\xc2\x8a\xde\x99\x6d\xe9\xf2\x87\x1c\xb5\x80\x6e\xf0\xe0\xf8\xf8\xc0\xf4\x92\x0b\x73\x95\x1a\x8f\xa2\xfe\x7c\xaf\xae\x85\x4e\xa9\x7a\x02\x37\x7c\x48\x07\x63\x97\xc8\x94\xd3\xb0\x53\xe5\x42\xac\xb9\x74\xf5\x2f\xc0\x98\x72\x59\x53\xdf\xef\xb5\x0f\xcc\xe7\x76\xad\x96\x93\xfd\xce\x10\xbc\xb8\xdf\x5b\xe5\xc7\xf0\x23\xdb\x3c\xb1\x54\x47\xf1\xa1\x79\xe5\x71\xd1\xb4\x23\xfb\xfa\xe3\x9a\xd4\x5c\x2c\xfd\x8f\xbe\xf8\xe6\x58\x2a\x2e\xf0\x1c\x4a\x46\x99\xc6\xcd\x9f\xf9\x9f\xcc\x1f\xf6\xba\xb7\xfe\xd7\x06\xdd\xd1\x65\x66\xf9\x5a\x2c\x5f\x9d\x2d\xe7\xd6\x6d\x4f\x0c\x28\xbf\xad\x9e\x40\xfe\x1c\x78\xc0\x9c\x89\xb9\xf9\x59\x84\x90\xba\xad\x09\x3b\xea\x14\x0e\xc0\x7d\x18\x25\x4f\x1e\xec\x8f\x1c\x42\xa8\xa4\x77\x54\xf2\x84\xb2\x1d\xfe\x45\xeb\xe1\x09\x47\xd1\xc4\x5b\xd5\xb4\x90\xdb\x59\x63\xe5\x3d\x28\x0f\x0d\x97\x80\x16\xb1\x87\x7d\xc5\x35\xf8\x2a\x35\xf2\x02\x3a\x86\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\xc9\x5d\xc7\x6c\xf9\x21\x51\x7a\x9b\x67\x6c\x37\x0b\x65\x8a\xcc\xc9\xb6\xcc\x79\x1f\x7b\x63\xa6\x50\x5b\xef\x2a\xa4\x4c\x8d\xb9\x18\x5b\x2e\x2d\x30\x52\x12\x1b\x70\xdb\x2b\xf7\xf9\xbf\x72\x52\x33\xc8\x54\x76\x4a\xe1\x1e\x1d\xf0\xa7\x52\x34\x0c\xc3\xcf\x73\xc0\x64\x4c\x4b\x41\x2d\xf5\x03\xd9\x91\xdb\x7c\x6d\x37\xe8\xbf\x03\x72\xc6\x05\x8d\xcc\xba\x76\x96\x94\x36\xaf\x8e\x3b\x23\xc8\x71\xaf\xd9\xef\xdd\x92\x04\x88\x99\x7b\x06\xa4\x4d\xf4\x33\x20\x6d\x1e\xe9\xca\x80\xb4\x49\x7a\xbe\x48\xa4\x8d\xe1\x1d\xfc\xf7\x84\xd9\xe4\xaf\x8a\x16\x99\xb9\x93\xb3\x20\x1a\x61\x77\xb1\xe0\xea\x9c\xa9\x6e\xce\xed\xa1\x38\x6a\x78\xd3\x56\x58\x3d\x92\x45\x91\x29\xef\x6d\xcf\x22\x67\x40\xb4\x6b\x54\x3f\x8b\xe1\xa7\x0c\xd5\x6d\xa5\x68\x13\x99\x10\xe0\x4d\x4b\x4f\xa6\x8b\xb0\x94\xbc\xa0\xd8\x25\x82\xc3\x6f\x2a\x2c\x95\x1b\x32\x78\xe6\x15\xbe\x25\x01\x21\x6f\x6c\xb6\x36\x90\xf7\xba\xb9\x9d\x2e\xf5\x3d\x74\xce\xee\xec\x9d\x84\xca\xd6\x24\xb8\x92\x2e\x56\x9a\xa5\xdd\xaf\x2b\x9b\x51\x9f\x4b\x9b\xad\x10\x24\x35\x82\x06\xe9\x9d\x88\x18\xa2\x39\x7c\xd6\x41\x20\x21\xfd\xc3\xd2\xc3\x46\x75\x23\xd9\x38\x48\x57\xc5\x7d\x36\x42\x92\x8d\xb5\xa6\x83\x77\x30\xd1\xbe\xee\x1d\xdd\xc2\x1e\x25\x70\xa4\x6b\xe5\x79\x35\xf2\xa7\xd0\xc6\xf7\x45\x13\xdf\x13\x2d\xfc\x69\x34\xf0\xfd\xd4\xbe\xb3\x69\xde\x79\xb4\xee\x3c\x1a\xf7\x16\xb8\xf6\x9c\x5a\x76\x1e\x0d\xfb\x29\xfc\x6b\x8d\x20\x33\xfa\xb0\x0f\x69\xcb\xae\xc2\x0f\x52\xe4\x01\x5c\x35\x8d\x20\x0d\x61\xa5\x23\x42\x73\x11\x58\x60\x6c\x1c\x32\xce\xbd\x5f\x34\xef\x85\x7d\xbd\xc9\x53\x36\xdc\xd6\x68\xb8\xad\xb7\x78\x86\xdb\x7a\xb8\xad\x9f\xe5\xb6\xb6\xd2\xea\xeb\xbf\xaa\x73\x57\xd7\xad\xf1\x7c\x67\x15\x10\xce\xfa\x54\x76\x20\x99\x9f\x85\xba\x7f\xad\x9e\x48\xa4\x1f\x2b\x14\xb2\x1e\x74\xa1\xb8\x11\x7b\x86\x6b\x5a\x20\x53\x7d\xcd\x98\xd5\xa8\xc6\x0c\xcf\x81\x06\x5b\x7f\xcf\x1e\x31\xc4\x85\xaf\x6a\x15\xd5\x93\x15\x4e\x40\xf0\x60\x39\x5e\x63\xf8\xa5\xe0\x55\xa5\xf5\x95\x8a\xde\x12\xf4\x9a\x34\x15\x5f\xd6\x96\xa6\xa9\x44\xd7\x0a\x2b\x32\x6b\xab\x6b\xa2\x12\x0a\x55\x47\x4a\x1c\x5f\xd1\xc7\xb0\xaf\xef\x6a\x2b\x42\x71\x1f\x28\x76\x83\x1a\x43\x03\x1f\xf5\x9a\x0f\x0c\xae\xf2\xd3\xea\x1e\x2f\xe5\x08\x5d\x92\x3b\x22\x46\xe8\x62\x76\xc9\xd5\xc4\x38\x91\xe2\xde\x1b\x72\x82\x98\x97\x23\x3a\x43\xdf\x55\x58\x11\xa9\x90\xc2\x73\xc0\x16\x77\x05\x7e\xb8\xe8\x35\x8a\xb8\x16\x94\xf7\x74\xfb\x42\x3d\xe6\x79\x56\x4e\xbe\x8f\x54\xfd\x81\xd6\x7d\xcd\x9f\x67\xaf\xab\x51\x39\x1e\xfd\x9d\x71\x42\x1b\xfa\x7e\x43\xe7\x6d\xd8\xe8\xbd\x38\x31\x25\x03\x5d\x55\x64\x70\xe9\x52\x86\x04\x91\x0d\x67\x92\xf4\xca\x37\x74\x03\x81\x9a\x97\x71\xa7\x3e\xab\xc7\x37\xda\x30\x48\x35\x09\x1a\x2e\x15\x54\x39\x88\xd5\x4f\x72\xd9\x02\x13\xd7\x11\x28\x7c\x81\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x33\x45\x04\xc2\xa1\xa8\xf7\xe5\x53\x7d\xde\x88\xa9\x87\xe1\x4a\x69\xc4\x1b\x6b\x7d\x9a\x59\x09\x79\xb4\x94\x41\xf4\xc2\xa0\x4e\x6d\xe1\x8f\xae\xf0\xc6\x4a\x29\x8d\x24\x21\xaa\x9f\x0f\xa0\xd9\x05\xdb\x7b\x15\xb4\x8b\xa6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\xd5\xc9\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x3f\xc7\xfe\x80\x8d\x75\xaf\xe4\xc9\x6f\xba\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x03\x29\x52\xf4\xf9\x7e\xb0\xe5\x81\x14\x61\xa5\x4f\x47\xe3\xac\x77\x94\x25\x4f\xce\x14\x77\x34\x4f\x26\xfc\x55\x2e\xcc\x53\x02\x69\x75\xf8\xe4\x86\xf4\x9c\xd9\x45\xa0\xd2\xce\xbc\xf9\xb1\xa2\x8c\xf4\x17\xc6\xd7\x7f\xf3\x8b\x63\xc2\x9e\xd6\xc8\x45\x25\x15\xa4\x50\x5c\x2c\x1d\xeb\x57\x72\xd7\x5c\x5f\x74\xdf\xa0\x70\xf2\xe1\xc1\xc9\xc1\xd1\xda\x1e\x39\x90\x90\x7e\x61\xae\xc5\x63\x4b\x9d\xed\x07\x25\x69\xdd\x54\x4b\x18\xc7\x41\x39\x42\x54\xe5\xc0\x08\xe9\xdb\xd0\x94\x09\x87\x59\xb1\x54\xdf\x23\x24\x39\x52\x02\x97\xd4\x1a\x08\xf0\xa9\xfe\x92\x12\xad\xbd\xd0\x0f\x0f\x7e\x3d\x18\x21\xa2\x8a\x23\x74\xcf\xd9\x81\x82\xe9\x3b\x46\x37\x50\x5c\x31\x1d\xd6\xeb\x3a\xb2\xe4\x2d\x54\x18\x37\x4b\x68\xea\xe9\x56\x4b\xb8\x6e\x10\x6f\x6d\xfd\x55\xac\x52\x28\xca\xc3\xe7\xfc\x81\x2a\x4b\xbe\xa1\xe5\xf7\x4b\xd8\x4d\xb6\xe2\x37\xd6\xc6\xc8\x1d\x39\x59\x10\x5c\xa9\x85\xc9\x66\x60\x9c\x8d\xff\x45\x04\x07\x1a\x73\x66\x7f\x93\xda\x8d\xb4\x90\x72\xf8\x24\x84\x97\xd7\x3b\x94\x05\xc8\x94\xd9\x19\xe0\x1e\x7d\xed\xbd\x21\xd1\x2a\x11\x5a\x95\x47\x6f\x6f\x6e\x26\x6f\x88\xea\xd7\x73\xd6\x1f\xa2\x37\xe7\x37\x2e\x87\x05\x1c\xfd\x44\xcc\xb8\xa8\xf7\x40\xbc\xe7\x01\xd7\x8e\x51\xc3\xc5\x3e\xdc\x32\x0b\x2e\x93\x96\x13\x3d\xc1\x15\xf3\x96\x4b\x65\x62\x39\xc6\x36\x61\x90\xd8\xc8\xfb\x09\x19\x2e\x7d\xff\x62\x72\x8c\xfe\xc6\x5b\xa8\x44\x86\xa7\xd5\xd2\x17\x32\x92\x24\x0d\x45\xad\x9f\x17\xba\x2b\x2f\xf4\x0d\xa2\x77\xfe\x5b\x82\x4b\x22\x24\x08\x68\x82\x93\x93\xa1\xb3\x1d\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x61\x87\xdd\xa7\x38\xb7\x87\xf3\xd8\x1c\x57\x4b\x27\x2b\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x49\x2f\x33\xef\xf6\xf3\xa9\x51\x53\xc3\x69\xb3\x01\x0e\x43\x54\x6a\x65\x9b\x29\x9a\x97\xe9\xba\xc8\x90\x2f\x80\x32\xe6\x0c\xa0\x34\xf2\xf3\xd5\x17\x41\xb0\x27\xf9\x4d\xf9\xd2\x10\x50\x36\xa8\x3d\x7a\x12\xb8\x3d\xb2\x28\x4a\xbb\xf9\x8c\x0f\x3a\xde\x7b\xbe\xe9\xe5\xb4\xab\x0b\x5e\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\xd9\xdc\x3a\xd0\x6c\x0b\x2c\xc9\x18\x22\xef\xcc\x88\x73\x19\xb0\x5d\x6b\xe9\xa0\x38\x07\x75\xcf\x17\x89\x36\xbd\xce\xd3\xd5\xac\xa8\xf0\x64\xea\xf6\xf0\x59\x0b\xa8\xf7\x16\x2b\xcf\x8e\x47\x5f\x84\x3a\x89\x32\x11\x2f\xac\x73\x9b\x99\x3a\xa1\xc0\xe7\x6d\xae\x2b\x10\xbc\x92\x88\xbb\xf4\xfd\x95\x6d\x5e\xb5\x0a\xb8\x6f\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4a\x44\x47\x0c\x29\xd4\xfa\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xe6\x04\xbd\xd2\x2d\xff\xf1\xdb\x6f\x7f\xff\x6d\x86\x76\xf4\xf0\x5c\x2b\x98\xa1\x8b\xd3\xcb\xd3\x5f\xae\x7f\x3c\x03\xba\xf9\xd4\xd7\x67\x4a\x92\xcd\x9d\x22\x9b\x35\x41\xf6\x49\xd3\x63\x81\xb8\x31\x59\xca\xe6\x3e\x12\xd7\xd0\x2b\xbd\x09\x5b\x69\x28\xea\xad\x4d\x12\x94\xd8\xd6\x66\x54\xfa\xee\x0c\x83\x79\x5a\x60\xed\x85\xa4\x92\x15\x21\x4d\x36\x8b\xff\x5a\xbf\xad\x57\x0e\x08\x95\xad\x30\x55\x69\x7d\xf0\xaa\xf3\xe5\xdb\xa0\x15\xf4\xe1\x2b\x32\xfe\x25\x29\x38\x2b\x53\x4c\x80\x5c\x2a\xad\xed\x49\xd6\x33\x77\x6d\xde\xe9\x5c\xc4\xdd\x55\x62\x1b\x03\x4b\x32\x75\x45\x91\x5f\xd5\x3c\x72\xd2\xb0\x41\xc0\xdb\xfe\xf8\x87\xf8\x00\x59\xd1\x5c\xf3\xe2\x36\xa3\x8b\x2c\x51\x80\xbd\xd6\x27\xad\x30\xb1\xc0\x9b\xb3\x89\xe9\x9c\x5e\x99\xcb\x0f\x37\x1d\xf5\x8b\xd6\xc2\x71\x57\x0d\xfe\xad\x8d\x16\x62\x56\xa2\x5b\xd2\xa4\x59\x97\x5a\x60\x3a\x18\x61\x1f\x45\x08\xbe\x77\x61\xeb\x76\x98\xf4\x6a\x23\x08\x1c\xfa\xcf\x68\xc4\x69\x15\x80\x82\xe0\x3c\x04\x02\xad\x11\x32\xc3\xb4\x42\x18\xbc\xf2\x8a\xd6\x04\xdd\x2f\x08\x33\xce\xfe\x0e\x2d\xf1\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x20\xe1\xdf\x6d\xed\x35\x4c\x65\xc5\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\xd5\x6c\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\x91\xf3\x09\xc8\xe0\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x30\x17\xcb\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x9b\x90\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\xcb\x13\xeb\xa6\x6b\x96\x14\xce\xef\x26\xb6\x10\x58\x2e\x08\xe4\xce\x92\x07\xaa\xa4\x69\xd4\xb0\xb1\xba\x19\xd7\xfa\xc2\x5c\xe0\x82\xa0\x86\x08\xca\xb5\x8a\xd1\x32\x55\xf2\x7b\x86\xa6\x64\x4e\x99\x74\x2b\x96\xd2\x25\xb7\x25\x00\x49\x44\xa5\xaf\xdd\x7d\x8c\xae\x7a\x95\xe3\x2c\xbb\x58\xc1\x3b\x99\x69\xa7\x68\x94\x69\x4a\x40\x79\x81\x6d\xd0\xe2\xaa\x5a\x76\x1b\x2f\x24\x08\x7d\x64\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\xa5\xc9\x20\x9f\x51\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\xa3\x3b\x83\x4a\x24\x08\x2e\x92\x78\x8c\x07\x0c\xd8\xa7\x9e\x01\x03\x36\x60\xc0\x06\x0c\xd8\xfa\x33\x60\xc0\xfa\xcf\x80\x01\x7b\xbc\x43\xfb\x1c\xb4\x1b\x30\x60\x83\x57\x66\xfd\x19\x30\x60\x51\xcf\x80\x01\xfb\xe4\xb3\x77\x22\x7a\xc0\x80\x7d\xc6\x33\x60\xc0\x3e\xf3\x19\x30\x60\x03\x06\x6c\xc0\x80\x0d\x18\xb0\x84\x67\xc0\x80\x6d\x3f\xbc\x21\xf8\x13\xff\x0c\x18\xb0\x01\x03\xb6\xe5\x33\x60\xc0\x56\x9e\x01\x03\x36\x60\xc0\x3e\xf6\x0c\x18\xb0\x01\x03\x66\x9f\xc1\xdb\xb8\xf6\x0c\x18\xb0\x0d\xcf\x80\x01\xdb\xae\x9d\xc1\x0c\x48\x7b\xd9\x93\x98\x01\x52\xf1\xe6\x9a\xce\x13\x78\x21\x73\x1d\x83\x6b\xdf\x13\x4b\x1a\x29\x6d\xb1\x5d\x69\x3e\x74\x7e\x2c\x69\x29\xfb\x42\x44\x58\x70\x93\x4c\x89\x36\x11\xf4\xb0\x9a\x94\xdb\xe4\x62\x06\x01\xe4\x80\xc9\x4d\x9f\x0a\x47\x13\x48\x7b\x65\x1d\xfa\xea\xb3\xbb\xdd\x28\xd3\xb6\x4b\x7c\x0f\x82\xf9\x28\x30\x33\x95\x51\x6d\x99\x6c\x7d\xbd\x4f\x78\x29\x5d\x25\x09\xc6\xd9\xd8\x90\xb5\x1e\xeb\x0e\x1f\x73\x79\x9c\xe0\x0d\x4e\x64\x66\x33\x18\xb9\x89\xe0\xd3\x9d\xb1\xb3\x4d\x00\x7f\x44\x0b\x0b\xd0\xe3\xb3\x1e\xe3\x9a\xe9\x60\x24\xd3\x5a\x1f\x18\x06\xc5\x9a\x1d\x05\x17\xb5\x02\xdb\x83\x02\x77\xc9\xe6\xb6\x35\x72\xca\xb1\x54\xca\x93\x86\x9b\xff\x74\xb8\xa9\x00\x30\x15\x1d\x47\xd9\x31\xbd\x5c\x0a\x4a\x6a\x67\x08\xa9\x3d\x41\x98\x65\x40\x45\xe5\xd4\x95\xf6\x14\x0d\xb5\x9f\x48\xa8\x7d\x44\x41\xed\x02\x01\xb5\x73\xf4\x53\x9e\xb0\x7a\x86\x90\x7a\x26\x8d\xf4\x09\xc2\x53\x16\x48\x7f\xb3\x10\x44\x2e\x78\x15\x2d\x70\x72\x09\x9b\xf7\x94\xd1\xba\xad\xa1\x0a\x85\x96\x29\xf4\xce\x83\xfd\xa5\x13\x19\xf6\xba\x37\x88\x03\x28\x57\x51\x12\x28\x03\x8e\x69\xa5\xb7\x16\x90\x85\x2e\xf0\x1d\x28\xa5\x6d\x51\x10\x52\xa6\xa8\xa5\xa1\xb7\xfa\xf7\xc7\xbe\x87\x86\xa3\x9f\x4a\xf4\x2a\xed\xaa\x49\xb3\x7b\x02\x77\xde\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\xd2\xec\xee\x66\x4e\x77\x33\x25\xb9\x98\x72\x28\x06\xa9\x5e\x94\x7e\x0c\x99\x0b\xb5\x12\x02\x9d\xc3\x2a\x12\x71\x47\x0b\x72\xfc\x0c\x8e\x8a\x5c\xc6\x7f\xfa\x41\x40\x10\x26\x80\x81\xef\x8b\xda\x75\x6d\xba\xe3\x23\x0c\x81\x8f\xca\xf6\x14\x40\xa3\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\xbc\x41\x33\xa7\x6a\xd1\x4e\x8f\x0b\x5e\x9f\x68\xd1\x61\xfe\x33\xad\xf8\xf4\xa4\xc6\x52\x11\xa1\x6d\x1c\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xe5\x36\x0d\xeb\x11\x27\xc1\x94\x68\xb9\xcf\xc5\x8a\xb7\x40\x4f\x4a\xfa\x26\x4d\xbe\xbf\x53\x8b\x8a\x24\xc2\x92\x77\x02\x49\x1e\xa4\x36\xca\x10\x10\xc8\x29\x54\xf6\x03\x76\xfc\x64\x90\xe3\x2c\x67\x35\x13\xd4\x78\x8f\x60\xc6\x7b\x63\x0b\xed\x0b\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xc9\xa0\xc3\x5f\x04\x6c\x38\x63\x7c\x2c\x13\x5c\xf8\x39\xa0\xc2\xfb\xeb\x83\x41\x19\xe0\xc1\xcf\x07\x0d\xce\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x28\xf0\x73\xc4\xff\x9f\x2c\xf6\x9f\x21\xee\x9f\x33\xe6\x9f\x2d\xde\xff\x64\x90\xdf\x74\xb8\x6f\x56\x9f\xc2\xb3\xc0\x7c\x73\x42\x7c\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x80\xa0\xb9\x56\xe2\x72\x0d\x2c\x6a\xdc\xd6\x7d\x5c\xc3\x02\x4b\xe4\x42\xdd\x96\xe2\xc5\xc5\xd2\xad\x0a\x8c\x30\x44\x9c\xf5\xf8\xa2\xa3\xd6\x68\xff\x22\xd7\x68\x6f\xdc\xe3\x86\x57\x65\x4f\x76\xcd\x5b\x7e\x8f\xf8\x4c\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\xf7\x3a\xf2\x65\xfb\xf8\xe9\xd0\x97\xfd\xe2\xac\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\x75\x8c\xde\x5b\x75\xe2\x15\xf4\xc7\x8b\x22\xcc\x4a\x64\xf9\xb9\xbe\xbe\x7d\x92\x0c\x75\xef\x1b\x37\x1e\x9b\xde\xc7\xb3\x98\x1b\x58\x6b\x99\x1c\x61\xfd\x2d\x50\x40\x07\xa7\xeb\xde\x38\x5d\x77\x84\xc0\xfe\xfa\xac\xad\xe7\x47\x5c\x0f\xd6\xd6\xbf\x8b\xb5\x15\xd0\xe2\xbd\x11\xb8\x20\x93\x7d\x52\xde\x9c\x00\xe9\x12\x01\x3b\x1d\xce\x8b\x0b\x46\x88\x49\x1c\xeb\x48\x0f\x81\xdf\x6f\xd6\x56\xd5\xd2\xf8\x10\x7b\x0c\x98\xf1\x5b\xeb\x66\x41\xd6\xa8\x03\x21\x94\xba\xa1\x77\x9d\x6d\xd2\x08\x6e\x35\x12\xd1\x32\xa6\x55\x0c\x7b\x9c\x74\xe7\xb5\x2d\x22\x09\x8b\x77\xa7\xe3\x1e\xb1\xa1\x05\xa1\x03\xd0\x73\x41\x50\x97\xbf\xd4\xef\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\x25\x0b\xd2\xbe\xa5\x55\x65\x5f\x93\x00\x0a\x27\xca\x84\x9e\x8d\x46\x53\x71\x36\x87\xc9\xc0\xa6\x23\xe4\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x85\xeb\x67\x12\x2a\x3e\x68\x9d\x4a\xc4\x68\x35\x72\x53\xde\xa7\xc0\x5c\xdf\xf3\x9d\x4b\x59\x92\xd2\xb2\x57\xde\x53\x49\x46\xf0\xce\xe8\x3e\x99\xbe\xb8\xaa\xfd\x66\xdf\x98\xcf\x1a\xc1\xef\x68\xd9\x61\xf4\xf5\xb6\x00\x7c\x7c\x74\x5b\x3f\xc2\x7b\x9d\x68\x65\x9c\x8d\x19\x99\x63\x50\x8f\xad\x40\x33\x88\x4e\xd3\xbe\xc1\x0f\xb2\x92\x16\x58\x11\x09\x39\x09\x3d\x6a\xdb\x3b\x8a\xa3\x7b\xa2\xc7\x13\xec\x28\x74\xc8\x38\xe2\x90\x59\xd8\x32\xaa\x96\x10\xd1\x5b\xb4\x0a\x95\xfc\x9e\x1d\xa5\x1c\x4c\x03\x73\xc0\x68\x4a\x14\xee\x92\x03\x9d\x4a\x26\x11\x61\x78\x5a\xe9\xb3\x07\x88\xff\x9b\x8d\x1b\x00\xcd\x08\x56\xad\x20\x68\x8e\x55\x82\x94\xd8\xa0\xcd\x9b\xf5\xfc\xf8\xb6\xa3\xd2\xc6\xeb\x66\xa8\x65\x92\x24\x2a\xb2\xd9\x4c\x80\xc8\x8c\x57\x7d\xa2\x79\xab\xf6\xe4\x1e\x79\xcc\x75\x64\x32\x77\x02\x23\x91\xd6\x44\x22\xde\x26\x78\xf2\x7a\xe6\x9f\x6d\x2e\xa7\x85\x37\xf8\x9d\x36\x3e\xb1\x61\xd3\x1c\x3b\xec\x32\xd0\xca\x03\x7e\x02\x07\xb7\x32\x19\xd4\xaf\x2f\xaf\x7f\x79\x77\xfa\xdf\xe7\xef\xe2\x16\xfe\x1c\x17\x8b\x90\x5b\x9c\x21\x0c\x17\x05\x08\xf9\x05\xbe\x23\x08\xa3\x96\xd1\x7f\xb6\x16\xf2\x76\xe8\xdb\x8b\x14\xab\x59\xd2\x7b\x92\x14\x5f\x7d\x4b\x44\x49\x8e\x1c\x6b\xfa\x8e\x4a\x20\xaa\x86\x4e\x58\xe0\x3f\x97\x04\xcd\x04\xaf\x57\x0c\x2d\x74\xe9\xc1\x75\x4b\x7d\xc3\x60\x63\x9a\x2d\x88\x88\xd3\xc8\x5f\x7f\x38\xbf\x86\x1c\xfc\x46\x18\x62\x77\x48\x2e\x80\x77\x42\xeb\x26\x75\xd0\xf4\xa7\x3c\x46\xa7\x6c\x69\x7e\x69\x84\x59\xa4\x8a\x52\x51\xa9\x08\x28\xa7\xd6\x90\x74\xf0\xc0\x17\x2f\x8f\xe1\x7f\x2f\x10\x2e\x4b\xa1\x2d\x4d\x9f\xa3\x51\xac\x66\x99\x45\xb5\x6c\xec\x57\x3a\xad\x82\xc9\x65\x44\x41\x1a\x47\xd4\x0b\xdf\xf3\xd2\xae\x04\x28\x81\x80\xdf\x31\xda\xad\x54\x02\x2b\x32\xa7\x05\xaa\x89\x98\x13\xd4\x60\x55\x2c\x50\x8d\x97\xa8\xe0\x42\xb4\x8d\xa1\x18\x29\xb1\xc2\x71\x2d\x7f\xcf\x05\xaa\x9d\x74\xd6\xd2\x4c\xab\xe4\xd7\x9b\x81\xa0\x9d\xc8\x0e\xff\x49\xa5\x6c\x89\x3c\x79\xf5\xf2\x4f\xdf\x7c\x1b\x69\x5e\x67\x3c\xb8\xb1\xd0\xa7\x04\xc8\x53\x1f\xfe\xe5\x36\x18\x80\xae\x7b\xcc\x30\x76\x87\x98\x9d\x0f\xd2\x50\x52\x36\xaf\x92\x1d\x20\xc9\x6e\xc0\x54\x27\xe0\xb8\x1b\xc1\x24\xd6\x17\x98\xee\x09\xec\xf5\x21\xde\x95\x92\xcf\x0b\xd6\x69\x70\xce\xef\x65\x05\x32\x67\x81\x61\x77\x31\x71\x52\x2a\xc5\x7f\x04\xd6\x84\x77\x4c\x19\xf6\x11\xd3\xac\xc1\x3b\x8c\xd0\x4b\xf4\x5f\xe8\x01\xfd\x17\x78\xc1\xfe\x18\xdf\x54\x1e\x1f\x53\x0e\x18\xff\x82\x4b\x75\x31\xc9\xb4\xd0\x7f\xd5\xf7\x95\x7e\xa3\x5e\x0f\xc5\xd1\x94\x5a\x77\x04\x79\x50\x44\x68\x33\xd0\xae\x61\xea\xcc\x25\x79\xd4\x74\x07\xbf\x94\xdd\x9d\x0a\x2e\xb8\x98\xf5\xd1\xff\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x0a\x9d\xb0\x1f\x35\x5c\xc4\x3d\x71\x9f\xd2\xea\x7b\xbd\xf7\xba\x1a\x1b\xa8\xe4\x90\x00\x61\x72\x38\x17\x34\x41\x38\xec\xcf\x89\x4d\xc3\x89\xe6\xdb\xba\x1f\xdb\x5a\x2b\x3e\x7d\xf0\xc8\x58\x23\x25\x28\x4b\xd3\xf0\xf2\x18\xec\x9b\x84\x5e\xe8\xd9\x28\x03\x65\xe0\x23\xa6\xd1\xb1\xb1\xd7\x7c\x74\x18\x0e\x9c\x96\x58\x05\x66\xb1\x3a\xac\x79\x04\x99\x11\x21\x4c\x9e\xf0\x74\xe9\xd2\x8d\x92\x77\x5b\x92\x94\x6b\x04\x57\xbc\xe0\xd1\xb4\x29\x39\xb7\xca\xc4\xf6\x05\xe6\x1e\x62\xb5\x3e\x3a\xfe\xc3\xeb\xc9\x08\xdd\x9c\x4d\x46\x88\x0b\x74\x7d\x96\x06\x7e\x0a\x5d\x30\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x0e\xd3\xcd\xd9\x24\xe2\x25\xeb\xf0\xd9\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x5e\x33\xb9\xb8\xac\x43\xdf\xd3\x7c\x94\x2e\x35\xbf\x23\xa5\xb1\x9a\x5d\x2b\x84\x95\x0d\xa7\xda\x46\x1a\x78\x5e\x3e\xf6\x0c\x3c\x2f\xdb\x3f\x03\xcf\xcb\xa6\x67\xe0\x79\xd9\xe2\x19\x78\x5e\xcc\x33\xf0\xbc\xf4\x3b\xb2\x8f\x39\x46\x03\xcf\xcb\x27\x9f\x81\xe7\xe5\xd1\x67\xe0\x79\xd9\xea\x19\x78\x5e\xd6\x9f\x81\xe7\xe5\x23\xcf\xc0\xf3\xe2\x9f\x81\xe7\x65\xe0\x79\xf9\x72\xa5\xf6\xc0\xf3\xb2\xfa\x0c\x3c\x2f\x03\xcf\xcb\xc0\xf3\x12\x3e\x03\xcf\xcb\x23\xcf\xc0\xf3\x32\xf0\xbc\x0c\x3c\x2f\x1f\x7f\x06\x9e\x97\xe8\x67\xe0\x79\xd9\xee\x19\x32\x0f\xb7\x7c\x06\x9e\x97\x81\xe7\x65\xf5\x19\x78\x5e\x3e\xf9\xec\x87\x7b\x7c\xe0\x79\x19\x78\x5e\x3e\xfa\x0c\x3c\x2f\x03\xcf\xcb\x47\x9f\x81\xe7\x25\xe2\xd9\x3b\xa7\xeb\xc0\xf3\x32\xf0\xbc\x7c\xac\x8d\xc1\xda\xda\xee\x19\x78\x5e\x06\x9e\x97\xb5\x67\xe0\x79\x59\x7f\x06\x9e\x97\x81\xe7\x65\xe0\x79\x19\x78\x5e\xfc\x33\xf0\xbc\x7c\xed\x7e\x27\x41\x24\xfd\x17\x99\xf0\x8a\x16\xcb\xe4\x6c\x9f\x2b\x22\x79\x2b\x0a\x7d\x63\xc3\x6b\x51\x03\xef\xf5\x1e\x85\x24\x25\x7b\xcf\x28\x14\xae\x82\x89\x0b\xa9\x14\x84\x9d\x83\xa7\x98\x82\xbd\xa0\x53\x70\x03\xbc\x8c\x47\x10\x8c\x5d\xf9\x6c\x33\x7d\x71\xce\xd2\x64\xab\x3d\x1c\xc8\x3e\xa4\x73\x86\xb4\x47\x7e\x17\x29\xee\x85\x2d\x7d\x74\x73\xe1\xa6\xa9\x68\x4a\x62\x2c\x42\xd7\x2d\x68\x17\xc4\x86\xc0\xe5\x77\xa8\x68\xda\x11\xaa\x49\xcd\x45\x42\x62\x44\x06\x0b\xae\xb7\x55\xf6\x61\x9d\xae\x4c\x87\xdc\xe4\x2b\x0e\xf3\xbf\x34\xf6\x42\xc7\x52\xe5\xd7\x8a\x3a\x71\x98\x84\x35\xbb\x98\xad\x82\x51\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x70\x67\xac\x55\x67\xbc\x6e\x5a\x45\x7a\x17\x9b\x99\x62\x63\x74\x50\x99\x2a\xd0\x77\x93\x0d\x5a\x70\x36\xa3\x73\x6b\x7d\x9f\xd4\x98\xe1\x39\x19\xfb\xd9\x1e\x77\x54\x0f\x27\xd1\x17\xf5\xce\x52\x41\x8b\x0a\xd3\x78\xe0\x60\x2e\x31\x71\x06\xbd\x00\x1a\xb0\x0e\x50\x0f\xb9\x69\x7e\x9a\x47\x1e\x36\x4e\x8d\xdc\x38\x76\xbf\x32\x7f\x3c\x4a\xb0\x1e\xb1\x02\x5f\x05\x18\x46\x1b\x76\x6a\x9a\xc1\x68\xcc\xc4\x92\x34\x44\x5b\x04\xc6\x81\x1a\xaf\xf7\x2f\x19\xae\x69\xe1\x4e\xd8\x69\x55\xf1\xc2\xf8\x64\xfa\x56\x65\x8e\x2e\x6b\x63\xb7\xae\x5b\x85\xa7\x15\x39\x46\x17\x86\xa2\x82\xb3\x6a\xa9\xcf\x9f\x24\xca\x41\x14\xec\xe6\x4f\xb3\x24\x53\xf0\xaf\x89\xd8\xd7\x8d\x4a\x39\x6c\x2a\xc3\xa9\x41\x98\x16\x65\x9c\x11\x44\x98\x12\x4b\xbd\xff\x26\xbc\xbc\xd6\x5b\xb0\xf7\xed\x64\xaa\x8d\x44\xc8\x6b\x0e\xb8\x6b\x22\xd4\x35\x0f\x40\x35\x1d\x9c\x9a\x17\x98\xda\x85\x10\x0c\x53\x50\x98\xf1\xd3\xdb\x16\x0d\x2f\x8f\x37\x88\x26\xc4\x67\x89\x3d\xd0\x2d\x4e\x78\xa9\x95\x26\x41\x8c\x7c\xf2\x67\xd4\x38\x10\x2f\x74\xe7\x6e\xc1\xe3\x87\x55\xa7\x4d\xe1\x3b\x4c\x2b\x7d\x80\x13\x3b\xb0\xce\xba\x98\x16\x95\xc9\x14\xab\xb0\xe0\xfc\x7d\xda\x2c\x36\xad\xab\x97\x19\x56\x2c\xb8\x24\x0c\xe4\x25\xf6\x19\x3c\x3e\xbf\xc0\x8a\x98\xd2\xdc\xc5\xa9\x28\xe2\x8b\x19\x22\x75\xa3\x96\x23\x44\xee\x88\x58\xaa\x05\xa0\x0d\x3c\x6f\x28\x88\x35\x2a\x51\x8d\xcb\x60\x77\x8c\x10\x77\x0e\xe8\xc4\xe6\xe1\x7e\xb0\x36\x59\x5b\x29\x63\xa1\x51\xe9\xd3\x28\x76\xbd\x6b\x72\xd3\xd9\xa0\x54\xa1\x99\x93\x8e\x06\x01\x95\x6a\x4d\xe3\x88\x6b\x51\xc6\xb3\xf0\x0e\x7a\x11\xa4\x8e\xe8\x2d\x51\xe3\x07\x70\x4f\xe2\x9a\xb7\x4c\x19\x9e\x1a\x63\x31\x78\x2d\xcf\x24\xd8\x3c\x23\x5e\xee\x49\x75\x7b\x94\xe7\x6a\xc7\xa5\xa3\xa6\x98\xe4\xc8\x53\xc6\x4a\x11\xc1\xbe\x43\xff\x73\xf8\xf7\xdf\xfd\x3a\x3e\xfa\xf3\xe1\xe1\x4f\x2f\xc7\xff\xf9\xf3\xef\x0e\xff\x7e\x0c\xff\xf8\x8f\xa3\x3f\x1f\xfd\xea\x7e\xf8\xdd\xd1\xd1\xe1\xe1\x4f\x7f\x79\xff\xe6\x66\x72\xfe\x33\x3d\xfa\xf5\x27\xd6\xd6\xb7\xe6\xa7\x5f\x0f\x7f\x22\xe7\x3f\x7f\xe6\x4b\x8e\x8e\xfe\xfc\xdb\xf8\xe8\x63\x6a\xa8\x3d\x5f\xa0\x3d\x53\x98\xfd\x49\x82\xec\x56\xc6\xee\xfc\xf0\xdb\x2b\x70\xed\xf8\xdb\xe8\xc4\xc7\x8e\xbf\x48\xf6\xc9\x5c\xcc\xba\xf6\xa9\x44\xbc\xa6\x4a\x91\xd2\xde\xbd\x01\xf7\xcd\x8a\x3f\xc8\x0a\x2c\xa0\xad\xc2\x70\x7b\x07\x1c\x2c\x9d\x1b\x29\xba\x5b\xfe\x7e\x05\x0f\x18\x43\xb4\x6e\x2a\x52\x13\xa6\x40\xf0\x8c\x9d\x6d\x0b\xee\xc4\xe3\x6e\x04\x85\x71\x78\x90\x87\x82\x90\xd2\x76\x72\x90\x8d\xc1\x33\xc8\xc6\x41\x36\x7e\xea\x49\xf6\x89\xe7\x10\x8c\x57\x61\x27\xac\x2f\x4b\x3a\x4d\x19\x3c\xe4\x9e\x22\x81\xcf\x00\x28\x71\x47\xcb\x16\x57\x21\x93\xac\x23\x17\x8d\x93\x00\xe0\xda\xe9\x43\x43\x20\x4c\x4b\xee\x48\xe5\x3b\x61\xdc\xf4\xc7\xe8\xaf\x06\xce\x13\x1a\x9a\x7d\x87\x7a\x5c\x40\x6e\xd3\x70\xfb\x8c\x10\xd6\xd4\x3d\x90\x2b\x5d\xf2\x68\xa3\x2e\x09\x43\xef\xb6\xb8\xa9\x38\xf5\x52\xa3\x5a\x8e\x90\x24\xca\xe4\xd8\x2c\xc8\xca\x32\x61\x89\x5e\x9c\x56\xf7\x78\x29\x5f\xf8\x98\x24\x65\x54\xad\x14\x1f\x88\xea\x03\x70\xc3\xea\x17\xce\xb8\xd6\x79\xa1\xaa\xc2\x6c\x46\x8a\x48\x6b\xd6\x70\x70\xac\xf7\xcd\xe2\xd1\x15\x65\xad\x1e\xad\x9b\x55\x52\x22\xce\xa2\x1a\x22\x0f\x54\xa1\x96\x29\x5a\x69\x65\x1d\x09\x32\x6f\x2b\x1c\x3a\x02\xed\xc8\x1c\x4c\xae\x3c\x46\x1f\x58\x41\xc2\x2f\xc7\x79\xaa\x57\x1a\xd0\xca\x43\x45\x14\x29\x47\xf0\xea\xfe\xd0\xa5\x01\x9a\xf5\x4e\xbe\x5f\xca\xa8\xe6\xdd\x5c\x7a\x20\xd1\xb1\x39\x50\x1e\xe5\x80\x4a\x3a\x9b\xe9\x96\xc1\xd8\x66\x5c\xd4\x78\xbd\x57\x98\x95\x51\xad\xeb\x93\x0b\xe9\x25\x21\xcb\x2f\x54\x76\x79\x21\x69\x49\x0a\x2c\x5e\x84\x35\x41\x4e\x2b\xb5\xe0\xed\x7c\xd1\xed\x8a\xb4\x29\x47\x52\x01\xbc\x4a\x4f\xa6\x74\x9e\x8b\x95\xcd\x26\xb5\xce\xc2\x0a\x62\x54\x2b\x4e\x8c\xc0\xb8\xc7\x91\x6d\xaf\x41\x00\x0c\xa6\xdb\xac\xb9\xcb\xb9\x02\x0c\x1f\x29\x83\x04\x39\x46\x1e\x54\x86\x01\x1f\xa3\x0b\x43\x78\x31\xea\xbf\xb5\x37\x25\x66\x32\x02\x0c\x9b\x43\x63\x46\x02\xf8\x56\x1a\xa0\x3e\xc5\x0c\x78\x89\xcd\xcb\x31\x5b\xba\x8c\x0e\xc0\x98\x99\x4c\x34\x9f\x64\x52\xc5\xf9\xd0\xfd\x59\x7a\xf6\x32\x3b\xbd\x13\x7a\xd5\x56\xbb\x8b\x5e\x5e\x85\x05\x3e\x2a\x5b\x80\x47\xe8\x1e\xb9\xac\x9e\x05\x29\x6e\xcd\xc9\x2b\x89\x11\x6f\xc4\xf2\xdc\xa6\x9e\xae\x05\x6f\xab\xd2\xb0\xea\x76\xd2\x19\x24\xad\x81\x50\x9a\x6e\x60\x41\x10\xd1\x16\x02\x50\x8f\xd0\x38\xf1\xcd\x45\xa9\xb7\xb7\x11\xc9\xf0\x62\xe3\xd5\x76\xe9\x2e\xb6\x4b\x20\xe5\x0b\xce\xcc\x3d\x39\xb2\x37\x77\x8d\x29\x8b\x55\xed\xba\x31\xd0\x39\xe3\x02\x9c\xd6\x33\xc4\x78\xbf\x0f\xfd\x23\xbf\xd2\x8b\x68\x9d\xc3\xe3\x90\x36\x6a\x3b\xdd\x72\x9a\xf6\xef\x17\x44\x5b\x6b\xfd\xbe\xc4\x8a\xed\x60\x45\x85\x96\x88\xc7\xba\x33\x52\x09\x0c\x34\xc9\x36\x9f\x42\xc4\x6e\x7c\xad\x74\x9f\x2a\x54\x73\xa9\xd0\x37\x2f\x83\x39\x4e\xf2\xa3\x8d\x11\x9c\x44\x08\xf8\x79\x35\x05\x98\x2e\x30\xe4\x42\xc5\xbe\xf5\xa2\x24\x4c\xd1\x02\x57\x41\x47\xf5\x25\x31\xe3\x62\x4a\xcb\x92\x00\xb4\x1d\x0a\x42\x80\xc9\x19\x69\xe9\x82\xea\xda\x35\x10\x60\x40\xba\x8d\xf5\xfe\x87\xeb\x1b\x88\x61\xf6\xf5\xbd\xce\xe6\x8f\x53\x8d\xee\xf4\x10\x94\x16\x0a\xe1\x7e\x36\xea\x6c\xaf\xa5\xaf\x03\xd2\xa7\xc7\xa3\x77\x4a\xe0\xe8\x59\xf0\xfb\x75\x39\x42\xb5\xca\xc6\xca\xe8\x84\xc7\x3d\xc0\xf1\x99\x8d\xbf\x23\xec\x9d\x69\x7c\x1f\xd0\x5c\xd7\x3e\x37\x52\x6f\x6c\x6c\x33\x23\xf1\x2d\x61\x5a\x94\xad\x2f\xfc\xcc\x73\x68\x51\x01\xee\xae\x14\x6a\x28\x38\xcd\x58\x51\xa9\x4f\xb3\xb9\x18\x21\xdc\xd4\x70\x5b\xc1\xcd\xe3\x9e\x5f\xd8\xcd\xf9\x42\x5f\xd6\x4e\xd8\xa7\x71\x5a\x67\x08\x7c\x66\xf0\x8e\xe8\x59\x3d\xe3\x65\x8a\x8f\x6b\x05\xee\xe0\x95\x1e\x93\x32\x03\xf7\x6d\x69\x74\x1e\x50\x78\xf4\xba\xf6\x57\xf5\xeb\xc0\x39\xe8\x33\x89\x15\x8f\xf7\x77\xe5\xc1\x3a\xb8\x6e\xec\x57\x08\xbb\xb7\x29\x04\xa9\xcc\x75\xbc\xa0\x0d\x9a\x12\x75\x4f\x08\xdb\xac\xa7\x95\xe4\x50\x1e\x39\x47\x4d\x62\x27\x3a\x68\xa8\x81\xd8\x1e\xa3\x49\xef\x98\xc3\xe5\x9e\xce\xec\x76\xc1\xbe\x5b\x15\x51\x60\x78\x39\x31\xe3\x44\xd8\x86\xb1\x02\x40\x2a\x0d\xce\xe5\x07\x4b\xc0\xda\x58\x1b\x73\xf2\xf0\x2e\xb9\x4a\x1b\x61\xf2\xd0\xb4\x7e\x67\x1d\x06\x4f\x32\xca\x4c\x48\x12\x8b\xe3\xde\xa3\x53\xd8\xbf\x6a\xed\xdc\xd9\xad\xef\x85\x73\x0f\x82\x17\x88\xef\xd4\x9d\xe3\x6d\x8a\x6f\xbf\x45\xc4\x04\xaa\x32\xd8\x15\xee\xc9\x43\x79\x99\x85\xf4\x32\x1f\xcf\x35\xca\xc6\x75\x8d\x3e\x02\x0b\x89\x63\x77\xcd\x8c\x34\x97\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\x28\x87\x75\x8e\xb3\x72\xdd\xef\x46\x2f\xa8\xe2\xba\x88\x78\x63\x2a\x78\xac\x94\xc7\xee\x3c\x2e\x2d\x03\x5f\x71\xdc\x8e\xbe\x98\xe9\x15\x31\xee\x11\x08\x94\x00\x68\x79\xb5\x63\x2e\xe8\x62\x74\xac\x7f\xb6\xf4\x0e\x57\x5a\x0c\x77\x7f\x31\x81\x0c\xcd\xf0\x8f\x9e\x12\xd9\xae\xb0\xbc\xed\xc2\xbb\x64\xdc\xf0\xb2\x8b\xe6\x9e\xb8\xa9\x83\x8f\xc8\x83\xfa\x02\x51\xed\x20\xa5\x26\x82\xde\xd1\x8a\xcc\xc9\xb9\x2c\xb0\x51\x61\x76\x8d\x8c\x38\x7d\xa4\x5f\xb0\x33\x05\xaf\xa4\xf7\x3d\x61\x97\x9f\x0e\x4e\x98\x39\xa6\x0c\x6a\x3b\x27\x68\xab\xb6\x51\x69\x12\xe4\xa9\x92\xa8\xc1\x42\xef\x42\x97\x08\x6f\xe2\x19\x53\xce\x2b\x5b\x0c\xa8\x5a\x76\xfd\xa2\xf1\x10\x56\x70\xa0\xf3\x5f\x18\xb9\xff\x45\xf7\x42\xa2\x59\x85\xe7\x5d\x3c\x45\x5f\x6c\xab\xfa\x64\x72\x6e\xfe\xa3\x13\x0d\x95\x6e\x5a\x7d\x8f\xdd\xe3\xa5\xec\x58\x0b\x42\xb7\x7b\xfc\x8d\xf2\xea\x08\xe4\x09\x96\xc8\xb7\x1d\x17\xef\xd1\xcf\x37\x47\xe0\xdc\x3f\x3b\x9d\xfc\x72\xfd\xb7\xeb\x5f\x4e\x5f\xbf\xbf\xb8\x8c\x7e\xd9\x25\x57\xc4\x40\x5b\x82\xa0\x6e\xe1\xd3\x69\xf4\x2a\xf8\x8c\xac\x63\x2e\x8f\x01\xb7\x0a\x94\xb9\xac\xe4\xf7\x89\xe0\x7e\xbd\xa7\x08\x8e\xf3\x9e\xe0\xa6\x39\x15\x35\x17\x13\xc1\x67\xb4\x8a\xd6\xf8\x73\x9d\xe0\x95\xee\x38\x98\xef\xa9\xfd\xb8\xbb\x6e\x0c\x8b\xe3\x7a\x36\x49\x70\x65\x50\xe0\x0a\xd4\xaf\x89\x87\x15\xad\x86\xf3\x0f\xe4\x6a\x17\xe3\x0f\xd1\x4e\xf7\xcc\xce\x39\xb2\x74\x37\x22\xff\x3c\x87\x6b\xa0\xe2\x05\xae\xa0\x4a\x74\xda\xc6\x47\x99\x0d\x93\xd5\x7e\x05\x9c\x1e\xd8\x6d\x67\x54\x71\x5c\x9a\x18\x96\x11\xfe\x25\x71\xb5\xcb\x9c\xda\x05\x59\x0b\x49\x1d\xb9\x31\x7c\x0a\xd0\x9e\x23\x21\x69\x04\xf1\x5a\xcd\x4a\xf3\xdc\x94\x6c\x4b\x6a\xf2\x7d\x3f\x07\xc4\x8e\xb2\x47\x97\x95\x7a\xe6\x7c\x33\xf6\x80\xd1\x19\xf8\x53\xc0\xcf\xa9\x0d\xf5\x65\x63\x1c\x9c\xef\xdc\x32\x24\x94\x97\xcd\x64\x3c\xc3\x4b\xf6\x64\x77\x9a\xf9\xf1\x3b\xd2\x24\x83\xdf\x52\x3d\x83\xb3\x4e\x48\xbb\x6d\xe3\x74\x10\x93\x11\x9e\xb8\x1f\x7f\x84\x42\xe6\x4e\xfe\x67\x70\x4e\xf9\x25\x46\xe3\xe0\x68\x35\x82\x8c\xd7\x8f\x57\xaa\xbd\x7f\xd5\x32\x45\x6b\xe2\x18\x46\xc7\x2b\x3a\x91\x30\xbf\x3e\x90\xbe\x9e\x4f\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x8e\x87\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\x28\x8f\x19\xf4\x07\x30\x40\x65\x79\x52\x0a\xde\x98\x9b\xd8\x51\x7f\xa5\x67\x65\xf6\x29\x66\xc2\x4a\x4e\xd6\x13\xd5\xeb\xc8\x5c\x60\xa6\x3a\xfc\xde\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x68\xf6\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x45\x6b\xce\xdc\xe0\x02\x8e\x19\x34\xf9\x70\x7d\xf1\x7f\x56\xce\x4d\xbc\x6a\x67\x9e\xfd\x2e\x59\xa1\xe5\x41\xb6\x6d\x73\x65\xeb\x7c\x0f\x1b\xe7\xeb\xde\x38\xde\x41\xb4\x73\xbe\xed\xab\x36\x8c\x38\x53\x16\x74\x0d\xd5\x49\xba\xce\xc4\x53\x53\xf6\xdf\x1a\x02\x74\x05\x41\xfa\x2b\x4c\x51\x80\x4b\x07\xde\x5a\xc5\x4d\x29\x6b\xab\x76\xa5\x95\x62\x08\x6f\xd7\x19\xae\xe4\x97\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\xf7\xbc\x65\x79\x08\xbc\x13\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x33\xf8\x2d\x32\x39\x6b\x41\x6d\x8e\x9e\x9e\x93\xa0\x66\xdd\x04\xaa\x95\xc7\xaf\x38\x3d\xdc\xd8\x2f\xad\x5c\x03\x46\x5a\xbd\xaa\x4b\x61\x9b\x25\x20\x19\x04\xc1\xa5\x01\xd2\x60\xb5\x30\xa4\xf1\x35\x96\xb7\xa4\x34\x1f\x24\x12\x66\x7a\x72\x4c\x80\xc2\xb9\x99\xbe\xd1\x93\xeb\x38\x4b\xc0\x21\x6c\x40\xb6\xc0\xa0\x99\x62\x8a\xed\xf4\x34\x24\x08\x76\xbd\x08\x1f\x58\xb5\xbc\xe2\x5c\x7d\xef\x6b\xe2\xef\xfa\x64\xfc\xd5\x43\x61\x43\x27\x26\xf8\xa5\x31\x74\x79\x0c\x1b\x07\xe4\x62\x50\xc9\x3f\x55\x2c\xea\x05\xf9\x77\x95\x8a\xa2\x65\xa7\xf2\x8d\xe0\x6d\xb4\x0e\x97\xd3\xde\x7c\x73\xf1\x1a\x2e\xbe\xd6\x72\x2a\x33\x25\x96\x0d\xa7\x4c\x39\x8f\x57\xc6\xa0\xcd\x0f\x96\xbd\x3a\x94\x6c\xc9\x44\xb5\x08\xbd\xc7\x4b\x84\x2b\xc9\xbd\x4b\x8d\x6d\x0a\xb7\xba\x58\xae\xfe\xf5\x94\xab\xc5\x5a\x10\x37\x36\x75\x47\x3f\xeb\xed\x8d\x02\x6a\xe6\x0e\x10\x43\xd9\x5a\xb3\x0a\x58\x5d\x1a\x41\x0a\x52\x12\x56\x7c\xa9\x27\x62\xd7\x4c\xc1\x70\xaa\x2e\x39\xd3\xe2\x75\xd7\xe7\xea\xc2\xfb\x27\xed\x6a\x84\xa7\x08\x5c\xd9\x36\x88\x88\x81\x55\x1b\x84\x6b\x2b\x53\x90\xa7\x17\x33\x88\x7a\x9a\x4d\xf7\x97\x76\x4a\x2a\xbd\xd8\xb4\xaa\x1c\xda\xde\x40\x13\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x22\xb3\xaa\xf4\xe3\x13\xc2\xec\xd0\x7e\xb8\x78\x8d\x5e\xa2\x43\x3d\x36\x83\x18\x9c\x61\x5a\x01\x51\xb7\xc3\xea\x86\x36\xc0\xcc\xe5\x94\x25\x4d\x01\xc8\x11\xc4\x85\xb9\x5a\x46\x88\x71\x24\xdb\x62\x11\x64\x1c\x78\x8f\xb0\xad\xda\x94\x44\x44\x32\x88\x9d\x7c\xf7\xe1\x0f\x92\x44\x43\x64\x73\x5e\x87\x3f\x3c\xe3\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\xbe\x30\xec\xda\xe1\xb2\x4c\xb8\x2c\x25\x79\x47\x59\xfb\x60\xea\xa2\xec\x45\xd8\xe3\xfa\x1c\x7a\x84\x0a\xb7\xd0\x3c\x88\xdb\xb9\x08\x45\x86\x14\x8d\x8b\xde\x31\x1a\x3d\x62\x75\xc3\x2d\x81\x0d\xf7\x26\x64\x51\x62\x56\xf2\x7a\xad\x93\x33\x2e\x10\xc1\xc5\x22\xba\x37\x01\x6a\x64\x38\x98\xf6\xf9\xf7\x0e\x08\x41\xfa\x6a\x36\xdf\xfe\x3b\x48\x86\xa5\xd2\xef\x5c\x93\x1d\x5b\xe1\x29\xa9\x2c\x2d\xae\xe1\x4a\xcf\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x7f\x11\xf3\x90\x15\x7c\x71\x63\xd1\x25\xdd\x3c\x80\x0f\xf4\x4b\x98\x87\x36\x41\x41\x44\xab\xf3\xa0\xb5\xcd\xfe\x3c\x80\xfe\xb5\xef\xf3\x20\x49\x51\xf0\xba\xd9\x13\xa4\xe4\x8d\x41\xe1\xeb\x1e\x7d\x2e\x2a\xb2\xff\x65\x9c\x04\x77\xb6\xd5\xae\xb0\x32\xf7\xa0\x2b\x79\xf5\xbf\x83\xeb\x1c\xa4\xdd\xea\x1d\x6f\x5b\x4f\x46\x64\xfa\x16\xed\x0b\xff\x1d\x6f\xbc\x01\x86\xd9\x7b\x9e\x1d\x86\x19\x30\xe6\x63\x70\xcf\xf7\x20\x91\x5f\x03\x18\x53\x1b\x01\x30\xaf\x84\x01\x0b\x50\x83\xd5\x62\x64\x33\x56\xef\x88\x13\xcf\xb7\xc6\xe3\x75\x00\x12\xc7\x75\xc8\x89\x9b\x0e\xb3\x6a\x98\xf4\xb3\x62\x37\x37\xe1\x35\xcd\x77\x2e\x3f\xdc\x84\x3c\xfa\x98\x2d\x0d\x47\x64\x02\xab\x99\x79\xf6\x4f\xad\x78\x4a\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xe1\x48\x0b\x65\xe8\x04\xc1\x55\x95\x05\x93\xb0\xc9\x0b\xe2\x4e\x81\xa7\x92\x5f\xf7\x06\xf4\x6b\x9a\xa6\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x82\x94\x06\x27\x75\xdd\x90\x62\x5f\x6e\x8b\x37\xef\xaf\x4f\xfb\x3d\x03\x5d\xd8\x16\xce\x20\xf0\x7b\x84\xcb\x9a\x4a\x09\x01\x1f\x32\x5d\x70\x7e\x9b\xd4\xe4\xa1\x4b\xb5\x9d\x53\xb5\x68\xa7\xc7\x05\xaf\x83\xac\xdb\xb1\xa4\x73\x79\x62\x25\xca\x58\x4f\xdc\x11\xa2\xac\xf2\x99\xca\xe0\x2d\x04\x2e\xb0\x78\x2a\xb9\x70\xf0\xa8\xf0\xa3\x87\xad\x07\xf9\x29\x1e\x9a\xbd\x3e\x3d\x50\xdd\x04\x36\xef\xce\xb5\x8e\xf5\x5d\x95\x56\x6d\x70\x65\x67\x3d\x32\xf6\xb0\x52\x87\x8d\xe2\x6c\x9c\x47\x63\xbc\xee\x7c\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\xde\x76\x5d\x0a\xb9\xf4\xe8\xac\xc7\x08\xd5\xcf\xb9\x87\xf0\xf6\x81\xfe\x4b\x07\xcb\x3c\xc8\x55\x5c\xe6\xb4\xaa\xf4\x42\x62\x4b\xbc\x16\xa0\x3b\xc1\x34\xe9\x33\xda\x19\xce\x5d\x6d\x2c\x84\xa3\x80\x8b\x24\x4d\x28\x18\xde\x33\x7d\x19\x58\xce\x0c\xbd\x81\xa0\x6d\x8c\x6a\xfa\xa0\x7b\x18\xb6\xd8\x27\x89\x85\xc0\xff\xe6\x5f\x27\x14\xb0\x46\x00\x3e\xf0\x9c\xe9\x23\xbd\x42\x61\x23\x2e\x39\x5a\xe9\x6b\x4b\xff\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2b\x72\x8c\x36\xa4\xef\x3c\x5b\x04\x19\x7d\x7e\x14\xf9\x09\x63\x55\x68\x5f\xe2\x55\x89\x52\x3f\xe4\xfa\xdd\x19\xcf\x4a\xc8\x37\x4c\xd7\xc1\x4b\x13\x5e\xae\xd1\x10\x03\x99\x31\xc5\x55\x7c\x21\xd7\x8b\x59\x48\xdd\xc9\xb8\x75\x8f\x98\x0a\xe2\x06\xa7\xff\x40\x8a\x56\x91\xd2\xb2\x91\x5b\x97\xb2\x61\x32\xee\xf7\x26\xba\x07\x2e\x49\x7f\x4a\x00\xa0\x24\x47\x5d\x29\x36\x6b\xeb\x78\x7e\xd7\x11\xfa\xbf\x20\x25\xa5\x23\xd4\xaa\xe8\x1d\x61\x44\xca\x89\xff\xf3\xd8\xa9\x00\x1c\x75\x81\x99\xb3\xad\xf4\x99\xb6\x1e\x6e\xcb\x3a\x6e\x79\x3c\xa6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x99\x92\x39\x35\x69\x81\xc1\xa5\xe8\x69\xcb\xe3\x48\x75\xc1\xb0\xa1\x0a\xd5\x74\xbe\x30\xa7\x05\x61\x54\x71\x36\x47\x0e\x37\x56\x71\x5c\x22\x10\x2c\x5c\xa0\x7b\x2c\x6a\xad\x0b\xe0\x62\x01\x20\x34\xcc\x50\xd9\xea\xf3\x80\x80\x64\x7b\x39\x96\x0a\x2b\x62\xc9\xf0\xa2\x7d\x70\x6e\x9a\x76\x50\x22\xf6\xa9\xcb\xdf\xef\x98\x4f\x47\x9f\xb4\x2c\x5e\x90\xf3\x07\x52\xf8\x63\x6d\x18\xa7\xeb\x1a\x08\x03\xb9\x3b\xce\x8e\x2d\x2e\x59\x19\xdc\x13\x53\xd9\x8e\x70\x5f\x74\x93\x33\x3b\xe1\xd4\x59\x9f\xe6\x47\x6d\x8f\xf6\x17\x41\xba\x20\x56\x50\x34\x09\xd8\xb1\xb9\xb8\xd5\x27\xd7\x70\x04\x71\xe1\xab\xf5\x27\x75\xcb\xf5\x03\x28\xb3\x39\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x30\xcd\xc0\x64\x44\x77\x03\x92\xb4\x6e\xaa\x25\x8c\xe1\xc0\x94\xfc\x4e\x24\x30\x74\x80\x55\x5f\xfe\x52\x2e\x48\x55\x8d\x90\xd4\xea\x2f\x76\x35\x44\xcc\xa7\xfa\x4b\x4a\xb4\x85\x71\x93\x1d\x1e\xfc\x7a\x30\x42\x44\x15\x47\xe8\x9e\xb3\x03\x65\x02\x1e\xe8\x06\x6c\xc8\xa4\x3e\xf9\x4e\x2c\x79\x8b\x18\x21\xf6\xec\xf8\x62\x55\x05\xd6\xe6\x4f\x6b\x74\x74\x43\xba\x41\xaa\x2a\x4d\x9f\x3b\x7f\xa0\x4a\xab\x22\xaa\x05\x37\xc5\x4b\x63\x29\x10\xe0\xa1\xc7\x12\x6e\xba\x93\x05\xc1\x95\x5a\x2c\xbd\xf5\xf2\x2f\x22\x38\xd4\x27\x65\xf6\x37\xe9\x3a\xd4\x1e\xa4\x8d\xee\x6f\x02\xa7\x56\x30\x5a\x41\x6e\x16\x82\xc8\x05\xaf\x76\x9e\xc6\xf9\xde\x96\x7b\x2b\x38\x93\x5a\xa6\x68\x13\xdb\xf6\x51\xfa\x0c\x3a\xa3\xb3\xd8\xfa\x0a\x1c\x4e\x99\x20\xa5\x55\x96\x6c\xc9\x8b\x05\xbe\x03\x4d\x41\xeb\x73\xa4\x4c\x31\x4d\x42\x9b\xe8\xf7\xc7\xbe\x87\x3e\xed\xee\xd5\x9e\xc0\x36\x23\xb9\x23\xe7\xa2\xc9\x73\x4b\xbf\xb9\x9a\x9c\xf5\x6e\x69\xf8\xe0\x2d\x1c\xe3\xb3\x05\x29\x6e\xaf\xd2\xaa\xb9\xee\x09\xb4\xa0\xe1\x62\x97\x8a\x81\x6e\x3e\x9b\x56\x30\xe1\x42\x21\xd6\xd6\x53\x22\x9c\x43\x61\x0e\xab\x48\xc4\x1d\x2d\xc8\x31\xba\x34\xbf\x73\xc1\x79\x57\x7d\x18\xb3\x39\x41\xaf\xf4\x81\xf8\xe3\xb7\xdf\xfe\xfe\xdb\x74\x19\x9d\x4e\xa4\x9a\x87\x44\xd5\x0e\x7c\x5f\xd4\xae\x6b\xd3\x9d\x4d\xce\x66\xdb\x53\x30\xea\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\x5e\x49\x49\x08\xda\x10\xae\xd0\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\x42\xdb\x38\xf6\x5a\x1f\x03\xdd\x30\x65\xf3\xe3\xba\x3c\x3a\x4e\x8b\x82\x3b\xb3\x7a\xad\xa4\x5c\x8f\x66\xe6\x91\xf2\x70\x7a\x52\x76\xee\x82\x47\xae\x97\xdf\xa1\x17\x71\xd5\xc4\xf4\x12\xbc\x21\x79\x32\xd1\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\xdc\xb8\xde\x5d\x26\xa9\x69\x90\xda\x29\x52\x7b\xc1\xd3\xea\xcd\xe7\x8e\xbb\x18\x51\x02\xb5\xd1\x18\x23\x85\x5e\xe8\x51\xaf\xb2\xad\xc3\x21\x5e\x4c\x8e\xd1\xdf\x78\x0b\x2a\x17\x9e\x56\x4b\x74\x8f\x0d\xa3\x41\x1c\xa5\x74\xf7\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x6f\x09\x2e\x4d\xad\x4a\x70\xed\xec\xfc\xac\x06\x7d\xca\xb6\x6c\x67\xad\x54\xbc\x46\x0b\x3b\x54\x33\x87\x5d\x41\x7f\xa3\x1b\x99\x23\x08\xb1\x1f\x89\x04\x69\x8c\xb5\x64\xff\xe6\xab\xb0\x85\xd6\xa4\x90\x99\xe7\xa0\x1a\x10\x46\x45\x38\x55\x56\xd1\x07\x17\x26\xb5\x32\x2a\xda\x25\xd6\x3d\x59\xaa\x8a\xa0\x4c\x95\x45\x10\x08\x29\x7d\x28\x93\x5f\x92\x1e\x84\xcc\x53\xa3\x44\x3f\x2c\x31\xbc\x66\x9e\xbc\x15\x12\x90\x0d\xb5\xd9\xcd\x65\x00\x38\xba\xa3\xa9\xac\x84\xc8\x39\x93\x7d\x01\x55\xcc\x38\xa3\x85\x09\x67\xa0\xb6\xe1\x0c\xf1\x56\x35\xad\x02\x57\x50\x81\x25\x19\xdf\x61\x41\xb5\x40\xd5\xed\x77\x7f\xd8\x32\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\x2b\x80\x91\x79\x85\xd7\x16\x27\x7d\x47\xa3\xbd\xf6\xc1\x20\x53\x43\x7c\x91\xcf\xac\xc3\x6a\x01\xc8\x3e\x88\x65\x39\x60\x28\x08\x4e\x6d\x36\xec\x41\xe2\x4d\x56\x2b\x36\x51\x24\x40\xbc\x9d\x8b\x15\x3b\x58\xf7\x70\x7d\x0e\x33\x61\x4d\x9e\xde\xac\xb6\xc3\x72\x2d\x60\x86\x2e\x4e\x2f\x4f\x7f\xb9\xfe\xf1\xec\x97\xcb\xd3\xf7\xe7\x29\xaf\x4e\xae\x1d\x9f\xb3\x7a\x7c\xb6\xfa\xf1\x4f\x50\x41\xde\x3d\xb2\x58\x90\xfd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xf5\x90\xd3\x58\xea\xd0\x8a\xd3\x54\x0b\x9e\x9d\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xbc\x26\x05\x67\xe5\xce\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x06\x9a\xac\x30\x66\xb9\x42\xb0\xb6\x78\xb5\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbf\xc8\x35\xda\x1b\xf7\x78\x43\x04\x05\x44\xd0\x3e\xec\x9a\xb7\xfc\xde\x56\x74\x3f\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\xd9\xd4\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x87\x45\xfa\xec\x75\xe4\xcb\xf6\xf1\xd3\xa1\xaf\x0e\xb6\xd4\x0f\x7f\xa5\xe0\x87\xd0\x8a\x18\x7f\x75\xec\xf3\xd4\x5e\x41\x7f\xbc\x28\xc2\xac\x74\x90\xb3\xaf\x6f\x9f\xa8\xa2\xb9\xe6\xc5\x6d\x26\xb7\xeb\xcd\xd9\xc4\xbc\x6d\x05\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xb7\x40\x01\x1d\x9c\xae\x7b\xe3\x74\x3d\x30\x69\x5d\xb8\xfa\x6e\x6b\x07\xea\xc1\x60\x6d\x75\x8f\x53\x7c\x44\xbf\x02\xca\x60\x6d\x3d\xf2\x0c\xd6\xd6\x16\x8f\x49\x22\x01\x30\xe8\x1b\x81\x0b\x32\xd9\x27\xe5\xcd\x09\x10\x54\xb6\xc2\x96\x95\xf3\x3a\x9c\x17\x17\x8c\x90\xd2\xc8\x0f\x3b\x14\x82\xe6\x7a\x24\x06\x1e\x0d\x3e\xc4\x0e\x58\xdc\x8a\x04\x35\xef\x66\x61\x5f\x6d\x55\x5c\x17\x64\xde\xd4\xbb\xce\x36\x69\x3c\x19\xba\xab\x1a\x62\x8f\x93\xee\x3c\x94\x5a\x27\x2c\xde\x9d\x8e\xc3\x15\x44\x92\xce\xf5\x74\xd9\xca\xd0\x06\x23\xec\x4b\xef\x75\x1d\xd1\xad\xce\xb8\x28\xe8\xb4\x5a\xa2\x05\xae\xb4\xb1\x74\x4f\xd5\x02\x61\x74\x4b\xab\xca\xbe\x26\x7e\xa2\xae\x89\xcd\xd5\x34\x1a\x4d\xc5\xd9\x1c\x26\x03\xdb\x9c\x8c\x87\x86\x14\xba\xcd\xa2\x22\x98\xb5\x8d\xe9\xa7\xd6\x8f\x96\xbc\xcd\x90\x96\xe1\x02\xdf\x5e\x9f\x62\xd4\xd2\x8f\x98\xc2\x6d\x1f\xdd\xf3\xfd\xe4\x5a\xf4\x41\x2d\x88\xb8\xa7\x92\x98\x42\x72\xd1\x7d\x32\x7d\xe9\x97\x91\x33\x9f\x79\x0a\x15\x9b\x39\xa8\xb7\x05\xa4\xb2\x46\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\xb9\x21\x6a\xb0\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xb3\x0d\xa4\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x4b\x74\x47\x71\x74\x4f\x80\x14\xa2\xdb\x51\xe8\x90\x71\xc4\x1b\x7d\x75\xb5\x8c\xaa\x25\x44\xf4\x16\xad\x42\x25\xbf\x67\x09\xf9\x56\x37\x16\xe6\x80\xd1\x94\x28\x6c\x7d\xe0\xfa\x10\x78\x4e\x74\xa0\x3b\xd7\x67\x0f\x92\x04\x6e\x36\x6e\x00\x4f\x93\x3e\xc7\x2a\x41\x4a\x6c\xd0\xe6\xcd\x7a\x7e\x7c\xdb\x51\x69\xe3\x75\x89\x3c\xcc\xfb\xc1\x6c\xa8\x4f\x34\x6f\xd5\x9e\xdc\x23\x8f\xb9\x8e\x0c\xc5\x45\x60\x24\xd2\x9a\x48\xc4\xdb\x4c\xf5\x26\x5e\xd9\xe6\x72\x5a\x78\x83\xdf\x69\xe3\x23\x55\x49\xa3\xaa\x0e\xe7\xd8\x62\x8f\x90\xf7\xdb\x3c\xdc\x80\xbf\x72\xda\xce\x66\x44\xc0\x4d\x07\x1d\x5e\x83\xdd\xfb\x3a\x5e\xee\x0e\x8b\x73\xde\x5a\xc0\x17\x51\x23\xa8\x1d\x60\xc9\x24\x1e\x69\xd2\x92\x6c\x42\x99\x5e\x41\x24\x70\xc1\x33\x74\xfe\xe1\xfb\xb8\x2d\x9a\xa3\xb2\x40\x5a\xca\x2a\x8c\xf3\x03\x8b\xc3\x24\xe6\xdd\x0f\x9b\x58\x5f\xec\xb6\x28\x2a\x2e\x6d\x7a\x34\xac\x4b\xb1\xc0\x8c\x11\xe7\x8c\xa2\x0a\x3c\xd9\x53\x42\x18\xe2\x0d\x31\xa0\xbc\xa8\xce\x60\x24\x29\x9b\x57\x04\x61\xa5\x70\xb1\x38\xd6\xbd\x63\x6e\x2f\x74\x79\xc8\xf6\x13\xa9\x04\xc1\xb5\xd9\x13\x82\xd4\x98\x9a\xe6\x11\x2e\x04\x97\x12\xd5\x6d\xa5\x68\xe3\x5f\x16\xe7\x45\x24\xc0\x08\x21\x4d\x5a\xaa\x5b\x2b\x48\x2b\xe9\x12\x9e\x47\x5d\x0f\xed\xf0\x79\x58\xac\x08\x5c\x67\x23\xfd\x5b\x52\x37\x6a\xe9\x13\x13\xe3\x6c\xa0\x19\x15\x52\xa1\xa2\xa2\x84\x29\x3b\x32\x43\x39\x08\x7d\x18\x39\x75\x9a\xd9\x19\x91\x76\x4a\x58\x09\xc6\x77\xa3\xa4\xc9\xbf\xf3\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x19\x97\xfd\x87\x5d\x65\x1a\xb3\x71\xdc\x8c\xc0\xd6\x71\x0a\x8e\xe9\x91\xfd\x28\xe8\x42\x50\x67\xbb\xcb\x9d\x4c\x93\x2b\x50\x3e\xc6\x9d\xeb\x51\x8f\x73\xa0\xb3\x2d\x20\x15\x66\x4d\xea\xc0\x86\x62\xe4\x4e\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xd9\x65\x4c\xa0\xcb\xbd\x27\x52\xe2\x39\x99\x44\xc2\x11\x72\x08\x9c\xce\xd1\x06\x38\x86\x6e\xdb\x2c\x88\x21\xba\x52\x3c\xf8\x24\x4c\xf2\x0a\x8d\xc7\xda\x0c\x24\xaa\x07\xce\x68\xba\x17\x54\x29\x02\xbb\x14\x2a\x39\x01\x00\x6d\x95\xbc\xb3\x9f\x5c\x16\xd5\x9e\x9d\xf4\xb0\x3d\xad\x7e\xb0\xd2\xa4\x69\x4d\x09\x9a\x0a\x4a\x66\x68\x46\x21\x6f\x0c\x32\xaa\x46\xa6\x0a\x01\x06\xdc\x2e\x96\x92\x08\x18\xb6\x75\x0b\xb8\xe1\xc7\xf5\xe7\xaf\x76\xfc\x4a\xb4\xac\xc0\x41\x89\x4e\xe0\x16\xa3\x33\x34\x87\x2c\x2e\x6b\x04\xff\xe1\xe5\x7f\xfe\x11\x4d\x97\x5a\x5f\x03\x43\x4c\x71\x85\x2b\xd7\x01\x54\x11\x36\xd7\xab\x08\x22\x37\x4e\x6e\xf4\xf8\xa9\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x47\x0f\xe4\xe3\x49\x49\xee\x4e\x82\x2d\x34\xae\xf8\x3c\xee\xad\x67\x39\xb2\x89\x93\xfc\x6c\x1b\x4e\x34\xaf\x68\xb1\xdc\xd5\x99\x76\xc5\x4b\xd0\x82\xdf\x1b\x67\xce\xfa\x51\x0d\xa8\x5e\x1a\xde\xb4\x15\x4c\x1c\xfa\xde\xf3\xf3\xb5\x92\xac\x52\x1f\xa5\x3a\x09\x03\x69\x07\x41\x54\xdb\xec\xca\x9d\x63\x53\x18\x5d\x37\xb9\x25\x9e\xb0\x31\x37\x5f\x87\x24\xda\x1b\xf7\x3d\xae\xaa\x29\x2e\x6e\x6f\xf8\x3b\x3e\x97\x1f\xd8\xb9\x10\x5c\xf4\xc7\x5c\x61\x7d\xa7\x2f\x5a\x76\x0b\x55\x74\x3b\x32\x5a\x3e\xb7\x98\x42\xc7\x1f\x10\x8c\x2e\xaa\x33\x6e\x94\x86\x1e\xd4\xa9\x24\xce\x07\xd7\xb5\x4c\x1e\x68\xe7\x68\x63\x88\xe8\x3e\xc7\x26\xe0\x93\xde\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\x29\xc7\x72\x64\x2e\x00\xb8\x81\xb5\xaa\x55\xe3\xaa\x8a\x8d\x12\x84\x22\xe0\xfb\xe8\xe2\xd4\x7b\x70\xe4\xd5\xce\x4e\xf7\x67\x9b\x8c\x37\x37\x7f\x03\x7b\x91\x2a\x49\xaa\xd9\xc8\xb0\xbd\x78\xb7\xd6\x01\x68\x57\x07\xf6\xca\x8b\x67\x0a\xda\xbd\xd1\x76\xc7\xab\xb6\x26\xaf\xc9\x1d\x2d\xe2\x02\x98\xbd\x55\xe9\xbd\xcd\xb9\xe9\x2b\x2a\x81\x04\x68\x5a\xf1\xe2\x16\x95\xf6\x97\x01\x54\x7e\xb5\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x3a\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xdf\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\xc7\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\xbf\x0d\xdf\xc2\x1a\x33\x96\xa7\x1c\xf2\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\xef\xbe\xcc\x10\x0c\x4d\xcb\x91\xe8\xcd\x0b\xf3\x41\xe8\x1a\x2b\x6b\x1f\xb9\x28\x3b\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xbb\x9a\x84\x75\x44\x7d\x8d\x9b\xf1\x2d\x59\x46\x6e\xb8\xc4\xe3\xf2\x18\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc2\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x27\x31\x63\x33\xea\x40\xbb\xbe\x72\x7e\xec\x16\xae\x7f\xe3\xe8\x4f\xfc\x95\x63\xbe\xf5\x35\x5d\x34\x30\xbe\x2f\xf5\x9e\xf1\x9d\xcf\x24\x4e\x93\x90\x4e\x70\x3b\xd9\x9d\xd1\xbf\x8e\x7a\x0e\x2d\x73\x32\x03\xd3\xd7\x3a\x9a\x8e\x4d\x51\x80\x84\x0e\xe8\xa3\x68\x1b\x45\x07\xdf\x1d\xec\xf4\x8e\x33\x2b\x23\x78\x83\xe7\x60\x99\xee\xc3\x02\xad\xf6\x29\xe4\xa0\x5d\xf0\x7b\xf3\x7b\x83\x2e\x69\xec\xb7\x48\xd9\x11\x99\x2f\x78\xd2\xea\x18\xe4\xa0\xdb\x11\xd6\xba\x36\x5c\x85\xf7\x78\x89\xb0\xe0\x2d\x4b\x4a\x83\x86\xc0\x88\x0f\x9c\xbd\x5f\x19\xec\x25\x67\xc4\x05\xe9\x53\x5a\xb9\xe9\x38\xcc\xa9\x34\x78\x05\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x7a\x47\xae\x6c\x8d\xf3\x20\xa8\x72\x31\x9b\x70\x29\xe9\xb4\x82\xc4\x2d\xc5\xd1\xb9\x29\x00\xbf\x3e\x50\x0f\x1c\x81\x11\x73\x11\xb2\x95\x26\xf4\xf0\xd0\x9c\xe0\x10\xf0\xa9\x1b\x48\x40\x7d\xec\x97\x26\x09\xeb\xba\xa2\x49\x5e\x7a\x4d\xd2\xdc\x7b\x3b\x1d\xab\x2b\x7c\xbf\x0f\x92\xe4\xbd\x8d\x0d\x74\x95\xed\xa9\xab\x9c\x0c\x1f\xdd\x0b\xaa\xec\xe1\xbe\xa7\x92\xa0\x43\xf0\x4a\xac\x6c\xc6\x24\x82\xe6\xd0\x87\x95\x58\x01\x3f\x07\xc1\xb2\x58\x3d\xba\xfb\xb0\x4a\xeb\xf2\xa4\x43\xe0\xdf\x5b\x07\x56\xb7\x82\x56\xfa\x77\xf7\xf2\x02\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x65\x12\x17\xce\xc5\x0c\x85\x22\xd1\xc6\x2f\x83\x6a\x12\x0b\x2c\x11\xe3\xa8\x26\x18\x00\x9a\xfa\x76\x71\x52\xb0\xc7\xd5\x9c\xaf\x0f\x66\xb3\x9b\x6b\x2c\xbc\x10\xac\xb8\x7e\x4d\xa5\x15\xcf\x5a\x8e\x58\x0b\xc4\xc0\x3a\x6a\x5c\xa6\xa4\x76\x07\x73\xda\x2d\xde\x71\x07\x9a\x5c\xed\x49\x77\x71\xac\xf4\xe5\x29\xfa\x31\xb2\x25\xc8\x75\xf3\x2d\xe0\x04\x37\xb8\xe5\x3a\x90\x4c\x52\x34\xdb\x3c\xab\xc3\xf5\xd7\xe2\xda\x58\x37\xf7\xd8\x77\x38\xa1\x0f\x9f\x1e\xea\x28\x90\x85\x0e\x23\x6a\x42\xea\xb6\x06\x8a\xcd\x78\x4c\x63\xf2\x76\x41\x09\xef\xee\x99\x13\x46\x04\xb6\x71\x05\x07\x11\xb5\xe4\x2b\x58\x72\x96\x7a\x20\x3e\xb1\xe1\xb4\xbc\xff\xb4\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x72\xda\x6d\xc4\x64\x93\xc6\x92\x73\xd4\x2b\xd4\x5c\x66\xf3\x07\x9c\x9f\x7a\x51\xfe\xd9\xd2\x3b\x5c\x11\xc3\x61\xef\x44\xc3\x4e\x95\x09\xd9\x4e\xf7\xd5\x6c\xb4\xf6\x21\x98\x1d\x9b\x41\x0f\x8f\x5a\x90\x99\xf4\x89\x17\x2f\xd0\xa1\x69\xe3\xc0\x90\xec\xee\x56\xc9\xb5\x6b\x75\xfe\xd0\x24\x54\x6e\xcd\xb7\x5e\xe7\x0f\x0d\x06\x9c\x46\xb3\x17\x0b\xf7\xdf\x64\x81\xef\x08\x70\x1a\xd3\x0a\x8b\x0a\x40\xe9\xd7\x66\xca\xd0\xb4\x55\x88\xb0\x3b\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xdb\xc3\x1f\x4f\xaf\x20\x69\xe9\xc8\xb2\xe5\xdb\xf1\xb5\x12\xf8\x01\x56\xc6\x10\xbc\x6e\x1f\xf7\x1b\x72\x63\xd7\xdb\x05\xf4\x13\x37\x17\x7a\x6c\x75\xab\x5a\x5c\x01\xf5\x73\x51\xb5\xfa\x2e\xdc\xd9\xce\xce\xef\x03\x4f\xf1\xe4\xe5\x74\x81\x5b\xe2\xef\xd7\x34\xea\xb8\xe6\x38\xa8\x67\xc1\x7e\x5d\xa3\x21\x8f\xae\xf1\xb0\x81\x84\x72\x4d\xd1\x39\x90\x9e\x98\x32\xcc\xc3\xb1\x77\x71\x1c\x3c\x03\x4a\x27\x98\xe4\x6f\x57\x93\x74\xcd\xc3\x08\x35\x5a\x76\xee\xc3\x8f\x38\x0c\xf9\x8e\x41\x84\x23\x3a\xcf\xae\x67\xbc\x24\xdb\x57\x15\x4a\xdb\xe7\x97\xb6\xcd\x20\xf1\x89\x32\x7b\xeb\x98\xd2\xb9\x50\x90\xc4\xe4\xf8\xc9\x62\x41\xca\x36\x42\xe5\xba\x98\x19\x30\xd0\xa8\xf7\x3a\x8c\x0a\xcc\x4a\xaa\xf7\x8a\x49\x05\x30\xaf\xd7\x87\xcc\xea\xff\xae\x41\x11\xd6\x2c\xf5\x1f\x5e\x46\x30\xaf\x01\xc4\x7a\x4d\xdd\x1e\x85\x55\x7b\x2d\x61\x02\xa8\xa4\x25\x41\x53\x52\xf0\x9a\x00\x76\xb8\xe1\xcc\xe8\xe3\x8e\x52\xc1\x27\x90\x98\xc8\xb1\x19\xda\xb6\x5d\x0a\x1c\xa1\xf6\x42\x77\xc7\x48\x7a\xae\x7d\x01\x68\x31\xbd\xd6\x54\x74\xcd\xeb\x79\x34\xb0\x0d\xbf\x32\x88\x33\x84\xbb\xa2\x9d\x7a\x04\xdb\xf6\xe7\x73\x92\x69\xba\xa5\x1a\x93\x3b\x0a\xf4\x03\x27\x58\x4a\x3a\x67\xe3\x86\x97\x63\xdd\xec\xc9\x6f\xf4\x7f\xb7\x3e\x4a\x91\x02\x40\xb7\x75\x4d\x2a\x90\xcc\xcf\x7d\x7e\x5c\xbb\x66\x4f\x4b\xf7\x93\x39\x44\xce\x3a\x83\xfc\x82\x95\x85\x9b\x51\x65\xd6\x2b\x66\x99\xae\x37\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4a\x2a\xf9\xa9\xed\x02\x18\x87\x98\x1e\x6c\x99\x80\xe5\xae\x1d\xbc\x71\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x49\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x65\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xe1\x7a\x0d\x24\x23\x03\x20\xc8\xd6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xed\x2f\x21\x3b\x82\x55\x4f\x0b\x14\xc8\x35\x77\xc0\x8c\x57\x15\xbf\x07\xfe\x1b\xd3\x87\xc0\xfd\xb9\x3d\x8f\xcb\x58\xae\x54\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x51\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x26\x67\xf1\x7f\xfc\x83\x24\x62\x5b\xaf\xa2\xfd\x73\x41\x24\x6f\x45\xb1\x75\x3e\xa7\xfd\xf3\xd5\xd5\xc3\x4d\x73\x2a\x6a\x2e\x26\xa6\x86\x78\x9e\x97\x4a\xf2\x4e\x6f\x3f\xb7\x25\x32\xbd\x13\x8a\xd4\x67\xed\xe7\x4c\xbe\x11\xbc\xdd\xd6\x8a\xfb\xf8\xcb\xce\x16\x98\xb9\xfc\x82\x4c\x23\x5f\xca\x42\x55\xb1\xd3\xb8\xc0\x82\xd8\xda\xa4\x5a\xb9\x94\x0d\x2e\x32\xcd\x9e\x2f\x1b\x9a\xf1\x75\x19\xd7\x43\xb6\x4d\x53\x91\x9a\x30\x85\x2b\x78\x6d\xae\x8d\xb8\xf6\xde\x94\xc5\xee\xae\x9c\x9f\xfe\xe3\xe7\xa7\x39\x9d\x1f\x6f\x22\xc7\x59\xfd\x54\x0b\xe9\x27\xf7\xe3\x2d\x14\xb8\xc1\x53\x5a\x51\xad\xfa\x3c\xc5\xfb\x5d\x78\xfd\x8a\x73\xf5\xbd\x87\x05\x3e\x45\x4b\x8d\xa0\x77\xb4\x22\xf3\xad\x43\xab\x9f\xb7\x9d\xf4\x45\x3a\x71\x4d\x9c\xcb\x02\x57\x31\xa9\x31\x9f\x39\x12\x5e\x40\x5c\xe7\x49\x16\x24\x4d\xf4\x7c\xc6\xcb\xb7\x17\x44\xd1\x0a\x7c\x2c\x4e\x31\xc2\xa9\x13\x8f\x2a\x8c\x43\xd3\xa4\x3b\x2c\x1f\xab\x2e\x6f\xcb\x9c\xb2\x39\xea\xd5\x31\x6c\x85\x20\x4c\x55\xcb\x20\xee\x0a\xbc\x1c\x46\xf1\x06\xa5\x18\xf4\x72\xab\x5c\xc6\xb8\xf3\x4e\xbd\xbd\x65\x29\x3f\x6a\xbc\xd4\xda\x68\xe0\xce\x99\xb5\xc0\x35\x03\x06\x80\xa9\x38\x0b\x70\xab\x28\xe2\xb2\x0d\x85\x86\x78\x43\x58\xb7\x85\x4f\xac\x7b\x75\xac\xb7\x76\xaf\xf4\x90\xb1\x4e\x8f\xeb\xf2\x37\x4d\x85\xd5\x8c\x8b\x7a\xec\xbc\x28\xe3\x9e\xe5\x1a\xd1\xad\x33\x48\x83\xf7\x90\x10\x43\xfb\x64\xaa\xb3\xb3\xb2\x22\x81\x55\xea\x17\x80\x95\x26\xf6\x89\x5a\x26\x48\xc1\xe7\x0c\x0a\x01\xd8\xdf\x82\xbd\xe5\x9d\x46\x58\x6a\x8b\x10\xb1\xb6\xaa\xb6\xee\x5b\xa4\x2d\xcb\xef\x88\x58\x10\xbc\xe5\x29\x4c\xdb\xe0\x1f\x6c\x9b\x48\x90\x46\x10\x09\x13\x6a\x22\xf0\x46\xc7\xf7\x9d\x42\x58\x4a\x5e\x00\xa9\xb1\xc9\x31\x74\x74\x63\x18\x2c\xcd\x19\x17\x08\xa3\x39\xbd\x23\x0c\x5d\x99\xdd\x70\x56\xe1\xed\x69\xb6\x02\xb7\x9d\xf3\xd0\xe3\x56\x71\x9f\x7f\x8a\xb0\x42\xb8\xac\x29\x90\x3c\x18\xe2\x02\xeb\xd5\x0c\x5b\x0d\xbe\xa2\x77\xa9\xe0\x90\x8d\x88\x2e\xb6\xcd\x4f\xfd\xac\xf7\x42\x52\xa6\xc3\x11\xf8\xe9\x02\x0b\xd1\xe1\x27\x7c\xed\x74\x54\x40\xe8\xdd\x55\x97\x89\x98\x9e\xcf\xe9\x90\xe5\xd7\xd0\xd7\xc0\xa6\x46\xad\x6f\x6b\x81\xef\x0c\xda\xa2\x5b\xe2\x4a\xab\x19\xdb\xaa\x91\x92\x98\x1a\xf0\xbd\x7e\x99\xbc\x43\x17\x10\x01\x3e\x5a\xf0\xac\x75\xd1\x91\x09\x2f\xaf\x1b\x52\x8c\xba\x2d\xe8\x16\xdc\x11\x75\x38\x0e\xb1\x2d\xfb\x13\x48\x41\xe3\x51\x11\xc6\xc9\x5c\xea\xdd\x1a\x76\x32\x84\xbd\x50\xd5\x63\x25\x01\xbb\xbe\x93\x17\x06\x2b\xf1\x2f\x22\xb6\xce\x4c\xda\xe0\xcd\x9b\x53\x75\x7c\xfb\x27\x70\xe5\x11\xb6\xc0\xac\x00\x4d\x5e\x9e\xdc\x92\x46\x9e\x48\x3a\x37\x9e\xbb\x3f\xfe\xe9\x4f\xe0\xc6\x73\x8b\x73\x72\x75\x7e\xfa\xfa\xfd\xf9\x71\xbd\x9d\x5a\xb6\x53\x9f\x5e\x83\x95\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\x5b\x76\x34\x92\xd3\x33\x95\xc7\x33\x89\xbb\x33\x23\x5f\x67\x23\x08\xa9\xe1\x06\x89\x21\x25\x48\xbb\x80\x26\x2b\x6d\x3b\x4d\xcb\xfe\xa4\xef\x15\xd7\x3d\x36\xd7\x57\x8d\x34\xd7\x4f\xc5\xef\x81\x18\x86\x72\xad\x38\x6f\x1f\xb0\x02\x35\xee\x92\xdc\x11\x31\x72\x7d\x78\xa7\x5f\x39\x89\x7c\x63\x88\x98\xd8\xf4\xbe\x48\xe6\xbd\xc8\x0d\xe2\xe6\xe5\x39\x57\xf2\x06\x88\xee\xec\x68\x41\x70\x1f\xa3\x1f\xb1\xa0\xbc\x95\x56\x43\x46\xda\x08\xe7\x0c\x94\x0c\x43\xa4\xe0\x2f\x7b\x88\xdb\x98\xac\x8b\x6d\x85\x8c\x6b\xd2\x33\x17\x97\x96\x85\xca\x4f\xfd\xa9\xbf\x24\xcf\x36\xdf\xda\x74\x5b\x13\xb1\x11\xe4\xce\x0d\x43\x38\x2a\x22\xa2\x4c\xc9\x0e\x3f\x2a\x63\x11\x6c\xbc\xa2\x9d\x42\xb3\xad\xb3\x20\x98\x32\x68\xd4\x8d\x11\x2e\xb4\x98\xd0\x2d\x14\x77\xa2\x73\x47\x28\x06\xeb\x66\x9c\xf6\xc1\xa7\x71\xc7\x2c\x5e\x38\xc6\xb2\xf5\x35\xab\xb3\xf1\x9c\xfb\xff\x62\xd6\x43\x5a\xfa\xc8\x7f\xc7\x0c\xeb\xa7\x11\xbd\x30\x07\x02\xae\xfa\x71\x21\xa8\xa2\x05\xae\x5e\x44\x00\x6c\xdd\x8b\x8a\xaa\xd5\x06\x57\xf8\x2e\x41\x90\xba\xe7\xa6\x4f\xb8\x42\xb7\x64\x79\xcf\x45\xe9\xb4\xbf\x10\x6f\xbb\x6d\x28\x5b\x6f\x0c\xa9\xdc\x70\x00\xaf\xaf\x45\xb2\x89\xf4\x88\x9a\x08\x34\x25\x0e\x9c\xb6\xf2\xe5\xe5\x31\x3a\x65\x4b\xa3\x78\x45\xd8\xff\x3e\xf0\x12\xd4\x92\x05\xed\xd6\x58\x22\xbd\xd3\x60\xb5\x1e\xd7\x37\xac\xa2\x8a\xca\x6d\x46\x16\x69\x93\xc7\x0b\x1e\xa7\xb7\x3a\x68\x11\x17\x96\xf5\x16\x04\x92\x30\x1c\xc1\xdb\x42\x88\xed\xcb\x9e\xe5\xb6\xd0\x5a\x3f\x65\x44\xca\x37\x7a\xc3\xee\xee\xcc\x60\x50\xc0\x6d\x5f\x80\x27\xb7\x63\x97\x22\x5a\x32\x99\x8c\x3f\xad\x12\xf0\xb2\xfb\xe6\xb6\x4b\x7a\xea\xa0\x32\x60\xed\x18\x06\x6b\xdd\x34\x55\x32\x8c\xbf\x9a\x38\xa9\xfe\xc6\xe9\xe5\xb6\x51\x3a\x4b\x91\x65\x54\x68\xd9\x8d\xb1\xab\x2e\xda\x1f\x25\xd8\x62\x96\xd6\x88\xfc\xb3\xc5\x15\x00\x2f\x6f\x44\x4b\xb6\x2d\x4c\x1c\x65\x70\x10\x75\xcf\xc5\xed\xc9\xb7\x7f\x7a\x09\x36\x87\xef\xdd\x78\xbe\xf5\x15\x15\x9b\x2e\x1e\x95\x28\xbe\x52\x3b\xbd\xbc\x0a\x37\xb2\x5b\x4b\xe7\xd0\xb0\x90\x5a\x53\xd0\x43\xef\x00\xbf\x40\x51\x50\x85\xa8\xb4\xf0\xf8\x84\xf0\x71\xd7\xdd\x9b\x65\xb3\xbd\x92\x14\x9f\xcb\xdd\x6b\x37\x19\x33\x7a\x16\xbe\xcd\xac\x8a\x34\x4b\xe2\xdb\x09\x90\x0f\x07\x32\xf8\x18\x18\x76\x40\x9a\x03\x22\x07\x6e\x98\x65\x93\xc0\x26\x94\x05\x10\x19\x09\x37\x71\x0e\x36\x20\xfd\x78\x56\x99\x7b\xd5\x6b\xd9\xde\xa4\x4e\x2d\x58\xf9\xa5\x2f\xa0\x61\x29\xa3\xb6\x55\x4f\x0c\x89\x28\xd4\xb8\xf4\x05\xd3\xac\xf3\x07\x70\x5d\x95\x36\xe3\x4a\x43\x86\x8a\x85\x32\x0a\x73\x2c\xbe\xa0\xa3\x91\x29\x09\xc2\x77\x98\x56\x00\xa6\x07\x57\x12\x97\x3d\x6c\x8d\x19\x6c\xc1\x99\x6c\x6b\xe8\xd1\xb6\xa1\xb4\xe9\xd2\x6a\x13\x31\xfe\x4d\x6a\x38\x22\xab\x66\xf1\x71\x36\xf9\xed\x55\xb3\xd7\x4b\x86\x6b\x5a\xb8\x55\x3c\x35\xcb\x06\x3c\x94\x3d\xf6\xf9\x78\xaf\xac\xee\x7e\x5d\xb7\x4a\x4f\x6d\x8c\x72\xb2\x8b\x9b\x21\x22\xec\x03\x97\x49\x70\x14\xc2\x94\x0c\xf2\x80\x0b\x55\x2d\x21\xa2\xd2\xfb\xd2\x08\x11\x0a\x69\xab\x06\xcd\x5e\x6d\x4f\x98\xc2\x85\xdd\x59\x46\x9f\xed\xbd\xfd\x86\xd4\x0d\x90\x21\x5a\x05\x5e\x1a\xd6\x60\xd5\x0a\xe6\x78\x50\x57\xfe\x62\xeb\xe6\x03\x4c\x63\x44\x1a\xda\x85\x42\xb8\x2c\x25\xc2\xbe\x16\x13\x55\x46\xf1\x6e\x19\xfd\x67\x4b\xaa\x25\xa2\x25\x61\xaa\xc3\xbd\xf5\xa7\xd8\xd2\x45\x59\xf9\xb0\xbd\x58\x3f\xeb\xce\xb7\x51\xf7\x09\x29\x5d\x01\x23\xeb\x4f\x7e\x64\x4d\x8d\xfb\x17\xcc\x04\xad\xab\x47\x98\x09\x3b\xd2\x09\x22\xc8\x5d\x52\x54\x81\x58\x42\x83\x1c\x59\x23\x10\x86\xdd\xbc\x91\x0c\x07\xb5\x89\x57\x15\xab\x5b\x29\x02\x3f\x69\x9e\x8e\x72\x41\x5f\x80\xe8\xf5\xe5\xf5\x2f\xef\x4e\xff\xfb\xfc\xdd\xb3\x13\x49\xf6\x54\x85\xed\xbd\x1a\xe6\xc9\xb1\x04\x57\xab\x1d\x59\x0d\x8b\xaf\xc8\x1f\x67\x81\x5b\x7d\x4e\xc6\x32\x11\x31\x87\x1a\x33\xd5\xd7\x5d\x42\x40\xd4\xbb\xce\x03\xe1\xcd\x67\x1b\x86\xa4\xaf\xe2\x8d\x72\xd7\x57\x14\x8b\x6a\xd7\xc4\xb5\x76\xbb\x77\xc2\x91\xec\xc5\x1e\xea\x4d\xed\xc7\xf7\x92\xfb\x6a\x54\xa3\xeb\xfb\x30\xeb\x9e\x02\x92\x6d\x7f\x3b\x07\x89\x65\xc0\x2a\x64\x82\xaf\x18\x31\x72\xbf\xaa\x2e\x98\x9b\x5c\xff\x45\xec\x9e\x9a\xf2\x96\x95\xe6\x76\xb3\x43\x30\xbe\xef\x30\x23\xa8\x24\x15\x51\xce\x73\x95\xa6\x20\x20\xa7\x66\x03\x51\x2c\xf8\xbc\xe0\xdd\x46\x71\x87\x7a\x69\xee\x0c\x79\x89\xac\x3f\x19\x21\x5c\x71\x36\xb7\xec\xc4\x51\xcd\x76\x6c\x01\x3e\x8a\x30\x5a\x9b\x6c\x28\xb9\x8b\xed\x35\x61\xfa\x62\x75\x9a\xf4\xcd\x1a\x2e\x97\x6e\x53\x90\x82\x8b\xd2\xf8\x74\xf4\xc4\x1b\xf7\xcd\x71\xef\xc4\x5d\xc3\x67\x44\x46\x6f\xac\x8d\x7a\x37\xcc\x2f\xe3\x50\xd4\x63\x1e\xf8\xc8\xc0\xf0\x31\x9a\x4e\x54\x73\x2b\xa1\xf2\x9e\x28\x0f\xb8\x23\x04\xaf\x50\x53\x61\x46\x6c\x35\x11\xef\x80\xcd\x32\xcd\x83\x5c\xff\xd4\xf3\x15\x24\x65\x7a\x13\x7f\x17\x8e\x0f\x4f\xd9\x6c\x0a\x23\x60\xc3\xc3\xc2\x67\xe8\x6c\xf2\x03\x6c\x93\xf7\xa4\xe6\x62\xd9\x75\xd2\xab\xe8\xfa\x14\xe0\xad\x85\xf5\xe6\x9c\x1e\x6d\x2e\x59\x88\xa0\x73\x10\x2f\xcd\xb1\xb3\x28\x1d\xdd\x93\x77\xb4\xa6\x0a\x72\xcd\xb6\x8d\x0b\x15\x4d\xfb\x62\x84\x5e\xd4\x30\x14\x88\x2c\xa1\x17\x8b\x76\x4e\x1a\x3c\x27\x72\xfc\xa2\x2f\x9e\x25\x32\x34\x3d\x2b\xde\x1f\x2c\x88\x09\x7e\x38\x24\x63\x8a\xe3\xc0\x04\x5b\xf5\x4f\x8c\x8c\xe7\x02\x43\xf8\xc6\x89\x13\x6e\x4a\xb7\xd8\x2e\xe1\xc0\x6d\x11\x25\xbd\xb5\x6d\x20\x60\x9a\x47\xc6\xc7\xa4\x27\xd6\xbf\x5e\x2e\xb0\x00\xfb\xba\xd6\x57\x52\x7f\x75\x70\x94\x1a\xb0\xad\x57\x47\xdb\xb7\xef\xc8\x1d\xa9\xba\x2d\x69\xfd\x33\x5b\x36\xbc\x7d\x2d\xc1\x68\x43\x35\xde\x6e\x2c\x22\x5c\x9c\x28\x8b\xba\x69\xf7\xb1\x16\x53\x9d\x72\x29\xf5\x51\xf7\x67\x7b\xd4\x4b\x82\x0e\xd3\x9b\xcc\x1f\xc7\x94\x56\x02\xef\x83\x3e\x3c\x1d\xef\x7b\xc8\xc3\x1f\x75\xc3\x05\x27\xa9\x24\x0d\x61\xa5\x2b\xca\x1c\xf1\xae\x27\xf2\x12\xa2\x8f\x78\x0a\xb5\xb4\x2b\x30\x03\x39\xe3\x30\x7e\xfa\x6c\x77\xa7\x6f\xfb\x2b\x34\x85\x99\x38\x9a\x97\xb8\xb7\x29\x1f\x75\x11\x6a\x2d\x84\x30\x25\x96\x16\xf7\x79\xad\x37\x56\x5f\xba\xc6\xab\x0c\xd1\x84\xc4\x69\x74\xc4\xd1\x54\xc2\xa9\x44\xc2\x29\x34\x9a\xd9\x6a\x7c\x7e\x84\xc9\xbd\xb7\xd8\x60\x09\xac\x8b\x91\xd8\xda\x38\xc8\xa2\x90\x27\xbc\x44\xf7\x00\x26\xe8\xd3\x2c\x98\x32\xc2\x17\xba\x5b\xb7\x5d\x79\x34\x77\x8f\xba\x18\x48\x74\xd3\xd6\x8f\x96\xcc\xa4\x9d\x81\x69\xca\xa2\x97\x77\xbd\x11\xac\x7a\xd6\xf3\x56\x14\x0b\x2e\x09\xb3\x18\x78\xe1\xbe\xc0\xfa\x71\xe7\xd2\xdc\x83\x49\x75\xa7\x2d\xdd\x07\xb9\x23\x62\xa9\x20\x00\xea\xe9\x8f\xad\xdf\x53\xae\x44\xbf\x02\x8c\x73\x74\xc3\x20\xb3\x6d\x52\x00\xe0\x5b\x66\xce\xe7\x0a\x23\xdd\xc9\x8e\xc8\xcb\xcf\x14\x29\xda\xf2\xd1\x32\x41\x81\xa5\x9d\xa8\x48\xd6\xc2\xe8\x38\xf5\x81\x99\x12\x3f\x40\x41\xe1\xce\x34\x2a\x78\xdd\xb4\x2a\x88\xcd\xba\xd8\x6d\xcc\xea\x27\x51\x5c\xd4\x98\xe1\x39\x19\xfb\x8e\x8c\x83\x3c\xa4\x48\x15\x22\xf2\x42\xcd\x01\x91\x47\x5f\x12\x4c\x1e\xc5\x43\xe5\x51\x06\xb8\x3c\x4a\x85\xcc\xa3\xbc\xb0\x79\xd4\xdd\x4a\x3b\x39\xba\xde\x53\xb0\x72\x78\x6d\x35\xf0\x8f\x1d\x5e\xa7\x09\xc6\x9c\x5e\xa0\x1a\xb6\x2d\x53\x89\x78\x4d\x95\x83\xe5\x05\x7a\x02\x70\x8d\x86\xe4\xa6\x56\xd0\x00\x28\x12\xc3\xfd\x49\x1e\xfe\x7f\xf6\xfe\x86\xbb\x8d\xdb\xda\x17\x87\xbf\x0a\x96\x72\xd7\xb2\x94\x92\xb4\x9d\xa4\x2f\xc7\xb7\x4f\xbb\x14\x49\x6e\x75\x13\xdb\x3a\x96\x92\xac\x3e\x4d\xef\x09\x38\x03\x92\x38\x9a\x01\x26\x00\x46\x32\x7b\x7b\xbe\xfb\x7f\x61\x6f\x00\x83\x21\x29\xd9\xc2\x40\x22\xe5\x6a\xba\x56\x63\x91\xc3\xc1\x1e\x60\x63\x63\xbf\xfe\x76\x53\xf1\x82\x9b\x08\xf9\xb9\x4c\x31\xb7\x22\xf0\x5a\x69\x4d\x70\x5e\xfb\xea\x78\xe8\x1a\xe9\xed\x3b\x97\x92\x1e\x68\x2f\x10\x59\x8d\x7d\x28\x18\xf3\x9e\x96\x27\x69\xf6\x24\xcd\x3e\xf1\xfa\xdc\xa4\x99\xeb\xe2\xfc\xf0\x15\x40\xef\x71\x60\xd2\x74\x15\x3f\x6b\x1d\x66\x03\x8a\x6b\x42\x34\xdf\xd5\xfa\x1c\x42\x0f\xfa\x11\x79\x27\x5e\x63\x6f\xd0\x11\x96\xff\x4c\xc8\xa9\x20\x5a\xd6\xae\x8f\xe9\x07\xa3\x47\xa8\xf1\x52\xa2\xdb\xa9\x66\x4e\xdf\x95\x9a\xf9\x42\x61\x57\x6d\xdd\x30\x85\xa2\x2f\xb1\x54\xc8\x4a\x2b\x24\xea\x9e\x21\xc2\xae\xa5\xba\xac\x24\x2d\xf5\xf3\x46\xe2\xff\x8d\x03\xc4\xde\xf3\x2f\xdc\xba\x8f\x9b\xbb\x43\x88\xa4\xa6\x9b\x47\x35\x98\x0f\x5d\xa4\xf1\x7e\x65\xec\x5e\x06\x6a\xaf\x82\xb5\x1f\x33\x06\x24\x37\x4c\xa2\x26\x73\x25\xdb\xc6\x47\x03\x3b\xb4\x60\x6b\x8a\xdf\x35\x6b\x48\xda\xc9\x88\x62\xb7\x58\x6e\xd0\x27\x24\x98\xf3\xe0\x79\x60\x9d\xdd\x09\x16\xa5\xd6\xa3\x8d\x98\xed\xaa\x15\x09\xa5\x0e\x58\xf7\x2a\x55\x07\x2c\xc9\xc8\x5e\xc5\xe6\xb4\x58\xee\xf5\xa9\xda\x80\x9f\xea\x3c\xe0\xf6\xf8\xb5\xc7\x3a\x52\xe7\x1b\xd2\xde\xd5\x83\x0f\x5d\x6e\xe1\xe8\xc6\xe4\x5f\xcc\x23\xd3\xee\xf5\x7d\xa9\x85\x63\x25\x57\xf2\x7f\x67\xe7\x44\x72\x75\xee\x6f\xff\xf0\xdb\xb1\x07\x3d\x80\xd7\x7c\x88\x7d\xd3\x83\xe8\xdc\x5e\x95\x46\x8f\xdb\xa6\x8c\x94\x5c\x37\xc0\x99\xe0\xea\xee\x4a\x1d\x02\xb9\xf9\x4a\x6e\x36\x0f\xe9\x99\x21\x71\xc0\x61\xab\xc1\xc5\xfc\xc1\xab\x66\xce\xfb\x43\xbb\x7d\x27\x1b\xfa\x6b\xdb\xf5\xa1\x75\x87\x15\x2a\xdb\xd1\x02\xba\x49\x84\xc6\xac\x11\x36\x6c\xe2\xe1\x6a\x59\x63\x9d\x1a\xd0\xab\x3b\x09\x12\x96\x4e\x1b\xba\xf4\x12\xb5\xff\x12\x25\x54\xbf\x30\xdf\x79\xeb\x8e\x54\x74\x88\xb6\x41\x04\x5a\x2d\xb4\x6e\xe0\x90\xf5\xdf\x26\xa7\xb6\xae\xce\xf7\x6a\x20\x83\x1a\xac\x27\x81\x3c\x08\x07\x4b\x81\xdd\x57\x20\x4d\xa4\x96\x57\x80\x09\x6a\x75\x8a\x99\x61\xea\x9a\xaa\xf2\x8e\x67\xfe\x56\xab\x6a\xfa\xaf\x0f\xdc\xd6\x61\x81\xc0\xc1\x79\x86\x18\xa8\xf3\x96\xaa\x12\xca\xa8\x3a\x9e\x78\x4a\xa4\xdd\x74\x6d\x3d\x91\xd6\x15\x4b\x47\x02\xe0\xee\xa1\x64\x7f\x9d\x50\xab\x07\xf5\x9f\x84\xb1\x12\x28\x6b\x5b\x49\xc7\x82\xc2\xe8\xa7\x74\x99\x3b\xb9\x88\x57\xf0\xc1\x1e\xf4\xac\xe9\x0f\x4d\x16\xb2\x2a\x41\x59\x1d\x57\xec\x8a\x55\x81\x34\x2b\x70\x15\x9f\xb6\xc6\xe1\x2c\x15\xb2\xae\x5d\xc9\xbb\x6b\x3e\x8f\xe5\xf1\x77\x36\x76\x10\x16\x90\x56\xaf\x7a\x10\x0b\x70\xba\x4c\x2c\x79\x0c\x38\x23\x7e\x4b\x30\x21\xbd\x52\xe0\x8e\x41\x39\x23\xcc\xb2\x69\x02\xfb\x6d\x21\x63\x62\x05\x74\x71\x1b\xce\xc5\x15\x12\x7c\xbc\xeb\xd0\x7d\x4c\x24\xa2\x35\xda\xb5\x68\x35\x5b\x6b\x2d\xd5\xc1\x69\x25\xe6\xdf\xbf\x95\x50\x9b\x0e\x8d\xc2\x43\xc0\xb3\x08\xcd\x10\xec\xb1\x0b\x85\xbb\x10\x6b\x95\x7a\x22\x5c\x0a\x71\x32\xac\xda\x20\xe7\xd9\x90\xc8\x3a\x3a\x81\xee\xfc\xc3\x61\x51\xf5\x4a\x16\xb4\x02\x04\xe2\x54\x16\x23\xd9\x82\xaa\xab\xb4\x44\xd8\x09\xd4\xbe\x26\x7c\x56\x49\x5a\x7a\x64\x75\xe6\x9b\x28\x50\xb3\x62\x7f\xa7\xc6\x22\x11\xbb\x04\x47\xf2\x25\x1f\x8d\x62\x11\x84\x55\x6f\x60\x09\x7d\x4b\x52\x07\x7b\xd3\x4f\x23\x70\x6f\x16\x43\x0b\x3a\x52\x06\x0d\xe0\x71\xc7\x66\x20\x8e\x43\x17\x4c\x2b\x2b\xb9\x26\x7b\xdf\xfb\x49\xdf\x1b\xd2\x1b\x3b\xd9\x71\x69\x12\x6b\x89\x73\xf1\x1c\xce\x43\xe0\x33\xf4\x5f\x5c\x72\x3b\x53\xb3\x4e\xc8\x79\x96\x08\x50\x74\x4d\x53\xf1\x74\x2e\xfb\x91\x56\xbc\x0c\x92\x93\xaa\x01\xcd\x61\xc3\xf2\x91\x71\xb4\x49\x1a\xc5\xc6\xeb\x1b\x25\x3d\xe5\xc0\x79\x7c\xbc\xc3\x72\xfc\xd1\xae\x3a\x03\x19\x97\x90\x1f\x04\xec\x39\xc1\x4a\xab\x6d\xc9\x6e\x29\x98\x98\x49\x85\xce\x98\x07\x67\x58\x87\xab\xbd\x8d\x63\xf8\x30\xe0\xb7\xc4\xa0\xcf\xe8\x82\x74\x79\x86\xc0\x93\xe8\xc1\xec\xbb\xcd\xbb\x74\xd6\xbb\x8f\x0b\x2d\x04\x5c\x43\x34\x3b\x73\x2e\xde\x0f\x0c\xf0\x9d\xeb\xe8\x62\x7c\x05\x02\xa2\x08\x5e\xdb\x41\x17\xbc\x41\x21\x46\x8d\xfb\x79\x8a\x70\x80\xd2\x12\xfb\xc0\xd0\xb3\xb2\x91\xe5\xab\x94\x7c\xc4\x97\x58\x99\x22\xaf\x01\xab\xf2\x2f\xa7\xc7\x61\x2f\xdb\xa7\xbe\x3e\x4f\x41\xfb\xb6\xd7\x57\xf8\x5c\xcd\xcc\x9c\x97\x64\xea\x9a\x8a\x32\x43\xf6\x05\xbb\x26\x76\x0f\x68\x57\xf9\x13\x30\x3f\xdc\x6c\xfa\xf1\xc3\xeb\x39\x22\x0e\x12\xa8\xf8\xda\xd5\xdd\x30\xe5\x21\xa6\xa6\xdc\xb5\x48\x7f\xf7\xfe\x99\x07\xea\xbc\x1e\xab\xeb\xf1\x78\x3c\x4e\x99\x3f\xef\x13\x1e\xf5\x56\x3e\x78\x59\x6a\x59\xf2\xd9\x72\x65\xfd\xed\x79\xd3\x91\x04\xba\x37\x15\x4b\xf7\xfe\x8f\x48\x17\x4c\x8d\xec\x45\xe8\x55\xbf\xfb\x26\x4d\xd4\xc4\x10\xfe\xdb\x10\x3b\x1b\xc8\x08\x40\x11\x53\xb6\xa0\x57\xdc\x9a\x00\x33\xdc\xff\x76\x67\xdd\xb4\xfa\x5e\xa3\x49\x96\x05\x0e\x34\x02\x01\xa5\xd8\x87\x46\x6a\xd8\x51\x90\x96\x78\x26\xa1\xf0\xac\x8f\x18\x8b\x7e\xb6\xa6\x81\x56\x8b\x09\x03\xf6\x84\x9e\x8b\xf1\x60\xfd\x83\x9f\x15\x32\xa5\x96\x88\xf0\xca\xfb\x2b\x0c\x9f\xd4\x1f\xf1\xd4\xed\x2a\x70\x99\x08\x49\xd8\x6c\xc6\x0a\x68\x64\xc4\x9a\x05\xab\x99\xa2\x55\x9f\x34\xdd\x16\x0b\x42\xf5\x2b\x6b\x81\x2b\xbb\x41\x51\x59\xad\xe9\x9d\xbb\x0c\x10\x07\xd4\x01\x36\x75\xc9\x93\x52\x3c\x51\xb5\x89\x80\xae\xf7\xde\x89\xf7\x52\x9a\x37\x5c\x83\xa6\xeb\x2a\x50\x30\xde\xb9\x37\xd9\xe0\xe3\xf7\xdf\x85\xac\xd6\xc7\x23\x28\x92\x94\x8a\x0e\xe3\x7d\x1b\x1b\xdc\x1e\x1b\xf6\x34\x0c\x11\x48\x97\xc2\xdc\x48\x2e\xcc\x5a\x33\x22\xab\xd7\x15\x09\x48\x5b\xf6\xfa\x41\x33\x1d\xe2\x74\x5e\x4f\x4c\x03\xc3\xc4\xeb\x0d\x5d\x86\xf2\x53\x87\xac\xbc\xe2\xa4\xc2\x38\xaa\xfb\x6e\x2a\xcd\x62\xcd\x8b\x95\xd6\xc9\xfa\x4c\x96\x2b\x0f\x1a\x75\xa0\x89\x7d\x90\xaf\xd5\x01\x0d\xa4\x67\x5b\x93\x92\x95\x4c\xdc\xb9\xff\x09\x09\xe0\x1c\xd4\x0c\xcb\xc5\xfe\x37\x3a\x4b\x61\x87\xbd\x95\x20\x87\xb6\xb1\xc7\x4e\x23\x08\x48\x98\xef\x78\x47\x81\x97\xc1\x6e\x3d\x0a\x80\x29\x52\x8c\x95\x94\x10\xe1\x4e\x5a\xd6\xd3\x99\xeb\xf9\xbf\xa6\xa6\x5d\x59\xc9\xec\x1b\xab\x43\x23\x52\x42\xbb\xc0\xb9\x91\x84\x09\xdd\x2a\xc7\x13\x77\x06\x42\xb5\x57\x29\x19\x86\xfc\xdc\xeb\xfc\x70\x7a\x4c\x5e\x90\x7d\x68\x15\x0c\x62\x7f\x46\x79\x15\x30\x9e\x56\x5b\xa3\x42\x83\x7b\xfb\x88\xc4\xd7\x0e\x29\x0b\x33\x5a\x69\x36\xb2\x67\x27\x1c\x8d\xee\xbd\xad\x0e\xe2\x55\xee\x86\x29\xc0\xa7\x4c\x4b\x5a\xfe\x1c\xc4\x4e\xea\xf6\x9d\x4a\x59\xb1\x3b\x27\x71\x84\x1e\x29\xdb\x3a\xe1\x7e\x78\x90\x13\x2e\x8e\x4b\xd8\xfd\xdb\x5f\x12\xdc\x72\x35\x33\xb4\xa4\x86\xba\x93\xcf\xdf\xf0\x6f\xcb\x88\x4f\xe7\xdf\xa7\x5d\x43\xce\x3f\xd7\x57\x6b\xdb\xb6\xe4\x06\x32\x82\x2d\xb9\x70\x2e\xa5\xb8\x85\xfd\xf9\x09\xdc\x8f\x7d\x56\x21\xdb\x00\xbd\xae\xde\xc3\x85\x56\x90\x8e\x8a\x6b\x13\xf1\xc2\xc0\xe8\x5a\x50\xdd\x37\xb7\x84\x2c\xfd\x89\x5d\xca\xb8\xfc\x3d\x10\x66\xf9\x50\x06\x32\xc2\xe9\xb7\x72\x5b\x1e\x2b\x0a\xfa\x57\x61\x08\xd4\x99\x50\xef\xed\xce\xd2\xfc\x8a\xed\x25\x15\xe8\x46\xbf\x27\x35\xa3\x42\x13\xc5\x60\xa6\xc1\x8a\x9f\xc1\x0c\xa3\xfb\x4a\x22\x2a\xee\x99\x2c\xc3\xbb\xae\x46\xf9\xbc\x1a\x91\xf2\xae\x08\xaf\x85\xa9\xb4\xba\x92\xd7\xb0\xbf\x2b\xaa\xe6\xde\x59\xa0\x47\x64\xda\x1a\xf4\x3b\x6a\x52\xf3\x0f\xd0\x00\x20\x74\x27\x83\xd9\x68\x45\xf4\xc1\x99\x2c\x75\x28\xee\x0f\x40\x3f\xce\x68\x96\x31\xf6\x0f\x38\xc5\x53\x26\xaf\xb7\x1c\x50\x5f\x01\x8e\x51\xc2\x2a\x3e\x87\x1e\xd6\xf1\x6c\x81\xf7\xed\x97\xb1\xf4\x89\xc5\xbf\x10\x57\x91\x01\xbf\x4f\x9e\xb3\x80\x28\xe0\x56\x47\xfb\x40\x18\x75\xe0\x9a\xf1\x6b\xbb\xf0\x6c\xf8\xb8\xb7\xb9\x12\xb7\x8c\x4b\xf0\x6a\xa4\xc6\xbe\xdd\x56\xb3\xdb\x38\x38\x02\x2c\x7c\x6c\xc9\x52\xa8\x38\xf1\xf3\xed\xe7\x9a\x42\x22\xe7\xd8\x28\xc6\xc8\x6b\x3e\x55\xcc\x8a\x1b\xc1\x2a\x18\x92\x9f\x1f\x9d\x9f\x76\x5c\x65\x3f\xb2\x73\x17\x7d\x98\x40\xc2\x35\xa4\x84\xdb\x67\x94\x8a\x5f\x31\x45\xec\x19\xd2\x42\xf5\xb7\x9f\x64\x2f\x11\xa6\xcb\xd0\x1c\xc0\xf5\x73\x84\xef\x81\x99\x30\x4f\xdf\xf9\x88\x79\x4a\x19\xc1\xd1\xf9\xe9\x31\x52\xc0\x85\x36\xd4\x6a\x79\xe4\x1d\xc0\x50\xc6\x93\x43\xc1\xbb\x42\x14\x1b\xc3\xd2\x57\xac\x24\xca\x4b\x82\xea\xce\xdd\x2e\xc8\xda\x66\x40\x1d\x20\xc2\x74\x05\x3f\x1c\x1c\xa5\x6e\x3a\xe0\xf6\x1e\xc2\x40\xd4\x83\x21\x69\x3b\xae\x3a\x91\x60\x65\x3f\x65\xb4\xd1\x0a\xf1\x03\x5c\x4e\x77\xa7\xa1\xe4\xfa\x36\x22\x40\x0e\xbe\x67\xb4\xfc\x49\x71\xc3\xde\x89\x82\x45\x32\x25\xd1\xb3\x17\x0b\x7d\x5f\x5f\x21\x63\x16\x19\x8a\xf5\x40\xe1\xf8\x44\x18\x99\x48\x26\x81\x33\xb3\x7f\x9e\x43\x2c\xc1\xc1\xa4\x3a\x6c\x84\x15\x55\x51\xaa\x4d\x0a\xa4\x3b\x9a\x62\xbc\x88\x94\x70\x5a\x4f\x64\xf6\x24\xa3\x93\x59\x2e\x9f\xa0\xf7\xd5\x06\x0d\x26\xee\x1d\xa5\x5d\xbb\x6d\x4c\x0c\x9d\x33\x43\xb4\x69\x8b\x4b\xfb\x16\x01\x92\xf4\xc8\x63\x64\x41\x9a\xeb\x23\x52\x5c\x93\x7c\x9b\xfd\x8e\xae\xdb\xb2\xfe\x3c\xe3\x15\xde\x06\x91\x51\x0c\x7f\x3d\x5e\x9a\xee\x7f\xe8\x27\xaa\xaf\x69\x47\x1e\x31\x0f\x21\xb4\x09\x25\x8a\x8a\x52\xd6\x6b\xf4\xd9\x9d\xc9\x68\xb1\x48\xa0\xa3\x33\x89\xee\x6a\x1f\xa6\x84\x64\x6e\xb0\x28\x07\xd8\x87\x29\x41\xe2\x15\x8b\xf2\x71\xdb\x87\x89\x79\x67\x03\x93\xc0\xd8\x15\xab\x32\x64\xe1\x00\x94\x95\x9d\x84\x20\xea\xe1\x03\x14\xf8\xab\x49\x0a\xbd\x2d\xb2\x95\xdc\x23\x25\xb3\xe4\xbb\xbd\x97\x98\x16\x49\xc3\x6b\xdb\x07\xef\xec\x5b\x67\xca\xb8\xba\x70\x09\x64\xdd\x5b\x43\x2a\xd5\xae\xbe\x75\x9b\xe4\x7d\x24\xab\x6f\xfd\x83\xc6\x8e\x61\xdd\x5b\x83\xa3\x6f\x17\xdf\xba\xdf\xeb\x7c\x5b\x67\xaf\xa3\xe2\x29\x4d\xb8\x77\x3d\xa5\x09\xdf\x77\x9a\x70\x04\xe6\x47\xc1\x8f\xd5\x4b\xdc\x7d\xac\xc9\xc2\x00\x40\x6f\x67\x91\x21\x34\x6f\x43\xcd\x62\x04\x8e\x3b\xc3\xaf\x3c\xe4\x2f\xb9\xc4\xb0\xdf\xb3\x5e\xeb\x5d\xbf\x11\xbb\x3c\x6a\x84\xfa\xcb\x94\x5b\xbc\x29\x9f\x18\xef\x79\xfb\xee\x22\x06\xfa\xa3\xbe\xeb\x5b\x72\xcf\x9e\x5d\x39\x01\xef\x27\xe7\x78\x75\x9d\xee\x2f\xe5\x38\xf1\x49\x9b\x33\x8e\x1f\x62\xbf\x7d\x5a\x16\xf2\x6a\x0e\x72\xa6\xc1\x57\x13\x92\xd7\x9f\x3e\x68\x85\x86\x1c\xf4\x51\x42\x30\xe4\x11\x6d\xc5\xd0\x3e\x0c\x05\xc7\x90\x93\xdc\x8b\xd6\x40\x43\x48\xae\xa0\xfb\x23\x44\x57\x21\x12\xcb\x05\x96\x62\xc5\x50\x41\x29\x66\xa8\x07\xac\x59\x53\xb9\xb0\xd3\x66\x4d\xd5\x12\x52\x9c\x20\x03\xc1\x65\xee\xed\xc7\x95\xd0\x07\x60\x07\xa7\x08\x92\x05\x23\xe7\x6b\xb3\xef\x3b\x16\x3b\x77\x5f\xec\x6d\x4c\x83\x69\x5d\x5f\x60\x3f\x84\x83\x81\x35\x4c\xd5\xae\x77\x17\x33\xae\x57\xab\x66\xce\x17\x1e\xe6\x27\x2d\x01\x5b\xa2\x3b\x99\xd1\xd2\xe7\xef\x62\xce\x79\xcd\xea\x29\xa6\x3d\xea\xf5\x4e\xeb\x21\xa9\xa3\xa6\xf3\x24\x19\xbf\xea\x4f\x11\x32\xc2\x25\x0a\x1c\xa6\x98\xfd\x14\x27\x56\xb6\xf3\xc5\x3a\x69\x29\x59\x2c\xb7\xbe\x0c\x44\xaa\xb4\xe9\x81\x5e\x20\x0e\x2f\xc4\xcd\x52\x91\x78\x6f\x5f\xe2\x47\xa4\x10\x3f\x30\x0a\xef\x50\xe8\xa5\x21\x61\xf5\x8c\x4d\x00\xc9\x2d\x2c\xb0\x0d\x61\x7e\x1c\x85\xe5\xd7\xeb\x4d\xb4\xcf\x9a\x41\x99\xbe\x96\x3b\xe3\x22\x4d\x05\xad\x0a\xe8\x6d\x9d\xc4\xbf\x1b\x42\xe0\x4c\xcd\x99\x0b\x7e\x9f\x1b\xc5\x0b\xb3\x39\x7f\xd8\xdd\x37\x20\x96\xb3\x7f\x58\x35\x0b\x7a\x40\x7e\xd0\x3e\x82\x8c\xdb\x27\x44\x5c\x3f\x49\xf0\x43\x9c\x07\x7d\xcd\xee\x00\x48\x8c\xda\x6c\x56\x73\xc0\xe2\x08\x10\x77\x5d\x6e\x3a\x78\x3f\x79\x00\x92\x7f\x44\xb2\x23\x4d\xfb\x59\xea\xc2\x54\x5b\x51\x79\xce\x71\x68\x28\x85\x27\x34\xe8\x3f\xa1\xa3\x50\xe9\x89\xeb\xe2\x79\xa1\xe9\x03\x04\x9f\x20\x31\xa0\x15\xa1\xad\x42\xca\xc1\xe1\x46\xd8\xbf\x29\x25\xe3\x80\xd4\x7c\xbe\x30\x21\xf7\xb2\xa2\xad\x28\x16\x8f\x88\x2b\xb6\x89\xeb\x8e\x2b\x1c\xb2\x94\x28\xb9\xb4\xd2\xbe\x22\x0d\x55\xb4\xb6\x6a\x97\xdb\xdf\x9a\x25\x45\x2e\x1e\x25\x8a\xbb\xfd\x29\x88\xe5\x84\xdf\xee\x0c\x02\xfc\xdb\xd0\x5c\xcc\x91\xb4\x84\xec\x95\xa4\x65\x24\x39\x50\xcd\x61\x46\xb3\xbc\xda\x8f\x10\x64\xdb\x95\x77\xcb\xaa\x22\x39\x49\xb2\xe5\x70\xf2\x4f\x48\x85\xd7\x39\x8a\x80\x68\x72\xff\x21\x65\xef\xbf\x71\x40\x98\xb4\x9f\x2f\xb9\x12\x89\x8d\x91\xf9\x12\x09\xf8\x48\xea\xf0\x76\x33\xd2\xd3\x4f\xa4\x2a\x2d\x2f\x73\x8b\x11\xda\x79\xad\xe9\x91\x62\xd0\xec\x94\x56\xe7\x0d\x2b\xb6\xe9\xc0\xfc\xcb\x9b\xf3\xc3\x3e\x35\x70\xce\xbb\xb6\x14\x0c\xbe\x27\xb4\xf4\xa5\x9f\xd7\x6c\xba\x90\xf2\x32\x71\xb0\xfd\x08\x91\x71\xd1\x4e\x27\x85\xac\x23\x94\xd3\xb1\xe6\x73\xfd\xdc\x09\x86\xb1\x9d\xa6\x03\xc2\x45\x05\xc7\xb5\xd7\x87\x98\x30\xde\x64\x19\xf0\xc2\xa4\x08\x6f\x0c\x0c\xe5\xa0\x37\x9d\xde\xb5\x3e\x25\x6f\x07\xa1\x5c\x0d\x3e\x52\xd6\x39\x26\xb5\xdb\xe7\x0a\xd7\xdc\xf0\xa6\x2b\x5d\x3b\x03\x1b\xac\xce\x1a\x06\x00\xb7\x32\x25\x2e\x66\x64\x4d\xd4\x6d\xee\x9e\xbf\x76\x64\xc4\xbe\x3b\x3e\x8b\xe5\x79\xe4\x57\x0e\xc5\x61\xcf\xec\x2f\x89\xfb\xe9\xb3\xe1\xad\x58\x0e\xab\x0a\xf5\x84\x33\x59\x3e\xd3\x71\x30\xb6\x03\x6d\x0b\xb9\x6f\x98\x18\xcf\xaf\x58\x8f\xfe\x54\x45\xd0\x5e\xfb\x3c\xa4\x10\x47\xfd\xff\x1d\x54\x5c\xcd\x3f\x58\xda\xe2\xb1\x22\xfa\xb0\xef\xa5\x18\x6f\xfe\x3a\xa9\xee\x9a\x40\xa1\x5e\xf0\x32\x8e\xec\x7a\xc4\x8f\xb7\xfc\xad\x5a\x86\xbd\xd6\xed\x17\x6f\x99\xb9\x96\xea\x12\xe7\x2a\xce\xb3\x32\x12\xee\x1c\xc2\xe2\x69\x65\x56\x24\x2e\xb5\xca\xb4\xdb\x93\xb9\x1c\xca\xae\x1c\x1d\xf6\xfc\xf7\x5a\xd3\xfd\x97\x61\x91\x95\x52\x2c\xfb\xe0\x07\x28\xc7\x22\x9b\x4b\xb2\xd6\x55\xa4\xc9\xfd\x14\x65\x91\x6d\x57\x08\x92\x01\x18\xba\x4c\x5d\xf1\x82\x1d\x16\x05\xa4\xc2\xdf\x69\xe8\x61\xec\x7a\xcc\xec\x2b\x53\xc3\xca\xf3\x1e\x0d\x98\xe4\x53\x86\x6f\x09\xad\x38\x85\x06\x9c\xa4\x7f\xa3\xe5\xef\xbb\x03\xbf\xfb\xc7\x42\x46\xd1\xca\xeb\xbb\x1d\x03\x31\x97\x87\x41\x30\x5e\x1b\xfe\x61\x81\x25\xd7\x5f\x7e\x5d\x97\x58\x59\x1d\x5f\xce\xb2\x82\x9b\x7e\xc7\xa1\x3f\x0d\x3f\xdf\x50\x7d\xd9\xb5\xeb\x60\xe3\x46\x96\x5d\x77\x8e\xe8\x73\x37\x8d\x63\x8a\x34\xde\xad\x6d\x47\xf2\xd2\x19\x7b\x16\xd9\x99\x3a\xd4\xaf\xff\xf3\xf8\xed\x03\xc3\x81\xfb\x23\xd1\xce\xfe\x33\x0d\x1a\x16\xac\x9a\xb7\x3d\xa3\x04\x14\xaa\xa3\x1b\x2d\xa9\x23\xa2\xa8\x8b\x56\x52\x3c\x10\x2a\x46\xd1\x7d\x4a\xf6\x23\x70\xf7\x3b\x1f\xe7\xa7\x82\x74\x09\xd5\xa8\x12\x8c\x90\x47\xb0\xd0\xcd\xd7\xe0\x00\xf2\xd3\x7f\x1e\xbf\xf5\xa1\xbe\x40\x3d\x1a\x92\x8e\xf3\x9c\xcb\x6f\xdf\x27\x33\xf4\xef\xd0\x46\xb5\x85\x21\xad\xd1\xf6\xf3\x14\x52\xfd\xc1\xf8\x09\xc4\x2a\x36\xe7\xda\xa8\xa5\x93\xe7\x72\x16\x91\xec\x9c\xcb\xe1\x96\x4b\xb6\x24\x7f\xfd\xee\xe4\x6f\xff\xf5\xfd\xbb\xa3\xc3\xef\xff\xeb\xcd\xe1\xd1\x5f\x4f\xdf\x9e\xfc\xfc\xf3\xf9\xdf\xce\x2f\x4e\xde\xfc\xfc\xf3\x51\xab\x14\x13\xe6\x08\x1b\xef\x9e\x33\xf3\xf3\xcf\x6e\x8f\xe9\x9f\x7f\xbe\x28\x1a\xde\xfc\xfc\xf3\x99\x77\x73\xc2\x39\x6a\xa7\x2a\x01\x16\x1c\xa0\xc7\xba\xea\x48\xd0\xef\x70\xf9\xe1\x2d\x7b\x75\x97\x03\x3a\x68\x40\xd5\x7f\x8a\xb8\xbc\xbb\xae\x05\x45\x6e\x4e\x2f\x7c\xeb\x9d\xfd\x0f\x2a\x32\xa1\xca\x8e\x12\xcd\xc5\x1c\xd0\xfe\x50\x45\x0d\x81\x07\x32\x65\xe6\x9a\x31\xac\xdb\x5c\x55\xad\xd2\xf1\xe0\x7e\xb2\xaa\xaf\x71\x2d\x8e\xad\x02\xd3\x6b\xcd\xe2\xd2\x94\x5c\x21\xe0\x15\x67\xd7\xa0\xa6\x6b\x3e\x17\xb4\x8a\x42\x83\xd0\xa9\x10\x33\xc0\xba\xdf\xdf\x91\x12\x1e\x15\x71\x62\x73\x67\x17\x26\xeb\x67\x99\xac\x65\x98\xf4\x3a\x63\x50\x6d\x69\x63\x25\x39\x3b\x3d\x26\x2f\xef\x3a\x19\x60\x1b\xb8\xac\x92\xf3\x4d\x0c\x11\x1c\x51\x56\xc5\x4b\xeb\x0e\xbf\x06\x79\xfc\xd0\x8c\xde\x4e\x4b\x59\x53\x2e\xb6\xdb\x64\x62\xd6\x56\xd5\x92\xfc\xda\xd2\x0a\xb5\xd7\x33\x59\xae\x9f\x34\x7b\x7f\xf4\x1f\xfd\x69\xf2\xc7\x40\xf8\x9f\x26\x7f\xb4\xd2\x27\xec\x8c\x3f\x4d\xf4\x55\x31\xf9\x63\x51\xb5\xda\x30\x45\xdc\x4d\x77\x86\x3e\xfd\x48\x67\x8a\x20\xe7\xa8\x1b\x01\x28\xa5\x60\xe7\x3e\x88\x46\x87\x4e\x05\xc8\xef\xfc\x8b\xa2\x05\x3b\x63\x8a\x83\x69\x20\x45\xf9\xa0\x1d\x2a\x3c\x07\x93\xd2\x35\x3a\x83\xee\xda\x48\x47\x98\x33\xc1\x58\x89\x96\x9a\x23\x9b\x91\xb9\xa5\x1a\xd6\x7d\x02\x46\xd5\xd4\x6a\x03\x85\x62\x14\x51\xdf\x48\xc9\x2a\x06\x8d\xec\x92\x3a\x8f\x62\x88\xc4\xa7\xec\x0a\x29\xc6\x82\xcd\x31\x85\xd6\xa5\x92\x20\x9e\x22\x1e\xb3\xff\x64\x4a\x46\xe9\x9a\xda\xc8\x86\xf0\xba\x66\x25\xa7\x86\x55\x4b\x72\xc5\xe9\x1d\xc7\x07\xb5\x02\xfa\x60\xa0\x70\xdc\x17\x92\x48\x88\x01\xb7\x82\xbb\x70\xcd\xa2\x35\xa4\x94\xd7\xe2\xee\x2a\x85\xeb\xca\x1a\x0a\x71\x05\xaf\x46\xbd\x66\x39\x30\xb9\xa4\x01\x9e\xe8\x45\x09\xd2\xac\x0e\xb4\xf5\x7b\x0f\x75\x0a\xfc\xa6\x45\x87\xce\x17\x1e\xdc\xd8\x1d\x09\xaa\x15\x00\xcb\xd9\xf5\xf6\x82\x8c\x0f\xcd\xc4\x5d\xfd\xec\x34\x66\x7d\x3f\xbd\xfe\x70\xc0\x1a\x3c\x3c\xc4\xd8\x4a\xb2\xca\x4c\xaa\x82\x4f\xab\x25\x59\xd0\xca\x30\x87\x98\x49\xe3\x55\xba\xeb\xa4\x9c\x33\x13\x2f\x44\x25\xc5\x3c\xd6\x75\xd9\x87\x86\x15\x06\x7a\x37\x31\x2a\xda\x06\xa9\xb3\x6a\xdc\x52\xb6\xc9\xfe\x8f\xd8\xef\xf1\xf5\x0b\x3f\xe9\x29\x32\x27\x25\xa7\x2a\x35\x9b\xca\xc8\x8a\x21\xa7\x0c\x11\x4e\x1b\xbb\x13\x3d\xd3\xf1\xd3\x1f\x4b\xb3\x95\x04\xaf\xdb\x85\xdb\x38\xc0\x72\x17\xe1\x95\xc1\x8f\x61\x0c\x85\x1e\x49\x56\xc4\xe2\x37\xd0\x9c\x61\x49\xac\x56\x64\x30\x82\xe6\x9a\x8a\xdd\x3d\x28\x66\x37\x96\xe2\x4d\xc5\xc8\x1f\x2f\xd9\x72\x04\xdc\x3e\x42\x75\xfe\x4f\xa4\x0d\x19\x54\xf0\x7c\xc8\x91\x6c\x2c\x01\x52\x91\x3f\xfa\x7f\xfd\xe9\x01\x7b\xc3\x0c\x09\xc3\xe1\x4b\x6d\xab\x5d\xcb\x09\x22\xd3\xf0\x08\x4c\x8e\xb9\x05\x74\xa0\x35\x46\xe2\x2c\x4f\xc8\x09\x74\x4d\x43\x03\x12\x01\xe6\xad\x25\x10\xdf\x9c\xe8\x59\xfd\xc9\x87\x53\xdd\x2e\xf3\x8e\xfb\x28\x4f\xef\xad\x74\x7d\x82\xd8\x88\x9c\x41\x57\xbd\xee\x13\x10\xc5\x6f\xe5\xc9\x07\x56\xb4\x69\xd5\xef\x83\x42\x40\x97\x2c\x21\x9b\x32\xcf\xea\x7d\xc7\x96\xfe\x54\xc4\x65\xb0\xf6\x79\x80\x03\xec\x44\x54\x54\x3f\x78\xfb\x32\x5e\xb2\xbb\xf7\x8b\xc4\xeb\xd4\xfb\x35\x80\x22\xd7\x9e\x2b\xec\x4a\xaf\x15\x9d\x7c\xe0\xda\xe8\xff\x8d\xf2\xa4\x90\xf5\xd4\x1f\xaa\x48\x8e\xe7\x35\x44\x62\x72\xab\xef\xf0\x54\x52\x49\x1b\xb4\xb6\xfe\x05\xb6\xb5\xc0\xef\xfc\x04\x2a\xd6\x28\xa6\x21\xe6\x4c\xed\x54\x3c\xd3\xae\x40\x4b\x0a\xc0\x45\x76\x11\x09\xec\x42\x9c\x34\x94\xaf\xe5\xc1\x01\x71\xd7\xe1\x72\xc1\x12\x9c\x58\x4b\x69\xd2\x53\x05\xf0\xa3\x34\xb1\x83\x0f\xb6\x9c\xf2\x6b\xcb\xaf\x68\xc5\xd0\xfd\x7a\xcd\xab\xb2\xa0\x0a\xd3\x1a\x51\xe8\x13\x2d\x5d\x0d\x2c\xb6\x41\x4b\x0a\x60\x05\x6d\x80\x75\xcc\xae\x5d\x3a\x13\x55\x86\x17\x6d\x45\x15\xb1\x12\x70\x2e\x55\x12\x5e\xcd\x20\x36\xeb\x76\x6a\x92\x35\x85\x57\x0e\x7e\xbb\x58\x25\x24\x66\x3c\xb3\x08\xaa\xb8\x9c\xa1\x66\xb9\x22\x66\xf6\xb1\xea\xcc\xed\xf6\x24\x0a\xe4\xcc\x1f\x3c\x41\xa2\xc7\x68\x28\x51\x4a\x0e\xd7\x84\xcf\x85\x54\xac\x3c\x88\x14\x90\x20\x0b\x27\xe4\xdb\xd0\xbc\x31\xa5\xef\xb7\xd5\xb8\x7c\x24\x19\x60\x65\xdc\xbb\x39\x41\xe5\xb8\xa9\x13\xbd\x33\xa9\xd8\x15\x53\x64\xdf\xe1\xba\xb1\x2b\x5e\x98\x83\x09\xf9\xff\x5b\x43\x2f\x35\xf8\x16\x2c\x48\x27\x0c\x43\x7b\x01\x07\xfe\x4f\x35\x79\x41\xf6\x61\xa8\xd8\x7a\x3c\xf0\x09\x24\x7a\xa9\x0d\xab\xd3\xf9\x79\x5b\x35\x10\xc9\x89\x8b\x39\x36\xc1\x8f\xde\xc6\xed\x16\x17\xad\xad\x15\x6e\x0f\x1d\x73\xe5\xa0\x23\x33\x1c\x92\x5c\x3b\xb9\xd8\x0b\xaf\x86\x8c\x0d\x7f\xa6\x86\xbd\xf0\xdf\x90\x23\x40\x14\x9b\x83\xf4\x42\xd9\xb3\xe5\xe6\x77\x89\x79\x98\x46\x36\xb2\x92\xf3\xe5\x79\xa3\x18\x2d\x8f\xa4\xd0\x46\x81\x8c\x7e\x48\xb7\xd2\xc5\x4d\x44\xb8\xe7\x4e\x5d\xed\x0a\x75\x15\x61\x72\x86\xb8\x4c\xb2\x9d\x2f\xb0\x15\x28\xfc\x90\xd0\x42\x49\xad\xc3\x3b\xdd\xd5\x64\x03\xdf\x9e\x9e\xf8\xbe\xa0\xde\xbf\x1c\xfa\x8c\xc2\x98\xe0\x6d\xbf\xa6\x4b\x27\x95\xe8\x94\x97\x3d\x04\x45\x4f\xfa\x5d\xd9\xe1\xd0\x9e\x8e\x37\xce\x83\xd5\x09\x0e\xdf\x1e\xdf\x35\x95\x61\x7b\x26\xef\x4d\x4b\x1a\xac\x0d\x07\x12\x1a\xd6\x2e\x18\x94\x30\xcb\x08\x31\x68\xa7\x74\xce\xaf\x98\x08\x33\xf3\x48\xda\x8e\xd6\xf4\xc3\xf9\x25\xbb\x4e\xf8\xa5\x7f\xd1\xef\xd8\xdd\x8b\x24\xc6\xe0\x0d\xfb\x41\x68\x6a\xb8\x9e\x71\x3a\xad\x1e\xb2\xf7\x29\x80\xa6\x9c\xb3\x8a\x15\x5b\x54\xdb\xbf\x8f\x89\x08\xd0\x7b\x46\x92\x19\x17\x2b\x3c\x96\x76\x74\x74\x28\x73\xbe\xd3\x1b\xd7\x01\x02\xcf\x0d\x0b\xd5\x72\xb2\x15\xae\x8f\x6e\x48\x0a\xc4\x2c\x88\xb6\x9e\x32\xe5\x45\x58\x9a\x7a\xe4\x40\x25\x49\x21\x95\x62\xba\x91\x58\xad\xea\x59\xc7\x09\xb2\xf4\xf3\x28\xb9\x84\x65\x68\x3d\x08\x4c\xe9\xc9\x07\xab\xf7\xea\xb4\x92\x00\xbc\x7a\x9c\xb4\xfa\x50\x4c\x05\xf2\xd5\x5d\x2b\x4b\xe7\x36\x3d\xf4\x86\xc7\xa0\x41\xfc\x49\xaa\x18\xee\xae\x21\x35\x50\x78\x25\x57\x42\xe1\x95\x27\x1b\x90\x20\x42\xc0\x8d\x73\x87\x73\x1c\xbe\x89\xe1\xdb\x9c\x03\x5d\x8f\xd0\x9c\x76\xb0\xad\xa2\x53\xc6\xec\xcd\x03\xc8\x02\xe3\xdc\x99\x23\x97\x6c\x09\x8f\xc7\x11\xd3\xbb\xd7\x0d\xdc\x16\x9e\xb0\x21\xf5\x5d\x78\x8d\xed\x2b\x0d\xfa\xbd\x9f\xe6\xe4\x87\x0c\xdd\xe3\x78\x25\xba\xee\xba\xab\xc7\xc7\x97\x9d\x37\x0e\x79\xb2\xe7\x8d\xeb\xe4\x72\xe7\x8b\x1b\x34\xf6\xe0\xea\x30\xbc\x86\xb8\xb8\xba\x2b\xdf\x86\x8e\x69\xfa\x14\xb7\x17\x85\xa4\x11\x39\x1b\xbc\xbd\xf0\xda\xe4\x06\x3b\x15\x23\xf2\x56\x1a\xfb\x9f\xc8\x23\x76\x2c\x99\x7e\x2b\x0d\x7c\xb2\x13\x2b\x89\x13\xb0\x4b\xeb\xe8\xbc\x16\x56\x0c\x0b\x3c\x6e\x5c\x76\x9b\x55\x14\xdc\x7a\x6d\x32\x83\x4f\x05\x91\xca\x4d\xf9\x40\x12\x82\x25\xad\x1d\x01\x71\x80\xde\xf5\xf9\xbe\xd1\x10\xb7\x54\xc4\xcb\x7c\x6f\xc4\x38\x42\x00\xf3\x18\xbf\x01\x28\xf6\xa6\x82\x82\xef\xb2\x85\x09\xa3\x76\xe6\xa8\x61\xf3\x3b\x97\x38\xae\x5e\x35\x53\x73\x46\x1a\x08\xeb\x64\xe0\xdc\x21\x8a\x04\x5e\x03\xd5\x89\x98\x98\xc1\xdb\x28\x73\x79\xe9\x3d\x3e\x14\x74\x4a\xb0\x35\xf2\xe8\xa8\x03\xf6\x7b\x44\x0a\x6a\x5d\x35\x05\x07\xc9\xff\x0b\xd1\xdb\xff\x21\x0d\xe5\x4a\x4f\xc8\xa1\xcf\x30\x8c\xbf\x73\x49\x1a\xd1\x63\x06\x90\xd2\xac\x07\x16\xa8\x20\xcc\x61\x5a\xc8\xd9\x9a\x32\x3e\x72\x78\xfb\xf6\xc0\x0e\xce\xe5\xbd\x4b\xb6\xdc\x4b\x45\x57\xc2\x2b\x96\x28\x7b\xa7\x62\xaf\x4b\x29\xec\x49\x81\xa0\x93\x02\xc0\xf9\x1e\x7c\xb7\x77\x7f\x7a\xff\x20\x0d\xb2\x03\x4c\x3a\xcb\xa0\x82\x0d\xdc\xb2\xbd\x3d\x55\xd3\x66\xd8\x96\xea\x98\xef\x3b\xb6\xdc\x5a\x08\xe6\x4d\x8f\x0a\x6f\xc2\x18\x67\xaa\x77\x9a\xa5\xc6\xfa\xfb\x0a\x62\xf4\x0b\xe7\x16\x94\x57\x4c\xa1\x4b\x30\x69\x6c\x74\x82\xd9\xb3\x26\xa4\xda\x77\x70\x3b\xc0\x8f\x30\xb0\xe5\x43\xef\xd1\xa8\xa4\xbc\x6c\x1b\xcf\xcf\x90\x86\x9b\xba\x63\xb8\x28\x64\xed\xfc\x22\xf8\x9e\xe0\x09\x77\x1b\x73\xec\x32\x9e\x50\xc6\x84\xad\x80\x39\x55\x3d\xaf\x4f\x62\x7c\x30\x9e\xcc\xe0\xe0\x65\xf6\xd8\x0f\xfe\xc0\x6e\x7a\x6f\x9d\xaa\x24\x02\x7c\xae\x7d\x3c\x0b\xae\x0d\x34\xad\x43\x60\x7d\x26\xd5\x94\x97\x25\xf8\x22\x91\xb8\x50\xf0\xb5\xc2\x38\x56\xd2\xf4\xfc\x50\x69\x42\x63\xe5\xa9\x1b\xea\xe0\x57\x9d\x5d\xe2\x99\x49\x49\x4b\xc6\x0b\x06\x71\xed\x91\xec\x83\xc2\x2b\xae\x4e\x8d\x67\x04\x3b\xfb\x49\x23\x4d\x99\x0f\x1f\xda\x23\x49\xb4\x55\x65\xb5\x3d\x50\xc4\xd0\x2d\x83\x91\x3e\x10\xc9\x2e\x29\x61\x6e\x85\xb4\xe9\x33\x5b\x52\xa3\x08\xd7\xdd\x02\xf6\xf6\x94\x19\xea\xfb\x5c\x88\x15\x34\xa8\xfe\xe4\x9f\x8a\x33\x59\xf6\x3d\xda\xb7\xc0\x42\x91\x7d\xff\x8f\xe9\x32\xb9\xe8\x85\x0c\xd6\xf1\x06\x68\x76\x39\x0f\x87\xe1\x0a\x97\x73\xa6\x6f\xef\x58\x80\xe1\xa3\x50\x14\x26\xdf\xce\x15\x43\x14\x60\x90\x4a\x20\xa5\x5c\xdb\xab\x56\xb0\x2b\x66\xb9\xb7\xe4\x76\x0e\xa7\x6d\x22\x66\x9a\xcb\xcf\xfa\x65\xcd\xab\xff\xff\x3b\x96\x6f\xa5\xf1\x61\xaa\x5f\x46\x2e\x60\x8e\x7a\xdc\x07\x5e\xb7\x35\xf6\xad\x36\xc6\xda\x30\x7c\x36\x63\x2a\xb1\x39\x1f\x09\xb5\x27\x7d\xdf\x75\x3f\x5a\xe3\xa4\x84\xa1\x6a\x0e\x05\xd3\xce\x0f\xed\x55\xae\x79\x25\xa7\xb4\x22\x35\x17\x96\xb4\xb4\x99\xb8\x58\x7b\x4e\x78\x63\xf7\xe7\x2d\xc4\x81\x0e\xea\x3a\x4b\xa1\x73\x3c\x2d\x43\x42\xb9\xe4\xf1\xd9\xca\x6c\xac\x3c\x1c\xe4\x4b\xc5\xb4\xc6\xf4\xe0\x37\x5c\x1c\xbb\xd0\x62\xd2\xb0\xaf\xad\x74\xfc\x40\xeb\xa6\x62\x23\x0c\x3f\x7e\x3d\xfe\xa7\x14\x8c\xb8\xb2\x87\x51\x60\x51\x57\xc7\x63\x24\x79\x89\x0a\x6f\x13\x60\xc9\x7c\x7d\x4d\x12\x05\x3d\xb9\x1b\x82\xad\x9a\x7c\xf5\xfc\xab\xe7\x2f\xd3\x44\xcc\xa9\x2b\x3d\x2a\xa8\x76\xdd\x6d\xd7\x57\xf7\xce\x45\x3c\x78\xfd\x8b\xd8\xd9\x79\xe9\xfe\xfb\x95\xfb\xef\xd7\xe4\x5f\x89\x4f\x23\x67\xe4\xac\xf7\x5f\xfb\x9f\xc4\xa7\x8d\x2d\xf3\x44\xcb\xf5\x72\xd4\x3f\x5b\x0b\x2a\xf0\xe0\xb3\xe7\xbc\xdb\xdf\xa0\xed\xe1\x2b\xc0\x39\x53\xc8\x9a\xc1\xd4\x7f\xf5\xbf\xd3\x74\x4d\x7c\x2e\x64\xe8\x1b\x22\x85\x7b\xfa\xcb\x7d\x98\xae\x03\x72\x0d\x79\x0f\x35\xbd\xc4\x80\xd5\x61\x61\x5a\x5a\x59\x82\xf7\xbf\x1e\xbf\x3c\x20\x52\xf4\x6e\x4f\x22\xe1\x8a\x4b\xab\xaf\xf9\x99\xd8\x7f\x99\x88\xf1\xb0\x3a\x9d\x5f\x6d\x98\xce\xde\x4c\xc2\xdb\x52\xb1\x84\x57\xc8\x2b\x93\xbd\x38\x3e\x14\xcb\x6b\xba\x0c\x42\xd9\xab\xeb\x73\x7e\xc5\xc8\x82\xcf\x17\x80\x86\x30\xa0\x5f\x2a\xc1\xbc\x6f\x90\xb1\xdc\xb7\xb4\x44\x42\x96\x84\x27\x6a\x7f\xa7\xe6\x99\x86\x8c\x16\x8c\x51\x38\xa0\x9b\x50\xa7\x16\x8a\x4f\x5e\x82\x58\x79\xb1\x02\xf4\xb1\xe5\x34\xa7\xaf\xbf\xba\xbb\x4e\x11\x64\xf2\xd6\xd4\x8a\x40\x41\xaf\xe1\xc1\xfa\x69\xb6\x7a\xb8\x0c\xe0\xda\x8f\x9c\x5a\x70\x50\x84\xc3\x33\x1c\xe3\x97\xce\x1a\xee\x4e\xb4\x6e\xf6\xd2\xfc\xb2\x67\xb2\x0c\x09\x22\xc4\xe9\xd3\x90\x58\xa7\xc9\x5e\xff\x18\xd8\x83\x44\xbb\xe0\xbd\x71\x18\xce\xce\xde\xe3\x52\xd8\xf7\xf0\x9b\x7f\x50\x1b\x70\x42\x0e\x45\xd9\x55\x13\x25\xce\x12\xfb\xb5\xa5\x15\x38\xaf\xe7\x90\x27\xa8\xf2\xcc\x57\x54\x77\xb4\xd6\xd7\xb6\x93\xe6\x89\xaf\x8d\xfb\x5e\xb7\x15\x64\x5a\x7e\xfc\xfd\xb3\x72\x82\xee\x52\xad\xc0\xea\x0c\xb9\x56\xb5\xc4\xde\xf5\xc2\xab\xff\x2e\xf3\x42\x3a\xbf\xc4\xa0\xcd\x70\x3a\xdb\x50\x4e\xd7\xe5\x6e\x91\x29\x5b\xd0\x2b\xbb\x1d\x01\xc6\x29\xde\xa9\x6e\x89\x41\xc5\x1a\x92\xed\x1d\x15\x58\x38\x11\xa8\xfb\x2c\xf3\x62\xc0\x36\xef\xde\x4d\x1a\x7c\xbf\x9f\x56\x4f\xab\x10\xff\xe8\x59\x12\x89\x26\x75\x8a\x82\xfa\xd5\x68\x65\x5e\xdd\xe7\xbf\x7d\x28\xbd\xf5\xab\x34\xbd\xf5\xde\x95\x4b\xfc\x6f\xb2\x8d\xd4\x6d\xdc\x8d\xfb\xf5\xb7\xfb\xdd\xac\x1f\x40\x86\xff\x9a\xc0\x05\x64\xac\x2e\xc9\x39\x71\x87\x39\xf5\x5e\x73\xd3\x52\x04\xe0\x12\xec\xda\x95\x54\x47\xcb\xba\xb2\x44\x91\x93\xcb\xab\x6c\x69\x72\x65\xca\x0a\xda\x6a\xbb\xa9\xeb\xc6\x9a\xdf\x44\x5b\xf6\xf3\x0e\xc3\xaf\xf7\xbf\x26\x63\xf2\xe2\xc0\xee\x6e\x81\xa2\x05\x58\x30\x56\xb8\xa1\xb1\x0d\x1a\x7a\x66\x61\x4d\x7d\xbb\xce\x89\x52\x8e\x3b\xf4\xce\x15\xb5\xf7\xf1\xa9\x4d\x42\x96\xec\x70\x36\xe3\x82\x9b\x65\x2a\x9c\x7d\x1e\xf5\xe9\xed\x1a\x25\x91\x1a\xb5\x90\xd7\xe4\xda\x61\x09\x00\x2f\x3b\x48\xbc\x98\xfc\xe7\xf6\x8f\x41\x8e\x6b\x38\x2c\x83\x2e\xe2\x2c\x8e\xa0\x0f\x38\x69\x63\xf9\x6e\xe2\xea\xe6\x5d\xa3\x9e\x94\xb1\xc6\xe4\xaf\x52\x48\xf5\x0a\x8d\x43\xec\x65\x1f\x74\x90\x1b\x5f\xcb\x9d\x2f\x45\xd5\x96\x51\x07\x8c\x4e\x7b\x4a\x3c\x3e\xc7\xe4\x14\xfc\xb7\xaf\x3e\x36\x72\xf0\xf2\x02\x88\x42\x19\x0e\xbc\xdb\x08\x4a\x4f\xe8\xdf\x58\x24\x0f\x47\x39\xc7\x40\x60\x3f\x30\x69\xbf\x85\x49\x25\x0d\xf0\xcf\x83\xd7\x1e\xd9\x19\xb9\x80\xf4\xee\xed\x6f\xa5\x98\x8e\x5b\x37\x12\xf6\x3e\xc3\xa4\xf4\xd5\x0d\x90\x34\xfa\x43\x6c\x1a\xe4\x3d\x7b\xf0\xc8\xd6\x38\xea\x47\x84\x56\x12\x82\x48\xf6\x38\xb2\x1f\xb1\xd2\xdd\x38\x93\x3e\xd6\xb4\x1a\xfb\x48\x22\x63\x01\x68\x9f\x5d\xf9\xca\xa8\xb7\x0b\x72\x6c\x41\xbf\x20\x9f\xb0\xe9\x1e\x78\x83\x21\x95\xdb\xda\x61\x51\x32\xfd\xf6\xea\xfa\x02\x09\xde\x61\x7d\xc9\x40\xb3\x80\x85\xc3\x58\xda\x04\xf6\x60\xdc\x5c\x9d\xba\x70\xb3\x53\x96\xb8\x4e\x4e\xfc\xb4\xea\x34\x07\xc8\xde\x82\x56\xb1\xdd\x61\xed\x1d\x5e\x32\x85\xea\xce\x94\xf5\x50\x98\x52\xeb\x2d\xf0\xfa\xa9\x7b\x3a\x22\x36\x01\x94\x00\x0e\xfe\x27\x04\xbf\xdd\x9b\xb6\xc5\x25\x33\x3e\x31\x43\x01\x4a\x4a\xd3\x1a\x32\xa5\x15\x15\x85\xdd\x8b\xa0\xc9\xa6\x39\xea\x67\xde\xf5\x6f\x24\x12\x80\xa3\x25\xbf\x0d\x76\x8c\x08\xf8\x3f\xf8\x0a\x51\xfd\x2a\x17\xda\x58\xaa\xb1\xb0\x75\xd8\xe4\x1d\x56\x5a\x8e\xac\xd4\xf5\x83\xae\x05\x2f\x70\x78\xf7\x6f\xcc\x9f\x71\x1a\x01\x63\xc6\xc1\xc6\x45\xc9\x2b\x32\xa5\x17\xda\x26\x5d\xcf\xe1\xf4\xf6\x4f\x8b\xb4\x97\x64\x93\x39\x64\xff\xad\x6c\x8f\xbd\x3e\x5e\xa3\x87\x80\xda\x1b\xe1\x2a\xda\x5d\xe2\x90\x3c\xf1\xe5\x41\x41\xa7\x66\xe8\x8c\x8b\x12\xf0\x81\x57\x89\x09\x4f\xed\x53\x65\x0d\x01\x4f\x11\x98\xb9\xf9\x29\xda\xec\x8e\x7d\x68\xf1\xb9\xe6\xe3\xde\x96\x10\x5d\x77\x5f\xf4\x55\x14\x28\xb2\xa1\x95\x47\xf9\xb1\x2a\x05\x9f\x59\xab\xab\x94\x0c\xb3\x22\xd0\x3d\x9e\xe8\x7c\x63\x5e\x2f\xe9\x5c\x44\xa9\xa7\x76\xcf\xdd\x42\xf6\x7d\x76\x00\x31\xac\xaa\xf0\x74\xe8\x3c\x62\xd6\x12\x36\xb2\x73\x89\xa5\xfa\xf6\xc7\xa4\x1f\x9a\xd8\x38\x58\x3c\x90\x07\x6d\x82\xc8\xe9\x32\xb4\x96\x4d\xcd\xc1\x9d\xb6\x86\xcc\xf9\x95\x55\xa1\xd6\xe2\x1f\x9b\x62\x19\x18\x7f\x5a\xb0\xaa\x21\x8a\x95\x6d\xc1\x06\x64\x02\xea\x44\x33\x9b\x90\xc3\xd8\x21\x08\x98\x19\xe1\xb8\xdc\xeb\xf1\xe2\x9e\xeb\x83\x3b\x5c\x51\xe4\x33\x90\xb0\x60\xe2\xf1\x19\x61\x57\x4c\x2d\x49\x23\xb5\x06\xd9\x0f\xfa\x02\x82\x1c\x42\x36\xe5\xcc\x17\xd6\x80\x53\x05\xe6\xcc\xf9\x17\x92\x06\xdf\x73\x4e\x89\x3d\x70\x2a\xcb\xc1\x3a\xc0\xee\x46\xad\xbf\x7e\xfe\x32\x35\x6a\x9d\xdb\xfb\x77\x06\xff\x0b\x21\xe5\x41\xa1\xe5\xd3\xd9\x26\x39\x19\xe6\xb6\x27\x79\x3e\x25\xea\x9c\x1a\x9a\x84\x99\x81\xe0\xf0\xd7\x07\x51\xc0\xfa\xeb\xe7\x5f\x3d\x7f\xb9\x6f\xe7\xfe\xab\x03\xbb\x0a\x51\x58\xf9\xab\x28\xac\x1c\x7e\xe9\xde\x22\x01\xc2\x8a\x74\x49\x3b\xfb\x2f\x0f\x26\x50\xd3\x00\xf8\xa4\xd7\x52\x95\xae\xc4\xdf\x23\x46\xda\x37\x0f\xed\x3f\x79\xed\x95\xcf\x11\x08\xad\x20\x1d\xd3\xdc\x43\x10\xd0\x80\x30\x3a\x37\xe4\xcb\x5a\x2a\xf6\x65\x34\xc4\x63\x55\x0c\xd6\x93\xbb\x6a\xda\x8c\x2f\x13\xf2\x76\x87\x14\x3b\x0f\x2d\x75\xbe\x29\x45\xad\xa6\xcd\x1d\x9e\x73\x25\xab\xb6\xbe\x6b\x16\xf6\x30\x85\xe8\x7b\x57\xb7\xea\x86\x76\xa5\x95\x98\xe6\x50\xbb\x9a\xe3\xe9\x32\x86\xf2\x9d\xb2\x4a\x8a\x39\xc6\x2a\x43\xc3\xc2\x3b\x8e\xfa\x69\xc8\xea\x85\x14\x05\x6b\x8c\x7e\xae\x8d\x54\x74\xce\x9e\x3b\x22\xef\x34\xd8\xf6\x20\x0b\x7e\x04\x6a\xfb\x95\x6f\xd8\x14\x08\xdf\x23\x00\x2d\xfb\xfa\x6f\x90\x97\xb4\x00\xd8\x49\x98\x75\xab\x2d\x45\x0d\x86\x45\xea\x74\x6f\x09\xb5\x20\xa1\x83\xe0\x90\x6a\x50\x7a\xad\x4f\x2a\xaa\x0d\x2f\xbe\xad\x64\x71\x79\x6e\x64\x9a\xa3\x2f\x87\x85\xb1\x89\x96\x1e\x27\x08\x72\xf8\xd3\x39\x39\xe6\xfa\x92\x28\xa6\x65\xab\x0a\xd7\xaa\x6c\x05\x90\xf1\xae\xd8\xb1\x78\xd9\xcd\x54\x31\xe3\x20\xf7\x49\x4d\x8b\x05\x9a\xfe\x2e\xeb\x81\x7d\x68\xa4\xee\x9a\xaf\x27\xb0\x14\x5e\x71\xa7\x8a\xc3\x9f\xce\xd7\x5f\x99\xeb\xa8\x49\x06\xfa\x10\xb1\x94\x06\x3c\xb1\x5d\xa6\xfc\xd8\x28\x96\xa6\x95\x6d\x9c\x69\xcb\xf0\xe0\x94\x52\xac\xe4\x0a\x81\x54\xdd\xbb\xb2\xa9\x9e\x14\x9a\x4f\xe8\xb5\x9e\x14\xb2\x26\x47\xe7\xa7\xa4\x54\xfc\x2a\xb5\x4f\xd2\x30\x51\xf6\x05\xbd\xd6\x0c\xc9\x9f\x5a\xf2\xed\xd7\x29\xf3\xb0\xe5\x5e\xa1\xf8\x36\xa7\xc7\x09\x3f\x1f\x5a\xff\x3d\xd3\x17\xf6\xdd\x13\xed\xb9\x5c\x55\x73\x48\x85\xf7\xc8\xce\x78\xc5\x10\xb0\x0b\x39\xd1\xc5\x7d\x9d\xd8\x87\x6d\xbe\x94\x2d\xb9\xa6\xe8\xd8\x86\x73\x36\xbd\x7c\xf3\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x91\xfa\x2a\x09\x56\x71\xf7\x7d\x84\x3d\xba\x10\xc8\x06\xb7\x1d\xc5\x7c\x00\xc4\x18\x5e\x27\x68\x9d\xe9\x57\x64\x8f\x7d\x30\xdf\xec\x8d\xc8\xde\x87\x99\xb6\xff\x11\x66\xa6\xf7\x26\xe4\xb4\x6e\x2a\x5e\x70\x63\xcd\x51\x31\x63\xaa\x73\x15\xe3\x0f\x32\x75\x59\xda\x95\x3d\x49\x72\x54\xb2\x82\x53\x18\xd8\x73\xcb\x1c\x1e\x08\xf1\x4c\x1e\x7d\x20\xee\x93\xbd\x4f\x67\x44\x62\xe9\x41\x1f\xa6\x9c\xeb\xf0\x70\xcb\xd0\x6e\x74\x91\xd0\x6f\xa9\xbb\x3a\x16\x7e\x2d\x95\x7f\xe4\xf3\x92\x5d\x3d\xd7\x25\x7d\x39\x82\xd7\x42\xfe\x5c\xae\xcc\x01\xd5\x64\xef\xe5\x9d\x1b\x05\x74\xd7\x39\xaf\x79\x45\x55\xb5\x1c\xc5\x73\xd9\x3d\xdf\x1e\x95\x9e\x10\x70\x26\xbf\xd8\x23\xfb\x88\x06\x0e\xea\x7a\xc5\x7c\x3b\xbe\xd0\xd5\x17\x2a\xa0\x92\x9b\xdd\x0d\x4d\x0c\x21\x83\x93\x43\x08\x1c\x4c\xb4\x7c\x27\xaa\x64\x70\x8f\x5c\xdc\xef\xe9\xf0\xf8\x81\xaa\x75\x51\xec\x99\x44\xcd\x8d\x75\xb7\xf8\x96\x3c\x5c\x38\x13\xe0\x8d\xe5\xd1\x01\x78\x16\xbb\x26\xce\xd2\xdb\x0f\x92\xa0\x29\x6c\x7b\x41\x3d\x1d\x90\x52\x2f\xf8\xaf\x2d\x23\xa7\xc7\xfe\xa0\x6e\x98\xd2\x5c\x1b\x26\x0c\x29\x7b\x1a\x3a\x47\xb5\x7d\xff\xb0\xa6\xff\x94\x82\x9c\x7c\x7b\xee\x1e\x94\xbc\xcd\x76\x6f\x75\x13\x0f\x2b\xfa\xcf\x56\x31\x6b\xcf\x6c\xcd\xe4\xf2\x04\xac\xda\x59\xf6\x73\x72\x4c\x0d\x45\x73\x0b\x4f\x0c\xd9\xf5\xf4\x02\xb3\x68\x0a\x78\x6e\xbe\x79\x5c\x3e\xa3\x28\x10\x75\x27\x4b\x28\x7a\x19\xbb\x28\x69\xf3\xb1\xd1\xfc\xb1\xfc\x8c\xf6\x8f\x1d\x21\x83\x05\xb4\x65\xcb\xc3\xbe\xcf\xdb\x54\x8f\x3e\xfe\xfc\x87\xf7\xa7\x5b\xb0\x5b\x0a\xb0\xc9\xe7\x6f\x64\x99\xc7\x78\x79\x16\x3d\xd0\xab\x68\xd0\x10\xf8\x08\x3f\x27\xb5\x1d\x89\xbc\x95\x82\x8d\xc8\x7b\x46\x4b\x62\x0f\x2b\xf7\xcf\x9f\x14\x37\x6c\xf2\x6c\x5b\x4a\xae\x5f\xc4\x2c\x13\xe1\x1f\xe6\x27\xe1\x6d\xd4\x26\x12\x7a\xb9\x82\x48\x77\x3a\xeb\xb4\x92\x53\xe2\x44\xea\x36\xdf\xfe\x87\xf7\xa7\xd9\x5e\xfe\x87\xf7\xa7\xfe\xdd\xed\x3f\xe5\x6c\x37\x5f\x7b\xd7\x0c\xf7\xd7\x2b\x16\xf3\x70\xcb\xe5\x8d\xab\x89\xa0\x6b\xd6\xf8\xfd\x9b\xe2\x93\x2d\x1b\xe1\x19\x20\x9c\x9c\xa1\xf7\x8a\x58\xba\xd2\xdc\xa0\x5c\x24\xc3\x23\xf6\x85\xab\x7d\x52\xd7\x93\x29\xca\x7a\x83\xde\x7e\xe5\x2b\x52\xb7\x95\x81\x2e\x37\xb0\xb5\xec\x5e\x83\x02\x32\xbf\xc9\x88\xeb\xfa\x6a\xb5\x03\xcc\x34\x29\x5f\x79\xf4\xa4\xf0\x8b\xcd\x3f\x78\x43\x05\x9d\xdb\xdb\xe1\xc4\x26\x35\xfe\x19\xed\xe9\x7d\x0c\xf0\x8b\xf0\x15\xbd\xa2\xbc\xa2\x53\x5e\x71\x03\xd6\xc8\xc1\xc4\xcf\x25\x42\xcd\x00\xc9\x5b\x13\xf6\x3b\x67\xd2\xc5\x9d\x30\xa0\x7b\x22\xd9\xb7\xdf\x3d\xbf\xb6\x87\xe2\xc1\x04\x4e\x48\xb8\x71\xc1\x54\x6c\xf5\x25\x8f\x6c\x37\xfc\xfb\x7b\xb2\x16\x87\x5b\x68\xd1\xc6\x83\xd9\x48\xb3\x04\xac\x34\xdd\xaa\x25\x60\x09\xd8\x68\x09\xc0\x17\xae\x97\xed\x16\x8c\x01\x18\x3e\xc1\x18\x80\xdf\x65\x36\x06\xec\xb1\xf4\x39\x19\x03\x9a\x15\x8a\x99\x01\xe6\x00\x88\xc6\xc4\xdf\x0f\x35\x08\x76\x4e\x2e\x96\x4f\x72\x31\xbe\x3a\xe6\xca\xb2\x42\xdd\xe3\xbc\xb2\x1e\x1a\xda\xe3\x57\x2b\x28\xd7\x28\xbc\xce\x9d\x76\xe0\x1b\xdd\xc3\xef\xad\xc8\x4a\xc1\xf7\xc7\x6b\xf0\x81\x1e\x36\x4d\x9e\x79\xf1\x4f\xf3\xd3\x82\x6a\x0f\x7c\x4c\x92\xb7\xf6\xc0\xd7\x2c\x58\xb3\x98\x6d\x0d\xda\xc1\x8e\xfe\xfa\xbc\x9f\x48\x72\xc4\x9a\x05\x79\x7d\xbe\xe1\x00\x43\xfc\x0e\x3b\x5d\x1a\xd3\x4b\x9e\x69\x52\xf1\x19\x33\x3c\x35\x32\x12\x9f\x61\x47\x48\x4b\xef\x00\x0b\xc0\x4c\xfe\xc0\xc2\xe9\x0a\x81\x47\x21\x7d\x7b\xd3\x60\xf7\x3c\xc2\xc3\xa5\x96\x82\x1b\x79\xe7\x5e\xe4\x24\x47\x1f\x03\x37\xf4\xb6\x8f\x06\x4f\x87\x5d\xd4\xf7\x7e\x3a\xc9\x9b\xe8\x53\x4a\x0a\x59\x55\xac\xf0\x58\x1a\xc0\xa6\x03\x66\x0e\xaf\x0d\x2e\x72\x97\x0a\xac\x27\x97\x7f\x00\x27\xb9\x73\x87\x3f\x47\xd6\x7b\xfe\xfe\xe4\xf0\xf8\xcd\xc9\xa4\x2e\xbf\x58\xc8\xeb\xb1\x91\xe3\x56\xb3\x31\x4f\x85\x4a\xdd\x7a\x97\x85\x0c\xd6\xf4\x3d\xa0\x16\x37\xd4\x2c\xf2\x98\xd7\xf6\x49\x96\x7d\xba\x8e\xf6\x3f\x68\xc4\x0b\x00\x44\x36\x97\x87\xa8\xa4\x34\x23\xa2\x28\x24\xdf\x86\x4e\xc9\xb3\xb6\xaa\x90\xcf\xac\xec\x19\xc5\xf1\xe1\xe7\x4f\x46\xae\x57\xa7\x7a\x93\xfb\x59\x59\xbc\xbb\x22\x1e\x86\xeb\x96\xa9\x36\x33\xc9\xc8\x30\x1d\x25\x7d\x96\x39\xef\x7d\x8e\xb9\x0f\x66\x61\x19\xe8\x92\x2d\x09\xa0\xda\x5b\xb3\xf5\x07\xcd\x54\x7f\x0b\x32\x53\xc0\xac\x3f\x6f\x35\x53\x13\x7c\xfc\x23\x5f\xe9\x21\xba\x32\xbc\xff\x7b\x36\xdb\x8d\x75\x7e\xcf\x66\x9b\x96\xd9\x7d\x0c\xdd\x99\x43\x55\x95\x55\xc5\x5b\xb3\xc0\xca\x5f\xec\x9f\x8f\x76\xca\xc6\x75\xc7\x3e\x08\x8f\x7c\xa1\x07\xe1\xab\xe7\x68\x6c\x23\x06\x58\x55\x24\x73\x13\x90\x38\x8e\xe6\x38\x63\x60\xb7\x94\x8b\x5e\x0b\x58\x84\x20\xe3\x57\xac\x5a\x06\x5d\x1d\xeb\x66\xca\x16\x11\x91\x69\x71\x79\x4d\x55\x09\xfd\xa6\x1b\x6a\xb8\xf3\x70\xf3\x74\xc5\xd2\x5e\xbe\x47\xb9\xc3\x5c\x76\x8d\x44\x5c\x01\xb6\xc6\x37\xe6\xce\x98\xc1\x82\x50\xe1\xc0\xa5\x1d\x82\x9a\x3d\x23\x69\x72\xd2\x85\x27\xa2\xb6\xb6\x5b\xc1\x94\xb5\xf6\xab\x25\xb9\x56\x32\x15\x81\xcd\x5f\x77\x4c\x2c\x91\x57\x4c\x5d\x71\x76\xfd\xfc\x5a\xaa\x4b\x2e\xe6\x63\xfb\xb2\x63\xdc\x02\xfa\xb9\xe5\x44\xfd\xfc\x0b\xf8\xcf\x00\xaa\x32\x75\xf6\x08\x1e\xea\xbd\xbd\x1c\xea\xf0\xe0\x86\x03\xf6\xb2\xe7\xdb\xb6\xa5\xba\xa5\xc1\xee\x25\x19\xeb\xd1\xca\x9f\xd8\x8a\x96\x52\xe3\x3d\x76\x1d\x7b\xf2\x9a\x96\x75\x22\x8a\x31\xd9\x19\x71\x9d\xea\xdc\xe1\xa2\x4c\x5b\xba\x2c\xce\x1d\x18\xbd\xef\xdc\x71\x9f\xb9\x24\xd0\x50\x0e\x42\x7d\x54\x02\x80\x67\x7d\x91\x47\xbf\xc6\x23\x83\x87\x07\x07\xbf\x5b\x88\xc2\x51\x9c\x39\x3e\x81\x4f\x85\x08\x85\x6c\x98\x15\xc9\xc5\xe5\x44\xaa\xf9\x7d\x14\x6d\xac\xf2\x6b\xbd\xd4\xbf\x56\x63\xa4\x60\xdc\x94\x1d\xc3\x3e\x3e\xcf\xd5\x53\x75\xc6\xad\xd5\x19\x8f\x3b\xd1\x63\x87\x6b\x2e\xee\x73\x4b\x91\xcf\xd2\x4b\xf3\x59\x85\xdc\xb6\xc8\x13\xc3\x7d\x31\xbb\x66\xa2\x77\x1a\x5d\x23\x01\x9b\xcd\x35\xcc\x04\x0b\x1c\x4f\x16\x1f\x2b\x04\x14\x06\xaa\x68\xcd\x0c\x53\x1d\x60\x7c\x21\x85\x18\xd2\x6f\xd6\x48\xf2\xae\x61\xe2\x1c\x0e\xe1\x27\xb3\xfa\xc9\xac\xbe\xfd\x7a\x32\xab\x9f\xcc\xea\x1c\x66\xf5\xce\x15\x0c\x79\x79\x8a\x20\x88\xae\x10\xb0\x43\x74\x70\x36\xcb\xe3\x3b\x33\x53\xad\x67\x29\x66\x7c\xfe\x86\x36\x83\x0d\xe8\xf0\xa4\x15\x63\x38\x7c\xec\x32\x1b\x00\x9a\xaa\x91\x0d\xb4\xe8\x73\x30\xa2\x30\xfd\x0f\x6f\x99\x0d\x3d\x8c\xdc\x86\xcb\x56\x04\x32\x80\xbf\x23\x52\xfa\xfa\x46\x6d\x3f\x99\x72\xd3\x69\x12\x9a\x19\xec\x07\x86\x3d\x57\x89\x14\xa4\x70\x08\xef\x60\xff\x44\x7d\xea\x32\xd8\x54\x82\xc8\xc2\x78\xa8\xd1\xd0\x3e\xec\xc5\x8b\x17\x2f\xb0\x77\xcc\xef\x7f\xff\x7b\x22\x15\xa1\xa4\x64\x05\xaf\xd7\x6f\x84\xbb\x7e\xfb\x32\xb1\xbd\x82\xbd\xfe\x76\xf8\xe6\x7b\xc0\x65\x69\x8c\xc6\x0e\x8d\x48\x91\x7d\x70\x6f\x50\x3d\x22\xff\xe7\xfc\xdd\xdb\xae\xf5\x5f\xff\x5b\xf0\x9a\x84\xe9\x4c\xa7\x27\x0e\xdf\xbe\xf8\xdd\x37\xdf\x0c\x78\x12\x38\x5c\xa4\xe2\x0e\xce\xd8\x43\xcc\x50\x7b\x1e\x2b\x86\x3d\x79\x40\x81\xf0\x16\x2c\x02\x80\x99\xe4\xf6\x20\xc4\x2b\x28\x35\x9f\x2f\x8c\x83\x89\xb5\x5b\xbc\xe2\x85\x41\x45\x00\xc1\xb5\xa4\x43\x6b\x86\x4d\x8f\x34\x04\xeb\x7d\x40\x02\x4b\xc9\x46\xa4\xe2\x97\x8c\xcc\xf4\x5f\x94\x6c\x9b\xae\x91\x2f\xf6\x2c\xf1\xd8\x47\x48\x44\xc7\xfb\xc9\x7d\x30\x77\xa5\x92\x7a\x50\x06\x4a\x2e\x21\x03\x44\xac\xb8\x1c\x1c\xf2\x69\xd7\x18\xb6\xa1\x3c\x80\x1d\x41\xd9\x26\xea\xb2\x7d\x1d\xb9\x48\x04\x94\xb3\xd7\x51\x38\x51\x7c\x03\x87\x46\xc9\xff\x46\x26\x07\x88\xdf\xe8\x44\x07\x68\x5c\xcb\x73\x1e\x18\xb7\xcb\x4c\x4c\x1e\xff\x92\x21\xf4\xad\xb5\xd7\x98\x08\xad\x16\xe1\xed\x01\xc5\x36\x9a\x1b\xfb\x45\xc5\xb5\x25\x0d\x3a\x02\x39\x8a\x93\xc7\xde\xf0\xa6\x61\x34\xd8\xf7\x1a\x77\x44\x2b\xd6\x46\xc5\x4e\x1a\x03\x46\x86\x23\x1d\x5e\x90\xfa\x2e\xb8\xdd\xd8\x08\x90\xee\x9a\xcc\xb8\x7b\x3d\x17\x84\x05\x4b\x6f\xdb\x1f\x2d\xa9\x66\xa6\x75\x4b\xcf\x94\x92\xca\xbe\x2b\xd3\xda\xf5\x57\xab\xa9\xba\x64\x65\x38\xff\x26\xe4\xcc\x4e\x8a\xef\x6f\x33\xc0\xc5\x53\x51\x6b\x85\xa1\x13\x9f\x2e\xe1\x35\x9d\xc1\x0e\xc4\x3d\x9b\x4c\x9e\xa1\xe0\x95\x8a\x68\x43\x95\x93\x86\xf6\xf3\x61\x92\x67\x8b\x79\x6b\x3d\xb9\xf1\x86\x36\xd0\x02\x1b\xf4\x4c\x60\x00\xf0\x61\xc0\x3b\xbb\xc3\x87\xba\x35\x4a\x3f\x5b\x32\x78\x18\x86\x3a\xdc\xf1\x1a\x27\x23\xac\xfb\xdf\xdb\x89\x19\xb2\xcf\x07\xbb\x49\x40\x52\x0d\xf9\xf9\x0a\x03\x5c\xf6\x31\xeb\x8d\xf4\xd2\x68\x98\x41\x9e\xc9\xf8\xad\x07\x28\xe1\x78\xe5\x74\x0b\x21\x3d\xfd\xe4\x9c\x4f\xd2\xc4\x0d\x7a\x7f\xaa\x01\x7b\x08\xaf\x1d\x52\xc0\xf1\xda\x35\x35\x1c\xaf\xd3\x19\x88\xf2\x95\x23\xdb\x1d\x35\xb1\x51\xe5\x75\x0d\xbb\x76\x43\x07\xdd\x9e\x06\x8d\xd7\x56\xf4\x68\xbc\x72\x68\xd3\x78\x0d\xd7\xa9\xf1\x1a\x92\x06\x8d\x57\x5e\xc1\xe1\x93\xa9\x71\x31\x9c\xda\x81\x9a\xc5\x2c\x30\x00\x44\x3d\xc1\xa7\xe2\x85\xf1\x60\x79\xe1\x94\x1a\x14\x19\x74\xaa\x65\xd5\x1a\x1c\x38\xd7\xa3\x63\x7d\x09\x5e\x88\x55\xd0\x93\x62\x90\x92\xb4\x3a\x48\xa4\x7b\x81\x76\x8c\xea\xca\xf0\x11\x76\x33\x87\x7f\x48\x28\x24\x17\xdb\xe6\x0d\x81\x6c\x3f\xfc\xb1\xf5\xd0\x47\xee\xb0\xc7\xae\x85\x3c\x72\x82\x4b\x24\x86\x3a\x82\x7f\x34\xc7\xde\xf1\x0f\x0b\xd8\x82\xd7\x0b\xe6\x8a\x5c\x22\xe3\xd7\x2a\x59\xf6\x08\x05\x8b\xdc\xf7\x5b\xc5\xa6\x3e\xdb\x8a\x96\xe7\x0d\xf7\x14\x9a\x0f\x0f\x22\x68\x4e\xf6\x8f\x02\x66\xb6\xaf\x97\x3d\x15\x86\xa9\x19\x2d\xd8\x41\x1c\x5c\x60\xcd\x82\xd5\x4c\xd9\x89\x77\xf7\x79\x08\xe6\x05\x15\x65\xe5\xa0\xcf\x71\x17\x11\xf6\xc1\x30\x65\x17\xa9\x4b\x3e\x4b\x52\x1e\xb7\x0d\x98\x05\x94\x6f\x23\xd6\x01\x03\x6f\xfb\xac\x41\x2a\xbc\x7a\x24\xa2\x93\xa7\x5b\x56\xdf\x37\xcd\xb2\x80\x8e\x03\x4c\xe9\x12\xf4\x48\x0a\xd0\x8a\x41\xdc\x2f\x65\xab\x30\xe1\x36\xe4\x51\x16\x52\x29\xab\x9f\x03\x41\x54\x13\xc5\xe6\x5c\x1b\xe8\x0e\xe3\xbb\x5a\x62\x87\x89\xad\xe1\xf1\xec\x54\x26\x5f\x48\xd9\xbb\x05\xe9\x28\x79\x0c\x67\xd1\x35\x4a\x5e\xf1\xd2\x1b\x74\xf1\xf9\xcc\x35\x69\xa8\x8e\xf0\xd3\xa9\xd6\xb2\xe0\x10\x00\xeb\xb8\x28\x79\x7c\xf4\x84\x82\xb9\x58\x32\x63\xad\x7b\xc1\x7a\xc8\xb7\x71\x92\xa1\x24\xb4\x69\xaa\xe4\x4a\x9b\xc1\x6c\x21\x64\xc9\xce\xda\x69\xc5\xf5\xe2\x7c\x57\x12\xa7\x36\xd1\x84\xc5\xc9\x6b\x15\x4d\x37\x25\x50\x0d\x48\xda\x12\x9a\x83\xc5\x65\xf5\x25\x6b\x60\x72\x29\xc0\xd5\x45\xb5\xf6\xa3\xc6\xa2\x46\x82\xde\x59\x31\xc3\xfc\x57\xe9\x7a\x74\xf7\xde\xae\xf7\x84\xb5\xc9\xed\xa7\x3f\x88\xa6\xf7\x79\x41\xab\x6a\x80\xe7\xa3\xaf\x62\x7b\xed\x05\x5d\x00\xbe\x8f\x05\x6e\x18\x6e\xf7\x92\x9f\x65\x28\x29\xc3\xd3\x6b\x82\x1d\x40\xd3\x55\xdc\x8d\x0b\xa7\xa3\x36\xff\x52\xf8\xd5\x1d\x59\x85\xdc\xff\x20\x70\x00\xc2\x77\xe1\x3e\x7e\x4a\x67\x7b\x4a\x67\xfb\xc8\xb5\x75\x9b\x8e\x3c\xa5\xb3\xdd\xf5\xda\xc5\x74\xb6\x9d\x4b\x39\xf7\x8e\x6b\x3c\x1e\x69\x39\x06\x34\x41\x4c\xba\x6a\xb1\xdc\x27\x68\xa9\x43\xb5\xe0\x8f\xe0\x0e\x6c\x2d\xe5\x1b\xdf\xeb\xd0\x18\xc5\xa7\xad\x49\x17\xc5\x79\x73\x0d\x3b\x7a\xc0\x3c\x65\xda\xe9\x0c\x63\xb7\x64\x45\x74\x78\x38\x27\x7f\x38\xd1\x22\x4d\x63\xa0\xa9\x34\x09\xb6\x0b\x98\x2d\xf8\xe1\x33\x4d\x4a\x59\xb4\x35\x13\xa6\xe3\x90\xae\xd6\x05\xe3\x2c\x5b\x3c\x55\x69\x59\x72\x54\x4a\xce\x32\x9c\xaf\x83\xc4\x51\x29\xaf\x85\x3d\x8f\x0e\xcf\x92\x10\x7e\xfb\xe8\xbe\xdd\xb3\x62\x37\x86\xff\x98\xd8\xcf\xe9\x14\x7a\xd2\xbb\x96\xab\x4f\x29\x93\x1b\x1f\x91\x67\x9b\x6e\x8a\xcc\x1a\x49\x5a\xcd\x6e\x4d\x89\xec\x22\xab\x59\x47\x7e\xca\xce\xdc\x8d\xb0\xf0\x53\x76\x66\xea\xc8\x4f\xd9\x99\x69\xc3\xf7\xe4\xd9\x29\xa6\x58\x5a\x75\xae\x72\xbd\x3d\x7b\xe7\x83\xcb\x4c\x18\xb0\x50\xbb\x95\x55\x76\xdc\x9d\x89\xe8\xdc\x58\x05\xfe\x5d\xf1\xc3\xa0\x2c\xec\xe2\xe0\x51\xd1\x9c\x3f\x34\xc1\xd8\xfc\x1c\x32\xd0\x76\x20\x83\x0c\xe6\x72\x80\x4f\x10\xaf\x3e\x5a\x5c\x07\x3d\x88\xdd\xb8\x31\x45\x37\xca\x11\x6e\x64\xf9\x0a\x1b\x50\x53\x21\x24\xaa\xa8\x7a\x84\x0d\xbc\xf5\xc8\x81\x5f\x80\x91\xda\xd0\x02\xbd\x64\x2d\x2f\x41\xa6\x76\x08\x95\xa9\xd8\x71\x78\x65\xe1\x02\x92\x89\x13\x08\x70\x03\x4c\xd1\xd9\x10\x96\x20\xd9\xd8\xc2\x5e\xb4\xe1\x3f\x32\xa5\x07\xf4\xb6\xeb\xae\x7e\xe3\x5d\x7c\xaa\xe7\x06\x5d\x2c\x58\x4d\xe1\x9f\xaf\xfd\x14\x58\x01\x69\xad\x4e\xc3\xb0\x7d\x1d\x53\xb5\x26\x72\x36\xea\x55\x60\xef\x5d\x0d\xe9\xe8\xe6\xaf\x4c\xce\x0c\xe2\x37\xd3\xd9\xe0\x74\x23\xb2\x3a\x61\x67\xbd\xe4\x20\xbb\x91\x40\x8f\xb4\x7b\xcb\x87\x9f\xba\x44\x6d\x38\x44\x70\x86\x77\x68\x72\xf2\x7b\x6a\xf0\xda\xb5\xac\xd0\xd4\x6c\xd0\x51\xc8\x18\xe8\xab\xec\x03\xc9\x79\xca\x06\xed\x5f\x4f\xd9\xa0\x4f\xd9\xa0\x59\xb3\x41\x23\x65\xc7\x9f\x5b\x1b\x12\x3b\xe3\x3c\x06\x9f\xdd\x39\x65\xde\xee\x77\x1e\x07\x9f\x9c\xe9\x33\x33\xa5\xea\x17\xa0\x3c\x9b\x4c\x9e\x61\x09\x4a\xe7\xa2\x68\xcd\x6c\xfc\x07\xc2\x44\x21\x4b\xfb\x9c\x0b\x78\xbe\xd2\x06\x54\xf8\x2e\xce\x13\xd3\x52\xfb\xb1\xe2\x22\x16\x78\x76\x0e\x8d\x6a\xf0\x51\xe1\x7b\x39\xbe\xce\xaf\x98\x0e\x16\xee\x9d\x3a\x1b\x3a\x4e\xba\x29\x2e\x7c\x46\x93\xd3\x6b\xfd\xf7\x9a\x54\xbc\xe6\xd0\xde\xa4\x04\x09\xc7\xb4\x19\x16\xe8\x22\x64\x1f\x1f\x39\x29\x9a\x76\xe4\x1e\x3f\xa9\x59\x2d\xd5\x72\x14\x86\xb0\x5f\xf6\xc6\x74\x77\x1c\x80\x12\x5d\xb4\x4a\x31\x61\xaa\xe5\x30\xc0\xf7\xee\xda\x41\x6d\xda\xaf\xc0\x8e\x28\xd3\x81\x41\x86\x34\x62\xe8\xae\xbe\x0c\xea\xf2\xe9\x20\xd4\x1c\x66\x11\xce\x4e\x07\xec\x37\xea\xb2\x18\xed\xa7\x4c\x5c\x91\x2b\xaa\xf4\xb0\x3d\x4f\xf2\xea\xcf\x25\xbf\xe2\x5a\x26\xe7\xa0\x45\x0f\x8a\xa7\xe7\x3c\x44\xd0\xec\x4e\x95\xad\x69\x5a\xe3\x8e\x13\xbf\x7d\xd9\x87\x46\x5a\x25\x2d\x6c\xdb\x15\x43\xe3\x65\x6a\x80\xb2\xbb\x1a\x6a\x0c\x53\xe2\x15\xf9\xbf\xfb\x3f\xff\xe6\x5f\xe3\x83\x3f\xef\xef\xff\xfd\xc5\xf8\x3f\xfe\xf1\x9b\xfd\x9f\x27\xf0\x8f\x2f\x0f\xfe\x7c\xf0\x2f\xff\xc7\x6f\x0e\x0e\xf6\xf7\xff\xfe\xdd\x9b\xbf\x5c\x9c\x9d\xfc\x83\x1f\xfc\xeb\xef\xa2\xad\x2f\xf1\xaf\x7f\xed\xff\x9d\x9d\xfc\xe3\x13\x1f\x72\x70\xf0\xe7\xff\x35\x98\x74\x2a\x96\xef\x06\xca\x61\xbc\xc6\x19\xf5\x81\xfe\x13\xb3\xb0\xdf\x8a\x95\xc2\x85\x19\x4b\x35\xc6\x47\xbf\x82\x9e\xd2\x03\x07\xf0\xec\x95\x7b\xff\x77\x3a\x48\x38\x97\x82\x81\xb8\x43\x1b\xfc\x3e\x6c\xc0\xcc\x25\x17\x90\x12\x72\xcc\xb7\x86\x36\xea\xc7\xef\x43\xac\x18\x56\x37\x52\x51\xb5\x24\xa5\x0b\x39\x2c\xef\xa1\x8d\xcc\xc0\x46\xd7\x40\x7a\xc9\x53\x76\xf5\x96\x43\x96\x35\x2b\x79\x5b\x6f\x3b\x5a\x89\x54\xc4\x0b\x7f\x6d\x97\x18\x32\x96\xe4\x2c\x64\xc0\xbb\xdb\x5c\xcc\x78\x4a\x8b\x4b\x74\x22\x04\xce\x18\x12\x59\x62\x31\xe4\xf0\xde\x9e\x4b\x75\xad\x19\x15\x21\x72\x0a\x69\xd9\xb2\x64\xcf\x74\xb8\x17\x49\xca\x12\xac\xc4\x94\x2c\x57\xd3\xb5\xef\x06\x38\xb0\xa6\xd0\x1b\xd0\x5f\xb7\xd6\xc6\x7d\x00\x77\x93\x2c\x8d\x09\xf8\x3f\xd9\xf7\x56\xd7\xdf\x36\x9b\x06\x42\x7c\x8e\xbe\x91\xe0\xd6\x71\x8d\xae\x66\xa4\x92\x45\x54\xb0\xd1\x53\x45\x81\x51\x4f\xbc\x88\x1b\x9a\xad\x64\xd9\xd5\x52\x83\x36\x10\x84\xd4\x2a\x8d\xf9\xd6\xbc\xa0\xd3\x8a\xa1\xeb\x08\xf8\x66\x30\x8f\xda\xc1\x6a\xfa\x81\xd7\x6d\x4d\x5a\x6d\xdf\x4c\x8a\xfe\xb3\xbb\x17\xbb\xc6\xad\x89\x7b\xa5\xe6\x02\x7e\xd4\x73\xb3\xa5\x07\xaf\x16\x8c\x9c\x87\x15\xe8\x9c\xbe\x98\xbe\xe8\x7c\x3a\xba\x05\xd3\xdf\x51\xe7\x0c\x50\x39\x83\x34\xdb\x60\x87\x68\x02\x78\x0e\xc9\x8d\x33\xc9\xba\xc0\x10\xbc\xea\x4b\x0c\x90\x5f\x8b\x68\x81\x5a\xe1\xea\xa1\x1e\xeb\x3e\x7e\x74\x5a\xfc\x40\xdd\x3d\x97\xc6\x9e\x45\x4f\xcf\xae\x9d\x87\xfa\xb2\xad\xa9\x7b\xa1\xc0\xad\xa7\xef\x39\x7f\xf4\x86\x62\x37\xea\xeb\x8c\x82\x80\x1d\x02\xb3\x7e\x11\x7c\xdf\x4e\x79\x2c\x96\x85\x6b\x20\xc4\xbb\x1c\xc5\x90\xa7\x86\x7b\x17\x80\x78\xc6\xf6\xff\xbc\x8f\xdc\xa7\x2f\x4d\xd9\x0c\xd3\xfb\xf1\x37\xe0\x5f\xd4\x69\x90\x40\x18\x25\xa8\x98\x01\xe4\x21\x26\xc2\x43\xa1\x46\xa1\x96\x57\x56\x84\x24\x3d\xf9\x07\xed\x12\xec\x78\xe2\xb6\xa0\x07\x3d\x44\x49\x8d\x0e\x3f\xc1\x58\x89\x28\x49\x55\x37\x03\xaa\x15\x89\xef\x3f\x3d\x20\x33\x46\x4d\xab\x30\x77\x5d\x48\x05\x11\x11\x14\x62\xe8\xca\x57\xcc\xb2\x00\x34\x76\x52\xb2\x26\x5a\xd0\x46\x2f\xa4\x01\xb7\x31\x6d\x68\xc1\x4d\x32\xbc\x8d\x51\xb4\xb8\xb4\x4f\x86\x2c\x26\x78\xb3\xb4\xd7\x28\x0e\x5c\x8d\x7e\xcc\xab\x7d\x5c\x29\xb3\x50\xb2\x9d\x2f\x00\x78\x08\xef\x2a\x2a\xaa\x11\xe5\x2a\x2d\x01\x71\xe3\x98\xce\xd1\xa9\x49\xb9\x14\xb4\xe6\x85\x5f\x3f\xa8\x22\xd3\x5c\xba\x04\x13\xa0\x25\x75\xda\x28\x39\x63\x4a\x73\x6d\x98\x30\x98\xeb\x72\x54\x51\x5e\x93\x7d\xcd\x18\x39\xf1\x5b\x1d\xbf\x39\x47\x33\x1d\x83\x5b\xe9\x65\x07\x71\xf2\x8c\x6b\x32\xea\x70\xa4\xed\x27\x3e\xa8\x17\x25\x94\xa6\xb7\x80\x70\xbb\x72\xe3\x2b\x1e\x0c\xd8\x8c\x9b\xe7\x4c\x2a\xa8\x10\x72\xfe\xb9\x2b\x26\x4a\xd9\x25\x56\x27\x8d\x75\x78\x76\xaa\x63\x87\x28\xca\xb4\x06\x47\x87\x2f\x5c\x13\xd4\xd0\xb9\x30\x48\xc4\xa4\xf1\xac\xc2\x25\x08\x17\x25\xbf\xe2\x65\x4b\x2b\x54\xb5\x92\xa7\xe9\xe8\xfc\x14\x89\xe4\xf3\x85\x19\x5f\x33\x08\x27\xa2\xae\xdd\x9d\x22\xfe\xd5\xf8\x5a\xc9\x2c\xd7\xa0\x94\x19\x62\x64\x9a\x40\x62\x2e\x8c\x6d\x27\xed\x9a\x2e\xa1\x9b\xb7\x2b\x7b\xec\x65\x9a\xbb\x15\x73\xc3\xce\x64\x9a\xce\x50\x7b\x2d\xcf\x31\x77\xe2\xc4\x1d\x82\x18\x2e\xa8\x00\xd3\x15\xa2\xd0\x96\xff\x41\xa6\xae\xcf\x5a\xaa\xc4\x69\x02\x07\x77\x8f\x42\xc5\x57\x53\xbb\xe3\x12\x3d\x32\x5b\xf6\x8a\x5c\x75\xbb\xf1\x82\xd5\x4d\x45\xcd\xd6\x13\xba\x7f\x8a\x82\xf2\x51\xae\xa0\x3d\x3a\xa8\x28\xc7\xb4\xb2\x22\xe3\xec\xc7\x23\x07\x5d\x86\x82\x3d\x4b\x65\xcc\x85\x57\x3f\x84\xb3\x70\xd0\x94\xdd\x28\xd3\xa1\xbb\xde\x94\x95\xa0\x0f\x38\x8a\x87\x94\x52\xca\x6b\xc1\x94\xdf\x57\x67\x3f\x1e\x8d\x08\x9f\xb0\x89\xff\x2b\x0c\xe1\xd5\x25\x23\xe7\x08\x4e\xe1\x21\x72\xd2\x33\x0c\x65\x39\xc1\x57\x8f\xe3\xd7\xf1\x98\xbf\xfc\xd1\x4e\x8a\xfd\xf6\x4f\xe3\x3f\xba\x03\x06\xfe\xfa\xc5\x6a\x6d\x03\xaa\xe9\x7e\x59\x79\x5a\x8c\x07\x00\xea\x8e\xfd\xeb\x97\x33\x59\x9e\x37\xac\x98\xe0\xf4\xeb\x5f\x06\x25\xbd\x12\xc2\x84\x51\xcb\x09\x39\x93\x50\x21\xc3\x4b\x14\x68\xf0\xae\x8a\xfd\xb7\x4f\xc8\x00\x36\x08\x51\xdf\x82\x1a\x26\x40\xfb\x15\xe9\xbd\xcf\x89\xc7\xd5\x84\x61\x41\xcc\x53\x98\xe7\x7d\x08\xd5\x21\xbc\xf8\x88\x18\x89\x8d\xba\x53\x4f\x5b\x7b\x1d\x0a\xc2\x3e\x70\x0d\x7d\x44\x70\x25\x81\x49\xa8\x83\x36\xf0\x26\x87\x25\xc6\xf2\x5d\xe8\x8b\xd3\xc8\xf4\x8c\x5b\x98\xc1\x2f\x85\x34\x5f\x86\xcd\xeb\x2b\xd6\xc0\xb6\x90\x84\x5e\x49\x5e\x92\x56\x83\xce\x29\x48\x2b\x20\x65\x61\x00\x84\xac\xe3\x9e\xe9\x92\xd4\x5c\x1b\x7a\xc9\x26\xe4\xdc\x9a\x23\x71\x1a\x31\xf2\x94\x20\xd3\x4a\x16\x97\xac\x24\xad\x30\xbc\x1a\xe4\x99\x09\x74\xc3\xd4\x46\xa6\x0a\x80\xc6\xb6\x85\xd5\x72\x1b\xc5\xc6\xde\x60\xc2\xbb\x06\x78\x8c\xf1\x40\x0f\xb3\xda\xad\xd5\x28\x6c\xd5\x05\x45\xd7\x6d\x53\xc2\x90\xae\xf6\x75\xa0\x30\x5a\xab\xd3\xb7\xf3\x29\xe1\x6f\xf7\x07\x30\x99\x9e\x90\xb7\x60\xb9\x54\xe9\x9b\x12\x8b\x26\xd0\xdb\xed\x32\x64\x04\x2b\x98\xd6\x54\x2d\xb1\xb0\x98\x1b\x5f\xd3\xde\x6a\x36\x6b\x2b\x30\x18\xd3\x27\x95\x8a\xd6\x12\x4c\x14\x2b\xa4\xd0\x46\xb5\x05\x70\x0d\x25\x53\x25\x2f\x99\xe8\x80\x3e\x06\x1c\x26\x71\xc5\x74\x57\xd4\x69\xd5\x6b\x21\x49\xb1\xa0\x62\xce\x02\x94\x30\xa9\x69\x09\x9c\xfc\x5d\x70\x7e\xa4\x4f\xa6\x0c\x7c\x41\x67\xc6\xaa\x85\x06\x18\x64\x6a\xad\x04\x9f\x8d\x94\xfe\x62\xef\x43\xc1\x77\x1d\x25\x34\x09\x5e\x6d\xb1\xd4\x70\x78\x46\xc9\x18\xac\xd5\x54\x87\x61\x86\x0c\x92\x9a\x19\x5a\x52\x43\x77\x05\x43\xe0\x0d\x5d\x86\xcc\x34\xcc\xd9\x07\xd6\x8d\x72\xf9\x9d\x99\xe0\xfd\x43\xb2\xe1\x31\xa0\xf5\xd9\x8f\x47\x83\xc6\x07\x87\x10\x70\x2b\x74\xc3\x32\x56\xca\xb8\xd4\x45\xd8\x55\x08\x1d\xe1\x11\x01\x2c\x69\x9e\x12\x3c\xc6\x59\x49\xca\x76\x70\x34\xbb\x53\x11\x86\xe4\x4e\x65\xc9\x9c\xb2\xfc\xb9\x2b\xcc\x71\xd1\x25\xa3\x17\xfd\xea\xf4\x8d\x86\x3e\xe6\x2c\x32\x61\xb8\x62\x11\xe0\xfa\x20\x12\x1c\xbf\xb5\x02\x25\x69\x9f\xf3\x90\x35\xe7\xcc\xe8\xae\xec\x12\x15\xca\x81\xa3\x1a\x67\x24\xe1\x1b\x81\xe5\xe7\xb9\xd1\xc5\x5a\x36\x4e\xc0\xa0\x31\x91\xcf\xb5\x74\x8a\xa3\x55\xb9\xb7\xce\x8c\xf9\xb2\xe6\x68\x61\xcf\xf9\x37\xb2\x1c\x9e\x7e\x97\x37\x0f\xb4\x47\x5a\x07\x6e\x83\x18\x50\x1a\xc2\x9d\x78\x03\xa4\x52\xeb\x1e\xb8\x3d\x6a\x32\x0b\x7a\x35\x18\x00\x3a\x39\x16\xd6\xf9\x2b\xc6\x3e\x2c\x86\xe4\x8e\x81\xdc\xf1\xcb\x81\x84\x0d\x2f\x40\xf4\xd7\xc0\x42\xc4\x3e\x41\x59\x72\xc4\xee\x01\xe2\xd5\x5f\xf6\x88\x3f\xcf\x92\x1f\x96\x9b\xdb\x3b\xca\x9c\xda\xea\xca\x05\x42\x61\x8b\x83\xc5\x64\xdc\x1e\xc2\xc3\xd7\xeb\xcb\x9e\x99\xea\x9c\x2b\x21\xbe\x81\x90\x52\xfb\x3e\xe0\x31\x71\x6c\xed\xbb\x6f\xf5\x6f\x3f\xc8\x4c\x0c\x58\xe5\x9b\x7d\xe0\x83\x47\x3a\x75\xd5\x91\xde\x73\xc5\x14\x54\xea\x44\xd0\x96\x56\xd4\x28\x59\x55\x4c\xc1\x12\xb8\xa0\xc6\x4a\x01\x98\x5d\x2d\x82\x69\x80\xe9\xfd\x38\xfc\xe5\xc3\x7c\xc1\xd5\x26\xd8\x75\xb0\xae\xa9\xc6\x4e\xd7\x3e\x03\x1e\xc2\x97\xbe\xaa\x6f\x13\x3d\xc3\x45\xde\x4f\x3e\x18\x78\x28\x96\x38\xf9\xc7\x11\x73\x62\xc8\x8c\xcc\x2d\xa9\x5c\x13\x26\xe8\xb4\xb2\xe6\x48\xc4\xc0\x81\xce\x15\xed\xd4\xc8\xe8\xae\xf7\x6c\x36\x7c\xea\x20\x86\x19\x3f\xf2\xd3\xc6\x46\xf5\xb6\xf7\xc3\x49\x57\x0b\xeb\x7c\x33\x19\x1a\x02\xfb\xcb\x71\x5d\x6f\x88\x7e\x7d\xd4\x0a\x35\x71\xb7\x99\x8d\x6f\x30\x94\xa6\x6c\xd5\x04\xf9\xea\x09\xa0\x5f\x08\x4f\x8c\x0f\xf4\x1f\x33\xc8\x4f\x88\x57\xbe\xb2\x04\xa8\xf2\x85\x92\xb0\x1c\xf9\xdd\xb9\xcf\x1d\x82\x61\x3b\xa0\xcf\xbb\x80\xe7\xf0\x87\xb7\x29\x42\xbe\xf3\x94\x59\xe9\xdc\x35\x9f\x1a\xbe\x2f\x08\xee\x8d\x78\xfc\x0d\xa5\x83\x9d\x98\xfb\x8e\x8b\x32\x14\x71\x7a\x50\x58\xab\xa0\x1d\x9e\x9d\x22\xd5\x79\x68\x7a\x0d\x67\xc2\xd2\x19\xbc\x66\xc1\x55\x39\x6e\xa8\x32\x4b\x0c\x6d\x8d\x7a\x14\x07\x3c\xc7\x0c\x43\x67\xcd\xb4\xb7\x9b\x29\x3b\xcb\xc1\x12\xf8\xb4\x44\x97\x37\x7b\x23\x87\xec\xda\x8c\x0c\x45\x89\xf4\x57\x6f\x46\xde\x76\xed\xd0\x42\x10\xe7\x91\xcc\xc8\x7d\x55\x8c\x93\xfe\x69\xb6\xbb\xba\xb6\x3d\x6a\x75\xbf\x76\x09\x55\x5f\xf0\x57\xb8\x30\xa4\x8c\x61\xc3\x82\x95\x09\x5e\x7e\xfb\xa4\x11\xe1\x33\xab\xb4\x49\x31\x86\xcc\xc7\xc1\xe4\x75\x69\x4f\xce\xd2\x9d\xb8\xf2\x66\xf4\xc0\x83\x60\x8a\xa8\x8c\x86\xee\xe4\x20\xd9\x17\x32\xdd\x41\xef\x2f\x90\xad\x38\xd6\x01\x56\xb4\xdf\x90\x49\x32\x1d\xde\xc2\x8a\x74\x9a\x67\xec\xba\x8f\xce\x02\xaf\x12\x73\x51\xda\x4d\x05\x2a\x12\x38\xf5\x75\x5b\x14\x8c\x85\x90\xa1\x13\x4b\xc3\x4d\xda\xde\xd9\xe3\xa6\xbc\xa6\xa6\x58\x30\x4d\xb4\x84\x5e\xc7\xda\xd0\xaa\x62\x65\x48\x75\x42\x46\x91\x60\x55\xb8\x34\xa8\xc1\x74\x44\xc6\xca\xf0\x29\x8e\x02\x23\x2e\xea\xda\x54\xd4\x05\x95\x66\xad\x28\xb0\x7e\x91\x9b\x65\xc8\x32\x59\x35\x4c\xc1\x0f\xad\x21\xd6\x36\xdc\xf4\x99\x61\xc6\x48\xe4\x53\x0e\xcc\x0c\x87\xff\x12\x8f\xfb\x05\xbd\x62\x5d\xb6\x87\xeb\x12\x69\x4f\xe9\x00\x75\x9b\x81\xd7\x23\xa8\xdc\x11\x5a\x08\xb1\xc2\x2e\x9e\xc5\xc9\xe0\x5c\xe4\x36\x65\xe2\x79\xd8\x8f\x26\x7d\xcd\xc4\x39\x08\xa6\x8d\x66\x26\x80\x78\x0f\xd7\x78\x89\xcb\x9f\xa7\xad\x91\x35\x35\xbc\x80\x10\x1d\x9f\x45\x49\x62\x35\x26\x5e\x58\x49\xe3\x13\xe1\x51\x45\x02\xc5\xcd\xad\x5b\x26\x31\xb0\xd9\x58\xba\x87\x89\x8f\xe6\xda\xad\x72\x7f\x5a\xfd\xb4\x44\xaa\x67\xa6\xf7\xbc\xf0\x88\xc8\xc4\x2c\x14\x63\x84\xd7\x8d\x54\x86\x0a\x43\x4a\x3e\x0b\x18\xdd\x3e\xc3\xf0\x36\x9e\xc8\xe1\x0f\xfa\x09\xf2\x6a\xa3\x51\x30\x60\x5a\x55\xf2\x5a\x13\x73\x2d\x43\xc8\xa1\xcb\xef\x72\x98\xc7\xa3\x3e\x31\x19\x74\x1c\x37\xaa\x3d\xea\x2c\x5f\x45\xe7\xd0\xc8\xca\x9e\x6b\x56\x55\xf6\xbf\xb7\x9d\x46\x83\x71\x4c\x36\xce\x09\x9f\x0b\x84\xa1\xe5\xda\x07\xbf\x1c\x86\xca\x7e\xa9\x64\xd3\xb8\xe4\x87\xfa\x20\xff\x9c\x40\xf2\xba\xba\x62\x1a\x8a\x4c\x3c\xae\x8b\x65\x85\x39\x13\x4c\x51\x03\xe9\x75\xae\x9f\x2b\xa8\x24\xab\x44\x0e\x0d\xfa\xe0\x95\xd1\x2f\xf2\x11\xa6\xc3\xd4\xcb\xcd\x4c\xe6\xef\x71\xdf\x66\x78\x2f\x2e\x90\xdf\xbc\xdc\xc9\xc0\x40\xfb\xdf\x32\x43\x0f\xc8\x0f\x1a\xd9\x22\x9c\xbc\x01\x87\xe7\x93\xbc\x6c\x0e\x6f\x1d\x1d\x6d\x19\x88\x3a\xac\x9a\x45\x44\x55\xec\x97\x0a\x10\x72\xfd\xb9\xee\xd1\x7b\xa4\xa4\xd6\x6f\xfd\x4f\x1e\x90\xf4\x27\x9f\xd5\x47\xae\x27\x9f\xd5\x93\xcf\xea\xc9\x67\x05\xd7\x93\xcf\x6a\xf5\xfa\x5c\x7c\x56\xa4\x3b\xae\x76\x55\x36\xbd\x8d\x4d\x97\xfe\x01\x7b\xcf\xf3\x4c\xc8\x5b\x69\x5c\x8a\x31\x58\xb0\xf4\xc6\xa0\x13\x85\x13\xfa\x9a\x2e\x27\x82\x19\xd7\xc9\xc4\xc7\x77\xdf\x7b\x9a\xfe\xa2\xac\x35\xe2\x5c\x1f\x91\xdc\xf0\x82\xcc\xb7\xb7\x89\x46\x31\x12\x55\xb3\x2e\xe3\x19\x3e\x7f\xa6\x5d\x5e\xab\xfd\x1e\x20\x0b\xe3\x07\x14\x6c\x42\xce\x5d\xad\xcb\xca\xe0\xeb\x4d\x16\x4a\x66\x28\x1f\xd2\xbb\x29\xbe\xbc\x36\x74\x71\x83\x76\xb6\x35\x6d\x87\xe4\xdc\x36\x01\x74\x69\xd7\x5c\xb1\x1d\x88\x5b\x54\x9d\x1b\xd7\xf4\x77\x37\xdc\x57\x86\xcf\xe9\x8c\xbc\x67\x85\xbc\x62\x0a\x57\xf7\xe4\x43\x43\x85\xe6\x52\xbc\xa6\xbc\xb2\x6b\xeb\xd7\xb8\x8b\x76\x93\x56\x33\xd5\x4f\x81\x8c\x52\x34\xc2\x06\x77\x8c\x64\xb9\x77\xb8\x81\x12\xba\x9b\xd8\xf1\x5c\x05\x5d\xa3\xd8\x15\x97\xad\xf6\xc8\x07\xad\x41\x4d\x43\x1b\xe7\x21\x5a\xf0\xf9\xc2\xdf\xec\x2b\x56\x21\xeb\x5a\x95\x61\x13\x0f\xa6\x4c\x1b\x6a\x5a\xdd\x87\x9f\x2e\x20\xf1\x70\x87\xb2\xaf\x02\x1f\xed\x8e\x11\x92\x53\x5d\x47\x04\x8a\x5d\x3d\x10\xbf\x47\x7c\x0c\x7c\xf4\xd4\xed\x65\x0f\xf5\xd1\xc1\x9a\x14\xb2\x6e\x5a\xc3\xa2\x3d\xef\x76\x57\x1e\x51\x7f\x47\x66\xea\xf5\x7f\x7a\x5e\x53\x41\xe7\x6c\x1c\x48\x1b\x77\x28\x1f\xcf\xb3\x49\xfa\x2c\x6c\x45\xb2\x37\xff\x89\xaf\x47\x87\xce\xd1\xbf\xb2\xe1\xec\x91\x7b\xc1\xda\x23\xf9\xf1\xf6\xc8\xfd\x63\xee\x91\x00\x81\xba\xab\x02\xe8\xbd\xa3\x6f\x55\x04\x39\x25\xe3\x36\x11\x94\xd3\x54\x76\xca\x86\xa3\x85\x6b\x22\x6b\x6e\x0c\xf3\xe5\x88\x41\xa4\x8c\x08\x37\x3d\x74\x4c\x27\x40\x21\xc0\x89\xd5\x83\xec\x43\x53\xf1\x82\x9b\xa8\x7d\x5d\x22\x80\xc4\xea\x05\x0e\x84\x6b\xae\x51\x95\x17\x84\xd7\x4d\xc5\x82\x06\x3e\x76\xe8\x42\x3e\x08\x17\xde\xa6\x80\xda\x14\xc2\x3e\x40\x28\x16\x09\x7e\x92\xdb\x77\xbc\x9e\xe4\xf6\x0d\xd7\x93\xdc\xce\x2e\xb7\x11\xbb\x74\x38\x14\x70\x4f\x5e\xfb\x87\xba\xee\x4b\x74\xca\x2a\xf2\x6b\xcb\xd4\x92\x58\x03\xab\xc3\x05\x91\x56\xd8\x69\x5e\x22\x7e\x85\xcf\xe9\xd8\xa1\x08\x41\x4e\xe5\x1c\x72\x46\x4e\x3e\x58\xfb\x16\xba\x52\x64\x3f\x25\x57\x07\xe8\xf7\xbe\xc2\x55\x08\x2b\x13\x5b\xa5\x58\x48\x15\x7f\x02\x26\xe6\xe1\xdb\xe3\x9c\x0e\x8c\x1c\x65\x2a\x24\x5f\xa9\x0a\xb9\x27\x25\x83\x90\xc3\x5b\xe6\x1a\xd7\x24\x7c\x03\xe7\x78\x28\x6b\x0a\xd1\x5c\x72\xc9\x96\x23\x57\xea\x49\x2c\x07\x52\x7f\x73\x26\x12\xb1\x7a\x1e\xd5\x9f\x4b\x86\x79\x1c\xc3\x7a\x95\xf6\xaf\xcc\x07\x62\xce\x50\x1d\x5e\x63\xfb\xda\xd9\x9e\xe5\x97\x28\xcf\x19\x9d\xf9\xcc\x27\xf6\x55\x73\x3d\x6a\x65\xcf\x58\xde\x71\xde\x6d\xe4\x79\xfb\x41\x40\xa3\x0c\x6c\x0e\x48\xa1\x20\xf0\xf3\xb0\x17\xc9\x1d\x4c\xc0\xcb\x2f\xe3\x3d\x4d\x56\x36\x01\x43\x22\x5a\xfb\x78\x86\x97\x6c\xf9\x4c\xbb\x36\x24\x52\xe8\x05\x6f\x40\x7d\x87\x64\x26\x39\xcb\xba\xc5\xf1\xfa\x11\xca\x61\x3d\x31\x78\x6e\x9c\x8a\x11\x79\x2b\x8d\xfd\xcf\x09\x80\x53\x80\x78\x39\x96\x4c\xbf\x95\x06\x3e\xd9\x69\x2e\xc0\x49\x7a\x0c\x3c\xe0\x72\x8e\x38\x64\xfc\xc0\xf1\x8a\xf8\xd5\x80\x55\xe8\xd6\xda\x57\x1d\x05\x7e\xe1\x9a\x9c\x0a\x22\x95\x5b\xa2\x8c\xe4\x80\x6b\x1e\x49\x42\x62\x7c\xbc\xbb\x4b\x0a\xdc\x44\x8d\xe3\x11\xa9\x7a\x2c\xf2\x20\x84\x39\xa2\x20\xea\x83\xdf\x40\x74\x0b\x72\x61\x3d\x74\x01\x80\x5e\x29\x6a\xd8\x3c\x43\x12\x6f\x77\xd5\x4c\xcd\xa1\x4f\x50\xb1\xc8\xbd\x1b\x72\x29\x5a\x78\x65\x54\xb7\xf0\xba\x87\x2d\x7b\xaf\xd5\xc2\x0f\x32\x00\xe8\xee\xdf\x03\xc4\xc7\xae\x7a\xcf\x22\x12\x51\x8b\xad\x69\x63\xe5\xcd\xff\xb3\xca\x2a\x6c\xaf\xff\x21\x0d\xe5\x4a\x4f\xc8\x21\xd1\x5c\xcc\x2b\xd6\xfb\xce\x05\x8b\xa3\xc7\x64\x22\x0b\x72\x59\xac\x7e\x78\x45\x2b\x86\x38\x4d\x54\x10\x86\xee\x2a\xc0\xe7\x5e\x31\x8c\x46\xe4\x7a\x21\x35\x6a\xbe\xa1\xc4\x60\xef\x92\x2d\xf7\x46\x59\x42\x61\x24\x3e\x9f\xed\xa3\x4f\xc5\x5e\xd7\x08\xae\x27\x89\x82\xee\x0f\x19\x8f\x7b\xf0\xdd\xde\xc3\xd8\x63\x8f\xc0\x5d\xf5\x28\x8a\x9c\x5c\xb8\xf1\xa8\xa2\x98\x22\xb0\x6b\xc1\xf5\x55\xfa\x56\x33\x7e\x00\xe9\x3e\xba\xa7\x4b\xef\x70\x28\x67\x3b\x17\xc5\x05\xdc\xe2\x4c\xe0\x19\x19\x98\x0b\xc9\x3a\x34\x46\xf1\x69\x6b\x98\xde\x59\x4e\xb8\x91\xd0\x08\xd6\x2d\xf4\x4f\xb5\x2b\xff\xe3\xa6\x1f\x44\x08\x78\x5c\xe7\x62\x8e\xd3\xd9\x6a\xee\x64\x04\xa9\x1b\xe3\x22\x48\xe5\x10\xf6\xd6\xaa\xf0\xec\xdf\x34\x90\xea\x30\xd4\x87\xa7\x53\x75\xc9\x9a\x8a\xe9\x46\x62\xd5\xd9\xc6\x89\x71\x8a\xe4\x82\x6a\xc8\xba\x9f\xb9\xa4\xa8\xa6\x55\x8d\x04\x2c\x74\x2a\xd6\x36\x63\x16\xdc\x08\x07\x12\xe2\x41\x98\x10\x70\x2e\xec\x5c\xbb\xdf\x43\xff\xcb\xc3\x95\xce\x2f\x52\x41\x33\x09\x57\x18\x20\x4a\x5e\x38\xbf\x10\x35\x44\xa4\x01\x18\xc7\xd7\x66\x06\xf2\x95\x4b\xe8\x16\x08\xf0\xf7\xc8\x4a\xde\x44\x40\xda\x99\x30\x90\x63\x23\xc8\xa9\x98\x31\xaa\xf9\xb4\x62\xae\xb8\x41\x1b\x6a\x32\xcc\x5f\x94\x90\xef\xe6\xd1\x9a\xd3\xa0\x45\x70\xa3\x57\x93\x6b\xf6\xb9\x28\xaa\x16\x78\x40\xf0\xea\x00\x5c\xd8\x54\x14\xac\x42\xdd\x46\x96\x01\x8d\x2b\x1b\x5e\x44\x94\x48\x34\x63\x4a\xe1\x7c\x4d\x97\x9b\x77\x33\x29\x25\xc3\x54\x64\x00\x52\x19\xe1\xeb\x6d\xae\x90\x71\xcb\x30\xfc\x80\xc1\xd9\xa2\xe4\x8c\xe1\xee\xc0\x95\x21\xd4\x1e\x25\xb3\x0a\x71\xe0\xdc\x59\x02\x33\xe4\x2a\x1d\xce\xa3\x8c\xa1\x11\x82\x82\x3a\xec\xce\xb8\xf1\xe7\x60\xf2\x1c\x40\xe6\xb6\xce\x2f\x5c\xa6\x71\x27\x99\xc6\x70\x7c\xb1\xc1\x81\xc7\xcc\xe7\xd7\x9b\xc1\xfd\xbd\xef\xeb\xc0\x82\x36\xd1\xbe\x25\x46\xaf\x55\x57\x57\x23\x7d\x4f\x3a\xcb\x8f\xb0\xe9\xe5\x8c\xbc\xe6\x15\xd3\x4b\x6d\xb0\xf8\x91\xd7\x28\xb8\xb0\x3c\x54\x1a\x82\x52\x01\x93\xe9\x50\x70\xd9\xd3\x2c\x4f\x20\x2b\xdb\x0a\x67\x57\x49\xba\xc7\x7a\x9d\xd2\x57\x65\xaf\xc1\xd6\xae\x4a\x20\x28\xd9\x0d\xf5\x50\x59\x56\x6b\xd0\x6c\xcd\x92\x60\x1d\x7b\xb3\x31\x2b\xfa\xbe\xd8\xd7\x7c\xaa\x18\x39\x5a\x50\x21\x58\x15\xf5\x8b\x74\xa9\x1b\xd4\x18\x5a\x2c\x50\x9a\x53\x62\x25\x49\xc5\xcc\x33\x4d\x16\x52\x1b\x52\xd3\x62\xc1\x45\x68\x34\x25\x42\xdf\xd4\x0e\x05\xf8\x11\x02\xdd\xcf\xf4\x85\x25\x20\x71\x9d\x73\x09\x17\xa4\xc2\x73\xec\xac\xdb\xd8\x20\x55\x8c\x24\x90\x06\x94\xa1\xc9\xde\xda\xb3\x43\x0f\x68\x2f\xa5\x60\xad\xd1\x53\x00\xe7\x26\xdc\x9b\x3e\xf2\xc9\x87\x09\xd9\x63\x1f\xcc\x37\x7b\x23\xb2\xf7\x61\xa6\xed\x7f\x84\x99\xe9\xbd\x09\x39\xad\x43\xa2\x10\x17\x91\x1a\xc1\xdc\x0f\x08\x9f\x91\x56\x0c\x2e\xea\x1c\x2c\xb1\xaa\x56\x64\xe1\x8f\x67\x55\x2b\xec\x12\xbf\x73\xad\x98\x5f\x91\xd7\x47\xc4\x50\x35\x67\xc6\x8e\x41\x44\x5b\x4f\x99\x4a\x6d\xd9\x9a\x23\x71\x64\x78\x9b\x7d\xc5\x68\xf9\x4e\x54\xc9\xb1\xbd\x5c\x1b\xca\xd3\xd1\x9f\xef\xe3\x28\x71\x6d\x46\x2b\xcd\xc8\xbe\xbd\xf1\xf9\xb5\xe2\x86\x1d\x4c\xc8\x7b\xff\x2b\x28\x7f\x07\x5d\x74\x26\x87\xe8\x7b\x58\x35\xe2\x1e\xaa\x99\x41\xcc\x62\xe1\x6c\x90\x37\x76\x53\x27\x6b\x81\xb8\xe0\x53\x29\x2b\x96\x08\xe9\x8e\xbc\xf7\xd3\x4f\x6f\x93\x5d\x63\x7d\xfe\xee\x9e\x77\x13\x9b\x5f\x4b\x55\x95\xd7\xbc\x74\x85\x47\x64\xdf\xde\x7c\x30\x8c\xe5\x87\x84\x16\x06\x06\x12\x72\xb7\xb5\xcb\xe3\xc3\xbf\xbe\xe6\x65\x9e\x15\x1d\xb0\x01\x81\x88\x3e\x0f\x78\xc7\x88\xe5\x01\x02\x4c\xc0\x4b\x26\x8c\x15\xee\x4a\x93\x7d\xf8\x45\x3a\x8e\xe6\x09\xc7\xbe\x27\x30\xae\x54\xa4\x90\xf5\x94\x8b\xae\x2d\x51\xc7\x9b\x56\x81\xb1\xf2\xd6\x47\xdc\x34\x33\xd8\x4b\x00\x50\x0d\xa5\x59\x10\xcd\xeb\xb6\x32\x54\x30\xd9\xea\x2a\x19\x4e\xe3\x89\x3d\xd7\xae\x59\xc5\x3e\xa0\xec\xdb\x56\xd3\xc5\x8e\x82\xbe\x66\x0c\x48\x15\x5d\x67\xb8\x55\xd5\x38\x69\xac\x0e\x1e\xa9\x7c\x1e\x54\xeb\xd0\xe7\x84\x7d\x60\x85\x43\x51\x6d\xaa\x76\xce\x13\xbd\x33\xc7\xf6\x2d\x0a\x6a\x58\xf9\x8a\xbc\xee\x5e\x0e\x30\xba\xfc\x37\x13\x72\xe4\x73\x1a\xdd\xf0\xe4\xe8\xfc\xf4\xd8\x35\x07\x13\xda\x30\xba\x0d\xdd\x7d\x58\x02\xd5\xd8\xb9\x62\xb7\x60\x34\xe0\xc0\x59\x44\x6c\xd7\xa1\x6d\x35\xfe\xe1\xbe\x71\x9d\xb7\x43\x07\xe5\x61\xcd\xac\x06\x8b\x84\x27\x7b\x69\x6b\xf6\x52\xdc\x70\x39\x22\xab\x64\x0d\x13\xf6\xcc\x13\xf1\xfe\xc7\x79\xde\x1a\x9b\x48\x58\xe3\x4c\x7a\xa5\x7b\x58\x5f\xa9\x8c\x7c\xe4\x0b\x59\x95\x9a\xb0\x0f\x46\x51\x7b\xec\xd7\xf6\x80\x0f\xbf\x99\x11\x2a\x96\x93\x61\x2a\xe6\xa0\xb0\x74\xde\x50\xf4\xe0\x95\xd9\x6d\x0b\xad\x7c\xb2\xd0\xe2\x4b\xb3\x42\x31\x33\x00\x46\x2d\x5b\xe3\x7f\x4f\x48\x7f\xb9\x7a\x1f\xaf\x39\x58\xf1\x5b\x0f\xd2\xe0\xd2\x4a\x86\xf8\x8d\x35\x13\x9a\x1b\x7e\xd5\xeb\x0e\x0a\x30\xa8\x54\xeb\xe0\x87\x04\x65\xca\x09\x40\xdd\x43\x28\x4d\x1e\x18\xe3\x93\x7c\x46\x84\x5c\x79\xab\x18\xba\x22\xc4\x09\x7b\xb7\x24\x0f\x1a\xf2\x70\x6a\x6c\xac\x4d\x05\x00\x1e\xe2\xc3\x47\x80\xb5\x86\xff\xc6\x54\x1c\x3b\x07\x91\x37\x16\x66\x21\x7d\xa6\xdd\xec\x6d\x4f\x6c\xe6\x48\x39\x1f\x8a\x50\x93\x33\x76\xf4\x36\x52\xed\x3c\x38\xc9\xb0\xf0\x42\xbf\x93\x1c\x9b\xcd\x58\x61\xf7\x06\x74\xaf\xf3\xad\xd8\xac\x59\x5b\xb6\x08\x00\xe2\x01\x49\xfb\x80\xa2\x43\xa1\xf7\x22\x98\x89\x2e\x7b\xf5\x54\x68\x43\x01\x23\x12\xde\xd8\xea\x69\x56\x79\x72\xfd\x07\xdd\x76\xc2\xe8\xb5\x47\x9a\x1c\x48\x44\x6d\xd5\xb0\x82\x29\xbb\x63\xaa\x25\xb9\x56\x72\x68\xd1\xd6\x1d\x63\xab\xf2\x8a\xa9\x2b\xce\xae\x9f\x3b\xc4\x9a\xb1\x7d\xd9\xb1\x03\x01\x7c\x0e\xee\xae\xe7\x5f\xc0\x7f\x06\x50\x95\x29\xfa\xe6\x4e\xd9\x57\x64\x6f\x2f\x87\x5f\x60\x70\xea\xda\x0c\x9a\x70\x26\x19\x54\x79\x7c\x02\x30\xfc\x4a\xa8\xcc\x7d\xe8\x1c\x02\x9f\x12\x1a\x73\x67\x4d\xa4\x90\xdb\xcd\xee\x1f\xe4\xda\xb7\x10\x6d\xf9\xa4\x03\x59\x6a\x85\x48\xae\x2f\xec\xdb\xfe\x38\x4c\xcf\xf0\x0f\x09\x9e\x5c\x8c\x8d\x62\x2c\xbc\xaa\x71\xe6\x93\x90\xbe\xf1\x79\x30\x6c\x1e\x61\x10\xaf\xa4\x86\x6a\x66\x86\x04\x93\x73\x89\xfa\x88\x14\x3b\xbf\xb1\xd4\x77\x5f\x41\xbe\x15\x03\xa4\x6a\xdf\xdb\x91\x8c\xff\xe4\x4c\x7f\xd1\xbb\xd3\x1a\xfd\x6e\x5d\xd3\x4f\x72\x44\x24\x82\x6e\x2d\xe8\x03\xc2\xb1\x3b\x26\xd9\x96\x8d\xe8\xde\xf2\x87\x1f\x4e\x8f\xf3\xb8\x52\xba\xe7\x79\xcf\x00\xfc\xbb\x3f\xfd\x6e\x93\x72\x4d\x5a\xc1\x7f\x6d\x63\x27\x34\x74\xed\x0f\x1b\xc9\xdd\xbf\x8d\xd9\x99\x17\xac\x4b\x4e\x38\xe6\xfa\x72\x5b\x92\x71\x8d\x90\xbe\x8c\xfc\xcb\xd1\x09\x71\x9f\xde\x96\x49\x90\x34\xf4\xc3\x64\x1f\xf4\x65\xe8\x5f\x8e\x4e\x56\x5e\x77\xc5\x8d\x7a\x58\x55\xde\xd7\x23\x85\x0e\xa0\x9e\x4e\xba\x66\x9a\x62\x90\xcd\x56\xa3\x57\xac\xe4\x0a\x53\xd5\xfc\x5b\x96\x93\x42\xf3\xd0\xf4\x6c\x7e\xc9\x26\x5c\x46\x69\xa9\x69\x53\x30\x28\x8b\x4c\x7f\x31\x2f\x58\x97\x10\x5d\x72\x7d\xf9\xf8\x3c\xc9\x4d\xf9\x36\x0d\xe4\xf6\x73\x4b\x3f\x59\x75\x77\x3a\xd9\xe9\x94\x20\xd8\xdd\x4b\xd9\x92\x6b\xd7\x7b\x7c\xa0\x9b\xf5\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x85\xee\x2a\x09\xd6\xc2\xbe\x77\xa7\x2b\x34\xd9\xd7\xaf\xb6\x9c\xaa\xb2\x13\x5b\x91\xe4\x38\xdb\x1b\xaa\x0c\x78\x3d\xb7\xcd\xda\x81\x10\xaf\x12\x44\x1f\x88\xfb\xe4\xed\xd3\x99\xc7\x50\x1a\xb9\xde\xb0\xe8\xb9\xe7\x3a\x3c\xbc\xcb\x98\x06\xed\x2f\x07\xff\xbe\x96\xc1\x62\x79\x5e\xb2\xab\xe7\xba\xa4\x2f\x47\xf0\x5a\x1e\x03\xb2\x3f\x07\x54\x93\xbd\x97\x7b\xe9\x23\x9f\xf3\x9a\x57\x54\x55\xd8\x13\x25\x34\x9b\x09\xcf\xb7\x27\xa4\x27\x04\xca\xce\x5e\xec\x91\x7d\xa9\x80\xa2\x82\x0a\x52\x31\xdf\x3f\xc5\x49\xd2\x25\x3a\x07\x0e\x3e\x93\x2d\xb4\xed\x7c\x2c\x3c\xd8\xb6\xbe\x09\x4b\x6f\x0f\x39\x9d\x3b\x8e\x73\x9e\x1d\x77\xea\x23\x17\x56\x07\x9b\x90\x1f\x9c\x66\xe7\x74\x73\xe4\xda\x12\x14\x32\xbc\xe3\xf3\xe0\x8e\xcf\x29\x8c\xb3\x12\x90\xb9\xd7\xc0\x0a\x59\xcf\xe4\xfb\x4c\x38\x22\x35\x58\x34\xe7\xe6\x3d\x6b\xe4\xd6\xec\x44\x1c\x7e\x25\xa5\x86\x1b\xfb\x81\xd4\xdc\x48\xb5\x24\xd4\x10\x8a\x27\x43\xd1\x56\x54\x11\xc5\x30\x39\x26\x83\xd9\xe6\x46\x5f\x31\xd6\x2e\x64\x97\x81\x13\x63\x18\x3a\x37\x74\xa0\x6f\xe4\x4e\xe3\xc4\x18\xdd\x89\x3d\xaf\x8e\xb9\xb2\x52\x5a\x62\x55\x18\x37\x47\x61\x30\x84\x53\xaa\xa4\x70\xd0\x46\x76\x44\x97\x85\x33\xe7\xc6\xb5\xd8\x45\x02\xec\xd7\xfe\x69\x49\xa4\x00\x05\x20\x53\x65\xf9\x4c\x77\x6f\xfc\x08\x73\x7b\x3a\xc6\xd9\x86\x3f\x11\xcc\x6e\xa9\xb6\x2e\x5d\x03\x21\xa1\x49\x04\xe6\xd1\x76\x9f\x0f\x53\x1c\x21\xcf\x45\xc8\x10\x9c\x25\x58\xc3\xa8\x0c\xee\x91\x67\x93\xc9\xb3\x09\xa8\xb2\xcf\x26\xcf\xbc\x21\x56\x85\x72\x58\xa7\xed\x75\xc4\xf8\x22\xca\x21\x80\x05\x7d\xa9\x31\x21\xe4\x9d\x47\xfd\x84\x76\x96\x2b\x15\xb9\xa1\xd8\xb6\xaa\xc2\x3b\x40\xd3\x95\xbe\xec\x19\x10\x09\x85\x78\x6e\x3b\x8d\x5f\xd2\x15\xf6\xce\xf9\x95\xeb\x06\xb7\xb5\x34\x9b\xee\x15\xb3\x70\x6a\x3c\x63\xce\x81\xfa\xfe\xfb\xed\xbd\x1b\x8a\xee\x4c\x6f\xe6\xce\x01\xf7\x5e\x85\xac\x6b\x6e\xc8\x82\xea\x45\xf0\xe2\x75\x9d\x71\x86\x1d\x4d\x43\x9d\xbf\x55\xab\x0d\x53\xb3\x24\xd9\x95\xe5\x30\xf7\x04\xac\x38\x7b\xc3\xc7\x0e\x93\x58\x74\xae\x18\x38\xe4\xf4\x82\x2a\x66\xef\x6c\xe0\xf4\xa9\xf8\x8c\x19\x9e\xba\x39\x7a\xe7\x7b\x18\xf9\xf6\xe0\x56\x47\xf8\x6e\x85\xb7\x86\x9e\x85\x4c\x94\x8d\xe4\xa9\xad\x1a\xc6\xa4\xa1\x26\xa5\x21\xea\xd0\x53\x34\x90\x9d\x65\x07\x87\xa7\xf9\x2d\xec\x3f\x40\x63\x12\x38\xd0\xf5\x5f\x89\x18\xc6\xc8\x46\x56\x72\x3e\x30\x87\x7f\x90\x23\xcc\x2c\xb6\xad\x45\x58\x1a\xfc\xac\x75\x53\x13\x7c\x35\x66\x00\xda\xd7\x06\xe3\x89\x39\x67\x94\x6f\xd9\xe3\x0c\xa5\xe7\x61\x77\x3e\x7f\x7f\x72\x78\xfc\xe6\x64\x52\x97\x5f\x20\x06\xc4\x98\x8e\x1b\xb9\xb5\x30\xe4\xa3\xb0\xa4\xd7\x96\x0d\xbd\xcf\x20\x89\x59\x89\x3a\x89\x7d\xc0\x18\x30\x9b\x1a\xa6\x6a\x8e\xb8\x52\xbb\x6a\x62\x6f\x85\x4b\x52\xad\x6b\x7b\xc6\x9d\x25\x6e\xe4\x1c\xec\xe1\xc7\xef\x1f\xc8\x8d\x62\x63\x00\x92\xb0\xb6\xe4\x8c\x57\x00\x44\xd3\xe9\xa9\xd1\xf9\x9c\x34\xa8\x8f\xb8\xfa\x90\x2e\x3e\xb9\x5a\xae\x46\x5e\x3b\x2b\x33\x44\xd6\xb1\xed\x6b\x55\xa5\xd5\x3d\x01\x96\x8f\x55\xca\x5c\x14\x88\xce\xe1\x85\xa5\x72\x1d\x04\x1b\xc5\xaf\x78\xc5\xe6\x96\x84\x05\x17\x73\xdd\x75\x20\x72\xc9\x68\x49\xc3\x02\xc6\x10\xeb\x74\x9a\x90\xd4\xf3\x06\x52\xcb\x02\x38\x3f\x6e\xcd\xb7\xef\x2e\x88\x60\x48\x42\xe2\x26\x1b\xe8\x78\xb2\x44\x26\x9e\xec\xdb\x8e\xb6\x6e\x47\x1f\xd9\x99\xa3\xd8\x27\xa4\x6c\xda\xaa\x83\x02\x4e\x18\xdb\xc1\xc3\x9e\x12\xbd\xac\x2b\x2e\x2e\xa1\x65\x87\x3b\x4e\x5c\xfb\x3b\x46\xec\x17\x7e\x03\x2b\x46\xab\xfc\x6a\xc0\x03\xb1\x32\xc9\xa1\x02\x98\x1d\x88\xc1\x83\xc9\x62\xa5\xde\x5f\xbd\xb0\x47\x4f\x79\x96\xf3\x3b\x39\xcf\xf3\x51\x2f\x2d\xaf\xe9\x7c\x6b\x85\xa6\x30\x78\xef\xc0\x16\xe4\xdd\xd1\xa9\xaf\x1b\xd8\x8f\x1d\xd2\x78\xaf\x54\x84\x2a\xc3\x67\xb4\x30\x07\xa4\x69\xab\xca\x99\xb8\x5e\xc9\x73\x52\xe2\x86\xdc\xd3\x24\x22\x2f\x3a\x17\x1a\x14\x70\x68\x59\x5d\xd9\x51\x8d\xb5\xe1\xd1\x13\xd8\x36\x2e\xa1\x15\xa0\xd9\x04\xb9\x5e\xf0\x62\x41\xce\xda\xaa\x3a\x93\x15\x2f\x96\xa1\x81\x3b\x3a\xdb\x4b\x7b\x2c\x24\x9e\x0b\x87\xd5\x35\x5d\xea\x57\xf1\x5b\x12\x0a\x9f\x11\x6a\x0c\xab\x1b\x64\x66\x3b\x35\xab\x2d\x3a\x3b\x7f\x3b\x28\x8b\xdc\x12\x0a\x22\x8f\xf2\x2a\x48\xc6\xd6\x7d\x90\x78\x5e\x8f\xc9\x5b\x76\xc5\x54\x9f\x3e\x61\x3f\x82\x47\xeb\x3e\x4d\xb0\x74\xa0\x8d\xb7\x1a\xbc\x22\xd8\x33\x7e\x6d\xa9\x3f\x42\x3b\x9f\xad\x3c\x96\x6b\xf1\xcc\x10\xc7\x55\xa9\x2f\x72\x3a\x7b\x2b\xcd\x19\x3e\xa3\xff\x3e\xf8\x26\x37\x8c\x4a\x2b\x6b\x63\x2c\xfd\xe8\x96\x1d\x4a\xae\x2f\x07\xbd\x42\xf0\xe2\xc4\xcb\x33\x94\x99\xe7\xcc\x58\x76\x1e\x07\x8e\x76\x34\x58\xae\x86\xef\x4a\xfb\xb2\x6e\x7f\x29\xe6\xa0\x08\x47\x8e\xb9\x6b\x46\x85\xc7\x1b\x64\xd7\x44\xb1\x5a\x1a\xd4\x73\x2d\xbd\xce\xc9\x5d\xc8\x9a\x11\x7a\x45\x79\x45\xa7\x15\x64\xee\xda\x87\xbb\x67\x25\xfb\x0e\x0f\x61\x06\x20\x1f\x4a\xfa\xfd\x68\xb9\x25\xf0\x3c\xf2\x8f\x83\x01\x8f\x37\x29\x92\x55\xc9\xe2\x32\xd6\x55\x67\x4a\xd6\x78\x0b\x56\x9d\x97\x50\x09\x45\xcb\x92\x68\x3e\x17\x00\x0c\x28\x0c\xa9\xa8\x61\xa2\x58\x4e\x88\x6b\x2c\xda\xc1\x21\x2a\x66\x14\x0f\x55\xeb\x42\xaa\x9a\x56\x7e\x92\xa7\xb4\xb8\x94\xb3\x19\x3c\xb5\xbb\xdf\x25\x6a\x39\x61\x85\x73\x42\xb5\x14\x38\x38\xd3\x9a\xce\x07\x08\x2b\xe8\x18\x6e\x15\x28\x57\x58\x81\xab\xe4\xa0\x42\xbd\xa0\xf4\x38\xa0\x3e\x75\x5f\x79\xa8\xb6\x0e\x8a\x2d\xf0\xab\x6a\x85\xe1\x56\xfc\xf5\x7a\x89\x11\x88\x18\xae\x25\x9e\xda\xa1\x5c\x63\x36\x00\x8f\x70\x10\x6b\x50\x8a\x75\x05\x5d\x07\x90\xbe\xb5\x7c\xb5\x55\x51\x0f\x55\x3b\xe9\xb3\x10\x9d\x23\xc0\xcd\xfe\xc5\xb9\xa5\xda\xc1\x5c\x77\xda\xe5\x3e\xe0\xbe\x75\x4c\xf1\xf7\x2f\xff\x31\xb9\x8a\xa3\xf0\xf0\x73\xab\x72\x1c\x58\x7a\x6b\xa6\xe6\x88\x82\xc6\x48\x4d\x05\x9f\x31\x6d\x39\x64\x69\xd9\xc9\x45\x57\x34\xad\x19\xb9\xb6\x8c\x84\x39\xb0\x2b\xaf\x97\x28\x5f\x2f\x56\xe2\x39\xd1\x8a\x76\xae\x8d\x7d\x25\x0f\x60\x2d\x00\xc0\xff\x03\x2b\x5a\x03\xfb\x0f\xb2\x06\xc9\xbe\x90\xf6\xb3\xc4\xec\xa1\xf3\x76\x8a\xea\x33\x0c\xbb\xf2\x6a\x58\x64\x07\x0d\xf5\xc3\xea\x7e\x74\x66\x75\x3b\x6d\x70\x5e\xd9\xcc\xea\x51\x2f\x27\x5f\x7f\x9d\x3e\x39\x58\xeb\x05\x63\x6a\x56\xb4\x8a\x9b\xa5\x15\xbc\xec\x83\x99\xcc\x34\x74\xd0\x3f\x02\xb8\x55\x77\x30\x2f\x28\x38\xc0\xb1\x30\x0c\x37\x64\xb7\x29\x2c\xa3\x3e\xc2\x4a\x8f\x26\xe8\x1d\xdb\xd6\xd7\xdd\x24\xcf\x9c\x70\xb6\x3b\xa6\xdb\x96\x7a\x42\xce\xa4\x46\x64\xd8\x80\xad\x3e\xa0\x14\x71\xc7\x35\x23\x7b\x7d\x26\xba\x11\x01\x4b\x7a\xb7\xb5\xa3\xd4\xf7\x8a\x2d\x42\xe4\x28\x3b\xfa\x2b\x68\xbb\x65\x88\xa1\xf3\x95\x46\xfc\x52\xf5\xa6\xa2\xeb\xbf\xb9\xc5\x78\xb7\x9b\xa5\x6d\xef\xfe\xf7\xde\x05\x46\x4e\x57\x99\xb6\x5f\x07\xef\x10\xcc\xd3\x17\xed\x5b\xb6\xa0\x57\x6c\xe3\xd1\xdb\xc8\x72\xb2\xe1\x04\x82\x6d\x94\x3e\xa0\x35\xed\x42\x61\x79\x80\xc5\xd6\x9a\xd5\xd0\x60\xfe\x06\x15\x60\x93\x96\x33\x5d\x92\x4a\x4a\x80\x54\x6d\x1b\x22\x64\xc9\xec\x06\x80\x94\x4e\x5a\xe9\x11\x39\x3f\x74\x37\x36\xd1\x90\xd8\x94\x02\x34\xdb\x86\x15\x1b\x6e\x78\x30\x2f\x55\xd4\x8f\x15\xd5\x9a\xf4\x3a\x87\x5e\xa5\xb6\x74\xf0\x09\x50\x1b\x05\x1e\x39\xd7\x0c\xbf\x62\x57\x0c\xd2\x58\x66\x7c\x4e\xb0\x3d\x6c\xed\x9a\x87\xf8\xec\x71\xa9\xa0\x5d\xa5\xe2\x65\xba\x63\x68\x55\x5b\xb3\x4b\x7a\x2d\xd5\x65\x25\x69\xe9\xab\x54\x2b\xab\xf0\x54\xfc\x92\x91\x63\xd6\x54\x72\xe9\x3a\x7e\x88\x92\x9c\x1b\x6a\xd8\xac\xad\xce\x07\x2c\xc5\x30\xaf\x8e\x2e\x34\xdf\x9a\x57\xc7\x0e\xbe\xe2\xd5\x39\x3d\x3f\x3a\x3f\x7d\xf4\x75\x70\xc3\xfc\x7c\xcf\xbf\x80\x99\x79\x7c\xb1\x08\xfe\x6b\x5a\x6a\xd8\x98\x54\x6d\xea\x2f\x31\x89\xef\x4c\x2a\x43\xab\x2d\xe8\xd0\xc5\x82\x36\x87\xad\x59\x1c\x73\x5d\x58\x61\x92\x47\x95\x5e\x7b\x6a\x04\x8f\xce\x20\x6e\xe7\xec\x26\xc2\xfd\x7e\x71\xf7\x1d\xfd\xf5\xf0\x8c\xd0\xd6\x72\xb3\x71\x8d\x0a\xb6\x12\xe5\x25\xd1\xdc\x9c\x63\x5b\xa6\xac\x33\xe3\x9e\xf9\x91\x79\xf1\x77\xed\xd2\xac\xec\x5a\x95\xe2\xa6\x32\xc1\xa7\x4a\xc5\x47\x55\xa9\x98\x7a\x5c\x90\x1c\x66\x04\x17\xdc\x70\x6a\xa4\xda\x85\xe2\xa8\x1e\x31\x21\x3f\xb5\xd5\x46\xd6\x4e\x24\x9c\xfa\x3b\x00\x4e\x62\x50\x84\x78\x6d\xb0\x2e\xe9\x15\x72\x88\x60\x59\x4e\x85\x61\x6a\x46\x0b\xb6\x02\x84\x3b\x02\x77\x38\xd2\xc4\xfd\x3d\xc9\xd4\xfc\xd1\xe5\xb2\x37\x70\x0e\xfe\xe9\xd5\x1f\xa3\x52\xc8\x3f\x05\xc3\xc3\xb9\xe6\x63\x1b\x43\xb0\x62\x48\x33\x9b\xe1\xdc\xf3\x6b\x9e\x73\x81\xff\x2a\x56\xd2\xfa\x71\x6a\xff\xb3\xa5\x15\x2e\xc9\x90\xe5\x1e\xfe\x9a\x3d\x56\xd8\xfa\x2e\xe9\x33\xa6\x9b\xb7\xc0\x85\x08\xb4\x02\x92\x19\x5d\x4a\xc2\x4d\xa6\x51\x54\x68\xcb\x62\x79\xdc\x26\xcf\x9c\x21\xf6\x8c\xec\x9b\xa2\x49\xae\x52\xcd\x80\xe3\x14\x30\x9c\xdc\x3f\x92\x1e\x93\xab\xb5\x41\xd5\x8a\xd8\x28\xc2\xa9\xbf\x40\xa6\xfe\x3e\xb4\x36\x18\x36\x5b\x5b\x2f\xa5\x05\x39\xb5\x75\x60\x75\x47\x46\xd8\x01\xf1\x54\xa3\x49\x41\xbe\xe7\xda\x20\x5c\x2c\xde\x0c\xf0\x70\x08\x8f\x6e\xcd\xd5\x33\x22\x15\xe1\xcd\x7f\xd1\xb2\x54\xaf\x50\xf3\xf4\xd1\x51\x95\x8e\x56\xc8\xb5\x4b\xcf\x03\xa0\x42\xef\xaf\xd8\x37\xcb\x86\x17\xb4\xaa\x96\xe4\xe2\xe8\x0c\x46\xd0\xe4\x0f\xbf\x7b\x01\xf6\xeb\xd7\x5f\xfd\xee\xc5\xc0\x2d\xf4\x84\xae\xbe\x72\x3d\x8a\x6c\xe6\x47\x50\x17\xbc\x6b\xd8\xad\x3d\xa4\x55\xe8\x45\x69\xed\xc3\x73\x04\x1a\xb5\xca\x91\x3b\xee\x50\x10\xd8\xdd\x15\x54\xbd\x9c\x56\xe4\x13\xa4\x67\x74\x3d\x41\x7a\x3e\x41\x7a\x3e\x41\x7a\xde\x7c\xc5\x7e\xce\x6d\x9f\x47\x31\x2d\xd0\x2e\x71\x5d\x6f\x42\x95\xe9\xec\x73\x57\x99\x12\x59\x2d\x55\xf0\xe6\x58\xc0\x18\x2e\x66\x48\xff\x8b\xae\xad\xc3\xf1\xdb\xf3\xff\xfa\xfe\xf0\xdb\x93\xef\x61\x56\x1d\x2a\x8d\xdd\xde\x5c\x3c\x68\x18\xe5\x5e\x45\xcc\xb0\xf5\xde\x5e\x01\xb2\x58\x29\x3d\x16\xe4\xed\xeb\xf3\x3b\x56\x1d\x6f\x21\x06\xf6\x85\x98\xa5\xaf\xd2\x63\x2b\xc6\xb1\x3f\xd5\x4c\x6d\xa7\xff\xce\xce\x54\xf2\xf8\x30\x2f\xfb\xd0\xf7\xfa\x5b\x7e\xc5\xd9\xd9\x9a\x83\x3d\x8d\x19\xc9\xbf\x4d\x45\xad\x5d\x22\x5c\xb6\x47\x5f\x4b\xfb\x90\x6c\x31\xcc\x22\x56\xb9\xda\x66\x0d\x6a\x65\xa2\xa2\x8e\x5b\xf6\x20\x41\xf5\x42\x59\x35\xcf\x2a\x78\x4c\x6b\xaf\x6c\xfc\xfb\xee\xe3\x66\x53\x7b\xfe\x6d\x29\x04\x1b\x89\x71\x0d\xfb\x31\xdf\xa6\x57\x18\xdd\x4b\xc0\x4b\xcb\xba\x59\xed\x0d\x0e\x23\xf6\x72\xdf\x40\x29\x6b\x68\x91\xaa\x8a\xa6\x71\x45\x37\x13\x63\xcf\x20\xdd\x47\xf8\x09\x34\x2e\x7f\x84\x8a\x08\xd0\xbd\x25\x18\xe6\x30\xf6\xb6\x85\x53\x20\x64\xb5\x23\x20\xbd\x0b\x4b\x12\xaa\x43\xf5\x0d\x56\xee\x64\x68\x1d\xb8\x93\x3c\x4b\x3e\x4b\x7d\xe5\xa7\x07\x76\x97\x6f\xd3\x55\xde\x2c\xa4\x91\x62\x37\xda\x1d\x6c\xa2\xa5\x7f\xb4\x9c\xc1\x1d\x47\x21\x49\x36\x3a\x9a\x10\x9f\x36\x24\x7c\xae\x54\xee\xba\x34\xce\x1c\x45\xbb\x31\x34\xd6\xd9\x26\x8a\x6f\x47\xc9\xda\xf8\x92\x9f\x17\x60\x56\x53\x9e\x1e\x6f\xe1\x14\x79\x0c\x69\x72\x9f\x69\x6f\xd4\x07\x4a\x7b\x1b\x0e\x07\x56\x66\x6a\x76\x63\x1f\xe4\xd7\xf8\xf4\xd8\x39\x22\x7c\x27\x1b\xed\xe4\x02\xb9\x59\x50\x6d\xc5\xa6\x90\xca\x5c\x4b\xb5\xe5\x0e\xe0\x7d\x2a\x56\x20\x95\xdc\x77\x6b\x5d\xbf\x1e\x48\x9a\xf7\x49\xbb\x53\xf3\x99\xd5\xf7\xb2\x2b\x95\x44\xd0\x0d\x9d\x67\x3e\x94\x13\x3f\xc2\xa4\x90\x75\xd4\x74\x86\x5c\x2f\x18\x6a\xa1\x47\xe7\xa7\x6f\xf8\x1c\x09\xf4\xef\x42\x66\x8c\x9a\x56\xb1\xf1\x9c\x9a\x34\x82\xb8\x26\x69\xd9\x7e\x5b\x3e\x85\x90\x87\xfe\x9d\x4f\xa2\x73\x38\x89\xa2\x1d\x76\xdb\x89\xf4\x39\x1c\x48\x8f\xe7\x20\xda\x39\x9b\xe7\xa9\xf3\x73\xef\xf2\xc2\x23\xcb\xfa\xf8\x87\xb9\x40\xa7\xe5\xcd\x4e\x55\xa0\xe1\xd8\x71\xf7\x6d\x45\x35\x50\xf2\xbf\xe1\xbc\x19\xac\x15\x84\x27\x61\x7e\x1f\x1c\x93\xb4\xaa\xec\xca\x4a\xc1\x42\x85\x9e\xee\xea\x4d\xb1\xe0\xb2\xa6\x8d\xab\x3d\x2d\xe5\xb5\xb8\xa6\xaa\x24\x87\x67\xa7\x0f\x7f\xea\x0c\xc6\xae\xc7\x7d\xf4\x46\x96\x5b\x97\xff\x11\x29\xa0\x55\x00\xa2\x88\xfd\x63\xca\x8d\x46\x98\x47\x00\x5d\x34\x71\x90\xc5\xaa\x57\x21\xe9\x1f\x40\x3d\xa6\x41\x38\x64\x30\x5a\x04\x91\x85\xa1\x95\xcb\x54\x9a\x32\x73\xcd\x98\x20\x2f\x5e\xbc\xc0\xfc\x8a\x17\xbf\xff\xfd\xef\xa1\x98\x9b\x94\xac\xe0\xf5\xfa\x8d\x70\xd7\x6f\x5f\xbe\x4c\x27\xe5\x6f\x87\x6f\xbe\x27\xb4\x00\x1f\x19\x99\x4a\xb3\x70\x14\x01\xeb\xc5\x83\xea\x11\xf9\x3f\xe7\xef\xde\x7a\x3d\x44\xaf\x7c\x0b\x9c\x1d\xa6\x73\x80\x0f\xc8\x01\xc5\x70\x80\xfd\xe9\x32\x20\xa8\x59\x04\xc8\x13\x0a\x99\x68\x11\xb4\x8e\x93\x97\x03\x0a\xaa\xa0\x2b\x3b\x9f\x2f\x60\x59\xb8\x80\x5d\x58\xf1\xc2\x75\x1e\xc0\xbc\x18\xac\x94\xf6\xf8\x9e\x88\x63\xe2\x55\x88\xe4\x91\xed\x94\x8d\xb0\xb6\xd9\xa1\xa6\x8c\x82\x8f\x44\x31\xdd\x56\x06\x3a\x53\x4d\x99\x23\xa2\xe3\x58\xcd\x92\x39\x70\x37\x52\xd8\x9d\xe8\xdb\xb6\x5c\xf0\x12\xd8\x99\xaf\x15\xb7\x4a\xd9\x2c\x00\x52\xa3\x00\x87\x80\x2b\x39\xa1\xc5\x82\x30\x61\xa0\x87\x03\xb2\x9e\xbd\x3d\x79\xe8\x05\x15\xa5\x95\x29\xd0\x48\x1f\xc8\x78\xb4\xf9\xe7\xf9\x32\x59\xcf\xc2\x8c\xf7\xe0\xb4\xba\x93\x94\x56\x52\xcc\xe3\x8d\xd9\x29\xd6\x11\x9c\xd0\x00\x19\x04\x85\x8d\x00\x2e\x6c\x17\x06\x83\xaf\xda\x01\x1e\x69\xc4\xda\x9a\xb2\x21\xfb\x2f\x4b\xfe\x72\x9e\x0c\x66\x42\x0a\xc4\xb8\xbe\x50\xad\x36\xdf\xb6\x96\x21\x87\x3c\x2d\x6f\x4e\x33\x21\x47\x6b\xd4\x61\x42\xb0\xcb\xb1\x82\x98\x6a\x51\x30\x8d\x9b\xf7\x17\x44\x20\x31\xdd\xdd\xbf\xe0\xb2\x0d\xa4\x42\xce\x36\x11\xe2\x51\xdf\xb8\xb0\x27\x39\x6d\x8d\x1c\xb7\x4d\x49\x03\x02\x76\x22\x72\x60\x77\x1d\x56\xcd\x82\x8e\xc8\x9c\x46\x46\xe3\x3a\x1d\xd1\x86\x71\xde\x0d\xf8\xc5\xe0\xd1\x6f\x79\x63\x7b\x24\xb9\x84\x54\xd8\x09\x55\x38\x8f\x05\xad\x19\x60\xf5\x20\xb9\x03\x49\x28\x64\x3d\xe5\xc2\x81\xe0\xcd\x00\x25\x90\x29\x8c\x42\x02\x02\x1e\xa9\xe8\x94\x55\x8e\x00\xa9\x06\xbf\xf2\x77\x1e\x59\x89\x29\x7b\xbe\x69\x42\xe7\x73\xc5\xb4\xe6\x57\xcc\xc1\x0d\xf2\x7f\x06\x6a\xa0\xb5\xd5\xc9\x1b\x0f\xc5\xa8\x89\x35\x0e\x0d\x4b\x6f\xee\x83\x57\x68\x9b\x65\xd9\xbb\xf3\x21\x4c\x08\x39\xd1\xd2\x30\xc5\x0b\x18\xd5\x2d\xb5\x26\xba\x2d\x16\x84\x6a\xac\x3e\x1c\x03\xe6\xe2\xf0\x59\xef\x10\x56\x10\xc4\x71\xc1\x68\xe9\x51\xe7\xac\x51\xd5\x34\xac\x9c\x10\x72\x64\xc5\xcf\x8c\x17\xd4\x20\xa6\x18\x29\x59\xd9\x36\x15\x47\x1f\xe1\x40\x32\x2e\x16\x8c\x48\x55\x32\x00\x97\x94\x33\x48\xbe\x0f\x83\x45\xba\x21\x80\xcd\x73\x3b\xfe\x94\x1b\x45\xd5\x12\x35\x28\xb7\x96\x03\x89\xb0\xa7\x4f\x01\x38\x76\x30\x16\xd0\x03\xa0\x37\x24\xbd\x9b\x8c\xbf\xb2\x1c\x02\x64\xb0\x6f\xb0\xbb\x06\xe4\x5f\xfa\x2b\xcf\x99\x64\x2f\xd8\xda\xe7\x6e\x67\x0f\x7d\x58\xee\x63\xc9\x5e\x48\x1b\x98\xf3\xeb\xa2\x32\x60\x81\x9a\x62\xe1\x34\xc5\xbe\xa8\x22\x04\xfd\x47\x74\x58\x75\x0c\x5e\x0e\x55\x91\x7b\x11\x19\xea\xe9\x99\x99\x58\x73\xd3\xb4\xb4\xaa\x96\x63\xf6\xc1\x1e\xf6\x56\x98\x81\xf6\x04\xcd\xc2\xa0\x10\xbf\x15\x9a\x99\x51\x06\x42\x40\x08\x35\x0a\xd1\x6c\x35\xd9\xc3\xf7\x17\x12\x5a\x23\xec\xe1\x60\xd6\xc4\x9e\xb6\x06\x8b\x74\x46\x9b\x7f\x92\x63\x4e\xae\x98\x5a\xba\x71\x07\x3f\x2e\xdb\x56\x25\x59\xf7\x08\x01\x09\x65\x8a\xc5\xc9\x87\x46\x21\x54\x4b\x96\x67\xae\x6c\x97\xd5\x21\x10\xd1\xdf\x5b\x4a\x7d\xc6\xf6\xc2\x08\x4e\x10\x2c\x62\x89\x3f\x81\x53\xe2\xf0\xed\xf1\xf0\xe3\x01\xaf\xe1\x86\x4f\xff\x1a\x68\x06\xf5\xaf\xfc\x32\x07\xaf\xc3\x5b\xe6\xdc\x75\x5b\xf0\xdf\x60\xc3\x4f\xc4\x58\xd3\xc1\x93\x43\xc9\x25\x73\xc7\x24\x15\x2e\x04\xe1\x6e\xce\x46\xa4\x62\x00\xe5\x88\x88\x95\x6c\x09\x83\xe1\xf8\x79\x56\x3e\xf3\xa6\xc4\x2b\xd7\x49\xda\x5d\x63\xfb\xf2\x19\x9f\xe6\x17\x2b\xd3\x23\xf3\xca\x22\xbc\x2e\x59\x72\x20\x67\xd3\xd5\xdb\x45\x96\x93\xbc\xa7\x06\xf6\x80\xfd\x20\x60\x20\x05\xb6\xa7\xd0\x19\x54\x13\x23\x73\x31\x1b\xc9\x57\x1d\xd9\xbf\xfc\x82\xde\xdb\x94\x65\x14\x3c\x24\xa2\xb7\x9f\xab\x70\xc9\x96\xcf\x34\xee\x79\x7b\x42\x2c\x78\x03\xa6\x39\x1c\xf6\x72\x96\x79\xe3\xe3\xf5\x23\x60\x9c\x7b\x72\xf0\x64\x39\x15\x23\xf2\x56\x1a\xfb\x9f\x93\x0f\x5c\x3b\x1b\xe6\x58\x32\xfd\x56\x1a\xf8\x64\xe7\xf9\x01\xa7\xea\xb1\x70\x83\xf3\xfe\x73\x28\x8c\x83\x63\x18\x0c\x75\x98\x12\xbf\xea\x1e\xd8\x39\x70\x0e\xd7\xe4\x14\xba\xfb\xe2\x52\x65\x25\x08\xaa\x32\x3d\xc8\xb5\x25\xc7\xfb\xeb\x00\xa2\xdd\x55\x8f\xaf\xd3\xe3\xb8\x45\xaa\x1e\xb3\x3c\x10\x69\x8e\x2c\x88\x42\xe0\x37\xd0\xff\xa4\xa9\x68\xc1\x4a\xdf\x5e\x81\xda\x59\xa5\x86\xcd\x13\xeb\x9f\x6f\xba\x6a\xa6\xe6\x10\x60\x29\x06\xb4\x5c\x5a\xbf\x72\x2b\x66\x78\x65\x55\xcf\xf0\xba\x97\x4d\x7c\x2f\x68\x2a\x0f\x3e\x04\xe8\xfd\xdf\xdb\x63\xf6\x3e\xac\x8a\x6c\x92\x28\x22\x13\xb5\xdf\x9a\x36\x56\x0a\xfd\x3f\xab\xe4\xc2\x86\xfb\x1f\xd2\x50\xae\xf4\x84\x1c\xfa\x86\x14\xf1\x77\xce\x8f\x14\x3d\x26\x1b\x61\x0d\xd4\x63\xfe\xda\xf2\x2b\x5a\x39\xf0\x64\x2a\x08\xc3\xe6\x1e\x96\xc6\x55\xd3\x6a\x44\xae\x17\x52\xa3\xc6\x1c\xa0\x37\xf6\x2e\xd9\x72\x6f\x94\xc1\x9f\xea\xaf\x58\xf2\xed\x9d\x8a\xbd\x2e\xe6\xd8\x93\x4f\xc1\x6e\x80\xda\xc3\x3d\xf8\x6e\xef\xa1\x6c\xba\x8c\x7a\x3d\x2d\x4b\x8e\x28\xd7\x67\xd9\xd5\xdd\xac\xe2\x23\x3f\xea\x45\x77\x0d\xc5\xaa\xc1\xeb\xfe\xdc\x68\x7e\x67\x6e\x08\x3b\x4c\x97\xbe\xc1\x8c\x73\x59\xad\x7b\xb4\x32\x10\x02\x3e\xb1\xc8\x7f\x66\xb7\x44\xcf\x09\x99\xcb\x8d\x94\x85\x59\x3c\x6e\xfb\x2e\x2e\xa9\xd5\xaf\x54\xcb\x46\xa4\x94\xe2\x99\x71\x21\x84\xb8\x3d\xd4\x6a\x9b\x89\x72\xc3\xaa\xef\xeb\x83\x0c\xa4\x50\xc5\xa0\x1b\x86\x6f\x8d\xe5\xfc\x9d\xd8\x40\x0a\x62\x55\xc6\xe7\x0b\xdb\x3f\x37\x11\x32\x14\xc0\xc8\x11\xe2\x60\x8c\x84\x84\x53\x00\x5a\xe5\xc6\xc4\x74\x8c\x17\x91\xd4\x8f\x7f\x65\xa0\xe2\x36\xf6\x86\xb3\xb3\x03\x5b\x42\xd7\xed\x3f\x99\x92\x19\xc6\xdd\xe0\x20\xcf\xb5\x9b\x86\xe4\x35\x76\xd7\x10\x10\x87\xee\xea\x6d\xa5\xf7\x60\x0c\x5f\xb9\xe4\x25\xe8\x7d\x16\x61\x42\x2b\x89\x8c\x00\x19\xa5\xf0\xc5\x14\xe6\x65\xa7\x84\x4c\xc7\x2e\xbb\x28\x66\xee\x18\x80\x89\xa2\xc7\x39\xf4\x94\x8f\x44\x55\x2e\x16\xac\x8b\x0c\xcb\x19\x50\xe9\x03\xe5\xf7\xb3\xa1\x02\x4a\x71\x2b\x10\xb0\x17\x73\xf8\xf2\x05\x64\xb3\xb1\x16\xe6\xb8\xbe\xa1\x4d\xc6\x4c\x93\xf0\x4c\xa8\x09\x56\x35\x0a\x4d\x3a\x95\xad\xf1\x50\xcd\xee\xfb\x92\x1a\x0a\xfd\xa9\x30\x6f\x62\x37\x42\xb8\xf9\xfc\xb0\x99\x4c\xe4\xfc\xdb\x15\x33\xa0\xfb\x15\x07\x23\xc2\x68\xb1\xb0\xd6\xce\x18\x53\x5b\xad\x9d\xe6\x0d\xb2\x63\xbb\x50\x68\x04\xc9\x55\x85\x21\xc7\x16\x0a\x1c\xe1\x37\x4e\x94\xad\xed\x93\x30\x7c\xe9\x95\x76\x05\x1d\xce\x3c\x13\x5d\x51\x7c\x06\x4a\x7c\x78\xc4\x37\xf5\x74\x0e\x6e\x98\x11\xf0\x56\x45\xf3\xe5\x73\x14\x59\x69\x7f\x16\x36\x7d\x06\x2a\x36\xbc\x7d\x87\xc7\x6e\xcf\x30\x97\x91\xde\x8a\xb5\xf1\xad\x52\x93\x89\x06\xec\x96\x66\x5f\x9a\x7a\x67\x7f\x84\x0a\x0f\x1d\x51\xa1\x32\xb8\x6b\x4a\xe6\xb8\x25\x2c\x67\x0e\xa7\x5d\xb4\xf4\x9a\x85\x86\xa6\x4c\x29\xa9\xec\xfb\x33\xad\x09\x87\x75\xaa\xa9\xba\x64\x65\xd0\xc6\x27\xe4\xcc\x4e\x94\xf7\xec\x65\xa0\x44\x79\x2d\xc2\xb7\x4b\xb5\xaf\xee\x0c\x73\x20\xf3\xd9\x64\xf2\xcc\x75\x72\x57\xa8\x60\xe3\x39\x64\x3f\xcf\x25\xf1\xf3\xb8\xf1\xb2\x39\xef\x7a\xb2\xe9\x0d\x6d\x34\x3a\x47\xad\x1a\x0d\xe1\x20\x49\x28\xce\x88\xcb\x12\xa2\x83\xc1\x26\xba\x2b\xb3\x73\x22\x6f\xc0\x31\x5f\xb0\x31\x43\x2a\x10\x5e\xb9\x03\x8c\x19\x83\x8b\x37\x05\x16\x1d\x0f\x39\x79\x98\x37\x5a\x9d\xd1\xcf\x5c\x0f\x28\xaa\x59\xbd\xee\x2b\x44\x04\xe5\x0a\x5c\x93\x77\xde\x5b\xf1\x69\x25\x37\x06\x91\x87\x73\x58\x43\xfe\xda\xa1\x9a\x9b\xd5\x6b\xd7\x6a\x70\x56\xaf\xd3\x19\x76\x1a\xee\x2b\x21\xee\x78\x8c\xcb\xaa\x82\x01\x32\xa8\xc7\xe4\xea\xb5\xbd\xe2\x9c\xd5\x6b\x2b\xc5\x3a\xab\x57\x8e\xe2\x9d\xd5\x6b\x78\x31\xcf\xea\x95\xc7\x9f\x82\xd7\x7d\x09\x27\x50\x11\xb8\xef\x06\x1c\x3b\x6b\x9c\xb9\x01\x0a\x3f\xb8\xc2\x9a\xe8\x60\xc8\x28\x93\x9c\x3a\x87\x62\x89\x4e\xb5\xac\x5a\x83\x24\xe4\x1f\x24\xd6\x19\xe1\x25\x7d\x14\x2a\x8f\xa2\xb8\x3a\x5c\xa4\x89\x82\x25\x81\xea\x59\xce\xb1\xee\x2f\xf2\x92\x3b\x96\xba\xab\xa1\x97\xfc\x2d\x03\xf0\xda\x8d\xc6\x01\x78\xed\x44\xfb\x00\x4f\x4a\xfe\x26\x02\x78\xed\x12\xce\x77\xff\xca\xba\x49\x87\xb7\x15\xf0\xd7\x3d\x45\xcf\x42\x33\x65\xd4\x95\x96\xa1\xab\x66\xcf\x41\x01\xf0\xfd\x46\xa3\xff\xc4\xe7\x00\x61\x1f\xce\xe1\x7e\xad\x7c\x41\x91\xfb\x0a\x46\x7b\x44\x83\xc3\xb3\xd3\x8c\xfe\xdf\xe8\xa9\x37\x78\x80\xe3\x3b\x9e\x7c\xc0\x9f\x72\xf5\x26\xf8\x14\xdd\xb7\x71\xe6\xff\x71\x37\xa3\x0e\xe7\x29\x8b\xba\xbd\xfb\x3e\xa7\xb5\x17\x7f\x6d\x35\xc5\xb8\xe7\x5c\xc4\x81\x46\x3a\x08\x89\x4e\xa7\x74\xba\x18\x62\xa1\xfa\x4a\xbf\xe1\x65\xaa\x64\xf7\xfd\x53\x3b\xea\x55\x82\xd9\x1f\xd0\x1d\x6b\xf5\xea\x71\xcb\xb3\xf7\x7e\x12\x5d\xc8\x12\x83\x09\x51\x5c\xa3\x91\xe5\x2b\x4c\xb2\xa2\x42\x48\x83\x39\xd4\x23\x0c\xcf\xeb\x91\x4b\x54\x88\x00\x75\x45\x49\x5a\x5e\x62\x35\x66\x40\xc6\x7c\xf6\xef\x55\x56\x01\x13\x78\x96\x87\x9d\xc8\x3d\x55\x42\xd0\x86\xff\xc8\xd4\x90\xde\xdd\x9b\xae\x1e\x73\xb9\xe7\x7b\x4e\xd2\xc5\x82\xd5\x14\xfe\xf9\xda\x4f\x90\x15\xda\xae\x36\x19\x82\x25\x4c\xd5\x56\xf1\x1d\xf5\x50\xae\xf6\xae\x5e\x66\xa8\x93\xeb\xae\x7b\x49\xab\x0d\x6b\x7e\x6f\xd3\x79\xd6\x33\xff\xed\x16\x05\x0f\x25\x24\x1a\x78\x74\xeb\x10\x8e\xb2\x9a\xc4\x15\xce\xff\x8e\x4f\xdd\x7d\x26\x16\xe2\xf5\x18\xbc\xd1\xa9\x5e\xe8\x51\xd0\xd2\xfb\xde\xe3\x6c\x84\x3d\x79\xa1\x3f\x7e\x3d\x79\xa1\xdd\xf5\xe4\x85\xfe\xe4\xeb\xde\xbc\xd0\x91\x4a\xe7\x4f\xd8\x0d\x6e\xe4\xb8\x53\x9c\xf7\x25\x77\x5d\xe4\x27\x18\x93\xf2\x0e\x60\xef\xfd\x95\xaa\x1f\xde\x7f\x36\x99\x3c\xc3\x00\xff\x24\x04\xb1\x5a\x33\x1b\xff\x81\x30\x51\xc8\xd2\x3e\xe7\x02\x9e\xaf\xb4\x01\x73\xa7\xf3\xe8\xc5\xb4\xd4\x7e\xac\x38\x45\x00\x9e\x9d\x57\x6f\xcc\x78\x6c\x79\x74\xc4\xd7\xf7\xa9\x9c\x67\x3c\x5e\x3a\xe5\xde\x53\xee\x97\xc2\x2d\x28\x53\x4e\xcb\xef\x70\x1f\x2b\x5e\x73\x57\xa5\x68\xe5\x29\xd3\x26\x57\xf1\x09\x21\xfb\xf8\xf0\x49\xd1\xb4\x23\x37\xd0\xa4\x66\xb5\x54\xcb\x51\x18\xcc\x7e\xd9\x1b\xdd\xdd\x71\x00\xc6\x45\xd1\x2a\xc5\x84\xa9\x96\xc3\x00\xf8\x37\x5d\x8f\xc4\xca\xf0\x2b\xb5\xc3\x46\x46\x60\xae\x3c\x79\xba\xdd\xd5\x97\x78\x47\x7e\x18\x0c\x67\x84\xd9\x86\xf3\xde\xb5\x52\x19\x75\x1e\x50\xfb\x29\x13\x57\xe4\x8a\x2a\x9d\x4b\xc2\x90\xfb\xb2\x2b\x4a\x7e\xc5\xf5\x3d\x96\x60\x9f\x3b\xa5\x05\x63\x8d\xb2\x35\x4d\x6b\xdc\x71\xe7\x45\x04\xfb\xd0\x48\xab\x8a\x06\xd1\xb0\x62\x9e\xbd\x1c\xea\xf2\x8e\xaf\x86\x1a\xc3\x94\x78\x45\xfe\xef\xfe\xcf\xbf\xf9\xd7\xf8\xe0\xcf\xfb\xfb\x7f\x7f\x31\xfe\x8f\x7f\xfc\x66\xff\xe7\x09\xfc\xe3\xcb\x83\x3f\x1f\xfc\xcb\xff\xf1\x9b\x83\x83\xfd\xfd\xbf\x7f\xf7\xe6\x2f\x17\x67\x27\xff\xe0\x07\xff\xfa\xbb\x68\xeb\x4b\xfc\xeb\x5f\xfb\x7f\x67\x27\xff\xf8\xc4\x87\x1c\x1c\xfc\xf9\x7f\x65\x7c\x09\x2a\x96\xef\xb2\x9d\x09\x78\x8d\xef\x45\xaf\xe9\x3f\xfb\x7e\x2b\x4d\xb9\x30\x63\xa9\xc6\x38\xc8\x2b\x28\xc3\xc9\x36\x94\x67\xcd\xfb\x93\x31\x9d\x56\x15\x4e\xd0\x60\x7e\xef\xb8\x10\xb9\x5f\x0b\xfb\xde\xc2\xd3\x8d\x2c\x23\x10\xb7\x5d\x42\x7e\x74\xb0\x86\x3a\x60\x2b\x2a\x70\x8c\x8a\xb9\xd5\x9f\x01\x30\x9c\x56\xae\x66\x86\xec\x37\x8a\x5f\x51\xd3\x01\xcd\x44\x58\x71\x03\xc9\x28\x16\x94\x8b\x83\x0e\x62\xa4\x91\x25\x98\x57\xad\x66\xa1\x27\xb7\x55\xf9\x2e\xbe\x3f\x27\x45\xc5\xa1\xac\x57\x85\x36\x8d\x03\x07\xf7\x78\x84\x73\x26\x98\x42\x90\x3d\xb2\xfa\xaa\xad\x66\x90\x8c\x0c\x1b\x45\x94\x89\x2d\x06\xbb\xeb\xac\xc7\x11\xef\x51\x2d\xf4\x8d\x37\xb0\x46\x0e\x2b\x69\x00\xc2\xcc\x35\x05\x73\xb5\x35\xb4\x69\x94\xbc\x62\x39\xf2\xe2\x9d\x3e\x0a\xaf\xc8\xb5\x86\xa2\xe4\x78\x59\x71\x61\x46\x61\x8a\xa0\x8e\xaa\x87\x36\x34\x74\xe1\x57\xc7\x22\x37\xe1\x32\x5e\xb8\x0f\x4b\xc9\x74\x64\x62\xb5\xc2\xf0\x2a\x1f\x11\x9a\x2c\xe8\x15\x23\x53\xc6\x04\x4e\x08\x6a\x5e\x50\x3f\xd1\xdf\xc5\x51\x26\xff\x20\x0c\x7d\x7f\x39\x49\xcc\x05\x44\xad\x01\x61\x35\x17\x63\x3b\x5f\xcd\xdc\xce\xae\x5a\x42\x3c\x4c\x12\xd8\xe8\xc8\x57\xf1\x22\xb8\x0d\x68\x78\x6d\x69\x29\xb1\xa6\x69\x20\x1d\x0e\x54\xd5\xb1\xaf\xef\x4e\xc8\x36\x6f\x82\xc9\xb9\xa1\xa6\xd5\x93\x6f\x2d\xbd\xef\xd9\x4c\x31\xbd\x38\x1c\x6a\xbc\xd8\xd7\xd1\x86\xd6\x4d\xb6\x39\xb5\xd2\x09\xab\x0a\x43\x4d\x35\x3a\x31\xc3\xa4\xf9\xd7\xee\x04\xa9\x43\x92\x1d\x1e\x4d\x01\x9f\xf9\x08\x45\x60\x43\xad\xcc\xc2\xbd\xb2\x61\xf4\x4b\xb6\x04\xdf\x49\xd6\xad\x7a\x64\x77\x2a\x3c\x16\xe1\x9a\x07\xcf\xea\x45\x6f\x9e\xfc\x81\x83\x20\x6b\xdd\xe4\xda\xcd\x01\xa8\xac\xa0\xd3\x3b\x99\x80\x2e\x99\xb3\x93\x37\x03\x49\x70\x88\xe3\xae\x8b\x66\x24\xfe\xf7\xed\xa8\xdf\x1d\x9d\x7f\xf1\x07\x37\xf0\x41\xec\x09\xac\x5d\x84\x39\x0f\x01\xdc\x21\xbc\xae\xee\x4a\x14\x8d\x4e\x20\xf5\xb7\xd3\xbe\x59\x36\xbc\xa0\x55\xb5\x1c\x5a\x92\x83\x0f\x74\xc5\x46\x8a\x99\x56\x81\x73\x8c\xab\x4d\xa4\x08\x52\x31\x3a\x1b\x83\xc6\x20\x0d\x42\xb6\x1e\x0c\xe6\x83\x33\x48\x90\x8b\x44\xc4\x3a\x53\xe0\x1a\x8c\x2c\x5f\x14\x8c\x2c\x65\xeb\x70\xc8\x0a\xcc\x03\x28\x64\x39\x58\x19\xa1\x02\x7a\xd4\xd8\xf3\x1e\x55\x3f\x3b\xbb\x58\x46\xbe\x94\x2d\x28\x25\xd1\xb6\xda\xb8\x31\x86\xae\xc5\xda\x7b\x81\x67\xb1\xa6\x97\x8c\x98\x6b\xd9\xdf\xf6\x40\x6c\x00\x80\xd2\x8c\x14\x92\x8b\x82\x0f\x9e\x07\x4c\xd4\xeb\x2d\xbe\x72\x61\xf3\x91\x2b\xcc\x6a\xa4\xd6\x7c\x5a\xb1\x48\x73\x5b\x51\x9c\x2c\x97\x64\xd4\x11\xec\xfc\xc3\xda\x74\x45\x5a\x4a\x31\xdd\x48\x01\xf1\x25\x38\xa7\xc1\x21\x3f\x21\xe4\x6f\x2b\x73\x38\x78\x3a\xaa\x8a\x08\x86\x81\xac\x62\xc1\x8a\x4b\xd7\x8f\x8d\x6b\x52\x48\x81\xe0\x27\x23\xe7\xe6\x1b\x03\x91\xa0\x9c\xd8\x69\x59\x66\x48\x6e\x2c\xa4\x70\xdd\xfc\xb2\x88\xdb\x58\xc9\x04\xef\x96\x92\x95\x26\xc5\x42\x4a\xed\x34\xbc\xbe\xeb\x24\x5e\x05\x3e\xf4\x3c\x46\x5d\xf3\x7f\xc3\x3b\xb5\x95\x89\xe5\x19\xaf\x1b\x4c\x99\x86\x35\x7b\xa6\x49\x29\x8b\x36\xfc\x6d\xe7\xbe\x62\x54\x09\xb2\x90\xd7\xc4\x0c\x45\x4d\xb0\x5b\x79\xe5\xe5\x5c\xcd\xa1\x1e\x8c\xa4\xb7\x83\xc0\xd3\x97\x6c\x79\x91\xda\x23\x30\x7e\x4e\x87\x58\xb0\x23\xa9\x78\x9b\x44\xf0\x2e\xe6\x82\xff\x14\x70\x28\xd6\x8f\x54\x10\xa0\x56\xa6\x42\xa8\xcb\x95\x10\xac\xd8\x18\x83\x77\x3e\x81\x3c\x66\x6b\xf1\x75\x72\x51\x13\xbd\x90\x6d\x05\x46\xee\x46\x6d\x75\x42\xc8\x4f\x0b\x26\xdc\xb1\xec\x8e\xbe\x1c\xa9\xda\x37\x1d\x9e\xeb\xc7\x9f\x95\xbb\xba\x13\xbc\xe1\xb8\xc9\x53\x89\xe9\x0f\xaa\xbe\x25\xa4\x58\x24\x73\x47\x64\xca\x0a\x6a\x67\x68\xf5\xe4\x93\x78\x20\xe5\x29\x52\xc7\xf6\x57\x35\x2f\xc7\xfe\xa8\xdd\x19\x3c\x09\x7b\x6d\xe2\x8e\x1d\xdf\x67\x6b\x0a\xe4\x83\xed\xb3\x4f\x34\x6a\xfa\xe0\xd1\x75\x5b\x19\xde\x54\xd8\xf4\x02\x30\x9d\xb2\x64\x77\xf4\x2c\x25\x87\x15\x05\x94\x9c\xbd\x3f\xfd\xf1\xf0\xe2\x84\x7c\x77\xf2\x37\xfc\x78\x14\xe7\xcd\x52\x6f\xf9\x38\xb5\x2e\x03\x25\x97\x6c\x99\x6d\x76\x3b\xf3\x0b\x67\x0a\xf6\xec\xd1\xc9\xfb\x8b\xd3\xd7\xa7\x47\xf6\xad\xf0\xe3\xd1\x6a\x2a\x30\x1a\x52\x19\x88\x58\x97\xe2\x01\x81\xc8\x9b\x67\x20\x57\x10\x03\x7c\x89\x30\xfc\x35\x2b\xb9\x55\x34\x86\x9b\x4b\xf6\xfa\x41\xf7\xbd\xb5\xdd\xc6\x24\xd0\xae\x18\x44\xe9\x99\x2c\x9f\xe9\x35\x3b\x09\xed\x09\xcf\x8d\x39\xe4\x28\x58\x4b\x5e\x1e\x52\x63\xad\x48\xc5\xd9\x15\xba\x15\x83\x2c\xdd\xe4\x40\xc6\xe9\x0b\x46\x56\x9e\xec\xe5\xff\x76\xa9\x41\x35\xfa\x6d\xfb\xae\x92\x8d\xa6\x63\x4f\xcb\xcf\x31\x23\x01\x14\xb1\x5a\xae\x9e\x5d\x6b\x27\xce\x35\xd5\xde\xc6\x77\x5e\x50\xd8\x2c\x43\x69\xc8\x28\xff\xdd\xd9\xbf\xdb\x22\x1f\xb8\xeb\x49\x99\x7a\x52\xa6\x76\x5c\x99\x72\xd6\xd8\x2e\x6e\x26\x7b\xb8\x42\xb1\xa6\x9c\x59\x32\x01\x2f\xaa\x17\x4d\xf0\xb1\xb2\xd0\x92\xbe\x91\x65\x96\xfd\x84\x78\xf3\x01\x20\x97\x91\xbd\xf7\xe7\x87\x5f\xbf\xf8\xfd\x57\x7b\x23\xf8\xe7\x37\x2f\xfe\xe3\x77\xf6\x9f\x27\x47\xc7\xe7\x87\x67\x5f\xfd\x36\xfa\xe3\xeb\x3f\x7c\xb3\x97\x03\x96\xc8\x3d\xee\xb7\x5f\xbd\x74\x90\xbd\x7b\x27\xc7\x5f\xfd\xf6\xb7\x2f\xff\x23\x5b\x8b\x9b\x2c\xec\x53\xd3\x0f\x27\x1f\x1a\x8e\xad\xf7\xcf\x59\x21\x45\xb9\x93\x88\x64\x9b\xe8\xf4\x7e\xf6\x9a\x7e\xe0\x75\x5b\x93\x8a\xcf\x18\x84\x9c\x20\x39\xdc\x18\x17\x76\xcb\x23\x06\x22\x39\x94\x85\x45\x43\x08\x48\x36\x98\x6c\xc4\x5d\xcf\x17\x72\xc5\xd4\x94\x1a\x5e\x77\xd8\x5e\x1b\x43\x5c\x7a\xb8\x03\xcd\x5e\x5d\xbc\x3a\xf8\x21\xbb\x46\xaa\x59\xde\xf4\x74\x46\x24\x2e\xc7\x88\x5c\xb6\x53\x36\xa6\x0d\xc7\xa0\x3b\x4a\x01\xcd\x8c\x0b\x8a\xff\xe1\x77\xdf\xbc\x78\xb1\xff\xd5\x37\x64\x21\x5b\xa5\x0f\x26\x2b\xb7\x67\xa0\xc5\x45\x25\x40\xa5\x73\xe2\x41\x2f\xa4\x32\x50\xf7\x4b\x05\xf9\xfa\x77\x2f\x5e\x90\xfd\x97\x40\xc0\x81\x8b\x0d\x79\xf6\x82\xf2\x74\x3a\xcd\xa2\xe3\xe2\x4a\x73\x4d\x7e\xff\x87\xdf\x7d\xf5\x8d\x1d\xf3\x3f\x5e\x92\x92\x2e\x33\xa9\xf3\x17\x37\x79\x42\xdd\x96\xb1\x16\x06\x83\x83\x12\x34\xc5\x15\xff\xbc\xab\xad\xcf\x71\x8c\x87\x2d\xf9\xa5\x9b\xe6\x2f\x71\x9e\xdf\x6c\xd8\xce\x08\x34\x20\xe4\xfa\x8a\x64\x20\x44\x3b\x91\xd1\x5b\x5b\xf4\xb9\x6b\xa3\x28\x47\x28\x3f\x26\x66\x52\x15\x18\x1d\xeb\xf3\x5e\x0e\xf3\xf9\x97\x5e\xa1\xff\x2f\xfd\x50\x99\x60\x76\x43\xe0\x72\xac\xb5\x4f\x84\x42\x5e\x9c\xc9\x1c\x8b\x22\xc5\xdc\x4f\xaf\xdf\x6c\xb9\x0e\xa5\x5c\xe9\x78\x39\x0b\x0c\xee\x0d\x1a\xd7\xc9\xf0\x67\x3a\x48\xd1\x92\x1c\x9d\xbf\xef\xe0\x5d\x69\x59\x2a\xa6\xb5\x37\xc5\x02\xb2\xed\xce\xa8\x00\x9a\x15\x8a\x99\x8c\xb9\x64\xf8\xc0\x1b\xca\xfa\xdd\x97\x4f\x15\xfd\x9f\x72\x7d\xfe\xa8\xae\xe7\xc8\x0e\x4f\x90\xae\xe4\xf1\x43\xba\xe2\x5a\x3e\xe1\xb9\x3e\xe1\xb9\x3e\xe1\xb9\x0e\x7e\xd2\x8e\x22\x6f\x3c\xe1\xb9\xfa\xeb\x31\x54\xd0\x3f\xe1\xb9\x7e\xc2\xf5\x54\x49\x7f\xeb\xf5\x54\x49\xdf\xbb\xfe\xcd\x2b\xe9\x9f\xf0\x5c\x13\x07\x79\xc2\x73\xbd\xed\x7a\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x4d\xa0\x69\x13\x9e\x2b\x32\xff\x26\x54\x57\xe7\x6f\xea\x20\x5d\xff\x0d\x11\x5d\xb5\x65\xbf\x82\x1d\x16\x85\x6c\x85\xb9\x90\x97\x6c\x20\xde\xdd\x8a\xf7\x77\xed\xe9\x56\x0c\xdd\xe4\x0d\x5e\xbf\x79\x27\x5d\xc3\xf9\x52\xe7\x07\x1b\xf6\xf9\x4c\x7a\xda\x96\x9c\x89\x1c\x08\x01\xf9\x0f\x47\x4f\x9b\xd7\x10\xad\xc6\x2d\x4a\x56\x76\x5f\xb8\x93\xd3\x58\xa6\x99\x90\x43\xa2\x58\xc1\x1b\xee\x1a\x35\x53\xfc\x3c\x47\xd6\x81\x95\x0f\x1c\xb2\xaf\x66\x4b\x2b\x35\x58\x35\x0b\x47\x95\xfb\x9c\x33\x15\xf9\x48\x9d\x96\xb7\x42\x68\x0e\xe7\x97\x7d\x25\xb4\x79\xc0\xc2\xb9\xe6\x9a\xf9\x2c\x31\x17\xd0\x8e\x66\xe4\x22\xa6\x21\x06\x27\xc9\x43\x4c\xf4\xea\x6e\x25\x32\x06\x4a\x33\x9e\x5b\xec\x31\xa4\xb6\xac\x11\xd9\x19\x46\x90\xe8\xc1\x4a\x52\xb6\xca\x77\x96\xb5\xba\x11\x2f\xad\x8e\xe6\x61\x44\x51\x8c\xe6\xd8\x76\x28\x89\xc3\xae\xd2\x1d\x47\x21\x5c\x00\x2d\x16\x4c\x47\xf4\xa2\x37\xe2\xd2\x65\xb2\x64\x29\x60\xb7\x57\x53\xb5\x73\x2e\xd0\xa5\x01\xa3\x7a\x0d\xb6\x2b\x36\x77\x2f\xbd\x4a\xf2\x45\x44\x8e\xfd\x79\x8e\xc4\x01\x30\xa6\x36\x56\xbc\xe3\xcc\xf0\x59\xfc\x87\x26\xb2\x2a\x7d\x70\xfd\x0f\x2f\x48\xc3\x54\x81\x62\x29\x4b\x00\x4f\x63\x4d\xbd\x91\xa4\xb2\x16\xb3\x55\x65\x6e\x1e\x3e\xc4\xf6\x8f\x23\x01\x80\xf9\x0f\x99\x32\x34\x03\xd6\xa6\x21\x15\xa3\xda\x90\x97\x2f\x48\xcd\x45\x6b\xf2\xf5\x0c\xbe\x87\x84\x82\xdf\x7d\x33\xf0\x69\xf7\xd0\x81\x38\x8b\x24\x89\xbd\x2a\xf0\xef\xe0\x5a\x71\x11\xc5\x1a\x36\x4b\x23\xb9\x30\xab\x8e\x96\x28\xd1\x3d\xd7\x69\x05\x91\xcc\x9d\x38\x0f\x32\xbb\x18\x7e\x6d\xe5\x74\x99\x06\xc1\x93\x63\xd1\xdd\xf0\x31\x88\x3d\x25\xff\xe9\x3e\xc4\x25\x96\xa8\x86\x2c\xac\xd1\x0b\x7e\x59\xbd\xa0\x0a\x31\x69\xa0\x88\xc3\x67\x13\xa5\xad\xce\xb1\x1d\x18\x00\x22\x5e\x85\x71\xb9\x26\x65\xf8\x38\xb8\x66\xb9\x18\x1b\xc5\x58\x20\x19\x6c\x7d\x88\x20\xfb\x2c\xa4\x41\x68\x85\x03\x55\xfc\x61\x8a\xfd\x98\x28\x36\xe7\xda\xa8\xb4\xb0\xdf\x38\xfd\xc0\x1c\x6a\x05\xcc\x95\x6c\x93\x1b\x3a\xe7\x12\x5b\x40\x84\x77\xf1\xfa\x44\x8f\xa2\x60\x5a\x0f\x29\x9a\x71\x47\x9d\xe3\x31\x18\x23\xf1\x59\x83\xc5\x8e\x62\xb4\x7c\x27\xaa\xe4\x98\x69\xae\x89\xf6\x74\xa0\x3f\x0d\xb4\x2a\xc8\x72\x84\x0d\xea\xb7\xaf\x5b\x00\x74\xd5\x81\x0c\x61\x25\x5a\x3a\xf6\xe7\x63\x80\x42\x8d\x22\x85\xe9\x52\x3d\xd6\x45\x66\xb4\xd2\xc9\x71\xc6\xe1\xbe\x16\xbf\x7d\xb7\xbf\x40\x48\x47\x5f\xa0\xbb\xea\x4e\xa9\xba\x6a\x4e\xbf\x58\xef\xfd\x0f\x9c\x1a\x9c\xee\x2b\xec\x0c\x57\x1a\x65\x72\x50\x0d\x27\xc7\x2b\x2b\x98\x31\x21\x6c\x3f\xd0\x10\x03\xcc\xf8\x62\x38\xc7\x29\x85\xac\x6b\xaa\x0f\x92\x89\xc1\xfc\x22\x0a\x40\x72\xda\xd5\xb7\x0b\xa3\x68\xd5\xcd\x50\x04\x60\xba\xad\x6d\x6d\x98\xa0\x22\x39\x65\x32\x17\xcf\x20\x15\x44\x5e\x87\x72\xd4\x39\xbf\x62\x62\x75\x3f\x3b\x77\xc4\xb7\xb4\xb8\x64\x03\xb0\x9b\x7e\xd0\x7e\x8d\xcb\xa5\xa0\x0e\xcb\xc6\x1e\x43\x57\xdc\x8a\x03\x56\xae\x8c\xab\x47\x5d\x86\xbb\x66\xc6\x83\x0d\xa1\x61\xb7\xad\x85\x6b\x35\x4b\x86\x8d\xcd\xb5\x6c\x96\x86\xfb\x3a\xf3\x34\x66\x74\x28\x7e\x55\x30\x6f\x17\xdb\xf1\xb6\x35\xdf\xf8\x7e\x59\x66\xdc\x73\x73\x24\xa3\x5c\x65\xb0\x4b\x47\x45\xe8\xc9\xca\x9e\x55\x4b\x0f\xda\xbe\xba\x17\xa6\x4b\x88\x06\x0e\x3b\x6f\x12\xe7\x43\x4d\x93\x94\xcc\x1c\x6c\xa7\xa6\x65\xff\x60\x79\x4f\x4b\xa9\xc9\xb7\x50\xbd\x7f\xcc\xc0\x8d\xf2\xd0\x46\xc3\xfb\x6f\x8f\x3f\x62\x30\x58\xaa\x3f\x2f\x63\x81\xd7\x74\x9e\x66\x5a\x8f\x49\x2d\x05\x37\x52\xa5\x9c\x79\x43\x6d\x85\x99\x1e\x52\x5e\x9a\x4b\x6e\x22\x15\xde\xb7\xd1\x41\x7a\x86\xfa\xd2\x28\x2d\x0a\x58\x77\x29\x5b\x72\x4d\xc1\x33\x88\xdc\x9d\xae\xb1\x5e\xf0\xe6\x15\x39\x11\xba\x55\x11\x42\xd9\x2a\x09\xf6\xa0\xf3\xcc\xe9\x8f\x3b\xd8\x48\x76\xf6\x11\x0b\xd7\x81\x90\x26\xd3\x71\xf2\x81\xd6\x4d\xc5\xf4\x2b\xb2\xc7\x3e\x98\x6f\xf6\x46\x64\xef\xc3\x4c\xdb\xff\x08\x33\xd3\x7b\x13\x72\x5a\x37\x15\x2f\xb8\xa9\x96\x84\x8b\x19\x53\x2a\xc4\xde\xf1\x07\x2b\xa9\xff\xe9\x94\xdc\x31\xe6\xad\x8d\x54\x74\xce\x9e\x3b\xdd\xe0\x0b\x35\x4d\xd5\x44\x06\x9f\x49\xb0\x09\xb7\xcd\xcc\x40\x44\x70\xf2\x83\x34\xc6\x8f\x86\x1c\x4f\x1b\x57\x85\x39\x96\x99\x5c\xfe\x01\xd6\xc5\xad\xc0\x73\x35\x2d\x9f\xbf\x3f\x39\x3c\x7e\x73\x32\xa9\xcb\x2f\x16\xf2\x7a\x6c\xe4\xb8\xd5\x6c\x9c\x5c\x52\x3a\x78\x65\x2e\xd9\x12\x70\xd0\xb7\xbc\x36\x8e\x8c\x9e\x17\xd5\x48\x48\x16\x80\xcf\xad\x01\xf2\xfe\xdb\xe3\x1f\xf4\x90\x48\x57\xe4\xa4\x78\xce\x4c\xf1\xbc\x60\xcd\xe2\xb9\x1b\xf9\xdf\x75\xfd\xa3\x14\x93\xb5\x39\x49\x7a\xa0\x3f\x33\xb7\xcd\x51\x9e\x0e\xd4\x5e\x0b\x59\x55\x58\x5b\x6d\x4f\xad\x23\xd6\x2c\xc2\x0d\x8f\x7a\xe5\x87\x94\xa9\x0c\x2c\x4e\xd9\xbd\xf8\x00\x01\xb4\x7e\x99\x9c\xe2\x94\x8b\xf5\x2c\x0d\xfd\x73\x06\x3e\x19\x76\xcc\x44\xc2\x4b\x4d\xf3\x2a\x11\x8f\x53\x5c\xa5\xaa\x33\x8f\xc2\x3f\xfc\xde\x7f\xa9\x99\x01\x2d\x96\x0b\x82\x7d\x94\xdf\x58\xad\x7a\x17\x1c\xc1\x3b\xc1\x4a\x43\xfc\xd0\x58\x16\x3d\xa0\x6b\x5a\x2e\x4e\x08\x84\x80\xd5\x1d\x65\x28\xd3\xd6\x2c\x98\x30\x1e\xfa\xc9\xd5\x71\xc7\xba\x10\x39\x9d\xa1\x3f\xb0\x1c\x90\x46\x29\xaf\x98\x52\xbc\x64\x9a\x0c\x56\x86\xe2\x38\x10\xaf\x1e\x35\x6b\x0d\xca\x60\xcc\x91\x30\x38\x34\x87\x3e\x67\xa2\x43\xfe\xbc\xf9\xdd\xc8\x98\xdf\x89\x5c\xf9\xfb\xc8\x92\xdf\xc5\xfc\xf8\x4c\x19\x86\xc3\x73\xe2\xf3\x67\x79\xef\x4c\x90\xa3\xa7\x76\xc2\x27\xd9\xd4\x4e\x5a\xd6\x7c\x00\x08\xdf\x0e\x88\xf4\x3c\x8a\x27\xcc\xc3\x9d\x1f\xa2\x0b\x5a\xb1\xd3\x77\xdb\x0a\x47\xb8\xe1\xfb\x21\x89\x73\xf7\x61\xc3\x94\x47\x77\xf5\xd1\x31\x63\x68\xb1\x70\x01\x02\x9f\x97\x20\x05\x40\xef\xe0\xbe\x21\x42\x96\xa9\xe9\x86\x71\x4c\xc2\xd3\x70\x7b\x5c\xc2\x93\xff\x79\xc5\x26\xe6\xd4\xb0\xeb\x44\xfb\x7d\xdc\xa9\x8d\xa9\xbf\x07\xc7\xf8\x53\x6c\x63\x63\x60\x61\x78\xfc\x22\x94\xdf\xaf\x3d\xfb\xfe\x23\x16\x93\x1b\x62\x15\x39\x8e\x01\x78\xe2\x56\xa2\xb9\x78\x05\x39\xfc\x61\x96\xa6\x8c\xb8\x5d\x97\x85\xff\xdc\xb3\x3c\x17\xc1\x42\x3a\xf4\x31\xaf\x2e\x7b\x01\x77\x78\x76\x4a\xfe\x82\xb7\x6f\x6d\xf6\x1a\x25\x0d\xba\x41\x8f\x65\x4d\x79\x72\x0d\x5a\x6f\x0e\x56\x1f\xea\x27\x23\xb6\x64\xfd\x24\x9c\x85\x7b\x89\xbb\xd9\x63\xd0\x16\x52\xcc\xf8\xbc\x55\xac\x24\x2e\x70\xb5\xb5\x59\xda\x39\x0f\xd1\x9a\xcf\x86\xec\xdb\xef\x9e\x43\x0f\xbb\x83\x49\xe7\x2d\x5a\x71\x25\xa5\xfb\x76\xef\xd1\x05\xf5\x59\x3a\x6e\xa2\x8c\x18\x8f\x22\xd6\x39\x6b\x3c\xf3\x83\x3a\x1e\x2a\xc9\x06\x8c\x2a\x34\x87\xf2\x82\xa8\xc0\xd3\x75\x10\xe3\xba\x03\x0a\x43\xaf\xd0\x88\x7c\x2f\xe7\x5c\xf8\xe3\x45\xba\x02\x9f\x19\x4d\x77\xcf\x3c\xf9\x47\xd6\xae\x27\xff\xc8\x93\x7f\xe4\xc9\x3f\x72\xf3\xa5\x75\x75\x22\xe8\xb4\x4a\xaf\xe6\xee\x17\xbc\x87\xc7\x91\xd7\x15\x9d\x13\x06\x7f\x3c\x2f\xb9\xb6\xff\x25\xe7\xe7\xdf\x43\x56\x74\x2b\xbc\xeb\x1c\x78\xd3\x69\x5f\x23\x3f\x43\x78\x96\x6e\xef\x18\x43\x35\xe7\xcd\x00\x50\xb3\x6c\x07\x59\x47\x4a\xe8\x42\xab\x7b\x20\x0e\xee\x0e\x38\xcf\x68\x00\x8a\xc4\x3a\xe8\x29\xb3\xd2\xaa\xb8\x3c\x8b\x12\x93\xa5\xb2\x9f\x89\xe8\xa3\x2c\xc6\x47\xa6\x67\xe6\x34\x43\x56\x48\x1a\xc2\x0a\x67\xb9\x82\xd7\xd1\xf3\xbc\x36\xee\x95\x90\x73\xb7\x90\xf0\x1d\xd5\x5a\x16\xbc\x2b\x25\x70\x9d\x56\xbc\x8a\x5e\x82\x8a\xbe\xb5\x49\x46\x3b\x38\xcf\x84\xa0\xf9\xbd\xc1\x32\xf1\x8c\xed\xee\xa0\x3a\xb6\x44\xb8\xf0\xf3\xb6\xb5\x49\xc0\xad\x36\x04\x45\x3b\x97\x90\xe8\x28\x59\x9d\xc7\x20\x10\x56\x53\xc1\x3d\x4a\xad\xe3\xbd\x64\x8f\x13\x5e\x90\x05\xca\xf5\x06\xae\xe5\x3a\x88\x24\xe8\xc4\xbe\x95\xd5\x4a\x07\xf5\xce\xe2\xe0\x45\x7b\xa3\x5f\xcb\x84\x9f\xb9\xa4\x72\x90\xd5\x8d\x6c\xda\x0a\x2b\xe9\xc3\xa4\xa5\xcd\xd6\xc0\x6c\x54\xa4\xed\xe1\x7d\xb6\x43\x2d\x8f\x08\xfd\x71\xdb\x1b\x32\x06\xa2\xbc\x3b\xe2\xa8\xdf\xa3\xd8\x68\x69\xba\xf4\x8f\xcb\xe0\xf1\xdc\x3e\xe0\x68\x2e\x80\xd1\x74\xef\x72\x0f\x98\xb4\xe7\xc1\x79\xf1\xbb\x6f\xbe\x19\xa0\x0c\x71\xc5\x0a\x23\xa1\x18\xd0\x81\x3d\x87\x8c\x59\xaa\x18\xd8\xfe\x88\x06\xea\xfd\xcb\x58\x0c\x66\x06\xe5\x75\x6c\x0f\x91\x74\x2b\x08\xa4\x39\x30\x30\x86\x23\x8c\x0e\x4a\xd0\xcc\x96\x35\x0f\xdd\x0b\x4e\xb7\xdc\xbd\x60\xab\x3d\x0b\xb6\xd9\xa9\x60\x7b\xfd\x09\xb6\xd8\x95\x60\xdb\xbd\x08\xb6\xd2\x81\x60\xeb\x09\xdd\x0f\xdf\x63\x20\x0b\x54\x60\x0e\x98\xc0\xa1\x5d\x04\x06\x42\x0c\xe6\x81\x17\x1c\xdc\x27\xe0\x21\xba\x03\x64\xf2\x71\x0e\xef\x04\x90\x17\x06\x6a\xdb\xa8\xff\x3b\xa4\x7a\xe3\xb5\x9b\x08\xff\x5b\xc1\xf5\xdf\x36\x9a\xff\x16\x31\xfc\xf3\x61\xc9\xe5\xc2\xeb\x1f\x8e\x21\x97\x57\x70\x6c\x09\x91\xff\x1e\x71\xf8\x1f\x04\x7d\xff\xbe\x31\xf7\x77\xb3\xb8\x6d\x28\x86\xf7\x60\xe4\x6e\x9d\x09\xba\x3b\x57\x0e\xc8\x2e\xb8\xc5\x3b\x4a\x36\x86\x17\x7c\x63\x46\xdf\x68\xfb\x19\x96\xf8\xe8\x86\x16\xb0\xaf\xdb\xcc\x15\x58\x0f\xe2\x83\x25\x83\x7d\xe5\x48\x89\x4c\x52\x78\xb3\xb8\xcb\x91\x80\x77\xe7\x2b\x19\xd1\xe1\xe3\x87\x4f\x84\x0e\x43\x7f\x24\x15\xda\x4f\xdd\x8e\x25\x43\x3f\x65\x05\x7f\xca\xb5\x8b\x59\xc1\x0f\x85\x60\xf2\xf9\x25\x66\x96\x4f\x89\x99\xf1\xb5\x83\x89\x99\x9e\x69\x75\x7c\x1a\xe3\xb1\x0b\xa6\xa5\x9c\x5a\x25\xd5\x83\xf9\x75\x32\xf8\xf0\xec\x34\x79\xf4\x42\x31\x00\xea\xa7\x95\x9e\x6c\xb2\x39\x7d\xfa\x91\xb3\x70\x43\xd7\x6a\x63\x58\xdd\x24\x0a\x6f\xf2\x94\x97\xb9\xe9\x7a\xca\xcb\x7c\xca\xcb\x7c\xca\xcb\xbc\xf9\xda\xe5\xec\xa2\x45\x5b\x53\x31\xb6\xe7\x29\x24\x75\xf6\xca\x49\x56\xd4\xf4\x09\x71\x27\xe0\x20\xa1\x85\xe8\xba\x80\xb9\xdc\x0a\xfe\x6b\xcb\xba\x48\x47\x30\xd9\x76\x20\x0f\x0c\xe8\xd8\x9d\xe5\x42\x4b\x76\xe5\x9c\x2d\xe4\x1a\x3e\xa0\x9b\xcb\xb0\x74\xfe\x68\x1c\xb6\x64\x30\x78\x2f\x30\x69\x16\x0c\x8d\xed\xb3\x15\x63\xbb\xe7\xd3\x75\x82\x1c\xe4\xe8\xb0\xe8\x70\x6c\x09\x5a\x16\xb5\xef\xee\x9a\x96\x4c\x19\xa9\xb9\x52\x52\xb9\x4c\xb5\xf8\xf5\xb1\xf0\x89\xcf\x17\x86\x29\xf4\x90\x62\x79\x46\xba\xf8\x3c\x67\xc6\xed\x02\xd8\x45\x46\x12\x2a\x10\x7b\xd5\xfe\xdb\x83\x7c\xc0\xd4\x78\x0d\x64\xca\x16\xf4\x8a\xcb\x76\x00\xa8\xda\x39\xea\x53\x7b\xee\x91\x60\x2b\x2c\x65\x1b\x72\x51\x5a\x6d\x27\x23\xac\x82\x5e\xe7\x83\xe4\xa1\xdf\x76\x0f\x05\xb7\x79\x29\x7d\x30\x7a\xcc\x3e\x70\x6d\xd6\xe7\xdc\xb3\x80\xcb\x7d\xda\xca\x66\xbe\xd2\x8d\x3d\x7d\x7f\x4c\x86\xe9\xcd\xb1\x85\x7b\x44\xf4\x5d\x20\x57\xe7\xf0\xd5\xc7\x1c\x20\xae\xdf\x0f\x42\x96\x93\x9a\x16\x0b\x2e\x32\x40\xd4\xfe\xd8\x23\xac\xe7\x09\x99\x90\xc3\xaa\xea\xea\x98\x74\x28\x1d\xf4\x9e\x91\xfe\x4b\xd9\x45\x4a\x22\xc7\x72\xae\x62\x25\xe4\x59\xa1\x8a\x05\xf5\x89\x9a\x4f\xdc\x00\x93\xab\xfa\x9a\x2a\x36\x29\x64\x4d\x8e\xce\x4f\x49\xa9\x78\x62\x07\xae\x2d\xd7\x9f\xe3\x12\x9f\xa5\x85\xae\x3f\x37\x7f\xcf\x93\xaf\x67\xa7\x7c\x3d\xa1\x84\xa1\xe2\xc5\xf2\xf4\x38\x6f\x59\x04\x3e\xd3\x2b\x9a\x3a\x94\x44\xd8\xcf\xc9\xb7\x54\xb3\x92\xbc\xa1\x82\xce\x31\x60\xb5\x7f\x7e\xf6\xed\x9b\x03\xcb\xf0\x10\x8c\x3b\x3d\xde\x58\x37\x71\x1e\x3f\xfc\xed\xb6\x10\xcf\xc9\xea\xd4\x65\xd3\xed\xd7\x9e\x9a\x38\x7d\x5b\x03\x83\x27\x41\x6d\x3d\x1b\x10\x04\xde\x00\x90\x7f\xb6\xda\xff\x0b\x0b\x15\x7c\xb3\x46\xbd\x7a\xa4\x5e\xd5\xe5\xe5\x43\x4f\xc0\x7a\x34\xd2\xda\x8f\x97\x6c\x79\x67\xe9\x3d\x86\x15\x1c\x38\x38\xbe\x47\x4d\x6f\xee\x12\x14\x65\xca\xdc\x46\xe1\xa7\x65\xcd\x7d\x42\x66\x5c\x6f\x5d\xcf\x8d\xa2\x86\xcd\x97\xc7\xac\xa9\xe4\xd2\x72\xf1\x59\x94\xb8\x83\xb7\x4e\x51\x95\x56\x53\x5a\x10\xd5\x56\xd0\x0b\xa1\x5c\xeb\x90\x28\x18\x2b\x3b\x31\xcf\x85\x36\xb4\xaa\xec\x02\xc2\xf3\x6f\xa5\xe8\x93\x95\x83\x4f\x55\x03\xc6\x48\xe7\x47\xef\xea\x77\x08\x7e\xfb\xb1\xd5\xfe\x74\x45\x00\x86\xff\x38\xbf\xdd\x25\x13\xf2\x93\x73\x1e\x53\x14\x06\x94\x68\xef\xdb\xca\x1e\xd0\x55\xd9\xef\xa8\x8c\x26\x87\x63\x05\xec\xd6\x00\xf2\xcf\xbe\xa4\x73\x01\x4a\xa6\x7b\xa9\x10\xd1\xcf\x3f\x69\x7c\x6c\xda\x7c\xbd\x40\x0d\xd4\x3e\x98\xd0\xa6\xa9\x38\xa2\x0c\x48\xe5\x92\x70\xa3\x78\xf2\xfa\x6d\x9f\x22\x6a\xef\xa8\x86\xde\x4d\xed\x1c\x93\x2b\xa6\xa6\x9f\xe2\x7f\xbb\xab\x46\x49\x1b\x0e\xe9\x4c\x9f\x2c\xc2\x52\x95\xc6\xc3\xb3\x53\x1c\x68\x53\x84\xdf\x7f\x89\x0c\xe1\x96\xda\x27\xf4\x60\x39\x9a\x0b\x03\x84\x66\x4e\x87\x67\xa7\xd8\x23\xcd\xf5\x73\xea\x42\x03\xd6\x62\xa7\x58\x7c\xd9\xb5\xa1\xa5\x73\xfb\x44\x43\xa4\x60\x77\x69\x68\x6a\x29\x60\xa2\xad\x19\xf6\x8a\x0a\xc4\x10\x2e\x60\x9c\x40\x45\x17\x81\x40\xaf\xf2\x84\xec\xed\xc5\x36\x21\xc2\xb3\xa8\x88\x6e\x10\x75\x7b\x5f\xf6\xee\xb2\x72\xad\x7b\xb1\x4f\x3d\xe1\xef\x9e\xf5\x7c\xc7\x2c\xe7\x84\x13\x33\x43\xe6\x8e\x90\xe2\xbd\x9b\xef\x1f\xde\x7f\x7f\xef\x0c\xfa\xb6\x3f\x9c\xeb\xd8\xc3\xa0\xdb\x68\x43\x95\xe1\xb4\x22\xad\xaa\x7c\x7a\x21\x22\x91\xb8\x8a\xc0\x05\xbd\x8a\xba\x21\x4d\x08\xf9\x12\xb9\xd2\x31\x03\x8a\x32\x70\x8a\xba\xee\x60\xb3\xb6\xaa\x46\x64\xc6\x05\xb5\x07\x19\x6b\x48\x94\xe4\xf5\xc9\x14\x9f\x73\x51\x30\x3b\x4d\x63\xcf\x97\x04\x28\xf7\x6e\xa3\x20\xd3\x20\x47\x33\x0e\xb9\x20\x29\x56\xbe\x15\xe0\x17\x9e\x49\x45\x8e\xaa\x56\x1b\xa6\xde\x4b\x7b\x0c\x77\xe5\x26\x64\xa6\x64\x4d\x68\xfc\xf5\xb7\x5c\x94\x77\xaa\x84\x7a\x0f\x47\x7b\x41\x05\x61\x1c\x12\xa3\xec\xd0\x90\x0f\x6d\x99\xbd\xdb\x54\xfb\xba\x2d\x16\x76\x8a\xf6\x1a\x59\xea\x3d\x2b\x9d\xf7\x30\xdc\xa8\xf7\x0e\xec\x5f\xab\xef\x8a\xd5\x1b\xd1\xef\x9e\xd3\x86\xef\x1d\x8c\x08\x4c\x38\x24\xe7\xc9\x4f\xcf\xc6\xfb\x4c\xf7\x91\x9f\x30\x70\xf5\x25\xed\xa2\xf7\xf1\x13\x60\x63\x88\x2e\xf5\xed\x7a\xc1\x0d\xd6\xeb\xd8\x9d\x82\x31\x80\xd0\x6b\x66\xf5\x20\x25\xe4\xd0\x07\xd1\xec\xd6\xaa\x19\xf5\xf9\xba\xec\x8a\xa9\xa5\x59\xb8\x06\x16\x5e\x8a\x3e\xad\x1c\xec\x8c\x41\xab\xe6\x44\x99\x5f\xa1\x6e\xbb\x81\x4c\x58\x5b\xa1\x67\x5f\x3e\x5b\x3d\x92\xba\x33\xf8\xdf\x7b\x3d\x40\x09\x4b\x5a\x8b\x1f\xed\x2f\xfb\xeb\x80\x1f\xe1\x61\x12\xc4\xe1\xf7\xdf\xbb\xf4\x14\x9c\xf0\xef\xb8\x80\xa8\x37\xe8\x43\x1e\x0b\xc0\x2d\xda\xc6\x95\x02\x0a\xff\x6d\x57\x69\xdd\xe8\xfa\x54\x43\xe9\x16\x1a\xbd\x9d\x79\xd3\xa3\x6e\x7d\x80\x33\x56\xdf\xc8\x72\xf3\x26\xee\x31\xc9\x69\x74\x73\xc8\x25\xee\xdc\x9c\xee\x59\xce\x72\x5a\x36\x1b\xad\xd0\xdb\xd7\xf4\x96\xf5\xbb\x89\x92\xce\x4f\x07\x62\x3f\xfa\xe6\xa2\x4b\x8c\x20\xb3\x8a\xce\x3b\x5e\x04\x21\x8e\x9a\xfd\xd1\xf9\x8f\xfe\x15\x34\xb9\x01\x7a\xf8\xa3\xa6\xd3\xc7\x8c\xa5\x71\x37\x4b\x37\xde\x71\x63\x28\xe3\xe3\x16\x53\x78\xf8\xcd\xdc\xf4\x29\x79\x5f\xe6\x56\x57\xfd\x4d\xf3\xef\x5d\xeb\x34\xe2\x04\xdf\x39\xce\xbb\x42\xa0\xda\x04\x74\xb8\xf3\x1f\x7b\x6c\xf2\x11\x7a\x6f\x60\xda\x4b\xb6\xbc\x96\xaa\xfc\x38\xc3\x1e\x06\x61\xe6\x7f\xe2\x8d\x79\x9f\x0c\x86\xee\x78\xb9\x31\xb0\x93\xcc\xaa\xb7\x12\x5f\xd1\x29\xab\x3e\x4e\xfa\x0d\x86\xc1\x1b\xda\xd8\xd7\xe9\x4a\x36\xd1\x23\xe5\xb2\xcc\xd0\x3a\xc5\x3a\x1f\x5f\x91\x26\xd5\x9c\x0a\xfe\x4f\xac\x73\x2d\xac\xa4\x90\x8a\xff\x73\x33\xab\xed\x63\x4c\x1f\x7d\x5c\x15\x2b\xcc\x81\xe3\xfa\x8d\x22\xfb\x23\xdb\x82\x96\x25\x47\x15\xec\xec\x23\x1c\x7c\xfb\x7c\x71\x71\x79\x97\x95\x86\xfb\xb1\xcc\xa6\x0b\xec\xdd\xe3\x32\xdf\x22\x16\x3e\xbe\x73\x6f\x4f\xa3\xfb\x84\xe3\xa9\x55\xb7\x14\x8a\xdc\xfa\xfb\x9a\x72\x3c\xb5\x37\xb7\xf1\xba\x61\x76\x1d\x37\x51\xa7\x5b\x5b\x59\x6a\xdf\x2f\x3c\xed\x01\xf6\xd5\xa0\x09\x67\x35\xe5\xa9\x33\x86\xd7\x80\x25\xab\xa9\x69\x15\x37\x1b\x4f\xea\xdb\x7f\xc8\xc5\x77\xed\x94\xfd\xc8\x94\xb6\xeb\x71\xd7\x9f\x0b\xa8\x38\x3b\x3c\x3b\xdd\x38\x2d\x79\x4e\xe4\x1b\x1d\x19\xe0\x37\x73\x94\x5b\x75\x91\xb4\x82\xd6\x53\x3e\x6f\x65\xab\xab\x65\x1c\x41\xa1\xe4\x92\x8b\x72\x42\xc8\x29\xba\x55\xc5\x33\x43\xa8\x90\x62\x59\xbb\x5b\x45\x51\xb5\x25\xeb\x3d\xf1\xa6\xa3\x4c\x12\x7a\x25\x79\x49\x68\x6b\x64\x4d\x0d\x2f\x48\x21\x99\x2a\x00\x44\x35\x7e\x7e\xab\x19\xa1\xbd\x27\x76\xbf\x2d\x5a\x6d\x64\x4d\x6a\xaa\xf4\x82\x56\xd5\x4d\x2c\x91\x41\x3b\x00\x77\xda\x8d\xdf\xda\x59\xb9\xf1\xcb\xab\x5b\xe6\xe1\xe3\xdb\x01\x06\x1e\xb4\x1d\x2c\x71\x83\x1e\x70\x75\x33\x53\x7f\xc2\x33\x1c\x02\xee\xc6\xbe\x1c\x3d\xfe\xbc\x58\x30\xd2\xb4\xd3\x8a\x6b\x30\xe1\x41\x70\x2d\xc9\x94\x2d\xb8\x2b\xbd\xf9\xb8\xc4\xba\x71\x89\x3f\x36\xcf\xb7\x89\x8c\x8f\xce\xd0\x2d\x12\xfe\xd6\xdf\xba\x13\xf0\xb4\xa6\xf3\x4f\x50\xed\x6f\xd8\xbe\xdf\x5b\xb1\x4f\xc5\x32\x9c\xa7\xd0\x4c\x55\x8f\x88\x54\xae\x90\xd8\xdb\x7e\xca\x7d\x15\x5a\x04\x2b\xf2\xce\xcd\xa8\xab\x8b\x76\xdb\x00\x50\x06\x98\x9a\x49\x55\xdb\x79\xe7\x8a\xcc\x5a\x01\xde\xf0\x1b\xec\x42\xc8\xe1\x83\xf3\xc7\x39\x33\x69\xa5\x65\x10\x06\xb0\x6c\xc2\x13\x46\xa8\x26\xd7\xac\xaa\x30\x8d\x08\x3b\xbf\x46\xb0\xcd\x1d\x96\x65\x97\x4a\x38\xdd\x6c\x5b\x96\x7c\xce\xb4\x21\xfb\xe7\x7f\x3d\x3c\x00\x85\x08\x9c\x75\x4b\x62\xe8\x7c\xb2\x92\x1f\x8e\xc9\xa4\x56\xdd\x2a\x5b\x50\xcb\x0a\x6a\x68\x25\xe7\x98\x81\x66\x45\x8a\xfd\x7d\x53\xd1\x25\x94\x71\x35\x54\x41\xad\x60\x81\x0e\x4b\xa2\x5a\x71\x53\xe7\xef\xfb\x3b\x29\x3f\x2e\x93\x6e\xeb\xa9\x7d\x4b\x78\xf8\xe3\x32\xe7\x23\x7d\x82\xef\xf7\x08\x56\xac\xf9\xff\xd8\xbb\xb6\xde\xc6\x6d\x25\xfc\xde\x5f\x41\xf8\x25\x6d\x10\x67\x71\xd0\xee\x79\xe8\x5b\xe0\xa4\x40\x70\x72\x59\x38\x69\xfb\x5a\xc6\x62\x6c\x21\x32\xa9\x92\x52\x2e\x2d\xfa\xdf\x0f\x38\x43\x52\xa2\x2d\x91\x94\xad\x38\x8b\x45\xf5\x92\x5d\x4b\xbc\xdf\x66\xbe\x99\xf9\x58\xd0\x1e\xc0\x6a\x6b\xbf\x68\xa8\x0f\xb5\xde\x02\xc0\x86\xe0\xcc\xe5\x71\x4a\xee\x70\x3e\xad\x69\xb5\x40\xff\x90\x3f\xd6\xac\xa2\x19\xad\xe8\xa9\x56\xee\xff\xf0\x29\x92\x44\x91\xe9\x8c\xfa\x07\xba\xa7\xce\x28\x8a\x8b\xf8\x1e\x77\xa5\x55\x0b\xf7\x39\x28\x5c\x76\xdd\x06\x11\xb2\x3d\xb7\x37\x68\xfe\xc5\xab\xd6\xad\x83\xa6\x7c\xaf\xae\x9b\x89\x7c\xec\xa9\xf0\x5b\x62\x66\xeb\x9a\xf1\x4a\x9d\xc2\xd0\xb4\x7f\x01\x7b\xc2\xd9\xcd\x79\x3f\x1c\x1b\x07\x92\x22\xc0\x51\xba\xcd\xe6\x2c\x50\x77\x6b\xb2\x31\x6f\x7c\x5b\xa2\x25\xca\x00\x1a\x26\x24\x6f\xa0\xdc\x9d\x4a\xf0\x71\xa0\x58\x1c\xe7\x86\xca\xa5\x51\x0a\xfb\xc1\xb6\x24\x8b\x70\x8a\x1d\x38\xc6\xac\x33\x75\xcd\xe8\xfd\x28\xcd\x2c\x1c\x65\xbf\xe9\x63\xb7\xc1\x31\x01\x5a\x05\x8b\xfc\xbb\x61\x48\x35\xa3\x27\x82\x85\xb6\xa9\x03\x2a\x1a\x35\x02\xba\x59\xe0\x39\xf1\x3e\xb1\xb7\x23\xa3\xe9\xea\x15\xb4\xca\x4b\xe4\x6f\x32\x36\xc1\xd8\xf0\xe3\xf3\x1b\x2d\xf2\xcc\x15\x80\x6b\xe9\x92\x9f\x90\x1b\x51\xe9\x3f\x17\xaf\xb9\xaa\x10\x63\x38\x17\x4c\xdd\x88\x0a\x7e\x19\xa5\xa7\xb0\x82\x63\xf6\x93\x81\x41\xd0\x00\x04\xcb\xbd\x05\x96\x98\xfe\xc0\x3b\x14\x1a\x79\x4f\x7f\x7d\xc9\xb5\x40\x83\x4d\x8e\x14\xe1\x48\xe1\x94\x29\xc0\x92\x25\x70\xc1\xa7\x36\x46\x6b\xbb\x04\xd3\x8f\x42\x7a\xdd\xb8\x73\x61\xa6\x20\x0c\x6f\x80\x37\xb9\xb2\xe7\x92\x13\x43\xa8\x85\x86\xa3\xb8\xf4\x9a\xc9\x25\xd8\x76\x17\x11\x5b\x64\x2a\x22\x9f\x84\xc3\x27\xa3\xef\x3b\x61\xee\x3b\x24\x82\x33\xe9\xaa\x17\x9f\x23\x03\xe6\x63\x2b\x2b\xdc\xf5\xd7\x08\xdc\xfd\xad\x37\x77\x18\xd2\x7f\x80\x50\x51\x9d\x92\x33\xa2\x72\xbe\x2c\x98\xf7\xce\x98\xdb\x5b\xd9\x04\x8a\x2a\x21\x4a\xf1\xcf\x3a\x7f\xa6\x85\x3e\x66\x20\x2a\xc4\x51\xb1\x88\xc7\xad\xc3\xf6\xc4\x10\x27\xea\x0d\xd1\x89\xb1\x93\x27\xf6\x36\x39\x09\x86\xc9\xb4\x67\xf4\xe4\x92\x4f\x1a\x8e\x21\x6f\x96\xba\x33\x0d\x24\xe3\x09\xbc\x9b\xec\x7e\x6e\x07\x4f\xa8\x74\x94\x91\xc4\xa7\xdc\xb0\xd8\x3b\xf5\x94\x77\xbb\x25\xa5\x4c\x12\x2b\x5f\x7e\xaf\x7e\x00\x5c\x8d\x33\x02\x24\x58\x12\x4c\x12\xfa\xd7\x36\xa3\xb3\xd6\x58\x9e\xf2\xb2\x6c\xe8\xb6\xeb\x72\x29\x69\xc6\xc8\x52\xd2\xb2\x67\xd1\x0e\x93\x4e\x51\xc4\xed\x2a\x32\xa0\x96\x7d\xfd\x3a\x50\xcf\x58\x07\x50\x87\x60\xba\x17\xf6\xb0\x12\xe2\x09\x98\x71\x60\xde\xbd\x23\xa4\xf6\x3b\x96\x75\xde\xfc\x66\xe1\x0e\x45\x32\x56\xd1\xbc\x00\x17\xc1\xdb\xab\x6b\xe3\x44\x68\x65\x35\x5b\xcb\xee\x3d\x63\x04\xdd\x90\x66\xc6\x4f\x76\xce\x9e\x73\xf6\x62\x90\xb3\xbe\x2d\x6a\x4a\x96\x8c\x83\x83\x5a\xc0\xcd\x74\x4a\x54\x9e\xb1\x0b\x08\xb5\xee\xcf\x68\x0f\x23\x59\x4f\x9d\x63\x7b\x45\xf8\xac\x8b\x9e\x73\x09\x67\x9c\x43\x50\xbe\x08\x19\x60\x96\x4f\xa3\x59\x4b\xa3\x50\x73\x51\xca\x3f\xfd\xf4\x63\xe0\x5c\x79\xcd\xd7\xf5\xfa\x67\xf2\xdf\xcf\x9f\x7f\xfc\xdc\xff\x59\xce\xf1\xb3\xff\xf4\xb7\xcf\xac\xb6\xd9\xfc\xfc\x2b\xe8\xef\xcc\xf9\x7b\x87\x0d\xf0\x09\x59\x3d\xd2\xbc\xa8\xa5\x09\x97\x48\xd4\x1e\x7f\x69\xa7\x01\xe3\x69\x13\x56\x4b\x6d\x8e\xd6\xcf\xd8\xf8\x1f\x3f\xe6\x9c\x29\xb2\x12\x2f\xa4\xe6\x92\x2d\xc4\x92\xe7\x7f\xb1\x0c\xc9\x72\x15\x3a\xc0\xc1\x55\xf2\x76\x8a\x13\xc6\xb3\x52\xe4\xbc\x82\x23\x76\x45\x79\x56\x84\x7c\x95\x12\x5a\xda\x5e\xc1\x7b\x75\x19\x9c\x46\x83\x3a\xec\xba\x49\xb1\xd1\x5d\xba\xcd\xd6\xd4\x8c\xa7\x1c\x76\xdb\x5e\x2d\xc5\x8d\xf1\x2e\x80\xb9\x74\xd4\x71\x18\x24\x80\x50\x07\xfc\xf6\x67\xcd\xe4\x1b\xc4\xed\x36\x8a\x5b\xcb\xa3\xf8\xbe\xa1\x6f\xb4\x6d\x34\x42\x25\xed\xb5\x09\x90\x0e\x48\xa6\x25\x6a\x35\x0e\x6e\x1b\xb5\x82\x34\x0c\xdd\x74\xac\xd5\x97\x9c\x11\x5e\x17\x45\xa0\xa4\x9e\x4c\xb8\x08\x59\x8e\xf1\x49\xc2\x1f\xd2\x80\x81\x54\x08\x0a\x9f\x8f\x03\xa2\xda\x0d\x1f\x49\x8b\x1a\xea\x4e\xfc\x41\x00\x15\x3e\xbb\xc0\x54\xf8\x0c\x08\x5f\x48\x0f\x5d\x48\xa3\x84\x4e\x80\xaf\xf0\x19\x12\xdb\x90\x48\xe4\xfc\x9e\x80\x16\x3e\x83\x7c\xe0\xd2\xc0\xad\x8e\xaa\x27\xfa\xb9\xbf\x23\xd0\x85\xcf\x7b\xc0\x5d\xf8\x0c\xea\xc7\x14\xe8\x0b\x9f\x5d\x7a\xf1\x00\x30\x98\x69\xf3\x21\xc1\xb0\x48\x91\x23\x43\x62\xf8\x24\x03\x63\xa6\x72\x83\x1c\x56\x07\x38\xab\x0e\x74\x54\xdd\xc3\x49\x75\xe7\xa4\x09\xe0\x19\x3e\xc3\x66\xf4\x01\x81\x34\x5b\xe0\xc1\xe0\x34\x7c\x0e\x0d\xaa\xe1\x93\x7c\x9e\x0e\x03\xd8\xda\x99\x47\xa6\xeb\x2e\x44\x57\x92\xe5\xfc\x59\xe0\x7d\x9f\x83\x94\x88\xf9\x56\xc2\x0d\x5d\xe2\x05\x8e\x51\xa3\x4c\x38\xed\xab\xad\x53\xad\x84\x78\x22\xb5\x8a\x5b\xd4\x82\xed\x8e\x84\xc7\x8e\xa2\x04\x0f\x59\x61\xf3\xba\x60\xbf\xe7\xd5\xea\xb6\xa1\x5c\x81\x65\x56\xd5\x65\x01\x7d\xd1\x7a\xa1\xe7\xe5\xbc\x51\x4e\x2e\x2b\xdc\x62\x17\x62\xbd\x66\x3c\x43\x6f\xcb\x35\x7d\x0a\x4f\x78\xa5\xd5\x5b\x8c\x2a\x28\x0a\x54\xe1\xa0\x28\xf6\x5a\x52\xde\x28\x2b\xcf\xfa\xa0\x0e\x4d\xe1\xc4\x09\x9c\x2a\x93\x25\xc7\x99\x0e\x96\xb7\x37\xe3\x4a\x5b\x81\xa1\x5e\xfc\x28\x79\x60\x85\x00\x4e\x29\x8c\x9c\xc0\x28\xa3\xe4\x50\xcb\xcb\x47\x9b\xca\x48\x4e\xe6\x9e\x22\xc6\x97\x0d\xd1\xbc\x2a\xf2\x05\x73\x47\xa6\x48\x21\xf3\x99\x1b\x69\x3a\x4d\x40\x4f\x39\xfb\x12\xcf\xbd\x01\x67\xde\x1e\xe7\x1d\x2d\xf3\x38\x14\x88\xcf\x0e\x23\x6f\xb3\x6e\x8f\xfd\xb3\xfd\x2d\x65\xf4\xed\xc7\xff\x8e\x7f\xe8\xd9\x63\xfc\x1b\xaa\xa9\xb1\x87\xdf\xdf\x51\x1b\x19\xd8\x8d\xfd\xc6\xd1\xb2\xa0\x52\x1f\xf6\x80\xe4\x4f\xc9\x6c\x7e\x71\x76\x7f\x71\x42\x7e\xfd\x72\x0e\x7f\xcf\x2f\xae\x2e\xf4\xdf\xd9\xed\xcd\xcd\xc5\xec\x5e\x0b\xcf\xc7\xd1\x2a\xc0\x45\xce\x45\x81\xa3\xaf\x25\x14\xe1\x6f\xe6\x94\xbf\x91\xc7\xba\xd2\x3b\x72\x53\x19\xaf\x96\x14\x21\x44\x9a\x65\x29\xc1\x8e\xdf\xdc\x1c\xf4\xc6\xdc\x0d\xe8\x26\x6a\xdb\xea\x33\x73\x77\xb6\x89\xeb\x8f\xb7\xec\x30\x93\x3c\x39\x4e\x73\xe8\x1c\xdf\x2d\x84\xf3\xbb\x68\xbe\xbf\x08\x49\xd8\x2b\x5d\x97\x45\x42\x84\xdc\x51\x29\x32\x75\x64\x62\x75\xf5\xbf\xe3\xdd\x0e\x49\x3e\x15\x62\x79\xe4\x42\x7c\x19\x29\xc4\x92\xa8\xfa\xc1\xc5\x6f\x83\x20\x98\x94\xdb\xb1\xcd\xc6\x0b\x46\x3d\x71\x41\xde\xad\x5c\x93\x2b\xe7\xe5\xd9\xce\x60\x48\xbd\x3e\xa9\x05\x2d\x98\x97\x93\xfe\x61\x68\x85\x8e\x3f\x75\xb7\xd0\x6a\x2a\xb9\xdc\xc8\x31\x65\xa7\x78\xc9\x8b\x6c\x41\x65\xb6\xb5\x5d\x80\xe8\x87\xab\x09\x66\x0e\x5e\x0c\xc8\x41\x70\x6c\x8a\x46\x22\xc8\x38\x62\xf5\xcc\x64\x41\x4b\x8c\x03\x84\x1b\x2d\xc1\x6f\x39\xa1\x8a\xe7\xac\x64\xc0\x23\x80\x97\x78\x31\xc2\xf8\xa2\x10\xc0\x74\x89\x52\xe7\x89\x3f\x2c\xe8\xe5\x6c\x2f\xdc\x49\x8d\x0f\xff\xc6\x8f\x57\x08\x28\x1b\x7b\xd7\xc1\x28\xb5\x5e\x36\x5a\x1b\x7f\x1c\xcd\x07\xc1\x40\xa7\x65\x33\x32\x31\x24\x12\x93\x13\x32\x71\xc4\xa3\x99\xd1\xc8\x27\xc7\x71\x4a\x67\x97\x41\x9b\x39\x00\x14\x76\xe3\xe9\x30\x85\x7a\xb6\x89\x5a\x60\x76\x5b\x1f\x8d\xe4\xaa\x37\xa4\xbc\x5a\xa4\x34\xa6\x16\x68\x83\x5f\x50\x3c\xa7\x76\x43\xb7\x6a\xdd\x30\x74\xec\x5d\xe3\xc9\xb1\x97\x7d\x65\xd9\xc9\x09\x17\x66\xf0\x24\xd3\xb3\x31\x14\x0a\xd0\x7e\xee\xbc\xb5\xe7\x7c\x5c\xda\xac\xc4\xb9\x24\x25\x95\x8c\x57\xae\xf2\xf1\x6c\xcd\x25\xce\x00\xc6\x1c\x4f\xd2\x56\x65\x70\x11\xb5\xdc\x1a\x12\xb1\x8a\x3b\x97\x62\x56\x50\xa5\x3a\x0c\x9e\x70\x06\xe8\x8c\x0d\x37\xbd\x3e\x7b\x8d\xcf\x07\x5c\x65\xba\xa2\xcf\x81\xa6\x26\x54\xba\xa2\x72\xc9\xaa\xb0\x43\x02\xe5\x6f\xb7\xc1\x4b\x20\xa6\xc9\x57\xc3\x4d\x77\x40\x8c\x72\x5e\x4d\x85\x9c\x62\x92\x9f\x49\x25\xeb\x3e\xdc\xa1\xca\xd7\x4c\xd4\xd5\x1d\x5b\x08\xde\x1d\x34\x6c\xbe\x1b\xcd\xc3\x62\x40\x24\xb5\x71\xf2\x39\xb3\xe2\x77\xfb\x66\x1a\x0b\x47\x35\xb2\xb9\x75\xec\xf1\xc9\x45\x6f\xaf\xae\xf7\x19\x6c\x02\x0c\x52\xe1\x91\xfc\xcd\x9c\xc9\x7c\xe9\x6a\x6a\x6a\x1e\x4c\x76\x5d\x57\xc3\x13\xcd\x9c\xc3\x48\xf8\x6b\xd3\x19\x61\xa2\xc7\xde\xf6\xab\x8a\x56\xf5\xd6\x6c\x88\x1d\x45\x66\x7f\xbf\x43\x22\x07\xa3\xde\xdf\x41\x56\x6d\x9b\x55\x9b\x43\x0e\x35\x3a\x24\xd1\x84\xef\x6c\x44\xc9\x29\x31\x09\xf5\x92\xad\x24\xcd\x11\x0e\xa3\x8b\xaa\xa6\xdb\x26\x77\x9d\xd8\x44\xa3\x74\x33\xc7\x06\x00\xb1\x10\x08\xb6\x60\xb2\x52\x57\x54\x55\xbf\x96\x19\xed\xe1\x10\xd8\x88\x32\x51\x15\xac\x29\xd4\x69\x5f\x38\xcb\xf4\x21\x64\xba\x04\xf3\x23\x2f\x7a\x77\xaf\x31\xc7\x8e\x0c\x23\xb3\xd2\xae\x31\x9d\x7c\xaa\x8b\xea\xae\xf5\x5c\xe8\x3e\x39\xeb\xdc\xa3\xfc\x60\x9e\x58\x6d\xf5\x89\x26\x21\x37\xc2\xd9\x6b\x97\x54\xb9\x7f\x8d\x0b\x46\x79\x77\xb0\xa5\x57\xd7\x19\x7e\x37\x7c\x4e\x99\x02\xc8\xcb\x2a\xd7\xea\x16\x72\x2d\x28\x62\x85\xd8\x8c\x15\xac\x87\x72\x61\xcf\xf8\x1f\x53\xc2\xb9\x29\x60\x5f\xd7\xe9\x2f\x7e\x76\xce\xe2\x6d\x74\x4b\x13\x95\xdb\x68\x69\x46\xf6\x71\x58\xc5\x66\x83\x41\x78\x7b\x28\xc4\xe2\x09\x49\xcd\x81\xd4\x2c\xff\x8b\xc9\x80\x90\x01\x56\xc4\x9c\x67\xf9\xc2\xb9\x2b\x94\x52\x2c\x25\x53\x5e\x57\x23\x07\xac\xc2\xdc\x75\x99\xba\xcf\x5d\xb9\x42\x36\xb6\x9d\x9a\x1b\xda\x8b\xc3\x84\x28\x59\xbd\x1c\xe2\x37\x3d\x5b\xfa\xb6\x8a\x8e\xfc\x92\x70\x2b\x86\x01\x68\xe8\xda\x04\x59\x7f\xfa\x5f\x7f\xe8\xf1\xa8\xf1\x43\xa1\x00\x68\xfc\x22\xb7\xf7\xde\x04\xbf\x0a\x84\x4a\xa7\x9a\x02\x22\x21\xd1\x24\x5d\x75\x72\x55\x4e\xc9\x6d\xd4\x98\x8a\xd1\xdd\x64\x12\xd8\x80\x87\x38\xbf\xa4\xde\x1e\x35\xc8\xec\xcd\x87\x5c\x9b\xe2\xad\x96\x46\x99\x32\xdc\x29\xe8\x1f\xf7\x28\x64\xaf\xda\x36\x5e\xe5\xc3\x01\xf4\xd1\x8c\xb4\x4c\xdb\xef\x88\xee\x1f\xdc\x76\x07\x75\x49\x4e\x08\x25\xab\x5c\x55\x42\x1a\x0f\x11\x7d\x00\x56\x92\x72\x85\xef\x7b\xcf\x8a\x7d\x5d\xdb\x67\xae\x0a\x84\x96\x25\xa3\xd2\xda\xe9\xcd\x71\x46\x15\x80\xa8\x0b\x21\xb3\xce\x8a\x59\x48\xa6\x53\x1c\xeb\x2c\x7e\x04\xee\x90\x82\xaa\xea\xde\xd5\x41\xcb\x14\x89\xbb\xb1\x2f\x31\x99\x26\x36\xad\xb1\x1c\x96\x82\x37\x2f\x05\xa1\xdc\x00\x55\x7d\x45\x24\xcd\xaf\xb8\x5c\xd2\xb4\x0d\x05\xc0\x9d\xda\xf5\xe2\x84\xbd\x56\x13\x0f\x53\xf3\x35\x53\x2a\x18\x50\xbe\xc1\x64\x03\x37\x4e\x11\x77\xe3\x94\x49\x6e\x0f\x7b\x14\x1c\x30\xb6\xc2\x32\x33\xbf\xf5\x4f\x35\x02\x62\x02\xc2\x20\x6e\x59\xed\x35\x64\xe5\x8a\xaa\xd4\xc6\xb8\x55\xe4\x62\x78\x92\x97\x43\x62\x6d\x24\xa3\x2a\xc4\xcd\x31\xc4\x09\xfa\x41\xe6\xec\x91\xcc\xe8\x9a\x15\x33\xaa\xc6\xec\x79\xd8\x1e\x42\x50\x0d\x3b\x5d\x9e\x92\xa3\x79\xcb\x4d\xe6\x46\x54\xd7\xac\x3a\xda\xad\x6f\xd2\x36\x82\x77\xdd\x02\xf6\x56\x47\xe2\x0b\x7e\xcf\xa5\xbe\x77\x0d\x03\x0b\xfb\xab\x58\xd2\x61\x5e\x9a\xbe\x65\xec\x2f\xe0\x5a\x02\x3c\xb9\xd8\x75\x21\x47\xb8\x2e\xfa\x16\x6f\xca\xb2\xfd\xa0\x05\x3b\x64\xa9\x46\x5a\xef\xb2\xb8\xeb\x84\x7a\xb6\x3a\xe2\xde\x53\xa7\xc1\x56\xd4\xf6\x8d\xc7\x9b\xa8\x72\xa5\x95\xbc\x31\x05\xa3\x8f\xe5\x8f\x32\x83\xda\xfb\x3e\x20\xf9\x4f\xc3\xe7\xfc\xbe\xdc\x54\x19\xd8\xdf\xf4\x0c\x38\xa4\xbb\xdc\xb9\x2d\xd5\x00\x30\xee\xfe\x1b\xf8\x1f\x5a\xf7\x5d\xcd\xbc\xf9\xf1\x7d\x25\x48\x29\xd9\x33\xc4\x51\x70\x88\x0f\x65\x84\x33\xa5\x17\xca\x0f\x81\xe2\x13\x55\xb6\x34\x75\x2d\xae\x4a\x47\xd5\x64\x12\x1f\x5a\xfb\x51\x68\x80\xf1\x49\xd5\x0a\x13\xb4\xee\x01\xea\x60\x5c\xa7\x1a\x90\x59\x54\xc0\x1c\x98\x5f\x37\xf0\xbc\xf9\x6c\x5c\x55\xa3\x93\xcc\x61\x3f\x47\x4f\x8b\x85\xde\x95\x17\x70\x0b\x13\x6e\xf3\xee\xa2\xbc\x36\xc8\x3c\xdf\xdc\x03\xc1\xe7\xde\x9f\xe1\x63\x35\xab\xae\xf3\xf1\xfa\x3c\x4a\x0a\x97\x9c\xdf\x57\xc0\x70\x17\x9d\x40\xef\x4b\x79\x85\x4f\x6c\xd6\x7d\xfc\x7c\x4b\x61\x3b\x0d\xce\xb1\x77\x22\x1b\x54\x4c\x3e\xb3\xcc\xb3\x30\x9a\xdb\xd0\xfc\xdf\x5a\xf6\xe8\x26\x7f\xd3\xed\xe4\xef\x7f\xbe\xfb\x7f\x00\x00\x00\xff\xff\x90\x1c\x07\x44\xe8\x50\x0c\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -225,7 +225,7 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xe4\xb6\x95\x28\xfe\x7f\x3e\x05\x4a\x49\x95\xa4\xa4\xbb\x67\x9c\xcd\xdd\xcd\x9d\x9b\x4a\x4a\x96\x34\x59\x5d\x7b\xc6\xba\xa3\xb1\x53\xfb\xf3\x7a\xd7\x10\x89\xee\x46\x44\x02\x34\x01\xb6\xa6\xb3\xde\xef\xfe\x2b\x9c\x03\x80\x64\xbf\x08\x50\xdd\x2d\x8d\x97\xf8\xc3\x1e\xb1\x49\x3c\x0f\xce\xfb\x41\x0b\xfe\x1d\x2b\x15\x97\xe2\x0d\xa1\x05\x67\x9f\x34\x13\xe6\x2f\x35\x79\xf8\xa3\x9a\x70\xf9\x6a\xf1\xc5\xaf\x1e\xb8\x48\xdf\x90\xcb\x4a\x69\x99\x7f\x60\x4a\x56\x65\xc2\xae\xd8\x94\x0b\xae\xb9\x14\xbf\xca\x99\xa6\x29\xd5\xf4\xcd\xaf\x08\xa1\x42\x48\x4d\xcd\x63\x65\xfe\x24\x24\x91\x42\x97\x32\xcb\x58\x39\x9e\x31\x31\x79\xa8\xee\xd9\x7d\xc5\xb3\x94\x95\xd0\xb9\x1b\x7a\xf1\x7a\xf2\xc5\x1f\x27\xaf\x7f\x45\x88\xa0\x39\x7b\x43\x54\x75\xaf\x92\x92\x17\xd0\xd3\x44\x16\xac\xa4\x5a\x96\x6a\x92\xc8\x92\x49\xf3\xbf\xfc\x57\xaa\x60\x89\x19\x63\x56\xca\xaa\x78\x43\x36\xbe\x83\xdd\xb9\xa9\x50\xcd\x66\xb2\xe4\xee\x6f\x42\xc6\x44\x66\x39\xfc\x1b\x97\x78\xd7\x18\x15\x1e\x67\x5c\xe9\xaf\xd6\x7e\xfa\x9a\x2b\x0d\x3f\x17\x59\x55\xd2\x6c\x65\xb6\xf0\x8b\x9a\xcb\x52\xbf\xaf\xc7\x36\x63\xa9\xea\xbe\xf9\x6f\xfb\x22\x17\xb3\x2a\xa3\x65\xbb\x93\x5f\x11\xa2\x12\x59\xb0\x37\x04\xfa\x28\x68\xc2\xd2\x5f\x11\x62\xb7\xcb\xf6\x39\x26\x34\x4d\xe1\x08\x68\x76\x5b\x72\xa1\x59\x79\x29\xb3\x2a\x17\x7e\x4c\xf3\x4e\xca\x7c\xaf\x6f\xc8\xc7\x39\x23\x05\x4d\x1e\xe8\x8c\xb9\xf1\xee\x59\x4a\xb4\xf4\x1f\x10\xf2\x77\x25\xc5\x2d\xd5\xf3\x37\x64\x62\xb6\x78\x62\x76\xb0\xf1\x33\x9e\xcf\x2d\x76\xd2\x78\xae\x97\x66\xba\x4a\x97\x5c\xcc\x76\x0d\x9f\x50\x4d\x33\x39\x23\x08\x46\x64\x2a\x4b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xd4\xcd\x6f\xc7\x8c\xf0\xd3\xb5\x39\xdd\xad\x3e\x0e\x9e\xd2\x9c\x0a\xc1\x32\x22\xa7\xa4\x2a\x52\xaa\x99\x22\x5a\xd6\xfb\xb3\x7b\x7b\xec\xc7\x6b\xb3\xb9\x5c\x7b\xbe\x61\x3a\xf8\xea\xe2\x0b\x9a\x15\x73\xfa\x85\x7d\xa8\x92\x39\xcb\x69\x7d\x86\xb2\x60\xe2\xe2\xf6\xe6\xbb\x7f\xba\x5b\xf9\x81\xb4\x97\xd2\x04\x51\xf2\xc0\x58\xa1\xea\x4b\x41\xaa\xc2\xac\xc9\x2c\x8e\xdc\x2f\x89\x2e\x69\xf2\xc0\xc5\x0c\x96\x3e\xc3\xf5\x5e\xe2\xc1\xa8\xc9\xda\x94\xe5\xfd\xdf\x59\xa2\x1b\x8f\x4b\xf6\x53\xc5\x4b\x96\x36\xa7\x62\x76\xd6\x61\x82\x95\xc7\x66\x9f\x1a\x8f\x8a\xd2\x4c\x4b\x37\xee\x21\xb6\x06\x2a\x6a\x3d\x5f\x59\xe6\xcf\xe3\x95\x5f\x09\x31\xbb\x83\x5f\x92\xd4\xe0\x25\xb3\xa0\x39\x73\xd7\x85\xa5\x76\x4b\xcd\x01\xeb\x39\x57\xa4\x64\x45\xc9\x14\x13\x88\xa9\xcc\x63\x2a\xec\x2a\x27\x6b\x9d\xdf\xb1\xd2\x74\x64\xae\x74\x95\xa5\x06\xa1\x2d\x58\xa9\x49\xc9\x12\x39\x13\xfc\x1f\xbe\x77\xd8\x44\x33\x6c\x66\x20\x48\x13\xb8\x90\x82\x66\x64\x41\xb3\x8a\x8d\x08\x15\xe9\x5a\xdf\x39\x5d\x92\x92\x99\x71\x49\x25\x1a\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xc9\x08\x17\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x66\x5c\x3b\x54\x9d\xc8\x3c\xaf\x04\xd7\xcb\x57\x80\x75\xf9\x7d\x65\x8e\xfe\x55\xca\x16\x2c\x7b\xa5\xf8\x6c\x4c\xcb\x64\xce\x35\x4b\x74\x55\xb2\x57\xb4\xe0\x63\x58\x8c\x40\x24\x9b\xa7\xbf\x2e\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc8\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\x5b\x9f\x89\x79\x64\xb6\xf1\xc3\xf5\xdd\x47\xe2\x66\x84\xe7\x86\x47\x54\xbf\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x4a\xfc\x72\x5a\xca\x1c\x7a\x65\x22\x2d\x24\x17\x1a\xfe\x48\x32\xce\x84\x36\x37\x3d\xe7\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x09\xa4\x8d\xdc\x33\x8b\x23\xd2\xf5\x57\x6e\x04\xb9\xa4\x39\xcb\x2e\xa9\x62\x47\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xf8\xf4\x9a\x84\x7b\xfd\x83\xb5\x5b\x4f\x88\x23\xb9\x5b\x8f\xbb\x89\x82\xee\x0a\x96\xf8\xeb\x48\x05\xb9\x28\x8a\x8c\x27\x78\xe3\xf4\x9c\x6a\x92\x50\x61\xb6\x93\x0b\xa5\x69\x96\xb1\xd5\xdb\xb1\x75\x16\xdb\xf0\x0f\x01\x64\xb3\x42\xae\xdc\xe3\x35\x9a\xd1\xfe\xc1\x93\xd9\x95\x37\xb6\xe1\x2a\xd3\x2c\xe6\x5f\xff\x61\xc7\x96\x13\x64\x89\xa6\x7c\xb6\xe9\xb3\xad\x7b\x79\x09\x9f\x00\x33\x45\xb9\x50\xb6\x8b\xaa\xc4\xdd\xac\x69\xa7\xa1\xa6\xb4\xc5\x49\xac\xc3\xe1\xce\x9d\xed\x5a\xb3\x69\x74\x0a\xac\xdf\x72\xf3\xaf\xdd\x08\xc0\xb5\x9b\x69\x3d\xf3\x11\x91\x0b\x56\x96\x3c\xb5\xa8\xbb\x90\xe9\xa9\x02\xc4\x9a\x56\x19\x10\x2a\x29\x94\x2e\x29\xdf\x78\xe9\x5d\x13\x3c\x33\x8b\x1f\x53\x8d\x37\x88\x29\xf2\xc8\xb3\x8c\xfc\x56\x48\xfd\x5b\x3f\x02\x0c\x20\x4b\x3e\xe3\x1e\x3b\x2b\xc2\x85\x1b\x17\xc8\xba\xe5\x4b\xa4\x62\x2b\x1d\x6e\x1f\xfc\x5b\xc5\x08\xcb\x0b\xbd\x74\x68\xea\xec\xbf\xfe\xfb\xdc\xd0\x04\x56\x52\xd5\x18\xb0\xd5\xdf\x56\x4c\x8f\xad\xe3\xa4\x48\xc0\x69\xc1\xbe\xc8\x94\x5d\x74\x9c\x1a\x59\x3d\xb9\x2b\x86\xec\x8f\x82\xcf\xfd\xa9\x37\x0f\xa5\xac\x32\xa6\x3c\x0b\x67\xf6\x6e\x47\xe7\x01\x6b\x09\x5d\x0f\xbe\xc7\xa6\xac\x2c\x59\x7a\x55\x99\x5b\x76\xe7\x67\x75\x33\x13\xd2\x3f\xbe\xfe\xc4\x92\x4a\x6f\x60\x29\x76\x2e\x7d\x07\xd0\xba\x66\xf8\x46\xbb\x13\xac\x44\x28\xc3\x19\x01\xeb\x68\x7f\x30\x5b\x02\x6c\x81\xd9\x41\x85\x58\x4f\x51\xcd\xd5\x74\xd9\x39\x80\xd9\x51\xbf\xe7\xec\x93\xa1\x78\xc0\xfb\x37\x6e\xbb\x61\xe4\x80\xb8\x71\x96\xa5\x23\x72\x5f\x69\xc2\x35\x50\xbe\x64\x2e\xa5\x5a\xc7\x76\xab\x8d\xe2\xd1\xc2\xbc\x16\x5c\x02\xe3\x42\xa4\x30\xc0\x4a\x72\x43\xae\x80\x61\x62\xcd\xe1\x27\xb0\xf2\xfa\x33\xbe\x4a\x6d\xd6\x5b\x2e\x95\xae\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x47\xae\xe7\xf0\xc7\xac\x64\xc8\x34\xa9\x2a\x37\x83\x3e\x32\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x26\xf3\xc6\xb4\x72\xc6\xb4\x22\x34\xcb\xdc\x12\x9a\x50\x8b\xd4\x23\x37\x0c\x04\x39\x73\x1c\x46\xe7\x28\x96\x3b\x18\x79\xea\xb3\x0a\x78\x1b\x8f\x6b\x44\x98\x4e\x26\xe7\xa3\xce\xee\x13\x99\x17\x06\x21\x50\xd8\x83\xfb\x25\xe1\xda\xf0\xee\xc8\x0d\x95\xb2\x9a\xe1\x4e\xb1\xcc\x4e\xdc\xf1\xb2\x70\xf8\x86\xb9\x04\x69\x70\x03\xb9\x59\x6d\x27\xb8\xb9\x27\x8e\x5d\x35\xc3\x71\xdc\x24\xd8\xbf\x9c\xea\x64\x6e\xd1\x70\x22\xcb\x92\xa9\x42\x0a\xd3\x33\xfe\x72\x5d\xaf\xed\xff\x98\x77\x3a\xc7\x33\x9d\x9e\xa9\xf3\xfa\xb0\xe7\x7c\x36\x77\x67\x4d\x4b\x44\xc7\x6d\x18\xe9\x3a\x72\x44\x25\xb4\x2c\x69\xd7\x3d\xe2\x9a\xe5\x1d\x88\x84\xf4\xb8\xfd\x84\x5c\x08\x8b\xec\x6b\xc0\x6e\x80\x98\x66\x65\xee\x37\x12\xa0\x10\xd0\x9e\xc2\x4d\xe0\xb9\xe1\x84\xb8\xb6\x60\x4e\x5e\x07\x8c\x77\x66\x6e\x02\xe1\xfa\x54\xc1\xad\x1d\xcb\xe2\x7c\x42\x2e\x88\xa8\x3c\xe2\xd9\x35\x05\x21\xfd\x0c\x6c\x47\x66\x5a\x4a\xd6\x7d\x75\xe3\xa3\x30\xf4\x8d\x6d\x3b\x83\xb6\xde\xc6\x76\xfe\x4c\x04\x5c\x42\xf3\x3a\xee\x5a\xe7\xab\xa1\x84\xc4\xbd\xed\xe6\x10\xf2\xf6\x0a\xc4\x5c\xe0\xcd\x51\x2c\x63\x89\x36\xd4\x90\x95\xf9\x88\x50\xa5\x64\xc2\x8d\xa8\x50\xc3\x7e\xfb\x42\xe1\x4a\xba\xf7\x9e\xc4\xee\x3f\x89\x5e\x3f\x01\x69\xb4\x7d\xbf\x43\xbf\x5b\xdb\x8d\x8c\x2b\x6d\x10\x54\x7b\x57\x5a\x78\xf7\x7e\x09\xbf\x9e\x2a\x92\xd1\x7b\x96\xed\xe0\xab\x56\x5b\xf8\xe5\xaf\x5b\x20\x1a\xd8\xb2\xa0\x20\x84\x50\xb7\x55\x68\x68\xac\xdb\xca\xbd\x1e\x4e\x40\x0c\x72\x4c\x3d\xb2\x82\x23\x42\xc9\x03\x5b\x8e\x10\xa5\x0b\xaf\xc2\x89\x9a\x02\x74\x5c\x32\x24\xe8\x06\xee\x1e\xd8\x12\x3a\xdc\xcd\x6e\x6e\xec\x2a\x16\xee\xb0\xc5\x60\x80\xba\x8d\xcd\x44\x23\xbf\xe8\xb1\x41\xf1\x57\x03\xdb\x03\xdb\xc9\x3e\x6f\x6a\x6b\xca\x46\x00\x77\x38\x0f\x38\x24\xa0\xc0\x0e\x1e\xa8\x11\x91\xd9\x66\xfd\xc3\xee\xb6\x53\xe0\xdc\xd5\xdc\xee\x3d\x69\x5d\x91\x17\xc4\xb4\x0f\x5e\x87\x83\xf0\x7e\xaa\x10\x5e\x0d\xde\x99\x73\x50\x56\x9a\x8b\x02\x68\x24\x1e\x68\xb1\x7d\x47\x33\x9e\x36\x74\xa0\x86\xd9\xb8\x11\x23\xf2\x5e\x6a\xf3\xbf\xeb\x4f\x5c\x19\x1e\xf3\x4a\x32\xf5\x5e\x6a\xf8\x73\x42\xfe\xaa\xf1\xea\x7d\x1d\x88\x97\xeb\xd6\xfb\x0c\x70\x7d\xc7\x3e\x81\x0b\x81\x48\xd4\xec\x70\x53\x13\xa7\x26\x46\x32\x07\x16\xdd\xee\x9c\xc1\x5a\x37\xc2\x08\x05\xb8\x73\xd1\x43\x81\x32\x16\xe5\x6c\x1c\x32\xaf\x14\xa8\xd2\x84\x14\x63\x60\xa3\x36\x8e\x89\x07\x64\xc6\x6d\x1e\xd1\x1e\x87\xdf\x3e\xf4\x5f\xb5\x19\xf6\x6b\x3d\x6a\x7c\x1c\x3d\x6e\x63\xb0\x39\x5d\x00\x6b\xcf\xc5\x2c\xf3\x4c\xfc\x88\x3c\xce\x79\x32\x47\xe9\x11\x34\x61\x9a\x95\x45\xc9\x0c\xc7\x40\x41\x67\x66\x9e\xcc\x58\x19\x0f\xfa\x1f\x8d\x68\x80\xe3\xa3\xbe\x3b\xa3\x09\x4b\x49\x0a\x22\x0b\xaa\x5e\xa9\x66\x33\x9e\x90\x9c\x95\x33\x46\x0a\x43\xfa\xfb\x01\x7c\x1c\x25\xc6\x16\x4d\x8f\x9b\x03\xf6\xb8\x61\x84\x7c\x1a\x3f\x54\xf7\xac\x14\x4c\x33\x35\x36\xfc\xc9\xd8\xce\x5e\xcb\x9c\x27\xc1\x9d\xed\xa5\x1b\xe0\xb3\xde\x1a\xb9\xed\x48\x2c\x16\xc8\x88\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x15\xdc\x06\x16\xeb\xc9\xc3\x0f\x2c\xd6\xc0\x62\x1d\x9d\xc5\x6a\x75\x91\xd3\x22\xb6\x07\xd4\xcb\xf5\x50\x04\xfe\x0d\x15\xba\xab\x9a\x3f\x60\xf8\x9c\x5f\x43\x5b\x05\x68\xf8\x98\x3b\x4b\x9c\x3e\x82\xda\xd0\x5a\x22\x4b\x2a\x66\x8c\x7c\x31\xfe\xe2\xf5\xeb\x18\x05\xa1\x05\xe7\xa0\x2f\xa6\xb2\xcc\xa9\x86\x6f\xfe\xe9\xf7\x1d\x5f\x3c\xe1\x54\xb6\xd9\x4b\x8e\x63\xa8\xb3\x98\xc7\xdb\x66\x5a\x2c\xf2\x16\x5b\x1a\x90\x31\x21\x35\xc9\x99\x26\xb4\x9b\x27\x6b\xaa\xdd\x79\xce\x46\xce\x1c\x8a\x68\xc7\xba\x8d\x38\xa3\x60\x4a\xa4\xb0\xa6\x17\x73\xf8\xdd\x87\xdb\x6b\x05\x09\xa3\x8a\x19\x12\x7f\xcf\xcc\x2a\xba\x4d\x81\x9a\x28\x99\x9b\x59\x73\xa1\x1d\x12\x33\x4b\x60\xee\x60\xc8\x19\x9b\xcc\x26\x24\xad\xa0\x5b\x2a\xac\x1f\xcc\x39\xae\x56\x2d\x95\x66\x79\xb7\x2d\xd0\x10\xc3\x12\xfe\x67\xb6\x45\x97\x4b\xb0\x90\x2f\x98\xd0\x15\xcd\xb2\x25\x61\x0b\x9e\x68\xbf\x7f\xe0\xb6\xc3\xb5\x0a\xda\xa9\x08\x36\x3a\x9c\x75\x1e\xaf\xdd\xd0\x2e\x22\x15\xc3\xf9\xae\xf5\x1d\x82\x73\x5a\x37\xe0\x83\x5d\xc9\x64\xab\x4c\xa8\x4d\xbf\x68\xb6\x85\x7f\x02\x70\x7f\xf3\xa1\xdb\xca\x46\xa2\xe9\x4f\x04\xcd\xe9\xc7\x5a\x59\x83\x97\x2c\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xd6\xad\x91\xd3\xc0\x01\xf5\x9c\xa1\x91\xf2\xe2\xfd\x55\xd8\x8e\x11\xeb\x1c\xf0\x51\x16\x32\x93\xb3\x65\xf3\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb0\x36\xe8\x2d\x9e\x3c\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x77\x1b\x58\xac\x9d\x6d\x60\xb1\x7c\x1b\x58\xac\x81\xc5\x1a\x58\xac\x81\xc5\x1a\x58\xac\x63\x75\xf3\x54\xd3\xd0\x93\xa6\xd0\x6f\xf0\x42\xa6\x4f\x08\xde\x2a\x64\xba\x23\x76\x0b\x75\xfa\x89\x1c\x67\x32\xa1\xda\x86\xd9\x9a\x4f\xac\x15\x4a\xd1\x1c\xcd\x14\x23\xf2\x0f\x29\x18\x46\xb3\x98\xeb\x01\xc6\x02\xa9\xe7\xac\x34\xaf\x9f\xa9\xf3\x9d\x21\x04\x43\xec\xd7\x10\xfb\x35\xc4\x7e\x6d\x6d\x2f\x26\xf6\x6b\x4e\x15\xc2\x2d\x92\xc6\xed\xa1\x60\x0d\x9c\xf4\x91\x95\xf9\x2f\x34\x12\xcc\x80\xbb\x05\x47\x48\x12\x51\x83\x14\xee\x4c\x6a\x0d\xfe\x2c\xbd\x6d\xef\x87\x15\xab\x61\x51\x34\x4d\x59\x4a\x0a\x56\x8e\x11\x44\x25\x99\x72\x91\x6e\x58\xab\xdb\x9f\x6e\xf4\x70\xc0\x50\xac\xf6\x3a\x82\xbe\x39\x4c\x3c\x56\x7b\x22\x3d\x8c\x8a\x4d\xcb\x68\x8b\x08\xbe\x88\xe8\xac\x58\x09\x7d\x4c\xb4\x35\x28\x7e\x15\x28\xa3\xc7\x8b\xd9\x20\x1c\x3b\xf3\x63\x4f\xf5\x53\x94\x28\x74\x61\xe5\xf1\x9f\x2a\x56\x2e\x21\x3e\xbf\x16\x3b\x7d\x2e\x12\xeb\x11\xc3\x15\x49\xa8\x42\xb2\x1a\xc3\x2a\xdf\x4c\x31\x6a\x52\x54\x59\x36\xc2\x7e\x56\x2f\xab\x43\x73\x00\x07\x42\x9a\xdf\xa3\x35\x62\x91\x2a\x9a\x7e\x3a\x90\xfe\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\xa3\xed\xe3\xd8\xfa\x0a\x30\xbd\xc4\x97\x27\xcb\xeb\x3b\xf6\xe4\x09\x7a\x45\x78\x39\x7a\x32\xfb\xd1\x2d\x92\xfe\xfa\x45\xd2\x5b\xc7\x48\x7a\xe9\x19\x49\x5f\x5d\x23\x79\x82\xbe\x91\xf4\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xc3\xa8\x1f\xc9\xd3\x84\xf3\xfe\x6a\x48\xb2\x87\x8b\xd5\x1c\xbf\x91\xd9\xe9\x70\x7a\x49\x12\xaa\x9b\x84\x6b\xd5\x52\x4f\x1e\xfb\x5c\xfa\xa9\x26\xc9\x9e\x4e\xc5\x65\xc6\x01\x5d\xd8\xb1\x94\x95\xe4\xf9\x15\x96\x3b\xa7\x60\x87\x0f\xd6\xf0\xf5\x1a\xfd\x09\x5a\x41\xf2\x24\xcd\x20\xe9\xaf\x1d\x24\x4f\x05\xf6\xbd\x69\x09\xf7\xda\x15\xf0\x49\x5f\x83\x1f\xda\x13\xb8\xad\xe8\x1b\xd8\x18\x16\xb9\x8b\x9c\x16\xe6\xf6\xfd\x97\x61\x22\x00\x30\xff\x9b\x14\x94\x97\xca\x48\x37\x56\xaf\xdd\xfc\xcd\xaa\xef\x1a\xdd\x44\x4f\xa0\x30\x03\x1b\x1a\xbf\xa0\x99\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\x79\x84\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\xf2\xc0\x96\x27\xa3\x20\xf5\x40\xbb\x35\x6f\xf6\xc9\x8d\x38\x41\xd6\x69\xed\x5e\x7a\x3e\x4b\x8a\x6c\x49\x4e\xe0\xb7\x93\x7d\xf3\xa8\x3d\xf8\xa3\x66\x6a\xd6\xbe\xec\x47\xaf\xeb\xf4\x54\x05\x37\x69\x41\xdf\x57\x6c\xd9\xd7\x11\x21\x0a\xe6\xdf\xb5\x46\x74\x0c\x35\x80\x99\x91\xdd\x3d\xdf\x84\x99\x59\x81\x65\xb2\x3a\x2a\x54\x57\xf1\x2c\x8b\x18\xed\x9e\x11\x4d\x1f\x18\x58\x78\x24\xa4\x96\xe3\x29\xc3\x64\x7a\x08\x3a\x30\x92\x01\x99\x4a\x41\x7a\x5c\x92\x49\xf9\x50\x15\x0e\xf4\x5c\x36\xc9\x88\x21\xb9\x48\x64\xee\x7c\xea\xd1\xaf\x75\x64\x13\xcc\x3d\xb0\xe5\x18\x73\x60\xe2\x73\x18\x18\x48\x80\x55\x4d\xfc\xd8\x12\xcc\x7f\x24\x54\x91\x1f\x81\xa9\x14\xe4\x0c\x3e\x3c\xff\x31\xc6\xa5\xc0\x6f\x20\x6a\x5f\x65\x05\x98\x85\x19\x62\x69\x27\xa8\x56\xf7\x76\xd7\x8e\x45\x0c\xed\x32\xc5\x35\x37\xe3\x14\xed\x0d\x67\x54\x68\x7e\xee\x95\x34\x13\x02\x70\x00\x5c\x72\x2a\xc5\xa9\xc6\xf9\x39\xbc\xe6\x3a\x88\xf1\x3a\xf0\xfb\x5e\x5b\xfc\xd0\x5a\x80\x47\x9e\xb2\x29\xad\x32\x6d\xb3\x91\x1a\xd4\x07\x94\x3e\x62\x84\x8f\xce\x5e\x62\x19\xfe\xa9\x2c\xef\x79\x9a\x32\x01\x21\x0e\x6e\xfa\xf7\xd2\x05\x04\xd5\xe0\x6e\x30\x5b\xeb\x8c\x63\x86\xbd\xc8\x94\x1c\xad\xf6\x98\xf8\x6c\xa5\xe6\x16\x3d\xce\x99\x68\x0f\x40\xb8\x32\x9b\xaa\x58\x04\x53\x7b\x14\xd7\x9f\xa7\xe3\xbc\xde\xae\x57\x5c\x3d\x03\xde\x5b\x1d\x74\x40\x7d\x41\xa8\x4f\x48\x3d\x60\xbf\xcf\x16\xfb\xad\x01\xfd\x3e\x10\xe0\x5a\xa7\x03\x0e\x8c\xc6\x81\xc2\xa5\x41\x7e\x66\x2b\x00\x2a\xc6\xd0\x8b\xd5\x4d\x49\xd5\x3a\x33\x08\xf4\xea\xa7\x2f\x73\x61\x70\x80\x67\xa1\x87\xd4\x19\x43\x2b\x61\x93\xc1\x83\x39\xb4\x1e\x16\xf1\xc5\xaa\xcd\x3d\x62\x4c\x27\xb8\x48\xc1\x14\xa8\xd8\x99\xf7\xaf\x68\x0c\x03\xbd\xc6\x2c\x05\x42\xe1\x6a\xf5\xa1\x48\x57\x83\xe3\xea\xbe\x41\xaf\x9f\x33\x2a\x14\x39\x71\x2e\x1e\xa7\xaa\x7e\xe3\x24\xea\xbe\xb9\xd4\x97\x7e\x6c\xc8\x74\xdc\x4c\x77\x59\x0f\x3d\xd8\x51\x06\x3b\x4a\xb3\x0d\x76\x94\xf5\x49\x0c\x76\x94\x6d\x6d\xb0\xa3\xf4\x1a\x7f\xb0\xa3\xb4\xdb\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xc1\x8e\x12\xfa\xd1\x3e\xec\x28\xb5\x18\x74\x0c\x39\xba\x29\xb2\x5a\x3f\x71\xac\xb2\x45\x35\x4f\xea\xa8\x50\xf7\x16\xfe\xeb\xb9\x84\xea\xa6\x18\xfc\x54\x91\xba\x29\xa0\xaf\x69\x30\xa2\x25\xea\xad\xf2\xb3\x97\xb0\xd7\xc6\xd8\x93\x68\xfd\x0b\x57\x2e\x35\x1c\x58\x8f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x9e\xd5\x71\x2e\x29\x39\x73\xba\xd6\x73\x73\xe0\x42\xea\xf6\x8f\x42\xf3\x71\xfd\x86\x77\x10\x06\x95\xb0\xcb\xe6\x16\xb3\xe9\x4e\x66\xa9\x75\x8f\x62\xa5\xec\x65\x0d\x6d\x06\xff\xb3\xb2\x35\x5b\xae\x6c\x25\x35\x08\x4d\x2b\x2b\x21\x0c\x7b\x24\x85\x8d\xe2\x88\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xfa\x98\x1a\x01\x00\x54\x63\x99\x44\x9b\x73\x49\x0a\xab\x24\x37\x4f\xb0\x9f\x88\x49\xf8\x0b\x0b\xfb\xc9\xfd\x8a\x62\xee\xea\x35\xdc\xd1\xe6\x64\xb9\x82\x73\xa4\x59\x26\x1f\x63\xe8\x53\xe4\x8d\xe8\x9d\x1c\x30\x18\x7a\x1f\xa3\xb3\x08\xae\x78\xcb\x87\xf2\xea\x43\xaa\xc1\x9d\x6d\x48\x35\xf8\x32\x52\x0d\x36\xec\xa0\xcd\x9c\x83\xdd\x7b\x05\x39\x09\x0f\x9a\x73\x90\x90\xbf\xcd\x19\xdc\xa2\x92\xa1\xf1\xb2\xca\x34\x2f\xea\x28\x63\x85\x27\x94\xa1\x48\x3d\xb5\xd1\x80\xed\xdb\x6b\x66\x43\x93\x79\xe7\x50\x2b\xb7\x1c\xc6\x83\xa8\x65\x05\xd8\x14\x23\xe6\x40\xff\x8e\x89\xfe\x9c\xac\x8d\x61\x87\xfc\xb9\xa3\xa9\x82\xf0\xdf\x95\x2b\x18\xda\xb0\x81\x2b\x72\x66\xa8\x63\xb6\xb4\x56\xe3\x16\x22\x6c\x91\xd5\x80\x01\x50\x0f\xb6\x60\x8e\x41\x9d\xf1\x05\x13\x35\xf5\x3d\x53\xe7\xe7\x8e\x27\x5e\xe5\x1f\x02\x7a\x7f\x0a\x87\x11\x82\xb5\x63\x39\x83\x15\x7a\x1f\x30\xc2\x06\x8e\xe0\x4f\x0d\x2a\xfb\xe7\x6e\x9e\x20\x60\x10\xbc\xd2\x2e\x3c\xb3\x71\xd0\x35\x2f\xd0\xd9\xcb\x01\xa3\xe0\x62\x42\xad\xe2\xb4\xe2\x3d\x42\xac\xfa\x66\xca\x3c\x6c\x68\xd5\x41\xc3\xaa\x3e\x9f\x84\x96\xcf\x6c\xfe\xfb\x0c\xb2\x31\xbd\x10\x73\xdf\x90\x8e\x69\x5b\x7b\xae\x74\x4c\x07\x37\xe7\x7d\x76\x59\x99\x8e\x6a\xbe\x3b\x8e\xe9\xee\x33\xcb\xca\xf4\x2c\xa6\xba\x17\x9e\x9f\xe9\x70\x26\xba\x21\xf9\xd1\xf3\xe4\x97\x8c\x35\xc3\xf5\xbf\x55\xcf\x6a\x7e\x7b\x56\xd3\xdb\xf3\x9b\xdd\x7a\xf1\x2a\x4f\x35\xb7\x45\x5f\x93\xa7\x9a\xd9\xfa\xb8\xec\xf7\x83\xe7\xe3\x85\x28\x1d\xd9\x47\xff\x65\x84\x26\x3d\x93\x63\xfe\x73\x39\xe5\x1f\xd6\x21\xff\x19\x42\x91\x8e\x12\x86\x14\x4b\xf6\xa3\x88\xfd\xd3\x70\x57\x1f\x8a\xdc\x33\xe4\xa8\x27\xfe\x3a\x66\xa8\xd1\x2f\x00\x85\xf5\x0a\x31\x1a\xb0\xd8\x33\x61\xb1\xfd\x85\x14\x1d\x2b\x9c\xe8\x17\x86\xcb\x7a\x86\x0e\xed\x4d\xbb\x7d\x98\x90\xa1\x63\x87\x0b\x1d\x20\x54\xe8\x39\xc2\x84\x0e\x10\x22\x34\xd8\x04\x02\xdb\x60\x13\x08\x6d\x83\x4d\x60\x5b\x1b\x6c\x02\xab\x6d\xb0\x09\x0c\x36\x81\xc1\x26\x30\xd8\x04\xd6\x07\x1c\x6c\x02\x83\x4d\x20\xac\x0d\x36\x81\xe3\xd8\x04\x62\xc3\x6e\xfa\xc1\xf2\xf3\x84\xdb\x1c\x37\xd4\x66\xff\x61\x36\xcf\x18\x62\xf3\x0b\x53\xb8\x44\x87\xd3\xf4\x03\xf3\x97\x12\x46\xf3\x32\x42\x68\x9e\x3d\x7c\xe6\xa9\xa1\x33\xfb\x09\x9b\x89\x80\xf6\x9e\x70\x5e\xc8\xf4\x42\x68\xfe\xd4\xc2\x47\x4d\x00\xdc\x56\xfd\x88\x2e\x24\x4f\x49\x51\x69\x5b\x70\x65\xa8\x80\xd4\x09\x03\xc7\xa9\x80\xd4\x3a\xbc\xa1\x0c\xd2\xae\xf6\x62\xca\x20\x6d\x3b\xb3\xa1\x16\x52\xbb\x0d\xb5\x90\x86\x5a\x48\x43\x2d\x24\x6c\x43\x2d\xa4\xa1\x16\xd2\x90\xc3\x6f\xc8\xe1\x37\xe4\xf0\x0b\xff\x6a\xc8\xe1\xb7\xbd\x0d\x39\xfc\x62\xda\x90\xc3\x2f\x78\xf4\x21\x87\xdf\x90\xc3\x2f\x6e\xe0\x21\x87\x1f\x19\x72\xf8\x0d\x39\xfc\x3e\xe3\x1c\x7e\x43\x2d\xa4\xcf\xa2\x20\xc8\x50\x0d\x24\x62\xec\x97\x55\x0d\x64\xa8\x85\xb4\x73\x90\xa1\x16\xd2\x80\xfa\x86\x5a\x48\xbf\x58\xec\x37\xd4\x42\x0a\x18\x64\xa8\x85\x34\xd4\x42\xda\xd9\x86\x5a\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x12\xfb\xd5\x60\x47\xd9\xde\x06\x3b\x4a\x4c\x1b\xec\x28\xc1\xa3\x0f\x76\x94\xc1\x8e\x12\x37\xf0\x60\x47\x21\x83\x1d\x65\xb0\xa3\x7c\xc6\x76\x94\xa1\x16\xd2\x50\x0b\x69\xa8\x85\xe4\x47\x1e\x6a\x21\x0d\xb5\x90\xa0\x0d\xb5\x90\x02\x46\x18\x6a\x21\x7d\xae\xb5\x90\x5a\xf1\x40\x9f\x6f\x41\xa4\xf8\x65\x0c\x55\x91\x86\xaa\x48\x5b\xda\x50\x15\x69\xa8\x8a\xb4\xa9\x0d\x55\x91\x86\xaa\x48\x3b\xda\x90\x01\x31\xb0\x0d\x19\x10\x43\xdb\x90\x01\x71\x5b\x1b\x32\x20\xae\xb6\x21\x03\xe2\x90\x01\x71\xc8\x80\x38\x64\x40\x5c\x1f\x70\xc8\x80\x38\x64\x40\x0c\x6b\xcf\x6f\x80\xfb\x9f\x91\x01\x71\xa8\x8a\xf4\x22\x4b\x8a\x0c\xf5\x44\x3a\xda\xcb\xa9\x27\x32\x54\x45\x6a\x75\x3e\x54\x45\x1a\x50\xd8\x50\x15\xe9\xb3\xc3\x62\x43\x55\xa4\x0d\x9d\x0f\x55\x91\x86\xaa\x48\x43\x55\xa4\xc1\x26\xd0\xd9\x06\x9b\xc0\x60\x13\x68\xb6\xc1\x26\xb0\xda\x06\x9b\xc0\x60\x13\x18\x6c\x02\x83\x4d\x60\x7d\xc0\xc1\x26\x30\xd8\x04\xc2\xda\x60\x13\x18\xaa\x22\x0d\x55\x91\x86\xaa\x48\xd0\x86\xaa\x48\x43\x55\xa4\xa1\x2a\xd2\xc6\x8f\x41\xd1\x8a\x92\xcd\x36\xc8\x0e\x85\xe5\x8b\xba\x2b\xcb\xc1\x57\x42\xe9\xb2\x4a\x74\x55\xb2\x14\x0e\x0c\x0f\xd3\x30\x06\x4a\xcb\xd2\x59\x05\xa0\xc4\xcc\x15\x2b\x32\xb9\x34\xd4\x76\x44\x6e\x65\x3a\x22\x17\xb7\x37\x77\xac\x5c\xf0\x84\x39\xe8\xfb\xc6\xd2\xf4\xed\xfb\xf6\x71\x59\xf0\x84\x66\x19\x68\x2c\xea\xd9\xe4\x74\xe9\x74\xc9\xf7\x4b\xc2\x3e\x69\x56\x0a\x9a\x11\x2d\x65\x86\xe6\x17\x33\x19\x40\x88\x25\xd3\x25\x67\x0b\x46\x68\x79\xcf\x75\x49\xcb\x25\xc9\x99\xa6\x29\xd5\x74\xfb\xa8\xdf\x2a\xd6\x8c\xd1\xd0\x92\x14\x25\x1b\xe3\x0d\x68\xcd\x03\x60\xf3\x9b\xaf\xdf\xb9\xfb\x4d\xd3\xd4\x05\x24\x38\x08\xbf\xab\xee\xfd\x6e\x9f\x6e\xe7\xb6\x52\xbf\x5b\x6a\x04\xe0\x69\x55\x34\x05\x57\xb8\x67\x5b\x25\xd2\x00\xb6\x24\x8e\x09\xe9\x84\x4f\x26\x16\x4f\x05\xad\x6b\xb1\x68\x6b\xf6\x98\x58\xf0\x52\x0a\xe0\x23\x17\xb4\xe4\xf4\x3e\x63\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x3b\xe0\xe5\xd2\xdb\x19\x30\xd8\x65\xeb\x95\xec\xa6\x67\x1d\x14\xac\xb5\xd2\x6b\xb1\xf8\x8e\xb6\xd5\x0c\x62\xe3\x92\x88\x7d\xc1\x2c\x89\x92\xcb\xee\x05\x05\x31\x9d\x21\xea\xb0\x31\x60\xf8\xad\x2f\x84\x29\xad\x4c\x17\xbb\xe9\x65\x6b\x5b\xde\xd3\xbc\xae\x8c\xb5\x61\x37\x26\xe4\x9d\x15\x8d\x29\xb9\xfc\xcf\x9b\xab\xeb\xf7\x1f\x6f\xde\xde\x5c\x7f\xd8\x8d\x47\x03\xf1\x27\xa0\xa6\x88\xc9\x76\x12\xf5\xef\xdc\x19\x42\xf5\x21\x26\x0c\xe3\xf5\x9b\xb3\xef\x2e\x3e\xfc\xe7\xfb\x8b\x77\xd7\xe7\x20\x52\xb0\x4f\x05\x15\x29\xeb\x62\x11\x2b\xe5\x22\x70\x8a\x92\x2d\xb8\xac\x54\xb6\xf4\x14\x76\xf3\x55\x58\xbd\x03\x06\x3d\x74\x8c\x62\xe8\xa3\xc5\x1e\x9b\x3b\x05\x35\x08\xad\x81\xb3\xb6\xd2\x95\x4c\xc9\x6c\xc1\xd2\x2e\xed\x07\xc4\x42\xba\xed\xa8\xed\xa0\x45\xa5\x9d\x92\xc7\x99\x36\x2b\x91\xcc\xa9\x98\xb1\x74\x42\xae\x64\x65\x46\xfb\xcd\x6f\x60\xcb\x4a\x96\x56\x49\xe7\x8e\xa1\x86\x0e\x05\xda\xdf\x8c\x1c\x03\x60\xc8\xae\xc2\xaa\x66\x2a\xa1\x85\xdb\xd4\xe6\xa9\xa8\xa5\xd0\xf4\xd3\x9b\x90\xfa\x68\x27\xbf\x69\x7c\x78\xe2\xea\xd5\x49\x33\x3d\x64\x96\x70\x45\x19\x94\x1a\xcb\xc8\x49\xf3\xed\xae\xbe\xaf\xcd\xfc\x58\xda\x84\x1d\x8c\x3c\x64\x0b\x56\x82\x72\xc8\x42\xce\x88\x94\x6c\x46\xcb\x34\x63\x0a\x62\xde\x1e\xe7\x0c\x8a\x07\xa2\xa4\x8b\x07\xd5\x31\x16\xf3\x8a\x2c\x21\x3b\x15\x8c\x57\x68\x65\x06\x5c\x7b\xd2\xb1\x8c\x98\x9b\xf7\xb6\x94\x1d\x25\xa8\x5a\xb7\xef\x0e\x82\x6a\xbc\x2d\x7e\x13\xb8\x9e\x5a\x23\xc6\xa4\x89\xe5\x95\xe1\x4e\xa7\xb5\x8d\xdc\x3c\x0f\xb0\x93\x07\xcb\xf2\xe1\xca\xfc\x44\x8a\x29\x9f\xbd\xa3\xc5\x57\x6c\xf9\x81\x4d\x23\xe3\xfb\x90\x31\xb7\xea\x69\x60\x77\x0d\x75\xc0\x0e\xbb\xd9\xca\x03\x86\x73\x85\x98\x4c\xe2\x2c\x1e\xc1\x76\x8e\xb5\xc2\x72\x28\x22\x58\x36\x7e\xef\xcc\x36\x09\x22\x70\x1b\x27\x17\x2c\x10\x36\x29\xa2\x45\x05\xc1\x26\x80\x8f\x35\x47\xca\x15\x61\xd3\x29\x4b\x34\x5f\xb0\xcc\x47\x1a\xdb\xca\x96\x36\xf2\xf7\x9e\x26\x0f\x8f\xb4\x4c\x15\xd4\x4a\xa4\x9a\xdf\xf3\x8c\xeb\x65\x48\x1d\x4a\x6c\x56\xa8\xb1\xc1\xc9\x4e\x6f\x2e\x94\xa6\x80\xbe\x5c\x45\x45\xb3\xc3\xc8\xf6\x53\x67\xb8\xc6\xdb\xe8\xc2\x7a\x83\x87\x83\xda\x7e\x09\x2b\x0d\x81\xcb\x96\xe4\xb1\x94\xe1\xa2\xd9\x3b\x09\xf1\xbc\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x6a\xd1\x69\xc2\xe5\xab\x54\x26\xea\x55\x22\x45\xc2\x0a\xad\x5e\xc9\x85\xa1\x8b\xec\xf1\xd5\xa3\x2c\x1f\xb8\x98\x8d\xcd\x02\xc6\x78\x81\xd4\x2b\x90\x85\x5f\xfd\x1a\xfe\x77\x08\x28\x23\xce\xb7\xe7\x0d\x39\x39\x09\x78\x5f\x16\xc8\xbd\xf7\x80\xcc\x3b\x10\xf0\x97\x2d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x48\x61\xb9\x90\x88\x65\xdf\x4b\x99\x31\xda\xed\x6d\xf5\x14\xcd\x24\x80\x7d\x3c\x56\x0d\xba\x97\x35\xea\xc5\xcb\x65\xaf\x67\x21\xd3\x37\x44\x55\x45\x21\x4b\xad\x6a\xa1\xd1\x00\xc5\xa8\xfd\x27\xa8\x4d\x46\xe4\x47\xff\x10\xbd\xba\xbe\x3f\xfd\xd3\x57\xd7\xff\xf6\xe7\xd3\x1f\x7e\x6c\xfe\xd6\x10\x1f\x1b\x2f\x04\x4c\x53\x15\x2c\x99\x08\x99\xb2\xf7\x30\x03\xf8\xd3\x72\x77\x17\x49\x22\x2b\xa1\xed\x0f\x9a\xea\x4a\x4d\xe6\x52\xe9\x9b\x5b\xff\x67\x21\xd3\xd5\xbf\x02\x6c\x9c\x07\xa4\x2b\xb0\xd7\xb7\x54\x07\x44\xee\x47\x51\x17\x5a\xf0\xef\x58\xa9\x02\x72\x55\x60\x6b\xc1\x8b\xfd\xb2\x59\x0a\x37\xa7\xf0\xcf\xb7\x6e\xba\x06\xf7\x3e\x96\x5c\x6b\x70\x39\xb4\xc9\x02\xe4\x74\xe4\xae\x34\x32\x52\x8b\x2f\xa2\xf4\xaa\xc1\x98\xc3\xef\x5a\x8f\xc5\xc1\xec\xed\xca\xbc\x62\xc3\x3a\x5c\xae\xa9\x03\x2f\x6e\x6f\xc8\x02\x77\xe3\x00\x0b\x79\x0a\x2a\x70\x01\xd8\x6f\x8f\x82\x12\xdc\x68\x6e\xe3\xbc\xfc\xf5\x06\x2d\x4c\x3e\x1c\x9c\x64\x3c\xe7\xd6\xc0\x6f\x0b\x20\x87\xd0\x8e\x33\xfc\x6c\x92\x14\xd5\xc8\x76\x31\xc9\x59\x2e\xcb\xa5\xff\x93\x15\x73\x96\x1b\x89\x63\xac\xb4\x2c\xe9\x8c\x8d\xfc\x00\xf8\x99\xff\x0b\x3f\x6c\x4d\x61\xfd\x6b\x14\x54\x93\xaa\x34\xbc\x47\xb6\x74\x28\x2e\x44\x7b\x79\x40\x74\x10\x5c\x5c\x3a\x0e\x1b\xf8\xe3\x7a\xdf\x8f\xb1\x3b\xf5\x2a\x1a\x64\x0d\xfd\xaa\x40\x52\x59\xc8\xac\xca\x99\x1a\x79\x02\x8d\xa2\xa8\x58\x18\x99\x45\x9d\x1e\x02\x01\xa4\x7c\xc1\x55\x2f\xff\xd0\x3b\x6f\x67\x03\xa3\x54\xa5\x8d\x90\x8e\x49\x86\x1a\xd5\xcb\xa5\x02\x21\xd5\xe7\x38\x68\x61\xb5\x2f\x42\x98\x15\x42\x0a\xaa\x35\x2b\xc5\x1b\xf2\x1f\x67\xff\xfe\xbb\x9f\xc7\xe7\x7f\x39\x3b\xfb\xfe\xf5\xf8\x7f\xff\xf0\xbb\xb3\x7f\x9f\xc0\x3f\x7e\x7b\xfe\x97\xf3\x9f\xdd\x1f\xbf\x3b\x3f\x3f\x3b\xfb\xfe\xab\x77\x7f\xfd\x78\x7b\xfd\x03\x3f\xff\xf9\x7b\x51\xe5\x0f\xf8\xd7\xcf\x67\xdf\xb3\xeb\x1f\x02\x3b\x39\x3f\xff\xcb\x6f\x82\xa6\x47\xc5\xf2\x9b\x00\xac\x81\x6d\xdc\x23\x73\x53\xfd\x55\x5f\x93\x16\x17\x7a\x2c\xcb\x31\x7e\xfe\x86\xe8\xb2\x0a\xe1\xa2\xdd\xb1\xf5\x81\x73\x57\xfa\xf9\x4d\x8d\xf1\x3c\x75\x38\x00\x20\x3f\x85\x00\x28\x96\x94\x4c\xef\x4b\xca\xc6\xde\x1c\x01\x5c\x31\x8e\x0e\x82\x77\x2d\x78\xfb\x84\x33\xb0\x5f\x35\xeb\x30\x2d\x65\x3e\x21\x0d\x4d\xee\x02\x1c\xe1\xec\x7b\x0f\x2c\x30\x62\x61\x10\xd4\x07\x41\x7d\x10\xd4\xdb\x82\xfa\x1d\xde\xa1\x17\x2e\xa5\x33\xb1\xd8\xa5\xec\x8d\x30\x09\xbe\x85\xec\x71\x4d\xb3\xa0\x63\xae\xb5\x24\x85\x2c\xaa\x8c\xea\x2d\xa6\x8c\x08\x1b\xa1\x8f\xa0\x73\x06\x17\x03\x52\x60\x8f\xb3\x84\x2f\xdf\x6c\x94\x22\x17\x59\x46\xb8\x40\xf4\x66\x3a\xd8\x3a\x82\xb3\x79\x94\x0c\x39\x6b\x42\xd1\x20\xb8\x30\x53\x7e\xb4\x39\xef\x1a\xa6\x1c\xae\x8c\x60\x5e\x6a\x2e\x66\x13\xcc\x89\x87\x04\xca\x2a\xf2\xb9\xf0\x99\xf1\xb6\x0e\xe9\x19\x36\xef\x11\xb7\x96\x0c\x13\xfd\x2d\x94\x76\xcb\x84\x59\x6a\xfa\x00\x46\xa8\x84\xa5\x4c\x24\x3b\x4c\x24\xdf\xa1\x97\x9d\xdb\xb3\x7b\x23\x66\x80\x19\x17\x31\x0a\x49\xab\x22\xe3\x89\x39\x1f\x33\xf3\xb8\xbe\x6f\xf2\xbc\xd2\x60\x10\x3c\x96\xb5\xd6\x40\x9a\x35\x39\x34\x8c\xb6\x40\xdf\xbc\xb8\xe7\x3d\xc2\xbd\xbe\x0c\x6c\x2a\x78\x29\xb7\x1f\x7e\x10\x4b\x10\x46\xb8\xbd\x49\xa1\x93\xd3\x59\xa3\xd8\xb5\x8e\xaf\x4d\xa9\x8f\x6d\x15\x09\xa3\xd3\xf1\x34\xba\x2f\x7d\x3e\x26\x6d\x3e\x22\x5d\xee\x4f\x93\x9f\x8f\x1e\x47\xd1\xe2\x70\x3a\x1c\x4e\x83\x23\x14\xe5\xb1\x74\x37\x9c\xe6\xf6\x95\x84\x8a\x92\x4d\xf9\xa7\x08\xac\xf0\x8d\xd3\x51\x68\xf6\x49\x5b\x9f\xa6\x82\x09\xef\x01\x2b\xec\x8d\x02\xe7\xa5\xa3\x7b\x6b\xa0\xb8\x10\x8f\xe7\xee\x36\x89\x23\x03\x92\x1b\x90\x5c\xab\x0d\x48\xae\x53\xc8\x78\x49\x18\x4e\xc8\xb4\x33\x12\x3e\xf4\x36\xbd\x6f\xf4\xb5\x12\x20\x8b\x4e\x44\x6e\xe1\xba\xac\x6a\xff\x93\x42\x02\x44\x4f\xb9\xae\xbd\x9c\xb7\x03\xda\xdd\x86\x1e\xc1\x7d\xd9\x7e\x79\xaa\x5c\xa2\x87\x95\xfe\x57\x72\x8e\xa3\x3f\xe9\xee\xb1\x22\x41\x19\x59\xc8\x0a\x13\x62\xbc\xa2\x4a\xf1\x99\x18\x17\x32\x1d\x9b\x51\x5e\xed\x64\xb7\x8f\xe9\x52\xea\x35\xce\x4f\x3d\xee\x0f\xde\x1e\xd3\xe0\xeb\x0d\x5a\xab\x34\x6b\x18\x6b\xbc\x1a\xdf\xe5\x19\x08\x90\x1b\x3b\xa5\x94\x27\x1e\x4e\x4e\x05\x9d\xb1\xb1\x9d\xec\xd8\x4f\x76\xec\xe7\xf6\x84\xf3\x0a\x21\x66\x49\x46\xf9\xee\xa0\x8d\x18\x12\x76\x09\xbd\xd9\xe4\xed\x3e\xaa\x66\x25\x85\xb2\x13\x27\xb9\x40\x83\xb6\xfb\x09\x3f\xde\x6d\x16\x87\xcb\xe2\xb3\xe0\x6c\x38\xc8\x9d\x5f\x03\x8d\xb4\x71\xa9\x59\x31\x77\xc6\x7f\x67\x3b\xe3\x25\x53\x84\x09\x7a\x9f\x59\xa7\xc2\x9d\x9d\x5d\x2d\x05\xcd\x79\xe2\x80\xef\x22\x83\xc0\x09\x2e\x05\x99\x32\xaa\xab\x92\x91\x19\xd5\x2c\x64\x46\x9e\x6a\x73\x0f\x6d\xe4\x46\x93\x84\x0a\xb4\x37\x5a\xaf\x77\x83\x47\xfc\x4a\x77\x1a\xf2\xc3\x02\x77\x02\xc2\x75\x5a\x67\xff\xa1\x79\x4e\x4d\xa7\x46\x29\x18\x61\x42\x97\x90\xc5\xec\x56\xa6\x86\xe2\x4c\x5a\x6f\x77\xb8\x1d\x04\xb3\x67\xa1\xda\xf4\x0e\xc7\x67\xf2\x72\x38\xbd\x06\xdd\x68\x32\xe4\xad\x2d\x2d\x64\x3a\xd9\x70\x53\xc2\xd3\xd3\xdf\xca\xd4\xc6\xf7\xe8\x16\xbc\x99\x4b\x04\xa0\x96\xd3\x07\x17\x75\xe3\x4d\x41\x74\x41\x79\x16\xe0\x79\x4a\x20\x9d\x94\xe2\xa9\x91\x11\x02\x50\xaa\x9f\x58\x38\x97\x64\x0d\xdb\x87\x38\x84\x0f\xd8\xb5\x4b\xa2\x00\xfb\x9f\xcc\xa5\x62\x02\xee\x1b\x75\x63\xfb\x22\x30\x0e\xec\x53\x44\x9d\x21\x9c\xe8\xcd\x14\xb9\xdf\x11\x61\x0b\x56\x2e\x35\x94\x62\x70\x09\xbb\xb0\x1b\x33\x7e\x4e\xd3\xc6\xae\x8f\x88\x34\xec\xda\x23\x57\x21\x07\x00\x78\x02\xe7\xa7\xaa\x4c\x7b\x16\xdc\xce\x7e\x6f\xa7\xb1\x1e\x9c\x64\x98\xbb\x87\xce\x4c\x6c\x9d\x17\x72\x5b\xd4\x53\x4e\x8b\xad\x5f\xa1\xaf\xc4\xbe\x68\xd7\xd7\xe8\xcb\x81\x9f\xdc\x5b\x93\x79\x4e\x3f\xf1\xbc\xca\x09\xcd\x65\x85\xd1\xce\xeb\x7c\x45\x50\x20\xd8\x3e\xb8\x84\x0d\xdc\x81\xda\xc6\x1e\x90\x70\xb4\x1a\x1f\xae\xfc\x42\x8d\xfd\x41\x46\xfe\x38\xe3\x7e\x84\x51\xbf\xb7\x31\xdf\xb9\xed\xec\x0b\x90\x2d\x4a\x5b\x03\x65\x2e\x3a\x41\xd9\xd1\xd7\xdd\xb0\x7c\x33\xad\xc7\xe0\x8a\xc8\x9c\x6b\x6d\xbd\x63\x1a\x14\x60\x44\xb8\x6e\xb9\x92\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x91\xf1\x84\x83\x47\x92\xf3\x42\xdb\xcd\xff\x79\x9c\x68\xd3\x10\xf0\xbc\xc0\x44\x04\x70\x51\xc6\x8e\xb5\xb4\x31\x03\x7e\x96\x36\xc8\x85\x7d\x4a\x18\x4b\xed\x44\x86\xfb\x3a\xdc\xd7\xe8\xfb\xaa\xf6\xa4\xa1\x68\x6a\x27\xea\x98\x68\xaf\xa5\x30\x57\x09\xe2\x95\x51\x5f\xe0\xa0\x6b\xd7\xc5\xbc\x76\x19\x33\x3f\x30\x30\xca\xdd\x31\xad\x6c\xf4\x35\xf4\xb4\x4b\xdd\xb6\x96\x81\xcf\x67\xd9\x74\xa9\x0c\x28\xe8\x13\x1b\x6f\xd4\xb1\xab\x3b\x84\x67\xbd\xca\xde\x82\x0a\x84\xe5\x45\x46\x75\xad\x20\x79\x42\x90\x6b\x08\x13\x1f\x93\xa4\xee\x79\xd3\xd2\x1d\x46\x6c\xeb\x64\x83\x9f\x31\xbd\x5c\xdf\x84\x72\x07\x10\x18\xbb\x5d\xaf\x02\x13\xc3\x85\x0b\x96\x41\xbe\x59\x87\x4e\xf7\x16\x21\x86\x85\xa7\x74\x8b\x97\xc3\x0e\x9c\xb6\xed\x50\x89\xda\x22\x76\x2f\x34\x19\x5b\xfc\xde\x1d\x29\xe1\xda\xd1\x53\xac\x1d\x33\xa9\x5a\x54\x1a\xb5\x98\xc4\x38\xc1\x49\x71\xfa\xfb\xd2\xc6\x24\xc3\xe9\xf9\x61\x60\xca\xb3\x18\xd8\x3d\x72\x5a\xb3\x23\x27\x32\x7b\x8e\xd4\x65\x07\x93\x1f\x02\x40\x33\xde\xe0\xa7\x65\x66\x73\xb6\x87\x19\x80\x3e\xd6\xef\xc3\x76\xd4\xae\xdb\x8d\x9e\x8e\xe3\x4c\xb6\x13\xb2\x3f\x3a\x3e\xd7\x60\xa7\x7a\xd2\x00\xe3\x5a\xd3\x64\x6e\x13\x90\xe1\x2f\x06\x12\xc4\x92\x18\x20\xd0\x48\xc9\x6d\x0e\xa4\x5d\xe7\x3c\x67\x44\x97\x50\x34\xf7\x4f\xfe\x42\x8c\xd0\xe4\xff\xe7\x46\x9e\x09\x5f\xf6\xd5\x03\xe3\x9f\xdc\xbf\xfe\xfc\xc4\xec\x23\x61\x4c\x0e\x4e\x69\x9f\xbc\xea\x35\xf4\x48\xb8\x48\xc1\xef\x10\x59\x21\xdc\x3c\x1c\xcc\x6c\x2d\xac\x7b\x62\x33\x37\x61\x1a\x34\x6b\x99\x05\x07\xc5\xfa\xe5\x4e\xd6\x01\xfc\x32\x6b\xd5\x84\x77\x7c\xf0\x77\x98\x91\xf7\xd2\xd6\xcf\x66\x23\x72\x0b\xda\xe1\xfa\x09\xdc\xf9\xf7\x12\x2b\x69\x77\xa4\xa2\x08\x44\xff\x9d\x3c\x63\xdc\x7e\x7e\x55\x33\x94\xb8\x31\x2d\x86\xb2\xbe\x58\x4d\x96\x72\xe7\xc6\x3e\xb0\x65\xe7\xae\x5a\x26\xc1\x32\xb3\x56\x35\xee\x61\xd4\x11\x79\xe4\x1b\xfe\x8f\xb3\xf0\xe5\xf7\x5c\xe0\x54\x70\x60\x77\xce\x30\xb6\x3b\x0f\x23\x81\x64\x59\xc0\x24\x02\x77\x3b\x8c\xe3\x8d\xdb\xf2\x6f\x22\x38\x5d\x4f\x2f\xba\xb6\x74\x13\x7f\xdb\x60\x6a\xaf\x7f\xaa\x68\x36\x69\xe5\xfd\xc0\x47\x5d\xd7\xcd\x3a\x23\xaf\xd2\xcd\x47\x9e\xa5\x09\x2d\x6d\x44\x1c\xa0\x1f\xa2\xa4\xb5\xce\x02\xf6\x4b\x3a\xdd\xce\x1d\x02\xac\x81\x47\xa1\x07\x6e\x41\x4b\xcd\x93\x2a\xa3\x25\x31\x77\x7c\x26\xcb\xa0\xc4\x1e\x9d\x87\x59\x43\xf3\x1d\x4b\xa4\x48\xf7\x2a\x44\x7f\x5c\xed\x7c\xd5\xc7\xb8\x60\x25\xb7\x25\x9c\x79\xce\x56\xaf\xd7\x59\xcb\x2f\xa5\x4b\x0e\x9b\x3a\x64\xe7\x71\xcb\xa8\xa9\x19\x6d\xdb\x94\xb1\xbc\xc8\x79\x83\xe0\xf8\xdb\x3e\x21\x5f\x2e\x9d\x8a\xb6\x8b\x21\xe7\xda\xa5\x5a\x51\x4c\xbb\x64\x3c\xee\x2a\xda\x93\xac\xd1\xc8\x54\x96\x90\xe4\xe6\x2c\x95\x98\x9e\x65\xc1\x13\x7d\x3e\x21\xff\x1f\x2b\x65\x40\x16\x23\xc1\x66\x58\x73\xdc\x5e\x6c\xaf\x8f\x2a\x19\xb5\xbe\xf5\xaf\xc9\x19\x96\xa1\xe7\x79\xce\x52\x4e\x35\xcb\x96\xe7\xa8\x9e\x62\xb6\x90\x7d\x08\xd4\x84\xa8\x15\x31\x60\x12\xde\xfd\xe7\x3f\xec\x78\xf3\x00\xd9\xa7\x6c\x86\x9b\x7a\x63\xd1\x81\x6e\x05\x7a\x7c\xda\xc4\x4e\x79\x7f\xab\x7c\xd6\x0c\x22\xa8\x13\x57\x3a\xdc\xec\x61\xeb\xef\x06\x40\x29\x29\xd9\x0c\xee\x27\xde\xb9\x27\xde\x4e\x8c\xa8\x7d\x27\x2b\xb1\xdd\x06\xd2\xda\xb7\xaf\xad\x0a\xee\xbb\xc6\x87\xb1\x69\xe3\xf6\xcb\x10\x36\x66\xd2\xb0\xba\x50\x02\xa6\x16\xe0\xc0\x0c\x62\xc3\xb7\xea\xd0\x93\x00\x63\xf9\x1e\x53\xc1\xc1\x5c\x3a\x92\x2f\xec\x25\x61\x9c\x1f\x68\x9f\x57\x01\x12\x19\xd8\x9d\x5b\xc9\x89\xe6\x4a\x6e\x01\x00\xe3\x16\xd7\x10\x0c\x93\x61\xa9\x0d\x56\xec\x42\x3b\xd2\x6b\x37\xc9\xe9\x9b\xd3\xbd\x50\x1d\xdc\x8d\x52\x16\x74\x06\x97\x75\x9f\x9b\xb2\xda\x37\x49\x99\x66\x65\xce\x05\x53\x64\x2e\x1f\xf1\x77\x64\x06\x0a\xfb\x16\x4b\x6b\xcf\x83\xb9\xec\xdc\x11\x2c\xaf\x55\x67\x9f\x43\xec\x01\x7e\xa4\x8f\x74\x49\x68\x29\x2b\xd1\x99\x44\x00\xb8\x68\x4f\x39\xde\xad\x4c\xfa\xbd\x14\xcc\x3b\xa3\x74\x51\xd9\x16\x69\xbb\x67\x9a\x9a\x0b\xff\xc5\xe4\x8b\xd7\x41\x73\xf8\xc0\x92\xaa\x54\x7c\xc1\x3e\x30\x9a\x7e\x63\x24\x6e\xae\x00\x6b\x68\x49\x6e\xa6\xb7\x52\x29\x7e\x9f\x31\x22\x4b\x60\x90\x04\xbd\xcf\x0c\xd3\xbf\x3a\x61\xcf\xa1\xc2\xcc\x65\x49\x2a\xe1\x45\x84\x8e\x59\x58\x32\xdf\xb4\x8a\x9a\x4e\xce\xf7\x02\x69\x91\x89\x1a\x61\x2f\x57\xec\x33\xce\xf9\xdc\xe1\xaa\xbd\xcc\xab\xb4\x9b\xbd\x4f\xc8\x7f\x87\xd7\x1a\xfa\x1e\x83\xee\x84\x4f\xc1\x6a\x37\xc2\x47\x8f\x25\xd7\xac\x41\xb7\xce\xa6\x34\x53\xab\x87\xd5\xb1\xed\xed\x3c\x79\xd0\x41\xc8\x7e\x74\xbb\x47\x97\xab\x60\xb8\xcf\x9d\x59\x87\xf1\x3a\xd9\xba\x73\x01\xaf\x77\xcd\x62\x88\x1a\x5f\xce\xa9\x48\xb3\x4e\x38\xf6\x2b\xc8\x96\x1d\x0e\x8e\xd6\x5b\xa0\xbe\x6e\xb0\x8f\xa3\x26\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf5\x37\xac\x71\x58\xb1\xe3\x20\x30\x20\xca\x6a\x22\x0d\x7b\xdd\xaf\xb8\xb2\xd7\x1b\x34\x25\x40\xb9\x2d\x7f\x9b\xd3\xce\xec\xd6\x8d\xf5\xd7\x9b\x39\xb1\xec\xd5\x86\xd1\x6a\xe4\xb2\x32\x5e\xdf\xb1\x46\x06\xde\x91\x25\xf7\xb9\x5c\x1c\xf3\x5b\x23\xec\xd2\x70\x1f\x39\xab\x27\xd6\x31\xd4\xea\xb4\x3d\x0a\x5c\x9b\xf3\xe6\x59\xf9\x49\x75\x8c\xd3\x3d\xe5\xb6\x3c\x83\x0a\x35\xcc\x9d\x69\x2b\x0a\x6a\x8a\x41\xb6\x01\x09\x51\x09\x2b\x4b\x59\x7a\x19\x62\xc6\x04\x48\x2b\xa0\x85\x73\x8a\x24\xeb\x3b\x47\x95\x14\x21\x80\xd6\x71\xc8\x06\xcf\x74\x93\x0f\xfc\xac\x63\x30\xa0\x31\x67\xb2\x5c\xb9\x0d\x4e\x00\xdb\x40\x49\x62\x67\x0f\x84\xb9\xee\x17\x81\xaa\x21\x68\x99\x0d\xac\x85\x7f\x39\xf5\x57\x67\x3f\x31\x60\xd5\xfd\xa1\x59\x45\xcb\x13\x02\xdb\x53\x73\x8a\x1e\xe4\x4e\xd5\x76\xae\x31\x82\x3e\x9c\x9c\x90\x33\xec\xe7\x54\x91\x52\x4a\xbd\x1f\xa2\x6e\xf7\xe7\xfa\x53\xb1\x57\x25\xd4\xb5\xcd\x3c\x4b\x8a\xa3\x6d\xd6\x97\x6c\x4e\x17\x4c\x11\xc5\x73\x9e\xd1\x32\x83\xb4\x9e\x77\xb8\x3c\x88\x4c\xdb\x98\x3b\x3b\x20\xef\x72\x43\xe3\xdd\x9c\x67\xa3\xbb\x43\x9e\x23\x71\x6b\x30\x47\x04\xf4\xc6\xad\x09\xea\xe6\x56\xba\xa2\x59\xb6\x24\xec\x53\x92\x55\x06\x5f\xee\x45\x58\xee\x23\x27\xaf\x8a\xc8\x85\x75\xd4\x3f\xa2\x80\xdc\x56\x79\x1a\x7e\x35\x75\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\x49\x98\x52\x2e\xf3\xc0\xb2\x99\x3d\xc1\xaf\xe1\x73\x49\xa3\x4e\x1f\xd5\x75\x46\x95\xe6\xc9\x97\x99\x4c\x1e\xee\xb4\x2c\xf7\xaa\x2b\xda\xd4\xff\x4a\x72\xfa\x8b\xbf\xdd\x19\xe4\xfd\xd0\x48\xf7\x64\x1d\x31\x9b\x86\x29\xda\x31\xd0\x43\x75\xcf\x32\xa6\x4f\x15\xc8\x8f\x24\xa7\xc9\x1c\x4b\x24\x80\x70\x28\x7c\x42\x31\xab\xbe\xde\x79\x44\xd8\xae\xcc\x2c\xa1\xe8\xc8\x1b\x33\xc7\xf5\x65\xa0\xbf\x99\x7d\x07\x73\x72\xa0\x06\x0b\x8c\x81\x75\x2d\xe7\xb1\x2e\x59\x17\x3b\xb5\x71\x9f\x20\x52\xd5\x26\x26\xe7\x25\x7a\xba\xd9\xf9\xb3\x7b\x35\x49\x14\x9f\xd0\x47\x35\x49\x64\x4e\x2e\xef\x6e\x48\x5a\xf2\x45\x77\x88\x43\xa4\x0b\xa9\x4d\xd5\xf7\xca\xde\xf0\x5f\xd3\x47\xc5\x70\xa2\xf7\x66\xa2\x50\xde\x22\x00\x77\xec\xd5\x29\x0a\xe7\x72\x73\xb5\xf3\xc5\x70\x87\xa7\xa9\xfa\x68\xe6\xd8\xf1\x56\x1f\x17\x18\xec\xd9\xa9\x4a\xa7\x3c\x63\xa8\x02\xc6\x93\xb5\xe1\xd4\x16\xd5\x00\xd0\x2f\x65\x45\x1e\x29\x5a\x33\x80\x80\x05\xc5\x58\xf3\xe2\x0d\xb9\x16\xaa\x2a\x59\x6d\x24\x5b\x1d\x6c\x13\x4b\x0e\x37\xc5\x82\xac\x98\x05\xa9\xa7\xb1\x5d\x7f\xa2\x79\x91\x31\xf5\x86\x9c\xb0\x4f\xfa\x0f\x27\x23\x72\xf2\x69\xaa\xcc\xff\x84\x9e\xaa\x93\x09\xb9\xc9\xbd\x0b\x35\x17\x53\x56\x96\x3e\x2c\x1b\x3f\x30\x2c\x79\x4b\x8a\xea\x1e\xf3\xd8\x70\x4b\xe2\x9c\x5f\xc0\x3c\xd4\xad\x49\x23\xbd\xe0\xc8\x77\xee\x40\xa9\xf1\x40\xec\x07\x88\x6e\xa6\xce\x63\x1e\xe5\x2a\x57\xf2\x9d\x2b\xdf\x8d\x01\x1b\x3b\x8e\xa1\x3c\x71\x80\xf2\xd6\x27\xa9\x24\xaf\x52\xb6\x78\xa5\x52\xfa\xc5\x08\xa6\xaa\x6c\x24\x78\x7b\x5d\x54\x91\x93\xb0\xcc\xb5\x77\x8e\x73\x1b\x35\x77\xa2\xee\xc9\x20\x62\x37\x24\xf8\xbd\xbc\x3e\x01\xd1\xc5\x8c\x9d\x50\x41\x32\x46\x17\x56\x9c\x43\x94\xb1\x44\x03\x43\x27\x87\x15\x63\xac\x21\x6d\x83\xcd\x3f\xfd\xbe\x53\xbc\x0e\xd1\xc1\x90\x5e\xd0\xe4\xfa\x76\x56\x9b\xb2\xb2\x19\x98\xa6\xb2\x4c\xbc\xcc\x69\xb5\x34\x4c\x03\x6e\xe0\xa2\x65\xd7\x78\xd9\x17\x36\x2c\xc1\x98\xa3\x22\x07\xf1\x7d\xb4\x7d\x83\x06\x59\xf0\x9f\x2a\x46\x6e\xae\x7c\x3a\x6f\x56\x2a\xae\xb4\x11\x28\xd2\x16\xdf\xc3\x91\x19\x3a\xbb\xc8\xe9\x3f\xa4\x20\xd7\x5f\xde\xd9\x8e\x02\x40\xf1\x45\x23\x48\xfa\x8f\xaa\x64\x86\xc7\xdb\x2b\x6b\xe9\x3a\x5d\xe5\x27\xcd\x73\x72\x45\x35\x45\xb6\xd2\x06\x16\x89\x9a\xe4\x19\xa6\xf0\x9e\x8b\xd4\xfe\xd4\x93\x25\xf4\xc3\x47\xf1\x81\x8d\x69\x9b\xcd\xeb\x5a\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x28\xfe\xef\x00\xdc\x98\x99\xcd\xfb\xae\xb8\x66\xf7\xe2\xb7\x1f\x6e\xf6\xc4\xb5\x25\xc0\xe1\xcf\xde\xc9\x34\x96\x75\x3b\x6d\x7c\xea\x08\xea\xbf\x1a\xb8\xb8\xc4\xe7\x24\x37\x7d\x82\xe2\x6a\x04\xca\x5b\xf2\x0d\xe8\x36\xe1\x9f\x7f\x2b\xb9\x66\x93\xee\x3c\xb4\x11\xac\x83\xdb\xc0\xc8\x65\xb8\xcf\xdc\x12\x9a\x29\x7a\x52\x03\xfd\x80\x5c\x2c\x7f\x70\x9f\xc9\x7b\x62\xaf\xfc\xbe\xe7\xfe\xed\x87\x9b\x1e\x53\xff\xf6\xc3\x8d\x9b\xb9\xf9\xa7\x9c\x1e\x6f\xd2\xc7\x60\xf8\xdf\xae\xf0\xdf\x31\xbc\x58\x9d\xdc\x6a\x95\x8b\xdf\x27\x0b\x3f\x39\x1a\xf3\xde\x2f\xf3\x90\x19\xab\x4b\xe8\xe7\x22\x20\x85\x71\xfb\xf2\x9b\x6f\x08\xfb\x54\x20\x46\x6d\xb8\x4c\xde\xcd\x29\x64\x9d\x76\x09\x2e\x11\xfc\x0c\x3c\x2a\x43\xb2\x1d\x20\x12\x8a\x25\x2e\x0c\x35\x40\x2d\x7d\xfa\xc6\x39\x82\xfb\x2f\x36\x7f\xf0\x0e\x02\x30\xd3\x37\x48\x03\x08\xc6\x63\xa6\x0d\xb8\x3f\x43\x73\x85\xf0\x3f\xd9\xb8\x7b\x4c\x82\xa5\x98\x3e\x9f\xb4\x74\xeb\x0a\xa6\xbc\x57\x64\x74\x14\xc6\x73\xcd\x82\x49\xce\xcc\x6f\xaf\xc0\x3e\x7a\x3e\xa9\x2d\x66\x90\x1d\xa2\xe6\x4d\x03\xc6\x30\x97\xe2\xc3\x93\xb9\xd7\xb8\x44\xb5\x1e\x64\x61\x2d\x5d\x7c\x90\xc1\x0c\x7b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\x3b\x3d\x24\x2b\x04\x03\xf5\x60\x85\xe0\xbb\xde\xac\x90\x41\x90\x2f\x87\x15\xc2\xd4\x81\x41\xcc\x10\x5c\xdd\xce\x37\xc3\xd9\xa1\xa3\xdc\xdb\xf4\x97\x74\x6f\xeb\xc3\x8a\xdc\xb3\xfa\x43\xc7\xc0\xf8\x04\x39\x2e\x25\x7d\x2b\x20\x15\x2f\xe2\x9d\xa5\x06\xb6\x42\x12\xb2\x6b\xe6\xfa\x7d\x15\x90\x5d\x3f\x02\x81\x7b\xc0\x8a\x5d\x95\xfb\xce\x2d\x0a\x89\x14\x3c\x26\x01\x20\x1d\x3c\xc9\x84\x15\xf3\xe9\x5e\xbd\x9c\x4d\x8f\x6f\xef\xda\x66\x9c\x4b\x56\xcc\xc9\xdb\xbb\x0d\x28\x0f\x0e\x07\x96\xa5\xd0\xb8\x73\xaa\x48\xc6\xa7\x0c\x7c\x12\x22\xb0\xde\x25\x8e\xda\x42\x79\xde\x19\xcd\xa1\x38\x5c\xac\x57\xc1\x0a\x49\x32\x29\x66\x86\x39\x08\xab\x75\x73\x00\x24\x95\x4b\xc1\xb5\x2c\x77\x7b\x43\x84\x23\x1e\xd7\xdd\x21\x10\x8f\xeb\xdb\x6c\x5d\x5d\x16\xe4\x5d\xe3\x29\x25\x89\xcc\x32\x96\x68\x5b\x2b\x0b\x8e\x3d\x68\x85\xd8\x36\x28\x4d\x98\xd5\x59\x4e\x1e\xfe\x08\x6a\x13\xab\x20\x79\x85\x47\xf9\xea\xc3\xf5\xc5\xd5\xbb\xeb\x49\x9e\xfe\x7a\x2e\x1f\xc7\x5a\x8e\x2b\xc5\xc6\xbc\xbb\xe4\xc6\x67\x1c\x9d\x49\x30\x59\x47\x40\xa5\xaf\x36\xab\x5d\xd8\x22\x65\x2e\xdf\xef\x1b\xf2\xad\x42\xef\x0d\xef\xb9\xc3\x52\xb0\x66\x8f\x48\x49\x6d\x1a\x50\x8a\x57\x75\x5a\x65\x19\x9e\xa6\xb9\x47\xa3\xa6\x3e\xfa\xd5\xe7\xc7\xf0\xb6\x36\xe1\xc5\x73\xbf\xc7\xbf\x16\x31\x14\xbb\x9b\x7f\x26\xbd\x0e\xab\xee\xbd\x7d\x5c\x77\xad\xe7\x68\xa5\xd0\x73\x73\x78\x0f\x6c\x49\x20\xa8\xdb\x30\xb6\xdf\x2a\x56\xb6\xc1\x94\xe9\x04\x76\xe7\x55\xa5\x58\x39\xc1\xee\x5f\xe0\xde\x87\x71\x15\x61\x49\xb1\xc9\x13\x76\xfe\x03\x9b\x6e\xda\x78\xfb\xb8\x2e\xed\x6d\x39\x7f\x5a\xe9\x39\x13\x9a\xdb\xec\x96\x96\xf3\xda\x78\x12\x01\x55\x98\xb1\x1d\x7b\xeb\x03\xab\x35\xc5\xd5\x56\x1a\xea\x11\xd5\x6d\xa8\x47\xf4\x32\xea\x11\x3d\xa5\xc8\x9a\xc1\x9e\x87\xc0\x3a\xa6\x5f\x48\x14\xd7\xe4\x4e\x7c\xea\xab\x92\xa6\x52\xe1\x3b\x58\x67\xb7\x81\x4f\x68\x9a\xf3\x6e\xad\xd0\x0b\xc4\xe4\x09\x17\x69\xd7\x66\x46\x8a\x5e\xd0\x63\x5b\xf4\xb2\xcf\xac\x21\xde\x3b\x71\x51\xa7\x65\xc2\x04\xe3\xd6\x61\xab\xed\xaf\x15\x25\x7f\xe1\x30\x71\x2a\x27\x3b\xb7\xde\xfa\x26\xfc\x1e\x34\x4e\xb2\x60\x06\x91\x24\x0f\x13\x59\xce\x9e\xe6\x80\xb5\x0a\x15\xf9\x52\xfd\x94\x8d\x71\xac\x71\x91\xd6\x60\x71\x6c\x59\xf1\x17\xe2\x69\xf5\xf2\x8c\x2f\x2f\xc2\x7f\x6a\x3f\x60\x47\x5e\xa0\xbc\xf5\xe2\x15\x95\x47\x39\x8f\x18\xa9\xea\x18\xac\x7d\x4d\x69\x0b\xc9\x6d\x74\xb4\x2f\x7b\x8a\x78\xcb\x69\x4d\xcd\xa6\x16\xb4\xa4\x39\xd3\xac\xc4\x28\x4c\x1b\xf5\x29\x42\x38\x66\x08\x11\xfd\xa6\x60\xe2\x0e\x10\xf4\xc0\x8e\x6f\x6e\x03\x3b\xbe\xa3\x0d\xec\xf8\xc6\x76\x14\xb7\x39\x77\xdf\x79\x6a\x44\x7c\xeb\x1c\x5a\xc7\x64\x58\x2e\xec\x65\x60\xd9\x6e\xae\xdb\xd5\x6e\x8b\x60\xbc\xfd\x37\x2b\xac\x75\x5d\x4b\x11\xad\x18\x10\xed\xe4\xeb\x91\xc2\xed\xc1\x6d\xda\x0f\xa7\x18\x8e\xea\x2c\xf8\xf5\x70\xc7\x0a\x82\x8c\x46\xf7\x6d\x4a\x92\x9b\x27\xf7\x5c\xd7\x34\x42\x31\x4d\x0a\x56\xe6\xdc\xe6\xc7\x95\x82\x24\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\xa2\xf8\x41\x41\x64\xa2\xa9\xcd\xea\x44\xee\x99\x7e\x64\x4c\x90\xd7\xaf\x5f\xbf\x06\xd1\xe6\xf5\xbf\xfc\xcb\xbf\x10\xc8\x35\x9e\xb2\x84\xe7\xeb\x2f\xc2\x5b\xff\xeb\x8b\x2f\x42\x06\xfd\xb7\x8b\x77\x5f\x43\x9c\x51\xa1\x15\xb9\x97\x7a\x6e\xc7\x36\x5d\xb4\xba\x57\x23\xf2\x7f\xef\xbe\x79\x5f\x17\x8a\x69\xff\x0a\xf2\x8f\xdf\xa2\x90\x91\x9b\xca\xe9\xd7\xff\xfc\x87\x3f\x04\x7d\x03\x42\x92\x2c\x21\x98\xbb\x0e\xda\x2b\x5c\xb8\x99\x90\x7a\x3d\x55\xb3\x65\x9d\x82\x8b\xc8\xe5\x7c\x36\x87\x83\x30\xf7\x5f\x8a\x69\xc6\x13\x8d\x44\x02\x13\x3f\x20\x48\xd8\x72\x21\xd4\x66\x5d\xb3\xb2\x40\x90\xa9\x29\x65\x23\x92\xf1\x07\x46\xa6\xea\xaf\xa5\xac\x8a\x3a\x37\xa2\xad\x5e\x91\x50\x61\xc6\xc7\xe1\x6a\xb8\x53\x2c\x38\x23\xeb\x21\x3c\xc5\x03\x6d\x45\xf1\x57\x0e\x3a\x5e\x11\x34\x46\x58\x93\xf1\x81\x2d\xc7\x08\xdd\x05\xe5\x3e\xec\x0d\x5c\x6e\x91\x9b\x68\xf3\x23\x49\x50\x79\xe8\xba\xc4\xa5\x8b\x89\x2e\x4a\xf9\x77\x04\x1a\x2e\x5c\xda\x31\xab\x54\x50\x56\x3e\xb3\xb9\x30\x45\x6d\xb7\x0e\x18\xc9\xe5\x74\x36\xbc\xa6\xcd\x26\x5d\xa7\x34\x23\x37\xd3\x66\xe0\x31\x24\x35\xe6\xca\x4c\x02\x2a\x35\xdb\xb9\x05\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x12\x6b\xfd\x63\x38\x79\xd0\x18\x40\x1a\x60\xd2\xd4\xa5\xae\xab\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x38\xe7\xad\x8d\xb0\x65\xba\xb2\x47\x84\x11\xec\x95\xc8\x98\x52\x36\x42\x3b\xa7\xe5\x03\x4b\x3d\x7e\x9e\x40\xd8\xb3\x0a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x9c\x2e\x5b\xd9\x6f\xcc\x34\x4e\x27\x93\x53\x44\x2d\xb2\xc4\x80\x7b\xc4\x02\xe6\xf9\x33\xe5\xc8\x6d\xdd\x2d\x28\xce\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1d\xd1\x4c\xed\x5e\x86\xe0\xbe\x28\xc9\x24\x5c\xb5\x83\x2d\x24\xbf\xb8\x7b\xb3\xd8\x9d\xa3\xc9\xb5\x38\xe1\x28\x30\xdb\x38\xb6\x6d\x39\xc7\xed\x1e\xdb\xfb\x16\xca\xde\x47\x33\xd8\x79\x10\x6b\xb3\x61\xaa\xc1\xa2\x1c\x8e\xd1\x36\x82\x05\xf1\x37\x36\x75\xc2\xae\x7a\x80\xab\xed\x59\xd8\x1a\x6c\xcf\xc7\xdc\x60\xbb\x99\xae\x66\x97\x68\xa0\xb7\x26\xa3\xe9\xe8\x50\x48\x0e\xa8\xba\x1d\x83\x5b\xc1\x76\x60\x9e\x05\x5b\x1c\xe7\x82\x2d\x86\x7f\xc1\x16\xe6\x5e\x82\xad\xef\xe5\x72\xee\x28\xb8\x3d\x96\xcc\x20\x25\x99\xfa\xcd\xc7\x0c\xae\x45\x03\xb1\x44\xdc\x29\x4b\xae\xf0\x5a\xd1\x7b\x25\xb3\x4a\xe3\x10\xf1\x9d\x34\x69\x1e\x4c\xd2\xa5\x04\x0f\x23\x74\xab\xdd\x35\x28\x25\x70\x22\x48\x9e\x62\xfa\x3a\x9e\xaf\xd1\x50\xc4\x7a\x28\x62\xbd\xa5\xbd\xac\x22\xd6\xee\x33\x1f\xc3\xbc\xb9\x64\xbf\x2c\x89\x41\xba\xc0\xdf\xbf\xa4\xe2\xd6\xd8\x12\xc5\x63\x14\x53\x8a\x93\xb3\x4b\x9f\xf1\xc4\x79\x35\xdf\x08\xcd\xca\x29\x4d\xd8\x79\x53\x61\xc5\x8a\x39\xcb\x59\x69\x36\xc8\xbe\xe7\x52\x7b\xd8\x84\x6e\xe4\x7e\xe9\xe0\x8f\xb0\x4f\x9a\x95\x66\x33\x6b\x53\xea\xf1\xeb\xed\xe0\xb8\xfb\xd2\x89\x41\x67\x07\x51\x87\x41\xcf\xad\xf2\xa0\x16\xaf\xd5\x9b\x87\x7b\x8d\x1b\xad\x9a\xaa\xc1\x90\x1b\x7e\x29\x05\xf0\x0f\x80\x62\x96\xb2\x2a\xd1\xe9\xc1\xdb\xd3\x13\x59\x96\x86\x67\x81\xa1\xa9\x22\x25\x9b\x19\x21\xb6\xc4\x02\xca\xf0\x46\x56\x99\x07\x7b\x8d\x0e\x3b\xb8\xfd\xd8\x1b\x8a\x77\xc4\xc7\x05\xf4\x66\x39\xcc\xa2\x94\x0b\x9e\x3a\x06\xb3\x89\xa5\xb9\x22\x05\x55\x8d\x7c\x34\x54\x29\x99\x70\x50\x52\xd6\x27\x18\x30\x12\x4a\xf8\xc0\xa8\xfa\x2c\xab\xad\xfc\x0d\x4d\x23\xb6\x84\x7c\xf9\x01\x9e\x70\x11\x47\x22\x64\xca\x6e\xab\xfb\x8c\xab\xf9\xdd\x21\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\x6d\x06\xc5\x20\x73\xa5\x50\x1c\xf8\x42\x43\xdd\x0c\x13\xcb\x8d\x78\x25\xe1\xb4\x5c\xff\xcd\x2b\x26\x81\xc6\x67\xcc\xe6\xea\xbb\xbc\xdb\x1d\xde\x8c\xed\x7d\xbd\x16\x9b\x81\x0a\x2b\x32\xa4\xec\x5b\x51\xb4\x9e\x27\x34\xdb\x5e\x89\xae\xd9\xda\x2c\x8a\xa3\x4b\x28\x0e\xb8\xbc\x55\x08\x80\xdc\xc0\xa6\xdb\x23\xde\x28\xae\x69\xb3\x70\x07\x1b\x75\x57\x36\x58\x91\x5c\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x68\x64\x4d\x83\xe4\xbf\x70\x03\x06\xe3\xec\x96\x36\x18\x67\x77\xb4\xc1\x38\xbb\xb1\x1d\xc5\xb9\xa6\xce\xdc\x4b\x1b\x49\x56\x5b\xb5\x66\x3d\x9f\x10\xce\x71\x74\x44\x45\xec\xd5\xe5\x05\x67\x75\xa1\x75\xc9\xef\x2b\x7d\xa0\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x49\x03\x61\x59\x65\x90\xc7\x8c\x0d\x7a\x13\xcc\x12\x4e\x3c\xe7\x06\x4c\x1b\x3e\x3c\x55\x24\x95\x49\xe5\x0b\x12\xc3\xe9\xd4\xde\x6c\xa1\xf5\x0a\xa3\xf0\x70\x7c\x39\xaf\xe6\x20\x9d\x57\x2b\x95\x8f\xc2\x60\xbb\x8b\xdb\x8e\xdc\x13\xed\xbc\x13\xf5\x57\x4d\x31\xc5\x3d\x26\xe6\x39\xbd\x97\x95\xf6\xd9\x7d\xff\x87\x99\xd9\x37\xe9\x9d\xb5\x24\x95\x62\x3b\xcd\xe8\xb5\x36\xb9\xe7\x18\x83\xed\x7e\xb0\xdd\x0f\xb6\xfb\x6d\xad\x75\x8f\x6f\xd0\x2c\xdf\x2c\xfa\xdc\xc2\x5f\x2e\x55\x72\xc8\xd6\x1d\xde\x1a\x7a\x55\x63\x5c\x14\x69\x56\x13\x55\xac\xc8\x59\x78\xdb\x6b\x6d\x7c\xc3\x1d\xd4\xa1\x64\x60\x89\x9f\xdf\x72\x7a\x20\x7b\x28\xac\x2e\x48\x86\xc6\xd6\x8e\xb8\xad\x83\xa4\xb1\x94\x3b\xba\x49\x34\x3c\x32\x0a\x99\xbe\xc1\xaa\x9e\x54\x08\x89\xec\x80\x1a\xd9\x92\xe7\x23\x1b\xea\x02\x8c\x70\x41\x13\x94\x4b\x2b\x9e\x02\x26\xa8\x23\xd6\xbb\xe3\x6f\xb1\x45\x9e\x00\x89\x3e\x05\x02\x27\x01\x0b\xec\x28\x21\xd4\x6c\xb1\x47\x62\x1a\x2d\xf8\x77\xac\x54\x41\xf9\x3d\xeb\xd6\x4e\x36\x8d\xdf\xbb\x93\x50\xc9\x9c\xe5\x14\xfe\xf9\xd6\x2d\xc0\x5c\x6b\xc3\xef\x6a\x86\x89\x3d\x59\x99\x1b\xc1\x6b\xd4\xf2\x67\x3f\x59\x84\xe5\xc5\x74\x2d\x5a\x58\x21\x0e\x0c\xbb\x53\xe0\xef\x58\xee\x6d\xcb\xb0\x66\x40\x10\xe8\x7b\x86\x85\x32\x57\xdc\x61\x00\x71\xe1\xfe\x1c\x78\x69\x4f\x91\xae\xb0\x1d\xc3\x0f\xa0\xaf\xfd\x7f\xe4\xed\x0b\x6d\x96\x27\x78\xe0\xc1\xfe\x3f\xd8\xff\xdb\xed\x85\xdb\xff\x1b\x24\xcf\x61\xd0\x0d\x06\xfe\xa6\x85\xc4\x59\xf9\xef\x99\x93\x2d\xac\xfc\xe2\x4c\xf7\xce\x6e\x2f\xcb\xb6\xe3\xd9\xe9\x64\x72\x8a\xae\x67\xb5\xc0\x53\xe9\xe9\xf8\x8f\x84\x89\x44\xa6\xa6\x9f\x8f\xd0\x7f\xa9\x34\xb0\x4b\xb5\xe6\xaf\x39\x97\xdc\x8d\xd5\x74\x5e\x83\xbe\xe3\xe8\x6a\x04\xda\x73\x19\x66\xdf\x3e\x85\xb9\x88\x40\x5f\x35\xf3\xe1\x73\xdb\xda\xad\xf0\xb5\x12\x2c\x17\xe2\x7e\x57\x24\xe3\x39\xb7\x75\x61\xcd\x7d\x67\x4a\x87\x2a\x2e\x09\x39\xc3\x8f\x27\x49\x51\x8d\x6c\x47\x93\x9c\xe5\xb2\x5c\x8e\x7c\x67\xe6\xc7\x56\xef\xf6\x0d\xac\xda\x91\x54\x65\xc9\x84\xce\x96\xa1\x89\x79\xea\x76\x24\x2e\xc7\xed\xd4\x01\x99\x1c\x7f\x38\x61\xe9\xa3\xea\xd6\xbe\x91\xb5\x75\x18\xd4\xeb\x7e\xb5\x58\x96\x17\x03\x9e\x47\xb5\xed\xdc\x3c\x65\x62\x41\x16\xb4\x54\xa1\x37\x80\xf4\xe5\x6b\x52\xbe\xe0\xaa\xab\x72\xf2\x8e\xc5\xdd\x79\xdd\x27\x94\x1c\xac\x74\x51\x69\x8b\xee\x1c\x88\xbb\x4a\x13\x1e\xb4\x57\xd8\xb7\x2f\xba\x55\xc0\x75\x2b\xa8\xd6\xac\x14\x6f\xc8\x7f\x9c\xfd\xfb\xef\x7e\x1e\x9f\xff\xe5\xec\xec\xfb\xd7\xe3\xff\xfd\xc3\xef\xce\xfe\x7d\x02\xff\xf8\xed\xf9\x5f\xce\x7f\x76\x7f\xfc\xee\xfc\xfc\xec\xec\xfb\xaf\xde\xfd\xf5\xe3\xed\xf5\x0f\xfc\xfc\xe7\xef\x45\x95\x3f\xe0\x5f\x3f\x9f\x7d\xcf\xae\x7f\x08\xec\xe4\xfc\xfc\x2f\xbf\x89\x98\x24\x15\xcb\x6f\x82\x71\x0a\xb6\x71\x2f\xba\xd2\xfe\x36\xf2\xe8\x57\x78\x3f\x2e\xf4\x58\x96\x63\xec\xe4\x0d\x64\x41\x0f\xee\xca\x1d\x6d\xff\x3b\x52\x53\xad\xba\xea\x89\x63\x8f\x0f\x7c\x09\x9e\xc6\x01\xf7\x76\xec\x02\x53\xd1\x15\xdf\x6b\xf6\x01\xd7\x67\x3b\x48\x4a\xb3\xbc\x90\x25\x2d\x97\x24\xb5\xca\xad\xe5\x93\x92\xbe\x3d\x31\xb1\x3a\x4c\x32\xe5\xbb\x61\xfc\x00\xaa\xe2\x9c\xa5\xbc\xca\x0f\x92\x96\x0d\x7a\x6e\x6e\xfa\x23\x94\x1d\xb1\x45\x4d\x9c\xaf\x8f\x7d\xcd\x95\xe4\xa2\xc9\x03\x0a\x2a\xfe\x54\xc2\xf4\x87\xad\x5a\x14\x27\x27\x2b\x35\xbe\x41\x37\x0d\x4e\x30\x32\x65\xa7\xca\xbf\x8b\x83\x47\x2a\x89\xd1\x9c\x69\x7d\x23\xcf\x6c\x57\xe7\x86\x11\x7c\x07\xbc\xc2\x11\xd2\xf0\x07\x41\x0b\x89\x4c\xde\xc4\xff\xc1\xbe\x36\x5c\xd1\x41\x22\xbc\x5d\xe7\xbe\x22\xb8\x04\x61\xce\x26\x5e\x9c\x92\x4c\x26\x0d\x07\xb0\x16\x33\x00\xe0\x70\xed\x2e\x71\xb8\xad\xd0\x00\x85\x19\x17\x79\x3d\x50\x86\x66\x0a\xbd\x5b\x78\x02\x05\xda\x40\x34\x84\x33\x8b\x80\x04\xd3\x6d\x4e\x3f\xf1\xbc\xca\x49\xa5\xcc\x6c\xa5\x68\xf7\x52\x4f\xf6\xd1\xd5\x99\x83\x54\x76\x5c\xc0\x47\x2d\xd1\x38\x44\x45\x39\x67\xe4\xce\xef\x5f\xad\x0e\x41\x53\xba\x95\xe4\x54\x05\x82\x84\x9d\x87\x65\x93\xe5\x14\x1c\x2b\x3c\xc7\xa6\x7c\xa9\xb2\x1e\x97\x4a\xf0\xac\x7d\xab\x5c\x11\x21\xbf\xbd\x95\xb0\xfe\x8a\x2f\xe9\x06\xbc\x60\xde\x28\x98\x23\x8a\xe7\x83\x22\xb9\x9f\x27\xf0\x3c\xde\x7b\x73\xaf\x24\xdb\xbb\x84\xb6\x68\x76\xb3\x7e\x51\xdb\x3d\x94\x3a\x4f\x42\x8f\x42\xc2\xd2\xec\x7c\xf4\x3a\x1d\x4b\xea\x93\x65\x62\x53\xf8\xf1\x56\x1d\x38\x1c\x14\xe1\x1b\xc2\xd8\xc6\xe6\x3f\x4e\xf7\xe3\xcc\x8f\xf7\x6c\x8a\xee\x4d\xf8\x0d\xc8\xee\xaa\x2b\x74\x0e\x35\x5a\x19\xd3\x10\x8b\xc7\x7c\x75\x40\xf4\xbb\xca\xe5\x22\xa0\x80\xf0\xb7\xca\x1a\x9c\x79\x27\x40\xd1\xf3\x56\x9c\xbc\x42\x11\x5b\x30\x96\x62\x2c\x60\x56\xcf\xbf\xac\x44\xe7\xec\xef\xcf\xc9\x94\x51\x5d\x95\xe8\xfd\x23\x8c\x94\x93\x39\x01\x0e\xd5\x4e\x25\x33\x87\x02\x29\x10\x4b\x99\x13\x25\x68\xa1\xe6\x52\x83\xea\x84\x16\x34\xe1\x3a\x20\xbc\x4c\x97\x34\x79\x80\x1a\xcb\x25\xb3\xb3\xed\x9a\x5a\x72\x6e\xa3\x18\x9a\x10\xd1\x8e\x7d\xd4\xf3\x52\x56\xb3\x39\x84\xe2\xe1\x5b\x49\x46\x15\xc6\x5c\x76\x19\xd9\x37\xf6\x6e\x15\x03\x8a\xa4\x4b\x41\x73\x9e\xf8\x4a\x53\xa5\x5c\x70\xc5\xa5\x35\x52\xc1\xa8\xdd\x8b\xa6\xe4\xd6\x97\x01\x42\xcb\xd8\x65\x46\x79\x4e\xce\x14\x63\xe4\xda\x5d\x12\xfc\xe5\x0e\x05\x04\x54\x77\x86\x38\x58\x35\x8d\x6a\x36\xf5\xb1\xcd\x9c\x62\x9e\x38\xd5\x6d\xc3\x8d\x21\x24\x21\x96\x85\xe7\x8d\xd3\xee\x2e\xf0\x6b\xc0\x78\xf3\x8a\x65\x09\xfe\x82\xae\x1a\x1e\x13\xa9\xac\xdd\x63\x3a\x7a\xbd\xb8\xbd\x51\x4d\xb5\x02\xde\x65\x5b\x60\x09\x7e\xb0\xe9\x96\x7d\x5e\x59\x8f\x09\x3a\x7a\x36\x04\x56\x40\x21\xe6\x05\x4f\x2b\x9a\x21\x69\x0d\x58\xe4\xe5\xdd\x0d\x0e\xcc\x67\x73\x3d\x7e\x64\xa0\x08\x46\x1e\xa8\xc6\x7d\x6e\xba\x7c\xcd\x69\x9b\x2b\x20\xc2\x01\x35\x98\xad\x62\x1a\x97\xfc\x48\x97\x90\x7f\xde\x3a\xff\xb6\xbc\x7d\x5c\x4d\x18\x1c\x60\x2a\xbb\xa8\x4c\xee\xe8\xb7\x05\xa1\xce\x65\x5f\x00\x4a\x49\xa8\x00\x66\x1c\x34\xfa\x06\x9e\x00\x6b\xac\xaf\xb9\xfb\xfe\x35\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xa7\xcc\x76\x00\x69\x6a\x51\x43\xec\x47\x96\x17\x19\xd5\x07\x71\xc0\xf9\x5b\xc3\xe4\xd0\xb0\x87\x1b\x24\x46\x45\x3a\xa6\x99\xb9\x2a\xb7\xdf\x5d\xda\x80\x57\x44\x3c\x91\x9e\x76\x1f\x1d\x11\x12\xbe\x96\xb2\x61\xc3\x37\xe2\x1c\xc8\x9e\x7a\xcf\x52\xa0\x20\x76\x6e\x61\x4e\xc2\xf2\x51\xb0\xd2\xc1\xde\xed\x77\x97\x23\xc2\x27\x6c\xe2\xfe\xf2\x9d\x39\xf2\xa8\xe5\x0c\x43\x67\x5c\x88\x5a\x88\x6d\x5d\xa6\x13\x5c\x4e\x53\xbf\xdf\xec\xfd\xc7\x3f\x99\x85\x9a\x5f\xff\x3c\xfe\x53\xa3\x76\xe1\x9f\x7f\x34\xf4\x38\xc8\x57\xf5\xc7\x95\xef\x9a\x31\x17\x40\xf4\xcc\x5f\x3f\xde\xda\xb2\xc5\xb6\xa8\xf1\x8f\x81\x4e\x15\x84\x30\xa1\xcb\xe5\x84\xdc\x4a\xf0\xc3\xe3\x29\x5e\x59\x98\x7f\xc9\xfe\xee\xcc\x42\x70\x5c\x5e\x83\x9e\x50\xcd\x04\x70\x25\x3b\x2b\x00\xd7\xcd\x66\x00\x80\x01\x00\x39\x51\xd8\xa5\x33\x50\xbd\x62\x3a\x9c\x11\xd1\x12\x93\xd3\x77\xe3\x72\xd3\x2e\x04\x61\x9f\xb8\x82\xec\x67\xb8\xe3\x70\x6c\xd4\x86\x84\x38\x46\xce\x0c\x6b\x20\xc1\xe7\xcc\x2b\x64\x88\xef\x06\xac\xff\xb7\x42\xea\xdf\xfa\xcb\xe0\x3c\x4a\x81\x63\x93\x84\x2e\x24\x77\x35\xb6\x0d\xe2\x11\x60\x64\x09\x4a\x34\x61\xcf\xf3\x7e\x49\x72\xae\x34\x7d\x60\x13\x72\x67\xd8\xb9\xa6\x93\x09\x9e\xb2\x20\x50\x0b\x8f\xa5\xa4\x12\x9a\x67\x81\x12\x9d\x9f\x0b\x6c\x4c\x83\xd5\x83\xd4\x12\x55\x62\x78\x92\xa2\x64\x63\xc7\x5a\xe2\x5b\x41\x7a\x17\x5b\xd5\xd3\xed\x49\xbd\xa7\x23\x0f\xfa\x73\x8a\x6a\x91\x22\x85\xce\xad\xa7\x76\xf0\x85\x5d\x8b\xa6\x30\xbb\x21\x45\x52\xb3\x8e\x70\xec\x6a\x42\xde\x03\x3f\x98\x85\x00\x39\x3a\x8d\xa1\x1e\xc8\x5a\xd9\x04\x4b\x98\x52\xb4\x5c\xa2\x13\x3b\xf7\xd5\xb5\x2b\xc5\xa6\x55\x06\xec\x72\xc8\x96\x50\x81\x95\xcc\x4b\x96\x48\xa1\x74\x59\x25\x70\x8e\x94\xdc\x97\xf2\x81\x89\x3a\x0c\x29\x08\x31\x36\x3d\xee\x6b\xd7\x66\xc3\xf6\x08\x49\x92\x39\x15\x33\xe6\x53\x80\x90\x9c\xa6\x00\x45\x5f\x79\x01\x2b\x64\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\xf7\x86\x23\x73\xf6\xc8\x90\xc9\x7e\xf0\x41\x00\x79\xc3\x78\x29\x78\xb6\x67\x47\xde\x18\x5b\xd5\x18\xf8\xef\x6e\xc1\x3d\xca\x36\x95\x33\x4d\x53\xaa\xe9\x21\xe3\x34\xde\x51\x5f\xc6\xdd\xfa\x42\xc1\xa1\x37\x7c\xa4\x2c\x9b\xe5\xa4\x42\x59\xf0\x66\x62\x97\xdb\xef\x2e\x03\x47\x02\x31\x10\xce\x19\xf2\x46\x6a\x73\x8f\xac\x79\x1e\x20\x0f\x43\x63\x5c\x2c\x86\x99\x84\x1b\x13\xc9\x01\x4b\x49\x5a\x45\x68\xfb\x6b\xa2\x12\x66\xcf\x8c\xb4\x66\x9a\xf3\x3e\xe4\xc1\x7c\xac\xdd\x84\x92\x76\x64\xc1\x46\x61\x02\x2d\xf0\x4c\x68\x5e\xb2\x46\x7a\x9f\xc0\xc1\xec\xa9\x56\x02\x6f\x7a\xfb\x7c\x11\x00\x66\x4c\xab\xda\x25\x19\xc9\x7f\x70\xff\xda\x32\x8e\x38\x4b\xe0\x65\xdd\x99\x5b\xfd\xdd\xc6\x45\x05\xf6\x8e\x70\xa3\xa4\x25\xf3\x86\xbd\x39\xc8\x91\xf7\xb1\x2d\xd3\xc4\x60\xfb\x77\x32\x8d\x31\x47\xf7\xf5\x3e\x68\x0d\x57\x87\xa7\x61\x54\xa4\x02\xe5\x33\xbe\x00\x0e\x31\xaa\x95\xdc\x08\x69\xd4\x9c\x2e\x22\x52\xa9\xf4\xd6\x78\xd6\x72\xce\xd8\x57\xe1\x85\x89\x8d\x61\x62\xe3\x2f\x82\xa7\x10\xe3\xc8\xeb\x5a\xb0\x43\x6f\x7b\x90\x48\xab\xeb\x93\x12\x41\xb8\x66\xd0\xff\x5d\xa4\xc5\xb5\x3f\xf4\xd4\xa3\x59\x66\xc0\x3a\x51\x79\x07\x3c\x1b\xec\xcf\xb8\x41\xdb\x31\x3b\xf8\xdb\x16\xdb\x6c\x05\x2d\xaf\x33\xc3\x70\xca\x33\xa7\x44\x9b\x58\x30\x71\x79\x2a\xdb\xaf\x9f\xf7\x1e\x16\x38\xff\xcd\x5a\x9c\x88\x3e\x6f\xac\x3f\xb1\x93\x41\x8d\xac\x57\x82\x0d\xcd\x85\xf1\x9b\x8b\x57\xca\x2c\x63\x25\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\x87\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\xa3\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x31\x57\xfd\x6f\x4e\x8d\x7b\x21\x96\xb8\x75\x57\x0d\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\xfb\xcc\xb0\x68\x0d\x90\xf2\x33\x5a\xe1\x25\xb4\x6c\xbc\xf5\x81\x4d\x63\xb6\x03\xf4\xcc\xcd\x8f\xc3\x46\x41\x66\xa4\xf5\xe1\xa4\xf6\xfd\xb6\xd2\x5b\x54\x92\x71\xd7\x2c\x74\xb4\x3a\x6b\xfb\x5b\xae\x8c\xdb\xcc\x7b\xb7\x71\xae\xe1\xa3\xf7\xf0\xc7\xea\xe3\x91\x05\xd9\xd3\x78\xa7\x2e\xab\xfd\x41\xa0\xbc\x8e\xad\x8f\x0b\x17\x78\xaa\x83\x2b\x68\x9c\x3f\x4e\x7f\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x67\x06\xff\xd4\x49\x21\x63\x20\x8a\x20\x54\x35\x47\xda\xe0\xc4\x5b\x5f\xef\xaf\xa0\xa8\xa9\x35\xed\xbb\x94\x14\x86\x4c\x5f\xdc\xde\xe0\xfc\x62\x47\x7f\x0b\xf8\x6d\x69\x99\x75\x3d\xe7\x65\x3a\x2e\x68\xa9\x97\xa8\xec\x1c\xb5\xe6\xe6\xa3\xea\xa3\x06\xe9\xe9\xd7\x14\x56\x06\xb9\xd9\x5a\xc7\x0d\x5b\xe5\x8c\xf7\xd6\x87\x63\xeb\x99\x1d\x63\x3d\xe1\x51\xf9\x1b\xd7\xd3\x2c\x62\xe9\x14\x83\xcf\xb8\x9e\xa7\x47\x1c\x90\x36\xae\x3c\x2e\x0f\x64\x90\xb3\x6a\x7b\x3d\x22\xa3\x02\xd2\x8f\x55\x20\xcb\x66\x70\xac\xe7\xa6\x41\xf7\x64\x7a\x1a\x11\x3e\x35\x44\x5a\x8a\x31\x58\xf7\x23\x26\x52\x1b\x33\x2d\xef\x3e\xb1\x0e\xf6\xa8\x2d\x82\x0b\xd9\x98\x4f\x63\x90\xfa\xa6\x93\x33\x21\x43\x94\x49\xae\x01\x9e\xc0\x5e\xcf\x31\xf6\x61\x8b\xe5\xea\x3e\x26\xe1\x24\xa9\xb9\x87\xa6\x9a\xa9\x81\xc1\x1c\x03\xc3\x45\x6a\x80\x14\x48\x22\x28\xa0\x54\x95\x24\x8c\x79\x15\xb0\xbd\xa4\x31\xac\x7b\x0b\x37\xda\x0d\xcb\xa9\x4e\xe6\x4c\x11\x25\x21\xab\xba\xd2\x34\xcb\x58\xea\xcd\x9a\x78\xa0\x12\xf8\x3a\x6b\xf2\x8c\x18\xb1\xc1\x18\xc6\x6c\x50\x43\x05\x67\x75\xe0\x45\x46\xad\xf2\x71\x5a\x89\x04\x7d\x86\xb9\x5e\x7a\xab\xd6\x2a\xb3\x0e\x7a\x1b\x05\x7a\xd6\x18\x86\x72\x8a\x76\xab\x86\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xd6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x0a\xce\x1a\x89\x3a\x46\xc8\x8d\x35\x59\x26\x71\xda\x74\x0a\xe2\xa2\x3f\x83\xd8\x5c\xdb\x59\x63\xcb\xd6\x18\xc7\x73\xcf\x30\x2a\xe6\xcb\x81\xab\x18\xae\x85\x58\x2f\x28\x5a\x69\x99\x53\xcd\x13\x50\xcf\xf2\x69\xc3\xc8\x9b\xfb\xa2\x7c\xde\xc9\x09\x89\x2a\x10\x75\xbb\xeb\xd1\xd7\x6a\x33\xb3\xf9\xa4\x6d\x6b\xec\x94\x3d\x8d\xf6\xa6\xb8\xa5\x36\x58\x8d\xe8\xb9\x7f\x74\x79\x53\x88\x9e\x97\x8c\x11\x9e\x1b\x31\x89\x0a\x4d\x52\x3e\xf5\xf9\x72\x9c\xcd\x7e\xd7\xd9\xc5\x49\xa2\x7f\x03\x7f\x90\x46\x7f\xa8\xea\xce\x32\xf9\xa8\x88\x7e\x94\x5e\xed\x56\xdb\x72\x6d\xbe\x94\x51\x7b\xd8\x28\x0a\x6a\xfb\x37\x68\xdb\x9c\x74\x03\xd3\x8e\xcc\xad\x7d\x64\x59\x66\xfe\xbf\x0b\xdf\x46\x44\x7a\x6d\x5c\x27\x9f\x09\x4c\xc4\xc1\x95\x53\xb3\xda\x78\xb2\xb3\xb4\x94\x45\x61\xcd\x40\xf9\xf9\x53\xd6\x09\xae\x4d\xe5\x82\x29\x70\xd3\x73\xd1\x6c\xe6\xc8\x66\x4c\xb0\x92\x6a\x30\x84\xdb\x0c\xda\x40\x1c\x57\xa7\x13\xae\xb6\xc4\xd6\x4b\x4e\xeb\x00\x03\x74\x5b\xd8\x7c\xec\xee\x1d\xfb\x6b\xd4\x5c\xb9\x40\x08\x70\x37\x36\xea\x48\xcf\xbe\x64\x9a\x9e\x93\x6f\x15\x1e\x94\xa7\x17\x3e\x4a\x30\x48\x3a\xb7\x59\x8e\x50\x40\x8f\x1a\xfe\x22\x2b\xe6\x8d\xf1\x9b\x52\xae\x0f\xb5\x6e\xef\x54\x6b\x66\x97\xa5\x54\xea\xbd\xfb\xe4\x20\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\xdd\x6d\x90\x80\x8f\xbd\x1e\xc0\x77\xc7\xbc\x93\xef\x9b\x0c\x61\x1b\x51\xef\x6d\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\x6e\x55\x7a\x52\xc0\xe9\x8f\x74\x39\x11\x4c\xdb\x3c\x74\x4e\xb7\xff\xc1\x8d\xfe\xd7\xd2\x70\x7e\x56\x40\x6b\xdc\x22\x77\x81\x5d\x12\xc1\xc6\x28\x5a\x22\x29\xae\xbd\x6f\xe0\xf9\xa9\xb2\x1e\x1d\xe6\x77\x08\xb6\x27\xad\x92\x2c\x13\x72\x67\xbd\x05\x57\x06\x5f\x4f\x15\x96\x32\x4d\x79\x58\x1e\xca\x66\x73\x94\xf2\xe3\x16\x1a\x7d\x04\x4a\x48\xfa\x81\xac\x0f\xdd\x3c\x86\xaa\xa5\x0e\x81\x6e\x78\xc4\x37\xa3\x4a\xea\x17\x9e\x6e\xa9\xbc\x99\x92\x0f\x2c\x91\x0b\x56\xe2\x7e\x5f\x7f\x2a\xa8\x30\x62\xfa\x5b\xca\x33\xb3\xdb\x6e\xd7\x6b\xeb\x05\x14\x41\x6e\xbb\x25\x34\x8c\x60\xfe\x1a\xd9\xa3\x35\x90\x13\xc3\x0c\xfa\x9c\x77\xa6\x67\xeb\xa7\x5b\x94\x6c\xc1\x65\xa5\x5c\x3c\x4d\xa5\x91\x8e\x29\x6d\x65\xd3\x39\x9f\xcd\xdd\xcb\xce\xcf\x1c\x3c\x80\xca\xd4\x5f\x95\x88\x39\x28\x4d\x75\xa5\xda\x89\x72\x12\x70\x27\x78\x16\x1b\xb0\x3f\xef\xc3\x32\x7c\xfd\x98\x2b\x8c\x3f\x3a\x26\x1a\xff\x1a\x23\x9e\xb0\x93\x7b\x7b\x0b\x5c\x98\x56\x1d\x66\x96\xc8\xbc\xa8\x34\x6b\xdc\x16\x0b\xad\xb1\x68\x2b\xf2\x20\x5b\x79\x2f\x5f\xe5\x54\xd0\x19\x1b\xfb\x49\x8c\xeb\x08\xad\x57\x3d\xb0\x56\xe4\x91\x92\x27\x24\x5e\x6c\xb6\x17\x1c\x59\xb5\xb2\xd8\xf8\xc8\x73\xf2\xc4\xe8\x73\xf2\x94\x08\x74\xb2\xcf\x28\x74\xe2\x53\x59\x1c\xf3\x3a\x7e\xb0\x63\xae\x5e\x48\x4b\xac\x76\x5d\xc8\x7e\x22\x81\x25\x5a\x76\x54\xae\x88\xcc\xb9\xd6\xcc\x39\x32\xfb\x0b\x36\x22\x5c\xb7\x32\x2d\x58\xc4\x01\x4a\x73\xf4\x46\x66\x9f\x7c\x59\xed\x9a\x31\x8b\x9c\x0c\x08\x3f\x8f\x5c\x21\xe3\x25\x08\xcf\x0b\x2c\xcc\x02\x08\x60\x6c\xe3\x24\x9d\x6a\xd8\xcf\x3b\x01\x5f\x42\xc2\x3e\x81\x22\x1f\xa7\x36\x60\xa6\x01\x33\xad\xb4\x5f\x02\x66\xc2\x2c\x16\x31\x49\x56\x5a\x18\xc9\x7d\x6e\x73\x5c\xd2\x7b\x96\x91\x9f\x2a\x56\x2e\x89\x61\x5b\xeb\x48\x2f\xa8\x06\xae\x78\x8a\x31\x4d\xce\x6a\x76\x60\x2d\x59\x3f\xa6\x09\x2c\x6d\xd7\x9f\x0c\x77\x0f\x39\xdb\x9e\x80\xaf\x57\xbb\x6a\x67\x02\xc5\xdd\xf2\x3b\xd8\xe4\xc9\xd1\xe9\xb4\xf9\x04\xd8\xee\x8b\xf7\x57\xfd\x04\xaa\x38\x67\x43\xd2\xc7\xe1\x70\x6d\xf1\xd1\xc4\x8a\x90\x8b\x1d\x7b\x82\x7b\xe7\x7f\x01\x2a\xe1\xdd\x45\xbd\xce\x9e\x3c\xb0\xe5\xc8\xba\x83\x13\x73\xfa\xd4\xbd\x1c\x3d\x19\x8c\x0b\xa9\xab\x16\x9a\x4e\x43\xb3\x6f\xb7\x5b\x6f\x24\xdc\x4f\xd1\x8b\x2d\xbc\x5c\x64\xfb\x2b\xb7\x69\xb1\xb8\xbe\x37\x95\x88\x2a\x2b\xd9\x6c\xdb\x4a\x4c\x22\x0c\x41\x3d\x38\x97\x1b\xc1\x83\x0d\x64\x9d\x00\x84\x14\x7b\x88\xa4\xbf\x42\x0d\x9b\xdb\xd8\x27\x2f\xb5\xc7\xc5\x6a\x8e\xdf\x8e\xe5\x7f\x60\xcb\x53\x65\x93\xde\x49\xa1\xe6\xbc\xc0\x12\xa8\x8a\x01\x8e\xea\x07\xf0\xd8\xbe\x03\xd7\x76\x37\x2c\x62\xb0\x1b\x31\x22\xef\xa5\x36\xff\xbb\x86\xd0\x24\xb8\x56\x57\x92\xa9\xf7\x52\xc3\x93\xa3\x9f\x0b\x2e\xf1\xb9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x6e\x04\x91\xa5\xdd\xca\x5e\x03\x6b\x57\x44\x59\xd9\x61\x9d\xf5\xa1\x36\xea\x6f\x1a\xd7\x9e\x9a\x2c\x5b\x87\xb6\xe7\x29\xd8\xe1\x41\x17\x89\xbf\x80\x76\x15\xbc\x4b\x5c\x48\x0d\x96\xed\xa5\x9a\xcd\xa2\x5c\x5d\xea\x96\xb3\x72\x06\x59\x1e\x93\x88\x82\x8f\x8d\xc9\xf7\x24\xac\xd8\x7a\x91\xd7\xe6\xc0\x3d\x81\x7d\x4f\x3e\xfe\x7b\xee\x0a\xf8\xa4\xaf\x21\x94\xeb\x98\xd2\x71\x63\x58\xe4\x2e\x72\x5a\x98\xdb\xf7\x5f\x86\x89\x00\xc0\xfc\x6f\xa8\x99\xae\x26\xe4\x82\x28\x2e\x66\x19\x6b\xfd\x66\xd5\xfc\x8d\x6e\xa2\x27\x00\xd6\x37\x43\xe3\x17\x34\x63\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x9d\x3c\xb0\xe5\xc9\x28\x52\x91\x4a\x9a\x34\xc1\x74\x72\x23\x4e\xea\x94\xb4\xad\x7b\xe9\xf9\x2c\xf0\x37\x38\x81\xdf\x4e\xf6\xcd\xa3\x3e\x93\x90\xfa\x6c\x6e\xa2\x56\xa9\x7c\x99\x51\x34\xac\x1c\xc3\x7c\xb1\x3a\xe6\xa6\xa2\x84\x77\x8d\x77\x6a\x93\x96\x8d\x5e\x7e\x46\x4d\x3b\x64\x84\x89\x0e\xb3\x8a\x3a\xd8\xd5\x32\x40\x47\x3d\x9b\xad\x83\x37\x82\xad\x7d\x4e\x71\x73\x16\xdf\x6d\xfa\xa0\x11\x6b\xce\x55\xfc\x71\xdd\x4c\x57\x7d\x14\x1a\xe9\x4e\x9a\x51\x3c\xb2\xb4\x51\xeb\x6b\x3e\xc4\x50\x21\xb1\xae\xa4\x14\x5a\x3b\xb5\x6e\xb5\xfb\x43\xc9\x54\x21\xd1\xbf\x76\xe3\x62\x2d\x8b\x30\xa7\x0a\x7c\xb2\xa6\xd6\xdc\x5a\x54\x65\x21\x95\x2d\x6f\xb7\x0a\xf2\x91\x91\x4b\x36\x9c\xcc\x05\x99\x62\x18\xb8\xbf\x09\xe6\xfe\xf8\xbc\xd4\x17\x2b\x39\x09\xd1\x20\xd6\xc8\xd2\x26\xe4\xe6\x65\x44\xcc\xc8\x39\x7c\xa2\x1c\xe3\x33\x63\xe1\x64\x30\x36\xff\x14\x5d\x4d\x1a\xe6\x3f\xc3\xed\xeb\xa6\xf7\x95\x96\xed\x99\x42\xca\x00\x4c\x1e\x17\x91\x6c\x9c\x20\xbc\x54\xa2\x76\x63\x71\xd4\x63\xb3\x4b\x20\xe4\xa6\xbb\x97\x95\xb0\xa0\xe5\xb2\xda\xed\x6b\x53\xcc\x2a\x5d\x96\x05\x3f\x01\x0b\x9a\x8d\x00\x37\x3e\x35\x6b\xb5\x99\x11\xe2\xd6\xda\xf2\x0f\x02\xeb\x7c\x69\x8b\xf0\x2d\x37\xdf\x5f\x92\x4a\x86\xe7\x01\xe3\x8d\xf0\x14\x36\x6f\x8f\x5d\x46\x0c\x3a\x47\x0f\x57\x4a\x6e\x19\xde\x12\xa5\xa9\x66\x23\xac\xf1\x3a\xcd\x1a\x75\x80\x18\xc9\x65\xca\xa7\xd6\xcf\xee\xae\x61\x43\x1d\x61\xba\x0c\x9b\xeb\xa2\x99\x06\x3c\x62\x22\xf1\x9b\xf9\xa4\xbc\x83\xe3\x1a\xbf\x8c\x81\x2c\xb0\x28\xb5\x78\x90\x53\xe2\x66\xec\xba\xdd\xcf\x81\x9c\xc9\xe9\xb4\x51\xf2\x2a\xa0\x0a\x9e\x6b\xbd\x29\x55\x58\x65\x31\xd7\x9e\x4a\x9a\xa0\xcc\x82\x4b\xbd\xd7\x4a\x22\x5b\xc7\x7d\x3c\x99\x5f\xf8\x0e\x90\xa6\x9c\x92\xb7\x75\x2d\x5c\xae\xc0\x70\xc3\x5d\x62\x3e\x73\x9d\xb8\x48\xb2\xca\x3a\x10\x20\xf6\x33\x58\xe8\x08\x7b\xfe\x04\x76\xa0\xee\xc0\xf1\x5d\x2e\x7a\x64\x2d\x91\xcb\x2a\x86\x80\x90\x05\x0f\xae\x91\xbb\x1a\xb8\xd6\x69\x47\x72\x88\xd6\x5a\xa6\x49\x5b\x8f\xf4\x96\xdf\x97\x8c\x5c\xce\xa9\x10\x2c\x6b\xe4\xc9\xb6\xc6\x3c\xaa\x35\x4d\xe6\x88\x2b\x29\x31\x37\x3d\x63\x86\x52\xcd\xa5\xd2\x24\xa7\xc9\x9c\x0b\x9f\x44\x55\xf8\xac\xec\x75\x56\x9b\xa3\xa7\x10\x3b\x78\xf5\x6a\x0b\x01\xcd\x92\xcf\xad\xa2\xd6\x01\x3d\xf9\x64\xc8\x6b\xbd\xd4\xf5\x22\xed\x3d\x84\x7d\x46\x69\x0f\xe8\x04\xbc\x1b\x32\xc6\xf6\xd2\xda\xe4\x26\xf7\x06\x5a\x2e\x1a\xa4\x90\xd9\x0f\x0c\xa1\x6d\x30\x07\x7b\xad\x64\x9d\x55\x01\xb5\x9d\xda\x59\xdc\xb3\x4a\x98\x4d\xaf\xab\xf5\xbc\xbd\x24\x9a\x96\x33\xa6\x4d\x6f\x44\x54\xf9\x3d\x2b\xbb\xd3\xb9\x1f\xae\xc0\xdc\x51\xea\xc1\xb6\x76\xa0\xa3\x8c\x2b\xf9\xe0\xbe\x82\xb0\x17\xe0\x4f\xa6\x32\x8c\x33\x40\x5f\x45\x57\x84\x16\x4b\x10\x1a\x5c\xfd\x9d\x25\x25\x95\x08\xe1\x17\x62\xea\xc4\xe2\x59\xfe\xed\x6f\xef\x63\x8b\xf4\x9d\xd6\x5f\x6e\x03\x90\x47\x59\x66\xe9\x23\x4f\xad\x5b\x2a\x39\x33\x2f\x9f\x87\x02\xcb\x9e\x6b\xf6\xf5\x4f\x29\x1c\xab\xa3\x7b\x7c\xe4\xe9\x41\xea\xed\x42\xc7\xed\x9d\x76\x22\xa4\xd9\x69\x02\x5b\xcd\x53\x26\xb4\x41\x1d\xa5\x22\x67\xf0\x45\x48\xce\x8b\x6b\x8e\x99\x09\x61\x04\xa8\x0a\x94\xdf\x73\x51\x27\xd7\xac\xcf\xda\x90\x1b\x73\xf3\x9d\xd6\x59\x31\x8d\xf9\xcd\x20\xb3\x81\xd4\x73\xa2\x78\x5e\x65\x9a\x0a\x26\x2b\x15\x5e\x8a\xff\xb3\x3c\xee\x69\xc6\x3e\xe1\xdd\xdc\x67\x02\xe9\xba\xd7\x36\xb7\x00\x71\x55\x75\x56\xde\x55\x76\xa1\xa3\xd7\x3a\x5c\x35\x7d\xe5\x19\x0b\x9f\x5d\x90\x7d\x62\x89\xcd\x2b\x52\x64\xd5\x8c\x77\xe6\xd2\xba\x32\x33\x4b\x8c\x0c\xff\x86\xbc\xad\x27\x0c\x51\xcc\xee\x17\x2c\xd5\x0c\xfe\x0b\x76\x20\x72\x79\x77\x73\x65\xd3\xc0\x0a\xa5\x19\xdd\x17\x8f\x12\x6a\xf2\x1d\x5b\xb5\xcc\x9e\x18\x1e\xec\x2c\xf2\xb2\xd7\x79\x70\x57\xb5\x88\xf6\x17\x5b\xf3\xc1\xd7\x0f\x08\x4d\x7c\x1a\x01\xf4\x03\xa7\x86\x6d\x07\xa7\xd6\x2c\x21\xd0\x98\x40\xca\x0a\x26\x52\x28\x4a\xd8\x80\x7b\xdc\xa5\xbd\x1e\x91\x2d\xa0\x17\x4b\x97\x5d\xdd\xbd\x16\x51\x6e\xc8\xeb\x73\x99\xa5\x8a\xb0\x4f\xba\xa4\x06\xcd\xe7\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x40\xf5\xd3\x97\x54\x28\x9d\x3c\x0b\x17\x98\xfe\x92\xb8\x40\xc5\x92\x92\xe9\xa0\x00\xeb\x1e\xe5\x53\x5c\xe7\xed\x0d\x6c\x3d\x5e\x13\xe5\xf1\x57\x17\x26\x54\xd7\x48\x0e\x1a\x4f\x28\x0e\xc5\x08\x57\x2a\x2f\x17\x54\x29\x2f\x1d\x03\x91\xb3\xd7\x56\xb5\x32\x6e\x04\x0c\x81\x7a\x60\x3e\x25\x42\xae\xcc\xb4\x19\x10\xe5\x5d\x01\x5a\xaf\x04\x74\xef\x2d\x87\x39\x16\x64\xa0\x02\x52\x0b\x60\x37\x23\x88\xb7\xc6\x7f\xa3\xf1\xd0\xac\xab\x21\xf7\xc3\xca\x42\xf6\xc9\xae\x7d\xbf\x97\x3d\xce\xa5\x29\x3c\x0a\xb0\x9f\x1e\xee\x7d\x83\xb8\xba\xc0\xb2\x50\x15\x50\x3b\x57\x2e\x83\x0a\xa6\x7c\xc1\x20\x13\xaf\x4b\x4c\x6b\x18\xdf\xb4\x42\xa5\xa6\x4b\x8f\xd1\x4e\x7a\x11\x1e\xe4\xde\xb0\x3d\xd4\xde\x1c\x37\x42\x69\x0a\xf9\x11\x60\x15\x86\xaa\x1a\x02\x68\x73\x1e\x5b\x40\x44\x9b\x89\xcb\xb2\x10\x3c\x5c\x6e\x88\x66\xc2\x4a\x03\x6b\xd9\x92\x3c\x96\x32\xdc\xb9\x34\x52\x13\x2d\x17\xac\x5c\x70\xf6\xf8\xca\x46\x05\x8e\xcd\x02\xc6\x36\xb0\xfe\x15\x88\x87\xaf\x7e\x0d\xff\x0b\x1a\x3f\x5a\x0f\x69\xb1\xf5\x1b\x72\xd2\x5d\x9a\xb0\xaf\x99\x7a\x0a\x89\xb4\xf7\x5a\xfd\xcd\x76\xb9\xa2\x34\xb4\x0f\xad\x18\x10\xa2\x24\xb4\xf8\xad\xc1\xba\x98\x0b\xe1\x3a\xb2\x56\x1e\xa2\xcc\x19\xd5\xe1\xa2\x95\x10\x01\xde\xc6\x6d\x39\x00\x3b\x6c\x09\x01\xde\xbc\xc5\xc5\x58\x97\x8c\xf9\x45\x69\xcb\x26\x0a\xe9\x4a\x58\x04\x16\x26\x3d\x80\xe2\x32\xa5\x9a\x2a\xa6\xc3\xd4\xd4\xf1\xa8\xa8\xd1\xbd\x59\x71\x13\x2b\xd9\x9f\xc0\xe2\xca\x20\xaf\x8f\xcb\x06\x4d\xc6\x7f\xb6\xc2\x81\x68\xbd\x69\xc4\x02\xbb\xd3\x21\x58\x7e\xee\xca\x78\x39\x5f\x72\x1c\xa5\x3e\xa0\x7d\xf2\xac\x76\x8e\xdf\x7e\x7b\x73\x15\x2b\x14\xd5\x5f\x3a\xd9\x01\xfe\xdd\xde\x26\x0b\xc8\x60\x13\xe5\x3f\x55\x4d\x75\x07\xd4\x33\xf1\x20\x68\xdf\xdf\xd7\xda\x66\x09\xab\x8d\x0b\x57\x5c\x3d\xec\xf3\x96\xaf\x75\xde\xbe\xef\x7f\xbd\xbc\x26\xf6\xe9\x2e\xfb\x40\xc7\x20\xfb\xb6\x1e\xb4\x6f\xfe\x5f\x2f\xaf\x57\x96\xb0\xa2\x08\xb8\xc8\x32\x27\x9f\x19\x41\xc3\xa5\x8d\xb0\x38\x21\x7a\x83\x00\x77\x18\xde\xa7\x64\x58\x6b\xb1\x31\xf3\x74\x92\x28\xee\x53\xcb\xce\x1e\xd8\x84\xcb\x86\x43\xc6\x81\x6b\x61\xce\x12\x56\x9b\xd1\x53\xae\x1e\x8e\xad\xdf\x28\xd2\xf7\x5d\x09\x48\x5e\x96\x41\x67\x55\xb8\x77\x65\x92\x1a\xf5\xd2\x96\xb2\x22\x8f\xb6\x32\x44\xb0\xfa\xe0\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x3e\xed\xab\x83\x19\x7e\x7d\x8f\xca\x04\x28\x34\xa2\xde\x1c\xcd\xf8\x73\x64\x70\x25\x71\xd4\xa0\xa0\xa5\x06\xc9\xff\x10\x00\xe4\x3b\x77\xe4\xa2\xf1\x40\xec\x07\x82\x6e\xa6\x2e\x12\xb3\xed\x7a\xc3\x95\xef\xa6\xf6\x61\x01\x5a\x1d\x07\x25\x6f\x7d\x59\x2f\xf2\x2a\x65\x8b\x57\x2a\xa5\x5f\x8c\x60\xaa\x2e\xf7\x40\x7b\x5d\x54\x91\x93\x2f\x4e\x42\xc6\xb8\xe3\x39\xcf\x68\x99\x61\x66\x3f\x9f\xf0\xd0\xf7\x64\xf0\xaf\x1b\x12\xdc\x58\x5f\x9f\x90\x33\x59\xc2\xd8\x09\x15\x24\x63\x2e\x0b\xa0\xc5\x15\x4b\x14\x35\x82\xfc\x33\x9e\x09\x24\x0f\x61\x5d\x44\x64\x7a\x10\xf0\x4d\x1d\x37\x68\x39\x99\x56\x81\xa7\xab\x9a\xd8\x73\x61\xa8\xeb\x84\x7c\x6b\xa9\xb3\xe5\x78\x10\x36\x52\x20\xb5\xf8\xc6\xcb\x3d\x99\x97\xa3\xc2\x5b\x51\xc6\xed\x49\xd5\x46\xd6\x6d\xc2\x2f\xf8\x34\xba\x55\x82\x33\xae\x3f\xb0\x42\xee\x95\xc7\xc5\x2e\x57\x0c\x5a\x5c\x9b\x07\x52\x71\xa8\x60\x4e\x35\xa1\x88\xa3\x92\x2a\xa3\x46\xea\x45\x83\x55\x14\x23\x6a\xc7\x59\x61\x3f\x3f\x36\x6b\xc9\x35\x22\xea\xad\x22\xc5\xcf\x64\x64\xb1\x7a\xa7\xc6\xd4\x57\x49\x86\x02\x2a\x54\x90\x1b\xc1\xf5\xa5\xef\x16\x03\x2d\x33\x29\xac\x5f\x9c\xe9\xdb\xda\xc0\x66\x5c\xdb\xf4\xf0\x38\x94\xf9\xd9\xf5\xd6\x31\x68\x5d\xac\x05\xaa\xbb\xfb\x55\x1c\xdd\x86\x56\x1f\xda\xbe\xe4\x6f\x57\x30\xfd\x20\xd2\xb7\xaf\x91\xef\x12\xa0\xa1\x7f\x42\xfd\x3c\x94\x74\xbf\x73\x75\xa8\x5c\x25\x25\x59\x62\x9d\x5c\x84\xa3\xd3\xc9\xe4\x74\x02\x6c\xc3\xe9\xe4\xd4\xb1\x96\x99\x77\x0a\xb7\x54\xb8\x1e\x36\xae\xdc\x60\xfb\xb6\x4c\x08\xf9\xc6\xe5\x69\x80\xe4\xd3\x2b\x1e\xe8\xde\xb9\xbc\xae\xa1\x8d\x69\xfb\xda\x77\x2e\x48\x53\x0c\x3a\xec\xea\xbe\x39\x71\xeb\xb2\x3e\xe3\x0b\x9b\x97\x76\xaf\xa6\xaf\x7a\x82\x91\xf0\xd0\x5c\x99\x55\x22\x7c\xf8\x7a\xbf\x33\x43\x24\x12\x3d\x2f\x8b\x7b\xec\xac\x12\x99\xe7\x58\x16\x6d\xee\x65\xe1\xda\x21\x3c\x14\xf1\x85\xab\x2f\xb0\x44\xdc\xb4\xe3\x1e\x46\xa2\x74\xd7\xe9\x8a\xba\xc2\x3f\xb6\x79\x52\x44\x2d\x54\x01\x5a\x54\x73\x5a\x32\x85\xa5\xdc\x6d\xe1\xea\xee\x7a\xa7\x2b\x58\xde\x8f\xb1\x5b\xd5\x58\x4f\xb1\xb7\xb2\x71\x23\x99\xb6\x15\x25\x95\x4b\x6e\x67\x49\xf2\x2b\x3f\xde\xab\x0f\xd7\x17\x57\xef\xae\x27\xf9\x6e\xed\xda\x01\x50\x33\x13\x69\x21\x79\x77\x86\xb2\x31\x29\xa8\xde\x9d\x3f\x3c\x1c\x7d\xfb\x41\x0f\x81\xbe\x7d\xe7\xee\xf2\xb8\x07\x8d\x3a\x9c\x36\x7f\x5f\x03\x30\xb4\x2c\x64\x26\x67\x41\x89\xaa\x9f\x76\xc2\xbf\xc6\x58\x96\x31\x1d\x87\x54\xfe\x8c\x12\x9f\xf5\xfc\x30\x92\xb3\x9e\xbb\xbd\xac\x37\xcc\xcb\x88\x3a\x28\xb2\xf7\x85\xee\xd9\xb3\x49\x11\x6b\x1b\x89\x7a\x1d\xc0\x81\xae\x48\x69\x5d\x6f\xb3\x60\x65\xce\x31\x36\xf5\x98\xe2\xc5\x81\x4f\xa8\x5b\xb2\x30\x54\xe0\xb6\x13\xac\xe3\x8e\xc6\xf5\xd9\x26\x43\x45\xc9\xc6\xbe\x20\xd8\x94\x67\x10\x7c\x57\x73\x30\x0d\xaa\xd4\xd1\xbd\xd3\x94\x3b\xa5\x3b\xf6\x91\x2d\x57\x35\xe6\x35\x37\xee\x6d\x14\x98\x08\xbd\xbb\x80\xac\xaf\xfe\x6b\x35\x93\x74\x86\x05\xbd\x4a\x9b\x87\xb8\x28\xf9\x82\x67\x6c\x06\xa5\xd0\xb9\x98\xa9\x3a\xa7\xa4\x35\x1a\x77\x0c\x00\xf1\x8f\xac\xa6\xc3\xde\x2c\xf8\x0e\x4c\xc0\x3e\x4d\x16\x02\xf5\xfb\x6f\x3e\x12\xc1\x70\xb0\x4e\xf0\x7c\xa2\x10\x6b\xa6\xd3\x49\x88\x0e\xa1\x25\xdf\x1f\xf1\x3b\x28\x9a\x76\xe6\xaf\x4d\x80\x1b\xa8\xc2\x44\x1d\x22\xa2\x7c\x4a\xd4\x32\xcf\xb8\x78\x18\xf9\x02\x73\x53\x69\x53\xeb\x32\x62\x7e\x70\xe0\x5c\x32\x9a\x3d\x85\x18\xec\x1d\x08\x48\x1c\x21\xd0\x07\xb2\x5b\x00\x23\x69\xee\xea\xbf\x3a\xb4\x83\xba\xa2\x48\x2c\x1e\xe0\x87\xf0\xe2\xb6\x95\xe7\x74\xb6\x57\x47\x67\xe8\xb0\x85\xb6\x05\xf9\xe6\xf2\xc6\xd7\x89\x6c\x2a\x6a\xf0\x5d\x59\x12\x5a\x6a\x3e\xa5\x89\x3e\x27\x45\x05\xd5\x7c\xa0\x36\x89\x25\xb3\xf6\x76\x6c\xf1\x82\xe8\x98\xce\xc7\x5a\x6c\x06\x97\x34\x25\xb3\x85\xe9\x5f\x43\x51\x70\x90\xf3\xab\xc2\x3a\x51\x60\x00\xb0\x2d\x0e\x75\x5b\x65\xd9\xad\xcc\x78\xb2\xf4\x85\x2d\x50\xdd\x94\x1a\x54\xd4\x89\x8b\x2e\xb2\x47\xba\x54\x6f\x9a\x33\x27\x14\x9e\x11\xaa\x35\xcb\x0b\x04\x19\xb3\xdc\xd5\x04\xd7\xb5\xc6\x09\x0b\x2e\xbb\xc2\xfa\x53\xca\x33\x7f\xf7\x2b\xfb\xa0\x13\x97\x8f\xc9\x7b\xb6\x60\x65\x7b\x26\xc2\x3c\x82\x4e\x54\x7b\x74\xd8\x78\xe0\x66\x2a\x05\xf2\x1c\xd6\xd2\x58\x3b\xa8\x8e\x59\xf2\xe9\x4a\xb7\x58\x87\xc6\xc2\x44\xf7\x94\x6f\xa6\xef\xa5\xbe\xc5\xb7\xdb\x33\xc7\x39\x6f\xe9\x9f\x66\x86\x1b\x5b\xba\x71\xcc\x61\xa6\x5c\x3d\x3c\x69\xb2\x5e\xfe\x6c\x6e\x79\x38\xd0\x41\xe5\xe5\x12\x13\x58\x02\xe4\xd9\xd1\x0c\xf4\xc1\x6f\xa9\x59\x96\x85\xf8\x92\xd9\x10\xfa\x91\x05\xc2\x66\xc8\x3c\x7b\x84\x8a\xfc\xba\xae\x10\x6d\x55\x4d\x89\xcc\x19\xa1\x0b\xca\x33\x7a\x9f\x81\x67\x89\xe9\xdc\xf6\x15\xa0\x71\xb8\x80\x55\x81\x45\x55\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x36\xd4\xbc\x36\x38\x81\x4c\x26\x0f\x4d\x7e\x03\x2a\x9a\xc1\x2b\x18\x87\x90\x82\x0f\x26\x4d\x53\xa2\xf8\x4c\x40\x49\x6c\xa1\x49\x46\x35\x13\xc9\x72\x42\x6c\x0a\x6f\xd5\xa8\x18\xae\x4b\xee\xe3\x18\x04\xd4\xeb\xaf\xab\xa4\x26\x0f\x72\x3a\x5d\xa9\x30\x6e\x4d\xbd\x16\x51\xe0\xea\xa9\x92\x02\x07\x67\x4a\xd1\x59\x10\xa2\x58\x2d\x19\x84\x3b\x6f\x93\x4e\x38\x74\xe4\x32\x4a\x38\x57\xad\xd2\x85\x02\xd7\xa1\xbe\x1e\xda\xca\x4a\x68\x9e\xb3\x95\x6c\xab\x04\xf4\xd5\x6b\x2e\x1b\x66\x28\x9b\x8e\x16\x02\x71\x6c\x60\xaf\x2b\xc5\xc3\x53\x3b\xbf\x35\xdb\xf6\x2a\x42\x05\xff\xc6\x90\xf5\x36\xf0\x32\xc0\xa2\x5b\x22\x14\xf5\xb6\x69\x7e\x6a\x2e\xe5\x0c\xe2\x8a\xeb\x83\xfe\xfe\xb7\x3f\x4c\x16\x4d\x9b\x0a\x7c\x6e\xc8\xe7\xb9\x99\x59\xce\xca\x99\xab\x35\x93\x53\xc1\xa7\x4c\x99\x53\x5f\x1a\x10\xb1\x7a\x4b\x28\x46\xf5\x68\x80\x03\xbd\x47\x56\x16\xd2\x89\xdb\x3e\xae\xe8\x44\x1b\xa7\x54\x8b\x65\x67\xa5\x3c\x87\xfd\x85\x74\x5e\x9f\x58\x52\x69\xb8\x27\xe0\x35\x40\xce\x84\x34\xcf\x3a\x6d\xa0\x77\xd5\x3d\x32\x5c\x30\xc0\xca\x74\x5d\xe5\x35\xdd\x38\x9b\xce\xdd\x52\xd5\x7d\x81\x7b\xc5\xa6\x86\x27\xf8\x62\xf2\x4f\xff\x14\xb2\x60\xf4\x5e\x85\xde\x15\x4b\xaa\x92\xeb\xa5\x41\x6f\xec\x93\x9e\x4c\x15\xd4\x31\xb9\x84\x14\x1d\x96\x78\xcd\x29\x28\xc8\xd0\xd5\x15\xaf\x48\x0d\xbc\x06\xa0\x8e\xee\x97\x57\x78\xca\x7a\x08\x5e\xce\x2e\x7b\x6a\x11\x98\x81\xc0\x1a\xcc\xd5\x84\xdc\x4a\xa5\xb8\x39\x7f\x9f\xd7\x29\xc8\x59\xf9\xc5\xd0\x73\xd3\x3e\x3b\x8a\x4e\x40\x6a\x79\xd9\x34\xbd\x7b\x05\x4d\x5e\x1f\xe1\xc1\x8c\xf3\x06\x92\xa3\x6a\xa2\xe9\x6c\xa5\x74\x8a\x2c\x5b\x8b\xae\x73\x70\xef\xd9\xae\x62\xd7\x78\x88\xdb\xf4\xc1\x09\xdf\xe4\x66\x15\x60\xda\xf1\x1d\x36\x2b\x53\xc8\x36\x7e\xc9\xe6\x74\xc1\x36\x12\x81\x42\xa6\x93\x0d\x78\x13\x80\x35\xa4\x6b\xc3\xb4\xfb\x30\x0a\x9f\x21\x48\x29\x96\x43\x62\x92\x2d\x64\x67\x13\x0d\xbd\x5f\x92\x4c\x4a\x48\x34\x51\x15\x44\xc8\x94\x19\x30\x03\x37\x0d\x9a\xa9\x11\xb9\xbb\xb0\x2f\x16\x8d\x21\x31\x69\x1c\x70\x48\x05\x4b\x36\xbc\x70\x00\xb9\xbb\x91\x0f\x1d\x89\x66\x88\x17\x5d\x2b\x0a\x42\xda\xf0\x9d\xba\x24\x8f\x2d\x54\x92\xb1\x05\x03\x43\xe3\x94\xcf\x08\x26\x62\xcf\x6d\x6a\x3e\xe7\x35\x25\x4b\x48\x6f\x5d\xf2\x34\x44\x58\x5e\xa5\xef\xe6\x40\x1e\x65\xf9\x90\x49\x9a\x36\xf2\x12\x29\x92\xf1\x07\x46\xae\x58\x91\xc9\xa5\xcd\xa7\x27\x52\x72\xa7\xa9\x66\xd3\x2a\xbb\x0b\xda\xc8\x50\xf9\x57\x25\x8a\xef\x55\xfe\x35\x1d\xae\xc8\xbf\x37\x77\x97\x77\x37\x2f\xd2\xdf\x37\x42\x9f\x0c\x0b\x7b\x3e\x1b\x18\xff\xa9\xcb\xaa\x3d\x26\x59\xd5\xfd\x0e\xfa\x09\xdc\xca\x52\xd3\x6c\x4f\x0c\x4d\x32\xa7\xc5\x45\xa5\xe7\x57\x5c\x41\x8d\xa2\x58\xbe\x66\xed\xfb\x46\x6e\x21\x06\xca\x62\xcb\x56\x12\xee\x00\xc9\xbe\x77\xf9\xaf\x17\xb7\x84\x56\xe6\xf0\x35\x4f\x80\x08\xee\x4d\xad\xdf\x5c\xd9\x1d\xe6\xdc\xec\xb9\x2e\xfb\x75\xc7\xaa\xdc\x5b\x87\x5e\xd3\x73\x45\x49\x0f\x2e\xd0\x47\x74\x81\x06\x64\xb5\x4f\x2e\x8b\x0b\xae\x39\xd5\xb2\x3c\x94\xef\x68\x6b\x00\xef\x52\x52\x29\x2d\x73\x7b\x41\x6e\xdc\x1b\x10\x6b\x14\x68\x28\x58\xeb\xb6\xf6\x48\x01\xf3\x25\x6c\xd4\x8d\xd0\xac\x9c\xd2\x84\xad\xe4\xf9\x18\x81\xd6\x09\x47\xe7\xee\x9d\x80\x71\xff\x64\x9d\xb1\xa0\x24\x74\xf6\xe7\x37\x7f\x6a\x78\x53\xff\xd9\xf3\x65\x56\xd7\xd5\x64\xc1\x04\x4b\x42\x34\x56\x71\x27\xf7\x53\x2c\xde\xe2\x3f\x89\x15\xaf\x32\xdc\x82\xff\x57\xd1\x0c\xb7\x2e\xec\x00\x62\x26\xd9\x3a\x86\x83\xc0\x57\xfb\xa0\xed\xfa\xfc\xa9\x62\xfc\x1a\xe0\x13\x94\x13\x85\x5d\xb4\x2e\xa9\x50\xe6\x20\x63\x25\xa4\x53\xcb\x23\x9e\x92\x33\x9d\x14\x01\x4e\xe6\x51\x01\xa0\x3e\xf8\xd3\xfe\xa3\xe3\x83\xf8\x2c\x59\x59\x25\x9a\x5c\x1c\x6e\xc6\x47\x04\x87\xaf\x7d\x96\xac\xd0\x55\x1d\xc4\x8f\x1d\x6e\xd7\x41\xdc\x73\x6c\xd7\x1e\x4a\x9a\x8b\x47\xd6\x89\x7c\xcd\x95\xc6\x7c\x1a\xf8\x32\xc4\x53\x63\xc6\x21\xc3\xf1\xde\x1a\xd1\x80\x17\xff\x49\xd3\xb4\x7c\x83\x54\xde\x29\xbe\xcb\x90\x70\x79\x23\x97\x68\x5f\x2d\xd1\x89\x1b\x67\x7a\x59\xd8\xd2\xfc\x1f\x2f\x6f\xa1\x2f\x45\xfe\xf8\xcf\xaf\x81\x05\xfe\xa7\xdf\xff\xf3\xeb\x60\x30\xfb\x2c\x53\x13\x91\xff\x81\x2e\xf5\xc7\x48\x79\xd1\x4a\x5b\x01\xa9\x9e\x0d\x0f\x7a\x87\x19\x1e\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xfb\x71\xaa\x43\xde\x85\x21\xef\x42\xdd\x86\xbc\x0b\x9b\x27\xd6\x90\xd4\x0f\xe2\xf5\xd1\xe8\x1f\x32\xeb\xae\x53\x39\x24\x70\xb7\x9f\x23\x81\xeb\x3c\xd0\x6e\x74\x11\xb7\xa5\xcd\x58\xb7\xb0\xe4\x66\x75\x2e\xb0\xab\xf7\x77\xff\xf9\xf5\xc5\x97\xd7\x5f\xc3\x3a\x6d\xf0\x9c\x01\x6b\x2e\x9e\xa0\xc9\x3a\xc2\x25\x0a\xdd\xeb\xfd\x7a\xe9\x8b\x15\xff\x7c\x41\xde\xbf\xbd\x8b\x74\xcd\xdf\xef\x76\xae\xca\xdf\x62\x1a\xb2\x6f\xc7\xf5\xfe\x33\x2f\x29\x56\xee\x2f\x51\xe0\x41\x9d\x04\x1b\xc5\x5f\x5b\x5a\x1c\x73\xd2\xb8\x8a\x23\xa8\x51\xba\x8e\x91\x7c\x26\x8e\xdc\x66\xd3\x70\x23\x5f\xa4\x0b\xf7\x61\x8e\x24\x94\x67\x2e\xe3\xb3\x5d\x06\xe6\x88\x2b\x1b\x29\x31\x0d\x42\x42\x12\x51\x1a\xe2\x69\xc8\x26\x53\xca\x11\x8c\xcf\x15\xaa\x8b\x4d\xf5\x2b\xf6\x89\xea\x37\x0e\x60\x6b\x57\xb8\xe2\x1b\x0d\x0f\xf9\x96\x4d\xb6\xcb\x9c\xb4\xa5\x36\x49\xc3\x48\x0a\x04\xb0\xa0\x49\x37\x29\xdf\x5b\x71\xa3\xd5\x7a\x25\x90\xe1\xff\xe8\xc4\x04\x46\xdd\x63\xce\x15\xdf\xdf\x21\x2e\x9a\xef\x7c\x35\xfd\x2c\x8d\x39\x62\x42\x95\x77\x9f\xab\xea\x82\x20\xa1\x79\x6a\x9f\x19\x06\xc8\x0b\xa4\x44\x7f\x3b\x98\x02\x65\xdf\xca\x93\x62\x2e\xb5\x14\x87\xcb\x86\xb5\xa9\xff\x36\xe2\xba\x85\x37\x2e\xeb\xda\x44\x35\x0c\x60\x42\x0c\x6f\x27\x5f\x71\x0d\xb7\x36\xf1\x38\xaf\xf0\x66\xdc\xe9\xed\xa6\xb9\xed\x0e\x41\xdd\xb8\x9c\xc3\xa7\xbe\x8b\xc9\x17\x75\x73\xb5\x27\xcc\x35\x24\x95\xc6\xf6\x42\xcb\x7f\x98\x93\x8e\x3c\x1c\xf3\x89\xdb\xf5\x9b\x2b\x2b\x68\xb8\x94\x7b\xca\xde\x07\xb2\xfd\x2a\xee\x8d\x77\x92\xa5\x7e\x94\xe5\x01\x92\xed\xb7\x7b\x5e\x89\x21\xb4\xbf\xad\xa5\xda\xdc\x3b\x5e\x69\x4f\x22\x2a\x77\xde\xea\x0a\xcc\x8e\x76\x0c\xbd\x25\x71\xde\xa7\x74\xe2\xfa\x9a\x24\x32\x6f\x15\x31\x9c\x33\xe4\x03\x2e\xef\x6e\xde\xf1\x19\x4e\xc5\xcd\xda\xd5\xf7\x1a\xcf\xa8\xee\x1a\x9a\x2b\xd2\x65\xb3\x3d\x00\x8e\xc3\xf3\xfb\x1c\xf0\xdc\x1d\xe0\xb9\x06\x14\xee\xc2\x77\x2f\x15\xdd\x3d\x2f\x9a\x3b\x0a\xbf\xf6\x8b\x4a\xff\xee\xae\x47\xe4\x8e\xb9\xcf\xac\x12\xd6\x9c\x75\x4d\x1a\xa8\x47\x6a\xf6\xbd\xbd\x91\x82\x52\xfe\x1d\xf0\x56\x04\x15\xf0\xdf\xa0\x95\x16\x50\x28\xcd\x32\xb3\xab\x52\xd4\x95\x54\x54\xed\x9c\x8b\x9e\xac\x39\x2d\xac\xa3\x6e\x2a\x1f\xc5\x23\x2d\x53\x72\x71\x7b\xb3\x1f\xec\x15\x91\x1c\x09\x61\x2d\xac\x6e\x61\x8f\xf4\x48\x75\xf7\x40\x19\x34\xd6\xbd\x64\xe4\x9e\x6b\xd5\xaa\x9f\xdb\x50\x79\x19\xb2\xe7\x9d\x72\x20\x3a\xa6\x2e\xe2\x18\xc5\x86\x09\x22\x13\x4d\x33\x6b\x4b\xbb\x67\xfa\x91\x31\x41\x5e\xbf\x7e\x8d\x76\x8c\xd7\xff\xf2\x2f\xff\x02\x9e\xe4\x24\x65\x09\xcf\xd7\x5f\x84\xb7\xfe\xd7\x17\x5f\x84\x0c\xfa\x6f\x17\xef\xbe\x26\x34\x01\x99\x12\x6b\x15\xe1\xd8\x70\xc0\xcd\xee\xd5\x88\xfc\xdf\xbb\x6f\xde\xd7\xb5\x2d\xdb\xbf\x02\xfc\xf8\x2d\x0a\x92\xc5\x6c\x64\x14\x87\xd8\xb5\xda\x56\x41\xf5\xdc\xc7\x03\x51\xb0\x74\x36\xa2\xc6\xec\xdd\x0f\x72\xf4\x83\xf2\x05\x7c\x36\x87\x4d\xe5\x02\xe0\x37\xe3\x89\x4d\x4c\x85\xd6\x23\x57\xe5\x03\x93\x07\x60\x90\x8f\x23\x2f\x01\x63\x98\x05\x8f\xd0\xdd\xda\x06\x0f\xd5\x85\xcf\x4b\xa6\x8c\xa8\x69\xeb\xfe\xe2\x70\x35\x0c\x05\x95\xc7\x3d\x9c\xf3\x8b\xbd\xdc\x07\xd1\x5b\x5a\xbc\x61\x59\xe4\x8c\x2b\xdd\x28\xed\x69\xd1\x0e\xa8\x88\xc9\x35\x4d\xe6\x84\x09\x0d\x49\xb7\xf0\x80\xcd\xeb\x01\x83\xcc\xa9\x48\xcd\x0d\x83\x1a\x10\x30\xe0\x33\x79\xae\xf4\xf1\x05\xb8\xf5\x7b\xd0\x8a\x90\xac\x31\x32\x35\x12\x70\x13\x4c\x6b\xc6\xa4\x11\x79\x16\x58\x26\xf7\xfa\x13\x85\xdc\x1c\x66\xab\x50\x5d\xac\x6c\x14\x9c\x6a\x56\x2c\x0b\xe9\x2c\xb2\xbe\x7e\x9c\xff\x05\x21\x09\xa6\x5c\xf9\x58\x56\x4a\x7f\x59\x99\x03\x0e\xad\x8f\xda\xb7\x22\xed\xe5\xda\x88\xe8\xfa\x60\xed\x7d\xa0\x05\x4e\x12\xa6\x10\x94\x7f\xc4\xe0\x1a\x5d\xbf\xfd\x23\x6e\x64\xf0\x78\x72\xba\x69\x48\x17\x2e\xcb\x85\xc1\xfd\xb4\xd2\x72\x0c\x25\xd1\x5d\x9a\x96\xce\x80\xe9\xba\x5d\x64\xc5\x9c\x8e\xa0\xaa\xb0\x67\x62\xd7\x47\x6c\x00\x60\xb3\x0e\x71\xc4\x38\x3b\x56\x61\x10\x9e\x35\xf4\x03\x64\xd5\xd5\xa3\x05\xcd\x19\x84\x75\xe1\xc4\x82\x07\x5b\xa9\xbc\xa7\xf8\x4c\xb0\x12\xb5\xb4\x10\xf8\x4b\x32\x7a\xcf\x32\x3b\x94\x2c\x23\x96\xf1\x95\x0b\xa1\x63\xa5\xc1\x9e\x8a\xd0\xd9\xac\x64\x4a\xf1\x05\xb3\x91\xd3\xfc\x1f\x75\xc5\xbf\x39\x23\xb7\xd7\xef\x5c\xfc\xb8\x22\x86\xb1\xd5\x2c\x24\x5b\x20\x36\x9f\xab\xd2\x80\x56\x2d\x7b\x4c\x08\xb9\x56\x52\x43\x1d\x3b\xd3\xbf\x3d\x12\xe5\x2b\x69\x83\x97\xe9\x18\x02\xc5\x63\xf6\xac\x0e\xfd\xc1\x18\xf3\x39\xa3\xa9\x0b\xb6\x35\x2c\x65\x51\x18\x49\x9a\x5c\x9a\x2b\x3a\xe5\x46\xb0\x56\x36\x1c\x3b\xad\x8c\xa8\x42\x03\x12\xc1\xd5\xed\xe3\x9c\x11\x59\xa6\x0c\xeb\xc0\x4f\xc1\x99\xc7\x77\xdb\xa0\xef\x90\x77\x88\x9b\x91\xee\xb9\x2e\x69\xb9\x44\x8a\x69\x4f\x22\x78\x38\x83\x33\xb1\x96\x3e\xf4\x0a\x23\x43\x2c\x15\x09\x49\x9c\xe7\x5a\x24\x42\x23\x11\x12\x76\xdd\x82\x6c\xeb\xae\xc5\xe2\x4c\xd3\x00\xfc\xef\x2c\xf4\x87\x7f\xf6\x94\x42\xde\x84\xe0\x78\x20\x32\xac\x23\x03\x1f\xfa\xaf\x93\xb9\xa5\xeb\xed\x2b\x4a\x08\x4a\x82\x34\xa6\x3c\x3f\x71\x61\xd8\xdc\x21\x01\xef\x95\xcf\xf4\xc4\x30\xd0\xba\xa2\x59\xb6\x1c\xb3\x4f\x86\x94\x98\x4b\x0c\x34\x14\x72\x71\x82\x3b\x7f\x25\x14\xd3\xa3\xa8\x21\xe1\xf2\x15\x25\x26\x99\x50\xe4\x04\xd7\x24\x24\x64\x9d\x3a\xc1\x6e\x8d\x20\x70\x5f\x69\x74\x81\x1b\x6d\xfe\x24\x6e\x9d\x0b\x56\x2e\xed\x08\x11\x1f\xf6\x00\x67\xd2\x13\xe6\x08\xdc\x41\x9d\xcc\xaf\x3f\x15\x25\x86\x1e\x45\x7e\xbd\x02\x7e\xab\x9d\x61\x6a\x26\xc7\x3d\xb6\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\xd6\x7c\x02\x58\xec\xe2\xfd\x55\x0c\xfa\xc2\x16\xc3\x22\xb6\x5b\x30\xc3\xd8\x6e\x4f\xb9\x81\xd8\x2e\x76\xec\x8d\x4d\x6f\xe5\x7e\xc1\x0c\xcc\xae\x90\x9a\x93\xea\x28\x79\x60\x16\x09\x1b\xc9\x13\x94\x5d\xf6\xe5\x1e\xd3\x29\x19\xc4\x73\x63\x80\x3a\x5b\x42\xb7\x38\x52\xec\x59\xf4\x06\x67\x37\x91\x58\x3c\x5d\xb7\xb1\x99\x7a\xaf\xef\xdc\xf6\x45\x7f\xdc\xf7\x0e\x62\x7b\x60\x01\xaa\xbd\x4d\xad\x05\x7f\xe6\xbc\x9c\xd4\x06\x30\x65\x1e\xf8\x18\x39\x0f\x46\x14\x12\x38\x2b\xa2\x65\xfc\x91\x92\x3e\x1e\xb3\xed\xe6\xb6\x78\x0f\x0b\xee\x75\xe1\x9a\x73\x68\xdb\x46\x1e\xd8\xf2\x54\xe1\x0d\x30\x18\x6c\xce\x0b\x2c\x40\x66\xc8\x83\x91\x80\x7b\x5e\x03\x6c\xdf\x41\x0a\x1b\x37\x30\xe2\xb8\x1b\x31\x22\xef\xa5\x36\xff\xbb\xfe\xc4\x95\xe5\xf6\xae\x24\x53\xef\xa5\x86\x27\xcf\x72\x42\xb8\xd0\xe7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x3b\xc4\x9f\x25\x57\xe4\x06\xd2\x97\xe3\x96\xf6\x1c\x1a\xfc\x77\x5d\x6e\x14\x33\xb0\x93\xb1\x21\x7f\x8e\xf5\xa4\x5f\x1f\xd9\x9e\x9f\x2c\x5b\xc7\xb7\xf7\x49\xd8\x09\x80\x6e\x0c\x7f\x81\xb4\x6e\x45\x46\x13\x96\xba\x1c\x55\xd4\xec\x14\xd5\x6c\xd6\xe9\x63\xbe\xad\xe5\xac\x9c\x81\x2a\x2f\x09\xca\x95\xb8\x61\x01\xbd\x09\x31\xb6\x9e\xe4\xb8\x39\x78\x6f\xf0\x7f\x62\x84\xd2\x01\x3b\x03\x1e\xeb\x6b\x83\xda\x9f\xc6\xab\xf5\xb8\x97\x8d\xa1\x91\x2b\xc9\x69\x61\xee\xe4\x7f\x19\xe6\x03\x40\xf5\xbf\x49\x41\x79\xa9\x26\xe4\xc2\xe5\xce\x6a\xfe\x66\xa5\xc7\x46\x37\x3d\xa6\x50\x80\x47\xf0\x4f\x15\x5f\xd0\xcc\x66\xe2\xa0\x82\x30\xcc\x2d\x66\x66\xb3\xca\x84\x8e\xc8\xe3\x5c\x2a\xe4\x64\x7c\xf8\xcd\xc9\x03\x5b\x9e\x8c\xa2\x34\x18\xae\x35\x6f\xfc\xc9\x8d\x38\xa9\xb5\xc5\xad\xdb\xea\x79\x34\xf0\xaa\x3d\x81\xdf\x4e\xf6\xcf\xe7\xf6\xe2\xac\xfa\x56\xae\xde\x34\x81\xe8\x2b\xf6\x94\x78\x98\xba\x85\x47\x7a\x61\xdb\x87\x98\xec\x60\x7a\x83\xe2\xec\x7e\xe9\xb2\xc8\x59\x41\x75\x5d\x8e\x8d\x1a\x12\x64\xde\x86\x7c\x6c\x40\xac\xa5\x22\x88\x17\x29\x23\x0f\xca\xa5\xc4\x39\xd6\x26\x1b\x7a\x5a\x56\x6c\x44\x52\x29\x4e\xb5\x55\x77\x35\x33\x2d\xae\xe6\xb3\x4a\x37\x9c\xc3\x99\x3a\x8f\x1a\x94\x96\x0c\x12\x6c\xb9\xcc\x91\x56\xc3\x80\x59\x17\x41\xd3\xa9\x9d\x87\x88\xf9\x73\xd3\x90\xe1\x01\x79\x76\x48\x1b\x96\x27\x24\xe0\x2e\xc8\xe5\xdd\x1c\xb6\x3e\xf4\xc6\xe0\x6d\xed\x69\xd4\x78\xbb\x80\x08\xb0\x78\x1d\x26\x88\x6a\x91\x7f\xb0\x52\x46\x8d\xb0\x41\x75\x14\x0f\x9d\x61\x16\xfd\xba\x85\x05\x9e\xd4\xad\x05\x9a\x1f\x80\xbd\x5f\x58\x43\x25\x24\xeb\x6c\xe4\x25\x29\x25\x1e\x0d\xf8\x3c\xc0\x0f\xf7\xb0\xaa\x83\x5f\xb9\xfa\xa8\x5e\xa8\x02\xb0\xa1\xb5\x8f\xa3\x56\x1d\x5a\xbd\x8f\x73\x56\x6b\xe4\xe5\xd4\x56\x82\x47\xa3\xc3\x53\x41\xd1\xe7\xda\xa8\x04\x26\xae\x40\xab\x78\x1f\xf5\x78\x8f\x63\x45\x7f\x8b\x77\xb4\xe8\x65\x05\xf3\x5f\xb7\x4a\xfe\xd3\x7b\x59\x69\x97\x2e\xc4\xfe\x0e\x85\x95\xb5\x74\xf6\xc7\xc3\xa9\xce\xfb\xe8\x38\xa2\x19\xf9\xa7\x80\x34\x7a\xc2\xb4\xfd\xb0\x46\x84\xd1\x64\x6e\x38\xc0\x31\xba\x59\x18\x2e\xd5\xb1\xa3\x57\x66\xeb\x90\x31\x94\xab\x24\x26\x0e\xf8\xfc\x69\x38\x90\x6b\xf8\xe7\x38\xb3\x91\x73\xb9\x54\xd6\x75\xcd\x32\xa7\xa2\x0e\x5d\x88\x1a\xd3\xa9\xe7\x5c\x3e\x64\xab\xfa\x81\x55\x82\x8c\xba\x52\x3e\xcb\xc8\x1e\x2c\x35\x9f\xf9\x8b\x11\x35\xde\x86\x15\xd5\xd9\x74\x0c\x36\xb5\x7e\x45\x95\x58\x1b\xc9\x10\xbc\xe8\xd1\x30\xb5\xa6\x59\x08\x75\xaa\xad\x46\xf6\x1e\x48\x10\x0d\xfe\xe6\x75\x5e\x4b\x7b\xaa\xfe\x30\xe2\xc4\xef\xc6\x11\x29\xe6\xf3\x3b\xb3\xb2\x94\xa5\x59\x13\x53\x8a\x70\xd8\xe5\x9c\x96\x0f\x2c\xf5\x5c\xd2\x84\xdc\x9a\xc5\x3b\x19\x3d\x6a\xcc\xd2\x51\x23\x97\x27\xba\x59\x89\xcd\x4c\xe8\x74\x32\x39\xb5\x65\x13\xd6\xeb\xb2\x45\x63\xaf\x58\x81\xbc\x87\x18\xde\xba\xbf\xef\x68\xa1\x50\x1d\x61\xd8\x1b\x50\x47\x4a\x28\x88\xa8\xe7\xce\xa6\x48\x23\x42\x6c\x56\x97\xd3\x43\x00\xea\xab\x56\xee\xa3\x52\x8e\x32\x1c\x62\xeb\xaf\x46\xee\xa5\x42\xde\xa6\x3e\xb6\x27\x65\x6f\x7c\x5f\xcd\x7f\x2f\x0d\x4c\x1e\xe4\x12\xb8\xda\x9e\xae\x76\x04\xd7\x2e\xae\xc8\x37\x4e\xf6\x09\x73\x18\xd4\x73\x5b\xee\xbb\x8f\x9e\xec\x59\x3c\x06\x57\xdb\xf3\x79\x10\xae\xb6\x9b\x29\x26\x11\xdf\x58\xf5\xb1\xe9\xd2\xe9\xd9\xba\xc0\x94\xbb\xab\xed\x18\xae\x85\xab\xed\xc0\xae\x86\xab\x2d\xce\xf5\x70\xb5\xc5\xb8\x22\xae\xb6\x58\xe9\x0c\xdb\xd3\x2f\x70\xb3\x04\x5c\xd9\x12\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x45\x03\xc9\xf5\xba\xb7\x96\x50\xe3\xd5\xa5\xf7\x4a\x66\x95\x0e\xaf\x33\xb7\xad\xbb\x26\xdd\x87\x89\x3b\xcd\x66\x2c\xb1\x5f\xed\xb8\xc1\x37\x00\xd7\x86\xe4\xb8\x5f\xaf\xfb\xd0\xfc\xf5\xd7\x82\x1f\x53\xf5\xf7\x94\x84\x4f\xd8\x8e\x9d\xf6\x09\xdb\x91\x93\x3f\xb9\x41\x9f\x92\x02\x0a\xdb\xf3\x26\x82\xc2\xd6\x13\xbc\x63\x92\x42\xb9\xf6\x64\x2d\xab\xcf\x5c\x8e\x14\x73\xe9\x33\x0b\xb7\x84\x20\x48\xd4\xa4\x15\x4a\x63\xce\x8e\x68\x4b\xb6\x1c\x58\x55\xf7\x74\x75\xbf\x8b\x51\xb9\xb8\xbd\xe9\xa5\x45\x69\x7c\xbf\x45\x8f\xd2\x7c\xe3\x17\xac\x49\xb9\x41\xd5\x48\xd3\x27\xeb\xaa\x5e\xb9\x8d\xb3\x8c\x64\x6d\x9e\x47\xa6\x5c\x9b\xf6\x5b\x43\xd7\x9b\xb9\x4a\x1b\xe7\xac\xa5\x0d\xe9\xa9\x39\x00\x4b\x65\x5d\x6d\x1e\xf4\xe5\x8d\x71\x02\x27\xcf\x23\x7f\x1e\x51\x96\x84\xfd\x08\xca\x23\xb9\xda\x5a\x27\x75\x5a\x97\xcf\x40\x65\x33\x2a\xbe\x1a\xda\xb6\x42\xa6\x6f\xd0\x48\x4a\x85\x90\x58\x1e\x4a\x8d\xd0\x50\xa1\x46\xd6\x0c\xd3\x48\xd1\x21\x52\x52\xf1\x14\x3d\xa0\x7d\x76\x81\xd3\xcf\xc9\x31\x0d\x96\x7f\x1b\x7b\x94\xe4\xc9\x1e\x66\xb4\xe0\xdf\xb1\x32\x2c\x8b\xfd\xa6\xd6\x3a\x58\xdb\x93\x3b\x45\x95\xcc\x59\x4e\xe1\x9f\x6f\xdd\xf2\x0c\xaa\xb1\xfe\xf5\xa0\x96\x63\x65\x6e\x58\x8f\x51\x2b\xca\xf4\x64\xf1\x45\x94\x7f\x6c\xdd\x9e\xe8\xe2\xe1\x4f\x61\x0f\x9b\x71\xdb\x12\x31\x0c\x70\x83\xa6\x00\x8c\x2b\x2e\xd3\x8c\x57\x5b\x1a\x2a\xb3\xc0\xdd\x7b\x86\x85\xef\xc7\xfc\x8e\xed\xb9\xf4\x34\x7d\xf5\x33\x23\xcf\xfb\xb4\xb5\x2d\x3d\xa6\x30\xe8\x67\x06\xfd\xcc\xff\x68\xfd\x4c\x83\xb0\x3b\x5c\xbf\x41\xed\xd2\xcc\x88\xea\x74\x2f\x75\xdd\x83\x09\x6a\x3f\x9d\x1a\xc5\xe9\x50\xea\xba\x82\x68\xfe\x38\x9d\x4c\x4e\xd1\x00\x32\xf1\xea\xd2\x4a\x4f\xc7\x7f\x24\x4c\x24\x32\x35\xfd\x60\x55\xc0\x52\x69\x60\x2d\x6b\x89\xbd\x39\x97\xdc\x8d\xd5\x34\xa1\x40\xdf\x7d\xb9\x87\x5e\x28\xd8\x45\xe5\xbf\xdd\x0f\x83\xd5\x0b\x81\xd6\xac\x98\x2f\xc6\x64\xb7\xcc\xd7\xa7\xb2\x3c\x59\x9d\x43\x20\xe3\x39\xb7\xde\xc9\x06\xbb\x30\xa5\xe3\xdd\xf7\x08\x39\xc3\x6e\x26\x49\x51\x8d\x6c\x97\x93\x9c\xe5\xb2\x5c\x8e\x7c\xb7\xe6\xc7\xd6\x38\xf6\x8d\x73\x60\xfa\x92\xaa\x2c\x99\xd0\xd9\x32\x34\xb9\xd4\xa6\xf6\x8c\xdc\x9f\xdb\xd1\x23\x33\x7f\xfe\x60\x63\xfd\x4b\xea\xd6\xbe\xff\x75\xf1\x41\x50\xc8\xf9\x5d\x01\x1a\x63\xd3\xd8\x8d\x6a\xfd\x84\x79\xca\xc4\x82\x2c\x68\xa9\xe2\xef\x1b\x79\x3a\xbf\x97\xf2\x05\x57\x7b\x09\x39\xb8\xb3\xc4\x0f\xf5\xcc\xb2\xd2\x45\xa5\x2d\x3a\x76\xd7\xc8\x95\x21\xf3\xd7\x67\x85\xe9\xfd\x22\x5c\x45\xd4\x6c\x05\xd5\x9a\x95\xe2\x0d\xf9\x8f\xb3\x7f\xff\xdd\xcf\xe3\xf3\xbf\x9c\x9d\x7d\xff\x7a\xfc\xbf\x7f\xf8\xdd\xd9\xbf\x4f\xe0\x1f\xbf\x3d\xff\xcb\xf9\xcf\xee\x8f\xdf\x9d\x9f\x9f\x9d\x7d\xff\xd5\xbb\xbf\x7e\xbc\xbd\xfe\x81\x9f\xff\xfc\xbd\xa8\xf2\x07\xfc\xeb\xe7\xb3\xef\xd9\xf5\x0f\x81\x9d\x9c\x9f\xff\xe5\x37\xbd\xa6\x4b\xc5\xf2\x9b\x1e\xf8\x0d\xdb\xf8\x89\xf4\xb1\xdd\xcb\xbe\x3c\xc1\xb9\xd0\x63\x59\x8e\xb1\xbb\x37\xe0\xb2\xd8\xa3\x53\x07\x16\xfb\xb8\x87\x35\x1d\xae\x0b\xeb\x39\xe1\xe3\x19\x2e\xda\xbe\xe4\x8b\x3d\x18\x0b\x30\xeb\x4d\x2f\x9d\x21\x7e\xba\x45\x5d\x68\x7f\xfc\x05\x6b\x0a\x3f\x1b\x9f\x2b\x5b\xa0\x64\x70\xb8\x7a\x76\x87\x2b\x3c\x89\xc1\xdb\xaa\x5e\xdc\xe0\x6d\x05\x6d\xf0\xb6\x6a\xb6\xc1\xdb\xaa\x35\xee\xe0\x6d\x35\x68\xf3\x06\x6d\xde\xf3\x6b\xf3\x06\x6f\xab\xc1\xdb\x6a\x73\x1b\xbc\xad\xba\xdb\xe0\x6d\xf5\x3f\xcd\xdb\x0a\x41\x6c\x93\xcf\x95\x95\x48\x6b\x87\xab\xcf\xce\xdf\x4a\x99\x43\x4e\xd8\x45\x92\xc8\x4a\xe8\x8f\xf2\x81\x05\xfb\x0b\xac\xe8\x50\xd6\xfa\x81\x1a\x83\x5b\x74\x2a\xeb\x2f\x1f\x4d\xc1\xf2\x02\xf3\xc1\xd1\x2a\xe5\x4c\xc4\x69\x08\x9f\x82\x7a\xdd\x78\xcd\xaa\xd8\x22\x65\x69\xfd\x83\xc5\xcb\xda\x1c\xcd\x84\x5c\x90\x92\x25\xbc\xe0\x36\xe9\x02\xc5\xe7\x51\x43\xc2\xbd\xb0\xa9\xb5\x97\xe6\xb6\xb0\x6c\xea\xd1\xa3\x4f\xb9\x5d\x36\xf4\x0f\x96\x52\xaf\x4c\x29\x4e\x8c\x35\xd3\x44\x3e\x10\xb8\xbe\x47\xae\x18\x51\x73\x59\x65\x29\x29\xd9\xdf\x1d\xcb\x69\x57\xf9\xb1\x39\x5a\x53\x81\x1f\x3b\x6c\x63\x39\x76\x1f\x69\xc1\xc3\xab\x7d\xf9\xd9\xf7\xc1\x95\xec\x53\xc1\xb1\xb2\xc1\x1d\x4b\xa4\x48\x8f\xa6\x16\x5c\x1b\xb8\x66\x16\xc1\xae\x87\xd9\x6a\x7c\x6e\xce\x05\xcd\x78\x6a\xa8\xaf\x73\x29\x42\x94\x10\x07\xc6\x88\x3f\x3c\x94\xaa\xfa\x34\x09\x2d\x8a\x52\xd2\x64\xce\x54\x63\x66\x28\xf1\xd8\x4a\x17\xa1\x29\xdd\x9b\xad\xc8\xaa\x19\x17\x28\x20\x41\xff\x8e\xdf\x90\xda\xb9\x1c\xda\x85\xac\x4e\xee\x63\x63\x60\xf3\x79\xd4\xb0\xc8\x60\xea\x72\x09\x3e\x8c\xb2\x39\x1c\xae\x96\x4f\x9b\x7f\x28\x22\xb3\xd4\x55\x5a\xfd\xe3\x6b\x23\x53\x27\x78\x75\x23\x15\xbd\x0a\x72\x73\x9a\x11\x33\xc3\xed\x1b\x32\xb7\x7d\xa0\xdf\xff\x81\xcc\x65\x55\xaa\x49\xb3\x4a\xe0\x17\xf0\x2c\xee\x54\x45\x5a\x7b\xee\x68\x92\x31\xaa\x34\xf9\xe2\x35\xc9\xb9\xa8\x74\x9f\x6c\x03\xf1\x52\x5a\x43\x3e\xfb\xe7\x3f\x04\x7f\xf7\xa4\x2c\x05\x91\xb7\xad\x29\x8d\xc1\xbf\xbd\x48\x66\xf5\xc6\x58\x1c\xb5\x90\x5c\xe8\x55\x01\xcd\x52\xd8\x7e\xd8\x14\x34\xd3\x07\xc3\x62\xbd\xc5\x98\x9f\x2a\x79\xbf\xd4\x7b\x2d\xaa\x63\xbb\x6c\x67\x8c\xfb\x7f\xf6\x61\x5c\xed\xd9\x98\x32\x3a\x6e\x84\xdd\x15\xb9\xdc\xe4\x5e\x52\x11\xae\x92\xcd\xb8\xd2\x65\x97\x1a\x77\x1c\x82\x78\xc3\xb9\xa8\x59\x29\xab\x80\x84\x0b\xf1\x97\x0d\x3a\x76\x0a\x0d\x67\x58\xb2\xb9\xc5\x43\x72\xa6\xb8\xd2\x75\x78\x3a\xd0\x5b\xe7\x57\x2f\xad\x42\xcc\xa6\xda\xb2\x0e\x40\x5d\x62\xfb\xe7\xad\x2f\x1b\x23\x35\x39\x00\x3d\xcc\x96\x61\xdf\x6d\x74\x61\x73\x48\xc9\x92\xe4\x55\xa6\x79\x91\xd5\xdb\xf7\xc1\x7d\x60\x19\x86\x10\x29\xba\x66\x8e\x69\xc3\xee\x43\xb1\x66\x17\x16\x65\x07\xc3\xeb\x99\x1f\x8d\x09\x0d\xf5\x3a\xc0\x81\x9e\x15\xb4\xa4\xfe\x94\x12\x99\xe7\x34\x28\x85\x12\x5a\x02\x29\xf8\x90\x21\xc9\x31\xec\x44\x49\xb3\x7a\xd5\x0d\x37\xa0\x7d\x02\xb9\x66\x82\x8a\x00\xa3\x7e\x8f\x62\xf8\xd0\x33\x91\x8f\x3e\x2e\x64\xc6\x17\x4c\xac\x42\xb7\x15\x42\xbe\xa4\xc9\x03\x13\x21\xd2\xfc\xb7\xca\xed\x6f\xba\x14\x34\xb7\xb5\xed\x8b\x52\x2e\xb8\xb9\x06\x2c\x5d\x19\x41\x8d\xac\x5a\x08\x93\x62\xbb\x12\x00\xc8\x68\xee\x73\x2b\x2b\x75\x98\xaa\xc7\xa6\xdf\xa7\x63\x49\x85\xf6\x9f\x92\x2f\x12\xe6\x38\x67\xd3\xf3\x3e\x77\x60\x11\x50\x77\x8f\x6c\xae\x0f\x65\xf3\x32\xe3\x7d\x03\x4a\xef\x5d\x18\x30\x63\x69\x66\x70\xde\xd2\x57\x13\x5a\x81\x22\x5b\x4a\x61\x6f\x15\xc2\xca\xfb\x98\xc2\x51\x9d\xc7\x58\xde\xa7\x6d\xb4\xf5\x81\xa6\x52\x91\x2f\x21\x2b\xdb\x15\x03\x71\xe6\x70\x0c\xcf\x87\x2f\xaf\x3a\x98\x1d\x33\xbf\xde\x8c\xce\x46\xbd\x27\xfb\x44\xf3\x22\x63\x6a\xf2\xf0\x47\xd0\x7c\xda\xbb\xf8\xaa\xbc\x4f\x5f\x7d\xb8\xbe\xb8\x7a\x77\x3d\xc9\x77\xdf\xf6\x03\xf0\x4f\x3c\xa7\xb3\x2e\x8e\x7c\x4c\x72\x29\xb8\x96\xe5\x6e\x34\xfb\x22\xca\x00\xee\x2c\x77\x6a\x65\x12\xc7\x44\x18\x58\x5a\xca\x8a\x3c\x52\xcc\xf2\x19\x5c\x0a\xf5\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x99\xaf\x57\x07\x33\xb8\x75\x8f\x95\x02\x11\x76\xde\x1c\xad\x3c\xea\x93\x0b\xc0\x97\xf7\xdd\xa4\x2b\x02\x91\x02\xa0\x1e\x02\x64\xa0\x63\xaf\x37\x02\x24\x84\x8f\x42\x93\xd0\xf5\xbd\xea\xbf\x9e\xcb\xc7\xb1\x96\xe3\x4a\xb1\x31\xef\x56\x24\x47\xec\xd5\x03\x5b\x82\xf3\xe8\x01\x76\xcb\x76\xdd\x52\x03\x68\x09\x56\x08\x78\x6e\x78\xb2\x0f\x5f\x5e\x7d\xab\xc2\xd4\x8e\x0d\x79\xe5\x15\xd3\xc9\xab\x84\x15\xf3\x57\x76\x8c\xcf\x73\xef\x1b\x76\xa3\xb5\x15\x75\x7c\xea\xb0\xec\x21\xce\xcd\xf5\x8d\x4c\x45\x22\xb3\xcc\x96\x76\x92\x53\x72\xc9\x8a\xb9\x7f\xe1\xc5\xed\xfa\x9e\x4b\xb1\x1d\x47\x35\x44\xa0\x40\xb2\x0c\xb0\x03\xc6\x1f\xa5\xe9\xb7\x8d\xaf\xe0\x49\x28\xba\x6a\x5c\xb9\xf2\xbe\x2f\x21\x78\x39\x97\xac\x9b\xcc\x3c\x9b\xd2\xe2\xe9\xb5\x68\x7b\x69\x27\x8e\x7c\x60\x61\x6a\x10\xf4\x68\x0f\x0a\x46\xeb\x51\x4c\xd2\x75\x0e\xcc\x7a\xc3\xc5\x83\x56\x7a\xce\x84\xe6\x09\x9a\x80\xac\x5b\x7d\x93\x46\x91\x9b\x29\x0a\xca\x69\x90\xdd\x5c\x2e\x58\x59\xf2\x94\x29\x12\x41\xa4\x9a\x4a\x39\x9e\xbd\xb8\x03\x0c\x34\x64\xc7\xd9\x98\xc3\x9d\x7a\xfa\x59\x24\x9e\xe2\xc8\x73\x6c\x17\x9e\x23\x3b\xef\x3c\xcd\x6d\xe7\x79\x1d\x76\xa2\xcd\xcf\x31\x4e\x3a\x4f\x71\x5c\x39\xa8\x26\xab\x45\xcc\xe1\x49\x0f\x62\x4e\xd3\x9c\x07\xa5\x7b\x78\xd1\xe4\x1c\x56\xb1\xe3\x75\x95\xd0\x8c\xdd\x7c\xb3\x4f\x4d\x94\xed\xb2\xad\x8d\xba\xb3\x0f\x0b\x56\x2a\xae\x20\x10\xc7\x29\x1a\xb5\xa6\xc9\xdc\x6a\x8c\x9c\x09\x42\x0a\xa8\x4d\x89\xb0\x45\x84\x4c\xbb\x6d\xc6\x4d\x75\x94\x1b\x6d\xb7\x4a\xca\x4d\xf4\x25\xd9\xdf\x66\x54\xb3\xc7\x4e\xfe\x7c\x5c\x93\xe8\xee\x37\x41\x29\xf2\x99\x6b\x9a\x62\xb4\x49\x3e\x62\x60\xad\x97\x7d\xea\x8f\x26\x5b\x34\x47\x71\x48\x06\xbe\xdd\x9b\x4a\x19\x9b\xbf\xfb\x9f\xa6\x5d\x44\xc2\x42\x5b\xe4\x79\xda\xaf\xdc\x59\xc1\x26\xd2\x34\x2d\x99\x52\x8e\x85\x70\x17\xf0\xe2\xf6\x86\xfc\x15\x5f\xdf\xeb\x2a\x8b\x52\x6a\x14\xb8\xaf\x64\x4e\x79\x80\xbb\x63\x6b\x05\xab\x9f\xbb\xa5\x34\x79\x5d\xb7\x84\x5b\xff\x2e\xb1\x2f\x4f\x65\xd9\x48\xe6\x5f\x95\x2c\x25\x56\x59\xb7\xd7\x35\x1e\x45\xce\x5a\x93\x87\xc8\x99\xf9\xed\x15\x94\xd2\x38\x9f\xd4\x32\xd7\x8a\x40\x16\xa2\x19\xd8\x8b\xc8\xf6\x02\x85\xa2\x86\xd9\xc8\x05\x78\xd6\x82\x90\x03\x1b\x60\x3b\xbc\xd3\x62\x50\xff\x42\x71\xf0\xfe\x69\xf8\xdb\xda\xaa\x75\x5c\xd5\x31\x9c\x28\x5b\x8d\xc8\xd7\x72\xc6\x5d\xe5\x50\x03\x9c\x78\x36\x34\x44\x20\x1a\xe4\x94\x41\x4e\x59\x6d\x83\x9c\xb2\xb1\x29\x95\x5d\x0b\x7a\x9f\x85\xb8\x9a\xb7\x7d\xe9\xfd\x87\xe4\x6d\x46\x67\x84\xc1\x1f\xaf\x52\xae\xcc\xff\xc9\xdd\xdd\xd7\xe0\xbc\x51\x09\xa7\x4c\x01\x08\xb0\xb4\xd2\xe7\x1e\x41\x9c\xbc\x5f\x24\x89\xa4\xea\x5d\x50\x0c\x69\x0f\x34\x59\x77\x4f\xb8\x48\x5d\x29\xfa\x46\xbc\x85\x7d\x03\xb0\x25\xf5\xd1\xe4\xe8\xd0\x7d\xcf\xcc\x2d\x4d\x1e\x6e\x1b\xbe\x16\xb2\x34\xcf\x44\xe3\x51\x24\x93\x15\xfd\x75\x3f\x76\x6b\x65\x98\xb0\x63\xb8\x8d\x57\x6a\x37\xbe\x74\x7c\x8b\x23\x3a\x77\x76\x6b\xe1\x37\xaa\x94\x4c\x78\xed\x2b\x04\xf6\xa5\x9a\x99\x49\x81\x99\xd9\xeb\x66\x20\xff\x1c\xbb\x1c\x64\xd0\x37\x70\x60\x0e\x50\xec\x1b\x54\x35\x39\x2e\x2e\xdc\xaa\xf7\xba\x04\x04\xc7\xb0\x8c\x4b\xf1\x97\xa3\xee\x7d\x75\xbd\xfe\x22\xac\x7a\xa1\xb8\x64\x0d\xf6\x84\x03\xa4\x39\xbb\xe6\x39\x45\x35\xc6\x1a\x14\x70\xe5\x2f\x1d\x24\x9f\xd9\xdb\xfe\x85\x64\x6f\x89\x54\x25\x20\x5f\xd5\x76\xc7\xc3\x67\xd6\x73\x05\xb0\x46\x21\x8b\x2a\x43\x67\x7a\xbf\xb8\x1e\x0e\x25\x31\xd6\x78\x9c\xc5\x7e\xb4\x03\xe1\x1c\x56\x23\xc0\xfb\x10\xe0\xd9\x8c\x1f\x8f\x0f\xf3\x77\x10\x0b\x52\xb7\x91\xb0\x6d\x77\x51\x32\xfb\x31\xa3\xfc\xf7\x15\xd5\x1f\xa2\xdd\x68\xc5\xfd\xb7\xa4\xae\xd7\xff\xfc\x87\x3f\x04\x11\x34\x5e\x42\x09\x48\x0e\x15\xf2\x20\x2f\x88\xf7\x18\xa0\x25\x03\xe9\x00\x43\xf0\x9d\x7e\x03\xbd\x11\x75\xa0\x55\xe5\x18\x01\xff\x07\x0e\xf0\x8f\x0b\x15\x89\x09\xe0\x0f\x34\x87\xf7\xf0\x96\x81\x44\x4c\x37\x47\x4b\xc4\x74\xa4\xf4\x4b\xc7\x49\xba\x74\x8c\x54\x4b\x47\x49\xb0\x74\xbc\xb4\x4a\x07\x4e\xa6\x74\x10\x17\x93\x43\xa6\x4b\x8a\x8c\x3d\x8e\x8b\x3b\x0e\x4f\x88\x14\x1c\x9d\x1c\x1b\x99\x1c\x91\xf2\x68\xbf\x89\x8e\xa2\x25\xfa\x98\xa4\x46\x7d\xa3\xee\x8e\x97\xc0\xe8\x19\xd3\x16\x3d\x77\xb2\xa2\x03\xa7\x28\x3a\x5e\x62\xa2\xa3\xa4\x23\xea\x13\xde\x1a\x9f\x7a\x28\x26\xac\xb5\xef\xe5\x3a\x78\x72\xa1\xbd\xa4\x14\xda\x73\x22\xa1\xfd\xa5\x0f\x3a\x9e\x23\x65\x78\x52\x95\x27\xa7\x52\x89\xaf\x5d\x15\x6f\xef\x39\x94\xb2\xa6\xee\x7d\xa3\x72\xca\xe5\x9b\x75\x25\x71\x4e\x55\xa3\xe6\x8d\x96\x06\xab\x1d\x21\x2a\x20\x40\x0f\x41\x22\x34\x38\xd8\xbb\xec\x60\x2e\x22\x95\x38\xd8\xe9\x37\x77\x2b\x1e\x21\xfe\xf1\x21\x1d\x41\xfc\x20\x1d\xae\x20\x6e\xe1\x47\x70\x06\x19\xbc\x2d\xf6\xe7\x6d\xb1\xff\x38\x9d\x97\x66\xa0\x4f\x07\x03\x7d\xb4\x81\x5e\xb5\xd2\xfd\x3b\x85\x31\xa0\x64\x60\x6a\xe5\x7d\xb3\x96\x5c\x8d\x23\x2e\x6e\x6f\x02\xc6\x49\x4a\x06\xb9\x81\x68\xa6\x26\x9b\xb8\x5d\x67\xba\xb3\x5c\xb4\xe3\x72\xa9\xd6\x2c\x2f\x82\x6a\x5f\x0c\xf6\xf9\xc1\x3e\xbf\xda\x06\xfb\xfc\xc6\x76\x6c\x7b\xdd\xbc\xca\xa9\x18\x1b\x0c\x0c\x66\xfc\x96\xc3\xd8\x0a\x43\x33\x21\x16\x93\x06\x5e\x4b\x4c\xf0\x00\x29\x37\x2a\xc1\x7f\xaa\x58\xad\xcf\xf2\x8c\xe5\x81\x6c\x9d\xd0\xf7\x61\x37\x10\xf9\xe2\x15\xcc\x9c\xc8\xb5\x28\x62\xbb\x66\xbf\x99\x0e\xc5\x86\x6e\x22\x0c\xd3\x52\xd1\xea\x39\x43\x26\xfd\x76\x85\x49\x6f\xe9\x1f\x2c\xfa\x01\x9c\x10\xaa\xe5\x6e\x72\xa6\x06\x10\xcc\x7a\x6c\x76\xaf\x7b\x46\x72\x5e\x96\xb2\xb4\x76\xd7\xe6\x92\xd0\x81\x90\xcf\xe6\x9a\x95\x28\xf9\xa3\x0b\x57\x08\x2a\xb8\x63\xda\x42\x15\x40\xa5\x96\x84\x0a\x4c\x4c\x60\xfe\xed\xc2\x69\x60\xb9\x8e\x0e\xdd\xb3\x39\x5d\x70\x59\x05\x05\x90\xde\x21\xa5\x3c\xb1\x1f\x03\xff\xb4\x94\x95\xb7\x30\x55\xca\x2c\xd0\xef\xa1\x5a\x3f\xaf\x80\x41\xde\xd7\x9f\x83\x82\x26\x95\x4e\x7d\x3e\x66\x9f\xb8\xd2\xeb\x3b\xe6\x8e\xca\x95\x21\xdb\xd7\x35\x58\xa8\xc2\x60\xf1\xef\x02\xb2\x4a\xc4\x01\x7f\xab\xe3\xb6\xe0\xb3\xb8\x83\x9f\xba\xc4\x1e\x9b\x68\x0e\xf3\xc2\x90\x9c\x26\x73\x2e\xa2\x72\x32\x7c\xd7\x9a\x42\x4b\xfe\x99\x90\x8b\x2c\xab\x7d\x07\x95\x77\x69\x75\xf2\x50\x7b\xfa\x66\x33\x3b\x06\x36\xf0\x51\xb2\x14\x6c\x94\x48\x52\xc1\x43\x56\xf1\x89\xed\x6a\xb2\xc8\x1f\x69\xc9\x26\x89\xcc\xc9\xe5\xdd\x0d\x49\x4b\xde\x99\x4a\xf1\x00\xfe\xf5\xb8\xe9\x9d\xa5\x5c\x5f\x96\x8c\x36\xc8\x67\x75\x8b\x71\x47\x72\x8e\x52\x19\x4f\x96\x37\x57\x7d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa9\x62\x29\x79\x47\x05\x9d\xa1\xfa\xf0\xec\xee\xf6\xcb\x77\xe7\x06\x80\x40\xdd\x79\x73\xb5\xd1\x0f\xeb\xae\xd9\xf9\xfb\x7d\xa6\x95\x59\x5b\x78\x0f\xde\x68\xed\xfb\x9e\x8b\xdf\x6b\xbe\x1c\xe2\xd9\x89\xb0\x12\xc0\x1b\x32\x00\xdd\xae\x26\x5c\x44\x27\x29\x97\xe9\x55\xad\xa2\xe6\x45\x9e\x3e\x3c\x6d\xfa\xdc\x48\x13\x59\x76\x9b\x51\x71\x51\x14\xa5\x5c\x6c\xd6\xba\x86\x20\x07\xf7\xbd\x5b\x00\x3a\x98\xbb\x87\x05\x9e\x08\xf8\x54\x0a\x14\x62\x70\xd8\xcd\xfb\x7f\xa3\xbd\x62\x56\x0a\x60\xc1\x4e\x2e\x2a\x2d\x73\xaa\x79\x72\x42\x64\x49\x4e\xde\x51\x51\xd1\x6c\x63\x6c\xca\xce\x15\x6f\x13\x30\x77\x7e\xb4\xbd\xb6\x5a\xc0\x67\x3b\x19\xd8\xdd\xdf\x6b\x5a\x1a\x54\x77\x79\xf7\x5d\xd4\xb7\x4a\x53\x5d\xad\x51\x86\x1d\xd4\x6a\x3b\x7d\x1a\x93\x8c\x2a\xfd\x6d\x91\x1a\xfc\xb0\xf2\xeb\x2e\x22\x94\x50\x4d\x33\x39\xfb\x57\x46\xb3\xcd\x97\x21\x04\xa4\x2e\x9b\x9d\x38\x8b\x88\xf5\x28\xad\xee\xfd\xf7\xa7\x8a\x18\x51\xd2\x40\x09\xd7\x8a\x94\x2c\x63\x0b\x2a\xb4\xfb\xfc\x0e\xeb\x25\x9e\xda\x6d\xd9\x0a\x70\xbc\xb6\xb1\xa6\x4c\xb3\x32\xe7\xa2\x3d\xce\x1d\x7c\x7f\x29\x45\xca\x91\x2b\x01\x2b\x12\x7e\xd1\x1e\x6b\x3b\x54\x6e\x73\x3d\xd8\xe1\x6c\xd0\xae\x14\xd9\x98\x4f\x7b\x7b\xf0\xb5\x7b\x2b\xba\xcc\xf1\x21\x78\x6e\xb6\xe6\xb6\xb6\x7b\xe4\x41\x18\x89\x02\x12\xa7\x6f\xde\x9b\x4e\x36\xa7\x8b\xbd\x19\x3b\x70\xc0\x29\x6c\x8f\x0a\x1c\xdb\x79\x6f\x73\x4a\xd8\x05\x8d\xd8\xba\x19\xa3\xd5\xa9\x6c\xc7\xd4\xad\x8d\xbf\x5c\xf9\x0c\x13\xab\x78\xdf\x26\xf4\xf2\x68\xbd\xb4\x9d\xb2\x04\xf1\x8d\x61\x2c\x5e\x68\x05\xfe\xd6\x5a\x1a\xf5\xe2\xe3\x74\x61\x81\xa4\x30\xb0\x10\x7e\x1c\xcb\x79\x63\x03\x9b\x4a\x2b\xc1\x52\x52\x70\x86\x29\xdb\xa9\xb0\x9b\x09\xf4\x8c\xd1\xd4\x3e\x34\x74\xb3\x64\xf6\xb7\x91\xf5\x38\x0c\x62\x50\xd0\x6f\xd7\xd9\x60\x29\x66\x12\x07\x6f\x84\x57\x7f\x95\x56\x07\x68\x33\x10\x1a\xac\x02\xdc\xc5\x88\xa8\x2a\x99\x13\x6a\x04\x19\x65\xae\x83\xc1\x17\x6c\x92\x53\xc1\xa7\x4c\xe9\x89\xaf\x97\xab\xbe\xff\xfd\x0f\x5d\x6c\xc7\x5b\x59\x12\x1b\xa5\x3d\x72\x09\xb1\xed\x1a\x6b\x98\xe3\x0a\x37\xc2\xf7\x5c\x6b\x64\x0a\x99\xda\x05\x3f\xc2\x52\x34\x7d\x30\xa4\x14\x97\x52\x31\xf0\x1a\xe8\xe2\x51\x4e\x0c\xdb\xdb\x98\xf6\x7f\x19\xda\xf9\xdf\x27\xe4\xec\x11\x98\x90\x13\xf3\xe7\x09\x4e\xc7\x47\x9a\x35\x15\x4e\xf5\xb4\x30\x69\x5a\xc9\x67\x33\x56\x76\xda\x58\xcd\xa7\x6c\xc1\x84\x3e\xb7\xc9\xc0\x85\x6c\x74\xe5\xfc\xfc\x6a\xfd\xc9\xea\x34\xbf\xff\xfd\x0f\x27\xe4\xac\xbd\x27\x1d\x43\x72\x91\xb2\x4f\xe4\xf7\x68\x2d\xe5\xca\xec\xde\xf9\x04\x15\x2e\x6a\x29\x34\xfd\x64\x46\x4c\xe6\x52\x31\x81\x0a\x30\x2d\xc9\x9c\x2e\x18\x51\x32\x67\xe4\x91\x65\xd9\xd8\xda\x8f\xc9\x23\x5d\x76\xe7\x40\x77\x47\x08\x99\x55\x49\x41\x4b\xdd\x02\xe3\xbd\x5c\xc2\x07\x2e\xf6\x9a\xc0\xf1\x2b\x2e\x56\x5d\x3a\x3b\x05\xbc\x0d\x4a\xe1\x19\xd7\x2e\xeb\x80\x8d\x2f\xd2\xcb\x57\xe6\xb0\x4a\x7e\x5f\x69\x59\xaa\x57\x29\x5b\xb0\xec\x95\xe2\xb3\x31\x2d\x93\x39\xd7\x2c\xd1\x55\xc9\x5e\xd1\x82\x8f\x13\x29\x0c\x60\x40\xaa\xdf\x3c\xfd\xb5\xd9\x09\x35\x36\x0b\xdd\xad\x25\x0e\xdc\xb1\x6e\xdb\x43\xdc\x8e\xf5\xb1\x35\x3c\x8f\x1a\x3d\x62\x83\x02\x54\xb1\xf1\xbb\x84\xfa\xce\x67\xdf\x2a\x50\xf9\xbd\xda\xc7\x4e\xb9\xc2\xc9\xf1\xb4\xb9\x73\xbf\x6c\xad\xf0\x64\x75\x0c\x83\x93\xd0\xdb\x17\x50\x58\x8b\x4a\xe4\x34\x45\x32\x42\x45\x67\x9c\xfb\x81\xef\xac\x39\x0f\xa8\xb7\x9f\x2c\xc7\xd0\x85\xcc\xc6\x54\xa4\xe6\xdf\x98\x78\x23\xd9\xed\x91\x1a\x78\x00\x15\xdf\x2b\xf2\xfb\xf6\xe6\xea\xf9\xc1\xf3\xd5\xaf\x2b\xbe\x0f\x4c\xd7\xc7\x9e\x65\xf9\xf2\x40\x66\x19\x45\x12\xf4\xd0\x2d\x2b\xe6\x18\x98\xb6\x20\xc2\x95\xeb\xf5\xff\x58\xcf\x01\x5f\x3f\xa7\x8b\x75\xde\x6d\xcd\x6f\xc8\x08\x81\xf3\xfd\xba\xfe\xa2\xa9\x0b\x07\xcf\x7f\xaa\xb4\xad\x50\xe2\x32\xbf\xb6\x96\xe1\x84\xd3\x39\x15\xb3\x1d\xac\x4d\xd0\xc1\x38\xbf\x49\x33\x91\xb1\x19\x73\x5d\xac\xf6\xc2\x67\xa7\x4c\xdd\x90\x53\x41\x54\xc9\xb8\xf2\x55\x3a\x8c\xd8\xaa\x34\xa1\x0b\xca\x33\xb0\x13\xca\x7b\xc5\xca\x85\x55\xb6\x63\x0d\x2d\xba\x2a\x63\xe3\xb5\xd5\xc8\xf0\x1e\x49\xc2\x75\x6b\x58\x3f\x95\x5d\x0b\x00\xa9\x77\x65\xf6\x5b\x67\xbd\x17\xf9\x16\x55\x0b\x5b\x7f\xde\x6a\xa0\xe8\x16\xf2\x0c\xfc\xfd\x2b\xa3\xa5\xbe\x67\x54\x7f\xe4\xbb\x38\x94\x35\x90\x6e\x7d\xe7\xf4\x72\x35\x40\x3f\x32\x32\x93\xda\xb0\x9d\x15\xc0\x3e\xca\x07\x98\xa2\xde\x03\xda\xa1\x21\xba\x5e\xe5\xc7\x92\x42\x86\x09\x29\x22\x97\xd9\xfe\x70\x7d\x9d\x56\x16\xb1\x90\xa4\xf1\x6d\x32\x2d\x65\x0e\xca\x45\x3c\x3b\x34\x55\xee\x4e\x86\xb1\xd7\x25\xe7\x4c\xa9\x9d\x29\x8e\xdb\x61\x25\xf8\x36\x5e\xe5\x15\x23\x7f\xee\x7e\xc3\x70\x76\x23\x54\xa4\x4c\x53\x9e\xb9\xab\x8c\x5b\xe1\x77\xa9\x0b\xbb\xee\x5c\x60\xc9\xa8\xda\xc5\xd0\xb4\x66\xfd\x01\x5e\xc6\x49\x4b\xc1\xc6\x8f\xb2\x4c\xc9\x25\xcd\x59\x76\x49\x15\xb3\x7d\x35\xf3\xd5\xe0\x19\x9d\xaa\xbd\x4e\x79\xb3\x3a\x74\xcb\x94\x51\xc9\x57\x1b\x14\xe0\xaf\x5a\xa0\xc5\x09\x8e\x9c\x56\xfa\x63\x59\xb1\x11\x79\x6b\xa8\xd7\x88\x7c\x2b\x1e\x84\x7c\x7c\xda\x5c\xf5\x4e\x63\x5d\x6b\xa6\x4d\x0f\x49\x97\xee\xbc\xa5\xd8\xf3\xd3\xed\x39\x23\x8b\xf0\xb7\x68\x9f\xdb\xc4\xc6\xbf\xea\x66\x64\xfe\xb9\xa6\x6a\x34\xa2\x75\x29\x67\x25\x53\x0a\xb5\x38\xd1\xea\xfb\x86\xc1\xe2\xaf\x4c\x58\xfb\x70\xe7\xf4\x6e\x36\x7d\xe5\x66\xea\xe8\xda\xac\xfe\xc5\x9e\xb7\x1d\xac\xc8\x36\xb2\x1a\xbb\x23\x23\x1a\x13\xdd\xa2\x64\xdc\x36\xc3\xcd\xca\xc5\x06\xd5\x6b\xbc\x8b\x4c\xc9\x2e\xcd\xb8\x5b\xdd\xe5\xdd\x77\xdb\x37\x7b\x2b\xed\xeb\xa2\x4f\xdd\xea\xc7\xa7\x2a\x1e\x3b\xef\x4c\xa7\xb2\x31\x94\xd3\x3f\x8e\x82\xf1\x39\x55\x8b\xcf\xab\x54\x3c\xba\x3a\xf1\xa8\x8a\xc4\xe3\xa9\x10\x7b\x2a\x0f\x3b\x2f\xd2\x2e\x85\x61\xe8\x1d\x8a\x53\x12\x3e\xbb\x7a\xb0\x73\x4f\x76\xa9\x04\x43\xf7\x24\x4e\x0d\x78\x6c\x05\x60\xd0\x16\xec\x54\xfa\xc5\xec\x43\xa4\xa2\xef\xc8\x2a\xbe\xce\xbd\x08\x54\xeb\x85\xee\xc8\xe1\x54\x79\x2f\x56\x89\xd7\xb9\xc5\x3b\x14\x77\xa1\xdb\x1a\xa5\xac\x3b\xb2\x9a\xae\x63\xfd\x71\xaa\x39\xcb\x63\xb2\x34\x84\x45\xbf\x69\xbc\xdc\x64\xd2\x2d\x83\x08\x0e\x70\xf6\x0d\xe7\x70\xd7\x64\x25\xfb\x72\xea\x86\x79\xee\xeb\xff\x61\xa7\x1c\xce\x0d\x5b\x16\x9e\xa5\x5e\xa6\xec\x5a\x02\x21\x57\xd7\xb7\x1f\xae\x2f\x2f\x3e\x5e\x5f\xad\x72\xe1\xf1\xec\xf2\x6e\x45\xd1\xb8\xc1\x2e\x6f\x79\xc1\x10\xab\x2d\x3f\x19\xd8\xda\xf2\x53\x55\xf1\x4d\x5f\x3d\x9d\x79\x7f\x12\xcf\xf0\x24\xe2\xda\x8d\x27\xf6\x84\x28\x00\xb6\xd0\x6b\xd5\x70\x95\x73\x99\xa5\xca\xc5\x37\xdc\x5c\xf9\x44\x04\x5c\x24\x59\x95\x1a\x96\xeb\xdb\x6f\x6f\xae\xd4\x84\x90\x2f\x59\x42\x2b\x65\x58\xb7\xed\xe2\xba\x14\xa7\x9a\x7c\xf3\xfe\xeb\x7f\x83\xd0\x2e\xf8\x72\xe4\xd3\xa5\x42\x49\x3f\x4e\xb1\x2a\x21\x2c\x14\x7a\x45\xb6\x0e\x66\x94\xd0\xc2\x60\xe0\xed\x2a\x7f\x8e\xd9\x6b\xa8\x48\xc9\x9c\x65\x85\xa1\x0e\x0f\x8c\xd4\x75\xca\xcc\x80\xf0\x2b\xc6\x6f\x58\x3f\xf6\x19\xd3\x98\x94\x60\x97\xab\xfa\xce\x03\xe8\xd0\xb0\x3f\x41\xb7\xde\x52\x17\x58\xed\xcb\x23\x55\x56\x43\xb9\x71\xb6\x1d\xa0\xd2\xad\x8f\xdb\xae\xd2\xda\xa2\xcc\x42\xca\x02\x7f\xad\xcd\xd9\x4c\xb6\xd6\x5b\xa1\x73\x18\xd7\xc1\xda\xf3\xed\x9e\x80\x9b\x0b\x4f\xaf\xe9\xae\xd8\xea\x26\xb7\x06\xf6\xb1\x40\x8d\x29\x87\xcd\x45\xb1\x72\xc1\xd2\x37\x60\xcf\x71\x8f\xd0\xdb\xb6\xfd\xac\xba\x77\xcc\x4c\x03\xeb\x58\x0d\x1c\xf9\xaf\xff\xfe\xd5\xff\x1f\x00\x00\xff\xff\x20\x58\x67\x59\xb4\x7f\x03\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfd\x77\xe3\xb6\x95\x30\x8e\xff\xde\xbf\x02\xc7\xed\x39\xb6\x5b\x49\x33\xd3\x76\xdb\xee\x3c\xfd\xb6\xc7\xf1\x78\xba\x7e\x92\x99\xf8\x19\x4f\xd2\xb3\xdf\x6c\x76\x03\x93\x90\x84\x9a\x04\x18\x02\x94\x47\xdd\xec\xff\xfe\x39\xb8\x17\x00\x41\x49\x36\x01\x59\x92\x3d\x59\xe2\x87\x64\x4c\x91\x78\xbd\xb8\xef\x2f\xb4\xe2\xdf\xb2\x5a\x71\x29\x5e\x13\x5a\x71\xf6\x49\x33\x61\xfe\x52\x93\xdb\x3f\xa9\x09\x97\x2f\x16\xaf\x7e\x71\xcb\x45\xfe\x9a\x9c\x37\x4a\xcb\xf2\x03\x53\xb2\xa9\x33\xf6\x86\x4d\xb9\xe0\x9a\x4b\xf1\x8b\x92\x69\x9a\x53\x4d\x5f\xff\x82\x10\x2a\x84\xd4\xd4\x3c\x56\xe6\x4f\x42\x32\x29\x74\x2d\x8b\x82\xd5\xe3\x19\x13\x93\xdb\xe6\x86\xdd\x34\xbc\xc8\x59\x0d\x9d\xbb\xa1\x17\x2f\x27\xaf\xfe\x34\x79\xf9\x0b\x42\x04\x2d\xd9\x6b\xa2\x9a\x1b\x95\xd5\xbc\x82\x9e\x26\xb2\x62\x35\xd5\xb2\x56\x93\x4c\xd6\x4c\x9a\xff\x95\xbf\x50\x15\xcb\xcc\x18\xb3\x5a\x36\xd5\x6b\xb2\xf1\x1d\xec\xce\x4d\x85\x6a\x36\x93\x35\x77\x7f\x13\x32\x26\xb2\x28\xe1\xdf\xb8\xc4\xeb\x60\x54\x78\x5c\x70\xa5\xbf\x5c\xfb\xe9\x2b\xae\x34\xfc\x5c\x15\x4d\x4d\x8b\x95\xd9\xc2\x2f\x6a\x2e\x6b\xfd\xbe\x1d\xdb\x8c\xa5\x9a\x9b\xf0\xdf\xf6\x45\x2e\x66\x4d\x41\xeb\x6e\x27\xbf\x20\x44\x65\xb2\x62\xaf\x09\xf4\x51\xd1\x8c\xe5\xbf\x20\xc4\x6e\x97\xed\x73\x4c\x68\x9e\xc3\x11\xd0\xe2\xaa\xe6\x42\xb3\xfa\x5c\x16\x4d\x29\xfc\x98\xe6\x9d\x9c\xf9\x5e\x5f\x93\x8f\x73\x46\x2a\x9a\xdd\xd2\x19\x73\xe3\xdd\xb0\x9c\x68\xe9\x3f\x20\xe4\x1f\x4a\x8a\x2b\xaa\xe7\xaf\xc9\xc4\x6c\xf1\xc4\xec\x60\xf0\x33\x9e\xcf\x15\x76\x12\x3c\xd7\x4b\x33\x5d\xa5\x6b\x2e\x66\x0f\x0d\x9f\x51\x4d\x0b\x39\x23\x08\x46\x64\x2a\x6b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xdc\xcd\xef\x81\x19\xe1\xa7\x6b\x73\xba\x5e\x7d\x1c\x3d\xa5\x39\x15\x82\x15\x44\x4e\x49\x53\xe5\x54\x33\x45\xb4\x6c\xf7\xe7\xe1\xed\xb1\x1f\xaf\xcd\xe6\x7c\xed\xf9\x86\xe9\xe0\xab\x8b\x57\xb4\xa8\xe6\xf4\x95\x7d\xa8\xb2\x39\x2b\x69\x7b\x86\xb2\x62\xe2\xec\xea\xf2\xdb\xdf\x5d\xaf\xfc\x40\xba\x4b\x09\x41\x94\xdc\x32\x56\xa9\xf6\x52\x90\xa6\x32\x6b\x32\x8b\x23\x37\x4b\xa2\x6b\x9a\xdd\x72\x31\x83\xa5\xcf\x70\xbd\xe7\x78\x30\x6a\xb2\x36\x65\x79\xf3\x0f\x96\xe9\xe0\x71\xcd\x7e\x6c\x78\xcd\xf2\x70\x2a\x66\x67\x1d\x26\x58\x79\x6c\xf6\x29\x78\x54\xd5\x66\x5a\x3a\xb8\x87\xd8\x02\x54\xd4\x79\xbe\xb2\xcc\x9f\xc6\x2b\xbf\x12\x62\x76\x07\xbf\x24\xb9\xc1\x4b\x66\x41\x73\xe6\xae\x0b\xcb\xed\x96\x9a\x03\xd6\x73\xae\x48\xcd\xaa\x9a\x29\x26\x10\x53\x99\xc7\x54\xd8\x55\x4e\xd6\x3a\xbf\x66\xb5\xe9\xc8\x5c\xe9\xa6\xc8\x0d\x42\x5b\xb0\x5a\x93\x9a\x65\x72\x26\xf8\x3f\x7d\xef\xb0\x89\x66\xd8\xc2\x40\x90\x26\x70\x21\x05\x2d\xc8\x82\x16\x0d\x1b\x11\x2a\xf2\xb5\xbe\x4b\xba\x24\x35\x33\xe3\x92\x46\x04\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xcd\x08\x17\x53\xf9\x9a\xcc\xb5\xae\xd4\xeb\x17\x2f\x66\x5c\x3b\x54\x9d\xc9\xb2\x6c\x04\xd7\xcb\x17\x80\x75\xf9\x4d\x63\x8e\xfe\x45\xce\x16\xac\x78\xa1\xf8\x6c\x4c\xeb\x6c\xce\x35\xcb\x74\x53\xb3\x17\xb4\xe2\x63\x58\x8c\x40\x24\x5b\xe6\xbf\xac\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc4\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\xdb\x9e\x89\x79\x64\xb6\xf1\xc3\xc5\xf5\x47\xe2\x66\x84\xe7\x86\x47\xd4\xbe\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x6a\xfc\x72\x5a\xcb\x12\x7a\x65\x22\xaf\x24\x17\x1a\xfe\xc8\x0a\xce\x84\x36\x37\xbd\xe4\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x0e\xa4\x8d\xdc\x30\x8b\x23\xf2\xf5\x57\x2e\x05\x39\xa7\x25\x2b\xce\xa9\x62\x07\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xfa\xf4\x42\xc2\xbd\xfe\xc1\xda\xad\x27\xc4\x91\xdc\x7b\x8f\x3b\x44\x41\xd7\x15\xcb\xfc\x75\xa4\x82\x9c\x55\x55\xc1\x33\xbc\x71\x7a\x4e\x35\xc9\xa8\x30\xdb\xc9\x85\xd2\xb4\x28\xd8\xea\xed\xb8\x77\x16\xf7\xe1\x1f\x02\xc8\x66\x85\x5c\xb9\xc7\x6b\x34\xa3\xfb\x83\x27\xb3\x2b\x6f\xdc\x87\xab\x4c\xb3\x98\x7f\xfd\x87\x07\xb6\x9c\x20\x4b\x34\xe5\xb3\x4d\x9f\xdd\xbb\x97\xe7\xf0\x09\x30\x53\x94\x0b\x65\xbb\x68\x6a\xdc\xcd\x96\x76\x1a\x6a\x4a\x3b\x9c\xc4\x3a\x1c\x3e\xb8\xb3\x7d\x6b\x36\x8d\x4e\x81\xf5\x5b\x6e\xfe\xb5\x1f\x01\xb8\x76\x39\x6d\x67\x3e\x22\x72\xc1\xea\x9a\xe7\x16\x75\x57\x32\x3f\x56\x80\x58\xf3\xa6\x00\x42\x25\x85\xd2\x35\xe5\x1b\x2f\xbd\x6b\x82\x17\x66\xf1\x63\xaa\xf1\x06\x31\x45\xee\x78\x51\x90\x5f\x0b\xa9\x7f\xed\x47\x80\x01\x64\xcd\x67\xdc\x63\x67\x45\xb8\x70\xe3\x02\x59\xb7\x7c\x89\x54\x6c\xa5\xc3\xfb\x07\xff\x46\x31\xc2\xca\x4a\x2f\x1d\x9a\x3a\xf9\xef\xff\x39\x35\x34\x81\xd5\x54\x05\x03\x76\xfa\xbb\x17\xd3\x63\xeb\x39\x29\x12\x71\x5a\xb0\x2f\x32\x67\x67\x3d\xa7\x46\x56\x4f\xee\x0d\x43\xf6\x47\xc1\xe7\xfe\xd4\xc3\x43\xa9\x9b\x82\x29\xcf\xc2\x99\xbd\x7b\xa0\xf3\x88\xb5\xc4\xae\x07\xdf\x63\x53\x56\xd7\x2c\x7f\xd3\x98\x5b\x76\xed\x67\x75\x39\x13\xd2\x3f\xbe\xf8\xc4\xb2\x46\x6f\x60\x29\x1e\x5c\xfa\x03\x40\xeb\x9a\xe1\x1b\xed\x4e\xb0\x1a\xa1\x0c\x67\x04\xac\xa3\xfd\xc1\x6c\x09\xb0\x05\x66\x07\x15\x62\x3d\x45\x35\x57\xd3\x65\xef\x00\x66\x47\xfd\x9e\xb3\x4f\x86\xe2\x01\xef\x1f\xdc\x76\xc3\xc8\x01\x71\xe3\xac\xc8\x47\xe4\xa6\xd1\x84\x6b\xa0\x7c\xd9\x5c\x4a\xb5\x8e\xed\x56\x1b\xc5\xa3\x85\x79\x2d\xb8\x04\xc6\x85\x48\x61\x80\x95\x94\x86\x5c\x01\xc3\xc4\xc2\xe1\x27\xb0\xf2\xf6\x33\xbe\x4a\x6d\xd6\x5b\x29\x95\x6e\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x3b\xae\xe7\xf0\xc7\xac\x66\xc8\x34\xa9\xa6\x34\x83\xde\x31\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x66\xf3\x60\x5a\x25\x63\x5a\x11\x5a\x14\x6e\x09\x21\xd4\x22\xf5\x28\x0d\x03\x41\x4e\x1c\x87\xd1\x3b\x8a\xe5\x0e\x46\x9e\xfa\xac\x02\xde\xc6\xe3\x1a\x11\xa6\xb3\xc9\xe9\xa8\xb7\xfb\x4c\x96\x95\x41\x08\x14\xf6\xe0\x66\x49\xb8\x36\xbc\x3b\x72\x43\xb5\x6c\x66\xb8\x53\xac\xb0\x13\x77\xbc\x2c\x1c\xbe\x61\x2e\x41\x1a\xdc\x40\x6e\x56\xdb\x11\x6e\xee\x91\x63\x57\xcd\x70\x1c\x37\x09\xf6\xaf\xa4\x3a\x9b\x5b\x34\x9c\xc9\xba\x66\xaa\x92\xc2\xf4\x8c\xbf\x5c\xb4\x6b\xfb\x3f\xe6\x9d\xde\xf1\x4c\xa7\x27\xea\xb4\x3d\xec\x39\x9f\xcd\xdd\x59\xd3\x1a\xd1\x71\x17\x46\xfa\x8e\x1c\x51\x09\xad\x6b\xda\x77\x8f\xb8\x66\x65\x0f\x22\x21\x5b\xdc\x7e\x42\xce\x84\x45\xf6\x2d\x60\x07\x20\xa6\x59\x5d\xfa\x8d\x04\x28\x04\xb4\xa7\x70\x13\x78\x69\x38\x21\xae\x2d\x98\x93\x97\x11\xe3\x9d\x98\x9b\x40\xb8\x3e\x56\x70\x6b\xc7\xb2\x3a\x9d\x90\x33\x22\x1a\x8f\x78\x1e\x9a\x82\x90\x7e\x06\xb6\x23\x33\x2d\x25\xdb\xbe\xfa\xf1\x51\x1c\xfa\xc6\x76\x3f\x83\xb6\xde\xc6\x76\xfe\x4c\x44\x5c\x42\xf3\x3a\xee\x5a\xef\xab\xb1\x84\xc4\xbd\xed\xe6\x10\xf3\xf6\x0a\xc4\x9c\xe1\xcd\x51\xac\x60\x99\x36\xd4\x90\xd5\xe5\x88\x50\xa5\x64\xc6\x8d\xa8\xd0\xc2\x7e\xf7\x42\xe1\x4a\xfa\xf7\x9e\xa4\xee\x3f\x49\x5e\x3f\x01\x69\xb4\x7b\xbf\x63\xbf\x5b\xdb\x8d\x82\x2b\x6d\x10\x54\x77\x57\x3a\x78\xf7\x66\x09\xbf\x1e\x2b\x52\xd0\x1b\x56\x3c\xc0\x57\xad\xb6\xf8\xcb\xdf\xb6\x48\x34\x70\xcf\x82\xa2\x10\x42\xdb\x56\xa1\x21\x58\xb7\x95\x7b\x3d\x9c\x80\x18\xe4\x98\x7a\x64\x05\x47\x84\x92\x5b\xb6\x1c\x21\x4a\x17\x5e\x85\x93\x34\x05\xe8\xb8\x66\x48\xd0\x0d\xdc\xdd\xb2\x25\x74\xf8\x30\xbb\xb9\xb1\xab\x54\xb8\xc3\x96\x82\x01\xda\x36\x36\x13\x4d\xfc\x62\x8b\x0d\x4a\xbf\x1a\xd8\x6e\xd9\x83\xec\xf3\xa6\xb6\xa6\x6c\x04\x70\x87\xf3\x80\x43\x02\x0a\xec\xe0\x81\x1a\x11\x99\x6d\xd6\x3f\x3c\xdc\x1e\x14\x38\x1f\x6a\x6e\xf7\x1e\xb5\xae\xc4\x0b\x62\xda\x07\xaf\xc3\x41\x78\x3f\x56\x08\xaf\x06\xef\xcc\x39\x28\x2b\xcd\x45\x01\x34\x92\x0e\xb4\xd8\xbe\xa5\x05\xcf\x03\x1d\xa8\x61\x36\x2e\xc5\x88\xbc\x97\xda\xfc\xef\xe2\x13\x57\x86\xc7\x7c\x23\x99\x7a\x2f\x35\xfc\x39\x21\x7f\xd3\x78\xf5\xbe\x8a\xc4\xcb\x6d\xdb\xfa\x0c\x70\x7d\x87\x3e\x81\x33\x81\x48\xd4\xec\x70\xa8\x89\x53\x13\x23\x99\x03\x8b\x6e\x77\xce\x60\xad\x4b\x61\x84\x02\xdc\xb9\xe4\xa1\x40\x19\x8b\x72\x36\x0e\x59\x36\x0a\x54\x69\x42\x8a\x31\xb0\x51\x1b\xc7\xc4\x03\x32\xe3\x86\x47\xb4\xc3\xe1\xef\x1f\xfa\x6f\xda\x0c\xfb\x95\x1e\x05\x1f\x27\x8f\x1b\x0c\x36\xa7\x0b\x60\xed\xb9\x98\x15\x9e\x89\x1f\x91\xbb\x39\xcf\xe6\x28\x3d\x82\x26\x4c\xb3\xba\xaa\x99\xe1\x18\x28\xe8\xcc\xcc\x93\x19\xab\xd3\x41\xff\xa3\x11\x0d\x70\x7c\xd4\x77\x17\x34\x63\x39\xc9\x41\x64\x41\xd5\x2b\xd5\x6c\xc6\x33\x52\xb2\x7a\xc6\x48\x65\x48\xff\x76\x00\x9f\x46\x89\xb1\x25\xd3\xe3\x70\xc0\x2d\x6e\x18\x21\x9f\xc6\xb7\xcd\x0d\xab\x05\xd3\x4c\x8d\x0d\x7f\x32\xb6\xb3\xd7\xb2\xe4\x59\x74\x67\x3b\xe9\x06\xf8\xac\xb7\x46\x6e\x3b\x10\x8b\x05\x32\xe2\xc0\x62\x0d\x2c\xd6\xc0\x62\x0d\x2c\xd6\xc0\x62\x45\xb7\x81\xc5\x7a\xf4\xf0\x03\x8b\x35\xb0\x58\x07\x67\xb1\x3a\x5d\x94\xb4\x4a\xed\x01\xf5\x72\x5b\x28\x02\xff\x8e\x0a\xdd\x55\xcd\x1f\x30\x7c\xce\xaf\xa1\xab\x02\x34\x7c\xcc\xb5\x25\x4e\x1f\x41\x6d\x68\x2d\x91\x35\x15\x33\x46\x5e\x8d\x5f\xbd\x7c\x99\xa2\x20\xb4\xe0\x1c\xf5\xc5\x54\xd6\x25\xd5\xf0\xcd\xef\x7e\xdb\xf3\xc5\x23\x4e\xe5\x3e\x7b\xc9\x61\x0c\x75\x16\xf3\x78\xdb\x4c\x87\x45\xbe\xc7\x96\x06\x64\x4c\x48\x4d\x4a\xa6\x09\xed\xe7\xc9\x42\xb5\x3b\x2f\xd9\xc8\x99\x43\x11\xed\x58\xb7\x11\x67\x14\xcc\x89\x14\xd6\xf4\x62\x0e\xbf\xff\x70\xb7\x5a\x41\xc6\xa8\x62\x86\xc4\xdf\x30\xb3\x8a\x7e\x53\xa0\x26\x4a\x96\x66\xd6\x5c\x68\x87\xc4\xcc\x12\x98\x3b\x18\x72\xc2\x26\xb3\x09\xc9\x1b\xe8\x96\x0a\xeb\x07\x73\x8a\xab\x55\x4b\xa5\x59\xd9\x6f\x0b\x34\xc4\xb0\x86\xff\x99\x6d\xd1\xf5\x12\x2c\xe4\x0b\x26\x74\x43\x8b\x62\x49\xd8\x82\x67\xda\xef\x1f\xb8\xed\x70\xad\xa2\x76\x2a\x81\x8d\x8e\x67\x9d\xc7\x6b\x37\xb4\x8f\x48\xa5\x70\xbe\x6b\x7d\xc7\xe0\x9c\xce\x0d\xf8\x60\x57\x32\xb9\x57\x26\xd4\xa6\x5f\x34\xdb\xc2\x3f\x01\xb8\xbf\xfe\xd0\x6f\x65\x23\xc9\xf4\x27\x81\xe6\x6c\xc7\x5a\x59\x83\x97\xac\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xce\xad\x91\xd3\xc8\x01\xf5\x9c\xa1\x91\xf2\xec\xfd\x9b\xb8\x1d\x23\xd6\x39\xe0\xa3\xac\x64\x21\x67\xcb\xf0\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb8\x36\xe8\x2d\x1e\x3d\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x7f\x1b\x58\xac\x07\xdb\xc0\x62\xf9\x36\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x87\xea\xe6\xb1\xa6\xa1\x47\x4d\x61\xbb\xc1\x2b\x99\x3f\x22\x78\xab\x92\xf9\x03\xb1\x5b\xa8\xd3\xcf\xe4\xb8\x90\x19\xd5\x36\xcc\xd6\x7c\x62\xad\x50\x8a\x96\x68\xa6\x18\x91\x7f\x4a\xc1\x30\x9a\xc5\x5c\x0f\x30\x16\x48\x3d\x67\xb5\x79\xfd\x44\x9d\x3e\x18\x42\x30\xc4\x7e\x0d\xb1\x5f\x43\xec\xd7\xbd\xed\xd9\xc4\x7e\xcd\xa9\x42\xb8\x45\xd2\x78\x7f\x28\x58\x80\x93\x3e\xb2\xba\xfc\x99\x46\x82\x19\x70\xb7\xe0\x08\x49\x22\x5a\x90\xc2\x9d\xc9\xad\xc1\x9f\xe5\x57\xdd\xfd\xb0\x62\x35\x2c\x8a\xe6\x39\xcb\x49\xc5\xea\x31\x82\xa8\x24\x53\x2e\xf2\x0d\x6b\x75\xfb\xd3\x8f\x1e\xf6\x18\x8a\xd5\x5d\x47\xd4\x37\xfb\x89\xc7\xea\x4e\x64\x0b\xa3\x62\x68\x19\xed\x10\xc1\x67\x11\x9d\x95\x2a\xa1\x8f\x89\xb6\x06\xc5\x2f\x23\x65\xf4\x74\x31\x1b\x84\x63\x67\x7e\xdc\x52\xfd\x94\x24\x0a\x9d\x59\x79\xfc\xc7\x86\xd5\x4b\x88\xcf\x6f\xc5\x4e\x9f\x8b\xc4\x7a\xc4\x70\x45\x32\xaa\x90\xac\xa6\xb0\xca\x97\x53\x8c\x9a\x14\x4d\x51\x8c\xb0\x9f\xd5\xcb\xea\xd0\x1c\xc0\x81\x90\xe6\xf7\x64\x8d\x58\xa2\x8a\x66\x3b\x1d\xc8\xf6\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\x93\xed\xe3\xd8\xb6\x15\x60\xb6\x12\x5f\x1e\x2d\xaf\x3f\xb0\x27\x8f\xd0\x2b\xc2\xcb\xc9\x93\xd9\x8d\x6e\x91\x6c\xaf\x5f\x24\x5b\xeb\x18\xc9\x56\x7a\x46\xb2\xad\xae\x91\x3c\x42\xdf\x48\xb6\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xfd\xa8\x1f\xc9\xe3\x84\xf3\xed\xd5\x90\x64\x07\x17\x2b\x1c\x3f\xc8\xec\xb4\x3f\xbd\x24\x89\xd5\x4d\xc2\xb5\xea\xa8\x27\x0f\x7d\x2e\xdb\xa9\x26\xc9\x8e\x4e\xc5\x65\xc6\x01\x5d\xd8\xa1\x94\x95\xe4\xe9\x15\x96\x0f\x4e\xc1\x0e\x1f\xad\xe1\xdb\x6a\xf4\x47\x68\x05\xc9\xa3\x34\x83\x64\x7b\xed\x20\x79\x2c\xb0\xef\x4c\x4b\xb8\xd3\xae\x80\x4f\xfa\x0a\xfc\xd0\x1e\xc1\x6d\x25\xdf\xc0\x60\x58\xe4\x2e\x4a\x5a\x99\xdb\xf7\xdf\x86\x89\x00\xc0\xfc\x1f\x52\x51\x5e\x2b\x23\xdd\x58\xbd\x76\xf8\x9b\x55\xdf\x05\xdd\x24\x4f\xa0\x32\x03\x1b\x1a\xbf\xa0\x85\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\xb9\x83\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\x74\xcb\x96\x47\xa3\x28\xf5\x40\xb7\x85\x37\xfb\xe8\x52\x1c\x21\xeb\xb4\x76\x2f\x3d\x9f\x25\x45\xb1\x24\x47\xf0\xdb\xd1\xae\x79\xd4\x2d\xf8\xa3\x30\x35\xeb\xb6\xec\xc7\x56\xd7\xe9\xb1\x0a\x6e\xd2\x81\xbe\x2f\xd9\x72\x5b\x47\x84\x24\x98\x7f\xd7\x19\xd1\x31\xd4\x00\x66\x46\x76\xf7\x7c\x13\x66\x66\x05\x96\xc9\xea\xa8\x50\x5d\xc5\x8b\x22\x61\xb4\x1b\x46\x34\xbd\x65\x60\xe1\x91\x90\x5a\x8e\xe7\x0c\x93\xe9\x21\xe8\xc0\x48\x06\x64\x1a\x05\xe9\x71\x49\x21\xe5\x6d\x53\x39\xd0\x73\xd9\x24\x13\x86\xe4\x22\x93\xa5\xf3\xa9\x47\xbf\xd6\x91\x4d\x30\x77\xcb\x96\x63\xcc\x81\x89\xcf\x61\x60\x20\x01\x56\x35\xf1\x43\x47\x30\xff\x81\x50\x45\x7e\x00\xa6\x52\x90\x13\xf8\xf0\xf4\x87\x14\x97\x02\xbf\x81\xa8\x7d\x95\x0d\x60\x16\x66\x88\xa5\x9d\xa0\x5a\xdd\xdb\x87\x76\x2c\x61\x68\x97\x29\x2e\xdc\x8c\x63\xb4\x37\x9c\x50\xa1\xf9\xa9\x57\xd2\x4c\x08\xc0\x01\x70\xc9\xb9\x14\xc7\x1a\xe7\xe7\xf0\x9a\xeb\x20\xc5\xeb\xc0\xef\x7b\x6b\xf1\x43\x6b\x01\x1e\x79\xce\xa6\xb4\x29\xb4\xcd\x46\x6a\x50\x1f\x50\xfa\x84\x11\x3e\x3a\x7b\x89\x65\xf8\xa7\xb2\xbe\xe1\x79\xce\x04\x84\x38\xb8\xe9\xdf\x48\x17\x10\xd4\x82\xbb\xc1\x6c\x9d\x33\x4e\x19\xf6\xac\x50\x72\xb4\xda\x63\xe6\xb3\x95\x9a\x5b\x74\x37\x67\xa2\x3b\x00\xe1\xca\x6c\xaa\x62\x09\x4c\xed\x41\x5c\x7f\x1e\x8f\xf3\xb6\x76\xbd\xe2\xea\x09\xf0\xde\xea\xa0\x03\xea\x8b\x42\x7d\x42\xea\x01\xfb\x7d\xb6\xd8\x6f\x0d\xe8\x77\x81\x00\xd7\x3a\x1d\x70\x60\x32\x0e\x14\x2e\x0d\xf2\x13\x5b\x01\x50\x31\x86\x5e\xac\x6e\x4a\xaa\xd5\x99\x41\xa0\xd7\x76\xfa\x32\x17\x06\x07\x78\x16\x7a\xc8\x9d\x31\xb4\x11\x36\x19\x3c\x98\x43\xdb\x61\x11\x5f\xac\xda\xdc\x13\xc6\x74\x82\x8b\x14\x4c\x81\x8a\x9d\x79\xff\x8a\x60\x18\xe8\x35\x65\x29\x10\x0a\xd7\xaa\x0f\x45\xbe\x1a\x1c\xd7\xf6\x0d\x7a\xfd\x92\x51\xa1\xc8\x91\x73\xf1\x38\x56\xed\x1b\x47\x49\xf7\xcd\xa5\xbe\xf4\x63\x43\xa6\xe3\x30\xdd\x65\x3b\xf4\x60\x47\x19\xec\x28\x61\x1b\xec\x28\xeb\x93\x18\xec\x28\xf7\xb5\xc1\x8e\xb2\xd5\xf8\x83\x1d\xa5\xdb\x06\x3b\xca\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xd8\x8f\x76\x61\x47\x69\xc5\xa0\x43\xc8\xd1\xa1\xc8\x6a\xfd\xc4\xb1\xca\x16\xd5\x3c\x6b\xa3\x42\xdd\x5b\xf8\xaf\xa7\x12\xaa\x43\x31\xf8\xb1\x22\x75\x28\xa0\xaf\x69\x30\x92\x25\xea\x7b\xe5\x67\x2f\x61\xaf\x8d\xb1\x23\xd1\xfa\x67\xae\x5c\x0a\x1c\x58\x0f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x86\xb5\x71\x2e\x39\x39\x71\xba\xd6\x53\x73\xe0\x42\xea\xee\x8f\x42\xf3\x71\xfb\x86\x77\x10\x06\x95\xb0\xcb\xe6\x96\xb2\xe9\x4e\x66\x69\x75\x8f\x62\xa5\xec\x65\x0b\x6d\x06\xff\xb3\xba\x33\x5b\xae\x6c\x25\x35\x08\x4d\xab\x1b\x21\x0c\x7b\x24\x85\x8d\xe2\x48\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xf6\x98\x82\x00\x00\xaa\xb1\x4c\xa2\xcd\xb9\x24\x85\x55\x92\x9b\x27\xd8\x4f\xc2\x24\xfc\x85\x85\xfd\xe4\x7e\x45\x29\x77\xf5\x02\xee\x68\x38\x59\xae\xe0\x1c\x69\x51\xc8\xbb\x14\xfa\x94\x78\x23\xb6\x4e\x0e\x18\x0d\xbd\x77\xc9\x59\x04\x57\xbc\xe5\x63\x79\xf5\x21\xd5\xe0\x83\x6d\x48\x35\xf8\x3c\x52\x0d\x06\x76\xd0\x30\xe7\x60\xff\x5e\x41\x4e\xc2\xbd\xe6\x1c\x24\xe4\xef\x73\x06\xb7\xa8\x66\x68\xbc\x6c\x0a\xcd\xab\x36\xca\x58\xe1\x09\x15\x28\x52\x4f\x6d\x34\x60\xf7\xf6\x9a\xd9\xd0\x6c\xde\x3b\xd4\xca\x2d\x87\xf1\x20\x6a\x59\x01\x36\xc5\x88\x39\xd0\xbf\x63\xa2\x3f\x27\x6b\x63\xd8\x21\x7f\xea\x68\xaa\x28\xfc\xf7\xc6\x15\x0c\x0d\x6c\xe0\x8a\x9c\x18\xea\x58\x2c\xad\xd5\xb8\x83\x08\x3b\x64\x35\x62\x00\xd4\x83\x2d\x98\x63\x50\x67\x7c\xc1\x44\x4b\x7d\x4f\xd4\xe9\xa9\xe3\x89\x57\xf9\x87\x88\xde\x1f\xc3\x61\xc4\x60\xed\x54\xce\x60\x85\xde\x47\x8c\xb0\x81\x23\xf8\x73\x40\x65\xff\xd2\xcf\x13\x44\x0c\x82\x57\xda\x85\x67\x06\x07\xdd\xf2\x02\xbd\xbd\xec\x31\x0a\x2e\x25\xd4\x2a\x4d\x2b\xbe\x45\x88\xd5\xb6\x99\x32\xf7\x1b\x5a\xb5\xd7\xb0\xaa\xcf\x27\xa1\xe5\x13\x9b\xff\x3e\x83\x6c\x4c\xcf\xc4\xdc\x37\xa4\x63\xba\xaf\x3d\x55\x3a\xa6\xbd\x9b\xf3\x3e\xbb\xac\x4c\x07\x35\xdf\x1d\xc6\x74\xf7\x99\x65\x65\x7a\x12\x53\xdd\x33\xcf\xcf\xb4\x3f\x13\xdd\x90\xfc\xe8\x69\xf2\x4b\xa6\x9a\xe1\xb6\xbf\x55\x4f\x6a\x7e\x7b\x52\xd3\xdb\xd3\x9b\xdd\xb6\xe2\x55\x1e\x6b\x6e\x4b\xbe\x26\x8f\x35\xb3\x6d\xe3\xb2\xbf\x1d\x3c\x1f\x2e\x44\xe9\xc0\x3e\xfa\xcf\x23\x34\xe9\x89\x1c\xf3\x9f\xca\x29\x7f\xbf\x0e\xf9\x4f\x10\x8a\x74\x90\x30\xa4\x54\xb2\x9f\x44\xec\x1f\x87\xbb\xb6\xa1\xc8\x5b\x86\x1c\x6d\x89\xbf\x0e\x19\x6a\xf4\x33\x40\x61\x5b\x85\x18\x0d\x58\xec\x89\xb0\xd8\xee\x42\x8a\x0e\x15\x4e\xf4\x33\xc3\x65\x5b\x86\x0e\xed\x4c\xbb\xbd\x9f\x90\xa1\x43\x87\x0b\xed\x21\x54\xe8\x29\xc2\x84\xf6\x10\x22\x34\xd8\x04\x22\xdb\x60\x13\x88\x6d\x83\x4d\xe0\xbe\x36\xd8\x04\x56\xdb\x60\x13\x18\x6c\x02\x83\x4d\x60\xb0\x09\xac\x0f\x38\xd8\x04\x06\x9b\x40\x5c\x1b\x6c\x02\x87\xb1\x09\xa4\x86\xdd\x6c\x07\xcb\x4f\x13\x6e\x73\xd8\x50\x9b\xdd\x87\xd9\x3c\x61\x88\xcd\xcf\x4c\xe1\x92\x1c\x4e\xb3\x1d\x98\x3f\x97\x30\x9a\xe7\x11\x42\xf3\xe4\xe1\x33\x8f\x0d\x9d\xd9\x4d\xd8\x4c\x02\xb4\x6f\x09\xe7\x95\xcc\xcf\x84\xe6\x8f\x2d\x7c\x14\x02\xe0\x7d\xd5\x8f\xe8\x42\xf2\x9c\x54\x8d\xb6\x05\x57\x86\x0a\x48\xbd\x30\x70\x98\x0a\x48\x9d\xc3\x1b\xca\x20\x3d\xd4\x9e\x4d\x19\xa4\xfb\xce\xec\x80\xb5\x90\x54\x73\xa3\x6b\x9a\xe9\xa4\x82\x48\xce\xe0\x38\x94\x44\x5a\x6b\x43\x49\xa4\xa1\x24\xd2\x50\x12\x69\x28\x89\x34\xa4\xf2\x1b\x52\xf9\x85\xed\xd9\xd8\xf1\xc8\x90\xca\x2f\xf1\xd3\x21\x95\x5f\x5f\x1b\x52\xf9\x0d\xa9\xfc\xee\x1b\x7d\x48\xe5\x37\xa4\xf2\x4b\x1b\x78\x48\xe5\x47\x86\x54\x7e\x43\x2a\xbf\xcf\x38\x95\xdf\x50\x12\xe9\xb3\xa8\x0b\x32\x14\x05\x49\x18\xfb\x79\x15\x05\x19\x4a\x22\x3d\x38\xc8\x50\x12\x69\x40\x7d\x43\x49\xa4\x9f\x2d\xf6\x1b\x4a\x22\x45\x0c\x32\x94\x44\x1a\x4a\x22\x3d\xd8\x86\x92\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x92\xfa\xd5\x60\x47\xb9\xbf\x0d\x76\x94\x94\x36\xd8\x51\xa2\x47\x1f\xec\x28\x83\x1d\x25\x6d\xe0\xc1\x8e\x42\x06\x3b\xca\x60\x47\xf9\x8c\xed\x28\x43\x49\xa4\xa1\x24\xd2\x50\x12\xc9\x8f\x3c\x94\x44\x1a\x4a\x22\x41\x1b\x4a\x22\x45\x8c\x30\x94\x44\xfa\x5c\x4b\x22\x75\xc2\x82\x3e\xdf\xba\x48\xe9\xcb\x18\x8a\x23\x0d\xc5\x91\xee\x69\x43\x71\xa4\xa1\x38\xd2\xa6\x36\x14\x47\x1a\x8a\x23\x3d\xd0\x86\x44\x88\x91\x6d\x48\x84\x18\xdb\x86\x44\x88\xf7\xb5\x21\x11\xe2\x6a\x1b\x12\x21\x0e\x89\x10\x87\x44\x88\x43\x22\xc4\xf5\x01\x87\x44\x88\x43\x22\xc4\xb8\xf6\xf4\x06\xb8\xff\x1d\x89\x10\x87\xe2\x48\xcf\xb2\xb2\xc8\x50\x56\xa4\xa7\x3d\x9f\xb2\x22\x43\x71\xa4\x4e\xe7\x43\x71\xa4\x01\x85\x0d\xc5\x91\x3e\x3b\x2c\x36\x14\x47\xda\xd0\xf9\x50\x1c\x69\x28\x8e\x34\x14\x47\x1a\x6c\x02\xbd\x6d\xb0\x09\x0c\x36\x81\xb0\x0d\x36\x81\xd5\x36\xd8\x04\x06\x9b\xc0\x60\x13\x18\x6c\x02\xeb\x03\x0e\x36\x81\xc1\x26\x10\xd7\x06\x9b\xc0\x50\x1c\x69\x28\x8e\x34\x14\x47\x82\x36\x14\x47\x1a\x8a\x23\x0d\xc5\x91\x36\x7e\x0c\x8a\x56\x94\x6c\xee\x83\xec\x58\x58\x3e\x6b\xbb\xb2\x1c\x7c\x23\x94\xae\x9b\x4c\x37\x35\xcb\xe1\xc0\xf0\x30\x0d\x63\xa0\xb4\xac\x9d\x55\x00\x2a\xcd\xbc\x61\x55\x21\x97\x86\xda\x8e\xc8\x95\xcc\x47\xe4\xec\xea\xf2\x9a\xd5\x0b\x9e\x31\x07\x7d\x5f\x5b\x9a\x7e\xff\xbe\x7d\x5c\x56\x3c\xa3\x45\x01\x1a\x8b\x76\x36\x25\x5d\x3a\x5d\xf2\xcd\x92\xb0\x4f\x9a\xd5\x82\x16\x44\x4b\x59\xa0\xf9\xc5\x4c\x06\x10\x62\xcd\x74\xcd\xd9\x82\x11\x5a\xdf\x70\x5d\xd3\x7a\x49\x4a\xa6\x69\x4e\x35\xbd\x7f\xd4\x6f\x14\x0b\x63\x34\xb4\x24\x55\xcd\xc6\x78\x03\x3a\xf3\x00\xd8\xfc\xfa\xab\x77\xee\x7e\xd3\x3c\x77\x01\x09\x0e\xc2\xaf\x9b\x1b\xbf\xdb\xc7\xf7\x73\x5b\xb9\xdf\x2d\x35\x02\xf0\xb4\x2a\x9a\x8a\x2b\xdc\xb3\x7b\x25\xd2\x08\xb6\x24\x8d\x09\xe9\x85\x4f\x26\x16\x8f\x05\xad\x0b\xb1\xe8\x6a\xf6\x98\x58\xf0\x5a\x0a\xe0\x23\x17\xb4\xe6\xf4\xa6\x60\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x0f\xc0\xcb\xb9\xb7\x33\x60\xb0\xcb\xbd\x57\xb2\x9f\x9e\xf5\x50\xb0\xce\x4a\x2f\xc4\xe2\x5b\xda\x55\x33\x88\x8d\x4b\x22\xf6\x05\xb3\x24\x4a\xce\xfb\x17\x14\xc5\x74\xc6\xa8\xc3\xc6\x80\xe1\xef\x7d\x21\x4e\x69\x65\xba\x78\x98\x5e\xa6\xd1\xc9\xf7\xb4\x6c\x2b\x68\x6d\xd8\xae\x3e\x84\xfa\x0e\x39\x7e\x65\x81\xc8\x10\x84\xaa\xe6\x42\xc3\x56\x9f\x5d\x9f\x5f\x5e\x92\x6c\x4e\x6b\x9a\x69\x56\x2b\xc2\x3e\x65\xac\xd2\xe4\xf8\xff\x77\xfc\x70\xbf\x91\x08\x1a\x70\xdf\x2e\x77\xe3\x5b\x07\x24\x50\xde\x88\x09\xc3\xd9\xfd\xea\xe4\xdb\xb3\x0f\xff\xf5\xfe\xec\xdd\xc5\x29\xc8\x2c\xec\x53\x45\x45\xce\xfa\x78\xd0\x46\xb9\x10\x9f\xaa\x66\x0b\x2e\x1b\x55\x2c\x3d\x09\xdf\x7c\xd7\x56\x2f\x99\xc1\x3f\x3d\xa3\x98\xfd\xb6\xe8\x69\x73\xa7\xa0\x67\xa1\x2d\xf4\xb7\x66\xc0\x9a\x29\x59\x2c\x58\xde\xa7\x5e\x81\x60\x4b\xb7\x1d\xad\xa1\xb5\x6a\xb4\xd3\x22\x39\xdb\x69\x23\xb2\x39\x15\x33\x96\x4f\xc8\x1b\xd9\x98\xd1\x7e\xf5\x2b\xd8\xb2\x9a\xe5\x4d\xd6\xbb\x63\xa8\x02\x44\x89\xf9\x57\x23\xc7\x61\x18\xba\xae\xb0\x7a\x9a\xca\x68\xe5\x36\x35\x3c\x15\xb5\x14\x9a\x7e\x7a\x1d\x53\x87\xed\xe8\x57\xc1\x87\x47\xae\x2e\x9e\x34\xd3\x43\x6e\x0c\x57\x54\x40\x49\xb3\x82\x1c\x85\x6f\xf7\xf5\x7d\x61\xe6\xc7\xf2\x10\x76\x30\xb4\x91\x2d\x58\x0d\xda\x27\x0b\x39\x23\x52\xb3\x19\xad\xf3\x82\x29\x08\xaa\xbb\x9b\x33\x28\x52\x88\xa2\x34\x1e\x54\xcf\x58\xcc\x6b\xca\x84\xec\xd5\x60\xbe\x41\x33\x36\x20\xf3\xa3\x9e\x65\xa4\xdc\xbc\xb7\xb5\xec\xa9\x71\xd5\xb9\x7d\xd7\x10\xb5\xe3\x8d\xfd\x9b\xc0\xf5\xd8\x5a\x49\x26\x21\x19\x51\x86\xfd\x9d\xb6\x46\x78\xf3\x3c\xc2\x10\x1f\xad\x2c\x88\xb7\x16\x64\x52\x4c\xf9\xec\x1d\xad\xbe\x64\xcb\x0f\x6c\x9a\x18\x40\x88\x9c\xbf\xd5\x7f\x03\xb2\x34\xe4\x07\x3b\xec\xe7\x5b\xf7\x18\x2f\x16\x63\x93\x49\x33\xa9\x44\x1b\x52\xd6\x2a\xd7\xa1\x0c\x62\xe5\x84\x9d\x73\xf3\x24\x8a\x82\x6e\x9c\x5c\xb4\xc4\x19\x52\x54\x8b\x0a\xa2\x6d\x0c\x1f\x5b\x96\x97\x2b\xc2\xa6\x53\x96\x69\xbe\x60\x85\x0f\x65\xb6\x15\x34\x6d\x68\xf1\x0d\xcd\x6e\xef\x68\x9d\x2b\xa8\xc9\x48\x35\xbf\xe1\x05\xd7\xcb\x98\x7a\x97\xd8\xac\xd4\x64\xa3\x9f\x9d\x62\x5e\x28\x4d\x01\x7d\xb9\xca\x8d\x66\x87\x51\xae\xa0\xce\x32\x8e\xb7\xd1\xc5\x0d\x47\x0f\x07\xc5\x03\x33\x56\x1b\x02\x57\x2c\xc9\x5d\x2d\xe3\x65\xbf\x77\x12\x02\x86\xa7\xf2\x35\x99\x6b\x5d\xa9\xd7\x2f\x5e\xb4\xb2\xd9\x84\xcb\x17\xb9\xcc\xd4\x8b\x4c\x0a\xc3\x63\xa8\x17\x72\x61\xe8\x22\xbb\x7b\x71\x27\xeb\x5b\x2e\x66\x63\xb3\x80\x31\x5e\x20\xf5\x02\x84\xed\x17\xbf\x84\xff\xed\x03\xca\x88\x73\x1e\x7a\x4d\x8e\x8e\x22\xde\x97\x15\x8a\x07\x5b\x40\xe6\x35\x68\x10\x96\x1d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x0a\x62\xb9\x90\x84\x65\xdf\x48\x59\x30\xda\xef\xce\xf5\x18\xd5\x27\x80\x7d\x3a\x56\x8d\xba\x97\x2d\xea\xc5\xcb\x65\xaf\x67\x25\xf3\xd7\x44\x35\x55\x25\x6b\xad\x5a\xa9\xd4\x00\xc5\xa8\xfb\x27\xe8\x65\x46\xe4\x07\xff\x10\xdd\xc6\xbe\x3b\xfe\xf3\x97\x17\xff\xfe\x97\xe3\xef\x7f\x08\x7f\x0b\xe4\xd3\xe0\x85\x88\x69\xaa\x8a\x65\x13\x21\x73\xf6\x1e\x66\x00\x7f\x5a\xee\xee\x2c\xcb\x64\x23\xb4\xfd\x41\x53\xdd\xa8\xc9\x5c\x2a\x7d\x79\xe5\xff\xac\x64\xbe\xfa\x57\x84\x11\x75\x8f\x74\x05\xf6\xfa\x8a\xea\x88\xd4\x00\x49\xd4\x85\x56\xfc\x5b\x56\xab\x88\x64\x18\xd8\x3a\xf0\x62\xbf\x0c\x4b\xee\x96\x14\xfe\xf9\xd6\x4d\xd7\xe0\xde\xbb\x9a\x6b\x0d\x3e\x8d\x36\x1b\x81\x9c\x8e\xdc\x95\x46\x46\x6a\xf1\x2a\x49\x71\x1b\x8d\x39\xfc\xae\x6d\xb1\x38\x98\xbd\x5d\x99\xd7\x9c\x58\x8f\xce\x35\x7d\xe3\xd9\xd5\x25\x59\xe0\x6e\xec\x61\x21\x8f\x43\x05\x05\xdb\x8a\xc5\x8a\x42\x06\x6f\x7d\xef\x76\x6b\x02\x96\xcc\x32\xa6\x30\x83\x98\x4d\xb1\xf5\x5a\xd1\xe7\xe3\x42\x2c\x4c\xdf\x8a\x4c\x19\xd5\x4d\xcd\xc8\x8c\x6a\x97\x59\x84\x09\xc3\xdf\x46\xe8\x27\x9f\x98\xcf\x83\x7a\xba\x31\x57\xd6\xbc\xb8\x90\x45\x53\x02\xb2\x7a\x16\xfc\x63\x82\x51\x00\x19\x4d\xc3\x11\xd8\x6b\xe1\x0f\x9d\x9c\x99\x4b\xbf\x00\x57\x12\x7c\x07\x4b\xa7\x2f\xc0\xda\x1a\x26\x59\x51\x9a\xd6\x3a\x41\x77\xed\xfd\xc6\x9d\x16\xc0\x0e\x4f\x09\xe6\x33\xc0\xa2\xe8\x3b\xd7\xa5\xb4\x0d\x33\x09\x91\xb3\xa2\x9a\x83\xa1\x6f\xe6\xf9\xd4\x8d\x90\x3b\xf2\x9e\x65\x8a\xff\x13\x24\xaf\x82\x97\x5c\x23\xbb\xf8\xea\xb7\x7f\x0a\x26\xb3\x17\x44\xf8\x08\x96\x28\x1a\x12\x36\xf1\x4e\x06\x0c\x1e\x60\x9b\xbc\xe7\x8a\x7b\x2f\xde\xa5\x2d\x97\xcc\x8a\xaf\xe0\xd7\x62\x7a\x69\xa1\x6f\x41\x6b\x27\xdd\x56\xcd\x4d\xc1\xd5\x3c\xde\x34\x7e\x39\xf5\xbb\x65\xfa\x50\x0c\x1c\x03\x74\xdd\x30\x6f\x03\x6d\xf1\xbe\x59\xd3\xca\x4c\x12\x8c\x58\x1b\x75\xaa\x9d\x14\x4e\xad\xba\xf8\x0a\x0c\x9d\x5e\x9f\xa5\x26\xbf\x78\xd4\x7a\xa6\xb4\x50\xbb\x5d\x90\x11\x67\xea\x5a\xd6\x5e\x85\x55\x33\xdd\xd4\xa2\xf5\x05\xba\x92\x39\xc9\x6a\x86\x91\x1f\x7b\x60\x98\x49\x28\x28\xc0\xfa\x22\x3e\xa9\xb6\x63\x0e\x92\xd0\xa3\x19\x23\xc4\x8f\x88\xea\x11\xf1\xa1\x66\xae\x1b\x2b\x12\x4b\x30\x4d\x7b\x67\x2f\x94\xcf\x65\x64\x8e\xd4\xe5\xb7\xb2\xd0\x02\x9d\x1e\x4f\x26\xc7\x38\x13\x59\x23\xba\x45\x29\xd4\x3c\xdf\x0b\xca\x69\x09\xda\x96\xea\x0b\x11\x08\xff\x76\xcb\x4a\xc3\xb7\xbb\x65\x39\xf5\x65\x0a\x8f\x71\x40\xc6\xcb\xa5\xd6\x79\x7b\x10\x59\xcc\x8d\xe6\x36\xcc\x23\x8a\xd7\xe8\x3b\xe4\x13\xfd\x20\xe1\x51\xd6\x9c\xf8\x63\xc3\x94\x8e\x11\xda\x4f\xf0\xb3\x49\x56\x35\x23\xdb\xc5\xa4\x64\xa5\xac\x97\xfe\x4f\x56\xcd\x59\xc9\x6a\x5a\x8c\x95\x96\x35\x9d\xb1\x91\x1f\x00\x3f\xf3\x7f\xe1\x87\x9d\x29\xac\x7f\x8d\x16\x82\xac\xa9\x6b\x26\x74\xb1\x74\xb2\xe5\x13\xf3\x7d\x6e\x1f\x77\xcc\xa4\xf9\xe3\xda\xf2\xbe\x1c\x7b\xe3\x1b\xea\xe4\xfc\xaa\x40\x45\x8c\xb7\x47\x8d\x5a\x42\x00\x36\x00\x24\x94\xea\x78\x1f\xb7\x3f\xe7\x0b\xae\xb6\x8a\xfc\xb9\xf6\x1e\x54\xe0\x6e\xd4\xe8\xaa\xd1\x36\x7d\xa4\x97\x2a\x3e\x55\x52\x81\x75\xc0\x67\xaf\xea\x88\x93\xaf\x62\xb4\x44\x80\xfb\x35\xab\xc5\x6b\xf2\x9f\x27\xff\xf1\x9b\x9f\xc6\xa7\x7f\x3d\x39\xf9\xee\xe5\xf8\x5f\xbf\xff\xcd\xc9\x7f\x4c\xe0\x1f\xbf\x3e\xfd\xeb\xe9\x4f\xee\x8f\xdf\x9c\x9e\x9e\x9c\x7c\xf7\xe5\xbb\xbf\x7d\xbc\xba\xf8\x9e\x9f\xfe\xf4\x9d\x68\xca\x5b\xfc\xeb\xa7\x93\xef\xd8\xc5\xf7\x91\x9d\x9c\x9e\xfe\xf5\x57\x51\xd3\xa3\x62\xf9\x75\x04\xd6\xc0\x36\xde\x22\x27\x67\xfb\xd5\xb6\xce\x4a\x5c\xe8\xb1\xac\xc7\xf8\xf9\x6b\x60\x92\x22\x3a\x71\xc7\xb6\x0d\x9c\x7f\x70\xb7\xb5\xc5\x78\x9e\x78\xee\x01\x90\x1f\x43\x00\x14\xcb\x6a\xa6\x77\x65\xde\xc0\xde\x1c\x37\xb8\xe2\xf6\xf6\xdc\x25\xe1\x43\x5a\x3c\x7c\x2a\x41\xd8\xaf\x96\xb3\x32\xec\xd6\xa4\x65\x98\x28\x41\xb9\xd4\xbe\x77\xcb\x22\x63\x51\x07\x0b\xc9\x60\x21\x19\x2c\x24\x5d\x29\xff\x1a\xef\xd0\x33\x37\x8f\x30\xb1\x78\xc8\xca\x9e\xe0\xec\xf5\x16\xf2\x02\x87\x0e\x5f\x8e\xb9\xd6\x92\x54\xb2\x6a\x0a\xaa\xef\xf1\x21\x49\xf0\xfe\xea\xd7\x71\x79\x54\x76\xfe\x5f\x97\x6f\x2e\xde\x7f\xbc\x7c\x7b\x79\xf1\x61\x42\xce\x8a\x22\x54\xbb\xdd\x0f\x71\xad\xa4\x8e\x9c\x35\xa1\xe8\xea\x05\xfa\xb9\x3b\xa7\x50\x69\x7d\x68\xb8\x6a\x15\x75\x98\xed\x18\x09\x94\xf5\xa0\xe0\xc2\xe7\x3c\xbe\x77\x48\xcf\xb0\xf9\x58\x87\xb5\x34\xe7\xe8\x49\xab\xb4\x5b\x26\xcc\x52\xd3\x5b\xf0\xfe\xc9\x58\xce\x44\xf6\x80\xac\xf7\x2d\xc6\x4f\xb8\x3d\xbb\x31\x62\x06\x38\xe8\x21\x46\x21\x79\x53\x15\x3c\x33\xe7\xe3\x35\x92\xd1\x7d\x5f\x96\x65\xa3\x1f\xf2\xe4\xda\xb9\x1f\x9e\x81\x34\xeb\xeb\x11\xb8\xe3\x01\x7d\xf3\xe2\x9e\x8f\xf5\xf3\x86\x4a\x70\x66\xc1\x4b\x79\xff\xe1\x47\xb1\x04\x71\x84\xdb\xfb\x72\xf4\x72\x3a\x6b\x14\xbb\x35\xae\x76\x29\xf5\x83\xbd\xec\xc1\x1d\x25\x8e\x4e\xa7\xd3\xe8\x6d\xe9\xf3\x21\x69\xf3\x01\xe9\xf2\xf6\x34\xf9\xe9\xe8\x71\x12\x2d\x8e\xa7\xc3\xf1\x34\x38\xc1\x43\x21\x95\xee\xc6\xd3\xdc\x6d\x25\xa1\xaa\x66\x53\xfe\x69\x97\x8e\xa5\x5f\x3b\x25\x86\x66\x9f\xb4\x75\x67\xaf\x98\xf0\xc1\x4f\x4e\x6f\x08\x7e\xeb\x9f\x9d\x1f\x2e\xca\x23\xe9\x88\xf4\x7a\x93\xbc\x33\x60\xd1\x01\x8b\x76\xda\x80\x45\x7b\xa5\x98\xe7\x84\x42\x85\xcc\x7b\x93\x28\xc5\xde\xa6\xf7\x41\x5f\x2b\xb9\x55\xd0\x08\xe5\x16\x0e\xa6\x4e\xe7\x59\x5c\x49\x80\xe8\x29\xd7\x6d\x80\xdc\xfd\x80\x76\xbd\xa1\x47\x88\x7c\xb3\x5f\x1e\x2b\x97\x23\x6c\xa5\xff\x95\x72\x35\x18\x8a\xf4\xf0\x58\x89\xa0\x8c\x3c\x6a\x83\xb9\xd4\x5e\x50\xa5\xf8\x4c\x8c\x2b\x99\x8f\xcd\x28\x2f\x1e\xe4\xe7\x0f\x19\x8d\xe4\x55\xda\x8f\x3d\xee\x0f\xde\xe0\x13\x08\x0e\x06\xad\x35\x9a\x05\xd6\x20\x6f\x27\x70\x29\xaa\x22\x04\xd3\x5e\x31\xe8\x91\x87\x53\x52\x41\x67\x6c\x6c\x27\x3b\xf6\x93\x1d\xfb\xb9\x3d\xe2\xbc\x62\x88\x59\x56\x50\xfe\x70\xbc\x6f\x0a\x09\x3b\x87\xde\x6c\xdd\x1f\x1f\x90\xbd\x52\x7d\xc3\xc9\xab\x5c\xa0\xab\xa2\xfb\x09\x3f\x7e\xd8\x06\x0f\x97\xc5\x27\x50\xdc\x70\x90\x0f\x7e\x1d\xd0\xc8\x1c\xf8\x28\x85\x17\xf0\x61\x42\xf4\x66\x29\x68\xc9\x33\x07\x65\x67\x05\x04\xd7\x72\x29\x3a\x6e\x2f\xf1\x43\x73\x45\xb8\x07\x2b\x72\xa9\x49\x46\x05\x5a\x2e\xad\x1b\x84\x41\x18\xa1\xf7\xc3\x03\xdb\x11\x15\xdc\x1d\x11\xd2\xdd\x39\xe4\x0f\xe1\x81\x84\x71\x29\x52\x30\xc2\x84\xae\x21\xd3\xed\x95\xcc\x0d\x69\x99\x74\xde\xee\x71\xe9\x89\xe6\xc3\x62\xf5\xf2\x3d\xc1\x71\xe4\xf9\xb0\x74\x01\x81\x08\x39\xf7\xce\x96\x56\x32\x9f\x6c\xb8\x12\xf1\x25\x8c\xae\x64\x6e\x63\xc0\x75\x07\xde\xcc\x6d\x01\x50\x2b\xe9\xad\x8b\xcc\xf6\x46\x25\xba\xa0\xbc\x88\x08\x1e\x22\x90\x72\x54\xf1\x9c\x11\x1a\x83\x3b\xfd\xc4\xe2\xd9\x21\x6b\x22\xdf\xc7\x21\x7c\xc0\xae\x5d\xa2\x2d\xd8\xff\x6c\x2e\x15\x13\x70\xdf\xa8\x1b\xdb\x17\x0a\x74\x60\x9f\x23\x8e\x8c\x61\x39\x2f\xa7\xc8\xe6\x8e\x08\x5b\xb0\x7a\xa9\xa1\x5c\x97\x4b\xea\x8a\xdd\x98\xf1\x4b\x9a\x07\xbb\x3e\x22\xd2\xf0\x65\x77\x3c\xca\x89\x07\xf0\x04\xce\x4f\x35\x85\xf6\xbc\xb6\x9d\xfd\xce\x4e\x63\x3d\x80\xdd\x70\x71\xb7\xbd\xd9\x7a\x7b\x2f\xe4\x7d\x91\xf1\x25\xad\xee\xfd\x0a\xbd\x2e\x76\x45\xa4\xbe\x42\xaf\x10\xfc\xe4\xc6\x1a\xdf\x4b\xfa\x89\x97\x4d\x49\x28\xfa\xdd\xc8\xe9\x06\x06\x22\x2a\x59\xc0\x2e\xd8\x81\x0d\x6c\x80\xba\x8f\x0f\x20\xf1\x68\x35\x3d\xa5\xcd\x33\x75\x1b\x88\x72\x17\x48\x73\x13\x48\x70\x0f\xd8\xda\x2d\xc0\x39\x00\xed\x0a\x90\x2d\x4a\x5b\x03\x65\x2e\x7a\x41\xd9\xd1\xd7\x87\x61\xf9\x72\xda\x8e\xc1\x15\x91\x25\xd7\xda\xfa\xd9\x04\x14\x60\x44\xb8\xee\x38\xa5\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x55\xf0\x8c\x83\x6f\x93\xf3\xbf\x7c\x98\xd1\xf3\x38\xd1\xa6\xaa\xe2\x65\x85\xc9\xaa\xe0\xa2\x8c\x1d\x0f\x69\xc3\x3e\xfd\x2c\x6d\x9c\x32\xfb\x94\x31\x96\xdb\x89\x0c\xf7\x75\xb8\xaf\xc9\xf7\x55\xed\x48\x15\x11\xaa\x21\xda\xbc\x39\x5e\x1d\x61\xae\x12\xe4\xb4\x41\xc5\x80\x83\xae\x87\x2e\xe6\x85\xcb\xaa\xfe\x81\x81\x79\xef\x9a\x69\x65\x33\xf4\x40\x4f\x0f\xe9\xd5\xd6\xb2\x34\xfb\x4c\xec\x2e\xdd\x15\x05\xc5\x61\xf0\x46\x9b\xdf\xe4\x01\x29\x59\xaf\xb2\xb7\xa0\xeb\x60\x65\x55\x50\xdd\x6a\x42\x1e\x91\x08\x25\x86\x89\x4f\x49\x64\xfc\xb4\xa9\x8b\xf7\x23\xb6\xf5\xb2\xc1\x4f\x98\x82\x78\xdb\xa4\xc3\x7b\x10\x18\xfb\x9d\xb8\x22\x93\x07\xc7\x0b\x96\x51\x5e\x5e\xfb\x4e\x09\x9c\x20\x86\xc5\xa7\xfd\x4d\x97\xc3\xf6\x9c\xda\x77\x5f\xc9\x7c\x13\x76\x2f\x36\x61\x6f\xfa\xde\x1d\x28\x29\xef\xc1\xd3\xf0\x1e\x32\xf1\x6e\x52\xaa\xdd\x94\xe4\x89\xd1\x89\x13\xb7\xf7\xca\x4d\x49\x98\xb8\xe5\x87\x91\x69\x71\x53\x60\xf7\xc0\xa9\x6f\x0f\x9c\xec\xf6\x29\xd2\xdb\xee\x4d\x7e\x88\x00\xcd\x74\xcb\x9e\x96\x85\xad\xeb\x13\x67\xe9\xf9\xd8\xbe\x0f\xdb\xd1\x3a\x81\x07\x3d\x1d\xc6\x2d\xed\x41\xc8\xfe\xe8\xf8\x5c\x83\x9d\xda\x49\x03\x8c\x6b\x4d\xb3\xb9\x4d\x52\x8b\xbf\x18\x48\x10\x4b\x62\x80\x40\x23\x25\xb7\x79\x32\x1f\x3a\xe7\x39\x23\xba\xe6\x55\xc1\xc8\x9f\xfd\x85\x18\xa1\x6d\xff\x2f\x41\xaa\x30\x97\x54\xb4\x05\xc6\x3f\xbb\x7f\xfd\xe5\x91\x19\xea\xe2\x98\x1c\x9c\xd2\x2e\x79\xd5\x0b\xe8\x91\x70\x91\x83\x07\x23\xb2\x42\xb8\x79\x38\x98\xd9\x5a\x58\xf7\xc4\x66\xf7\xc4\x54\xb9\xd6\x04\x0b\xae\x8e\xed\xcb\xbd\xac\x03\x78\x78\xb6\xaa\x09\xef\xe1\xe0\xef\x30\x23\xef\xe5\xb5\x35\xdb\x8e\xc8\x15\x68\x87\xdb\x27\x70\xe7\xdf\xcb\x8b\x4f\x2c\x6b\x74\x8f\xd3\x4d\x24\xfa\xef\xe5\x19\xd3\xf6\xf3\xcb\x96\xa1\xc4\x8d\xe9\x30\x94\xed\xc5\x0a\x59\xca\x07\x37\xf6\x96\x2d\x7b\x77\xd5\x32\x09\x96\x99\xb5\xaa\x71\x0f\xa3\x8e\xc8\x23\xdf\xf0\x7f\x9c\x29\xaf\xbc\xe1\x02\xa7\x82\x03\xbb\x73\x86\xb1\xdd\x79\x18\x09\xa4\x28\x22\x26\x11\xb9\xdb\x71\x1c\x6f\xaa\xf3\x56\x3c\xa7\xeb\xe9\x45\xdf\x96\x6e\xe2\x6f\x03\xa6\xf6\xe2\xc7\x86\x16\x93\x4e\xea\x36\x7c\xd4\x77\xdd\xac\x5b\xf3\x2a\xdd\xbc\xe3\x45\x9e\xd1\xda\xc6\xd6\x01\xfa\x21\x4a\x5a\x33\x2c\x60\xbf\xac\xd7\x81\xdd\x21\xc0\x16\x78\x14\xfa\xf2\x56\xb4\xd6\x3c\x6b\x0a\x5a\x13\x73\xc7\x67\xb2\x8e\xca\xcd\xd6\x7b\x98\x2d\x34\x5f\xb3\x4c\x8a\x7c\xa7\x42\xf4\xc7\xd5\xce\x57\xbd\x95\x2b\x56\x73\x89\xb9\x82\x78\xc9\x56\xaf\xd7\x49\xc7\x01\xa5\x4f\x0e\x9b\x3a\x64\xe7\x71\xcb\x28\xd4\x8c\x76\x6d\xca\x58\x82\xee\x34\x20\x38\xfe\xb6\x4f\xc8\x17\x4b\xa7\xa2\xed\x63\xc8\xb9\x76\xf9\x04\x14\xd3\x2e\x9f\xa2\xbb\x8a\xf6\x24\x5b\x34\x32\x95\x35\xe4\x29\x3c\xc9\x25\xc6\xd1\x2f\x78\xa6\x4f\x27\xe4\xff\xcf\x6a\x19\x91\x88\x52\xb0\x19\xc6\x72\xdb\x8b\xed\xf5\x51\x35\xa3\xd6\x4b\xff\x25\x39\x81\x4e\x09\x2f\x4b\x96\x73\xaa\x59\xb1\x3c\x45\xf5\x14\x23\x6a\xa9\x34\xeb\xb1\xcd\xc5\xab\x15\x31\xf4\x12\xde\xfd\xc3\xef\x1f\x78\x73\x0f\x09\x44\x6d\x92\xc2\x76\x63\xd1\x53\x6e\x05\x7a\x7c\x6a\xed\x5e\x79\xff\x5e\xf9\x2c\x0c\x47\x68\x93\x9b\x3b\xdc\xec\x61\xeb\x1f\x06\x40\x29\xa9\xd9\x0c\xee\x27\xde\xb9\x47\xde\x4e\x8c\xcd\x7d\x27\x1b\x71\xbf\x0d\xa4\xb3\x6f\x5f\x59\x15\xdc\xb7\xc1\x87\xa9\xa9\x85\x77\xcb\x10\x06\x33\x09\xac\x2e\x14\xa3\xf5\x81\x03\x33\x88\x0d\xdf\x6a\x83\x58\x22\x8c\xe5\x3b\x4c\x17\x0c\x73\xe9\xc9\x9f\xb5\x93\xa4\xc2\x7e\xa0\x5d\x5e\x85\xab\x95\x0c\x12\x41\x5a\x5b\x57\x96\x35\xc8\x92\xd0\x42\x30\x4c\x86\xe5\x36\xec\xb1\x0f\xed\x04\x19\x23\x8e\x5f\xef\xc6\x9b\x19\x77\xa3\x96\x15\x9d\xc1\x65\xdd\xe5\xa6\xac\xf6\x4d\x72\xa6\x59\x5d\x72\xc1\x14\x99\xcb\x3b\xfc\x1d\x99\x81\xca\xbe\xc5\xf2\xd6\xf3\x60\x2e\x7b\x77\x04\x4b\xb0\xb6\x09\x84\x11\x7b\x80\xc3\xe8\x1d\x5d\x12\x5a\xcb\x46\xf4\xa6\x23\x00\x2e\xda\x53\x8e\x77\x2b\x93\x7e\x2f\x05\xf3\xce\x28\x7d\x54\xb6\x43\xda\x6e\x98\xa6\xe6\xc2\xbf\x9a\xbc\x7a\x19\x35\x87\x0f\x2c\x6b\x6a\xc5\x17\xec\x03\xa3\xf9\xd7\x46\xe2\x6e\xd3\xc1\x5c\x4e\xaf\xa4\x52\xfc\x06\xb3\xf0\x18\x06\x09\x73\x6c\xad\x4f\xd8\x73\xa8\x30\x73\x59\x93\x46\x78\x11\xa1\x67\x16\x96\xcc\x87\x56\x51\xd3\xc9\xe9\x4e\x20\x2d\x31\x99\x37\xec\xe5\x8a\x7d\xc6\x79\x99\x3b\x5c\xb5\x93\x79\xd5\x76\xb3\x77\x09\xf9\xef\xf0\x5a\x43\xdf\x63\xd0\x9d\xf0\x29\x58\xed\x46\xf8\xe8\xae\xe6\x9a\x05\x74\xeb\x04\xb3\xfd\x74\x0f\xab\x67\xdb\xbb\xa9\x8e\xa1\x83\x98\xfd\xe8\xf7\x83\xae\x57\xc1\x70\x97\x3b\xb3\x0e\xe3\x6d\x41\x1e\xe7\xeb\xdd\xee\x9a\xc5\x10\x2d\xbe\x9c\x53\x91\x17\xbd\x70\xec\x57\x50\x2c\x7b\xb3\x30\x81\xb7\x40\x7b\xdd\x60\x1f\x47\x21\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf7\x37\x2c\x38\xac\xd4\x71\x10\x18\x10\x65\x85\x48\xc3\x5e\xf7\x37\x5c\xd9\xeb\x0d\x9a\x12\xa0\xdc\x96\xbf\x2d\x69\x6f\x05\x94\x60\xfd\xed\x66\x4e\x2c\x7b\xb5\x61\xb4\x16\xb9\xac\x8c\xb7\xed\x58\x23\x03\xef\xc8\x92\xfb\xac\x30\x8e\xf9\x6d\x11\x76\x6d\xb8\x8f\x92\xb5\x13\xeb\x19\x6a\x75\xda\x1e\x05\xae\xcd\x79\xf3\xac\xfc\xa4\x7a\xc6\xe9\x9f\x72\x57\x9e\x41\x85\x5a\x27\x2d\x98\xa6\x18\xae\x1b\x91\xd3\x7e\x25\x29\xd7\x8c\x09\x90\x56\x40\x0b\xe7\x14\x49\xd6\x77\x8e\x2a\x29\x62\x00\xad\xe7\x90\x0d\x9e\xe9\x27\x1f\xf8\x59\xcf\x60\x40\x63\x4e\x64\xbd\x72\x1b\x9c\x00\xb6\x81\x92\xa4\xce\x1e\x08\x73\xdb\x2f\x02\x55\x20\x68\x99\x0d\x6c\x85\x7f\x39\xf5\x57\x67\x37\xc1\x5e\xcd\xcd\xbe\x59\xc5\x0d\xc9\xc6\x42\x90\x3b\x56\xf7\x73\x8d\x09\xf4\xe1\xe8\x88\x9c\x60\x3f\xc7\x8a\xd4\x52\xea\xdd\x10\x75\xbb\x3f\x17\x9f\xaa\x9d\x2a\xa1\x2e\x6c\xf1\x80\x98\xcc\x6c\x3b\xda\xac\x2f\xd8\x9c\x2e\x98\x22\x8a\x97\xbc\xa0\x75\x01\x99\xd9\xaf\x71\x79\x10\x82\xb6\x31\x17\x60\x44\xe9\x8c\x40\xe3\x1d\xce\x33\xe8\x6e\x9f\xe7\x48\xdc\x1a\xcc\x11\x01\xbd\x71\x6b\x32\x73\x2c\x1b\xdd\xd0\xa2\x58\x12\xf6\x29\x2b\x1a\x83\x2f\x77\x22\x2c\x6f\x23\x27\xaf\x8a\xc8\x95\x75\xd4\x3f\xa0\x80\xdc\x55\x79\x1a\x7e\x35\x77\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\xcb\x98\x52\x2e\x87\xc1\x32\xcc\xc3\xe0\xd7\xf0\xb9\x94\xda\xa1\x77\xea\xa2\xa0\x4a\xf3\xec\x8b\x42\x66\xb7\xd7\x5a\xd6\x3b\xd5\x15\x6d\xea\x7f\xa5\x80\xd1\xd9\xdf\xaf\x0d\xf2\xbe\x0d\x12\x47\x59\x47\xcc\xd0\x30\x45\x7b\x06\xba\x6d\x6e\x58\xc1\xf4\xb1\x02\xf9\x91\x94\x34\x9b\x63\x19\xad\x1c\x33\x90\xba\xd4\x64\x56\x7d\xfd\xe0\x11\x61\x7b\x63\x66\x09\x85\xe9\x5e\x9b\x39\xae\x2f\x03\xfd\xcd\xec\x3b\x98\xdd\x03\x35\x58\x60\x0c\x74\x81\x74\x5c\x8c\x75\xcd\xfa\xd8\xa9\x8d\xfb\x04\x21\xa9\xb6\xb6\x0c\xaf\xd1\xd3\xcd\xce\x9f\xdd\xa8\x49\xa6\xf8\x84\xde\xa9\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\x2f\xfa\x43\x1c\x12\x5d\x48\x6d\xd2\xbf\x17\xf6\x86\xff\x92\xde\x29\x86\x13\xbd\x31\x13\x85\x12\x68\x11\xb8\x63\xa7\x4e\x51\x38\x97\xcb\x37\x0f\xbe\x18\xef\xf0\x34\x55\x1f\xcd\x1c\x7b\xde\xda\xc6\x05\x06\x7b\x76\xaa\xd2\x29\x2f\x18\xaa\x80\xf1\x64\xbb\x29\x34\x01\xe8\x97\xb2\x21\x77\x14\xad\x19\x40\xc0\xa2\x82\xa9\x79\xf5\x9a\x5c\x08\xd5\xd4\xac\x35\x92\xad\x0e\xb6\x89\x25\x87\x9b\x62\x41\x56\xcc\xa2\xd4\xd3\xd8\x2e\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\xde\x85\x9a\x8b\x29\xab\x6b\x1f\x7f\x8d\x1f\x18\x96\xbc\x23\x45\xf5\x8f\x79\x68\xb8\x25\x69\xce\x2f\x60\x1e\xea\xd7\xa4\x91\xad\xe0\xc8\x77\xee\x40\x29\x78\x20\x76\x03\x44\x97\x53\xe7\x31\x8f\x72\x95\x65\xe1\x61\x40\xdb\x8d\x01\x1b\x3b\x8e\xa1\x3c\x69\x80\xf2\xd6\xa7\xbb\x24\x2f\x72\xb6\x78\xa1\x72\xfa\x6a\x04\x53\x55\x36\xe4\xbb\xbb\x2e\xaa\xc8\x51\x5c\xf1\x81\x6b\xc7\xb9\x8d\xc2\x9d\x68\x7b\x32\x88\xd8\x0d\x09\x7e\x2f\x2f\x8f\x40\x74\x31\x63\x67\x54\x90\x82\xd1\x85\x15\xe7\x10\x65\x2c\xd1\xc0\xd0\xcb\x61\xa5\x18\x6b\x48\xd7\x60\xf3\xbb\xdf\xf6\x8a\xd7\x31\x3a\x18\xb2\x15\x34\xb9\xbe\x9d\xd5\xa6\x6e\x6c\x2e\xa7\xa9\xac\x33\x2f\x73\x5a\x2d\x0d\xd3\x80\x1b\xb8\xe8\xd8\x35\x9e\xf7\x85\x8d\x4b\x55\xe6\xa8\xc8\x5e\x7c\x1f\x6d\xdf\xa0\x41\x16\xfc\xc7\x86\x91\xcb\x37\xbe\x22\x0b\xab\x15\x57\xda\x08\x14\x79\x87\xef\xe1\xc8\x0c\x9d\x9c\x95\xf4\x9f\x52\x90\x8b\x2f\xae\x6d\x47\x11\xa0\xf8\xac\x11\x24\xfd\x67\x53\x33\xc3\xe3\xed\x94\xb5\x74\x9d\xae\xf2\x93\xe6\x39\x79\x43\x35\x45\xb6\xd2\x06\x16\x89\x96\xe4\x19\xa6\xf0\x86\x8b\xdc\xfe\xb4\x25\x4b\xe8\x87\x4f\xe2\x03\x83\x69\x9b\xcd\xeb\x5b\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x24\xfe\x6f\x0f\xdc\x98\x99\x4d\x44\x79\x0c\x7c\xf1\x9b\x0f\x97\x3b\xe2\xda\x32\xe0\xf0\x67\xef\x64\x9e\xca\xba\x1d\x07\x9f\x3a\x82\xfa\x6f\x06\x2e\xce\xf1\x39\x29\x4d\x9f\xa0\xb8\x1a\x81\xf2\x96\x7c\x0d\xba\x4d\xf8\xe7\xdf\x6b\xae\xd9\xa4\x3f\xa3\x6d\x02\xeb\xe0\x36\x30\x71\x19\xee\x33\xb7\x84\x30\x17\x4f\x6e\xa0\x1f\x90\x8b\xe5\x0f\x6e\x0a\x79\x43\xec\x95\xdf\xf5\xdc\xbf\xf9\x70\xb9\xc5\xd4\xbf\xf9\x70\xe9\x66\x6e\xfe\x29\xa7\x87\x9b\xf4\x21\x18\xfe\xb7\x2b\xfc\x77\x0a\x2f\xd6\xa6\xc2\x5d\xe5\xe2\x77\xc9\xc2\x4f\x0e\xc6\xbc\x6f\x97\x62\xc8\x8c\xd5\x27\xf4\x73\x11\x91\x0c\xb9\x7b\xf9\xcd\x37\x84\x7d\xaa\x10\xa3\x06\x2e\x93\xd7\x73\x0a\xf9\xab\x5d\xaa\x4c\x04\x3f\x03\x8f\xca\x90\x6c\x07\x88\x84\x62\x95\x32\x43\x0d\x50\x4b\x9f\xbf\x76\x8e\xe0\xfe\x8b\xcd\x1f\xbc\x83\x00\xcc\xfc\x35\xd2\x00\x82\xf1\x98\x79\x00\xf7\x27\x68\xae\x10\xfe\x27\x1b\x77\x8f\xd9\xae\x14\xd3\xa7\x93\x8e\x6e\x5d\xc1\x94\x77\x8a\x8c\x0e\xc2\x78\xae\x59\x30\xc9\x89\xf9\xed\x05\xd8\x47\x4f\x27\xad\xc5\x0c\xb2\x43\xb4\xbc\x69\xc4\x18\xe6\x52\x7c\x78\x34\xf7\x9a\x96\xf2\x36\xba\xb8\x09\x9c\xbb\xc1\x0c\x3b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\xc4\xdf\x27\x2b\x04\x03\x6d\xc1\x0a\xc1\x77\x5b\xb3\x42\x50\x5f\xe4\xd9\xb0\x42\x98\x23\x30\x8a\x19\x82\xab\xdb\xfb\x66\x3c\x3b\x74\x90\x7b\x9b\xff\x9c\xee\x6d\x7b\x58\x89\x7b\xd6\x7e\xe8\x18\x18\x9f\x20\xc7\x25\xb7\xef\x04\xa4\xe2\x45\xbc\xb6\xd4\xc0\x16\xb9\x44\x76\xcd\x5c\xbf\x2f\x23\xf2\xf4\x27\x20\x70\x0f\x58\xa9\xab\x72\xdf\xb9\x45\x21\x91\x82\xc7\x24\xaa\xfc\x5d\xe4\x24\x33\x56\xcd\xa7\x3b\xf5\x72\x36\x3d\xbe\xbd\xee\x9a\x71\xce\x59\x35\x27\x6f\xaf\x37\xa0\x3c\x38\x1c\x58\x96\x42\xe3\xce\xb1\x22\x05\x9f\x32\xf0\x49\x48\xc0\x7a\xe7\x38\x6a\x07\xe5\x79\x67\x34\x87\xe2\x70\xb1\x5e\x05\x2b\x24\x29\xa4\x98\x19\xe6\x20\xae\x6a\xce\x1e\x90\x54\x29\x05\xd7\xb2\x7e\xd8\x1b\x22\x1e\xf1\xb8\xee\xf6\x81\x78\x5c\xdf\x66\xeb\xda\x02\x23\xef\x82\xa7\x94\x64\xb2\x28\x58\xa6\x6d\xb9\x53\x38\xf6\xa8\x15\x62\xdb\xa0\x34\x61\x56\x67\x39\xb9\xfd\x13\xa8\x4d\xac\x82\xe4\x05\x1e\xe5\x8b\x0f\x17\x67\x6f\xde\x5d\x4c\xca\xfc\x97\x73\x79\x37\xd6\x72\xdc\x28\x36\xe6\xfd\xc5\x3b\x3e\xe3\xe8\x4c\x12\x5d\x8f\xad\xcb\x6a\x57\xb6\xce\xac\x4b\x0c\xfc\x9a\x7c\xa3\xd0\x7b\xc3\x7b\xee\xb0\x1c\xac\xd9\x23\x52\x53\x9b\xef\x93\xe2\x55\x9d\x36\x45\x81\xa7\x69\xee\xd1\x28\xd4\x47\xbf\xf8\xfc\x18\xde\xce\x26\x3c\x7b\xee\xf7\xf0\xd7\x22\x85\x62\xf7\xf3\xcf\x64\xab\xc3\x6a\x7b\xef\x1e\xd7\x75\xe7\xb9\x76\x75\x03\xb5\x84\x50\x31\x08\xea\x36\x8c\xed\x37\x8a\xd5\x5d\x30\x65\x3a\x83\xdd\x79\xd1\x28\x56\x4f\xb0\xfb\x67\xb8\xf7\x71\x5c\x45\x5c\xf6\x6b\xf2\x88\x9d\xff\xc0\xa6\x9b\x36\xde\x3e\xf6\x1e\x37\x8e\xf3\xa7\x8d\x9e\x33\xa1\xb9\xcd\x6e\x69\x39\xaf\x8d\x27\x81\x81\xf9\xcf\x70\xeb\x23\xeb\x3e\xa5\x55\x69\x1a\x2a\x1b\xb5\x6d\xa8\x6c\xf4\x3c\x2a\x1b\x3d\xa6\x5c\x9b\xc1\x9e\xfb\xc0\x3a\xa6\x5f\x48\x14\x17\x72\x27\x3e\xf5\x55\x4d\x73\xa9\xf0\x1d\xb3\x87\x1d\x7c\x42\xf3\x92\xc7\x94\xbd\x7d\x76\x98\x3c\xe3\x22\xef\xdb\xcc\x44\xd1\x0b\x7a\xec\x8a\x5e\xf6\x99\x35\xc4\x7b\x27\x2e\xea\xb4\x4c\x98\x49\xdc\x3a\x6c\x75\xfd\xb5\x92\xe4\x2f\x1c\x26\x4d\xe5\x64\xe7\xb6\xb5\xbe\x09\xbf\x07\x8d\x93\xac\x98\x41\x24\xd9\xed\x44\xd6\xb3\xc7\x39\x60\xad\x42\x45\xb9\x54\x3f\x16\x63\x1c\x6b\x5c\xe5\x2d\x58\x1c\x5a\x56\xfc\x99\x78\x5a\x3d\x3f\xe3\xcb\xb3\xf0\x9f\xda\x0d\xd8\x91\x67\x28\x6f\x3d\x7b\x45\xe5\x41\xce\x23\x45\xaa\x3a\x04\x6b\xdf\x52\xda\x4a\x72\x1b\x1d\xed\x0b\xa8\x22\xde\x0a\x6b\x88\x57\xb4\xa6\x25\x83\x5a\x3e\x8d\x75\xdd\xcd\xa4\x10\x31\x1c\x33\x84\x88\x7e\x5d\x31\x71\x0d\x08\x7a\x60\xc7\x37\xb7\x81\x1d\x7f\xa0\x0d\xec\xf8\xc6\x76\x10\xb7\x39\x77\xdf\x79\x6e\x44\x7c\xeb\x1c\xda\xc6\x64\x58\x2e\xec\x79\x60\xd9\x7e\xae\xdb\x55\x81\x4b\x60\xbc\xfd\x37\x2b\xac\x75\x5b\x95\x11\xad\x18\x10\xed\xe4\x2b\x9b\xc2\xed\xc1\x6d\xda\x0d\xa7\x18\x8f\xea\x2c\xf8\x6d\xe1\x8e\x15\x05\x19\x41\xf7\x5d\x4a\x52\x9a\x27\x37\x5c\xb7\x34\x42\x31\x4d\x2a\x56\x97\xdc\xe6\xc7\x95\x82\x64\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\x92\xf8\x41\x41\x64\xa6\xa9\xcd\xea\x44\x6e\x98\xbe\x63\x4c\x90\x97\x2f\x5f\xbe\x04\xd1\xe6\xe5\x1f\xff\xf8\x47\x02\xb9\xc6\x73\x96\xf1\x72\xfd\x45\x78\xeb\x5f\x5e\xbd\x8a\x19\xf4\xdf\xcf\xde\x7d\x05\x71\x46\x95\x56\xe4\x46\xea\xb9\x1d\xdb\x74\xd1\xe9\x5e\x8d\xc8\xff\xbd\xfe\xfa\xbd\xc3\xd7\x6a\xe5\x57\x90\x7f\xfc\x16\xc5\x8c\x1c\x2a\xa7\x5f\xfe\xe1\xf7\xbf\x8f\xfa\x06\x84\x24\x59\x43\x30\x77\x1b\xb4\x57\xb9\x70\x33\x21\xf5\x7a\xaa\x66\xcb\x3a\x45\x57\x8b\x2b\xf9\x6c\x0e\x07\x61\xee\xbf\x14\xd3\x82\x67\x1a\x89\x04\x26\x7e\x40\x90\xb0\xe5\x42\xa8\xcd\xba\x66\x65\x81\x28\x53\x53\xce\x46\xa4\xe0\xb7\x8c\x4c\xd5\xdf\x6a\xd9\x54\x6d\x6e\x44\x5b\xbd\x22\xa3\xc2\x8c\x8f\xc3\xb5\x70\xa7\x58\x74\x46\xd6\x7d\x78\x8a\x47\xda\x8a\xd2\xaf\x1c\x74\xbc\x22\x68\x8c\xb0\x78\xe3\x2d\x5b\x8e\x11\xba\x2b\xca\x7d\xd8\x1b\xb8\xdc\x22\x37\xd1\xe5\x47\xb2\xa8\x42\xd3\x6d\xb1\x4c\x17\x13\x5d\xd5\xf2\x1f\x08\x34\x5c\xb8\xb4\x63\x56\xa9\xa0\xac\x7c\x66\x73\x61\x8a\xd6\x6e\x1d\x31\x92\xcb\xe9\x6c\x78\x4d\x9b\x4d\xba\x4d\x69\x46\x2e\xa7\x61\xe0\x31\x24\x35\xe6\xca\x4c\x02\x6a\x3e\xdb\xb9\x45\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x11\x6b\xfd\x63\x38\x79\xd4\x18\x40\x1a\x60\xd2\xd4\xa5\xae\x6b\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x3a\xe7\xad\x8d\xb0\x65\xba\xb1\x47\x84\x11\xec\x8d\x28\x98\x52\x36\x42\xbb\xa4\xf5\x2d\xcb\x3d\x7e\x9e\x40\xd8\xb3\x8a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x92\x2e\x3b\xd9\x6f\xcc\x34\x8e\x27\x93\x63\x44\x2d\xb2\xc6\x80\x7b\xc4\x02\xe6\xf9\x13\xe5\xc8\xed\xdc\x2d\x28\xf3\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1b\xd1\x4c\xed\x5e\xc6\xe0\xbe\x24\xc9\x24\x5e\xb5\x83\x2d\x26\xbf\xb8\x7b\xb3\x7a\x38\x47\x93\x6b\x69\xc2\x51\x64\xb6\x71\x6c\xf7\xe5\x1c\xb7\x7b\x6c\xef\x5b\x2c\x7b\x9f\xcc\x60\x97\x51\xac\xcd\x86\xa9\x46\x8b\x72\x38\x46\xd7\x08\x16\xc5\xdf\xd8\xd4\x09\xfd\x15\x74\xdb\xf6\x24\x6c\x0d\xb6\xa7\x63\x6e\xb0\x5d\x4e\x57\xb3\x4b\x04\xe8\x2d\x64\x34\x1d\x1d\x8a\xc9\x01\xd5\xb6\x43\x70\x2b\xd8\xf6\xcc\xb3\x60\x4b\xe3\x5c\xb0\xa5\xf0\x2f\xd8\xe2\xdc\x4b\xb0\x6d\x7b\xb9\x9c\x3b\x0a\x6e\x8f\x25\x33\x48\x49\xa6\x7e\xf3\x31\x83\x6b\x15\x20\x96\x84\x3b\x65\xc9\x15\x5e\x2b\x7a\xa3\x64\xd1\x68\x1c\x22\xbd\x93\x90\xe6\xc1\x24\x5d\x4a\xf0\x38\x42\xb7\xda\x5d\x40\x29\x81\x13\x41\xf2\x94\xd2\xd7\xe1\x7c\x8d\x86\x6a\xd5\x43\xb5\xea\x7b\xda\xf3\xaa\x56\xed\x3e\xf3\x31\xcc\x9b\x8b\xff\xcb\x9a\x18\xa4\x0b\xfc\xfd\x73\xaa\x62\x8d\x2d\x53\x3c\x45\x31\xa5\x38\x39\x39\xf7\x19\x4f\x9c\x57\xf3\xa5\xd0\xac\x9e\xd2\x8c\x9d\x86\x0a\x2b\x56\xcd\x59\xc9\x6a\xb3\x41\xf6\x3d\x97\xda\xc3\x26\x74\x23\x37\x4b\x07\x7f\x84\x7d\xd2\xac\x36\x9b\xd9\x9a\x52\x0f\x5f\x6f\x07\xc7\xdd\x95\x4e\x0c\x3a\xdb\x8b\x3a\x0c\x7a\xee\x94\x07\xb5\x78\xad\xdd\x3c\xdc\x6b\xdc\x68\x15\xaa\x06\x63\x6e\xf8\xb9\x14\xc0\x3f\x00\x8a\x59\xca\xa6\x46\xa7\x07\x6f\x4f\xcf\x64\x5d\x1b\x9e\x05\x86\xa6\x8a\xd4\x6c\x66\x84\xd8\x1a\x2b\x25\xc3\x1b\x45\x63\x1e\xec\x34\x3a\x6c\xef\xf6\x63\x6f\x28\x7e\x20\x3e\x2e\xa2\x37\xcb\x61\x56\xb5\x5c\xf0\xdc\x31\x98\x21\x96\xe6\x8a\x54\x54\x05\xf9\x68\xa8\x52\x32\xe3\xa0\xa4\x6c\x4f\x30\x62\x24\x94\xf0\x81\x51\xf5\x59\x56\x3b\xf9\x1b\x42\x23\xb6\x84\x7c\xf9\x11\x9e\x70\x09\x47\x22\x64\xce\xae\x9a\x9b\x82\xab\xf9\xf5\x3e\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\xfb\x0c\x8a\x51\xe6\x4a\xa1\x38\xf0\x85\x86\xba\x19\x26\x96\x1b\xf1\x4a\xc2\x69\xb9\xfe\xc3\x2b\x26\x81\xc6\x17\xcc\xe6\xea\x3b\xbf\x7e\x38\xbc\x19\xdb\xfb\x76\x2d\x36\x03\x15\x56\x64\xc8\xd9\x37\xa2\xea\x3c\xcf\x68\x71\x7f\x25\xba\xb0\x75\x59\x14\x47\x97\x50\x1c\x70\x79\xab\x10\x00\xb9\x81\x4d\xb7\x47\x3c\x28\xae\x69\xb3\x70\x47\x1b\x75\x57\x36\x58\x91\x52\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x08\xb2\xa6\x41\xf2\x5f\xb8\x01\x83\x71\xf6\x9e\x36\x18\x67\x1f\x68\x83\x71\x76\x63\x3b\x88\x73\x4d\x9b\xb9\x97\x06\x49\x56\x3b\xb5\x66\x3d\x9f\x10\xcf\x71\xf4\x44\x45\xec\xd4\xe5\x05\x67\x75\xa6\x75\xcd\x6f\x1a\xbd\xa7\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x59\x80\xb0\xac\x32\xc8\x63\xc6\x80\xde\x44\xb3\x84\x13\xcf\xb9\x01\xd3\x86\x0f\x8f\x15\xc9\x65\xd6\xf8\x82\xc4\x70\x3a\xad\x37\x5b\x6c\xbd\xc2\x24\x3c\x9c\x5e\xce\x2b\x1c\xa4\xf7\x6a\xe5\xf2\x4e\x18\x6c\x77\x76\xd5\x93\x7b\xa2\x9b\x77\xa2\xfd\x2a\x14\x53\xdc\x63\x62\x9e\xd3\x1b\xd9\x68\x9f\xdd\xf7\x7f\x99\x99\x7d\x93\xde\x59\x4b\xd2\x28\xf6\xa0\x19\xbd\xd5\x26\x6f\x39\xc6\x60\xbb\x1f\x6c\xf7\x83\xed\xfe\xbe\xd6\xb9\xc7\x97\x68\x96\x0f\x8b\x3e\x77\xf0\x97\x4b\x95\x1c\xb3\x75\xfb\xb7\x86\xbe\x69\x31\x2e\x8a\x34\xab\x89\x2a\x56\xe4\x2c\xbc\xed\xad\x36\x3e\x70\x07\x75\x28\x19\x58\xe2\xa7\xb7\x9c\xee\xc9\x1e\x0a\xab\x8b\x92\xa1\xb1\x75\x23\x6e\xdb\x20\x69\x2c\xe5\x8e\x6e\x12\x81\x47\x46\x25\xf3\xd7\x58\xd5\x93\x0a\x21\x91\x1d\x50\x23\x5b\xf2\x7c\x64\x43\x5d\x80\x11\xae\x68\x86\x72\x69\xc3\x73\xc0\x04\x6d\xc4\x7a\x7f\xfc\x2d\xb6\xc4\x13\x20\xc9\xa7\x40\xe0\x24\x60\x81\x3d\x25\x84\xc2\x96\x7a\x24\xa6\xd1\x8a\x7f\xcb\x6a\x15\x95\xdf\xb3\x6d\xdd\x64\xd3\xf8\xbd\x3b\x09\x95\xcd\x59\x49\xe1\x9f\x6f\xdd\x02\xcc\xb5\x36\xfc\xae\x66\x98\xd8\x93\xd5\xa5\x11\xbc\x46\x1d\x7f\xf6\xa3\x45\x5c\x5e\x4c\xd7\x92\x85\x15\xe2\xc0\xb0\x3f\x05\xfe\x03\xcb\xbd\xea\x18\xd6\x0c\x08\x02\x7d\x2f\xb0\x50\xe6\x8a\x3b\x0c\x20\x2e\xdc\x9f\x3d\x2f\xed\x31\xd2\x15\xb6\x43\xf8\x01\x6c\x6b\xff\x1f\x79\xfb\x42\x97\xe5\x89\x1e\x78\xb0\xff\x0f\xf6\xff\x6e\x7b\xe6\xf6\xff\x80\xe4\x39\x0c\xba\xc1\xc0\x1f\x5a\x48\x9c\x95\xff\x86\x39\xd9\xc2\xca\x2f\xce\x74\xef\xec\xf6\xb2\xee\x3a\x9e\x1d\x4f\x26\xc7\xe8\x7a\xd6\x0a\x3c\x8d\x9e\x8e\xff\x44\x98\xc8\x64\x6e\xfa\xf9\x08\xfd\xd7\x4a\x03\xbb\xd4\x6a\xfe\xc2\xb9\x94\x6e\xac\xd0\x79\x0d\xfa\x4e\xa3\xab\x09\x68\xcf\x65\x98\x7d\xfb\x18\xe6\x22\x01\x7d\xb5\xcc\x87\xcf\x6d\x6b\xb7\xc2\xd7\x4a\xb0\x5c\x88\xfb\x5d\x91\x82\x97\xdc\xd6\x85\x35\xf7\x9d\x29\x1d\xab\xb8\x24\xe4\x04\x3f\x9e\x64\x55\x33\xb2\x1d\x4d\x4a\x56\xca\x7a\x39\xf2\x9d\x99\x1f\x3b\xbd\xdb\x37\xb0\x6a\x47\xd6\xd4\x35\x13\xba\x58\xc6\x26\xe6\x69\xdb\x81\xb8\x1c\xb7\x53\x7b\x64\x72\xfc\xe1\xc4\xa5\x8f\x6a\x5b\xf7\x46\xb6\xd6\x61\x50\xaf\xfb\xd5\x62\x59\x5e\x0c\x78\x1e\xb5\xb6\x73\xf3\x94\x89\x05\x59\xd0\x5a\xc5\xde\x00\xb2\x2d\x5f\x93\xf3\x05\x57\x7d\x95\x93\x1f\x58\xdc\xb5\xd7\x7d\x42\xc9\xc1\x46\x57\x8d\xb6\xe8\xce\x81\xb8\xab\x34\xe1\x41\x7b\x85\x7d\x7b\xd5\xaf\x02\x6e\x5b\x45\xb5\x66\xb5\x78\x4d\xfe\xf3\xe4\x3f\x7e\xf3\xd3\xf8\xf4\xaf\x27\x27\xdf\xbd\x1c\xff\xeb\xf7\xbf\x39\xf9\x8f\x09\xfc\xe3\xd7\xa7\x7f\x3d\xfd\xc9\xfd\xf1\x9b\xd3\xd3\x93\x93\xef\xbe\x7c\xf7\xb7\x8f\x57\x17\xdf\xf3\xd3\x9f\xbe\x13\x4d\x79\x8b\x7f\xfd\x74\xf2\x1d\xbb\xf8\x3e\xb2\x93\xd3\xd3\xbf\xfe\x2a\x61\x92\x54\x2c\xbf\x8e\xc6\x29\xd8\xc6\x5b\xd1\x95\xee\xb7\x89\x47\xbf\xc2\xfb\x71\xa1\xc7\xb2\x1e\x63\x27\xaf\x21\x0b\x7a\x74\x57\xee\x68\xb7\xbf\x23\x2d\xd5\x6a\xab\x9e\x38\xf6\x78\xcf\x97\xe0\x71\x1c\xf0\xd6\x8e\x5d\x60\x2a\x7a\xc3\x77\x9a\x7d\xc0\xf5\xd9\x0d\x92\xd2\xac\xac\x64\x4d\xeb\x25\xc9\xad\x72\x6b\xf9\xa8\xa4\x6f\x8f\x4c\xac\x0e\x93\xcc\xf9\xc3\x30\xbe\x07\x55\x71\xc9\x72\xde\x94\x7b\x49\xcb\x06\x3d\x87\x9b\x7e\x07\x65\x47\x6c\x51\x13\xe7\xeb\x63\x5f\x73\x25\xb9\x68\x76\x8b\x82\x8a\x3f\x95\x38\xfd\x61\xa7\x16\xc5\xd1\xd1\x4a\x8d\x6f\xd0\x4d\x83\x13\x8c\xcc\xd9\xb1\xf2\xef\xe2\xe0\x89\x4a\x62\x34\x67\x5a\xdf\xc8\x13\xdb\xd5\xa9\x61\x04\xdf\x01\xaf\x70\x80\x34\xfc\x51\xd0\x42\x12\x93\x37\xf1\x7f\xb2\xaf\x0c\x57\xb4\x97\x08\x6f\xd7\xb9\xaf\x08\x2e\x41\x98\xb3\x89\x17\xa7\xa4\x90\x59\xe0\x00\xd6\x61\x06\x00\x1c\x2e\xdc\x25\x8e\xb7\x15\x1a\xa0\x30\xe3\x22\xaf\x07\xca\xd0\x42\xa1\x77\x0b\xcf\xa0\x40\x1b\x88\x86\x70\x66\x09\x90\x60\xba\x2d\xe9\x27\x5e\x36\x25\x69\x94\x99\xad\x14\xdd\x5e\xda\xc9\xde\xb9\x3a\x73\x90\xca\x8e\x0b\xf8\xa8\x23\x1a\xc7\xa8\x28\xe7\x8c\x5c\xfb\xfd\x6b\xd5\x21\x68\x4a\xb7\x92\x9c\x6a\x40\x90\xb0\xf3\xb0\x6c\xb2\x9c\x82\x63\x85\xe7\xd8\x94\x2f\x55\xb6\xc5\xa5\x12\xbc\xe8\xde\x2a\x57\x44\xc8\x6f\x6f\x23\xac\xbf\xe2\x73\xba\x01\xcf\x98\x37\x8a\xe6\x88\xd2\xf9\xa0\x44\xee\xe7\x11\x3c\x8f\xf7\xde\xdc\x29\xc9\xf6\x2e\xa1\x1d\x9a\x1d\xd6\x2f\xea\xba\x87\x52\xe7\x49\xe8\x51\x48\x5c\x9a\x9d\x8f\x5e\xa7\x63\x49\x7d\xb6\xcc\x6c\x0a\x3f\xde\xa9\x03\x87\x83\x22\x7c\x43\x18\xdb\xd8\xfc\xc7\xe9\x7e\x9c\xf9\xf1\x86\x4d\xd1\xbd\x09\xbf\x01\xd9\x5d\xf5\x85\xce\xa1\x46\xab\x60\x1a\x62\xf1\x98\xaf\x0e\x88\x7e\x57\xa5\x5c\x44\x14\x10\xfe\x46\x59\x83\x33\xef\x05\x28\x7a\xda\x89\x93\x57\x28\x62\x0b\xc6\x72\x8c\x05\x2c\xda\xf9\xd7\x8d\xe8\x9d\xfd\xcd\x29\x99\x32\xaa\x9b\x1a\xbd\x7f\x84\x91\x72\x0a\x27\xc0\xa1\xda\xa9\x66\xe6\x50\x20\x05\x62\x2d\x4b\xa2\x04\xad\xd4\x5c\x6a\x50\x9d\xd0\x8a\x66\x5c\x47\x84\x97\xe9\x9a\x66\xb7\x50\x63\xb9\x66\x76\xb6\x7d\x53\xcb\x4e\x6d\x14\x43\x08\x11\xdd\xd8\x47\x3d\xaf\x65\x33\x9b\x43\x28\x1e\xbe\x95\x15\x54\x61\xcc\x65\x9f\x91\x7d\x63\xef\x56\x31\xa0\x48\xbe\x14\xb4\xe4\x99\xaf\x34\x55\xcb\x05\x57\x5c\x5a\x23\x15\x8c\xda\xbf\x68\x4a\xae\x7c\x19\x20\xb4\x8c\x9d\x17\x94\x97\xe4\x44\x31\x46\x2e\xdc\x25\xc1\x5f\xae\x51\x40\x40\x75\x67\x8c\x83\x55\x68\x54\xb3\xa9\x8f\x6d\xe6\x14\xf3\xc4\xa9\x6e\x03\x37\x86\x98\x84\x58\x16\x9e\x37\x4e\xbb\xbf\xc0\xaf\x01\xe3\xcd\x2b\x96\x35\xf8\x0b\xba\x6a\x78\x4c\xe4\xb2\x75\x8f\xe9\xe9\xf5\xec\xea\x52\x85\x6a\x05\xbc\xcb\xb6\xc0\x12\xfc\x60\xd3\x2d\xfb\xbc\xb2\x1e\x13\xf4\xf4\x6c\x08\xac\x80\x42\xcc\x0b\x9e\x37\xb4\x40\xd2\x1a\xb1\xc8\xf3\xeb\x4b\x1c\x98\xcf\xe6\x7a\x7c\xc7\x40\x11\x8c\x3c\x50\x8b\xfb\xdc\x74\xf9\x9a\xd3\x36\x57\x40\x84\x23\x6a\x30\x5b\xc5\x34\x2e\xf9\x8e\x2e\x21\xff\xbc\x75\xfe\xed\x78\xfb\xb8\x9a\x30\x38\xc0\x54\xf6\x51\x99\xd2\xd1\x6f\x0b\x42\xbd\xcb\x3e\x03\x94\x92\x51\x01\xcc\x38\x68\xf4\x0d\x3c\x01\xd6\x58\x5f\x73\xff\xfd\x0b\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xaf\xcc\xb6\x07\x69\x6a\xd1\x42\xec\x47\x56\x56\x05\xd5\x7b\x71\xc0\xf9\x7b\x60\x72\x08\xec\xe1\x06\x89\x51\x91\x8f\x69\x61\xae\xca\xd5\xb7\xe7\x36\xe0\x15\x11\x4f\xa2\xa7\xdd\x47\x47\x84\x84\xaf\xa5\x6c\xd8\xf0\x8d\x38\x07\xb2\xa7\xde\xb0\x1c\x28\x88\x9d\x5b\x9c\x93\xb0\xbc\x13\xac\x76\xb0\x77\xf5\xed\xf9\x88\xf0\x09\x9b\xb8\xbf\x7c\x67\x8e\x3c\x6a\x39\xc3\xd0\x19\x17\xa2\x16\x63\x5b\x97\xf9\x04\x97\x13\xea\xf7\xc3\xde\x7f\xf8\xb3\x59\xa8\xf9\xf5\x2f\xe3\x3f\x07\xb5\x0b\xff\xf2\x83\xa1\xc7\x51\xbe\xaa\x3f\xac\x7c\x17\xc6\x5c\x00\xd1\x33\x7f\xfd\x70\x65\xcb\x16\xdb\xa2\xc6\x3f\x44\x3a\x55\x10\xc2\x84\xae\x97\x13\x72\x25\xc1\x0f\x8f\xe7\x78\x65\x61\xfe\x35\xfb\x87\x33\x0b\xc1\x71\x79\x0d\x7a\x46\x35\x13\xc0\x95\x3c\x58\x01\xb8\x6d\x36\x03\x00\x0c\x00\xc8\x89\xc2\x2e\x9d\x80\xea\x15\xd3\xe1\x8c\x88\x96\x98\x9c\xbe\x1f\x97\x9b\x76\x26\x08\xfb\xc4\x15\x64\x3f\xc3\x1d\x87\x63\xa3\x36\x24\xc4\x31\x72\x66\x58\x03\x09\x3e\x67\x5e\x25\x63\x7c\x37\x60\xfd\xbf\x16\x52\xff\xda\x5f\x06\xe7\x51\x0a\x1c\x9b\x24\x74\x21\xb9\xab\xb1\x6d\x10\x8f\x00\x23\x4b\x54\xa2\x09\x7b\x9e\x37\x4b\x52\x72\xa5\xe9\x2d\x9b\x90\x6b\xc3\xce\x85\x4e\x26\x78\xca\x82\x40\x2d\x3c\x96\x93\x46\x68\x5e\x44\x4a\x74\x7e\x2e\xb0\x31\x01\xab\x07\xa9\x25\x9a\xcc\xf0\x24\x55\xcd\xc6\x8e\xb5\xc4\xb7\xa2\xf4\x2e\xb6\xaa\xa7\xdb\x93\x76\x4f\x47\x1e\xf4\xe7\x14\xd5\x22\x55\x0e\x9d\x5b\x4f\xed\xe8\x0b\xbb\x16\x4d\x61\x76\x43\x8a\xac\x65\x1d\xe1\xd8\xd5\x84\xbc\x07\x7e\xb0\x88\x01\x72\x74\x1a\x43\x3d\x90\xb5\xb2\x09\x96\x31\xa5\x68\xbd\x44\x27\x76\xee\xab\x6b\x37\x8a\x4d\x9b\x02\xd8\xe5\x98\x2d\xa1\x02\x2b\x99\xd7\x2c\x93\x42\xe9\xba\xc9\xe0\x1c\x29\xb9\xa9\xe5\x2d\x13\x6d\x18\x52\x14\x62\x0c\x3d\xee\x5b\xd7\x66\xc3\xf6\x08\x49\xb2\x39\x15\x33\xe6\x53\x80\x90\x92\xe6\x00\x45\x5f\x7a\x01\x2b\x66\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\x37\x86\x23\x73\xf6\xc8\x98\xc9\x7e\xf0\x41\x00\x65\x60\xbc\x14\xbc\xd8\xb1\x23\x6f\x8a\xad\x6a\x0c\xfc\x77\xbf\xe0\x9e\x64\x9b\x2a\x99\xa6\x39\xd5\x74\x9f\x71\x1a\xef\xa8\x2f\xe3\x6e\x7d\xa1\xe0\xd0\x03\x1f\x29\xcb\x66\x39\xa9\x50\x56\x3c\x4c\xec\x72\xf5\xed\x79\xe4\x48\x20\x06\xc2\x39\x43\xde\x48\x6d\xee\x91\x35\xcf\x03\xe4\x61\x68\x8c\x8b\xc5\x30\x93\x70\x63\x22\x39\x60\x39\xc9\x9b\x04\x6d\x7f\x4b\x54\xe2\xec\x99\x89\xd6\x4c\x73\xde\xfb\x3c\x98\x8f\xad\x9b\x50\xd6\x8d\x2c\xd8\x28\x4c\xa0\x05\x9e\x09\xcd\x6b\x16\xa4\xf7\x89\x1c\xcc\x9e\x6a\x23\xf0\xa6\x77\xcf\x17\x01\x60\xc6\xb4\x6a\x5d\x92\x91\xfc\x47\xf7\xaf\x2d\xe3\x88\xb3\x04\x5e\xd6\x9d\xb9\xd5\xdf\x6d\x5c\x54\x64\xef\x08\x37\x4a\x5a\x32\x6f\xd8\x9b\xbd\x1c\xf9\x36\xb6\x65\x9a\x19\x6c\xff\x4e\xe6\x29\xe6\xe8\x6d\xbd\x0f\x3a\xc3\xb5\xe1\x69\x18\x15\xa9\x40\xf9\x8c\x2f\x80\x43\x8c\xea\x24\x37\x42\x1a\x35\xa7\x8b\x84\x54\x2a\x5b\x6b\x3c\x5b\x39\x67\xec\xab\xf0\xc2\xc4\xc6\x30\xb1\xf1\xab\xe8\x29\xa4\x38\xf2\xba\x16\xed\xd0\xdb\x1d\x24\xd1\xea\xfa\xa8\x44\x10\xae\x19\xf4\x7f\x9d\x68\x71\xdd\x1e\x7a\xda\xd1\x2c\x33\x60\x9d\xa8\xbc\x03\x9e\x0d\xf6\x67\xdc\xa0\xed\x94\x1d\xfc\x75\x87\x6d\xb6\x82\x96\xd7\x99\x61\x38\xe5\x89\x53\xa2\x4d\x2c\x98\xb8\x3c\x95\xdd\xd7\x4f\xb7\x1e\x16\x38\xff\xcd\x5a\x9c\x84\x3e\x2f\xad\x3f\xb1\x93\x41\x8d\xac\x57\x83\x0d\xcd\x85\xf1\x9b\x8b\x57\xcb\xa2\x60\x35\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\xc7\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\x9d\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x29\x57\xfd\xef\x4e\x8d\x7b\x26\x96\xb8\x75\x6f\x02\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\x9b\xc2\xb0\x68\x01\x48\xf9\x19\xad\xf0\x12\x5a\x06\x6f\x7d\x60\xd3\x94\xed\x00\x3d\x73\xf8\x71\xdc\x28\xc8\x8c\x74\x3e\x9c\xb4\xbe\xdf\x56\x7a\x4b\x4a\x32\xee\x9a\x85\x8e\x4e\x67\x5d\x7f\xcb\x95\x71\xc3\xbc\x77\x1b\xe7\x1a\x3f\xfa\x16\xfe\x58\xdb\x78\x64\x41\xf6\x34\xde\xab\xcb\xea\x7e\x10\x29\xaf\x63\xdb\xc6\x85\x0b\x3c\xd5\xc1\x15\x34\xcd\x1f\x67\x7b\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x61\x06\xff\xb4\x49\x21\x53\x20\x8a\x20\x54\x85\x23\x6d\x70\xe2\x6d\xaf\xf7\x97\x50\xd4\xd4\x9a\xf6\x5d\x4a\x0a\x43\xa6\xcf\xae\x2e\x71\x7e\xa9\xa3\xbf\x05\xfc\xb6\xb4\xcc\xba\x9e\xf3\x3a\x1f\x57\xb4\xd6\x4b\x54\x76\x8e\x3a\x73\xf3\x51\xf5\x49\x83\x6c\xe9\xd7\x14\x57\x06\x39\x6c\x9d\xe3\x86\xad\x72\xc6\x7b\xeb\xc3\x71\xef\x99\x1d\x62\x3d\xf1\x51\xf9\x1b\xd7\x13\x16\xb1\x74\x8a\xc1\x27\x5c\xcf\xe3\x23\x0e\x48\x17\x57\x1e\x96\x07\x32\xc8\x59\x75\xbd\x1e\x91\x51\x01\xe9\xc7\x2a\x90\x65\x18\x1c\xeb\xb9\x69\xd0\x3d\x99\x9e\x46\x84\x4f\x0d\x91\x96\x62\x0c\xd6\xfd\x84\x89\xb4\xc6\x4c\xcb\xbb\x4f\xac\x83\x3d\x6a\x8b\xe0\x42\x06\xf3\x09\x06\x69\x6f\x3a\x39\x11\x32\x46\x99\xe4\x1a\xe0\x09\xec\xf5\x14\x63\x1f\xee\xb1\x5c\xdd\xa4\x24\x9c\x24\x2d\xf7\x10\xaa\x99\x02\x0c\xe6\x18\x18\x2e\x72\x03\xa4\x40\x12\x41\x01\xa5\x9a\x2c\x63\xcc\xab\x80\xed\x25\x4d\x61\xdd\x3b\xb8\xd1\x6e\x58\x49\x75\x36\x67\x8a\x28\x09\x59\xd5\x95\xa6\x45\xc1\x72\x6f\xd6\xc4\x03\x95\xc0\xd7\x59\x93\x67\xc2\x88\x01\x63\x98\xb2\x41\x81\x0a\xce\xea\xc0\xab\x82\x5a\xe5\xe3\xb4\x11\x19\xfa\x0c\x73\xbd\xf4\x56\xad\x55\x66\x1d\xf4\x36\x0a\xf4\xac\x29\x0c\xe5\x14\xed\x56\x81\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xb6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x09\xce\x82\x44\x1d\x23\xe4\xc6\x42\x96\x49\x1c\x87\x4e\x41\x5c\x6c\xcf\x20\x86\x6b\x3b\x09\xb6\x6c\x8d\x71\x3c\xf5\x0c\xa3\x62\xbe\x1c\xb8\x4a\xe1\x5a\x88\xf5\x82\xa2\x8d\x96\x25\xd5\x3c\x03\xf5\x2c\x9f\x06\x46\xde\xd2\x17\xe5\xf3\x4e\x4e\x48\x54\x81\xa8\xdb\x5d\x4f\xbe\x56\x9b\x99\xcd\x47\x6d\x5b\xb0\x53\xf6\x34\xba\x9b\xe2\x96\x1a\xb0\x1a\xc9\x73\xff\xe8\xf2\xa6\x10\x3d\xaf\x19\x23\xbc\x34\x62\x12\x15\x9a\xe4\x7c\xea\xf3\xe5\x38\x9b\xfd\x43\x67\x97\x26\x89\xfe\x1d\xfc\x41\x82\xfe\x50\xd5\x5d\x14\xf2\x4e\x11\x7d\x27\xbd\xda\xad\xb5\xe5\xda\x7c\x29\xa3\xee\xb0\x49\x14\xd4\xf6\x6f\xd0\xb6\x39\xe9\x00\xd3\x8e\xcc\xad\xbd\x63\x45\x61\xfe\xff\x10\xbe\x4d\x88\xf4\xda\xb8\x4e\x3e\x13\x98\x88\x83\x2b\xa7\x66\xb5\xf1\x64\x27\x79\x2d\xab\xca\x9a\x81\xca\xd3\xc7\xac\x13\x5c\x9b\xea\x05\x53\xe0\xa6\xe7\xa2\xd9\xcc\x91\xcd\x98\x60\x35\xd5\x60\x08\xb7\x19\xb4\x81\x38\xae\x4e\x27\x5e\x6d\x89\x6d\x2b\x39\xad\x07\x0c\xd0\x6d\x61\xf3\xb1\xbb\x77\xec\xaf\x49\x73\xe5\x02\x21\xc0\xdd\xd8\xa4\x23\x3d\xf9\x82\x69\x7a\x4a\xbe\x51\x78\x50\x9e\x5e\xf8\x28\xc1\x28\xe9\xdc\x66\x39\x42\x01\x3d\x69\xf8\xb3\xa2\x9a\x07\xe3\x87\x52\xae\x0f\xb5\xee\xee\x54\x67\x66\xe7\xb5\x54\xea\xbd\xfb\x64\x2f\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\x87\xdb\x20\x01\x1f\x7a\x3d\x80\xef\x0e\x79\x27\xdf\x87\x0c\x61\x17\x51\xef\x6c\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\xde\xab\xf4\xa4\x80\xd3\xef\xe8\x72\x22\x98\xb6\x79\xe8\x9c\x6e\xff\x83\x1b\xfd\x6f\xb5\xe1\xfc\xac\x80\x16\xdc\x22\x77\x81\x5d\x12\xc1\x60\x14\x2d\x91\x14\xb7\xde\x37\xf0\xfc\x58\x59\x8f\x0e\xf3\x3b\x04\xdb\x93\x4e\x49\x96\x09\xb9\xb6\xde\x82\x2b\x83\xaf\xa7\x0a\xcb\x99\xa6\x3c\x2e\x0f\x65\xd8\x1c\xa5\xfc\x78\x0f\x8d\x3e\x00\x25\x24\xdb\x81\xac\x0f\xdd\x3c\x84\xaa\xa5\x0d\x81\x0e\x3c\xe2\xc3\xa8\x92\xf6\x85\xc7\x5b\x2a\x2f\xa7\xe4\x03\xcb\xe4\x82\xd5\xb8\xdf\x17\x9f\x2a\x2a\x8c\x98\xfe\x96\xf2\xc2\xec\xb6\xdb\xf5\xd6\x7a\x01\x45\x90\xbb\x6e\x09\x81\x11\xcc\x5f\x23\x7b\xb4\x06\x72\x52\x98\x41\x9f\xf3\xce\xf4\x6c\xfd\x74\xab\x9a\x2d\xb8\x6c\x94\x8b\xa7\x69\x34\xd2\x31\xa5\xad\x6c\x3a\xe7\xb3\xb9\x7b\xd9\xf9\x99\x83\x07\x50\x9d\xfb\xab\x92\x30\x07\xa5\xa9\x6e\x54\x37\x51\x4e\x06\xee\x04\x4f\x62\x03\xf6\xe7\xbd\x5f\x86\x6f\x3b\xe6\x0a\xe3\x8f\x0e\x89\xc6\xbf\xc2\x88\x27\xec\xe4\xc6\xde\x02\x17\xa6\xd5\x86\x99\x65\xb2\xac\x1a\xcd\x82\xdb\x62\xa1\x35\x15\x6d\x25\x1e\x64\x27\xef\xe5\x8b\x92\x0a\x3a\x63\x63\x3f\x89\x71\x1b\xa1\xf5\x62\x0b\xac\x95\x78\xa4\xe4\x11\x89\x17\xc3\xf6\x8c\x23\xab\x56\x16\x9b\x1e\x79\x4e\x1e\x19\x7d\x4e\x1e\x13\x81\x4e\x76\x19\x85\x4e\x7c\x2a\x8b\x43\x5e\xc7\x0f\x76\xcc\xd5\x0b\x69\x89\xd5\x43\x17\x72\x3b\x91\xc0\x12\x2d\x3b\x2a\x57\x44\x96\x5c\x6b\xe6\x1c\x99\xfd\x05\x1b\x11\xae\x3b\x99\x16\x2c\xe2\x00\xa5\x39\x7a\x23\xb3\x4f\xbe\xac\x76\xcb\x98\x25\x4e\x06\x84\x9f\x3b\xae\x90\xf1\x12\x84\x97\x15\x16\x66\x01\x04\x30\xb6\x71\x92\x4e\x35\xec\xe7\x9d\x81\x2f\x21\x61\x9f\x40\x91\x8f\x53\x1b\x30\xd3\x80\x99\x56\xda\xcf\x01\x33\x61\x16\x8b\x94\x24\x2b\x1d\x8c\xe4\x3e\xb7\x39\x2e\xe9\x0d\x2b\xc8\x8f\x0d\xab\x97\xc4\xb0\xad\x6d\xa4\x17\x54\x03\x57\x3c\xc7\x98\x26\x67\x35\xdb\xb3\x96\x6c\x3b\xa6\x09\x2c\x6d\x17\x9f\x0c\x77\x0f\x39\xdb\x1e\x81\xaf\x57\xbb\xea\x66\x02\xc5\xdd\xf2\x3b\x18\xf2\xe4\xe8\x74\x1a\x3e\x01\xb6\xfb\xec\xfd\x9b\xed\x04\xaa\x34\x67\x43\xb2\x8d\xc3\xe1\xda\xe2\x93\x89\x15\x21\x67\x0f\xec\x09\xee\x9d\xff\x05\xa8\x84\x77\x17\xf5\x3a\x7b\x72\xcb\x96\x23\xeb\x0e\x4e\xcc\xe9\x53\xf7\x72\xf2\x64\x30\x2e\xa4\xad\x5a\x68\x3a\x8d\xcd\xbe\xdd\x6d\x5b\x23\xe1\xed\x14\xbd\xd8\xe2\xcb\x45\x76\xbf\x72\x9b\x96\x8a\xeb\xb7\xa6\x12\x49\x65\x25\xc3\x76\x5f\x89\x49\x84\x21\xa8\x07\xe7\x72\x23\x78\xb0\x81\xac\x13\x80\x90\x52\x0f\x91\x6c\xaf\x50\xc3\xe6\x36\xf6\xd1\x4b\xdd\xe2\x62\x85\xe3\x77\x63\xf9\x6f\xd9\xf2\x58\xd9\xa4\x77\x52\xa8\x39\xaf\xb0\x04\xaa\x62\x80\xa3\xb6\x03\x78\x6c\xdf\x82\x6b\xbb\x1b\x16\x31\xd8\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x40\x68\x12\x5c\xab\x37\x92\xa9\xf7\x52\xc3\x93\x83\x9f\x0b\x2e\xf1\xa9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x2e\x05\x91\xb5\xdd\xca\xad\x06\xd6\xae\x88\xb2\xb2\xc3\x3a\xeb\x43\x6b\xd4\xdf\x34\xae\x3d\x35\x59\x77\x0e\x6d\xc7\x53\xb0\xc3\x83\x2e\x12\x7f\x01\xed\x2a\x78\x97\xb8\x90\x1a\x2c\xdb\x4b\x35\x9b\x25\xb9\xba\xb4\xad\x64\xf5\x0c\xb2\x3c\x66\x09\x05\x1f\x83\xc9\x6f\x49\x58\xb1\x6d\x45\x5e\xc3\x81\xb7\x04\xf6\x1d\xf9\xf8\xef\xb8\x2b\xe0\x93\xbe\x82\x50\xae\x43\x4a\xc7\xc1\xb0\xc8\x5d\x94\xb4\x32\xb7\xef\xbf\x0d\x13\x01\x80\xf9\x3f\x50\x33\x5d\x4d\xc8\x19\x51\x5c\xcc\x0a\xd6\xf9\xcd\xaa\xf9\x83\x6e\x92\x27\x00\xd6\x37\x43\xe3\x17\xb4\x60\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x1d\xdd\xb2\xe5\xd1\x28\x51\x91\x4a\x42\x9a\x60\x3a\xb9\x14\x47\x6d\x4a\xda\xce\xbd\xf4\x7c\x16\xf8\x1b\x1c\xc1\x6f\x47\xbb\xe6\x51\x9f\x48\x48\x7d\x32\x37\x51\xab\x54\x3e\x2f\x28\x1a\x56\x0e\x61\xbe\x58\x1d\x73\x53\x51\xc2\xeb\xe0\x9d\xd6\xa4\x65\xa3\x97\x9f\x50\xd3\x0e\x19\x61\x92\xc3\xac\x92\x0e\x76\xb5\x0c\xd0\x41\xcf\xe6\xde\xc1\x83\x60\x6b\x9f\x53\xdc\x9c\xc5\xb7\x9b\x3e\x08\x62\xcd\xb9\x4a\x3f\xae\xcb\xe9\xaa\x8f\x42\x90\xee\x24\x8c\xe2\x91\xb5\x8d\x5a\x5f\xf3\x21\x86\x0a\x89\x6d\x25\xa5\xd8\xda\xa9\x6d\x6b\xdd\x1f\x6a\xa6\x2a\x89\xfe\xb5\x1b\x17\x6b\x59\x84\x39\x55\xe0\x93\x35\xb5\xe6\xd6\xaa\xa9\x2b\xa9\x6c\x79\xbb\x55\x90\x4f\x8c\x5c\xb2\xe1\x64\x2e\xc8\x14\xc3\xc0\xfd\x4d\x30\xf7\xc7\xe7\xa5\x3e\x5b\xc9\x49\x28\x6b\x48\xd6\x66\x1d\xc4\x44\xce\x33\x2b\x4f\x52\x4d\x44\x5f\xc2\x98\xb0\x6d\x3e\x68\xe7\xfb\x89\x22\x8d\x4f\x92\x85\x47\xee\x58\x37\x9c\x25\x13\x1a\xac\x82\x82\x5c\x8a\x29\xa3\x8a\xdf\x14\xcc\xba\xb3\x29\x4d\x75\xd2\x9e\x04\x4e\x5c\x76\x6f\x8c\x30\x01\x94\x8b\x6b\xb5\x6a\x0e\x3c\xe1\x22\x2b\x1a\x38\x41\xc1\x8b\x53\x50\x04\x51\x91\xb1\x02\x29\xa7\xcc\x7d\xac\xf0\x16\x11\x4b\x81\x39\x73\xca\xea\xda\x96\xc3\x5b\x6e\xbe\x49\x24\x97\x0c\x9d\x70\x20\xb8\x6e\x84\x0b\xd9\xec\xbb\x68\xb7\x36\x05\xb1\xe2\x0e\x50\x72\xc5\x10\x5e\x71\x5f\xb1\xda\xea\xb4\x08\x2a\xf2\xd8\x55\x5b\x8f\xb7\xeb\xc0\x9a\x39\xc2\xc4\x15\x36\xeb\x44\x98\x90\x3b\x61\x22\x36\xe1\xc3\xfe\x31\x34\x6e\xf2\xb8\xbd\xe9\x63\x40\xd0\x2c\x41\x41\xbd\x35\x86\x8e\xab\xa8\xe5\xda\x63\x51\x32\x94\x17\x70\x29\xe7\x3a\xc9\x53\xdb\x78\x87\x47\xd3\xc9\x6f\xe1\xba\xc8\x29\x79\xdb\xd6\x80\xe5\x0a\x0c\x16\xdc\x25\xa4\x33\xc0\x8b\xf7\x09\x0d\xe7\x78\xb9\x0d\xbe\x4e\x55\xa4\x6e\xb1\xe7\x8f\x20\x83\x6d\x07\x8e\xdf\x70\x51\x13\x6b\x09\x4c\x56\xef\x23\xb8\xea\x7b\xdf\xd1\xc4\x5d\x8d\x5c\xeb\xb4\x27\x29\x42\x67\x2d\xd3\xac\xab\x3f\x79\xcb\x6f\x6a\x46\xce\xe7\x54\x08\x56\x04\xf9\xa1\xad\x11\x8b\x6a\x4d\xb3\x39\x62\x26\x4a\xcc\xbd\x2a\x98\x3e\x56\x64\x2e\x95\x26\x25\xcd\xe6\x5c\xf8\xe4\xa1\xc2\x67\x23\x6f\xb3\xb9\x1c\x3c\x75\xd6\xde\xab\x36\x5b\x08\x08\x4b\x1d\x77\x8a\x39\x47\xf4\xe4\x93\x00\xaf\xf5\xd2\xd6\x49\xb4\xf7\x10\xf6\x19\xa5\x1c\xc0\xca\xf0\x6e\xcc\x18\xf7\x97\x94\x26\x97\xa5\x37\x4c\x72\x11\x10\x1e\x66\x3f\x20\x7c\x4a\x1a\x91\xe0\xe2\x9d\x70\x27\x8b\x26\xa2\xa6\x51\x37\x7b\x79\xd1\x08\xb3\xe9\x6d\x95\x9a\xb7\xe7\x44\xd3\x7a\xc6\xb4\xe9\x8d\x88\xa6\xbc\x61\x75\x7f\x1a\xf3\xfd\x15\x56\x3b\x48\x1d\xd4\xce\x0e\xf4\x94\x2f\x25\x1f\xdc\x57\x10\xee\x01\xdc\xc0\x54\xc6\xd1\x61\xf4\xd1\x73\xc5\x57\xb1\xf4\x9e\xc1\xd5\xdf\x5a\x52\xd2\x88\x18\xea\x9c\x52\x1f\x15\xcf\xf2\xef\x7f\x7f\x9f\x5a\x9c\xee\xb8\xfd\xf2\x3e\x00\xb9\x93\x75\x91\xdf\xf1\xdc\xba\x63\x92\x13\xf3\xf2\x69\x2c\xb0\xec\xb8\x56\xdd\xf6\xa9\x74\x53\x75\x53\x77\x77\x3c\xdf\x4b\x9d\x59\xe8\xb8\xbb\xd3\x4e\x74\x32\x3b\x4d\x60\xab\x79\xce\x84\x36\xa8\xa3\x56\xe4\x04\xbe\x88\xc9\xf5\x70\xc1\x31\x23\x1f\x8c\x00\xd5\x70\xca\x1b\x2e\xda\xa4\x92\xed\x59\x1b\x72\x63\x6e\xbe\xd3\xb6\x2a\xa6\x31\xaf\x17\x44\xf4\x4b\x3d\x27\x8a\x97\x4d\xa1\xa9\x60\xb2\x51\xf1\x25\xe8\x3f\xcb\xe3\x9e\x16\xec\x13\xde\xcd\x5d\x26\x4e\x6e\x7b\xed\x72\x0b\x10\x4f\xd4\x66\xa3\x5d\x65\x17\x7a\x7a\x6d\xc3\x34\xf3\x17\x9e\xb1\xf0\x59\xf5\xd8\x27\x96\xd9\x7c\x1a\x55\xd1\xcc\x78\xaf\x44\xf5\xc6\xcc\xcc\xc8\xa4\xf9\x6b\xf2\xb6\x9d\x30\x44\xef\xba\x5f\xb0\x44\x31\xd8\xed\xed\x40\xe4\xfc\xfa\xf2\x8d\x4d\x7f\x2a\x94\x66\x74\x57\x3c\x4a\xac\xa9\x73\x6c\xd5\x11\x3b\x62\x78\xb0\xb3\xc4\xcb\xde\xe6\x7f\x5d\xd5\x9e\xd9\x5f\x6c\xad\x03\x9f\x37\x3f\x36\xe1\x67\x02\xd0\x0f\x9c\x1a\xb6\x07\x38\xb5\x30\x75\x7e\x30\x81\x9c\x55\x4c\xe4\x50\x8c\x2f\x80\x7b\xdc\xa5\x9d\x1e\x91\x2d\x1c\x97\x4a\x97\x5d\xbd\xb9\x0e\x51\x0e\xf4\x2e\x73\x59\xe4\x8a\xb0\x4f\xba\xa6\x06\xcd\x97\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x44\xd5\xcf\xe7\x54\x20\x9c\x3c\x09\x17\x98\xff\x9c\xb8\x40\xc5\xb2\x9a\xe9\xa8\xc0\xe2\x2d\xca\x86\xb8\xce\xbb\x1b\xd8\x79\xbc\x26\xca\xe3\xaf\x2e\x3c\xa6\xad\x0d\x1c\x35\x9e\x50\x1c\x8a\xf0\xad\x54\x1c\xae\xa8\x52\x5e\x3a\x06\x22\x67\xaf\xad\xea\x64\x9a\x88\x18\x02\x35\xb5\x7c\x4a\x84\x5c\x99\x69\x18\x08\xe4\xf5\xa8\x9d\x57\x22\xba\xf7\x16\xb3\x12\x0b\x11\x50\x01\x21\xf5\xd8\xcd\x08\xe2\x8c\xf1\xdf\x68\x34\x33\xeb\x0a\xe4\x7e\x58\x59\xcc\x3e\xd9\xb5\xef\xf6\xb2\xa7\xb9\xf2\xc4\x47\xbf\x6d\xa7\x87\x7b\x1f\x10\x57\x17\x50\x15\xab\x02\xea\xe6\x88\x65\x50\xb9\x93\x2f\x18\x64\xa0\x75\x09\x59\x0d\xe3\x9b\x37\x18\xb4\xe4\xd2\x42\x74\x93\x3d\xc4\x07\x77\x07\x21\x37\xad\x17\xc3\xa5\x50\x9a\x42\x5e\x00\x58\x85\xa1\xaa\x86\x00\xda\x5c\xbf\x16\x10\x51\x5b\xee\xb2\x0b\x44\x0f\x57\x1a\xa2\x99\xb1\xda\xc0\x5a\xb1\x24\x77\xb5\x8c\x77\xaa\x4c\xd4\xfb\xca\x05\xab\x17\x9c\xdd\xbd\xb0\xd1\x70\x63\xb3\x80\xb1\x0d\x28\x7f\x01\xe2\xe1\x8b\x5f\xc2\xff\xa2\xc6\x4f\xd6\x43\x5a\x6c\xfd\x9a\x1c\xf5\x97\xe4\xdb\xd6\x3c\x3b\x85\x04\xd2\x3b\xad\x7a\x66\xbb\x5c\x51\x1a\xda\x87\x56\x0c\x88\x51\x12\x5a\xfc\x16\xb0\x2e\xe6\x42\xb8\x8e\x6c\xfa\x3e\xa2\xcc\x19\xb5\x61\x92\x8d\x10\x11\x5e\xb6\x5d\x39\x00\x3b\xec\x08\x01\xde\x29\x80\x8b\xb1\xae\x19\xf3\x8b\xd2\x96\x4d\x14\xd2\x95\x6e\x88\x2c\xc8\xb9\x07\xc5\x65\x4e\x35\x55\x4c\xc7\xa9\xa9\xd3\x51\x51\xd0\xbd\x59\x71\x88\x95\xec\x4f\x60\x69\x64\x90\xcf\xc6\x65\x41\x26\xe3\xbf\x58\xe1\x40\x74\xde\x34\x62\x81\xdd\xe9\x18\x2c\x3f\x77\xe5\xab\x9c\x0f\x35\x8e\xd2\x1e\xd0\x2e\x79\x56\x3b\xc7\x6f\xbe\xb9\x7c\x93\x2a\x14\xb5\x5f\x3a\xd9\x01\xfe\xdd\xdd\x26\x0b\xc8\x50\xa7\x8a\xff\xd8\x84\xea\x0e\xa8\xe3\xe1\x41\xd0\xbe\xbf\xab\xb5\xcd\x32\xd6\x1a\x17\xde\x70\x75\xbb\xcb\x5b\xbe\xd6\x79\xf7\xbe\xff\xed\xfc\x82\xd8\xa7\x0f\xd9\x07\x7a\x06\xd9\xb5\xf5\xa0\x7b\xf3\xff\x76\x7e\xb1\xb2\x84\x15\x45\xc0\x59\x51\x38\xf9\xcc\x08\x1a\x2e\x5d\x82\xc5\x09\xc9\x1b\x04\xb8\xc3\xf0\x3e\x35\xc3\x1a\x83\xc1\xcc\xf3\x49\xa6\xb8\x4f\xa9\x3a\xbb\x65\x13\x2e\x03\x47\x84\x3d\xd7\x80\x9c\x65\xac\x75\x3f\xc9\xb9\xba\x3d\xb4\x7e\xa3\xca\xdf\xf7\x25\xde\x78\x5e\x06\x9d\x55\xe1\xde\x95\x07\x0a\xea\x84\x2d\x65\x43\xee\x6c\x45\x84\x68\xf5\xc1\x47\x5e\xbd\x26\x17\x42\x35\x35\x6b\x7d\xb9\x57\x07\x33\xfc\xfa\x0e\x95\x09\x50\x60\x43\xbd\x3e\x98\xf1\xe7\xc0\xe0\x4a\xd2\xa8\x41\x45\x6b\x0d\x92\xff\x3e\x00\xc8\x77\xee\xc8\x45\xf0\x40\xec\x06\x82\x2e\xa7\x2e\x02\x71\x64\x73\x8a\xfb\x42\x8a\xae\x9b\xd6\x63\x04\x68\x75\x1a\x94\xbc\xf5\xe5\xac\xc8\x8b\x9c\x2d\x5e\xa8\x9c\xbe\x1a\xc1\x54\x5d\xcc\x7d\x77\x5d\x54\x91\xa3\x57\x47\x31\x63\x5c\xf3\x92\x17\xb4\x2e\x30\xa3\x9d\x4f\xf4\xe7\x7b\x32\xf8\xd7\x0d\x09\xee\x9b\x2f\x8f\xc8\x89\xac\x61\xec\x8c\x0a\x52\x30\x97\xfd\xce\xe2\x8a\x25\x8a\x1a\xa7\xcf\x18\x24\xf7\x61\x5d\x44\x64\xba\x17\xf0\xcd\x1d\x37\x68\x39\x99\x4e\x61\xa3\x37\x2d\xb1\xe7\xc2\x50\xd7\x09\xf9\xc6\x52\x67\xcb\xf1\x20\x6c\xe4\x40\x6a\xf1\x8d\xe7\x7b\x32\xcf\x47\x85\xb7\xa2\x8c\xdb\x91\xaa\x8d\xac\xdb\x84\x9f\xf1\x69\xf4\xab\x04\x67\x5c\x7f\x60\x95\xdc\x29\x8f\x8b\x5d\xae\x18\xb4\xb8\x36\x0f\xa4\xe2\x50\xb9\x9b\x6a\x42\x11\x47\x65\x4d\x41\x8d\xd4\x8b\x06\xab\x24\x46\xd4\x8e\xb3\xc2\x7e\x7e\x0c\x6b\xa8\x05\x91\xe4\x56\x91\xe2\x67\x32\xb2\x58\xbd\x57\x63\xea\xab\x03\x43\xe1\x10\xf0\x8d\xe4\xfa\xdc\x77\x8b\x01\x86\x85\x14\x36\x04\xd0\xf4\x6d\x6d\x60\x33\xae\x6d\x5a\x74\x1c\xca\xfc\xec\x7a\xeb\x19\xb4\x2d\x52\x02\x55\xcd\xfd\x2a\x0e\x6e\x43\x6b\x0f\x6d\x57\xf2\xb7\x2b\x14\xbe\x17\xe9\xdb\xd7\x86\x77\x89\xbf\xd0\x3f\xa1\x7d\x1e\x4b\xba\xdf\xb9\xfa\x4b\xae\x82\x10\xfa\xc0\xd6\x1a\xe1\xe8\x78\x32\x39\x9e\x00\xdb\x70\x3c\x39\x76\xac\x65\xe1\x9d\xa1\x2d\x15\x6e\x87\x4d\x2b\xb3\xd7\xbd\x2d\x13\x42\xbe\x76\xf9\x09\x20\xe9\xf2\x8a\xe7\xb5\x77\xaa\x6e\x6b\x47\x63\xba\xba\xee\x9d\x8b\xd2\x14\x83\x0e\xbb\xb9\x09\x27\x6e\x5d\xb5\x67\x7c\x61\xf3\xb1\xee\xd4\xf4\xd5\x4e\x30\x11\x1e\xc2\x95\x59\x25\xc2\x87\xaf\x76\x3b\x33\x44\x22\xc9\xf3\xb2\xb8\xc7\xce\x2a\x93\x65\x89\xe5\xc0\xe6\x5e\x16\x6e\xf3\xf9\xc5\x22\xbe\x78\xf5\x05\x96\x46\x9b\xf6\xdc\xc3\x44\x94\xee\x3a\x5d\x51\x57\xf8\xc7\x36\x3f\x88\x68\x85\x2a\x40\x8b\x6a\x4e\x6b\xa6\xb0\x84\xb9\x2d\xd8\xdc\x5f\xe7\x73\x05\xcb\xfb\x31\x1e\x56\x35\xb6\x53\xdc\xbf\xb2\x31\x1e\x7b\x32\x91\x57\x92\xf7\x27\xcf\x1a\x93\x8a\xea\x87\x53\x5b\xc7\x63\x58\x3f\x68\x22\xe4\xfa\xef\x1c\xe8\xba\x07\x41\xf5\x47\x9b\x35\x2e\x38\x16\x2d\x2b\x59\xc8\x59\xb4\xf7\x4f\xa4\x38\xa9\xe7\xfb\x91\x24\xf5\xdc\xad\xae\x5d\x82\x97\x99\x74\x54\x84\xe7\x06\x66\xce\xd6\xdb\x54\x2e\xf5\x9f\x65\xdc\x5e\x78\xa8\x7c\xf1\xe1\xe2\xec\xcd\xbb\x8b\x49\x99\xff\x12\xe3\x40\xc6\x74\x1c\x53\x35\xf3\x73\xe0\xaa\xd7\x36\x12\xf5\x1c\x80\x13\x5c\xb1\xca\xb6\xee\x62\xc5\xea\x92\x63\x8c\xe2\x21\xd9\xed\x3d\x9f\x50\x3f\xa7\x6d\xb0\xe2\x55\x2f\x58\xa7\x1d\x8d\xeb\xb3\x8b\x96\xab\x9a\x8d\x7d\x61\xa8\x29\x2f\x20\x08\xab\xa5\xe8\x01\x96\xee\xe9\xde\x69\x8e\x9d\x12\x1a\xfb\x28\x96\xab\x1a\xe4\x96\x3b\xf5\x3a\x7b\x4c\x88\xdd\x5f\x48\xd4\x57\x81\xb5\x9a\x3a\x3a\xc3\xc2\x4e\xb5\xcd\x47\x5b\xd5\x7c\xc1\x0b\x36\x83\x92\xd8\x5c\xcc\x54\x9b\x5b\xd0\x1a\x51\x7b\x06\x80\x38\x38\xd6\xd2\x25\x6f\x26\x7b\x07\x26\x51\x9f\x2e\x09\x81\xfa\xfd\xd7\x1f\xa1\x58\x3d\xd8\x5f\xf7\xac\x3e\x36\xd3\xe9\xc5\xfa\xfb\xd0\x1a\xef\x8e\xd2\xec\x15\x4d\x3b\x73\xd0\x26\xc0\x8d\x54\xe9\xa1\x4e\x0d\x51\x3e\x25\x6a\x59\x16\x5c\xdc\x8e\x7c\xa1\xb1\xa9\xb4\x29\x56\x19\x31\x3f\x38\x70\xae\x19\x2d\x1e\x43\x0c\x76\x0e\x04\x24\x8d\x10\xe8\x3d\xe9\xf1\x81\xb1\x32\x77\xf5\xdf\x1c\xda\x41\xdd\x49\x22\x16\x8f\xb0\xcb\x3f\xbb\x6d\xe5\x25\x9d\xed\xd4\xf1\x17\x3a\xec\xa0\x6d\x41\xbe\x3e\xbf\xf4\xf5\x02\x43\xc5\x05\xbe\x2b\x6b\x42\x6b\xcd\xa7\x34\xd3\xa7\xa4\x6a\xa0\xaa\x0b\xd4\xa8\xb0\x64\xd6\xde\x8e\x7b\xbc\x02\x7a\xa6\xf3\xb1\x15\x23\xc1\x45\x4b\xc9\x62\x61\xfa\xd7\x50\x1c\x1a\xe4\xde\xa6\xb2\x4e\x05\x10\xb2\xea\xaa\xcc\x5f\x35\x45\x71\x25\x0b\x9e\x2d\x7d\x81\x03\x54\xbf\xe4\x06\x15\xf5\xe2\xa2\xb3\xe2\x8e\x2e\xd5\xeb\x70\xe6\x84\xc2\x33\x42\xb5\x66\x65\x85\x20\x63\x96\xbb\x9a\xe8\xb8\xd5\xc0\x60\xe1\x5d\x57\x60\x7d\x4a\x79\xe1\xef\x7e\x63\x1f\xf4\xe2\xf2\x31\x79\xcf\x16\xac\xee\xce\x44\x98\x47\xd0\x89\xea\x8e\x0e\x1b\x0f\xdc\x4c\xa3\x40\xbe\xc1\x9a\x0a\x6b\x07\xd5\x33\x4b\x3e\x5d\xe9\x16\xeb\x91\x58\x98\xe8\x9f\xf2\xe5\xf4\xbd\xd4\x57\xf8\x76\x77\xe6\x38\xe7\x7b\xfa\xa7\x85\xe1\xc6\x96\x6e\x1c\x73\x98\x39\x57\xb7\x8f\x9a\xac\x97\xc7\xc2\x2d\x8f\x07\x3a\xa8\xc0\x5b\x63\x22\x43\x80\x3c\x3b\x9a\x81\x3e\xf8\x2d\x37\xcb\xb2\x10\x5f\x33\x1b\x4a\x3d\xb2\x40\x58\x32\xea\x6a\x39\x0b\x76\x07\x95\xd9\x75\x5b\x29\xd8\xaa\x5e\x32\x59\x32\x42\x17\x94\x17\xf4\xa6\x00\x4f\x0b\xd3\xb9\xed\x2b\x42\x02\x3f\x83\x55\x81\x85\x51\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x3a\x13\x5e\x1b\x9c\x40\x21\xb3\xdb\x90\xdf\x80\xca\x56\xca\x95\xa8\x87\x9b\x4c\x97\x84\xe6\x39\x51\x7c\x26\x20\xdc\x59\x68\x52\x50\xcd\x44\xb6\x9c\x10\x9b\xca\x59\x05\x95\xa3\x75\xcd\xbd\x5f\xbf\x80\xba\xed\x6d\xb5\xcc\xec\x56\x4e\xa7\x2b\x95\xa6\xad\xe9\xd3\x22\x0a\x5c\x3d\x55\x52\xe0\xe0\x4c\x29\x3a\x8b\x42\x14\xab\xa5\x63\x70\xe7\x6d\xf2\x01\x87\x8e\x5c\x66\x01\xe7\xba\x54\xbb\xd0\xd8\x36\xf4\xd5\x43\x5b\xdd\x08\xcd\x4b\xb6\x92\x75\x93\x80\xfe\x76\xcd\x85\xc1\x0c\x65\xd3\x92\x42\x60\x8a\x0d\x74\x75\x25\x59\x78\x6e\xe7\xb7\x66\xeb\x5d\x45\xa8\xe0\xef\x17\xb3\xde\x00\x2f\x03\x2c\xba\x25\x42\x71\x67\x9b\xee\xa5\xe5\x52\x4e\x20\xce\xb6\x3d\xe8\xef\x7e\xfd\xfd\x64\x11\xda\x18\xe0\x73\x43\x3e\x4f\xcd\xcc\x4a\x56\xcf\x5c\xcd\x91\x92\x0a\x3e\x65\xca\x9c\xfa\xd2\x80\x88\xd5\xe3\x41\x51\xa2\x3b\x03\x1c\xe8\x4d\xb1\xb2\x90\x5e\xdc\xf6\x71\x45\x47\x18\x9c\x52\x2b\x96\x9d\xd4\xf2\xd4\xd6\xc4\x17\x63\xf6\x89\x65\x8d\x86\x7b\x02\x56\x74\x72\x22\xa4\x79\xd6\x6b\x13\xbc\x6e\x6e\x90\xe1\x82\x01\x56\xa6\xeb\x2a\x70\xe9\xe0\x6c\x7a\x77\x4b\x35\x37\x15\xee\x15\x9b\x1a\x9e\xe0\xd5\xe4\x77\xbf\x8b\x59\x30\x7a\x73\x42\xef\x8a\x65\x4d\xcd\xf5\xd2\xa0\x37\xf6\x49\x4f\xa6\x0a\xea\x59\x9c\x43\xaa\x06\x4b\xbc\xe6\x14\x14\x46\xe8\xfa\x89\x57\xa4\x05\x5e\x03\x50\x07\xf7\x53\xab\x3c\x65\xdd\x07\x2f\x67\x97\x3d\xb5\x08\xcc\x40\x60\x0b\xe6\x6a\x42\xae\xa4\xc2\xec\x0f\x3e\xbf\x4f\x94\xf3\xee\xb3\xa1\xe7\xa6\x7d\x76\x14\x9d\x80\xd4\xf2\xbc\x69\x7a\xff\x0a\x42\x5e\x1f\xe1\xc1\x8c\xf3\x1a\x92\x64\x6a\xa2\xe9\x6c\xa5\x84\x86\xac\x3b\x8b\x6e\x73\x31\xef\xd8\xce\x60\xd7\xb8\x8f\xdb\xf4\xc1\x09\xdf\xe4\x72\x15\x60\xba\xf1\x0e\x36\x3b\x4f\xcc\x36\x7e\xc1\xe6\x74\xc1\x36\x12\x81\x4a\xe6\x93\x0d\x78\x13\x80\x35\xa6\x6b\xc3\xb4\xfb\xb0\x02\x9f\x1e\x46\x29\x56\x42\x69\x88\x7b\xc8\xce\x26\x1a\x7a\xb3\x24\x85\x94\x90\x78\xa1\xa9\x88\x90\x39\x33\x60\x06\x6e\x0b\xb4\x50\x23\x72\x7d\x66\x5f\xac\x82\x21\x31\x79\x18\x70\x48\x15\xcb\x36\xbc\xb0\x07\xb9\x3b\xc8\x8b\x8d\x44\x33\xc6\xab\xac\x13\x15\x20\x6d\x38\x4b\x5b\x9a\xc5\x16\xac\x28\xd8\x82\x81\xe1\x6d\xca\x67\x04\x13\x72\x97\x36\x45\x9b\xf3\x22\x92\x35\xa4\x39\xae\x79\x1e\x23\x2c\xaf\xd2\x77\x73\x20\x77\xb2\xbe\x2d\x24\xcd\x83\x02\xec\x8a\x14\xfc\x96\x91\x37\xac\x2a\xe4\xd2\xe6\x55\x13\x39\xb9\xd6\x54\xb3\x69\x53\x5c\x47\x6d\x64\xac\xfc\xab\x32\xc5\x77\x2a\xff\x9a\x0e\x57\xe4\xdf\xcb\xeb\xf3\xeb\xcb\x67\xe9\xff\xfa\x38\x6d\xc4\x8b\x5f\xc2\x6a\x0f\xad\xe7\xe3\x3f\xf6\x19\x7c\xc7\xa4\x68\xfa\xdf\x41\x13\xfa\x95\xac\x35\x2d\x76\xc4\xdb\x64\x73\x5a\x9d\x35\x7a\xfe\x86\x2b\x28\x5b\x93\xca\xe2\xac\x7d\x1f\xa4\xdd\x61\xa0\x37\xb6\x1c\x26\xe1\x0e\xa6\xec\x7b\xe7\xff\x76\x76\x45\x68\x63\xe0\x40\xdb\x84\x52\x3b\xd3\xf0\x87\x2b\xbb\xc6\x34\x8c\x5b\xae\xcb\x7e\xdd\xb3\x2a\xf7\xd6\xbe\xd7\xf4\x54\x01\xc4\x83\x77\xf0\x01\xbd\x83\xfb\x51\x14\x49\x63\xb8\xb8\xe0\x9a\x53\x2d\xeb\x7d\xb9\x55\x76\x06\xf0\xde\x16\x8d\xd2\xb2\xb4\x17\xe4\xd2\xbd\x01\x61\x38\x91\x36\x83\xb5\x6e\x5b\x67\x0d\xb0\x64\xc2\x46\x5d\x0a\xcd\xea\x29\xcd\xd8\x4a\x0a\x8c\x11\x28\xa0\x70\x74\xee\xde\x89\x18\xf7\xcf\xd6\x4f\x09\xaa\x04\x17\x7f\x79\xfd\xe7\xc0\xd1\xf8\x2f\x9e\x45\xb3\x6a\xaf\x90\x1b\x13\x2c\x8b\x4b\x8a\x97\x72\x72\x3f\xa6\xe2\x2d\xfe\xa3\x58\x71\xb8\xc2\x2d\xf8\x7f\x0d\x2d\x70\xeb\xe2\x0e\x20\x65\x92\x9d\x63\xd8\x0b\x7c\x75\x0f\xda\xae\xcf\x9f\x2a\x86\x76\x01\x3e\x41\x91\x51\xd8\x45\xeb\x9a\x0a\x65\x0e\x32\x55\x58\x3a\xb6\xec\xe2\x31\x39\xd1\x59\x15\xe1\x7f\x9d\x14\x1b\xe9\xe3\x22\xed\x3f\x7a\x3e\x48\x4f\x20\x55\x34\x22\x64\xe8\x70\x33\x3e\x22\x38\x7c\xe5\x13\x48\xc5\xae\x6a\x2f\x2e\xde\x70\xbb\xf6\x92\xb0\xc7\x76\xed\xa1\x24\x5c\x3c\xb2\x4e\xe4\x2b\xae\x34\xa6\x9a\xc0\x97\x21\xd4\x18\x93\xf1\x18\xe6\xf7\xca\x48\x09\xbc\xfa\x2f\x9a\xe7\xf5\x6b\xa4\xf2\x4e\x07\x5e\xc7\x44\x92\x1b\x11\x45\xfb\x02\x7a\x4e\xf2\x38\xd1\xcb\xca\x56\x6b\xff\x78\x7e\x05\x7d\x29\xf2\xa7\x3f\xbc\x04\x6e\xf8\x77\xbf\xfd\xc3\xcb\x68\x30\xfb\x2c\xb3\xf6\x90\xff\x85\xde\xe6\x87\xc8\x06\xd1\xc9\xe8\x00\xd9\x7f\x0d\x0f\x7a\x8d\xc9\x0f\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xb7\xe3\x54\x87\x94\x04\x43\x4a\x82\xb6\x0d\x29\x09\x36\x4f\x2c\x90\xd4\xf7\xe2\x00\x12\xf4\x0f\x49\x67\xd7\xa9\x1c\x12\xb8\xab\xcf\x91\xc0\xf5\x1e\x68\x3f\xba\x48\xdb\xd2\x30\x0c\x2c\x2e\xef\x57\x9b\x26\xeb\xcd\xfb\xeb\xff\xfa\xea\xec\x8b\x8b\xaf\x60\x9d\x36\xae\xcc\x80\x35\x17\x7b\x52\x6a\xed\xe8\x12\xc5\xee\xf5\x6e\x1d\xd8\xc5\x8a\xeb\xba\x20\xef\xdf\x5e\x27\x7a\xad\xef\x55\x47\xf8\x4b\x31\x8d\xd9\xb7\xc3\x3a\x02\x9a\x97\x14\xab\x77\x97\x43\x6f\xaf\xfe\x82\x41\x3d\xd0\x8e\x16\xc7\x9c\x34\xae\xe2\x00\x6a\x94\xbe\x63\x24\x9f\x89\x4f\xb7\xd9\x34\xdc\xc8\x67\xe9\xcd\xbd\x9f\x23\x89\xe5\x99\xeb\xf4\x44\x90\x91\xe9\xd3\xea\x20\x5b\xa4\x41\x48\x48\x22\x6a\x43\x3c\x0d\xd9\x64\x4a\x39\x82\xf1\xb9\x42\x75\xb5\xa9\x90\xc2\x2e\x51\xfd\xc6\x01\x6c\x11\x05\x57\x05\x22\x70\x96\xef\x98\x67\xfb\x2c\x4b\x9b\xab\x40\x84\xf6\x52\x20\x80\x15\xcd\xfa\x49\xf9\xce\xea\xdd\xb4\x8f\xf0\x09\x24\xbf\x3f\x38\x31\x81\x51\x77\x98\x8e\xc4\xf7\xb7\x8f\x8b\xe6\x3b\x5f\xcd\xcc\x4a\x53\x8e\x98\x50\xe5\x3d\xe9\xd0\x0b\x2f\x29\x85\xeb\x13\xc3\x00\x79\x86\x94\xe8\xef\x7b\x53\xa0\xec\x5a\x79\x52\xcd\xa5\x96\x62\x7f\x89\xa2\x36\xf5\xdf\x45\x5c\x57\xf0\xc6\xb9\x77\x07\x08\x10\x1f\xe6\x8a\xf0\x26\xf3\x15\x2f\x71\x6b\x1e\x4f\x73\x10\x0f\x43\x32\xaf\x36\xcd\xed\xe1\xe8\xcc\x8d\xcb\x79\x4e\x81\x9a\x55\x7e\xf9\x66\x47\x98\x6b\xc8\xb7\x8c\xed\x99\x56\xc6\x30\x27\x9d\x78\x38\xe6\x13\xb7\xeb\x97\x6f\xac\xa0\xe1\xb2\xd1\x29\x7b\x1f\xc8\xfd\x57\x71\x67\xbc\x93\xac\xf5\x9d\xac\xf7\x90\x87\xbe\xdb\xf3\x4a\x38\xa1\xfd\x6d\x2d\x0b\xe5\xce\xf1\x4a\x77\x12\x49\x69\xe5\x56\x57\x60\x76\xb4\x67\xe8\x7b\x72\xca\x7d\xca\x27\xae\xaf\x49\x26\xcb\x4e\x5d\xbb\x39\x43\x3e\xe0\xfc\xfa\xf2\x1d\x9f\xe1\x54\xdc\xac\xc9\x94\x51\xdd\xd4\x6c\x3c\xa3\xba\x6f\x68\xae\x48\x9f\xcd\x76\x0f\x38\x0e\xcf\xef\x73\xc0\x73\xd7\x80\xe7\x02\x28\x7c\x08\xdf\x3d\x57\x74\xf7\xb4\x68\xee\x20\xfc\xda\xcf\x2a\x33\xba\xbb\x1e\x89\x3b\xe6\x3e\xb3\x4a\x58\x73\xd6\x2d\x69\xa0\x1e\xa9\xd9\xf7\x76\x46\x0a\x6a\xf9\x0f\xc0\x5b\x09\x54\xc0\x7f\x83\x56\x5a\x40\xa1\xb4\x28\xcc\xae\x4a\xd1\x16\x19\x51\xad\x9f\x2e\x3a\xb5\x96\xb4\xb2\x3e\xbb\xb9\xbc\x13\x77\xb4\xce\xc9\xd9\xd5\xe5\x6e\xb0\x57\x42\xde\x20\x84\xb5\xb8\x92\x7e\x5b\x64\x0e\x6a\xbb\x07\xca\xa0\xb1\x00\x23\x23\x37\x5c\xab\x4e\x49\xd5\x40\xe5\x65\xc8\x9e\x77\xca\x81\x40\x99\x1b\x7f\x29\x92\xd8\x30\x41\x64\xa6\xa9\xab\x01\x7a\xc3\xf4\x1d\x63\x82\xbc\x7c\xf9\x12\xed\x18\x2f\xff\xf8\xc7\x3f\x82\x53\x39\xc9\x59\xc6\xcb\xf5\x17\xe1\xad\x7f\x79\xf5\x2a\x66\xd0\x7f\x3f\x7b\xf7\x15\xa1\x19\xc8\x94\x58\xc6\x07\xc7\x86\x03\x0e\xbb\x57\x23\xf2\x7f\xaf\xbf\x7e\xef\x28\x8c\x5a\xf9\x15\xe0\xc7\x6f\x51\x94\x2c\x66\x83\xa4\x38\x84\xb1\xb5\xb6\x0a\xaa\xe7\x3e\x34\x88\x82\xa5\x33\x08\x20\xb3\x77\x3f\xca\xd1\x0f\x32\xfb\xf3\xd9\x1c\x36\x95\x0b\x80\xdf\x82\x67\x36\x67\x13\x5a\x8f\x5c\x01\x0c\xcc\x23\x80\xf1\x3e\x8e\xbc\x44\x8c\x61\x16\x3c\x42\xcf\x6b\x1b\x47\xd4\xd6\xc2\xae\x99\x32\xa2\xa6\x2d\x77\x8a\xc3\xb5\x30\xa4\x58\x74\xd1\x90\x7d\x38\xbf\xd8\xcb\xbd\x17\xbd\xa5\xc5\x1b\x96\x45\x2e\xb8\xd2\x41\xd5\x4b\x8b\x76\x40\x45\x4c\x2e\x68\x36\x27\x4c\x68\xc8\x47\x85\x07\x6c\x5e\x8f\x18\x64\x4e\x45\x6e\x6e\x18\x94\x47\x80\x01\x9f\xc8\x73\x65\x1b\x5f\x80\x2b\xbf\x07\x9d\x60\xc9\x16\x23\x53\x23\x01\x87\x60\xda\x32\x26\x41\x10\x5a\x64\xbd\xd6\x8b\x4f\x14\xd2\x74\x98\xad\x42\x75\xb1\xb2\x01\x71\x2a\x2c\xe6\x15\xd3\x59\x62\xc9\xf5\x34\xff\x0b\x42\x32\xcc\xbe\xf2\xb1\x6e\x94\xfe\xa2\x31\x07\x1c\x5b\x3a\x74\xdb\x62\xad\xe7\x6b\x23\xa2\xeb\x83\xb5\xf7\x81\x16\x38\xcb\x98\x42\x50\xfe\x01\xe3\x6c\x74\xfb\xf6\x0f\xb8\x91\xd1\xe3\xc9\xe9\xa6\x21\x5d\xe4\x2c\x17\x06\xf7\xd3\x46\xcb\x31\x54\xc9\x76\x19\x5b\x7a\x63\xa7\xdb\x76\x56\x54\x73\x3a\x22\x33\x1a\x30\xb1\xeb\x23\x06\x00\x68\xe5\x14\xf8\x22\x61\x9c\x07\x56\x61\x10\x9e\x35\xf4\x03\x64\xb5\x65\x8c\x05\x2d\x19\x44\x78\xe1\xc4\xa2\x07\x5b\x29\x4a\xa7\xf8\x4c\xb0\x1a\xb5\xb4\x10\x03\x4c\x0a\x7a\xc3\x0a\x3b\x94\xac\x13\x96\xf1\xa5\x8b\xa6\x63\xb5\xc1\x9e\x8a\xd0\xd9\xac\x66\x4a\xf1\x05\xb3\x41\xd4\xfc\x9f\x6d\x31\xbc\x39\x23\x57\x17\xef\x5c\x28\xb9\x22\x86\xb1\xd5\x2c\x26\x91\x1e\x36\x9f\xc6\xd1\x80\x56\x2b\x7b\x4c\x08\xb9\x50\x52\x43\x89\x37\xd3\xbf\x3d\x12\xe5\x4b\x3a\x83\x97\xe9\x18\x62\xc6\x53\xf6\xac\x8d\x02\xc2\x70\xf3\x39\xa3\xb9\x8b\xbb\x35\x2c\x65\x55\x19\x49\x9a\x9c\x9b\x2b\x3a\xb5\x65\xc6\x31\x32\x3b\x6f\x8c\xa8\x42\x7b\x55\x6f\x61\xfb\x38\x67\x44\xd6\x39\xc3\x22\xe6\x53\x70\xe6\xf1\xdd\x06\xf4\x1d\x52\x10\x71\x33\xd2\x0d\xd7\x35\xad\x97\x48\x31\xed\x49\x44\x0f\x67\x70\x26\x96\x57\x87\x5e\x61\x64\x08\xab\x22\x31\x39\xe5\x5c\x4b\x44\x68\x24\x41\xc2\x6e\x5b\x94\x6d\xdd\xb5\x54\x9c\x69\x1a\x80\xff\xb5\x85\xfe\xf8\xcf\x1e\x53\xe3\x9a\x10\x1c\x0f\x44\x86\x75\x64\xe0\xb3\x00\xe8\x6c\x6e\xe9\x7a\xf7\x8a\x12\x82\x92\x20\x8d\xf5\x48\xc3\x66\x23\xb2\xb9\x43\x02\xde\x2b\x9f\xe9\x89\x61\xa0\x75\x43\x8b\x62\x39\x66\x9f\x0c\x29\x31\x97\x18\x68\x28\xa4\xa9\x04\x77\xfe\x46\x28\xa6\x53\xea\xd6\x13\xbc\x7c\x55\x8d\xf9\x26\x14\x39\xc2\x35\x09\x09\x09\xa8\x8e\xb0\x5b\x23\x08\xdc\x34\x1a\x5d\xe0\x46\x9b\x3f\x49\x5b\xe7\x82\xd5\x4b\x3b\x42\xc2\x87\x5b\x80\x33\xd9\x12\xe6\x08\xdc\x41\x9d\xcd\x2f\x3e\x55\x35\x86\x1e\x25\x7e\xbd\x02\x7e\xab\x9d\x61\x96\x26\xc7\x3d\x76\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\x16\x3e\x01\x2c\x76\xf6\xfe\x4d\x0a\xfa\xc2\x96\xc2\x22\x76\x5b\x34\xc3\xd8\x6d\x8f\xb9\x81\xd8\xce\x1e\xd8\x1b\x9b\xe9\xca\xfd\x82\xc9\x89\x5d\x8d\x31\x27\xd5\x51\x72\xcb\x2c\x12\x36\x92\x27\x28\xbb\xec\xcb\x5b\x4c\xa7\x66\x10\xda\x8d\xb1\xea\x6c\x09\xdd\xe2\x48\xa9\x67\xb1\x35\x38\xbb\x89\xa4\xe2\xe9\xb6\x8d\xcd\xd4\xb7\xfa\xce\x6d\x5f\xf2\xc7\xdb\xde\x41\x6c\xb7\x2c\x42\xb5\xb7\xa9\x75\xe0\xcf\x9c\x97\x93\xda\x00\xa6\xcc\x03\x1f\x23\xe7\xc1\x88\x42\x6e\x63\x45\xb4\x4c\x3f\x52\xb2\x8d\xc7\x6c\xb7\xb9\x2d\xde\xc1\x82\xb7\xba\x70\xe1\x1c\xba\xb6\x91\x5b\xb6\x3c\x56\x78\x03\x0c\x06\x9b\xf3\x0a\x6b\x73\x19\xf2\x60\x24\xe0\x2d\xaf\x01\xb6\x6f\x21\x9b\x8d\x1b\x18\x71\xdc\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x7c\xe2\xca\x72\x7b\x6f\x24\x53\xef\xa5\x86\x27\x4f\x72\x42\xb8\xd0\xa7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x46\xc4\x9f\x25\x57\xe4\x12\x32\x7b\xe3\x96\x6e\x39\x34\xf8\xef\xba\x34\x29\x66\x60\x27\x63\x43\x2a\x1d\xeb\x49\xbf\x3e\xb2\x3d\x3f\x59\x77\x8e\x6f\xe7\x93\xb0\x13\x00\xdd\x18\xfe\x02\x19\xde\xaa\x82\x66\x2c\x77\xe9\xaa\xa8\xd9\x29\xaa\xd9\xac\xd7\xc7\xfc\xbe\x56\xb2\x7a\x06\xaa\xbc\x2c\x2a\x6d\xe2\x86\x05\x6c\x4d\x88\xb1\x6d\x49\x8e\xc3\xc1\xb7\x06\xff\x47\x46\x28\xed\xb1\x33\xe0\xb1\xbe\x32\xa8\xfd\x71\xbc\xda\x16\xf7\x32\x18\x1a\xb9\x92\x92\x56\xe6\x4e\xfe\xb7\x61\x3e\x00\x54\xff\x87\x54\x94\xd7\x6a\x42\xce\x5c\x1a\xad\xf0\x37\x2b\x3d\x06\xdd\x6c\x31\x85\x0a\x3c\x82\x7f\x6c\xf8\x82\x16\x36\x29\x07\x15\x84\x61\x9a\x31\x33\x9b\x55\x26\x74\x44\xee\xe6\x52\x21\x27\xe3\xc3\x6f\x8e\x6e\xd9\xf2\x68\x94\xa4\xc1\x70\x2d\xbc\xf1\x47\x97\xe2\xa8\xd5\x16\x77\x6e\xab\xe7\xd1\xc0\xab\xf6\x08\x7e\x3b\xda\x3d\x9f\xbb\x15\x67\xb5\x6d\x51\xe7\x4d\x13\x48\xbe\x62\x8f\x89\x87\x69\x5b\x7c\xa4\x17\xb6\x5d\x88\xc9\x0e\xa6\x37\x28\xce\x6e\x96\x2e\xa1\x9c\x15\x54\xd7\xe5\xd8\xa4\x21\x41\xe6\x0d\xe4\x63\x03\x62\x1d\x15\x41\xba\x48\x99\x78\x50\x2e\x3b\xce\xa1\x36\xd9\xd0\xd3\xba\x61\x23\x92\x4b\x71\xac\xad\xba\x2b\x4c\xba\xb8\x9a\xda\x2a\xdf\x70\x0e\x27\xea\x34\x69\x50\x5a\x33\xc8\xb5\xe5\x92\x48\x5a\x0d\x03\x26\x60\x04\x4d\xa7\x76\x1e\x22\xe6\xcf\x4d\x43\xc6\x07\xe4\xd9\x21\x6d\x58\x9e\x90\x80\xbb\x20\xad\x77\x38\x6c\x7b\xe8\xc1\xe0\x5d\xed\x69\xd2\x78\x0f\x01\x11\x60\xf1\x36\x4c\x10\xd5\x22\xff\x64\xb5\x4c\x1a\x61\x83\xea\x28\x1d\x3a\xe3\x2c\xfa\x6d\x8b\x0b\x3c\x69\x5b\x07\x34\x3f\x00\x7b\xbf\xb0\x86\x4a\xc8\xdb\x19\xe4\x25\xa9\x25\x1e\x0d\xf8\x3c\xc0\x0f\x37\xb0\xaa\xbd\x5f\xb9\xf6\xa8\x9e\xa9\x02\x30\xd0\xda\xa7\x51\xab\x1e\xad\xde\xc7\x39\x6b\x35\xf2\x72\x6a\x8b\xa4\xa3\xd1\xe1\xb1\xa0\xe8\x73\x6d\x34\x02\x13\x57\xa0\x55\x7c\x1b\xf5\xf8\x16\xc7\x8a\xfe\x16\xef\x68\xb5\x95\x15\xcc\x7f\xdd\xa9\x86\x4f\x6f\x64\xa3\x5d\xba\x10\xfb\x3b\xd4\x1c\xd6\xd2\xd9\x1f\xf7\xa7\x3a\xdf\x46\xc7\x91\xcc\xc8\x3f\x06\xa4\xd1\x13\xa6\xeb\x87\x35\x22\x8c\x66\x73\xc3\x01\x8e\xd1\xcd\xc2\x70\xa9\x8e\x1d\x7d\x63\xb6\x0e\x19\x43\xb9\x4a\x62\xd2\x80\xcf\x9f\x86\x03\xb9\xc0\x3f\xc7\x99\x8d\x9c\xcb\xa5\xb2\xae\x6b\x96\x39\x15\x6d\xe8\x42\xd2\x98\x4e\x3d\xe7\x52\x23\x5b\xd5\x0f\xac\x12\x64\xd4\x95\xca\x52\x46\xf6\x60\xb9\xf9\xcc\x5f\x8c\xa4\xf1\x36\xac\xa8\xcd\xa6\x63\xb0\xa9\xf5\x2b\x6a\xc4\xda\x48\x86\xe0\x25\x8f\x86\x59\x36\xcd\x42\xa8\x53\x6d\x05\xd9\x7b\x20\x57\x34\xf8\x9b\xb7\x29\x2e\xed\xa9\xfa\xc3\x48\x13\xbf\x83\x23\x52\xcc\xa7\x7a\x66\x75\x2d\x6b\xb3\x26\xa6\x14\xe1\xb0\xcb\x25\xad\x6f\x59\xee\xb9\xa4\x09\xb9\x32\x8b\x77\x32\x7a\xd2\x98\xb5\xa3\x46\x2e\x65\x74\x58\xa4\xcc\x4c\xe8\x78\x32\x39\xb6\x15\x14\xd6\x4b\x96\x25\x63\xaf\x54\x81\x7c\x0b\x31\xbc\x73\x7f\xdf\xd1\x4a\xa1\x3a\xc2\xb0\x37\xa0\x8e\x94\x50\x2b\x50\xcf\x9d\x4d\x91\x26\x84\xd8\xac\x2e\x67\x0b\x01\x68\x5b\xb5\xf2\x36\x2a\xe5\x24\xc3\x21\xb6\xed\xd5\xc8\x5b\xa9\x90\xef\x53\x1f\xdb\x93\xb2\x37\x7e\x5b\xcd\xff\x56\x1a\x98\x32\xca\x25\x70\xb5\x3d\x5e\xed\x08\xae\x5d\x5c\x91\xaf\x9d\xec\x13\xe7\x30\xa8\xe7\xb6\x12\xf6\x36\x7a\xb2\x27\xf1\x18\x5c\x6d\x4f\xe7\x41\xb8\xda\x2e\xa7\x98\x4f\x7c\x63\x41\xc4\xd0\xa5\xd3\xb3\x75\x91\xd9\x77\x57\xdb\x21\x5c\x0b\x57\xdb\x9e\x5d\x0d\x57\x5b\x9a\xeb\xe1\x6a\x4b\x71\x45\x5c\x6d\xa9\xd2\x19\xb6\xc7\x5f\xe0\xb0\x1a\x5c\xdd\x11\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x55\x80\xe4\xb6\xba\xb7\x96\x50\xe3\xd5\xa5\x37\x4a\x16\x8d\x8e\x2f\x39\x77\x5f\x77\x21\xdd\x87\x89\x3b\xcd\x66\x2a\xb1\x5f\xed\x38\xe0\x1b\x80\x6b\x43\x72\xbc\x5d\xaf\xbb\xd0\xfc\x6d\xaf\x05\x3f\xa4\xea\xef\x31\x09\x9f\xb0\x1d\x3a\xed\x13\xb6\x03\x27\x7f\x72\x83\x3e\x26\x05\x14\xb6\xa7\x4d\x04\x85\x6d\x4b\xf0\x4e\x49\x0a\xe5\xda\xa3\xb5\xac\x3e\x89\x39\x52\xcc\xa5\xcf\x2c\xdc\x11\x82\x20\x51\x93\x56\x28\x8d\x39\x3b\xa2\xad\xde\xb2\x67\x55\xdd\xe3\xd5\xfd\x2e\x46\xe5\xec\xea\x72\x2b\x2d\x4a\xf0\xfd\x3d\x7a\x94\xf0\x8d\x9f\xb1\x26\xe5\x12\x55\x23\xa1\x4f\xd6\x9b\x76\xe5\x36\xce\x32\x91\xb5\x79\x1a\x99\x72\x6d\xda\x6f\x0d\x5d\x0f\x73\x95\x06\xe7\xac\xa5\x0d\xe9\x69\x39\x00\x4b\x65\x5d\x99\x1e\xf4\xe5\x4d\x71\x02\x27\x4f\x23\x7f\x1e\x50\x96\x84\xfd\x88\xca\x23\xb9\xda\x3a\x27\x75\xdc\x56\xd2\x40\x65\x33\x2a\xbe\x02\x6d\x5b\x25\xf3\xd7\x68\x24\xa5\x42\x48\xac\x14\xa5\x46\x68\xa8\x50\x23\x6b\x86\x09\x52\x74\x88\x9c\x34\x3c\x47\x0f\x68\x9f\x5d\xe0\xf8\x73\x72\x4c\x83\xe5\x5f\xa5\x1e\x25\x79\xb4\x87\x19\xad\xf8\xb7\xac\x8e\xcb\x62\xbf\xa9\x75\x0e\xd6\xf6\xe4\x4e\x51\x65\x73\x56\x52\xf8\xe7\x5b\xb7\x3c\x83\x6a\xac\x7f\x3d\xa8\xe5\x58\x5d\x1a\xd6\x63\xd4\x89\x32\x3d\x5a\xbc\x4a\xf2\x8f\x6d\xdb\x23\x5d\x3c\xfc\x29\xec\x60\x33\xae\x3a\x22\x86\x01\x6e\xd0\x14\x80\x71\xc5\x65\x9a\xf1\x6a\x4b\x43\x65\x16\xb8\x7b\x4f\xb0\xf0\xdd\x98\xdf\xb1\x3d\x95\x9e\x66\x5b\xfd\xcc\xc8\xf3\x3e\x5d\x6d\xcb\x16\x53\x18\xf4\x33\x83\x7e\xe6\x7f\xb5\x7e\x26\x20\xec\x0e\xd7\x6f\x50\xbb\x84\x19\x51\x9d\xee\xa5\xad\x7b\x30\x41\xed\xa7\x53\xa3\x38\x1d\x4a\x5b\x62\x10\xcd\x1f\xc7\x93\xc9\x31\x1a\x40\x26\x5e\x5d\xda\xe8\xe9\xf8\x4f\x84\x89\x4c\xe6\xa6\x1f\x2c\x10\x58\x2b\x0d\xac\x65\x2b\xb1\x87\x73\x29\xdd\x58\xa1\x09\x05\xfa\xde\x96\x7b\xd8\x0a\x05\xbb\xa8\xfc\xb7\xbb\x61\xb0\xb6\x42\xa0\x2d\x2b\xe6\xeb\x32\xd9\x2d\xf3\xa5\xaa\x2c\x4f\xd6\xe6\x10\x28\x78\xc9\xad\x77\xb2\xc1\x2e\x4c\xe9\x74\xf7\x3d\x42\x4e\xb0\x9b\x49\x56\x35\x23\xdb\xe5\xa4\x64\xa5\xac\x97\x23\xdf\xad\xf9\xb1\x33\x8e\x7d\xe3\x14\x98\xbe\xac\xa9\x6b\x26\x74\xb1\x8c\x4d\x2e\xb5\xa9\x3d\x21\xf7\xe7\x76\xf4\xc0\xcc\x9f\x3f\xd8\x54\xff\x92\xb6\x75\xef\x7f\x5b\x87\x10\x14\x72\x7e\x57\x80\xc6\xd8\x34\x76\xa3\x56\x3f\x61\x9e\x32\xb1\x20\x0b\x5a\xab\xf4\xfb\x46\x1e\xcf\xef\xe5\x7c\xc1\xd5\x4e\x42\x0e\xae\x2d\xf1\x43\x3d\xb3\x6c\x74\xd5\x68\x8b\x8e\xdd\x35\x72\x15\xc9\xfc\xf5\x59\x61\x7a\x5f\xc5\xab\x88\xc2\x56\x51\xad\x59\x2d\x5e\x93\xff\x3c\xf9\x8f\xdf\xfc\x34\x3e\xfd\xeb\xc9\xc9\x77\x2f\xc7\xff\xfa\xfd\x6f\x4e\xfe\x63\x02\xff\xf8\xf5\xe9\x5f\x4f\x7f\x72\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xbb\x2f\xdf\xfd\xed\xe3\xd5\xc5\xf7\xfc\xf4\xa7\xef\x44\x53\xde\xe2\x5f\x3f\x9d\x7c\xc7\x2e\xbe\x8f\xec\xe4\xf4\xf4\xaf\xbf\xda\x6a\xba\x54\x2c\xbf\xde\x02\xbf\x61\x1b\x3f\x92\x3e\x76\x7b\xd9\x95\x27\x38\x17\x7a\x2c\xeb\x31\x76\xf7\x1a\x5c\x16\xb7\xe8\xd4\x81\xc5\x2e\xee\x61\x4b\x87\xdb\x1a\x7b\x4e\xf8\x78\x82\x8b\xb6\x2b\xf9\x62\x07\xc6\x82\x4a\xe6\x41\x60\xf4\xbe\xf3\x10\xd8\x80\x7c\xe5\xe3\xff\x6b\x50\x66\x88\x59\x50\x40\xd3\x7a\x12\x92\x93\xaa\xe6\x0b\xaa\xdb\xf0\xba\x20\xd2\x3a\x7a\xc0\x6c\x4e\xb9\x38\x6d\x83\xbb\x2a\x99\x03\x7b\xda\x28\xe6\xb3\xf4\x1b\x12\xff\xf1\xab\x6b\x92\x15\x1c\xdc\xe3\x6b\x9f\x62\x38\x7a\x18\x17\x5f\x3f\x63\x82\xd5\x18\x60\x4e\x56\xa7\x0f\xf5\x92\xb8\x46\xc0\x13\x79\x6f\xda\xdd\x60\xd7\x3a\x67\xf4\x01\x09\xbe\x4b\xdd\x86\x3e\xb7\xe8\x75\x08\xe1\xc6\x36\x8d\xa8\xf5\x43\xa4\x55\x55\xcb\x05\x4b\xf3\x9a\xb2\x3c\x05\x96\x30\x51\x0a\x1c\xf6\xc3\xed\xc7\x6d\x1d\xf9\x65\x83\x17\x68\x27\x16\x32\xfe\x80\x56\x7b\x25\xf7\xe5\x0e\xf8\x68\x1f\xe6\x92\xa9\x80\x45\x6d\x84\xe6\x0f\x57\x68\xbc\x67\x38\x45\xe6\x74\x61\x64\x4f\x26\x70\x91\x48\x95\xc1\x0b\xae\x7b\x2b\x02\x8f\xae\xc8\x7c\x56\xae\x59\x5c\xc3\x05\x58\x16\x20\xab\x46\x3a\x50\x59\x29\x71\x66\xf6\xa6\x5e\x82\x3e\x56\x12\xb8\x38\x78\xd2\xe1\x16\x5a\x30\xc7\xc2\xf2\x22\x47\xef\xcd\xe8\x11\x6d\x22\x0d\x0b\x3a\x2e\xbb\x2f\xdb\x0c\x80\x93\x6b\x4d\x75\xa3\x26\x5f\x98\x99\x7d\x60\xd3\x9a\xa9\xf9\x59\x3c\xa3\x68\xa6\xa8\x34\x2d\xab\x2d\x76\xc4\xdc\x60\xf4\x3c\xf6\xf1\x06\xa8\xba\xf0\x4b\xf6\xe5\xef\x3d\x5a\xb1\x19\x41\x52\x34\x8a\xa0\xa5\x1a\x21\x42\xa8\xa8\xb9\xd7\x08\x91\x1b\xc6\xb9\x65\x4b\x90\xf0\xb6\x04\xfd\x73\x03\xf9\xd0\x01\x26\xac\x49\xd8\x93\x8f\x9d\x55\x3a\xe4\x89\x01\xd1\xed\xd6\x18\x10\x84\x9c\x1b\xc0\x81\x4d\x48\x20\x0c\x5e\x5d\xbc\x8b\x1e\xcc\xe6\x30\xb2\x19\xa0\x03\x04\x77\x62\xfa\xff\xf2\xfc\xfa\x97\x7f\xb2\x43\x9c\x86\x5a\x81\xd2\xda\x11\x52\x87\xe2\x36\x53\xc7\x2a\x94\x23\xa2\xb0\x97\xb6\x0b\xb4\x6d\x65\x94\x78\xa7\x46\xfc\xd4\xba\x60\xd6\x4c\x37\x35\x08\xd5\xbc\xde\x34\xa8\x20\x05\xa3\xd3\x31\xd0\x2e\xa9\x31\x21\xc7\x69\xc2\x79\x5d\x81\x89\x3c\xb8\x5c\xeb\x87\x87\x3b\x38\x32\xe7\x97\x31\xb2\x94\x8d\x8d\x45\xc6\xda\x51\xc4\x88\xf3\xf1\x40\x46\x05\x64\x2e\x34\x94\x07\xd9\x02\xb3\x37\x18\x4c\xb1\x94\x0d\x10\xc2\x00\x78\x37\x02\x65\xfc\x4e\xae\xcd\x15\xf4\x09\x25\xbd\x65\x44\xdf\xc9\xee\x35\x82\x69\xf9\xf0\x54\x65\xc4\x6a\x2e\xb2\xb8\x62\xd1\xd8\xd0\x28\xdf\x39\xa4\xda\x1a\x47\x46\xd6\x05\xb5\x72\x15\xfd\x5b\x0e\x60\x85\x2c\x9b\xd3\xdc\x8a\x5a\x99\xdd\x83\x9d\x6d\xdd\x51\xeb\x9a\xa9\x4a\x0a\xd0\xb1\x02\x1d\x01\x15\xd8\x84\x90\x7f\x5f\xd9\x97\x84\x25\x16\x05\x11\x0c\xd5\xb6\xd9\x9c\x65\xb7\x36\x07\x2c\x57\x46\x5a\xc5\x10\xb5\x91\x55\x04\x8c\x61\x3a\x40\x10\xcd\x52\x97\x49\xce\x09\x99\x14\x36\x7b\x6f\x22\xf2\x09\x19\x10\x57\xa8\x5b\x91\x6c\x2e\xa5\xb2\x3c\x41\x57\xec\x0b\xf7\x90\xc7\xd3\x0b\xe4\x43\xfe\x0f\xcc\xb3\x29\x74\x78\xe7\x79\x59\xa1\x03\x10\xec\xed\xb1\x22\xb9\xcc\x1a\xff\xb7\xd9\xb9\x82\xd1\x5a\x90\xb9\xbc\x23\x3a\x3e\x6e\xc7\x5c\x8d\x95\x09\x5b\xcf\x66\x95\x10\xdf\x7e\xa0\xd4\x3b\xb7\x6c\xf9\xb1\x3f\xfb\x6f\xf8\x45\x1b\x49\xb3\x47\x63\xfc\x26\x74\x72\x28\xbf\xa4\xbf\xfb\xd8\xa4\x75\x34\x0e\xc8\xc0\xe0\x07\x50\xcb\x5a\x57\xb2\x15\x2e\x2f\xe1\x1e\x10\xf0\xca\x31\x1c\x73\x7b\xc7\x15\x51\x73\xd9\x14\xc0\xf8\x6f\xe4\x43\x26\x84\xfc\x7d\xce\x84\x25\x05\x16\x09\xa7\x39\x13\xdd\x87\xb0\xd7\x11\xb1\xc1\x21\xaa\x45\x22\x1e\x1d\xa6\x7a\x6b\x3b\x94\xd9\xe5\x3a\x6b\x16\xe0\x8f\x11\xb9\x61\x19\x35\xab\x5e\xc5\xc1\x12\x11\x66\x6a\x00\x07\x26\x19\x2d\x79\x3e\x76\xe8\x7d\xef\x61\x66\x9b\xce\xeb\x09\xe0\x76\x8d\x35\xd8\x03\xdc\x46\x32\x90\xdd\xa4\x3a\x65\x53\x68\x5e\x15\x98\x28\x0e\xe2\x50\x13\x2d\x65\x1d\xfe\xd3\x46\xb2\xc2\x98\x57\x1f\x2e\xbf\x3d\xfb\x78\x41\xbe\xbc\xf8\x77\x7c\x3c\x0a\x3d\x51\xa8\xe3\x32\x2d\x19\x4f\x1a\xf3\x96\x2d\xb7\xd8\x9b\x96\x7d\xc5\x75\x02\xb4\x9f\x5f\x7c\xf8\x78\xf9\xf6\xf2\xdc\xcc\x14\x1f\x8f\x56\x1d\x66\x90\x3d\x4d\x1a\x6e\x1d\x4f\xf9\xb8\x4b\xc7\xde\xc2\xdd\xc3\x1c\x46\x4b\x4c\xc0\x55\xb2\x9c\x1b\xd2\x94\xc2\x84\x9a\xf6\x8d\xea\xea\x5d\x5a\x40\x27\x90\xd0\x1e\x50\xc8\x15\x14\x83\x5b\xe5\x3e\x91\xa3\x73\xf0\x91\x86\x3f\x80\x07\x75\x78\x80\x6a\xc3\x6f\xd7\x9c\x2d\x50\xc5\xe0\x71\xc8\x26\xa5\x0f\x6e\x89\x67\x5d\x53\x7d\x7c\xfe\x61\x0d\x9f\x25\x6a\x60\xba\x02\xdd\x46\x26\xbb\xc3\x7d\xa5\xad\xd2\x27\x0f\x28\x96\xab\x18\x77\x0d\x7b\xde\x51\xe5\x64\x19\xab\xfb\x00\x40\x8d\x1f\x6d\x2b\x0c\x67\xe9\xcd\xe1\x91\x1a\x9c\xec\x40\x7e\x07\xf2\xfb\x40\xb3\xdc\xec\xa1\x80\xd3\xa0\x79\x70\xf3\x96\x53\x33\x34\x44\xbe\x76\xb4\x6f\x4e\xaf\xeb\x0b\x70\x40\xa5\xd1\xa4\x31\x30\xaf\x95\x4f\x7f\xc2\xc8\xd1\x87\xeb\xb3\xdf\xbd\xfc\xe3\x6f\x8f\x46\xf0\xcf\xdf\xbf\xfc\xd7\x3f\x98\x7f\x5e\x9c\xbf\xb9\x3e\xbb\xfa\xed\xbf\x04\x7f\xfc\xee\x4f\xbf\x3f\x4a\x0b\xd1\xb4\x1f\xfe\xcb\x6f\x5f\xd9\xd4\x2b\x47\x17\x6f\x7e\xfb\x2f\xff\xf2\xea\x5f\xb7\x48\xb3\x98\x78\x74\x25\xfd\x74\xf1\xa9\xe2\x58\x26\xe4\x9a\x19\x21\xf5\x60\x71\xcd\x9b\xc6\x76\xda\xaa\x92\x7e\xe2\x65\x53\xfa\xc2\xa6\xe8\x00\xa5\xb5\x55\xfb\xa6\x5e\x8a\xe0\xfe\x25\x02\x82\x57\x62\xca\x0a\xcd\xa3\xdc\xe6\x28\x24\x0b\x56\xdf\x50\x0d\x85\xd7\x2c\x21\xd8\xa8\x78\x55\x29\x62\xb3\x69\xad\x55\xc2\xeb\x0e\xda\xf4\xe4\x89\xb3\xbf\x9c\x12\x89\xdb\x36\x82\xda\x37\x63\x5a\x71\x5b\xc1\x11\x6e\x8a\x62\xda\x1a\x39\xfe\xf4\x87\xdf\xbf\x7c\x79\xf2\xdb\xdf\x93\xb9\x6c\x6a\x75\x3a\x59\x79\x3d\x69\x54\xab\x99\x03\x12\x6e\xaf\x90\x9a\xcb\x5a\xbb\xba\xc8\xbf\xfb\xc3\xcb\x97\xe4\xe4\x15\x0c\x75\x6a\xb5\x9b\xee\xc0\x21\xcc\x83\xde\x24\xf2\x29\x78\x22\x5c\x91\x3f\xfe\xe9\x0f\xbf\xfd\xbd\xe9\xfd\x5f\x5f\x91\x9c\x2e\x93\xd9\xac\x8f\xf7\xe9\x29\x2c\x60\x1a\x1e\x8f\x01\x72\x06\x1e\x60\x45\x9f\x65\xe3\x4e\xd2\x88\x84\x07\xf1\x5f\xdb\x4d\xfa\x35\xee\xd2\xbb\x0d\xd7\x03\x03\x6b\x84\x5c\xdf\xcf\xa4\x21\x95\xbd\x6c\x9d\x33\x40\x1d\x95\xd2\x35\xe5\x18\x76\xcf\x04\x14\x42\x01\x9d\x6d\x17\x1a\xd2\x84\x87\x1f\x3a\xe1\x2e\x3f\x74\x15\xb8\x82\x61\x39\x51\xb3\x99\x6b\xc9\x99\xc1\xad\x3f\xaa\xb2\xf1\xca\x96\x62\xa9\x36\xd8\x1c\x07\xd2\xe9\xa8\x34\xdd\x4c\xbf\x9d\x03\xdb\x0e\x92\xa4\x58\x2c\x75\xac\x3c\xf6\xc8\xc9\xf9\xf5\x87\x36\x55\x88\xad\xcc\xea\x98\x56\x9f\xf9\x64\xaf\x04\x06\x6b\xb4\x6c\x65\xa5\xc6\x4f\xef\x09\x6e\xb1\x3f\xfe\x8c\xe3\x5a\x3e\x9b\x0c\x21\xd7\x78\x14\x43\x7a\x90\x27\x4f\x0f\x82\x27\x31\xe4\x06\x69\x17\x37\xe4\x06\x81\x36\xe4\x06\x09\xdb\x90\x1b\xa4\x33\xee\x90\x1b\x64\x88\x3d\x19\x62\x4f\x9e\x3e\xf6\x64\xc8\x0d\x32\xe4\x06\xd9\xdc\x86\xdc\x20\xfd\x6d\xc8\x0d\xf2\xbf\x2d\x37\x08\x82\xd8\xa6\x0c\x21\x56\x22\x6d\xd3\x83\x7c\x76\xd9\x41\x94\x39\xe4\x8c\x9d\x65\x99\x6c\x84\xfe\x28\x6f\x59\x74\x74\xfb\x8a\x0e\x65\xad\x1f\x73\x29\xef\xd3\xa9\xac\xbf\x7c\x30\x05\xcb\x33\xac\x5e\x46\x9b\x9c\x33\x91\x16\xcf\xf2\x18\xd4\xeb\xc6\x73\xf4\xdc\xf0\x31\x22\x67\x79\xfb\x83\xc5\xcb\xda\x1c\xcd\x84\x9c\x91\x9a\x65\xbc\xe2\xb6\x44\x00\xc5\xe7\x69\xf6\x17\x73\x2f\x6c\x21\xe8\xa5\xb9\x2d\xac\x98\x7a\xf4\xe8\x0b\x44\xd7\x81\xfe\xc1\x52\xea\x95\x29\xa5\x89\xb1\x66\x9a\xc8\x07\x02\xd7\x77\xc7\x15\x73\xb6\x5f\x6b\x32\x08\x56\xf9\x31\x1c\x2d\x0c\x37\x4b\x1d\x36\x58\x8e\xdd\xc7\xad\x94\xd9\x5b\xe1\x4a\xf6\x54\x06\xb6\xb5\x81\x5b\x66\x11\x4c\x53\x58\x5b\xc5\x57\x92\x5c\xd0\x82\xe7\x86\xfa\xba\x04\x18\x88\x12\xd2\xc0\x18\xf1\x87\x87\x52\xd5\x9e\x26\x06\xb7\xd0\x6c\xce\x54\x30\x33\x94\x78\x6e\xad\x95\x2d\x31\x60\xc3\xb4\xaa\x68\x66\x5c\xa0\x80\x04\xfd\x3b\x7e\xa3\x0d\xb9\xb0\x0b\x59\x9d\xdc\xc7\x60\x60\xf3\x79\x9a\x09\x05\x18\xcc\x8d\x11\x1e\xb8\x5a\x3e\x0d\xff\x50\x44\x16\xb9\x33\x49\xfc\xe9\xa5\x91\xa9\x33\xbc\xba\x89\x8a\x5e\x85\xd1\x22\x5a\x92\xc2\x70\xfb\x86\xcc\xdd\x3f\x90\xb7\x7d\xbc\x09\xae\x0e\xda\x7c\x92\xfd\x18\x7c\x9e\x09\x4d\x0a\x46\x95\x26\xaf\x5e\x92\x92\x8b\x46\x6f\x93\x1b\xff\x51\xa6\x95\x3f\xfc\x3e\xfa\xbb\x47\xe5\xd4\x4f\xbc\x6d\xa1\x34\x06\xff\xf6\x22\x99\xd5\x1b\x97\x00\x7c\x95\xe4\x42\xaf\x0a\x68\x81\xc3\x53\x3a\x36\x05\xcd\xf4\xde\xb0\xd8\xd6\x62\xcc\x8f\x8d\xbc\x59\xf6\x05\x29\xa6\x6d\xb8\xed\xb2\x5b\xdf\xec\xff\xd9\x87\xb8\xbd\x12\x49\xd4\xdc\xb0\xe6\xa0\xc7\x50\x73\x5a\x33\x5b\x39\xf9\x58\x79\x7b\x62\xdf\x7e\xbd\x31\x43\x40\xd0\xd0\x6b\x3f\x02\x57\x24\xf7\x8f\xbd\x2a\x83\x8b\xb1\xae\x19\xf3\x93\x03\x29\x03\x74\xf4\xce\x0e\x19\x19\xd5\x1f\xcd\x38\xc5\xb2\x4b\x63\x52\xb3\x19\x57\xba\xee\x53\xe3\x8e\x63\x10\x6f\x3c\x17\x35\xab\x65\x13\x51\x1e\x20\xfd\xb2\x41\xc7\x4e\xa1\xe1\x0c\x4b\xb6\x12\x76\x8c\xcb\x9f\x45\x83\xf6\x74\xa0\xb7\xde\xaf\x12\x2e\x4b\xcd\x68\xfe\xb5\x28\x22\xb4\xd2\xe9\x4b\x77\x7d\xa3\xac\x0a\xd4\x0e\xac\xf3\x00\x82\x0e\x40\x5d\x19\x76\x10\x83\xe1\x3e\xb0\x1c\x39\x3a\xf3\xf9\x18\xd2\x5f\x04\xda\xdc\x18\x9c\x11\x52\x8e\x29\x2d\x54\x74\x45\xfb\x38\xa9\xc9\x01\xe8\x7e\xb6\x0c\xfb\xee\xa2\x0b\xeb\x25\x2d\xeb\xd6\x2b\xda\x6d\xdf\x07\xf7\x81\x65\x18\x62\xa4\xe8\x96\x39\xa6\x81\xdd\x87\x2a\xc0\x40\xaf\xcd\xb5\x47\xc3\xeb\x89\x1f\x2d\x0c\x95\x73\x8e\xad\xf6\x94\x32\x59\x96\x34\xaa\xe0\x0f\x5a\x02\x29\x04\x67\x2b\x1b\x35\x21\x74\x4d\x8b\x76\xd5\x41\xd2\x8a\x5d\x02\xb9\x66\x82\x8a\x08\xa3\x7e\xfa\x79\x61\xcf\x44\xde\x79\xa7\xec\x19\x5f\x30\xb1\x0a\xdd\x56\x08\xf9\x82\x66\xb7\x2c\x2a\x7e\xf3\x1b\xe5\xf6\x37\x5f\x0a\x6a\x63\xea\x0c\x3a\x5b\x70\x73\x0d\x58\xbe\x32\x82\x1a\xb5\xfe\x44\x50\x43\x19\x43\x16\x91\xd1\xdc\xe5\x56\x36\x8a\x45\x24\xef\x48\xdf\x48\xd3\xef\xe3\xb1\xa4\x42\xfb\x4f\xcd\x17\x19\x73\x9c\xb3\xe9\x79\x97\x3b\x80\xb3\x4b\xdc\x03\x07\x07\xc1\x7d\xb3\xbe\xe9\xd6\x85\x01\x13\x16\x14\x06\xe7\x2d\x5d\x62\xa6\x55\x28\xb2\x85\xff\x63\xb1\x59\xef\x6a\xea\x9b\x1e\x72\x9c\x76\x8c\xf5\x4d\xde\x45\x5b\x1f\x68\x2e\x15\xf9\x02\x22\x2f\xde\x30\x10\x67\xf6\xc7\xf0\x7c\xf8\xe2\x4d\x0f\xb3\x63\xe6\xf7\x9c\x18\x1d\x5e\xd2\x59\x1f\xeb\x3c\x26\xa5\x14\x5c\xcb\xfa\x61\x7c\x18\xcf\xe7\x4c\x55\x9c\xdb\x73\xfa\x0d\xc6\x9e\x9d\x34\xd1\x26\x56\xf0\x7e\xcf\x81\x99\x10\x0e\x7d\x29\x1b\x72\x47\xb1\x78\x24\xc0\x45\x0c\x6d\xff\xc8\xab\xd7\xe4\x42\xa8\xa6\x0e\x22\x6e\x57\x07\x33\x48\xd0\x1d\xab\x43\x85\x00\x6c\x58\x35\x12\x0a\xbc\x61\xd2\x87\x88\x11\x2f\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\x55\xc1\x33\xae\x8b\x25\xe1\x62\xca\xea\xda\x6b\xf5\xf1\x83\x15\x27\xa7\x98\x31\x13\x75\xec\x4a\xcb\x9a\xce\xd8\x0b\x4b\x0b\x7e\x59\xdf\xf4\xd3\x98\x04\x8c\x07\x80\xba\x0f\x90\x81\x8e\xbd\x82\x07\xb0\x05\x3e\x8a\xad\x6d\xb6\x61\x9f\x98\x3d\xae\xc9\xed\x9f\x60\xa7\xec\x9e\xbc\xa8\x6f\xf2\x17\x1f\x2e\xce\xde\xbc\xbb\x98\x94\xf9\x2f\xe7\xf2\x6e\xac\xe5\xb8\x51\x6c\x1c\xe1\xea\x9c\xb0\x57\xb7\x6c\x09\x39\x89\xf6\xb0\x5b\xb6\xeb\x8e\xbc\xae\x25\x98\x0b\xe0\xb9\x61\x9e\x3e\x7c\xf1\xe6\x1b\x15\xa7\x1f\x0c\x04\x8b\x17\x4c\x67\x2f\x32\x56\xcd\x5f\xd8\x31\x3e\xcf\xbd\x0f\x0c\x3c\x6b\x2b\xea\xf9\xd4\x61\xd9\x7d\x9c\x9b\xeb\x1b\xa9\x7f\x26\x8b\x02\xfd\xe2\x0d\x4e\x3c\x67\xd5\xdc\xbf\xf0\xec\x76\x3d\xce\x11\x2d\xda\xfd\xec\x30\x3a\x1c\x02\x39\xa7\x64\x84\xc1\x2e\xfd\x28\x4d\xbf\x5d\x7c\x05\x4f\x62\xd1\x55\x70\xe5\xea\x9b\x6d\x09\xc1\xf3\xb9\x64\xfd\x64\xe6\xc9\xb4\x0b\x1f\xdc\x8f\x8a\x69\xa0\xf7\x5c\x10\xcc\x51\xff\xce\x70\x1a\xfb\x52\x23\x1c\xf8\xc0\xe2\xf4\x15\xe8\x7a\x1e\x95\xe3\x34\xfd\x14\x7c\xe7\xc0\x55\x07\xbe\x18\xb4\xd1\x73\x26\xb4\x0b\x4f\xb4\xfe\xef\x21\x8d\x22\x97\x53\x94\x68\xf3\x28\x03\xb7\x5c\xb0\xba\xe6\x39\x53\x24\x81\x48\x85\xda\x33\x5e\x3c\xbb\x03\x8c\xb4\x38\xa7\x19\x83\xe3\xbd\x6f\xb6\x33\x1d\x3c\xc6\xe3\xe6\xd0\xbe\x36\x07\xf6\xb2\x79\x9c\x7f\xcd\xd3\x7a\xd6\x24\xdb\x89\x53\xbc\x69\x1e\xe3\x61\xb2\x57\x95\x53\x87\x98\xc3\x93\x2d\x88\x39\xcd\x4b\x1e\x15\xb2\xfc\xac\xc9\x39\xac\xe2\x81\xd7\x55\x46\x0b\x76\xf9\xf5\x2e\x55\x46\xb6\xcb\xae\xda\xe8\xda\x3e\xac\x58\xed\x72\x35\x38\x8d\xa0\xd6\x34\x9b\x5b\xd5\x8e\xb3\x15\x48\x01\xa1\x64\x08\x5b\x44\xc8\xbc\xdf\xb8\x1b\xea\x8d\xdc\x68\x0f\xeb\x8e\xdc\x44\x9f\x93\xfe\x68\x46\x35\xbb\xeb\xe5\xcf\xc7\x2d\x89\xee\x7f\x13\x94\x22\x9f\xb9\xa6\x29\x45\x9b\xe4\x5d\xfb\xd7\x7a\xd9\xa5\xfe\x68\x72\x8f\xe6\x28\x0d\xc9\xc0\xb7\x3b\xd3\xfd\x62\xf3\x77\xff\xd3\xb4\x8f\x48\x58\x68\x4b\x3c\x4f\xfb\x95\x3b\x2b\xd8\x44\x1b\xd7\xe9\x58\x08\x77\x01\xcf\xae\x2e\xc9\xdf\xf0\xf5\x9d\xae\xb2\xaa\xa5\x46\x81\xfb\x8d\x2c\x29\x8f\xf0\x4b\xec\xac\x60\xf5\x73\xb7\x94\x90\xd7\x75\x4b\xb8\xf2\xef\x12\xfb\xb2\xcb\xe6\x80\x35\xe2\x9b\x9a\xe5\xc4\x2a\xeb\x76\xba\xc6\x83\xc8\x59\x6b\xf2\x10\x39\x31\xbf\xbd\x80\x3c\xa9\xa7\x93\x56\xe6\x5a\x11\xc8\x62\x34\x03\x3b\x11\xd9\x9e\xa1\x50\x14\xd8\x77\x5c\x24\x66\x2b\x08\x39\xb0\x01\xb6\xc3\x7b\x17\x46\xf5\x2f\x14\x07\x37\x9d\xc0\x31\xd6\xe6\xb9\xe4\xaa\x0d\xb6\x44\xd9\x6a\x44\xbe\x92\x33\x2e\x1c\xf2\x92\xd6\xf1\x6c\x4a\x63\x04\xa2\x41\x4e\x19\xe4\x94\xd5\x36\xc8\x29\x1b\x9b\x52\xc5\x85\xa0\x37\x45\x8c\x4f\x78\xd7\xe9\xdd\x7f\x48\xde\x16\x74\x46\x18\xfc\xf1\x22\xe7\xca\xfc\x9f\x5c\x5f\x7f\x05\x5e\x16\x8d\x70\xca\x14\x80\x00\x4b\x2b\x7d\x49\x0b\xc4\xc9\xbb\x45\x92\x48\xaa\xde\x45\x05\x7b\x6e\x81\x26\xdb\xee\x7d\xbe\x6b\xd5\x09\x8c\xb0\x6f\x00\xb6\xa4\x3e\xec\x1b\x3d\xaf\x6f\x98\xb9\xa5\xd9\xed\x55\xe0\x14\x21\x6b\xf3\x4c\x04\x8f\x12\x99\xac\xe4\xaf\xb7\x63\xb7\x56\x86\x89\x3b\x86\xab\x74\xa5\x76\xf0\xa5\xe3\x5b\x1c\xd1\xb9\xb6\x5b\x0b\xbf\x51\xa5\x64\xc6\x5b\xa7\x1e\x9b\x2d\xcd\x31\x33\x39\x30\x33\x3b\xdd\x0c\xe4\x9f\x53\x97\x83\x0c\xfa\x06\x0e\xcc\x01\x8a\x7d\x83\xaa\x90\xe3\xe2\xc2\xad\x7a\xa7\x4b\x40\x70\x8c\xcb\x81\x92\x7e\x39\xda\xde\x57\xd7\xeb\x2f\xc2\xaa\xbb\x88\xcb\xaa\x60\x4f\x38\x42\x9a\xb3\x6b\x9e\x53\x54\x63\xac\x41\x01\x57\xfe\xd2\x41\x9d\x81\x9d\xed\x5f\x4c\x9a\x95\x44\x55\x02\xf2\x55\x5d\xbf\x39\x7c\x66\x5d\x4c\x00\x6b\x54\xb2\x6a\x0a\xf4\x7a\xf7\x8b\xeb\x5b\xd5\x23\xad\xf1\x38\x8b\xdd\x68\x07\xe2\x39\xac\x20\x12\x7b\x1f\xe0\x19\x06\x7a\xa7\xc7\xe3\x3b\x88\xc5\xc4\x7f\x37\x4b\xd7\x5d\x92\xcc\x7e\xc8\x70\xfc\x5d\x85\xdf\xc7\x68\x37\x3a\x01\xfa\x1d\xa9\xeb\xe5\x1f\x7e\xff\xfb\x28\x82\xc6\x6b\x96\x69\x09\x2e\x9b\x36\x81\x87\xf7\x18\xa0\x35\x03\xe9\x00\x63\xe5\x9d\x7e\x03\xdd\x06\x75\xa4\x55\xe5\x10\x91\xf9\x7b\x8e\xc4\x4f\x8b\xe9\x48\x89\xb4\x8f\x34\x87\x6f\xe1\x2d\x03\x19\x93\x2e\x0f\x96\x31\xe9\x40\x79\x92\x0e\x93\x1d\xe9\x10\x39\x91\x0e\x92\x09\xe9\x70\xf9\x8f\xf6\x9c\xf5\x68\x2f\x2e\x26\xfb\xcc\x6b\x94\x18\x24\x9c\x16\x20\x1c\x9f\xb9\x28\x3a\x8c\x38\x35\x84\x38\x21\x37\xd1\x6e\x33\x12\x25\x4b\xf4\x29\xd9\x87\xb6\x0d\x8f\x3b\x5c\xa6\xa1\x27\xcc\x2f\xf4\xd4\x59\x85\xf6\x9c\x4b\xe8\x70\x19\x84\x0e\x92\x37\x68\x9b\x38\xd4\xf4\x1c\x41\x29\xf1\xa7\xdb\x5e\xae\xbd\x67\x01\xda\x49\xee\x9f\x1d\x67\xfc\xd9\x5d\x9e\x9f\xc3\x39\x52\xc6\x67\x3f\x79\x74\xce\x13\x95\x9c\xf4\x24\xdd\xde\xb3\x2f\x65\x4d\xdb\xfb\x46\xe5\x94\x4b\x0c\xeb\x12\xbb\x1f\xa3\xab\x9c\xaa\x28\x96\x89\x6d\xb6\xf6\x2d\xdc\xb1\x1e\x82\x24\x68\x70\xb0\x77\xd9\xc3\x5c\x24\x2a\x71\xb0\xd3\xaf\xaf\x57\x3c\x42\xfc\xe3\x7d\x3a\x82\xf8\x41\x7a\x5c\x41\xdc\xc2\x0f\xe0\x0c\x32\x78\x5b\xec\xce\xdb\x62\xf7\x71\x3a\xcf\xcd\x40\x9f\x0f\x06\xfa\x64\x03\xbd\xea\x54\x91\x77\x0a\x63\x40\xc9\xc0\xd4\xca\x9b\xb0\xe2\x52\x8b\x23\xce\xae\x2e\x23\xc6\x69\xab\xc2\xa8\xc9\x26\x6e\xd7\x99\xee\x2c\x17\xed\x33\x9f\x6b\xcd\xca\xaa\x17\x8d\x90\xc1\x3e\x3f\xd8\xe7\x37\xb4\xc1\x3e\xbf\xb1\x1d\xda\x5e\x37\x6f\x4a\x2a\xa0\x62\x2a\x98\xf1\x3b\x0e\x63\x2b\x0c\xcd\x84\x58\x4c\x1a\x79\x2d\x31\x13\x03\xe4\xc6\x68\x04\xff\xb1\x61\xad\x3e\xcb\x33\x96\x7b\xb2\x75\x42\xdf\xfb\xdd\x40\xe4\x8b\x57\x30\x73\x26\xd7\xa2\x88\xed\x9a\xfd\x66\x3a\x14\x1b\xbb\x89\x30\x4c\x47\x45\x0b\xd5\x52\x6c\x59\x9c\x0e\x93\xde\xd1\x3f\x58\xf4\x03\x38\x21\x56\xcb\x1d\x72\xa6\x06\x10\xcc\x7a\x6c\x1a\xae\x1b\x46\x4a\x5e\xd7\xb2\xb6\x76\xd7\x70\x49\xe8\x40\xc8\x67\x73\xcd\x6a\x94\xfc\xeb\xe8\xfa\x58\xd7\x4c\x5b\xa8\x02\xa8\xd4\x12\x2a\xfa\x09\xfb\x6f\x17\x4e\x03\xcb\x75\x74\xe8\x86\xcd\xe9\x82\xcb\x26\x2a\x80\xf4\x1a\x29\xe5\x91\xfd\x18\xf8\xa7\xa5\x6c\xbc\x85\x09\xcb\x9e\xf9\x3d\x54\xeb\xe7\x15\x31\xc8\xfb\xf6\x73\x50\xd0\xe4\xd2\xa9\xcf\xc7\xec\x13\x57\x7a\x7d\xc7\xdc\x51\x59\x1b\xe3\xce\xae\xc1\x42\x55\x06\x8b\x7f\x1b\x91\xfe\x21\x0d\xf8\x3b\x1d\x77\x05\x9f\xc5\x35\xfc\xd4\x27\xf6\xd8\x8c\x70\x98\xc0\x85\x94\x34\x9b\x73\x91\x94\x3c\xe1\xdb\xce\x14\x3a\xf2\xcf\x84\x9c\x15\x45\xeb\x3b\xa8\xbc\x4b\xab\x93\x87\xba\xd3\xd7\xfd\x25\x82\x0d\x7c\xd4\x2c\x07\x1b\x65\x5b\x91\x30\x53\x7c\x62\xbb\x9a\x2c\xca\x3b\x5a\xb3\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\xf7\xe6\x3c\xdc\x83\x7f\x3d\x6e\x7a\x6f\xcd\xbe\xe7\x25\xa3\x0d\xf2\x59\xdb\x52\xdc\x91\x9c\xa3\x54\xc1\xb3\xe5\xe5\x9b\x6d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa8\x62\x39\x79\x47\x05\x9d\xa1\xfa\xf0\xe4\xfa\xea\x8b\x77\xa7\x06\x80\x40\xdd\x79\xf9\x66\xa3\x1f\xd6\x75\xd8\xf9\xfb\x5d\xe6\x7f\x59\x5b\xf8\x16\xbc\xd1\xda\xf7\x5b\x2e\x7e\xa7\x89\x6d\x88\x67\x27\xe2\x0a\x90\x6e\x48\xd5\x73\xb5\x9a\x19\x11\x9d\xa4\x5c\x4a\x56\xb5\x8a\x9a\x17\x65\x7e\xfb\xb8\xe9\x73\x23\x4d\x14\xc5\x55\x41\xc5\x59\x55\xd5\x72\xb1\x59\xeb\x1a\x83\x1c\xdc\xf7\x6e\x01\xe8\x60\xee\x1e\x56\x78\x22\xe0\x53\x29\x50\x88\xc1\x61\x37\xef\xff\xa5\xf6\x8a\x59\x29\x80\x05\x3b\x3a\x6b\xb4\x2c\xa9\xe6\xd9\x11\x91\x35\x39\x7a\x47\x45\x43\x8b\x8d\xb1\x29\x0f\xae\xf8\x3e\x01\xf3\xc1\x8f\xd0\x11\x6d\xcb\xcf\x1e\x64\x60\x1f\xfe\x5e\xd3\xda\xa0\xba\xf3\xeb\x6f\x93\xbe\x55\x9a\xea\x66\x8d\x32\x3c\x40\xad\xee\xa7\x4f\x63\x52\x50\xa5\xbf\xa9\x72\x83\x1f\x56\x7e\x7d\x88\x08\x65\x54\xd3\x42\xce\xfe\x8d\xd1\x62\xf3\x65\x88\x01\xa9\xf3\xb0\x93\xb6\x4a\x37\x20\xa8\xe6\xc6\x7f\x7f\xac\x88\x11\x25\x0d\x94\x70\xad\x48\xcd\x0a\xb6\xa0\x42\xbb\xcf\xaf\xe1\x14\xd4\xb1\xdd\x96\x7b\x01\x8e\xb7\x36\xd6\x9c\x69\x56\x97\x5c\x74\xc7\xb9\x86\xef\xcf\xa5\xc0\x2a\xc8\x0a\xad\x48\xf8\x45\x77\xac\xfb\xa1\xf2\x3e\xd7\x83\x07\x9c\x0d\x3a\x3b\x15\xce\xa7\xbb\x3d\xf8\xda\x8d\x15\x5d\xe6\xf8\x10\x3c\x37\x3b\x73\x5b\xdb\x3d\x72\x2b\x8c\x44\x01\x19\xce\x37\xef\x4d\x2f\x9b\xd3\xc7\xde\x8c\x1d\x38\xe0\x14\xee\x8f\x0a\x1c\xdb\x79\xdf\xe7\x94\xf0\x10\x34\x62\xeb\x67\x8c\x56\xa7\x72\x3f\xa6\xee\x6c\xfc\xf9\xca\x67\x98\x58\xc5\xfb\x36\xa1\x97\x47\xe7\xa5\xfb\x29\x4b\x14\xdf\x18\xc7\xe2\xd1\x8a\x7f\xcb\x6a\x65\xa6\x18\x2f\x1d\x9c\x5d\x5d\x92\x05\x7e\x95\xa6\x0b\x8b\x24\x85\xa0\x23\xeb\xa7\x82\x69\x2c\xe7\xa5\x0d\x6c\xaa\xad\x04\x4b\x49\xc5\x19\xe6\x56\xa7\xc2\x6e\x26\xd0\x33\x46\x73\xfb\xd0\xd0\xcd\x9a\xd9\xdf\x46\xd6\xe3\x30\x8a\x41\x41\xbf\x5d\x67\x83\xa5\x98\xf2\x1b\xbc\x11\x5e\xfc\x4d\x5a\x1d\xa0\x4d\x15\x68\xb0\x0a\x70\x17\x23\xa2\x9a\x6c\x4e\xa8\x11\x64\x94\xb9\x0e\x06\x5f\xb0\x49\x49\x05\x9f\x32\xa5\x27\xb6\x37\x56\xab\xef\x7e\xfb\x7d\x1f\xdb\xf1\x56\xd6\xc4\x46\x69\x8f\x5c\xe6\x6a\xbb\xc6\x16\xe6\xb8\xc2\x8d\xf0\x3d\xb7\x1a\x99\x4a\xe6\x76\xc1\x77\xb0\x14\x4d\x6f\x0d\x29\xc5\xa5\x34\x0c\xbc\x06\xfa\x78\x94\x23\xc3\xf6\x06\xd3\xfe\x6f\x43\x3b\xff\xe7\x88\x9c\xdc\x01\x13\x72\x64\xfe\x3c\xc2\xe9\xf8\x48\xb3\x50\xe1\xd4\x4e\x0b\x93\xa6\xd5\x7c\x36\x63\x75\xaf\x8d\xd5\x7c\xca\x16\x4c\xe8\x53\x9b\xb5\x5b\xc8\xa0\x2b\xe7\xe7\xd7\xea\x4f\x56\xa7\xf9\xdd\x6f\xbf\x3f\x22\x27\xdd\x3d\xe9\x19\x92\x8b\x9c\x7d\x22\xbf\x45\x6b\x29\x14\x17\xcf\x4f\x27\xa8\x70\x51\x4b\xa1\xe9\x27\x33\x62\x36\x97\x8a\x09\x54\x80\x69\x49\xe6\x74\xc1\x88\x92\x25\x23\x77\xac\x28\xc6\xd6\x7e\x4c\xee\xe8\xb2\x3f\x59\xb9\x3b\x42\x48\x81\x4a\x2a\x5a\xeb\x0e\x18\xef\xe4\x12\xde\x72\xb1\xd3\x4c\x8b\x5f\x72\xb1\xea\xd2\xd9\x2b\xe0\x6d\x50\x0a\xcf\xb8\x76\x59\x07\x6c\x7c\x91\x5e\xbe\x30\x87\x55\xf3\x9b\x46\xcb\x5a\xbd\xc8\xd9\x82\x15\x2f\x14\x9f\x8d\x69\x9d\xcd\xb9\x66\x99\x6e\x6a\xf6\xe2\xff\x63\xee\x7c\x7e\xdb\x06\xa1\x38\x7e\xdf\x5f\x81\xd4\x43\x2f\xf1\x7a\xdf\x4e\x5b\xd2\x6d\x91\xaa\x6d\x6a\x93\x49\x3b\x52\x9b\xa5\xa8\x8e\x1d\x81\xdd\x68\x9a\xf6\xbf\x4f\xf0\xc0\x86\xc4\xfc\x4a\x5c\x67\xb7\x36\xb6\x93\xc7\x03\xc3\xf7\x7d\x78\x00\xde\xd1\x2c\xaf\x2b\xd1\x30\xe4\x9e\xbc\xdb\xe2\x4a\x78\x82\x67\xa2\xa0\x7e\x4a\x1c\xe9\xb1\xf0\xdc\x43\x9a\xc7\x4e\x99\x6b\xb8\x0c\x46\x4f\x70\x50\x04\x8a\x4d\xf7\x12\xf0\xce\x8b\xbb\x4a\x22\xbf\x9b\x31\x3c\xc5\x08\x68\xff\xf4\xb1\x39\xe8\xaf\x07\xe8\xf8\xf2\xc3\xdf\x10\x7d\x12\x64\xfb\xca\x2e\xcc\x1a\x25\xb6\xb8\x80\x61\x04\x57\xc1\x75\xee\xaf\xfc\xce\x8a\xfa\x68\x99\xb0\xec\x77\x26\xbf\xa2\x2e\x33\x5c\x15\xe2\x6f\xd8\x78\x23\xf7\x67\xa4\x46\x56\x40\x4b\x47\xed\xfc\xd6\xcb\xc5\xe5\x9b\xe7\xcd\x55\x4b\xc7\xe8\xe9\x4e\x99\xcf\x52\xba\x3c\x52\x2c\x43\x48\x02\x19\xba\xac\x25\x5a\xc0\xd8\x81\x08\xe5\xfa\x5b\xdf\xab\xcc\x81\xee\xa0\x9b\x90\x74\xf6\xcf\xe6\x1b\x31\x42\xa4\xbd\x77\xfd\x13\x26\x0b\x97\x99\xff\x98\x37\xea\x28\x11\xbd\xf3\xab\x55\x0c\x1d\x9c\x3e\xe1\x6a\xe3\x91\x36\x51\x15\xa3\xf3\x26\x85\x21\xd9\xe0\x61\xee\x79\x17\x7c\x06\x63\x6a\x23\x4e\x95\xa1\x4a\x49\x79\x77\x9c\x86\x08\x5b\x79\x83\xf0\x0b\xa6\xa5\x9c\x27\xac\x1f\x39\x61\x2f\x0a\xb6\xc3\x61\x57\xf8\x30\xc6\x86\xd7\xb6\x01\xc1\x3b\x51\x84\xab\xcb\x70\x5c\x2b\xbe\x02\xc8\xa8\xf7\xc0\x7a\xa7\xd5\xa3\xc4\xb7\x80\x16\x9c\x97\x9d\x13\x14\xe1\x20\x4f\xb4\xbf\x2f\x04\xb3\xe6\x91\xe0\x66\x45\x7d\x0a\xe5\xa8\x49\x5b\xcf\x69\x2e\xd7\x37\xe8\x3d\x41\x9b\xba\x11\xb2\xb3\x95\x6d\x1f\xe2\x03\xd8\x4b\xbe\x6b\x68\xaf\xdd\xa2\xfb\x52\xae\x18\x96\x3b\x4c\xd4\x55\x62\x31\xed\x07\x8f\xcb\xa9\x62\x11\xd5\x92\x1a\xb8\x1b\xfd\x62\xf5\x56\xc2\x45\xa8\x3b\x98\xaa\xf4\x6f\x86\x31\x6a\x91\xb7\x84\x73\xef\x16\xc7\xf6\xb2\x12\xb8\x1b\x5e\xe5\x83\x49\xfe\xad\xbe\x06\xcb\xd9\x45\x50\x51\x90\x06\xd3\x52\xbf\xca\xe0\x8a\xce\x4b\xa1\xde\xd5\x5b\x40\x46\x30\xf7\x09\x1a\xcb\xea\x7b\x79\x33\x18\x5d\x57\x24\xdb\xd7\xac\x40\x73\xbc\x25\xe5\x1c\x73\xa2\xbe\xcb\xdc\xaf\x06\xea\xe8\x9a\x8f\x6a\xf2\x30\x0e\x75\x98\x0c\x90\xaf\x9f\x50\x90\xff\xf5\x01\x2d\x18\x38\xd3\x54\x7a\xc5\x5a\x32\x43\x9f\xc4\xe8\x35\x43\xeb\xea\xb9\xaa\xf7\xe7\xd9\xda\x78\x27\xeb\x2c\x4b\xcd\x0c\x49\xbd\xdd\xb9\x05\xf6\x3a\x73\x4f\xb4\x48\x75\xf8\x0e\xfa\x6c\x0f\x36\xdd\xad\xda\x22\xf1\xe7\x11\x6a\x14\xa1\x35\xab\x37\x8c\x70\x0e\x14\x27\x19\xdf\x1b\x13\x16\x9f\x49\xa5\xe6\x87\x83\xe6\x2d\x87\x9e\xd2\x96\xea\x71\x6d\xd3\x5f\x51\xf5\xad\x7e\x6c\x57\x0e\x4a\x0d\xff\xca\x08\xc3\x50\x07\x64\x74\x59\x38\x0c\x17\x8d\x51\xcf\xb8\x17\x44\x89\x8f\x8c\xeb\xd2\xcd\x1f\x7e\xb8\x9d\xed\x1c\xfb\x42\xe3\x53\x18\x3f\x9e\x0b\x1e\x83\xef\x4c\x10\x36\xc6\x2a\xfd\x69\x00\xe3\x25\xd1\xe2\x65\xa1\xe2\xe4\x38\x71\x52\x90\x38\x1d\x42\x3c\x11\x1e\x06\x5f\x24\x1f\x30\x8c\x7d\x87\xd2\x20\xe1\xc5\xf1\x60\xd0\x27\x3e\x24\x18\xeb\x93\x34\x0c\x38\x35\x00\x8c\x72\x81\x17\xfa\xa5\xf8\x21\x11\xf4\x4d\x8c\xf8\x82\xbe\x88\xc4\x7a\xb1\x1e\x79\x3d\x94\xf7\xdf\x42\xbc\xa0\x8b\x3d\xe0\x2e\xd6\xad\x49\xb0\x6e\x62\x4c\x17\x28\x7f\x1a\x9a\x53\x1a\x93\x14\x31\x12\x7d\x69\xdc\x6c\x8a\x74\x25\x10\x65\x02\x9c\xba\x43\x27\xdc\x99\x52\xf2\x54\xa5\x2e\xc4\xf3\xa9\xf9\x1f\xca\xe4\x78\x35\xac\x24\x3c\x29\xba\x98\x32\x54\x04\x84\x16\xb7\xdf\xef\x6f\xe7\x1f\x56\xb7\x8b\x43\x15\x9e\x2e\x97\xfd\xa0\x28\x33\xe4\xb2\xe3\x06\x31\x58\x39\x2e\x89\xb6\xe5\xb8\xd4\xb6\x74\xe8\xa9\xf3\xc5\xfb\x59\x9a\xe1\xac\xc1\x35\xdc\x4f\x8c\xd4\x51\xc8\xb6\x05\x59\xab\x42\x55\x3e\xd5\x65\xc1\xf5\xfa\x86\xe5\xa2\xdb\x88\x80\x56\x79\xd9\x16\x42\x72\xad\xd7\xcb\x05\x7f\x8b\xd0\x47\x92\xe3\x96\x0b\xe9\xe6\x0e\xd7\xeb\xea\xba\x41\xdf\xbe\xde\xfd\x94\x4b\xbb\xe4\x93\xb3\x6e\xbb\x54\x79\xf6\x1e\xc5\x70\x7c\xa0\x2c\xa8\xfc\x56\x90\x75\xd2\xa2\x1c\xef\x44\x0f\xec\x46\xfe\x14\x76\xaf\xc1\x55\x81\x9e\x48\xb9\x13\xa3\xc3\x33\x41\xfd\x39\x65\xe2\x07\xe5\x55\x58\xbf\xa1\xf2\xd8\x37\xa4\x81\x4d\x09\x7c\xa9\xea\xde\x0a\x08\x10\xf6\x33\xd8\xba\x85\x0b\x14\x7d\xd9\x63\xae\x08\xe5\xa0\xb5\x81\xa6\x12\xe6\x71\x6e\xa4\xe5\x80\x59\x30\xb2\xc8\xff\x8e\x6c\x16\xc6\xf6\xdc\x0a\x92\xc3\x68\x13\x4d\xcf\xdd\x99\x80\xc3\x27\x44\x1f\xb1\x2b\x72\xe8\x64\xeb\x87\xbb\xb5\x40\x86\xc9\x71\xb6\x70\xc2\x5e\x48\xf1\x4e\xce\xe7\xe8\x8f\x20\xdb\xd6\xfe\xac\x7d\xd4\x62\xc6\xe8\x75\x14\x81\x43\x7f\xfe\xbe\xf9\x17\x00\x00\xff\xff\xc4\xc9\x92\x01\x49\xa6\x03\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( diff --git a/staging/api/go.mod b/staging/api/go.mod index 67febe8403..7a219074d7 100644 --- a/staging/api/go.mod +++ b/staging/api/go.mod @@ -5,16 +5,16 @@ go 1.24.4 require ( github.com/blang/semver/v4 v4.0.0 github.com/go-bindata/go-bindata/v3 v3.1.3 - github.com/google/cel-go v0.26.0 + github.com/google/cel-go v0.26.1 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.9.1 - github.com/stretchr/testify v1.11.0 + github.com/spf13/cobra v1.10.1 + github.com/stretchr/testify v1.11.1 google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 - k8s.io/api v0.33.4 - k8s.io/apiextensions-apiserver v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/client-go v0.33.4 - sigs.k8s.io/controller-runtime v0.21.0 + k8s.io/api v0.34.1 + k8s.io/apiextensions-apiserver v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 + sigs.k8s.io/controller-runtime v0.22.1 sigs.k8s.io/yaml v1.6.0 ) @@ -25,16 +25,15 @@ require ( github.com/cenkalti/backoff/v5 v5.0.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.11.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -43,14 +42,14 @@ require ( github.com/kisielk/errcheck v1.8.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.16.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/pflag v1.0.9 // indirect github.com/stoewer/go-strcase v1.3.1 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect @@ -63,6 +62,7 @@ require ( go.opentelemetry.io/otel/trace v1.36.0 // indirect go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/lint v0.0.0-20241112194109-818c5a804067 // indirect golang.org/x/mod v0.25.0 // indirect @@ -79,13 +79,13 @@ require ( google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.33.4 // indirect - k8s.io/component-base v0.33.4 // indirect + k8s.io/apiserver v0.34.1 // indirect + k8s.io/component-base v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a // indirect + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) diff --git a/staging/api/go.sum b/staging/api/go.sum index 58a1e27fbb..2ee1585bbf 100644 --- a/staging/api/go.sum +++ b/staging/api/go.sum @@ -19,12 +19,12 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.11.2 h1:1onLa9DcsMYO9P+CXaL0dStDqQ2EHHXLiz+BtnqkLAU= -github.com/emicklei/go-restful/v3 v3.11.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -46,11 +46,10 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= -github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= +github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -86,8 +85,9 @@ github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUt github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= @@ -112,10 +112,10 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -128,22 +128,22 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= -github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= @@ -170,8 +170,8 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= -go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE= -go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 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= @@ -243,35 +243,33 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= +sigs.k8s.io/controller-runtime v0.22.1 h1:Ah1T7I+0A7ize291nJZdS1CabF/lB4E++WizgV24Eqg= +sigs.k8s.io/controller-runtime v0.22.1/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/staging/operator-lifecycle-manager/.bingo/Variables.mk b/staging/operator-lifecycle-manager/.bingo/Variables.mk index 7d111bbc09..81a37089c2 100644 --- a/staging/operator-lifecycle-manager/.bingo/Variables.mk +++ b/staging/operator-lifecycle-manager/.bingo/Variables.mk @@ -35,11 +35,11 @@ $(HELM): $(BINGO_DIR)/helm.mod @echo "(re)installing $(GOBIN)/helm-v3.18.3" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=helm.mod -o=$(GOBIN)/helm-v3.18.3 "helm.sh/helm/v3/cmd/helm" -KIND := $(GOBIN)/kind-v0.29.0 +KIND := $(GOBIN)/kind-v0.30.0 $(KIND): $(BINGO_DIR)/kind.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/kind-v0.29.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=kind.mod -o=$(GOBIN)/kind-v0.29.0 "sigs.k8s.io/kind" + @echo "(re)installing $(GOBIN)/kind-v0.30.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=kind.mod -o=$(GOBIN)/kind-v0.30.0 "sigs.k8s.io/kind" SETUP_ENVTEST := $(GOBIN)/setup-envtest-v0.0.0-20250620151452-b9a9ca01fd37 $(SETUP_ENVTEST): $(BINGO_DIR)/setup-envtest.mod diff --git a/staging/operator-lifecycle-manager/.bingo/kind.mod b/staging/operator-lifecycle-manager/.bingo/kind.mod index 80513d6833..51be6d24b1 100644 --- a/staging/operator-lifecycle-manager/.bingo/kind.mod +++ b/staging/operator-lifecycle-manager/.bingo/kind.mod @@ -4,4 +4,4 @@ go 1.22.0 toolchain go1.22.3 -require sigs.k8s.io/kind v0.29.0 +require sigs.k8s.io/kind v0.30.0 diff --git a/staging/operator-lifecycle-manager/.bingo/kind.sum b/staging/operator-lifecycle-manager/.bingo/kind.sum index 7800696aca..f1889a9118 100644 --- a/staging/operator-lifecycle-manager/.bingo/kind.sum +++ b/staging/operator-lifecycle-manager/.bingo/kind.sum @@ -39,6 +39,8 @@ github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= @@ -56,6 +58,8 @@ sigs.k8s.io/kind v0.26.0 h1:8fS6I0Q5WGlmLprSpH0DarlOSdcsv0txnwc93J2BP7M= sigs.k8s.io/kind v0.26.0/go.mod h1:t7ueEpzPYJvHA8aeLtI52rtFftNgUYUaCwvxjk7phfw= sigs.k8s.io/kind v0.29.0 h1:3TpCsyh908IkXXpcSnsMjWdwdWjIl7o9IMZImZCWFnI= sigs.k8s.io/kind v0.29.0/go.mod h1:ldWQisw2NYyM6k64o/tkZng/1qQW7OlzcN5a8geJX3o= +sigs.k8s.io/kind v0.30.0 h1:2Xi1KFEfSMm0XDcvKnUt15ZfgRPCT0OnCBbpgh8DztY= +sigs.k8s.io/kind v0.30.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= diff --git a/staging/operator-lifecycle-manager/.bingo/variables.env b/staging/operator-lifecycle-manager/.bingo/variables.env index d6a29bc397..28ce0c6fb1 100644 --- a/staging/operator-lifecycle-manager/.bingo/variables.env +++ b/staging/operator-lifecycle-manager/.bingo/variables.env @@ -14,7 +14,7 @@ GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.64.8" HELM="${GOBIN}/helm-v3.18.3" -KIND="${GOBIN}/kind-v0.29.0" +KIND="${GOBIN}/kind-v0.30.0" SETUP_ENVTEST="${GOBIN}/setup-envtest-v0.0.0-20250620151452-b9a9ca01fd37" diff --git a/staging/operator-lifecycle-manager/AGENTS.md b/staging/operator-lifecycle-manager/AGENTS.md new file mode 100644 index 0000000000..1406828413 --- /dev/null +++ b/staging/operator-lifecycle-manager/AGENTS.md @@ -0,0 +1,352 @@ +# AGENTS.md + +This file provides AI agents with comprehensive context about the Operator Lifecycle Manager (OLM) v0 codebase to enable effective navigation, understanding, and contribution. + +## Project Status + +**CRITICAL**: This repository is in **maintenance mode**. OLM v0 accepts only critical bug fixes and security updates. For new development, use [operator-controller](https://github.com/operator-framework/operator-controller) (OLM v1). + +## Project Overview + +Operator Lifecycle Manager (OLM) extends Kubernetes to provide declarative installation, upgrade, and lifecycle management for Kubernetes operators. It's part of the [Operator Framework](https://github.com/operator-framework) ecosystem. + +### Core Capabilities +- **Over-the-Air Updates**: Automatic operator updates via catalog channels +- **Dependency Resolution**: Automatic resolution and installation of operator dependencies +- **Multi-tenancy**: Namespace-scoped operator management via OperatorGroups +- **Discovery**: Catalog-based operator discovery and installation +- **Stability**: Prevents conflicting operators from owning the same APIs + +## Architecture + +OLM consists of two main operators working together: + +### 1. OLM Operator (`cmd/olm`) +**Responsibility**: Manages the installation and lifecycle of operators defined by ClusterServiceVersions (CSVs) + +**Key Functions**: +- Creates Deployments, ServiceAccounts, Roles, and RoleBindings from CSV specifications +- Manages CSV lifecycle states: None → Pending → InstallReady → Installing → Succeeded/Failed +- Monitors installed operator health and rotates certificates +- Enforces OperatorGroup namespace scoping + +**Primary Controllers**: +- CSV Controller (pkg/controller/operators/olm) +- OperatorGroup Controller + +### 2. Catalog Operator (`cmd/catalog`) +**Responsibility**: Manages operator catalogs, subscriptions, and dependency resolution + +**Key Functions**: +- Monitors CatalogSources and builds operator catalogs +- Processes Subscriptions to track operator updates +- Generates InstallPlans with resolved dependencies +- Creates CRDs and CSVs from catalog content + +**Primary Controllers**: +- Subscription Controller +- InstallPlan Controller +- CatalogSource Controller +- Registry Reconciler + +## Custom Resource Definitions (CRDs) + +| Resource | API Group | Owner | Description | +|----------|-----------|-------|-------------| +| **ClusterServiceVersion (CSV)** | operators.coreos.com/v1alpha1 | OLM | Defines operator metadata, installation strategy, permissions, and owned/required CRDs | +| **Subscription** | operators.coreos.com/v1alpha1 | Catalog | Tracks operator updates from a catalog channel; drives automatic upgrades | +| **InstallPlan** | operators.coreos.com/v1alpha1 | Catalog | Calculated list of resources to install/upgrade; requires approval (manual or automatic) | +| **CatalogSource** | operators.coreos.com/v1alpha1 | Catalog | Repository of operators and metadata; served via grpc from operator-registry | +| **OperatorGroup** | operators.coreos.com/v1 | OLM | Groups namespaces for operator installation scope; enables multi-tenancy | +| **OperatorCondition** | operators.coreos.com/v2 | OLM | Tracks operator health status and conditions | + +## Directory Structure + +``` +operator-lifecycle-manager/ +├── cmd/ # Entry point binaries +│ ├── catalog/ # Catalog Operator main +│ ├── olm/ # OLM Operator main +│ ├── package-server/ # Package API server +│ └── copy-content/ # Content copy utility +│ +├── pkg/ # Core implementation +│ ├── api/ # API client and wrappers +│ │ ├── client/ # Generated Kubernetes clients +│ │ └── wrappers/ # Client wrapper utilities +│ │ +│ ├── controller/ # Main controllers +│ │ ├── bundle/ # Bundle lifecycle controller +│ │ ├── install/ # Installation controller +│ │ ├── operators/ # Operator/CSV controllers (OLM Operator) +│ │ └── registry/ # Catalog/registry controllers (Catalog Operator) +│ │ +│ ├── lib/ # Shared libraries and utilities +│ │ ├── catalogsource/ # CatalogSource utilities +│ │ ├── csv/ # CSV manipulation utilities +│ │ ├── operatorclient/ # Operator client abstractions +│ │ ├── operatorlister/ # Informer-based listers +│ │ ├── operatorstatus/ # Status management +│ │ ├── ownerutil/ # Owner reference utilities +│ │ ├── queueinformer/ # Queue-based informers +│ │ ├── scoped/ # Scoped client for multi-tenancy +│ │ └── [other utilities] +│ │ +│ ├── metrics/ # Prometheus metrics +│ └── package-server/ # Package server implementation +│ +├── test/ # Testing infrastructure +│ ├── e2e/ # End-to-end tests +│ └── images/ # Test container images +│ +├── doc/ # Documentation +│ ├── design/ # Architecture and design docs +│ └── contributors/ # Contributor guides +│ +└── vendor/ # Vendored dependencies +``` + +## Key Packages and Their Responsibilities + +### Controllers (`pkg/controller/`) + +#### `pkg/controller/operators/` +The heart of the OLM Operator. Contains the CSV controller that manages the complete operator lifecycle. + +**Key files**: +- `olm/operator.go` - Main OLM operator reconciler +- `olm/csv.go` - CSV reconciliation logic +- `catalog/operator.go` - Catalog operator reconciler + +#### `pkg/controller/registry/` +Registry and catalog management for the Catalog Operator. + +**Key files**: +- `reconciler/reconciler.go` - CatalogSource reconciliation +- `grpc/source.go` - gRPC catalog source handling + +#### `pkg/controller/install/` +Manages the installation of resources defined in InstallPlans. + +### Libraries (`pkg/lib/`) + +#### `pkg/lib/operatorclient/` +Abstraction layer over Kubernetes clients providing OLM-specific operations. + +#### `pkg/lib/operatorlister/` +Informer-based listers for efficient caching and querying of OLM resources. + +#### `pkg/lib/queueinformer/` +Queue-based informer pattern used throughout OLM controllers for event-driven reconciliation. + +#### `pkg/lib/ownerutil/` +Owner reference management ensuring proper garbage collection of OLM-managed resources. + +#### `pkg/lib/scoped/` +Scoped clients that respect OperatorGroup namespace boundaries for multi-tenancy. + +## Development Workflow + +### Building +```bash +make build # Build all binaries +make image # Build container image +make local-build # Build with 'local' tag +``` + +### Testing +```bash +make unit # Unit tests with setup-envtest +make e2e # E2E tests (requires cluster) +make e2e-local # Build + deploy + e2e locally +make coverage # Unit tests with coverage +``` + +### Code Generation +```bash +make gen-all # Generate all code (clients, mocks, manifests) +make codegen # Generate K8s clients and deep-copy methods +make mockgen # Generate test mocks +make manifests # Copy CRD manifests from operator-framework/api +``` + +### Local Development +```bash +make run-local # Complete local setup +# OR step-by-step: +make kind-create # Create kind cluster (kind-olmv0) +make cert-manager-install +make deploy # Deploy OLM to cluster +``` + +## Key Design Patterns + +### Control Loop State Machines + +**CSV Lifecycle**: +``` +None → Pending → InstallReady → Installing → Succeeded + ↑ ↓ + ←----------←------←-------Failed +``` + +**InstallPlan Lifecycle**: +``` +None → Planning → RequiresApproval → Installing → Complete + ↓ ↓ + ←-------←-------Failed +``` + +**Subscription Lifecycle**: +``` +None → UpgradeAvailable → UpgradePending → AtLatestKnown + ↑ ↓ + ←-----------←-----------←-------------← +``` + +### Dependency Resolution +- CSVs declare owned CRDs (what they provide) and required CRDs (what they need) +- Catalog Operator resolves transitive dependencies via graph traversal +- InstallPlans capture the complete dependency closure +- Resolution is based on (Group, Version, Kind) - no version pinning + +### Catalog and Channel Model +``` +Package (e.g., "etcd") + ├── Channel: "stable" → CSV v0.9.4 → CSV v0.9.3 → CSV v0.9.2 + ├── Channel: "alpha" → CSV v0.10.0 + └── Channel: "beta" → CSV v0.9.4 +``` + +Subscriptions track a channel; OLM follows the replacement chain to upgrade operators. + +## Testing Strategy + +### Unit Tests +- Use `setup-envtest` for real Kubernetes API behavior +- Race detection enabled by default (`CGO_ENABLED=1`) +- Mock generation via `counterfeiter` and `gomock` + +### E2E Tests +- Full cluster testing with Ginkgo/Gomega BDD framework +- Test images in `test/images/` hosted on quay.io/olmtest +- Default timeout: 90 minutes (configurable via `E2E_TIMEOUT`) +- Uses kind cluster named `kind-olmv0` + +### Integration Tests +- Bundle and catalog integration testing +- Upgrade path validation +- Multi-tenant scenario testing + +## Important Dependencies + +| Dependency | Version | Purpose | +|------------|---------|---------| +| kubernetes | v0.34.1 | Core K8s libraries | +| controller-runtime | v0.22.2 | Controller framework | +| operator-framework/api | v0.35.0 | OLM API definitions | +| operator-registry | v1.60.0 | Catalog/bundle tooling | +| ginkgo/gomega | v2.26.0 / v1.38.2 | BDD testing | + +## Common Tasks for AI Agents + +### Understanding Operator Installation Flow +1. User creates Subscription pointing to catalog/package/channel +2. Catalog Operator queries catalog for latest CSV in channel +3. Catalog Operator creates InstallPlan with resolved dependencies +4. Upon approval, Catalog Operator creates CRDs and CSV +5. OLM Operator detects CSV, validates requirements, creates Deployment/RBAC +6. CSV transitions through: Pending → InstallReady → Installing → Succeeded + +### Debugging Installation Issues +- Check CSV status and conditions: `kubectl get csv -o yaml` +- Examine InstallPlan: `kubectl get ip -o yaml` +- Review operator logs: OLM Operator and Catalog Operator pods in `olm` namespace +- Verify OperatorGroup configuration for namespace scoping + +### Adding New Functionality +**REMINDER**: This repository is in maintenance mode - only critical fixes accepted! + +For understanding existing code: +1. Controllers follow controller-runtime patterns with Reconcile() methods +2. Use informers and listers from `pkg/lib/operatorlister` +3. Queue-based event handling via `pkg/lib/queueinformer` +4. Always respect OperatorGroup namespace scoping + +### Code Generation +Most code is generated - don't hand-edit: +- Client code: Generated from CRDs using k8s.io/code-generator +- Deep-copy methods: Auto-generated for all API types +- Mocks: Generated via counterfeiter/gomock +- CRD manifests: Copied from operator-framework/api repository + +Always run `make gen-all` after API changes. + +## Navigation Tips + +### Finding Controllers +- OLM Operator controllers: `pkg/controller/operators/` +- Catalog Operator controllers: `pkg/controller/registry/`, subscription/installplan logic in `pkg/controller/operators/catalog/` + +### Finding API Definitions +- CRDs are defined in operator-framework/api (external dependency) +- Clients are in `pkg/api/client/` +- Listers are in `pkg/lib/operatorlister/` + +### Finding Business Logic +- CSV installation: `pkg/controller/operators/olm/` +- Dependency resolution: `pkg/controller/registry/resolver/` +- Catalog management: `pkg/controller/registry/reconciler/` +- InstallPlan execution: `pkg/controller/install/` + +### Finding Utilities +- Owner references: `pkg/lib/ownerutil/` +- Scoped clients: `pkg/lib/scoped/` +- Operator clients: `pkg/lib/operatorclient/` +- Queue informers: `pkg/lib/queueinformer/` + +## Anti-Patterns to Avoid + +1. **Don't bypass OperatorGroup scoping** - Always use scoped clients for multi-tenancy +2. **Don't modify generated code** - Edit source (CRDs, annotations) and regenerate +3. **Don't skip approval for InstallPlans** - Respect manual approval settings +4. **Don't create CSVs directly** - Use Subscriptions/Catalogs for proper lifecycle +5. **Don't ignore owner references** - Critical for garbage collection + +## Resources and Links + +- [OLM Documentation](https://olm.operatorframework.io/) +- [Architecture Doc](doc/design/architecture.md) +- [Philosophy](doc/design/philosophy.md) +- [Design Proposals](doc/contributors/design-proposals/) +- [Operator Framework Community](https://github.com/operator-framework/community) +- [OperatorHub.io](https://operatorhub.io/) - Public operator catalog + +## Quick Reference + +### Resource Short Names +```bash +kubectl get csv # ClusterServiceVersions +kubectl get sub # Subscriptions +kubectl get ip # InstallPlans +kubectl get catsrc # CatalogSources +kubectl get og # OperatorGroups +``` + +### Common Build Targets +```bash +make build build-utils # Build all binaries +make test unit e2e # Run tests +make lint verify # Code quality +make gen-all # Generate everything +make run-local # Full local dev environment +``` + +### Tool Management +Tools are managed via **bingo** (`.bingo/Variables.mk`) for reproducible builds. All tools are version-pinned. + +## Contributing + +See [CONTRIBUTING.md](CONTRIBUTING.md) and [CLAUDE.md](CLAUDE.md) for detailed guidelines. + +**Remember**: OLM v0 is in maintenance mode - only critical security fixes and outage issues are accepted! diff --git a/staging/operator-lifecycle-manager/Makefile b/staging/operator-lifecycle-manager/Makefile index d10ff7ab85..4331b24f6e 100644 --- a/staging/operator-lifecycle-manager/Makefile +++ b/staging/operator-lifecycle-manager/Makefile @@ -286,12 +286,16 @@ codegen: #HELP Generate clients, deepcopy, listers, and informers .PHONY: mockgen mockgen: #HELP Generate mocks - # Generate mocks and silence the followign warning: + # Generate mocks and silence the following warning: # WARNING: Invoking counterfeiter multiple times from "go generate" is slow. # Consider using counterfeiter:generate directives to speed things up. # See https://github.com/maxbrunsfeld/counterfeiter#step-2b---add-counterfeitergenerate-directives for more information. # Set the "COUNTERFEITER_NO_GENERATE_WARNING" environment variable to suppress this message. - COUNTERFEITER_NO_GENERATE_WARNING=1 go generate ./pkg/... + @set -e; \ + overlay_file=$$(mktemp "$(CURDIR)/hack/overlays/goimports_overlay.XXXXXX.json"); \ + trap 'rm -f "$$overlay_file"' EXIT; \ + printf '{\n "Replace": {\n "%s/vendor/golang.org/x/tools/imports/vendorlesspath.go": "%s/hack/overlays/goimports_vendorlesspath.go"\n }\n}\n' "$(CURDIR)" "$(CURDIR)" > "$$overlay_file"; \ + GO111MODULE=on GOWORK=off COUNTERFEITER_NO_GENERATE_WARNING=1 GOFLAGS="$$GOFLAGS -overlay=$$overlay_file" go generate ./pkg/... #SECTION Verification diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml index 086fbc4c04..391b04ea4a 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml @@ -631,8 +631,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml index 20bb1a0394..b957a9badb 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -1382,8 +1382,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1767,7 +1767,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1822,6 +1824,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1872,8 +1910,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1900,7 +1938,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2544,7 +2584,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2597,10 +2637,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2612,6 +2652,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3213,7 +3304,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3268,6 +3361,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3318,8 +3447,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3346,7 +3475,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3969,7 +4100,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4023,9 +4154,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4541,7 +4714,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4566,6 +4741,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4653,7 +4841,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4708,6 +4898,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4758,8 +4984,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4786,7 +5012,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5430,7 +5658,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5483,10 +5711,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5498,6 +5726,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6007,6 +6286,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6158,7 +6438,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6172,7 +6452,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7406,15 +7686,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7583,16 +7861,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7667,7 +7942,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8060,6 +8335,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8186,7 +8565,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml index c388b9181e..10f465665c 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml @@ -618,8 +618,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -968,7 +968,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1023,6 +1025,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1098,7 +1136,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1137,7 +1177,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1987,15 +2027,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2164,16 +2202,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2248,7 +2283,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2641,6 +2676,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2767,7 +2906,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod index 6b46db5f62..233822a394 100644 --- a/staging/operator-lifecycle-manager/go.mod +++ b/staging/operator-lifecycle-manager/go.mod @@ -17,41 +17,41 @@ require ( github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 github.com/mitchellh/hashstructure v1.1.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/onsi/ginkgo/v2 v2.25.3 + github.com/onsi/ginkgo/v2 v2.26.0 github.com/onsi/gomega v1.38.2 - github.com/openshift/api v3.9.0+incompatible + github.com/openshift/api v0.0.0-20221021112143-4226c2167e40 github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a - github.com/operator-framework/api v0.34.0 - github.com/operator-framework/operator-registry v1.59.0 + github.com/operator-framework/api v0.35.0 + github.com/operator-framework/operator-registry v1.60.0 github.com/otiai10/copy v1.14.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.23.2 github.com/prometheus/client_model v0.6.2 - github.com/prometheus/common v0.66.1 + github.com/prometheus/common v0.67.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/stretchr/testify v1.11.1 go.podman.io/image/v5 v5.37.0 - golang.org/x/net v0.44.0 + golang.org/x/net v0.46.0 golang.org/x/sync v0.17.0 - golang.org/x/time v0.13.0 - google.golang.org/grpc v1.75.1 + golang.org/x/time v0.14.0 + google.golang.org/grpc v1.76.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.33.4 - k8s.io/apiextensions-apiserver v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/apiserver v0.33.4 - k8s.io/client-go v0.33.4 - k8s.io/code-generator v0.33.4 - k8s.io/component-base v0.33.4 + k8s.io/api v0.34.1 + k8s.io/apiextensions-apiserver v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/apiserver v0.34.1 + k8s.io/client-go v0.34.1 + k8s.io/code-generator v0.34.1 + k8s.io/component-base v0.34.1 k8s.io/klog v1.0.0 k8s.io/klog/v2 v2.130.1 - k8s.io/kube-aggregator v0.33.4 - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a + k8s.io/kube-aggregator v0.34.1 + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 - sigs.k8s.io/controller-runtime v0.21.0 - sigs.k8s.io/controller-tools v0.18.0 + sigs.k8s.io/controller-runtime v0.22.3 + sigs.k8s.io/controller-tools v0.19.0 ) require ( @@ -90,7 +90,7 @@ require ( github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect @@ -103,8 +103,8 @@ require ( github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/cel-go v0.26.0 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/cel-go v0.26.1 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect @@ -129,7 +129,7 @@ require ( github.com/moby/sys/user v0.4.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect @@ -140,12 +140,12 @@ require ( github.com/stoewer/go-strcase v1.3.1 // indirect github.com/x448/float16 v0.8.4 // indirect go.etcd.io/bbolt v1.4.3 // indirect - go.etcd.io/etcd/api/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/v3 v3.5.21 // indirect + go.etcd.io/etcd/api/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/v3 v3.6.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect go.opentelemetry.io/otel v1.37.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect @@ -159,48 +159,32 @@ require ( go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.42.0 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/mod v0.28.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/term v0.35.0 // indirect - golang.org/x/text v0.29.0 // indirect - golang.org/x/tools v0.36.0 // indirect - golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/oauth2 v0.31.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/tools v0.38.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/protobuf v1.36.9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect - k8s.io/kms v0.33.4 // indirect + k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect + k8s.io/kms v0.34.1 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) -// v1.64.0 brings in go1.23, which we aren't ready to go to just yet -// issue: https://github.com/operator-framework/operator-lifecycle-manager/issues/3284 -replace google.golang.org/grpc => google.golang.org/grpc v1.63.2 - -// cel-go v0.23.0 upgrade causes errors raised from the vendor source which lead to think in -// incompatibilities scenarios. After upgrade to use the latest versions of k8s/api v0.33+ -// we should try to see if we could fix this one and remove this replace -replace github.com/google/cel-go => github.com/google/cel-go v0.22.1 - -replace ( - // controller runtime - github.com/openshift/api => github.com/openshift/api v0.0.0-20221021112143-4226c2167e40 // release-4.12 - github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c // release-4.12 -) - retract v3.11.0+incompatible // https://github.com/operator-framework/operator-lifecycle-manager/issues/2253 diff --git a/staging/operator-lifecycle-manager/go.sum b/staging/operator-lifecycle-manager/go.sum index 82366be3be..efa7336698 100644 --- a/staging/operator-lifecycle-manager/go.sum +++ b/staging/operator-lifecycle-manager/go.sum @@ -1,10 +1,10 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -17,1374 +17,77 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= -cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accessapproval v1.7.2/go.mod h1:/gShiq9/kK/h8T/eEn1BTzalDvk0mZxJlhfw0p+Xuc0= -cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= -cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= -cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/accesscontextmanager v1.8.2/go.mod h1:E6/SCRM30elQJ2PKtFMs2YhfJpZSNcJyejhuzoId4Zk= -cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= -cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= -cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.1/go.mod h1:kY3nIMAVQOK2XDqDPHaOuD9e+FdMA6OOpfBjsvaFSOo= -cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= -cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.57.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.2/go.mod h1:c3kCiVmb6UC1dHAjZjcpDj6ZS0bHQ2slL88ZjC2LtlA= -cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.4/go.mod h1:zZgNCxLCy8b2rKKVfC1YkC2vTrpfZmeRCySM3aUbskA= -cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= -cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigateway v1.6.2/go.mod h1:CwMC90nnZElorCW63P2pAYm25AtQrHfuOkbRSHj0bT8= -cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= -cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= -cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeconnect v1.6.2/go.mod h1:s6O0CgXT9RgAxlq3DLXvG8riw8PYYbU/v25jqP3Dy18= -cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= -cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= -cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apigeeregistry v0.7.2/go.mod h1:9CA2B2+TGsPKtfi3F7/1ncCCsL62NXBRfM6iPoGSM+8= -cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= -cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= -cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/appengine v1.8.2/go.mod h1:WMeJV9oZ51pvclqFN2PqHoGnys7rK0rz6s3Mp6yMvDo= -cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= -cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= -cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/area120 v0.8.2/go.mod h1:a5qfo+x77SRLXnCynFWPUZhnZGeSgvQ+Y0v1kSItkh4= -cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= -cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= -cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= -cloud.google.com/go/artifactregistry v1.14.3/go.mod h1:A2/E9GXnsyXl7GUvQ/2CjHA+mVRoWAXC0brg2os+kNI= -cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= -cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= -cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= -cloud.google.com/go/asset v1.15.1/go.mod h1:yX/amTvFWRpp5rcFq6XbCxzKT8RJUam1UoboE179jU4= -cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= -cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.16.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.1/go.mod h1:byvDw36UME5AzGNK7o4JnOnINkwOZ1yRrGrKIahHrng= -cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/assuredworkloads v1.11.2/go.mod h1:O1dfr+oZJMlE6mw0Bp0P1KZSlj5SghMBvTpZqIcUAW4= -cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= -cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= -cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/automl v1.13.2/go.mod h1:gNY/fUmDEN40sP8amAX3MaXkxcqPIn7F1UIIPZpy4Mg= -cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= -cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= -cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= -cloud.google.com/go/baremetalsolution v1.2.1/go.mod h1:3qKpKIw12RPXStwQXcbhfxVj1dqQGEvcmA+SX/mUR88= -cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= -cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= -cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.1/go.mod h1:RpBuIYLkQu8+CWDk3dFD/t/jOCGuUpkpX+Y0n1Xccs8= -cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= -cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.1/go.mod h1:zl/rWWAFVeV+kx+X2Javly7o1EIQThU4WlkynffL/lk= -cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= -cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= -cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec= -cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= -cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= -cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= -cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.2/go.mod h1:u/AdV/3wr3xoRBk5xvUzYMS1IawOAPwQMuHgHMdljDg= -cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= -cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= -cloud.google.com/go/binaryauthorization v1.7.1/go.mod h1:GTAyfRWYgcbsP3NJogpV3yeunbUIjx2T9xVeYovtURE= -cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= -cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/certificatemanager v1.7.2/go.mod h1:15SYTDQMd00kdoW0+XY5d9e+JbOPjp24AvF48D8BbcQ= -cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= -cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= -cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= -cloud.google.com/go/channel v1.17.1/go.mod h1:xqfzcOZAcP4b/hUDH0GkGg1Sd5to6di1HOJn/pi5uBQ= -cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= -cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.1/go.mod h1:K7wGc/3zfvmYWOWwYTgF/d/UVJhS4pu+HAy7PL7mCsU= -cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= -cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= -cloud.google.com/go/clouddms v1.7.1/go.mod h1:o4SR8U95+P7gZ/TX+YbJxehOCsM+fe6/brlrFquiszk= -cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= -cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= -cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.2/go.mod h1:A7nYkjNlW2gUoROg1kvJrQGhJP/38UaWwsnuBDOBVUk= -cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= -cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= -cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= -cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU= -cloud.google.com/go/contactcenterinsights v1.11.1/go.mod h1:FeNP3Kg8iteKM80lMwSk3zZZKVxr+PGnAId6soKuXwE= -cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso= -cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= -cloud.google.com/go/container v1.26.1/go.mod h1:5smONjPRUxeEpDG7bMKWfDL4sauswqEtnBK1/KKpR04= -cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4= -cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.30.1/go.mod h1:vkbfX0EnAKL/vgVECs5BZn24e1cJROzgszJirRKQ4Bg= -cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= -cloud.google.com/go/containeranalysis v0.11.1/go.mod h1:rYlUOM7nem1OJMKwE1SadufX0JP3wnXj844EtZAwWLY= -cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8= -cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= -cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.1/go.mod h1:TzAWaz+ON1tkNr4MOcak8EBHX7wIRX/gZKM+yTVsv+A= -cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk= -cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= -cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataflow v0.9.2/go.mod h1:vBfdBZ/ejlTaYIGB3zB4T08UshH70vbtZeMD+urnUSo= -cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE= -cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= -cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/dataform v0.8.2/go.mod h1:X9RIqDs6NbGPLR80tnYoPNiO1w0wenKTb8PxxlhTMKM= -cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg= -cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= -cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datafusion v1.7.2/go.mod h1:62K2NEC6DRlpNmI43WHMWf9Vg/YvN6QVi8EVwifElI0= -cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE= -cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= -cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/datalabeling v0.8.2/go.mod h1:cyDvGHuJWu9U/cLDA7d8sb9a0tWLEletStu2sTmg3BE= -cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI= -cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= -cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.10.1/go.mod h1:1MzmBv8FvjYfc7vDdxhnLFNskikkB+3vl475/XdCDhs= -cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y= -cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.13.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.1/go.mod h1:bWxQAbg6Smg+sca2+Ex7s8D9a5qU6xfXtwmq4BVReps= -cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= -cloud.google.com/go/dataproc/v2 v2.2.1/go.mod h1:QdAJLaBjh+l4PVlVZcmrmhGccosY/omC1qwfQ61Zv/o= -cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4= -cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= -cloud.google.com/go/dataqna v0.8.2/go.mod h1:KNEqgx8TTmUipnQsScOoDpq/VlXVptUqVMZnt30WAPs= -cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4= -cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= -cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.1/go.mod h1:7ngSYwnw95YFyTd5tOGBxHlOZiL+OtpjheqU7t2/s/c= -cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0= -cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= -cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.1/go.mod h1:8jeadyLkH9qu9xgO3hVWw8jVr29N1mnW42gRJT8GY6g= -cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw= -cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= -cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.1/go.mod h1:n/h+/N2ouKOO+rbe/ZnI186xImpqvCVj2DdsWS/0EAk= -cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c= -cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.47.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= -cloud.google.com/go/dialogflow v1.48.2/go.mod h1:7A2oDf6JJ1/+hdpnFRfb/RjJUOh2X3rhIa5P8wQSEX4= -cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/dlp v1.10.2/go.mod h1:ZbdKIhcnyhILgccwVDzkwqybthh7+MplGC3kZVZsIOQ= -cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0= -cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= -cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.2/go.mod h1:Q/wcRT+qnuXOpjAkvOV4A+IeQl04q2/ReT7SSbytLSo= -cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y= -cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.6/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.8/go.mod h1:Vd/y5PosxCpUHmwC+v9arZyeMfTqBR9VIwOwIqQYYfA= -cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/domains v0.9.2/go.mod h1:3YvXGYzZG1Temjbk7EyGCuGGiXHJwVNmwIf+E/cUp5I= -cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU= -cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= -cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/edgecontainer v1.1.2/go.mod h1:wQRjIzqxEs9e9wrtle4hQPSR1Y51kqN75dgF7UllZZ4= -cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA= -cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= -cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/essentialcontacts v1.6.3/go.mod h1:yiPCD7f2TkP82oJEFXFTou8Jl8L6LBRPeBEkTaO0Ggo= -cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM= -cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= -cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.1/go.mod h1:EqBxmGHFrruIara4FUQ3RHlgfCn7yo1HYsu2Hpt/C3Y= -cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM= -cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= -cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/filestore v1.7.2/go.mod h1:TYOlyJs25f/omgj+vY7/tIG/E7BX369triSPzE4LdgE= -cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0= -cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= -cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/functions v1.15.2/go.mod h1:CHAjtcR6OU4XF2HuiVeriEdELNcnvRZSk1Q8RMqy4lE= -cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug= -cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= -cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.2/go.mod h1:OMZbXzEJloyXMC7gqdSB+EOEQ1AKcpGYvO3s1ec5ixk= -cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I= -cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= -cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkeconnect v0.8.2/go.mod h1:6nAVhwchBJYgQCXD2pHBFQNiJNyAd/wyxljpaa6ZPrY= -cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo= -cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= -cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkehub v0.14.2/go.mod h1:iyjYH23XzAxSdhrbmfoQdePnlMj2EWcvnR+tHdBQsCY= -cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8= -cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= -cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.1/go.mod h1:AcrGoin6VLKT/fwZEYuqvVominLriQBCKmbjtnbMjG8= -cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo= -cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= -cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/gsuiteaddons v1.6.2/go.mod h1:K65m9XSgs8hTF3X9nNTPi8IQueljSdYo9F+Mi+s4MyU= -cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48= -cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= -cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= -cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= -cloud.google.com/go/iap v1.9.1/go.mod h1:SIAkY7cGMLohLSdBR25BuIxO+I4fXJiL06IBL7cy/5Q= -cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI= -cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= -cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/ids v1.4.2/go.mod h1:3vw8DX6YddRu9BncxuzMyWn0g8+ooUjI2gslJ7FH3vk= -cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU= -cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= -cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/iot v1.7.2/go.mod h1:q+0P5zr1wRFpw7/MOgDXrG/HVA+l+cSwdObffkrpnSg= -cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I= -cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= -cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= -cloud.google.com/go/kms v1.15.3/go.mod h1:AJdXqHxS2GlPyduM99s9iGqi2nwbviBbhV/hdmt4iOQ= -cloud.google.com/go/kms v1.15.4/go.mod h1:L3Sdj6QTHK8dfwK5D1JLsAyELsNMnd3tAIwGS4ltKpc= -cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= -cloud.google.com/go/kms v1.15.6/go.mod h1:yF75jttnIdHfGBoE51AKsD/Yqf+/jICzB9v1s1acsms= -cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= -cloud.google.com/go/language v1.11.1/go.mod h1:Xyid9MG9WOX3utvDbpX7j3tXDmmDooMyMDqgUVpH17U= -cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4= -cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= -cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/lifesciences v0.9.2/go.mod h1:QHEOO4tDzcSAzeJg7s2qwnLM2ji8IRpQl4p6m5Z9yTA= -cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM= -cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= -cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= -cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= -cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/managedidentities v1.6.2/go.mod h1:5c2VG66eCa0WIq6IylRk3TBW83l161zkFvCj28X7jn8= -cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4= -cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= -cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.1/go.mod h1:BxSa0BnW1g2U2gNdbq5zikLlHUuHW0GFWh7sgML2kIY= -cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4= -cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= -cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/mediatranslation v0.8.2/go.mod h1:c9pUaDRLkgHRx3irYE5ZC8tfXGrMYwNZdmDqKMSfFp8= -cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y= -cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= -cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/memcache v1.10.2/go.mod h1:f9ZzJHLBrmd4BkguIAa/l/Vle6uTHzHokdnzSWOdQ6A= -cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo= -cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= -cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk= -cloud.google.com/go/metastore v1.13.1/go.mod h1:IbF62JLxuZmhItCppcIfzBBfUFq0DIB9HPDoLgWrVOU= -cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA= -cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= -cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= -cloud.google.com/go/monitoring v1.16.1/go.mod h1:6HsxddR+3y9j+o/cMJH6q/KJ/CBTvM/38L/1m7bTRJ4= -cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc= -cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.1/go.mod h1:SJzPMakCF0GHOuKEH/r4hxVKF04zl+cRPQyc3d/fqII= -cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.1/go.mod h1:LyGPXR742uQcDxZ/wv4EI0Vu5N6NKJ77ZYVnDe69Zug= -cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo= -cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= -cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= -cloud.google.com/go/networkmanagement v1.9.1/go.mod h1:CCSYgrQQvW73EJawO2QamemYcOb57LvrDdDU51F0mcI= -cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw= -cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= -cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/networksecurity v0.9.2/go.mod h1:jG0SeAttWzPMUILEHDUvFYdQTl8L/E/KC8iZDj85lEI= -cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0= -cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= -cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= -cloud.google.com/go/notebooks v1.10.1/go.mod h1:5PdJc2SgAybE76kFQCWrTfJolCOUQXF97e+gteUUA6A= -cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ= -cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= -cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= -cloud.google.com/go/optimization v1.5.1/go.mod h1:NC0gnUD5MWVAF7XLdoYVPmYYVth93Q6BUzqAq3ZwtV8= -cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo= -cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= -cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orchestration v1.8.2/go.mod h1:T1cP+6WyTmh6LSZzeUhvGf0uZVmJyTx7t8z7Vg87+A0= -cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs= -cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= -cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/orgpolicy v1.11.2/go.mod h1:biRDpNwfyytYnmCRWZWxrKF22Nkz9eNVj9zyaBdpm1o= -cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM= -cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/osconfig v1.12.2/go.mod h1:eh9GPaMZpI6mEJEuhEjUJmaxvQ3gav+fFEJon1Y8Iw0= -cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM= -cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= -cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE= -cloud.google.com/go/oslogin v1.11.1/go.mod h1:OhD2icArCVNUxKqtK0mcSmKL7lgr0LVlQz+v9s1ujTg= -cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU= -cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= -cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= -cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/phishingprotection v0.8.2/go.mod h1:LhJ91uyVHEYKSKcMGhOa14zMMWfbEdxG032oT6ECbC8= -cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8= -cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= -cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= -cloud.google.com/go/policytroubleshooter v1.9.1/go.mod h1:MYI8i0bCrL8cW+VHN1PoiBTyNZTstCg2WUw2eVC4c4U= -cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs= -cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= -cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= -cloud.google.com/go/privatecatalog v0.9.2/go.mod h1:RMA4ATa8IXfzvjrhhK8J6H4wwcztab+oZph3c6WmtFc= -cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE= -cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= -cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= -cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.1/go.mod h1:JZYZJOeZjgSSTGP4uz7NlQ4/d1w5hGmksVgM0lbEij0= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommendationengine v0.8.2/go.mod h1:QIybYHPK58qir9CV2ix/re/M//Ty10OxjnnhWdaKS1Y= -cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8= -cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= -cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= -cloud.google.com/go/recommender v1.11.1/go.mod h1:sGwFFAyI57v2Hc5LbIj+lTwXipGu9NW015rkaEM5B18= -cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y= -cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/redis v1.13.2/go.mod h1:0Hg7pCMXS9uz02q+LoEVl5dNHUkIQv+C/3L76fandSA= -cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U= -cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= -cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcemanager v1.9.2/go.mod h1:OujkBg1UZg5lX2yIyMo5Vz9O5hf7XQOSV7WxqxxMtQE= -cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U= -cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= -cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/resourcesettings v1.6.2/go.mod h1:mJIEDd9MobzunWMeniaMp6tzg4I2GvD3TTmPkc8vBXk= -cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic= -cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= -cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/retail v1.14.2/go.mod h1:W7rrNRChAEChX336QF7bnMxbsjugcOCPU44i5kbLiL8= -cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo= -cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= -cloud.google.com/go/retail v1.15.1/go.mod h1:In9nSBOYhLbDGa87QvWlnE1XA14xBN2FpQRiRsUs9wU= -cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU= -cloud.google.com/go/run v1.3.1/go.mod h1:cymddtZOzdwLIAsmS6s+Asl4JoXIDm/K1cpZTxV4Q5s= -cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE= -cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= -cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/scheduler v1.10.2/go.mod h1:O3jX6HRH5eKCA3FutMw375XHZJudNIKVonSCHv7ropY= -cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc= -cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/secretmanager v1.11.2/go.mod h1:MQm4t3deoSub7+WNwiC4/tRYgDBHJgJPvswqQVB1Vss= -cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI= -cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= -cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/security v1.15.2/go.mod h1:2GVE/v1oixIRHDaClVbHuPcZwAqFM28mXuAKCfMgYIg= -cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs= -cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= -cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/securitycenter v1.23.1/go.mod h1:w2HV3Mv/yKhbXKwOCu2i8bCuLtNP1IMHuiYQn4HJq5s= -cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI= -cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.1/go.mod h1:tJywXimEWzNzw9FvtNjsQxxJ3/41jseeILgwU/QLrGI= -cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg= -cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= -cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/shell v1.7.2/go.mod h1:KqRPKwBV0UyLickMn0+BY1qIyE98kKyI216sH/TuHmc= -cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc= -cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= -cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= -cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.53.1/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.54.0/go.mod h1:wZvSQVBgngF0Gq86fKup6KIYmN2be7uOKjtK97X+bQU= -cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= -cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0= -cloud.google.com/go/spanner v1.57.0/go.mod h1:aXQ5QDdhPRIqVhYmnkAdwPYvj/DRN0FguclhEWw+jOo= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.1/go.mod h1:WcuaWz/3hOlzPFOVo9DUsblMIHwxP589y6ZMtaG+iAA= -cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI= -cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/storage v1.37.0/go.mod h1:i34TiT2IhiNDmcj65PqwCjcoUX7Z5pLzS8DEmoiFq1k= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/storagetransfer v1.10.1/go.mod h1:rS7Sy0BtPviWYTTJVWCSV4QrbBitgPeuK4/FKa4IdLs= -cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA= -cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= -cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/talent v1.6.3/go.mod h1:xoDO97Qd4AK43rGjJvyBHMskiEf3KulgYzcH6YWOVoo= -cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY= -cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= -cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/texttospeech v1.7.2/go.mod h1:VYPT6aTOEl3herQjFHYErTlSZJ4vB00Q2ZTmuVgluD4= -cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so= -cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= -cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/tpu v1.6.2/go.mod h1:NXh3NDwt71TsPZdtGWgAG5ThDfGd32X1mJ2cMaRlVgU= -cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY= -cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= -cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/trace v1.10.2/go.mod h1:NPXemMi6MToRFcSxRl2uDnu/qAlAQ3oULUphcHGh1vA= -cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY= -cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= -cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.1/go.mod h1:TWIgDZknq2+JD4iRcojgeDtqGEp154HN/uL6hMvylS8= -cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY= -cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= -cloud.google.com/go/video v1.20.1/go.mod h1:3gJS+iDprnj8SY6pe0SwLeC5BUW80NjhwX7INWEuWGU= -cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA= -cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= -cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/videointelligence v1.11.2/go.mod h1:ocfIGYtIVmIcWk1DsSGOoDiXca4vaZQII1C85qtoplc= -cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo= -cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= -cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vision/v2 v2.7.3/go.mod h1:V0IcLCY7W+hpMKXK1JYE0LV5llEqVmj+UJChjvA1WsM= -cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw= -cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= -cloud.google.com/go/vision/v2 v2.7.6/go.mod h1:ZkvWTVNPBU3YZYzgF9Y1jwEbD1NBOCyJn0KFdQfE6Bw= -cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmmigration v1.7.2/go.mod h1:iA2hVj22sm2LLYXGPT1pB63mXHhrH1m/ruux9TwWLd8= -cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo= -cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= -cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.1/go.mod h1:aT3Xsm5sNx0QShk1Jc1B8OddrxAScYLwzVoaiXfdzzk= -cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA= -cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= -cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/vpcaccess v1.7.2/go.mod h1:mmg/MnRHv+3e8FJUjeSibVFvQF1cCy2MsFaFqxeY1HU= -cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc= -cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= -cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/webrisk v1.9.2/go.mod h1:pY9kfDgAqxUpDBOrG4w8deLfhvJmejKB0qd/5uQIPBc= -cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8= -cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= -cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/websecurityscanner v1.6.2/go.mod h1:7YgjuU5tun7Eg2kpKgGnDuEOXWIrh8x8lWrJT4zfmas= -cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw= -cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= -cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= -cloud.google.com/go/workflows v1.12.1/go.mod h1:5A95OhD/edtOhQd/O741NSfIMezNTbCwLM1P1tBRGHM= -cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc= -cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= -cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/akrylysov/pogreb v0.10.2 h1:e6PxmeyEhWyi2AKOBIJzAEi4HkiC+lKyCocRGlnDi78= github.com/akrylysov/pogreb v0.10.2/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= -github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y= -github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= -github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= github.com/containerd/containerd v1.7.28 h1:Nsgm1AtcmEh4AHAJ4gGlNSaKgXiNccU270Dnf81FQ3c= @@ -1417,6 +120,11 @@ github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6N github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU= +github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= +github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -1444,51 +152,47 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.14 h1:3fAqdB6BCPKHDMHAKRwtPUwYexKtGrNuw8HX/T/4neo= +github.com/gkampitakis/go-snaps v0.5.14/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-air/gini v1.0.4 h1:lteMAxHKNOAjIqazL/klOJJmxq6YxxSuJ17MnMXny+s= github.com/go-air/gini v1.0.4/go.mod h1:dd8RvT1xcv6N1da33okvBd8DhMh1/A4siGy6ErjTljs= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= @@ -1498,58 +202,50 @@ github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lo github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= +github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= -github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= -github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-migrate/migrate/v4 v4.19.0 h1:RcjOnCGz3Or6HQYEJ/EEVLfWnmw9KnoigPSjzhCuaSE= github.com/golang-migrate/migrate/v4 v4.19.0/go.mod h1:9dyEcu+hO+G9hPSw8AIg50yg622pXJsoHItQnDGZkI0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -1576,21 +272,18 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40= -github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= +github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -1602,25 +295,18 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.20.6 h1:cvWX87UxxLgaH76b4hIvya6Dzz9qHB31qAwjAohdSTU= github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2FAkwCDf9/HZgsFJ02E2Y= -github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1630,67 +316,32 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 h1:+epNPbD5EqgpEMm5wrl4Hqts3jZt8+kYaqUisuuIGTk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= @@ -1708,12 +359,10 @@ github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8z github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/itchyny/gojq v0.12.17 h1:8av8eGduDb5+rvEdaOO+zQUjA04MS0m3Ps8HiD+fceg= @@ -1724,33 +373,25 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/joelanford/ignore v0.1.1 h1:vKky5RDoPT+WbONrbQBgOn95VV/UPh4ejlyAbbzgnQk= github.com/joelanford/ignore v0.1.1/go.mod h1:8eho/D8fwQ3rIXrLwE23AaeaGDNXqLE9QJ3zJ4LIPCw= -github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= -github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -1759,47 +400,40 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/letsencrypt/boulder v0.0.0-20250624003606-5ddd5acf990d h1:fCRb9hXR4QQJpwc7xnGugnva0DD5ollTGkys0n8aXT4= github.com/letsencrypt/boulder v0.0.0-20250624003606-5ddd5acf990d/go.mod h1:BVoSL2Ed8oCncct0meeBqoTY7b1Mzx7WqEOZ8EisFmY= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= -github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +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.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 h1:aOeI7xAOVdK+R6xbVsZuU9HmCZYmQVmZgPf9xJUd2Sg= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0/go.mod h1:0hZWbtfeCYUQeAQdPLUzETiBhUSns7O6LDj9vH88xKA= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= @@ -1813,16 +447,29 @@ github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcY github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.25.3 h1:Ty8+Yi/ayDAGtk4XxmmfUy4GabvM+MegeB4cDLRi6nw= -github.com/onsi/ginkgo/v2 v2.25.3/go.mod h1:43uiyQC4Ed2tkOzLsEYm7hnrb7UJTWHYNsuy3bG/snE= +github.com/onsi/ginkgo/v2 v2.26.0 h1:1J4Wut1IlYZNEAWIV3ALrT9NfiaGW2cDCJQSFQMs/gE= +github.com/onsi/ginkgo/v2 v2.26.0/go.mod h1:qhEywmzWTBUY88kfO0BRvX4py7scov9yR+Az2oavUzw= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -1831,29 +478,23 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/openshift/api v0.0.0-20220525145417-ee5b62754c68/go.mod h1:LEnw1IVscIxyDnltE3Wi7bQb/QzIM8BfPNKoGA1Qlxw= github.com/openshift/api v0.0.0-20221021112143-4226c2167e40 h1:PxjGCA72RtsdHWToZLkjjeWm7WXXx4cuv0u4gtvLbrk= github.com/openshift/api v0.0.0-20221021112143-4226c2167e40/go.mod h1:aQ6LDasvHMvHZXqLHnX2GRmnfTWCF/iIwz8EMTTIE9A= -github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c h1:CV76yFOTXmq9VciBR3Bve5ZWzSxdft7gaMVB3kS0rwg= -github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c/go.mod h1:lFMO8mLHXWFzSdYvGNo8ivF9SfF6zInA8ZGw4phRnUE= -github.com/operator-framework/api v0.34.0 h1:REiEaYhG1CWmDoajdcAdZqtgoljWG+ixMY59vUX5pFI= -github.com/operator-framework/api v0.34.0/go.mod h1:eGncUNIYvWtfGCCKmLzGXvoi3P0TDf3Yd/Z0Sn9E6SQ= -github.com/operator-framework/operator-registry v1.59.0 h1:SQhT0qMTYJXqStNhBOYXmLAMpS3eszzbcXAg5NLgJu8= -github.com/operator-framework/operator-registry v1.59.0/go.mod h1:QE1RRQGe+iau8sfY10DbP3+eoahH0G0l+coYrnEzJgI= +github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= +github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a h1:ylsEgoC8Dlg4A0C1TLH0A4x/TZao7k1YveLwROhRUdk= +github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a/go.mod h1:eDO5QeVi2IiXmDwB0e2z1DpAznWroZKe978pzZwFBzg= +github.com/operator-framework/api v0.35.0 h1:xKrffuGEagk3CWy6zqdK5YmIErlBtWUblNNK+q7ld7c= +github.com/operator-framework/api v0.35.0/go.mod h1:A9UNu/pdcO1RauMHvV54unp4DNm/Y5fMVbGDpnIIF+M= +github.com/operator-framework/operator-registry v1.60.0 h1:eUP14WThVTNx+/5hQR9Jyg0nxbf5cOg7hK/GgaOA5Tg= +github.com/operator-framework/operator-registry v1.60.0/go.mod h1:PojPivJbKZgD9RG77JWxFpQRo3iCoUn6WR3aTiS6HBI= github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1864,14 +505,10 @@ github.com/proglottis/gpgme v0.1.5/go.mod h1:5LoXMgpE4bttgwwdv9bLs/vwqv3qV7F4glE github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= 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/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI= +github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/redis/go-redis/extra/rediscmd/v9 v9.10.0 h1:uTiEyEyfLhkw678n6EulHVto8AkcXVr8zUcBJNZ0ark= @@ -1880,23 +517,17 @@ github.com/redis/go-redis/extra/redisotel/v9 v9.10.0 h1:4z7/hCJ9Jft8EBb2tDmK38p2 github.com/redis/go-redis/extra/redisotel/v9 v9.10.0/go.mod h1:B0thqLh4hB8MvvcUKSwyP5YiIcCCp8UrQ0cA9gEqyjk= github.com/redis/go-redis/v9 v9.10.0 h1:FxwK3eV8p/CQa0Ch276C7u2d0eNC9kCmAYQ7mCXCzVs= github.com/redis/go-redis/v9 v9.10.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/secure-systems-lab/go-securesystemslib v0.9.1 h1:nZZaNz4DiERIQguNy0cL5qTdn9lR8XKHf4RUyG1Sx3g= github.com/secure-systems-lab/go-securesystemslib v0.9.1/go.mod h1:np53YzT0zXGMv6x4iEWc9Z59uR+x+ndLwCLqPYpLXVU= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sigstore/fulcio v1.7.1 h1:RcoW20Nz49IGeZyu3y9QYhyyV3ZKQ85T+FXPKkvE+aQ= github.com/sigstore/fulcio v1.7.1/go.mod h1:7lYY+hsd8Dt+IvKQRC+KEhWpCZ/GlmNvwIa5JhypMS8= github.com/sigstore/protobuf-specs v0.4.3 h1:kRgJ+ciznipH9xhrkAbAEHuuxD3GhYnGC873gZpjJT4= @@ -1909,18 +540,16 @@ github.com/smallstep/pkcs7 v0.2.1 h1:6Kfzr/QizdIuB6LSv8y1LJdZ3aPSfTNhTLqAx9CTLfA github.com/smallstep/pkcs7 v0.2.1/go.mod h1:RcXHsMfL+BzH8tRhmrF1NkkpebKpq3JEM66cOFxanf0= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1928,22 +557,26 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= github.com/tidwall/btree v1.8.1/go.mod h1:jBbTdUWhSZClZWoDg54VnvV7/54modSOzDN7VXftj1A= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= @@ -1964,26 +597,20 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v2 v2.305.21 h1:eLiFfexc2mE+pTLz9WwnoEsX5JTTpLCYVivKkmVXIRA= -go.etcd.io/etcd/client/v2 v2.305.21/go.mod h1:OKkn4hlYNf43hpjEM3Ke3aRdUkhSl8xjKjSf8eCq2J8= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= -go.etcd.io/etcd/pkg/v3 v3.5.21 h1:jUItxeKyrDuVuWhdh0HtjUANwyuzcb7/FAeUfABmQsk= -go.etcd.io/etcd/pkg/v3 v3.5.21/go.mod h1:wpZx8Egv1g4y+N7JAsqi2zoUiBIUWznLjqJbylDjWgU= -go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= -go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= -go.etcd.io/etcd/server/v3 v3.5.21 h1:9w0/k12majtgarGmlMVuhwXRI2ob3/d1Ik3X5TKo0yU= -go.etcd.io/etcd/server/v3 v3.5.21/go.mod h1:G1mOzdwuzKT1VRL7SqRchli/qcFrtLBTAQ4lV20sXXo= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= +go.etcd.io/etcd/pkg/v3 v3.6.4 h1:fy8bmXIec1Q35/jRZ0KOes8vuFxbvdN0aAFqmEfJZWA= +go.etcd.io/etcd/pkg/v3 v3.6.4/go.mod h1:kKcYWP8gHuBRcteyv6MXWSN0+bVMnfgqiHueIZnKMtE= +go.etcd.io/etcd/server/v3 v3.6.4 h1:LsCA7CzjVt+8WGrdsnh6RhC0XqCsLkBly3ve5rTxMAU= +go.etcd.io/etcd/server/v3 v3.6.4/go.mod h1:aYCL/h43yiONOv0QIR82kH/2xZ7m+IWYjzRmyQfnCAg= +go.etcd.io/raft/v3 v3.6.0 h1:5NtvbDVYpnfZWcIHgGRk9DyzkBIXOi8j+DDp1IcnUWQ= +go.etcd.io/raft/v3 v3.6.0/go.mod h1:nLvLevg6+xrVtHUmVaTcTz603gQPHfh7kUAwV6YpfGo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1999,17 +626,10 @@ go.opentelemetry.io/contrib/bridges/prometheus v0.61.0 h1:RyrtJzu5MAmIcbRrwg75b+ go.opentelemetry.io/contrib/bridges/prometheus v0.61.0/go.mod h1:tirr4p9NXbzjlbruiRGp53IzlYrDk5CO2fdHj0sSSaY= go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 h1:XfzKtKSrbtYk9TNCF8dkO0Y9M7IOfb4idCwBOTwGBiI= go.opentelemetry.io/contrib/exporters/autoexport v0.61.0/go.mod h1:N6otC+qXTD5bAnbK2O1f/1SXq3cX+3KYSWrkBUqG0cw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= @@ -2036,28 +656,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 h1:G8Xec/SgZQricwW go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0/go.mod h1:PD57idA/AiFD5aqoxGxCvT/ILJPeHy3MjqU/NS7KogY= go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.podman.io/common v0.65.0 h1:8JNl25U4VpKDkFHSymSPm4te7ZQHJbfAB/l2FqtmYEg= @@ -2074,67 +682,36 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= 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-20190820162420-60c769a6c586/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-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 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/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -2145,7 +722,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -2157,20 +733,12 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= 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= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2181,6 +749,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR 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-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= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2191,6 +760,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2199,46 +769,16 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/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-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2249,31 +789,11 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/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.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= +golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2284,18 +804,11 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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-20220601150217-0de741cfad7f/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.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2304,11 +817,13 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2319,6 +834,7 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2328,84 +844,25 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/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-20210423185535-09eb48e85fd7/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/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-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/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-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/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= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2415,30 +872,16 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= -golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2451,7 +894,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw 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-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/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= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2472,6 +914,8 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2481,31 +925,16 @@ 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-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -2514,22 +943,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2551,62 +968,14 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= -google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= -google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g= -google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2629,7 +998,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -2637,203 +1005,42 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= -google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= -google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= -google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= -google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= -google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= -google.golang.org/genproto/googleapis/api v0.0.0-20240122161410-6c6643bf1457/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I= -google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:PVreiBMirk8ypES6aw9d4p6iiBNSIfZEBqr3UGoAi2E= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:SCz6T5xjNXM4QFPRwxHcfChp7V+9DcXR3ay2TkHR8Tg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920183334-c177e329c48b/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231211222908-989df2bf70f3/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240122161410-6c6643bf1457/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2847,38 +1054,39 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2888,114 +1096,66 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/code-generator v0.33.4 h1:DiA801QxqApRIBh3OWULasVAUA237XnYvFNMh+E34Y8= -k8s.io/code-generator v0.33.4/go.mod h1:ifWxKWhEl/Z1K7WmWAyOBEf3ex/i546ingCzLC8YVIY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= +k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc= +k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.33.4 h1:rvsVglcIFa9WeKk5vd3mBufSG4D5dqponz1Jz5d6FXU= -k8s.io/kms v0.33.4/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E= -k8s.io/kube-aggregator v0.33.4 h1:TdIJKHb0/bLpby7FblXIaVEzyA1jGEjzt/n9cRvwq8U= -k8s.io/kube-aggregator v0.33.4/go.mod h1:wZuctdRvGde5bwzxkZRs0GYj2KOpCNgx8rRGVoNb62k= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kms v0.34.1 h1:iCFOvewDPzWM9fMTfyIPO+4MeuZ0tcZbugxLNSHFG4w= +k8s.io/kms v0.34.1/go.mod h1:s1CFkLG7w9eaTYvctOxosx88fl4spqmixnNpys0JAtM= +k8s.io/kube-aggregator v0.34.1 h1:WNLV0dVNoFKmuyvdWLd92iDSyD/TSTjqwaPj0U9XAEU= +k8s.io/kube-aggregator v0.34.1/go.mod h1:RU8j+5ERfp0h+gIvWtxRPfsa5nK7rboDm8RST8BJfYQ= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.38.1/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.0.0-20220910160915-348f15de615a/go.mod h1:8p47QxPkdugex9J4n9P2tLZ9bK01yngIVp00g4nomW0= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.19.0/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.2/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= -sigs.k8s.io/controller-tools v0.18.0 h1:rGxGZCZTV2wJreeRgqVoWab/mfcumTMmSwKzoM9xrsE= -sigs.k8s.io/controller-tools v0.18.0/go.mod h1:gLKoiGBriyNh+x1rWtUQnakUYEujErjXs9pf+x/8n1U= +sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTijTq8Y= +sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk= +sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/staging/operator-lifecycle-manager/hack/overlays/goimports_vendorlesspath.go b/staging/operator-lifecycle-manager/hack/overlays/goimports_vendorlesspath.go new file mode 100644 index 0000000000..4d1ab99221 --- /dev/null +++ b/staging/operator-lifecycle-manager/hack/overlays/goimports_vendorlesspath.go @@ -0,0 +1,14 @@ +package imports + +import "strings" + +// VendorlessPath returns ipath with any vendor prefixes trimmed. +func VendorlessPath(ipath string) string { + if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 { + return ipath[i+len("/vendor/"):] + } + if strings.HasPrefix(ipath, "vendor/") { + return ipath[len("vendor/"):] + } + return ipath +} diff --git a/staging/operator-lifecycle-manager/hack/scripts/run-counterfeiter.sh b/staging/operator-lifecycle-manager/hack/scripts/run-counterfeiter.sh new file mode 100755 index 0000000000..cd2e320189 --- /dev/null +++ b/staging/operator-lifecycle-manager/hack/scripts/run-counterfeiter.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ $# -lt 3 ]]; then + echo "usage: $0 " >&2 + exit 2 +fi + +out="$1" +pkg_path="$2" +type_name="$3" + +# Resolve the fully-qualified package path even when invoked from GOPATH layouts. +module_pkg=$(GO111MODULE="${GO111MODULE:-on}" GOWORK="${GOWORK:-off}" GOFLAGS="${GOFLAGS:-}" go list "$pkg_path") + +GO111MODULE="${GO111MODULE:-on}" GOWORK="${GOWORK:-off}" GOFLAGS="${GOFLAGS:-}" \ + go run github.com/maxbrunsfeld/counterfeiter/v6 -o "$out" "${module_pkg}.${type_name}" diff --git a/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go b/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go index 1b09f2edb4..cb46e97ba3 100644 --- a/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go +++ b/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go @@ -441,7 +441,7 @@ func TestEnsureServiceAccount(t *testing.T) { require.True(t, equality.Semantic.DeepEqual(tt.expect.returnedServiceAccount, sa), "Resources do not match : %s", - diff.ObjectDiff(tt.expect.returnedServiceAccount, sa)) + diff.Diff(tt.expect.returnedServiceAccount, sa)) require.EqualValues(t, tt.expect.returnedError, errors.Cause(err)) diff --git a/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go b/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go index b24538859d..2a928f9841 100644 --- a/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go +++ b/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go @@ -8,7 +8,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" - v1 "k8s.io/api/apps/v1" + "k8s.io/api/apps/v1" v1b "k8s.io/api/core/v1" v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go b/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go index 4fdf56e26b..c7aea05f44 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go @@ -163,7 +163,7 @@ func grpcConnection(address string) (*grpc.ClientConn, error) { })) } - return grpc.Dial(address, dialOptions...) + return grpc.NewClient(address, dialOptions...) } func (s *SourceStore) Add(key registry.CatalogKey, address string) (*SourceConn, error) { @@ -203,6 +203,11 @@ func (s *SourceStore) stateTimeout(state connectivity.State) time.Duration { func (s *SourceStore) watch(ctx context.Context, key registry.CatalogKey, source SourceConn) { state := source.ConnectionState + + // Make initial connection + source.Conn.Connect() + + // Periodically observe connection state change for { select { case <-ctx.Done(): diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go index 77fcc2d59c..c7bb8fe4f0 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeClusterRoleBindingLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go index 82eed6967a..67f9b8f8dd 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go index e3432c88fb..ff67a136c1 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go index 7caeab6ca5..b2de0d603d 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleBindingLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go index fdda3a76cf..d95d9b411c 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleBindingNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go index c07aa9f450..491fb0c77c 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeSecretLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go index b4c70b1f95..217d168cf6 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeSecretNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go index 9c417b127e..904a6f528f 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceAccountLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go index b6cd697361..447f7a6f0d 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceAccountNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go index 3a3a7dfd22..f5646edb91 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go index 02e7c77ac5..34199c47e5 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go index 296cbc6558..1d542d2859 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go +++ b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go @@ -78,10 +78,6 @@ func TestServerSideApply(t *testing.T) { return nil }, want: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - APIVersion: "v1", - }, ObjectMeta: metav1.ObjectMeta{ Name: "testpod", Namespace: "testns", @@ -106,10 +102,6 @@ func TestServerSideApply(t *testing.T) { return nil }, want: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - APIVersion: "v1", - }, ObjectMeta: metav1.ObjectMeta{ Name: "testpod", Namespace: "testns", @@ -137,10 +129,6 @@ func TestServerSideApply(t *testing.T) { return unstructured.SetNestedField(u.Object, "new", "status", "message") }, want: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - APIVersion: "v1", - }, ObjectMeta: metav1.ObjectMeta{ Name: "testpod", Namespace: "testns", diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go index a6b94264f7..67cb40108c 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go @@ -25,8 +25,8 @@ import ( //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go k8s.io/client-go/listers/rbac/v1.RoleBindingNamespaceLister //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go k8s.io/client-go/listers/rbac/v1.ClusterRoleBindingLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionNamespaceLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionNamespaceLister // OperatorLister is a union of versioned informer listers // diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go index cc6ed0d2fe..003dce5780 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1" + "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1" ) type FakeAPIRegistrationV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go index 53e64161c1..f2a0e9f19c 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/client-go/listers/apps/v1" + "k8s.io/client-go/listers/apps/v1" ) type FakeAppsV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go index 99e222e063..d7774d2e01 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeCoreV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go index 6a578b93dd..10b70b77ca 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRbacV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go b/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go index bb0b092d85..6b7fcab02e 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go @@ -214,7 +214,7 @@ func MonitorClusterStatus(name string, syncCh <-chan error, stopCh <-chan struct log.Errorf("Failed to get related objects: %v", err) } if !reflect.DeepEqual(previousStatus.RelatedObjects, existing.Status.RelatedObjects) { - diffString := diff.ObjectDiff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) + diffString := diff.Diff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) log.Debugf("Update required for related objects: %v", diffString) } diff --git a/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go b/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go index 02b994ce95..ec38b314a5 100644 --- a/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go +++ b/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go @@ -2067,7 +2067,7 @@ func TestRegistryProviderListLabels(t *testing.T) { } func newTestRegistryClient(t *testing.T, catsrc *operatorsv1alpha1.CatalogSource) *registryClient { - conn, err := grpc.Dial(address+catsrc.Status.RegistryServiceStatus.Port, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.NewClient(address+catsrc.Status.RegistryServiceStatus.Port, grpc.WithTransportCredentials(insecure.NewCredentials())) require.NoError(t, err, "could not set up test grpc connection") return newRegistryClient(catsrc, conn) } diff --git a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go index 872707e436..dfb8b2c6b1 100644 --- a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go @@ -1561,7 +1561,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csv.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) }) It("create with owned API service", func() { @@ -2557,7 +2557,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) }) It("update different deployment name", func() { @@ -2735,7 +2735,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old") depNew, err := c.GetDeployment(generatedNamespace.GetName(), strategyNew.DeploymentSpecs[0].Name) @@ -2924,7 +2924,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old") depNew, err := c.GetDeployment(generatedNamespace.GetName(), strategyNew.DeploymentSpecs[0].Name) @@ -3293,7 +3293,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old one") depNew, err := c.GetDeployment(generatedNamespace.GetName(), strategyNew.DeploymentSpecs[0].Name) @@ -3372,7 +3372,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err = fetchCSV(crc, generatedNamespace.GetName(), csvNew2.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old one") depNew, err = c.GetDeployment(generatedNamespace.GetName(), strategyNew2.DeploymentSpecs[0].Name) diff --git a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go index 4fe1419fd6..09641dac67 100644 --- a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go @@ -770,8 +770,8 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { By(`Don't compare object meta as labels can be applied by the operator controller.`) - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Spec, fip.Spec)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Status, fip.Status)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Spec, fip.Spec)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Status, fip.Status)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) @@ -941,7 +941,7 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) @@ -2496,7 +2496,7 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) @@ -2696,7 +2696,7 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) diff --git a/staging/operator-registry/.github/workflows/goreleaser.yaml b/staging/operator-registry/.github/workflows/goreleaser.yaml index 93c482aad8..b09a7010c8 100644 --- a/staging/operator-registry/.github/workflows/goreleaser.yaml +++ b/staging/operator-registry/.github/workflows/goreleaser.yaml @@ -61,7 +61,7 @@ jobs: run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_ARGS: release --skip=validate --clean -f release/goreleaser.windows.yaml ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} + RELEASE_ARGS: release --verbose --skip=validate --clean -f release/goreleaser.windows.yaml ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} - run: tar -cvf dist-windows.tar dist - uses: actions/upload-artifact@v4 @@ -85,7 +85,7 @@ jobs: run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_ARGS: release --rm-dist -f release/goreleaser.darwin.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} + RELEASE_ARGS: release --verbose --clean -f release/goreleaser.darwin.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} - run: gtar -cvf dist-darwin.tar dist - uses: actions/upload-artifact@v4 @@ -140,7 +140,7 @@ jobs: run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_ARGS: release --rm-dist -f release/goreleaser.linux.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} + RELEASE_ARGS: release --verbose --clean -f release/goreleaser.linux.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} - run: tar -cvf dist-linux.tar dist - uses: actions/upload-artifact@v4 diff --git a/staging/operator-registry/Makefile b/staging/operator-registry/Makefile index 8f4e906667..51fd6ebfde 100644 --- a/staging/operator-registry/Makefile +++ b/staging/operator-registry/Makefile @@ -9,6 +9,7 @@ export PKG := github.com/operator-framework/operator-registry export GIT_COMMIT := $(or $(SOURCE_GIT_COMMIT),$(shell git rev-parse --short HEAD)) export OPM_VERSION := $(or $(SOURCE_GIT_TAG),$(shell git describe --always --tags HEAD)) export BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') +export GRPC_HEALTH_PROBE_VERSION := $(shell $(GO) list -m github.com/grpc-ecosystem/grpc-health-probe | awk '{print $$2}') .DEFAULT_GOAL := all @@ -143,7 +144,7 @@ export LATEST_IMAGE_OR_EMPTY := $(shell \ && [ "$(shell echo -e "$(OPM_VERSION)\n$(LATEST_TAG)" | sort -rV | head -n1)" == "$(OPM_VERSION)" ] \ && echo "$(OPM_IMAGE_REPO):latest" || echo "") RELEASE_GOOS := $(shell go env GOOS) -RELEASE_ARGS ?= release --clean --snapshot -f release/goreleaser.$(RELEASE_GOOS).yaml +RELEASE_ARGS ?= release --verbose --clean --snapshot -f release/goreleaser.$(RELEASE_GOOS).yaml # Note: bingo does not yet support windows (https://github.com/bwplotka/bingo/issues/26) # so GOOS=windows gets its own way to install goreleaser diff --git a/staging/operator-registry/go.mod b/staging/operator-registry/go.mod index 67f8ba3f5d..4099cf546b 100644 --- a/staging/operator-registry/go.mod +++ b/staging/operator-registry/go.mod @@ -24,7 +24,7 @@ require ( github.com/onsi/gomega v1.38.2 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.1 - github.com/operator-framework/api v0.34.0 + github.com/operator-framework/api v0.35.0 github.com/otiai10/copy v1.14.1 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 @@ -45,14 +45,14 @@ require ( google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.33.4 - k8s.io/apiextensions-apiserver v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/client-go v0.33.4 + k8s.io/api v0.34.1 + k8s.io/apiextensions-apiserver v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 k8s.io/kubectl v0.33.2 oras.land/oras-go/v2 v2.6.0 - sigs.k8s.io/controller-runtime v0.21.0 - sigs.k8s.io/kind v0.29.0 + sigs.k8s.io/controller-runtime v0.22.1 + sigs.k8s.io/kind v0.30.0 sigs.k8s.io/yaml v1.6.0 ) @@ -95,7 +95,7 @@ require ( github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.16.2 // indirect @@ -109,8 +109,8 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cel-go v0.26.0 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/cel-go v0.26.1 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-containerregistry v0.20.6 // indirect github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/google/uuid v1.6.0 // indirect @@ -142,7 +142,7 @@ require ( github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/opencontainers/runtime-spec v1.2.1 // indirect @@ -213,14 +213,14 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.33.4 // indirect + k8s.io/apiserver v0.34.1 // indirect k8s.io/cli-runtime v0.33.2 // indirect - k8s.io/component-base v0.33.4 // indirect + k8s.io/component-base v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a // indirect + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) diff --git a/staging/operator-registry/go.sum b/staging/operator-registry/go.sum index 9164c21cb9..673766764a 100644 --- a/staging/operator-registry/go.sum +++ b/staging/operator-registry/go.sum @@ -118,8 +118,8 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= @@ -175,17 +175,16 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= -github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= +github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -296,8 +295,9 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -313,8 +313,8 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/operator-framework/api v0.34.0 h1:REiEaYhG1CWmDoajdcAdZqtgoljWG+ixMY59vUX5pFI= -github.com/operator-framework/api v0.34.0/go.mod h1:eGncUNIYvWtfGCCKmLzGXvoi3P0TDf3Yd/Z0Sn9E6SQ= +github.com/operator-framework/api v0.35.0 h1:xKrffuGEagk3CWy6zqdK5YmIErlBtWUblNNK+q7ld7c= +github.com/operator-framework/api v0.35.0/go.mod h1:A9UNu/pdcO1RauMHvV54unp4DNm/Y5fMVbGDpnIIF+M= github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= @@ -425,12 +425,12 @@ github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= @@ -687,24 +687,24 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= k8s.io/cli-runtime v0.33.2 h1:koNYQKSDdq5AExa/RDudXMhhtFasEg48KLS2KSAU74Y= k8s.io/cli-runtime v0.33.2/go.mod h1:gnhsAWpovqf1Zj5YRRBBU7PFsRc6NkEkwYNQE+mXL88= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= k8s.io/kubectl v0.33.2 h1:7XKZ6DYCklu5MZQzJe+CkCjoGZwD1wWl7t/FxzhMz7Y= k8s.io/kubectl v0.33.2/go.mod h1:8rC67FB8tVTYraovAGNi/idWIK90z2CHFNMmGJZJ3KI= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= @@ -713,17 +713,15 @@ oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= +sigs.k8s.io/controller-runtime v0.22.1 h1:Ah1T7I+0A7ize291nJZdS1CabF/lB4E++WizgV24Eqg= +sigs.k8s.io/controller-runtime v0.22.1/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/kind v0.29.0 h1:3TpCsyh908IkXXpcSnsMjWdwdWjIl7o9IMZImZCWFnI= -sigs.k8s.io/kind v0.29.0/go.mod h1:ldWQisw2NYyM6k64o/tkZng/1qQW7OlzcN5a8geJX3o= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/kind v0.30.0 h1:2Xi1KFEfSMm0XDcvKnUt15ZfgRPCT0OnCBbpgh8DztY= +sigs.k8s.io/kind v0.30.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/staging/operator-registry/pkg/lib/bundle/supported_resources.go b/staging/operator-registry/pkg/lib/bundle/supported_resources.go index 3569367ef2..ee2afeb419 100644 --- a/staging/operator-registry/pkg/lib/bundle/supported_resources.go +++ b/staging/operator-registry/pkg/lib/bundle/supported_resources.go @@ -22,6 +22,7 @@ const ( ConsoleLinkKind = "ConsoleLink" ConsolePlugin = "ConsolePlugin" NetworkPolicyKind = "NetworkPolicy" + PodMonitorKind = "PodMonitor" ) // Namespaced indicates whether the resource is namespace scoped (true) or cluster-scoped (false). @@ -51,6 +52,7 @@ var supportedResources = map[string]Namespaced{ ConsoleLinkKind: false, ConsolePlugin: false, NetworkPolicyKind: true, + PodMonitorKind: true, } // IsSupported checks if the object kind is OLM-supported and if it is namespaced diff --git a/staging/operator-registry/pkg/sqlite/configmap_test.go b/staging/operator-registry/pkg/sqlite/configmap_test.go index a09f22f4d4..b6c3485382 100644 --- a/staging/operator-registry/pkg/sqlite/configmap_test.go +++ b/staging/operator-registry/pkg/sqlite/configmap_test.go @@ -171,12 +171,12 @@ func TestQuerierForConfigmap(t *testing.T) { }, Version: "0.9.2", SkipRange: "< 0.6.0", - CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"creationTimestamp\":null,\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", + CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", Object: []string{ - "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"creationTimestamp\":null,\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", - "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"etcdclusters.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdCluster\",\"listKind\":\"EtcdClusterList\",\"plural\":\"etcdclusters\",\"shortNames\":[\"etcdclus\",\"etcd\"],\"singular\":\"etcdcluster\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", - "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"etcdbackups.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdBackup\",\"listKind\":\"EtcdBackupList\",\"plural\":\"etcdbackups\",\"singular\":\"etcdbackup\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", - "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}"}, + "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", + "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdclusters.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdCluster\",\"listKind\":\"EtcdClusterList\",\"plural\":\"etcdclusters\",\"shortNames\":[\"etcdclus\",\"etcd\"],\"singular\":\"etcdcluster\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", + "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdbackups.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdBackup\",\"listKind\":\"EtcdBackupList\",\"plural\":\"etcdbackups\",\"singular\":\"etcdbackup\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", + "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}"}, } bareGetBundleForChannelResult := &api.Bundle{ CsvName: expectedBundle.CsvName, diff --git a/staging/operator-registry/release/goreleaser.linux.yaml b/staging/operator-registry/release/goreleaser.linux.yaml index 2822d1d302..2d74ea71d3 100644 --- a/staging/operator-registry/release/goreleaser.linux.yaml +++ b/staging/operator-registry/release/goreleaser.linux.yaml @@ -87,6 +87,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/amd64 + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} - image_templates: - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" ids: ["linux-arm64"] @@ -97,6 +98,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/arm64 + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} - image_templates: - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" ids: ["linux-ppc64le"] @@ -107,6 +109,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/ppc64le + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} - image_templates: - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" ids: ["linux-s390x"] @@ -117,6 +120,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/s390x + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} docker_manifests: # IMAGE_TAG is either set by the Makefile or the goreleaser action workflow, # This image is intended to be tagged/pushed on all trunk (master, release branch) commits and tags. diff --git a/staging/operator-registry/release/goreleaser.opm.Dockerfile b/staging/operator-registry/release/goreleaser.opm.Dockerfile index 96c70d6d24..5c668c9b41 100644 --- a/staging/operator-registry/release/goreleaser.opm.Dockerfile +++ b/staging/operator-registry/release/goreleaser.opm.Dockerfile @@ -1,8 +1,13 @@ # NOTE: This Dockerfile is used in conjuction with GoReleaser to # build opm images. See the configurations in .goreleaser.yaml # and .github/workflows/release.yaml. +# +# The GRPC_HEALTH_PROBE_VERSION is automatically passed as a build arg +# by GoReleaser from the GRPC_HEALTH_PROBE_VERSION environment variable, +# which is set in the Makefile from go.mod. -FROM ghcr.io/grpc-ecosystem/grpc-health-probe:v0.4.37 AS grpc_health_probe +ARG GRPC_HEALTH_PROBE_VERSION +FROM ghcr.io/grpc-ecosystem/grpc-health-probe:${GRPC_HEALTH_PROBE_VERSION} AS grpc_health_probe FROM gcr.io/distroless/static:debug COPY --from=grpc_health_probe /ko-app/grpc-health-probe /bin/grpc_health_probe COPY ["nsswitch.conf", "/etc/nsswitch.conf"] diff --git a/vendor/github.com/fxamacker/cbor/v2/README.md b/vendor/github.com/fxamacker/cbor/v2/README.md index da9f9e6f09..d072b81c73 100644 --- a/vendor/github.com/fxamacker/cbor/v2/README.md +++ b/vendor/github.com/fxamacker/cbor/v2/README.md @@ -4,7 +4,7 @@ CBOR is a [trusted alternative](https://www.rfc-editor.org/rfc/rfc8949.html#name-comparison-of-other-binary-) to JSON, MessagePack, Protocol Buffers, etc.  CBOR is an Internet Standard defined by [IETF STD 94 (RFC 8949)](https://www.rfc-editor.org/info/std94) and is designed to be relevant for decades. -`fxamacker/cbor` is used in projects by Arm Ltd., Cisco, EdgeX Foundry, Flow Foundation, Fraunhofer‑AISEC, Kubernetes, Let's Encrypt (ISRG), Linux Foundation, Microsoft, Mozilla, Oasis Protocol, Tailscale, Teleport, [etc](https://github.com/fxamacker/cbor#who-uses-fxamackercbor). +`fxamacker/cbor` is used in projects by Arm Ltd., EdgeX Foundry, Flow Foundation, Fraunhofer‑AISEC, IBM, Kubernetes[*](https://github.com/search?q=org%3Akubernetes%20fxamacker%2Fcbor&type=code), Let's Encrypt, Linux Foundation, Microsoft, Oasis Protocol, Red Hat[*](https://github.com/search?q=org%3Aopenshift+fxamacker%2Fcbor&type=code), Tailscale[*](https://github.com/search?q=org%3Atailscale+fxamacker%2Fcbor&type=code), Veraison[*](https://github.com/search?q=org%3Averaison+fxamacker%2Fcbor&type=code), [etc](https://github.com/fxamacker/cbor#who-uses-fxamackercbor). See [Quick Start](#quick-start) and [Releases](https://github.com/fxamacker/cbor/releases/). 🆕 `UnmarshalFirst` and `DiagnoseFirst` can decode CBOR Sequences. `MarshalToBuffer` and `UserBufferEncMode` accepts user-specified buffer. @@ -39,7 +39,7 @@ Codec passed multiple confidential security assessments in 2022. No vulnerabili __🗜️  Data Size__ -Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) automatically reduce size of encoded structs. Encoding optionally shrinks float64→32→16 when values fit. +Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) and field tag "-" automatically reduce size of encoded structs. Encoding optionally shrinks float64→32→16 when values fit. __:jigsaw:  Usability__ @@ -146,8 +146,12 @@ Struct tags automatically reduce encoded size of structs and improve speed. We can write less code by using struct tag options: - `toarray`: encode without field names (decode back to original struct) - `keyasint`: encode field names as integers (decode back to original struct) -- `omitempty`: omit empty fields when encoding -- `omitzero`: omit zero-value fields when encoding +- `omitempty`: omit empty field when encoding +- `omitzero`: omit zero-value field when encoding + +As a special case, struct field tag "-" omits the field. + +NOTE: When a struct uses `toarray`, the encoder will ignore `omitempty` and `omitzero` to prevent position of encoded array elements from changing. This allows decoder to match encoded elements to their Go struct field. ![alt text](https://github.com/fxamacker/images/raw/master/cbor/v2.3.0/cbor_struct_tags_api.svg?sanitize=1 "CBOR API and Go Struct Tags") @@ -353,6 +357,60 @@ err = em.MarshalToBuffer(v, &buf) // encode v to provided buf Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) reduce encoded size of structs. +As a special case, struct field tag "-" omits the field. + +
🔎  Example encoding with struct field tag "-"

+ +https://go.dev/play/p/aWEIFxd7InX + +```Go +// https://github.com/fxamacker/cbor/issues/652 +package main + +import ( + "encoding/json" + "fmt" + + "github.com/fxamacker/cbor/v2" +) + +// The `cbor:"-"` tag omits the Type field when encoding to CBOR. +type Entity struct { + _ struct{} `cbor:",toarray"` + ID uint64 `json:"id"` + Type string `cbor:"-" json:"typeOf"` + Name string `json:"name"` +} + +func main() { + entity := Entity{ + ID: 1, + Type: "int64", + Name: "Identifier", + } + + c, _ := cbor.Marshal(entity) + diag, _ := cbor.Diagnose(c) + fmt.Printf("CBOR in hex: %x\n", c) + fmt.Printf("CBOR in edn: %s\n", diag) + + j, _ := json.Marshal(entity) + fmt.Printf("JSON: %s\n", string(j)) + + fmt.Printf("JSON encoding is %d bytes\n", len(j)) + fmt.Printf("CBOR encoding is %d bytes\n", len(c)) + + // Output: + // CBOR in hex: 82016a4964656e746966696572 + // CBOR in edn: [1, "Identifier"] + // JSON: {"id":1,"typeOf":"int64","name":"Identifier"} + // JSON encoding is 45 bytes + // CBOR encoding is 13 bytes +} +``` + +

+
🔎  Example encoding 3-level nested Go struct to 1 byte CBOR

https://go.dev/play/p/YxwvfPdFQG2 @@ -476,6 +534,139 @@ if data, err := em.Marshal(v); err != nil {

+👉 `fxamacker/cbor` allows user apps to use almost any current or future CBOR tag number by implementing `cbor.Marshaler` and `cbor.Unmarshaler` interfaces. + +Basically, `MarshalCBOR` and `UnmarshalCBOR` functions can be implemented by user apps and those functions will automatically be called by this CBOR codec's `Marshal`, `Unmarshal`, etc. + +The following [example](https://github.com/fxamacker/cbor/blob/master/example_embedded_json_tag_for_cbor_test.go) shows how to encode and decode a tagged CBOR data item with tag number 262. The tag content is a JSON object "embedded" as a CBOR byte string (major type 2). + +
🔎  Example using Embedded JSON Tag for CBOR (tag 262) + +```go +// https://github.com/fxamacker/cbor/issues/657 + +package cbor_test + +// NOTE: RFC 8949 does not mention tag number 262. IANA assigned +// CBOR tag number 262 as "Embedded JSON Object" specified by the +// document Embedded JSON Tag for CBOR: +// +// "Tag 262 can be applied to a byte string (major type 2) to indicate +// that the byte string is a JSON Object. The length of the byte string +// indicates the content." +// +// For more info, see Embedded JSON Tag for CBOR at: +// https://github.com/toravir/CBOR-Tag-Specs/blob/master/embeddedJSON.md + +import ( + "bytes" + "encoding/json" + "fmt" + + "github.com/fxamacker/cbor/v2" +) + +// cborTagNumForEmbeddedJSON is the CBOR tag number 262. +const cborTagNumForEmbeddedJSON = 262 + +// EmbeddedJSON represents a Go value to be encoded as a tagged CBOR data item +// with tag number 262 and the tag content is a JSON object "embedded" as a +// CBOR byte string (major type 2). +type EmbeddedJSON struct { + any +} + +func NewEmbeddedJSON(val any) EmbeddedJSON { + return EmbeddedJSON{val} +} + +// MarshalCBOR encodes EmbeddedJSON to a tagged CBOR data item with the +// tag number 262 and the tag content is a JSON object that is +// "embedded" as a CBOR byte string. +func (v EmbeddedJSON) MarshalCBOR() ([]byte, error) { + // Encode v to JSON object. + data, err := json.Marshal(v) + if err != nil { + return nil, err + } + + // Create cbor.Tag representing a tagged CBOR data item. + tag := cbor.Tag{ + Number: cborTagNumForEmbeddedJSON, + Content: data, + } + + // Marshal to a tagged CBOR data item. + return cbor.Marshal(tag) +} + +// UnmarshalCBOR decodes a tagged CBOR data item to EmbeddedJSON. +// The byte slice provided to this function must contain a single +// tagged CBOR data item with the tag number 262 and tag content +// must be a JSON object "embedded" as a CBOR byte string. +func (v *EmbeddedJSON) UnmarshalCBOR(b []byte) error { + // Unmarshal tagged CBOR data item. + var tag cbor.Tag + if err := cbor.Unmarshal(b, &tag); err != nil { + return err + } + + // Check tag number. + if tag.Number != cborTagNumForEmbeddedJSON { + return fmt.Errorf("got tag number %d, expect tag number %d", tag.Number, cborTagNumForEmbeddedJSON) + } + + // Check tag content. + jsonData, isByteString := tag.Content.([]byte) + if !isByteString { + return fmt.Errorf("got tag content type %T, expect tag content []byte", tag.Content) + } + + // Unmarshal JSON object. + return json.Unmarshal(jsonData, v) +} + +// MarshalJSON encodes EmbeddedJSON to a JSON object. +func (v EmbeddedJSON) MarshalJSON() ([]byte, error) { + return json.Marshal(v.any) +} + +// UnmarshalJSON decodes a JSON object. +func (v *EmbeddedJSON) UnmarshalJSON(b []byte) error { + dec := json.NewDecoder(bytes.NewReader(b)) + dec.UseNumber() + return dec.Decode(&v.any) +} + +func Example_embeddedJSONTagForCBOR() { + value := NewEmbeddedJSON(map[string]any{ + "name": "gopher", + "id": json.Number("42"), + }) + + data, err := cbor.Marshal(value) + if err != nil { + panic(err) + } + + fmt.Printf("cbor: %x\n", data) + + var v EmbeddedJSON + err = cbor.Unmarshal(data, &v) + if err != nil { + panic(err) + } + + fmt.Printf("%+v\n", v.any) + for k, v := range v.any.(map[string]any) { + fmt.Printf(" %s: %v (%T)\n", k, v, v) + } +} +``` + +
+ + ### Functions and Interfaces
🔎  Functions and interfaces at a glance

@@ -492,7 +683,7 @@ because RFC 8949 treats CBOR data item with remaining bytes as malformed. Other useful functions: - `Diagnose`, `DiagnoseFirst` produce human-readable [Extended Diagnostic Notation](https://www.rfc-editor.org/rfc/rfc8610.html#appendix-G) from CBOR data. - `UnmarshalFirst` decodes first CBOR data item and return any remaining bytes. -- `Wellformed` returns true if the the CBOR data item is well-formed. +- `Wellformed` returns true if the CBOR data item is well-formed. Interfaces identical or comparable to Go `encoding` packages include: `Marshaler`, `Unmarshaler`, `BinaryMarshaler`, and `BinaryUnmarshaler`. @@ -511,28 +702,28 @@ Default limits may need to be increased for systems handling very large data (e. ## Status -v2.8.0 (March 30, 2025) is a small release primarily to add `omitzero` option to struct field tags and fix bugs. It passed fuzz tests (billions of executions) and is production quality. - -v2.8.0 and v2.7.1 fixes these 3 functions (when called directly by user apps) to use same error handling on bad inputs as `cbor.Unmarshal()`: -- `ByteString.UnmarshalCBOR()` -- `RawTag.UnmarshalCBOR()` -- `SimpleValue.UnmarshalCBOR()` +[v2.9.0](https://github.com/fxamacker/cbor/releases/tag/v2.9.0) (Jul 13, 2025) improved interoperability/transcoding between CBOR & JSON, refactored tests, and improved docs. +- Add opt-in support for `encoding.TextMarshaler` and `encoding.TextUnmarshaler` to encode and decode from CBOR text string. +- Add opt-in support for `json.Marshaler` and `json.Unmarshaler` via user-provided transcoding function. +- Update docs for TimeMode, Tag, RawTag, and add example for Embedded JSON Tag for CBOR. -The above 3 `UnmarshalCBOR()` functions were initially created for internal use and are deprecated now, so please use `Unmarshal()` or `UnmarshalFirst()` instead. To preserve backward compatibility, these deprecated functions were added to fuzz tests and will not be removed in v2. +v2.9.0 passed fuzz tests and is production quality. The minimum version of Go required to build: -- v2.8.0 requires go 1.20. -- v2.7.1 and older releases require go 1.17. +- v2.8.0 and newer releases require go 1.20+. +- v2.7.1 and older releases require go 1.17+. For more details, see [release notes](https://github.com/fxamacker/cbor/releases). ### Prior Releases -v2.7.0 (June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality. +[v2.8.0](https://github.com/fxamacker/cbor/releases/tag/v2.8.0) (March 30, 2025) is a small release primarily to add `omitzero` option to struct field tags and fix bugs. It passed fuzz tests (billions of executions) and is production quality. + +[v2.7.0](https://github.com/fxamacker/cbor/releases/tag/v2.7.0) (June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality. [v2.6.0](https://github.com/fxamacker/cbor/releases/tag/v2.6.0) (February 2024) adds important new features, optimizations, and bug fixes. It is especially useful to systems that need to convert data between CBOR and JSON. New options and optimizations improve handling of bignum, integers, maps, and strings. -v2.5.0 was released on Sunday, August 13, 2023 with new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023). +[v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) was released on Sunday, August 13, 2023 with new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023). __IMPORTANT__: 👉 Before upgrading from v2.4 or older release, please read the notable changes highlighted in the release notes. v2.5.0 is a large release with bug fixes to error handling for extraneous data in `Unmarshal`, etc. that should be reviewed before upgrading. @@ -601,9 +792,9 @@ geomean 2.782 ## Who uses fxamacker/cbor -`fxamacker/cbor` is used in projects by Arm Ltd., Berlin Institute of Health at Charité, Chainlink, Cisco, Confidential Computing Consortium, ConsenSys, EdgeX Foundry, F5, Flow Foundation, Fraunhofer‑AISEC, IBM, Kubernetes, Let's Encrypt (ISRG), Linux Foundation, Matrix.org, Microsoft, Mozilla, National Cybersecurity Agency of France (govt), Netherlands (govt), Oasis Protocol, Smallstep, Tailscale, Taurus SA, Teleport, TIBCO, and others. +`fxamacker/cbor` is used in projects by Arm Ltd., Berlin Institute of Health at Charité, Chainlink, Confidential Computing Consortium, ConsenSys, EdgeX Foundry, F5, Flow Foundation, Fraunhofer‑AISEC, IBM, Kubernetes, Let's Encrypt (ISRG), Linaro, Linux Foundation, Matrix.org, Microsoft, National Cybersecurity Agency of France (govt), Netherlands (govt), Oasis Protocol, Red Hat OpenShift, Smallstep, Tailscale, Taurus SA, TIBCO, Veraison, and others. -`fxamacker/cbor` passed multiple confidential security assessments. A [nonconfidential security assessment](https://github.com/veraison/go-cose/blob/v1.0.0-rc.1/reports/NCC_Microsoft-go-cose-Report_2022-05-26_v1.0.pdf) (prepared by NCC Group for Microsoft Corporation) includes a subset of fxamacker/cbor v2.4.0 in its scope. +`fxamacker/cbor` passed multiple confidential security assessments in 2022. A [nonconfidential security assessment](https://github.com/veraison/go-cose/blob/v1.0.0-rc.1/reports/NCC_Microsoft-go-cose-Report_2022-05-26_v1.0.pdf) (prepared by NCC Group for Microsoft Corporation) assessed a subset of fxamacker/cbor v2.4. ## Standards diff --git a/vendor/github.com/fxamacker/cbor/v2/cache.go b/vendor/github.com/fxamacker/cbor/v2/cache.go index 0d96b9882c..5051f110fb 100644 --- a/vendor/github.com/fxamacker/cbor/v2/cache.go +++ b/vendor/github.com/fxamacker/cbor/v2/cache.go @@ -37,6 +37,7 @@ const ( specialTypeIface specialTypeTag specialTypeTime + specialTypeJSONUnmarshalerIface ) type typeInfo struct { @@ -75,6 +76,8 @@ func newTypeInfo(t reflect.Type) *typeInfo { tInfo.spclType = specialTypeUnexportedUnmarshalerIface } else if reflect.PointerTo(t).Implements(typeUnmarshaler) { tInfo.spclType = specialTypeUnmarshalerIface + } else if reflect.PointerTo(t).Implements(typeJSONUnmarshaler) { + tInfo.spclType = specialTypeJSONUnmarshalerIface } switch k { diff --git a/vendor/github.com/fxamacker/cbor/v2/common.go b/vendor/github.com/fxamacker/cbor/v2/common.go index ec038a49ec..9cf33cd209 100644 --- a/vendor/github.com/fxamacker/cbor/v2/common.go +++ b/vendor/github.com/fxamacker/cbor/v2/common.go @@ -5,6 +5,7 @@ package cbor import ( "fmt" + "io" "strconv" ) @@ -180,3 +181,11 @@ func validBuiltinTag(tagNum uint64, contentHead byte) error { return nil } + +// Transcoder is a scheme for transcoding a single CBOR encoded data item to or from a different +// data format. +type Transcoder interface { + // Transcode reads the data item in its source format from a Reader and writes a + // corresponding representation in its destination format to a Writer. + Transcode(dst io.Writer, src io.Reader) error +} diff --git a/vendor/github.com/fxamacker/cbor/v2/decode.go b/vendor/github.com/fxamacker/cbor/v2/decode.go index 3c1c168f38..f0bdc3b38d 100644 --- a/vendor/github.com/fxamacker/cbor/v2/decode.go +++ b/vendor/github.com/fxamacker/cbor/v2/decode.go @@ -4,6 +4,7 @@ package cbor import ( + "bytes" "encoding" "encoding/base64" "encoding/binary" @@ -94,7 +95,7 @@ import ( // // To unmarshal CBOR null (0xf6) and undefined (0xf7) values into a // slice/map/pointer, Unmarshal sets Go value to nil. Because null is often -// used to mean "not present", unmarshalling CBOR null and undefined value +// used to mean "not present", unmarshaling CBOR null and undefined value // into any other Go type has no effect and returns no error. // // Unmarshal supports CBOR tag 55799 (self-describe CBOR), tag 0 and 1 (time), @@ -202,7 +203,7 @@ type DupMapKeyError struct { } func (e *DupMapKeyError) Error() string { - return fmt.Sprintf("cbor: found duplicate map key \"%v\" at map element index %d", e.Key, e.Index) + return fmt.Sprintf("cbor: found duplicate map key %#v at map element index %d", e.Key, e.Index) } // UnknownFieldError describes detected unknown field in CBOR map when decoding to Go struct. @@ -387,7 +388,7 @@ const ( // - return UnmarshalTypeError if value doesn't fit into int64 IntDecConvertSignedOrFail - // IntDecConvertSigned affects how CBOR integers (major type 0 and 1) decode to Go interface{}. + // IntDecConvertSignedOrBigInt affects how CBOR integers (major type 0 and 1) decode to Go interface{}. // It makes CBOR integers (major type 0 and 1) decode to: // - int64 if value fits // - big.Int or *big.Int (see BigIntDecMode) if value doesn't fit into int64 @@ -493,11 +494,11 @@ type BigIntDecMode int const ( // BigIntDecodeValue makes CBOR bignum decode to big.Int (instead of *big.Int) - // when unmarshalling into a Go interface{}. + // when unmarshaling into a Go interface{}. BigIntDecodeValue BigIntDecMode = iota // BigIntDecodePointer makes CBOR bignum decode to *big.Int when - // unmarshalling into a Go interface{}. + // unmarshaling into a Go interface{}. BigIntDecodePointer maxBigIntDecMode @@ -749,6 +750,25 @@ func (bum BinaryUnmarshalerMode) valid() bool { return bum >= 0 && bum < maxBinaryUnmarshalerMode } +// TextUnmarshalerMode specifies how to decode into types that implement +// encoding.TextUnmarshaler. +type TextUnmarshalerMode int + +const ( + // TextUnmarshalerNone does not recognize TextUnmarshaler implementations during decode. + TextUnmarshalerNone TextUnmarshalerMode = iota + + // TextUnmarshalerTextString will invoke UnmarshalText on the contents of a CBOR text + // string when decoding into a value that implements TextUnmarshaler. + TextUnmarshalerTextString + + maxTextUnmarshalerMode +) + +func (tum TextUnmarshalerMode) valid() bool { + return tum >= 0 && tum < maxTextUnmarshalerMode +} + // DecOptions specifies decoding options. type DecOptions struct { // DupMapKey specifies whether to enforce duplicate map key. @@ -797,7 +817,7 @@ type DecOptions struct { // TagsMd specifies whether to allow CBOR tags (major type 6). TagsMd TagsMode - // IntDec specifies which Go integer type (int64 or uint64) to use + // IntDec specifies which Go integer type (int64, uint64, or [big.Int]) to use // when decoding CBOR int (major type 0 and 1) to Go interface{}. IntDec IntDecMode @@ -811,7 +831,7 @@ type DecOptions struct { ExtraReturnErrors ExtraDecErrorCond // DefaultMapType specifies Go map type to create and decode to - // when unmarshalling CBOR into an empty interface value. + // when unmarshaling CBOR into an empty interface value. // By default, unmarshal uses map[interface{}]interface{}. DefaultMapType reflect.Type @@ -883,6 +903,15 @@ type DecOptions struct { // BinaryUnmarshaler specifies how to decode into types that implement // encoding.BinaryUnmarshaler. BinaryUnmarshaler BinaryUnmarshalerMode + + // TextUnmarshaler specifies how to decode into types that implement + // encoding.TextUnmarshaler. + TextUnmarshaler TextUnmarshalerMode + + // JSONUnmarshalerTranscoder sets the transcoding scheme used to unmarshal types that + // implement json.Unmarshaler but do not also implement cbor.Unmarshaler. If nil, decoding + // behavior is not influenced by whether or not a type implements json.Unmarshaler. + JSONUnmarshalerTranscoder Transcoder } // DecMode returns DecMode with immutable options and no tags (safe for concurrency). @@ -1095,33 +1124,39 @@ func (opts DecOptions) decMode() (*decMode, error) { //nolint:gocritic // ignore return nil, errors.New("cbor: invalid BinaryUnmarshaler " + strconv.Itoa(int(opts.BinaryUnmarshaler))) } + if !opts.TextUnmarshaler.valid() { + return nil, errors.New("cbor: invalid TextUnmarshaler " + strconv.Itoa(int(opts.TextUnmarshaler))) + } + dm := decMode{ - dupMapKey: opts.DupMapKey, - timeTag: opts.TimeTag, - maxNestedLevels: opts.MaxNestedLevels, - maxArrayElements: opts.MaxArrayElements, - maxMapPairs: opts.MaxMapPairs, - indefLength: opts.IndefLength, - tagsMd: opts.TagsMd, - intDec: opts.IntDec, - mapKeyByteString: opts.MapKeyByteString, - extraReturnErrors: opts.ExtraReturnErrors, - defaultMapType: opts.DefaultMapType, - utf8: opts.UTF8, - fieldNameMatching: opts.FieldNameMatching, - bigIntDec: opts.BigIntDec, - defaultByteStringType: opts.DefaultByteStringType, - byteStringToString: opts.ByteStringToString, - fieldNameByteString: opts.FieldNameByteString, - unrecognizedTagToAny: opts.UnrecognizedTagToAny, - timeTagToAny: opts.TimeTagToAny, - simpleValues: simpleValues, - nanDec: opts.NaN, - infDec: opts.Inf, - byteStringToTime: opts.ByteStringToTime, - byteStringExpectedFormat: opts.ByteStringExpectedFormat, - bignumTag: opts.BignumTag, - binaryUnmarshaler: opts.BinaryUnmarshaler, + dupMapKey: opts.DupMapKey, + timeTag: opts.TimeTag, + maxNestedLevels: opts.MaxNestedLevels, + maxArrayElements: opts.MaxArrayElements, + maxMapPairs: opts.MaxMapPairs, + indefLength: opts.IndefLength, + tagsMd: opts.TagsMd, + intDec: opts.IntDec, + mapKeyByteString: opts.MapKeyByteString, + extraReturnErrors: opts.ExtraReturnErrors, + defaultMapType: opts.DefaultMapType, + utf8: opts.UTF8, + fieldNameMatching: opts.FieldNameMatching, + bigIntDec: opts.BigIntDec, + defaultByteStringType: opts.DefaultByteStringType, + byteStringToString: opts.ByteStringToString, + fieldNameByteString: opts.FieldNameByteString, + unrecognizedTagToAny: opts.UnrecognizedTagToAny, + timeTagToAny: opts.TimeTagToAny, + simpleValues: simpleValues, + nanDec: opts.NaN, + infDec: opts.Inf, + byteStringToTime: opts.ByteStringToTime, + byteStringExpectedFormat: opts.ByteStringExpectedFormat, + bignumTag: opts.BignumTag, + binaryUnmarshaler: opts.BinaryUnmarshaler, + textUnmarshaler: opts.TextUnmarshaler, + jsonUnmarshalerTranscoder: opts.JSONUnmarshalerTranscoder, } return &dm, nil @@ -1174,33 +1209,35 @@ type DecMode interface { } type decMode struct { - tags tagProvider - dupMapKey DupMapKeyMode - timeTag DecTagMode - maxNestedLevels int - maxArrayElements int - maxMapPairs int - indefLength IndefLengthMode - tagsMd TagsMode - intDec IntDecMode - mapKeyByteString MapKeyByteStringMode - extraReturnErrors ExtraDecErrorCond - defaultMapType reflect.Type - utf8 UTF8Mode - fieldNameMatching FieldNameMatchingMode - bigIntDec BigIntDecMode - defaultByteStringType reflect.Type - byteStringToString ByteStringToStringMode - fieldNameByteString FieldNameByteStringMode - unrecognizedTagToAny UnrecognizedTagToAnyMode - timeTagToAny TimeTagToAnyMode - simpleValues *SimpleValueRegistry - nanDec NaNMode - infDec InfMode - byteStringToTime ByteStringToTimeMode - byteStringExpectedFormat ByteStringExpectedFormatMode - bignumTag BignumTagMode - binaryUnmarshaler BinaryUnmarshalerMode + tags tagProvider + dupMapKey DupMapKeyMode + timeTag DecTagMode + maxNestedLevels int + maxArrayElements int + maxMapPairs int + indefLength IndefLengthMode + tagsMd TagsMode + intDec IntDecMode + mapKeyByteString MapKeyByteStringMode + extraReturnErrors ExtraDecErrorCond + defaultMapType reflect.Type + utf8 UTF8Mode + fieldNameMatching FieldNameMatchingMode + bigIntDec BigIntDecMode + defaultByteStringType reflect.Type + byteStringToString ByteStringToStringMode + fieldNameByteString FieldNameByteStringMode + unrecognizedTagToAny UnrecognizedTagToAnyMode + timeTagToAny TimeTagToAnyMode + simpleValues *SimpleValueRegistry + nanDec NaNMode + infDec InfMode + byteStringToTime ByteStringToTimeMode + byteStringExpectedFormat ByteStringExpectedFormatMode + bignumTag BignumTagMode + binaryUnmarshaler BinaryUnmarshalerMode + textUnmarshaler TextUnmarshalerMode + jsonUnmarshalerTranscoder Transcoder } var defaultDecMode, _ = DecOptions{}.decMode() @@ -1215,32 +1252,34 @@ func (dm *decMode) DecOptions() DecOptions { } return DecOptions{ - DupMapKey: dm.dupMapKey, - TimeTag: dm.timeTag, - MaxNestedLevels: dm.maxNestedLevels, - MaxArrayElements: dm.maxArrayElements, - MaxMapPairs: dm.maxMapPairs, - IndefLength: dm.indefLength, - TagsMd: dm.tagsMd, - IntDec: dm.intDec, - MapKeyByteString: dm.mapKeyByteString, - ExtraReturnErrors: dm.extraReturnErrors, - DefaultMapType: dm.defaultMapType, - UTF8: dm.utf8, - FieldNameMatching: dm.fieldNameMatching, - BigIntDec: dm.bigIntDec, - DefaultByteStringType: dm.defaultByteStringType, - ByteStringToString: dm.byteStringToString, - FieldNameByteString: dm.fieldNameByteString, - UnrecognizedTagToAny: dm.unrecognizedTagToAny, - TimeTagToAny: dm.timeTagToAny, - SimpleValues: simpleValues, - NaN: dm.nanDec, - Inf: dm.infDec, - ByteStringToTime: dm.byteStringToTime, - ByteStringExpectedFormat: dm.byteStringExpectedFormat, - BignumTag: dm.bignumTag, - BinaryUnmarshaler: dm.binaryUnmarshaler, + DupMapKey: dm.dupMapKey, + TimeTag: dm.timeTag, + MaxNestedLevels: dm.maxNestedLevels, + MaxArrayElements: dm.maxArrayElements, + MaxMapPairs: dm.maxMapPairs, + IndefLength: dm.indefLength, + TagsMd: dm.tagsMd, + IntDec: dm.intDec, + MapKeyByteString: dm.mapKeyByteString, + ExtraReturnErrors: dm.extraReturnErrors, + DefaultMapType: dm.defaultMapType, + UTF8: dm.utf8, + FieldNameMatching: dm.fieldNameMatching, + BigIntDec: dm.bigIntDec, + DefaultByteStringType: dm.defaultByteStringType, + ByteStringToString: dm.byteStringToString, + FieldNameByteString: dm.fieldNameByteString, + UnrecognizedTagToAny: dm.unrecognizedTagToAny, + TimeTagToAny: dm.timeTagToAny, + SimpleValues: simpleValues, + NaN: dm.nanDec, + Inf: dm.infDec, + ByteStringToTime: dm.byteStringToTime, + ByteStringExpectedFormat: dm.byteStringExpectedFormat, + BignumTag: dm.bignumTag, + BinaryUnmarshaler: dm.binaryUnmarshaler, + TextUnmarshaler: dm.textUnmarshaler, + JSONUnmarshalerTranscoder: dm.jsonUnmarshalerTranscoder, } } @@ -1367,7 +1406,7 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin // Decode CBOR nil or CBOR undefined to pointer value by setting pointer value to nil. if d.nextCBORNil() && v.Kind() == reflect.Pointer { d.skip() - v.Set(reflect.Zero(v.Type())) + v.SetZero() return nil } @@ -1467,6 +1506,14 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin case specialTypeUnexportedUnmarshalerIface: return d.parseToUnexportedUnmarshaler(v) + + case specialTypeJSONUnmarshalerIface: + // This special type implies that the type does not also implement + // cbor.Umarshaler. + if d.dm.jsonUnmarshalerTranscoder == nil { + break + } + return d.parseToJSONUnmarshaler(v) } } @@ -1523,14 +1570,14 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin return err } copied = copied || converted - return fillByteString(t, b, !copied, v, d.dm.byteStringToString, d.dm.binaryUnmarshaler) + return fillByteString(t, b, !copied, v, d.dm.byteStringToString, d.dm.binaryUnmarshaler, d.dm.textUnmarshaler) case cborTypeTextString: b, err := d.parseTextString() if err != nil { return err } - return fillTextString(t, b, v) + return fillTextString(t, b, v, d.dm.textUnmarshaler) case cborTypePrimitives: _, ai, val := d.getHead() @@ -1582,7 +1629,7 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin return nil } if tInfo.nonPtrKind == reflect.Slice || tInfo.nonPtrKind == reflect.Array { - return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler) + return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler, d.dm.textUnmarshaler) } if bi.IsUint64() { return fillPositiveInt(t, bi.Uint64(), v) @@ -1605,7 +1652,7 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin return nil } if tInfo.nonPtrKind == reflect.Slice || tInfo.nonPtrKind == reflect.Array { - return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler) + return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler, d.dm.textUnmarshaler) } if bi.IsInt64() { return fillNegativeInt(t, bi.Int64(), v) @@ -1832,6 +1879,32 @@ func (d *decoder) parseToUnexportedUnmarshaler(v reflect.Value) error { return errors.New("cbor: failed to assert " + v.Type().String() + " as cbor.unmarshaler") } +// parseToJSONUnmarshaler parses CBOR data to be transcoded to JSON and passed to the value's +// implementation of the json.Unmarshaler interface. It assumes data is well-formed, and does not +// perform bounds checking. +func (d *decoder) parseToJSONUnmarshaler(v reflect.Value) error { + if d.nextCBORNil() && v.Kind() == reflect.Pointer && v.IsNil() { + d.skip() + return nil + } + + if v.Kind() != reflect.Pointer && v.CanAddr() { + v = v.Addr() + } + if u, ok := v.Interface().(jsonUnmarshaler); ok { + start := d.off + d.skip() + e := getEncodeBuffer() + defer putEncodeBuffer(e) + if err := d.dm.jsonUnmarshalerTranscoder.Transcode(e, bytes.NewReader(d.data[start:d.off])); err != nil { + return &TranscodeError{err: err, rtype: v.Type(), sourceFormat: "cbor", targetFormat: "json"} + } + return u.UnmarshalJSON(e.Bytes()) + } + d.skip() + return errors.New("cbor: failed to assert " + v.Type().String() + " as json.Unmarshaler") +} + // parse parses CBOR data and returns value in default Go type. // It assumes data is well-formed, and does not perform bounds checking. func (d *decoder) parse(skipSelfDescribedTag bool) (any, error) { //nolint:gocyclo @@ -2317,9 +2390,8 @@ func (d *decoder) parseArrayToArray(v reflect.Value, tInfo *typeInfo) error { } // Set remaining Go array elements to zero values. if gi < vLen { - zeroV := reflect.Zero(tInfo.elemTypeInfo.typ) for ; gi < vLen; gi++ { - v.Index(gi).Set(zeroV) + v.Index(gi).SetZero() } } return err @@ -2403,7 +2475,7 @@ func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //noli } keyType, eleType := tInfo.keyTypeInfo.typ, tInfo.elemTypeInfo.typ reuseKey, reuseEle := isImmutableKind(tInfo.keyTypeInfo.kind), isImmutableKind(tInfo.elemTypeInfo.kind) - var keyValue, eleValue, zeroKeyValue, zeroEleValue reflect.Value + var keyValue, eleValue reflect.Value keyIsInterfaceType := keyType == typeIntf // If key type is interface{}, need to check if key value is hashable. var err, lastErr error keyCount := v.Len() @@ -2422,10 +2494,7 @@ func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //noli if !keyValue.IsValid() { keyValue = reflect.New(keyType).Elem() } else if !reuseKey { - if !zeroKeyValue.IsValid() { - zeroKeyValue = reflect.Zero(keyType) - } - keyValue.Set(zeroKeyValue) + keyValue.SetZero() } if lastErr = d.parseToValue(keyValue, tInfo.keyTypeInfo); lastErr != nil { if err == nil { @@ -2460,10 +2529,7 @@ func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //noli if !eleValue.IsValid() { eleValue = reflect.New(eleType).Elem() } else if !reuseEle { - if !zeroEleValue.IsValid() { - zeroEleValue = reflect.Zero(eleType) - } - eleValue.Set(zeroEleValue) + eleValue.SetZero() } if lastErr := d.parseToValue(eleValue, tInfo.elemTypeInfo); lastErr != nil { if err == nil { @@ -2995,6 +3061,8 @@ func (d *decoder) nextCBORNil() bool { return d.data[d.off] == 0xf6 || d.data[d.off] == 0xf7 } +type jsonUnmarshaler interface{ UnmarshalJSON([]byte) error } + var ( typeIntf = reflect.TypeOf([]any(nil)).Elem() typeTime = reflect.TypeOf(time.Time{}) @@ -3002,6 +3070,8 @@ var ( typeUnmarshaler = reflect.TypeOf((*Unmarshaler)(nil)).Elem() typeUnexportedUnmarshaler = reflect.TypeOf((*unmarshaler)(nil)).Elem() typeBinaryUnmarshaler = reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem() + typeTextUnmarshaler = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() + typeJSONUnmarshaler = reflect.TypeOf((*jsonUnmarshaler)(nil)).Elem() typeString = reflect.TypeOf("") typeByteSlice = reflect.TypeOf([]byte(nil)) ) @@ -3009,7 +3079,7 @@ var ( func fillNil(_ cborType, v reflect.Value) error { switch v.Kind() { case reflect.Slice, reflect.Map, reflect.Interface, reflect.Pointer: - v.Set(reflect.Zero(v.Type())) + v.SetZero() return nil } return nil @@ -3110,7 +3180,7 @@ func fillFloat(t cborType, val float64, v reflect.Value) error { return &UnmarshalTypeError{CBORType: t.String(), GoType: v.Type().String()} } -func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts ByteStringToStringMode, bum BinaryUnmarshalerMode) error { +func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts ByteStringToStringMode, bum BinaryUnmarshalerMode, tum TextUnmarshalerMode) error { if bum == BinaryUnmarshalerByteString && reflect.PointerTo(v.Type()).Implements(typeBinaryUnmarshaler) { if v.CanAddr() { v = v.Addr() @@ -3123,9 +3193,26 @@ func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts B } return errors.New("cbor: cannot set new value for " + v.Type().String()) } - if bsts != ByteStringToStringForbidden && v.Kind() == reflect.String { - v.SetString(string(val)) - return nil + if bsts != ByteStringToStringForbidden { + if tum == TextUnmarshalerTextString && reflect.PointerTo(v.Type()).Implements(typeTextUnmarshaler) { + if v.CanAddr() { + v = v.Addr() + if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + // The contract of TextUnmarshaler forbids retaining the input + // bytes, so no copying is required even if val is shared. + if err := u.UnmarshalText(val); err != nil { + return fmt.Errorf("cbor: cannot unmarshal text for %s: %w", v.Type(), err) + } + return nil + } + } + return errors.New("cbor: cannot set new value for " + v.Type().String()) + } + + if v.Kind() == reflect.String { + v.SetString(string(val)) + return nil + } } if v.Kind() == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 { src := val @@ -3145,9 +3232,8 @@ func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts B } // Set remaining Go array elements to zero values. if i < vLen { - zeroV := reflect.Zero(reflect.TypeOf(byte(0))) for ; i < vLen; i++ { - v.Index(i).Set(zeroV) + v.Index(i).SetZero() } } return nil @@ -3155,11 +3241,28 @@ func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts B return &UnmarshalTypeError{CBORType: t.String(), GoType: v.Type().String()} } -func fillTextString(t cborType, val []byte, v reflect.Value) error { +func fillTextString(t cborType, val []byte, v reflect.Value, tum TextUnmarshalerMode) error { + // Check if the value implements TextUnmarshaler and the mode allows it + if tum == TextUnmarshalerTextString && reflect.PointerTo(v.Type()).Implements(typeTextUnmarshaler) { + if v.CanAddr() { + v = v.Addr() + if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + // The contract of TextUnmarshaler forbids retaining the input + // bytes, so no copying is required even if val is shared. + if err := u.UnmarshalText(val); err != nil { + return fmt.Errorf("cbor: cannot unmarshal text for %s: %w", v.Type(), err) + } + return nil + } + } + return errors.New("cbor: cannot set new value for " + v.Type().String()) + } + if v.Kind() == reflect.String { v.SetString(string(val)) return nil } + return &UnmarshalTypeError{CBORType: t.String(), GoType: v.Type().String()} } diff --git a/vendor/github.com/fxamacker/cbor/v2/encode.go b/vendor/github.com/fxamacker/cbor/v2/encode.go index a3f999221b..c550617c38 100644 --- a/vendor/github.com/fxamacker/cbor/v2/encode.go +++ b/vendor/github.com/fxamacker/cbor/v2/encode.go @@ -132,6 +132,20 @@ func (e *MarshalerError) Unwrap() error { return e.err } +type TranscodeError struct { + err error + rtype reflect.Type + sourceFormat, targetFormat string +} + +func (e TranscodeError) Error() string { + return "cbor: cannot transcode from " + e.sourceFormat + " to " + e.targetFormat + ": " + e.err.Error() +} + +func (e TranscodeError) Unwrap() error { + return e.err +} + // UnsupportedTypeError is returned by Marshal when attempting to encode value // of an unsupported type. type UnsupportedTypeError struct { @@ -293,24 +307,51 @@ func (icm InfConvertMode) valid() bool { return icm >= 0 && icm < maxInfConvert } -// TimeMode specifies how to encode time.Time values. +// TimeMode specifies how to encode time.Time values in compliance with RFC 8949 (CBOR): +// - Section 3.4.1: Standard Date/Time String +// - Section 3.4.2: Epoch-Based Date/Time +// For more info, see: +// - https://www.rfc-editor.org/rfc/rfc8949.html +// NOTE: User applications that prefer to encode time with fractional seconds to an integer +// (instead of floating point or text string) can use a CBOR tag number not assigned by IANA: +// 1. Define a user-defined type in Go with just a time.Time or int64 as its data. +// 2. Implement the cbor.Marshaler and cbor.Unmarshaler interface for that user-defined type +// to encode or decode the tagged data item with an enclosed integer content. type TimeMode int const ( - // TimeUnix causes time.Time to be encoded as epoch time in integer with second precision. + // TimeUnix causes time.Time to encode to a CBOR time (tag 1) with an integer content + // representing seconds elapsed (with 1-second precision) since UNIX Epoch UTC. + // The TimeUnix option is location independent and has a clear precision guarantee. TimeUnix TimeMode = iota - // TimeUnixMicro causes time.Time to be encoded as epoch time in float-point rounded to microsecond precision. + // TimeUnixMicro causes time.Time to encode to a CBOR time (tag 1) with a floating point content + // representing seconds elapsed (with up to 1-microsecond precision) since UNIX Epoch UTC. + // NOTE: The floating point content is encoded to the shortest floating-point encoding that preserves + // the 64-bit floating point value. I.e., the floating point encoding can be IEEE 764: + // binary64, binary32, or binary16 depending on the content's value. TimeUnixMicro - // TimeUnixDynamic causes time.Time to be encoded as integer if time.Time doesn't have fractional seconds, - // otherwise float-point rounded to microsecond precision. + // TimeUnixDynamic causes time.Time to encode to a CBOR time (tag 1) with either an integer content or + // a floating point content, depending on the content's value. This option is equivalent to dynamically + // choosing TimeUnix if time.Time doesn't have fractional seconds, and using TimeUnixMicro if time.Time + // has fractional seconds. TimeUnixDynamic - // TimeRFC3339 causes time.Time to be encoded as RFC3339 formatted string with second precision. + // TimeRFC3339 causes time.Time to encode to a CBOR time (tag 0) with a text string content + // representing the time using 1-second precision in RFC3339 format. If the time.Time has a + // non-UTC timezone then a "localtime - UTC" numeric offset will be included as specified in RFC3339. + // NOTE: User applications can avoid including the RFC3339 numeric offset by: + // - providing a time.Time value set to UTC, or + // - using the TimeUnix, TimeUnixMicro, or TimeUnixDynamic option instead of TimeRFC3339. TimeRFC3339 - // TimeRFC3339Nano causes time.Time to be encoded as RFC3339 formatted string with nanosecond precision. + // TimeRFC3339Nano causes time.Time to encode to a CBOR time (tag 0) with a text string content + // representing the time using 1-nanosecond precision in RFC3339 format. If the time.Time has a + // non-UTC timezone then a "localtime - UTC" numeric offset will be included as specified in RFC3339. + // NOTE: User applications can avoid including the RFC3339 numeric offset by: + // - providing a time.Time value set to UTC, or + // - using the TimeUnix, TimeUnixMicro, or TimeUnixDynamic option instead of TimeRFC3339Nano. TimeRFC3339Nano maxTimeMode @@ -483,6 +524,24 @@ func (bmm BinaryMarshalerMode) valid() bool { return bmm >= 0 && bmm < maxBinaryMarshalerMode } +// TextMarshalerMode specifies how to encode types that implement encoding.TextMarshaler. +type TextMarshalerMode int + +const ( + // TextMarshalerNone does not recognize TextMarshaler implementations during encode. + // This is the default behavior. + TextMarshalerNone TextMarshalerMode = iota + + // TextMarshalerTextString encodes the output of MarshalText to a CBOR text string. + TextMarshalerTextString + + maxTextMarshalerMode +) + +func (tmm TextMarshalerMode) valid() bool { + return tmm >= 0 && tmm < maxTextMarshalerMode +} + // EncOptions specifies encoding options. type EncOptions struct { // Sort specifies sorting order. @@ -540,6 +599,14 @@ type EncOptions struct { // BinaryMarshaler specifies how to encode types that implement encoding.BinaryMarshaler. BinaryMarshaler BinaryMarshalerMode + + // TextMarshaler specifies how to encode types that implement encoding.TextMarshaler. + TextMarshaler TextMarshalerMode + + // JSONMarshalerTranscoder sets the transcoding scheme used to marshal types that implement + // json.Marshaler but do not also implement cbor.Marshaler. If nil, encoding behavior is not + // influenced by whether or not a type implements json.Marshaler. + JSONMarshalerTranscoder Transcoder } // CanonicalEncOptions returns EncOptions for "Canonical CBOR" encoding, @@ -750,6 +817,9 @@ func (opts EncOptions) encMode() (*encMode, error) { //nolint:gocritic // ignore if !opts.BinaryMarshaler.valid() { return nil, errors.New("cbor: invalid BinaryMarshaler " + strconv.Itoa(int(opts.BinaryMarshaler))) } + if !opts.TextMarshaler.valid() { + return nil, errors.New("cbor: invalid TextMarshaler " + strconv.Itoa(int(opts.TextMarshaler))) + } em := encMode{ sort: opts.Sort, shortestFloat: opts.ShortestFloat, @@ -769,6 +839,8 @@ func (opts EncOptions) encMode() (*encMode, error) { //nolint:gocritic // ignore byteSliceLaterEncodingTag: byteSliceLaterEncodingTag, byteArray: opts.ByteArray, binaryMarshaler: opts.BinaryMarshaler, + textMarshaler: opts.TextMarshaler, + jsonMarshalerTranscoder: opts.JSONMarshalerTranscoder, } return &em, nil } @@ -814,6 +886,8 @@ type encMode struct { byteSliceLaterEncodingTag uint64 byteArray ByteArrayMode binaryMarshaler BinaryMarshalerMode + textMarshaler TextMarshalerMode + jsonMarshalerTranscoder Transcoder } var defaultEncMode, _ = EncOptions{}.encMode() @@ -890,22 +964,24 @@ func getMarshalerDecMode(indefLength IndefLengthMode, tagsMd TagsMode) *decMode // EncOptions returns user specified options used to create this EncMode. func (em *encMode) EncOptions() EncOptions { return EncOptions{ - Sort: em.sort, - ShortestFloat: em.shortestFloat, - NaNConvert: em.nanConvert, - InfConvert: em.infConvert, - BigIntConvert: em.bigIntConvert, - Time: em.time, - TimeTag: em.timeTag, - IndefLength: em.indefLength, - NilContainers: em.nilContainers, - TagsMd: em.tagsMd, - OmitEmpty: em.omitEmpty, - String: em.stringType, - FieldName: em.fieldName, - ByteSliceLaterFormat: em.byteSliceLaterFormat, - ByteArray: em.byteArray, - BinaryMarshaler: em.binaryMarshaler, + Sort: em.sort, + ShortestFloat: em.shortestFloat, + NaNConvert: em.nanConvert, + InfConvert: em.infConvert, + BigIntConvert: em.bigIntConvert, + Time: em.time, + TimeTag: em.timeTag, + IndefLength: em.indefLength, + NilContainers: em.nilContainers, + TagsMd: em.tagsMd, + OmitEmpty: em.omitEmpty, + String: em.stringType, + FieldName: em.fieldName, + ByteSliceLaterFormat: em.byteSliceLaterFormat, + ByteArray: em.byteArray, + BinaryMarshaler: em.binaryMarshaler, + TextMarshaler: em.textMarshaler, + JSONMarshalerTranscoder: em.jsonMarshalerTranscoder, } } @@ -1677,6 +1753,107 @@ func (bme binaryMarshalerEncoder) isEmpty(em *encMode, v reflect.Value) (bool, e return len(data) == 0, nil } +type textMarshalerEncoder struct { + alternateEncode encodeFunc + alternateIsEmpty isEmptyFunc +} + +func (tme textMarshalerEncoder) encode(e *bytes.Buffer, em *encMode, v reflect.Value) error { + if em.textMarshaler == TextMarshalerNone { + return tme.alternateEncode(e, em, v) + } + + vt := v.Type() + m, ok := v.Interface().(encoding.TextMarshaler) + if !ok { + pv := reflect.New(vt) + pv.Elem().Set(v) + m = pv.Interface().(encoding.TextMarshaler) + } + data, err := m.MarshalText() + if err != nil { + return fmt.Errorf("cbor: cannot marshal text for %s: %w", vt, err) + } + if b := em.encTagBytes(vt); b != nil { + e.Write(b) + } + + encodeHead(e, byte(cborTypeTextString), uint64(len(data))) + e.Write(data) + return nil +} + +func (tme textMarshalerEncoder) isEmpty(em *encMode, v reflect.Value) (bool, error) { + if em.textMarshaler == TextMarshalerNone { + return tme.alternateIsEmpty(em, v) + } + + m, ok := v.Interface().(encoding.TextMarshaler) + if !ok { + pv := reflect.New(v.Type()) + pv.Elem().Set(v) + m = pv.Interface().(encoding.TextMarshaler) + } + data, err := m.MarshalText() + if err != nil { + return false, fmt.Errorf("cbor: cannot marshal text for %s: %w", v.Type(), err) + } + return len(data) == 0, nil +} + +type jsonMarshalerEncoder struct { + alternateEncode encodeFunc + alternateIsEmpty isEmptyFunc +} + +func (jme jsonMarshalerEncoder) encode(e *bytes.Buffer, em *encMode, v reflect.Value) error { + if em.jsonMarshalerTranscoder == nil { + return jme.alternateEncode(e, em, v) + } + + vt := v.Type() + m, ok := v.Interface().(jsonMarshaler) + if !ok { + pv := reflect.New(vt) + pv.Elem().Set(v) + m = pv.Interface().(jsonMarshaler) + } + + json, err := m.MarshalJSON() + if err != nil { + return err + } + + offset := e.Len() + + if b := em.encTagBytes(vt); b != nil { + e.Write(b) + } + + if err := em.jsonMarshalerTranscoder.Transcode(e, bytes.NewReader(json)); err != nil { + return &TranscodeError{err: err, rtype: vt, sourceFormat: "json", targetFormat: "cbor"} + } + + // Validate that the transcode function has written exactly one well-formed data item. + d := decoder{data: e.Bytes()[offset:], dm: getMarshalerDecMode(em.indefLength, em.tagsMd)} + if err := d.wellformed(false, true); err != nil { + e.Truncate(offset) + return &TranscodeError{err: err, rtype: vt, sourceFormat: "json", targetFormat: "cbor"} + } + + return nil +} + +func (jme jsonMarshalerEncoder) isEmpty(em *encMode, v reflect.Value) (bool, error) { + if em.jsonMarshalerTranscoder == nil { + return jme.alternateIsEmpty(em, v) + } + + // As with types implementing cbor.Marshaler, transcoded json.Marshaler values always encode + // as exactly one complete CBOR data item. + return false, nil +} + func encodeMarshalerType(e *bytes.Buffer, em *encMode, v reflect.Value) error { if em.tagsMd == TagsForbidden && v.Type() == typeRawTag { return errors.New("cbor: cannot encode cbor.RawTag when TagsMd is TagsForbidden") @@ -1780,9 +1957,13 @@ func encodeHead(e *bytes.Buffer, t byte, n uint64) int { return headSize } +type jsonMarshaler interface{ MarshalJSON() ([]byte, error) } + var ( typeMarshaler = reflect.TypeOf((*Marshaler)(nil)).Elem() typeBinaryMarshaler = reflect.TypeOf((*encoding.BinaryMarshaler)(nil)).Elem() + typeTextMarshaler = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + typeJSONMarshaler = reflect.TypeOf((*jsonMarshaler)(nil)).Elem() typeRawMessage = reflect.TypeOf(RawMessage(nil)) typeByteString = reflect.TypeOf(ByteString("")) ) @@ -1825,6 +2006,30 @@ func getEncodeFuncInternal(t reflect.Type) (ef encodeFunc, ief isEmptyFunc, izf ief = bme.isEmpty }() } + if reflect.PointerTo(t).Implements(typeTextMarshaler) { + defer func() { + // capture encoding method used for modes that disable TextMarshaler + tme := textMarshalerEncoder{ + alternateEncode: ef, + alternateIsEmpty: ief, + } + ef = tme.encode + ief = tme.isEmpty + }() + } + if reflect.PointerTo(t).Implements(typeJSONMarshaler) { + defer func() { + // capture encoding method used for modes that don't support transcoding + // from types that implement json.Marshaler. + jme := jsonMarshalerEncoder{ + alternateEncode: ef, + alternateIsEmpty: ief, + } + ef = jme.encode + ief = jme.isEmpty + }() + } + switch k { case reflect.Bool: return encodeBool, isEmptyBool, getIsZeroFunc(t) diff --git a/vendor/github.com/fxamacker/cbor/v2/structfields.go b/vendor/github.com/fxamacker/cbor/v2/structfields.go index 593508d9ce..cf0a922cd7 100644 --- a/vendor/github.com/fxamacker/cbor/v2/structfields.go +++ b/vendor/github.com/fxamacker/cbor/v2/structfields.go @@ -239,8 +239,7 @@ func appendFields( // a nonexportable anonymous field of struct type. // Nonexportable anonymous field of struct type can contain exportable fields. func isFieldExportable(f reflect.StructField, fk reflect.Kind) bool { //nolint:gocritic // ignore hugeParam - exportable := f.PkgPath == "" - return exportable || (f.Anonymous && fk == reflect.Struct) + return f.IsExported() || (f.Anonymous && fk == reflect.Struct) } type embeddedFieldNullPtrFunc func(reflect.Value) (reflect.Value, error) diff --git a/vendor/github.com/fxamacker/cbor/v2/tag.go b/vendor/github.com/fxamacker/cbor/v2/tag.go index 47bcca8018..bd8b773f54 100644 --- a/vendor/github.com/fxamacker/cbor/v2/tag.go +++ b/vendor/github.com/fxamacker/cbor/v2/tag.go @@ -10,22 +10,23 @@ import ( "sync" ) -// Tag represents CBOR tag data, including tag number and unmarshaled tag content. Marshaling and -// unmarshaling of tag content is subject to any encode and decode options that would apply to -// enclosed data item if it were to appear outside of a tag. +// Tag represents a tagged data item (CBOR major type 6), comprising a tag number and the unmarshaled tag content. +// NOTE: The same encoding and decoding options that apply to untagged CBOR data items also applies to tag content +// during encoding and decoding. type Tag struct { Number uint64 Content any } -// RawTag represents CBOR tag data, including tag number and raw tag content. -// RawTag implements Unmarshaler and Marshaler interfaces. +// RawTag represents a tagged data item (CBOR major type 6), comprising a tag number and the raw tag content. +// The raw tag content (enclosed data item) is a CBOR-encoded data item. +// RawTag can be used to delay decoding a CBOR data item or precompute encoding a CBOR data item. type RawTag struct { Number uint64 Content RawMessage } -// UnmarshalCBOR sets *t with tag number and raw tag content copied from data. +// UnmarshalCBOR sets *t with the tag number and the raw tag content copied from data. // // Deprecated: No longer used by this codec; kept for compatibility // with user apps that directly call this function. @@ -49,7 +50,7 @@ func (t *RawTag) UnmarshalCBOR(data []byte) error { return t.unmarshalCBOR(data) } -// unmarshalCBOR sets *t with tag number and raw tag content copied from data. +// unmarshalCBOR sets *t with the tag number and the raw tag content copied from data. // This function assumes data is well-formed, and does not perform bounds checking. // This function is called by Unmarshal(). func (t *RawTag) unmarshalCBOR(data []byte) error { diff --git a/vendor/github.com/go-jose/go-jose/v4/CHANGELOG.md b/vendor/github.com/go-jose/go-jose/v4/CHANGELOG.md deleted file mode 100644 index 66a8a0f89a..0000000000 --- a/vendor/github.com/go-jose/go-jose/v4/CHANGELOG.md +++ /dev/null @@ -1,101 +0,0 @@ -## Changed - - - Defined a custom error, ErrUnexpectedSignatureAlgorithm, returned when a JWS - header contains an unsupported signature algorithm. - -# v4.0.4 - -## Fixed - - - Reverted "Allow unmarshalling JSONWebKeySets with unsupported key types" as a - breaking change. See #136 / #137. - -# v4.0.3 - -## Changed - - - Allow unmarshalling JSONWebKeySets with unsupported key types (#130) - - Document that OpaqueKeyEncrypter can't be implemented (for now) (#129) - - Dependency updates - -# v4.0.2 - -## Changed - - - Improved documentation of Verify() to note that JSONWebKeySet is a supported - argument type (#104) - - Defined exported error values for missing x5c header and unsupported elliptic - curves error cases (#117) - -# v4.0.1 - -## Fixed - - - An attacker could send a JWE containing compressed data that used large - amounts of memory and CPU when decompressed by `Decrypt` or `DecryptMulti`. - Those functions now return an error if the decompressed data would exceed - 250kB or 10x the compressed size (whichever is larger). Thanks to - Enze Wang@Alioth and Jianjun Chen@Zhongguancun Lab (@zer0yu and @chenjj) - for reporting. - -# v4.0.0 - -This release makes some breaking changes in order to more thoroughly -address the vulnerabilities discussed in [Three New Attacks Against JSON Web -Tokens][1], "Sign/encrypt confusion", "Billion hash attack", and "Polyglot -token". - -## Changed - - - Limit JWT encryption types (exclude password or public key types) (#78) - - Enforce minimum length for HMAC keys (#85) - - jwt: match any audience in a list, rather than requiring all audiences (#81) - - jwt: accept only Compact Serialization (#75) - - jws: Add expected algorithms for signatures (#74) - - Require specifying expected algorithms for ParseEncrypted, - ParseSigned, ParseDetached, jwt.ParseEncrypted, jwt.ParseSigned, - jwt.ParseSignedAndEncrypted (#69, #74) - - Usually there is a small, known set of appropriate algorithms for a program - to use and it's a mistake to allow unexpected algorithms. For instance the - "billion hash attack" relies in part on programs accepting the PBES2 - encryption algorithm and doing the necessary work even if they weren't - specifically configured to allow PBES2. - - Revert "Strip padding off base64 strings" (#82) - - The specs require base64url encoding without padding. - - Minimum supported Go version is now 1.21 - -## Added - - - ParseSignedCompact, ParseSignedJSON, ParseEncryptedCompact, ParseEncryptedJSON. - - These allow parsing a specific serialization, as opposed to ParseSigned and - ParseEncrypted, which try to automatically detect which serialization was - provided. It's common to require a specific serialization for a specific - protocol - for instance JWT requires Compact serialization. - -[1]: https://i.blackhat.com/BH-US-23/Presentations/US-23-Tervoort-Three-New-Attacks-Against-JSON-Web-Tokens.pdf - -# v3.0.2 - -## Fixed - - - DecryptMulti: handle decompression error (#19) - -## Changed - - - jwe/CompactSerialize: improve performance (#67) - - Increase the default number of PBKDF2 iterations to 600k (#48) - - Return the proper algorithm for ECDSA keys (#45) - -## Added - - - Add Thumbprint support for opaque signers (#38) - -# v3.0.1 - -## Fixed - - - Security issue: an attacker specifying a large "p2c" value can cause - JSONWebEncryption.Decrypt and JSONWebEncryption.DecryptMulti to consume large - amounts of CPU, causing a DoS. Thanks to Matt Schwager (@mschwager) for the - disclosure and to Tom Tervoort for originally publishing the category of attack. - https://i.blackhat.com/BH-US-23/Presentations/US-23-Tervoort-Three-New-Attacks-Against-JSON-Web-Tokens.pdf diff --git a/vendor/github.com/go-jose/go-jose/v4/README.md b/vendor/github.com/go-jose/go-jose/v4/README.md index 02b5749546..ca5f1d790b 100644 --- a/vendor/github.com/go-jose/go-jose/v4/README.md +++ b/vendor/github.com/go-jose/go-jose/v4/README.md @@ -3,7 +3,6 @@ [![godoc](https://pkg.go.dev/badge/github.com/go-jose/go-jose/v4.svg)](https://pkg.go.dev/github.com/go-jose/go-jose/v4) [![godoc](https://pkg.go.dev/badge/github.com/go-jose/go-jose/v4/jwt.svg)](https://pkg.go.dev/github.com/go-jose/go-jose/v4/jwt) [![license](https://img.shields.io/badge/license-apache_2.0-blue.svg?style=flat)](https://raw.githubusercontent.com/go-jose/go-jose/master/LICENSE) -[![test](https://img.shields.io/github/checks-status/go-jose/go-jose/v4)](https://github.com/go-jose/go-jose/actions) Package jose aims to provide an implementation of the Javascript Object Signing and Encryption set of standards. This includes support for JSON Web Encryption, @@ -29,17 +28,20 @@ libraries in other languages. ### Versions -[Version 4](https://github.com/go-jose/go-jose) -([branch](https://github.com/go-jose/go-jose/tree/main), -[doc](https://pkg.go.dev/github.com/go-jose/go-jose/v4), [releases](https://github.com/go-jose/go-jose/releases)) is the current stable version: +The forthcoming Version 5 will be released with several breaking API changes, +and will require Golang's `encoding/json/v2`, which is currently requires +Go 1.25 built with GOEXPERIMENT=jsonv2. + +Version 4 is the current stable version: import "github.com/go-jose/go-jose/v4" -The old [square/go-jose](https://github.com/square/go-jose) repo contains the prior v1 and v2 versions, which -are still useable but not actively developed anymore. +It supports at least the current and previous Golang release. Currently it +requires Golang 1.23. + +Version 3 is only receiving critical security updates. Migration to Version 4 is recommended. -Version 3, in this repo, is still receiving security fixes but not functionality -updates. +Versions 1 and 2 are obsolete, but can be found in the old repository, [square/go-jose](https://github.com/square/go-jose). ### Supported algorithms @@ -47,36 +49,36 @@ See below for a table of supported algorithms. Algorithm identifiers match the names in the [JSON Web Algorithms](https://dx.doi.org/10.17487/RFC7518) standard where possible. The Godoc reference has a list of constants. - Key encryption | Algorithm identifier(s) - :------------------------- | :------------------------------ - RSA-PKCS#1v1.5 | RSA1_5 - RSA-OAEP | RSA-OAEP, RSA-OAEP-256 - AES key wrap | A128KW, A192KW, A256KW - AES-GCM key wrap | A128GCMKW, A192GCMKW, A256GCMKW - ECDH-ES + AES key wrap | ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW - ECDH-ES (direct) | ECDH-ES1 - Direct encryption | dir1 +| Key encryption | Algorithm identifier(s) | +|:-----------------------|:-----------------------------------------------| +| RSA-PKCS#1v1.5 | RSA1_5 | +| RSA-OAEP | RSA-OAEP, RSA-OAEP-256 | +| AES key wrap | A128KW, A192KW, A256KW | +| AES-GCM key wrap | A128GCMKW, A192GCMKW, A256GCMKW | +| ECDH-ES + AES key wrap | ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW | +| ECDH-ES (direct) | ECDH-ES1 | +| Direct encryption | dir1 | 1. Not supported in multi-recipient mode - Signing / MAC | Algorithm identifier(s) - :------------------------- | :------------------------------ - RSASSA-PKCS#1v1.5 | RS256, RS384, RS512 - RSASSA-PSS | PS256, PS384, PS512 - HMAC | HS256, HS384, HS512 - ECDSA | ES256, ES384, ES512 - Ed25519 | EdDSA2 +| Signing / MAC | Algorithm identifier(s) | +|:------------------|:------------------------| +| RSASSA-PKCS#1v1.5 | RS256, RS384, RS512 | +| RSASSA-PSS | PS256, PS384, PS512 | +| HMAC | HS256, HS384, HS512 | +| ECDSA | ES256, ES384, ES512 | +| Ed25519 | EdDSA2 | 2. Only available in version 2 of the package - Content encryption | Algorithm identifier(s) - :------------------------- | :------------------------------ - AES-CBC+HMAC | A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 - AES-GCM | A128GCM, A192GCM, A256GCM +| Content encryption | Algorithm identifier(s) | +|:-------------------|:--------------------------------------------| +| AES-CBC+HMAC | A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 | +| AES-GCM | A128GCM, A192GCM, A256GCM | - Compression | Algorithm identifiers(s) - :------------------------- | ------------------------------- - DEFLATE (RFC 1951) | DEF +| Compression | Algorithm identifiers(s) | +|:-------------------|--------------------------| +| DEFLATE (RFC 1951) | DEF | ### Supported key types @@ -85,12 +87,12 @@ library, and can be passed to corresponding functions such as `NewEncrypter` or `NewSigner`. Each of these keys can also be wrapped in a JWK if desired, which allows attaching a key id. - Algorithm(s) | Corresponding types - :------------------------- | ------------------------------- - RSA | *[rsa.PublicKey](https://pkg.go.dev/crypto/rsa/#PublicKey), *[rsa.PrivateKey](https://pkg.go.dev/crypto/rsa/#PrivateKey) - ECDH, ECDSA | *[ecdsa.PublicKey](https://pkg.go.dev/crypto/ecdsa/#PublicKey), *[ecdsa.PrivateKey](https://pkg.go.dev/crypto/ecdsa/#PrivateKey) - EdDSA1 | [ed25519.PublicKey](https://pkg.go.dev/crypto/ed25519#PublicKey), [ed25519.PrivateKey](https://pkg.go.dev/crypto/ed25519#PrivateKey) - AES, HMAC | []byte +| Algorithm(s) | Corresponding types | +|:------------------|--------------------------------------------------------------------------------------------------------------------------------------| +| RSA | *[rsa.PublicKey](https://pkg.go.dev/crypto/rsa/#PublicKey), *[rsa.PrivateKey](https://pkg.go.dev/crypto/rsa/#PrivateKey) | +| ECDH, ECDSA | *[ecdsa.PublicKey](https://pkg.go.dev/crypto/ecdsa/#PublicKey), *[ecdsa.PrivateKey](https://pkg.go.dev/crypto/ecdsa/#PrivateKey) | +| EdDSA1 | [ed25519.PublicKey](https://pkg.go.dev/crypto/ed25519#PublicKey), [ed25519.PrivateKey](https://pkg.go.dev/crypto/ed25519#PrivateKey) | +| AES, HMAC | []byte | 1. Only available in version 2 or later of the package diff --git a/vendor/github.com/go-jose/go-jose/v4/crypter.go b/vendor/github.com/go-jose/go-jose/v4/crypter.go index d81b03b447..ab02a28e26 100644 --- a/vendor/github.com/go-jose/go-jose/v4/crypter.go +++ b/vendor/github.com/go-jose/go-jose/v4/crypter.go @@ -286,6 +286,10 @@ func makeJWERecipient(alg KeyAlgorithm, encryptionKey interface{}) (recipientKey return newSymmetricRecipient(alg, encryptionKey) case string: return newSymmetricRecipient(alg, []byte(encryptionKey)) + case JSONWebKey: + recipient, err := makeJWERecipient(alg, encryptionKey.Key) + recipient.keyID = encryptionKey.KeyID + return recipient, err case *JSONWebKey: recipient, err := makeJWERecipient(alg, encryptionKey.Key) recipient.keyID = encryptionKey.KeyID diff --git a/vendor/github.com/go-jose/go-jose/v4/jwk.go b/vendor/github.com/go-jose/go-jose/v4/jwk.go index 9700f8906c..164d6a1619 100644 --- a/vendor/github.com/go-jose/go-jose/v4/jwk.go +++ b/vendor/github.com/go-jose/go-jose/v4/jwk.go @@ -175,6 +175,8 @@ func (k JSONWebKey) MarshalJSON() ([]byte, error) { } // UnmarshalJSON reads a key from its JSON representation. +// +// Returns ErrUnsupportedKeyType for unrecognized or unsupported "kty" header values. func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) { var raw rawJSONWebKey err = json.Unmarshal(data, &raw) @@ -228,7 +230,7 @@ func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) { } key, err = raw.symmetricKey() case "OKP": - if raw.Crv == "Ed25519" && raw.X != nil { + if raw.Crv == "Ed25519" { if raw.D != nil { key, err = raw.edPrivateKey() if err == nil { @@ -238,17 +240,27 @@ func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) { key, err = raw.edPublicKey() keyPub = key } - } else { - return fmt.Errorf("go-jose/go-jose: unknown curve '%s'", raw.Crv) } - default: - return fmt.Errorf("go-jose/go-jose: unknown json web key type '%s'", raw.Kty) + case "": + // kty MUST be present + err = fmt.Errorf("go-jose/go-jose: missing json web key type") } if err != nil { return } + if key == nil { + // RFC 7517: + // 5. JWK Set Format + // ... + // Implementations SHOULD ignore JWKs within a JWK Set that use "kty" + // (key type) values that are not understood by them, that are missing + // required members, or for which values are out of the supported + // ranges. + return ErrUnsupportedKeyType + } + if certPub != nil && keyPub != nil { if !reflect.DeepEqual(certPub, keyPub) { return errors.New("go-jose/go-jose: invalid JWK, public keys in key and x5c fields do not match") @@ -581,10 +593,10 @@ func fromEcPublicKey(pub *ecdsa.PublicKey) (*rawJSONWebKey, error) { func (key rawJSONWebKey) edPrivateKey() (ed25519.PrivateKey, error) { var missing []string - switch { - case key.D == nil: + if key.D == nil { missing = append(missing, "D") - case key.X == nil: + } + if key.X == nil { missing = append(missing, "X") } @@ -611,19 +623,21 @@ func (key rawJSONWebKey) edPublicKey() (ed25519.PublicKey, error) { func (key rawJSONWebKey) rsaPrivateKey() (*rsa.PrivateKey, error) { var missing []string - switch { - case key.N == nil: + if key.N == nil { missing = append(missing, "N") - case key.E == nil: + } + if key.E == nil { missing = append(missing, "E") - case key.D == nil: + } + if key.D == nil { missing = append(missing, "D") - case key.P == nil: + } + if key.P == nil { missing = append(missing, "P") - case key.Q == nil: + } + if key.Q == nil { missing = append(missing, "Q") } - if len(missing) > 0 { return nil, fmt.Errorf("go-jose/go-jose: invalid RSA private key, missing %s value(s)", strings.Join(missing, ", ")) } @@ -698,8 +712,19 @@ func (key rawJSONWebKey) ecPrivateKey() (*ecdsa.PrivateKey, error) { return nil, fmt.Errorf("go-jose/go-jose: unsupported elliptic curve '%s'", key.Crv) } - if key.X == nil || key.Y == nil || key.D == nil { - return nil, fmt.Errorf("go-jose/go-jose: invalid EC private key, missing x/y/d values") + var missing []string + if key.X == nil { + missing = append(missing, "X") + } + if key.Y == nil { + missing = append(missing, "Y") + } + if key.D == nil { + missing = append(missing, "D") + } + + if len(missing) > 0 { + return nil, fmt.Errorf("go-jose/go-jose: invalid EC private key, missing %s value(s)", strings.Join(missing, ", ")) } // The length of this octet string MUST be the full size of a coordinate for diff --git a/vendor/github.com/go-jose/go-jose/v4/shared.go b/vendor/github.com/go-jose/go-jose/v4/shared.go index 1ec3396126..56a81b258d 100644 --- a/vendor/github.com/go-jose/go-jose/v4/shared.go +++ b/vendor/github.com/go-jose/go-jose/v4/shared.go @@ -22,7 +22,6 @@ import ( "encoding/base64" "errors" "fmt" - "github.com/go-jose/go-jose/v4/json" ) diff --git a/vendor/github.com/goccy/go-yaml/ast/ast.go b/vendor/github.com/goccy/go-yaml/ast/ast.go index f535a24658..a1a7de1d38 100644 --- a/vendor/github.com/goccy/go-yaml/ast/ast.go +++ b/vendor/github.com/goccy/go-yaml/ast/ast.go @@ -1,6 +1,7 @@ package ast import ( + "errors" "fmt" "io" "math" @@ -8,13 +9,12 @@ import ( "strings" "github.com/goccy/go-yaml/token" - "golang.org/x/xerrors" ) var ( - ErrInvalidTokenType = xerrors.New("invalid token type") - ErrInvalidAnchorName = xerrors.New("invalid anchor name") - ErrInvalidAliasName = xerrors.New("invalid alias name") + ErrInvalidTokenType = errors.New("invalid token type") + ErrInvalidAnchorName = errors.New("invalid anchor name") + ErrInvalidAliasName = errors.New("invalid alias name") ) // NodeType type identifier of node @@ -51,6 +51,8 @@ const ( MappingValueType // SequenceType type identifier for sequence node SequenceType + // SequenceEntryType type identifier for sequence entry node + SequenceEntryType // AnchorType type identifier for anchor node AnchorType // AliasType type identifier for alias node @@ -98,6 +100,8 @@ func (t NodeType) String() string { return "MappingValue" case SequenceType: return "Sequence" + case SequenceEntryType: + return "SequenceEntry" case AnchorType: return "Anchor" case AliasType: @@ -148,6 +152,8 @@ func (t NodeType) YAMLName() string { return "value" case SequenceType: return "sequence" + case SequenceEntryType: + return "value" case AnchorType: return "anchor" case AliasType: @@ -196,6 +202,7 @@ type Node interface { // MapKeyNode type for map key node type MapKeyNode interface { Node + IsMergeKey() bool // String node to text without comment stringWithoutComment() string } @@ -278,6 +285,49 @@ func readNode(p []byte, node Node) (int, error) { return size, nil } +func checkLineBreak(t *token.Token) bool { + if t.Prev != nil { + lbc := "\n" + prev := t.Prev + var adjustment int + // if the previous type is sequence entry use the previous type for that + if prev.Type == token.SequenceEntryType { + // as well as switching to previous type count any new lines in origin to account for: + // - + // b: c + adjustment = strings.Count(strings.TrimRight(t.Origin, lbc), lbc) + if prev.Prev != nil { + prev = prev.Prev + } + } + lineDiff := t.Position.Line - prev.Position.Line - 1 + if lineDiff > 0 { + if prev.Type == token.StringType { + // Remove any line breaks included in multiline string + adjustment += strings.Count(strings.TrimRight(strings.TrimSpace(prev.Origin), lbc), lbc) + } + // Due to the way that comment parsing works its assumed that when a null value does not have new line in origin + // it was squashed therefore difference is ignored. + // foo: + // bar: + // # comment + // baz: 1 + // becomes + // foo: + // bar: null # comment + // + // baz: 1 + if prev.Type == token.NullType || prev.Type == token.ImplicitNullType { + return strings.Count(prev.Origin, lbc) > 0 + } + if lineDiff-adjustment > 0 { + return true + } + } + } + return false +} + // Null create node for null value func Null(tk *token.Token) *NullNode { return &NullNode{ @@ -298,105 +348,30 @@ func Bool(tk *token.Token) *BoolNode { // Integer create node for integer value func Integer(tk *token.Token) *IntegerNode { - value := removeUnderScoreFromNumber(tk.Value) - switch tk.Type { - case token.BinaryIntegerType: - // skip two characters because binary token starts with '0b' - skipCharacterNum := 2 - negativePrefix := "" - if value[0] == '-' { - skipCharacterNum++ - negativePrefix = "-" - } - if len(negativePrefix) > 0 { - i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 2, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - i, _ := strconv.ParseUint(negativePrefix+value[skipCharacterNum:], 2, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - case token.OctetIntegerType: - // octet token starts with '0o' or '-0o' or '0' or '-0' - skipCharacterNum := 1 - negativePrefix := "" - if value[0] == '-' { - skipCharacterNum++ - if len(value) > 2 && value[2] == 'o' { - skipCharacterNum++ - } - negativePrefix = "-" - } else { - if value[1] == 'o' { - skipCharacterNum++ - } - } - if len(negativePrefix) > 0 { - i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 8, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - i, _ := strconv.ParseUint(value[skipCharacterNum:], 8, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - case token.HexIntegerType: - // hex token starts with '0x' or '-0x' - skipCharacterNum := 2 - negativePrefix := "" - if value[0] == '-' { - skipCharacterNum++ - negativePrefix = "-" - } - if len(negativePrefix) > 0 { - i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 16, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - i, _ := strconv.ParseUint(value[skipCharacterNum:], 16, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - if value[0] == '-' || value[0] == '+' { - i, _ := strconv.ParseInt(value, 10, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } + var v any + if num := token.ToNumber(tk.Value); num != nil { + v = num.Value } - i, _ := strconv.ParseUint(value, 10, 64) return &IntegerNode{ BaseNode: &BaseNode{}, Token: tk, - Value: i, + Value: v, } } // Float create node for float value func Float(tk *token.Token) *FloatNode { - f, _ := strconv.ParseFloat(removeUnderScoreFromNumber(tk.Value), 64) + var v float64 + if num := token.ToNumber(tk.Value); num != nil && num.Type == token.NumberTypeFloat { + value, ok := num.Value.(float64) + if ok { + v = value + } + } return &FloatNode{ BaseNode: &BaseNode{}, Token: tk, - Value: f, + Value: v, } } @@ -607,7 +582,9 @@ func (d *DocumentNode) String() string { if d.Start != nil { doc = append(doc, d.Start.Value) } - doc = append(doc, d.Body.String()) + if d.Body != nil { + doc = append(doc, d.Body.String()) + } if d.End != nil { doc = append(doc, d.End.Value) } @@ -619,10 +596,6 @@ func (d *DocumentNode) MarshalYAML() ([]byte, error) { return []byte(d.String()), nil } -func removeUnderScoreFromNumber(num string) string { - return strings.ReplaceAll(num, "_", "") -} - // NullNode type of null node type NullNode struct { *BaseNode @@ -654,6 +627,12 @@ func (n *NullNode) GetValue() interface{} { // String returns `null` text func (n *NullNode) String() string { + if n.Token.Type == token.ImplicitNullType { + if n.Comment != nil { + return n.Comment.String() + } + return "" + } if n.Comment != nil { return addCommentString("null", n.Comment) } @@ -669,6 +648,11 @@ func (n *NullNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *NullNode) IsMergeKey() bool { + return false +} + // IntegerNode type of integer node type IntegerNode struct { *BaseNode @@ -716,6 +700,11 @@ func (n *IntegerNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *IntegerNode) IsMergeKey() bool { + return false +} + // FloatNode type of float node type FloatNode struct { *BaseNode @@ -764,6 +753,11 @@ func (n *FloatNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *FloatNode) IsMergeKey() bool { + return false +} + // StringNode type of string node type StringNode struct { *BaseNode @@ -794,6 +788,11 @@ func (n *StringNode) GetValue() interface{} { return n.Value } +// IsMergeKey returns whether it is a MergeKey node. +func (n *StringNode) IsMergeKey() bool { + return false +} + // escapeSingleQuote escapes s to a single quoted scalar. // https://yaml.org/spec/1.2.2/#732-single-quoted-style func escapeSingleQuote(s string) string { @@ -831,11 +830,12 @@ func (n *StringNode) String() string { // It works mostly, but inconsistencies occur if line break characters are mixed. header := token.LiteralBlockHeader(n.Value) space := strings.Repeat(" ", n.Token.Position.Column-1) + indent := strings.Repeat(" ", n.Token.Position.IndentNum) values := []string{} for _, v := range strings.Split(n.Value, lbc) { - values = append(values, fmt.Sprintf("%s %s", space, v)) + values = append(values, fmt.Sprintf("%s%s%s", space, indent, v)) } - block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s %s", lbc, space)), fmt.Sprintf(" %s", space)) + block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s%s%s", lbc, indent, space)), fmt.Sprintf("%s%s", indent, space)) return fmt.Sprintf("%s%s%s", header, lbc, block) } else if len(n.Value) > 0 && (n.Value[0] == '{' || n.Value[0] == '[') { return fmt.Sprintf(`'%s'`, n.Value) @@ -862,11 +862,12 @@ func (n *StringNode) stringWithoutComment() string { // It works mostly, but inconsistencies occur if line break characters are mixed. header := token.LiteralBlockHeader(n.Value) space := strings.Repeat(" ", n.Token.Position.Column-1) + indent := strings.Repeat(" ", n.Token.Position.IndentNum) values := []string{} for _, v := range strings.Split(n.Value, lbc) { - values = append(values, fmt.Sprintf("%s %s", space, v)) + values = append(values, fmt.Sprintf("%s%s%s", space, indent, v)) } - block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s %s", lbc, space)), fmt.Sprintf(" %s", space)) + block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s%s%s", lbc, indent, space)), fmt.Sprintf(" %s", space)) return fmt.Sprintf("%s%s%s", header, lbc, block) } else if len(n.Value) > 0 && (n.Value[0] == '{' || n.Value[0] == '[') { return fmt.Sprintf(`'%s'`, n.Value) @@ -931,6 +932,11 @@ func (n *LiteralNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *LiteralNode) IsMergeKey() bool { + return false +} + // MergeKeyNode type of merge key node type MergeKeyNode struct { *BaseNode @@ -974,6 +980,11 @@ func (n *MergeKeyNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *MergeKeyNode) IsMergeKey() bool { + return true +} + // BoolNode type of boolean node type BoolNode struct { *BaseNode @@ -1021,6 +1032,11 @@ func (n *BoolNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *BoolNode) IsMergeKey() bool { + return false +} + // InfinityNode type of infinity node type InfinityNode struct { *BaseNode @@ -1068,6 +1084,11 @@ func (n *InfinityNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *InfinityNode) IsMergeKey() bool { + return false +} + // NanNode type of nan node type NanNode struct { *BaseNode @@ -1114,6 +1135,11 @@ func (n *NanNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *NanNode) IsMergeKey() bool { + return false +} + // MapNode interface of MappingValueNode / MappingNode type MapNode interface { MapRange() *MapNodeIter @@ -1147,6 +1173,11 @@ func (m *MapNodeIter) Value() Node { return m.values[m.idx].Value } +// KeyValue returns the MappingValueNode of the iterator's current map node entry. +func (m *MapNodeIter) KeyValue() *MappingValueNode { + return m.values[m.idx] +} + // MappingNode type of mapping node type MappingNode struct { *BaseNode @@ -1317,13 +1348,27 @@ func (n *MappingKeyNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *MappingKeyNode) IsMergeKey() bool { + if n.Value == nil { + return false + } + key, ok := n.Value.(MapKeyNode) + if !ok { + return false + } + return key.IsMergeKey() +} + // MappingValueNode type of mapping value type MappingValueNode struct { *BaseNode - Start *token.Token - Key MapKeyNode - Value Node - FootComment *CommentGroupNode + Start *token.Token // delimiter token ':'. + CollectEntry *token.Token // collect entry token ','. + Key MapKeyNode + Value Node + FootComment *CommentGroupNode + IsFlowStyle bool } // Replace replace value node. @@ -1360,6 +1405,7 @@ func (n *MappingValueNode) AddColumn(col int) { // SetIsFlowStyle set value to IsFlowStyle field recursively. func (n *MappingValueNode) SetIsFlowStyle(isFlow bool) { + n.IsFlowStyle = isFlow switch value := n.Value.(type) { case *MappingNode: value.SetIsFlowStyle(isFlow) @@ -1390,12 +1436,20 @@ func (n *MappingValueNode) String() string { func (n *MappingValueNode) toString() string { space := strings.Repeat(" ", n.Key.GetToken().Position.Column-1) + if checkLineBreak(n.Key.GetToken()) { + space = fmt.Sprintf("%s%s", "\n", space) + } keyIndentLevel := n.Key.GetToken().Position.IndentLevel valueIndentLevel := n.Value.GetToken().Position.IndentLevel keyComment := n.Key.GetComment() if _, ok := n.Value.(ScalarNode); ok { - return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) - } else if keyIndentLevel < valueIndentLevel { + value := n.Value.String() + if value == "" { + // implicit null value. + return fmt.Sprintf("%s%s:", space, n.Key.String()) + } + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), value) + } else if keyIndentLevel < valueIndentLevel && !n.IsFlowStyle { if keyComment != nil { return fmt.Sprintf( "%s%s: %s\n%s", @@ -1414,7 +1468,10 @@ func (n *MappingValueNode) toString() string { return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) } else if _, ok := n.Value.(*AliasNode); ok { return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) + } else if _, ok := n.Value.(*TagNode); ok { + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) } + if keyComment != nil { return fmt.Sprintf( "%s%s: %s\n%s", @@ -1485,13 +1542,14 @@ type SequenceNode struct { IsFlowStyle bool Values []Node ValueHeadComments []*CommentGroupNode + Entries []*SequenceEntryNode FootComment *CommentGroupNode } // Replace replace value node. func (n *SequenceNode) Replace(idx int, value Node) error { if len(n.Values) <= idx { - return xerrors.Errorf( + return fmt.Errorf( "invalid index for sequence: sequence length is %d, but specified %d index", len(n.Values), idx, ) @@ -1506,9 +1564,12 @@ func (n *SequenceNode) Replace(idx int, value Node) error { func (n *SequenceNode) Merge(target *SequenceNode) { column := n.Start.Position.Column - target.Start.Position.Column target.AddColumn(column) - for _, value := range target.Values { - n.Values = append(n.Values, value) + n.Values = append(n.Values, target.Values...) + if len(target.ValueHeadComments) == 0 { + n.ValueHeadComments = append(n.ValueHeadComments, make([]*CommentGroupNode, len(target.Values))...) + return } + n.ValueHeadComments = append(n.ValueHeadComments, target.ValueHeadComments...) } // SetIsFlowStyle set value to IsFlowStyle field recursively. @@ -1564,7 +1625,15 @@ func (n *SequenceNode) blockStyleString() string { } for idx, value := range n.Values { + if value == nil { + continue + } valueStr := value.String() + newLinePrefix := "" + if strings.HasPrefix(valueStr, "\n") { + valueStr = valueStr[1:] + newLinePrefix = "\n" + } splittedValues := strings.Split(valueStr, "\n") trimmedFirstValue := strings.TrimLeft(splittedValues[0], " ") diffLength := len(splittedValues[0]) - len(trimmedFirstValue) @@ -1587,9 +1656,10 @@ func (n *SequenceNode) blockStyleString() string { } newValue := strings.Join(newValues, "\n") if len(n.ValueHeadComments) == len(n.Values) && n.ValueHeadComments[idx] != nil { - values = append(values, n.ValueHeadComments[idx].StringWithSpace(n.Start.Position.Column-1)) + values = append(values, fmt.Sprintf("%s%s", newLinePrefix, n.ValueHeadComments[idx].StringWithSpace(n.Start.Position.Column-1))) + newLinePrefix = "" } - values = append(values, fmt.Sprintf("%s- %s", space, newValue)) + values = append(values, fmt.Sprintf("%s%s- %s", newLinePrefix, space, newValue)) } if n.FootComment != nil { values = append(values, n.FootComment.StringWithSpace(n.Start.Position.Column-1)) @@ -1618,6 +1688,87 @@ func (n *SequenceNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// SequenceEntryNode is the sequence entry. +type SequenceEntryNode struct { + *BaseNode + HeadComment *CommentGroupNode // head comment. + LineComment *CommentGroupNode // line comment e.g.) - # comment. + Start *token.Token // entry token. + Value Node // value node. +} + +// String node to text +func (n *SequenceEntryNode) String() string { + return "" // TODO +} + +// GetToken returns token instance +func (n *SequenceEntryNode) GetToken() *token.Token { + return n.Start +} + +// Type returns type of node +func (n *SequenceEntryNode) Type() NodeType { + return SequenceEntryType +} + +// AddColumn add column number to child nodes recursively +func (n *SequenceEntryNode) AddColumn(col int) { + n.Start.AddColumn(col) +} + +// SetComment set line comment. +func (n *SequenceEntryNode) SetComment(cm *CommentGroupNode) error { + n.LineComment = cm + return nil +} + +// Comment returns comment token instance +func (n *SequenceEntryNode) GetComment() *CommentGroupNode { + return n.LineComment +} + +// MarshalYAML +func (n *SequenceEntryNode) MarshalYAML() ([]byte, error) { + return []byte(n.String()), nil +} + +func (n *SequenceEntryNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// SequenceEntry creates SequenceEntryNode instance. +func SequenceEntry(start *token.Token, value Node, headComment *CommentGroupNode) *SequenceEntryNode { + return &SequenceEntryNode{ + BaseNode: &BaseNode{}, + HeadComment: headComment, + Start: start, + Value: value, + } +} + +// SequenceMergeValue creates SequenceMergeValueNode instance. +func SequenceMergeValue(values ...MapNode) *SequenceMergeValueNode { + return &SequenceMergeValueNode{ + values: values, + } +} + +// SequenceMergeValueNode is used to convert the Sequence node specified for the merge key into a MapNode format. +type SequenceMergeValueNode struct { + values []MapNode +} + +// MapRange returns MapNodeIter instance. +func (n *SequenceMergeValueNode) MapRange() *MapNodeIter { + ret := &MapNodeIter{idx: startRangeIndex} + for _, value := range n.values { + iter := value.MapRange() + ret.values = append(ret.values, iter.values...) + } + return ret +} + // AnchorNode type of anchor node type AnchorNode struct { *BaseNode @@ -1626,6 +1777,10 @@ type AnchorNode struct { Value Node } +func (n *AnchorNode) stringWithoutComment() string { + return n.Value.String() +} + func (n *AnchorNode) SetName(name string) error { if n.Name == nil { return ErrInvalidAnchorName @@ -1651,6 +1806,10 @@ func (n *AnchorNode) GetToken() *token.Token { return n.Start } +func (n *AnchorNode) GetValue() any { + return n.Value.GetToken().Value +} + // AddColumn add column number to child nodes recursively func (n *AnchorNode) AddColumn(col int) { n.Start.AddColumn(col) @@ -1664,15 +1823,18 @@ func (n *AnchorNode) AddColumn(col int) { // String anchor to text func (n *AnchorNode) String() string { + anchor := "&" + n.Name.String() value := n.Value.String() - if len(strings.Split(value, "\n")) > 1 { - return fmt.Sprintf("&%s\n%s", n.Name.String(), value) - } else if s, ok := n.Value.(*SequenceNode); ok && !s.IsFlowStyle { - return fmt.Sprintf("&%s\n%s", n.Name.String(), value) + if s, ok := n.Value.(*SequenceNode); ok && !s.IsFlowStyle { + return fmt.Sprintf("%s\n%s", anchor, value) } else if m, ok := n.Value.(*MappingNode); ok && !m.IsFlowStyle { - return fmt.Sprintf("&%s\n%s", n.Name.String(), value) + return fmt.Sprintf("%s\n%s", anchor, value) + } + if value == "" { + // implicit null value. + return anchor } - return fmt.Sprintf("&%s %s", n.Name.String(), value) + return fmt.Sprintf("%s %s", anchor, value) } // MarshalYAML encodes to a YAML text @@ -1680,6 +1842,18 @@ func (n *AnchorNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *AnchorNode) IsMergeKey() bool { + if n.Value == nil { + return false + } + key, ok := n.Value.(MapKeyNode) + if !ok { + return false + } + return key.IsMergeKey() +} + // AliasNode type of alias node type AliasNode struct { *BaseNode @@ -1687,6 +1861,10 @@ type AliasNode struct { Value Node } +func (n *AliasNode) stringWithoutComment() string { + return n.Value.String() +} + func (n *AliasNode) SetName(name string) error { if n.Value == nil { return ErrInvalidAliasName @@ -1712,6 +1890,10 @@ func (n *AliasNode) GetToken() *token.Token { return n.Start } +func (n *AliasNode) GetValue() any { + return n.Value.GetToken().Value +} + // AddColumn add column number to child nodes recursively func (n *AliasNode) AddColumn(col int) { n.Start.AddColumn(col) @@ -1730,11 +1912,20 @@ func (n *AliasNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *AliasNode) IsMergeKey() bool { + return false +} + // DirectiveNode type of directive node type DirectiveNode struct { *BaseNode + // Start is '%' token. Start *token.Token - Value Node + // Name is directive name e.g.) "YAML" or "TAG". + Name Node + // Values is directive values e.g.) "1.2" or "!!" and "tag:clarkevans.com,2002:app/". + Values []Node } // Read implements (io.Reader).Read @@ -1752,14 +1943,21 @@ func (n *DirectiveNode) GetToken() *token.Token { // AddColumn add column number to child nodes recursively func (n *DirectiveNode) AddColumn(col int) { - if n.Value != nil { - n.Value.AddColumn(col) + if n.Name != nil { + n.Name.AddColumn(col) + } + for _, value := range n.Values { + value.AddColumn(col) } } // String directive to text func (n *DirectiveNode) String() string { - return fmt.Sprintf("%s%s", n.Start.Value, n.Value.String()) + values := make([]string, 0, len(n.Values)) + for _, val := range n.Values { + values = append(values, val.String()) + } + return strings.Join(append([]string{"%" + n.Name.String()}, values...), " ") } // MarshalYAML encodes to a YAML text @@ -1770,8 +1968,21 @@ func (n *DirectiveNode) MarshalYAML() ([]byte, error) { // TagNode type of tag node type TagNode struct { *BaseNode - Start *token.Token - Value Node + Directive *DirectiveNode + Start *token.Token + Value Node +} + +func (n *TagNode) GetValue() any { + scalar, ok := n.Value.(ScalarNode) + if !ok { + return nil + } + return scalar.GetValue() +} + +func (n *TagNode) stringWithoutComment() string { + return n.Value.String() } // Read implements (io.Reader).Read @@ -1797,7 +2008,14 @@ func (n *TagNode) AddColumn(col int) { // String tag to text func (n *TagNode) String() string { - return fmt.Sprintf("%s %s", n.Start.Value, n.Value.String()) + value := n.Value.String() + if s, ok := n.Value.(*SequenceNode); ok && !s.IsFlowStyle { + return fmt.Sprintf("%s\n%s", n.Start.Value, value) + } else if m, ok := n.Value.(*MappingNode); ok && !m.IsFlowStyle { + return fmt.Sprintf("%s\n%s", n.Start.Value, value) + } + + return fmt.Sprintf("%s %s", n.Start.Value, value) } // MarshalYAML encodes to a YAML text @@ -1805,6 +2023,26 @@ func (n *TagNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *TagNode) IsMergeKey() bool { + if n.Value == nil { + return false + } + key, ok := n.Value.(MapKeyNode) + if !ok { + return false + } + return key.IsMergeKey() +} + +func (n *TagNode) ArrayRange() *ArrayNodeIter { + arr, ok := n.Value.(ArrayNode) + if !ok { + return nil + } + return arr.ArrayRange() +} + // CommentNode type of comment node type CommentNode struct { *BaseNode @@ -1882,10 +2120,13 @@ func (n *CommentGroupNode) StringWithSpace(col int) string { values := []string{} space := strings.Repeat(" ", col) for _, comment := range n.Comments { + space := space + if checkLineBreak(comment.Token) { + space = fmt.Sprintf("%s%s", "\n", space) + } values = append(values, space+comment.String()) } return strings.Join(values, "\n") - } // MarshalYAML encodes to a YAML text @@ -1932,7 +2173,10 @@ func Walk(v Visitor, node Node) { Walk(v, n.Value) case *DirectiveNode: walkComment(v, n.BaseNode) - Walk(v, n.Value) + Walk(v, n.Name) + for _, value := range n.Values { + Walk(v, value) + } case *TagNode: walkComment(v, n.BaseNode) Walk(v, n.Value) @@ -2018,7 +2262,14 @@ func (f *parentFinder) walk(parent, node Node) Node { case *LiteralNode: return f.walk(node, n.Value) case *DirectiveNode: - return f.walk(node, n.Value) + if found := f.walk(node, n.Name); found != nil { + return found + } + for _, value := range n.Values { + if found := f.walk(node, value); found != nil { + return found + } + } case *TagNode: return f.walk(node, n.Value) case *DocumentNode: @@ -2094,10 +2345,10 @@ func Merge(dst Node, src Node) error { err := &ErrInvalidMergeType{dst: dst, src: src} switch dst.Type() { case DocumentType: - node := dst.(*DocumentNode) + node, _ := dst.(*DocumentNode) return Merge(node.Body, src) case MappingType: - node := dst.(*MappingNode) + node, _ := dst.(*MappingNode) target, ok := src.(*MappingNode) if !ok { return err @@ -2105,7 +2356,7 @@ func Merge(dst Node, src Node) error { node.Merge(target) return nil case SequenceType: - node := dst.(*SequenceNode) + node, _ := dst.(*SequenceNode) target, ok := src.(*SequenceNode) if !ok { return err diff --git a/vendor/github.com/goccy/go-yaml/printer/color.go b/vendor/github.com/goccy/go-yaml/printer/color.go new file mode 100644 index 0000000000..79d7d7c6cc --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/printer/color.go @@ -0,0 +1,83 @@ +// This source inspired by https://github.com/fatih/color. +package printer + +import ( + "fmt" + "strings" +) + +type ColorAttribute int + +const ( + ColorReset ColorAttribute = iota + ColorBold + ColorFaint + ColorItalic + ColorUnderline + ColorBlinkSlow + ColorBlinkRapid + ColorReverseVideo + ColorConcealed + ColorCrossedOut +) + +const ( + ColorFgHiBlack ColorAttribute = iota + 90 + ColorFgHiRed + ColorFgHiGreen + ColorFgHiYellow + ColorFgHiBlue + ColorFgHiMagenta + ColorFgHiCyan + ColorFgHiWhite +) + +const ( + ColorResetBold ColorAttribute = iota + 22 + ColorResetItalic + ColorResetUnderline + ColorResetBlinking + + ColorResetReversed + ColorResetConcealed + ColorResetCrossedOut +) + +const escape = "\x1b" + +var colorResetMap = map[ColorAttribute]ColorAttribute{ + ColorBold: ColorResetBold, + ColorFaint: ColorResetBold, + ColorItalic: ColorResetItalic, + ColorUnderline: ColorResetUnderline, + ColorBlinkSlow: ColorResetBlinking, + ColorBlinkRapid: ColorResetBlinking, + ColorReverseVideo: ColorResetReversed, + ColorConcealed: ColorResetConcealed, + ColorCrossedOut: ColorResetCrossedOut, +} + +func format(attrs ...ColorAttribute) string { + format := make([]string, 0, len(attrs)) + for _, attr := range attrs { + format = append(format, fmt.Sprint(attr)) + } + return fmt.Sprintf("%s[%sm", escape, strings.Join(format, ";")) +} + +func unformat(attrs ...ColorAttribute) string { + format := make([]string, len(attrs)) + for _, attr := range attrs { + v := fmt.Sprint(ColorReset) + reset, exists := colorResetMap[attr] + if exists { + v = fmt.Sprint(reset) + } + format = append(format, v) + } + return fmt.Sprintf("%s[%sm", escape, strings.Join(format, ";")) +} + +func colorize(msg string, attrs ...ColorAttribute) string { + return format(attrs...) + msg + unformat(attrs...) +} diff --git a/vendor/github.com/goccy/go-yaml/printer/printer.go b/vendor/github.com/goccy/go-yaml/printer/printer.go index d5e25dc919..9346983da2 100644 --- a/vendor/github.com/goccy/go-yaml/printer/printer.go +++ b/vendor/github.com/goccy/go-yaml/printer/printer.go @@ -5,7 +5,6 @@ import ( "math" "strings" - "github.com/fatih/color" "github.com/goccy/go-yaml/ast" "github.com/goccy/go-yaml/token" ) @@ -29,6 +28,7 @@ type Printer struct { Bool PrintFunc String PrintFunc Number PrintFunc + Comment PrintFunc } func defaultLineNumberFormat(num int) string { @@ -82,6 +82,11 @@ func (p *Printer) property(tk *token.Token) *Property { return p.Number() } return prop + case token.CommentType: + if p.Comment != nil { + return p.Comment() + } + return prop default: } return prop @@ -144,47 +149,47 @@ func (p *Printer) PrintNode(node ast.Node) []byte { return []byte(fmt.Sprintf("%+v\n", node)) } -const escape = "\x1b" - -func format(attr color.Attribute) string { - return fmt.Sprintf("%s[%dm", escape, attr) -} - func (p *Printer) setDefaultColorSet() { p.Bool = func() *Property { return &Property{ - Prefix: format(color.FgHiMagenta), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiMagenta), + Suffix: format(ColorReset), } } p.Number = func() *Property { return &Property{ - Prefix: format(color.FgHiMagenta), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiMagenta), + Suffix: format(ColorReset), } } p.MapKey = func() *Property { return &Property{ - Prefix: format(color.FgHiCyan), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiCyan), + Suffix: format(ColorReset), } } p.Anchor = func() *Property { return &Property{ - Prefix: format(color.FgHiYellow), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiYellow), + Suffix: format(ColorReset), } } p.Alias = func() *Property { return &Property{ - Prefix: format(color.FgHiYellow), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiYellow), + Suffix: format(ColorReset), } } p.String = func() *Property { return &Property{ - Prefix: format(color.FgHiGreen), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiGreen), + Suffix: format(ColorReset), + } + } + p.Comment = func() *Property { + return &Property{ + Prefix: format(ColorFgHiBlack), + Suffix: format(ColorReset), } } } @@ -192,9 +197,9 @@ func (p *Printer) setDefaultColorSet() { func (p *Printer) PrintErrorMessage(msg string, isColored bool) string { if isColored { return fmt.Sprintf("%s%s%s", - format(color.FgHiRed), + format(ColorFgHiRed), msg, - format(color.Reset), + format(ColorReset), ) } return msg @@ -246,10 +251,7 @@ func (p *Printer) isNewLineLastChar(s string) bool { } func (p *Printer) printBeforeTokens(tk *token.Token, minLine, extLine int) token.Tokens { - for { - if tk.Prev == nil { - break - } + for tk.Prev != nil { if tk.Prev.Position.Line < minLine { break } @@ -317,8 +319,7 @@ func (p *Printer) setupErrorTokenFormat(annotateLine int, isColored bool) { p.LineNumber = true p.LineNumberFormat = func(num int) string { if isColored { - fn := color.New(color.Bold, color.FgHiWhite).SprintFunc() - return fn(prefix(annotateLine, num)) + return colorize(prefix(annotateLine, num), ColorBold, ColorFgHiWhite) } return prefix(annotateLine, num) } diff --git a/vendor/github.com/goccy/go-yaml/scanner/context.go b/vendor/github.com/goccy/go-yaml/scanner/context.go index 09d0a2daaa..4f3250be8a 100644 --- a/vendor/github.com/goccy/go-yaml/scanner/context.go +++ b/vendor/github.com/goccy/go-yaml/scanner/context.go @@ -1,13 +1,14 @@ package scanner import ( + "errors" + "strconv" + "strings" "sync" "github.com/goccy/go-yaml/token" ) -const whitespace = ' ' - // Context context at scanning type Context struct { idx int @@ -18,11 +19,20 @@ type Context struct { buf []rune obuf []rune tokens token.Tokens - isRawFolded bool - isLiteral bool - isFolded bool - isSingleLine bool - literalOpt string + mstate *MultiLineState +} + +type MultiLineState struct { + opt string + firstLineIndentColumn int + prevLineIndentColumn int + lineIndentColumn int + lastNotSpaceOnlyLineIndentColumn int + spaceOnlyIndentColumn int + foldedNewLine bool + isRawFolded bool + isLiteral bool + isFolded bool } var ( @@ -35,14 +45,13 @@ var ( func createContext() *Context { return &Context{ - idx: 0, - tokens: token.Tokens{}, - isSingleLine: true, + idx: 0, + tokens: token.Tokens{}, } } func newContext(src []rune) *Context { - ctx := ctxPool.Get().(*Context) + ctx, _ := ctxPool.Get().(*Context) ctx.reset(src) return ctx } @@ -51,17 +60,18 @@ func (c *Context) release() { ctxPool.Put(c) } +func (c *Context) clear() { + c.resetBuffer() + c.mstate = nil +} + func (c *Context) reset(src []rune) { c.idx = 0 c.size = len(src) c.src = src c.tokens = c.tokens[:0] c.resetBuffer() - c.isRawFolded = false - c.isSingleLine = true - c.isLiteral = false - c.isFolded = false - c.literalOpt = "" + c.mstate = nil } func (c *Context) resetBuffer() { @@ -71,15 +81,185 @@ func (c *Context) resetBuffer() { c.notSpaceOrgCharPos = 0 } -func (c *Context) isSaveIndentMode() bool { - return c.isLiteral || c.isFolded || c.isRawFolded +func (c *Context) breakMultiLine() { + c.mstate = nil +} + +func (c *Context) getMultiLineState() *MultiLineState { + return c.mstate +} + +func (c *Context) setLiteral(lastDelimColumn int, opt string) { + mstate := &MultiLineState{ + isLiteral: true, + opt: opt, + } + indent := firstLineIndentColumnByOpt(opt) + if indent > 0 { + mstate.firstLineIndentColumn = lastDelimColumn + indent + } + c.mstate = mstate +} + +func (c *Context) setFolded(lastDelimColumn int, opt string) { + mstate := &MultiLineState{ + isFolded: true, + opt: opt, + } + indent := firstLineIndentColumnByOpt(opt) + if indent > 0 { + mstate.firstLineIndentColumn = lastDelimColumn + indent + } + c.mstate = mstate +} + +func (c *Context) setRawFolded(column int) { + mstate := &MultiLineState{ + isRawFolded: true, + } + mstate.updateIndentColumn(column) + c.mstate = mstate +} + +func firstLineIndentColumnByOpt(opt string) int { + opt = strings.TrimPrefix(opt, "-") + opt = strings.TrimPrefix(opt, "+") + opt = strings.TrimSuffix(opt, "-") + opt = strings.TrimSuffix(opt, "+") + i, _ := strconv.ParseInt(opt, 10, 64) + return int(i) +} + +func (s *MultiLineState) lastDelimColumn() int { + if s.firstLineIndentColumn == 0 { + return 0 + } + return s.firstLineIndentColumn - 1 +} + +func (s *MultiLineState) updateIndentColumn(column int) { + if s.firstLineIndentColumn == 0 { + s.firstLineIndentColumn = column + } + if s.lineIndentColumn == 0 { + s.lineIndentColumn = column + } +} + +func (s *MultiLineState) updateSpaceOnlyIndentColumn(column int) { + if s.firstLineIndentColumn != 0 { + return + } + s.spaceOnlyIndentColumn = column +} + +func (s *MultiLineState) validateIndentAfterSpaceOnly(column int) error { + if s.firstLineIndentColumn != 0 { + return nil + } + if s.spaceOnlyIndentColumn > column { + return errors.New("invalid number of indent is specified after space only") + } + return nil +} + +func (s *MultiLineState) validateIndentColumn() error { + if firstLineIndentColumnByOpt(s.opt) == 0 { + return nil + } + if s.firstLineIndentColumn > s.lineIndentColumn { + return errors.New("invalid number of indent is specified in the multi-line header") + } + return nil +} + +func (s *MultiLineState) updateNewLineState() { + s.prevLineIndentColumn = s.lineIndentColumn + if s.lineIndentColumn != 0 { + s.lastNotSpaceOnlyLineIndentColumn = s.lineIndentColumn + } + s.foldedNewLine = true + s.lineIndentColumn = 0 +} + +func (s *MultiLineState) isIndentColumn(column int) bool { + if s.firstLineIndentColumn == 0 { + return column == 1 + } + return s.firstLineIndentColumn > column +} + +func (s *MultiLineState) addIndent(ctx *Context, column int) { + if s.firstLineIndentColumn == 0 { + return + } + + // If the first line of the document has already been evaluated, the number is treated as the threshold, since the `firstLineIndentColumn` is a positive number. + if column < s.firstLineIndentColumn { + return + } + + // `c.foldedNewLine` is a variable that is set to true for every newline. + if !s.isLiteral && s.foldedNewLine { + s.foldedNewLine = false + } + // Since addBuf ignore space character, add to the buffer directly. + ctx.buf = append(ctx.buf, ' ') + ctx.notSpaceCharPos = len(ctx.buf) +} + +// updateNewLineInFolded if Folded or RawFolded context and the content on the current line starts at the same column as the previous line, +// treat the new-line-char as a space. +func (s *MultiLineState) updateNewLineInFolded(ctx *Context, column int) { + if s.isLiteral { + return + } + + // Folded or RawFolded. + + if !s.foldedNewLine { + return + } + var ( + lastChar rune + prevLastChar rune + ) + if len(ctx.buf) != 0 { + lastChar = ctx.buf[len(ctx.buf)-1] + } + if len(ctx.buf) > 1 { + prevLastChar = ctx.buf[len(ctx.buf)-2] + } + if s.lineIndentColumn == s.prevLineIndentColumn { + // --- + // > + // a + // b + if lastChar == '\n' { + ctx.buf[len(ctx.buf)-1] = ' ' + } + } else if s.prevLineIndentColumn == 0 && s.lastNotSpaceOnlyLineIndentColumn == column { + // if previous line is indent-space and new-line-char only, prevLineIndentColumn is zero. + // In this case, last new-line-char is removed. + // --- + // > + // a + // + // b + if lastChar == '\n' && prevLastChar == '\n' { + ctx.buf = ctx.buf[:len(ctx.buf)-1] + ctx.notSpaceCharPos = len(ctx.buf) + } + } + s.foldedNewLine = false +} + +func (s *MultiLineState) hasTrimAllEndNewlineOpt() bool { + return strings.HasPrefix(s.opt, "-") || strings.HasSuffix(s.opt, "-") || s.isRawFolded } -func (c *Context) breakLiteral() { - c.isLiteral = false - c.isRawFolded = false - c.isFolded = false - c.literalOpt = "" +func (s *MultiLineState) hasKeepAllEndNewlineOpt() bool { + return strings.HasPrefix(s.opt, "+") || strings.HasSuffix(s.opt, "+") } func (c *Context) addToken(tk *token.Token) { @@ -90,7 +270,7 @@ func (c *Context) addToken(tk *token.Token) { } func (c *Context) addBuf(r rune) { - if len(c.buf) == 0 && r == ' ' { + if len(c.buf) == 0 && (r == ' ' || r == '\t') { return } c.buf = append(c.buf, r) @@ -99,6 +279,16 @@ func (c *Context) addBuf(r rune) { } } +func (c *Context) addBufWithTab(r rune) { + if len(c.buf) == 0 && r == ' ' { + return + } + c.buf = append(c.buf, r) + if r != ' ' { + c.notSpaceCharPos = len(c.buf) + } +} + func (c *Context) addOriginBuf(r rune) { c.obuf = append(c.obuf, r) if r != ' ' && r != '\t' { @@ -106,7 +296,7 @@ func (c *Context) addOriginBuf(r rune) { } } -func (c *Context) removeRightSpaceFromBuf() int { +func (c *Context) removeRightSpaceFromBuf() { trimmedBuf := c.obuf[:c.notSpaceOrgCharPos] buflen := len(trimmedBuf) diff := len(c.obuf) - buflen @@ -114,11 +304,6 @@ func (c *Context) removeRightSpaceFromBuf() int { c.obuf = c.obuf[:buflen] c.buf = c.bufferedSrc() } - return diff -} - -func (c *Context) isDocument() bool { - return c.isLiteral || c.isFolded || c.isRawFolded } func (c *Context) isEOS() bool { @@ -126,7 +311,7 @@ func (c *Context) isEOS() bool { } func (c *Context) isNextEOS() bool { - return len(c.src)-1 <= c.idx+1 + return len(c.src) <= c.idx+1 } func (c *Context) next() bool { @@ -151,18 +336,6 @@ func (c *Context) currentChar() rune { return rune(0) } -func (c *Context) currentCharWithSkipWhitespace() rune { - idx := c.idx - for c.size > idx { - ch := c.src[idx] - if ch != whitespace { - return ch - } - idx++ - } - return rune(0) -} - func (c *Context) nextChar() rune { if c.size > c.idx+1 { return c.src[c.idx+1] @@ -186,19 +359,53 @@ func (c *Context) progress(num int) { c.idx += num } -func (c *Context) nextPos() int { - return c.idx + 1 -} - func (c *Context) existsBuffer() bool { return len(c.bufferedSrc()) != 0 } +func (c *Context) isMultiLine() bool { + return c.mstate != nil +} + func (c *Context) bufferedSrc() []rune { src := c.buf[:c.notSpaceCharPos] - if len(src) > 0 && src[len(src)-1] == '\n' && c.isDocument() && c.literalOpt == "-" { - // remove end '\n' character - src = src[:len(src)-1] + if c.isMultiLine() { + mstate := c.getMultiLineState() + // remove end '\n' character and trailing empty lines. + // https://yaml.org/spec/1.2.2/#8112-block-chomping-indicator + if mstate.hasTrimAllEndNewlineOpt() { + // If the '-' flag is specified, all trailing newline characters will be removed. + src = []rune(strings.TrimRight(string(src), "\n")) + } else if !mstate.hasKeepAllEndNewlineOpt() { + // Normally, all but one of the trailing newline characters are removed. + var newLineCharCount int + for i := len(src) - 1; i >= 0; i-- { + if src[i] == '\n' { + newLineCharCount++ + continue + } + break + } + removedNewLineCharCount := newLineCharCount - 1 + for removedNewLineCharCount > 0 { + src = []rune(strings.TrimSuffix(string(src), "\n")) + removedNewLineCharCount-- + } + } + + // If the text ends with a space character, remove all of them. + if mstate.hasTrimAllEndNewlineOpt() { + src = []rune(strings.TrimRight(string(src), " ")) + } + if string(src) == "\n" { + // If the content consists only of a newline, + // it can be considered as the document ending without any specified value, + // so it is treated as an empty string. + src = []rune{} + } + if mstate.hasKeepAllEndNewlineOpt() && len(src) == 0 { + src = []rune{'\n'} + } } return src } @@ -209,18 +416,34 @@ func (c *Context) bufferedToken(pos *token.Position) *token.Token { } source := c.bufferedSrc() if len(source) == 0 { + c.buf = c.buf[:0] // clear value's buffer only. return nil } var tk *token.Token - if c.isDocument() { + if c.isMultiLine() { tk = token.String(string(source), string(c.obuf), pos) } else { tk = token.New(string(source), string(c.obuf), pos) } + c.setTokenTypeByPrevTag(tk) c.resetBuffer() return tk } +func (c *Context) setTokenTypeByPrevTag(tk *token.Token) { + lastTk := c.lastToken() + if lastTk == nil { + return + } + if lastTk.Type != token.TagType { + return + } + tag := token.ReservedTagKeyword(lastTk.Value) + if _, exists := token.ReservedTagKeywordMap[tag]; !exists { + tk.Type = token.StringType + } +} + func (c *Context) lastToken() *token.Token { if len(c.tokens) != 0 { return c.tokens[len(c.tokens)-1] diff --git a/vendor/github.com/goccy/go-yaml/scanner/error.go b/vendor/github.com/goccy/go-yaml/scanner/error.go new file mode 100644 index 0000000000..3f5419af52 --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/scanner/error.go @@ -0,0 +1,17 @@ +package scanner + +import "github.com/goccy/go-yaml/token" + +type InvalidTokenError struct { + Token *token.Token +} + +func (e *InvalidTokenError) Error() string { + return e.Token.Error +} + +func ErrInvalidToken(tk *token.Token) *InvalidTokenError { + return &InvalidTokenError{ + Token: tk, + } +} diff --git a/vendor/github.com/goccy/go-yaml/scanner/scanner.go b/vendor/github.com/goccy/go-yaml/scanner/scanner.go index ce9c6654ed..13a7ecc4d5 100644 --- a/vendor/github.com/goccy/go-yaml/scanner/scanner.go +++ b/vendor/github.com/goccy/go-yaml/scanner/scanner.go @@ -1,11 +1,13 @@ package scanner import ( + "errors" + "fmt" "io" + "strconv" "strings" "github.com/goccy/go-yaml/token" - "golang.org/x/xerrors" ) // IndentState state for indent @@ -25,20 +27,27 @@ const ( // Scanner holds the scanner's internal state while processing a given text. // It can be allocated as part of another data structure but must be initialized via Init before use. type Scanner struct { - source []rune - sourcePos int - sourceSize int - line int - column int - offset int - prevIndentLevel int - prevIndentNum int - prevIndentColumn int - docStartColumn int + source []rune + sourcePos int + sourceSize int + // line number. This number starts from 1. + line int + // column number. This number starts from 1. + column int + // offset represents the offset from the beginning of the source. + offset int + // lastDelimColumn is the last column needed to compare indent is retained. + lastDelimColumn int + // indentNum indicates the number of spaces used for indentation. + indentNum int + // prevLineIndentNum indicates the number of spaces used for indentation at previous line. + prevLineIndentNum int + // indentLevel indicates the level of indent depth. This value does not match the column value. indentLevel int - indentNum int isFirstCharAtLine bool isAnchor bool + isAlias bool + isDirective bool startedFlowSequenceNum int startedFlowMapNum int indentState IndentState @@ -64,7 +73,7 @@ func (s *Scanner) bufferedToken(ctx *Context) *token.Token { line := s.line column := s.column - len(ctx.buf) level := s.indentLevel - if ctx.isSaveIndentMode() { + if ctx.isMultiLine() { line -= s.newLineCount(ctx.buf) column = strings.Index(string(ctx.obuf), string(ctx.buf)) + 1 // Since we are in a literal, folded or raw folded @@ -86,30 +95,30 @@ func (s *Scanner) bufferedToken(ctx *Context) *token.Token { func (s *Scanner) progressColumn(ctx *Context, num int) { s.column += num s.offset += num - ctx.progress(num) + s.progress(ctx, num) +} + +func (s *Scanner) progressOnly(ctx *Context, num int) { + s.offset += num + s.progress(ctx, num) } func (s *Scanner) progressLine(ctx *Context) { + s.prevLineIndentNum = s.indentNum s.column = 1 s.line++ s.offset++ s.indentNum = 0 s.isFirstCharAtLine = true s.isAnchor = false - ctx.progress(1) + s.isAlias = false + s.isDirective = false + s.progress(ctx, 1) } -func (s *Scanner) isNeededKeepPreviousIndentNum(ctx *Context, c rune) bool { - if !s.isChangedToIndentStateUp() { - return false - } - if ctx.isDocument() { - return true - } - if c == '-' && ctx.existsBuffer() { - return true - } - return false +func (s *Scanner) progress(ctx *Context, num int) { + ctx.progress(num) + s.sourcePos += num } func (s *Scanner) isNewLineChar(c rune) bool { @@ -140,67 +149,50 @@ func (s *Scanner) newLineCount(src []rune) int { return cnt } -func (s *Scanner) updateIndentState(ctx *Context) { - indentNumBasedIndentState := s.indentState - if s.prevIndentNum < s.indentNum { - s.indentLevel = s.prevIndentLevel + 1 - indentNumBasedIndentState = IndentStateUp - } else if s.prevIndentNum == s.indentNum { - s.indentLevel = s.prevIndentLevel - indentNumBasedIndentState = IndentStateEqual - } else { - indentNumBasedIndentState = IndentStateDown - if s.prevIndentLevel > 0 { - s.indentLevel = s.prevIndentLevel - 1 - } - } - - if s.prevIndentColumn > 0 { - if s.prevIndentColumn < s.column { - s.indentState = IndentStateUp - } else if s.prevIndentColumn != s.column || indentNumBasedIndentState != IndentStateEqual { - // The following case ( current position is 'd' ), some variables becomes like here - // - prevIndentColumn: 1 of 'a' - // - indentNumBasedIndentState: IndentStateDown because d's indentNum(1) is less than c's indentNum(3). - // Therefore, s.prevIndentColumn(1) == s.column(1) is true, but we want to treat this as IndentStateDown. - // So, we look also current indentState value by the above prevIndentNum based logic, and determins finally indentState. - // --- - // a: - // b - // c - // d: e - // ^ - s.indentState = IndentStateDown - } else { - s.indentState = IndentStateEqual +func (s *Scanner) updateIndentLevel() { + if s.prevLineIndentNum < s.indentNum { + s.indentLevel++ + } else if s.prevLineIndentNum > s.indentNum { + if s.indentLevel > 0 { + s.indentLevel-- } + } +} + +func (s *Scanner) updateIndentState(ctx *Context) { + if s.lastDelimColumn == 0 { + return + } + + if s.lastDelimColumn < s.column { + s.indentState = IndentStateUp } else { - s.indentState = indentNumBasedIndentState + // If lastDelimColumn and s.column are the same, + // treat as Down state since it is the same column as delimiter. + s.indentState = IndentStateDown } } func (s *Scanner) updateIndent(ctx *Context, c rune) { - if s.isFirstCharAtLine && s.isNewLineChar(c) && ctx.isDocument() { + if s.isFirstCharAtLine && s.isNewLineChar(c) { return } if s.isFirstCharAtLine && c == ' ' { s.indentNum++ return } + if s.isFirstCharAtLine && c == '\t' { + // found tab indent. + // In this case, scanTab returns error. + return + } if !s.isFirstCharAtLine { s.indentState = IndentStateKeep return } + s.updateIndentLevel() s.updateIndentState(ctx) s.isFirstCharAtLine = false - if s.isNeededKeepPreviousIndentNum(ctx, c) { - return - } - if s.indentState != IndentStateUp { - s.prevIndentColumn = 0 - } - s.prevIndentNum = s.indentNum - s.prevIndentLevel = s.indentLevel } func (s *Scanner) isChangedToIndentStateDown() bool { @@ -211,20 +203,15 @@ func (s *Scanner) isChangedToIndentStateUp() bool { return s.indentState == IndentStateUp } -func (s *Scanner) isChangedToIndentStateEqual() bool { - return s.indentState == IndentStateEqual -} - func (s *Scanner) addBufferedTokenIfExists(ctx *Context) { ctx.addToken(s.bufferedToken(ctx)) } -func (s *Scanner) breakLiteral(ctx *Context) { - s.docStartColumn = 0 - ctx.breakLiteral() +func (s *Scanner) breakMultiLine(ctx *Context) { + ctx.breakMultiLine() } -func (s *Scanner) scanSingleQuote(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanSingleQuote(ctx *Context) (*token.Token, error) { ctx.addOriginBuf('\'') srcpos := s.pos() startIndex := ctx.idx + 1 @@ -233,6 +220,7 @@ func (s *Scanner) scanSingleQuote(ctx *Context) (tk *token.Token, pos int) { value := []rune{} isFirstLineChar := false isNewLine := false + for idx := startIndex; idx < size; idx++ { if !isNewLine { s.progressColumn(ctx, 1) @@ -240,34 +228,67 @@ func (s *Scanner) scanSingleQuote(ctx *Context) (tk *token.Token, pos int) { isNewLine = false } c := src[idx] - pos = idx + 1 ctx.addOriginBuf(c) if s.isNewLineChar(c) { - value = append(value, ' ') + notSpaceIdx := -1 + for i := len(value) - 1; i >= 0; i-- { + if value[i] == ' ' { + continue + } + notSpaceIdx = i + break + } + if len(value) > notSpaceIdx { + value = value[:notSpaceIdx+1] + } + if isFirstLineChar { + value = append(value, '\n') + } else { + value = append(value, ' ') + } isFirstLineChar = true isNewLine = true s.progressLine(ctx) + if idx+1 < size { + if err := s.validateDocumentSeparatorMarker(ctx, src[idx+1:]); err != nil { + return nil, err + } + } continue - } else if c == ' ' && isFirstLineChar { + } else if isFirstLineChar && c == ' ' { + continue + } else if isFirstLineChar && c == '\t' { + if s.lastDelimColumn >= s.column { + return nil, ErrInvalidToken( + token.Invalid( + "tab character cannot be used for indentation in single-quoted text", + string(ctx.obuf), s.pos(), + ), + ) + } continue } else if c != '\'' { value = append(value, c) isFirstLineChar = false continue - } - if idx+1 < len(ctx.src) && ctx.src[idx+1] == '\'' { + } else if idx+1 < len(ctx.src) && ctx.src[idx+1] == '\'' { // '' handle as ' character value = append(value, c) ctx.addOriginBuf(c) idx++ + s.progressColumn(ctx, 1) continue } s.progressColumn(ctx, 1) - tk = token.SingleQuote(string(value), string(ctx.obuf), srcpos) - pos = idx - startIndex + 1 - return + return token.SingleQuote(string(value), string(ctx.obuf), srcpos), nil } - return + s.progressColumn(ctx, 1) + return nil, ErrInvalidToken( + token.Invalid( + "could not find end character of single-quoted text", + string(ctx.obuf), srcpos, + ), + ) } func hexToInt(b rune) int { @@ -288,7 +309,7 @@ func hexRunesToInt(b []rune) int { return sum } -func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanDoubleQuote(ctx *Context) (*token.Token, error) { ctx.addOriginBuf('"') srcpos := s.pos() startIndex := ctx.idx + 1 @@ -297,6 +318,7 @@ func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { value := []rune{} isFirstLineChar := false isNewLine := false + for idx := startIndex; idx < size; idx++ { if !isNewLine { s.progressColumn(ctx, 1) @@ -304,107 +326,253 @@ func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { isNewLine = false } c := src[idx] - pos = idx + 1 ctx.addOriginBuf(c) if s.isNewLineChar(c) { - value = append(value, ' ') + notSpaceIdx := -1 + for i := len(value) - 1; i >= 0; i-- { + if value[i] == ' ' { + continue + } + notSpaceIdx = i + break + } + if len(value) > notSpaceIdx { + value = value[:notSpaceIdx+1] + } + if isFirstLineChar { + value = append(value, '\n') + } else { + value = append(value, ' ') + } isFirstLineChar = true isNewLine = true s.progressLine(ctx) + if idx+1 < size { + if err := s.validateDocumentSeparatorMarker(ctx, src[idx+1:]); err != nil { + return nil, err + } + } continue - } else if c == ' ' && isFirstLineChar { + } else if isFirstLineChar && c == ' ' { + continue + } else if isFirstLineChar && c == '\t' { + if s.lastDelimColumn >= s.column { + return nil, ErrInvalidToken( + token.Invalid( + "tab character cannot be used for indentation in double-quoted text", + string(ctx.obuf), s.pos(), + ), + ) + } continue } else if c == '\\' { isFirstLineChar = false - if idx+1 < size { - nextChar := src[idx+1] - switch nextChar { - case 'b': - ctx.addOriginBuf(nextChar) - value = append(value, '\b') - idx++ - continue - case 'e': - ctx.addOriginBuf(nextChar) - value = append(value, '\x1B') - idx++ - continue - case 'f': - ctx.addOriginBuf(nextChar) - value = append(value, '\f') - idx++ - continue - case 'n': - ctx.addOriginBuf(nextChar) - value = append(value, '\n') - idx++ - continue - case 'v': - ctx.addOriginBuf(nextChar) - value = append(value, '\v') - idx++ - continue - case 'L': // LS (#x2028) - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xE2', '\x80', '\xA8'}...) - idx++ - continue - case 'N': // NEL (#x85) - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xC2', '\x85'}...) - idx++ - continue - case 'P': // PS (#x2029) - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xE2', '\x80', '\xA9'}...) - idx++ - continue - case '_': // #xA0 - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xC2', '\xA0'}...) - idx++ - continue - case '"': + if idx+1 >= size { + value = append(value, c) + continue + } + nextChar := src[idx+1] + progress := 0 + switch nextChar { + case '0': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x00) + case 'a': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x07) + case 'b': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x08) + case 't': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x09) + case 'n': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0A) + case 'v': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0B) + case 'f': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0C) + case 'r': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0D) + case 'e': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x1B) + case ' ': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x20) + case '"': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x22) + case '/': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x2F) + case '\\': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x5C) + case 'N': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x85) + case '_': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0xA0) + case 'L': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x2028) + case 'P': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x2029) + case 'x': + if idx+3 >= size { + progress = 1 ctx.addOriginBuf(nextChar) value = append(value, nextChar) - idx++ - continue - case 'x': - if idx+3 >= size { - // TODO: need to return error - //err = xerrors.New("invalid escape character \\x") - return - } - codeNum := hexRunesToInt(src[idx+2 : idx+4]) + } else { + progress = 3 + codeNum := hexRunesToInt(src[idx+2 : idx+progress+1]) value = append(value, rune(codeNum)) - idx += 3 - continue - case 'u': - if idx+5 >= size { - // TODO: need to return error - //err = xerrors.New("invalid escape character \\u") - return + } + case 'u': + // \u0000 style must have 5 characters at least. + if idx+5 >= size { + return nil, ErrInvalidToken( + token.Invalid( + "not enough length for escaped UTF-16 character", + string(ctx.obuf), s.pos(), + ), + ) + } + progress = 5 + codeNum := hexRunesToInt(src[idx+2 : idx+6]) + + // handle surrogate pairs. + if codeNum >= 0xD800 && codeNum <= 0xDBFF { + high := codeNum + + // \u0000\u0000 style must have 11 characters at least. + if idx+11 >= size { + return nil, ErrInvalidToken( + token.Invalid( + "not enough length for escaped UTF-16 surrogate pair", + string(ctx.obuf), s.pos(), + ), + ) } - codeNum := hexRunesToInt(src[idx+2 : idx+6]) - value = append(value, rune(codeNum)) - idx += 5 - continue - case 'U': - if idx+9 >= size { - // TODO: need to return error - //err = xerrors.New("invalid escape character \\U") - return + + if src[idx+6] != '\\' || src[idx+7] != 'u' { + return nil, ErrInvalidToken( + token.Invalid( + "found unexpected character after high surrogate for UTF-16 surrogate pair", + string(ctx.obuf), s.pos(), + ), + ) } - codeNum := hexRunesToInt(src[idx+2 : idx+10]) - value = append(value, rune(codeNum)) - idx += 9 + + low := hexRunesToInt(src[idx+8 : idx+12]) + if low < 0xDC00 || low > 0xDFFF { + return nil, ErrInvalidToken( + token.Invalid( + "found unexpected low surrogate after high surrogate", + string(ctx.obuf), s.pos(), + ), + ) + } + codeNum = ((high - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000 + progress += 6 + } + value = append(value, rune(codeNum)) + case 'U': + // \U00000000 style must have 9 characters at least. + if idx+9 >= size { + return nil, ErrInvalidToken( + token.Invalid( + "not enough length for escaped UTF-32 character", + string(ctx.obuf), s.pos(), + ), + ) + } + progress = 9 + codeNum := hexRunesToInt(src[idx+2 : idx+10]) + value = append(value, rune(codeNum)) + case '\n': + isFirstLineChar = true + isNewLine = true + ctx.addOriginBuf(nextChar) + s.progressColumn(ctx, 1) + s.progressLine(ctx) + idx++ + continue + case '\r': + isFirstLineChar = true + isNewLine = true + ctx.addOriginBuf(nextChar) + s.progressLine(ctx) + progress = 1 + // Skip \n after \r in CRLF sequences + if idx+2 < size && src[idx+2] == '\n' { + ctx.addOriginBuf('\n') + progress = 2 + } + case '\t': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, nextChar) + default: + s.progressColumn(ctx, 1) + return nil, ErrInvalidToken( + token.Invalid( + fmt.Sprintf("found unknown escape character %q", nextChar), + string(ctx.obuf), s.pos(), + ), + ) + } + idx += progress + s.progressColumn(ctx, progress) + continue + } else if c == '\t' { + var ( + foundNotSpaceChar bool + progress int + ) + for i := idx + 1; i < size; i++ { + if src[i] == ' ' || src[i] == '\t' { + progress++ continue - case '\\': - ctx.addOriginBuf(nextChar) - idx++ } + if s.isNewLineChar(src[i]) { + break + } + foundNotSpaceChar = true + } + if foundNotSpaceChar { + value = append(value, c) + if src[idx+1] != '"' { + s.progressColumn(ctx, 1) + } + } else { + idx += progress + s.progressColumn(ctx, progress) } - value = append(value, c) continue } else if c != '"' { value = append(value, c) @@ -412,18 +580,86 @@ func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { continue } s.progressColumn(ctx, 1) - tk = token.DoubleQuote(string(value), string(ctx.obuf), srcpos) - pos = idx - startIndex + 1 - return + return token.DoubleQuote(string(value), string(ctx.obuf), srcpos), nil + } + s.progressColumn(ctx, 1) + return nil, ErrInvalidToken( + token.Invalid( + "could not find end character of double-quoted text", + string(ctx.obuf), srcpos, + ), + ) +} + +func (s *Scanner) validateDocumentSeparatorMarker(ctx *Context, src []rune) error { + if s.foundDocumentSeparatorMarker(src) { + return ErrInvalidToken( + token.Invalid("found unexpected document separator", string(ctx.obuf), s.pos()), + ) } - return + return nil } -func (s *Scanner) scanQuote(ctx *Context, ch rune) (tk *token.Token, pos int) { +func (s *Scanner) foundDocumentSeparatorMarker(src []rune) bool { + if len(src) < 3 { + return false + } + var marker string + if len(src) == 3 { + marker = string(src) + } else { + marker = strings.TrimRightFunc(string(src[:4]), func(r rune) bool { + return r == ' ' || r == '\t' || r == '\n' || r == '\r' + }) + } + return marker == "---" || marker == "..." +} + +func (s *Scanner) scanQuote(ctx *Context, ch rune) (bool, error) { + if ctx.existsBuffer() { + return false, nil + } if ch == '\'' { - return s.scanSingleQuote(ctx) + tk, err := s.scanSingleQuote(ctx) + if err != nil { + return false, err + } + ctx.addToken(tk) + } else { + tk, err := s.scanDoubleQuote(ctx) + if err != nil { + return false, err + } + ctx.addToken(tk) + } + ctx.clear() + return true, nil +} + +func (s *Scanner) scanWhiteSpace(ctx *Context) bool { + if ctx.isMultiLine() { + return false + } + if !s.isAnchor && !s.isDirective && !s.isAlias && !s.isFirstCharAtLine { + return false + } + + if s.isFirstCharAtLine { + s.progressColumn(ctx, 1) + ctx.addOriginBuf(' ') + return true + } + if s.isDirective { + s.addBufferedTokenIfExists(ctx) + s.progressColumn(ctx, 1) + ctx.addOriginBuf(' ') + return true } - return s.scanDoubleQuote(ctx) + + s.addBufferedTokenIfExists(ctx) + s.isAnchor = false + s.isAlias = false + return true } func (s *Scanner) isMergeKey(ctx *Context) bool { @@ -450,156 +686,169 @@ func (s *Scanner) isMergeKey(ctx *Context) bool { return false } -func (s *Scanner) scanTag(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanTag(ctx *Context) (bool, error) { + if ctx.existsBuffer() || s.isDirective { + return false, nil + } + ctx.addOriginBuf('!') - ctx.progress(1) // skip '!' character + s.progress(ctx, 1) // skip '!' character + + var progress int for idx, c := range ctx.src[ctx.idx:] { - pos = idx + 1 - ctx.addOriginBuf(c) + progress = idx + 1 switch c { - case ' ', '\n', '\r': + case ' ': + ctx.addOriginBuf(c) value := ctx.source(ctx.idx-1, ctx.idx+idx) - tk = token.Tag(value, string(ctx.obuf), s.pos()) - pos = len([]rune(value)) - return + ctx.addToken(token.Tag(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, len([]rune(value))) + ctx.clear() + return true, nil + case ',': + if s.startedFlowSequenceNum > 0 || s.startedFlowMapNum > 0 { + value := ctx.source(ctx.idx-1, ctx.idx+idx) + ctx.addToken(token.Tag(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, len([]rune(value))-1) // progress column before collect-entry for scanning it at scanFlowEntry function. + ctx.clear() + return true, nil + } else { + ctx.addOriginBuf(c) + } + case '\n', '\r': + ctx.addOriginBuf(c) + value := ctx.source(ctx.idx-1, ctx.idx+idx) + ctx.addToken(token.Tag(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, len([]rune(value))-1) // progress column before new-line-char for scanning new-line-char at scanNewLine function. + ctx.clear() + return true, nil + case '{', '}': + ctx.addOriginBuf(c) + s.progressColumn(ctx, progress) + invalidTk := token.Invalid(fmt.Sprintf("found invalid tag character %q", c), string(ctx.obuf), s.pos()) + return false, ErrInvalidToken(invalidTk) + default: + ctx.addOriginBuf(c) } } - return + s.progressColumn(ctx, progress) + ctx.clear() + return true, nil } -func (s *Scanner) scanComment(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanComment(ctx *Context) bool { + if ctx.existsBuffer() { + c := ctx.previousChar() + if c != ' ' && c != '\t' && !s.isNewLineChar(c) { + return false + } + } + + s.addBufferedTokenIfExists(ctx) ctx.addOriginBuf('#') - ctx.progress(1) // skip '#' character + s.progress(ctx, 1) // skip '#' character + for idx, c := range ctx.src[ctx.idx:] { - pos = idx + 1 ctx.addOriginBuf(c) - switch c { - case '\n', '\r': - if ctx.previousChar() == '\\' { - continue - } - value := ctx.source(ctx.idx, ctx.idx+idx) - tk = token.Comment(value, string(ctx.obuf), s.pos()) - pos = len([]rune(value)) + 1 - return + if !s.isNewLineChar(c) { + continue + } + if ctx.previousChar() == '\\' { + continue } + value := ctx.source(ctx.idx, ctx.idx+idx) + progress := len([]rune(value)) + ctx.addToken(token.Comment(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, progress) + s.progressLine(ctx) + ctx.clear() + return true } // document ends with comment. value := string(ctx.src[ctx.idx:]) - tk = token.Comment(value, string(ctx.obuf), s.pos()) - pos = len([]rune(value)) + 1 - return -} - -func trimCommentFromLiteralOpt(text string) (string, error) { - idx := strings.Index(text, "#") - if idx < 0 { - return text, nil - } - if idx == 0 { - return "", xerrors.New("invalid literal header") - } - return text[:idx-1], nil + ctx.addToken(token.Comment(value, string(ctx.obuf), s.pos())) + progress := len([]rune(value)) + s.progressColumn(ctx, progress) + s.progressLine(ctx) + ctx.clear() + return true } -func (s *Scanner) scanLiteral(ctx *Context, c rune) { +func (s *Scanner) scanMultiLine(ctx *Context, c rune) error { + state := ctx.getMultiLineState() ctx.addOriginBuf(c) if ctx.isEOS() { - if ctx.isLiteral { + if s.isFirstCharAtLine && c == ' ' { + state.addIndent(ctx, s.column) + } else { ctx.addBuf(c) } + state.updateIndentColumn(s.column) + if err := state.validateIndentColumn(); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return ErrInvalidToken(invalidTk) + } value := ctx.bufferedSrc() ctx.addToken(token.String(string(value), string(ctx.obuf), s.pos())) - ctx.resetBuffer() + ctx.clear() s.progressColumn(ctx, 1) } else if s.isNewLineChar(c) { - if ctx.isLiteral { - ctx.addBuf(c) - } else { - ctx.addBuf(' ') - } + ctx.addBuf(c) + state.updateSpaceOnlyIndentColumn(s.column - 1) + state.updateNewLineState() s.progressLine(ctx) - } else if s.isFirstCharAtLine && c == ' ' { - if 0 < s.docStartColumn && s.docStartColumn <= s.column { - ctx.addBuf(c) + if ctx.next() { + if s.foundDocumentSeparatorMarker(ctx.src[ctx.idx:]) { + value := ctx.bufferedSrc() + ctx.addToken(token.String(string(value), string(ctx.obuf), s.pos())) + ctx.clear() + s.breakMultiLine(ctx) + } } + } else if s.isFirstCharAtLine && c == ' ' { + state.addIndent(ctx, s.column) + s.progressColumn(ctx, 1) + } else if s.isFirstCharAtLine && c == '\t' && state.isIndentColumn(s.column) { + err := ErrInvalidToken( + token.Invalid( + "found a tab character where an indentation space is expected", + string(ctx.obuf), s.pos(), + ), + ) + s.progressColumn(ctx, 1) + return err + } else if c == '\t' && !state.isIndentColumn(s.column) { + ctx.addBufWithTab(c) s.progressColumn(ctx, 1) } else { - if s.docStartColumn == 0 { - s.docStartColumn = s.column + if err := state.validateIndentAfterSpaceOnly(s.column); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return ErrInvalidToken(invalidTk) } - ctx.addBuf(c) - s.progressColumn(ctx, 1) - } -} - -func (s *Scanner) scanLiteralHeader(ctx *Context) (pos int, err error) { - header := ctx.currentChar() - ctx.addOriginBuf(header) - ctx.progress(1) // skip '|' or '>' character - for idx, c := range ctx.src[ctx.idx:] { - pos = idx - ctx.addOriginBuf(c) - switch c { - case '\n', '\r': - value := ctx.source(ctx.idx, ctx.idx+idx) - opt := strings.TrimRight(value, " ") - orgOptLen := len(opt) - opt, err = trimCommentFromLiteralOpt(opt) - if err != nil { - return - } - switch opt { - case "", "+", "-", - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9": - hasComment := len(opt) < orgOptLen - if header == '|' { - if hasComment { - commentLen := orgOptLen - len(opt) - headerPos := strings.Index(string(ctx.obuf), "|") - litBuf := ctx.obuf[:len(ctx.obuf)-commentLen-headerPos] - commentBuf := ctx.obuf[len(litBuf):] - ctx.addToken(token.Literal("|"+opt, string(litBuf), s.pos())) - s.column += len(litBuf) - s.offset += len(litBuf) - commentHeader := strings.Index(value, "#") - ctx.addToken(token.Comment(string(value[commentHeader+1:]), string(commentBuf), s.pos())) - } else { - ctx.addToken(token.Literal("|"+opt, string(ctx.obuf), s.pos())) - } - ctx.isLiteral = true - } else if header == '>' { - if hasComment { - commentLen := orgOptLen - len(opt) - headerPos := strings.Index(string(ctx.obuf), ">") - foldedBuf := ctx.obuf[:len(ctx.obuf)-commentLen-headerPos] - commentBuf := ctx.obuf[len(foldedBuf):] - ctx.addToken(token.Folded(">"+opt, string(foldedBuf), s.pos())) - s.column += len(foldedBuf) - s.offset += len(foldedBuf) - commentHeader := strings.Index(value, "#") - ctx.addToken(token.Comment(string(value[commentHeader+1:]), string(commentBuf), s.pos())) - } else { - ctx.addToken(token.Folded(">"+opt, string(ctx.obuf), s.pos())) - } - ctx.isFolded = true - } - s.indentState = IndentStateKeep - ctx.resetBuffer() - ctx.literalOpt = opt - return - } - break + state.updateIndentColumn(s.column) + if err := state.validateIndentColumn(); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return ErrInvalidToken(invalidTk) + } + if col := state.lastDelimColumn(); col > 0 { + s.lastDelimColumn = col } + state.updateNewLineInFolded(ctx, s.column) + ctx.addBufWithTab(c) + s.progressColumn(ctx, 1) } - err = xerrors.New("invalid literal header") - return + return nil } func (s *Scanner) scanNewLine(ctx *Context, c rune) { if len(ctx.buf) > 0 && s.savedPos == nil { + bufLen := len(ctx.bufferedSrc()) s.savedPos = s.pos() - s.savedPos.Column -= len(ctx.bufferedSrc()) + s.savedPos.Column -= bufLen + s.savedPos.Offset -= bufLen } // if the following case, origin buffer has unnecessary two spaces. @@ -607,268 +856,621 @@ func (s *Scanner) scanNewLine(ctx *Context, c rune) { // --- // a:[space][space] // b: c - removedNum := ctx.removeRightSpaceFromBuf() - if removedNum > 0 { - s.column -= removedNum - s.offset -= removedNum - if s.savedPos != nil { - s.savedPos.Column -= removedNum - } + ctx.removeRightSpaceFromBuf() + + // There is no problem that we ignore CR which followed by LF and normalize it to LF, because of following YAML1.2 spec. + // > Line breaks inside scalar content must be normalized by the YAML processor. Each such line break must be parsed into a single line feed character. + // > Outside scalar content, YAML allows any line break to be used to terminate lines. + // > -- https://yaml.org/spec/1.2/spec.html + if c == '\r' && ctx.nextChar() == '\n' { + ctx.addOriginBuf('\r') + s.progress(ctx, 1) + s.offset++ + c = '\n' } if ctx.isEOS() { s.addBufferedTokenIfExists(ctx) - } else if s.isAnchor { + } else if s.isAnchor || s.isAlias || s.isDirective { s.addBufferedTokenIfExists(ctx) } - ctx.addBuf(' ') + if ctx.existsBuffer() && s.isFirstCharAtLine { + if ctx.buf[len(ctx.buf)-1] == ' ' { + ctx.buf[len(ctx.buf)-1] = '\n' + } else { + ctx.buf = append(ctx.buf, '\n') + } + } else { + ctx.addBuf(' ') + } + ctx.addOriginBuf(c) + s.progressLine(ctx) +} + +func (s *Scanner) isFlowMode() bool { + if s.startedFlowSequenceNum > 0 { + return true + } + if s.startedFlowMapNum > 0 { + return true + } + return false +} + +func (s *Scanner) scanFlowMapStart(ctx *Context) bool { + if ctx.existsBuffer() && !s.isFlowMode() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('{') + ctx.addToken(token.MappingStart(string(ctx.obuf), s.pos())) + s.startedFlowMapNum++ + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowMapEnd(ctx *Context) bool { + if s.startedFlowMapNum <= 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('}') + ctx.addToken(token.MappingEnd(string(ctx.obuf), s.pos())) + s.startedFlowMapNum-- + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowArrayStart(ctx *Context) bool { + if ctx.existsBuffer() && !s.isFlowMode() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('[') + ctx.addToken(token.SequenceStart(string(ctx.obuf), s.pos())) + s.startedFlowSequenceNum++ + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowArrayEnd(ctx *Context) bool { + if ctx.existsBuffer() && s.startedFlowSequenceNum <= 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf(']') + ctx.addToken(token.SequenceEnd(string(ctx.obuf), s.pos())) + s.startedFlowSequenceNum-- + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowEntry(ctx *Context, c rune) bool { + if s.startedFlowSequenceNum <= 0 && s.startedFlowMapNum <= 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) ctx.addOriginBuf(c) - ctx.isSingleLine = false + ctx.addToken(token.CollectEntry(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanMapDelim(ctx *Context) (bool, error) { + nc := ctx.nextChar() + if s.isDirective || s.isAnchor || s.isAlias { + return false, nil + } + if s.startedFlowMapNum <= 0 && nc != ' ' && nc != '\t' && !s.isNewLineChar(nc) && !ctx.isNextEOS() { + return false, nil + } + if s.startedFlowMapNum > 0 && nc == '/' { + // like http:// + return false, nil + } + if s.startedFlowMapNum > 0 { + tk := ctx.lastToken() + if tk != nil && tk.Type == token.MappingValueType { + return false, nil + } + } + + if strings.HasPrefix(strings.TrimPrefix(string(ctx.obuf), " "), "\t") && !strings.HasPrefix(string(ctx.buf), "\t") { + invalidTk := token.Invalid("tab character cannot use as a map key directly", string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return false, ErrInvalidToken(invalidTk) + } + + // mapping value + tk := s.bufferedToken(ctx) + if tk != nil { + s.lastDelimColumn = tk.Position.Column + ctx.addToken(tk) + } else if tk := ctx.lastToken(); tk != nil { + // If the map key is quote, the buffer does not exist because it has already been cut into tokens. + // Therefore, we need to check the last token. + if tk.Indicator == token.QuotedScalarIndicator { + s.lastDelimColumn = tk.Position.Column + } + } + ctx.addToken(token.MappingValue(s.pos())) + s.progressColumn(ctx, 1) + ctx.clear() + return true, nil +} + +func (s *Scanner) scanDocumentStart(ctx *Context) bool { + if s.indentNum != 0 { + return false + } + if s.column != 1 { + return false + } + if ctx.repeatNum('-') != 3 { + return false + } + if ctx.size > ctx.idx+3 { + c := ctx.src[ctx.idx+3] + if c != ' ' && c != '\t' && c != '\n' && c != '\r' { + return false + } + } + + s.addBufferedTokenIfExists(ctx) + ctx.addToken(token.DocumentHeader(string(ctx.obuf)+"---", s.pos())) + s.progressColumn(ctx, 3) + ctx.clear() + s.clearState() + return true +} + +func (s *Scanner) scanDocumentEnd(ctx *Context) bool { + if s.indentNum != 0 { + return false + } + if s.column != 1 { + return false + } + if ctx.repeatNum('.') != 3 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addToken(token.DocumentEnd(string(ctx.obuf)+"...", s.pos())) + s.progressColumn(ctx, 3) + ctx.clear() + return true +} + +func (s *Scanner) scanMergeKey(ctx *Context) bool { + if !s.isMergeKey(ctx) { + return false + } + + s.lastDelimColumn = s.column + ctx.addToken(token.MergeKey(string(ctx.obuf)+"<<", s.pos())) + s.progressColumn(ctx, 2) + ctx.clear() + return true +} + +func (s *Scanner) scanRawFoldedChar(ctx *Context) bool { + if !ctx.existsBuffer() { + return false + } + if !s.isChangedToIndentStateUp() { + return false + } + + ctx.setRawFolded(s.column) + ctx.addBuf('-') + ctx.addOriginBuf('-') + s.progressColumn(ctx, 1) + return true +} + +func (s *Scanner) scanSequence(ctx *Context) (bool, error) { + if ctx.existsBuffer() { + return false, nil + } + + nc := ctx.nextChar() + if nc != 0 && nc != ' ' && nc != '\t' && !s.isNewLineChar(nc) { + return false, nil + } + + if strings.HasPrefix(strings.TrimPrefix(string(ctx.obuf), " "), "\t") { + invalidTk := token.Invalid("tab character cannot use as a sequence delimiter", string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return false, ErrInvalidToken(invalidTk) + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('-') + tk := token.SequenceEntry(string(ctx.obuf), s.pos()) + s.lastDelimColumn = tk.Position.Column + ctx.addToken(tk) + s.progressColumn(ctx, 1) + ctx.clear() + return true, nil +} + +func (s *Scanner) scanMultiLineHeader(ctx *Context) (bool, error) { + if ctx.existsBuffer() { + return false, nil + } + + if err := s.scanMultiLineHeaderOption(ctx); err != nil { + return false, err + } s.progressLine(ctx) + return true, nil } -func (s *Scanner) scan(ctx *Context) (pos int) { +func (s *Scanner) validateMultiLineHeaderOption(opt string) error { + if len(opt) == 0 { + return nil + } + orgOpt := opt + opt = strings.TrimPrefix(opt, "-") + opt = strings.TrimPrefix(opt, "+") + opt = strings.TrimSuffix(opt, "-") + opt = strings.TrimSuffix(opt, "+") + if len(opt) == 0 { + return nil + } + if opt == "0" { + return fmt.Errorf("invalid header option: %q", orgOpt) + } + i, err := strconv.ParseInt(opt, 10, 64) + if err != nil { + return fmt.Errorf("invalid header option: %q", orgOpt) + } + if i > 9 { + return fmt.Errorf("invalid header option: %q", orgOpt) + } + return nil +} + +func (s *Scanner) scanMultiLineHeaderOption(ctx *Context) error { + header := ctx.currentChar() + ctx.addOriginBuf(header) + s.progress(ctx, 1) // skip '|' or '>' character + + var progress int + for idx, c := range ctx.src[ctx.idx:] { + progress = idx + ctx.addOriginBuf(c) + if s.isNewLineChar(c) { + break + } + } + value := strings.TrimRight(ctx.source(ctx.idx, ctx.idx+progress), " ") + commentValueIndex := strings.Index(value, "#") + opt := value + if commentValueIndex > 0 { + opt = value[:commentValueIndex] + } + opt = strings.TrimRightFunc(opt, func(r rune) bool { + return r == ' ' || r == '\t' + }) + if len(opt) != 0 { + if err := s.validateMultiLineHeaderOption(opt); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, progress) + return ErrInvalidToken(invalidTk) + } + } + if s.column == 1 { + s.lastDelimColumn = 1 + } + + commentIndex := strings.Index(string(ctx.obuf), "#") + headerBuf := string(ctx.obuf) + if commentIndex > 0 { + headerBuf = headerBuf[:commentIndex] + } + switch header { + case '|': + ctx.addToken(token.Literal("|"+opt, headerBuf, s.pos())) + ctx.setLiteral(s.lastDelimColumn, opt) + case '>': + ctx.addToken(token.Folded(">"+opt, headerBuf, s.pos())) + ctx.setFolded(s.lastDelimColumn, opt) + } + if commentIndex > 0 { + comment := string(value[commentValueIndex+1:]) + s.offset += len(headerBuf) + s.column += len(headerBuf) + ctx.addToken(token.Comment(comment, string(ctx.obuf[len(headerBuf):]), s.pos())) + } + s.indentState = IndentStateKeep + ctx.resetBuffer() + s.progressColumn(ctx, progress) + return nil +} + +func (s *Scanner) scanMapKey(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + + nc := ctx.nextChar() + if nc != ' ' && nc != '\t' { + return false + } + + tk := token.MappingKey(s.pos()) + s.lastDelimColumn = tk.Position.Column + ctx.addToken(tk) + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanDirective(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + if s.indentNum != 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('%') + ctx.addToken(token.Directive(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + ctx.clear() + s.isDirective = true + return true +} + +func (s *Scanner) scanAnchor(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('&') + ctx.addToken(token.Anchor(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + s.isAnchor = true + ctx.clear() + return true +} + +func (s *Scanner) scanAlias(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('*') + ctx.addToken(token.Alias(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + s.isAlias = true + ctx.clear() + return true +} + +func (s *Scanner) scanReservedChar(ctx *Context, c rune) error { + if ctx.existsBuffer() { + return nil + } + + ctx.addBuf(c) + ctx.addOriginBuf(c) + err := ErrInvalidToken( + token.Invalid( + fmt.Sprintf("%q is a reserved character", c), + string(ctx.obuf), s.pos(), + ), + ) + s.progressColumn(ctx, 1) + ctx.clear() + return err +} + +func (s *Scanner) scanTab(ctx *Context, c rune) error { + if s.startedFlowSequenceNum > 0 || s.startedFlowMapNum > 0 { + // tabs character is allowed in flow mode. + return nil + } + + if !s.isFirstCharAtLine { + return nil + } + + ctx.addBuf(c) + ctx.addOriginBuf(c) + err := ErrInvalidToken( + token.Invalid("found character '\t' that cannot start any token", + string(ctx.obuf), s.pos(), + ), + ) + s.progressColumn(ctx, 1) + ctx.clear() + return err +} + +func (s *Scanner) scan(ctx *Context) error { for ctx.next() { - pos = ctx.nextPos() c := ctx.currentChar() + // First, change the IndentState. + // If the target character is the first character in a line, IndentState is Up/Down/Equal state. + // The second and subsequent letters are Keep. s.updateIndent(ctx, c) - if ctx.isDocument() { - if s.isChangedToIndentStateEqual() || - s.isChangedToIndentStateDown() { - s.addBufferedTokenIfExists(ctx) - s.breakLiteral(ctx) + + // If IndentState is down, tokens are split, so the buffer accumulated until that point needs to be cutted as a token. + if s.isChangedToIndentStateDown() { + s.addBufferedTokenIfExists(ctx) + } + if ctx.isMultiLine() { + if s.isChangedToIndentStateDown() { + if tk := ctx.lastToken(); tk != nil { + // If literal/folded content is empty, no string token is added. + // Therefore, add an empty string token. + // But if literal/folded token column is 1, it is invalid at down state. + if tk.Position.Column == 1 { + return ErrInvalidToken( + token.Invalid( + "could not find multi-line content", + string(ctx.obuf), s.pos(), + ), + ) + } + if tk.Type != token.StringType { + ctx.addToken(token.String("", "", s.pos())) + } + } + s.breakMultiLine(ctx) } else { - s.scanLiteral(ctx, c) + if err := s.scanMultiLine(ctx, c); err != nil { + return err + } continue } - } else if s.isChangedToIndentStateDown() { - s.addBufferedTokenIfExists(ctx) - } else if s.isChangedToIndentStateEqual() { - // if first character is new line character, buffer expect to raw folded literal - if len(ctx.obuf) > 0 && s.newLineCount(ctx.obuf) <= 1 { - // doesn't raw folded literal - s.addBufferedTokenIfExists(ctx) - } } switch c { case '{': - if !ctx.existsBuffer() { - ctx.addOriginBuf(c) - ctx.addToken(token.MappingStart(string(ctx.obuf), s.pos())) - s.startedFlowMapNum++ - s.progressColumn(ctx, 1) - return + if s.scanFlowMapStart(ctx) { + continue } case '}': - if !ctx.existsBuffer() || s.startedFlowMapNum > 0 { - ctx.addToken(s.bufferedToken(ctx)) - ctx.addOriginBuf(c) - ctx.addToken(token.MappingEnd(string(ctx.obuf), s.pos())) - s.startedFlowMapNum-- - s.progressColumn(ctx, 1) - return + if s.scanFlowMapEnd(ctx) { + continue } case '.': - if s.indentNum == 0 && s.column == 1 && ctx.repeatNum('.') == 3 { - ctx.addToken(token.DocumentEnd(string(ctx.obuf)+"...", s.pos())) - s.progressColumn(ctx, 3) - pos += 2 - return + if s.scanDocumentEnd(ctx) { + continue } case '<': - if s.isMergeKey(ctx) { - s.prevIndentColumn = s.column - ctx.addToken(token.MergeKey(string(ctx.obuf)+"<<", s.pos())) - s.progressColumn(ctx, 1) - pos++ - return + if s.scanMergeKey(ctx) { + continue } case '-': - if s.indentNum == 0 && s.column == 1 && ctx.repeatNum('-') == 3 { - s.addBufferedTokenIfExists(ctx) - ctx.addToken(token.DocumentHeader(string(ctx.obuf)+"---", s.pos())) - s.progressColumn(ctx, 3) - pos += 2 - return - } - if ctx.existsBuffer() && s.isChangedToIndentStateUp() { - // raw folded - ctx.isRawFolded = true - ctx.addBuf(c) - ctx.addOriginBuf(c) - s.progressColumn(ctx, 1) + if s.scanDocumentStart(ctx) { continue } - if ctx.existsBuffer() { - // '-' is literal - ctx.addBuf(c) - ctx.addOriginBuf(c) - s.progressColumn(ctx, 1) + if s.scanRawFoldedChar(ctx) { continue } - nc := ctx.nextChar() - if nc == ' ' || s.isNewLineChar(nc) { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - tk := token.SequenceEntry(string(ctx.obuf), s.pos()) - s.prevIndentColumn = tk.Position.Column - ctx.addToken(tk) - s.progressColumn(ctx, 1) - return + scanned, err := s.scanSequence(ctx) + if err != nil { + return err + } + if scanned { + continue } case '[': - if !ctx.existsBuffer() { - ctx.addOriginBuf(c) - ctx.addToken(token.SequenceStart(string(ctx.obuf), s.pos())) - s.startedFlowSequenceNum++ - s.progressColumn(ctx, 1) - return + if s.scanFlowArrayStart(ctx) { + continue } case ']': - if !ctx.existsBuffer() || s.startedFlowSequenceNum > 0 { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.SequenceEnd(string(ctx.obuf), s.pos())) - s.startedFlowSequenceNum-- - s.progressColumn(ctx, 1) - return + if s.scanFlowArrayEnd(ctx) { + continue } case ',': - if s.startedFlowSequenceNum > 0 || s.startedFlowMapNum > 0 { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.CollectEntry(string(ctx.obuf), s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanFlowEntry(ctx, c) { + continue } case ':': - nc := ctx.nextChar() - if s.startedFlowMapNum > 0 || nc == ' ' || s.isNewLineChar(nc) || ctx.isNextEOS() { - // mapping value - tk := s.bufferedToken(ctx) - if tk != nil { - s.prevIndentColumn = tk.Position.Column - ctx.addToken(tk) - } else if tk := ctx.lastToken(); tk != nil { - // If the map key is quote, the buffer does not exist because it has already been cut into tokens. - // Therefore, we need to check the last token. - if tk.Indicator == token.QuotedScalarIndicator { - s.prevIndentColumn = tk.Position.Column - } - } - ctx.addToken(token.MappingValue(s.pos())) - s.progressColumn(ctx, 1) - return + scanned, err := s.scanMapDelim(ctx) + if err != nil { + return err + } + if scanned { + continue } case '|', '>': - if !ctx.existsBuffer() { - progress, err := s.scanLiteralHeader(ctx) - if err != nil { - // TODO: returns syntax error object - return - } - s.progressColumn(ctx, progress) - s.progressLine(ctx) + scanned, err := s.scanMultiLineHeader(ctx) + if err != nil { + return err + } + if scanned { continue } case '!': - if !ctx.existsBuffer() { - token, progress := s.scanTag(ctx) - ctx.addToken(token) - s.progressColumn(ctx, progress) - if c := ctx.previousChar(); s.isNewLineChar(c) { - s.progressLine(ctx) - } - pos += progress - return + scanned, err := s.scanTag(ctx) + if err != nil { + return err + } + if scanned { + continue } case '%': - if !ctx.existsBuffer() && s.indentNum == 0 { - ctx.addToken(token.Directive(string(ctx.obuf)+"%", s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanDirective(ctx) { + continue } case '?': - nc := ctx.nextChar() - if !ctx.existsBuffer() && nc == ' ' { - ctx.addToken(token.MappingKey(s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanMapKey(ctx) { + continue } case '&': - if !ctx.existsBuffer() { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.Anchor(string(ctx.obuf), s.pos())) - s.progressColumn(ctx, 1) - s.isAnchor = true - return + if s.scanAnchor(ctx) { + continue } case '*': - if !ctx.existsBuffer() { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.Alias(string(ctx.obuf), s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanAlias(ctx) { + continue } case '#': - if !ctx.existsBuffer() || ctx.previousChar() == ' ' { - s.addBufferedTokenIfExists(ctx) - token, progress := s.scanComment(ctx) - ctx.addToken(token) - s.progressColumn(ctx, progress) - s.progressLine(ctx) - pos += progress - return + if s.scanComment(ctx) { + continue } case '\'', '"': - if !ctx.existsBuffer() { - token, progress := s.scanQuote(ctx, c) - ctx.addToken(token) - pos += progress - // If the non-whitespace character immediately following the quote is ':', the quote should be treated as a map key. - // Therefore, do not return and continue processing as a normal map key. - if ctx.currentCharWithSkipWhitespace() == ':' { - continue - } - return + scanned, err := s.scanQuote(ctx, c) + if err != nil { + return err } - case '\r', '\n': - // There is no problem that we ignore CR which followed by LF and normalize it to LF, because of following YAML1.2 spec. - // > Line breaks inside scalar content must be normalized by the YAML processor. Each such line break must be parsed into a single line feed character. - // > Outside scalar content, YAML allows any line break to be used to terminate lines. - // > -- https://yaml.org/spec/1.2/spec.html - if c == '\r' && ctx.nextChar() == '\n' { - ctx.addOriginBuf('\r') - ctx.progress(1) - c = '\n' + if scanned { + continue } + case '\r', '\n': s.scanNewLine(ctx, c) continue case ' ': - if ctx.isSaveIndentMode() || (!s.isAnchor && !s.isFirstCharAtLine) { - ctx.addBuf(c) + if s.scanWhiteSpace(ctx) { + continue + } + case '@', '`': + if err := s.scanReservedChar(ctx, c); err != nil { + return err + } + case '\t': + if ctx.existsBuffer() && s.lastDelimColumn == 0 { + // tab indent for plain text (yaml-test-suite's spec-example-7-12-plain-lines). + s.indentNum++ ctx.addOriginBuf(c) - s.progressColumn(ctx, 1) + s.progressOnly(ctx, 1) continue } - if s.isFirstCharAtLine { - s.progressColumn(ctx, 1) + if s.lastDelimColumn < s.column { + s.indentNum++ ctx.addOriginBuf(c) + s.progressOnly(ctx, 1) continue } - s.addBufferedTokenIfExists(ctx) - pos-- // to rescan white space at next scanning for adding white space to next buffer. - s.isAnchor = false - return + if err := s.scanTab(ctx, c); err != nil { + return err + } } ctx.addBuf(c) ctx.addOriginBuf(c) s.progressColumn(ctx, 1) } s.addBufferedTokenIfExists(ctx) - return + return nil } // Init prepares the scanner s to tokenize the text src by setting the scanner at the beginning of src. @@ -880,12 +1482,15 @@ func (s *Scanner) Init(text string) { s.line = 1 s.column = 1 s.offset = 1 - s.prevIndentLevel = 0 - s.prevIndentNum = 0 - s.prevIndentColumn = 0 + s.isFirstCharAtLine = true + s.clearState() +} + +func (s *Scanner) clearState() { + s.prevLineIndentNum = 0 + s.lastDelimColumn = 0 s.indentLevel = 0 s.indentNum = 0 - s.isFirstCharAtLine = true } // Scan scans the next token and returns the token collection. The source end is indicated by io.EOF. @@ -895,9 +1500,17 @@ func (s *Scanner) Scan() (token.Tokens, error) { } ctx := newContext(s.source[s.sourcePos:]) defer ctx.release() - progress := s.scan(ctx) - s.sourcePos += progress + var tokens token.Tokens + err := s.scan(ctx) tokens = append(tokens, ctx.tokens...) + + if err != nil { + var invalidTokenErr *InvalidTokenError + if errors.As(err, &invalidTokenErr) { + tokens = append(tokens, invalidTokenErr.Token) + } + return tokens, err + } return tokens, nil } diff --git a/vendor/github.com/goccy/go-yaml/token/token.go b/vendor/github.com/goccy/go-yaml/token/token.go index 182f4bea91..e887356243 100644 --- a/vendor/github.com/goccy/go-yaml/token/token.go +++ b/vendor/github.com/goccy/go-yaml/token/token.go @@ -1,8 +1,11 @@ package token import ( + "errors" "fmt" + "strconv" "strings" + "time" ) // Character type for character @@ -99,6 +102,10 @@ const ( SpaceType // NullType type for Null token NullType + // ImplicitNullType type for implicit Null token. + // This is used when explicit keywords such as null or ~ are not specified. + // It is distinguished during encoding and output as an empty string. + ImplicitNullType // InfinityType type for Infinity token InfinityType // NanType type for Nan token @@ -117,6 +124,8 @@ const ( StringType // BoolType type for Bool token BoolType + // InvalidType type for invalid token + InvalidType ) // String type identifier to text @@ -182,10 +191,14 @@ func (t Type) String() string { return "Float" case NullType: return "Null" + case ImplicitNullType: + return "ImplicitNull" case InfinityType: return "Infinity" case NanType: return "Nan" + case InvalidType: + return "Invalid" } return "" } @@ -202,6 +215,8 @@ const ( CharacterTypeMiscellaneous // CharacterTypeEscaped type of escaped character CharacterTypeEscaped + // CharacterTypeInvalid type for a invalid token. + CharacterTypeInvalid ) // String character type identifier to text @@ -210,7 +225,7 @@ func (c CharacterType) String() string { case CharacterTypeIndicator: return "Indicator" case CharacterTypeWhiteSpace: - return "WhiteSpcae" + return "WhiteSpace" case CharacterTypeMiscellaneous: return "Miscellaneous" case CharacterTypeEscaped: @@ -339,9 +354,12 @@ func reservedKeywordToken(typ Type, value, org string, pos *Position) *Token { func init() { for _, keyword := range reservedNullKeywords { - reservedKeywordMap[keyword] = func(value, org string, pos *Position) *Token { + f := func(value, org string, pos *Position) *Token { return reservedKeywordToken(NullType, value, org, pos) } + + reservedKeywordMap[keyword] = f + reservedEncKeywordMap[keyword] = f } for _, keyword := range reservedBoolKeywords { f := func(value, org string, pos *Position) *Token { @@ -391,6 +409,10 @@ const ( SetTag ReservedTagKeyword = "!!set" // TimestampTag `!!timestamp` tag TimestampTag ReservedTagKeyword = "!!timestamp" + // BooleanTag `!!bool` tag + BooleanTag ReservedTagKeyword = "!!bool" + // MergeTag `!!merge` tag + MergeTag ReservedTagKeyword = "!!merge" ) var ( @@ -496,121 +518,163 @@ var ( Position: pos, } }, + BooleanTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + MergeTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, } ) -type numType int +type NumberType string const ( - numTypeNone numType = iota - numTypeBinary - numTypeOctet - numTypeHex - numTypeFloat + NumberTypeDecimal NumberType = "decimal" + NumberTypeBinary NumberType = "binary" + NumberTypeOctet NumberType = "octet" + NumberTypeHex NumberType = "hex" + NumberTypeFloat NumberType = "float" ) -type numStat struct { - isNum bool - typ numType +type NumberValue struct { + Type NumberType + Value any + Text string } -func getNumberStat(str string) *numStat { - stat := &numStat{} - if str == "" { - return stat +func ToNumber(value string) *NumberValue { + num, err := toNumber(value) + if err != nil { + return nil } - if str == "-" || str == "." || str == "+" || str == "_" { - return stat + return num +} + +func isNumber(value string) bool { + num, err := toNumber(value) + if err != nil { + var numErr *strconv.NumError + if errors.As(err, &numErr) && errors.Is(numErr.Err, strconv.ErrRange) { + return true + } + return false } - if str[0] == '_' { - return stat + return num != nil +} + +func toNumber(value string) (*NumberValue, error) { + if len(value) == 0 { + return nil, nil } - dotFound := false - isNegative := false - isExponent := false - if str[0] == '-' { - isNegative = true + if strings.HasPrefix(value, "_") { + return nil, nil } - for idx, c := range str { - switch c { - case 'x': - if (isNegative && idx == 2) || (!isNegative && idx == 1) { - continue - } - case 'o': - if (isNegative && idx == 2) || (!isNegative && idx == 1) { - continue - } - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - continue - case 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F': - if (len(str) > 2 && str[0] == '0' && str[1] == 'x') || - (len(str) > 3 && isNegative && str[1] == '0' && str[2] == 'x') { - // hex number - continue - } - if c == 'b' && ((isNegative && idx == 2) || (!isNegative && idx == 1)) { - // binary number - continue - } - if (c == 'e' || c == 'E') && dotFound { - // exponent - isExponent = true - continue - } - case '.': - if dotFound { - // multiple dot - return stat - } - dotFound = true - continue - case '-': - if idx == 0 || isExponent { - continue - } - case '+': - if idx == 0 || isExponent { - continue - } - case '_': - continue - } - return stat + dotCount := strings.Count(value, ".") + if dotCount > 1 { + return nil, nil } - stat.isNum = true + + isNegative := strings.HasPrefix(value, "-") + normalized := strings.ReplaceAll(strings.TrimPrefix(strings.TrimPrefix(value, "+"), "-"), "_", "") + + var ( + typ NumberType + base int + ) switch { - case dotFound: - stat.typ = numTypeFloat - case strings.HasPrefix(str, "0b") || strings.HasPrefix(str, "-0b"): - stat.typ = numTypeBinary - case strings.HasPrefix(str, "0x") || strings.HasPrefix(str, "-0x"): - stat.typ = numTypeHex - case strings.HasPrefix(str, "0o") || strings.HasPrefix(str, "-0o"): - stat.typ = numTypeOctet - case (len(str) > 1 && str[0] == '0') || (len(str) > 1 && str[0] == '-' && str[1] == '0'): - stat.typ = numTypeOctet - } - return stat + case strings.HasPrefix(normalized, "0x"): + normalized = strings.TrimPrefix(normalized, "0x") + base = 16 + typ = NumberTypeHex + case strings.HasPrefix(normalized, "0o"): + normalized = strings.TrimPrefix(normalized, "0o") + base = 8 + typ = NumberTypeOctet + case strings.HasPrefix(normalized, "0b"): + normalized = strings.TrimPrefix(normalized, "0b") + base = 2 + typ = NumberTypeBinary + case strings.HasPrefix(normalized, "0") && len(normalized) > 1 && dotCount == 0: + base = 8 + typ = NumberTypeOctet + case dotCount == 1: + typ = NumberTypeFloat + default: + typ = NumberTypeDecimal + base = 10 + } + + text := normalized + if isNegative { + text = "-" + text + } + + var v any + if typ == NumberTypeFloat { + f, err := strconv.ParseFloat(text, 64) + if err != nil { + return nil, err + } + v = f + } else if isNegative { + i, err := strconv.ParseInt(text, base, 64) + if err != nil { + return nil, err + } + v = i + } else { + u, err := strconv.ParseUint(text, base, 64) + if err != nil { + return nil, err + } + v = u + } + + return &NumberValue{ + Type: typ, + Value: v, + Text: text, + }, nil } -func looksLikeTimeValue(value string) bool { - for i, c := range value { - switch c { - case ':', '1', '2', '3', '4', '5', '6', '7', '8', '9': - continue - case '0': - if i == 0 { - return false - } - continue +// This is a subset of the formats permitted by the regular expression +// defined at http://yaml.org/type/timestamp.html. Note that time.Parse +// cannot handle: "2001-12-14 21:59:43.10 -5" from the examples. +var timestampFormats = []string{ + time.RFC3339Nano, + "2006-01-02t15:04:05.999999999Z07:00", // RFC3339Nano with lower-case "t". + time.DateTime, + time.DateOnly, + + // Not in examples, but to preserve backward compatibility by quoting time values. + "15:4", +} + +func isTimestamp(value string) bool { + for _, format := range timestampFormats { + if _, err := time.Parse(format, value); err == nil { + return true } - return false } - return true + return false } -// IsNeedQuoted whether need quote for passed string or not +// IsNeedQuoted checks whether the value needs quote for passed string or not func IsNeedQuoted(value string) bool { if value == "" { return true @@ -618,27 +682,30 @@ func IsNeedQuoted(value string) bool { if _, exists := reservedEncKeywordMap[value]; exists { return true } - if stat := getNumberStat(value); stat.isNum { + if isNumber(value) { + return true + } + if value == "-" { return true } first := value[0] switch first { - case '*', '&', '[', '{', '}', ']', ',', '!', '|', '>', '%', '\'', '"', '@': + case '*', '&', '[', '{', '}', ']', ',', '!', '|', '>', '%', '\'', '"', '@', ' ', '`': return true } last := value[len(value)-1] switch last { - case ':': + case ':', ' ': return true } - if looksLikeTimeValue(value) { + if isTimestamp(value) { return true } for i, c := range value { switch c { case '#', '\\': return true - case ':': + case ':', '-': if i+1 < len(value) && value[i+1] == ' ' { return true } @@ -663,13 +730,13 @@ func LiteralBlockHeader(value string) string { } } -// New create reserved keyword token or number token and other string token +// New create reserved keyword token or number token and other string token. func New(value string, org string, pos *Position) *Token { fn := reservedKeywordMap[value] if fn != nil { return fn(value, org, pos) } - if stat := getNumberStat(value); stat.isNum { + if num := ToNumber(value); num != nil { tk := &Token{ Type: IntegerType, CharacterType: CharacterTypeMiscellaneous, @@ -678,14 +745,14 @@ func New(value string, org string, pos *Position) *Token { Origin: org, Position: pos, } - switch stat.typ { - case numTypeFloat: + switch num.Type { + case NumberTypeFloat: tk.Type = FloatType - case numTypeBinary: + case NumberTypeBinary: tk.Type = BinaryIntegerType - case numTypeOctet: + case NumberTypeOctet: tk.Type = OctetIntegerType - case numTypeHex: + case NumberTypeHex: tk.Type = HexIntegerType } return tk @@ -709,14 +776,24 @@ func (p *Position) String() string { // Token type for token type Token struct { - Type Type + // Type is a token type. + Type Type + // CharacterType is a character type. CharacterType CharacterType - Indicator Indicator - Value string - Origin string - Position *Position - Next *Token - Prev *Token + // Indicator is a indicator type. + Indicator Indicator + // Value is a string extracted with only meaningful characters, with spaces and such removed. + Value string + // Origin is a string that stores the original text as-is. + Origin string + // Error keeps error message for InvalidToken. + Error string + // Position is a token position. + Position *Position + // Next is a next token reference. + Next *Token + // Prev is a previous token reference. + Prev *Token } // PreviousType previous token type @@ -756,9 +833,26 @@ func (t *Token) Clone() *Token { return &copied } +// Dump outputs token information to stdout for debugging. +func (t *Token) Dump() { + fmt.Printf( + "[TYPE]:%q [CHARTYPE]:%q [INDICATOR]:%q [VALUE]:%q [ORG]:%q [POS(line:column:level:offset)]: %d:%d:%d:%d\n", + t.Type, t.CharacterType, t.Indicator, t.Value, t.Origin, t.Position.Line, t.Position.Column, t.Position.IndentLevel, t.Position.Offset, + ) +} + // Tokens type of token collection type Tokens []*Token +func (t Tokens) InvalidToken() *Token { + for _, tt := range t { + if tt.Type == InvalidType { + return tt + } + } + return nil +} + func (t *Tokens) add(tk *Token) { tokens := *t if len(tokens) == 0 { @@ -782,7 +876,8 @@ func (t *Tokens) Add(tks ...*Token) { // Dump dump all token structures for debugging func (t Tokens) Dump() { for _, tk := range t { - fmt.Printf("- %+v\n", tk) + fmt.Print("- ") + tk.Dump() } } @@ -1054,6 +1149,18 @@ func DocumentEnd(org string, pos *Position) *Token { } } +func Invalid(err string, org string, pos *Position) *Token { + return &Token{ + Type: InvalidType, + CharacterType: CharacterTypeInvalid, + Indicator: NotIndicator, + Value: org, + Origin: org, + Error: err, + Position: pos, + } +} + // DetectLineBreakCharacter detect line break character in only one inside scalar content scope. func DetectLineBreakCharacter(src string) string { nc := strings.Count(src, "\n") diff --git a/vendor/github.com/google/cel-go/cel/BUILD.bazel b/vendor/github.com/google/cel-go/cel/BUILD.bazel index 81549fb4c5..c12e4904da 100644 --- a/vendor/github.com/google/cel-go/cel/BUILD.bazel +++ b/vendor/github.com/google/cel-go/cel/BUILD.bazel @@ -11,15 +11,17 @@ go_library( "decls.go", "env.go", "folding.go", - "io.go", "inlining.go", + "io.go", "library.go", "macro.go", "optimizer.go", "options.go", "program.go", + "prompt.go", "validator.go", ], + embedsrcs = ["//cel/templates"], importpath = "github.com/google/cel-go/cel", visibility = ["//visibility:public"], deps = [ @@ -29,6 +31,7 @@ go_library( "//common/ast:go_default_library", "//common/containers:go_default_library", "//common/decls:go_default_library", + "//common/env:go_default_library", "//common/functions:go_default_library", "//common/operators:go_default_library", "//common/overloads:go_default_library", @@ -61,9 +64,10 @@ go_test( "decls_test.go", "env_test.go", "folding_test.go", - "io_test.go", "inlining_test.go", + "io_test.go", "optimizer_test.go", + "prompt_test.go", "validator_test.go", ], data = [ @@ -72,6 +76,9 @@ go_test( embed = [ ":go_default_library", ], + embedsrcs = [ + "//cel/testdata:prompts", + ], deps = [ "//common/operators:go_default_library", "//common/overloads:go_default_library", @@ -83,8 +90,8 @@ go_test( "//test/proto2pb:go_default_library", "//test/proto3pb:go_default_library", "@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library", - "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//encoding/prototext:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/structpb:go_default_library", "@org_golang_google_protobuf//types/known/wrapperspb:go_default_library", ], diff --git a/vendor/github.com/google/cel-go/cel/decls.go b/vendor/github.com/google/cel-go/cel/decls.go index 4188060210..4d4873bd6b 100644 --- a/vendor/github.com/google/cel-go/cel/decls.go +++ b/vendor/github.com/google/cel-go/cel/decls.go @@ -142,8 +142,23 @@ func Constant(name string, t *Type, v ref.Val) EnvOption { // Variable creates an instance of a variable declaration with a variable name and type. func Variable(name string, t *Type) EnvOption { + return VariableWithDoc(name, t, "") +} + +// VariableWithDoc creates an instance of a variable declaration with a variable name, type, and doc string. +func VariableWithDoc(name string, t *Type, doc string) EnvOption { + return func(e *Env) (*Env, error) { + e.variables = append(e.variables, decls.NewVariableWithDoc(name, t, doc)) + return e, nil + } +} + +// VariableDecls configures a set of fully defined cel.VariableDecl instances in the environment. +func VariableDecls(vars ...*decls.VariableDecl) EnvOption { return func(e *Env) (*Env, error) { - e.variables = append(e.variables, decls.NewVariable(name, t)) + for _, v := range vars { + e.variables = append(e.variables, v) + } return e, nil } } @@ -183,13 +198,38 @@ func Function(name string, opts ...FunctionOpt) EnvOption { if err != nil { return nil, err } - if existing, found := e.functions[fn.Name()]; found { - fn, err = existing.Merge(fn) - if err != nil { - return nil, err + return FunctionDecls(fn)(e) + } +} + +// OverloadSelector selects an overload associated with a given function when it returns true. +// +// Used in combination with the FunctionDecl.Subset method. +type OverloadSelector = decls.OverloadSelector + +// IncludeOverloads defines an OverloadSelector which allow-lists a set of overloads by their ids. +func IncludeOverloads(overloadIDs ...string) OverloadSelector { + return decls.IncludeOverloads(overloadIDs...) +} + +// ExcludeOverloads defines an OverloadSelector which deny-lists a set of overloads by their ids. +func ExcludeOverloads(overloadIDs ...string) OverloadSelector { + return decls.ExcludeOverloads(overloadIDs...) +} + +// FunctionDecls provides one or more fully formed function declarations to be added to the environment. +func FunctionDecls(funcs ...*decls.FunctionDecl) EnvOption { + return func(e *Env) (*Env, error) { + var err error + for _, fn := range funcs { + if existing, found := e.functions[fn.Name()]; found { + fn, err = existing.Merge(fn) + if err != nil { + return nil, err + } } + e.functions[fn.Name()] = fn } - e.functions[fn.Name()] = fn return e, nil } } @@ -197,6 +237,13 @@ func Function(name string, opts ...FunctionOpt) EnvOption { // FunctionOpt defines a functional option for configuring a function declaration. type FunctionOpt = decls.FunctionOpt +// FunctionDocs provides a general usage documentation for the function. +// +// Use OverloadExamples to provide example usage instructions for specific overloads. +func FunctionDocs(docs ...string) FunctionOpt { + return decls.FunctionDocs(docs...) +} + // SingletonUnaryBinding creates a singleton function definition to be used for all function overloads. // // Note, this approach works well if operand is expected to have a specific trait which it implements, @@ -270,6 +317,11 @@ func MemberOverload(overloadID string, args []*Type, resultType *Type, opts ...O // OverloadOpt is a functional option for configuring a function overload. type OverloadOpt = decls.OverloadOpt +// OverloadExamples configures an example of how to invoke the overload. +func OverloadExamples(docs ...string) OverloadOpt { + return decls.OverloadExamples(docs...) +} + // UnaryBinding provides the implementation of a unary overload. The provided function is protected by a runtime // type-guard which ensures runtime type agreement between the overload signature and runtime argument types. func UnaryBinding(binding functions.UnaryOp) OverloadOpt { @@ -288,6 +340,12 @@ func FunctionBinding(binding functions.FunctionOp) OverloadOpt { return decls.FunctionBinding(binding) } +// LateFunctionBinding indicates that the function has a binding which is not known at compile time. +// This is useful for functions which have side-effects or are not deterministically computable. +func LateFunctionBinding() OverloadOpt { + return decls.LateFunctionBinding() +} + // OverloadIsNonStrict enables the function to be called with error and unknown argument values. // // Note: do not use this option unless absoluately necessary as it should be an uncommon feature. diff --git a/vendor/github.com/google/cel-go/cel/env.go b/vendor/github.com/google/cel-go/cel/env.go index caee8e8c15..58819e872a 100644 --- a/vendor/github.com/google/cel-go/cel/env.go +++ b/vendor/github.com/google/cel-go/cel/env.go @@ -16,6 +16,8 @@ package cel import ( "errors" + "fmt" + "math" "sync" "github.com/google/cel-go/checker" @@ -24,12 +26,16 @@ import ( celast "github.com/google/cel-go/common/ast" "github.com/google/cel-go/common/containers" "github.com/google/cel-go/common/decls" + "github.com/google/cel-go/common/env" + "github.com/google/cel-go/common/functions" + "github.com/google/cel-go/common/stdlib" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter" "github.com/google/cel-go/parser" exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1" + "google.golang.org/protobuf/reflect/protoreflect" ) // Source interface representing a user-provided expression. @@ -127,15 +133,19 @@ type Env struct { Container *containers.Container variables []*decls.VariableDecl functions map[string]*decls.FunctionDecl - macros []parser.Macro + macros []Macro + contextProto protoreflect.MessageDescriptor adapter types.Adapter provider types.Provider features map[int]bool appliedFeatures map[int]bool - libraries map[string]bool + libraries map[string]SingletonLibrary validators []ASTValidator costOptions []checker.CostOption + funcBindOnce sync.Once + functionBindings []*functions.Overload + // Internal parser representation prsr *parser.Parser prsrOpts []parser.Option @@ -151,6 +161,134 @@ type Env struct { progOpts []ProgramOption } +// ToConfig produces a YAML-serializable env.Config object from the given environment. +// +// The serialized configuration value is intended to represent a baseline set of config +// options which could be used as input to an EnvOption to configure the majority of the +// environment from a file. +// +// Note: validators, features, flags, and safe-guard settings are not yet supported by +// the serialize method. Since optimizers are a separate construct from the environment +// and the standard expression components (parse, check, evalute), they are also not +// supported by the serialize method. +func (e *Env) ToConfig(name string) (*env.Config, error) { + conf := env.NewConfig(name) + // Container settings + if e.Container != containers.DefaultContainer { + conf.SetContainer(e.Container.Name()) + } + for _, typeName := range e.Container.AliasSet() { + conf.AddImports(env.NewImport(typeName)) + } + + libOverloads := map[string][]string{} + for libName, lib := range e.libraries { + // Track the options which have been configured by a library and + // then diff the library version against the configured function + // to detect incremental overloads or rewrites. + libEnv, _ := NewCustomEnv() + libEnv, _ = Lib(lib)(libEnv) + for fnName, fnDecl := range libEnv.Functions() { + if len(fnDecl.OverloadDecls()) == 0 { + continue + } + overloads, exist := libOverloads[fnName] + if !exist { + overloads = make([]string, 0, len(fnDecl.OverloadDecls())) + } + for _, o := range fnDecl.OverloadDecls() { + overloads = append(overloads, o.ID()) + } + libOverloads[fnName] = overloads + } + subsetLib, canSubset := lib.(LibrarySubsetter) + alias := "" + if aliasLib, canAlias := lib.(LibraryAliaser); canAlias { + alias = aliasLib.LibraryAlias() + libName = alias + } + if libName == "stdlib" && canSubset { + conf.SetStdLib(subsetLib.LibrarySubset()) + continue + } + version := uint32(math.MaxUint32) + if versionLib, isVersioned := lib.(LibraryVersioner); isVersioned { + version = versionLib.LibraryVersion() + } + conf.AddExtensions(env.NewExtension(libName, version)) + } + + // If this is a custom environment without the standard env, mark the stdlib as disabled. + if conf.StdLib == nil && !e.HasLibrary("cel.lib.std") { + conf.SetStdLib(env.NewLibrarySubset().SetDisabled(true)) + } + + // Serialize the variables + vars := make([]*decls.VariableDecl, 0, len(e.Variables())) + stdTypeVars := map[string]*decls.VariableDecl{} + for _, v := range stdlib.Types() { + stdTypeVars[v.Name()] = v + } + for _, v := range e.Variables() { + if _, isStdType := stdTypeVars[v.Name()]; isStdType { + continue + } + vars = append(vars, v) + } + if e.contextProto != nil { + conf.SetContextVariable(env.NewContextVariable(string(e.contextProto.FullName()))) + skipVariables := map[string]bool{} + fields := e.contextProto.Fields() + for i := 0; i < fields.Len(); i++ { + field := fields.Get(i) + variable, err := fieldToVariable(field) + if err != nil { + return nil, fmt.Errorf("could not serialize context field variable %q, reason: %w", field.FullName(), err) + } + skipVariables[variable.Name()] = true + } + for _, v := range vars { + if _, found := skipVariables[v.Name()]; !found { + conf.AddVariableDecls(v) + } + } + } else { + conf.AddVariableDecls(vars...) + } + + // Serialize functions which are distinct from the ones configured by libraries. + for fnName, fnDecl := range e.Functions() { + if excludedOverloads, found := libOverloads[fnName]; found { + if newDecl := fnDecl.Subset(decls.ExcludeOverloads(excludedOverloads...)); newDecl != nil { + conf.AddFunctionDecls(newDecl) + } + } else { + conf.AddFunctionDecls(fnDecl) + } + } + + // Serialize validators + for _, val := range e.Validators() { + // Only add configurable validators to the env.Config as all others are + // expected to be implicitly enabled via extension libraries. + if confVal, ok := val.(ConfigurableASTValidator); ok { + conf.AddValidators(confVal.ToConfig()) + } + } + + // Serialize features + for featID, enabled := range e.features { + featName, found := featureNameByID(featID) + if !found { + // If the feature isn't named, it isn't intended to be publicly exposed + continue + } + conf.AddFeatures(env.NewFeature(featName, enabled)) + } + + return conf, nil +} + // NewEnv creates a program environment configured with the standard library of CEL functions and // macros. The Env value returned can parse and check any CEL program which builds upon the core // features documented in the CEL specification. @@ -186,18 +324,19 @@ func NewCustomEnv(opts ...EnvOption) (*Env, error) { return nil, err } return (&Env{ - variables: []*decls.VariableDecl{}, - functions: map[string]*decls.FunctionDecl{}, - macros: []parser.Macro{}, - Container: containers.DefaultContainer, - adapter: registry, - provider: registry, - features: map[int]bool{}, - appliedFeatures: map[int]bool{}, - libraries: map[string]bool{}, - validators: []ASTValidator{}, - progOpts: []ProgramOption{}, - costOptions: []checker.CostOption{}, + variables: []*decls.VariableDecl{}, + functions: map[string]*decls.FunctionDecl{}, + functionBindings: []*functions.Overload{}, + macros: []parser.Macro{}, + Container: containers.DefaultContainer, + adapter: registry, + provider: registry, + features: map[int]bool{}, + appliedFeatures: map[int]bool{}, + libraries: map[string]SingletonLibrary{}, + validators: []ASTValidator{}, + progOpts: []ProgramOption{}, + costOptions: []checker.CostOption{}, }).configure(opts) } @@ -217,7 +356,7 @@ func (e *Env) Check(ast *Ast) (*Ast, *Issues) { chk, err := e.initChecker() if err != nil { errs := common.NewErrors(ast.Source()) - errs.ReportError(common.NoLocation, err.Error()) + errs.ReportErrorString(common.NoLocation, err.Error()) return nil, NewIssuesWithSourceInfo(errs, ast.NativeRep().SourceInfo()) } @@ -362,7 +501,7 @@ func (e *Env) Extend(opts ...EnvOption) (*Env, error) { for k, v := range e.functions { funcsCopy[k] = v } - libsCopy := make(map[string]bool, len(e.libraries)) + libsCopy := make(map[string]SingletonLibrary, len(e.libraries)) for k, v := range e.libraries { libsCopy[k] = v } @@ -376,6 +515,7 @@ func (e *Env) Extend(opts ...EnvOption) (*Env, error) { variables: varsCopy, functions: funcsCopy, macros: macsCopy, + contextProto: e.contextProto, progOpts: progOptsCopy, adapter: adapter, features: featuresCopy, @@ -399,8 +539,8 @@ func (e *Env) HasFeature(flag int) bool { // HasLibrary returns whether a specific SingletonLibrary has been configured in the environment. func (e *Env) HasLibrary(libName string) bool { - configured, exists := e.libraries[libName] - return exists && configured + _, exists := e.libraries[libName] + return exists } // Libraries returns a list of SingletonLibrary that have been configured in the environment. @@ -418,9 +558,27 @@ func (e *Env) HasFunction(functionName string) bool { return ok } -// Functions returns map of Functions, keyed by function name, that have been configured in the environment. +// Functions returns a shallow copy of the Functions, keyed by function name, that have been configured in the environment. func (e *Env) Functions() map[string]*decls.FunctionDecl { - return e.functions + shallowCopy := make(map[string]*decls.FunctionDecl, len(e.functions)) + for nm, fn := range e.functions { + shallowCopy[nm] = fn + } + return shallowCopy +} + +// Variables returns a shallow copy of the variables associated with the environment. +func (e *Env) Variables() []*decls.VariableDecl { + shallowCopy := make([]*decls.VariableDecl, len(e.variables)) + copy(shallowCopy, e.variables) + return shallowCopy +} + +// Macros returns a shallow copy of macros associated with the environment. +func (e *Env) Macros() []Macro { + shallowCopy := make([]Macro, len(e.macros)) + copy(shallowCopy, e.macros) + return shallowCopy } // HasValidator returns whether a specific ASTValidator has been configured in the environment. @@ -433,6 +591,11 @@ func (e *Env) HasValidator(name string) bool { return false } +// Validators returns the set of ASTValidators configured on the environment. +func (e *Env) Validators() []ASTValidator { + return e.validators[:] +} + // Parse parses the input expression value `txt` to a Ast and/or a set of Issues. // // This form of Parse creates a Source value for the input `txt` and forwards to the @@ -502,31 +665,30 @@ func (e *Env) TypeProvider() ref.TypeProvider { return &interopLegacyTypeProvider{Provider: e.provider} } -// UnknownVars returns an interpreter.PartialActivation which marks all variables declared in the -// Env as unknown AttributePattern values. +// UnknownVars returns a PartialActivation which marks all variables declared in the Env as +// unknown AttributePattern values. // -// Note, the UnknownVars will behave the same as an interpreter.EmptyActivation unless the -// PartialAttributes option is provided as a ProgramOption. -func (e *Env) UnknownVars() interpreter.PartialActivation { +// Note, the UnknownVars will behave the same as an cel.NoVars() unless the PartialAttributes +// option is provided as a ProgramOption. +func (e *Env) UnknownVars() PartialActivation { act := interpreter.EmptyActivation() part, _ := PartialVars(act, e.computeUnknownVars(act)...) return part } -// PartialVars returns an interpreter.PartialActivation where all variables not in the input variable +// PartialVars returns a PartialActivation where all variables not in the input variable // set, but which have been configured in the environment, are marked as unknown. // -// The `vars` value may either be an interpreter.Activation or any valid input to the -// interpreter.NewActivation call. +// The `vars` value may either be an Activation or any valid input to the cel.NewActivation call. // // Note, this is equivalent to calling cel.PartialVars and manually configuring the set of unknown // variables. For more advanced use cases of partial state where portions of an object graph, rather // than top-level variables, are missing the PartialVars() method may be a more suitable choice. // -// Note, the PartialVars will behave the same as an interpreter.EmptyActivation unless the -// PartialAttributes option is provided as a ProgramOption. -func (e *Env) PartialVars(vars any) (interpreter.PartialActivation, error) { - act, err := interpreter.NewActivation(vars) +// Note, the PartialVars will behave the same as cel.NoVars() unless the PartialAttributes +// option is provided as a ProgramOption. +func (e *Env) PartialVars(vars any) (PartialActivation, error) { + act, err := NewActivation(vars) if err != nil { return nil, err } @@ -598,10 +760,15 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { } } - // If the default UTC timezone fix has been enabled, make sure the library is configured - e, err = e.maybeApplyFeature(featureDefaultUTCTimeZone, Lib(timeUTCLibrary{})) - if err != nil { - return nil, err + // If the default UTC timezone has been disabled, configure the legacy overloads + if utcTime, isSet := e.features[featureDefaultUTCTimeZone]; isSet && !utcTime { + if !e.appliedFeatures[featureDefaultUTCTimeZone] { + e.appliedFeatures[featureDefaultUTCTimeZone] = true + e, err = Lib(timeLegacyLibrary{})(e) + if err != nil { + return nil, err + } + } } // Configure the parser. @@ -615,6 +782,9 @@ func (e *Env) configure(opts []EnvOption) (*Env, error) { if e.HasFeature(featureVariadicLogicalASTs) { prsrOpts = append(prsrOpts, parser.EnableVariadicOperatorASTs(true)) } + if e.HasFeature(featureIdentEscapeSyntax) { + prsrOpts = append(prsrOpts, parser.EnableIdentEscapeSyntax(true)) + } e.prsr, err = parser.NewParser(prsrOpts...) if err != nil { return nil, err @@ -682,30 +852,9 @@ func (e *Env) getCheckerOrError() (*checker.Env, error) { return e.chk, e.chkErr } -// maybeApplyFeature determines whether the feature-guarded option is enabled, and if so applies -// the feature if it has not already been enabled. -func (e *Env) maybeApplyFeature(feature int, option EnvOption) (*Env, error) { - if !e.HasFeature(feature) { - return e, nil - } - _, applied := e.appliedFeatures[feature] - if applied { - return e, nil - } - e, err := option(e) - if err != nil { - return nil, err - } - // record that the feature has been applied since it will generate declarations - // and functions which will be propagated on Extend() calls and which should only - // be registered once. - e.appliedFeatures[feature] = true - return e, nil -} - // computeUnknownVars determines a set of missing variables based on the input activation and the // environment's configured declaration set. -func (e *Env) computeUnknownVars(vars interpreter.Activation) []*interpreter.AttributePattern { +func (e *Env) computeUnknownVars(vars Activation) []*interpreter.AttributePattern { var unknownPatterns []*interpreter.AttributePattern for _, v := range e.variables { varName := v.Name() diff --git a/vendor/github.com/google/cel-go/cel/folding.go b/vendor/github.com/google/cel-go/cel/folding.go index d7060896d3..d1ea6b19db 100644 --- a/vendor/github.com/google/cel-go/cel/folding.go +++ b/vendor/github.com/google/cel-go/cel/folding.go @@ -38,6 +38,23 @@ func MaxConstantFoldIterations(limit int) ConstantFoldingOption { } } +// FoldKnownValues adds an Activation which provides known values for the folding evaluator +// +// Any values the activation provides will be used by the constant folder and turned into +// literals in the AST. +// +// Defaults to the NoVars() Activation +func FoldKnownValues(knownValues Activation) ConstantFoldingOption { + return func(opt *constantFoldingOptimizer) (*constantFoldingOptimizer, error) { + if knownValues != nil { + opt.knownValues = knownValues + } else { + opt.knownValues = NoVars() + } + return opt, nil + } +} + // NewConstantFoldingOptimizer creates an optimizer which inlines constant scalar an aggregate // literal values within function calls and select statements with their evaluated result. func NewConstantFoldingOptimizer(opts ...ConstantFoldingOption) (ASTOptimizer, error) { @@ -56,6 +73,7 @@ func NewConstantFoldingOptimizer(opts ...ConstantFoldingOption) (ASTOptimizer, e type constantFoldingOptimizer struct { maxFoldIterations int + knownValues Activation } // Optimize queries the expression graph for scalar and aggregate literal expressions within call and @@ -68,7 +86,8 @@ func (opt *constantFoldingOptimizer) Optimize(ctx *OptimizerContext, a *ast.AST) // Walk the list of foldable expression and continue to fold until there are no more folds left. // All of the fold candidates returned by the constantExprMatcher should succeed unless there's // a logic bug with the selection of expressions. - foldableExprs := ast.MatchDescendants(root, constantExprMatcher) + constantExprMatcherCapture := func(e ast.NavigableExpr) bool { return opt.constantExprMatcher(ctx, a, e) } + foldableExprs := ast.MatchDescendants(root, constantExprMatcherCapture) foldCount := 0 for len(foldableExprs) != 0 && foldCount < opt.maxFoldIterations { for _, fold := range foldableExprs { @@ -77,21 +96,27 @@ func (opt *constantFoldingOptimizer) Optimize(ctx *OptimizerContext, a *ast.AST) if fold.Kind() == ast.CallKind && maybePruneBranches(ctx, fold) { continue } + // Late-bound function calls cannot be folded. + if fold.Kind() == ast.CallKind && isLateBoundFunctionCall(ctx, a, fold) { + continue + } // Otherwise, assume all context is needed to evaluate the expression. - err := tryFold(ctx, a, fold) - if err != nil { + err := opt.tryFold(ctx, a, fold) + // Ignore errors for identifiers, since there is no guarantee that the environment + // has a value for them. + if err != nil && fold.Kind() != ast.IdentKind { ctx.ReportErrorAtID(fold.ID(), "constant-folding evaluation failed: %v", err.Error()) return a } } foldCount++ - foldableExprs = ast.MatchDescendants(root, constantExprMatcher) + foldableExprs = ast.MatchDescendants(root, constantExprMatcherCapture) } // Once all of the constants have been folded, try to run through the remaining comprehensions // one last time. In this case, there's no guarantee they'll run, so we only update the // target comprehension node with the literal value if the evaluation succeeds. for _, compre := range ast.MatchDescendants(root, ast.KindMatcher(ast.ComprehensionKind)) { - tryFold(ctx, a, compre) + opt.tryFold(ctx, a, compre) } // If the output is a list, map, or struct which contains optional entries, then prune it @@ -121,7 +146,7 @@ func (opt *constantFoldingOptimizer) Optimize(ctx *OptimizerContext, a *ast.AST) // // If the evaluation succeeds, the input expr value will be modified to become a literal, otherwise // the method will return an error. -func tryFold(ctx *OptimizerContext, a *ast.AST, expr ast.Expr) error { +func (opt *constantFoldingOptimizer) tryFold(ctx *OptimizerContext, a *ast.AST, expr ast.Expr) error { // Assume all context is needed to evaluate the expression. subAST := &Ast{ impl: ast.NewCheckedAST(ast.NewAST(expr, a.SourceInfo()), a.TypeMap(), a.ReferenceMap()), @@ -130,7 +155,11 @@ func tryFold(ctx *OptimizerContext, a *ast.AST, expr ast.Expr) error { if err != nil { return err } - out, _, err := prg.Eval(NoVars()) + activation := opt.knownValues + if activation == nil { + activation = NoVars() + } + out, _, err := prg.Eval(activation) if err != nil { return err } @@ -139,6 +168,15 @@ func tryFold(ctx *OptimizerContext, a *ast.AST, expr ast.Expr) error { return nil } +func isLateBoundFunctionCall(ctx *OptimizerContext, a *ast.AST, expr ast.Expr) bool { + call := expr.AsCall() + function := ctx.Functions()[call.FunctionName()] + if function == nil { + return false + } + return function.HasLateBinding() +} + // maybePruneBranches inspects the non-strict call expression to determine whether // a branch can be removed. Evaluation will naturally prune logical and / or calls, // but conditional will not be pruned cleanly, so this is one small area where the @@ -455,13 +493,15 @@ func adaptLiteral(ctx *OptimizerContext, val ref.Val) (ast.Expr, error) { // Only comprehensions which are not nested are included as possible constant folds, and only // if all variables referenced in the comprehension stack exist are only iteration or // accumulation variables. -func constantExprMatcher(e ast.NavigableExpr) bool { +func (opt *constantFoldingOptimizer) constantExprMatcher(ctx *OptimizerContext, a *ast.AST, e ast.NavigableExpr) bool { switch e.Kind() { case ast.CallKind: return constantCallMatcher(e) case ast.SelectKind: sel := e.AsSelect() // guaranteed to be a navigable value return constantMatcher(sel.Operand().(ast.NavigableExpr)) + case ast.IdentKind: + return opt.knownValues != nil && a.ReferenceMap()[e.ID()] != nil case ast.ComprehensionKind: if isNestedComprehension(e) { return false @@ -477,6 +517,10 @@ func constantExprMatcher(e ast.NavigableExpr) bool { if e.Kind() == ast.IdentKind && !vars[e.AsIdent()] { constantExprs = false } + // Late-bound function calls cannot be folded. + if e.Kind() == ast.CallKind && isLateBoundFunctionCall(ctx, a, e) { + constantExprs = false + } }) ast.PreOrderVisit(e, visitor) return constantExprs diff --git a/vendor/github.com/google/cel-go/cel/io.go b/vendor/github.com/google/cel-go/cel/io.go index a327c9672d..2e611228d9 100644 --- a/vendor/github.com/google/cel-go/cel/io.go +++ b/vendor/github.com/google/cel-go/cel/io.go @@ -99,7 +99,13 @@ func AstToParsedExpr(a *Ast) (*exprpb.ParsedExpr, error) { // Note, the conversion may not be an exact replica of the original expression, but will produce // a string that is semantically equivalent and whose textual representation is stable. func AstToString(a *Ast) (string, error) { - return parser.Unparse(a.NativeRep().Expr(), a.NativeRep().SourceInfo()) + return ExprToString(a.NativeRep().Expr(), a.NativeRep().SourceInfo()) +} + +// ExprToString converts an AST Expr node back to a string using macro call tracking metadata from +// source info if any macros are encountered within the expression. +func ExprToString(e ast.Expr, info *ast.SourceInfo) (string, error) { + return parser.Unparse(e, info) } // RefValueToValue converts between ref.Val and google.api.expr.v1alpha1.Value. @@ -120,6 +126,55 @@ func ValueAsAlphaProto(res ref.Val) (*exprpb.Value, error) { return alpha, err } +// RefValToExprValue converts between ref.Val and google.api.expr.v1alpha1.ExprValue. +// The result ExprValue is the serialized proto form. +func RefValToExprValue(res ref.Val) (*exprpb.ExprValue, error) { + return ExprValueAsAlphaProto(res) +} + +// ExprValueAsAlphaProto converts between ref.Val and google.api.expr.v1alpha1.ExprValue. +// The result ExprValue is the serialized proto form. +func ExprValueAsAlphaProto(res ref.Val) (*exprpb.ExprValue, error) { + canonical, err := ExprValueAsProto(res) + if err != nil { + return nil, err + } + alpha := &exprpb.ExprValue{} + err = convertProto(canonical, alpha) + return alpha, err +} + +// ExprValueAsProto converts between ref.Val and cel.expr.ExprValue. +// The result ExprValue is the serialized proto form. +func ExprValueAsProto(res ref.Val) (*celpb.ExprValue, error) { + switch res := res.(type) { + case *types.Unknown: + return &celpb.ExprValue{ + Kind: &celpb.ExprValue_Unknown{ + Unknown: &celpb.UnknownSet{ + Exprs: res.IDs(), + }, + }}, nil + case *types.Err: + return &celpb.ExprValue{ + Kind: &celpb.ExprValue_Error{ + Error: &celpb.ErrorSet{ + // Keeping the error code as UNKNOWN since there's no error codes associated with + // Cel-Go runtime errors. + Errors: []*celpb.Status{{Code: 2, Message: res.Error()}}, + }, + }, + }, nil + default: + val, err := ValueAsProto(res) + if err != nil { + return nil, err + } + return &celpb.ExprValue{ + Kind: &celpb.ExprValue_Value{Value: val}}, nil + } +} + // ValueAsProto converts between ref.Val and cel.expr.Value. // The result Value is the serialized proto form. The ref.Val must not be error or unknown. func ValueAsProto(res ref.Val) (*celpb.Value, error) { diff --git a/vendor/github.com/google/cel-go/cel/library.go b/vendor/github.com/google/cel-go/cel/library.go index be59f1b028..59a10e81de 100644 --- a/vendor/github.com/google/cel-go/cel/library.go +++ b/vendor/github.com/google/cel-go/cel/library.go @@ -15,12 +15,13 @@ package cel import ( + "fmt" "math" - "strconv" - "strings" - "time" + "github.com/google/cel-go/common" "github.com/google/cel-go/common/ast" + "github.com/google/cel-go/common/decls" + "github.com/google/cel-go/common/env" "github.com/google/cel-go/common/operators" "github.com/google/cel-go/common/overloads" "github.com/google/cel-go/common/stdlib" @@ -35,9 +36,11 @@ const ( optMapMacro = "optMap" optFlatMapMacro = "optFlatMap" hasValueFunc = "hasValue" + unwrapOptFunc = "unwrapOpt" optionalNoneFunc = "optional.none" optionalOfFunc = "optional.of" optionalOfNonZeroValueFunc = "optional.ofNonZeroValue" + optionalUnwrapFunc = "optional.unwrap" valueFunc = "value" unusedIterVar = "#unused" ) @@ -68,6 +71,23 @@ type SingletonLibrary interface { LibraryName() string } +// LibraryAliaser generates a simple named alias for the library, for use during environment serialization. +type LibraryAliaser interface { + LibraryAlias() string +} + +// LibrarySubsetter provides the subset description associated with the library, nil if not subset. +type LibrarySubsetter interface { + LibrarySubset() *env.LibrarySubset +} + +// LibraryVersioner provides a version number for the library. +// +// If not implemented, the library version will be flagged as 'latest' during environment serialization. +type LibraryVersioner interface { + LibraryVersion() uint32 +} + // Lib creates an EnvOption out of a Library, allowing libraries to be provided as functional args, // and to be linked to each other. func Lib(l Library) EnvOption { @@ -77,7 +97,7 @@ func Lib(l Library) EnvOption { if e.HasLibrary(singleton.LibraryName()) { return e, nil } - e.libraries[singleton.LibraryName()] = true + e.libraries[singleton.LibraryName()] = singleton } var err error for _, opt := range l.CompileOptions() { @@ -91,26 +111,79 @@ func Lib(l Library) EnvOption { } } +// StdLibOption specifies a functional option for configuring the standard CEL library. +type StdLibOption func(*stdLibrary) *stdLibrary + +// StdLibSubset configures the standard library to use a subset of its functions and macros. +// +// Since the StdLib is a singleton library, only the first instance of the StdLib() environment options +// will be configured on the environment which means only the StdLibSubset() initially configured with +// the library will be used. +func StdLibSubset(subset *env.LibrarySubset) StdLibOption { + return func(lib *stdLibrary) *stdLibrary { + lib.subset = subset + return lib + } +} + // StdLib returns an EnvOption for the standard library of CEL functions and macros. -func StdLib() EnvOption { - return Lib(stdLibrary{}) +func StdLib(opts ...StdLibOption) EnvOption { + lib := &stdLibrary{} + for _, o := range opts { + lib = o(lib) + } + return Lib(lib) } // stdLibrary implements the Library interface and provides functional options for the core CEL // features documented in the specification. -type stdLibrary struct{} +type stdLibrary struct { + subset *env.LibrarySubset +} // LibraryName implements the SingletonLibrary interface method. -func (stdLibrary) LibraryName() string { +func (*stdLibrary) LibraryName() string { return "cel.lib.std" } +// LibraryAlias returns the simple name of the library. +func (*stdLibrary) LibraryAlias() string { + return "stdlib" +} + +// LibrarySubset returns the env.LibrarySubset definition associated with the CEL Library. +func (lib *stdLibrary) LibrarySubset() *env.LibrarySubset { + return lib.subset +} + // CompileOptions returns options for the standard CEL function declarations and macros. -func (stdLibrary) CompileOptions() []EnvOption { +func (lib *stdLibrary) CompileOptions() []EnvOption { + funcs := stdlib.Functions() + macros := StandardMacros + if lib.subset != nil { + subMacros := []Macro{} + for _, m := range macros { + if lib.subset.SubsetMacro(m.Function()) { + subMacros = append(subMacros, m) + } + } + macros = subMacros + subFuncs := []*decls.FunctionDecl{} + for _, fn := range funcs { + if f, include := lib.subset.SubsetFunction(fn); include { + subFuncs = append(subFuncs, f) + } + } + funcs = subFuncs + } return []EnvOption{ func(e *Env) (*Env, error) { var err error - for _, fn := range stdlib.Functions() { + if err = lib.subset.Validate(); err != nil { + return nil, err + } + e.variables = append(e.variables, stdlib.Types()...) + for _, fn := range funcs { existing, found := e.functions[fn.Name()] if found { fn, err = existing.Merge(fn) @@ -122,16 +195,12 @@ func (stdLibrary) CompileOptions() []EnvOption { } return e, nil }, - func(e *Env) (*Env, error) { - e.variables = append(e.variables, stdlib.Types()...) - return e, nil - }, - Macros(StandardMacros...), + Macros(macros...), } } // ProgramOptions returns function implementations for the standard CEL functions. -func (stdLibrary) ProgramOptions() []ProgramOption { +func (*stdLibrary) ProgramOptions() []ProgramOption { return []ProgramOption{} } @@ -260,6 +329,36 @@ func (stdLibrary) ProgramOptions() []ProgramOption { // be expressed with `optMap`. // // msg.?elements.optFlatMap(e, e[?0]) // return the first element if present. +// +// # First +// +// Introduced in version: 2 +// +// Returns an optional with the first value from the right hand list, or +// optional.None. +// +// [1, 2, 3].first().value() == 1 +// +// # Last +// +// Introduced in version: 2 +// +// Returns an optional with the last value from the right hand list, or +// optional.None. +// +// [1, 2, 3].last().value() == 3 +// +// This is syntactic sugar for msg.elements[msg.elements.size()-1]. +// +// # Unwrap / UnwrapOpt +// +// Introduced in version: 2 +// +// Returns a list of all the values that are not none in the input list of optional values. +// Can be used as optional.unwrap(List[T]) or with postfix notation: List[T].unwrapOpt() +// +// optional.unwrap([optional.of(42), optional.none()]) == [42] +// [optional.of(42), optional.none()].unwrapOpt() == [42] func OptionalTypes(opts ...OptionalTypesOption) EnvOption { lib := &optionalLib{version: math.MaxUint32} for _, opt := range opts { @@ -292,10 +391,20 @@ func OptionalTypesVersion(version uint32) OptionalTypesOption { } // LibraryName implements the SingletonLibrary interface method. -func (lib *optionalLib) LibraryName() string { +func (*optionalLib) LibraryName() string { return "cel.lib.optional" } +// LibraryAlias returns the simple name of the library. +func (*optionalLib) LibraryAlias() string { + return "optional" +} + +// LibraryVersion returns the version of the library. +func (lib *optionalLib) LibraryVersion() uint32 { + return lib.version +} + // CompileOptions implements the Library interface method. func (lib *optionalLib) CompileOptions() []EnvOption { paramTypeK := TypeParamType("K") @@ -303,6 +412,7 @@ func (lib *optionalLib) CompileOptions() []EnvOption { optionalTypeV := OptionalType(paramTypeV) listTypeV := ListType(paramTypeV) mapTypeKV := MapType(paramTypeK, paramTypeV) + listOptionalTypeV := ListType(optionalTypeV) opts := []EnvOption{ // Enable the optional syntax in the parser. @@ -312,16 +422,29 @@ func (lib *optionalLib) CompileOptions() []EnvOption { Types(types.OptionalType), // Configure the optMap and optFlatMap macros. - Macros(ReceiverMacro(optMapMacro, 2, optMap)), + Macros(ReceiverMacro(optMapMacro, 2, optMap, + MacroDocs(`perform computation on the value if present and return the result as an optional`), + MacroExamples( + common.MultilineDescription( + `// sub with the prefix 'dev.cel' or optional.none()`, + `request.auth.tokens.?sub.optMap(id, 'dev.cel.' + id)`), + `optional.none().optMap(i, i * 2) // optional.none()`))), // Global and member functions for working with optional values. Function(optionalOfFunc, + FunctionDocs(`create a new optional_type(T) with a value where any value is considered valid`), Overload("optional_of", []*Type{paramTypeV}, optionalTypeV, + OverloadExamples(`optional.of(1) // optional(1)`), UnaryBinding(func(value ref.Val) ref.Val { return types.OptionalOf(value) }))), Function(optionalOfNonZeroValueFunc, + FunctionDocs(`create a new optional_type(T) with a value, if the value is not a zero or empty value`), Overload("optional_ofNonZeroValue", []*Type{paramTypeV}, optionalTypeV, + OverloadExamples( + `optional.ofNonZeroValue(null) // optional.none()`, + `optional.ofNonZeroValue("") // optional.none()`, + `optional.ofNonZeroValue("hello") // optional.of('hello')`), UnaryBinding(func(value ref.Val) ref.Val { v, isZeroer := value.(traits.Zeroer) if !isZeroer || !v.IsZeroValue() { @@ -330,18 +453,26 @@ func (lib *optionalLib) CompileOptions() []EnvOption { return types.OptionalNone }))), Function(optionalNoneFunc, + FunctionDocs(`singleton value representing an optional without a value`), Overload("optional_none", []*Type{}, optionalTypeV, + OverloadExamples(`optional.none()`), FunctionBinding(func(values ...ref.Val) ref.Val { return types.OptionalNone }))), Function(valueFunc, + FunctionDocs(`obtain the value contained by the optional, error if optional.none()`), MemberOverload("optional_value", []*Type{optionalTypeV}, paramTypeV, + OverloadExamples( + `optional.of(1).value() // 1`, + `optional.none().value() // error`), UnaryBinding(func(value ref.Val) ref.Val { opt := value.(*types.Optional) return opt.GetValue() }))), Function(hasValueFunc, + FunctionDocs(`determine whether the optional contains a value`), MemberOverload("optional_hasValue", []*Type{optionalTypeV}, BoolType, + OverloadExamples(`optional.of({1: 2}).hasValue() // true`), UnaryBinding(func(value ref.Val) ref.Val { opt := value.(*types.Optional) return types.Bool(opt.HasValue()) @@ -350,21 +481,43 @@ func (lib *optionalLib) CompileOptions() []EnvOption { // Implementation of 'or' and 'orValue' are special-cased to support short-circuiting in the // evaluation chain. Function("or", - MemberOverload("optional_or_optional", []*Type{optionalTypeV, optionalTypeV}, optionalTypeV)), + FunctionDocs(`chain optional expressions together, picking the first valued optional expression`), + MemberOverload("optional_or_optional", []*Type{optionalTypeV, optionalTypeV}, optionalTypeV, + OverloadExamples( + `optional.none().or(optional.of(1)) // optional.of(1)`, + common.MultilineDescription( + `// either a value from the first list, a value from the second, or optional.none()`, + `[1, 2, 3][?x].or([3, 4, 5][?y])`)))), Function("orValue", - MemberOverload("optional_orValue_value", []*Type{optionalTypeV, paramTypeV}, paramTypeV)), + FunctionDocs(`chain optional expressions together picking the first valued optional or the default value`), + MemberOverload("optional_orValue_value", []*Type{optionalTypeV, paramTypeV}, paramTypeV, + OverloadExamples( + common.MultilineDescription( + `// pick the value for the given key if the key exists, otherwise return 'you'`, + `{'hello': 'world', 'goodbye': 'cruel world'}[?greeting].orValue('you')`)))), // OptSelect is handled specially by the type-checker, so the receiver's field type is used to determine the // optput type. Function(operators.OptSelect, - Overload("select_optional_field", []*Type{DynType, StringType}, optionalTypeV)), + FunctionDocs(`if the field is present create an optional of the field value, otherwise return optional.none()`), + Overload("select_optional_field", []*Type{DynType, StringType}, optionalTypeV, + OverloadExamples( + `msg.?field // optional.of(field) if non-empty, otherwise optional.none()`, + `msg.?field.?nested_field // optional.of(nested_field) if both field and nested_field are non-empty.`))), // OptIndex is handled mostly like any other indexing operation on a list or map, so the type-checker can use // these signatures to determine type-agreement without any special handling. Function(operators.OptIndex, - Overload("list_optindex_optional_int", []*Type{listTypeV, IntType}, optionalTypeV), + FunctionDocs(`if the index is present create an optional of the field value, otherwise return optional.none()`), + Overload("list_optindex_optional_int", []*Type{listTypeV, IntType}, optionalTypeV, + OverloadExamples(`[1, 2, 3][?x] // element value if x is in the list size, else optional.none()`)), Overload("optional_list_optindex_optional_int", []*Type{OptionalType(listTypeV), IntType}, optionalTypeV), - Overload("map_optindex_optional_value", []*Type{mapTypeKV, paramTypeK}, optionalTypeV), + Overload("map_optindex_optional_value", []*Type{mapTypeKV, paramTypeK}, optionalTypeV, + OverloadExamples( + `map_value[?key] // value at the key if present, else optional.none()`, + common.MultilineDescription( + `// map key-value if index is a valid map key, else optional.none()`, + `{0: 2, 2: 4, 6: 8}[?index]`))), Overload("optional_map_optindex_optional_value", []*Type{OptionalType(mapTypeKV), paramTypeK}, optionalTypeV)), // Index overloads to accommodate using an optional value as the operand. @@ -373,8 +526,65 @@ func (lib *optionalLib) CompileOptions() []EnvOption { Overload("optional_map_index_value", []*Type{OptionalType(mapTypeKV), paramTypeK}, optionalTypeV)), } if lib.version >= 1 { - opts = append(opts, Macros(ReceiverMacro(optFlatMapMacro, 2, optFlatMap))) + opts = append(opts, Macros(ReceiverMacro(optFlatMapMacro, 2, optFlatMap, + MacroDocs(`perform computation on the value if present and produce an optional value within the computation`), + MacroExamples( + common.MultilineDescription( + `// m = {'key': {}}`, + `m.?key.optFlatMap(k, k.?subkey) // optional.none()`), + common.MultilineDescription( + `// m = {'key': {'subkey': 'value'}}`, + `m.?key.optFlatMap(k, k.?subkey) // optional.of('value')`), + )))) + } + + if lib.version >= 2 { + opts = append(opts, Function("last", + FunctionDocs(`return the last value in a list if present, otherwise optional.none()`), + MemberOverload("list_last", []*Type{listTypeV}, optionalTypeV, + OverloadExamples( + `[].last() // optional.none()`, + `[1, 2, 3].last() ? optional.of(3)`), + UnaryBinding(func(v ref.Val) ref.Val { + list := v.(traits.Lister) + sz := list.Size().(types.Int) + if sz == types.IntZero { + return types.OptionalNone + } + return types.OptionalOf(list.Get(types.Int(sz - 1))) + }), + ), + )) + + opts = append(opts, Function("first", + FunctionDocs(`return the first value in a list if present, otherwise optional.none()`), + MemberOverload("list_first", []*Type{listTypeV}, optionalTypeV, + OverloadExamples( + `[].first() // optional.none()`, + `[1, 2, 3].first() ? optional.of(1)`), + UnaryBinding(func(v ref.Val) ref.Val { + list := v.(traits.Lister) + sz := list.Size().(types.Int) + if sz == types.IntZero { + return types.OptionalNone + } + return types.OptionalOf(list.Get(types.Int(0))) + }), + ), + )) + + opts = append(opts, Function(optionalUnwrapFunc, + FunctionDocs(`convert a list of optional values to a list containing only value which are not optional.none()`), + Overload("optional_unwrap", []*Type{listOptionalTypeV}, listTypeV, + OverloadExamples(`optional.unwrap([optional.of(1), optional.none()]) // [1]`), + UnaryBinding(optUnwrap)))) + opts = append(opts, Function(unwrapOptFunc, + FunctionDocs(`convert a list of optional values to a list containing only value which are not optional.none()`), + MemberOverload("optional_unwrapOpt", []*Type{listOptionalTypeV}, listTypeV, + OverloadExamples(`[optional.of(1), optional.none()].unwrapOpt() // [1]`), + UnaryBinding(optUnwrap)))) } + return opts } @@ -385,6 +595,11 @@ func (lib *optionalLib) ProgramOptions() []ProgramOption { } } +// Version returns the current version of the library. +func (lib *optionalLib) Version() uint32 { + return lib.version +} + func optMap(meh MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Expr, *Error) { varIdent := args[0] varName := "" @@ -439,6 +654,23 @@ func optFlatMap(meh MacroExprFactory, target ast.Expr, args []ast.Expr) (ast.Exp ), nil } +func optUnwrap(value ref.Val) ref.Val { + list := value.(traits.Lister) + var unwrappedList []ref.Val + iter := list.Iterator() + for iter.HasNext() == types.True { + val := iter.Next() + opt, isOpt := val.(*types.Optional) + if !isOpt { + return types.WrapErr(fmt.Errorf("value %v is not optional", val)) + } + if opt.HasValue() { + unwrappedList = append(unwrappedList, opt.GetValue()) + } + } + return types.DefaultTypeAdapter.NativeToValue(unwrappedList) +} + func enableOptionalSyntax() EnvOption { return func(e *Env) (*Env, error) { e.prsrOpts = append(e.prsrOpts, parser.EnableOptionalSyntax(true)) @@ -541,250 +773,99 @@ func (opt *evalOptionalOrValue) Eval(ctx interpreter.Activation) ref.Val { return opt.rhs.Eval(ctx) } -type timeUTCLibrary struct{} +type timeLegacyLibrary struct{} -func (timeUTCLibrary) CompileOptions() []EnvOption { +func (timeLegacyLibrary) CompileOptions() []EnvOption { return timeOverloadDeclarations } -func (timeUTCLibrary) ProgramOptions() []ProgramOption { +func (timeLegacyLibrary) ProgramOptions() []ProgramOption { return []ProgramOption{} } // Declarations and functions which enable using UTC on time.Time inputs when the timezone is unspecified // in the CEL expression. var ( - utcTZ = types.String("UTC") - timeOverloadDeclarations = []EnvOption{ - Function(overloads.TimeGetHours, - MemberOverload(overloads.DurationToHours, []*Type{DurationType}, IntType, - UnaryBinding(types.DurationGetHours))), - Function(overloads.TimeGetMinutes, - MemberOverload(overloads.DurationToMinutes, []*Type{DurationType}, IntType, - UnaryBinding(types.DurationGetMinutes))), - Function(overloads.TimeGetSeconds, - MemberOverload(overloads.DurationToSeconds, []*Type{DurationType}, IntType, - UnaryBinding(types.DurationGetSeconds))), - Function(overloads.TimeGetMilliseconds, - MemberOverload(overloads.DurationToMilliseconds, []*Type{DurationType}, IntType, - UnaryBinding(types.DurationGetMilliseconds))), Function(overloads.TimeGetFullYear, MemberOverload(overloads.TimestampToYear, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetFullYear(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetFullYear, overloads.TimestampToYear, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToYearWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetFullYear), - ), ), Function(overloads.TimeGetMonth, MemberOverload(overloads.TimestampToMonth, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetMonth(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetMonth, overloads.TimestampToMonth, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToMonthWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetMonth), - ), ), Function(overloads.TimeGetDayOfYear, MemberOverload(overloads.TimestampToDayOfYear, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetDayOfYear(ts, utcTZ) - }), - ), - MemberOverload(overloads.TimestampToDayOfYearWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(func(ts, tz ref.Val) ref.Val { - return timestampGetDayOfYear(ts, tz) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetDayOfYear, overloads.TimestampToDayOfYear, []ref.Val{}) }), ), ), Function(overloads.TimeGetDayOfMonth, MemberOverload(overloads.TimestampToDayOfMonthZeroBased, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetDayOfMonthZeroBased(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetDayOfMonth, overloads.TimestampToDayOfMonthZeroBased, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToDayOfMonthZeroBasedWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetDayOfMonthZeroBased), - ), ), Function(overloads.TimeGetDate, MemberOverload(overloads.TimestampToDayOfMonthOneBased, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetDayOfMonthOneBased(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetDate, overloads.TimestampToDayOfMonthOneBased, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToDayOfMonthOneBasedWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetDayOfMonthOneBased), - ), ), Function(overloads.TimeGetDayOfWeek, MemberOverload(overloads.TimestampToDayOfWeek, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetDayOfWeek(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetDayOfWeek, overloads.TimestampToDayOfWeek, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToDayOfWeekWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetDayOfWeek), - ), ), Function(overloads.TimeGetHours, MemberOverload(overloads.TimestampToHours, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetHours(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetHours, overloads.TimestampToHours, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToHoursWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetHours), - ), ), Function(overloads.TimeGetMinutes, MemberOverload(overloads.TimestampToMinutes, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetMinutes(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetMinutes, overloads.TimestampToMinutes, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToMinutesWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetMinutes), - ), ), Function(overloads.TimeGetSeconds, MemberOverload(overloads.TimestampToSeconds, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetSeconds(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetSeconds, overloads.TimestampToSeconds, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToSecondsWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetSeconds), - ), ), Function(overloads.TimeGetMilliseconds, MemberOverload(overloads.TimestampToMilliseconds, []*Type{TimestampType}, IntType, UnaryBinding(func(ts ref.Val) ref.Val { - return timestampGetMilliseconds(ts, utcTZ) + t := ts.(types.Timestamp) + return t.Receive(overloads.TimeGetMilliseconds, overloads.TimestampToMilliseconds, []ref.Val{}) }), ), - MemberOverload(overloads.TimestampToMillisecondsWithTz, []*Type{TimestampType, StringType}, IntType, - BinaryBinding(timestampGetMilliseconds), - ), ), } ) - -func timestampGetFullYear(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Year()) -} - -func timestampGetMonth(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - // CEL spec indicates that the month should be 0-based, but the Time value - // for Month() is 1-based. - return types.Int(t.Month() - 1) -} - -func timestampGetDayOfYear(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.YearDay() - 1) -} - -func timestampGetDayOfMonthZeroBased(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Day() - 1) -} - -func timestampGetDayOfMonthOneBased(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Day()) -} - -func timestampGetDayOfWeek(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Weekday()) -} - -func timestampGetHours(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Hour()) -} - -func timestampGetMinutes(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Minute()) -} - -func timestampGetSeconds(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Second()) -} - -func timestampGetMilliseconds(ts, tz ref.Val) ref.Val { - t, err := inTimeZone(ts, tz) - if err != nil { - return types.NewErr(err.Error()) - } - return types.Int(t.Nanosecond() / 1000000) -} - -func inTimeZone(ts, tz ref.Val) (time.Time, error) { - t := ts.(types.Timestamp) - val := string(tz.(types.String)) - ind := strings.Index(val, ":") - if ind == -1 { - loc, err := time.LoadLocation(val) - if err != nil { - return time.Time{}, err - } - return t.In(loc), nil - } - - // If the input is not the name of a timezone (for example, 'US/Central'), it should be a numerical offset from UTC - // in the format ^(+|-)(0[0-9]|1[0-4]):[0-5][0-9]$. The numerical input is parsed in terms of hours and minutes. - hr, err := strconv.Atoi(string(val[0:ind])) - if err != nil { - return time.Time{}, err - } - min, err := strconv.Atoi(string(val[ind+1:])) - if err != nil { - return time.Time{}, err - } - var offset int - if string(val[0]) == "-" { - offset = hr*60 - min - } else { - offset = hr*60 + min - } - secondsEastOfUTC := int((time.Duration(offset) * time.Minute).Seconds()) - timezone := time.FixedZone("", secondsEastOfUTC) - return t.In(timezone), nil -} diff --git a/vendor/github.com/google/cel-go/cel/macro.go b/vendor/github.com/google/cel-go/cel/macro.go index 4db1fd57a9..3d3c5be1b7 100644 --- a/vendor/github.com/google/cel-go/cel/macro.go +++ b/vendor/github.com/google/cel-go/cel/macro.go @@ -142,24 +142,38 @@ type MacroExprHelper interface { NewError(exprID int64, message string) *Error } +// MacroOpt defines a functional option for configuring macro behavior. +type MacroOpt = parser.MacroOpt + +// MacroDocs configures a list of strings into a multiline description for the macro. +func MacroDocs(docs ...string) MacroOpt { + return parser.MacroDocs(docs...) +} + +// MacroExamples configures a list of examples, either as a string or common.MultilineString, +// into an example set to be provided with the macro Documentation() call. +func MacroExamples(examples ...string) MacroOpt { + return parser.MacroExamples(examples...) +} + // GlobalMacro creates a Macro for a global function with the specified arg count. -func GlobalMacro(function string, argCount int, factory MacroFactory) Macro { - return parser.NewGlobalMacro(function, argCount, factory) +func GlobalMacro(function string, argCount int, factory MacroFactory, opts ...MacroOpt) Macro { + return parser.NewGlobalMacro(function, argCount, factory, opts...) } // ReceiverMacro creates a Macro for a receiver function matching the specified arg count. -func ReceiverMacro(function string, argCount int, factory MacroFactory) Macro { - return parser.NewReceiverMacro(function, argCount, factory) +func ReceiverMacro(function string, argCount int, factory MacroFactory, opts ...MacroOpt) Macro { + return parser.NewReceiverMacro(function, argCount, factory, opts...) } // GlobalVarArgMacro creates a Macro for a global function with a variable arg count. -func GlobalVarArgMacro(function string, factory MacroFactory) Macro { - return parser.NewGlobalVarArgMacro(function, factory) +func GlobalVarArgMacro(function string, factory MacroFactory, opts ...MacroOpt) Macro { + return parser.NewGlobalVarArgMacro(function, factory, opts...) } // ReceiverVarArgMacro creates a Macro for a receiver function matching a variable arg count. -func ReceiverVarArgMacro(function string, factory MacroFactory) Macro { - return parser.NewReceiverVarArgMacro(function, factory) +func ReceiverVarArgMacro(function string, factory MacroFactory, opts ...MacroOpt) Macro { + return parser.NewReceiverVarArgMacro(function, factory, opts...) } // NewGlobalMacro creates a Macro for a global function with the specified arg count. diff --git a/vendor/github.com/google/cel-go/cel/options.go b/vendor/github.com/google/cel-go/cel/options.go index 69c6942634..fee67323c8 100644 --- a/vendor/github.com/google/cel-go/cel/options.go +++ b/vendor/github.com/google/cel-go/cel/options.go @@ -15,6 +15,7 @@ package cel import ( + "errors" "fmt" "google.golang.org/protobuf/proto" @@ -25,6 +26,8 @@ import ( "github.com/google/cel-go/checker" "github.com/google/cel-go/common/containers" + "github.com/google/cel-go/common/decls" + "github.com/google/cel-go/common/env" "github.com/google/cel-go/common/functions" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/pb" @@ -65,8 +68,31 @@ const ( // Enable error generation when a presence test or optional field selection is // performed on a primitive type. featureEnableErrorOnBadPresenceTest + + // Enable escape syntax for field identifiers (`). + featureIdentEscapeSyntax ) +var featureIDsToNames = map[int]string{ + featureEnableMacroCallTracking: "cel.feature.macro_call_tracking", + featureCrossTypeNumericComparisons: "cel.feature.cross_type_numeric_comparisons", + featureIdentEscapeSyntax: "cel.feature.backtick_escape_syntax", +} + +func featureNameByID(id int) (string, bool) { + name, found := featureIDsToNames[id] + return name, found +} + +func featureIDByName(name string) (int, bool) { + for id, n := range featureIDsToNames { + if n == name { + return id, true + } + } + return 0, false +} + // EnvOption is a functional interface for configuring the environment. type EnvOption func(e *Env) (*Env, error) @@ -109,6 +135,8 @@ func CustomTypeProvider(provider any) EnvOption { // Note: Declarations will by default be appended to the pre-existing declaration set configured // for the environment. The NewEnv call builds on top of the standard CEL declarations. For a // purely custom set of declarations use NewCustomEnv. +// +// Deprecated: use FunctionDecls and VariableDecls or FromConfig instead. func Declarations(decls ...*exprpb.Decl) EnvOption { declOpts := []EnvOption{} var err error @@ -376,7 +404,7 @@ type ProgramOption func(p *prog) (*prog, error) // InterpretableDecorators can be used to inspect, alter, or replace the Program plan. func CustomDecorator(dec interpreter.InterpretableDecorator) ProgramOption { return func(p *prog) (*prog, error) { - p.decorators = append(p.decorators, dec) + p.plannerOptions = append(p.plannerOptions, interpreter.CustomDecorator(dec)) return p, nil } } @@ -398,10 +426,10 @@ func Functions(funcs ...*functions.Overload) ProgramOption { // variables with the same name provided to the Eval() call. If Globals is used in a Library with // a Lib EnvOption, vars may shadow variables provided by previously added libraries. // -// The vars value may either be an `interpreter.Activation` instance or a `map[string]any`. +// The vars value may either be an `cel.Activation` instance or a `map[string]any`. func Globals(vars any) ProgramOption { return func(p *prog) (*prog, error) { - defaultVars, err := interpreter.NewActivation(vars) + defaultVars, err := NewActivation(vars) if err != nil { return nil, err } @@ -423,6 +451,174 @@ func OptimizeRegex(regexOptimizations ...*interpreter.RegexOptimization) Program } } +// ConfigOptionFactory declares a signature which accepts a configuration element, e.g. env.Extension +// and optionally produces an EnvOption in response. +// +// If there are multiple ConfigOptionFactory values which could apply to the same configuration node +// the first one that returns an EnvOption and a `true` response will be used, and the config node +// will not be passed along to any other option factory. +// +// Only the *env.Extension type is provided at this time, but validators, optimizers, and other tuning +// parameters may be supported in the future. +type ConfigOptionFactory func(any) (EnvOption, bool) + +// FromConfig produces and applies a set of EnvOption values derived from an env.Config object. +// +// For configuration elements which refer to features outside of the `cel` package, an optional set of +// ConfigOptionFactory values may be passed in to support the conversion from static configuration to +// configured cel.Env value. +// +// Note: disabling the standard library will clear the EnvOptions values previously set for the +// environment with the exception of propagating types and adapters over to the new environment. +// +// Note: to support custom types referenced in the configuration file, you must ensure that one of +// the following options appears before the FromConfig option: Types, TypeDescs, or CustomTypeProvider +// as the type provider configured at the time when the config is processed is the one used to derive +// type references from the configuration. +func FromConfig(config *env.Config, optFactories ...ConfigOptionFactory) EnvOption { + return func(e *Env) (*Env, error) { + if err := config.Validate(); err != nil { + return nil, err + } + opts, err := configToEnvOptions(config, e.CELTypeProvider(), optFactories) + if err != nil { + return nil, err + } + for _, o := range opts { + e, err = o(e) + if err != nil { + return nil, err + } + } + return e, nil + } +} + +// configToEnvOptions generates a set of EnvOption values (or error) based on a config, a type provider, +// and an optional set of environment options. +func configToEnvOptions(config *env.Config, provider types.Provider, optFactories []ConfigOptionFactory) ([]EnvOption, error) { + envOpts := []EnvOption{} + // Configure the standard lib subset. + if config.StdLib != nil { + envOpts = append(envOpts, func(e *Env) (*Env, error) { + if e.HasLibrary("cel.lib.std") { + return nil, errors.New("invalid subset of stdlib: create a custom env") + } + return e, nil + }) + if !config.StdLib.Disabled { + envOpts = append(envOpts, StdLib(StdLibSubset(config.StdLib))) + } + } else { + envOpts = append(envOpts, StdLib()) + } + + // Configure the container + if config.Container != "" { + envOpts = append(envOpts, Container(config.Container)) + } + + // Configure abbreviations + for _, imp := range config.Imports { + envOpts = append(envOpts, Abbrevs(imp.Name)) + } + + // Configure the context variable declaration + if config.ContextVariable != nil { + typeName := config.ContextVariable.TypeName + if _, found := provider.FindStructType(typeName); !found { + return nil, fmt.Errorf("invalid context proto type: %q", typeName) + } + // Attempt to instantiate the proto in order to reflect to its descriptor + msg := provider.NewValue(typeName, map[string]ref.Val{}) + pbMsg, ok := msg.Value().(proto.Message) + if !ok { + return nil, fmt.Errorf("unsupported context type: %T", msg.Value()) + } + envOpts = append(envOpts, DeclareContextProto(pbMsg.ProtoReflect().Descriptor())) + } + + // Configure variables + if len(config.Variables) != 0 { + vars := make([]*decls.VariableDecl, 0, len(config.Variables)) + for _, v := range config.Variables { + vDef, err := v.AsCELVariable(provider) + if err != nil { + return nil, err + } + vars = append(vars, vDef) + } + envOpts = append(envOpts, VariableDecls(vars...)) + } + + // Configure functions + if len(config.Functions) != 0 { + funcs := make([]*decls.FunctionDecl, 0, len(config.Functions)) + for _, f := range config.Functions { + fnDef, err := f.AsCELFunction(provider) + if err != nil { + return nil, err + } + funcs = append(funcs, fnDef) + } + envOpts = append(envOpts, FunctionDecls(funcs...)) + } + + // Configure features + for _, feat := range config.Features { + // Note, if a feature is not found, it is skipped as it is possible the feature + // is not intended to be supported publicly. In the future, a refinement of + // to this strategy to report unrecognized features and validators should probably + // be covered as a standard ConfigOptionFactory + if id, found := featureIDByName(feat.Name); found { + envOpts = append(envOpts, features(id, feat.Enabled)) + } + } + + // Configure validators + for _, val := range config.Validators { + if fac, found := astValidatorFactories[val.Name]; found { + envOpts = append(envOpts, func(e *Env) (*Env, error) { + validator, err := fac(val) + if err != nil { + return nil, fmt.Errorf("%w", err) + } + return ASTValidators(validator)(e) + }) + } else if opt, handled := handleExtendedConfigOption(val, optFactories); handled { + envOpts = append(envOpts, opt) + } + // we don't error when the validator isn't found as it may be part + // of an extension library and enabled implicitly. + } + + // Configure extensions + for _, ext := range config.Extensions { + // version number has been validated by the call to `Validate` + ver, _ := ext.VersionNumber() + if ext.Name == "optional" { + envOpts = append(envOpts, OptionalTypes(OptionalTypesVersion(ver))) + } else { + opt, handled := handleExtendedConfigOption(ext, optFactories) + if !handled { + return nil, fmt.Errorf("unrecognized extension: %s", ext.Name) + } + envOpts = append(envOpts, opt) + } + } + + return envOpts, nil +} + +func handleExtendedConfigOption(conf any, optFactories []ConfigOptionFactory) (EnvOption, bool) { + for _, optFac := range optFactories { + if opt, useOption := optFac(conf); useOption { + return opt, true + } + } + return nil, false +} + // EvalOption indicates an evaluation option that may affect the evaluation behavior or information // in the output result. type EvalOption int @@ -531,7 +727,7 @@ func fieldToCELType(field protoreflect.FieldDescriptor) (*Type, error) { return nil, fmt.Errorf("field %s type %s not implemented", field.FullName(), field.Kind().String()) } -func fieldToVariable(field protoreflect.FieldDescriptor) (EnvOption, error) { +func fieldToVariable(field protoreflect.FieldDescriptor) (*decls.VariableDecl, error) { name := string(field.Name()) if field.IsMap() { mapKey := field.MapKey() @@ -544,20 +740,20 @@ func fieldToVariable(field protoreflect.FieldDescriptor) (EnvOption, error) { if err != nil { return nil, err } - return Variable(name, MapType(keyType, valueType)), nil + return decls.NewVariable(name, MapType(keyType, valueType)), nil } if field.IsList() { elemType, err := fieldToCELType(field) if err != nil { return nil, err } - return Variable(name, ListType(elemType)), nil + return decls.NewVariable(name, ListType(elemType)), nil } celType, err := fieldToCELType(field) if err != nil { return nil, err } - return Variable(name, celType), nil + return decls.NewVariable(name, celType), nil } // DeclareContextProto returns an option to extend CEL environment with declarations from the given context proto. @@ -565,17 +761,25 @@ func fieldToVariable(field protoreflect.FieldDescriptor) (EnvOption, error) { // https://github.com/google/cel-spec/blob/master/doc/langdef.md#evaluation-environment func DeclareContextProto(descriptor protoreflect.MessageDescriptor) EnvOption { return func(e *Env) (*Env, error) { + if e.contextProto != nil { + return nil, fmt.Errorf("context proto already declared as %q, got %q", + e.contextProto.FullName(), descriptor.FullName()) + } + e.contextProto = descriptor fields := descriptor.Fields() + vars := make([]*decls.VariableDecl, 0, fields.Len()) for i := 0; i < fields.Len(); i++ { field := fields.Get(i) variable, err := fieldToVariable(field) if err != nil { return nil, err } - e, err = variable(e) - if err != nil { - return nil, err - } + vars = append(vars, variable) + } + var err error + e, err = VariableDecls(vars...)(e) + if err != nil { + return nil, err } return Types(dynamicpb.NewMessage(descriptor))(e) } @@ -585,7 +789,7 @@ func DeclareContextProto(descriptor protoreflect.MessageDescriptor) EnvOption { // // Consider using with `DeclareContextProto` to simplify variable type declarations and publishing when using // protocol buffers. -func ContextProtoVars(ctx proto.Message) (interpreter.Activation, error) { +func ContextProtoVars(ctx proto.Message) (Activation, error) { if ctx == nil || !ctx.ProtoReflect().IsValid() { return interpreter.EmptyActivation(), nil } @@ -609,7 +813,7 @@ func ContextProtoVars(ctx proto.Message) (interpreter.Activation, error) { } vars[field.TextName()] = fieldVal } - return interpreter.NewActivation(vars) + return NewActivation(vars) } // EnableMacroCallTracking ensures that call expressions which are replaced by macros @@ -618,6 +822,12 @@ func EnableMacroCallTracking() EnvOption { return features(featureEnableMacroCallTracking, true) } +// EnableIdentifierEscapeSyntax enables identifier escaping (`) syntax for +// fields. +func EnableIdentifierEscapeSyntax() EnvOption { + return features(featureIdentEscapeSyntax, true) +} + // CrossTypeNumericComparisons makes it possible to compare across numeric types, e.g. double < int func CrossTypeNumericComparisons(enabled bool) EnvOption { return features(featureCrossTypeNumericComparisons, enabled) @@ -655,6 +865,15 @@ func ParserExpressionSizeLimit(limit int) EnvOption { } } +// EnableHiddenAccumulatorName sets the parser to use the identifier '@result' for accumulators +// which is not normally accessible from CEL source. +func EnableHiddenAccumulatorName(enabled bool) EnvOption { + return func(e *Env) (*Env, error) { + e.prsrOpts = append(e.prsrOpts, parser.EnableHiddenAccumulatorName(enabled)) + return e, nil + } +} + func maybeInteropProvider(provider any) (types.Provider, error) { switch p := provider.(type) { case types.Provider: diff --git a/vendor/github.com/google/cel-go/cel/program.go b/vendor/github.com/google/cel-go/cel/program.go index 49bd537838..ec3869bdb4 100644 --- a/vendor/github.com/google/cel-go/cel/program.go +++ b/vendor/github.com/google/cel-go/cel/program.go @@ -20,6 +20,7 @@ import ( "sync" "github.com/google/cel-go/common/ast" + "github.com/google/cel-go/common/functions" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/interpreter" @@ -29,7 +30,7 @@ import ( type Program interface { // Eval returns the result of an evaluation of the Ast and environment against the input vars. // - // The vars value may either be an `interpreter.Activation` or a `map[string]any`. + // The vars value may either be an `Activation` or a `map[string]any`. // // If the `OptTrackState`, `OptTrackCost` or `OptExhaustiveEval` flags are used, the `details` response will // be non-nil. Given this caveat on `details`, the return state from evaluation will be: @@ -47,14 +48,39 @@ type Program interface { // to support cancellation and timeouts. This method must be used in conjunction with the // InterruptCheckFrequency() option for cancellation interrupts to be impact evaluation. // - // The vars value may either be an `interpreter.Activation` or `map[string]any`. + // The vars value may either be an `Activation` or `map[string]any`. // // The output contract for `ContextEval` is otherwise identical to the `Eval` method. ContextEval(context.Context, any) (ref.Val, *EvalDetails, error) } +// Activation used to resolve identifiers by name and references by id. +// +// An Activation is the primary mechanism by which a caller supplies input into a CEL program. +type Activation = interpreter.Activation + +// NewActivation returns an activation based on a map-based binding where the map keys are +// expected to be qualified names used with ResolveName calls. +// +// The input `bindings` may either be of type `Activation` or `map[string]any`. +// +// Lazy bindings may be supplied within the map-based input in either of the following forms: +// - func() any +// - func() ref.Val +// +// The output of the lazy binding will overwrite the variable reference in the internal map. +// +// Values which are not represented as ref.Val types on input may be adapted to a ref.Val using +// the types.Adapter configured in the environment. +func NewActivation(bindings any) (Activation, error) { + return interpreter.NewActivation(bindings) +} + +// PartialActivation extends the Activation interface with a set of unknown AttributePatterns. +type PartialActivation = interpreter.PartialActivation + // NoVars returns an empty Activation. -func NoVars() interpreter.Activation { +func NoVars() Activation { return interpreter.EmptyActivation() } @@ -64,10 +90,9 @@ func NoVars() interpreter.Activation { // This method relies on manually configured sets of missing attribute patterns. For a method which // infers the missing variables from the input and the configured environment, use Env.PartialVars(). // -// The `vars` value may either be an interpreter.Activation or any valid input to the -// interpreter.NewActivation call. +// The `vars` value may either be an Activation or any valid input to the NewActivation call. func PartialVars(vars any, - unknowns ...*interpreter.AttributePattern) (interpreter.PartialActivation, error) { + unknowns ...*AttributePatternType) (PartialActivation, error) { return interpreter.NewPartialActivation(vars, unknowns...) } @@ -84,12 +109,15 @@ func PartialVars(vars any, // fully qualified variable name may be `ns.app.a`, `ns.a`, or `a` per the CEL namespace resolution // rules. Pick the fully qualified variable name that makes sense within the container as the // AttributePattern `varName` argument. +func AttributePattern(varName string) *AttributePatternType { + return interpreter.NewAttributePattern(varName) +} + +// AttributePatternType represents a top-level variable with an optional set of qualifier patterns. // // See the interpreter.AttributePattern and interpreter.AttributeQualifierPattern for more info // about how to create and manipulate AttributePattern values. -func AttributePattern(varName string) *interpreter.AttributePattern { - return interpreter.NewAttributePattern(varName) -} +type AttributePatternType = interpreter.AttributePattern // EvalDetails holds additional information observed during the Eval() call. type EvalDetails struct { @@ -120,37 +148,24 @@ func (ed *EvalDetails) ActualCost() *uint64 { type prog struct { *Env evalOpts EvalOption - defaultVars interpreter.Activation + defaultVars Activation dispatcher interpreter.Dispatcher interpreter interpreter.Interpreter interruptCheckFrequency uint // Intermediate state used to configure the InterpretableDecorator set provided // to the initInterpretable call. - decorators []interpreter.InterpretableDecorator + plannerOptions []interpreter.PlannerOption regexOptimizations []*interpreter.RegexOptimization // Interpretable configured from an Ast and aggregate decorator set based on program options. interpretable interpreter.Interpretable + observable *interpreter.ObservableInterpretable callCostEstimator interpreter.ActualCostEstimator costOptions []interpreter.CostTrackerOption costLimit *uint64 } -func (p *prog) clone() *prog { - costOptsCopy := make([]interpreter.CostTrackerOption, len(p.costOptions)) - copy(costOptsCopy, p.costOptions) - - return &prog{ - Env: p.Env, - evalOpts: p.evalOpts, - defaultVars: p.defaultVars, - dispatcher: p.dispatcher, - interpreter: p.interpreter, - interruptCheckFrequency: p.interruptCheckFrequency, - } -} - // newProgram creates a program instance with an environment, an ast, and an optional list of // ProgramOption values. // @@ -162,10 +177,10 @@ func newProgram(e *Env, a *ast.AST, opts []ProgramOption) (Program, error) { // Ensure the default attribute factory is set after the adapter and provider are // configured. p := &prog{ - Env: e, - decorators: []interpreter.InterpretableDecorator{}, - dispatcher: disp, - costOptions: []interpreter.CostTrackerOption{}, + Env: e, + plannerOptions: []interpreter.PlannerOption{}, + dispatcher: disp, + costOptions: []interpreter.CostTrackerOption{}, } // Configure the program via the ProgramOption values. @@ -177,16 +192,25 @@ func newProgram(e *Env, a *ast.AST, opts []ProgramOption) (Program, error) { } } - // Add the function bindings created via Function() options. - for _, fn := range e.functions { - bindings, err := fn.Bindings() - if err != nil { - return nil, err - } - err = disp.Add(bindings...) - if err != nil { - return nil, err + e.funcBindOnce.Do(func() { + var bindings []*functions.Overload + e.functionBindings = []*functions.Overload{} + for _, fn := range e.functions { + bindings, err = fn.Bindings() + if err != nil { + return + } + e.functionBindings = append(e.functionBindings, bindings...) } + }) + if err != nil { + return nil, err + } + + // Add the function bindings created via Function() options. + err = disp.Add(e.functionBindings...) + if err != nil { + return nil, err } // Set the attribute factory after the options have been set. @@ -203,74 +227,71 @@ func newProgram(e *Env, a *ast.AST, opts []ProgramOption) (Program, error) { p.interpreter = interp // Translate the EvalOption flags into InterpretableDecorator instances. - decorators := make([]interpreter.InterpretableDecorator, len(p.decorators)) - copy(decorators, p.decorators) + plannerOptions := make([]interpreter.PlannerOption, len(p.plannerOptions)) + copy(plannerOptions, p.plannerOptions) // Enable interrupt checking if there's a non-zero check frequency if p.interruptCheckFrequency > 0 { - decorators = append(decorators, interpreter.InterruptableEval()) + plannerOptions = append(plannerOptions, interpreter.InterruptableEval()) } // Enable constant folding first. if p.evalOpts&OptOptimize == OptOptimize { - decorators = append(decorators, interpreter.Optimize()) + plannerOptions = append(plannerOptions, interpreter.Optimize()) p.regexOptimizations = append(p.regexOptimizations, interpreter.MatchesRegexOptimization) } // Enable regex compilation of constants immediately after folding constants. if len(p.regexOptimizations) > 0 { - decorators = append(decorators, interpreter.CompileRegexConstants(p.regexOptimizations...)) + plannerOptions = append(plannerOptions, interpreter.CompileRegexConstants(p.regexOptimizations...)) } // Enable exhaustive eval, state tracking and cost tracking last since they require a factory. if p.evalOpts&(OptExhaustiveEval|OptTrackState|OptTrackCost) != 0 { - factory := func(state interpreter.EvalState, costTracker *interpreter.CostTracker) (Program, error) { - costTracker.Estimator = p.callCostEstimator - costTracker.Limit = p.costLimit - for _, costOpt := range p.costOptions { - err := costOpt(costTracker) - if err != nil { - return nil, err - } - } - // Limit capacity to guarantee a reallocation when calling 'append(decs, ...)' below. This - // prevents the underlying memory from being shared between factory function calls causing - // undesired mutations. - decs := decorators[:len(decorators):len(decorators)] - var observers []interpreter.EvalObserver - - if p.evalOpts&(OptExhaustiveEval|OptTrackState) != 0 { - // EvalStateObserver is required for OptExhaustiveEval. - observers = append(observers, interpreter.EvalStateObserver(state)) - } - if p.evalOpts&OptTrackCost == OptTrackCost { - observers = append(observers, interpreter.CostObserver(costTracker)) - } - - // Enable exhaustive eval over a basic observer since it offers a superset of features. - if p.evalOpts&OptExhaustiveEval == OptExhaustiveEval { - decs = append(decs, interpreter.ExhaustiveEval(), interpreter.Observe(observers...)) - } else if len(observers) > 0 { - decs = append(decs, interpreter.Observe(observers...)) - } - - return p.clone().initInterpretable(a, decs) + costOptCount := len(p.costOptions) + if p.costLimit != nil { + costOptCount++ + } + costOpts := make([]interpreter.CostTrackerOption, 0, costOptCount) + costOpts = append(costOpts, p.costOptions...) + if p.costLimit != nil { + costOpts = append(costOpts, interpreter.CostTrackerLimit(*p.costLimit)) + } + trackerFactory := func() (*interpreter.CostTracker, error) { + return interpreter.NewCostTracker(p.callCostEstimator, costOpts...) + } + var observers []interpreter.PlannerOption + if p.evalOpts&(OptExhaustiveEval|OptTrackState) != 0 { + // EvalStateObserver is required for OptExhaustiveEval. + observers = append(observers, interpreter.EvalStateObserver()) + } + if p.evalOpts&OptTrackCost == OptTrackCost { + observers = append(observers, interpreter.CostObserver(interpreter.CostTrackerFactory(trackerFactory))) + } + // Enable exhaustive eval over a basic observer since it offers a superset of features. + if p.evalOpts&OptExhaustiveEval == OptExhaustiveEval { + plannerOptions = append(plannerOptions, + append([]interpreter.PlannerOption{interpreter.ExhaustiveEval()}, observers...)...) + } else if len(observers) > 0 { + plannerOptions = append(plannerOptions, observers...) } - return newProgGen(factory) } - return p.initInterpretable(a, decorators) + return p.initInterpretable(a, plannerOptions) } -func (p *prog) initInterpretable(a *ast.AST, decs []interpreter.InterpretableDecorator) (*prog, error) { +func (p *prog) initInterpretable(a *ast.AST, plannerOptions []interpreter.PlannerOption) (*prog, error) { // When the AST has been exprAST it contains metadata that can be used to speed up program execution. - interpretable, err := p.interpreter.NewInterpretable(a, decs...) + interpretable, err := p.interpreter.NewInterpretable(a, plannerOptions...) if err != nil { return nil, err } p.interpretable = interpretable + if oi, ok := interpretable.(*interpreter.ObservableInterpretable); ok { + p.observable = oi + } return p, nil } // Eval implements the Program interface method. -func (p *prog) Eval(input any) (v ref.Val, det *EvalDetails, err error) { +func (p *prog) Eval(input any) (out ref.Val, det *EvalDetails, err error) { // Configure error recovery for unexpected panics during evaluation. Note, the use of named // return values makes it possible to modify the error response during the recovery // function. @@ -285,9 +306,9 @@ func (p *prog) Eval(input any) (v ref.Val, det *EvalDetails, err error) { } }() // Build a hierarchical activation if there are default vars set. - var vars interpreter.Activation + var vars Activation switch v := input.(type) { - case interpreter.Activation: + case Activation: vars = v case map[string]any: vars = activationPool.Setup(v) @@ -298,12 +319,24 @@ func (p *prog) Eval(input any) (v ref.Val, det *EvalDetails, err error) { if p.defaultVars != nil { vars = interpreter.NewHierarchicalActivation(p.defaultVars, vars) } - v = p.interpretable.Eval(vars) + if p.observable != nil { + det = &EvalDetails{} + out = p.observable.ObserveEval(vars, func(observed any) { + switch o := observed.(type) { + case interpreter.EvalState: + det.state = o + case *interpreter.CostTracker: + det.costTracker = o + } + }) + } else { + out = p.interpretable.Eval(vars) + } // The output of an internal Eval may have a value (`v`) that is a types.Err. This step // translates the CEL value to a Go error response. This interface does not quite match the // RPC signature which allows for multiple errors to be returned, but should be sufficient. - if types.IsError(v) { - err = v.(*types.Err) + if types.IsError(out) { + err = out.(*types.Err) } return } @@ -315,9 +348,9 @@ func (p *prog) ContextEval(ctx context.Context, input any) (ref.Val, *EvalDetail } // Configure the input, making sure to wrap Activation inputs in the special ctxActivation which // exposes the #interrupted variable and manages rate-limited checks of the ctx.Done() state. - var vars interpreter.Activation + var vars Activation switch v := input.(type) { - case interpreter.Activation: + case Activation: vars = ctxActivationPool.Setup(v, ctx.Done(), p.interruptCheckFrequency) defer ctxActivationPool.Put(vars) case map[string]any: @@ -331,90 +364,8 @@ func (p *prog) ContextEval(ctx context.Context, input any) (ref.Val, *EvalDetail return p.Eval(vars) } -// progFactory is a helper alias for marking a program creation factory function. -type progFactory func(interpreter.EvalState, *interpreter.CostTracker) (Program, error) - -// progGen holds a reference to a progFactory instance and implements the Program interface. -type progGen struct { - factory progFactory -} - -// newProgGen tests the factory object by calling it once and returns a factory-based Program if -// the test is successful. -func newProgGen(factory progFactory) (Program, error) { - // Test the factory to make sure that configuration errors are spotted at config - tracker, err := interpreter.NewCostTracker(nil) - if err != nil { - return nil, err - } - _, err = factory(interpreter.NewEvalState(), tracker) - if err != nil { - return nil, err - } - return &progGen{factory: factory}, nil -} - -// Eval implements the Program interface method. -func (gen *progGen) Eval(input any) (ref.Val, *EvalDetails, error) { - // The factory based Eval() differs from the standard evaluation model in that it generates a - // new EvalState instance for each call to ensure that unique evaluations yield unique stateful - // results. - state := interpreter.NewEvalState() - costTracker, err := interpreter.NewCostTracker(nil) - if err != nil { - return nil, nil, err - } - det := &EvalDetails{state: state, costTracker: costTracker} - - // Generate a new instance of the interpretable using the factory configured during the call to - // newProgram(). It is incredibly unlikely that the factory call will generate an error given - // the factory test performed within the Program() call. - p, err := gen.factory(state, costTracker) - if err != nil { - return nil, det, err - } - - // Evaluate the input, returning the result and the 'state' within EvalDetails. - v, _, err := p.Eval(input) - if err != nil { - return v, det, err - } - return v, det, nil -} - -// ContextEval implements the Program interface method. -func (gen *progGen) ContextEval(ctx context.Context, input any) (ref.Val, *EvalDetails, error) { - if ctx == nil { - return nil, nil, fmt.Errorf("context can not be nil") - } - // The factory based Eval() differs from the standard evaluation model in that it generates a - // new EvalState instance for each call to ensure that unique evaluations yield unique stateful - // results. - state := interpreter.NewEvalState() - costTracker, err := interpreter.NewCostTracker(nil) - if err != nil { - return nil, nil, err - } - det := &EvalDetails{state: state, costTracker: costTracker} - - // Generate a new instance of the interpretable using the factory configured during the call to - // newProgram(). It is incredibly unlikely that the factory call will generate an error given - // the factory test performed within the Program() call. - p, err := gen.factory(state, costTracker) - if err != nil { - return nil, det, err - } - - // Evaluate the input, returning the result and the 'state' within EvalDetails. - v, _, err := p.ContextEval(ctx, input) - if err != nil { - return v, det, err - } - return v, det, nil -} - type ctxEvalActivation struct { - parent interpreter.Activation + parent Activation interrupt <-chan struct{} interruptCheckCount uint interruptCheckFrequency uint @@ -438,10 +389,15 @@ func (a *ctxEvalActivation) ResolveName(name string) (any, bool) { return a.parent.ResolveName(name) } -func (a *ctxEvalActivation) Parent() interpreter.Activation { +func (a *ctxEvalActivation) Parent() Activation { return a.parent } +func (a *ctxEvalActivation) AsPartialActivation() (interpreter.PartialActivation, bool) { + pa, ok := a.parent.(interpreter.PartialActivation) + return pa, ok +} + func newCtxEvalActivationPool() *ctxEvalActivationPool { return &ctxEvalActivationPool{ Pool: sync.Pool{ @@ -457,7 +413,7 @@ type ctxEvalActivationPool struct { } // Setup initializes a pooled Activation with the ability check for context.Context cancellation -func (p *ctxEvalActivationPool) Setup(vars interpreter.Activation, done <-chan struct{}, interruptCheckRate uint) *ctxEvalActivation { +func (p *ctxEvalActivationPool) Setup(vars Activation, done <-chan struct{}, interruptCheckRate uint) *ctxEvalActivation { a := p.Pool.Get().(*ctxEvalActivation) a.parent = vars a.interrupt = done @@ -506,8 +462,8 @@ func (a *evalActivation) ResolveName(name string) (any, bool) { } } -// Parent implements the interpreter.Activation interface -func (a *evalActivation) Parent() interpreter.Activation { +// Parent implements the Activation interface +func (a *evalActivation) Parent() Activation { return nil } diff --git a/vendor/github.com/google/cel-go/cel/prompt.go b/vendor/github.com/google/cel-go/cel/prompt.go new file mode 100644 index 0000000000..929a26f91f --- /dev/null +++ b/vendor/github.com/google/cel-go/cel/prompt.go @@ -0,0 +1,155 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cel + +import ( + _ "embed" + "sort" + "strings" + "text/template" + + "github.com/google/cel-go/common" + "github.com/google/cel-go/common/operators" + "github.com/google/cel-go/common/overloads" +) + +//go:embed templates/authoring.tmpl +var authoringPrompt string + +// AuthoringPrompt creates a prompt template from a CEL environment for the purpose of AI-assisted authoring. +func AuthoringPrompt(env *Env) (*Prompt, error) { + funcMap := template.FuncMap{ + "split": func(str string) []string { return strings.Split(str, "\n") }, + } + tmpl := template.New("cel").Funcs(funcMap) + tmpl, err := tmpl.Parse(authoringPrompt) + if err != nil { + return nil, err + } + return &Prompt{ + Persona: defaultPersona, + FormatRules: defaultFormatRules, + GeneralUsage: defaultGeneralUsage, + tmpl: tmpl, + env: env, + }, nil +} + +// Prompt represents the core components of an LLM prompt based on a CEL environment. +// +// All fields of the prompt may be overwritten / modified with support for rendering the +// prompt to a human-readable string. +type Prompt struct { + // Persona indicates something about the kind of user making the request + Persona string + + // FormatRules indicate how the LLM should generate its output + FormatRules string + + // GeneralUsage specifies additional context on how CEL should be used. + GeneralUsage string + + // tmpl is the text template base-configuration for rendering text. + tmpl *template.Template + + // env reference used to collect variables, functions, and macros available to the prompt. + env *Env +} + +type promptInst struct { + *Prompt + + Variables []*common.Doc + Macros []*common.Doc + Functions []*common.Doc + UserPrompt string +} + +// Render renders the user prompt with the associated context from the prompt template +// for use with LLM generators. +func (p *Prompt) Render(userPrompt string) string { + var buffer strings.Builder + vars := make([]*common.Doc, len(p.env.Variables())) + for i, v := range p.env.Variables() { + vars[i] = v.Documentation() + } + sort.SliceStable(vars, func(i, j int) bool { + return vars[i].Name < vars[j].Name + }) + macs := make([]*common.Doc, len(p.env.Macros())) + for i, m := range p.env.Macros() { + macs[i] = m.(common.Documentor).Documentation() + } + funcs := make([]*common.Doc, 0, len(p.env.Functions())) + for _, f := range p.env.Functions() { + if _, hidden := hiddenFunctions[f.Name()]; hidden { + continue + } + funcs = append(funcs, f.Documentation()) + } + sort.SliceStable(funcs, func(i, j int) bool { + return funcs[i].Name < funcs[j].Name + }) + inst := &promptInst{ + Prompt: p, + Variables: vars, + Macros: macs, + Functions: funcs, + UserPrompt: userPrompt} + p.tmpl.Execute(&buffer, inst) + return buffer.String() +} + +const ( + defaultPersona = `You are a software engineer with expertise in networking and application security +authoring boolean Common Expression Language (CEL) expressions to ensure firewall, +networking, authentication, and data access is only permitted when all conditions +are satisfied.` + + defaultFormatRules = `Output your response as a CEL expression. + +Write the expression with the comment on the first line and the expression on the +subsequent lines. Format the expression using 80-character line limits commonly +found in C++ or Java code.` + + defaultGeneralUsage = `CEL supports Protocol Buffer and JSON types, as well as simple types and aggregate types. + +Simple types include bool, bytes, double, int, string, and uint: + +* double literals must always include a decimal point: 1.0, 3.5, -2.2 +* uint literals must be positive values suffixed with a 'u': 42u +* byte literals are strings prefixed with a 'b': b'1235' +* string literals can use either single quotes or double quotes: 'hello', "world" +* string literals can also be treated as raw strings that do not require any + escaping within the string by using the 'R' prefix: R"""quote: "hi" """ + +Aggregate types include list and map: + +* list literals consist of zero or more values between brackets: "['a', 'b', 'c']" +* map literal consist of colon-separated key-value pairs within braces: "{'key1': 1, 'key2': 2}" +* Only int, uint, string, and bool types are valid map keys. +* Maps containing HTTP headers must always use lower-cased string keys. + +Comments start with two-forward slashes followed by text and a newline.` +) + +var ( + hiddenFunctions = map[string]bool{ + overloads.DeprecatedIn: true, + operators.OldIn: true, + operators.OldNotStrictlyFalse: true, + operators.NotStrictlyFalse: true, + } +) diff --git a/vendor/github.com/google/cel-go/cel/templates/authoring.tmpl b/vendor/github.com/google/cel-go/cel/templates/authoring.tmpl new file mode 100644 index 0000000000..d0b0133f15 --- /dev/null +++ b/vendor/github.com/google/cel-go/cel/templates/authoring.tmpl @@ -0,0 +1,60 @@ +{{define "variable"}}{{.Name}} is a {{.Type}}{{if .Description}} + +{{range split .Description}} {{.}} +{{end}} +{{- end -}} +{{- end -}} + +{{define "macro" -}} +{{.Name}} macro{{if .Description}} - {{range split .Description}}{{.}} {{end}} +{{end}} +{{range .Children}}{{range split .Description}} {{.}} +{{end}} +{{- end -}} +{{- end -}} + +{{define "overload" -}} +{{if .Children}}{{range .Children}}{{range split .Description}} {{.}} +{{end}} +{{- end -}} +{{else}} {{.Signature}} +{{end}} +{{- end -}} + +{{define "function" -}} +{{.Name}}{{if .Description}} - {{range split .Description}}{{.}} {{end}} +{{end}} +{{range .Children}}{{template "overload" .}}{{end}} +{{- end -}} + +{{.Persona}} + +{{.FormatRules}} + +{{if or .Variables .Macros .Functions -}} +Only use the following variables, macros, and functions in expressions. +{{if .Variables}} +Variables: + +{{range .Variables}}* {{template "variable" .}} +{{end -}} + +{{end -}} +{{if .Macros}} +Macros: + +{{range .Macros}}* {{template "macro" .}} +{{end -}} + +{{end -}} +{{if .Functions}} +Functions: + +{{range .Functions}}* {{template "function" .}} +{{end -}} + +{{end -}} +{{- end -}} +{{.GeneralUsage}} + +{{.UserPrompt}} diff --git a/vendor/github.com/google/cel-go/cel/validator.go b/vendor/github.com/google/cel-go/cel/validator.go index b50c674520..952f88f41b 100644 --- a/vendor/github.com/google/cel-go/cel/validator.go +++ b/vendor/github.com/google/cel-go/cel/validator.go @@ -20,11 +20,16 @@ import ( "regexp" "github.com/google/cel-go/common/ast" + "github.com/google/cel-go/common/env" "github.com/google/cel-go/common/overloads" ) const ( - homogeneousValidatorName = "cel.lib.std.validate.types.homogeneous" + durationValidatorName = "cel.validator.duration" + regexValidatorName = "cel.validator.matches" + timestampValidatorName = "cel.validator.timestamp" + homogeneousValidatorName = "cel.validator.homogeneous_literals" + nestingLimitValidatorName = "cel.validator.comprehension_nesting_limit" // HomogeneousAggregateLiteralExemptFunctions is the ValidatorConfig key used to configure // the set of function names which are exempt from homogeneous type checks. The expected type @@ -36,6 +41,43 @@ const ( HomogeneousAggregateLiteralExemptFunctions = homogeneousValidatorName + ".exempt" ) +var ( + astValidatorFactories = map[string]ASTValidatorFactory{ + nestingLimitValidatorName: func(val *env.Validator) (ASTValidator, error) { + if limit, found := val.ConfigValue("limit"); found { + // In case of protos, config value is of type by google.protobuf.Value, which numeric values are always a double. + if val, isDouble := limit.(float64); isDouble { + if val != float64(int64(val)) { + return nil, fmt.Errorf("invalid validator: %s, limit value is not a whole number: %v", nestingLimitValidatorName, limit) + } + return ValidateComprehensionNestingLimit(int(val)), nil + } + + if val, isInt := limit.(int); isInt { + return ValidateComprehensionNestingLimit(val), nil + } + return nil, fmt.Errorf("invalid validator: %s unsupported limit type: %v", nestingLimitValidatorName, limit) + } + return nil, fmt.Errorf("invalid validator: %s missing limit", nestingLimitValidatorName) + }, + durationValidatorName: func(*env.Validator) (ASTValidator, error) { + return ValidateDurationLiterals(), nil + }, + regexValidatorName: func(*env.Validator) (ASTValidator, error) { + return ValidateRegexLiterals(), nil + }, + timestampValidatorName: func(*env.Validator) (ASTValidator, error) { + return ValidateTimestampLiterals(), nil + }, + homogeneousValidatorName: func(*env.Validator) (ASTValidator, error) { + return ValidateHomogeneousAggregateLiterals(), nil + }, + } +) + +// ASTValidatorFactory creates an ASTValidator as configured by the input map +type ASTValidatorFactory func(*env.Validator) (ASTValidator, error) + // ASTValidators configures a set of ASTValidator instances into the target environment. // // Validators are applied in the order in which the are specified and are treated as singletons. @@ -70,6 +112,18 @@ type ASTValidator interface { Validate(*Env, ValidatorConfig, *ast.AST, *Issues) } +// ConfigurableASTValidator supports conversion of an object to an `env.Validator` instance used for +// YAML serialization. +type ConfigurableASTValidator interface { + // ToConfig converts the internal configuration of an ASTValidator into an env.Validator instance + // which minimally must include the validator name, but may also include a map[string]any config + // object to be serialized to YAML. The string keys represent the configuration parameter name, + // and the any value must mirror the internally supported type associated with the config key. + // + // Note: only primitive CEL types are supported by CEL validators at this time. + ToConfig() *env.Validator +} + // ValidatorConfig provides an accessor method for querying validator configuration state. type ValidatorConfig interface { GetOrDefault(name string, value any) any @@ -196,7 +250,12 @@ type formatValidator struct { // Name returns the unique name of this function format validator. func (v formatValidator) Name() string { - return fmt.Sprintf("cel.lib.std.validate.functions.%s", v.funcName) + return fmt.Sprintf("cel.validator.%s", v.funcName) +} + +// ToConfig converts the ASTValidator to an env.Validator specifying the validator name. +func (v formatValidator) ToConfig() *env.Validator { + return env.NewValidator(v.Name()) } // Validate searches the AST for uses of a given function name with a constant argument and performs a check @@ -242,6 +301,11 @@ func (homogeneousAggregateLiteralValidator) Name() string { return homogeneousValidatorName } +// ToConfig converts the ASTValidator to an env.Validator specifying the validator name. +func (v homogeneousAggregateLiteralValidator) ToConfig() *env.Validator { + return env.NewValidator(v.Name()) +} + // Validate validates that all lists and map literals have homogeneous types, i.e. don't contain dyn types. // // This validator makes an exception for list and map literals which occur at any level of nesting within @@ -336,10 +400,18 @@ type nestingLimitValidator struct { limit int } +// Name returns the name of the nesting limit validator. func (v nestingLimitValidator) Name() string { - return "cel.lib.std.validate.comprehension_nesting_limit" + return nestingLimitValidatorName +} + +// ToConfig converts the ASTValidator to an env.Validator specifying the validator name and the nesting limit +// as an integer value: {"limit": int} +func (v nestingLimitValidator) ToConfig() *env.Validator { + return env.NewValidator(v.Name()).SetConfig(map[string]any{"limit": v.limit}) } +// Validate implements the ASTValidator interface method. func (v nestingLimitValidator) Validate(e *Env, _ ValidatorConfig, a *ast.AST, iss *Issues) { root := ast.NavigateAST(a) comprehensions := ast.MatchDescendants(root, ast.KindMatcher(ast.ComprehensionKind)) diff --git a/vendor/github.com/google/cel-go/checker/checker.go b/vendor/github.com/google/cel-go/checker/checker.go index 6824af7a54..0057c16ccb 100644 --- a/vendor/github.com/google/cel-go/checker/checker.go +++ b/vendor/github.com/google/cel-go/checker/checker.go @@ -145,6 +145,17 @@ func (c *checker) checkSelect(e ast.Expr) { func (c *checker) checkOptSelect(e ast.Expr) { // Collect metadata related to the opt select call packaged by the parser. call := e.AsCall() + if len(call.Args()) != 2 || call.IsMemberFunction() { + t := "" + if call.IsMemberFunction() { + t = " member call with" + } + c.errors.notAnOptionalFieldSelectionCall(e.ID(), c.location(e), + fmt.Sprintf( + "incorrect signature.%s argument count: %d", t, len(call.Args()))) + return + } + operand := call.Args()[0] field := call.Args()[1] fieldName, isString := maybeUnwrapString(field) diff --git a/vendor/github.com/google/cel-go/checker/cost.go b/vendor/github.com/google/cel-go/checker/cost.go index 04244694d8..5bc6318ed0 100644 --- a/vendor/github.com/google/cel-go/checker/cost.go +++ b/vendor/github.com/google/cel-go/checker/cost.go @@ -28,15 +28,20 @@ import ( // CostEstimator estimates the sizes of variable length input data and the costs of functions. type CostEstimator interface { - // EstimateSize returns a SizeEstimate for the given AstNode, or nil if - // the estimator has no estimate to provide. The size is equivalent to the result of the CEL `size()` function: - // length of strings and bytes, number of map entries or number of list items. - // EstimateSize is only called for AstNodes where - // CEL does not know the size; EstimateSize is not called for values defined inline in CEL where the size - // is already obvious to CEL. + // EstimateSize returns a SizeEstimate for the given AstNode, or nil if the estimator has no + // estimate to provide. + // + // The size is equivalent to the result of the CEL `size()` function: + // * Number of unicode characters in a string + // * Number of bytes in a sequence + // * Number of map entries or number of list items. + // + // EstimateSize is only called for AstNodes where CEL does not know the size; EstimateSize is not + // called for values defined inline in CEL where the size is already obvious to CEL. EstimateSize(element AstNode) *SizeEstimate - // EstimateCallCost returns the estimated cost of an invocation, or nil if - // the estimator has no estimate to provide. + + // EstimateCallCost returns the estimated cost of an invocation, or nil if the estimator has no + // estimate to provide. EstimateCallCost(function, overloadID string, target *AstNode, args []AstNode) *CallEstimate } @@ -44,6 +49,7 @@ type CostEstimator interface { // The ResultSize should only be provided if the call results in a map, list, string or bytes. type CallEstimate struct { CostEstimate + ResultSize *SizeEstimate } @@ -53,10 +59,13 @@ type AstNode interface { // represent type directly reachable from the provided type declarations. // The first path element is a variable. All subsequent path elements are one of: field name, '@items', '@keys', '@values'. Path() []string + // Type returns the deduced type of the AstNode. Type() *types.Type + // Expr returns the expression of the AstNode. Expr() ast.Expr + // ComputedSize returns a size estimate of the AstNode derived from information available in the CEL expression. // For constants and inline list and map declarations, the exact size is returned. For concatenated list, strings // and bytes, the size is derived from the size estimates of the operands. nil is returned if there is no @@ -84,36 +93,7 @@ func (e astNode) Expr() ast.Expr { } func (e astNode) ComputedSize() *SizeEstimate { - if e.derivedSize != nil { - return e.derivedSize - } - var v uint64 - switch e.expr.Kind() { - case ast.LiteralKind: - switch ck := e.expr.AsLiteral().(type) { - case types.String: - // converting to runes here is an O(n) operation, but - // this is consistent with how size is computed at runtime, - // and how the language definition defines string size - v = uint64(len([]rune(ck))) - case types.Bytes: - v = uint64(len(ck)) - case types.Bool, types.Double, types.Duration, - types.Int, types.Timestamp, types.Uint, - types.Null: - v = uint64(1) - default: - return nil - } - case ast.ListKind: - v = uint64(e.expr.AsList().Size()) - case ast.MapKind: - v = uint64(e.expr.AsMap().Size()) - default: - return nil - } - - return &SizeEstimate{Min: v, Max: v} + return e.derivedSize } // SizeEstimate represents an estimated size of a variable length string, bytes, map or list. @@ -121,6 +101,16 @@ type SizeEstimate struct { Min, Max uint64 } +// UnknownSizeEstimate returns a size between 0 and max uint +func UnknownSizeEstimate() SizeEstimate { + return unknownSizeEstimate +} + +// FixedSizeEstimate returns a size estimate with a fixed min and max range. +func FixedSizeEstimate(size uint64) SizeEstimate { + return SizeEstimate{Min: size, Max: size} +} + // Add adds to another SizeEstimate and returns the sum. // If add would result in an uint64 overflow, the result is math.MaxUint64. func (se SizeEstimate) Add(sizeEstimate SizeEstimate) SizeEstimate { @@ -175,12 +165,22 @@ type CostEstimate struct { Min, Max uint64 } +// UnknownCostEstimate returns a cost with an unknown impact. +func UnknownCostEstimate() CostEstimate { + return unknownCostEstimate +} + +// FixedCostEstimate returns a cost with a fixed min and max range. +func FixedCostEstimate(cost uint64) CostEstimate { + return CostEstimate{Min: cost, Max: cost} +} + // Add adds the costs and returns the sum. // If add would result in an uint64 overflow for the min or max, the value is set to math.MaxUint64. func (ce CostEstimate) Add(cost CostEstimate) CostEstimate { return CostEstimate{ - addUint64NoOverflow(ce.Min, cost.Min), - addUint64NoOverflow(ce.Max, cost.Max), + Min: addUint64NoOverflow(ce.Min, cost.Min), + Max: addUint64NoOverflow(ce.Max, cost.Max), } } @@ -188,8 +188,8 @@ func (ce CostEstimate) Add(cost CostEstimate) CostEstimate { // If multiply would result in an uint64 overflow, the result is math.MaxUint64. func (ce CostEstimate) Multiply(cost CostEstimate) CostEstimate { return CostEstimate{ - multiplyUint64NoOverflow(ce.Min, cost.Min), - multiplyUint64NoOverflow(ce.Max, cost.Max), + Min: multiplyUint64NoOverflow(ce.Min, cost.Min), + Max: multiplyUint64NoOverflow(ce.Max, cost.Max), } } @@ -197,8 +197,8 @@ func (ce CostEstimate) Multiply(cost CostEstimate) CostEstimate { // nearest integer of the result, rounded up. func (ce CostEstimate) MultiplyByCostFactor(costPerUnit float64) CostEstimate { return CostEstimate{ - multiplyByCostFactor(ce.Min, costPerUnit), - multiplyByCostFactor(ce.Max, costPerUnit), + Min: multiplyByCostFactor(ce.Min, costPerUnit), + Max: multiplyByCostFactor(ce.Max, costPerUnit), } } @@ -245,49 +245,6 @@ func multiplyByCostFactor(x uint64, y float64) uint64 { return uint64(ceil) } -var ( - selectAndIdentCost = CostEstimate{Min: common.SelectAndIdentCost, Max: common.SelectAndIdentCost} - constCost = CostEstimate{Min: common.ConstCost, Max: common.ConstCost} - - createListBaseCost = CostEstimate{Min: common.ListCreateBaseCost, Max: common.ListCreateBaseCost} - createMapBaseCost = CostEstimate{Min: common.MapCreateBaseCost, Max: common.MapCreateBaseCost} - createMessageBaseCost = CostEstimate{Min: common.StructCreateBaseCost, Max: common.StructCreateBaseCost} -) - -type coster struct { - // exprPath maps from Expr Id to field path. - exprPath map[int64][]string - // iterRanges tracks the iterRange of each iterVar. - iterRanges iterRangeScopes - // computedSizes tracks the computed sizes of call results. - computedSizes map[int64]SizeEstimate - checkedAST *ast.AST - estimator CostEstimator - overloadEstimators map[string]FunctionEstimator - // presenceTestCost will either be a zero or one based on whether has() macros count against cost computations. - presenceTestCost CostEstimate -} - -// Use a stack of iterVar -> iterRange Expr Ids to handle shadowed variable names. -type iterRangeScopes map[string][]int64 - -func (vs iterRangeScopes) push(varName string, expr ast.Expr) { - vs[varName] = append(vs[varName], expr.ID()) -} - -func (vs iterRangeScopes) pop(varName string) { - varStack := vs[varName] - vs[varName] = varStack[:len(varStack)-1] -} - -func (vs iterRangeScopes) peek(varName string) (int64, bool) { - varStack := vs[varName] - if len(varStack) > 0 { - return varStack[len(varStack)-1], true - } - return 0, false -} - // CostOption configures flags which affect cost computations. type CostOption func(*coster) error @@ -300,7 +257,7 @@ func PresenceTestHasCost(hasCost bool) CostOption { c.presenceTestCost = selectAndIdentCost return nil } - c.presenceTestCost = CostEstimate{Min: 0, Max: 0} + c.presenceTestCost = FixedCostEstimate(0) return nil } } @@ -325,10 +282,11 @@ func Cost(checked *ast.AST, estimator CostEstimator, opts ...CostOption) (CostEs checkedAST: checked, estimator: estimator, overloadEstimators: map[string]FunctionEstimator{}, - exprPath: map[int64][]string{}, - iterRanges: map[string][]int64{}, + exprPaths: map[int64][]string{}, + localVars: make(scopes), computedSizes: map[int64]SizeEstimate{}, - presenceTestCost: CostEstimate{Min: 1, Max: 1}, + computedEntrySizes: map[int64]entrySizeEstimate{}, + presenceTestCost: FixedCostEstimate(1), } for _, opt := range opts { err := opt(c) @@ -339,6 +297,165 @@ func Cost(checked *ast.AST, estimator CostEstimator, opts ...CostOption) (CostEs return c.cost(checked.Expr()), nil } +type coster struct { + // exprPaths maps from Expr Id to field path. + exprPaths map[int64][]string + // localVars tracks the local and iteration variables assigned during evaluation. + localVars scopes + // computedSizes tracks the computed sizes of call results. + computedSizes map[int64]SizeEstimate + // computedEntrySizes tracks the size of list and map entries + computedEntrySizes map[int64]entrySizeEstimate + + checkedAST *ast.AST + estimator CostEstimator + overloadEstimators map[string]FunctionEstimator + // presenceTestCost will either be a zero or one based on whether has() macros count against cost computations. + presenceTestCost CostEstimate +} + +// entrySizeEstimate captures the container kind and associated key/index and value SizeEstimate values. +// +// An entrySizeEstimate only exists if both the key/index and the value have SizeEstimate values, otherwise +// a nil entrySizeEstimate should be used. +type entrySizeEstimate struct { + containerKind types.Kind + key SizeEstimate + val SizeEstimate +} + +// container returns the container kind (list or map) of the entry. +func (s *entrySizeEstimate) container() types.Kind { + if s == nil { + return types.UnknownKind + } + return s.containerKind +} + +// keySize returns the SizeEstimate for the key if one exists. +func (s *entrySizeEstimate) keySize() *SizeEstimate { + if s == nil { + return nil + } + return &s.key +} + +// valSize returns the SizeEstimate for the value if one exists. +func (s *entrySizeEstimate) valSize() *SizeEstimate { + if s == nil { + return nil + } + return &s.val +} + +func (s *entrySizeEstimate) union(other *entrySizeEstimate) *entrySizeEstimate { + if s == nil || other == nil { + return nil + } + sk := s.key.Union(other.key) + sv := s.val.Union(other.val) + return &entrySizeEstimate{ + containerKind: s.containerKind, + key: sk, + val: sv, + } +} + +// localVar captures the local variable size and entrySize estimates if they exist for variables +type localVar struct { + exprID int64 + path []string + size *SizeEstimate + entrySize *entrySizeEstimate +} + +// scopes is a stack of variable name to integer id stack to handle scopes created by cel.bind() like macros +type scopes map[string][]*localVar + +func (s scopes) push(varName string, expr ast.Expr, path []string, size *SizeEstimate, entrySize *entrySizeEstimate) { + s[varName] = append(s[varName], &localVar{ + exprID: expr.ID(), + path: path, + size: size, + entrySize: entrySize, + }) +} + +func (s scopes) pop(varName string) { + varStack := s[varName] + s[varName] = varStack[:len(varStack)-1] +} + +func (s scopes) peek(varName string) (*localVar, bool) { + varStack := s[varName] + if len(varStack) > 0 { + return varStack[len(varStack)-1], true + } + return nil, false +} + +func (c *coster) pushIterKey(varName string, rangeExpr ast.Expr) { + entrySize := c.computeEntrySize(rangeExpr) + size := entrySize.keySize() + path := c.getPath(rangeExpr) + container := entrySize.container() + if container == types.UnknownKind { + container = c.getType(rangeExpr).Kind() + } + subpath := "@keys" + if container == types.ListKind { + subpath = "@indices" + } + c.localVars.push(varName, rangeExpr, append(path, subpath), size, nil) +} + +func (c *coster) pushIterValue(varName string, rangeExpr ast.Expr) { + entrySize := c.computeEntrySize(rangeExpr) + size := entrySize.valSize() + path := c.getPath(rangeExpr) + container := entrySize.container() + if container == types.UnknownKind { + container = c.getType(rangeExpr).Kind() + } + subpath := "@values" + if container == types.ListKind { + subpath = "@items" + } + c.localVars.push(varName, rangeExpr, append(path, subpath), size, nil) +} + +func (c *coster) pushIterSingle(varName string, rangeExpr ast.Expr) { + entrySize := c.computeEntrySize(rangeExpr) + size := entrySize.keySize() + subpath := "@keys" + container := entrySize.container() + if container == types.UnknownKind { + container = c.getType(rangeExpr).Kind() + } + if container == types.ListKind { + size = entrySize.valSize() + subpath = "@items" + } + path := c.getPath(rangeExpr) + c.localVars.push(varName, rangeExpr, append(path, subpath), size, nil) +} + +func (c *coster) pushLocalVar(varName string, e ast.Expr) { + path := c.getPath(e) + // note: retrieve the entry size for the local variable based on the size of the binding expression + // since the binding expression could be a list or map, the entry size should also be propagated + entrySize := c.computeEntrySize(e) + c.localVars.push(varName, e, path, c.computeSize(e), entrySize) +} + +func (c *coster) peekLocalVar(varName string) (*localVar, bool) { + return c.localVars.peek(varName) +} + +func (c *coster) popLocalVar(varName string) { + c.localVars.pop(varName) +} + func (c *coster) cost(e ast.Expr) CostEstimate { if e == nil { return CostEstimate{} @@ -360,7 +477,11 @@ func (c *coster) cost(e ast.Expr) CostEstimate { case ast.StructKind: cost = c.costCreateStruct(e) case ast.ComprehensionKind: - cost = c.costComprehension(e) + if c.isBind(e) { + cost = c.costBind(e) + } else { + cost = c.costComprehension(e) + } default: return CostEstimate{} } @@ -370,17 +491,11 @@ func (c *coster) cost(e ast.Expr) CostEstimate { func (c *coster) costIdent(e ast.Expr) CostEstimate { identName := e.AsIdent() // build and track the field path - if iterRange, ok := c.iterRanges.peek(identName); ok { - switch c.checkedAST.GetType(iterRange).Kind() { - case types.ListKind: - c.addPath(e, append(c.exprPath[iterRange], "@items")) - case types.MapKind: - c.addPath(e, append(c.exprPath[iterRange], "@keys")) - } + if v, ok := c.peekLocalVar(identName); ok { + c.addPath(e, v.path) } else { c.addPath(e, []string{identName}) } - return selectAndIdentCost } @@ -405,14 +520,18 @@ func (c *coster) costSelect(e ast.Expr) CostEstimate { // build and track the field path c.addPath(e, append(c.getPath(sel.Operand()), sel.FieldName())) - return sum } func (c *coster) costCall(e ast.Expr) CostEstimate { + // Dyn is just a way to disable type-checking, so return the cost of 1 with the cost of the argument + if dynEstimate := c.maybeUnwrapDynCall(e); dynEstimate != nil { + return *dynEstimate + } + + // Continue estimating the cost of all other calls. call := e.AsCall() args := call.Args() - var sum CostEstimate argTypes := make([]AstNode, len(args)) @@ -426,16 +545,17 @@ func (c *coster) costCall(e ast.Expr) CostEstimate { if len(overloadIDs) == 0 { return CostEstimate{} } - var targetType AstNode + var targetType *AstNode if call.IsMemberFunction() { sum = sum.Add(c.cost(call.Target())) - targetType = c.newAstNode(call.Target()) + var t AstNode = c.newAstNode(call.Target()) + targetType = &t } // Pick a cost estimate range that covers all the overload cost estimation ranges fnCost := CostEstimate{Min: uint64(math.MaxUint64), Max: 0} var resultSize *SizeEstimate for _, overload := range overloadIDs { - overloadCost := c.functionCost(call.FunctionName(), overload, &targetType, argTypes, argCosts) + overloadCost := c.functionCost(e, call.FunctionName(), overload, targetType, argTypes, argCosts) fnCost = fnCost.Union(overloadCost.CostEstimate) if overloadCost.ResultSize != nil { if resultSize == nil { @@ -449,37 +569,73 @@ func (c *coster) costCall(e ast.Expr) CostEstimate { switch overload { case overloads.IndexList: if len(args) > 0 { + // note: assigning resultSize here could be redundant with the path-based lookup later + resultSize = c.computeEntrySize(args[0]).valSize() c.addPath(e, append(c.getPath(args[0]), "@items")) } case overloads.IndexMap: if len(args) > 0 { + resultSize = c.computeEntrySize(args[0]).valSize() c.addPath(e, append(c.getPath(args[0]), "@values")) } } + if resultSize == nil { + resultSize = c.computeSize(e) + } } - if resultSize != nil { - c.computedSizes[e.ID()] = *resultSize - } + c.setSize(e, resultSize) return sum.Add(fnCost) } +func (c *coster) maybeUnwrapDynCall(e ast.Expr) *CostEstimate { + call := e.AsCall() + if call.FunctionName() != "dyn" { + return nil + } + arg := call.Args()[0] + argCost := c.cost(arg) + c.copySizeEstimates(e, arg) + callCost := FixedCostEstimate(1).Add(argCost) + return &callCost +} + func (c *coster) costCreateList(e ast.Expr) CostEstimate { create := e.AsList() var sum CostEstimate + itemSize := SizeEstimate{Min: math.MaxUint64, Max: 0} + if create.Size() == 0 { + itemSize.Min = 0 + } for _, e := range create.Elements() { sum = sum.Add(c.cost(e)) + is := c.sizeOrUnknown(e) + itemSize = itemSize.Union(is) } + c.setEntrySize(e, &entrySizeEstimate{containerKind: types.ListKind, key: FixedSizeEstimate(1), val: itemSize}) return sum.Add(createListBaseCost) } func (c *coster) costCreateMap(e ast.Expr) CostEstimate { mapVal := e.AsMap() var sum CostEstimate + keySize := SizeEstimate{Min: math.MaxUint64, Max: 0} + valSize := SizeEstimate{Min: math.MaxUint64, Max: 0} + if mapVal.Size() == 0 { + valSize.Min = 0 + keySize.Min = 0 + } for _, ent := range mapVal.Entries() { entry := ent.AsMapEntry() sum = sum.Add(c.cost(entry.Key())) sum = sum.Add(c.cost(entry.Value())) + // Compute the key size range + ks := c.sizeOrUnknown(entry.Key()) + keySize = keySize.Union(ks) + // Compute the value size range + vs := c.sizeOrUnknown(entry.Value()) + valSize = valSize.Union(vs) } + c.setEntrySize(e, &entrySizeEstimate{containerKind: types.MapKind, key: keySize, val: valSize}) return sum.Add(createMapBaseCost) } @@ -498,43 +654,76 @@ func (c *coster) costComprehension(e ast.Expr) CostEstimate { var sum CostEstimate sum = sum.Add(c.cost(comp.IterRange())) sum = sum.Add(c.cost(comp.AccuInit())) + c.pushLocalVar(comp.AccuVar(), comp.AccuInit()) - // Track the iterRange of each IterVar for field path construction - c.iterRanges.push(comp.IterVar(), comp.IterRange()) + // Track the iterRange of each IterVar and AccuVar for field path construction + if comp.HasIterVar2() { + c.pushIterKey(comp.IterVar(), comp.IterRange()) + c.pushIterValue(comp.IterVar2(), comp.IterRange()) + } else { + c.pushIterSingle(comp.IterVar(), comp.IterRange()) + } + + // Determine the cost for each element in the loop loopCost := c.cost(comp.LoopCondition()) stepCost := c.cost(comp.LoopStep()) - c.iterRanges.pop(comp.IterVar()) - sum = sum.Add(c.cost(comp.Result())) - rangeCnt := c.sizeEstimate(c.newAstNode(comp.IterRange())) - c.computedSizes[e.ID()] = rangeCnt + // Clear the intermediate variable tracking. + c.popLocalVar(comp.IterVar()) + if comp.HasIterVar2() { + c.popLocalVar(comp.IterVar2()) + } + + // Determine the result cost. + sum = sum.Add(c.cost(comp.Result())) + c.localVars.pop(comp.AccuVar()) + // Estimate the cost of the loop. + rangeCnt := c.sizeOrUnknown(comp.IterRange()) rangeCost := rangeCnt.MultiplyByCost(stepCost.Add(loopCost)) sum = sum.Add(rangeCost) + switch k := comp.AccuInit().Kind(); k { + case ast.LiteralKind: + c.setSize(e, c.computeSize(comp.AccuInit())) + case ast.ListKind, ast.MapKind: + c.setSize(e, &rangeCnt) + // For a step which produces a container value, it will have an entry size associated + // with its expression id. + if stepEntrySize := c.computeEntrySize(comp.LoopStep()); stepEntrySize != nil { + c.setEntrySize(e, stepEntrySize) + break + } + } return sum } -func (c *coster) sizeEstimate(t AstNode) SizeEstimate { - if l := t.ComputedSize(); l != nil { - return *l - } - if l := c.estimator.EstimateSize(t); l != nil { - return *l - } - // return an estimate of 1 for return types of set - // lengths, since strings/bytes/more complex objects could be of - // variable length - if isScalar(t.Type()) { - // TODO: since the logic for size estimation is split between - // ComputedSize and isScalar, changing one will likely require changing - // the other, so they should be merged in the future if possible - return SizeEstimate{Min: 1, Max: 1} - } - return SizeEstimate{Min: 0, Max: math.MaxUint64} +func (c *coster) isBind(e ast.Expr) bool { + comp := e.AsComprehension() + iterRange := comp.IterRange() + loopCond := comp.LoopCondition() + return iterRange.Kind() == ast.ListKind && iterRange.AsList().Size() == 0 && + loopCond.Kind() == ast.LiteralKind && loopCond.AsLiteral() == types.False && + comp.AccuVar() != parser.AccumulatorName +} + +func (c *coster) costBind(e ast.Expr) CostEstimate { + comp := e.AsComprehension() + var sum CostEstimate + // Binds are lazily initialized, so we retain the cost of an empty iteration range. + sum = sum.Add(c.cost(comp.IterRange())) + sum = sum.Add(c.cost(comp.AccuInit())) + + c.pushLocalVar(comp.AccuVar(), comp.AccuInit()) + sum = sum.Add(c.cost(comp.Result())) + c.popLocalVar(comp.AccuVar()) + + // Associate the bind output size with the result size. + c.copySizeEstimates(e, comp.Result()) + return sum } -func (c *coster) functionCost(function, overloadID string, target *AstNode, args []AstNode, argCosts []CostEstimate) CallEstimate { +func (c *coster) functionCost(e ast.Expr, function, overloadID string, target *AstNode, args []AstNode, argCosts []CostEstimate) CallEstimate { argCostSum := func() CostEstimate { var sum CostEstimate for _, a := range argCosts { @@ -559,35 +748,42 @@ func (c *coster) functionCost(function, overloadID string, target *AstNode, args case overloads.ExtFormatString: if target != nil { // ResultSize not calculated because we can't bound the max size. - return CallEstimate{CostEstimate: c.sizeEstimate(*target).MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum())} + return CallEstimate{ + CostEstimate: c.sizeOrUnknown(*target).MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum())} } case overloads.StringToBytes: if len(args) == 1 { - sz := c.sizeEstimate(args[0]) + sz := c.sizeOrUnknown(args[0]) // ResultSize max is when each char converts to 4 bytes. - return CallEstimate{CostEstimate: sz.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), ResultSize: &SizeEstimate{Min: sz.Min, Max: sz.Max * 4}} + return CallEstimate{ + CostEstimate: sz.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), + ResultSize: &SizeEstimate{Min: sz.Min, Max: sz.Max * 4}} } case overloads.BytesToString: if len(args) == 1 { - sz := c.sizeEstimate(args[0]) + sz := c.sizeOrUnknown(args[0]) // ResultSize min is when 4 bytes convert to 1 char. - return CallEstimate{CostEstimate: sz.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), ResultSize: &SizeEstimate{Min: sz.Min / 4, Max: sz.Max}} + return CallEstimate{ + CostEstimate: sz.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), + ResultSize: &SizeEstimate{Min: sz.Min / 4, Max: sz.Max}} } case overloads.ExtQuoteString: if len(args) == 1 { - sz := c.sizeEstimate(args[0]) + sz := c.sizeOrUnknown(args[0]) // ResultSize max is when each char is escaped. 2 quote chars always added. - return CallEstimate{CostEstimate: sz.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), ResultSize: &SizeEstimate{Min: sz.Min + 2, Max: sz.Max*2 + 2}} + return CallEstimate{ + CostEstimate: sz.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), + ResultSize: &SizeEstimate{Min: sz.Min + 2, Max: sz.Max*2 + 2}} } case overloads.StartsWithString, overloads.EndsWithString: if len(args) == 1 { - return CallEstimate{CostEstimate: c.sizeEstimate(args[0]).MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum())} + return CallEstimate{CostEstimate: c.sizeOrUnknown(args[0]).MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum())} } case overloads.InList: // If a list is composed entirely of constant values this is O(1), but we don't account for that here. // We just assume all list containment checks are O(n). if len(args) == 2 { - return CallEstimate{CostEstimate: c.sizeEstimate(args[1]).MultiplyByCostFactor(1).Add(argCostSum())} + return CallEstimate{CostEstimate: c.sizeOrUnknown(args[1]).MultiplyByCostFactor(1).Add(argCostSum())} } // O(nm) functions case overloads.MatchesString: @@ -595,19 +791,19 @@ func (c *coster) functionCost(function, overloadID string, target *AstNode, args if target != nil && len(args) == 1 { // Add one to string length for purposes of cost calculation to prevent product of string and regex to be 0 // in case where string is empty but regex is still expensive. - strCost := c.sizeEstimate(*target).Add(SizeEstimate{Min: 1, Max: 1}).MultiplyByCostFactor(common.StringTraversalCostFactor) + strCost := c.sizeOrUnknown(*target).Add(SizeEstimate{Min: 1, Max: 1}).MultiplyByCostFactor(common.StringTraversalCostFactor) // We don't know how many expressions are in the regex, just the string length (a huge // improvement here would be to somehow get a count the number of expressions in the regex or // how many states are in the regex state machine and use that to measure regex cost). // For now, we're making a guess that each expression in a regex is typically at least 4 chars // in length. - regexCost := c.sizeEstimate(args[0]).MultiplyByCostFactor(common.RegexStringLengthCostFactor) + regexCost := c.sizeOrUnknown(args[0]).MultiplyByCostFactor(common.RegexStringLengthCostFactor) return CallEstimate{CostEstimate: strCost.Multiply(regexCost).Add(argCostSum())} } case overloads.ContainsString: if target != nil && len(args) == 1 { - strCost := c.sizeEstimate(*target).MultiplyByCostFactor(common.StringTraversalCostFactor) - substrCost := c.sizeEstimate(args[0]).MultiplyByCostFactor(common.StringTraversalCostFactor) + strCost := c.sizeOrUnknown(*target).MultiplyByCostFactor(common.StringTraversalCostFactor) + substrCost := c.sizeOrUnknown(args[0]).MultiplyByCostFactor(common.StringTraversalCostFactor) return CallEstimate{CostEstimate: strCost.Multiply(substrCost).Add(argCostSum())} } case overloads.LogicalOr, overloads.LogicalAnd: @@ -617,7 +813,9 @@ func (c *coster) functionCost(function, overloadID string, target *AstNode, args argCost := CostEstimate{Min: lhs.Min, Max: lhs.Add(rhs).Max} return CallEstimate{CostEstimate: argCost} case overloads.Conditional: - size := c.sizeEstimate(args[1]).Union(c.sizeEstimate(args[2])) + size := c.sizeOrUnknown(args[1]).Union(c.sizeOrUnknown(args[2])) + resultEntrySize := c.computeEntrySize(args[1].Expr()).union(c.computeEntrySize(args[2].Expr())) + c.setEntrySize(e, resultEntrySize) conditionalCost := argCosts[0] ifTrueCost := argCosts[1] ifFalseCost := argCosts[2] @@ -625,13 +823,19 @@ func (c *coster) functionCost(function, overloadID string, target *AstNode, args return CallEstimate{CostEstimate: argCost, ResultSize: &size} case overloads.AddString, overloads.AddBytes, overloads.AddList: if len(args) == 2 { - lhsSize := c.sizeEstimate(args[0]) - rhsSize := c.sizeEstimate(args[1]) + lhsSize := c.sizeOrUnknown(args[0]) + rhsSize := c.sizeOrUnknown(args[1]) resultSize := lhsSize.Add(rhsSize) + rhsEntrySize := c.computeEntrySize(args[0].Expr()) + lhsEntrySize := c.computeEntrySize(args[1].Expr()) + resultEntrySize := rhsEntrySize.union(lhsEntrySize) + if resultEntrySize != nil { + c.setEntrySize(e, resultEntrySize) + } switch overloadID { case overloads.AddList: // list concatenation is O(1), but we handle it here to track size - return CallEstimate{CostEstimate: CostEstimate{Min: 1, Max: 1}.Add(argCostSum()), ResultSize: &resultSize} + return CallEstimate{CostEstimate: FixedCostEstimate(1).Add(argCostSum()), ResultSize: &resultSize} default: return CallEstimate{CostEstimate: resultSize.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), ResultSize: &resultSize} } @@ -639,8 +843,8 @@ func (c *coster) functionCost(function, overloadID string, target *AstNode, args case overloads.LessString, overloads.GreaterString, overloads.LessEqualsString, overloads.GreaterEqualsString, overloads.LessBytes, overloads.GreaterBytes, overloads.LessEqualsBytes, overloads.GreaterEqualsBytes, overloads.Equals, overloads.NotEquals: - lhsCost := c.sizeEstimate(args[0]) - rhsCost := c.sizeEstimate(args[1]) + lhsCost := c.sizeOrUnknown(args[0]) + rhsCost := c.sizeOrUnknown(args[1]) min := uint64(0) smallestMax := lhsCost.Max if rhsCost.Max < smallestMax { @@ -650,14 +854,16 @@ func (c *coster) functionCost(function, overloadID string, target *AstNode, args min = 1 } // equality of 2 scalar values results in a cost of 1 - return CallEstimate{CostEstimate: CostEstimate{Min: min, Max: smallestMax}.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum())} + return CallEstimate{ + CostEstimate: CostEstimate{Min: min, Max: smallestMax}.MultiplyByCostFactor(common.StringTraversalCostFactor).Add(argCostSum()), + } } // O(1) functions // See CostTracker.costCall for more details about O(1) cost calculations // Benchmarks suggest that most of the other operations take +/- 50% of a base cost unit // which on an Intel xeon 2.20GHz CPU is 50ns. - return CallEstimate{CostEstimate: CostEstimate{Min: 1, Max: 1}.Add(argCostSum())} + return CallEstimate{CostEstimate: FixedCostEstimate(1).Add(argCostSum())} } func (c *coster) getType(e ast.Expr) *types.Type { @@ -665,28 +871,145 @@ func (c *coster) getType(e ast.Expr) *types.Type { } func (c *coster) getPath(e ast.Expr) []string { - return c.exprPath[e.ID()] + if e.Kind() == ast.IdentKind { + if v, found := c.peekLocalVar(e.AsIdent()); found { + return v.path[:] + } + } + return c.exprPaths[e.ID()][:] } func (c *coster) addPath(e ast.Expr, path []string) { - c.exprPath[e.ID()] = path + c.exprPaths[e.ID()] = path +} + +func isAccumulatorVar(name string) bool { + return name == parser.AccumulatorName || name == parser.HiddenAccumulatorName } func (c *coster) newAstNode(e ast.Expr) *astNode { path := c.getPath(e) - if len(path) > 0 && path[0] == parser.AccumulatorName { + if len(path) > 0 && isAccumulatorVar(path[0]) { // only provide paths to root vars; omit accumulator vars path = nil } - var derivedSize *SizeEstimate - if size, ok := c.computedSizes[e.ID()]; ok { - derivedSize = &size - } return &astNode{ path: path, t: c.getType(e), expr: e, - derivedSize: derivedSize} + derivedSize: c.computeSize(e)} +} + +func (c *coster) setSize(e ast.Expr, size *SizeEstimate) { + if size == nil { + return + } + // Store the computed size with the expression + c.computedSizes[e.ID()] = *size +} + +func (c *coster) sizeOrUnknown(node any) SizeEstimate { + switch v := node.(type) { + case ast.Expr: + if sz := c.computeSize(v); sz != nil { + return *sz + } + case AstNode: + if sz := v.ComputedSize(); sz != nil { + return *sz + } + } + return UnknownSizeEstimate() +} + +func (c *coster) copySizeEstimates(dst, src ast.Expr) { + c.setSize(dst, c.computeSize(src)) + c.setEntrySize(dst, c.computeEntrySize(src)) +} + +func (c *coster) computeSize(e ast.Expr) *SizeEstimate { + if size, ok := c.computedSizes[e.ID()]; ok { + return &size + } + if size := computeExprSize(e); size != nil { + return size + } + // Ensure size estimates are computed first as users may choose to override the costs that + // CEL would otherwise ascribe to the type. + node := astNode{expr: e, path: c.getPath(e), t: c.getType(e)} + if size := c.estimator.EstimateSize(node); size != nil { + // storing the computed size should reduce calls to EstimateSize() + c.computedSizes[e.ID()] = *size + return size + } + if size := computeTypeSize(c.getType(e)); size != nil { + return size + } + if e.Kind() == ast.IdentKind { + varName := e.AsIdent() + if v, ok := c.peekLocalVar(varName); ok && v.size != nil { + return v.size + } + } + return nil +} + +func (c *coster) setEntrySize(e ast.Expr, size *entrySizeEstimate) { + if size == nil { + return + } + c.computedEntrySizes[e.ID()] = *size +} + +func (c *coster) computeEntrySize(e ast.Expr) *entrySizeEstimate { + if sz, found := c.computedEntrySizes[e.ID()]; found { + return &sz + } + if e.Kind() == ast.IdentKind { + varName := e.AsIdent() + if v, ok := c.peekLocalVar(varName); ok && v.entrySize != nil { + return v.entrySize + } + } + return nil +} + +func computeExprSize(expr ast.Expr) *SizeEstimate { + var v uint64 + switch expr.Kind() { + case ast.LiteralKind: + switch ck := expr.AsLiteral().(type) { + case types.String: + // converting to runes here is an O(n) operation, but + // this is consistent with how size is computed at runtime, + // and how the language definition defines string size + v = uint64(len([]rune(ck))) + case types.Bytes: + v = uint64(len(ck)) + case types.Bool, types.Double, types.Duration, + types.Int, types.Timestamp, types.Uint, + types.Null: + v = uint64(1) + default: + return nil + } + case ast.ListKind: + v = uint64(expr.AsList().Size()) + case ast.MapKind: + v = uint64(expr.AsMap().Size()) + default: + return nil + } + cost := FixedSizeEstimate(v) + return &cost +} + +func computeTypeSize(t *types.Type) *SizeEstimate { + if isScalar(t) { + cost := FixedSizeEstimate(1) + return &cost + } + return nil } // isScalar returns true if the given type is known to be of a constant size at @@ -696,10 +1019,24 @@ func isScalar(t *types.Type) bool { switch t.Kind() { case types.BoolKind, types.DoubleKind, types.DurationKind, types.IntKind, types.TimestampKind, types.UintKind: return true + case types.OpaqueKind: + if t.TypeName() == "optional_type" { + return isScalar(t.Parameters()[0]) + } } return false } var ( doubleTwoTo64 = math.Ldexp(1.0, 64) + + unknownSizeEstimate = SizeEstimate{Min: 0, Max: math.MaxUint64} + unknownCostEstimate = unknownSizeEstimate.MultiplyByCostFactor(1) + + selectAndIdentCost = FixedCostEstimate(common.SelectAndIdentCost) + constCost = FixedCostEstimate(common.ConstCost) + + createListBaseCost = FixedCostEstimate(common.ListCreateBaseCost) + createMapBaseCost = FixedCostEstimate(common.MapCreateBaseCost) + createMessageBaseCost = FixedCostEstimate(common.StructCreateBaseCost) ) diff --git a/vendor/github.com/google/cel-go/checker/decls/decls.go b/vendor/github.com/google/cel-go/checker/decls/decls.go index c0e5de469f..e013d2c2b6 100644 --- a/vendor/github.com/google/cel-go/checker/decls/decls.go +++ b/vendor/github.com/google/cel-go/checker/decls/decls.go @@ -91,6 +91,17 @@ func NewFunction(name string, Overloads: overloads}}} } +// NewFunctionWithDoc creates a named function declaration with a description and one or more overloads. +func NewFunctionWithDoc(name, doc string, + overloads ...*exprpb.Decl_FunctionDecl_Overload) *exprpb.Decl { + return &exprpb.Decl{ + Name: name, + DeclKind: &exprpb.Decl_Function{ + Function: &exprpb.Decl_FunctionDecl{ + // Doc: desc, + Overloads: overloads}}} +} + // NewIdent creates a named identifier declaration with an optional literal // value. // @@ -98,28 +109,37 @@ func NewFunction(name string, // // Deprecated: Use NewVar or NewConst instead. func NewIdent(name string, t *exprpb.Type, v *exprpb.Constant) *exprpb.Decl { + return newIdent(name, t, v, "") +} + +func newIdent(name string, t *exprpb.Type, v *exprpb.Constant, desc string) *exprpb.Decl { return &exprpb.Decl{ Name: name, DeclKind: &exprpb.Decl_Ident{ Ident: &exprpb.Decl_IdentDecl{ Type: t, - Value: v}}} + Value: v, + Doc: desc}}} } // NewConst creates a constant identifier with a CEL constant literal value. func NewConst(name string, t *exprpb.Type, v *exprpb.Constant) *exprpb.Decl { - return NewIdent(name, t, v) + return newIdent(name, t, v, "") } // NewVar creates a variable identifier. func NewVar(name string, t *exprpb.Type) *exprpb.Decl { - return NewIdent(name, t, nil) + return newIdent(name, t, nil, "") +} + +// NewVarWithDoc creates a variable identifier with a type and a description string. +func NewVarWithDoc(name string, t *exprpb.Type, desc string) *exprpb.Decl { + return newIdent(name, t, nil, desc) } // NewInstanceOverload creates a instance function overload contract. // First element of argTypes is instance. -func NewInstanceOverload(id string, argTypes []*exprpb.Type, - resultType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { +func NewInstanceOverload(id string, argTypes []*exprpb.Type, resultType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { return &exprpb.Decl_FunctionDecl_Overload{ OverloadId: id, ResultType: resultType, @@ -154,8 +174,7 @@ func NewObjectType(typeName string) *exprpb.Type { // NewOverload creates a function overload declaration which contains a unique // overload id as well as the expected argument and result types. Overloads // must be aggregated within a Function declaration. -func NewOverload(id string, argTypes []*exprpb.Type, - resultType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { +func NewOverload(id string, argTypes []*exprpb.Type, resultType *exprpb.Type) *exprpb.Decl_FunctionDecl_Overload { return &exprpb.Decl_FunctionDecl_Overload{ OverloadId: id, ResultType: resultType, @@ -231,7 +250,5 @@ func NewWrapperType(wrapped *exprpb.Type) *exprpb.Type { // TODO: return an error panic("Wrapped type must be a primitive") } - return &exprpb.Type{ - TypeKind: &exprpb.Type_Wrapper{ - Wrapper: primitive}} + return &exprpb.Type{TypeKind: &exprpb.Type_Wrapper{Wrapper: primitive}} } diff --git a/vendor/github.com/google/cel-go/checker/errors.go b/vendor/github.com/google/cel-go/checker/errors.go index 8b3bf0b8b6..3535440baa 100644 --- a/vendor/github.com/google/cel-go/checker/errors.go +++ b/vendor/github.com/google/cel-go/checker/errors.go @@ -45,6 +45,10 @@ func (e *typeErrors) notAComprehensionRange(id int64, l common.Location, t *type FormatCELType(t)) } +func (e *typeErrors) notAnOptionalFieldSelectionCall(id int64, l common.Location, err string) { + e.errs.ReportErrorAtID(id, l, "unsupported optional field selection: %s", err) +} + func (e *typeErrors) notAnOptionalFieldSelection(id int64, l common.Location, field ast.Expr) { e.errs.ReportErrorAtID(id, l, "unsupported optional field selection: %v", field) } diff --git a/vendor/github.com/google/cel-go/common/BUILD.bazel b/vendor/github.com/google/cel-go/common/BUILD.bazel index eef7f281be..1b1b7914d6 100644 --- a/vendor/github.com/google/cel-go/common/BUILD.bazel +++ b/vendor/github.com/google/cel-go/common/BUILD.bazel @@ -9,6 +9,7 @@ go_library( name = "go_default_library", srcs = [ "cost.go", + "doc.go", "error.go", "errors.go", "location.go", @@ -25,6 +26,7 @@ go_test( name = "go_default_test", size = "small", srcs = [ + "doc_test.go", "errors_test.go", "source_test.go", ], diff --git a/vendor/github.com/google/cel-go/common/ast/ast.go b/vendor/github.com/google/cel-go/common/ast/ast.go index b807669d49..62c09cfc64 100644 --- a/vendor/github.com/google/cel-go/common/ast/ast.go +++ b/vendor/github.com/google/cel-go/common/ast/ast.go @@ -160,6 +160,13 @@ func MaxID(a *AST) int64 { return visitor.maxID + 1 } +// Heights computes the heights of all AST expressions and returns a map from expression id to height. +func Heights(a *AST) map[int64]int { + visitor := make(heightVisitor) + PostOrderVisit(a.Expr(), visitor) + return visitor +} + // NewSourceInfo creates a simple SourceInfo object from an input common.Source value. func NewSourceInfo(src common.Source) *SourceInfo { var lineOffsets []int32 @@ -455,3 +462,74 @@ func (v *maxIDVisitor) VisitEntryExpr(e EntryExpr) { v.maxID = e.ID() } } + +type heightVisitor map[int64]int + +// VisitExpr computes the height of a given node as the max height of its children plus one. +// +// Identifiers and literals are treated as having a height of zero. +func (hv heightVisitor) VisitExpr(e Expr) { + // default includes IdentKind, LiteralKind + hv[e.ID()] = 0 + switch e.Kind() { + case SelectKind: + hv[e.ID()] = 1 + hv[e.AsSelect().Operand().ID()] + case CallKind: + c := e.AsCall() + height := hv.maxHeight(c.Args()...) + if c.IsMemberFunction() { + tHeight := hv[c.Target().ID()] + if tHeight > height { + height = tHeight + } + } + hv[e.ID()] = 1 + height + case ListKind: + l := e.AsList() + hv[e.ID()] = 1 + hv.maxHeight(l.Elements()...) + case MapKind: + m := e.AsMap() + hv[e.ID()] = 1 + hv.maxEntryHeight(m.Entries()...) + case StructKind: + s := e.AsStruct() + hv[e.ID()] = 1 + hv.maxEntryHeight(s.Fields()...) + case ComprehensionKind: + comp := e.AsComprehension() + hv[e.ID()] = 1 + hv.maxHeight(comp.IterRange(), comp.AccuInit(), comp.LoopCondition(), comp.LoopStep(), comp.Result()) + } +} + +// VisitEntryExpr computes the max height of a map or struct entry and associates the height with the entry id. +func (hv heightVisitor) VisitEntryExpr(e EntryExpr) { + hv[e.ID()] = 0 + switch e.Kind() { + case MapEntryKind: + me := e.AsMapEntry() + hv[e.ID()] = hv.maxHeight(me.Value(), me.Key()) + case StructFieldKind: + sf := e.AsStructField() + hv[e.ID()] = hv[sf.Value().ID()] + } +} + +func (hv heightVisitor) maxHeight(exprs ...Expr) int { + max := 0 + for _, e := range exprs { + h := hv[e.ID()] + if h > max { + max = h + } + } + return max +} + +func (hv heightVisitor) maxEntryHeight(entries ...EntryExpr) int { + max := 0 + for _, e := range entries { + h := hv[e.ID()] + if h > max { + max = h + } + } + return max +} diff --git a/vendor/github.com/google/cel-go/common/ast/factory.go b/vendor/github.com/google/cel-go/common/ast/factory.go index 994806b793..d4dcde4d94 100644 --- a/vendor/github.com/google/cel-go/common/ast/factory.go +++ b/vendor/github.com/google/cel-go/common/ast/factory.go @@ -40,15 +40,18 @@ type ExprFactory interface { NewIdent(id int64, name string) Expr // NewAccuIdent creates an Expr value representing an accumulator identifier within a - //comprehension. + // comprehension. NewAccuIdent(id int64) Expr + // AccuIdentName reports the name of the accumulator variable to be used within a comprehension. + AccuIdentName() string + // NewLiteral creates an Expr value representing a literal value, such as a string or integer. NewLiteral(id int64, value ref.Val) Expr // NewList creates an Expr value representing a list literal expression with optional indices. // - // Optional indicies will typically be empty unless the CEL optional types are enabled. + // Optional indices will typically be empty unless the CEL optional types are enabled. NewList(id int64, elems []Expr, optIndices []int32) Expr // NewMap creates an Expr value representing a map literal expression @@ -78,11 +81,23 @@ type ExprFactory interface { isExprFactory() } -type baseExprFactory struct{} +type baseExprFactory struct { + accumulatorName string +} // NewExprFactory creates an ExprFactory instance. func NewExprFactory() ExprFactory { - return &baseExprFactory{} + return &baseExprFactory{ + "@result", + } +} + +// NewExprFactoryWithAccumulator creates an ExprFactory instance with a custom +// accumulator identifier name. +func NewExprFactoryWithAccumulator(id string) ExprFactory { + return &baseExprFactory{ + id, + } } func (fac *baseExprFactory) NewCall(id int64, function string, args ...Expr) Expr { @@ -138,7 +153,11 @@ func (fac *baseExprFactory) NewIdent(id int64, name string) Expr { } func (fac *baseExprFactory) NewAccuIdent(id int64) Expr { - return fac.NewIdent(id, "__result__") + return fac.NewIdent(id, fac.AccuIdentName()) +} + +func (fac *baseExprFactory) AccuIdentName() string { + return fac.accumulatorName } func (fac *baseExprFactory) NewLiteral(id int64, value ref.Val) Expr { diff --git a/vendor/github.com/google/cel-go/common/ast/navigable.go b/vendor/github.com/google/cel-go/common/ast/navigable.go index d7a90fb7c3..13e5777b50 100644 --- a/vendor/github.com/google/cel-go/common/ast/navigable.go +++ b/vendor/github.com/google/cel-go/common/ast/navigable.go @@ -237,8 +237,13 @@ func visit(expr Expr, visitor Visitor, order visitOrder, depth, maxDepth int) { case StructKind: s := expr.AsStruct() for _, f := range s.Fields() { - visitor.VisitEntryExpr(f) + if order == preOrder { + visitor.VisitEntryExpr(f) + } visit(f.AsStructField().Value(), visitor, order, depth+1, maxDepth) + if order == postOrder { + visitor.VisitEntryExpr(f) + } } } if order == postOrder { diff --git a/vendor/github.com/google/cel-go/common/containers/container.go b/vendor/github.com/google/cel-go/common/containers/container.go index 3097a3f785..fc146b6fc4 100644 --- a/vendor/github.com/google/cel-go/common/containers/container.go +++ b/vendor/github.com/google/cel-go/common/containers/container.go @@ -63,9 +63,9 @@ func (c *Container) Extend(opts ...ContainerOption) (*Container, error) { } // Copy the name and aliases of the existing container. ext := &Container{name: c.Name()} - if len(c.aliasSet()) > 0 { - aliasSet := make(map[string]string, len(c.aliasSet())) - for k, v := range c.aliasSet() { + if len(c.AliasSet()) > 0 { + aliasSet := make(map[string]string, len(c.AliasSet())) + for k, v := range c.AliasSet() { aliasSet[k] = v } ext.aliases = aliasSet @@ -133,8 +133,8 @@ func (c *Container) ResolveCandidateNames(name string) []string { return append(candidates, name) } -// aliasSet returns the alias to fully-qualified name mapping stored in the container. -func (c *Container) aliasSet() map[string]string { +// AliasSet returns the alias to fully-qualified name mapping stored in the container. +func (c *Container) AliasSet() map[string]string { if c == nil || c.aliases == nil { return noAliases } @@ -160,7 +160,7 @@ func (c *Container) findAlias(name string) (string, bool) { simple = name[0:dot] qualifier = name[dot:] } - alias, found := c.aliasSet()[simple] + alias, found := c.AliasSet()[simple] if !found { return "", false } @@ -264,7 +264,7 @@ func aliasAs(kind, qualifiedName, alias string) ContainerOption { return nil, fmt.Errorf("%s must refer to a valid qualified name: %s", kind, qualifiedName) } - aliasRef, found := c.aliasSet()[alias] + aliasRef, found := c.AliasSet()[alias] if found { return nil, fmt.Errorf( "%s collides with existing reference: name=%s, %s=%s, existing=%s", diff --git a/vendor/github.com/google/cel-go/common/debug/debug.go b/vendor/github.com/google/cel-go/common/debug/debug.go index 25d2e3d71c..75f5f0d636 100644 --- a/vendor/github.com/google/cel-go/common/debug/debug.go +++ b/vendor/github.com/google/cel-go/common/debug/debug.go @@ -257,7 +257,7 @@ func formatLiteral(c ref.Val) string { case types.Bool: return fmt.Sprintf("%t", v) case types.Bytes: - return fmt.Sprintf("b\"%s\"", string(v)) + return fmt.Sprintf("b%s", strconv.Quote(string(v))) case types.Double: return fmt.Sprintf("%v", float64(v)) case types.Int: diff --git a/vendor/github.com/google/cel-go/common/decls/BUILD.bazel b/vendor/github.com/google/cel-go/common/decls/BUILD.bazel index 17791dce6a..bd3f9ae70e 100644 --- a/vendor/github.com/google/cel-go/common/decls/BUILD.bazel +++ b/vendor/github.com/google/cel-go/common/decls/BUILD.bazel @@ -13,7 +13,9 @@ go_library( importpath = "github.com/google/cel-go/common/decls", deps = [ "//checker/decls:go_default_library", + "//common:go_default_library", "//common/functions:go_default_library", + "//common/operators:go_default_library", "//common/types:go_default_library", "//common/types/ref:go_default_library", "//common/types/traits:go_default_library", diff --git a/vendor/github.com/google/cel-go/common/decls/decls.go b/vendor/github.com/google/cel-go/common/decls/decls.go index bfeb52c515..a4a51c3f28 100644 --- a/vendor/github.com/google/cel-go/common/decls/decls.go +++ b/vendor/github.com/google/cel-go/common/decls/decls.go @@ -20,7 +20,9 @@ import ( "strings" chkdecls "github.com/google/cel-go/checker/decls" + "github.com/google/cel-go/common" "github.com/google/cel-go/common/functions" + "github.com/google/cel-go/common/operators" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" @@ -54,6 +56,7 @@ func NewFunction(name string, opts ...FunctionOpt) (*FunctionDecl, error) { // overload instances. type FunctionDecl struct { name string + doc string // overloads associated with the function name. overloads map[string]*OverloadDecl @@ -84,6 +87,26 @@ const ( declarationEnabled ) +// Documentation generates documentation about the Function and its overloads as a common.Doc object. +func (f *FunctionDecl) Documentation() *common.Doc { + if f == nil { + return nil + } + children := make([]*common.Doc, len(f.OverloadDecls())) + for i, o := range f.OverloadDecls() { + var examples []*common.Doc + for _, ex := range o.Examples() { + examples = append(examples, common.NewExampleDoc(ex)) + } + od := common.NewOverloadDoc(o.ID(), formatSignature(f.Name(), o), examples...) + children[i] = od + } + return common.NewFunctionDoc( + f.Name(), + f.Description(), + children...) +} + // Name returns the function name in human-readable terms, e.g. 'contains' of 'math.least' func (f *FunctionDecl) Name() string { if f == nil { @@ -92,9 +115,22 @@ func (f *FunctionDecl) Name() string { return f.name } +// Description provides an overview of the function's purpose. +// +// Usage examples should be included on specific overloads. +func (f *FunctionDecl) Description() string { + if f == nil { + return "" + } + return f.doc +} + // IsDeclarationDisabled indicates that the function implementation should be added to the dispatcher, but the // declaration should not be exposed for use in expressions. func (f *FunctionDecl) IsDeclarationDisabled() bool { + if f == nil { + return true + } return f.state == declarationDisabled } @@ -107,8 +143,8 @@ func (f *FunctionDecl) Merge(other *FunctionDecl) (*FunctionDecl, error) { if f == other { return f, nil } - if f.Name() != other.Name() { - return nil, fmt.Errorf("cannot merge unrelated functions. %s and %s", f.Name(), other.Name()) + if f == nil || other == nil || f.Name() != other.Name() { + return nil, fmt.Errorf("cannot merge unrelated functions. %q and %q", f.Name(), other.Name()) } merged := &FunctionDecl{ name: f.Name(), @@ -120,12 +156,17 @@ func (f *FunctionDecl) Merge(other *FunctionDecl) (*FunctionDecl, error) { disableTypeGuards: f.disableTypeGuards && other.disableTypeGuards, // default to the current functions declaration state. state: f.state, + doc: f.doc, } // If the other state indicates that the declaration should be explicitly enabled or // disabled, then update the merged state with the most recent value. if other.state != declarationStateUnset { merged.state = other.state } + // Allow for non-empty overrides of documentation + if len(other.doc) != 0 && f.doc != other.doc { + merged.doc = other.doc + } // baseline copy of the overloads and their ordinals copy(merged.overloadOrdinals, f.overloadOrdinals) for oID, o := range f.overloads { @@ -148,6 +189,70 @@ func (f *FunctionDecl) Merge(other *FunctionDecl) (*FunctionDecl, error) { return merged, nil } +// FunctionSubsetter subsets a function declaration or returns nil and false if the function +// subset was empty. +type FunctionSubsetter func(fn *FunctionDecl) (*FunctionDecl, bool) + +// OverloadSelector selects an overload associated with a given function when it returns true. +// +// Used in combination with the Subset method. +type OverloadSelector func(overload *OverloadDecl) bool + +// IncludeOverloads defines an OverloadSelector which allow-lists a set of overloads by their ids. +func IncludeOverloads(overloadIDs ...string) OverloadSelector { + return func(overload *OverloadDecl) bool { + for _, oID := range overloadIDs { + if overload.id == oID { + return true + } + } + return false + } +} + +// ExcludeOverloads defines an OverloadSelector which deny-lists a set of overloads by their ids. +func ExcludeOverloads(overloadIDs ...string) OverloadSelector { + return func(overload *OverloadDecl) bool { + for _, oID := range overloadIDs { + if overload.id == oID { + return false + } + } + return true + } +} + +// Subset returns a new function declaration which contains only the overloads with the specified IDs. +// If the subset function contains no overloads, then nil is returned to indicate the function is not +// functional. +func (f *FunctionDecl) Subset(selector OverloadSelector) *FunctionDecl { + if f == nil { + return nil + } + overloads := make(map[string]*OverloadDecl) + overloadOrdinals := make([]string, 0, len(f.overloadOrdinals)) + for _, oID := range f.overloadOrdinals { + overload := f.overloads[oID] + if selector(overload) { + overloads[oID] = overload + overloadOrdinals = append(overloadOrdinals, oID) + } + } + if len(overloads) == 0 { + return nil + } + subset := &FunctionDecl{ + name: f.Name(), + doc: f.doc, + overloads: overloads, + singleton: f.singleton, + disableTypeGuards: f.disableTypeGuards, + state: f.state, + overloadOrdinals: overloadOrdinals, + } + return subset +} + // AddOverload ensures that the new overload does not collide with an existing overload signature; // however, if the function signatures are identical, the implementation may be rewritten as its // difficult to compare functions by object identity. @@ -155,6 +260,9 @@ func (f *FunctionDecl) AddOverload(overload *OverloadDecl) error { if f == nil { return fmt.Errorf("nil function cannot add overload: %s", overload.ID()) } + if overload == nil { + return fmt.Errorf("cannot add nil overload to funciton: %s", f.Name()) + } for oID, o := range f.overloads { if oID != overload.ID() && o.SignatureOverlaps(overload) { return fmt.Errorf("overload signature collision in function %s: %s collides with %s", f.Name(), oID, overload.ID()) @@ -165,10 +273,17 @@ func (f *FunctionDecl) AddOverload(overload *OverloadDecl) error { if overload.hasBinding() { f.overloads[oID] = overload } + // Allow redefinition of the doc string. + if len(overload.doc) != 0 && o.doc != overload.doc { + o.doc = overload.doc + } return nil } return fmt.Errorf("overload redefinition in function. %s: %s has multiple definitions", f.Name(), oID) } + if overload.HasLateBinding() != o.HasLateBinding() { + return fmt.Errorf("overload with late binding cannot be added to function %s: cannot mix late and non-late bindings", f.Name()) + } } f.overloadOrdinals = append(f.overloadOrdinals, overload.ID()) f.overloads[overload.ID()] = overload @@ -177,8 +292,9 @@ func (f *FunctionDecl) AddOverload(overload *OverloadDecl) error { // OverloadDecls returns the overload declarations in the order in which they were declared. func (f *FunctionDecl) OverloadDecls() []*OverloadDecl { + var emptySet []*OverloadDecl if f == nil { - return []*OverloadDecl{} + return emptySet } overloads := make([]*OverloadDecl, 0, len(f.overloads)) for _, oID := range f.overloadOrdinals { @@ -187,15 +303,31 @@ func (f *FunctionDecl) OverloadDecls() []*OverloadDecl { return overloads } +// HasLateBinding returns true if the function has late bindings. A function cannot mix late bindings with other bindings. +func (f *FunctionDecl) HasLateBinding() bool { + if f == nil { + return false + } + for _, oID := range f.overloadOrdinals { + if f.overloads[oID].HasLateBinding() { + return true + } + } + return false +} + // Bindings produces a set of function bindings, if any are defined. func (f *FunctionDecl) Bindings() ([]*functions.Overload, error) { + var emptySet []*functions.Overload if f == nil { - return []*functions.Overload{}, nil + return emptySet, nil } overloads := []*functions.Overload{} nonStrict := false + hasLateBinding := false for _, oID := range f.overloadOrdinals { o := f.overloads[oID] + hasLateBinding = hasLateBinding || o.HasLateBinding() if o.hasBinding() { overload := &functions.Overload{ Operator: o.ID(), @@ -213,6 +345,9 @@ func (f *FunctionDecl) Bindings() ([]*functions.Overload, error) { if len(overloads) != 0 { return nil, fmt.Errorf("singleton function incompatible with specialized overloads: %s", f.Name()) } + if hasLateBinding { + return nil, fmt.Errorf("singleton function incompatible with late bindings: %s", f.Name()) + } overloads = []*functions.Overload{ { Operator: f.Name(), @@ -298,6 +433,14 @@ func MaybeNoSuchOverload(funcName string, args ...ref.Val) ref.Val { // FunctionOpt defines a functional option for mutating a function declaration. type FunctionOpt func(*FunctionDecl) (*FunctionDecl, error) +// FunctionDocs configures documentation from a list of strings separated by newlines. +func FunctionDocs(docs ...string) FunctionOpt { + return func(fn *FunctionDecl) (*FunctionDecl, error) { + fn.doc = common.MultilineDescription(docs...) + return fn, nil + } +} + // DisableTypeGuards disables automatically generated function invocation guards on direct overload calls. // Type guards remain on during dynamic dispatch for parsed-only expressions. func DisableTypeGuards(value bool) FunctionOpt { @@ -450,9 +593,13 @@ func newOverloadInternal(overloadID string, // implementation. type OverloadDecl struct { id string + doc string argTypes []*types.Type resultType *types.Type isMemberFunction bool + // hasLateBinding indicates that the function has a binding which is not known at compile time. + // This is useful for functions which have side-effects or are not deterministically computable. + hasLateBinding bool // nonStrict indicates that the function will accept error and unknown arguments as inputs. nonStrict bool // operandTrait indicates whether the member argument should have a specific type-trait. @@ -469,6 +616,15 @@ type OverloadDecl struct { functionOp functions.FunctionOp } +// Examples returns a list of string examples for the overload. +func (o *OverloadDecl) Examples() []string { + var emptySet []string + if o == nil || len(o.doc) == 0 { + return emptySet + } + return common.ParseDescriptions(o.doc) +} + // ID mirrors the overload signature and provides a unique id which may be referenced within the type-checker // and interpreter to optimize performance. // @@ -508,6 +664,14 @@ func (o *OverloadDecl) IsNonStrict() bool { return o.nonStrict } +// HasLateBinding returns whether the overload has a binding which is not known at compile time. +func (o *OverloadDecl) HasLateBinding() bool { + if o == nil { + return false + } + return o.hasLateBinding +} + // OperandTrait returns the trait mask of the first operand to the overload call, e.g. // `traits.Indexer` func (o *OverloadDecl) OperandTrait() int { @@ -666,6 +830,14 @@ func matchOperandTrait(trait int, arg ref.Val) bool { // OverloadOpt is a functional option for configuring a function overload. type OverloadOpt func(*OverloadDecl) (*OverloadDecl, error) +// OverloadExamples configures example expressions for the overload. +func OverloadExamples(examples ...string) OverloadOpt { + return func(o *OverloadDecl) (*OverloadDecl, error) { + o.doc = common.MultilineDescription(examples...) + return o, nil + } +} + // UnaryBinding provides the implementation of a unary overload. The provided function is protected by a runtime // type-guard which ensures runtime type agreement between the overload signature and runtime argument types. func UnaryBinding(binding functions.UnaryOp) OverloadOpt { @@ -676,6 +848,9 @@ func UnaryBinding(binding functions.UnaryOp) OverloadOpt { if len(o.ArgTypes()) != 1 { return nil, fmt.Errorf("unary function bound to non-unary overload: %s", o.ID()) } + if o.hasLateBinding { + return nil, fmt.Errorf("overload already has a late binding: %s", o.ID()) + } o.unaryOp = binding return o, nil } @@ -691,6 +866,9 @@ func BinaryBinding(binding functions.BinaryOp) OverloadOpt { if len(o.ArgTypes()) != 2 { return nil, fmt.Errorf("binary function bound to non-binary overload: %s", o.ID()) } + if o.hasLateBinding { + return nil, fmt.Errorf("overload already has a late binding: %s", o.ID()) + } o.binaryOp = binding return o, nil } @@ -703,11 +881,26 @@ func FunctionBinding(binding functions.FunctionOp) OverloadOpt { if o.hasBinding() { return nil, fmt.Errorf("overload already has a binding: %s", o.ID()) } + if o.hasLateBinding { + return nil, fmt.Errorf("overload already has a late binding: %s", o.ID()) + } o.functionOp = binding return o, nil } } +// LateFunctionBinding indicates that the function has a binding which is not known at compile time. +// This is useful for functions which have side-effects or are not deterministically computable. +func LateFunctionBinding() OverloadOpt { + return func(o *OverloadDecl) (*OverloadDecl, error) { + if o.hasBinding() { + return nil, fmt.Errorf("overload already has a binding: %s", o.ID()) + } + o.hasLateBinding = true + return o, nil + } +} + // OverloadIsNonStrict enables the function to be called with error and unknown argument values. // // Note: do not use this option unless absoluately necessary as it should be an uncommon feature. @@ -737,13 +930,27 @@ func NewVariable(name string, t *types.Type) *VariableDecl { return &VariableDecl{name: name, varType: t} } +// NewVariableWithDoc creates a new variable declaration with usage documentation. +func NewVariableWithDoc(name string, t *types.Type, doc string) *VariableDecl { + return &VariableDecl{name: name, varType: t, doc: doc} +} + // VariableDecl defines a variable declaration which may optionally have a constant value. type VariableDecl struct { name string + doc string varType *types.Type value ref.Val } +// Documentation returns name, type, and description for the variable. +func (v *VariableDecl) Documentation() *common.Doc { + if v == nil { + return nil + } + return common.NewVariableDoc(v.Name(), describeCELType(v.Type()), v.Description()) +} + // Name returns the fully-qualified variable name func (v *VariableDecl) Name() string { if v == nil { @@ -752,6 +959,16 @@ func (v *VariableDecl) Name() string { return v.name } +// Description returns the usage documentation for the variable, if set. +// +// Good usage instructions provide information about the valid formats, ranges, sizes for the variable type. +func (v *VariableDecl) Description() string { + if v == nil { + return "" + } + return v.doc +} + // Type returns the types.Type value associated with the variable. func (v *VariableDecl) Type() *types.Type { if v == nil { @@ -793,7 +1010,7 @@ func variableDeclToExprDecl(v *VariableDecl) (*exprpb.Decl, error) { if err != nil { return nil, err } - return chkdecls.NewVar(v.Name(), varType), nil + return chkdecls.NewVarWithDoc(v.Name(), varType, v.doc), nil } // FunctionDeclToExprDecl converts a go-native function declaration into a protobuf-typed function declaration. @@ -838,8 +1055,10 @@ func functionDeclToExprDecl(f *FunctionDecl) (*exprpb.Decl, error) { overloads[i] = chkdecls.NewParameterizedOverload(oID, argTypes, resultType, params) } } + doc := common.MultilineDescription(o.Examples()...) + overloads[i].Doc = doc } - return chkdecls.NewFunction(f.Name(), overloads...), nil + return chkdecls.NewFunctionWithDoc(f.Name(), f.Description(), overloads...), nil } func collectParamNames(paramNames map[string]struct{}, arg *types.Type) { @@ -851,6 +1070,60 @@ func collectParamNames(paramNames map[string]struct{}, arg *types.Type) { } } +func formatSignature(fnName string, o *OverloadDecl) string { + if opName, isOperator := operators.FindReverse(fnName); isOperator { + if opName == "" { + opName = fnName + } + return formatOperator(opName, o) + } + return formatCall(fnName, o) +} + +func formatOperator(opName string, o *OverloadDecl) string { + args := o.ArgTypes() + argTypes := make([]string, len(o.ArgTypes())) + for j, a := range args { + argTypes[j] = describeCELType(a) + } + ret := describeCELType(o.ResultType()) + switch len(args) { + case 1: + return fmt.Sprintf("%s%s -> %s", opName, argTypes[0], ret) + case 2: + if opName == operators.Index { + return fmt.Sprintf("%s[%s] -> %s", argTypes[0], argTypes[1], ret) + } + return fmt.Sprintf("%s %s %s -> %s", argTypes[0], opName, argTypes[1], ret) + default: + if opName == operators.Conditional { + return fmt.Sprint("bool ? : -> ") + } + return formatCall(opName, o) + } +} + +func formatCall(funcName string, o *OverloadDecl) string { + args := make([]string, len(o.ArgTypes())) + ret := describeCELType(o.ResultType()) + for j, a := range o.ArgTypes() { + args[j] = describeCELType(a) + } + if o.IsMemberFunction() { + target := args[0] + args = args[1:] + return fmt.Sprintf("%s.%s(%s) -> %s", target, funcName, strings.Join(args, ", "), ret) + } + return fmt.Sprintf("%s(%s) -> %s", funcName, strings.Join(args, ", "), ret) +} + +func describeCELType(t *types.Type) string { + if t.Kind() == types.TypeKind { + return "type" + } + return t.String() +} + var ( - emptyArgs = []*types.Type{} + emptyArgs []*types.Type ) diff --git a/vendor/github.com/google/cel-go/common/doc.go b/vendor/github.com/google/cel-go/common/doc.go index 5362fdfe4b..06eae3642a 100644 --- a/vendor/github.com/google/cel-go/common/doc.go +++ b/vendor/github.com/google/cel-go/common/doc.go @@ -15,3 +15,157 @@ // Package common defines types and utilities common to expression parsing, // checking, and interpretation package common + +import ( + "strings" + "unicode" +) + +// DocKind indicates the type of documentation element. +type DocKind int + +const ( + // DocEnv represents environment variable documentation. + DocEnv DocKind = iota + 1 + // DocFunction represents function documentation. + DocFunction + // DocOverload represents function overload documentation. + DocOverload + // DocVariable represents variable documentation. + DocVariable + // DocMacro represents macro documentation. + DocMacro + // DocExample represents example documentation. + DocExample +) + +// Doc holds the documentation details for a specific program element like +// a variable, function, macro, or example. +type Doc struct { + // Kind specifies the type of documentation element (e.g., Function, Variable). + Kind DocKind + + // Name is the identifier of the documented element (e.g., function name, variable name). + Name string + + // Type is the data type associated with the element, primarily used for variables. + Type string + + // Signature represents the function or overload signature. + Signature string + + // Description holds the textual description of the element, potentially spanning multiple lines. + Description string + + // Children holds nested documentation elements, such as overloads for a function + // or examples for a function/macro. + Children []*Doc +} + +// MultilineDescription combines multiple lines into a newline separated string. +func MultilineDescription(lines ...string) string { + return strings.Join(lines, "\n") +} + +// ParseDescription takes a single string containing newline characters and splits +// it into a multiline description. All empty lines will be skipped. +// +// Returns an empty string if the input string is empty. +func ParseDescription(doc string) string { + var lines []string + if len(doc) != 0 { + // Split the input string by newline characters. + for _, line := range strings.Split(doc, "\n") { + l := strings.TrimRightFunc(line, unicode.IsSpace) + if len(l) == 0 { + continue + } + lines = append(lines, l) + } + } + // Return an empty slice if the input is empty. + return MultilineDescription(lines...) +} + +// ParseDescriptions splits a documentation string into multiple multi-line description +// sections, using blank lines as delimiters. +func ParseDescriptions(doc string) []string { + var examples []string + if len(doc) != 0 { + lines := strings.Split(doc, "\n") + lineStart := 0 + for i, l := range lines { + // Trim trailing whitespace to identify effectively blank lines. + l = strings.TrimRightFunc(l, unicode.IsSpace) + // If a line is blank, it marks the end of the current section. + if len(l) == 0 { + // Start the next section after the blank line. + ex := lines[lineStart:i] + if len(ex) != 0 { + examples = append(examples, MultilineDescription(ex...)) + } + lineStart = i + 1 + } + } + // Append the last section if it wasn't terminated by a blank line. + if lineStart < len(lines) { + examples = append(examples, MultilineDescription(lines[lineStart:]...)) + } + } + return examples +} + +// NewVariableDoc creates a new Doc struct specifically for documenting a variable. +func NewVariableDoc(name, celType, description string) *Doc { + return &Doc{ + Kind: DocVariable, + Name: name, + Type: celType, + Description: ParseDescription(description), + } +} + +// NewFunctionDoc creates a new Doc struct for documenting a function. +func NewFunctionDoc(name, description string, overloads ...*Doc) *Doc { + return &Doc{ + Kind: DocFunction, + Name: name, + Description: ParseDescription(description), + Children: overloads, + } +} + +// NewOverloadDoc creates a new Doc struct for a function example. +func NewOverloadDoc(id, signature string, examples ...*Doc) *Doc { + return &Doc{ + Kind: DocOverload, + Name: id, + Signature: signature, + Children: examples, + } +} + +// NewMacroDoc creates a new Doc struct for documenting a macro. +func NewMacroDoc(name, description string, examples ...*Doc) *Doc { + return &Doc{ + Kind: DocMacro, + Name: name, + Description: ParseDescription(description), + Children: examples, + } +} + +// NewExampleDoc creates a new Doc struct specifically for holding an example. +func NewExampleDoc(ex string) *Doc { + return &Doc{ + Kind: DocExample, + Description: ex, + } +} + +// Documentor is an interface for types that can provide their own documentation. +type Documentor interface { + // Documentation returns the documentation coded by the DocKind to assist + // with text formatting. + Documentation() *Doc +} diff --git a/vendor/github.com/google/cel-go/common/env/BUILD.bazel b/vendor/github.com/google/cel-go/common/env/BUILD.bazel new file mode 100644 index 0000000000..aebe1e544c --- /dev/null +++ b/vendor/github.com/google/cel-go/common/env/BUILD.bazel @@ -0,0 +1,50 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +package( + default_visibility = ["//visibility:public"], + licenses = ["notice"], # Apache 2.0 +) + +go_library( + name = "go_default_library", + srcs = [ + "env.go", + ], + importpath = "github.com/google/cel-go/common/env", + deps = [ + "//common:go_default_library", + "//common/decls:go_default_library", + "//common/types:go_default_library", + ], +) + +go_test( + name = "go_default_test", + size = "small", + srcs = [ + "env_test.go", + ], + data = glob(["testdata/**"]), + embed = [":go_default_library"], + deps = [ + "//common/decls:go_default_library", + "//common/operators:go_default_library", + "//common/overloads:go_default_library", + "//common/types:go_default_library", + "@in_gopkg_yaml_v3//:go_default_library", + ], +) diff --git a/vendor/github.com/google/cel-go/common/env/env.go b/vendor/github.com/google/cel-go/common/env/env.go new file mode 100644 index 0000000000..d848860c2c --- /dev/null +++ b/vendor/github.com/google/cel-go/common/env/env.go @@ -0,0 +1,887 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package env provides a representation of a CEL environment. +package env + +import ( + "errors" + "fmt" + "math" + "strconv" + "strings" + + "github.com/google/cel-go/common/decls" + "github.com/google/cel-go/common/types" +) + +// NewConfig creates an instance of a YAML serializable CEL environment configuration. +func NewConfig(name string) *Config { + return &Config{ + Name: name, + } +} + +// Config represents a serializable form of the CEL environment configuration. +// +// Note: custom validations, feature flags, and performance tuning parameters are not (yet) +// considered part of the core CEL environment configuration and should be managed separately +// until a common convention for such settings is developed. +type Config struct { + Name string `yaml:"name,omitempty"` + Description string `yaml:"description,omitempty"` + Container string `yaml:"container,omitempty"` + Imports []*Import `yaml:"imports,omitempty"` + StdLib *LibrarySubset `yaml:"stdlib,omitempty"` + Extensions []*Extension `yaml:"extensions,omitempty"` + ContextVariable *ContextVariable `yaml:"context_variable,omitempty"` + Variables []*Variable `yaml:"variables,omitempty"` + Functions []*Function `yaml:"functions,omitempty"` + Validators []*Validator `yaml:"validators,omitempty"` + Features []*Feature `yaml:"features,omitempty"` +} + +// Validate validates the whole configuration is well-formed. +func (c *Config) Validate() error { + if c == nil { + return nil + } + var errs []error + for _, imp := range c.Imports { + if err := imp.Validate(); err != nil { + errs = append(errs, err) + } + } + if err := c.StdLib.Validate(); err != nil { + errs = append(errs, err) + } + for _, ext := range c.Extensions { + if err := ext.Validate(); err != nil { + errs = append(errs, err) + } + } + if err := c.ContextVariable.Validate(); err != nil { + errs = append(errs, err) + } + if c.ContextVariable != nil && len(c.Variables) != 0 { + errs = append(errs, errors.New("invalid config: either context variable or variables may be set, but not both")) + } + for _, v := range c.Variables { + if err := v.Validate(); err != nil { + errs = append(errs, err) + } + } + for _, fn := range c.Functions { + if err := fn.Validate(); err != nil { + errs = append(errs, err) + } + } + for _, feat := range c.Features { + if err := feat.Validate(); err != nil { + errs = append(errs, err) + } + } + for _, val := range c.Validators { + if err := val.Validate(); err != nil { + errs = append(errs, err) + } + } + return errors.Join(errs...) +} + +// SetContainer configures the container name for this configuration. +func (c *Config) SetContainer(container string) *Config { + c.Container = container + return c +} + +// AddVariableDecls adds one or more variables to the config, converting them to serializable values first. +// +// VariableDecl inputs are expected to be well-formed. +func (c *Config) AddVariableDecls(vars ...*decls.VariableDecl) *Config { + convVars := make([]*Variable, len(vars)) + for i, v := range vars { + if v == nil { + continue + } + cv := NewVariable(v.Name(), SerializeTypeDesc(v.Type())) + cv.Description = v.Description() + convVars[i] = cv + } + return c.AddVariables(convVars...) +} + +// AddVariables adds one or more vairables to the config. +func (c *Config) AddVariables(vars ...*Variable) *Config { + c.Variables = append(c.Variables, vars...) + return c +} + +// SetContextVariable configures the ContextVariable for this configuration. +func (c *Config) SetContextVariable(ctx *ContextVariable) *Config { + c.ContextVariable = ctx + return c +} + +// AddFunctionDecls adds one or more functions to the config, converting them to serializable values first. +// +// FunctionDecl inputs are expected to be well-formed. +func (c *Config) AddFunctionDecls(funcs ...*decls.FunctionDecl) *Config { + convFuncs := make([]*Function, len(funcs)) + for i, fn := range funcs { + if fn == nil { + continue + } + overloads := make([]*Overload, 0, len(fn.OverloadDecls())) + for _, o := range fn.OverloadDecls() { + overloadID := o.ID() + args := make([]*TypeDesc, 0, len(o.ArgTypes())) + for _, a := range o.ArgTypes() { + args = append(args, SerializeTypeDesc(a)) + } + ret := SerializeTypeDesc(o.ResultType()) + var overload *Overload + if o.IsMemberFunction() { + overload = NewMemberOverload(overloadID, args[0], args[1:], ret) + } else { + overload = NewOverload(overloadID, args, ret) + } + exampleCount := len(o.Examples()) + if exampleCount > 0 { + overload.Examples = o.Examples() + } + overloads = append(overloads, overload) + } + cf := NewFunction(fn.Name(), overloads...) + cf.Description = fn.Description() + convFuncs[i] = cf + } + return c.AddFunctions(convFuncs...) +} + +// AddFunctions adds one or more functions to the config. +func (c *Config) AddFunctions(funcs ...*Function) *Config { + c.Functions = append(c.Functions, funcs...) + return c +} + +// SetStdLib configures the LibrarySubset for the standard library. +func (c *Config) SetStdLib(subset *LibrarySubset) *Config { + c.StdLib = subset + return c +} + +// AddImports appends a set of imports to the config. +func (c *Config) AddImports(imps ...*Import) *Config { + c.Imports = append(c.Imports, imps...) + return c +} + +// AddExtensions appends a set of extensions to the config. +func (c *Config) AddExtensions(exts ...*Extension) *Config { + c.Extensions = append(c.Extensions, exts...) + return c +} + +// AddValidators appends one or more validators to the config. +func (c *Config) AddValidators(vals ...*Validator) *Config { + c.Validators = append(c.Validators, vals...) + return c +} + +// AddFeatures appends one or more features to the config. +func (c *Config) AddFeatures(feats ...*Feature) *Config { + c.Features = append(c.Features, feats...) + return c +} + +// NewImport returns a serializable import value from the qualified type name. +func NewImport(name string) *Import { + return &Import{Name: name} +} + +// Import represents a type name that will be appreviated by its simple name using +// the cel.Abbrevs() option. +type Import struct { + Name string `yaml:"name"` +} + +// Validate validates the import configuration is well-formed. +func (imp *Import) Validate() error { + if imp == nil { + return errors.New("invalid import: nil") + } + if imp.Name == "" { + return errors.New("invalid import: missing type name") + } + return nil +} + +// NewVariable returns a serializable variable from a name and type definition +func NewVariable(name string, t *TypeDesc) *Variable { + return NewVariableWithDoc(name, t, "") +} + +// NewVariableWithDoc returns a serializable variable from a name, type definition, and doc string. +func NewVariableWithDoc(name string, t *TypeDesc, doc string) *Variable { + return &Variable{Name: name, TypeDesc: t, Description: doc} +} + +// Variable represents a typed variable declaration which will be published via the +// cel.VariableDecls() option. +type Variable struct { + Name string `yaml:"name"` + Description string `yaml:"description,omitempty"` + + // Type represents the type declaration for the variable. + // + // Deprecated: use the embedded *TypeDesc fields directly. + Type *TypeDesc `yaml:"type,omitempty"` + + // TypeDesc is an embedded set of fields allowing for the specification of the Variable type. + *TypeDesc `yaml:",inline"` +} + +// Validate validates the variable configuration is well-formed. +func (v *Variable) Validate() error { + if v == nil { + return errors.New("invalid variable: nil") + } + if v.Name == "" { + return errors.New("invalid variable: missing variable name") + } + if err := v.GetType().Validate(); err != nil { + return fmt.Errorf("invalid variable %q: %w", v.Name, err) + } + return nil +} + +// GetType returns the variable type description. +// +// Note, if both the embedded TypeDesc and the field Type are non-nil, the embedded TypeDesc will +// take precedence. +func (v *Variable) GetType() *TypeDesc { + if v == nil { + return nil + } + if v.TypeDesc != nil { + return v.TypeDesc + } + if v.Type != nil { + return v.Type + } + return nil +} + +// AsCELVariable converts the serializable form of the Variable into a CEL environment declaration. +func (v *Variable) AsCELVariable(tp types.Provider) (*decls.VariableDecl, error) { + if err := v.Validate(); err != nil { + return nil, err + } + t, err := v.GetType().AsCELType(tp) + if err != nil { + return nil, fmt.Errorf("invalid variable %q: %w", v.Name, err) + } + return decls.NewVariableWithDoc(v.Name, t, v.Description), nil +} + +// NewContextVariable returns a serializable context variable with a specific type name. +func NewContextVariable(typeName string) *ContextVariable { + return &ContextVariable{TypeName: typeName} +} + +// ContextVariable represents a structured message whose fields are to be treated as the top-level +// variable identifiers within CEL expressions. +type ContextVariable struct { + // TypeName represents the fully qualified typename of the context variable. + // Currently, only protobuf types are supported. + TypeName string `yaml:"type_name"` +} + +// Validate validates the context-variable configuration is well-formed. +func (ctx *ContextVariable) Validate() error { + if ctx == nil { + return nil + } + if ctx.TypeName == "" { + return errors.New("invalid context variable: missing type name") + } + return nil +} + +// NewFunction creates a serializable function and overload set. +func NewFunction(name string, overloads ...*Overload) *Function { + return &Function{Name: name, Overloads: overloads} +} + +// NewFunctionWithDoc creates a serializable function and overload set. +func NewFunctionWithDoc(name, doc string, overloads ...*Overload) *Function { + return &Function{Name: name, Description: doc, Overloads: overloads} +} + +// Function represents the serializable format of a function and its overloads. +type Function struct { + Name string `yaml:"name"` + Description string `yaml:"description,omitempty"` + Overloads []*Overload `yaml:"overloads,omitempty"` +} + +// Validate validates the function configuration is well-formed. +func (fn *Function) Validate() error { + if fn == nil { + return errors.New("invalid function: nil") + } + if fn.Name == "" { + return errors.New("invalid function: missing function name") + } + if len(fn.Overloads) == 0 { + return fmt.Errorf("invalid function %q: missing overloads", fn.Name) + } + var errs []error + for _, o := range fn.Overloads { + if err := o.Validate(); err != nil { + errs = append(errs, fmt.Errorf("invalid function %q: %w", fn.Name, err)) + } + } + return errors.Join(errs...) +} + +// AsCELFunction converts the serializable form of the Function into CEL environment declaration. +func (fn *Function) AsCELFunction(tp types.Provider) (*decls.FunctionDecl, error) { + if err := fn.Validate(); err != nil { + return nil, err + } + opts := make([]decls.FunctionOpt, 0, len(fn.Overloads)+1) + for _, o := range fn.Overloads { + opt, err := o.AsFunctionOption(tp) + opts = append(opts, opt) + if err != nil { + return nil, fmt.Errorf("invalid function %q: %w", fn.Name, err) + } + } + if len(fn.Description) != 0 { + opts = append(opts, decls.FunctionDocs(fn.Description)) + } + return decls.NewFunction(fn.Name, opts...) +} + +// NewOverload returns a new serializable representation of a global overload. +func NewOverload(id string, args []*TypeDesc, ret *TypeDesc, examples ...string) *Overload { + return &Overload{ID: id, Args: args, Return: ret, Examples: examples} +} + +// NewMemberOverload returns a new serializable representation of a member (receiver) overload. +func NewMemberOverload(id string, target *TypeDesc, args []*TypeDesc, ret *TypeDesc, examples ...string) *Overload { + return &Overload{ID: id, Target: target, Args: args, Return: ret, Examples: examples} +} + +// Overload represents the serializable format of a function overload. +type Overload struct { + ID string `yaml:"id"` + Examples []string `yaml:"examples,omitempty"` + Target *TypeDesc `yaml:"target,omitempty"` + Args []*TypeDesc `yaml:"args,omitempty"` + Return *TypeDesc `yaml:"return,omitempty"` +} + +// Validate validates the overload configuration is well-formed. +func (od *Overload) Validate() error { + if od == nil { + return errors.New("invalid overload: nil") + } + if od.ID == "" { + return errors.New("invalid overload: missing overload id") + } + var errs []error + if od.Target != nil { + if err := od.Target.Validate(); err != nil { + errs = append(errs, fmt.Errorf("invalid overload %q target: %w", od.ID, err)) + } + } + for i, arg := range od.Args { + if err := arg.Validate(); err != nil { + errs = append(errs, fmt.Errorf("invalid overload %q arg[%d]: %w", od.ID, i, err)) + } + } + if err := od.Return.Validate(); err != nil { + errs = append(errs, fmt.Errorf("invalid overload %q return: %w", od.ID, err)) + } + return errors.Join(errs...) +} + +// AsFunctionOption converts the serializable form of the Overload into a function declaration option. +func (od *Overload) AsFunctionOption(tp types.Provider) (decls.FunctionOpt, error) { + if err := od.Validate(); err != nil { + return nil, err + } + args := make([]*types.Type, len(od.Args)) + var err error + var errs []error + for i, a := range od.Args { + args[i], err = a.AsCELType(tp) + if err != nil { + errs = append(errs, err) + } + } + result, err := od.Return.AsCELType(tp) + if err != nil { + errs = append(errs, err) + } + if od.Target != nil { + t, err := od.Target.AsCELType(tp) + if err != nil { + return nil, errors.Join(append(errs, err)...) + } + args = append([]*types.Type{t}, args...) + return decls.MemberOverload(od.ID, args, result), nil + } + if len(errs) != 0 { + return nil, errors.Join(errs...) + } + return decls.Overload(od.ID, args, result, decls.OverloadExamples(od.Examples...)), nil +} + +// NewExtension creates a serializable Extension from a name and version string. +func NewExtension(name string, version uint32) *Extension { + versionString := "latest" + if version < math.MaxUint32 { + versionString = strconv.FormatUint(uint64(version), 10) + } + return &Extension{ + Name: name, + Version: versionString, + } +} + +// Extension represents a named and optionally versioned extension library configured in the environment. +type Extension struct { + // Name is either the LibraryName() or some short-hand simple identifier which is understood by the config-handler. + Name string `yaml:"name"` + + // Version may either be an unsigned long value or the string 'latest'. If empty, the value is treated as '0'. + Version string `yaml:"version,omitempty"` +} + +// Validate validates the extension configuration is well-formed. +func (e *Extension) Validate() error { + _, err := e.VersionNumber() + return err +} + +// VersionNumber returns the parsed version string, or an error if the version cannot be parsed. +func (e *Extension) VersionNumber() (uint32, error) { + if e == nil { + return 0, fmt.Errorf("invalid extension: nil") + } + if e.Name == "" { + return 0, fmt.Errorf("invalid extension: missing name") + } + if e.Version == "latest" { + return math.MaxUint32, nil + } + if e.Version == "" { + return 0, nil + } + ver, err := strconv.ParseUint(e.Version, 10, 32) + if err != nil { + return 0, fmt.Errorf("invalid extension %q version: %w", e.Name, err) + } + return uint32(ver), nil +} + +// NewLibrarySubset returns an empty library subsetting config which permits all library features. +func NewLibrarySubset() *LibrarySubset { + return &LibrarySubset{} +} + +// LibrarySubset indicates a subset of the macros and function supported by a subsettable library. +type LibrarySubset struct { + // Disabled indicates whether the library has been disabled, typically only used for + // default-enabled libraries like stdlib. + Disabled bool `yaml:"disabled,omitempty"` + + // DisableMacros disables macros for the given library. + DisableMacros bool `yaml:"disable_macros,omitempty"` + + // IncludeMacros specifies a set of macro function names to include in the subset. + IncludeMacros []string `yaml:"include_macros,omitempty"` + + // ExcludeMacros specifies a set of macro function names to exclude from the subset. + // Note: if IncludeMacros is non-empty, then ExcludeFunctions is ignored. + ExcludeMacros []string `yaml:"exclude_macros,omitempty"` + + // IncludeFunctions specifies a set of functions to include in the subset. + // + // Note: the overloads specified in the subset need only specify their ID. + // Note: if IncludeFunctions is non-empty, then ExcludeFunctions is ignored. + IncludeFunctions []*Function `yaml:"include_functions,omitempty"` + + // ExcludeFunctions specifies the set of functions to exclude from the subset. + // + // Note: the overloads specified in the subset need only specify their ID. + ExcludeFunctions []*Function `yaml:"exclude_functions,omitempty"` +} + +// Validate validates the library configuration is well-formed. +// +// For example, setting both the IncludeMacros and ExcludeMacros together could be confusing +// and create a broken expectation, likewise for IncludeFunctions and ExcludeFunctions. +func (lib *LibrarySubset) Validate() error { + if lib == nil { + return nil + } + var errs []error + if len(lib.IncludeMacros) != 0 && len(lib.ExcludeMacros) != 0 { + errs = append(errs, errors.New("invalid subset: cannot both include and exclude macros")) + } + if len(lib.IncludeFunctions) != 0 && len(lib.ExcludeFunctions) != 0 { + errs = append(errs, errors.New("invalid subset: cannot both include and exclude functions")) + } + return errors.Join(errs...) +} + +// SubsetFunction produces a function declaration which matches the supported subset, or nil +// if the function is not supported by the LibrarySubset. +// +// For IncludeFunctions, if the function does not specify a set of overloads to include, the +// whole function definition is included. If overloads are set, then a new function which +// includes only the specified overloads is produced. +// +// For ExcludeFunctions, if the function does not specify a set of overloads to exclude, the +// whole function definition is excluded. If overloads are set, then a new function which +// includes only the permitted overloads is produced. +func (lib *LibrarySubset) SubsetFunction(fn *decls.FunctionDecl) (*decls.FunctionDecl, bool) { + // When lib is null, it should indicate that all values are included in the subset. + if lib == nil { + return fn, true + } + if lib.Disabled { + return nil, false + } + if len(lib.IncludeFunctions) != 0 { + for _, include := range lib.IncludeFunctions { + if include.Name != fn.Name() { + continue + } + if len(include.Overloads) == 0 { + return fn, true + } + overloadIDs := make([]string, len(include.Overloads)) + for i, o := range include.Overloads { + overloadIDs[i] = o.ID + } + return fn.Subset(decls.IncludeOverloads(overloadIDs...)), true + } + return nil, false + } + if len(lib.ExcludeFunctions) != 0 { + for _, exclude := range lib.ExcludeFunctions { + if exclude.Name != fn.Name() { + continue + } + if len(exclude.Overloads) == 0 { + return nil, false + } + overloadIDs := make([]string, len(exclude.Overloads)) + for i, o := range exclude.Overloads { + overloadIDs[i] = o.ID + } + return fn.Subset(decls.ExcludeOverloads(overloadIDs...)), true + } + return fn, true + } + return fn, true +} + +// SubsetMacro indicates whether the macro function should be included in the library subset. +func (lib *LibrarySubset) SubsetMacro(macroFunction string) bool { + // When lib is null, it should indicate that all values are included in the subset. + if lib == nil { + return true + } + if lib.Disabled || lib.DisableMacros { + return false + } + if len(lib.IncludeMacros) != 0 { + for _, name := range lib.IncludeMacros { + if name == macroFunction { + return true + } + } + return false + } + if len(lib.ExcludeMacros) != 0 { + for _, name := range lib.ExcludeMacros { + if name == macroFunction { + return false + } + } + return true + } + return true +} + +// SetDisabled disables or enables the library. +func (lib *LibrarySubset) SetDisabled(value bool) *LibrarySubset { + lib.Disabled = value + return lib +} + +// SetDisableMacros disables the macros for the library. +func (lib *LibrarySubset) SetDisableMacros(value bool) *LibrarySubset { + lib.DisableMacros = value + return lib +} + +// AddIncludedMacros allow-lists one or more macros by function name. +// +// Note, this option will override any excluded macros. +func (lib *LibrarySubset) AddIncludedMacros(macros ...string) *LibrarySubset { + lib.IncludeMacros = append(lib.IncludeMacros, macros...) + return lib +} + +// AddExcludedMacros deny-lists one or more macros by function name. +func (lib *LibrarySubset) AddExcludedMacros(macros ...string) *LibrarySubset { + lib.ExcludeMacros = append(lib.ExcludeMacros, macros...) + return lib +} + +// AddIncludedFunctions allow-lists one or more functions from the subset. +// +// Note, this option will override any excluded functions. +func (lib *LibrarySubset) AddIncludedFunctions(funcs ...*Function) *LibrarySubset { + lib.IncludeFunctions = append(lib.IncludeFunctions, funcs...) + return lib +} + +// AddExcludedFunctions deny-lists one or more functions from the subset. +func (lib *LibrarySubset) AddExcludedFunctions(funcs ...*Function) *LibrarySubset { + lib.ExcludeFunctions = append(lib.ExcludeFunctions, funcs...) + return lib +} + +// NewValidator returns a named Validator instance. +func NewValidator(name string) *Validator { + return &Validator{Name: name} +} + +// Validator represents a named validator with an optional map-based configuration object. +// +// Note: the map-keys must directly correspond to the internal representation of the original +// validator, and should only use primitive scalar types as values at this time. +type Validator struct { + Name string `yaml:"name"` + Config map[string]any `yaml:"config,omitempty"` +} + +// Validate validates the configuration of the validator object. +func (v *Validator) Validate() error { + if v == nil { + return errors.New("invalid validator: nil") + } + if v.Name == "" { + return errors.New("invalid validator: missing name") + } + return nil +} + +// SetConfig sets the set of map key-value pairs associated with this validator's configuration. +func (v *Validator) SetConfig(config map[string]any) *Validator { + v.Config = config + return v +} + +// ConfigValue retrieves the value associated with the config key name, if one exists. +func (v *Validator) ConfigValue(name string) (any, bool) { + if v == nil { + return nil, false + } + value, found := v.Config[name] + return value, found +} + +// NewFeature creates a new feature flag with a boolean enablement flag. +func NewFeature(name string, enabled bool) *Feature { + return &Feature{Name: name, Enabled: enabled} +} + +// Feature represents a named boolean feature flag supported by CEL. +type Feature struct { + Name string `yaml:"name"` + Enabled bool `yaml:"enabled"` +} + +// Validate validates whether the feature is well-configured. +func (feat *Feature) Validate() error { + if feat == nil { + return errors.New("invalid feature: nil") + } + if feat.Name == "" { + return errors.New("invalid feature: missing name") + } + return nil +} + +// NewTypeDesc describes a simple or complex type with parameters. +func NewTypeDesc(typeName string, params ...*TypeDesc) *TypeDesc { + return &TypeDesc{TypeName: typeName, Params: params} +} + +// NewTypeParam describe a type-param type. +func NewTypeParam(paramName string) *TypeDesc { + return &TypeDesc{TypeName: paramName, IsTypeParam: true} +} + +// TypeDesc represents the serializable format of a CEL *types.Type value. +type TypeDesc struct { + TypeName string `yaml:"type_name"` + Params []*TypeDesc `yaml:"params,omitempty"` + IsTypeParam bool `yaml:"is_type_param,omitempty"` +} + +// String implements the strings.Stringer interface method. +func (td *TypeDesc) String() string { + ps := make([]string, len(td.Params)) + for i, p := range td.Params { + ps[i] = p.String() + } + typeName := td.TypeName + if len(ps) != 0 { + typeName = fmt.Sprintf("%s(%s)", typeName, strings.Join(ps, ",")) + } + return typeName +} + +// Validate validates the type configuration is well-formed. +func (td *TypeDesc) Validate() error { + if td == nil { + return errors.New("invalid type: nil") + } + if td.TypeName == "" { + return errors.New("invalid type: missing type name") + } + if td.IsTypeParam && len(td.Params) != 0 { + return errors.New("invalid type: param type cannot have parameters") + } + switch td.TypeName { + case "list": + if len(td.Params) != 1 { + return fmt.Errorf("invalid type: list expects 1 parameter, got %d", len(td.Params)) + } + return td.Params[0].Validate() + case "map": + if len(td.Params) != 2 { + return fmt.Errorf("invalid type: map expects 2 parameters, got %d", len(td.Params)) + } + if err := td.Params[0].Validate(); err != nil { + return err + } + if err := td.Params[1].Validate(); err != nil { + return err + } + case "optional_type": + if len(td.Params) != 1 { + return fmt.Errorf("invalid type: optional_type expects 1 parameter, got %d", len(td.Params)) + } + return td.Params[0].Validate() + default: + } + return nil +} + +// AsCELType converts the serializable object to a *types.Type value. +func (td *TypeDesc) AsCELType(tp types.Provider) (*types.Type, error) { + err := td.Validate() + if err != nil { + return nil, err + } + switch td.TypeName { + case "dyn": + return types.DynType, nil + case "map": + kt, err := td.Params[0].AsCELType(tp) + if err != nil { + return nil, err + } + vt, err := td.Params[1].AsCELType(tp) + if err != nil { + return nil, err + } + return types.NewMapType(kt, vt), nil + case "list": + et, err := td.Params[0].AsCELType(tp) + if err != nil { + return nil, err + } + return types.NewListType(et), nil + case "optional_type": + et, err := td.Params[0].AsCELType(tp) + if err != nil { + return nil, err + } + return types.NewOptionalType(et), nil + default: + if td.IsTypeParam { + return types.NewTypeParamType(td.TypeName), nil + } + if msgType, found := tp.FindStructType(td.TypeName); found { + // First parameter is the type name. + return msgType.Parameters()[0], nil + } + t, found := tp.FindIdent(td.TypeName) + if !found { + return nil, fmt.Errorf("undefined type name: %q", td.TypeName) + } + _, ok := t.(*types.Type) + if ok && len(td.Params) == 0 { + return t.(*types.Type), nil + } + params := make([]*types.Type, len(td.Params)) + for i, p := range td.Params { + params[i], err = p.AsCELType(tp) + if err != nil { + return nil, err + } + } + return types.NewOpaqueType(td.TypeName, params...), nil + } +} + +// SerializeTypeDesc converts a CEL native *types.Type to a serializable TypeDesc. +func SerializeTypeDesc(t *types.Type) *TypeDesc { + typeName := t.TypeName() + if t.Kind() == types.TypeParamKind { + return NewTypeParam(typeName) + } + if t != types.NullType && t.IsAssignableType(types.NullType) { + if wrapperTypeName, found := wrapperTypes[t.Kind()]; found { + return NewTypeDesc(wrapperTypeName) + } + } + var params []*TypeDesc + for _, p := range t.Parameters() { + params = append(params, SerializeTypeDesc(p)) + } + return NewTypeDesc(typeName, params...) +} + +var wrapperTypes = map[types.Kind]string{ + types.BoolKind: "google.protobuf.BoolValue", + types.BytesKind: "google.protobuf.BytesValue", + types.DoubleKind: "google.protobuf.DoubleValue", + types.IntKind: "google.protobuf.Int64Value", + types.StringKind: "google.protobuf.StringValue", + types.UintKind: "google.protobuf.UInt64Value", +} diff --git a/vendor/github.com/google/cel-go/common/errors.go b/vendor/github.com/google/cel-go/common/errors.go index 895706833f..c8865df8cd 100644 --- a/vendor/github.com/google/cel-go/common/errors.go +++ b/vendor/github.com/google/cel-go/common/errors.go @@ -46,6 +46,11 @@ func (e *Errors) ReportError(l Location, format string, args ...any) { e.ReportErrorAtID(0, l, format, args...) } +// ReportErrorString records an error at a source location. +func (e *Errors) ReportErrorString(l Location, message string) { + e.ReportErrorAtID(0, l, "%s", message) +} + // ReportErrorAtID records an error at a source location and expression id. func (e *Errors) ReportErrorAtID(id int64, l Location, format string, args ...any) { e.numErrors++ diff --git a/vendor/github.com/google/cel-go/common/stdlib/BUILD.bazel b/vendor/github.com/google/cel-go/common/stdlib/BUILD.bazel index b55f452156..124dbea819 100644 --- a/vendor/github.com/google/cel-go/common/stdlib/BUILD.bazel +++ b/vendor/github.com/google/cel-go/common/stdlib/BUILD.bazel @@ -12,6 +12,7 @@ go_library( ], importpath = "github.com/google/cel-go/common/stdlib", deps = [ + "//common:go_default_library", "//common/decls:go_default_library", "//common/functions:go_default_library", "//common/operators:go_default_library", diff --git a/vendor/github.com/google/cel-go/common/stdlib/standard.go b/vendor/github.com/google/cel-go/common/stdlib/standard.go index 1550c17863..4040a4f5c5 100644 --- a/vendor/github.com/google/cel-go/common/stdlib/standard.go +++ b/vendor/github.com/google/cel-go/common/stdlib/standard.go @@ -16,6 +16,11 @@ package stdlib import ( + "strconv" + "strings" + "time" + + "github.com/google/cel-go/common" "github.com/google/cel-go/common/decls" "github.com/google/cel-go/common/functions" "github.com/google/cel-go/common/operators" @@ -28,6 +33,7 @@ import ( var ( stdFunctions []*decls.FunctionDecl stdTypes []*decls.VariableDecl + utcTZ = types.String("UTC") ) func init() { @@ -55,19 +61,49 @@ func init() { // Logical operators. Special-cased within the interpreter. // Note, the singleton binding prevents extensions from overriding the operator behavior. function(operators.Conditional, + decls.FunctionDocs( + `The ternary operator tests a boolean predicate and returns the left-hand side `+ + `(truthy) expression if true, or the right-hand side (falsy) expression if false`), decls.Overload(overloads.Conditional, argTypes(types.BoolType, paramA, paramA), paramA, - decls.OverloadIsNonStrict()), + decls.OverloadIsNonStrict(), + decls.OverloadExamples( + `'hello'.contains('lo') ? 'hi' : 'bye' // 'hi'`, + `32 % 3 == 0 ? 'divisible' : 'not divisible' // 'not divisible'`)), decls.SingletonFunctionBinding(noFunctionOverrides)), + function(operators.LogicalAnd, + decls.FunctionDocs( + `logically AND two boolean values. Errors and unknown values`, + `are valid inputs and will not halt evaluation.`), decls.Overload(overloads.LogicalAnd, argTypes(types.BoolType, types.BoolType), types.BoolType, - decls.OverloadIsNonStrict()), + decls.OverloadIsNonStrict(), + decls.OverloadExamples( + `true && true // true`, + `true && false // false`, + `error && true // error`, + `error && false // false`)), decls.SingletonBinaryBinding(noBinaryOverrides)), + function(operators.LogicalOr, + decls.FunctionDocs( + `logically OR two boolean values. Errors and unknown values`, + `are valid inputs and will not halt evaluation.`), decls.Overload(overloads.LogicalOr, argTypes(types.BoolType, types.BoolType), types.BoolType, - decls.OverloadIsNonStrict()), + decls.OverloadIsNonStrict(), + decls.OverloadExamples( + `true || false // true`, + `false || false // false`, + `error || true // true`, + `error || error // true`)), decls.SingletonBinaryBinding(noBinaryOverrides)), + function(operators.LogicalNot, - decls.Overload(overloads.LogicalNot, argTypes(types.BoolType), types.BoolType), + decls.FunctionDocs(`logically negate a boolean value.`), + decls.Overload(overloads.LogicalNot, argTypes(types.BoolType), types.BoolType, + decls.OverloadExamples( + `!true // false`, + `!false // true`, + `!error // error`)), decls.SingletonUnaryBinding(func(val ref.Val) ref.Val { b, ok := val.(types.Bool) if !ok { @@ -90,66 +126,104 @@ func init() { // Equality / inequality. Special-cased in the interpreter function(operators.Equals, - decls.Overload(overloads.Equals, argTypes(paramA, paramA), types.BoolType), + decls.FunctionDocs(`compare two values of the same type for equality`), + decls.Overload(overloads.Equals, argTypes(paramA, paramA), types.BoolType, + decls.OverloadExamples( + `1 == 1 // true`, + `'hello' == 'world' // false`, + `bytes('hello') == b'hello' // true`, + `duration('1h') == duration('60m') // true`, + `dyn(3.0) == 3 // true`)), decls.SingletonBinaryBinding(noBinaryOverrides)), function(operators.NotEquals, - decls.Overload(overloads.NotEquals, argTypes(paramA, paramA), types.BoolType), + decls.FunctionDocs(`compare two values of the same type for inequality`), + decls.Overload(overloads.NotEquals, argTypes(paramA, paramA), types.BoolType, + decls.OverloadExamples( + `1 != 2 // true`, + `"a" != "a" // false`, + `3.0 != 3.1 // true`)), decls.SingletonBinaryBinding(noBinaryOverrides)), // Mathematical operators function(operators.Add, + decls.FunctionDocs( + `adds two numeric values or concatenates two strings, bytes,`, + `or lists.`), decls.Overload(overloads.AddBytes, - argTypes(types.BytesType, types.BytesType), types.BytesType), + argTypes(types.BytesType, types.BytesType), types.BytesType, + decls.OverloadExamples(`b'hi' + bytes('ya') // b'hiya'`)), decls.Overload(overloads.AddDouble, - argTypes(types.DoubleType, types.DoubleType), types.DoubleType), + argTypes(types.DoubleType, types.DoubleType), types.DoubleType, + decls.OverloadExamples(`3.14 + 1.59 // 4.73`)), decls.Overload(overloads.AddDurationDuration, - argTypes(types.DurationType, types.DurationType), types.DurationType), + argTypes(types.DurationType, types.DurationType), types.DurationType, + decls.OverloadExamples(`duration('1m') + duration('1s') // duration('1m1s')`)), decls.Overload(overloads.AddDurationTimestamp, - argTypes(types.DurationType, types.TimestampType), types.TimestampType), + argTypes(types.DurationType, types.TimestampType), types.TimestampType, + decls.OverloadExamples(`duration('24h') + timestamp('2023-01-01T00:00:00Z') // timestamp('2023-01-02T00:00:00Z')`)), decls.Overload(overloads.AddTimestampDuration, - argTypes(types.TimestampType, types.DurationType), types.TimestampType), + argTypes(types.TimestampType, types.DurationType), types.TimestampType, + decls.OverloadExamples(`timestamp('2023-01-01T00:00:00Z') + duration('24h1m2s') // timestamp('2023-01-02T00:01:02Z')`)), decls.Overload(overloads.AddInt64, - argTypes(types.IntType, types.IntType), types.IntType), + argTypes(types.IntType, types.IntType), types.IntType, + decls.OverloadExamples(`1 + 2 // 3`)), decls.Overload(overloads.AddList, - argTypes(listOfA, listOfA), listOfA), + argTypes(listOfA, listOfA), listOfA, + decls.OverloadExamples(`[1] + [2, 3] // [1, 2, 3]`)), decls.Overload(overloads.AddString, - argTypes(types.StringType, types.StringType), types.StringType), + argTypes(types.StringType, types.StringType), types.StringType, + decls.OverloadExamples(`"Hello, " + "world!" // "Hello, world!"`)), decls.Overload(overloads.AddUint64, - argTypes(types.UintType, types.UintType), types.UintType), + argTypes(types.UintType, types.UintType), types.UintType, + decls.OverloadExamples(`22u + 33u // 55u`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { return lhs.(traits.Adder).Add(rhs) }, traits.AdderType)), function(operators.Divide, + decls.FunctionDocs(`divide two numbers`), decls.Overload(overloads.DivideDouble, - argTypes(types.DoubleType, types.DoubleType), types.DoubleType), + argTypes(types.DoubleType, types.DoubleType), types.DoubleType, + decls.OverloadExamples(`7.0 / 2.0 // 3.5`)), decls.Overload(overloads.DivideInt64, - argTypes(types.IntType, types.IntType), types.IntType), + argTypes(types.IntType, types.IntType), types.IntType, + decls.OverloadExamples(`10 / 2 // 5`)), decls.Overload(overloads.DivideUint64, - argTypes(types.UintType, types.UintType), types.UintType), + argTypes(types.UintType, types.UintType), types.UintType, + decls.OverloadExamples(`42u / 2u // 21u`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { return lhs.(traits.Divider).Divide(rhs) }, traits.DividerType)), function(operators.Modulo, + decls.FunctionDocs(`compute the modulus of one integer into another`), decls.Overload(overloads.ModuloInt64, - argTypes(types.IntType, types.IntType), types.IntType), + argTypes(types.IntType, types.IntType), types.IntType, + decls.OverloadExamples(`3 % 2 // 1`)), decls.Overload(overloads.ModuloUint64, - argTypes(types.UintType, types.UintType), types.UintType), + argTypes(types.UintType, types.UintType), types.UintType, + decls.OverloadExamples(`6u % 3u // 0u`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { return lhs.(traits.Modder).Modulo(rhs) }, traits.ModderType)), function(operators.Multiply, + decls.FunctionDocs(`multiply two numbers`), decls.Overload(overloads.MultiplyDouble, - argTypes(types.DoubleType, types.DoubleType), types.DoubleType), + argTypes(types.DoubleType, types.DoubleType), types.DoubleType, + decls.OverloadExamples(`3.5 * 40.0 // 140.0`)), decls.Overload(overloads.MultiplyInt64, - argTypes(types.IntType, types.IntType), types.IntType), + argTypes(types.IntType, types.IntType), types.IntType, + decls.OverloadExamples(`-2 * 6 // -12`)), decls.Overload(overloads.MultiplyUint64, - argTypes(types.UintType, types.UintType), types.UintType), + argTypes(types.UintType, types.UintType), types.UintType, + decls.OverloadExamples(`13u * 3u // 39u`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { return lhs.(traits.Multiplier).Multiply(rhs) }, traits.MultiplierType)), function(operators.Negate, - decls.Overload(overloads.NegateDouble, argTypes(types.DoubleType), types.DoubleType), - decls.Overload(overloads.NegateInt64, argTypes(types.IntType), types.IntType), + decls.FunctionDocs(`negate a numeric value`), + decls.Overload(overloads.NegateDouble, argTypes(types.DoubleType), types.DoubleType, + decls.OverloadExamples(`-(3.14) // -3.14`)), + decls.Overload(overloads.NegateInt64, argTypes(types.IntType), types.IntType, + decls.OverloadExamples(`-(5) // -5`)), decls.SingletonUnaryBinding(func(val ref.Val) ref.Val { if types.IsBool(val) { return types.MaybeNoSuchOverloadErr(val) @@ -157,18 +231,32 @@ func init() { return val.(traits.Negater).Negate() }, traits.NegatorType)), function(operators.Subtract, + decls.FunctionDocs(`subtract two numbers, or two time-related values`), decls.Overload(overloads.SubtractDouble, - argTypes(types.DoubleType, types.DoubleType), types.DoubleType), + argTypes(types.DoubleType, types.DoubleType), types.DoubleType, + decls.OverloadExamples(`10.5 - 2.0 // 8.5`)), decls.Overload(overloads.SubtractDurationDuration, - argTypes(types.DurationType, types.DurationType), types.DurationType), + argTypes(types.DurationType, types.DurationType), types.DurationType, + decls.OverloadExamples(`duration('1m') - duration('1s') // duration('59s')`)), decls.Overload(overloads.SubtractInt64, - argTypes(types.IntType, types.IntType), types.IntType), + argTypes(types.IntType, types.IntType), types.IntType, + decls.OverloadExamples(`5 - 3 // 2`)), decls.Overload(overloads.SubtractTimestampDuration, - argTypes(types.TimestampType, types.DurationType), types.TimestampType), + argTypes(types.TimestampType, types.DurationType), types.TimestampType, + decls.OverloadExamples(common.MultilineDescription( + `timestamp('2023-01-10T12:00:00Z')`, + ` - duration('12h') // timestamp('2023-01-10T00:00:00Z')`))), decls.Overload(overloads.SubtractTimestampTimestamp, - argTypes(types.TimestampType, types.TimestampType), types.DurationType), + argTypes(types.TimestampType, types.TimestampType), types.DurationType, + decls.OverloadExamples(common.MultilineDescription( + `timestamp('2023-01-10T12:00:00Z')`, + ` - timestamp('2023-01-10T00:00:00Z') // duration('12h')`))), decls.Overload(overloads.SubtractUint64, - argTypes(types.UintType, types.UintType), types.UintType), + argTypes(types.UintType, types.UintType), types.UintType, + decls.OverloadExamples(common.MultilineDescription( + `// the subtraction result must be positive, otherwise an overflow`, + `// error is generated.`, + `42u - 3u // 39u`))), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { return lhs.(traits.Subtractor).Subtract(rhs) }, traits.SubtractorType)), @@ -176,34 +264,51 @@ func init() { // Relations operators function(operators.Less, + decls.FunctionDocs( + `compare two values and return true if the first value is`, + `less than the second`), decls.Overload(overloads.LessBool, - argTypes(types.BoolType, types.BoolType), types.BoolType), + argTypes(types.BoolType, types.BoolType), types.BoolType, + decls.OverloadExamples(`false < true // true`)), decls.Overload(overloads.LessInt64, - argTypes(types.IntType, types.IntType), types.BoolType), + argTypes(types.IntType, types.IntType), types.BoolType, + decls.OverloadExamples(`-2 < 3 // true`, `1 < 0 // false`)), decls.Overload(overloads.LessInt64Double, - argTypes(types.IntType, types.DoubleType), types.BoolType), + argTypes(types.IntType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`1 < 1.1 // true`)), decls.Overload(overloads.LessInt64Uint64, - argTypes(types.IntType, types.UintType), types.BoolType), + argTypes(types.IntType, types.UintType), types.BoolType, + decls.OverloadExamples(`1 < 2u // true`)), decls.Overload(overloads.LessUint64, - argTypes(types.UintType, types.UintType), types.BoolType), + argTypes(types.UintType, types.UintType), types.BoolType, + decls.OverloadExamples(`1u < 2u // true`)), decls.Overload(overloads.LessUint64Double, - argTypes(types.UintType, types.DoubleType), types.BoolType), + argTypes(types.UintType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`1u < 0.9 // false`)), decls.Overload(overloads.LessUint64Int64, - argTypes(types.UintType, types.IntType), types.BoolType), + argTypes(types.UintType, types.IntType), types.BoolType, + decls.OverloadExamples(`1u < 23 // true`, `1u < -1 // false`)), decls.Overload(overloads.LessDouble, - argTypes(types.DoubleType, types.DoubleType), types.BoolType), + argTypes(types.DoubleType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2.0 < 2.4 // true`)), decls.Overload(overloads.LessDoubleInt64, - argTypes(types.DoubleType, types.IntType), types.BoolType), + argTypes(types.DoubleType, types.IntType), types.BoolType, + decls.OverloadExamples(`2.1 < 3 // true`)), decls.Overload(overloads.LessDoubleUint64, - argTypes(types.DoubleType, types.UintType), types.BoolType), + argTypes(types.DoubleType, types.UintType), types.BoolType, + decls.OverloadExamples(`2.3 < 2u // false`, `-1.0 < 1u // true`)), decls.Overload(overloads.LessString, - argTypes(types.StringType, types.StringType), types.BoolType), + argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples(`'a' < 'b' // true`, `'cat' < 'cab' // false`)), decls.Overload(overloads.LessBytes, - argTypes(types.BytesType, types.BytesType), types.BoolType), + argTypes(types.BytesType, types.BytesType), types.BoolType, + decls.OverloadExamples(`b'hello' < b'world' // true`)), decls.Overload(overloads.LessTimestamp, - argTypes(types.TimestampType, types.TimestampType), types.BoolType), + argTypes(types.TimestampType, types.TimestampType), types.BoolType, + decls.OverloadExamples(`timestamp('2001-01-01T02:03:04Z') < timestamp('2002-02-02T02:03:04Z') // true`)), decls.Overload(overloads.LessDuration, - argTypes(types.DurationType, types.DurationType), types.BoolType), + argTypes(types.DurationType, types.DurationType), types.BoolType, + decls.OverloadExamples(`duration('1ms') < duration('1s') // true`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { cmp := lhs.(traits.Comparer).Compare(rhs) if cmp == types.IntNegOne { @@ -216,34 +321,51 @@ func init() { }, traits.ComparerType)), function(operators.LessEquals, + decls.FunctionDocs( + `compare two values and return true if the first value is`, + `less than or equal to the second`), decls.Overload(overloads.LessEqualsBool, - argTypes(types.BoolType, types.BoolType), types.BoolType), + argTypes(types.BoolType, types.BoolType), types.BoolType, + decls.OverloadExamples(`false <= true // true`)), decls.Overload(overloads.LessEqualsInt64, - argTypes(types.IntType, types.IntType), types.BoolType), + argTypes(types.IntType, types.IntType), types.BoolType, + decls.OverloadExamples(`-2 <= 3 // true`)), decls.Overload(overloads.LessEqualsInt64Double, - argTypes(types.IntType, types.DoubleType), types.BoolType), + argTypes(types.IntType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`1 <= 1.1 // true`)), decls.Overload(overloads.LessEqualsInt64Uint64, - argTypes(types.IntType, types.UintType), types.BoolType), + argTypes(types.IntType, types.UintType), types.BoolType, + decls.OverloadExamples(`1 <= 2u // true`, `-1 <= 0u // true`)), decls.Overload(overloads.LessEqualsUint64, - argTypes(types.UintType, types.UintType), types.BoolType), + argTypes(types.UintType, types.UintType), types.BoolType, + decls.OverloadExamples(`1u <= 2u // true`)), decls.Overload(overloads.LessEqualsUint64Double, - argTypes(types.UintType, types.DoubleType), types.BoolType), + argTypes(types.UintType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`1u <= 1.0 // true`, `1u <= 1.1 // true`)), decls.Overload(overloads.LessEqualsUint64Int64, - argTypes(types.UintType, types.IntType), types.BoolType), + argTypes(types.UintType, types.IntType), types.BoolType, + decls.OverloadExamples(`1u <= 23 // true`)), decls.Overload(overloads.LessEqualsDouble, - argTypes(types.DoubleType, types.DoubleType), types.BoolType), + argTypes(types.DoubleType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2.0 <= 2.4 // true`)), decls.Overload(overloads.LessEqualsDoubleInt64, - argTypes(types.DoubleType, types.IntType), types.BoolType), + argTypes(types.DoubleType, types.IntType), types.BoolType, + decls.OverloadExamples(`2.1 <= 3 // true`)), decls.Overload(overloads.LessEqualsDoubleUint64, - argTypes(types.DoubleType, types.UintType), types.BoolType), + argTypes(types.DoubleType, types.UintType), types.BoolType, + decls.OverloadExamples(`2.0 <= 2u // true`, `-1.0 <= 1u // true`)), decls.Overload(overloads.LessEqualsString, - argTypes(types.StringType, types.StringType), types.BoolType), + argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples(`'a' <= 'b' // true`, `'a' <= 'a' // true`, `'cat' <= 'cab' // false`)), decls.Overload(overloads.LessEqualsBytes, - argTypes(types.BytesType, types.BytesType), types.BoolType), + argTypes(types.BytesType, types.BytesType), types.BoolType, + decls.OverloadExamples(`b'hello' <= b'world' // true`)), decls.Overload(overloads.LessEqualsTimestamp, - argTypes(types.TimestampType, types.TimestampType), types.BoolType), + argTypes(types.TimestampType, types.TimestampType), types.BoolType, + decls.OverloadExamples(`timestamp('2001-01-01T02:03:04Z') <= timestamp('2002-02-02T02:03:04Z') // true`)), decls.Overload(overloads.LessEqualsDuration, - argTypes(types.DurationType, types.DurationType), types.BoolType), + argTypes(types.DurationType, types.DurationType), types.BoolType, + decls.OverloadExamples(`duration('1ms') <= duration('1s') // true`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { cmp := lhs.(traits.Comparer).Compare(rhs) if cmp == types.IntNegOne || cmp == types.IntZero { @@ -256,34 +378,51 @@ func init() { }, traits.ComparerType)), function(operators.Greater, + decls.FunctionDocs( + `compare two values and return true if the first value is`, + `greater than the second`), decls.Overload(overloads.GreaterBool, - argTypes(types.BoolType, types.BoolType), types.BoolType), + argTypes(types.BoolType, types.BoolType), types.BoolType, + decls.OverloadExamples(`true > false // true`)), decls.Overload(overloads.GreaterInt64, - argTypes(types.IntType, types.IntType), types.BoolType), + argTypes(types.IntType, types.IntType), types.BoolType, + decls.OverloadExamples(`3 > -2 // true`)), decls.Overload(overloads.GreaterInt64Double, - argTypes(types.IntType, types.DoubleType), types.BoolType), + argTypes(types.IntType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2 > 1.1 // true`)), decls.Overload(overloads.GreaterInt64Uint64, - argTypes(types.IntType, types.UintType), types.BoolType), + argTypes(types.IntType, types.UintType), types.BoolType, + decls.OverloadExamples(`3 > 2u // true`)), decls.Overload(overloads.GreaterUint64, - argTypes(types.UintType, types.UintType), types.BoolType), + argTypes(types.UintType, types.UintType), types.BoolType, + decls.OverloadExamples(`2u > 1u // true`)), decls.Overload(overloads.GreaterUint64Double, - argTypes(types.UintType, types.DoubleType), types.BoolType), + argTypes(types.UintType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2u > 1.9 // true`)), decls.Overload(overloads.GreaterUint64Int64, - argTypes(types.UintType, types.IntType), types.BoolType), + argTypes(types.UintType, types.IntType), types.BoolType, + decls.OverloadExamples(`23u > 1 // true`, `0u > -1 // true`)), decls.Overload(overloads.GreaterDouble, - argTypes(types.DoubleType, types.DoubleType), types.BoolType), + argTypes(types.DoubleType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2.4 > 2.0 // true`)), decls.Overload(overloads.GreaterDoubleInt64, - argTypes(types.DoubleType, types.IntType), types.BoolType), + argTypes(types.DoubleType, types.IntType), types.BoolType, + decls.OverloadExamples(`3.1 > 3 // true`, `3.0 > 3 // false`)), decls.Overload(overloads.GreaterDoubleUint64, - argTypes(types.DoubleType, types.UintType), types.BoolType), + argTypes(types.DoubleType, types.UintType), types.BoolType, + decls.OverloadExamples(`2.3 > 2u // true`)), decls.Overload(overloads.GreaterString, - argTypes(types.StringType, types.StringType), types.BoolType), + argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples(`'b' > 'a' // true`)), decls.Overload(overloads.GreaterBytes, - argTypes(types.BytesType, types.BytesType), types.BoolType), + argTypes(types.BytesType, types.BytesType), types.BoolType, + decls.OverloadExamples(`b'world' > b'hello' // true`)), decls.Overload(overloads.GreaterTimestamp, - argTypes(types.TimestampType, types.TimestampType), types.BoolType), + argTypes(types.TimestampType, types.TimestampType), types.BoolType, + decls.OverloadExamples(`timestamp('2002-02-02T02:03:04Z') > timestamp('2001-01-01T02:03:04Z') // true`)), decls.Overload(overloads.GreaterDuration, - argTypes(types.DurationType, types.DurationType), types.BoolType), + argTypes(types.DurationType, types.DurationType), types.BoolType, + decls.OverloadExamples(`duration('1ms') > duration('1us') // true`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { cmp := lhs.(traits.Comparer).Compare(rhs) if cmp == types.IntOne { @@ -296,34 +435,51 @@ func init() { }, traits.ComparerType)), function(operators.GreaterEquals, + decls.FunctionDocs( + `compare two values and return true if the first value is`, + `greater than or equal to the second`), decls.Overload(overloads.GreaterEqualsBool, - argTypes(types.BoolType, types.BoolType), types.BoolType), + argTypes(types.BoolType, types.BoolType), types.BoolType, + decls.OverloadExamples(`true >= false // true`)), decls.Overload(overloads.GreaterEqualsInt64, - argTypes(types.IntType, types.IntType), types.BoolType), + argTypes(types.IntType, types.IntType), types.BoolType, + decls.OverloadExamples(`3 >= -2 // true`)), decls.Overload(overloads.GreaterEqualsInt64Double, - argTypes(types.IntType, types.DoubleType), types.BoolType), + argTypes(types.IntType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2 >= 1.1 // true`, `1 >= 1.0 // true`)), decls.Overload(overloads.GreaterEqualsInt64Uint64, - argTypes(types.IntType, types.UintType), types.BoolType), + argTypes(types.IntType, types.UintType), types.BoolType, + decls.OverloadExamples(`3 >= 2u // true`)), decls.Overload(overloads.GreaterEqualsUint64, - argTypes(types.UintType, types.UintType), types.BoolType), + argTypes(types.UintType, types.UintType), types.BoolType, + decls.OverloadExamples(`2u >= 1u // true`)), decls.Overload(overloads.GreaterEqualsUint64Double, - argTypes(types.UintType, types.DoubleType), types.BoolType), + argTypes(types.UintType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2u >= 1.9 // true`)), decls.Overload(overloads.GreaterEqualsUint64Int64, - argTypes(types.UintType, types.IntType), types.BoolType), + argTypes(types.UintType, types.IntType), types.BoolType, + decls.OverloadExamples(`23u >= 1 // true`, `1u >= 1 // true`)), decls.Overload(overloads.GreaterEqualsDouble, - argTypes(types.DoubleType, types.DoubleType), types.BoolType), + argTypes(types.DoubleType, types.DoubleType), types.BoolType, + decls.OverloadExamples(`2.4 >= 2.0 // true`)), decls.Overload(overloads.GreaterEqualsDoubleInt64, - argTypes(types.DoubleType, types.IntType), types.BoolType), + argTypes(types.DoubleType, types.IntType), types.BoolType, + decls.OverloadExamples(`3.1 >= 3 // true`)), decls.Overload(overloads.GreaterEqualsDoubleUint64, - argTypes(types.DoubleType, types.UintType), types.BoolType), + argTypes(types.DoubleType, types.UintType), types.BoolType, + decls.OverloadExamples(`2.3 >= 2u // true`)), decls.Overload(overloads.GreaterEqualsString, - argTypes(types.StringType, types.StringType), types.BoolType), + argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples(`'b' >= 'a' // true`)), decls.Overload(overloads.GreaterEqualsBytes, - argTypes(types.BytesType, types.BytesType), types.BoolType), + argTypes(types.BytesType, types.BytesType), types.BoolType, + decls.OverloadExamples(`b'world' >= b'hello' // true`)), decls.Overload(overloads.GreaterEqualsTimestamp, - argTypes(types.TimestampType, types.TimestampType), types.BoolType), + argTypes(types.TimestampType, types.TimestampType), types.BoolType, + decls.OverloadExamples(`timestamp('2001-01-01T02:03:04Z') >= timestamp('2001-01-01T02:03:04Z') // true`)), decls.Overload(overloads.GreaterEqualsDuration, - argTypes(types.DurationType, types.DurationType), types.BoolType), + argTypes(types.DurationType, types.DurationType), types.BoolType, + decls.OverloadExamples(`duration('60s') >= duration('1m') // true`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { cmp := lhs.(traits.Comparer).Compare(rhs) if cmp == types.IntOne || cmp == types.IntZero { @@ -337,16 +493,28 @@ func init() { // Indexing function(operators.Index, - decls.Overload(overloads.IndexList, argTypes(listOfA, types.IntType), paramA), - decls.Overload(overloads.IndexMap, argTypes(mapOfAB, paramA), paramB), + decls.FunctionDocs(`select a value from a list by index, or value from a map by key`), + decls.Overload(overloads.IndexList, argTypes(listOfA, types.IntType), paramA, + decls.OverloadExamples(`[1, 2, 3][1] // 2`)), + decls.Overload(overloads.IndexMap, argTypes(mapOfAB, paramA), paramB, + decls.OverloadExamples( + `{'key': 'value'}['key'] // 'value'`, + `{'key': 'value'}['missing'] // error`)), decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val { return lhs.(traits.Indexer).Get(rhs) }, traits.IndexerType)), // Collections operators function(operators.In, - decls.Overload(overloads.InList, argTypes(paramA, listOfA), types.BoolType), - decls.Overload(overloads.InMap, argTypes(paramA, mapOfAB), types.BoolType), + decls.FunctionDocs(`test whether a value exists in a list, or a key exists in a map`), + decls.Overload(overloads.InList, argTypes(paramA, listOfA), types.BoolType, + decls.OverloadExamples( + `2 in [1, 2, 3] // true`, + `"a" in ["b", "c"] // false`)), + decls.Overload(overloads.InMap, argTypes(paramA, mapOfAB), types.BoolType, + decls.OverloadExamples( + `'key1' in {'key1': 'value1', 'key2': 'value2'} // true`, + `3 in {1: "one", 2: "two"} // false`)), decls.SingletonBinaryBinding(inAggregate)), function(operators.OldIn, decls.DisableDeclaration(true), // safe deprecation @@ -359,209 +527,364 @@ func init() { decls.Overload(overloads.InMap, argTypes(paramA, mapOfAB), types.BoolType), decls.SingletonBinaryBinding(inAggregate)), function(overloads.Size, - decls.Overload(overloads.SizeBytes, argTypes(types.BytesType), types.IntType), - decls.MemberOverload(overloads.SizeBytesInst, argTypes(types.BytesType), types.IntType), - decls.Overload(overloads.SizeList, argTypes(listOfA), types.IntType), - decls.MemberOverload(overloads.SizeListInst, argTypes(listOfA), types.IntType), - decls.Overload(overloads.SizeMap, argTypes(mapOfAB), types.IntType), - decls.MemberOverload(overloads.SizeMapInst, argTypes(mapOfAB), types.IntType), - decls.Overload(overloads.SizeString, argTypes(types.StringType), types.IntType), - decls.MemberOverload(overloads.SizeStringInst, argTypes(types.StringType), types.IntType), + decls.FunctionDocs( + `compute the size of a list or map, the number of characters in a string,`, + `or the number of bytes in a sequence`), + decls.Overload(overloads.SizeBytes, argTypes(types.BytesType), types.IntType, + decls.OverloadExamples(`size(b'123') // 3`)), + decls.MemberOverload(overloads.SizeBytesInst, argTypes(types.BytesType), types.IntType, + decls.OverloadExamples(`b'123'.size() // 3`)), + decls.Overload(overloads.SizeList, argTypes(listOfA), types.IntType, + decls.OverloadExamples(`size([1, 2, 3]) // 3`)), + decls.MemberOverload(overloads.SizeListInst, argTypes(listOfA), types.IntType, + decls.OverloadExamples(`[1, 2, 3].size() // 3`)), + decls.Overload(overloads.SizeMap, argTypes(mapOfAB), types.IntType, + decls.OverloadExamples(`size({'a': 1, 'b': 2}) // 2`)), + decls.MemberOverload(overloads.SizeMapInst, argTypes(mapOfAB), types.IntType, + decls.OverloadExamples(`{'a': 1, 'b': 2}.size() // 2`)), + decls.Overload(overloads.SizeString, argTypes(types.StringType), types.IntType, + decls.OverloadExamples(`size('hello') // 5`)), + decls.MemberOverload(overloads.SizeStringInst, argTypes(types.StringType), types.IntType, + decls.OverloadExamples(`'hello'.size() // 5`)), decls.SingletonUnaryBinding(func(val ref.Val) ref.Val { return val.(traits.Sizer).Size() }, traits.SizerType)), // Type conversions function(overloads.TypeConvertType, - decls.Overload(overloads.TypeConvertType, argTypes(paramA), types.NewTypeTypeWithParam(paramA)), + decls.FunctionDocs(`convert a value to its type identifier`), + decls.Overload(overloads.TypeConvertType, argTypes(paramA), types.NewTypeTypeWithParam(paramA), + decls.OverloadExamples( + `type(1) // int`, + `type('hello') // string`, + `type(int) // type`, + `type(type) // type`)), decls.SingletonUnaryBinding(convertToType(types.TypeType))), // Bool conversions function(overloads.TypeConvertBool, + decls.FunctionDocs(`convert a value to a boolean`), decls.Overload(overloads.BoolToBool, argTypes(types.BoolType), types.BoolType, + + decls.OverloadExamples(`bool(true) // true`), decls.UnaryBinding(identity)), decls.Overload(overloads.StringToBool, argTypes(types.StringType), types.BoolType, + + decls.OverloadExamples(`bool('true') // true`, `bool('false') // false`), decls.UnaryBinding(convertToType(types.BoolType)))), // Bytes conversions function(overloads.TypeConvertBytes, + decls.FunctionDocs(`convert a value to bytes`), decls.Overload(overloads.BytesToBytes, argTypes(types.BytesType), types.BytesType, + decls.OverloadExamples(`bytes(b'abc') // b'abc'`), decls.UnaryBinding(identity)), decls.Overload(overloads.StringToBytes, argTypes(types.StringType), types.BytesType, + decls.OverloadExamples(`bytes('hello') // b'hello'`), decls.UnaryBinding(convertToType(types.BytesType)))), // Double conversions function(overloads.TypeConvertDouble, + decls.FunctionDocs(`convert a value to a double`), decls.Overload(overloads.DoubleToDouble, argTypes(types.DoubleType), types.DoubleType, + decls.OverloadExamples(`double(1.23) // 1.23`), decls.UnaryBinding(identity)), decls.Overload(overloads.IntToDouble, argTypes(types.IntType), types.DoubleType, + decls.OverloadExamples(`double(123) // 123.0`), decls.UnaryBinding(convertToType(types.DoubleType))), decls.Overload(overloads.StringToDouble, argTypes(types.StringType), types.DoubleType, + decls.OverloadExamples(`double('1.23') // 1.23`), decls.UnaryBinding(convertToType(types.DoubleType))), decls.Overload(overloads.UintToDouble, argTypes(types.UintType), types.DoubleType, + decls.OverloadExamples(`double(123u) // 123.0`), decls.UnaryBinding(convertToType(types.DoubleType)))), // Duration conversions function(overloads.TypeConvertDuration, + decls.FunctionDocs(`convert a value to a google.protobuf.Duration`), decls.Overload(overloads.DurationToDuration, argTypes(types.DurationType), types.DurationType, + decls.OverloadExamples(`duration(duration('1s')) // duration('1s')`), decls.UnaryBinding(identity)), decls.Overload(overloads.IntToDuration, argTypes(types.IntType), types.DurationType, decls.UnaryBinding(convertToType(types.DurationType))), decls.Overload(overloads.StringToDuration, argTypes(types.StringType), types.DurationType, + decls.OverloadExamples(`duration('1h2m3s') // duration('3723s')`), decls.UnaryBinding(convertToType(types.DurationType)))), // Dyn conversions function(overloads.TypeConvertDyn, - decls.Overload(overloads.ToDyn, argTypes(paramA), types.DynType), + decls.FunctionDocs(`indicate that the type is dynamic for type-checking purposes`), + decls.Overload(overloads.ToDyn, argTypes(paramA), types.DynType, + decls.OverloadExamples(`dyn(1) // 1`)), decls.SingletonUnaryBinding(identity)), // Int conversions function(overloads.TypeConvertInt, + decls.FunctionDocs(`convert a value to an int`), decls.Overload(overloads.IntToInt, argTypes(types.IntType), types.IntType, + decls.OverloadExamples(`int(123) // 123`), decls.UnaryBinding(identity)), decls.Overload(overloads.DoubleToInt, argTypes(types.DoubleType), types.IntType, + decls.OverloadExamples(`int(123.45) // 123`), decls.UnaryBinding(convertToType(types.IntType))), decls.Overload(overloads.DurationToInt, argTypes(types.DurationType), types.IntType, - decls.UnaryBinding(convertToType(types.IntType))), + decls.OverloadExamples(`int(duration('1s')) // 1000000000`), + decls.UnaryBinding(convertToType(types.IntType))), // Duration to nanoseconds decls.Overload(overloads.StringToInt, argTypes(types.StringType), types.IntType, + decls.OverloadExamples(`int('123') // 123`, `int('-456') // -456`), decls.UnaryBinding(convertToType(types.IntType))), decls.Overload(overloads.TimestampToInt, argTypes(types.TimestampType), types.IntType, - decls.UnaryBinding(convertToType(types.IntType))), + decls.OverloadExamples(`int(timestamp('1970-01-01T00:00:01Z')) // 1`), + decls.UnaryBinding(convertToType(types.IntType))), // Timestamp to epoch seconds decls.Overload(overloads.UintToInt, argTypes(types.UintType), types.IntType, - decls.UnaryBinding(convertToType(types.IntType))), - ), + decls.OverloadExamples(`int(123u) // 123`), + decls.UnaryBinding(convertToType(types.IntType)))), // String conversions function(overloads.TypeConvertString, + decls.FunctionDocs(`convert a value to a string`), decls.Overload(overloads.StringToString, argTypes(types.StringType), types.StringType, + decls.OverloadExamples(`string('hello') // 'hello'`), decls.UnaryBinding(identity)), decls.Overload(overloads.BoolToString, argTypes(types.BoolType), types.StringType, + decls.OverloadExamples(`string(true) // 'true'`), decls.UnaryBinding(convertToType(types.StringType))), decls.Overload(overloads.BytesToString, argTypes(types.BytesType), types.StringType, + decls.OverloadExamples(`string(b'hello') // 'hello'`), decls.UnaryBinding(convertToType(types.StringType))), decls.Overload(overloads.DoubleToString, argTypes(types.DoubleType), types.StringType, - decls.UnaryBinding(convertToType(types.StringType))), + decls.UnaryBinding(convertToType(types.StringType)), + decls.OverloadExamples(`string(-1.23e4) // '-12300'`)), decls.Overload(overloads.DurationToString, argTypes(types.DurationType), types.StringType, + decls.OverloadExamples(`string(duration('1h30m')) // '5400s'`), decls.UnaryBinding(convertToType(types.StringType))), decls.Overload(overloads.IntToString, argTypes(types.IntType), types.StringType, + decls.OverloadExamples(`string(-123) // '-123'`), decls.UnaryBinding(convertToType(types.StringType))), decls.Overload(overloads.TimestampToString, argTypes(types.TimestampType), types.StringType, + decls.OverloadExamples(`string(timestamp('1970-01-01T00:00:00Z')) // '1970-01-01T00:00:00Z'`), decls.UnaryBinding(convertToType(types.StringType))), decls.Overload(overloads.UintToString, argTypes(types.UintType), types.StringType, + decls.OverloadExamples(`string(123u) // '123'`), decls.UnaryBinding(convertToType(types.StringType)))), // Timestamp conversions function(overloads.TypeConvertTimestamp, + decls.FunctionDocs(`convert a value to a google.protobuf.Timestamp`), decls.Overload(overloads.TimestampToTimestamp, argTypes(types.TimestampType), types.TimestampType, + decls.OverloadExamples(`timestamp(timestamp('2023-01-01T00:00:00Z')) // timestamp('2023-01-01T00:00:00Z')`), decls.UnaryBinding(identity)), decls.Overload(overloads.IntToTimestamp, argTypes(types.IntType), types.TimestampType, + decls.OverloadExamples(`timestamp(1) // timestamp('1970-01-01T00:00:01Z')`), // Epoch seconds to Timestamp decls.UnaryBinding(convertToType(types.TimestampType))), decls.Overload(overloads.StringToTimestamp, argTypes(types.StringType), types.TimestampType, + decls.OverloadExamples(`timestamp('2025-01-01T12:34:56Z') // timestamp('2025-01-01T12:34:56Z')`), decls.UnaryBinding(convertToType(types.TimestampType)))), // Uint conversions function(overloads.TypeConvertUint, + decls.FunctionDocs(`convert a value to a uint`), decls.Overload(overloads.UintToUint, argTypes(types.UintType), types.UintType, + decls.OverloadExamples(`uint(123u) // 123u`), decls.UnaryBinding(identity)), decls.Overload(overloads.DoubleToUint, argTypes(types.DoubleType), types.UintType, + decls.OverloadExamples(`uint(123.45) // 123u`), decls.UnaryBinding(convertToType(types.UintType))), decls.Overload(overloads.IntToUint, argTypes(types.IntType), types.UintType, + decls.OverloadExamples(`uint(123) // 123u`), decls.UnaryBinding(convertToType(types.UintType))), decls.Overload(overloads.StringToUint, argTypes(types.StringType), types.UintType, + decls.OverloadExamples(`uint('123') // 123u`), decls.UnaryBinding(convertToType(types.UintType)))), // String functions function(overloads.Contains, + decls.FunctionDocs(`test whether a string contains a substring`), decls.MemberOverload(overloads.ContainsString, argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples( + `'hello world'.contains('o w') // true`, + `'hello world'.contains('goodbye') // false`), decls.BinaryBinding(types.StringContains)), decls.DisableTypeGuards(true)), function(overloads.EndsWith, + decls.FunctionDocs(`test whether a string ends with a substring suffix`), decls.MemberOverload(overloads.EndsWithString, argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples( + `'hello world'.endsWith('world') // true`, + `'hello world'.endsWith('hello') // false`), decls.BinaryBinding(types.StringEndsWith)), decls.DisableTypeGuards(true)), function(overloads.StartsWith, + decls.FunctionDocs(`test whether a string starts with a substring prefix`), decls.MemberOverload(overloads.StartsWithString, argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples( + `'hello world'.startsWith('hello') // true`, + `'hello world'.startsWith('world') // false`), decls.BinaryBinding(types.StringStartsWith)), decls.DisableTypeGuards(true)), function(overloads.Matches, - decls.Overload(overloads.Matches, argTypes(types.StringType, types.StringType), types.BoolType), + decls.FunctionDocs(`test whether a string matches an RE2 regular expression`), + decls.Overload(overloads.Matches, argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples( + `matches('123-456', '^[0-9]+(-[0-9]+)?$') // true`, + `matches('hello', '^h.*o$') // true`)), decls.MemberOverload(overloads.MatchesString, - argTypes(types.StringType, types.StringType), types.BoolType), + argTypes(types.StringType, types.StringType), types.BoolType, + decls.OverloadExamples( + `'123-456'.matches('^[0-9]+(-[0-9]+)?$') // true`, + `'hello'.matches('^h.*o$') // true`)), decls.SingletonBinaryBinding(func(str, pat ref.Val) ref.Val { return str.(traits.Matcher).Match(pat) }, traits.MatcherType)), // Timestamp / duration functions function(overloads.TimeGetFullYear, + decls.FunctionDocs(`get the 0-based full year from a timestamp, UTC unless an IANA timezone is specified.`), decls.MemberOverload(overloads.TimestampToYear, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getFullYear() // 2023`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetFullYear(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToYearWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType)), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-01-01T05:30:00Z').getFullYear('-08:00') // 2022`), + decls.BinaryBinding(timestampGetFullYear))), function(overloads.TimeGetMonth, + decls.FunctionDocs(`get the 0-based month from a timestamp, UTC unless an IANA timezone is specified.`), decls.MemberOverload(overloads.TimestampToMonth, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getMonth() // 6`), // July is month 6 + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetMonth(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToMonthWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType)), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-01-01T05:30:00Z').getMonth('America/Los_Angeles') // 11`), // December is month 11 + decls.BinaryBinding(timestampGetMonth))), function(overloads.TimeGetDayOfYear, + decls.FunctionDocs(`get the 0-based day of the year from a timestamp, UTC unless an IANA timezone is specified.`), decls.MemberOverload(overloads.TimestampToDayOfYear, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-01-02T00:00:00Z').getDayOfYear() // 1`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfYear(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToDayOfYearWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType)), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-01-01T05:00:00Z').getDayOfYear('America/Los_Angeles') // 364`), + decls.BinaryBinding(timestampGetDayOfYear))), function(overloads.TimeGetDayOfMonth, + decls.FunctionDocs(`get the 0-based day of the month from a timestamp, UTC unless an IANA timezone is specified.`), decls.MemberOverload(overloads.TimestampToDayOfMonthZeroBased, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getDayOfMonth() // 13`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfMonthZeroBased(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToDayOfMonthZeroBasedWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType)), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-01T05:00:00Z').getDayOfMonth('America/Los_Angeles') // 29`), + decls.BinaryBinding(timestampGetDayOfMonthZeroBased))), function(overloads.TimeGetDate, + decls.FunctionDocs(`get the 1-based day of the month from a timestamp, UTC unless an IANA timezone is specified.`), decls.MemberOverload(overloads.TimestampToDayOfMonthOneBased, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getDate() // 14`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfMonthOneBased(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToDayOfMonthOneBasedWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType)), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-01T05:00:00Z').getDate('America/Los_Angeles') // 30`), + decls.BinaryBinding(timestampGetDayOfMonthOneBased))), function(overloads.TimeGetDayOfWeek, + decls.FunctionDocs(`get the 0-based day of the week from a timestamp, UTC unless an IANA timezone is specified.`), decls.MemberOverload(overloads.TimestampToDayOfWeek, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getDayOfWeek() // 5`), // Friday is day 5 + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetDayOfWeek(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToDayOfWeekWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType)), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-16T05:00:00Z').getDayOfWeek('America/Los_Angeles') // 6`), // Saturday is day 6 + decls.BinaryBinding(timestampGetDayOfWeek))), function(overloads.TimeGetHours, + decls.FunctionDocs(`get the hours portion from a timestamp, or convert a duration to hours`), decls.MemberOverload(overloads.TimestampToHours, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getHours() // 10`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetHours(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToHoursWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getHours('America/Los_Angeles') // 2`), + decls.BinaryBinding(timestampGetHours)), decls.MemberOverload(overloads.DurationToHours, - argTypes(types.DurationType), types.IntType)), + argTypes(types.DurationType), types.IntType, + decls.OverloadExamples(`duration('3723s').getHours() // 1`), + decls.UnaryBinding(types.DurationGetHours))), function(overloads.TimeGetMinutes, + decls.FunctionDocs(`get the minutes portion from a timestamp, or convert a duration to minutes`), decls.MemberOverload(overloads.TimestampToMinutes, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getMinutes() // 30`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetMinutes(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToMinutesWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getMinutes('America/Los_Angeles') // 30`), + decls.BinaryBinding(timestampGetMinutes)), decls.MemberOverload(overloads.DurationToMinutes, - argTypes(types.DurationType), types.IntType)), + argTypes(types.DurationType), types.IntType, + decls.OverloadExamples(`duration('3723s').getMinutes() // 62`), + decls.UnaryBinding(types.DurationGetMinutes))), function(overloads.TimeGetSeconds, + decls.FunctionDocs(`get the seconds portion from a timestamp, or convert a duration to seconds`), decls.MemberOverload(overloads.TimestampToSeconds, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getSeconds() // 45`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetSeconds(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToSecondsWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getSeconds('America/Los_Angeles') // 45`), + decls.BinaryBinding(timestampGetSeconds)), decls.MemberOverload(overloads.DurationToSeconds, - argTypes(types.DurationType), types.IntType)), + argTypes(types.DurationType), types.IntType, + decls.OverloadExamples(`duration('3723.456s').getSeconds() // 3723`), + decls.UnaryBinding(types.DurationGetSeconds))), function(overloads.TimeGetMilliseconds, + decls.FunctionDocs(`get the milliseconds portion from a timestamp`), decls.MemberOverload(overloads.TimestampToMilliseconds, - argTypes(types.TimestampType), types.IntType), + argTypes(types.TimestampType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getMilliseconds() // 123`), + decls.UnaryBinding(func(ts ref.Val) ref.Val { + return timestampGetMilliseconds(ts, utcTZ) + })), decls.MemberOverload(overloads.TimestampToMillisecondsWithTz, - argTypes(types.TimestampType, types.StringType), types.IntType), + argTypes(types.TimestampType, types.StringType), types.IntType, + decls.OverloadExamples(`timestamp('2023-07-14T10:30:45.123Z').getMilliseconds('America/Los_Angeles') // 123`), + decls.BinaryBinding(timestampGetMilliseconds)), decls.MemberOverload(overloads.DurationToMilliseconds, - argTypes(types.DurationType), types.IntType)), + argTypes(types.DurationType), types.IntType, + decls.UnaryBinding(types.DurationGetMilliseconds))), } } @@ -618,3 +941,118 @@ func convertToType(t ref.Type) functions.UnaryOp { return val.ConvertToType(t) } } + +func timestampGetFullYear(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Year()) +} + +func timestampGetMonth(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + // CEL spec indicates that the month should be 0-based, but the Time value + // for Month() is 1-based. + return types.Int(t.Month() - 1) +} + +func timestampGetDayOfYear(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.YearDay() - 1) +} + +func timestampGetDayOfMonthZeroBased(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Day() - 1) +} + +func timestampGetDayOfMonthOneBased(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Day()) +} + +func timestampGetDayOfWeek(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Weekday()) +} + +func timestampGetHours(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Hour()) +} + +func timestampGetMinutes(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Minute()) +} + +func timestampGetSeconds(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Second()) +} + +func timestampGetMilliseconds(ts, tz ref.Val) ref.Val { + t, err := inTimeZone(ts, tz) + if err != nil { + return types.NewErrFromString(err.Error()) + } + return types.Int(t.Nanosecond() / 1000000) +} + +func inTimeZone(ts, tz ref.Val) (time.Time, error) { + t := ts.(types.Timestamp) + val := string(tz.(types.String)) + ind := strings.Index(val, ":") + if ind == -1 { + loc, err := time.LoadLocation(val) + if err != nil { + return time.Time{}, err + } + return t.In(loc), nil + } + + // If the input is not the name of a timezone (for example, 'US/Central'), it should be a numerical offset from UTC + // in the format ^(+|-)(0[0-9]|1[0-4]):[0-5][0-9]$. The numerical input is parsed in terms of hours and minutes. + hr, err := strconv.Atoi(string(val[0:ind])) + if err != nil { + return time.Time{}, err + } + min, err := strconv.Atoi(string(val[ind+1:])) + if err != nil { + return time.Time{}, err + } + var offset int + if string(val[0]) == "-" { + offset = hr*60 - min + } else { + offset = hr*60 + min + } + secondsEastOfUTC := int((time.Duration(offset) * time.Minute).Seconds()) + timezone := time.FixedZone("", secondsEastOfUTC) + return t.In(timezone), nil +} diff --git a/vendor/github.com/google/cel-go/common/types/BUILD.bazel b/vendor/github.com/google/cel-go/common/types/BUILD.bazel index 8f010fae44..7082bc7550 100644 --- a/vendor/github.com/google/cel-go/common/types/BUILD.bazel +++ b/vendor/github.com/google/cel-go/common/types/BUILD.bazel @@ -18,6 +18,7 @@ go_library( "int.go", "iterator.go", "json_value.go", + "format.go", "list.go", "map.go", "null.go", diff --git a/vendor/github.com/google/cel-go/common/types/bool.go b/vendor/github.com/google/cel-go/common/types/bool.go index 565734f3ff..1f9e107392 100644 --- a/vendor/github.com/google/cel-go/common/types/bool.go +++ b/vendor/github.com/google/cel-go/common/types/bool.go @@ -18,6 +18,7 @@ import ( "fmt" "reflect" "strconv" + "strings" "github.com/google/cel-go/common/types/ref" @@ -128,6 +129,14 @@ func (b Bool) Value() any { return bool(b) } +func (b Bool) format(sb *strings.Builder) { + if b { + sb.WriteString("true") + } else { + sb.WriteString("false") + } +} + // IsBool returns whether the input ref.Val or ref.Type is equal to BoolType. func IsBool(elem ref.Val) bool { switch v := elem.(type) { diff --git a/vendor/github.com/google/cel-go/common/types/bytes.go b/vendor/github.com/google/cel-go/common/types/bytes.go index 7e813e291b..b59e1fc208 100644 --- a/vendor/github.com/google/cel-go/common/types/bytes.go +++ b/vendor/github.com/google/cel-go/common/types/bytes.go @@ -19,6 +19,7 @@ import ( "encoding/base64" "fmt" "reflect" + "strings" "unicode/utf8" "github.com/google/cel-go/common/types/ref" @@ -138,3 +139,17 @@ func (b Bytes) Type() ref.Type { func (b Bytes) Value() any { return []byte(b) } + +func (b Bytes) format(sb *strings.Builder) { + fmt.Fprintf(sb, "b\"%s\"", bytesToOctets([]byte(b))) +} + +// bytesToOctets converts byte sequences to a string using a three digit octal encoded value +// per byte. +func bytesToOctets(byteVal []byte) string { + var b strings.Builder + for _, c := range byteVal { + fmt.Fprintf(&b, "\\%03o", c) + } + return b.String() +} diff --git a/vendor/github.com/google/cel-go/common/types/double.go b/vendor/github.com/google/cel-go/common/types/double.go index 027e789786..1e7de9d6e1 100644 --- a/vendor/github.com/google/cel-go/common/types/double.go +++ b/vendor/github.com/google/cel-go/common/types/double.go @@ -18,6 +18,8 @@ import ( "fmt" "math" "reflect" + "strconv" + "strings" "github.com/google/cel-go/common/types/ref" @@ -209,3 +211,23 @@ func (d Double) Type() ref.Type { func (d Double) Value() any { return float64(d) } + +func (d Double) format(sb *strings.Builder) { + if math.IsNaN(float64(d)) { + sb.WriteString(`double("NaN")`) + return + } + if math.IsInf(float64(d), -1) { + sb.WriteString(`double("-Infinity")`) + return + } + if math.IsInf(float64(d), 1) { + sb.WriteString(`double("Infinity")`) + return + } + s := strconv.FormatFloat(float64(d), 'f', -1, 64) + sb.WriteString(s) + if !strings.ContainsRune(s, '.') { + sb.WriteString(".0") + } +} diff --git a/vendor/github.com/google/cel-go/common/types/duration.go b/vendor/github.com/google/cel-go/common/types/duration.go index 596e56d6b0..be58d567ed 100644 --- a/vendor/github.com/google/cel-go/common/types/duration.go +++ b/vendor/github.com/google/cel-go/common/types/duration.go @@ -18,6 +18,7 @@ import ( "fmt" "reflect" "strconv" + "strings" "time" "github.com/google/cel-go/common/overloads" @@ -185,6 +186,10 @@ func (d Duration) Value() any { return d.Duration } +func (d Duration) format(sb *strings.Builder) { + fmt.Fprintf(sb, `duration("%ss")`, strconv.FormatFloat(d.Seconds(), 'f', -1, 64)) +} + // DurationGetHours returns the duration in hours. func DurationGetHours(val ref.Val) ref.Val { dur, ok := val.(Duration) diff --git a/vendor/github.com/google/cel-go/common/types/err.go b/vendor/github.com/google/cel-go/common/types/err.go index 9c9d9e21ef..17ab1a95e5 100644 --- a/vendor/github.com/google/cel-go/common/types/err.go +++ b/vendor/github.com/google/cel-go/common/types/err.go @@ -62,6 +62,12 @@ func NewErr(format string, args ...any) ref.Val { return &Err{error: fmt.Errorf(format, args...)} } +// NewErrFromString creates a new Err with the provided message. +// TODO: Audit the use of this function and standardize the error messages and codes. +func NewErrFromString(message string) ref.Val { + return &Err{error: errors.New(message)} +} + // NewErrWithNodeID creates a new Err described by the format string and args. // TODO: Audit the use of this function and standardize the error messages and codes. func NewErrWithNodeID(id int64, format string, args ...any) ref.Val { diff --git a/vendor/github.com/google/cel-go/common/types/format.go b/vendor/github.com/google/cel-go/common/types/format.go new file mode 100644 index 0000000000..174a2bd040 --- /dev/null +++ b/vendor/github.com/google/cel-go/common/types/format.go @@ -0,0 +1,42 @@ +package types + +import ( + "fmt" + "strings" + + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" +) + +type formattable interface { + format(*strings.Builder) +} + +// Format formats the value as a string. The result is only intended for human consumption and ignores errors. +// Do not depend on the output being stable. It may change at any time. +func Format(val ref.Val) string { + var sb strings.Builder + formatTo(&sb, val) + return sb.String() +} + +func formatTo(sb *strings.Builder, val ref.Val) { + if fmtable, ok := val.(formattable); ok { + fmtable.format(sb) + return + } + // All of the builtins implement formattable. Try to deal with traits. + if l, ok := val.(traits.Lister); ok { + formatList(l, sb) + return + } + if m, ok := val.(traits.Mapper); ok { + formatMap(m, sb) + return + } + // This could be an error, unknown, opaque or object. + // Unfortunately we have no consistent way of inspecting + // opaque and object. So we just fallback to fmt.Stringer + // and hope it is relavent. + fmt.Fprintf(sb, "%s", val) +} diff --git a/vendor/github.com/google/cel-go/common/types/int.go b/vendor/github.com/google/cel-go/common/types/int.go index 0ae9507c39..0ac1997b70 100644 --- a/vendor/github.com/google/cel-go/common/types/int.go +++ b/vendor/github.com/google/cel-go/common/types/int.go @@ -19,6 +19,7 @@ import ( "math" "reflect" "strconv" + "strings" "time" "github.com/google/cel-go/common/types/ref" @@ -290,6 +291,10 @@ func (i Int) Value() any { return int64(i) } +func (i Int) format(sb *strings.Builder) { + sb.WriteString(strconv.FormatInt(int64(i), 10)) +} + // isJSONSafe indicates whether the int is safely representable as a floating point value in JSON. func (i Int) isJSONSafe() bool { return i >= minIntJSON && i <= maxIntJSON diff --git a/vendor/github.com/google/cel-go/common/types/list.go b/vendor/github.com/google/cel-go/common/types/list.go index ca47d39fec..8c023f8910 100644 --- a/vendor/github.com/google/cel-go/common/types/list.go +++ b/vendor/github.com/google/cel-go/common/types/list.go @@ -243,7 +243,7 @@ func (l *baseList) Equal(other ref.Val) ref.Val { func (l *baseList) Get(index ref.Val) ref.Val { ind, err := IndexOrError(index) if err != nil { - return ValOrErr(index, err.Error()) + return ValOrErr(index, "%v", err) } if ind < 0 || ind >= l.size { return NewErr("index '%d' out of range in list size '%d'", ind, l.Size()) @@ -299,6 +299,22 @@ func (l *baseList) String() string { return sb.String() } +func formatList(l traits.Lister, sb *strings.Builder) { + sb.WriteString("[") + n, _ := l.Size().(Int) + for i := 0; i < int(n); i++ { + formatTo(sb, l.Get(Int(i))) + if i != int(n)-1 { + sb.WriteString(", ") + } + } + sb.WriteString("]") +} + +func (l *baseList) format(sb *strings.Builder) { + formatList(l, sb) +} + // mutableList aggregates values into its internal storage. For use with internal CEL variables only. type mutableList struct { *baseList @@ -427,7 +443,7 @@ func (l *concatList) Equal(other ref.Val) ref.Val { func (l *concatList) Get(index ref.Val) ref.Val { ind, err := IndexOrError(index) if err != nil { - return ValOrErr(index, err.Error()) + return ValOrErr(index, "%v", err) } i := Int(ind) if i < l.prevList.Size().(Int) { diff --git a/vendor/github.com/google/cel-go/common/types/map.go b/vendor/github.com/google/cel-go/common/types/map.go index cb6cce78b0..b33096197c 100644 --- a/vendor/github.com/google/cel-go/common/types/map.go +++ b/vendor/github.com/google/cel-go/common/types/map.go @@ -17,6 +17,7 @@ package types import ( "fmt" "reflect" + "sort" "strings" "github.com/stoewer/go-strcase" @@ -318,6 +319,41 @@ func (m *baseMap) String() string { return sb.String() } +type baseMapEntry struct { + key string + val string +} + +func formatMap(m traits.Mapper, sb *strings.Builder) { + it := m.Iterator() + var ents []baseMapEntry + if s, ok := m.Size().(Int); ok { + ents = make([]baseMapEntry, 0, int(s)) + } + for it.HasNext() == True { + k := it.Next() + v, _ := m.Find(k) + ents = append(ents, baseMapEntry{Format(k), Format(v)}) + } + sort.SliceStable(ents, func(i, j int) bool { + return ents[i].key < ents[j].key + }) + sb.WriteString("{") + for i, ent := range ents { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(ent.key) + sb.WriteString(": ") + sb.WriteString(ent.val) + } + sb.WriteString("}") +} + +func (m *baseMap) format(sb *strings.Builder) { + formatMap(m, sb) +} + // Type implements the ref.Val interface method. func (m *baseMap) Type() ref.Type { return MapType diff --git a/vendor/github.com/google/cel-go/common/types/null.go b/vendor/github.com/google/cel-go/common/types/null.go index 36514ff200..2c0297fe65 100644 --- a/vendor/github.com/google/cel-go/common/types/null.go +++ b/vendor/github.com/google/cel-go/common/types/null.go @@ -17,6 +17,7 @@ package types import ( "fmt" "reflect" + "strings" "google.golang.org/protobuf/proto" @@ -117,3 +118,7 @@ func (n Null) Type() ref.Type { func (n Null) Value() any { return structpb.NullValue_NULL_VALUE } + +func (n Null) format(sb *strings.Builder) { + sb.WriteString("null") +} diff --git a/vendor/github.com/google/cel-go/common/types/object.go b/vendor/github.com/google/cel-go/common/types/object.go index 8ba0af9fbe..776f6954a9 100644 --- a/vendor/github.com/google/cel-go/common/types/object.go +++ b/vendor/github.com/google/cel-go/common/types/object.go @@ -17,9 +17,12 @@ package types import ( "fmt" "reflect" + "sort" + "strings" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" "github.com/google/cel-go/common/types/pb" "github.com/google/cel-go/common/types/ref" @@ -151,7 +154,7 @@ func (o *protoObj) Get(index ref.Val) ref.Val { } fv, err := fd.GetFrom(o.value) if err != nil { - return NewErr(err.Error()) + return NewErrFromString(err.Error()) } return o.NativeToValue(fv) } @@ -163,3 +166,29 @@ func (o *protoObj) Type() ref.Type { func (o *protoObj) Value() any { return o.value } + +type protoObjField struct { + fd protoreflect.FieldDescriptor + v protoreflect.Value +} + +func (o *protoObj) format(sb *strings.Builder) { + var fields []protoreflect.FieldDescriptor + o.value.ProtoReflect().Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { + fields = append(fields, fd) + return true + }) + sort.SliceStable(fields, func(i, j int) bool { + return fields[i].Number() < fields[j].Number() + }) + sb.WriteString(o.Type().TypeName()) + sb.WriteString("{") + for i, field := range fields { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(fmt.Sprintf("%s: ", field.Name())) + formatTo(sb, o.Get(String(field.Name()))) + } + sb.WriteString("}") +} diff --git a/vendor/github.com/google/cel-go/common/types/optional.go b/vendor/github.com/google/cel-go/common/types/optional.go index 97845a740c..b8685ebf55 100644 --- a/vendor/github.com/google/cel-go/common/types/optional.go +++ b/vendor/github.com/google/cel-go/common/types/optional.go @@ -18,6 +18,7 @@ import ( "errors" "fmt" "reflect" + "strings" "github.com/google/cel-go/common/types/ref" ) @@ -94,6 +95,16 @@ func (o *Optional) String() string { return "optional.none()" } +func (o *Optional) format(sb *strings.Builder) { + if o.HasValue() { + sb.WriteString(`optional.of(`) + formatTo(sb, o.GetValue()) + sb.WriteString(`)`) + } else { + sb.WriteString("optional.none()") + } +} + // Type implements the ref.Val interface method. func (o *Optional) Type() ref.Type { return OptionalType diff --git a/vendor/github.com/google/cel-go/common/types/pb/type.go b/vendor/github.com/google/cel-go/common/types/pb/type.go index bdd474c95a..171494f075 100644 --- a/vendor/github.com/google/cel-go/common/types/pb/type.go +++ b/vendor/github.com/google/cel-go/common/types/pb/type.go @@ -472,7 +472,7 @@ func unwrap(desc description, msg proto.Message) (any, bool, error) { } return v.GetValue(), true, nil } - return msg, false, nil + return unwrapDynamic(desc, msg.ProtoReflect()) } // unwrapDynamic unwraps a reflected protobuf Message value. diff --git a/vendor/github.com/google/cel-go/common/types/string.go b/vendor/github.com/google/cel-go/common/types/string.go index 3a93743f24..8aad4701cc 100644 --- a/vendor/github.com/google/cel-go/common/types/string.go +++ b/vendor/github.com/google/cel-go/common/types/string.go @@ -186,6 +186,10 @@ func (s String) Value() any { return string(s) } +func (s String) format(sb *strings.Builder) { + sb.WriteString(strconv.Quote(string(s))) +} + // StringContains returns whether the string contains a substring. func StringContains(s, sub ref.Val) ref.Val { str, ok := s.(String) diff --git a/vendor/github.com/google/cel-go/common/types/timestamp.go b/vendor/github.com/google/cel-go/common/types/timestamp.go index 33acdea8ef..f7be585916 100644 --- a/vendor/github.com/google/cel-go/common/types/timestamp.go +++ b/vendor/github.com/google/cel-go/common/types/timestamp.go @@ -179,6 +179,10 @@ func (t Timestamp) Value() any { return t.Time } +func (t Timestamp) format(sb *strings.Builder) { + fmt.Fprintf(sb, `timestamp("%s")`, t.Time.UTC().Format(time.RFC3339Nano)) +} + var ( timestampValueType = reflect.TypeOf(&tpb.Timestamp{}) diff --git a/vendor/github.com/google/cel-go/common/types/types.go b/vendor/github.com/google/cel-go/common/types/types.go index 1c5b6c40c3..78c77a9b5d 100644 --- a/vendor/github.com/google/cel-go/common/types/types.go +++ b/vendor/github.com/google/cel-go/common/types/types.go @@ -164,9 +164,9 @@ var ( traits.SubtractorType, } // ListType represents the runtime list type. - ListType = NewListType(nil) + ListType = NewListType(DynType) // MapType represents the runtime map type. - MapType = NewMapType(nil, nil) + MapType = NewMapType(DynType, DynType) // NullType represents the type of a null value. NullType = &Type{ kind: NullTypeKind, @@ -376,6 +376,10 @@ func (t *Type) TypeName() string { return t.runtimeTypeName } +func (t *Type) format(sb *strings.Builder) { + sb.WriteString(t.TypeName()) +} + // WithTraits creates a copy of the current Type and sets the trait mask to the traits parameter. // // This method should be used with Opaque types where the type acts like a container, e.g. vector. @@ -395,6 +399,9 @@ func (t *Type) WithTraits(traits int) *Type { // String returns a human-readable definition of the type name. func (t *Type) String() string { + if t.Kind() == TypeParamKind { + return fmt.Sprintf("<%s>", t.DeclaredTypeName()) + } if len(t.Parameters()) == 0 { return t.DeclaredTypeName() } @@ -768,6 +775,19 @@ func ProtoAsType(t *celpb.Type) (*Type, error) { } } +// TypeToProto converts from a CEL-native type representation to canonical CEL celpb.Type protobuf type. +func TypeToProto(t *Type) (*celpb.Type, error) { + exprType, err := TypeToExprType(t) + if err != nil { + return nil, err + } + var pbtype celpb.Type + if err = convertProto(exprType, &pbtype); err != nil { + return nil, err + } + return &pbtype, nil +} + func maybeWrapper(t *Type, pbType *exprpb.Type) *exprpb.Type { if t.IsAssignableType(NullType) { return chkdecls.NewWrapperType(pbType) diff --git a/vendor/github.com/google/cel-go/common/types/uint.go b/vendor/github.com/google/cel-go/common/types/uint.go index 6d74f30d88..a93405a134 100644 --- a/vendor/github.com/google/cel-go/common/types/uint.go +++ b/vendor/github.com/google/cel-go/common/types/uint.go @@ -19,6 +19,7 @@ import ( "math" "reflect" "strconv" + "strings" "github.com/google/cel-go/common/types/ref" @@ -250,6 +251,11 @@ func (i Uint) Value() any { return uint64(i) } +func (i Uint) format(sb *strings.Builder) { + sb.WriteString(strconv.FormatUint(uint64(i), 10)) + sb.WriteString("u") +} + // isJSONSafe indicates whether the uint is safely representable as a floating point value in JSON. func (i Uint) isJSONSafe() bool { return i <= maxIntJSON diff --git a/vendor/github.com/google/cel-go/ext/BUILD.bazel b/vendor/github.com/google/cel-go/ext/BUILD.bazel index b764fa1f5c..ef4f4ec3db 100644 --- a/vendor/github.com/google/cel-go/ext/BUILD.bazel +++ b/vendor/github.com/google/cel-go/ext/BUILD.bazel @@ -10,12 +10,15 @@ go_library( "bindings.go", "comprehensions.go", "encoders.go", + "extension_option_factory.go", "formatting.go", + "formatting_v2.go", "guards.go", "lists.go", "math.go", "native.go", "protos.go", + "regex.go", "sets.go", "strings.go", ], @@ -24,10 +27,12 @@ go_library( deps = [ "//cel:go_default_library", "//checker:go_default_library", + "//common:go_default_library", "//common/ast:go_default_library", "//common/decls:go_default_library", - "//common/overloads:go_default_library", + "//common/env:go_default_library", "//common/operators:go_default_library", + "//common/overloads:go_default_library", "//common/types:go_default_library", "//common/types/pb:go_default_library", "//common/types/ref:go_default_library", @@ -48,11 +53,15 @@ go_test( srcs = [ "bindings_test.go", "comprehensions_test.go", - "encoders_test.go", + "encoders_test.go", + "extension_option_factory_test.go", + "formatting_test.go", + "formatting_v2_test.go", "lists_test.go", "math_test.go", "native_test.go", "protos_test.go", + "regex_test.go", "sets_test.go", "strings_test.go", ], @@ -62,14 +71,16 @@ go_test( deps = [ "//cel:go_default_library", "//checker:go_default_library", + "//common:go_default_library", + "//common/env:go_default_library", "//common/types:go_default_library", "//common/types/ref:go_default_library", "//common/types/traits:go_default_library", "//test:go_default_library", "//test/proto2pb:go_default_library", "//test/proto3pb:go_default_library", + "@org_golang_google_protobuf//encoding/protojson:go_default_library", "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/wrapperspb:go_default_library", - "@org_golang_google_protobuf//encoding/protojson:go_default_library", ], ) diff --git a/vendor/github.com/google/cel-go/ext/README.md b/vendor/github.com/google/cel-go/ext/README.md index 07e544d0dc..41ae6a3143 100644 --- a/vendor/github.com/google/cel-go/ext/README.md +++ b/vendor/github.com/google/cel-go/ext/README.md @@ -11,7 +11,7 @@ in expressions. ### Cel.Bind Binds a simple identifier to an initialization expression which may be used -in a subsequenct result expression. Bindings may also be nested within each +in a subsequent result expression. Bindings may also be nested within each other. cel.bind(, , ) @@ -29,7 +29,7 @@ Local bindings are not guaranteed to be evaluated before use. ## Encoders -Encoding utilies for marshalling data into standardized representations. +Encoding utilities for marshalling data into standardized representations. ### Base64.Decode @@ -356,6 +356,23 @@ Examples: math.isFinite(0.0/0.0) // returns false math.isFinite(1.2) // returns true +### Math.Sqrt + +Introduced at version: 2 + +Returns the square root of the given input as double +Throws error for negative or non-numeric inputs + + math.sqrt() -> + math.sqrt() -> + math.sqrt() -> + +Examples: + + math.sqrt(81) // returns 9.0 + math.sqrt(985.25) // returns 31.388692231439016 + math.sqrt(-15) // returns NaN + ## Protos Protos configure extended macros and functions for proto manipulation. @@ -395,7 +412,7 @@ zero-based. ### Distinct -**Introduced in version 2** +**Introduced in version 2 (cost support in version 3)** Returns the distinct elements of a list. @@ -409,7 +426,7 @@ Examples: ### Flatten -**Introduced in version 1** +**Introduced in version 1 (cost support in version 3)** Flattens a list recursively. If an optional depth is provided, the list is flattened to a the specificied level. @@ -428,7 +445,7 @@ Examples: ### Range -**Introduced in version 2** +**Introduced in version 2 (cost support in version 3)** Returns a list of integers from 0 to n-1. @@ -441,7 +458,7 @@ Examples: ### Reverse -**Introduced in version 2** +**Introduced in version 2 (cost support in version 3)** Returns the elements of a list in reverse order. @@ -454,6 +471,7 @@ Examples: ### Slice +**Introduced in version 0 (cost support in version 3)** Returns a new sub-list using the indexes provided. @@ -466,7 +484,7 @@ Examples: ### Sort -**Introduced in version 2** +**Introduced in version 2 (cost support in version 3)** Sorts a list with comparable elements. If the element type is not comparable or the element types are not the same, the function will produce an error. @@ -483,7 +501,7 @@ Examples: ### SortBy -**Introduced in version 2** +**Introduced in version 2 (cost support in version 3)** Sorts a list by a key value, i.e., the order is determined by the result of an expression applied to each element of the list. @@ -500,6 +518,36 @@ Examples: ].sortBy(e, e.score).map(e, e.name) == ["bar", "foo", "baz"] +### Last + +**Introduced in the OptionalTypes library version 2** + +Returns an optional with the last value from the list or `optional.None` if the +list is empty. + + .last() -> + +Examples: + + [1, 2, 3].last().value() == 3 + [].last().orValue('test') == 'test' + +This is syntactic sugar for list[list.size()-1]. + +### First + +**Introduced in the OptionalTypes library version 2** + +Returns an optional with the first value from the list or `optional.None` if the +list is empty. + + .first() -> + +Examples: + + [1, 2, 3].first().value() == 1 + [].first().orValue('test') == 'test' + ## Sets Sets provides set relationship tests. diff --git a/vendor/github.com/google/cel-go/ext/bindings.go b/vendor/github.com/google/cel-go/ext/bindings.go index 50cf4fb3d6..63942b85cb 100644 --- a/vendor/github.com/google/cel-go/ext/bindings.go +++ b/vendor/github.com/google/cel-go/ext/bindings.go @@ -149,7 +149,7 @@ type blockValidationExemption struct{} // Name returns the name of the validator. func (blockValidationExemption) Name() string { - return "cel.lib.ext.validate.functions.cel.block" + return "cel.validator.cel_block" } // Configure implements the ASTValidatorConfigurer interface and augments the list of functions to skip @@ -224,7 +224,7 @@ func (b *dynamicBlock) ID() int64 { } // Eval implements the Interpretable interface method. -func (b *dynamicBlock) Eval(activation interpreter.Activation) ref.Val { +func (b *dynamicBlock) Eval(activation cel.Activation) ref.Val { sa := b.slotActivationPool.Get().(*dynamicSlotActivation) sa.Activation = activation defer b.clearSlots(sa) @@ -242,7 +242,7 @@ type slotVal struct { } type dynamicSlotActivation struct { - interpreter.Activation + cel.Activation slotExprs []interpreter.Interpretable slotCount int slotVals []*slotVal @@ -295,13 +295,13 @@ func (b *constantBlock) ID() int64 { // Eval implements the interpreter.Interpretable interface method, and will proxy @index prefixed variable // lookups into a set of constant slots determined from the plan step. -func (b *constantBlock) Eval(activation interpreter.Activation) ref.Val { +func (b *constantBlock) Eval(activation cel.Activation) ref.Val { vars := constantSlotActivation{Activation: activation, slots: b.slots, slotCount: b.slotCount} return b.expr.Eval(vars) } type constantSlotActivation struct { - interpreter.Activation + cel.Activation slots traits.Lister slotCount int } diff --git a/vendor/github.com/google/cel-go/ext/comprehensions.go b/vendor/github.com/google/cel-go/ext/comprehensions.go index 1428558d82..f08d8f9da6 100644 --- a/vendor/github.com/google/cel-go/ext/comprehensions.go +++ b/vendor/github.com/google/cel-go/ext/comprehensions.go @@ -16,6 +16,7 @@ package ext import ( "fmt" + "math" "github.com/google/cel-go/cel" "github.com/google/cel-go/common/ast" @@ -159,19 +160,36 @@ const ( // // {'greeting': 'aloha', 'farewell': 'aloha'} // .transformMapEntry(keyVar, valueVar, {valueVar: keyVar}) // error, duplicate key -func TwoVarComprehensions() cel.EnvOption { - return cel.Lib(compreV2Lib{}) +func TwoVarComprehensions(options ...TwoVarComprehensionsOption) cel.EnvOption { + l := &compreV2Lib{version: math.MaxUint32} + for _, o := range options { + l = o(l) + } + return cel.Lib(l) +} + +// TwoVarComprehensionsOption declares a functional operator for configuring two-variable comprehensions. +type TwoVarComprehensionsOption func(*compreV2Lib) *compreV2Lib + +// TwoVarComprehensionsVersion sets the library version for two-variable comprehensions. +func TwoVarComprehensionsVersion(version uint32) TwoVarComprehensionsOption { + return func(lib *compreV2Lib) *compreV2Lib { + lib.version = version + return lib + } } -type compreV2Lib struct{} +type compreV2Lib struct { + version uint32 +} // LibraryName implements that SingletonLibrary interface method. -func (compreV2Lib) LibraryName() string { +func (*compreV2Lib) LibraryName() string { return "cel.lib.ext.comprev2" } // CompileOptions implements the cel.Library interface method. -func (compreV2Lib) CompileOptions() []cel.EnvOption { +func (*compreV2Lib) CompileOptions() []cel.EnvOption { kType := cel.TypeParamType("K") vType := cel.TypeParamType("V") mapKVType := cel.MapType(kType, vType) @@ -217,7 +235,7 @@ func (compreV2Lib) CompileOptions() []cel.EnvOption { } // ProgramOptions implements the cel.Library interface method -func (compreV2Lib) ProgramOptions() []cel.ProgramOption { +func (*compreV2Lib) ProgramOptions() []cel.ProgramOption { return []cel.ProgramOption{} } @@ -231,7 +249,7 @@ func quantifierAll(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) ( target, iterVar1, iterVar2, - parser.AccumulatorName, + mef.AccuIdentName(), /*accuInit=*/ mef.NewLiteral(types.True), /*condition=*/ mef.NewCall(operators.NotStrictlyFalse, mef.NewAccuIdent()), /*step=*/ mef.NewCall(operators.LogicalAnd, mef.NewAccuIdent(), args[2]), @@ -249,7 +267,7 @@ func quantifierExists(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr target, iterVar1, iterVar2, - parser.AccumulatorName, + mef.AccuIdentName(), /*accuInit=*/ mef.NewLiteral(types.False), /*condition=*/ mef.NewCall(operators.NotStrictlyFalse, mef.NewCall(operators.LogicalNot, mef.NewAccuIdent())), /*step=*/ mef.NewCall(operators.LogicalOr, mef.NewAccuIdent(), args[2]), @@ -267,7 +285,7 @@ func quantifierExistsOne(mef cel.MacroExprFactory, target ast.Expr, args []ast.E target, iterVar1, iterVar2, - parser.AccumulatorName, + mef.AccuIdentName(), /*accuInit=*/ mef.NewLiteral(types.Int(0)), /*condition=*/ mef.NewLiteral(types.True), /*step=*/ mef.NewCall(operators.Conditional, args[2], @@ -293,10 +311,10 @@ func transformList(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) ( transform = args[2] } - // __result__ = __result__ + [transform] + // accumulator = accumulator + [transform] step := mef.NewCall(operators.Add, mef.NewAccuIdent(), mef.NewList(transform)) if filter != nil { - // __result__ = (filter) ? __result__ + [transform] : __result__ + // accumulator = (filter) ? accumulator + [transform] : accumulator step = mef.NewCall(operators.Conditional, filter, step, mef.NewAccuIdent()) } @@ -304,7 +322,7 @@ func transformList(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) ( target, iterVar1, iterVar2, - parser.AccumulatorName, + mef.AccuIdentName(), /*accuInit=*/ mef.NewList(), /*condition=*/ mef.NewLiteral(types.True), step, @@ -328,17 +346,17 @@ func transformMap(mef cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (a transform = args[2] } - // __result__ = cel.@mapInsert(__result__, iterVar1, transform) + // accumulator = cel.@mapInsert(accumulator, iterVar1, transform) step := mef.NewCall(mapInsert, mef.NewAccuIdent(), mef.NewIdent(iterVar1), transform) if filter != nil { - // __result__ = (filter) ? cel.@mapInsert(__result__, iterVar1, transform) : __result__ + // accumulator = (filter) ? cel.@mapInsert(accumulator, iterVar1, transform) : accumulator step = mef.NewCall(operators.Conditional, filter, step, mef.NewAccuIdent()) } return mef.NewComprehensionTwoVar( target, iterVar1, iterVar2, - parser.AccumulatorName, + mef.AccuIdentName(), /*accuInit=*/ mef.NewMap(), /*condition=*/ mef.NewLiteral(types.True), step, @@ -362,17 +380,17 @@ func transformMapEntry(mef cel.MacroExprFactory, target ast.Expr, args []ast.Exp transform = args[2] } - // __result__ = cel.@mapInsert(__result__, transform) + // accumulator = cel.@mapInsert(accumulator, transform) step := mef.NewCall(mapInsert, mef.NewAccuIdent(), transform) if filter != nil { - // __result__ = (filter) ? cel.@mapInsert(__result__, transform) : __result__ + // accumulator = (filter) ? cel.@mapInsert(accumulator, transform) : accumulator step = mef.NewCall(operators.Conditional, filter, step, mef.NewAccuIdent()) } return mef.NewComprehensionTwoVar( target, iterVar1, iterVar2, - parser.AccumulatorName, + mef.AccuIdentName(), /*accuInit=*/ mef.NewMap(), /*condition=*/ mef.NewLiteral(types.True), step, @@ -392,10 +410,10 @@ func extractIterVars(mef cel.MacroExprFactory, arg0, arg1 ast.Expr) (string, str if iterVar1 == iterVar2 { return "", "", mef.NewError(arg1.ID(), fmt.Sprintf("duplicate variable name: %s", iterVar1)) } - if iterVar1 == parser.AccumulatorName { + if iterVar1 == mef.AccuIdentName() || iterVar1 == parser.AccumulatorName { return "", "", mef.NewError(arg0.ID(), "iteration variable overwrites accumulator variable") } - if iterVar2 == parser.AccumulatorName { + if iterVar2 == mef.AccuIdentName() || iterVar2 == parser.AccumulatorName { return "", "", mef.NewError(arg1.ID(), "iteration variable overwrites accumulator variable") } return iterVar1, iterVar2, nil diff --git a/vendor/github.com/google/cel-go/ext/encoders.go b/vendor/github.com/google/cel-go/ext/encoders.go index ac04b1a7b0..731c3d095d 100644 --- a/vendor/github.com/google/cel-go/ext/encoders.go +++ b/vendor/github.com/google/cel-go/ext/encoders.go @@ -16,6 +16,7 @@ package ext import ( "encoding/base64" + "math" "github.com/google/cel-go/cel" "github.com/google/cel-go/common/types" @@ -47,17 +48,34 @@ import ( // Examples: // // base64.encode(b'hello') // return b'aGVsbG8=' -func Encoders() cel.EnvOption { - return cel.Lib(encoderLib{}) +func Encoders(options ...EncodersOption) cel.EnvOption { + l := &encoderLib{version: math.MaxUint32} + for _, o := range options { + l = o(l) + } + return cel.Lib(l) +} + +// EncodersOption declares a functional operator for configuring encoder extensions. +type EncodersOption func(*encoderLib) *encoderLib + +// EncodersVersion sets the library version for encoder extensions. +func EncodersVersion(version uint32) EncodersOption { + return func(lib *encoderLib) *encoderLib { + lib.version = version + return lib + } } -type encoderLib struct{} +type encoderLib struct { + version uint32 +} -func (encoderLib) LibraryName() string { +func (*encoderLib) LibraryName() string { return "cel.lib.ext.encoders" } -func (encoderLib) CompileOptions() []cel.EnvOption { +func (*encoderLib) CompileOptions() []cel.EnvOption { return []cel.EnvOption{ cel.Function("base64.decode", cel.Overload("base64_decode_string", []*cel.Type{cel.StringType}, cel.BytesType, @@ -74,7 +92,7 @@ func (encoderLib) CompileOptions() []cel.EnvOption { } } -func (encoderLib) ProgramOptions() []cel.ProgramOption { +func (*encoderLib) ProgramOptions() []cel.ProgramOption { return []cel.ProgramOption{} } diff --git a/vendor/github.com/google/cel-go/ext/extension_option_factory.go b/vendor/github.com/google/cel-go/ext/extension_option_factory.go new file mode 100644 index 0000000000..cebf0d760d --- /dev/null +++ b/vendor/github.com/google/cel-go/ext/extension_option_factory.go @@ -0,0 +1,75 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "fmt" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/env" +) + +// ExtensionOptionFactory converts an ExtensionConfig value to a CEL environment option. +func ExtensionOptionFactory(configElement any) (cel.EnvOption, bool) { + ext, isExtension := configElement.(*env.Extension) + if !isExtension { + return nil, false + } + fac, found := extFactories[ext.Name] + if !found { + return nil, false + } + // If the version is 'latest', set the version value to the max uint. + ver, err := ext.VersionNumber() + if err != nil { + return func(*cel.Env) (*cel.Env, error) { + return nil, fmt.Errorf("invalid extension version: %s - %s", ext.Name, ext.Version) + }, true + } + return fac(ver), true +} + +// extensionFactory accepts a version and produces a CEL environment associated with the versioned extension. +type extensionFactory func(uint32) cel.EnvOption + +var extFactories = map[string]extensionFactory{ + "bindings": func(version uint32) cel.EnvOption { + return Bindings(BindingsVersion(version)) + }, + "encoders": func(version uint32) cel.EnvOption { + return Encoders(EncodersVersion(version)) + }, + "lists": func(version uint32) cel.EnvOption { + return Lists(ListsVersion(version)) + }, + "math": func(version uint32) cel.EnvOption { + return Math(MathVersion(version)) + }, + "protos": func(version uint32) cel.EnvOption { + return Protos(ProtosVersion(version)) + }, + "sets": func(version uint32) cel.EnvOption { + return Sets(SetsVersion(version)) + }, + "strings": func(version uint32) cel.EnvOption { + return Strings(StringsVersion(version)) + }, + "two-var-comprehensions": func(version uint32) cel.EnvOption { + return TwoVarComprehensions(TwoVarComprehensionsVersion(version)) + }, + "regex": func(version uint32) cel.EnvOption { + return Regex(RegexVersion(version)) + }, +} diff --git a/vendor/github.com/google/cel-go/ext/formatting.go b/vendor/github.com/google/cel-go/ext/formatting.go index dbff613b2a..111184b739 100644 --- a/vendor/github.com/google/cel-go/ext/formatting.go +++ b/vendor/github.com/google/cel-go/ext/formatting.go @@ -268,14 +268,17 @@ func makeMatcher(locale string) (language.Matcher, error) { type stringFormatter struct{} +// String implements formatStringInterpolator.String. func (c *stringFormatter) String(arg ref.Val, locale string) (string, error) { return FormatString(arg, locale) } +// Decimal implements formatStringInterpolator.Decimal. func (c *stringFormatter) Decimal(arg ref.Val, locale string) (string, error) { return formatDecimal(arg, locale) } +// Fixed implements formatStringInterpolator.Fixed. func (c *stringFormatter) Fixed(precision *int) func(ref.Val, string) (string, error) { if precision == nil { precision = new(int) @@ -307,6 +310,7 @@ func (c *stringFormatter) Fixed(precision *int) func(ref.Val, string) (string, e } } +// Scientific implements formatStringInterpolator.Scientific. func (c *stringFormatter) Scientific(precision *int) func(ref.Val, string) (string, error) { if precision == nil { precision = new(int) @@ -337,6 +341,7 @@ func (c *stringFormatter) Scientific(precision *int) func(ref.Val, string) (stri } } +// Binary implements formatStringInterpolator.Binary. func (c *stringFormatter) Binary(arg ref.Val, locale string) (string, error) { switch arg.Type() { case types.IntType: @@ -358,6 +363,7 @@ func (c *stringFormatter) Binary(arg ref.Val, locale string) (string, error) { } } +// Hex implements formatStringInterpolator.Hex. func (c *stringFormatter) Hex(useUpper bool) func(ref.Val, string) (string, error) { return func(arg ref.Val, locale string) (string, error) { fmtStr := "%x" @@ -388,6 +394,7 @@ func (c *stringFormatter) Hex(useUpper bool) func(ref.Val, string) (string, erro } } +// Octal implements formatStringInterpolator.Octal. func (c *stringFormatter) Octal(arg ref.Val, locale string) (string, error) { switch arg.Type() { case types.IntType: @@ -407,7 +414,7 @@ type stringFormatValidator struct{} // Name returns the name of the validator. func (stringFormatValidator) Name() string { - return "cel.lib.ext.validate.functions.string.format" + return "cel.validator.string_format" } // Configure implements the ASTValidatorConfigurer interface and augments the list of functions to skip @@ -434,7 +441,7 @@ func (stringFormatValidator) Validate(env *cel.Env, _ cel.ValidatorConfig, a *as // use a placeholder locale, since locale doesn't affect syntax _, err := parseFormatString(formatStr, formatCheck, formatCheck, "en_US") if err != nil { - iss.ReportErrorAtID(getErrorExprID(e.ID(), err), err.Error()) + iss.ReportErrorAtID(getErrorExprID(e.ID(), err), "%v", err) continue } seenArgs := formatCheck.argsRequested @@ -504,6 +511,7 @@ type stringFormatChecker struct { ast *ast.AST } +// String implements formatStringInterpolator.String. func (c *stringFormatChecker) String(arg ref.Val, locale string) (string, error) { formatArg := c.args[c.currArgIndex] valid, badID := c.verifyString(formatArg) @@ -513,6 +521,7 @@ func (c *stringFormatChecker) String(arg ref.Val, locale string) (string, error) return "", nil } +// Decimal implements formatStringInterpolator.Decimal. func (c *stringFormatChecker) Decimal(arg ref.Val, locale string) (string, error) { id := c.args[c.currArgIndex].ID() valid := c.verifyTypeOneOf(id, types.IntType, types.UintType) @@ -522,6 +531,7 @@ func (c *stringFormatChecker) Decimal(arg ref.Val, locale string) (string, error return "", nil } +// Fixed implements formatStringInterpolator.Fixed. func (c *stringFormatChecker) Fixed(precision *int) func(ref.Val, string) (string, error) { return func(arg ref.Val, locale string) (string, error) { id := c.args[c.currArgIndex].ID() @@ -534,6 +544,7 @@ func (c *stringFormatChecker) Fixed(precision *int) func(ref.Val, string) (strin } } +// Scientific implements formatStringInterpolator.Scientific. func (c *stringFormatChecker) Scientific(precision *int) func(ref.Val, string) (string, error) { return func(arg ref.Val, locale string) (string, error) { id := c.args[c.currArgIndex].ID() @@ -545,6 +556,7 @@ func (c *stringFormatChecker) Scientific(precision *int) func(ref.Val, string) ( } } +// Binary implements formatStringInterpolator.Binary. func (c *stringFormatChecker) Binary(arg ref.Val, locale string) (string, error) { id := c.args[c.currArgIndex].ID() valid := c.verifyTypeOneOf(id, types.IntType, types.UintType, types.BoolType) @@ -554,6 +566,7 @@ func (c *stringFormatChecker) Binary(arg ref.Val, locale string) (string, error) return "", nil } +// Hex implements formatStringInterpolator.Hex. func (c *stringFormatChecker) Hex(useUpper bool) func(ref.Val, string) (string, error) { return func(arg ref.Val, locale string) (string, error) { id := c.args[c.currArgIndex].ID() @@ -565,6 +578,7 @@ func (c *stringFormatChecker) Hex(useUpper bool) func(ref.Val, string) (string, } } +// Octal implements formatStringInterpolator.Octal. func (c *stringFormatChecker) Octal(arg ref.Val, locale string) (string, error) { id := c.args[c.currArgIndex].ID() valid := c.verifyTypeOneOf(id, types.IntType, types.UintType) @@ -574,6 +588,7 @@ func (c *stringFormatChecker) Octal(arg ref.Val, locale string) (string, error) return "", nil } +// Arg implements formatListArgs.Arg. func (c *stringFormatChecker) Arg(index int64) (ref.Val, error) { c.argsRequested++ c.currArgIndex = index @@ -582,6 +597,7 @@ func (c *stringFormatChecker) Arg(index int64) (ref.Val, error) { return types.Int(0), nil } +// Size implements formatListArgs.Size. func (c *stringFormatChecker) Size() int64 { return int64(len(c.args)) } @@ -686,10 +702,12 @@ func newFormatError(id int64, msg string, args ...any) error { } } +// Error implements error. func (e formatError) Error() string { return e.msg } +// Is implements errors.Is. func (e formatError) Is(target error) bool { return e.msg == target.Error() } @@ -699,6 +717,7 @@ type stringArgList struct { args traits.Lister } +// Arg implements formatListArgs.Arg. func (c *stringArgList) Arg(index int64) (ref.Val, error) { if index >= c.args.Size().Value().(int64) { return nil, fmt.Errorf("index %d out of range", index) @@ -706,6 +725,7 @@ func (c *stringArgList) Arg(index int64) (ref.Val, error) { return c.args.Get(types.Int(index)), nil } +// Size implements formatListArgs.Size. func (c *stringArgList) Size() int64 { return c.args.Size().Value().(int64) } @@ -887,14 +907,17 @@ func newParseFormatError(msg string, wrapped error) error { return parseFormatError{msg: msg, wrapped: wrapped} } +// Error implements error. func (e parseFormatError) Error() string { return fmt.Sprintf("%s: %s", e.msg, e.wrapped.Error()) } +// Is implements errors.Is. func (e parseFormatError) Is(target error) bool { return e.Error() == target.Error() } +// Is implements errors.Unwrap. func (e parseFormatError) Unwrap() error { return e.wrapped } diff --git a/vendor/github.com/google/cel-go/ext/formatting_v2.go b/vendor/github.com/google/cel-go/ext/formatting_v2.go new file mode 100644 index 0000000000..ca8efbc4e7 --- /dev/null +++ b/vendor/github.com/google/cel-go/ext/formatting_v2.go @@ -0,0 +1,788 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "errors" + "fmt" + "math" + "sort" + "strconv" + "strings" + "time" + "unicode" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/ast" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "github.com/google/cel-go/common/types/traits" +) + +type clauseImplV2 func(ref.Val) (string, error) + +type appendingFormatterV2 struct { + buf []byte +} + +type formattedMapEntryV2 struct { + key string + val string +} + +func (af *appendingFormatterV2) format(arg ref.Val) error { + switch arg.Type() { + case types.BoolType: + argBool, ok := arg.Value().(bool) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.BoolType) + } + af.buf = strconv.AppendBool(af.buf, argBool) + return nil + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.IntType) + } + af.buf = strconv.AppendInt(af.buf, argInt, 10) + return nil + case types.UintType: + argUint, ok := arg.Value().(uint64) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.UintType) + } + af.buf = strconv.AppendUint(af.buf, argUint, 10) + return nil + case types.DoubleType: + argDbl, ok := arg.Value().(float64) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.DoubleType) + } + if math.IsNaN(argDbl) { + af.buf = append(af.buf, "NaN"...) + return nil + } + if math.IsInf(argDbl, -1) { + af.buf = append(af.buf, "-Infinity"...) + return nil + } + if math.IsInf(argDbl, 1) { + af.buf = append(af.buf, "Infinity"...) + return nil + } + af.buf = strconv.AppendFloat(af.buf, argDbl, 'f', -1, 64) + return nil + case types.BytesType: + argBytes, ok := arg.Value().([]byte) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.BytesType) + } + af.buf = append(af.buf, argBytes...) + return nil + case types.StringType: + argStr, ok := arg.Value().(string) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.StringType) + } + af.buf = append(af.buf, argStr...) + return nil + case types.DurationType: + argDur, ok := arg.Value().(time.Duration) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.DurationType) + } + af.buf = strconv.AppendFloat(af.buf, argDur.Seconds(), 'f', -1, 64) + af.buf = append(af.buf, "s"...) + return nil + case types.TimestampType: + argTime, ok := arg.Value().(time.Time) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.TimestampType) + } + af.buf = argTime.UTC().AppendFormat(af.buf, time.RFC3339Nano) + return nil + case types.NullType: + af.buf = append(af.buf, "null"...) + return nil + case types.TypeType: + argType, ok := arg.Value().(string) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.TypeType) + } + af.buf = append(af.buf, argType...) + return nil + case types.ListType: + argList, ok := arg.(traits.Lister) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.ListType) + } + argIter := argList.Iterator() + af.buf = append(af.buf, "["...) + if argIter.HasNext() == types.True { + if err := af.format(argIter.Next()); err != nil { + return err + } + for argIter.HasNext() == types.True { + af.buf = append(af.buf, ", "...) + if err := af.format(argIter.Next()); err != nil { + return err + } + } + } + af.buf = append(af.buf, "]"...) + return nil + case types.MapType: + argMap, ok := arg.(traits.Mapper) + if !ok { + return fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.MapType) + } + argIter := argMap.Iterator() + ents := []formattedMapEntryV2{} + for argIter.HasNext() == types.True { + key := argIter.Next() + val, ok := argMap.Find(key) + if !ok { + return fmt.Errorf("key missing from map: '%s'", key) + } + keyStr, err := formatStringV2(key) + if err != nil { + return err + } + valStr, err := formatStringV2(val) + if err != nil { + return err + } + ents = append(ents, formattedMapEntryV2{keyStr, valStr}) + } + sort.SliceStable(ents, func(x, y int) bool { + return ents[x].key < ents[y].key + }) + af.buf = append(af.buf, "{"...) + for i, e := range ents { + if i > 0 { + af.buf = append(af.buf, ", "...) + } + af.buf = append(af.buf, e.key...) + af.buf = append(af.buf, ": "...) + af.buf = append(af.buf, e.val...) + } + af.buf = append(af.buf, "}"...) + return nil + default: + return stringFormatErrorV2(runtimeID, arg.Type().TypeName()) + } +} + +func formatStringV2(arg ref.Val) (string, error) { + var fmter appendingFormatterV2 + if err := fmter.format(arg); err != nil { + return "", err + } + return string(fmter.buf), nil +} + +type stringFormatterV2 struct{} + +// String implements formatStringInterpolatorV2.String. +func (c *stringFormatterV2) String(arg ref.Val) (string, error) { + return formatStringV2(arg) +} + +// Decimal implements formatStringInterpolatorV2.Decimal. +func (c *stringFormatterV2) Decimal(arg ref.Val) (string, error) { + switch arg.Type() { + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.IntType) + } + return strconv.FormatInt(argInt, 10), nil + case types.UintType: + argUint, ok := arg.Value().(uint64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.UintType) + } + return strconv.FormatUint(argUint, 10), nil + case types.DoubleType: + argDbl, ok := arg.Value().(float64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.DoubleType) + } + if math.IsNaN(argDbl) { + return "NaN", nil + } + if math.IsInf(argDbl, -1) { + return "-Infinity", nil + } + if math.IsInf(argDbl, 1) { + return "Infinity", nil + } + return strconv.FormatFloat(argDbl, 'f', -1, 64), nil + default: + return "", decimalFormatErrorV2(runtimeID, arg.Type().TypeName()) + } +} + +// Fixed implements formatStringInterpolatorV2.Fixed. +func (c *stringFormatterV2) Fixed(precision int) func(ref.Val) (string, error) { + return func(arg ref.Val) (string, error) { + fmtStr := fmt.Sprintf("%%.%df", precision) + switch arg.Type() { + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.IntType) + } + return fmt.Sprintf(fmtStr, argInt), nil + case types.UintType: + argUint, ok := arg.Value().(uint64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.UintType) + } + return fmt.Sprintf(fmtStr, argUint), nil + case types.DoubleType: + argDbl, ok := arg.Value().(float64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.DoubleType) + } + if math.IsNaN(argDbl) { + return "NaN", nil + } + if math.IsInf(argDbl, -1) { + return "-Infinity", nil + } + if math.IsInf(argDbl, 1) { + return "Infinity", nil + } + return fmt.Sprintf(fmtStr, argDbl), nil + default: + return "", fixedPointFormatErrorV2(runtimeID, arg.Type().TypeName()) + } + } +} + +// Scientific implements formatStringInterpolatorV2.Scientific. +func (c *stringFormatterV2) Scientific(precision int) func(ref.Val) (string, error) { + return func(arg ref.Val) (string, error) { + fmtStr := fmt.Sprintf("%%1.%de", precision) + switch arg.Type() { + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.IntType) + } + return fmt.Sprintf(fmtStr, argInt), nil + case types.UintType: + argUint, ok := arg.Value().(uint64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.UintType) + } + return fmt.Sprintf(fmtStr, argUint), nil + case types.DoubleType: + argDbl, ok := arg.Value().(float64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.DoubleType) + } + if math.IsNaN(argDbl) { + return "NaN", nil + } + if math.IsInf(argDbl, -1) { + return "-Infinity", nil + } + if math.IsInf(argDbl, 1) { + return "Infinity", nil + } + return fmt.Sprintf(fmtStr, argDbl), nil + default: + return "", scientificFormatErrorV2(runtimeID, arg.Type().TypeName()) + } + } +} + +// Binary implements formatStringInterpolatorV2.Binary. +func (c *stringFormatterV2) Binary(arg ref.Val) (string, error) { + switch arg.Type() { + case types.BoolType: + argBool, ok := arg.Value().(bool) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.BoolType) + } + if argBool { + return "1", nil + } + return "0", nil + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.IntType) + } + return strconv.FormatInt(argInt, 2), nil + case types.UintType: + argUint, ok := arg.Value().(uint64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.UintType) + } + return strconv.FormatUint(argUint, 2), nil + default: + return "", binaryFormatErrorV2(runtimeID, arg.Type().TypeName()) + } +} + +// Hex implements formatStringInterpolatorV2.Hex. +func (c *stringFormatterV2) Hex(useUpper bool) func(ref.Val) (string, error) { + return func(arg ref.Val) (string, error) { + var fmtStr string + if useUpper { + fmtStr = "%X" + } else { + fmtStr = "%x" + } + switch arg.Type() { + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.IntType) + } + return fmt.Sprintf(fmtStr, argInt), nil + case types.UintType: + argUint, ok := arg.Value().(uint64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.UintType) + } + return fmt.Sprintf(fmtStr, argUint), nil + case types.StringType: + argStr, ok := arg.Value().(string) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.StringType) + } + return fmt.Sprintf(fmtStr, argStr), nil + case types.BytesType: + argBytes, ok := arg.Value().([]byte) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.BytesType) + } + return fmt.Sprintf(fmtStr, argBytes), nil + default: + return "", hexFormatErrorV2(runtimeID, arg.Type().TypeName()) + } + } +} + +// Octal implements formatStringInterpolatorV2.Octal. +func (c *stringFormatterV2) Octal(arg ref.Val) (string, error) { + switch arg.Type() { + case types.IntType: + argInt, ok := arg.Value().(int64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.IntType) + } + return strconv.FormatInt(argInt, 8), nil + case types.UintType: + argUint, ok := arg.Value().(uint64) + if !ok { + return "", fmt.Errorf("type conversion error from '%s' to '%s'", arg.Type(), types.UintType) + } + return strconv.FormatUint(argUint, 8), nil + default: + return "", octalFormatErrorV2(runtimeID, arg.Type().TypeName()) + } +} + +// stringFormatValidatorV2 implements the cel.ASTValidator interface allowing for static validation +// of string.format calls. +type stringFormatValidatorV2 struct{} + +// Name returns the name of the validator. +func (stringFormatValidatorV2) Name() string { + return "cel.validator.string_format" +} + +// Configure implements the ASTValidatorConfigurer interface and augments the list of functions to skip +// during homogeneous aggregate literal type-checks. +func (stringFormatValidatorV2) Configure(config cel.MutableValidatorConfig) error { + functions := config.GetOrDefault(cel.HomogeneousAggregateLiteralExemptFunctions, []string{}).([]string) + functions = append(functions, "format") + return config.Set(cel.HomogeneousAggregateLiteralExemptFunctions, functions) +} + +// Validate parses all literal format strings and type checks the format clause against the argument +// at the corresponding ordinal within the list literal argument to the function, if one is specified. +func (stringFormatValidatorV2) Validate(env *cel.Env, _ cel.ValidatorConfig, a *ast.AST, iss *cel.Issues) { + root := ast.NavigateAST(a) + formatCallExprs := ast.MatchDescendants(root, matchConstantFormatStringWithListLiteralArgs(a)) + for _, e := range formatCallExprs { + call := e.AsCall() + formatStr := call.Target().AsLiteral().Value().(string) + args := call.Args()[0].AsList().Elements() + formatCheck := &stringFormatCheckerV2{ + args: args, + ast: a, + } + // use a placeholder locale, since locale doesn't affect syntax + _, err := parseFormatStringV2(formatStr, formatCheck, formatCheck) + if err != nil { + iss.ReportErrorAtID(getErrorExprID(e.ID(), err), "%v", err) + continue + } + seenArgs := formatCheck.argsRequested + if len(args) > seenArgs { + iss.ReportErrorAtID(e.ID(), + "too many arguments supplied to string.format (expected %d, got %d)", seenArgs, len(args)) + } + } +} + +// stringFormatCheckerV2 implements the formatStringInterpolater interface +type stringFormatCheckerV2 struct { + args []ast.Expr + argsRequested int + currArgIndex int64 + ast *ast.AST +} + +// String implements formatStringInterpolatorV2.String. +func (c *stringFormatCheckerV2) String(arg ref.Val) (string, error) { + formatArg := c.args[c.currArgIndex] + valid, badID := c.verifyString(formatArg) + if !valid { + return "", stringFormatErrorV2(badID, c.typeOf(badID).TypeName()) + } + return "", nil +} + +// Decimal implements formatStringInterpolatorV2.Decimal. +func (c *stringFormatCheckerV2) Decimal(arg ref.Val) (string, error) { + id := c.args[c.currArgIndex].ID() + valid := c.verifyTypeOneOf(id, types.IntType, types.UintType, types.DoubleType) + if !valid { + return "", decimalFormatErrorV2(id, c.typeOf(id).TypeName()) + } + return "", nil +} + +// Fixed implements formatStringInterpolatorV2.Fixed. +func (c *stringFormatCheckerV2) Fixed(precision int) func(ref.Val) (string, error) { + return func(arg ref.Val) (string, error) { + id := c.args[c.currArgIndex].ID() + valid := c.verifyTypeOneOf(id, types.IntType, types.UintType, types.DoubleType) + if !valid { + return "", fixedPointFormatErrorV2(id, c.typeOf(id).TypeName()) + } + return "", nil + } +} + +// Scientific implements formatStringInterpolatorV2.Scientific. +func (c *stringFormatCheckerV2) Scientific(precision int) func(ref.Val) (string, error) { + return func(arg ref.Val) (string, error) { + id := c.args[c.currArgIndex].ID() + valid := c.verifyTypeOneOf(id, types.IntType, types.UintType, types.DoubleType) + if !valid { + return "", scientificFormatErrorV2(id, c.typeOf(id).TypeName()) + } + return "", nil + } +} + +// Binary implements formatStringInterpolatorV2.Binary. +func (c *stringFormatCheckerV2) Binary(arg ref.Val) (string, error) { + id := c.args[c.currArgIndex].ID() + valid := c.verifyTypeOneOf(id, types.BoolType, types.IntType, types.UintType) + if !valid { + return "", binaryFormatErrorV2(id, c.typeOf(id).TypeName()) + } + return "", nil +} + +// Hex implements formatStringInterpolatorV2.Hex. +func (c *stringFormatCheckerV2) Hex(useUpper bool) func(ref.Val) (string, error) { + return func(arg ref.Val) (string, error) { + id := c.args[c.currArgIndex].ID() + valid := c.verifyTypeOneOf(id, types.IntType, types.UintType, types.StringType, types.BytesType) + if !valid { + return "", hexFormatErrorV2(id, c.typeOf(id).TypeName()) + } + return "", nil + } +} + +// Octal implements formatStringInterpolatorV2.Octal. +func (c *stringFormatCheckerV2) Octal(arg ref.Val) (string, error) { + id := c.args[c.currArgIndex].ID() + valid := c.verifyTypeOneOf(id, types.IntType, types.UintType) + if !valid { + return "", octalFormatErrorV2(id, c.typeOf(id).TypeName()) + } + return "", nil +} + +// Arg implements formatListArgs.Arg. +func (c *stringFormatCheckerV2) Arg(index int64) (ref.Val, error) { + c.argsRequested++ + c.currArgIndex = index + // return a dummy value - this is immediately passed to back to us + // through one of the FormatCallback functions, so anything will do + return types.Int(0), nil +} + +// Size implements formatListArgs.Size. +func (c *stringFormatCheckerV2) Size() int64 { + return int64(len(c.args)) +} + +func (c *stringFormatCheckerV2) typeOf(id int64) *cel.Type { + return c.ast.GetType(id) +} + +func (c *stringFormatCheckerV2) verifyTypeOneOf(id int64, validTypes ...*cel.Type) bool { + t := c.typeOf(id) + if t == cel.DynType { + return true + } + for _, vt := range validTypes { + // Only check runtime type compatibility without delving deeper into parameterized types + if t.Kind() == vt.Kind() { + return true + } + } + return false +} + +func (c *stringFormatCheckerV2) verifyString(sub ast.Expr) (bool, int64) { + paramA := cel.TypeParamType("A") + paramB := cel.TypeParamType("B") + subVerified := c.verifyTypeOneOf(sub.ID(), + cel.ListType(paramA), cel.MapType(paramA, paramB), + cel.IntType, cel.UintType, cel.DoubleType, cel.BoolType, cel.StringType, + cel.TimestampType, cel.BytesType, cel.DurationType, cel.TypeType, cel.NullType) + if !subVerified { + return false, sub.ID() + } + switch sub.Kind() { + case ast.ListKind: + for _, e := range sub.AsList().Elements() { + // recursively verify if we're dealing with a list/map + verified, id := c.verifyString(e) + if !verified { + return false, id + } + } + return true, sub.ID() + case ast.MapKind: + for _, e := range sub.AsMap().Entries() { + // recursively verify if we're dealing with a list/map + entry := e.AsMapEntry() + verified, id := c.verifyString(entry.Key()) + if !verified { + return false, id + } + verified, id = c.verifyString(entry.Value()) + if !verified { + return false, id + } + } + return true, sub.ID() + default: + return true, sub.ID() + } +} + +// helper routines for reporting common errors during string formatting static validation and +// runtime execution. + +func binaryFormatErrorV2(id int64, badType string) error { + return newFormatError(id, "only ints, uints, and bools can be formatted as binary, was given %s", badType) +} + +func decimalFormatErrorV2(id int64, badType string) error { + return newFormatError(id, "decimal clause can only be used on ints, uints, and doubles, was given %s", badType) +} + +func fixedPointFormatErrorV2(id int64, badType string) error { + return newFormatError(id, "fixed-point clause can only be used on ints, uints, and doubles, was given %s", badType) +} + +func hexFormatErrorV2(id int64, badType string) error { + return newFormatError(id, "only ints, uints, bytes, and strings can be formatted as hex, was given %s", badType) +} + +func octalFormatErrorV2(id int64, badType string) error { + return newFormatError(id, "octal clause can only be used on ints and uints, was given %s", badType) +} + +func scientificFormatErrorV2(id int64, badType string) error { + return newFormatError(id, "scientific clause can only be used on ints, uints, and doubles, was given %s", badType) +} + +func stringFormatErrorV2(id int64, badType string) error { + return newFormatError(id, "string clause can only be used on strings, bools, bytes, ints, doubles, maps, lists, types, durations, and timestamps, was given %s", badType) +} + +// formatStringInterpolatorV2 is an interface that allows user-defined behavior +// for formatting clause implementations, as well as argument retrieval. +// Each function is expected to support the appropriate types as laid out in +// the string.format documentation, and to return an error if given an inappropriate type. +type formatStringInterpolatorV2 interface { + // String takes a ref.Val and a string representing the current locale identifier + // and returns the Val formatted as a string, or an error if one occurred. + String(ref.Val) (string, error) + + // Decimal takes a ref.Val and a string representing the current locale identifier + // and returns the Val formatted as a decimal integer, or an error if one occurred. + Decimal(ref.Val) (string, error) + + // Fixed takes an int pointer representing precision (or nil if none was given) and + // returns a function operating in a similar manner to String and Decimal, taking a + // ref.Val and locale and returning the appropriate string. A closure is returned + // so precision can be set without needing an additional function call/configuration. + Fixed(int) func(ref.Val) (string, error) + + // Scientific functions identically to Fixed, except the string returned from the closure + // is expected to be in scientific notation. + Scientific(int) func(ref.Val) (string, error) + + // Binary takes a ref.Val and a string representing the current locale identifier + // and returns the Val formatted as a binary integer, or an error if one occurred. + Binary(ref.Val) (string, error) + + // Hex takes a boolean that, if true, indicates the hex string output by the returned + // closure should use uppercase letters for A-F. + Hex(bool) func(ref.Val) (string, error) + + // Octal takes a ref.Val and a string representing the current locale identifier and + // returns the Val formatted in octal, or an error if one occurred. + Octal(ref.Val) (string, error) +} + +// parseFormatString formats a string according to the string.format syntax, taking the clause implementations +// from the provided FormatCallback and the args from the given FormatList. +func parseFormatStringV2(formatStr string, callback formatStringInterpolatorV2, list formatListArgs) (string, error) { + i := 0 + argIndex := 0 + var builtStr strings.Builder + for i < len(formatStr) { + if formatStr[i] == '%' { + if i+1 < len(formatStr) && formatStr[i+1] == '%' { + err := builtStr.WriteByte('%') + if err != nil { + return "", fmt.Errorf("error writing format string: %w", err) + } + i += 2 + continue + } else { + argAny, err := list.Arg(int64(argIndex)) + if err != nil { + return "", err + } + if i+1 >= len(formatStr) { + return "", errors.New("unexpected end of string") + } + if int64(argIndex) >= list.Size() { + return "", fmt.Errorf("index %d out of range", argIndex) + } + numRead, val, refErr := parseAndFormatClauseV2(formatStr[i:], argAny, callback, list) + if refErr != nil { + return "", refErr + } + _, err = builtStr.WriteString(val) + if err != nil { + return "", fmt.Errorf("error writing format string: %w", err) + } + i += numRead + argIndex++ + } + } else { + err := builtStr.WriteByte(formatStr[i]) + if err != nil { + return "", fmt.Errorf("error writing format string: %w", err) + } + i++ + } + } + return builtStr.String(), nil +} + +// parseAndFormatClause parses the format clause at the start of the given string with val, and returns +// how many characters were consumed and the substituted string form of val, or an error if one occurred. +func parseAndFormatClauseV2(formatStr string, val ref.Val, callback formatStringInterpolatorV2, list formatListArgs) (int, string, error) { + i := 1 + read, formatter, err := parseFormattingClauseV2(formatStr[i:], callback) + i += read + if err != nil { + return -1, "", newParseFormatError("could not parse formatting clause", err) + } + + valStr, err := formatter(val) + if err != nil { + return -1, "", newParseFormatError("error during formatting", err) + } + return i, valStr, nil +} + +func parseFormattingClauseV2(formatStr string, callback formatStringInterpolatorV2) (int, clauseImplV2, error) { + i := 0 + read, precision, err := parsePrecisionV2(formatStr[i:]) + i += read + if err != nil { + return -1, nil, fmt.Errorf("error while parsing precision: %w", err) + } + r := rune(formatStr[i]) + i++ + switch r { + case 's': + return i, callback.String, nil + case 'd': + return i, callback.Decimal, nil + case 'f': + return i, callback.Fixed(precision), nil + case 'e': + return i, callback.Scientific(precision), nil + case 'b': + return i, callback.Binary, nil + case 'x', 'X': + return i, callback.Hex(unicode.IsUpper(r)), nil + case 'o': + return i, callback.Octal, nil + default: + return -1, nil, fmt.Errorf("unrecognized formatting clause \"%c\"", r) + } +} + +func parsePrecisionV2(formatStr string) (int, int, error) { + i := 0 + if formatStr[i] != '.' { + return i, defaultPrecision, nil + } + i++ + var buffer strings.Builder + for { + if i >= len(formatStr) { + return -1, -1, errors.New("could not find end of precision specifier") + } + if !isASCIIDigit(rune(formatStr[i])) { + break + } + buffer.WriteByte(formatStr[i]) + i++ + } + precision, err := strconv.Atoi(buffer.String()) + if err != nil { + return -1, -1, fmt.Errorf("error while converting precision to integer: %w", err) + } + if precision < 0 { + return -1, -1, fmt.Errorf("negative precision: %d", precision) + } + return i, precision, nil +} diff --git a/vendor/github.com/google/cel-go/ext/guards.go b/vendor/github.com/google/cel-go/ext/guards.go index ccede289fb..1461c0416d 100644 --- a/vendor/github.com/google/cel-go/ext/guards.go +++ b/vendor/github.com/google/cel-go/ext/guards.go @@ -24,28 +24,28 @@ import ( func intOrError(i int64, err error) ref.Val { if err != nil { - return types.NewErr(err.Error()) + return types.NewErrFromString(err.Error()) } return types.Int(i) } func bytesOrError(bytes []byte, err error) ref.Val { if err != nil { - return types.NewErr(err.Error()) + return types.NewErrFromString(err.Error()) } return types.Bytes(bytes) } func stringOrError(str string, err error) ref.Val { if err != nil { - return types.NewErr(err.Error()) + return types.NewErrFromString(err.Error()) } return types.String(str) } func listStringOrError(strs []string, err error) ref.Val { if err != nil { - return types.NewErr(err.Error()) + return types.NewErrFromString(err.Error()) } return types.DefaultTypeAdapter.NativeToValue(strs) } diff --git a/vendor/github.com/google/cel-go/ext/lists.go b/vendor/github.com/google/cel-go/ext/lists.go index d0b90ea92e..b27ddf22f5 100644 --- a/vendor/github.com/google/cel-go/ext/lists.go +++ b/vendor/github.com/google/cel-go/ext/lists.go @@ -20,11 +20,14 @@ import ( "sort" "github.com/google/cel-go/cel" + "github.com/google/cel-go/checker" + "github.com/google/cel-go/common" "github.com/google/cel-go/common/ast" "github.com/google/cel-go/common/decls" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" "github.com/google/cel-go/common/types/traits" + "github.com/google/cel-go/interpreter" "github.com/google/cel-go/parser" ) @@ -44,7 +47,7 @@ var comparableTypes = []*cel.Type{ // // # Distinct // -// Introduced in version: 2 +// Introduced in version: 2 (cost support in version 3) // // Returns the distinct elements of a list. // @@ -58,7 +61,7 @@ var comparableTypes = []*cel.Type{ // // # Range // -// Introduced in version: 2 +// Introduced in version: 2 (cost support in version 3) // // Returns a list of integers from 0 to n-1. // @@ -70,7 +73,7 @@ var comparableTypes = []*cel.Type{ // // # Reverse // -// Introduced in version: 2 +// Introduced in version: 2 (cost support in version 3) // // Returns the elements of a list in reverse order. // @@ -82,6 +85,8 @@ var comparableTypes = []*cel.Type{ // // # Slice // +// Introduced in version: 0 (cost support in version 3) +// // Returns a new sub-list using the indexes provided. // // .slice(, ) -> @@ -93,12 +98,14 @@ var comparableTypes = []*cel.Type{ // // # Flatten // +// Introduced in version: 1 (cost support in version 3) +// // Flattens a list recursively. -// If an optional depth is provided, the list is flattened to a the specificied level. +// If an optional depth is provided, the list is flattened to a the specified level. // A negative depth value will result in an error. // -// .flatten() -> -// .flatten(, ) -> +// .flatten() -> +// .flatten() -> // // Examples: // @@ -110,7 +117,7 @@ var comparableTypes = []*cel.Type{ // // # Sort // -// Introduced in version: 2 +// Introduced in version: 2 (cost support in version 3) // // Sorts a list with comparable elements. If the element type is not comparable // or the element types are not the same, the function will produce an error. @@ -127,6 +134,8 @@ var comparableTypes = []*cel.Type{ // // # SortBy // +// Introduced in version: 2 (cost support in version 3) +// // Sorts a list by a key value, i.e., the order is determined by the result of // an expression applied to each element of the list. // The output of the key expression must be a comparable type, otherwise the @@ -134,7 +143,7 @@ var comparableTypes = []*cel.Type{ // // .sortBy(, ) -> // keyExpr returns a value in {int, uint, double, bool, duration, timestamp, string, bytes} - +// // Examples: // // [ @@ -143,15 +152,11 @@ var comparableTypes = []*cel.Type{ // Player { name: "baz", score: 1000 }, // ].sortBy(e, e.score).map(e, e.name) // == ["bar", "foo", "baz"] - func Lists(options ...ListsOption) cel.EnvOption { - l := &listsLib{ - version: math.MaxUint32, - } + l := &listsLib{version: math.MaxUint32} for _, o := range options { l = o(l) } - return cel.Lib(l) } @@ -211,9 +216,10 @@ func (lib listsLib) CompileOptions() []cel.EnvOption { cel.MemberOverload("list_flatten", []*cel.Type{listListType}, listType, cel.UnaryBinding(func(arg ref.Val) ref.Val { + // double-check as type-guards disabled list, ok := arg.(traits.Lister) if !ok { - return types.MaybeNoSuchOverloadErr(arg) + return types.ValOrErr(arg, "no such overload: %v.flatten()", arg.Type()) } flatList, err := flatten(list, 1) if err != nil { @@ -226,13 +232,14 @@ func (lib listsLib) CompileOptions() []cel.EnvOption { cel.MemberOverload("list_flatten_int", []*cel.Type{listDyn, types.IntType}, listDyn, cel.BinaryBinding(func(arg1, arg2 ref.Val) ref.Val { + // double-check as type-guards disabled list, ok := arg1.(traits.Lister) if !ok { - return types.MaybeNoSuchOverloadErr(arg1) + return types.ValOrErr(arg1, "no such overload: %v.flatten(%v)", arg1.Type(), arg2.Type()) } depth, ok := arg2.(types.Int) if !ok { - return types.MaybeNoSuchOverloadErr(arg2) + return types.ValOrErr(arg1, "no such overload: %v.flatten(%v)", arg1.Type(), arg2.Type()) } flatList, err := flatten(list, int64(depth)) if err != nil { @@ -260,10 +267,8 @@ func (lib listsLib) CompileOptions() []cel.EnvOption { }), cel.SingletonUnaryBinding( func(arg ref.Val) ref.Val { - list, ok := arg.(traits.Lister) - if !ok { - return types.MaybeNoSuchOverloadErr(arg) - } + // validated by type-guards + list := arg.(traits.Lister) sorted, err := sortList(list) if err != nil { return types.WrapErr(err) @@ -287,15 +292,10 @@ func (lib listsLib) CompileOptions() []cel.EnvOption { ) }), cel.SingletonBinaryBinding( - func(arg1 ref.Val, arg2 ref.Val) ref.Val { - list, ok := arg1.(traits.Lister) - if !ok { - return types.MaybeNoSuchOverloadErr(arg1) - } - keys, ok := arg2.(traits.Lister) - if !ok { - return types.MaybeNoSuchOverloadErr(arg2) - } + func(arg1, arg2 ref.Val) ref.Val { + // validated by type-guards + list := arg1.(traits.Lister) + keys := arg2.(traits.Lister) sorted, err := sortListByAssociatedKeys(list, keys) if err != nil { return types.WrapErr(err) @@ -312,9 +312,8 @@ func (lib listsLib) CompileOptions() []cel.EnvOption { opts = append(opts, cel.Function("lists.range", cel.Overload("lists_range", []*cel.Type{cel.IntType}, cel.ListType(cel.IntType), - cel.FunctionBinding(func(args ...ref.Val) ref.Val { - n := args[0].(types.Int) - result, err := genRange(n) + cel.UnaryBinding(func(n ref.Val) ref.Val { + result, err := genRange(n.(types.Int)) if err != nil { return types.WrapErr(err) } @@ -325,9 +324,8 @@ func (lib listsLib) CompileOptions() []cel.EnvOption { opts = append(opts, cel.Function("reverse", cel.MemberOverload("list_reverse", []*cel.Type{listType}, listType, - cel.FunctionBinding(func(args ...ref.Val) ref.Val { - list := args[0].(traits.Lister) - result, err := reverseList(list) + cel.UnaryBinding(func(list ref.Val) ref.Val { + result, err := reverseList(list.(traits.Lister)) if err != nil { return types.WrapErr(err) } @@ -348,13 +346,61 @@ func (lib listsLib) CompileOptions() []cel.EnvOption { ), )) } + if lib.version >= 3 { + estimators := []checker.CostOption{ + checker.OverloadCostEstimate("list_slice", estimateListSlice), + checker.OverloadCostEstimate("list_flatten", estimateListFlatten), + checker.OverloadCostEstimate("list_flatten_int", estimateListFlatten), + checker.OverloadCostEstimate("lists_range", estimateListsRange), + checker.OverloadCostEstimate("list_reverse", estimateListReverse), + checker.OverloadCostEstimate("list_distinct", estimateListDistinct), + } + for _, t := range comparableTypes { + estimators = append(estimators, + checker.OverloadCostEstimate( + fmt.Sprintf("list_%s_sort", t.TypeName()), + estimateListSort(t), + ), + checker.OverloadCostEstimate( + fmt.Sprintf("list_%s_sortByAssociatedKeys", t.TypeName()), + estimateListSortBy(t), + ), + ) + } + opts = append(opts, cel.CostEstimatorOptions(estimators...)) + } return opts } // ProgramOptions implements the Library interface method. -func (listsLib) ProgramOptions() []cel.ProgramOption { - return []cel.ProgramOption{} +func (lib *listsLib) ProgramOptions() []cel.ProgramOption { + var opts []cel.ProgramOption + if lib.version >= 3 { + // TODO: Add cost trackers for list operations + trackers := []interpreter.CostTrackerOption{ + interpreter.OverloadCostTracker("list_slice", trackListOutputSize), + interpreter.OverloadCostTracker("list_flatten", trackListFlatten), + interpreter.OverloadCostTracker("list_flatten_int", trackListFlatten), + interpreter.OverloadCostTracker("lists_range", trackListOutputSize), + interpreter.OverloadCostTracker("list_reverse", trackListOutputSize), + interpreter.OverloadCostTracker("list_distinct", trackListDistinct), + } + for _, t := range comparableTypes { + trackers = append(trackers, + interpreter.OverloadCostTracker( + fmt.Sprintf("list_%s_sort", t.TypeName()), + trackListSort, + ), + interpreter.OverloadCostTracker( + fmt.Sprintf("list_%s_sortByAssociatedKeys", t.TypeName()), + trackListSortBy, + ), + ) + } + opts = append(opts, cel.CostTrackerOptions(trackers...)) + } + return opts } func genRange(n types.Int) (ref.Val, error) { @@ -459,20 +505,24 @@ func sortListByAssociatedKeys(list, keys traits.Lister) (ref.Val, error) { sortedIndices := make([]ref.Val, 0, listLength) for i := types.IntZero; i < listLength; i++ { - if keys.Get(i).Type() != elem.Type() { - return nil, fmt.Errorf("list elements must have the same type") - } sortedIndices = append(sortedIndices, i) } + var err error sort.Slice(sortedIndices, func(i, j int) bool { iKey := keys.Get(sortedIndices[i]) jKey := keys.Get(sortedIndices[j]) + if iKey.Type() != elem.Type() || jKey.Type() != elem.Type() { + err = fmt.Errorf("list elements must have the same type") + return false + } return iKey.(traits.Comparer).Compare(jKey) == types.IntNegOne }) + if err != nil { + return nil, err + } sorted := make([]ref.Val, 0, listLength) - for _, sortedIdx := range sortedIndices { sorted = append(sorted, list.Get(sortedIdx)) } @@ -498,8 +548,9 @@ func sortByMacro(meh cel.MacroExprFactory, target ast.Expr, args []ast.Expr) (as if targetKind != ast.ListKind && targetKind != ast.SelectKind && targetKind != ast.IdentKind && - targetKind != ast.ComprehensionKind && targetKind != ast.CallKind { - return nil, meh.NewError(target.ID(), fmt.Sprintf("sortBy can only be applied to a list, identifier, comprehension, call or select expression")) + targetKind != ast.ComprehensionKind && + targetKind != ast.CallKind { + return nil, meh.NewError(target.ID(), "sortBy can only be applied to a list, identifier, comprehension, call or select expression") } mapCompr, err := parser.MakeMap(meh, meh.Copy(varIdent), args) @@ -558,3 +609,171 @@ func templatedOverloads(types []*cel.Type, template func(t *cel.Type) cel.Functi } return overloads } + +// estimateListSlice computes an O(n) slice operation with a cost factor of 1. +func estimateListSlice(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { + if target == nil || len(args) != 2 { + return nil + } + sz := estimateSize(estimator, *target) + start := nodeAsIntValue(args[0], 0) + end := nodeAsIntValue(args[1], sz.Max) + return estimateAllocatingListCall(1, checker.FixedSizeEstimate(end-start)) +} + +// estimateListsRange computes an O(n) range operation with a cost factor of 1. +func estimateListsRange(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { + if target != nil || len(args) != 1 { + return nil + } + return estimateAllocatingListCall(1, checker.FixedSizeEstimate(nodeAsIntValue(args[0], math.MaxUint))) +} + +// estimateListReverse computes an O(n) reverse operation with a cost factor of 1. +func estimateListReverse(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { + if target == nil || len(args) != 0 { + return nil + } + return estimateAllocatingListCall(1, estimateSize(estimator, *target)) +} + +// estimateListFlatten computes an O(n) flatten operation with a cost factor proportional to the flatten depth. +func estimateListFlatten(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { + if target == nil || len(args) > 1 { + return nil + } + depth := uint64(1) + if len(args) == 1 { + depth = nodeAsIntValue(args[0], math.MaxUint) + } + return estimateAllocatingListCall(float64(depth), estimateSize(estimator, *target)) +} + +// Compute an O(n^2) with a cost factor of 2, equivalent to sets.contains with a result list +// which can vary in size from 1 element to the original list size. +func estimateListDistinct(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { + if target == nil || len(args) != 0 { + return nil + } + sz := estimateSize(estimator, *target) + costFactor := 2.0 + return estimateAllocatingListCall(costFactor, sz.Multiply(sz)) +} + +// estimateListSort computes an O(n^2) sort operation with a cost factor of 2 for the equality +// operations against the elements in the list against themselves which occur during the sort computation. +func estimateListSort(t *types.Type) checker.FunctionEstimator { + return func(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { + if target == nil || len(args) != 0 { + return nil + } + return estimateListSortCost(estimator, *target, t) + } +} + +// estimateListSortBy computes an O(n^2) sort operation with a cost factor of 2 for the equality +// operations against the sort index list which occur during the sort computation. +func estimateListSortBy(u *types.Type) checker.FunctionEstimator { + return func(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { + if target == nil || len(args) != 1 { + return nil + } + // Estimate the size of the list used as the sort index + return estimateListSortCost(estimator, args[0], u) + } +} + +// estimateListSortCost estimates an O(n^2) sort operation with a cost factor of 2 for the equality +// operations which occur during the sort computation. +func estimateListSortCost(estimator checker.CostEstimator, node checker.AstNode, elemType *types.Type) *checker.CallEstimate { + sz := estimateSize(estimator, node) + costFactor := 2.0 + switch elemType { + case types.StringType, types.BytesType: + costFactor += common.StringTraversalCostFactor + } + return estimateAllocatingListCall(costFactor, sz.Multiply(sz)) +} + +// estimateAllocatingListCall computes cost as a function of the size of the result list with a +// baseline cost for the call dispatch and the associated list allocation. +func estimateAllocatingListCall(costFactor float64, listSize checker.SizeEstimate) *checker.CallEstimate { + return estimateListCall(costFactor, listSize, true) +} + +// estimateListCall computes cost as a function of the size of the target list and whether the +// call allocates memory. +func estimateListCall(costFactor float64, listSize checker.SizeEstimate, allocates bool) *checker.CallEstimate { + cost := listSize.MultiplyByCostFactor(costFactor).Add(callCostEstimate) + if allocates { + cost = cost.Add(checker.FixedCostEstimate(common.ListCreateBaseCost)) + } + return &checker.CallEstimate{CostEstimate: cost, ResultSize: &listSize} +} + +// trackListOutputSize computes cost as a function of the size of the result list. +func trackListOutputSize(_ []ref.Val, result ref.Val) *uint64 { + return trackAllocatingListCall(1, actualSize(result)) +} + +// trackListFlatten computes cost as a function of the size of the result list and the depth of +// the flatten operation. +func trackListFlatten(args []ref.Val, _ ref.Val) *uint64 { + depth := 1.0 + if len(args) == 2 { + depth = float64(args[1].(types.Int)) + } + inputSize := actualSize(args[0]) + return trackAllocatingListCall(depth, inputSize) +} + +// trackListDistinct computes costs as a worst-case O(n^2) operation over the input list. +func trackListDistinct(args []ref.Val, _ ref.Val) *uint64 { + return trackListSelfCompare(args[0].(traits.Lister)) +} + +// trackListSort computes costs as a worst-case O(n^2) operation over the input list. +func trackListSort(args []ref.Val, result ref.Val) *uint64 { + return trackListSelfCompare(args[0].(traits.Lister)) +} + +// trackListSortBy computes costs as a worst-case O(n^2) operation over the sort index list. +func trackListSortBy(args []ref.Val, result ref.Val) *uint64 { + return trackListSelfCompare(args[1].(traits.Lister)) +} + +// trackListSelfCompare computes costs as a worst-case O(n^2) operation over the input list. +func trackListSelfCompare(l traits.Lister) *uint64 { + sz := actualSize(l) + costFactor := 2.0 + if sz == 0 { + return trackAllocatingListCall(costFactor, 0) + } + elem := l.Get(types.IntZero) + if elem.Type() == types.StringType || elem.Type() == types.BytesType { + costFactor += common.StringTraversalCostFactor + } + return trackAllocatingListCall(costFactor, sz*sz) +} + +// trackAllocatingListCall computes costs as a function of the size of the result list with a baseline cost +// for the call dispatch and the associated list allocation. +func trackAllocatingListCall(costFactor float64, size uint64) *uint64 { + cost := uint64(float64(size)*costFactor) + callCost + common.ListCreateBaseCost + return &cost +} + +func nodeAsIntValue(node checker.AstNode, defaultVal uint64) uint64 { + if node.Expr().Kind() != ast.LiteralKind { + return defaultVal + } + lit := node.Expr().AsLiteral() + if lit.Type() != types.IntType { + return defaultVal + } + val := lit.(types.Int) + if val < types.IntZero { + return 0 + } + return uint64(lit.(types.Int)) +} diff --git a/vendor/github.com/google/cel-go/ext/math.go b/vendor/github.com/google/cel-go/ext/math.go index 250246db15..6df8e37736 100644 --- a/vendor/github.com/google/cel-go/ext/math.go +++ b/vendor/github.com/google/cel-go/ext/math.go @@ -325,6 +325,23 @@ import ( // // math.isFinite(0.0/0.0) // returns false // math.isFinite(1.2) // returns true +// +// # Math.Sqrt +// +// Introduced at version: 2 +// +// Returns the square root of the given input as double +// Throws error for negative or non-numeric inputs +// +// math.sqrt() -> +// math.sqrt() -> +// math.sqrt() -> +// +// Examples: +// +// math.sqrt(81) // returns 9.0 +// math.sqrt(985.25) // returns 31.388692231439016 +// math.sqrt(-15) // returns NaN func Math(options ...MathOption) cel.EnvOption { m := &mathLib{version: math.MaxUint32} for _, o := range options { @@ -357,6 +374,9 @@ const ( absFunc = "math.abs" signFunc = "math.sign" + // SquareRoot function + sqrtFunc = "math.sqrt" + // Bitwise functions bitAndFunc = "math.bitAnd" bitOrFunc = "math.bitOr" @@ -548,6 +568,18 @@ func (lib *mathLib) CompileOptions() []cel.EnvOption { ), ) } + if lib.version >= 2 { + opts = append(opts, + cel.Function(sqrtFunc, + cel.Overload("math_sqrt_double", []*cel.Type{cel.DoubleType}, cel.DoubleType, + cel.UnaryBinding(sqrt)), + cel.Overload("math_sqrt_int", []*cel.Type{cel.IntType}, cel.DoubleType, + cel.UnaryBinding(sqrt)), + cel.Overload("math_sqrt_uint", []*cel.Type{cel.UintType}, cel.DoubleType, + cel.UnaryBinding(sqrt)), + ), + ) + } return opts } @@ -691,6 +723,21 @@ func sign(val ref.Val) ref.Val { } } + +func sqrt(val ref.Val) ref.Val { + switch v := val.(type) { + case types.Double: + return types.Double(math.Sqrt(float64(v))) + case types.Int: + return types.Double(math.Sqrt(float64(v))) + case types.Uint: + return types.Double(math.Sqrt(float64(v))) + default: + return types.NewErr("no such overload: sqrt") + } +} + + func bitAndPairInt(first, second ref.Val) ref.Val { l := first.(types.Int) r := second.(types.Int) diff --git a/vendor/github.com/google/cel-go/ext/native.go b/vendor/github.com/google/cel-go/ext/native.go index 36ab4a7aec..ceaa274b74 100644 --- a/vendor/github.com/google/cel-go/ext/native.go +++ b/vendor/github.com/google/cel-go/ext/native.go @@ -17,6 +17,7 @@ package ext import ( "errors" "fmt" + "math" "reflect" "strings" "time" @@ -80,7 +81,7 @@ var ( // the time that it is invoked. // // There is also the possibility to rename the fields of native structs by setting the `cel` tag -// for fields you want to override. In order to enable this feature, pass in the `EnableStructTag` +// for fields you want to override. In order to enable this feature, pass in the `ParseStructTags(true)` // option. Here is an example to see it in action: // // ```go @@ -98,7 +99,9 @@ var ( func NativeTypes(args ...any) cel.EnvOption { return func(env *cel.Env) (*cel.Env, error) { nativeTypes := make([]any, 0, len(args)) - tpOptions := nativeTypeOptions{} + tpOptions := nativeTypeOptions{ + version: math.MaxUint32, + } for _, v := range args { switch v := v.(type) { @@ -128,6 +131,14 @@ func NativeTypes(args ...any) cel.EnvOption { // NativeTypesOption is a functional interface for configuring handling of native types. type NativeTypesOption func(*nativeTypeOptions) error +// NativeTypesVersion sets the native types version support for native extensions functions. +func NativeTypesVersion(version uint32) NativeTypesOption { + return func(opts *nativeTypeOptions) error { + opts.version = version + return nil + } +} + // NativeTypesFieldNameHandler is a handler for mapping a reflect.StructField to a CEL field name. // This can be used to override the default Go struct field to CEL field name mapping. type NativeTypesFieldNameHandler = func(field reflect.StructField) string @@ -158,6 +169,9 @@ type nativeTypeOptions struct { // This is most commonly used for switching to parsing based off the struct field tag, // such as "cel" or "json". fieldNameHandler NativeTypesFieldNameHandler + + // version is the native types library version. + version uint32 } // ParseStructTags configures if native types field names should be overridable by CEL struct tags. @@ -329,7 +343,7 @@ func (tp *nativeTypeProvider) NewValue(typeName string, fields map[string]ref.Va } fieldVal, err := val.ConvertToNative(refFieldDef.Type) if err != nil { - return types.NewErr(err.Error()) + return types.NewErrFromString(err.Error()) } refField := refVal.FieldByIndex(refFieldDef.Index) refFieldVal := reflect.ValueOf(fieldVal) @@ -436,7 +450,7 @@ func convertToCelType(refType reflect.Type) (*cel.Type, bool) { func (tp *nativeTypeProvider) newNativeObject(val any, refValue reflect.Value) ref.Val { valType, err := newNativeType(tp.options.fieldNameHandler, refValue.Type()) if err != nil { - return types.NewErr(err.Error()) + return types.NewErrFromString(err.Error()) } return &nativeObj{ Adapter: tp, @@ -595,7 +609,8 @@ func newNativeTypes(fieldNameHandler NativeTypesFieldNameHandler, rawType reflec var iterateStructMembers func(reflect.Type) iterateStructMembers = func(t reflect.Type) { if k := t.Kind(); k == reflect.Pointer || k == reflect.Slice || k == reflect.Array || k == reflect.Map { - t = t.Elem() + iterateStructMembers(t.Elem()) + return } if t.Kind() != reflect.Struct { return diff --git a/vendor/github.com/google/cel-go/ext/protos.go b/vendor/github.com/google/cel-go/ext/protos.go index 68796f60ad..b09db25b09 100644 --- a/vendor/github.com/google/cel-go/ext/protos.go +++ b/vendor/github.com/google/cel-go/ext/protos.go @@ -15,6 +15,8 @@ package ext import ( + "math" + "github.com/google/cel-go/cel" "github.com/google/cel-go/common/ast" ) @@ -49,8 +51,23 @@ import ( // Examples: // // proto.hasExt(msg, google.expr.proto2.test.int32_ext) // returns true || false -func Protos() cel.EnvOption { - return cel.Lib(protoLib{}) +func Protos(options ...ProtosOption) cel.EnvOption { + l := &protoLib{version: math.MaxUint32} + for _, o := range options { + l = o(l) + } + return cel.Lib(l) +} + +// ProtosOption declares a functional operator for configuring protobuf utilities. +type ProtosOption func(*protoLib) *protoLib + +// ProtosVersion sets the library version for extensions for protobuf utilities. +func ProtosVersion(version uint32) ProtosOption { + return func(lib *protoLib) *protoLib { + lib.version = version + return lib + } } var ( @@ -59,7 +76,9 @@ var ( getExtension = "getExt" ) -type protoLib struct{} +type protoLib struct { + version uint32 +} // LibraryName implements the SingletonLibrary interface method. func (protoLib) LibraryName() string { diff --git a/vendor/github.com/google/cel-go/ext/regex.go b/vendor/github.com/google/cel-go/ext/regex.go new file mode 100644 index 0000000000..1a66f65d0a --- /dev/null +++ b/vendor/github.com/google/cel-go/ext/regex.go @@ -0,0 +1,332 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ext + +import ( + "errors" + "fmt" + "math" + "regexp" + "strconv" + "strings" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" +) + +const ( + regexReplace = "regex.replace" + regexExtract = "regex.extract" + regexExtractAll = "regex.extractAll" +) + +// Regex returns a cel.EnvOption to configure extended functions for regular +// expression operations. +// +// Note: all functions use the 'regex' namespace. If you are +// currently using a variable named 'regex', the functions will likely work as +// intended, however there is some chance for collision. +// +// This library depends on the CEL optional type. Please ensure that the +// cel.OptionalTypes() is enabled when using regex extensions. +// +// # Replace +// +// The `regex.replace` function replaces all non-overlapping substring of a regex +// pattern in the target string with a replacement string. Optionally, you can +// limit the number of replacements by providing a count argument. When the count +// is a negative number, the function acts as replace all. Only numeric (\N) +// capture group references are supported in the replacement string, with +// validation for correctness. Backslashed-escaped digits (\1 to \9) within the +// replacement argument can be used to insert text matching the corresponding +// parenthesized group in the regexp pattern. An error will be thrown for invalid +// regex or replace string. +// +// regex.replace(target: string, pattern: string, replacement: string) -> string +// regex.replace(target: string, pattern: string, replacement: string, count: int) -> string +// +// Examples: +// +// regex.replace('hello world hello', 'hello', 'hi') == 'hi world hi' +// regex.replace('banana', 'a', 'x', 0) == 'banana' +// regex.replace('banana', 'a', 'x', 1) == 'bxnana' +// regex.replace('banana', 'a', 'x', 2) == 'bxnxna' +// regex.replace('banana', 'a', 'x', -12) == 'bxnxnx' +// regex.replace('foo bar', '(fo)o (ba)r', r'\2 \1') == 'ba fo' +// regex.replace('test', '(.)', r'\2') \\ Runtime Error invalid replace string +// regex.replace('foo bar', '(', '$2 $1') \\ Runtime Error invalid regex string +// regex.replace('id=123', r'id=(?P\d+)', r'value: \values') \\ Runtime Error invalid replace string +// +// # Extract +// +// The `regex.extract` function returns the first match of a regex pattern in a +// string. If no match is found, it returns an optional none value. An error will +// be thrown for invalid regex or for multiple capture groups. +// +// regex.extract(target: string, pattern: string) -> optional +// +// Examples: +// +// regex.extract('hello world', 'hello(.*)') == optional.of(' world') +// regex.extract('item-A, item-B', 'item-(\\w+)') == optional.of('A') +// regex.extract('HELLO', 'hello') == optional.empty() +// regex.extract('testuser@testdomain', '(.*)@([^.]*)') // Runtime Error multiple capture group +// +// # Extract All +// +// The `regex.extractAll` function returns a list of all matches of a regex +// pattern in a target string. If no matches are found, it returns an empty list. An error will +// be thrown for invalid regex or for multiple capture groups. +// +// regex.extractAll(target: string, pattern: string) -> list +// +// Examples: +// +// regex.extractAll('id:123, id:456', 'id:\\d+') == ['id:123', 'id:456'] +// regex.extractAll('id:123, id:456', 'assa') == [] +// regex.extractAll('testuser@testdomain', '(.*)@([^.]*)') // Runtime Error multiple capture group +func Regex(options ...RegexOptions) cel.EnvOption { + s := ®exLib{ + version: math.MaxUint32, + } + for _, o := range options { + s = o(s) + } + return cel.Lib(s) +} + +// RegexOptions declares a functional operator for configuring regex extension. +type RegexOptions func(*regexLib) *regexLib + +// RegexVersion configures the version of the Regex library definitions to use. See [Regex] for supported values. +func RegexVersion(version uint32) RegexOptions { + return func(lib *regexLib) *regexLib { + lib.version = version + return lib + } +} + +type regexLib struct { + version uint32 +} + +// LibraryName implements that SingletonLibrary interface method. +func (r *regexLib) LibraryName() string { + return "cel.lib.ext.regex" +} + +// CompileOptions implements the cel.Library interface method. +func (r *regexLib) CompileOptions() []cel.EnvOption { + optionalTypesEnabled := func(env *cel.Env) (*cel.Env, error) { + if !env.HasLibrary("cel.lib.optional") { + return nil, errors.New("regex library requires the optional library") + } + return env, nil + } + opts := []cel.EnvOption{ + cel.Function(regexExtract, + cel.Overload("regex_extract_string_string", []*cel.Type{cel.StringType, cel.StringType}, cel.OptionalType(cel.StringType), + cel.BinaryBinding(extract))), + + cel.Function(regexExtractAll, + cel.Overload("regex_extractAll_string_string", []*cel.Type{cel.StringType, cel.StringType}, cel.ListType(cel.StringType), + cel.BinaryBinding(extractAll))), + + cel.Function(regexReplace, + cel.Overload("regex_replace_string_string_string", []*cel.Type{cel.StringType, cel.StringType, cel.StringType}, cel.StringType, + cel.FunctionBinding(regReplace)), + cel.Overload("regex_replace_string_string_string_int", []*cel.Type{cel.StringType, cel.StringType, cel.StringType, cel.IntType}, cel.StringType, + cel.FunctionBinding((regReplaceN))), + ), + cel.EnvOption(optionalTypesEnabled), + } + return opts +} + +// ProgramOptions implements the cel.Library interface method +func (r *regexLib) ProgramOptions() []cel.ProgramOption { + return []cel.ProgramOption{} +} + +func compileRegex(regexStr string) (*regexp.Regexp, error) { + re, err := regexp.Compile(regexStr) + if err != nil { + return nil, fmt.Errorf("given regex is invalid: %w", err) + } + return re, nil +} + +func regReplace(args ...ref.Val) ref.Val { + target := args[0].(types.String) + regexStr := args[1].(types.String) + replaceStr := args[2].(types.String) + + return regReplaceN(target, regexStr, replaceStr, types.Int(-1)) +} + +func regReplaceN(args ...ref.Val) ref.Val { + target := string(args[0].(types.String)) + regexStr := string(args[1].(types.String)) + replaceStr := string(args[2].(types.String)) + replaceCount := int64(args[3].(types.Int)) + + if replaceCount == 0 { + return types.String(target) + } + + if replaceCount > math.MaxInt32 { + return types.NewErr("integer overflow") + } + + // If replaceCount is negative, just do a replaceAll. + if replaceCount < 0 { + replaceCount = -1 + } + + re, err := regexp.Compile(regexStr) + if err != nil { + return types.WrapErr(err) + } + + var resultBuilder strings.Builder + var lastIndex int + counter := int64(0) + + matches := re.FindAllStringSubmatchIndex(target, -1) + + for _, match := range matches { + if replaceCount != -1 && counter >= replaceCount { + break + } + + processedReplacement, err := replaceStrValidator(target, re, match, replaceStr) + if err != nil { + return types.WrapErr(err) + } + + resultBuilder.WriteString(target[lastIndex:match[0]]) + resultBuilder.WriteString(processedReplacement) + lastIndex = match[1] + counter++ + } + + resultBuilder.WriteString(target[lastIndex:]) + return types.String(resultBuilder.String()) +} + +func replaceStrValidator(target string, re *regexp.Regexp, match []int, replacement string) (string, error) { + groupCount := re.NumSubexp() + var sb strings.Builder + runes := []rune(replacement) + + for i := 0; i < len(runes); i++ { + c := runes[i] + + if c != '\\' { + sb.WriteRune(c) + continue + } + + if i+1 >= len(runes) { + return "", fmt.Errorf("invalid replacement string: '%s' \\ not allowed at end", replacement) + } + + i++ + nextChar := runes[i] + + if nextChar == '\\' { + sb.WriteRune('\\') + continue + } + + groupNum, err := strconv.Atoi(string(nextChar)) + if err != nil { + return "", fmt.Errorf("invalid replacement string: '%s' \\ must be followed by a digit or \\", replacement) + } + + if groupNum > groupCount { + return "", fmt.Errorf("replacement string references group %d but regex has only %d group(s)", groupNum, groupCount) + } + + if match[2*groupNum] != -1 { + sb.WriteString(target[match[2*groupNum]:match[2*groupNum+1]]) + } + } + return sb.String(), nil +} + +func extract(target, regexStr ref.Val) ref.Val { + t := string(target.(types.String)) + r := string(regexStr.(types.String)) + re, err := compileRegex(r) + if err != nil { + return types.WrapErr(err) + } + + if len(re.SubexpNames())-1 > 1 { + return types.WrapErr(fmt.Errorf("regular expression has more than one capturing group: %q", r)) + } + + matches := re.FindStringSubmatch(t) + if len(matches) == 0 { + return types.OptionalNone + } + + // If there is a capturing group, return the first match; otherwise, return the whole match. + if len(matches) > 1 { + capturedGroup := matches[1] + // If optional group is empty, return OptionalNone. + if capturedGroup == "" { + return types.OptionalNone + } + return types.OptionalOf(types.String(capturedGroup)) + } + return types.OptionalOf(types.String(matches[0])) +} + +func extractAll(target, regexStr ref.Val) ref.Val { + t := string(target.(types.String)) + r := string(regexStr.(types.String)) + re, err := compileRegex(r) + if err != nil { + return types.WrapErr(err) + } + + groupCount := len(re.SubexpNames()) - 1 + if groupCount > 1 { + return types.WrapErr(fmt.Errorf("regular expression has more than one capturing group: %q", r)) + } + + matches := re.FindAllStringSubmatch(t, -1) + result := make([]string, 0, len(matches)) + if len(matches) == 0 { + return types.NewStringList(types.DefaultTypeAdapter, result) + } + + if groupCount != 1 { + for _, match := range matches { + result = append(result, match[0]) + } + return types.NewStringList(types.DefaultTypeAdapter, result) + } + + for _, match := range matches { + if match[1] != "" { + result = append(result, match[1]) + } + } + return types.NewStringList(types.DefaultTypeAdapter, result) +} diff --git a/vendor/github.com/google/cel-go/ext/sets.go b/vendor/github.com/google/cel-go/ext/sets.go index 7e94166552..ecac4bf9d0 100644 --- a/vendor/github.com/google/cel-go/ext/sets.go +++ b/vendor/github.com/google/cel-go/ext/sets.go @@ -77,11 +77,28 @@ import ( // sets.intersects([1], []) // false // sets.intersects([1], [1, 2]) // true // sets.intersects([[1], [2, 3]], [[1, 2], [2, 3.0]]) // true -func Sets() cel.EnvOption { - return cel.Lib(setsLib{}) +func Sets(options ...SetsOption) cel.EnvOption { + l := &setsLib{} + for _, o := range options { + l = o(l) + } + return cel.Lib(l) +} + +// SetsOption declares a functional operator for configuring set extensions. +type SetsOption func(*setsLib) *setsLib + +// SetsVersion sets the library version for set extensions. +func SetsVersion(version uint32) SetsOption { + return func(lib *setsLib) *setsLib { + lib.version = version + return lib + } } -type setsLib struct{} +type setsLib struct { + version uint32 +} // LibraryName implements the SingletonLibrary interface method. func (setsLib) LibraryName() string { @@ -219,13 +236,13 @@ func setsEquivalent(listA, listB ref.Val) ref.Val { func estimateSetsCost(costFactor float64) checker.FunctionEstimator { return func(estimator checker.CostEstimator, target *checker.AstNode, args []checker.AstNode) *checker.CallEstimate { - if len(args) == 2 { - arg0Size := estimateSize(estimator, args[0]) - arg1Size := estimateSize(estimator, args[1]) - costEstimate := arg0Size.Multiply(arg1Size).MultiplyByCostFactor(costFactor).Add(callCostEstimate) - return &checker.CallEstimate{CostEstimate: costEstimate} + if len(args) != 2 { + return nil } - return nil + arg0Size := estimateSize(estimator, args[0]) + arg1Size := estimateSize(estimator, args[1]) + costEstimate := arg0Size.Multiply(arg1Size).MultiplyByCostFactor(costFactor).Add(callCostEstimate) + return &checker.CallEstimate{CostEstimate: costEstimate} } } @@ -256,6 +273,6 @@ func actualSize(value ref.Val) uint64 { } var ( - callCostEstimate = checker.CostEstimate{Min: 1, Max: 1} + callCostEstimate = checker.FixedCostEstimate(1) callCost = uint64(1) ) diff --git a/vendor/github.com/google/cel-go/ext/strings.go b/vendor/github.com/google/cel-go/ext/strings.go index 2e590a4c57..de65421f6d 100644 --- a/vendor/github.com/google/cel-go/ext/strings.go +++ b/vendor/github.com/google/cel-go/ext/strings.go @@ -286,10 +286,15 @@ const ( // // 'gums'.reverse() // returns 'smug' // 'John Smith'.reverse() // returns 'htimS nhoJ' +// +// Introduced at version: 4 +// +// Formatting updated to adhere to https://github.com/google/cel-spec/blob/master/doc/extensions/strings.md. +// +// .format() -> func Strings(options ...StringsOption) cel.EnvOption { s := &stringLib{ - version: math.MaxUint32, - validateFormat: true, + version: math.MaxUint32, } for _, o := range options { s = o(s) @@ -298,9 +303,8 @@ func Strings(options ...StringsOption) cel.EnvOption { } type stringLib struct { - locale string - version uint32 - validateFormat bool + locale string + version uint32 } // LibraryName implements the SingletonLibrary interface method. @@ -314,6 +318,8 @@ type StringsOption func(*stringLib) *stringLib // StringsLocale configures the library with the given locale. The locale tag will // be checked for validity at the time that EnvOptions are configured. If this option // is not passed, string.format will behave as if en_US was passed as the locale. +// +// If StringsVersion is greater than or equal to 4, this option is ignored. func StringsLocale(locale string) StringsOption { return func(sl *stringLib) *stringLib { sl.locale = locale @@ -340,10 +346,9 @@ func StringsVersion(version uint32) StringsOption { // StringsValidateFormatCalls validates type-checked ASTs to ensure that string.format() calls have // valid formatting clauses and valid argument types for each clause. // -// Enabled by default. +// Deprecated func StringsValidateFormatCalls(value bool) StringsOption { return func(s *stringLib) *stringLib { - s.validateFormat = value return s } } @@ -351,7 +356,7 @@ func StringsValidateFormatCalls(value bool) StringsOption { // CompileOptions implements the Library interface method. func (lib *stringLib) CompileOptions() []cel.EnvOption { formatLocale := "en_US" - if lib.locale != "" { + if lib.version < 4 && lib.locale != "" { // ensure locale is properly-formed if set _, err := language.Parse(lib.locale) if err != nil { @@ -466,21 +471,29 @@ func (lib *stringLib) CompileOptions() []cel.EnvOption { }))), } if lib.version >= 1 { - opts = append(opts, cel.Function("format", - cel.MemberOverload("string_format", []*cel.Type{cel.StringType, cel.ListType(cel.DynType)}, cel.StringType, - cel.FunctionBinding(func(args ...ref.Val) ref.Val { - s := string(args[0].(types.String)) - formatArgs := args[1].(traits.Lister) - return stringOrError(parseFormatString(s, &stringFormatter{}, &stringArgList{formatArgs}, formatLocale)) - }))), + if lib.version >= 4 { + opts = append(opts, cel.Function("format", + cel.MemberOverload("string_format", []*cel.Type{cel.StringType, cel.ListType(cel.DynType)}, cel.StringType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + s := string(args[0].(types.String)) + formatArgs := args[1].(traits.Lister) + return stringOrError(parseFormatStringV2(s, &stringFormatterV2{}, &stringArgList{formatArgs})) + })))) + } else { + opts = append(opts, cel.Function("format", + cel.MemberOverload("string_format", []*cel.Type{cel.StringType, cel.ListType(cel.DynType)}, cel.StringType, + cel.FunctionBinding(func(args ...ref.Val) ref.Val { + s := string(args[0].(types.String)) + formatArgs := args[1].(traits.Lister) + return stringOrError(parseFormatString(s, &stringFormatter{}, &stringArgList{formatArgs}, formatLocale)) + })))) + } + opts = append(opts, cel.Function("strings.quote", cel.Overload("strings_quote", []*cel.Type{cel.StringType}, cel.StringType, cel.UnaryBinding(func(str ref.Val) ref.Val { s := str.(types.String) return stringOrError(quote(string(s))) - }))), - - cel.ASTValidators(stringFormatValidator{})) - + })))) } if lib.version >= 2 { opts = append(opts, @@ -529,8 +542,12 @@ func (lib *stringLib) CompileOptions() []cel.EnvOption { }))), ) } - if lib.validateFormat { - opts = append(opts, cel.ASTValidators(stringFormatValidator{})) + if lib.version >= 1 { + if lib.version >= 4 { + opts = append(opts, cel.ASTValidators(stringFormatValidatorV2{})) + } else { + opts = append(opts, cel.ASTValidators(stringFormatValidator{})) + } } return opts } @@ -590,6 +607,10 @@ func lastIndexOf(str, substr string) (int64, error) { if substr == "" { return int64(len(runes)), nil } + + if len(str) < len(substr) { + return -1, nil + } return lastIndexOfOffset(str, substr, int64(len(runes)-1)) } diff --git a/vendor/github.com/google/cel-go/interpreter/activation.go b/vendor/github.com/google/cel-go/interpreter/activation.go index 1577f35909..dd40619ee1 100644 --- a/vendor/github.com/google/cel-go/interpreter/activation.go +++ b/vendor/github.com/google/cel-go/interpreter/activation.go @@ -156,6 +156,12 @@ type PartialActivation interface { UnknownAttributePatterns() []*AttributePattern } +// partialActivationConverter indicates whether an Activation implementation supports conversion to a PartialActivation +type partialActivationConverter interface { + // AsPartialActivation converts the current activation to a PartialActivation + AsPartialActivation() (PartialActivation, bool) +} + // partActivation is the default implementations of the PartialActivation interface. type partActivation struct { Activation @@ -166,3 +172,21 @@ type partActivation struct { func (a *partActivation) UnknownAttributePatterns() []*AttributePattern { return a.unknowns } + +// AsPartialActivation returns the partActivation as a PartialActivation interface. +func (a *partActivation) AsPartialActivation() (PartialActivation, bool) { + return a, true +} + +// AsPartialActivation walks the activation hierarchy and returns the first PartialActivation, if found. +func AsPartialActivation(vars Activation) (PartialActivation, bool) { + // Only internal activation instances may implement this interface + if pv, ok := vars.(partialActivationConverter); ok { + return pv.AsPartialActivation() + } + // Since Activations may be hierarchical, test whether a parent converts to a PartialActivation + if vars.Parent() != nil { + return AsPartialActivation(vars.Parent()) + } + return nil, false +} diff --git a/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go b/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go index 8f19bde7e1..7d0759e378 100644 --- a/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go +++ b/vendor/github.com/google/cel-go/interpreter/attribute_patterns.go @@ -358,7 +358,7 @@ func (m *attributeMatcher) AddQualifier(qual Qualifier) (Attribute, error) { func (m *attributeMatcher) Resolve(vars Activation) (any, error) { id := m.NamespacedAttribute.ID() // Bug in how partial activation is resolved, should search parents as well. - partial, isPartial := toPartialActivation(vars) + partial, isPartial := AsPartialActivation(vars) if isPartial { unk, err := m.fac.matchesUnknownPatterns( partial, @@ -384,14 +384,3 @@ func (m *attributeMatcher) Qualify(vars Activation, obj any) (any, error) { func (m *attributeMatcher) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { return attrQualifyIfPresent(m.fac, vars, obj, m, presenceOnly) } - -func toPartialActivation(vars Activation) (PartialActivation, bool) { - pv, ok := vars.(PartialActivation) - if ok { - return pv, true - } - if vars.Parent() != nil { - return toPartialActivation(vars.Parent()) - } - return nil, false -} diff --git a/vendor/github.com/google/cel-go/interpreter/interpretable.go b/vendor/github.com/google/cel-go/interpreter/interpretable.go index ebc432e9dd..96b5a8ffc0 100644 --- a/vendor/github.com/google/cel-go/interpreter/interpretable.go +++ b/vendor/github.com/google/cel-go/interpreter/interpretable.go @@ -109,6 +109,47 @@ type InterpretableConstructor interface { Type() ref.Type } +// ObservableInterpretable is an Interpretable which supports stateful observation, such as tracing +// or cost-tracking. +type ObservableInterpretable struct { + Interpretable + observers []StatefulObserver +} + +// ID implements the Interpretable method to get the expression id associated with the step. +func (oi *ObservableInterpretable) ID() int64 { + return oi.Interpretable.ID() +} + +// Eval proxies to the ObserveEval method while invoking a no-op callback to report the observations. +func (oi *ObservableInterpretable) Eval(vars Activation) ref.Val { + return oi.ObserveEval(vars, func(any) {}) +} + +// ObserveEval evaluates an interpretable and performs per-evaluation state-tracking. +// +// This method is concurrency safe and the expectation is that the observer function will use +// a switch statement to determine the type of the state which has been reported back from the call. +func (oi *ObservableInterpretable) ObserveEval(vars Activation, observer func(any)) ref.Val { + var err error + // Initialize the state needed for the observers to function. + for _, obs := range oi.observers { + vars, err = obs.InitState(vars) + if err != nil { + return types.WrapErr(err) + } + // Provide an initial reference to the state to ensure state is available + // even in cases of interrupting errors generated during evaluation. + observer(obs.GetState(vars)) + } + result := oi.Interpretable.Eval(vars) + // Get the state which needs to be reported back as having been observed. + for _, obs := range oi.observers { + observer(obs.GetState(vars)) + } + return result +} + // Core Interpretable implementations used during the program planning phase. type evalTestOnly struct { @@ -156,9 +197,6 @@ func (q *testOnlyQualifier) Qualify(vars Activation, obj any) (any, error) { if unk, isUnk := out.(types.Unknown); isUnk { return unk, nil } - if opt, isOpt := out.(types.Optional); isOpt { - return opt.HasValue(), nil - } return present, nil } @@ -762,6 +800,9 @@ func (fold *evalFold) Eval(ctx Activation) ref.Val { defer releaseFolder(f) foldRange := fold.iterRange.Eval(ctx) + if types.IsUnknownOrError(foldRange) { + return foldRange + } if fold.iterVar2 != "" { var foldable traits.Foldable switch r := foldRange.(type) { @@ -819,9 +860,9 @@ type evalWatch struct { } // Eval implements the Interpretable interface method. -func (e *evalWatch) Eval(ctx Activation) ref.Val { - val := e.Interpretable.Eval(ctx) - e.observer(e.ID(), e.Interpretable, val) +func (e *evalWatch) Eval(vars Activation) ref.Val { + val := e.Interpretable.Eval(vars) + e.observer(vars, e.ID(), e.Interpretable, val) return val } @@ -880,7 +921,7 @@ func (e *evalWatchAttr) AddQualifier(q Qualifier) (Attribute, error) { // Eval implements the Interpretable interface method. func (e *evalWatchAttr) Eval(vars Activation) ref.Val { val := e.InterpretableAttribute.Eval(vars) - e.observer(e.ID(), e.InterpretableAttribute, val) + e.observer(vars, e.ID(), e.InterpretableAttribute, val) return val } @@ -901,7 +942,7 @@ func (e *evalWatchConstQual) Qualify(vars Activation, obj any) (any, error) { } else { val = e.adapter.NativeToValue(out) } - e.observer(e.ID(), e.ConstantQualifier, val) + e.observer(vars, e.ID(), e.ConstantQualifier, val) return out, err } @@ -917,7 +958,7 @@ func (e *evalWatchConstQual) QualifyIfPresent(vars Activation, obj any, presence val = types.Bool(present) } if present || presenceOnly { - e.observer(e.ID(), e.ConstantQualifier, val) + e.observer(vars, e.ID(), e.ConstantQualifier, val) } return out, present, err } @@ -944,7 +985,7 @@ func (e *evalWatchAttrQual) Qualify(vars Activation, obj any) (any, error) { } else { val = e.adapter.NativeToValue(out) } - e.observer(e.ID(), e.Attribute, val) + e.observer(vars, e.ID(), e.Attribute, val) return out, err } @@ -960,7 +1001,7 @@ func (e *evalWatchAttrQual) QualifyIfPresent(vars Activation, obj any, presenceO val = types.Bool(present) } if present || presenceOnly { - e.observer(e.ID(), e.Attribute, val) + e.observer(vars, e.ID(), e.Attribute, val) } return out, present, err } @@ -981,7 +1022,7 @@ func (e *evalWatchQual) Qualify(vars Activation, obj any) (any, error) { } else { val = e.adapter.NativeToValue(out) } - e.observer(e.ID(), e.Qualifier, val) + e.observer(vars, e.ID(), e.Qualifier, val) return out, err } @@ -997,7 +1038,7 @@ func (e *evalWatchQual) QualifyIfPresent(vars Activation, obj any, presenceOnly val = types.Bool(present) } if present || presenceOnly { - e.observer(e.ID(), e.Qualifier, val) + e.observer(vars, e.ID(), e.Qualifier, val) } return out, present, err } @@ -1011,7 +1052,7 @@ type evalWatchConst struct { // Eval implements the Interpretable interface method. func (e *evalWatchConst) Eval(vars Activation) ref.Val { val := e.Value() - e.observer(e.ID(), e.InterpretableConst, val) + e.observer(vars, e.ID(), e.InterpretableConst, val) return val } @@ -1184,13 +1225,13 @@ func (a *evalAttr) Eval(ctx Activation) ref.Val { } // Qualify proxies to the Attribute's Qualify method. -func (a *evalAttr) Qualify(ctx Activation, obj any) (any, error) { - return a.attr.Qualify(ctx, obj) +func (a *evalAttr) Qualify(vars Activation, obj any) (any, error) { + return a.attr.Qualify(vars, obj) } // QualifyIfPresent proxies to the Attribute's QualifyIfPresent method. -func (a *evalAttr) QualifyIfPresent(ctx Activation, obj any, presenceOnly bool) (any, bool, error) { - return a.attr.QualifyIfPresent(ctx, obj, presenceOnly) +func (a *evalAttr) QualifyIfPresent(vars Activation, obj any, presenceOnly bool) (any, bool, error) { + return a.attr.QualifyIfPresent(vars, obj, presenceOnly) } func (a *evalAttr) IsOptional() bool { @@ -1223,9 +1264,9 @@ func (c *evalWatchConstructor) ID() int64 { } // Eval implements the Interpretable Eval function. -func (c *evalWatchConstructor) Eval(ctx Activation) ref.Val { - val := c.constructor.Eval(ctx) - c.observer(c.ID(), c.constructor, val) +func (c *evalWatchConstructor) Eval(vars Activation) ref.Val { + val := c.constructor.Eval(vars) + c.observer(vars, c.ID(), c.constructor, val) return val } @@ -1241,7 +1282,7 @@ func invalidOptionalElementInit(value ref.Val) ref.Val { func newFolder(eval *evalFold, ctx Activation) *folder { f := folderPool.Get().(*folder) f.evalFold = eval - f.Activation = ctx + f.activation = ctx return f } @@ -1262,7 +1303,7 @@ func releaseFolder(f *folder) { // cel.bind or cel.@block. type folder struct { *evalFold - Activation + activation Activation // fold state objects. accuVal ref.Val @@ -1290,7 +1331,7 @@ func (f *folder) foldIterable(iterable traits.Iterable) ref.Val { // Update the accumulation value and check for eval interuption. f.accuVal = f.step.Eval(f) f.initialized = true - if f.interruptable && checkInterrupt(f.Activation) { + if f.interruptable && checkInterrupt(f.activation) { f.interrupted = true return f.evalResult() } @@ -1316,7 +1357,7 @@ func (f *folder) FoldEntry(key, val any) bool { // Update the accumulation value and check for eval interuption. f.accuVal = f.step.Eval(f) f.initialized = true - if f.interruptable && checkInterrupt(f.Activation) { + if f.interruptable && checkInterrupt(f.activation) { f.interrupted = true return false } @@ -1330,7 +1371,7 @@ func (f *folder) ResolveName(name string) (any, bool) { if name == f.accuVar { if !f.initialized { f.initialized = true - initVal := f.accu.Eval(f.Activation) + initVal := f.accu.Eval(f.activation) if !f.exhaustive { if l, isList := initVal.(traits.Lister); isList && l.Size() == types.IntZero { initVal = types.NewMutableList(f.adapter) @@ -1355,7 +1396,32 @@ func (f *folder) ResolveName(name string) (any, bool) { return f.iterVar2Val, true } } - return f.Activation.ResolveName(name) + return f.activation.ResolveName(name) +} + +// Parent returns the activation embedded into the folder. +func (f *folder) Parent() Activation { + return f.activation +} + +// UnknownAttributePatterns implements the PartialActivation interface returning the unknown patterns +// if they were provided to the input activation, or an empty set if the proxied activation is not partial. +func (f *folder) UnknownAttributePatterns() []*AttributePattern { + if pv, ok := f.activation.(partialActivationConverter); ok { + if partial, isPartial := pv.AsPartialActivation(); isPartial { + return partial.UnknownAttributePatterns() + } + } + return []*AttributePattern{} +} + +func (f *folder) AsPartialActivation() (PartialActivation, bool) { + if pv, ok := f.activation.(partialActivationConverter); ok { + if _, isPartial := pv.AsPartialActivation(); isPartial { + return f, true + } + } + return nil, false } // evalResult computes the final result of the fold after all entries have been folded and accumulated. @@ -1381,7 +1447,7 @@ func (f *folder) evalResult() ref.Val { // reset clears any state associated with folder evaluation. func (f *folder) reset() { f.evalFold = nil - f.Activation = nil + f.activation = nil f.accuVal = nil f.iterVar1Val = nil f.iterVar2Val = nil diff --git a/vendor/github.com/google/cel-go/interpreter/interpreter.go b/vendor/github.com/google/cel-go/interpreter/interpreter.go index 0aca74d88b..be57e74392 100644 --- a/vendor/github.com/google/cel-go/interpreter/interpreter.go +++ b/vendor/github.com/google/cel-go/interpreter/interpreter.go @@ -18,36 +18,41 @@ package interpreter import ( + "errors" + "github.com/google/cel-go/common/ast" "github.com/google/cel-go/common/containers" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" ) +// PlannerOption configures the program plan options during interpretable setup. +type PlannerOption func(*planner) (*planner, error) + // Interpreter generates a new Interpretable from a checked or unchecked expression. type Interpreter interface { // NewInterpretable creates an Interpretable from a checked expression and an - // optional list of InterpretableDecorator values. - NewInterpretable(exprAST *ast.AST, decorators ...InterpretableDecorator) (Interpretable, error) + // optional list of PlannerOption values. + NewInterpretable(exprAST *ast.AST, opts ...PlannerOption) (Interpretable, error) } // EvalObserver is a functional interface that accepts an expression id and an observed value. // The id identifies the expression that was evaluated, the programStep is the Interpretable or Qualifier that // was evaluated and value is the result of the evaluation. -type EvalObserver func(id int64, programStep any, value ref.Val) +type EvalObserver func(vars Activation, id int64, programStep any, value ref.Val) -// Observe constructs a decorator that calls all the provided observers in order after evaluating each Interpretable -// or Qualifier during program evaluation. -func Observe(observers ...EvalObserver) InterpretableDecorator { - if len(observers) == 1 { - return decObserveEval(observers[0]) - } - observeFn := func(id int64, programStep any, val ref.Val) { - for _, observer := range observers { - observer(id, programStep, val) - } - } - return decObserveEval(observeFn) +// StatefulObserver observes evaluation while tracking or utilizing stateful behavior. +type StatefulObserver interface { + // InitState configures stateful metadata on the activation. + InitState(Activation) (Activation, error) + + // GetState retrieves the stateful metadata from the activation. + GetState(Activation) any + + // Observe passes the activation and relevant evaluation metadata to the observer. + // The observe method is expected to do the equivalent of GetState(vars) in order + // to find the metadata that needs to be updated upon invocation. + Observe(vars Activation, id int64, programStep any, value ref.Val) } // EvalCancelledError represents a cancelled program evaluation operation. @@ -73,24 +78,110 @@ const ( CostLimitExceeded ) -// TODO: Replace all usages of TrackState with EvalStateObserver +// evalStateOption configures the evalStateFactory behavior. +type evalStateOption func(*evalStateFactory) *evalStateFactory + +// EvalStateFactory configures the EvalState generator to be used by the EvalStateObserver. +func EvalStateFactory(factory func() EvalState) evalStateOption { + return func(fac *evalStateFactory) *evalStateFactory { + fac.factory = factory + return fac + } +} + +// EvalStateObserver provides an observer which records the value associated with the given expression id. +// EvalState must be provided to the observer. +func EvalStateObserver(opts ...evalStateOption) PlannerOption { + et := &evalStateFactory{factory: NewEvalState} + for _, o := range opts { + et = o(et) + } + return func(p *planner) (*planner, error) { + if et.factory == nil { + return nil, errors.New("eval state factory not configured") + } + p.observers = append(p.observers, et) + p.decorators = append(p.decorators, decObserveEval(et.Observe)) + return p, nil + } +} + +// evalStateConverter identifies an object which is convertible to an EvalState instance. +type evalStateConverter interface { + asEvalState() EvalState +} + +// evalStateActivation hides state in the Activation in a manner not accessible to expressions. +type evalStateActivation struct { + vars Activation + state EvalState +} + +// ResolveName proxies variable lookups to the backing activation. +func (esa evalStateActivation) ResolveName(name string) (any, bool) { + return esa.vars.ResolveName(name) +} + +// Parent proxies parent lookups to the backing activation. +func (esa evalStateActivation) Parent() Activation { + return esa.vars +} + +// AsPartialActivation supports conversion to a partial activation in order to detect unknown attributes. +func (esa evalStateActivation) AsPartialActivation() (PartialActivation, bool) { + return AsPartialActivation(esa.vars) +} -// TrackState decorates each expression node with an observer which records the value -// associated with the given expression id. EvalState must be provided to the decorator. -// This decorator is not thread-safe, and the EvalState must be reset between Eval() -// calls. -// DEPRECATED: Please use EvalStateObserver instead. It composes gracefully with additional observers. -func TrackState(state EvalState) InterpretableDecorator { - return Observe(EvalStateObserver(state)) +// asEvalState implements the evalStateConverter method. +func (esa evalStateActivation) asEvalState() EvalState { + return esa.state } -// EvalStateObserver provides an observer which records the value -// associated with the given expression id. EvalState must be provided to the observer. -// This decorator is not thread-safe, and the EvalState must be reset between Eval() -// calls. -func EvalStateObserver(state EvalState) EvalObserver { - return func(id int64, programStep any, val ref.Val) { - state.SetValue(id, val) +// asEvalState walks the Activation hierarchy and returns the first EvalState found, if present. +func asEvalState(vars Activation) (EvalState, bool) { + if conv, ok := vars.(evalStateConverter); ok { + return conv.asEvalState(), true + } + if vars.Parent() != nil { + return asEvalState(vars.Parent()) + } + return nil, false +} + +// evalStateFactory holds a reference to a factory function that produces an EvalState instance. +type evalStateFactory struct { + factory func() EvalState +} + +// InitState produces an EvalState instance and bundles it into the Activation in a way which is +// not visible to expression evaluation. +func (et *evalStateFactory) InitState(vars Activation) (Activation, error) { + state := et.factory() + return evalStateActivation{vars: vars, state: state}, nil +} + +// GetState extracts the EvalState from the Activation. +func (et *evalStateFactory) GetState(vars Activation) any { + if state, found := asEvalState(vars); found { + return state + } + return nil +} + +// Observe records the evaluation state for a given expression node and program step. +func (et *evalStateFactory) Observe(vars Activation, id int64, programStep any, val ref.Val) { + state, found := asEvalState(vars) + if !found { + return + } + state.SetValue(id, val) +} + +// CustomDecorator configures a custom interpretable decorator for the program. +func CustomDecorator(dec InterpretableDecorator) PlannerOption { + return func(p *planner) (*planner, error) { + p.decorators = append(p.decorators, dec) + return p, nil } } @@ -99,11 +190,8 @@ func EvalStateObserver(state EvalState) EvalObserver { // insight into the evaluation state of the entire expression. EvalState must be // provided to the decorator. This decorator is not thread-safe, and the EvalState // must be reset between Eval() calls. -func ExhaustiveEval() InterpretableDecorator { - ex := decDisableShortcircuits() - return func(i Interpretable) (Interpretable, error) { - return ex(i) - } +func ExhaustiveEval() PlannerOption { + return CustomDecorator(decDisableShortcircuits()) } // InterruptableEval annotates comprehension loops with information that indicates they @@ -111,14 +199,14 @@ func ExhaustiveEval() InterpretableDecorator { // // The custom activation is currently managed higher up in the stack within the 'cel' package // and should not require any custom support on behalf of callers. -func InterruptableEval() InterpretableDecorator { - return decInterruptFolds() +func InterruptableEval() PlannerOption { + return CustomDecorator(decInterruptFolds()) } // Optimize will pre-compute operations such as list and map construction and optimize // call arguments to set membership tests. The set of optimizations will increase over time. -func Optimize() InterpretableDecorator { - return decOptimize() +func Optimize() PlannerOption { + return CustomDecorator(decOptimize()) } // RegexOptimization provides a way to replace an InterpretableCall for a regex function when the @@ -142,8 +230,8 @@ type RegexOptimization struct { // CompileRegexConstants compiles regex pattern string constants at program creation time and reports any regex pattern // compile errors. -func CompileRegexConstants(regexOptimizations ...*RegexOptimization) InterpretableDecorator { - return decRegexOptimizer(regexOptimizations...) +func CompileRegexConstants(regexOptimizations ...*RegexOptimization) PlannerOption { + return CustomDecorator(decRegexOptimizer(regexOptimizations...)) } type exprInterpreter struct { @@ -172,14 +260,14 @@ func NewInterpreter(dispatcher Dispatcher, // NewIntepretable implements the Interpreter interface method. func (i *exprInterpreter) NewInterpretable( checked *ast.AST, - decorators ...InterpretableDecorator) (Interpretable, error) { - p := newPlanner( - i.dispatcher, - i.provider, - i.adapter, - i.attrFactory, - i.container, - checked, - decorators...) + opts ...PlannerOption) (Interpretable, error) { + p := newPlanner(i.dispatcher, i.provider, i.adapter, i.attrFactory, i.container, checked) + var err error + for _, o := range opts { + p, err = o(p) + if err != nil { + return nil, err + } + } return p.Plan(checked.Expr()) } diff --git a/vendor/github.com/google/cel-go/interpreter/planner.go b/vendor/github.com/google/cel-go/interpreter/planner.go index f0fd4eaf94..f0e0d43054 100644 --- a/vendor/github.com/google/cel-go/interpreter/planner.go +++ b/vendor/github.com/google/cel-go/interpreter/planner.go @@ -25,12 +25,6 @@ import ( "github.com/google/cel-go/common/types" ) -// interpretablePlanner creates an Interpretable evaluation plan from a proto Expr value. -type interpretablePlanner interface { - // Plan generates an Interpretable value (or error) from the input proto Expr. - Plan(expr ast.Expr) (Interpretable, error) -} - // newPlanner creates an interpretablePlanner which references a Dispatcher, TypeProvider, // TypeAdapter, Container, and CheckedExpr value. These pieces of data are used to resolve // functions, types, and namespaced identifiers at plan time rather than at runtime since @@ -40,8 +34,7 @@ func newPlanner(disp Dispatcher, adapter types.Adapter, attrFactory AttributeFactory, cont *containers.Container, - exprAST *ast.AST, - decorators ...InterpretableDecorator) interpretablePlanner { + exprAST *ast.AST) *planner { return &planner{ disp: disp, provider: provider, @@ -50,7 +43,8 @@ func newPlanner(disp Dispatcher, container: cont, refMap: exprAST.ReferenceMap(), typeMap: exprAST.TypeMap(), - decorators: decorators, + decorators: make([]InterpretableDecorator, 0), + observers: make([]StatefulObserver, 0), } } @@ -64,6 +58,7 @@ type planner struct { refMap map[int64]*ast.ReferenceInfo typeMap map[int64]*types.Type decorators []InterpretableDecorator + observers []StatefulObserver } // Plan implements the interpretablePlanner interface. This implementation of the Plan method also @@ -72,6 +67,17 @@ type planner struct { // such as state-tracking, expression re-write, and possibly efficient thread-safe memoization of // repeated expressions. func (p *planner) Plan(expr ast.Expr) (Interpretable, error) { + i, err := p.plan(expr) + if err != nil { + return nil, err + } + if len(p.observers) == 0 { + return i, nil + } + return &ObservableInterpretable{Interpretable: i, observers: p.observers}, nil +} + +func (p *planner) plan(expr ast.Expr) (Interpretable, error) { switch expr.Kind() { case ast.CallKind: return p.decorate(p.planCall(expr)) @@ -161,7 +167,7 @@ func (p *planner) planSelect(expr ast.Expr) (Interpretable, error) { sel := expr.AsSelect() // Plan the operand evaluation. - op, err := p.Plan(sel.Operand()) + op, err := p.plan(sel.Operand()) if err != nil { return nil, err } @@ -220,14 +226,14 @@ func (p *planner) planCall(expr ast.Expr) (Interpretable, error) { args := make([]Interpretable, argCount) if target != nil { - arg, err := p.Plan(target) + arg, err := p.plan(target) if err != nil { return nil, err } args[0] = arg } for i, argExpr := range call.Args() { - arg, err := p.Plan(argExpr) + arg, err := p.plan(argExpr) if err != nil { return nil, err } @@ -496,7 +502,7 @@ func (p *planner) planCreateList(expr ast.Expr) (Interpretable, error) { } elems := make([]Interpretable, len(elements)) for i, elem := range elements { - elemVal, err := p.Plan(elem) + elemVal, err := p.plan(elem) if err != nil { return nil, err } @@ -521,13 +527,13 @@ func (p *planner) planCreateMap(expr ast.Expr) (Interpretable, error) { hasOptionals := false for i, e := range entries { entry := e.AsMapEntry() - keyVal, err := p.Plan(entry.Key()) + keyVal, err := p.plan(entry.Key()) if err != nil { return nil, err } keys[i] = keyVal - valVal, err := p.Plan(entry.Value()) + valVal, err := p.plan(entry.Value()) if err != nil { return nil, err } @@ -560,7 +566,7 @@ func (p *planner) planCreateStruct(expr ast.Expr) (Interpretable, error) { for i, f := range objFields { field := f.AsStructField() fields[i] = field.Name() - val, err := p.Plan(field.Value()) + val, err := p.plan(field.Value()) if err != nil { return nil, err } @@ -582,23 +588,23 @@ func (p *planner) planCreateStruct(expr ast.Expr) (Interpretable, error) { // planComprehension generates an Interpretable fold operation. func (p *planner) planComprehension(expr ast.Expr) (Interpretable, error) { fold := expr.AsComprehension() - accu, err := p.Plan(fold.AccuInit()) + accu, err := p.plan(fold.AccuInit()) if err != nil { return nil, err } - iterRange, err := p.Plan(fold.IterRange()) + iterRange, err := p.plan(fold.IterRange()) if err != nil { return nil, err } - cond, err := p.Plan(fold.LoopCondition()) + cond, err := p.plan(fold.LoopCondition()) if err != nil { return nil, err } - step, err := p.Plan(fold.LoopStep()) + step, err := p.plan(fold.LoopStep()) if err != nil { return nil, err } - result, err := p.Plan(fold.Result()) + result, err := p.plan(fold.Result()) if err != nil { return nil, err } diff --git a/vendor/github.com/google/cel-go/interpreter/prune.go b/vendor/github.com/google/cel-go/interpreter/prune.go index 410d80dc43..1662c1c1b3 100644 --- a/vendor/github.com/google/cel-go/interpreter/prune.go +++ b/vendor/github.com/google/cel-go/interpreter/prune.go @@ -88,7 +88,7 @@ func PruneAst(expr ast.Expr, macroCalls map[int64]ast.Expr, state EvalState) *as func (p *astPruner) maybeCreateLiteral(id int64, val ref.Val) (ast.Expr, bool) { switch v := val.(type) { - case types.Bool, types.Bytes, types.Double, types.Int, types.Null, types.String, types.Uint: + case types.Bool, types.Bytes, types.Double, types.Int, types.Null, types.String, types.Uint, *types.Optional: p.state.SetValue(id, val) return p.NewLiteral(id, val), true case types.Duration: @@ -281,13 +281,29 @@ func (p *astPruner) prune(node ast.Expr) (ast.Expr, bool) { } if macro, found := p.macroCalls[node.ID()]; found { // Ensure that intermediate values for the comprehension are cleared during pruning + pruneMacroCall := node.Kind() != ast.UnspecifiedExprKind if node.Kind() == ast.ComprehensionKind { - compre := node.AsComprehension() - visit(macro, clearIterVarVisitor(compre.IterVar(), p.state)) + // Only prune cel.bind() calls since the variables of the comprehension are all + // visible to the user, so there's no chance of an incorrect value being observed + // as a result of looking at intermediate computations within a comprehension. + pruneMacroCall = isCelBindMacro(macro) } - // prune the expression in terms of the macro call instead of the expanded form. - if newMacro, pruned := p.prune(macro); pruned { - p.macroCalls[node.ID()] = newMacro + if pruneMacroCall { + // prune the expression in terms of the macro call instead of the expanded form when + // dealing with macro call tracking references. + if newMacro, pruned := p.prune(macro); pruned { + p.macroCalls[node.ID()] = newMacro + } + } else { + // Otherwise just prune the macro target in keeping with the pruning behavior of the + // comprehensions later in the call graph. + macroCall := macro.AsCall() + if macroCall.Target() != nil { + if newTarget, pruned := p.prune(macroCall.Target()); pruned { + macro = p.NewMemberCall(macro.ID(), macroCall.FunctionName(), newTarget, macroCall.Args()...) + p.macroCalls[node.ID()] = macro + } + } } } @@ -421,6 +437,19 @@ func (p *astPruner) prune(node ast.Expr) (ast.Expr, bool) { // the last iteration of the comprehension and not each step in the evaluation which // means that the any residuals computed in between might be inaccurate. if newRange, pruned := p.maybePrune(compre.IterRange()); pruned { + if compre.HasIterVar2() { + return p.NewComprehensionTwoVar( + node.ID(), + newRange, + compre.IterVar(), + compre.IterVar2(), + compre.AccuVar(), + compre.AccuInit(), + compre.LoopCondition(), + compre.LoopStep(), + compre.Result(), + ), true + } return p.NewComprehension( node.ID(), newRange, @@ -468,16 +497,6 @@ func getMaxID(expr ast.Expr) int64 { return maxID } -func clearIterVarVisitor(varName string, state EvalState) astVisitor { - return astVisitor{ - visitExpr: func(e ast.Expr) { - if e.Kind() == ast.IdentKind && e.AsIdent() == varName { - state.SetValue(e.ID(), nil) - } - }, - } -} - func maxIDVisitor(maxID *int64) astVisitor { return astVisitor{ visitExpr: func(e ast.Expr) { @@ -541,3 +560,15 @@ func visit(expr ast.Expr, visitor astVisitor) { } } } + +func isCelBindMacro(macro ast.Expr) bool { + if macro.Kind() != ast.CallKind { + return false + } + macroCall := macro.AsCall() + target := macroCall.Target() + return macroCall.FunctionName() == "bind" && + macroCall.IsMemberFunction() && + target.Kind() == ast.IdentKind && + target.AsIdent() == "cel" +} diff --git a/vendor/github.com/google/cel-go/interpreter/runtimecost.go b/vendor/github.com/google/cel-go/interpreter/runtimecost.go index b9b307c155..6c44cd7986 100644 --- a/vendor/github.com/google/cel-go/interpreter/runtimecost.go +++ b/vendor/github.com/google/cel-go/interpreter/runtimecost.go @@ -15,6 +15,7 @@ package interpreter import ( + "errors" "math" "github.com/google/cel-go/common" @@ -34,78 +35,172 @@ type ActualCostEstimator interface { CallCost(function, overloadID string, args []ref.Val, result ref.Val) *uint64 } +// costTrackPlanOption modifies the cost tracking factory associatied with the CostObserver +type costTrackPlanOption func(*costTrackerFactory) *costTrackerFactory + +// CostTrackerFactory configures the factory method to generate a new cost-tracker per-evaluation. +func CostTrackerFactory(factory func() (*CostTracker, error)) costTrackPlanOption { + return func(fac *costTrackerFactory) *costTrackerFactory { + fac.factory = factory + return fac + } +} + // CostObserver provides an observer that tracks runtime cost. -func CostObserver(tracker *CostTracker) EvalObserver { - observer := func(id int64, programStep any, val ref.Val) { - switch t := programStep.(type) { - case ConstantQualifier: - // TODO: Push identifiers on to the stack before observing constant qualifiers that apply to them - // and enable the below pop. Once enabled this can case can be collapsed into the Qualifier case. - tracker.cost++ - case InterpretableConst: - // zero cost - case InterpretableAttribute: - switch a := t.Attr().(type) { - case *conditionalAttribute: - // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. - tracker.stack.drop(a.falsy.ID(), a.truthy.ID(), a.expr.ID()) - default: - tracker.stack.drop(t.Attr().ID()) - tracker.cost += common.SelectAndIdentCost - } - if !tracker.presenceTestHasCost { - if _, isTestOnly := programStep.(*evalTestOnly); isTestOnly { - tracker.cost -= common.SelectAndIdentCost - } - } - case *evalExhaustiveConditional: - // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. - tracker.stack.drop(t.attr.falsy.ID(), t.attr.truthy.ID(), t.attr.expr.ID()) +func CostObserver(opts ...costTrackPlanOption) PlannerOption { + ct := &costTrackerFactory{} + for _, o := range opts { + ct = o(ct) + } + return func(p *planner) (*planner, error) { + if ct.factory == nil { + return nil, errors.New("cost tracker factory not configured") + } + p.observers = append(p.observers, ct) + p.decorators = append(p.decorators, decObserveEval(ct.Observe)) + return p, nil + } +} - // While the field names are identical, the boolean operation eval structs do not share an interface and so - // must be handled individually. - case *evalOr: - for _, term := range t.terms { - tracker.stack.drop(term.ID()) - } - case *evalAnd: - for _, term := range t.terms { - tracker.stack.drop(term.ID()) - } - case *evalExhaustiveOr: - for _, term := range t.terms { - tracker.stack.drop(term.ID()) - } - case *evalExhaustiveAnd: - for _, term := range t.terms { - tracker.stack.drop(term.ID()) - } - case *evalFold: - tracker.stack.drop(t.iterRange.ID()) - case Qualifier: - tracker.cost++ - case InterpretableCall: - if argVals, ok := tracker.stack.dropArgs(t.Args()); ok { - tracker.cost += tracker.costCall(t, argVals, val) - } - case InterpretableConstructor: - tracker.stack.dropArgs(t.InitVals()) - switch t.Type() { - case types.ListType: - tracker.cost += common.ListCreateBaseCost - case types.MapType: - tracker.cost += common.MapCreateBaseCost - default: - tracker.cost += common.StructCreateBaseCost +// costTrackerConverter identifies an object which is convertible to a CostTracker instance. +type costTrackerConverter interface { + asCostTracker() *CostTracker +} + +// costTrackActivation hides state in the Activation in a manner not accessible to expressions. +type costTrackActivation struct { + vars Activation + costTracker *CostTracker +} + +// ResolveName proxies variable lookups to the backing activation. +func (cta costTrackActivation) ResolveName(name string) (any, bool) { + return cta.vars.ResolveName(name) +} + +// Parent proxies parent lookups to the backing activation. +func (cta costTrackActivation) Parent() Activation { + return cta.vars +} + +// AsPartialActivation supports conversion to a partial activation in order to detect unknown attributes. +func (cta costTrackActivation) AsPartialActivation() (PartialActivation, bool) { + return AsPartialActivation(cta.vars) +} + +// asCostTracker implements the costTrackerConverter method. +func (cta costTrackActivation) asCostTracker() *CostTracker { + return cta.costTracker +} + +// asCostTracker walks the Activation hierarchy and returns the first cost tracker found, if present. +func asCostTracker(vars Activation) (*CostTracker, bool) { + if conv, ok := vars.(costTrackerConverter); ok { + return conv.asCostTracker(), true + } + if vars.Parent() != nil { + return asCostTracker(vars.Parent()) + } + return nil, false +} + +// costTrackerFactory holds a factory for producing new CostTracker instances on each Eval call. +type costTrackerFactory struct { + factory func() (*CostTracker, error) +} + +// InitState produces a CostTracker and bundles it into an Activation in a way which is not visible +// to expression evaluation. +func (ct *costTrackerFactory) InitState(vars Activation) (Activation, error) { + tracker, err := ct.factory() + if err != nil { + return nil, err + } + return costTrackActivation{vars: vars, costTracker: tracker}, nil +} + +// GetState extracts the CostTracker from the Activation. +func (ct *costTrackerFactory) GetState(vars Activation) any { + if tracker, found := asCostTracker(vars); found { + return tracker + } + return nil +} + +// Observe computes the incremental cost of each step and records it into the CostTracker associated +// with the evaluation. +func (ct *costTrackerFactory) Observe(vars Activation, id int64, programStep any, val ref.Val) { + tracker, found := asCostTracker(vars) + if !found { + return + } + switch t := programStep.(type) { + case ConstantQualifier: + // TODO: Push identifiers on to the stack before observing constant qualifiers that apply to them + // and enable the below pop. Once enabled this can case can be collapsed into the Qualifier case. + tracker.cost++ + case InterpretableConst: + // zero cost + case InterpretableAttribute: + switch a := t.Attr().(type) { + case *conditionalAttribute: + // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. + tracker.stack.drop(a.falsy.ID(), a.truthy.ID(), a.expr.ID()) + default: + tracker.stack.drop(t.Attr().ID()) + tracker.cost += common.SelectAndIdentCost + } + if !tracker.presenceTestHasCost { + if _, isTestOnly := programStep.(*evalTestOnly); isTestOnly { + tracker.cost -= common.SelectAndIdentCost } } - tracker.stack.push(val, id) + case *evalExhaustiveConditional: + // Ternary has no direct cost. All cost is from the conditional and the true/false branch expressions. + tracker.stack.drop(t.attr.falsy.ID(), t.attr.truthy.ID(), t.attr.expr.ID()) - if tracker.Limit != nil && tracker.cost > *tracker.Limit { - panic(EvalCancelledError{Cause: CostLimitExceeded, Message: "operation cancelled: actual cost limit exceeded"}) + // While the field names are identical, the boolean operation eval structs do not share an interface and so + // must be handled individually. + case *evalOr: + for _, term := range t.terms { + tracker.stack.drop(term.ID()) + } + case *evalAnd: + for _, term := range t.terms { + tracker.stack.drop(term.ID()) + } + case *evalExhaustiveOr: + for _, term := range t.terms { + tracker.stack.drop(term.ID()) + } + case *evalExhaustiveAnd: + for _, term := range t.terms { + tracker.stack.drop(term.ID()) + } + case *evalFold: + tracker.stack.drop(t.iterRange.ID()) + case Qualifier: + tracker.cost++ + case InterpretableCall: + if argVals, ok := tracker.stack.dropArgs(t.Args()); ok { + tracker.cost += tracker.costCall(t, argVals, val) + } + case InterpretableConstructor: + tracker.stack.dropArgs(t.InitVals()) + switch t.Type() { + case types.ListType: + tracker.cost += common.ListCreateBaseCost + case types.MapType: + tracker.cost += common.MapCreateBaseCost + default: + tracker.cost += common.StructCreateBaseCost } } - return observer + tracker.stack.push(val, id) + + if tracker.Limit != nil && tracker.cost > *tracker.Limit { + panic(EvalCancelledError{Cause: CostLimitExceeded, Message: "operation cancelled: actual cost limit exceeded"}) + } } // CostTrackerOption configures the behavior of CostTracker objects. @@ -198,20 +293,20 @@ func (c *CostTracker) costCall(call InterpretableCall, args []ref.Val, result re switch call.OverloadID() { // O(n) functions case overloads.StartsWithString, overloads.EndsWithString, overloads.StringToBytes, overloads.BytesToString, overloads.ExtQuoteString, overloads.ExtFormatString: - cost += uint64(math.Ceil(float64(c.actualSize(args[0])) * common.StringTraversalCostFactor)) + cost += uint64(math.Ceil(float64(actualSize(args[0])) * common.StringTraversalCostFactor)) case overloads.InList: // If a list is composed entirely of constant values this is O(1), but we don't account for that here. // We just assume all list containment checks are O(n). - cost += c.actualSize(args[1]) + cost += actualSize(args[1]) // O(min(m, n)) functions case overloads.LessString, overloads.GreaterString, overloads.LessEqualsString, overloads.GreaterEqualsString, overloads.LessBytes, overloads.GreaterBytes, overloads.LessEqualsBytes, overloads.GreaterEqualsBytes, overloads.Equals, overloads.NotEquals: // When we check the equality of 2 scalar values (e.g. 2 integers, 2 floating-point numbers, 2 booleans etc.), - // the CostTracker.actualSize() function by definition returns 1 for each operand, resulting in an overall cost + // the CostTracker.ActualSize() function by definition returns 1 for each operand, resulting in an overall cost // of 1. - lhsSize := c.actualSize(args[0]) - rhsSize := c.actualSize(args[1]) + lhsSize := actualSize(args[0]) + rhsSize := actualSize(args[1]) minSize := lhsSize if rhsSize < minSize { minSize = rhsSize @@ -220,23 +315,23 @@ func (c *CostTracker) costCall(call InterpretableCall, args []ref.Val, result re // O(m+n) functions case overloads.AddString, overloads.AddBytes: // In the worst case scenario, we would need to reallocate a new backing store and copy both operands over. - cost += uint64(math.Ceil(float64(c.actualSize(args[0])+c.actualSize(args[1])) * common.StringTraversalCostFactor)) + cost += uint64(math.Ceil(float64(actualSize(args[0])+actualSize(args[1])) * common.StringTraversalCostFactor)) // O(nm) functions case overloads.MatchesString: // https://swtch.com/~rsc/regexp/regexp1.html applies to RE2 implementation supported by CEL // Add one to string length for purposes of cost calculation to prevent product of string and regex to be 0 // in case where string is empty but regex is still expensive. - strCost := uint64(math.Ceil((1.0 + float64(c.actualSize(args[0]))) * common.StringTraversalCostFactor)) + strCost := uint64(math.Ceil((1.0 + float64(actualSize(args[0]))) * common.StringTraversalCostFactor)) // We don't know how many expressions are in the regex, just the string length (a huge // improvement here would be to somehow get a count the number of expressions in the regex or // how many states are in the regex state machine and use that to measure regex cost). // For now, we're making a guess that each expression in a regex is typically at least 4 chars // in length. - regexCost := uint64(math.Ceil(float64(c.actualSize(args[1])) * common.RegexStringLengthCostFactor)) + regexCost := uint64(math.Ceil(float64(actualSize(args[1])) * common.RegexStringLengthCostFactor)) cost += strCost * regexCost case overloads.ContainsString: - strCost := uint64(math.Ceil(float64(c.actualSize(args[0])) * common.StringTraversalCostFactor)) - substrCost := uint64(math.Ceil(float64(c.actualSize(args[1])) * common.StringTraversalCostFactor)) + strCost := uint64(math.Ceil(float64(actualSize(args[0])) * common.StringTraversalCostFactor)) + substrCost := uint64(math.Ceil(float64(actualSize(args[1])) * common.StringTraversalCostFactor)) cost += strCost * substrCost default: @@ -253,11 +348,15 @@ func (c *CostTracker) costCall(call InterpretableCall, args []ref.Val, result re return cost } -// actualSize returns the size of value -func (c *CostTracker) actualSize(value ref.Val) uint64 { +// actualSize returns the size of the value for all traits.Sizer values, a fixed size for all proto-based +// objects, and a size of 1 for all other value types. +func actualSize(value ref.Val) uint64 { if sz, ok := value.(traits.Sizer); ok { return uint64(sz.Size().(types.Int)) } + if opt, ok := value.(*types.Optional); ok && opt.HasValue() { + return actualSize(opt.GetValue()) + } return 1 } diff --git a/vendor/github.com/google/cel-go/parser/errors.go b/vendor/github.com/google/cel-go/parser/errors.go index 93ae7a3ad8..c3cec01a8d 100644 --- a/vendor/github.com/google/cel-go/parser/errors.go +++ b/vendor/github.com/google/cel-go/parser/errors.go @@ -15,8 +15,6 @@ package parser import ( - "fmt" - "github.com/google/cel-go/common" ) @@ -31,11 +29,11 @@ func (e *parseErrors) errorCount() int { } func (e *parseErrors) internalError(message string) { - e.errs.ReportErrorAtID(0, common.NoLocation, message) + e.errs.ReportErrorAtID(0, common.NoLocation, "%s", message) } func (e *parseErrors) syntaxError(l common.Location, message string) { - e.errs.ReportErrorAtID(0, l, fmt.Sprintf("Syntax error: %s", message)) + e.errs.ReportErrorAtID(0, l, "Syntax error: %s", message) } func (e *parseErrors) reportErrorAtID(id int64, l common.Location, message string, args ...any) { diff --git a/vendor/github.com/google/cel-go/parser/gen/CEL.g4 b/vendor/github.com/google/cel-go/parser/gen/CEL.g4 index b011da803c..ee53a844bd 100644 --- a/vendor/github.com/google/cel-go/parser/gen/CEL.g4 +++ b/vendor/github.com/google/cel-go/parser/gen/CEL.g4 @@ -52,13 +52,14 @@ unary member : primary # PrimaryExpr - | member op='.' (opt='?')? id=IDENTIFIER # Select + | member op='.' (opt='?')? id=escapeIdent # Select | member op='.' id=IDENTIFIER open='(' args=exprList? ')' # MemberCall | member op='[' (opt='?')? index=expr ']' # Index ; primary - : leadingDot='.'? id=IDENTIFIER (op='(' args=exprList? ')')? # IdentOrGlobalCall + : leadingDot='.'? id=IDENTIFIER # Ident + | leadingDot='.'? id=IDENTIFIER (op='(' args=exprList? ')') # GlobalCall | '(' e=expr ')' # Nested | op='[' elems=listInit? ','? ']' # CreateList | op='{' entries=mapInitializerList? ','? '}' # CreateStruct @@ -80,13 +81,18 @@ fieldInitializerList ; optField - : (opt='?')? IDENTIFIER + : (opt='?')? escapeIdent ; mapInitializerList : keys+=optExpr cols+=':' values+=expr (',' keys+=optExpr cols+=':' values+=expr)* ; +escapeIdent + : id=IDENTIFIER # SimpleIdentifier + | id=ESC_IDENTIFIER # EscapedIdentifier +; + optExpr : (opt='?')? e=expr ; @@ -198,3 +204,4 @@ STRING BYTES : ('b' | 'B') STRING; IDENTIFIER : (LETTER | '_') ( LETTER | DIGIT | '_')*; +ESC_IDENTIFIER : '`' (LETTER | DIGIT | '_' | '.' | '-' | '/' | ' ')+ '`'; \ No newline at end of file diff --git a/vendor/github.com/google/cel-go/parser/gen/CEL.interp b/vendor/github.com/google/cel-go/parser/gen/CEL.interp index 75b8bb3e20..e085bab574 100644 --- a/vendor/github.com/google/cel-go/parser/gen/CEL.interp +++ b/vendor/github.com/google/cel-go/parser/gen/CEL.interp @@ -36,6 +36,7 @@ null null null null +null token symbolic names: null @@ -75,6 +76,7 @@ NUM_UINT STRING BYTES IDENTIFIER +ESC_IDENTIFIER rule names: start @@ -91,9 +93,10 @@ listInit fieldInitializerList optField mapInitializerList +escapeIdent optExpr literal atn: -[4, 1, 36, 251, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 42, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 47, 8, 2, 10, 2, 12, 2, 50, 9, 2, 1, 3, 1, 3, 1, 3, 5, 3, 55, 8, 3, 10, 3, 12, 3, 58, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 66, 8, 4, 10, 4, 12, 4, 69, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 80, 8, 5, 10, 5, 12, 5, 83, 9, 5, 1, 6, 1, 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 1, 6, 4, 6, 93, 8, 6, 11, 6, 12, 6, 94, 1, 6, 3, 6, 98, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 106, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 114, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 120, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 125, 8, 7, 10, 7, 12, 7, 128, 9, 7, 1, 8, 3, 8, 131, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 136, 8, 8, 1, 8, 3, 8, 139, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 147, 8, 8, 1, 8, 3, 8, 150, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 155, 8, 8, 1, 8, 3, 8, 158, 8, 8, 1, 8, 1, 8, 3, 8, 162, 8, 8, 1, 8, 1, 8, 1, 8, 5, 8, 167, 8, 8, 10, 8, 12, 8, 170, 9, 8, 1, 8, 1, 8, 3, 8, 174, 8, 8, 1, 8, 3, 8, 177, 8, 8, 1, 8, 1, 8, 3, 8, 181, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 186, 8, 9, 10, 9, 12, 9, 189, 9, 9, 1, 10, 1, 10, 1, 10, 5, 10, 194, 8, 10, 10, 10, 12, 10, 197, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 207, 8, 11, 10, 11, 12, 11, 210, 9, 11, 1, 12, 3, 12, 213, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 225, 8, 13, 10, 13, 12, 13, 228, 9, 13, 1, 14, 3, 14, 231, 8, 14, 1, 14, 1, 14, 1, 15, 3, 15, 236, 8, 15, 1, 15, 1, 15, 1, 15, 3, 15, 241, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 249, 8, 15, 1, 15, 0, 3, 8, 10, 14, 16, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, 281, 0, 32, 1, 0, 0, 0, 2, 35, 1, 0, 0, 0, 4, 43, 1, 0, 0, 0, 6, 51, 1, 0, 0, 0, 8, 59, 1, 0, 0, 0, 10, 70, 1, 0, 0, 0, 12, 97, 1, 0, 0, 0, 14, 99, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 182, 1, 0, 0, 0, 20, 190, 1, 0, 0, 0, 22, 198, 1, 0, 0, 0, 24, 212, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, 230, 1, 0, 0, 0, 30, 248, 1, 0, 0, 0, 32, 33, 3, 2, 1, 0, 33, 34, 5, 0, 0, 1, 34, 1, 1, 0, 0, 0, 35, 41, 3, 4, 2, 0, 36, 37, 5, 20, 0, 0, 37, 38, 3, 4, 2, 0, 38, 39, 5, 21, 0, 0, 39, 40, 3, 2, 1, 0, 40, 42, 1, 0, 0, 0, 41, 36, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 3, 1, 0, 0, 0, 43, 48, 3, 6, 3, 0, 44, 45, 5, 9, 0, 0, 45, 47, 3, 6, 3, 0, 46, 44, 1, 0, 0, 0, 47, 50, 1, 0, 0, 0, 48, 46, 1, 0, 0, 0, 48, 49, 1, 0, 0, 0, 49, 5, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 51, 56, 3, 8, 4, 0, 52, 53, 5, 8, 0, 0, 53, 55, 3, 8, 4, 0, 54, 52, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, 57, 1, 0, 0, 0, 57, 7, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 59, 60, 6, 4, -1, 0, 60, 61, 3, 10, 5, 0, 61, 67, 1, 0, 0, 0, 62, 63, 10, 1, 0, 0, 63, 64, 7, 0, 0, 0, 64, 66, 3, 8, 4, 2, 65, 62, 1, 0, 0, 0, 66, 69, 1, 0, 0, 0, 67, 65, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 9, 1, 0, 0, 0, 69, 67, 1, 0, 0, 0, 70, 71, 6, 5, -1, 0, 71, 72, 3, 12, 6, 0, 72, 81, 1, 0, 0, 0, 73, 74, 10, 2, 0, 0, 74, 75, 7, 1, 0, 0, 75, 80, 3, 10, 5, 3, 76, 77, 10, 1, 0, 0, 77, 78, 7, 2, 0, 0, 78, 80, 3, 10, 5, 2, 79, 73, 1, 0, 0, 0, 79, 76, 1, 0, 0, 0, 80, 83, 1, 0, 0, 0, 81, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 11, 1, 0, 0, 0, 83, 81, 1, 0, 0, 0, 84, 98, 3, 14, 7, 0, 85, 87, 5, 19, 0, 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, 88, 89, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 98, 3, 14, 7, 0, 91, 93, 5, 18, 0, 0, 92, 91, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 92, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 98, 3, 14, 7, 0, 97, 84, 1, 0, 0, 0, 97, 86, 1, 0, 0, 0, 97, 92, 1, 0, 0, 0, 98, 13, 1, 0, 0, 0, 99, 100, 6, 7, -1, 0, 100, 101, 3, 16, 8, 0, 101, 126, 1, 0, 0, 0, 102, 103, 10, 3, 0, 0, 103, 105, 5, 16, 0, 0, 104, 106, 5, 20, 0, 0, 105, 104, 1, 0, 0, 0, 105, 106, 1, 0, 0, 0, 106, 107, 1, 0, 0, 0, 107, 125, 5, 36, 0, 0, 108, 109, 10, 2, 0, 0, 109, 110, 5, 16, 0, 0, 110, 111, 5, 36, 0, 0, 111, 113, 5, 14, 0, 0, 112, 114, 3, 18, 9, 0, 113, 112, 1, 0, 0, 0, 113, 114, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 125, 5, 15, 0, 0, 116, 117, 10, 1, 0, 0, 117, 119, 5, 10, 0, 0, 118, 120, 5, 20, 0, 0, 119, 118, 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 121, 1, 0, 0, 0, 121, 122, 3, 2, 1, 0, 122, 123, 5, 11, 0, 0, 123, 125, 1, 0, 0, 0, 124, 102, 1, 0, 0, 0, 124, 108, 1, 0, 0, 0, 124, 116, 1, 0, 0, 0, 125, 128, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 15, 1, 0, 0, 0, 128, 126, 1, 0, 0, 0, 129, 131, 5, 16, 0, 0, 130, 129, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 138, 5, 36, 0, 0, 133, 135, 5, 14, 0, 0, 134, 136, 3, 18, 9, 0, 135, 134, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 139, 5, 15, 0, 0, 138, 133, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 181, 1, 0, 0, 0, 140, 141, 5, 14, 0, 0, 141, 142, 3, 2, 1, 0, 142, 143, 5, 15, 0, 0, 143, 181, 1, 0, 0, 0, 144, 146, 5, 10, 0, 0, 145, 147, 3, 20, 10, 0, 146, 145, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 149, 1, 0, 0, 0, 148, 150, 5, 17, 0, 0, 149, 148, 1, 0, 0, 0, 149, 150, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 181, 5, 11, 0, 0, 152, 154, 5, 12, 0, 0, 153, 155, 3, 26, 13, 0, 154, 153, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 157, 1, 0, 0, 0, 156, 158, 5, 17, 0, 0, 157, 156, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 181, 5, 13, 0, 0, 160, 162, 5, 16, 0, 0, 161, 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 168, 5, 36, 0, 0, 164, 165, 5, 16, 0, 0, 165, 167, 5, 36, 0, 0, 166, 164, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 171, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 173, 5, 12, 0, 0, 172, 174, 3, 22, 11, 0, 173, 172, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 177, 5, 17, 0, 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 181, 5, 13, 0, 0, 179, 181, 3, 30, 15, 0, 180, 130, 1, 0, 0, 0, 180, 140, 1, 0, 0, 0, 180, 144, 1, 0, 0, 0, 180, 152, 1, 0, 0, 0, 180, 161, 1, 0, 0, 0, 180, 179, 1, 0, 0, 0, 181, 17, 1, 0, 0, 0, 182, 187, 3, 2, 1, 0, 183, 184, 5, 17, 0, 0, 184, 186, 3, 2, 1, 0, 185, 183, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 19, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 190, 195, 3, 28, 14, 0, 191, 192, 5, 17, 0, 0, 192, 194, 3, 28, 14, 0, 193, 191, 1, 0, 0, 0, 194, 197, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 195, 196, 1, 0, 0, 0, 196, 21, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 199, 3, 24, 12, 0, 199, 200, 5, 21, 0, 0, 200, 208, 3, 2, 1, 0, 201, 202, 5, 17, 0, 0, 202, 203, 3, 24, 12, 0, 203, 204, 5, 21, 0, 0, 204, 205, 3, 2, 1, 0, 205, 207, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 207, 210, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 23, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 211, 213, 5, 20, 0, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 5, 36, 0, 0, 215, 25, 1, 0, 0, 0, 216, 217, 3, 28, 14, 0, 217, 218, 5, 21, 0, 0, 218, 226, 3, 2, 1, 0, 219, 220, 5, 17, 0, 0, 220, 221, 3, 28, 14, 0, 221, 222, 5, 21, 0, 0, 222, 223, 3, 2, 1, 0, 223, 225, 1, 0, 0, 0, 224, 219, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 27, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 229, 231, 5, 20, 0, 0, 230, 229, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 233, 3, 2, 1, 0, 233, 29, 1, 0, 0, 0, 234, 236, 5, 18, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 249, 5, 32, 0, 0, 238, 249, 5, 33, 0, 0, 239, 241, 5, 18, 0, 0, 240, 239, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 249, 5, 31, 0, 0, 243, 249, 5, 34, 0, 0, 244, 249, 5, 35, 0, 0, 245, 249, 5, 26, 0, 0, 246, 249, 5, 27, 0, 0, 247, 249, 5, 28, 0, 0, 248, 235, 1, 0, 0, 0, 248, 238, 1, 0, 0, 0, 248, 240, 1, 0, 0, 0, 248, 243, 1, 0, 0, 0, 248, 244, 1, 0, 0, 0, 248, 245, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 247, 1, 0, 0, 0, 249, 31, 1, 0, 0, 0, 35, 41, 48, 56, 67, 79, 81, 88, 94, 97, 105, 113, 119, 124, 126, 130, 135, 138, 146, 149, 154, 157, 161, 168, 173, 176, 180, 187, 195, 208, 212, 226, 230, 235, 240, 248] \ No newline at end of file +[4, 1, 37, 259, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 44, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 49, 8, 2, 10, 2, 12, 2, 52, 9, 2, 1, 3, 1, 3, 1, 3, 5, 3, 57, 8, 3, 10, 3, 12, 3, 60, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 68, 8, 4, 10, 4, 12, 4, 71, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 82, 8, 5, 10, 5, 12, 5, 85, 9, 5, 1, 6, 1, 6, 4, 6, 89, 8, 6, 11, 6, 12, 6, 90, 1, 6, 1, 6, 4, 6, 95, 8, 6, 11, 6, 12, 6, 96, 1, 6, 3, 6, 100, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 108, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 116, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 122, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 127, 8, 7, 10, 7, 12, 7, 130, 9, 7, 1, 8, 3, 8, 133, 8, 8, 1, 8, 1, 8, 3, 8, 137, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 142, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 151, 8, 8, 1, 8, 3, 8, 154, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 159, 8, 8, 1, 8, 3, 8, 162, 8, 8, 1, 8, 1, 8, 3, 8, 166, 8, 8, 1, 8, 1, 8, 1, 8, 5, 8, 171, 8, 8, 10, 8, 12, 8, 174, 9, 8, 1, 8, 1, 8, 3, 8, 178, 8, 8, 1, 8, 3, 8, 181, 8, 8, 1, 8, 1, 8, 3, 8, 185, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 190, 8, 9, 10, 9, 12, 9, 193, 9, 9, 1, 10, 1, 10, 1, 10, 5, 10, 198, 8, 10, 10, 10, 12, 10, 201, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 211, 8, 11, 10, 11, 12, 11, 214, 9, 11, 1, 12, 3, 12, 217, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 229, 8, 13, 10, 13, 12, 13, 232, 9, 13, 1, 14, 1, 14, 3, 14, 236, 8, 14, 1, 15, 3, 15, 239, 8, 15, 1, 15, 1, 15, 1, 16, 3, 16, 244, 8, 16, 1, 16, 1, 16, 1, 16, 3, 16, 249, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 257, 8, 16, 1, 16, 0, 3, 8, 10, 14, 17, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, 290, 0, 34, 1, 0, 0, 0, 2, 37, 1, 0, 0, 0, 4, 45, 1, 0, 0, 0, 6, 53, 1, 0, 0, 0, 8, 61, 1, 0, 0, 0, 10, 72, 1, 0, 0, 0, 12, 99, 1, 0, 0, 0, 14, 101, 1, 0, 0, 0, 16, 184, 1, 0, 0, 0, 18, 186, 1, 0, 0, 0, 20, 194, 1, 0, 0, 0, 22, 202, 1, 0, 0, 0, 24, 216, 1, 0, 0, 0, 26, 220, 1, 0, 0, 0, 28, 235, 1, 0, 0, 0, 30, 238, 1, 0, 0, 0, 32, 256, 1, 0, 0, 0, 34, 35, 3, 2, 1, 0, 35, 36, 5, 0, 0, 1, 36, 1, 1, 0, 0, 0, 37, 43, 3, 4, 2, 0, 38, 39, 5, 20, 0, 0, 39, 40, 3, 4, 2, 0, 40, 41, 5, 21, 0, 0, 41, 42, 3, 2, 1, 0, 42, 44, 1, 0, 0, 0, 43, 38, 1, 0, 0, 0, 43, 44, 1, 0, 0, 0, 44, 3, 1, 0, 0, 0, 45, 50, 3, 6, 3, 0, 46, 47, 5, 9, 0, 0, 47, 49, 3, 6, 3, 0, 48, 46, 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 5, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 58, 3, 8, 4, 0, 54, 55, 5, 8, 0, 0, 55, 57, 3, 8, 4, 0, 56, 54, 1, 0, 0, 0, 57, 60, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 7, 1, 0, 0, 0, 60, 58, 1, 0, 0, 0, 61, 62, 6, 4, -1, 0, 62, 63, 3, 10, 5, 0, 63, 69, 1, 0, 0, 0, 64, 65, 10, 1, 0, 0, 65, 66, 7, 0, 0, 0, 66, 68, 3, 8, 4, 2, 67, 64, 1, 0, 0, 0, 68, 71, 1, 0, 0, 0, 69, 67, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 9, 1, 0, 0, 0, 71, 69, 1, 0, 0, 0, 72, 73, 6, 5, -1, 0, 73, 74, 3, 12, 6, 0, 74, 83, 1, 0, 0, 0, 75, 76, 10, 2, 0, 0, 76, 77, 7, 1, 0, 0, 77, 82, 3, 10, 5, 3, 78, 79, 10, 1, 0, 0, 79, 80, 7, 2, 0, 0, 80, 82, 3, 10, 5, 2, 81, 75, 1, 0, 0, 0, 81, 78, 1, 0, 0, 0, 82, 85, 1, 0, 0, 0, 83, 81, 1, 0, 0, 0, 83, 84, 1, 0, 0, 0, 84, 11, 1, 0, 0, 0, 85, 83, 1, 0, 0, 0, 86, 100, 3, 14, 7, 0, 87, 89, 5, 19, 0, 0, 88, 87, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 88, 1, 0, 0, 0, 90, 91, 1, 0, 0, 0, 91, 92, 1, 0, 0, 0, 92, 100, 3, 14, 7, 0, 93, 95, 5, 18, 0, 0, 94, 93, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 94, 1, 0, 0, 0, 96, 97, 1, 0, 0, 0, 97, 98, 1, 0, 0, 0, 98, 100, 3, 14, 7, 0, 99, 86, 1, 0, 0, 0, 99, 88, 1, 0, 0, 0, 99, 94, 1, 0, 0, 0, 100, 13, 1, 0, 0, 0, 101, 102, 6, 7, -1, 0, 102, 103, 3, 16, 8, 0, 103, 128, 1, 0, 0, 0, 104, 105, 10, 3, 0, 0, 105, 107, 5, 16, 0, 0, 106, 108, 5, 20, 0, 0, 107, 106, 1, 0, 0, 0, 107, 108, 1, 0, 0, 0, 108, 109, 1, 0, 0, 0, 109, 127, 3, 28, 14, 0, 110, 111, 10, 2, 0, 0, 111, 112, 5, 16, 0, 0, 112, 113, 5, 36, 0, 0, 113, 115, 5, 14, 0, 0, 114, 116, 3, 18, 9, 0, 115, 114, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 1, 0, 0, 0, 117, 127, 5, 15, 0, 0, 118, 119, 10, 1, 0, 0, 119, 121, 5, 10, 0, 0, 120, 122, 5, 20, 0, 0, 121, 120, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 123, 1, 0, 0, 0, 123, 124, 3, 2, 1, 0, 124, 125, 5, 11, 0, 0, 125, 127, 1, 0, 0, 0, 126, 104, 1, 0, 0, 0, 126, 110, 1, 0, 0, 0, 126, 118, 1, 0, 0, 0, 127, 130, 1, 0, 0, 0, 128, 126, 1, 0, 0, 0, 128, 129, 1, 0, 0, 0, 129, 15, 1, 0, 0, 0, 130, 128, 1, 0, 0, 0, 131, 133, 5, 16, 0, 0, 132, 131, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, 134, 185, 5, 36, 0, 0, 135, 137, 5, 16, 0, 0, 136, 135, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 5, 36, 0, 0, 139, 141, 5, 14, 0, 0, 140, 142, 3, 18, 9, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 185, 5, 15, 0, 0, 144, 145, 5, 14, 0, 0, 145, 146, 3, 2, 1, 0, 146, 147, 5, 15, 0, 0, 147, 185, 1, 0, 0, 0, 148, 150, 5, 10, 0, 0, 149, 151, 3, 20, 10, 0, 150, 149, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 5, 17, 0, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 185, 5, 11, 0, 0, 156, 158, 5, 12, 0, 0, 157, 159, 3, 26, 13, 0, 158, 157, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 161, 1, 0, 0, 0, 160, 162, 5, 17, 0, 0, 161, 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 185, 5, 13, 0, 0, 164, 166, 5, 16, 0, 0, 165, 164, 1, 0, 0, 0, 165, 166, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 172, 5, 36, 0, 0, 168, 169, 5, 16, 0, 0, 169, 171, 5, 36, 0, 0, 170, 168, 1, 0, 0, 0, 171, 174, 1, 0, 0, 0, 172, 170, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 175, 1, 0, 0, 0, 174, 172, 1, 0, 0, 0, 175, 177, 5, 12, 0, 0, 176, 178, 3, 22, 11, 0, 177, 176, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 181, 5, 17, 0, 0, 180, 179, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 185, 5, 13, 0, 0, 183, 185, 3, 32, 16, 0, 184, 132, 1, 0, 0, 0, 184, 136, 1, 0, 0, 0, 184, 144, 1, 0, 0, 0, 184, 148, 1, 0, 0, 0, 184, 156, 1, 0, 0, 0, 184, 165, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 17, 1, 0, 0, 0, 186, 191, 3, 2, 1, 0, 187, 188, 5, 17, 0, 0, 188, 190, 3, 2, 1, 0, 189, 187, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 199, 3, 30, 15, 0, 195, 196, 5, 17, 0, 0, 196, 198, 3, 30, 15, 0, 197, 195, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 21, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 203, 3, 24, 12, 0, 203, 204, 5, 21, 0, 0, 204, 212, 3, 2, 1, 0, 205, 206, 5, 17, 0, 0, 206, 207, 3, 24, 12, 0, 207, 208, 5, 21, 0, 0, 208, 209, 3, 2, 1, 0, 209, 211, 1, 0, 0, 0, 210, 205, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 23, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 217, 5, 20, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 3, 28, 14, 0, 219, 25, 1, 0, 0, 0, 220, 221, 3, 30, 15, 0, 221, 222, 5, 21, 0, 0, 222, 230, 3, 2, 1, 0, 223, 224, 5, 17, 0, 0, 224, 225, 3, 30, 15, 0, 225, 226, 5, 21, 0, 0, 226, 227, 3, 2, 1, 0, 227, 229, 1, 0, 0, 0, 228, 223, 1, 0, 0, 0, 229, 232, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 27, 1, 0, 0, 0, 232, 230, 1, 0, 0, 0, 233, 236, 5, 36, 0, 0, 234, 236, 5, 37, 0, 0, 235, 233, 1, 0, 0, 0, 235, 234, 1, 0, 0, 0, 236, 29, 1, 0, 0, 0, 237, 239, 5, 20, 0, 0, 238, 237, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 241, 3, 2, 1, 0, 241, 31, 1, 0, 0, 0, 242, 244, 5, 18, 0, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 257, 5, 32, 0, 0, 246, 257, 5, 33, 0, 0, 247, 249, 5, 18, 0, 0, 248, 247, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 257, 5, 31, 0, 0, 251, 257, 5, 34, 0, 0, 252, 257, 5, 35, 0, 0, 253, 257, 5, 26, 0, 0, 254, 257, 5, 27, 0, 0, 255, 257, 5, 28, 0, 0, 256, 243, 1, 0, 0, 0, 256, 246, 1, 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 251, 1, 0, 0, 0, 256, 252, 1, 0, 0, 0, 256, 253, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 256, 255, 1, 0, 0, 0, 257, 33, 1, 0, 0, 0, 36, 43, 50, 58, 69, 81, 83, 90, 96, 99, 107, 115, 121, 126, 128, 132, 136, 141, 150, 153, 158, 161, 165, 172, 177, 180, 184, 191, 199, 212, 216, 230, 235, 238, 243, 248, 256] \ No newline at end of file diff --git a/vendor/github.com/google/cel-go/parser/gen/CEL.tokens b/vendor/github.com/google/cel-go/parser/gen/CEL.tokens index b305bdad32..aa1f5eee6f 100644 --- a/vendor/github.com/google/cel-go/parser/gen/CEL.tokens +++ b/vendor/github.com/google/cel-go/parser/gen/CEL.tokens @@ -34,6 +34,7 @@ NUM_UINT=33 STRING=34 BYTES=35 IDENTIFIER=36 +ESC_IDENTIFIER=37 '=='=1 '!='=2 'in'=3 diff --git a/vendor/github.com/google/cel-go/parser/gen/CELLexer.interp b/vendor/github.com/google/cel-go/parser/gen/CELLexer.interp index 26e7f471e8..162d52188c 100644 --- a/vendor/github.com/google/cel-go/parser/gen/CELLexer.interp +++ b/vendor/github.com/google/cel-go/parser/gen/CELLexer.interp @@ -36,6 +36,7 @@ null null null null +null token symbolic names: null @@ -75,6 +76,7 @@ NUM_UINT STRING BYTES IDENTIFIER +ESC_IDENTIFIER rule names: EQUALS @@ -124,6 +126,7 @@ NUM_UINT STRING BYTES IDENTIFIER +ESC_IDENTIFIER channel names: DEFAULT_TOKEN_CHANNEL @@ -133,4 +136,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 36, 423, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 177, 8, 31, 1, 31, 4, 31, 180, 8, 31, 11, 31, 12, 31, 181, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 192, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 225, 8, 38, 1, 39, 4, 39, 228, 8, 39, 11, 39, 12, 39, 229, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 238, 8, 40, 10, 40, 12, 40, 241, 9, 40, 1, 40, 1, 40, 1, 41, 4, 41, 246, 8, 41, 11, 41, 12, 41, 247, 1, 41, 1, 41, 4, 41, 252, 8, 41, 11, 41, 12, 41, 253, 1, 41, 3, 41, 257, 8, 41, 1, 41, 4, 41, 260, 8, 41, 11, 41, 12, 41, 261, 1, 41, 1, 41, 1, 41, 1, 41, 4, 41, 268, 8, 41, 11, 41, 12, 41, 269, 1, 41, 3, 41, 273, 8, 41, 3, 41, 275, 8, 41, 1, 42, 4, 42, 278, 8, 42, 11, 42, 12, 42, 279, 1, 42, 1, 42, 1, 42, 1, 42, 4, 42, 286, 8, 42, 11, 42, 12, 42, 287, 3, 42, 290, 8, 42, 1, 43, 4, 43, 293, 8, 43, 11, 43, 12, 43, 294, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 303, 8, 43, 11, 43, 12, 43, 304, 1, 43, 1, 43, 3, 43, 309, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 314, 8, 44, 10, 44, 12, 44, 317, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 323, 8, 44, 10, 44, 12, 44, 326, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 335, 8, 44, 10, 44, 12, 44, 338, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 349, 8, 44, 10, 44, 12, 44, 352, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 360, 8, 44, 10, 44, 12, 44, 363, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 370, 8, 44, 10, 44, 12, 44, 373, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 383, 8, 44, 10, 44, 12, 44, 386, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 398, 8, 44, 10, 44, 12, 44, 401, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 407, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 414, 8, 46, 1, 46, 1, 46, 1, 46, 5, 46, 419, 8, 46, 10, 46, 12, 46, 422, 9, 46, 4, 336, 350, 384, 399, 0, 47, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 29, 81, 30, 83, 31, 85, 32, 87, 33, 89, 34, 91, 35, 93, 36, 1, 0, 16, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 456, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 3, 98, 1, 0, 0, 0, 5, 101, 1, 0, 0, 0, 7, 104, 1, 0, 0, 0, 9, 106, 1, 0, 0, 0, 11, 109, 1, 0, 0, 0, 13, 112, 1, 0, 0, 0, 15, 114, 1, 0, 0, 0, 17, 117, 1, 0, 0, 0, 19, 120, 1, 0, 0, 0, 21, 122, 1, 0, 0, 0, 23, 124, 1, 0, 0, 0, 25, 126, 1, 0, 0, 0, 27, 128, 1, 0, 0, 0, 29, 130, 1, 0, 0, 0, 31, 132, 1, 0, 0, 0, 33, 134, 1, 0, 0, 0, 35, 136, 1, 0, 0, 0, 37, 138, 1, 0, 0, 0, 39, 140, 1, 0, 0, 0, 41, 142, 1, 0, 0, 0, 43, 144, 1, 0, 0, 0, 45, 146, 1, 0, 0, 0, 47, 148, 1, 0, 0, 0, 49, 150, 1, 0, 0, 0, 51, 152, 1, 0, 0, 0, 53, 157, 1, 0, 0, 0, 55, 163, 1, 0, 0, 0, 57, 168, 1, 0, 0, 0, 59, 170, 1, 0, 0, 0, 61, 172, 1, 0, 0, 0, 63, 174, 1, 0, 0, 0, 65, 183, 1, 0, 0, 0, 67, 185, 1, 0, 0, 0, 69, 191, 1, 0, 0, 0, 71, 193, 1, 0, 0, 0, 73, 196, 1, 0, 0, 0, 75, 201, 1, 0, 0, 0, 77, 224, 1, 0, 0, 0, 79, 227, 1, 0, 0, 0, 81, 233, 1, 0, 0, 0, 83, 274, 1, 0, 0, 0, 85, 289, 1, 0, 0, 0, 87, 308, 1, 0, 0, 0, 89, 406, 1, 0, 0, 0, 91, 408, 1, 0, 0, 0, 93, 413, 1, 0, 0, 0, 95, 96, 5, 61, 0, 0, 96, 97, 5, 61, 0, 0, 97, 2, 1, 0, 0, 0, 98, 99, 5, 33, 0, 0, 99, 100, 5, 61, 0, 0, 100, 4, 1, 0, 0, 0, 101, 102, 5, 105, 0, 0, 102, 103, 5, 110, 0, 0, 103, 6, 1, 0, 0, 0, 104, 105, 5, 60, 0, 0, 105, 8, 1, 0, 0, 0, 106, 107, 5, 60, 0, 0, 107, 108, 5, 61, 0, 0, 108, 10, 1, 0, 0, 0, 109, 110, 5, 62, 0, 0, 110, 111, 5, 61, 0, 0, 111, 12, 1, 0, 0, 0, 112, 113, 5, 62, 0, 0, 113, 14, 1, 0, 0, 0, 114, 115, 5, 38, 0, 0, 115, 116, 5, 38, 0, 0, 116, 16, 1, 0, 0, 0, 117, 118, 5, 124, 0, 0, 118, 119, 5, 124, 0, 0, 119, 18, 1, 0, 0, 0, 120, 121, 5, 91, 0, 0, 121, 20, 1, 0, 0, 0, 122, 123, 5, 93, 0, 0, 123, 22, 1, 0, 0, 0, 124, 125, 5, 123, 0, 0, 125, 24, 1, 0, 0, 0, 126, 127, 5, 125, 0, 0, 127, 26, 1, 0, 0, 0, 128, 129, 5, 40, 0, 0, 129, 28, 1, 0, 0, 0, 130, 131, 5, 41, 0, 0, 131, 30, 1, 0, 0, 0, 132, 133, 5, 46, 0, 0, 133, 32, 1, 0, 0, 0, 134, 135, 5, 44, 0, 0, 135, 34, 1, 0, 0, 0, 136, 137, 5, 45, 0, 0, 137, 36, 1, 0, 0, 0, 138, 139, 5, 33, 0, 0, 139, 38, 1, 0, 0, 0, 140, 141, 5, 63, 0, 0, 141, 40, 1, 0, 0, 0, 142, 143, 5, 58, 0, 0, 143, 42, 1, 0, 0, 0, 144, 145, 5, 43, 0, 0, 145, 44, 1, 0, 0, 0, 146, 147, 5, 42, 0, 0, 147, 46, 1, 0, 0, 0, 148, 149, 5, 47, 0, 0, 149, 48, 1, 0, 0, 0, 150, 151, 5, 37, 0, 0, 151, 50, 1, 0, 0, 0, 152, 153, 5, 116, 0, 0, 153, 154, 5, 114, 0, 0, 154, 155, 5, 117, 0, 0, 155, 156, 5, 101, 0, 0, 156, 52, 1, 0, 0, 0, 157, 158, 5, 102, 0, 0, 158, 159, 5, 97, 0, 0, 159, 160, 5, 108, 0, 0, 160, 161, 5, 115, 0, 0, 161, 162, 5, 101, 0, 0, 162, 54, 1, 0, 0, 0, 163, 164, 5, 110, 0, 0, 164, 165, 5, 117, 0, 0, 165, 166, 5, 108, 0, 0, 166, 167, 5, 108, 0, 0, 167, 56, 1, 0, 0, 0, 168, 169, 5, 92, 0, 0, 169, 58, 1, 0, 0, 0, 170, 171, 7, 0, 0, 0, 171, 60, 1, 0, 0, 0, 172, 173, 2, 48, 57, 0, 173, 62, 1, 0, 0, 0, 174, 176, 7, 1, 0, 0, 175, 177, 7, 2, 0, 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 179, 1, 0, 0, 0, 178, 180, 3, 61, 30, 0, 179, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 64, 1, 0, 0, 0, 183, 184, 7, 3, 0, 0, 184, 66, 1, 0, 0, 0, 185, 186, 7, 4, 0, 0, 186, 68, 1, 0, 0, 0, 187, 192, 3, 71, 35, 0, 188, 192, 3, 75, 37, 0, 189, 192, 3, 77, 38, 0, 190, 192, 3, 73, 36, 0, 191, 187, 1, 0, 0, 0, 191, 188, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 190, 1, 0, 0, 0, 192, 70, 1, 0, 0, 0, 193, 194, 3, 57, 28, 0, 194, 195, 7, 5, 0, 0, 195, 72, 1, 0, 0, 0, 196, 197, 3, 57, 28, 0, 197, 198, 2, 48, 51, 0, 198, 199, 2, 48, 55, 0, 199, 200, 2, 48, 55, 0, 200, 74, 1, 0, 0, 0, 201, 202, 3, 57, 28, 0, 202, 203, 7, 6, 0, 0, 203, 204, 3, 65, 32, 0, 204, 205, 3, 65, 32, 0, 205, 76, 1, 0, 0, 0, 206, 207, 3, 57, 28, 0, 207, 208, 5, 117, 0, 0, 208, 209, 3, 65, 32, 0, 209, 210, 3, 65, 32, 0, 210, 211, 3, 65, 32, 0, 211, 212, 3, 65, 32, 0, 212, 225, 1, 0, 0, 0, 213, 214, 3, 57, 28, 0, 214, 215, 5, 85, 0, 0, 215, 216, 3, 65, 32, 0, 216, 217, 3, 65, 32, 0, 217, 218, 3, 65, 32, 0, 218, 219, 3, 65, 32, 0, 219, 220, 3, 65, 32, 0, 220, 221, 3, 65, 32, 0, 221, 222, 3, 65, 32, 0, 222, 223, 3, 65, 32, 0, 223, 225, 1, 0, 0, 0, 224, 206, 1, 0, 0, 0, 224, 213, 1, 0, 0, 0, 225, 78, 1, 0, 0, 0, 226, 228, 7, 7, 0, 0, 227, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 6, 39, 0, 0, 232, 80, 1, 0, 0, 0, 233, 234, 5, 47, 0, 0, 234, 235, 5, 47, 0, 0, 235, 239, 1, 0, 0, 0, 236, 238, 8, 8, 0, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 6, 40, 0, 0, 243, 82, 1, 0, 0, 0, 244, 246, 3, 61, 30, 0, 245, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 251, 5, 46, 0, 0, 250, 252, 3, 61, 30, 0, 251, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 257, 3, 63, 31, 0, 256, 255, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 275, 1, 0, 0, 0, 258, 260, 3, 61, 30, 0, 259, 258, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 264, 3, 63, 31, 0, 264, 275, 1, 0, 0, 0, 265, 267, 5, 46, 0, 0, 266, 268, 3, 61, 30, 0, 267, 266, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 272, 1, 0, 0, 0, 271, 273, 3, 63, 31, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 275, 1, 0, 0, 0, 274, 245, 1, 0, 0, 0, 274, 259, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 275, 84, 1, 0, 0, 0, 276, 278, 3, 61, 30, 0, 277, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 290, 1, 0, 0, 0, 281, 282, 5, 48, 0, 0, 282, 283, 5, 120, 0, 0, 283, 285, 1, 0, 0, 0, 284, 286, 3, 65, 32, 0, 285, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, 289, 277, 1, 0, 0, 0, 289, 281, 1, 0, 0, 0, 290, 86, 1, 0, 0, 0, 291, 293, 3, 61, 30, 0, 292, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 7, 9, 0, 0, 297, 309, 1, 0, 0, 0, 298, 299, 5, 48, 0, 0, 299, 300, 5, 120, 0, 0, 300, 302, 1, 0, 0, 0, 301, 303, 3, 65, 32, 0, 302, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 307, 7, 9, 0, 0, 307, 309, 1, 0, 0, 0, 308, 292, 1, 0, 0, 0, 308, 298, 1, 0, 0, 0, 309, 88, 1, 0, 0, 0, 310, 315, 5, 34, 0, 0, 311, 314, 3, 69, 34, 0, 312, 314, 8, 10, 0, 0, 313, 311, 1, 0, 0, 0, 313, 312, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 318, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 407, 5, 34, 0, 0, 319, 324, 5, 39, 0, 0, 320, 323, 3, 69, 34, 0, 321, 323, 8, 11, 0, 0, 322, 320, 1, 0, 0, 0, 322, 321, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 407, 5, 39, 0, 0, 328, 329, 5, 34, 0, 0, 329, 330, 5, 34, 0, 0, 330, 331, 5, 34, 0, 0, 331, 336, 1, 0, 0, 0, 332, 335, 3, 69, 34, 0, 333, 335, 8, 12, 0, 0, 334, 332, 1, 0, 0, 0, 334, 333, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 34, 0, 0, 340, 341, 5, 34, 0, 0, 341, 407, 5, 34, 0, 0, 342, 343, 5, 39, 0, 0, 343, 344, 5, 39, 0, 0, 344, 345, 5, 39, 0, 0, 345, 350, 1, 0, 0, 0, 346, 349, 3, 69, 34, 0, 347, 349, 8, 12, 0, 0, 348, 346, 1, 0, 0, 0, 348, 347, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 351, 353, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 354, 5, 39, 0, 0, 354, 355, 5, 39, 0, 0, 355, 407, 5, 39, 0, 0, 356, 357, 3, 67, 33, 0, 357, 361, 5, 34, 0, 0, 358, 360, 8, 13, 0, 0, 359, 358, 1, 0, 0, 0, 360, 363, 1, 0, 0, 0, 361, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 364, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 364, 365, 5, 34, 0, 0, 365, 407, 1, 0, 0, 0, 366, 367, 3, 67, 33, 0, 367, 371, 5, 39, 0, 0, 368, 370, 8, 14, 0, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 374, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 39, 0, 0, 375, 407, 1, 0, 0, 0, 376, 377, 3, 67, 33, 0, 377, 378, 5, 34, 0, 0, 378, 379, 5, 34, 0, 0, 379, 380, 5, 34, 0, 0, 380, 384, 1, 0, 0, 0, 381, 383, 9, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 388, 5, 34, 0, 0, 388, 389, 5, 34, 0, 0, 389, 390, 5, 34, 0, 0, 390, 407, 1, 0, 0, 0, 391, 392, 3, 67, 33, 0, 392, 393, 5, 39, 0, 0, 393, 394, 5, 39, 0, 0, 394, 395, 5, 39, 0, 0, 395, 399, 1, 0, 0, 0, 396, 398, 9, 0, 0, 0, 397, 396, 1, 0, 0, 0, 398, 401, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, 403, 5, 39, 0, 0, 403, 404, 5, 39, 0, 0, 404, 405, 5, 39, 0, 0, 405, 407, 1, 0, 0, 0, 406, 310, 1, 0, 0, 0, 406, 319, 1, 0, 0, 0, 406, 328, 1, 0, 0, 0, 406, 342, 1, 0, 0, 0, 406, 356, 1, 0, 0, 0, 406, 366, 1, 0, 0, 0, 406, 376, 1, 0, 0, 0, 406, 391, 1, 0, 0, 0, 407, 90, 1, 0, 0, 0, 408, 409, 7, 15, 0, 0, 409, 410, 3, 89, 44, 0, 410, 92, 1, 0, 0, 0, 411, 414, 3, 59, 29, 0, 412, 414, 5, 95, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, 0, 0, 414, 420, 1, 0, 0, 0, 415, 419, 3, 59, 29, 0, 416, 419, 3, 61, 30, 0, 417, 419, 5, 95, 0, 0, 418, 415, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 417, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 94, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 36, 0, 176, 181, 191, 224, 229, 239, 247, 253, 256, 261, 269, 272, 274, 279, 287, 289, 294, 304, 308, 313, 315, 322, 324, 334, 336, 348, 350, 361, 371, 384, 399, 406, 413, 418, 420, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 37, 435, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 179, 8, 31, 1, 31, 4, 31, 182, 8, 31, 11, 31, 12, 31, 183, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 194, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 227, 8, 38, 1, 39, 4, 39, 230, 8, 39, 11, 39, 12, 39, 231, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 240, 8, 40, 10, 40, 12, 40, 243, 9, 40, 1, 40, 1, 40, 1, 41, 4, 41, 248, 8, 41, 11, 41, 12, 41, 249, 1, 41, 1, 41, 4, 41, 254, 8, 41, 11, 41, 12, 41, 255, 1, 41, 3, 41, 259, 8, 41, 1, 41, 4, 41, 262, 8, 41, 11, 41, 12, 41, 263, 1, 41, 1, 41, 1, 41, 1, 41, 4, 41, 270, 8, 41, 11, 41, 12, 41, 271, 1, 41, 3, 41, 275, 8, 41, 3, 41, 277, 8, 41, 1, 42, 4, 42, 280, 8, 42, 11, 42, 12, 42, 281, 1, 42, 1, 42, 1, 42, 1, 42, 4, 42, 288, 8, 42, 11, 42, 12, 42, 289, 3, 42, 292, 8, 42, 1, 43, 4, 43, 295, 8, 43, 11, 43, 12, 43, 296, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 305, 8, 43, 11, 43, 12, 43, 306, 1, 43, 1, 43, 3, 43, 311, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 316, 8, 44, 10, 44, 12, 44, 319, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 325, 8, 44, 10, 44, 12, 44, 328, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 337, 8, 44, 10, 44, 12, 44, 340, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 351, 8, 44, 10, 44, 12, 44, 354, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 362, 8, 44, 10, 44, 12, 44, 365, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 372, 8, 44, 10, 44, 12, 44, 375, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 385, 8, 44, 10, 44, 12, 44, 388, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 400, 8, 44, 10, 44, 12, 44, 403, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 409, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 416, 8, 46, 1, 46, 1, 46, 1, 46, 5, 46, 421, 8, 46, 10, 46, 12, 46, 424, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 4, 47, 430, 8, 47, 11, 47, 12, 47, 431, 1, 47, 1, 47, 4, 338, 352, 386, 401, 0, 48, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 29, 81, 30, 83, 31, 85, 32, 87, 33, 89, 34, 91, 35, 93, 36, 95, 37, 1, 0, 17, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 3, 0, 32, 32, 45, 47, 95, 95, 471, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 3, 100, 1, 0, 0, 0, 5, 103, 1, 0, 0, 0, 7, 106, 1, 0, 0, 0, 9, 108, 1, 0, 0, 0, 11, 111, 1, 0, 0, 0, 13, 114, 1, 0, 0, 0, 15, 116, 1, 0, 0, 0, 17, 119, 1, 0, 0, 0, 19, 122, 1, 0, 0, 0, 21, 124, 1, 0, 0, 0, 23, 126, 1, 0, 0, 0, 25, 128, 1, 0, 0, 0, 27, 130, 1, 0, 0, 0, 29, 132, 1, 0, 0, 0, 31, 134, 1, 0, 0, 0, 33, 136, 1, 0, 0, 0, 35, 138, 1, 0, 0, 0, 37, 140, 1, 0, 0, 0, 39, 142, 1, 0, 0, 0, 41, 144, 1, 0, 0, 0, 43, 146, 1, 0, 0, 0, 45, 148, 1, 0, 0, 0, 47, 150, 1, 0, 0, 0, 49, 152, 1, 0, 0, 0, 51, 154, 1, 0, 0, 0, 53, 159, 1, 0, 0, 0, 55, 165, 1, 0, 0, 0, 57, 170, 1, 0, 0, 0, 59, 172, 1, 0, 0, 0, 61, 174, 1, 0, 0, 0, 63, 176, 1, 0, 0, 0, 65, 185, 1, 0, 0, 0, 67, 187, 1, 0, 0, 0, 69, 193, 1, 0, 0, 0, 71, 195, 1, 0, 0, 0, 73, 198, 1, 0, 0, 0, 75, 203, 1, 0, 0, 0, 77, 226, 1, 0, 0, 0, 79, 229, 1, 0, 0, 0, 81, 235, 1, 0, 0, 0, 83, 276, 1, 0, 0, 0, 85, 291, 1, 0, 0, 0, 87, 310, 1, 0, 0, 0, 89, 408, 1, 0, 0, 0, 91, 410, 1, 0, 0, 0, 93, 415, 1, 0, 0, 0, 95, 425, 1, 0, 0, 0, 97, 98, 5, 61, 0, 0, 98, 99, 5, 61, 0, 0, 99, 2, 1, 0, 0, 0, 100, 101, 5, 33, 0, 0, 101, 102, 5, 61, 0, 0, 102, 4, 1, 0, 0, 0, 103, 104, 5, 105, 0, 0, 104, 105, 5, 110, 0, 0, 105, 6, 1, 0, 0, 0, 106, 107, 5, 60, 0, 0, 107, 8, 1, 0, 0, 0, 108, 109, 5, 60, 0, 0, 109, 110, 5, 61, 0, 0, 110, 10, 1, 0, 0, 0, 111, 112, 5, 62, 0, 0, 112, 113, 5, 61, 0, 0, 113, 12, 1, 0, 0, 0, 114, 115, 5, 62, 0, 0, 115, 14, 1, 0, 0, 0, 116, 117, 5, 38, 0, 0, 117, 118, 5, 38, 0, 0, 118, 16, 1, 0, 0, 0, 119, 120, 5, 124, 0, 0, 120, 121, 5, 124, 0, 0, 121, 18, 1, 0, 0, 0, 122, 123, 5, 91, 0, 0, 123, 20, 1, 0, 0, 0, 124, 125, 5, 93, 0, 0, 125, 22, 1, 0, 0, 0, 126, 127, 5, 123, 0, 0, 127, 24, 1, 0, 0, 0, 128, 129, 5, 125, 0, 0, 129, 26, 1, 0, 0, 0, 130, 131, 5, 40, 0, 0, 131, 28, 1, 0, 0, 0, 132, 133, 5, 41, 0, 0, 133, 30, 1, 0, 0, 0, 134, 135, 5, 46, 0, 0, 135, 32, 1, 0, 0, 0, 136, 137, 5, 44, 0, 0, 137, 34, 1, 0, 0, 0, 138, 139, 5, 45, 0, 0, 139, 36, 1, 0, 0, 0, 140, 141, 5, 33, 0, 0, 141, 38, 1, 0, 0, 0, 142, 143, 5, 63, 0, 0, 143, 40, 1, 0, 0, 0, 144, 145, 5, 58, 0, 0, 145, 42, 1, 0, 0, 0, 146, 147, 5, 43, 0, 0, 147, 44, 1, 0, 0, 0, 148, 149, 5, 42, 0, 0, 149, 46, 1, 0, 0, 0, 150, 151, 5, 47, 0, 0, 151, 48, 1, 0, 0, 0, 152, 153, 5, 37, 0, 0, 153, 50, 1, 0, 0, 0, 154, 155, 5, 116, 0, 0, 155, 156, 5, 114, 0, 0, 156, 157, 5, 117, 0, 0, 157, 158, 5, 101, 0, 0, 158, 52, 1, 0, 0, 0, 159, 160, 5, 102, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 108, 0, 0, 162, 163, 5, 115, 0, 0, 163, 164, 5, 101, 0, 0, 164, 54, 1, 0, 0, 0, 165, 166, 5, 110, 0, 0, 166, 167, 5, 117, 0, 0, 167, 168, 5, 108, 0, 0, 168, 169, 5, 108, 0, 0, 169, 56, 1, 0, 0, 0, 170, 171, 5, 92, 0, 0, 171, 58, 1, 0, 0, 0, 172, 173, 7, 0, 0, 0, 173, 60, 1, 0, 0, 0, 174, 175, 2, 48, 57, 0, 175, 62, 1, 0, 0, 0, 176, 178, 7, 1, 0, 0, 177, 179, 7, 2, 0, 0, 178, 177, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 182, 3, 61, 30, 0, 181, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 64, 1, 0, 0, 0, 185, 186, 7, 3, 0, 0, 186, 66, 1, 0, 0, 0, 187, 188, 7, 4, 0, 0, 188, 68, 1, 0, 0, 0, 189, 194, 3, 71, 35, 0, 190, 194, 3, 75, 37, 0, 191, 194, 3, 77, 38, 0, 192, 194, 3, 73, 36, 0, 193, 189, 1, 0, 0, 0, 193, 190, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 193, 192, 1, 0, 0, 0, 194, 70, 1, 0, 0, 0, 195, 196, 3, 57, 28, 0, 196, 197, 7, 5, 0, 0, 197, 72, 1, 0, 0, 0, 198, 199, 3, 57, 28, 0, 199, 200, 2, 48, 51, 0, 200, 201, 2, 48, 55, 0, 201, 202, 2, 48, 55, 0, 202, 74, 1, 0, 0, 0, 203, 204, 3, 57, 28, 0, 204, 205, 7, 6, 0, 0, 205, 206, 3, 65, 32, 0, 206, 207, 3, 65, 32, 0, 207, 76, 1, 0, 0, 0, 208, 209, 3, 57, 28, 0, 209, 210, 5, 117, 0, 0, 210, 211, 3, 65, 32, 0, 211, 212, 3, 65, 32, 0, 212, 213, 3, 65, 32, 0, 213, 214, 3, 65, 32, 0, 214, 227, 1, 0, 0, 0, 215, 216, 3, 57, 28, 0, 216, 217, 5, 85, 0, 0, 217, 218, 3, 65, 32, 0, 218, 219, 3, 65, 32, 0, 219, 220, 3, 65, 32, 0, 220, 221, 3, 65, 32, 0, 221, 222, 3, 65, 32, 0, 222, 223, 3, 65, 32, 0, 223, 224, 3, 65, 32, 0, 224, 225, 3, 65, 32, 0, 225, 227, 1, 0, 0, 0, 226, 208, 1, 0, 0, 0, 226, 215, 1, 0, 0, 0, 227, 78, 1, 0, 0, 0, 228, 230, 7, 7, 0, 0, 229, 228, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 6, 39, 0, 0, 234, 80, 1, 0, 0, 0, 235, 236, 5, 47, 0, 0, 236, 237, 5, 47, 0, 0, 237, 241, 1, 0, 0, 0, 238, 240, 8, 8, 0, 0, 239, 238, 1, 0, 0, 0, 240, 243, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 244, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 244, 245, 6, 40, 0, 0, 245, 82, 1, 0, 0, 0, 246, 248, 3, 61, 30, 0, 247, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 253, 5, 46, 0, 0, 252, 254, 3, 61, 30, 0, 253, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 258, 1, 0, 0, 0, 257, 259, 3, 63, 31, 0, 258, 257, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 277, 1, 0, 0, 0, 260, 262, 3, 61, 30, 0, 261, 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 3, 63, 31, 0, 266, 277, 1, 0, 0, 0, 267, 269, 5, 46, 0, 0, 268, 270, 3, 61, 30, 0, 269, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 274, 1, 0, 0, 0, 273, 275, 3, 63, 31, 0, 274, 273, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 277, 1, 0, 0, 0, 276, 247, 1, 0, 0, 0, 276, 261, 1, 0, 0, 0, 276, 267, 1, 0, 0, 0, 277, 84, 1, 0, 0, 0, 278, 280, 3, 61, 30, 0, 279, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 292, 1, 0, 0, 0, 283, 284, 5, 48, 0, 0, 284, 285, 5, 120, 0, 0, 285, 287, 1, 0, 0, 0, 286, 288, 3, 65, 32, 0, 287, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 292, 1, 0, 0, 0, 291, 279, 1, 0, 0, 0, 291, 283, 1, 0, 0, 0, 292, 86, 1, 0, 0, 0, 293, 295, 3, 61, 30, 0, 294, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 299, 7, 9, 0, 0, 299, 311, 1, 0, 0, 0, 300, 301, 5, 48, 0, 0, 301, 302, 5, 120, 0, 0, 302, 304, 1, 0, 0, 0, 303, 305, 3, 65, 32, 0, 304, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 309, 7, 9, 0, 0, 309, 311, 1, 0, 0, 0, 310, 294, 1, 0, 0, 0, 310, 300, 1, 0, 0, 0, 311, 88, 1, 0, 0, 0, 312, 317, 5, 34, 0, 0, 313, 316, 3, 69, 34, 0, 314, 316, 8, 10, 0, 0, 315, 313, 1, 0, 0, 0, 315, 314, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 320, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 409, 5, 34, 0, 0, 321, 326, 5, 39, 0, 0, 322, 325, 3, 69, 34, 0, 323, 325, 8, 11, 0, 0, 324, 322, 1, 0, 0, 0, 324, 323, 1, 0, 0, 0, 325, 328, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 329, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 329, 409, 5, 39, 0, 0, 330, 331, 5, 34, 0, 0, 331, 332, 5, 34, 0, 0, 332, 333, 5, 34, 0, 0, 333, 338, 1, 0, 0, 0, 334, 337, 3, 69, 34, 0, 335, 337, 8, 12, 0, 0, 336, 334, 1, 0, 0, 0, 336, 335, 1, 0, 0, 0, 337, 340, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 341, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 341, 342, 5, 34, 0, 0, 342, 343, 5, 34, 0, 0, 343, 409, 5, 34, 0, 0, 344, 345, 5, 39, 0, 0, 345, 346, 5, 39, 0, 0, 346, 347, 5, 39, 0, 0, 347, 352, 1, 0, 0, 0, 348, 351, 3, 69, 34, 0, 349, 351, 8, 12, 0, 0, 350, 348, 1, 0, 0, 0, 350, 349, 1, 0, 0, 0, 351, 354, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 355, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 355, 356, 5, 39, 0, 0, 356, 357, 5, 39, 0, 0, 357, 409, 5, 39, 0, 0, 358, 359, 3, 67, 33, 0, 359, 363, 5, 34, 0, 0, 360, 362, 8, 13, 0, 0, 361, 360, 1, 0, 0, 0, 362, 365, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 366, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 366, 367, 5, 34, 0, 0, 367, 409, 1, 0, 0, 0, 368, 369, 3, 67, 33, 0, 369, 373, 5, 39, 0, 0, 370, 372, 8, 14, 0, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 376, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 377, 5, 39, 0, 0, 377, 409, 1, 0, 0, 0, 378, 379, 3, 67, 33, 0, 379, 380, 5, 34, 0, 0, 380, 381, 5, 34, 0, 0, 381, 382, 5, 34, 0, 0, 382, 386, 1, 0, 0, 0, 383, 385, 9, 0, 0, 0, 384, 383, 1, 0, 0, 0, 385, 388, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 389, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 390, 5, 34, 0, 0, 390, 391, 5, 34, 0, 0, 391, 392, 5, 34, 0, 0, 392, 409, 1, 0, 0, 0, 393, 394, 3, 67, 33, 0, 394, 395, 5, 39, 0, 0, 395, 396, 5, 39, 0, 0, 396, 397, 5, 39, 0, 0, 397, 401, 1, 0, 0, 0, 398, 400, 9, 0, 0, 0, 399, 398, 1, 0, 0, 0, 400, 403, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, 404, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 404, 405, 5, 39, 0, 0, 405, 406, 5, 39, 0, 0, 406, 407, 5, 39, 0, 0, 407, 409, 1, 0, 0, 0, 408, 312, 1, 0, 0, 0, 408, 321, 1, 0, 0, 0, 408, 330, 1, 0, 0, 0, 408, 344, 1, 0, 0, 0, 408, 358, 1, 0, 0, 0, 408, 368, 1, 0, 0, 0, 408, 378, 1, 0, 0, 0, 408, 393, 1, 0, 0, 0, 409, 90, 1, 0, 0, 0, 410, 411, 7, 15, 0, 0, 411, 412, 3, 89, 44, 0, 412, 92, 1, 0, 0, 0, 413, 416, 3, 59, 29, 0, 414, 416, 5, 95, 0, 0, 415, 413, 1, 0, 0, 0, 415, 414, 1, 0, 0, 0, 416, 422, 1, 0, 0, 0, 417, 421, 3, 59, 29, 0, 418, 421, 3, 61, 30, 0, 419, 421, 5, 95, 0, 0, 420, 417, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 419, 1, 0, 0, 0, 421, 424, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 94, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 425, 429, 5, 96, 0, 0, 426, 430, 3, 59, 29, 0, 427, 430, 3, 61, 30, 0, 428, 430, 7, 16, 0, 0, 429, 426, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 5, 96, 0, 0, 434, 96, 1, 0, 0, 0, 38, 0, 178, 183, 193, 226, 231, 241, 249, 255, 258, 263, 271, 274, 276, 281, 289, 291, 296, 306, 310, 315, 317, 324, 326, 336, 338, 350, 352, 363, 373, 386, 401, 408, 415, 420, 422, 429, 431, 1, 0, 1, 0] \ No newline at end of file diff --git a/vendor/github.com/google/cel-go/parser/gen/CELLexer.tokens b/vendor/github.com/google/cel-go/parser/gen/CELLexer.tokens index b305bdad32..aa1f5eee6f 100644 --- a/vendor/github.com/google/cel-go/parser/gen/CELLexer.tokens +++ b/vendor/github.com/google/cel-go/parser/gen/CELLexer.tokens @@ -34,6 +34,7 @@ NUM_UINT=33 STRING=34 BYTES=35 IDENTIFIER=36 +ESC_IDENTIFIER=37 '=='=1 '!='=2 'in'=3 diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go b/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go index c49d038676..514f2082fe 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_base_listener.go @@ -1,4 +1,4 @@ -// Code generated from /usr/local/google/home/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. +// Code generated from /usr/local/google/home/jdtatum/github/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. package gen // CEL import "github.com/antlr4-go/antlr/v4" @@ -98,11 +98,17 @@ func (s *BaseCELListener) EnterIndex(ctx *IndexContext) {} // ExitIndex is called when production Index is exited. func (s *BaseCELListener) ExitIndex(ctx *IndexContext) {} -// EnterIdentOrGlobalCall is called when production IdentOrGlobalCall is entered. -func (s *BaseCELListener) EnterIdentOrGlobalCall(ctx *IdentOrGlobalCallContext) {} +// EnterIdent is called when production Ident is entered. +func (s *BaseCELListener) EnterIdent(ctx *IdentContext) {} -// ExitIdentOrGlobalCall is called when production IdentOrGlobalCall is exited. -func (s *BaseCELListener) ExitIdentOrGlobalCall(ctx *IdentOrGlobalCallContext) {} +// ExitIdent is called when production Ident is exited. +func (s *BaseCELListener) ExitIdent(ctx *IdentContext) {} + +// EnterGlobalCall is called when production GlobalCall is entered. +func (s *BaseCELListener) EnterGlobalCall(ctx *GlobalCallContext) {} + +// ExitGlobalCall is called when production GlobalCall is exited. +func (s *BaseCELListener) ExitGlobalCall(ctx *GlobalCallContext) {} // EnterNested is called when production Nested is entered. func (s *BaseCELListener) EnterNested(ctx *NestedContext) {} @@ -164,6 +170,18 @@ func (s *BaseCELListener) EnterMapInitializerList(ctx *MapInitializerListContext // ExitMapInitializerList is called when production mapInitializerList is exited. func (s *BaseCELListener) ExitMapInitializerList(ctx *MapInitializerListContext) {} +// EnterSimpleIdentifier is called when production SimpleIdentifier is entered. +func (s *BaseCELListener) EnterSimpleIdentifier(ctx *SimpleIdentifierContext) {} + +// ExitSimpleIdentifier is called when production SimpleIdentifier is exited. +func (s *BaseCELListener) ExitSimpleIdentifier(ctx *SimpleIdentifierContext) {} + +// EnterEscapedIdentifier is called when production EscapedIdentifier is entered. +func (s *BaseCELListener) EnterEscapedIdentifier(ctx *EscapedIdentifierContext) {} + +// ExitEscapedIdentifier is called when production EscapedIdentifier is exited. +func (s *BaseCELListener) ExitEscapedIdentifier(ctx *EscapedIdentifierContext) {} + // EnterOptExpr is called when production optExpr is entered. func (s *BaseCELListener) EnterOptExpr(ctx *OptExprContext) {} diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go b/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go index b2c0783d39..8a12cb65e3 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_base_visitor.go @@ -1,9 +1,8 @@ -// Code generated from /usr/local/google/home/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. +// Code generated from /usr/local/google/home/jdtatum/github/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. package gen // CEL import "github.com/antlr4-go/antlr/v4" - type BaseCELVisitor struct { *antlr.BaseParseTreeVisitor } @@ -60,7 +59,11 @@ func (v *BaseCELVisitor) VisitIndex(ctx *IndexContext) interface{} { return v.VisitChildren(ctx) } -func (v *BaseCELVisitor) VisitIdentOrGlobalCall(ctx *IdentOrGlobalCallContext) interface{} { +func (v *BaseCELVisitor) VisitIdent(ctx *IdentContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseCELVisitor) VisitGlobalCall(ctx *GlobalCallContext) interface{} { return v.VisitChildren(ctx) } @@ -104,6 +107,14 @@ func (v *BaseCELVisitor) VisitMapInitializerList(ctx *MapInitializerListContext) return v.VisitChildren(ctx) } +func (v *BaseCELVisitor) VisitSimpleIdentifier(ctx *SimpleIdentifierContext) interface{} { + return v.VisitChildren(ctx) +} + +func (v *BaseCELVisitor) VisitEscapedIdentifier(ctx *EscapedIdentifierContext) interface{} { + return v.VisitChildren(ctx) +} + func (v *BaseCELVisitor) VisitOptExpr(ctx *OptExprContext) interface{} { return v.VisitChildren(ctx) } diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go b/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go index e026cc46f0..896562f5fb 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_lexer.go @@ -1,278 +1,285 @@ -// Code generated from /usr/local/google/home/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. +// Code generated from /usr/local/google/home/jdtatum/github/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. package gen + import ( "fmt" - "sync" - "unicode" "github.com/antlr4-go/antlr/v4" + "sync" + "unicode" ) + // Suppress unused import error var _ = fmt.Printf var _ = sync.Once{} var _ = unicode.IsLetter - type CELLexer struct { *antlr.BaseLexer channelNames []string - modeNames []string + modeNames []string // TODO: EOF string } var CELLexerLexerStaticData struct { - once sync.Once - serializedATN []int32 - ChannelNames []string - ModeNames []string - LiteralNames []string - SymbolicNames []string - RuleNames []string - PredictionContextCache *antlr.PredictionContextCache - atn *antlr.ATN - decisionToDFA []*antlr.DFA + once sync.Once + serializedATN []int32 + ChannelNames []string + ModeNames []string + LiteralNames []string + SymbolicNames []string + RuleNames []string + PredictionContextCache *antlr.PredictionContextCache + atn *antlr.ATN + decisionToDFA []*antlr.DFA } func cellexerLexerInit() { - staticData := &CELLexerLexerStaticData - staticData.ChannelNames = []string{ - "DEFAULT_TOKEN_CHANNEL", "HIDDEN", - } - staticData.ModeNames = []string{ - "DEFAULT_MODE", - } - staticData.LiteralNames = []string{ - "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", - "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", - "'?'", "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", - } - staticData.SymbolicNames = []string{ - "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", - "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", - "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", - "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", - "NUL", "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", - "STRING", "BYTES", "IDENTIFIER", - } - staticData.RuleNames = []string{ - "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", - "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", - "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", - "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", - "NUL", "BACKSLASH", "LETTER", "DIGIT", "EXPONENT", "HEXDIGIT", "RAW", - "ESC_SEQ", "ESC_CHAR_SEQ", "ESC_OCT_SEQ", "ESC_BYTE_SEQ", "ESC_UNI_SEQ", - "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", - "BYTES", "IDENTIFIER", - } - staticData.PredictionContextCache = antlr.NewPredictionContextCache() - staticData.serializedATN = []int32{ - 4, 0, 36, 423, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, - 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, - 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, - 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, - 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, - 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, - 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, - 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, - 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, - 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, - 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, - 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, - 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, - 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, - 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, - 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, - 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 177, 8, 31, 1, 31, 4, 31, 180, 8, 31, - 11, 31, 12, 31, 181, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, - 34, 3, 34, 192, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, - 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, - 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, - 1, 38, 1, 38, 1, 38, 3, 38, 225, 8, 38, 1, 39, 4, 39, 228, 8, 39, 11, 39, - 12, 39, 229, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 238, 8, 40, - 10, 40, 12, 40, 241, 9, 40, 1, 40, 1, 40, 1, 41, 4, 41, 246, 8, 41, 11, - 41, 12, 41, 247, 1, 41, 1, 41, 4, 41, 252, 8, 41, 11, 41, 12, 41, 253, - 1, 41, 3, 41, 257, 8, 41, 1, 41, 4, 41, 260, 8, 41, 11, 41, 12, 41, 261, - 1, 41, 1, 41, 1, 41, 1, 41, 4, 41, 268, 8, 41, 11, 41, 12, 41, 269, 1, - 41, 3, 41, 273, 8, 41, 3, 41, 275, 8, 41, 1, 42, 4, 42, 278, 8, 42, 11, - 42, 12, 42, 279, 1, 42, 1, 42, 1, 42, 1, 42, 4, 42, 286, 8, 42, 11, 42, - 12, 42, 287, 3, 42, 290, 8, 42, 1, 43, 4, 43, 293, 8, 43, 11, 43, 12, 43, - 294, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 303, 8, 43, 11, 43, - 12, 43, 304, 1, 43, 1, 43, 3, 43, 309, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, - 314, 8, 44, 10, 44, 12, 44, 317, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, - 44, 323, 8, 44, 10, 44, 12, 44, 326, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, - 1, 44, 1, 44, 1, 44, 5, 44, 335, 8, 44, 10, 44, 12, 44, 338, 9, 44, 1, - 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 349, - 8, 44, 10, 44, 12, 44, 352, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, - 44, 5, 44, 360, 8, 44, 10, 44, 12, 44, 363, 9, 44, 1, 44, 1, 44, 1, 44, - 1, 44, 1, 44, 5, 44, 370, 8, 44, 10, 44, 12, 44, 373, 9, 44, 1, 44, 1, - 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 383, 8, 44, 10, 44, - 12, 44, 386, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, - 44, 1, 44, 1, 44, 5, 44, 398, 8, 44, 10, 44, 12, 44, 401, 9, 44, 1, 44, - 1, 44, 1, 44, 1, 44, 3, 44, 407, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, - 46, 3, 46, 414, 8, 46, 1, 46, 1, 46, 1, 46, 5, 46, 419, 8, 46, 10, 46, - 12, 46, 422, 9, 46, 4, 336, 350, 384, 399, 0, 47, 1, 1, 3, 2, 5, 3, 7, - 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, - 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, - 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 0, 59, 0, 61, 0, 63, 0, - 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 29, 81, 30, 83, 31, - 85, 32, 87, 33, 89, 34, 91, 35, 93, 36, 1, 0, 16, 2, 0, 65, 90, 97, 122, - 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, - 102, 2, 0, 82, 82, 114, 114, 10, 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, - 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 2, 0, 88, 88, 120, - 120, 3, 0, 9, 10, 12, 13, 32, 32, 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, - 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, - 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, - 39, 2, 0, 66, 66, 98, 98, 456, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, - 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, - 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, - 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, - 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, - 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, - 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, - 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, - 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, - 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, - 3, 98, 1, 0, 0, 0, 5, 101, 1, 0, 0, 0, 7, 104, 1, 0, 0, 0, 9, 106, 1, 0, - 0, 0, 11, 109, 1, 0, 0, 0, 13, 112, 1, 0, 0, 0, 15, 114, 1, 0, 0, 0, 17, - 117, 1, 0, 0, 0, 19, 120, 1, 0, 0, 0, 21, 122, 1, 0, 0, 0, 23, 124, 1, - 0, 0, 0, 25, 126, 1, 0, 0, 0, 27, 128, 1, 0, 0, 0, 29, 130, 1, 0, 0, 0, - 31, 132, 1, 0, 0, 0, 33, 134, 1, 0, 0, 0, 35, 136, 1, 0, 0, 0, 37, 138, - 1, 0, 0, 0, 39, 140, 1, 0, 0, 0, 41, 142, 1, 0, 0, 0, 43, 144, 1, 0, 0, - 0, 45, 146, 1, 0, 0, 0, 47, 148, 1, 0, 0, 0, 49, 150, 1, 0, 0, 0, 51, 152, - 1, 0, 0, 0, 53, 157, 1, 0, 0, 0, 55, 163, 1, 0, 0, 0, 57, 168, 1, 0, 0, - 0, 59, 170, 1, 0, 0, 0, 61, 172, 1, 0, 0, 0, 63, 174, 1, 0, 0, 0, 65, 183, - 1, 0, 0, 0, 67, 185, 1, 0, 0, 0, 69, 191, 1, 0, 0, 0, 71, 193, 1, 0, 0, - 0, 73, 196, 1, 0, 0, 0, 75, 201, 1, 0, 0, 0, 77, 224, 1, 0, 0, 0, 79, 227, - 1, 0, 0, 0, 81, 233, 1, 0, 0, 0, 83, 274, 1, 0, 0, 0, 85, 289, 1, 0, 0, - 0, 87, 308, 1, 0, 0, 0, 89, 406, 1, 0, 0, 0, 91, 408, 1, 0, 0, 0, 93, 413, - 1, 0, 0, 0, 95, 96, 5, 61, 0, 0, 96, 97, 5, 61, 0, 0, 97, 2, 1, 0, 0, 0, - 98, 99, 5, 33, 0, 0, 99, 100, 5, 61, 0, 0, 100, 4, 1, 0, 0, 0, 101, 102, - 5, 105, 0, 0, 102, 103, 5, 110, 0, 0, 103, 6, 1, 0, 0, 0, 104, 105, 5, - 60, 0, 0, 105, 8, 1, 0, 0, 0, 106, 107, 5, 60, 0, 0, 107, 108, 5, 61, 0, - 0, 108, 10, 1, 0, 0, 0, 109, 110, 5, 62, 0, 0, 110, 111, 5, 61, 0, 0, 111, - 12, 1, 0, 0, 0, 112, 113, 5, 62, 0, 0, 113, 14, 1, 0, 0, 0, 114, 115, 5, - 38, 0, 0, 115, 116, 5, 38, 0, 0, 116, 16, 1, 0, 0, 0, 117, 118, 5, 124, - 0, 0, 118, 119, 5, 124, 0, 0, 119, 18, 1, 0, 0, 0, 120, 121, 5, 91, 0, - 0, 121, 20, 1, 0, 0, 0, 122, 123, 5, 93, 0, 0, 123, 22, 1, 0, 0, 0, 124, - 125, 5, 123, 0, 0, 125, 24, 1, 0, 0, 0, 126, 127, 5, 125, 0, 0, 127, 26, - 1, 0, 0, 0, 128, 129, 5, 40, 0, 0, 129, 28, 1, 0, 0, 0, 130, 131, 5, 41, - 0, 0, 131, 30, 1, 0, 0, 0, 132, 133, 5, 46, 0, 0, 133, 32, 1, 0, 0, 0, - 134, 135, 5, 44, 0, 0, 135, 34, 1, 0, 0, 0, 136, 137, 5, 45, 0, 0, 137, - 36, 1, 0, 0, 0, 138, 139, 5, 33, 0, 0, 139, 38, 1, 0, 0, 0, 140, 141, 5, - 63, 0, 0, 141, 40, 1, 0, 0, 0, 142, 143, 5, 58, 0, 0, 143, 42, 1, 0, 0, - 0, 144, 145, 5, 43, 0, 0, 145, 44, 1, 0, 0, 0, 146, 147, 5, 42, 0, 0, 147, - 46, 1, 0, 0, 0, 148, 149, 5, 47, 0, 0, 149, 48, 1, 0, 0, 0, 150, 151, 5, - 37, 0, 0, 151, 50, 1, 0, 0, 0, 152, 153, 5, 116, 0, 0, 153, 154, 5, 114, - 0, 0, 154, 155, 5, 117, 0, 0, 155, 156, 5, 101, 0, 0, 156, 52, 1, 0, 0, - 0, 157, 158, 5, 102, 0, 0, 158, 159, 5, 97, 0, 0, 159, 160, 5, 108, 0, - 0, 160, 161, 5, 115, 0, 0, 161, 162, 5, 101, 0, 0, 162, 54, 1, 0, 0, 0, - 163, 164, 5, 110, 0, 0, 164, 165, 5, 117, 0, 0, 165, 166, 5, 108, 0, 0, - 166, 167, 5, 108, 0, 0, 167, 56, 1, 0, 0, 0, 168, 169, 5, 92, 0, 0, 169, - 58, 1, 0, 0, 0, 170, 171, 7, 0, 0, 0, 171, 60, 1, 0, 0, 0, 172, 173, 2, - 48, 57, 0, 173, 62, 1, 0, 0, 0, 174, 176, 7, 1, 0, 0, 175, 177, 7, 2, 0, - 0, 176, 175, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 179, 1, 0, 0, 0, 178, - 180, 3, 61, 30, 0, 179, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 179, - 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 64, 1, 0, 0, 0, 183, 184, 7, 3, - 0, 0, 184, 66, 1, 0, 0, 0, 185, 186, 7, 4, 0, 0, 186, 68, 1, 0, 0, 0, 187, - 192, 3, 71, 35, 0, 188, 192, 3, 75, 37, 0, 189, 192, 3, 77, 38, 0, 190, - 192, 3, 73, 36, 0, 191, 187, 1, 0, 0, 0, 191, 188, 1, 0, 0, 0, 191, 189, - 1, 0, 0, 0, 191, 190, 1, 0, 0, 0, 192, 70, 1, 0, 0, 0, 193, 194, 3, 57, - 28, 0, 194, 195, 7, 5, 0, 0, 195, 72, 1, 0, 0, 0, 196, 197, 3, 57, 28, - 0, 197, 198, 2, 48, 51, 0, 198, 199, 2, 48, 55, 0, 199, 200, 2, 48, 55, - 0, 200, 74, 1, 0, 0, 0, 201, 202, 3, 57, 28, 0, 202, 203, 7, 6, 0, 0, 203, - 204, 3, 65, 32, 0, 204, 205, 3, 65, 32, 0, 205, 76, 1, 0, 0, 0, 206, 207, - 3, 57, 28, 0, 207, 208, 5, 117, 0, 0, 208, 209, 3, 65, 32, 0, 209, 210, - 3, 65, 32, 0, 210, 211, 3, 65, 32, 0, 211, 212, 3, 65, 32, 0, 212, 225, - 1, 0, 0, 0, 213, 214, 3, 57, 28, 0, 214, 215, 5, 85, 0, 0, 215, 216, 3, - 65, 32, 0, 216, 217, 3, 65, 32, 0, 217, 218, 3, 65, 32, 0, 218, 219, 3, - 65, 32, 0, 219, 220, 3, 65, 32, 0, 220, 221, 3, 65, 32, 0, 221, 222, 3, - 65, 32, 0, 222, 223, 3, 65, 32, 0, 223, 225, 1, 0, 0, 0, 224, 206, 1, 0, - 0, 0, 224, 213, 1, 0, 0, 0, 225, 78, 1, 0, 0, 0, 226, 228, 7, 7, 0, 0, - 227, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 227, 1, 0, 0, 0, 229, - 230, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 232, 6, 39, 0, 0, 232, 80, - 1, 0, 0, 0, 233, 234, 5, 47, 0, 0, 234, 235, 5, 47, 0, 0, 235, 239, 1, - 0, 0, 0, 236, 238, 8, 8, 0, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, - 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, - 239, 1, 0, 0, 0, 242, 243, 6, 40, 0, 0, 243, 82, 1, 0, 0, 0, 244, 246, - 3, 61, 30, 0, 245, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 245, 1, - 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 251, 5, 46, 0, - 0, 250, 252, 3, 61, 30, 0, 251, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, - 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, - 257, 3, 63, 31, 0, 256, 255, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 275, - 1, 0, 0, 0, 258, 260, 3, 61, 30, 0, 259, 258, 1, 0, 0, 0, 260, 261, 1, - 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 263, 1, 0, 0, - 0, 263, 264, 3, 63, 31, 0, 264, 275, 1, 0, 0, 0, 265, 267, 5, 46, 0, 0, - 266, 268, 3, 61, 30, 0, 267, 266, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, - 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 272, 1, 0, 0, 0, 271, 273, - 3, 63, 31, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 275, 1, - 0, 0, 0, 274, 245, 1, 0, 0, 0, 274, 259, 1, 0, 0, 0, 274, 265, 1, 0, 0, - 0, 275, 84, 1, 0, 0, 0, 276, 278, 3, 61, 30, 0, 277, 276, 1, 0, 0, 0, 278, - 279, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 290, - 1, 0, 0, 0, 281, 282, 5, 48, 0, 0, 282, 283, 5, 120, 0, 0, 283, 285, 1, - 0, 0, 0, 284, 286, 3, 65, 32, 0, 285, 284, 1, 0, 0, 0, 286, 287, 1, 0, - 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, - 289, 277, 1, 0, 0, 0, 289, 281, 1, 0, 0, 0, 290, 86, 1, 0, 0, 0, 291, 293, - 3, 61, 30, 0, 292, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 292, 1, - 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 7, 9, 0, - 0, 297, 309, 1, 0, 0, 0, 298, 299, 5, 48, 0, 0, 299, 300, 5, 120, 0, 0, - 300, 302, 1, 0, 0, 0, 301, 303, 3, 65, 32, 0, 302, 301, 1, 0, 0, 0, 303, - 304, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, - 1, 0, 0, 0, 306, 307, 7, 9, 0, 0, 307, 309, 1, 0, 0, 0, 308, 292, 1, 0, - 0, 0, 308, 298, 1, 0, 0, 0, 309, 88, 1, 0, 0, 0, 310, 315, 5, 34, 0, 0, - 311, 314, 3, 69, 34, 0, 312, 314, 8, 10, 0, 0, 313, 311, 1, 0, 0, 0, 313, - 312, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, - 1, 0, 0, 0, 316, 318, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 407, 5, 34, - 0, 0, 319, 324, 5, 39, 0, 0, 320, 323, 3, 69, 34, 0, 321, 323, 8, 11, 0, - 0, 322, 320, 1, 0, 0, 0, 322, 321, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, - 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 1, 0, 0, 0, 326, 324, - 1, 0, 0, 0, 327, 407, 5, 39, 0, 0, 328, 329, 5, 34, 0, 0, 329, 330, 5, - 34, 0, 0, 330, 331, 5, 34, 0, 0, 331, 336, 1, 0, 0, 0, 332, 335, 3, 69, - 34, 0, 333, 335, 8, 12, 0, 0, 334, 332, 1, 0, 0, 0, 334, 333, 1, 0, 0, - 0, 335, 338, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, - 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 34, 0, 0, 340, 341, - 5, 34, 0, 0, 341, 407, 5, 34, 0, 0, 342, 343, 5, 39, 0, 0, 343, 344, 5, - 39, 0, 0, 344, 345, 5, 39, 0, 0, 345, 350, 1, 0, 0, 0, 346, 349, 3, 69, - 34, 0, 347, 349, 8, 12, 0, 0, 348, 346, 1, 0, 0, 0, 348, 347, 1, 0, 0, - 0, 349, 352, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 351, - 353, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 354, 5, 39, 0, 0, 354, 355, - 5, 39, 0, 0, 355, 407, 5, 39, 0, 0, 356, 357, 3, 67, 33, 0, 357, 361, 5, - 34, 0, 0, 358, 360, 8, 13, 0, 0, 359, 358, 1, 0, 0, 0, 360, 363, 1, 0, - 0, 0, 361, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 364, 1, 0, 0, 0, - 363, 361, 1, 0, 0, 0, 364, 365, 5, 34, 0, 0, 365, 407, 1, 0, 0, 0, 366, - 367, 3, 67, 33, 0, 367, 371, 5, 39, 0, 0, 368, 370, 8, 14, 0, 0, 369, 368, - 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, - 0, 0, 372, 374, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 39, 0, 0, - 375, 407, 1, 0, 0, 0, 376, 377, 3, 67, 33, 0, 377, 378, 5, 34, 0, 0, 378, - 379, 5, 34, 0, 0, 379, 380, 5, 34, 0, 0, 380, 384, 1, 0, 0, 0, 381, 383, - 9, 0, 0, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 385, 1, 0, - 0, 0, 384, 382, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, - 387, 388, 5, 34, 0, 0, 388, 389, 5, 34, 0, 0, 389, 390, 5, 34, 0, 0, 390, - 407, 1, 0, 0, 0, 391, 392, 3, 67, 33, 0, 392, 393, 5, 39, 0, 0, 393, 394, - 5, 39, 0, 0, 394, 395, 5, 39, 0, 0, 395, 399, 1, 0, 0, 0, 396, 398, 9, - 0, 0, 0, 397, 396, 1, 0, 0, 0, 398, 401, 1, 0, 0, 0, 399, 400, 1, 0, 0, - 0, 399, 397, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, - 403, 5, 39, 0, 0, 403, 404, 5, 39, 0, 0, 404, 405, 5, 39, 0, 0, 405, 407, - 1, 0, 0, 0, 406, 310, 1, 0, 0, 0, 406, 319, 1, 0, 0, 0, 406, 328, 1, 0, - 0, 0, 406, 342, 1, 0, 0, 0, 406, 356, 1, 0, 0, 0, 406, 366, 1, 0, 0, 0, - 406, 376, 1, 0, 0, 0, 406, 391, 1, 0, 0, 0, 407, 90, 1, 0, 0, 0, 408, 409, - 7, 15, 0, 0, 409, 410, 3, 89, 44, 0, 410, 92, 1, 0, 0, 0, 411, 414, 3, - 59, 29, 0, 412, 414, 5, 95, 0, 0, 413, 411, 1, 0, 0, 0, 413, 412, 1, 0, - 0, 0, 414, 420, 1, 0, 0, 0, 415, 419, 3, 59, 29, 0, 416, 419, 3, 61, 30, - 0, 417, 419, 5, 95, 0, 0, 418, 415, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, - 417, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, - 1, 0, 0, 0, 421, 94, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 36, 0, 176, 181, - 191, 224, 229, 239, 247, 253, 256, 261, 269, 272, 274, 279, 287, 289, 294, - 304, 308, 313, 315, 322, 324, 334, 336, 348, 350, 361, 371, 384, 399, 406, - 413, 418, 420, 1, 0, 1, 0, -} - deserializer := antlr.NewATNDeserializer(nil) - staticData.atn = deserializer.Deserialize(staticData.serializedATN) - atn := staticData.atn - staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) - decisionToDFA := staticData.decisionToDFA - for index, state := range atn.DecisionToState { - decisionToDFA[index] = antlr.NewDFA(state, index) - } + staticData := &CELLexerLexerStaticData + staticData.ChannelNames = []string{ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", + } + staticData.ModeNames = []string{ + "DEFAULT_MODE", + } + staticData.LiteralNames = []string{ + "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", + "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", + "'?'", "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", + } + staticData.SymbolicNames = []string{ + "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", + "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", + "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", + "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", + "NUL", "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", + "STRING", "BYTES", "IDENTIFIER", "ESC_IDENTIFIER", + } + staticData.RuleNames = []string{ + "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", + "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", + "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", + "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", + "NUL", "BACKSLASH", "LETTER", "DIGIT", "EXPONENT", "HEXDIGIT", "RAW", + "ESC_SEQ", "ESC_CHAR_SEQ", "ESC_OCT_SEQ", "ESC_BYTE_SEQ", "ESC_UNI_SEQ", + "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", "STRING", + "BYTES", "IDENTIFIER", "ESC_IDENTIFIER", + } + staticData.PredictionContextCache = antlr.NewPredictionContextCache() + staticData.serializedATN = []int32{ + 4, 0, 37, 435, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, + 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, + 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, + 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, + 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, + 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, + 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, + 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, + 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, + 2, 47, 7, 47, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, + 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, + 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, + 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, + 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, + 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, + 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, + 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 179, 8, 31, 1, 31, + 4, 31, 182, 8, 31, 11, 31, 12, 31, 183, 1, 32, 1, 32, 1, 33, 1, 33, 1, + 34, 1, 34, 1, 34, 1, 34, 3, 34, 194, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, + 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, + 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, + 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 227, 8, 38, 1, 39, 4, + 39, 230, 8, 39, 11, 39, 12, 39, 231, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, + 1, 40, 5, 40, 240, 8, 40, 10, 40, 12, 40, 243, 9, 40, 1, 40, 1, 40, 1, + 41, 4, 41, 248, 8, 41, 11, 41, 12, 41, 249, 1, 41, 1, 41, 4, 41, 254, 8, + 41, 11, 41, 12, 41, 255, 1, 41, 3, 41, 259, 8, 41, 1, 41, 4, 41, 262, 8, + 41, 11, 41, 12, 41, 263, 1, 41, 1, 41, 1, 41, 1, 41, 4, 41, 270, 8, 41, + 11, 41, 12, 41, 271, 1, 41, 3, 41, 275, 8, 41, 3, 41, 277, 8, 41, 1, 42, + 4, 42, 280, 8, 42, 11, 42, 12, 42, 281, 1, 42, 1, 42, 1, 42, 1, 42, 4, + 42, 288, 8, 42, 11, 42, 12, 42, 289, 3, 42, 292, 8, 42, 1, 43, 4, 43, 295, + 8, 43, 11, 43, 12, 43, 296, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, + 43, 305, 8, 43, 11, 43, 12, 43, 306, 1, 43, 1, 43, 3, 43, 311, 8, 43, 1, + 44, 1, 44, 1, 44, 5, 44, 316, 8, 44, 10, 44, 12, 44, 319, 9, 44, 1, 44, + 1, 44, 1, 44, 1, 44, 5, 44, 325, 8, 44, 10, 44, 12, 44, 328, 9, 44, 1, + 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 337, 8, 44, 10, 44, + 12, 44, 340, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, + 44, 1, 44, 5, 44, 351, 8, 44, 10, 44, 12, 44, 354, 9, 44, 1, 44, 1, 44, + 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 362, 8, 44, 10, 44, 12, 44, 365, 9, + 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 372, 8, 44, 10, 44, 12, 44, + 375, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, + 44, 385, 8, 44, 10, 44, 12, 44, 388, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, + 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 400, 8, 44, 10, 44, 12, + 44, 403, 9, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 409, 8, 44, 1, 45, 1, + 45, 1, 45, 1, 46, 1, 46, 3, 46, 416, 8, 46, 1, 46, 1, 46, 1, 46, 5, 46, + 421, 8, 46, 10, 46, 12, 46, 424, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 4, + 47, 430, 8, 47, 11, 47, 12, 47, 431, 1, 47, 1, 47, 4, 338, 352, 386, 401, + 0, 48, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, + 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, + 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, + 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, + 0, 79, 29, 81, 30, 83, 31, 85, 32, 87, 33, 89, 34, 91, 35, 93, 36, 95, + 37, 1, 0, 17, 2, 0, 65, 90, 97, 122, 2, 0, 69, 69, 101, 101, 2, 0, 43, + 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 82, 82, 114, 114, 10, + 0, 34, 34, 39, 39, 63, 63, 92, 92, 96, 98, 102, 102, 110, 110, 114, 114, + 116, 116, 118, 118, 2, 0, 88, 88, 120, 120, 3, 0, 9, 10, 12, 13, 32, 32, + 1, 0, 10, 10, 2, 0, 85, 85, 117, 117, 4, 0, 10, 10, 13, 13, 34, 34, 92, + 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 1, 0, 92, 92, 3, 0, 10, 10, 13, + 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 66, 66, 98, 98, 3, 0, 32, + 32, 45, 47, 95, 95, 471, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, + 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, + 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, + 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, + 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, + 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, + 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, + 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, + 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, + 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 1, + 97, 1, 0, 0, 0, 3, 100, 1, 0, 0, 0, 5, 103, 1, 0, 0, 0, 7, 106, 1, 0, 0, + 0, 9, 108, 1, 0, 0, 0, 11, 111, 1, 0, 0, 0, 13, 114, 1, 0, 0, 0, 15, 116, + 1, 0, 0, 0, 17, 119, 1, 0, 0, 0, 19, 122, 1, 0, 0, 0, 21, 124, 1, 0, 0, + 0, 23, 126, 1, 0, 0, 0, 25, 128, 1, 0, 0, 0, 27, 130, 1, 0, 0, 0, 29, 132, + 1, 0, 0, 0, 31, 134, 1, 0, 0, 0, 33, 136, 1, 0, 0, 0, 35, 138, 1, 0, 0, + 0, 37, 140, 1, 0, 0, 0, 39, 142, 1, 0, 0, 0, 41, 144, 1, 0, 0, 0, 43, 146, + 1, 0, 0, 0, 45, 148, 1, 0, 0, 0, 47, 150, 1, 0, 0, 0, 49, 152, 1, 0, 0, + 0, 51, 154, 1, 0, 0, 0, 53, 159, 1, 0, 0, 0, 55, 165, 1, 0, 0, 0, 57, 170, + 1, 0, 0, 0, 59, 172, 1, 0, 0, 0, 61, 174, 1, 0, 0, 0, 63, 176, 1, 0, 0, + 0, 65, 185, 1, 0, 0, 0, 67, 187, 1, 0, 0, 0, 69, 193, 1, 0, 0, 0, 71, 195, + 1, 0, 0, 0, 73, 198, 1, 0, 0, 0, 75, 203, 1, 0, 0, 0, 77, 226, 1, 0, 0, + 0, 79, 229, 1, 0, 0, 0, 81, 235, 1, 0, 0, 0, 83, 276, 1, 0, 0, 0, 85, 291, + 1, 0, 0, 0, 87, 310, 1, 0, 0, 0, 89, 408, 1, 0, 0, 0, 91, 410, 1, 0, 0, + 0, 93, 415, 1, 0, 0, 0, 95, 425, 1, 0, 0, 0, 97, 98, 5, 61, 0, 0, 98, 99, + 5, 61, 0, 0, 99, 2, 1, 0, 0, 0, 100, 101, 5, 33, 0, 0, 101, 102, 5, 61, + 0, 0, 102, 4, 1, 0, 0, 0, 103, 104, 5, 105, 0, 0, 104, 105, 5, 110, 0, + 0, 105, 6, 1, 0, 0, 0, 106, 107, 5, 60, 0, 0, 107, 8, 1, 0, 0, 0, 108, + 109, 5, 60, 0, 0, 109, 110, 5, 61, 0, 0, 110, 10, 1, 0, 0, 0, 111, 112, + 5, 62, 0, 0, 112, 113, 5, 61, 0, 0, 113, 12, 1, 0, 0, 0, 114, 115, 5, 62, + 0, 0, 115, 14, 1, 0, 0, 0, 116, 117, 5, 38, 0, 0, 117, 118, 5, 38, 0, 0, + 118, 16, 1, 0, 0, 0, 119, 120, 5, 124, 0, 0, 120, 121, 5, 124, 0, 0, 121, + 18, 1, 0, 0, 0, 122, 123, 5, 91, 0, 0, 123, 20, 1, 0, 0, 0, 124, 125, 5, + 93, 0, 0, 125, 22, 1, 0, 0, 0, 126, 127, 5, 123, 0, 0, 127, 24, 1, 0, 0, + 0, 128, 129, 5, 125, 0, 0, 129, 26, 1, 0, 0, 0, 130, 131, 5, 40, 0, 0, + 131, 28, 1, 0, 0, 0, 132, 133, 5, 41, 0, 0, 133, 30, 1, 0, 0, 0, 134, 135, + 5, 46, 0, 0, 135, 32, 1, 0, 0, 0, 136, 137, 5, 44, 0, 0, 137, 34, 1, 0, + 0, 0, 138, 139, 5, 45, 0, 0, 139, 36, 1, 0, 0, 0, 140, 141, 5, 33, 0, 0, + 141, 38, 1, 0, 0, 0, 142, 143, 5, 63, 0, 0, 143, 40, 1, 0, 0, 0, 144, 145, + 5, 58, 0, 0, 145, 42, 1, 0, 0, 0, 146, 147, 5, 43, 0, 0, 147, 44, 1, 0, + 0, 0, 148, 149, 5, 42, 0, 0, 149, 46, 1, 0, 0, 0, 150, 151, 5, 47, 0, 0, + 151, 48, 1, 0, 0, 0, 152, 153, 5, 37, 0, 0, 153, 50, 1, 0, 0, 0, 154, 155, + 5, 116, 0, 0, 155, 156, 5, 114, 0, 0, 156, 157, 5, 117, 0, 0, 157, 158, + 5, 101, 0, 0, 158, 52, 1, 0, 0, 0, 159, 160, 5, 102, 0, 0, 160, 161, 5, + 97, 0, 0, 161, 162, 5, 108, 0, 0, 162, 163, 5, 115, 0, 0, 163, 164, 5, + 101, 0, 0, 164, 54, 1, 0, 0, 0, 165, 166, 5, 110, 0, 0, 166, 167, 5, 117, + 0, 0, 167, 168, 5, 108, 0, 0, 168, 169, 5, 108, 0, 0, 169, 56, 1, 0, 0, + 0, 170, 171, 5, 92, 0, 0, 171, 58, 1, 0, 0, 0, 172, 173, 7, 0, 0, 0, 173, + 60, 1, 0, 0, 0, 174, 175, 2, 48, 57, 0, 175, 62, 1, 0, 0, 0, 176, 178, + 7, 1, 0, 0, 177, 179, 7, 2, 0, 0, 178, 177, 1, 0, 0, 0, 178, 179, 1, 0, + 0, 0, 179, 181, 1, 0, 0, 0, 180, 182, 3, 61, 30, 0, 181, 180, 1, 0, 0, + 0, 182, 183, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, + 64, 1, 0, 0, 0, 185, 186, 7, 3, 0, 0, 186, 66, 1, 0, 0, 0, 187, 188, 7, + 4, 0, 0, 188, 68, 1, 0, 0, 0, 189, 194, 3, 71, 35, 0, 190, 194, 3, 75, + 37, 0, 191, 194, 3, 77, 38, 0, 192, 194, 3, 73, 36, 0, 193, 189, 1, 0, + 0, 0, 193, 190, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 193, 192, 1, 0, 0, 0, + 194, 70, 1, 0, 0, 0, 195, 196, 3, 57, 28, 0, 196, 197, 7, 5, 0, 0, 197, + 72, 1, 0, 0, 0, 198, 199, 3, 57, 28, 0, 199, 200, 2, 48, 51, 0, 200, 201, + 2, 48, 55, 0, 201, 202, 2, 48, 55, 0, 202, 74, 1, 0, 0, 0, 203, 204, 3, + 57, 28, 0, 204, 205, 7, 6, 0, 0, 205, 206, 3, 65, 32, 0, 206, 207, 3, 65, + 32, 0, 207, 76, 1, 0, 0, 0, 208, 209, 3, 57, 28, 0, 209, 210, 5, 117, 0, + 0, 210, 211, 3, 65, 32, 0, 211, 212, 3, 65, 32, 0, 212, 213, 3, 65, 32, + 0, 213, 214, 3, 65, 32, 0, 214, 227, 1, 0, 0, 0, 215, 216, 3, 57, 28, 0, + 216, 217, 5, 85, 0, 0, 217, 218, 3, 65, 32, 0, 218, 219, 3, 65, 32, 0, + 219, 220, 3, 65, 32, 0, 220, 221, 3, 65, 32, 0, 221, 222, 3, 65, 32, 0, + 222, 223, 3, 65, 32, 0, 223, 224, 3, 65, 32, 0, 224, 225, 3, 65, 32, 0, + 225, 227, 1, 0, 0, 0, 226, 208, 1, 0, 0, 0, 226, 215, 1, 0, 0, 0, 227, + 78, 1, 0, 0, 0, 228, 230, 7, 7, 0, 0, 229, 228, 1, 0, 0, 0, 230, 231, 1, + 0, 0, 0, 231, 229, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 233, 1, 0, 0, + 0, 233, 234, 6, 39, 0, 0, 234, 80, 1, 0, 0, 0, 235, 236, 5, 47, 0, 0, 236, + 237, 5, 47, 0, 0, 237, 241, 1, 0, 0, 0, 238, 240, 8, 8, 0, 0, 239, 238, + 1, 0, 0, 0, 240, 243, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 241, 242, 1, 0, + 0, 0, 242, 244, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 244, 245, 6, 40, 0, 0, + 245, 82, 1, 0, 0, 0, 246, 248, 3, 61, 30, 0, 247, 246, 1, 0, 0, 0, 248, + 249, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 251, + 1, 0, 0, 0, 251, 253, 5, 46, 0, 0, 252, 254, 3, 61, 30, 0, 253, 252, 1, + 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, + 0, 256, 258, 1, 0, 0, 0, 257, 259, 3, 63, 31, 0, 258, 257, 1, 0, 0, 0, + 258, 259, 1, 0, 0, 0, 259, 277, 1, 0, 0, 0, 260, 262, 3, 61, 30, 0, 261, + 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, + 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 3, 63, 31, 0, 266, 277, 1, + 0, 0, 0, 267, 269, 5, 46, 0, 0, 268, 270, 3, 61, 30, 0, 269, 268, 1, 0, + 0, 0, 270, 271, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, + 272, 274, 1, 0, 0, 0, 273, 275, 3, 63, 31, 0, 274, 273, 1, 0, 0, 0, 274, + 275, 1, 0, 0, 0, 275, 277, 1, 0, 0, 0, 276, 247, 1, 0, 0, 0, 276, 261, + 1, 0, 0, 0, 276, 267, 1, 0, 0, 0, 277, 84, 1, 0, 0, 0, 278, 280, 3, 61, + 30, 0, 279, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, + 281, 282, 1, 0, 0, 0, 282, 292, 1, 0, 0, 0, 283, 284, 5, 48, 0, 0, 284, + 285, 5, 120, 0, 0, 285, 287, 1, 0, 0, 0, 286, 288, 3, 65, 32, 0, 287, 286, + 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 290, 1, 0, + 0, 0, 290, 292, 1, 0, 0, 0, 291, 279, 1, 0, 0, 0, 291, 283, 1, 0, 0, 0, + 292, 86, 1, 0, 0, 0, 293, 295, 3, 61, 30, 0, 294, 293, 1, 0, 0, 0, 295, + 296, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 298, + 1, 0, 0, 0, 298, 299, 7, 9, 0, 0, 299, 311, 1, 0, 0, 0, 300, 301, 5, 48, + 0, 0, 301, 302, 5, 120, 0, 0, 302, 304, 1, 0, 0, 0, 303, 305, 3, 65, 32, + 0, 304, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, + 307, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 309, 7, 9, 0, 0, 309, 311, + 1, 0, 0, 0, 310, 294, 1, 0, 0, 0, 310, 300, 1, 0, 0, 0, 311, 88, 1, 0, + 0, 0, 312, 317, 5, 34, 0, 0, 313, 316, 3, 69, 34, 0, 314, 316, 8, 10, 0, + 0, 315, 313, 1, 0, 0, 0, 315, 314, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, + 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 320, 1, 0, 0, 0, 319, 317, + 1, 0, 0, 0, 320, 409, 5, 34, 0, 0, 321, 326, 5, 39, 0, 0, 322, 325, 3, + 69, 34, 0, 323, 325, 8, 11, 0, 0, 324, 322, 1, 0, 0, 0, 324, 323, 1, 0, + 0, 0, 325, 328, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, + 327, 329, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 329, 409, 5, 39, 0, 0, 330, + 331, 5, 34, 0, 0, 331, 332, 5, 34, 0, 0, 332, 333, 5, 34, 0, 0, 333, 338, + 1, 0, 0, 0, 334, 337, 3, 69, 34, 0, 335, 337, 8, 12, 0, 0, 336, 334, 1, + 0, 0, 0, 336, 335, 1, 0, 0, 0, 337, 340, 1, 0, 0, 0, 338, 339, 1, 0, 0, + 0, 338, 336, 1, 0, 0, 0, 339, 341, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 341, + 342, 5, 34, 0, 0, 342, 343, 5, 34, 0, 0, 343, 409, 5, 34, 0, 0, 344, 345, + 5, 39, 0, 0, 345, 346, 5, 39, 0, 0, 346, 347, 5, 39, 0, 0, 347, 352, 1, + 0, 0, 0, 348, 351, 3, 69, 34, 0, 349, 351, 8, 12, 0, 0, 350, 348, 1, 0, + 0, 0, 350, 349, 1, 0, 0, 0, 351, 354, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, + 352, 350, 1, 0, 0, 0, 353, 355, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 355, + 356, 5, 39, 0, 0, 356, 357, 5, 39, 0, 0, 357, 409, 5, 39, 0, 0, 358, 359, + 3, 67, 33, 0, 359, 363, 5, 34, 0, 0, 360, 362, 8, 13, 0, 0, 361, 360, 1, + 0, 0, 0, 362, 365, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, + 0, 364, 366, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 366, 367, 5, 34, 0, 0, 367, + 409, 1, 0, 0, 0, 368, 369, 3, 67, 33, 0, 369, 373, 5, 39, 0, 0, 370, 372, + 8, 14, 0, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, + 0, 0, 373, 374, 1, 0, 0, 0, 374, 376, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, + 376, 377, 5, 39, 0, 0, 377, 409, 1, 0, 0, 0, 378, 379, 3, 67, 33, 0, 379, + 380, 5, 34, 0, 0, 380, 381, 5, 34, 0, 0, 381, 382, 5, 34, 0, 0, 382, 386, + 1, 0, 0, 0, 383, 385, 9, 0, 0, 0, 384, 383, 1, 0, 0, 0, 385, 388, 1, 0, + 0, 0, 386, 387, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 389, 1, 0, 0, 0, + 388, 386, 1, 0, 0, 0, 389, 390, 5, 34, 0, 0, 390, 391, 5, 34, 0, 0, 391, + 392, 5, 34, 0, 0, 392, 409, 1, 0, 0, 0, 393, 394, 3, 67, 33, 0, 394, 395, + 5, 39, 0, 0, 395, 396, 5, 39, 0, 0, 396, 397, 5, 39, 0, 0, 397, 401, 1, + 0, 0, 0, 398, 400, 9, 0, 0, 0, 399, 398, 1, 0, 0, 0, 400, 403, 1, 0, 0, + 0, 401, 402, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, 404, 1, 0, 0, 0, 403, + 401, 1, 0, 0, 0, 404, 405, 5, 39, 0, 0, 405, 406, 5, 39, 0, 0, 406, 407, + 5, 39, 0, 0, 407, 409, 1, 0, 0, 0, 408, 312, 1, 0, 0, 0, 408, 321, 1, 0, + 0, 0, 408, 330, 1, 0, 0, 0, 408, 344, 1, 0, 0, 0, 408, 358, 1, 0, 0, 0, + 408, 368, 1, 0, 0, 0, 408, 378, 1, 0, 0, 0, 408, 393, 1, 0, 0, 0, 409, + 90, 1, 0, 0, 0, 410, 411, 7, 15, 0, 0, 411, 412, 3, 89, 44, 0, 412, 92, + 1, 0, 0, 0, 413, 416, 3, 59, 29, 0, 414, 416, 5, 95, 0, 0, 415, 413, 1, + 0, 0, 0, 415, 414, 1, 0, 0, 0, 416, 422, 1, 0, 0, 0, 417, 421, 3, 59, 29, + 0, 418, 421, 3, 61, 30, 0, 419, 421, 5, 95, 0, 0, 420, 417, 1, 0, 0, 0, + 420, 418, 1, 0, 0, 0, 420, 419, 1, 0, 0, 0, 421, 424, 1, 0, 0, 0, 422, + 420, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 94, 1, 0, 0, 0, 424, 422, 1, + 0, 0, 0, 425, 429, 5, 96, 0, 0, 426, 430, 3, 59, 29, 0, 427, 430, 3, 61, + 30, 0, 428, 430, 7, 16, 0, 0, 429, 426, 1, 0, 0, 0, 429, 427, 1, 0, 0, + 0, 429, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 431, + 432, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 5, 96, 0, 0, 434, 96, + 1, 0, 0, 0, 38, 0, 178, 183, 193, 226, 231, 241, 249, 255, 258, 263, 271, + 274, 276, 281, 289, 291, 296, 306, 310, 315, 317, 324, 326, 336, 338, 350, + 352, 363, 373, 386, 401, 408, 415, 420, 422, 429, 431, 1, 0, 1, 0, + } + deserializer := antlr.NewATNDeserializer(nil) + staticData.atn = deserializer.Deserialize(staticData.serializedATN) + atn := staticData.atn + staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) + decisionToDFA := staticData.decisionToDFA + for index, state := range atn.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(state, index) + } } // CELLexerInit initializes any static state used to implement CELLexer. By default the @@ -280,16 +287,16 @@ func cellexerLexerInit() { // NewCELLexer(). You can call this function if you wish to initialize the static state ahead // of time. func CELLexerInit() { - staticData := &CELLexerLexerStaticData - staticData.once.Do(cellexerLexerInit) + staticData := &CELLexerLexerStaticData + staticData.once.Do(cellexerLexerInit) } // NewCELLexer produces a new lexer instance for the optional input antlr.CharStream. func NewCELLexer(input antlr.CharStream) *CELLexer { - CELLexerInit() + CELLexerInit() l := new(CELLexer) l.BaseLexer = antlr.NewBaseLexer(input) - staticData := &CELLexerLexerStaticData + staticData := &CELLexerLexerStaticData l.Interpreter = antlr.NewLexerATNSimulator(l, staticData.atn, staticData.decisionToDFA, staticData.PredictionContextCache) l.channelNames = staticData.ChannelNames l.modeNames = staticData.ModeNames @@ -304,41 +311,41 @@ func NewCELLexer(input antlr.CharStream) *CELLexer { // CELLexer tokens. const ( - CELLexerEQUALS = 1 - CELLexerNOT_EQUALS = 2 - CELLexerIN = 3 - CELLexerLESS = 4 - CELLexerLESS_EQUALS = 5 + CELLexerEQUALS = 1 + CELLexerNOT_EQUALS = 2 + CELLexerIN = 3 + CELLexerLESS = 4 + CELLexerLESS_EQUALS = 5 CELLexerGREATER_EQUALS = 6 - CELLexerGREATER = 7 - CELLexerLOGICAL_AND = 8 - CELLexerLOGICAL_OR = 9 - CELLexerLBRACKET = 10 - CELLexerRPRACKET = 11 - CELLexerLBRACE = 12 - CELLexerRBRACE = 13 - CELLexerLPAREN = 14 - CELLexerRPAREN = 15 - CELLexerDOT = 16 - CELLexerCOMMA = 17 - CELLexerMINUS = 18 - CELLexerEXCLAM = 19 - CELLexerQUESTIONMARK = 20 - CELLexerCOLON = 21 - CELLexerPLUS = 22 - CELLexerSTAR = 23 - CELLexerSLASH = 24 - CELLexerPERCENT = 25 - CELLexerCEL_TRUE = 26 - CELLexerCEL_FALSE = 27 - CELLexerNUL = 28 - CELLexerWHITESPACE = 29 - CELLexerCOMMENT = 30 - CELLexerNUM_FLOAT = 31 - CELLexerNUM_INT = 32 - CELLexerNUM_UINT = 33 - CELLexerSTRING = 34 - CELLexerBYTES = 35 - CELLexerIDENTIFIER = 36 + CELLexerGREATER = 7 + CELLexerLOGICAL_AND = 8 + CELLexerLOGICAL_OR = 9 + CELLexerLBRACKET = 10 + CELLexerRPRACKET = 11 + CELLexerLBRACE = 12 + CELLexerRBRACE = 13 + CELLexerLPAREN = 14 + CELLexerRPAREN = 15 + CELLexerDOT = 16 + CELLexerCOMMA = 17 + CELLexerMINUS = 18 + CELLexerEXCLAM = 19 + CELLexerQUESTIONMARK = 20 + CELLexerCOLON = 21 + CELLexerPLUS = 22 + CELLexerSTAR = 23 + CELLexerSLASH = 24 + CELLexerPERCENT = 25 + CELLexerCEL_TRUE = 26 + CELLexerCEL_FALSE = 27 + CELLexerNUL = 28 + CELLexerWHITESPACE = 29 + CELLexerCOMMENT = 30 + CELLexerNUM_FLOAT = 31 + CELLexerNUM_INT = 32 + CELLexerNUM_UINT = 33 + CELLexerSTRING = 34 + CELLexerBYTES = 35 + CELLexerIDENTIFIER = 36 + CELLexerESC_IDENTIFIER = 37 ) - diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_listener.go b/vendor/github.com/google/cel-go/parser/gen/cel_listener.go index 22dc997898..da477c4b7f 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_listener.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_listener.go @@ -1,9 +1,8 @@ -// Code generated from /usr/local/google/home/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. +// Code generated from /usr/local/google/home/jdtatum/github/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. package gen // CEL import "github.com/antlr4-go/antlr/v4" - // CELListener is a complete listener for a parse tree produced by CELParser. type CELListener interface { antlr.ParseTreeListener @@ -47,8 +46,11 @@ type CELListener interface { // EnterIndex is called when entering the Index production. EnterIndex(c *IndexContext) - // EnterIdentOrGlobalCall is called when entering the IdentOrGlobalCall production. - EnterIdentOrGlobalCall(c *IdentOrGlobalCallContext) + // EnterIdent is called when entering the Ident production. + EnterIdent(c *IdentContext) + + // EnterGlobalCall is called when entering the GlobalCall production. + EnterGlobalCall(c *GlobalCallContext) // EnterNested is called when entering the Nested production. EnterNested(c *NestedContext) @@ -80,6 +82,12 @@ type CELListener interface { // EnterMapInitializerList is called when entering the mapInitializerList production. EnterMapInitializerList(c *MapInitializerListContext) + // EnterSimpleIdentifier is called when entering the SimpleIdentifier production. + EnterSimpleIdentifier(c *SimpleIdentifierContext) + + // EnterEscapedIdentifier is called when entering the EscapedIdentifier production. + EnterEscapedIdentifier(c *EscapedIdentifierContext) + // EnterOptExpr is called when entering the optExpr production. EnterOptExpr(c *OptExprContext) @@ -146,8 +154,11 @@ type CELListener interface { // ExitIndex is called when exiting the Index production. ExitIndex(c *IndexContext) - // ExitIdentOrGlobalCall is called when exiting the IdentOrGlobalCall production. - ExitIdentOrGlobalCall(c *IdentOrGlobalCallContext) + // ExitIdent is called when exiting the Ident production. + ExitIdent(c *IdentContext) + + // ExitGlobalCall is called when exiting the GlobalCall production. + ExitGlobalCall(c *GlobalCallContext) // ExitNested is called when exiting the Nested production. ExitNested(c *NestedContext) @@ -179,6 +190,12 @@ type CELListener interface { // ExitMapInitializerList is called when exiting the mapInitializerList production. ExitMapInitializerList(c *MapInitializerListContext) + // ExitSimpleIdentifier is called when exiting the SimpleIdentifier production. + ExitSimpleIdentifier(c *SimpleIdentifierContext) + + // ExitEscapedIdentifier is called when exiting the EscapedIdentifier production. + ExitEscapedIdentifier(c *EscapedIdentifierContext) + // ExitOptExpr is called when exiting the optExpr production. ExitOptExpr(c *OptExprContext) diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_parser.go b/vendor/github.com/google/cel-go/parser/gen/cel_parser.go index 35334af615..38693df58d 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_parser.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_parser.go @@ -1,10 +1,10 @@ -// Code generated from /usr/local/google/home/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. +// Code generated from /usr/local/google/home/jdtatum/github/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. package gen // CEL import ( "fmt" "strconv" - "sync" + "sync" "github.com/antlr4-go/antlr/v4" ) @@ -14,167 +14,170 @@ var _ = fmt.Printf var _ = strconv.Itoa var _ = sync.Once{} - type CELParser struct { *antlr.BaseParser } var CELParserStaticData struct { - once sync.Once - serializedATN []int32 - LiteralNames []string - SymbolicNames []string - RuleNames []string - PredictionContextCache *antlr.PredictionContextCache - atn *antlr.ATN - decisionToDFA []*antlr.DFA + once sync.Once + serializedATN []int32 + LiteralNames []string + SymbolicNames []string + RuleNames []string + PredictionContextCache *antlr.PredictionContextCache + atn *antlr.ATN + decisionToDFA []*antlr.DFA } func celParserInit() { - staticData := &CELParserStaticData - staticData.LiteralNames = []string{ - "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", - "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", - "'?'", "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", - } - staticData.SymbolicNames = []string{ - "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", - "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", - "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", - "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", - "NUL", "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", - "STRING", "BYTES", "IDENTIFIER", - } - staticData.RuleNames = []string{ - "start", "expr", "conditionalOr", "conditionalAnd", "relation", "calc", - "unary", "member", "primary", "exprList", "listInit", "fieldInitializerList", - "optField", "mapInitializerList", "optExpr", "literal", - } - staticData.PredictionContextCache = antlr.NewPredictionContextCache() - staticData.serializedATN = []int32{ - 4, 1, 36, 251, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, - 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, - 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, - 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 42, 8, 1, 1, - 2, 1, 2, 1, 2, 5, 2, 47, 8, 2, 10, 2, 12, 2, 50, 9, 2, 1, 3, 1, 3, 1, 3, - 5, 3, 55, 8, 3, 10, 3, 12, 3, 58, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, - 4, 5, 4, 66, 8, 4, 10, 4, 12, 4, 69, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, - 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 80, 8, 5, 10, 5, 12, 5, 83, 9, 5, 1, 6, 1, - 6, 4, 6, 87, 8, 6, 11, 6, 12, 6, 88, 1, 6, 1, 6, 4, 6, 93, 8, 6, 11, 6, - 12, 6, 94, 1, 6, 3, 6, 98, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, - 7, 106, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 114, 8, 7, 1, 7, - 1, 7, 1, 7, 1, 7, 3, 7, 120, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 125, 8, 7, 10, - 7, 12, 7, 128, 9, 7, 1, 8, 3, 8, 131, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 136, - 8, 8, 1, 8, 3, 8, 139, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, - 147, 8, 8, 1, 8, 3, 8, 150, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 155, 8, 8, 1, - 8, 3, 8, 158, 8, 8, 1, 8, 1, 8, 3, 8, 162, 8, 8, 1, 8, 1, 8, 1, 8, 5, 8, - 167, 8, 8, 10, 8, 12, 8, 170, 9, 8, 1, 8, 1, 8, 3, 8, 174, 8, 8, 1, 8, - 3, 8, 177, 8, 8, 1, 8, 1, 8, 3, 8, 181, 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 186, - 8, 9, 10, 9, 12, 9, 189, 9, 9, 1, 10, 1, 10, 1, 10, 5, 10, 194, 8, 10, - 10, 10, 12, 10, 197, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, - 11, 1, 11, 5, 11, 207, 8, 11, 10, 11, 12, 11, 210, 9, 11, 1, 12, 3, 12, - 213, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, - 13, 1, 13, 5, 13, 225, 8, 13, 10, 13, 12, 13, 228, 9, 13, 1, 14, 3, 14, - 231, 8, 14, 1, 14, 1, 14, 1, 15, 3, 15, 236, 8, 15, 1, 15, 1, 15, 1, 15, - 3, 15, 241, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 249, - 8, 15, 1, 15, 0, 3, 8, 10, 14, 16, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, - 22, 24, 26, 28, 30, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, - 281, 0, 32, 1, 0, 0, 0, 2, 35, 1, 0, 0, 0, 4, 43, 1, 0, 0, 0, 6, 51, 1, - 0, 0, 0, 8, 59, 1, 0, 0, 0, 10, 70, 1, 0, 0, 0, 12, 97, 1, 0, 0, 0, 14, - 99, 1, 0, 0, 0, 16, 180, 1, 0, 0, 0, 18, 182, 1, 0, 0, 0, 20, 190, 1, 0, - 0, 0, 22, 198, 1, 0, 0, 0, 24, 212, 1, 0, 0, 0, 26, 216, 1, 0, 0, 0, 28, - 230, 1, 0, 0, 0, 30, 248, 1, 0, 0, 0, 32, 33, 3, 2, 1, 0, 33, 34, 5, 0, - 0, 1, 34, 1, 1, 0, 0, 0, 35, 41, 3, 4, 2, 0, 36, 37, 5, 20, 0, 0, 37, 38, - 3, 4, 2, 0, 38, 39, 5, 21, 0, 0, 39, 40, 3, 2, 1, 0, 40, 42, 1, 0, 0, 0, - 41, 36, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 3, 1, 0, 0, 0, 43, 48, 3, 6, - 3, 0, 44, 45, 5, 9, 0, 0, 45, 47, 3, 6, 3, 0, 46, 44, 1, 0, 0, 0, 47, 50, - 1, 0, 0, 0, 48, 46, 1, 0, 0, 0, 48, 49, 1, 0, 0, 0, 49, 5, 1, 0, 0, 0, - 50, 48, 1, 0, 0, 0, 51, 56, 3, 8, 4, 0, 52, 53, 5, 8, 0, 0, 53, 55, 3, - 8, 4, 0, 54, 52, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, - 57, 1, 0, 0, 0, 57, 7, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 59, 60, 6, 4, -1, - 0, 60, 61, 3, 10, 5, 0, 61, 67, 1, 0, 0, 0, 62, 63, 10, 1, 0, 0, 63, 64, - 7, 0, 0, 0, 64, 66, 3, 8, 4, 2, 65, 62, 1, 0, 0, 0, 66, 69, 1, 0, 0, 0, - 67, 65, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 9, 1, 0, 0, 0, 69, 67, 1, 0, - 0, 0, 70, 71, 6, 5, -1, 0, 71, 72, 3, 12, 6, 0, 72, 81, 1, 0, 0, 0, 73, - 74, 10, 2, 0, 0, 74, 75, 7, 1, 0, 0, 75, 80, 3, 10, 5, 3, 76, 77, 10, 1, - 0, 0, 77, 78, 7, 2, 0, 0, 78, 80, 3, 10, 5, 2, 79, 73, 1, 0, 0, 0, 79, - 76, 1, 0, 0, 0, 80, 83, 1, 0, 0, 0, 81, 79, 1, 0, 0, 0, 81, 82, 1, 0, 0, - 0, 82, 11, 1, 0, 0, 0, 83, 81, 1, 0, 0, 0, 84, 98, 3, 14, 7, 0, 85, 87, - 5, 19, 0, 0, 86, 85, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, - 88, 89, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 98, 3, 14, 7, 0, 91, 93, 5, - 18, 0, 0, 92, 91, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 92, 1, 0, 0, 0, 94, - 95, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 98, 3, 14, 7, 0, 97, 84, 1, 0, - 0, 0, 97, 86, 1, 0, 0, 0, 97, 92, 1, 0, 0, 0, 98, 13, 1, 0, 0, 0, 99, 100, - 6, 7, -1, 0, 100, 101, 3, 16, 8, 0, 101, 126, 1, 0, 0, 0, 102, 103, 10, - 3, 0, 0, 103, 105, 5, 16, 0, 0, 104, 106, 5, 20, 0, 0, 105, 104, 1, 0, - 0, 0, 105, 106, 1, 0, 0, 0, 106, 107, 1, 0, 0, 0, 107, 125, 5, 36, 0, 0, - 108, 109, 10, 2, 0, 0, 109, 110, 5, 16, 0, 0, 110, 111, 5, 36, 0, 0, 111, - 113, 5, 14, 0, 0, 112, 114, 3, 18, 9, 0, 113, 112, 1, 0, 0, 0, 113, 114, - 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 125, 5, 15, 0, 0, 116, 117, 10, - 1, 0, 0, 117, 119, 5, 10, 0, 0, 118, 120, 5, 20, 0, 0, 119, 118, 1, 0, - 0, 0, 119, 120, 1, 0, 0, 0, 120, 121, 1, 0, 0, 0, 121, 122, 3, 2, 1, 0, - 122, 123, 5, 11, 0, 0, 123, 125, 1, 0, 0, 0, 124, 102, 1, 0, 0, 0, 124, - 108, 1, 0, 0, 0, 124, 116, 1, 0, 0, 0, 125, 128, 1, 0, 0, 0, 126, 124, - 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 15, 1, 0, 0, 0, 128, 126, 1, 0, - 0, 0, 129, 131, 5, 16, 0, 0, 130, 129, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, - 131, 132, 1, 0, 0, 0, 132, 138, 5, 36, 0, 0, 133, 135, 5, 14, 0, 0, 134, - 136, 3, 18, 9, 0, 135, 134, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 137, - 1, 0, 0, 0, 137, 139, 5, 15, 0, 0, 138, 133, 1, 0, 0, 0, 138, 139, 1, 0, - 0, 0, 139, 181, 1, 0, 0, 0, 140, 141, 5, 14, 0, 0, 141, 142, 3, 2, 1, 0, - 142, 143, 5, 15, 0, 0, 143, 181, 1, 0, 0, 0, 144, 146, 5, 10, 0, 0, 145, - 147, 3, 20, 10, 0, 146, 145, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 149, - 1, 0, 0, 0, 148, 150, 5, 17, 0, 0, 149, 148, 1, 0, 0, 0, 149, 150, 1, 0, - 0, 0, 150, 151, 1, 0, 0, 0, 151, 181, 5, 11, 0, 0, 152, 154, 5, 12, 0, - 0, 153, 155, 3, 26, 13, 0, 154, 153, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, - 155, 157, 1, 0, 0, 0, 156, 158, 5, 17, 0, 0, 157, 156, 1, 0, 0, 0, 157, - 158, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 181, 5, 13, 0, 0, 160, 162, - 5, 16, 0, 0, 161, 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 1, 0, - 0, 0, 163, 168, 5, 36, 0, 0, 164, 165, 5, 16, 0, 0, 165, 167, 5, 36, 0, - 0, 166, 164, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, - 169, 1, 0, 0, 0, 169, 171, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 173, - 5, 12, 0, 0, 172, 174, 3, 22, 11, 0, 173, 172, 1, 0, 0, 0, 173, 174, 1, - 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 177, 5, 17, 0, 0, 176, 175, 1, 0, 0, - 0, 176, 177, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 181, 5, 13, 0, 0, 179, - 181, 3, 30, 15, 0, 180, 130, 1, 0, 0, 0, 180, 140, 1, 0, 0, 0, 180, 144, - 1, 0, 0, 0, 180, 152, 1, 0, 0, 0, 180, 161, 1, 0, 0, 0, 180, 179, 1, 0, - 0, 0, 181, 17, 1, 0, 0, 0, 182, 187, 3, 2, 1, 0, 183, 184, 5, 17, 0, 0, - 184, 186, 3, 2, 1, 0, 185, 183, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187, - 185, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 19, 1, 0, 0, 0, 189, 187, 1, - 0, 0, 0, 190, 195, 3, 28, 14, 0, 191, 192, 5, 17, 0, 0, 192, 194, 3, 28, - 14, 0, 193, 191, 1, 0, 0, 0, 194, 197, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, - 195, 196, 1, 0, 0, 0, 196, 21, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 199, - 3, 24, 12, 0, 199, 200, 5, 21, 0, 0, 200, 208, 3, 2, 1, 0, 201, 202, 5, - 17, 0, 0, 202, 203, 3, 24, 12, 0, 203, 204, 5, 21, 0, 0, 204, 205, 3, 2, - 1, 0, 205, 207, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 207, 210, 1, 0, 0, 0, - 208, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 23, 1, 0, 0, 0, 210, 208, - 1, 0, 0, 0, 211, 213, 5, 20, 0, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, - 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 5, 36, 0, 0, 215, 25, 1, 0, 0, 0, - 216, 217, 3, 28, 14, 0, 217, 218, 5, 21, 0, 0, 218, 226, 3, 2, 1, 0, 219, - 220, 5, 17, 0, 0, 220, 221, 3, 28, 14, 0, 221, 222, 5, 21, 0, 0, 222, 223, - 3, 2, 1, 0, 223, 225, 1, 0, 0, 0, 224, 219, 1, 0, 0, 0, 225, 228, 1, 0, - 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 27, 1, 0, 0, 0, - 228, 226, 1, 0, 0, 0, 229, 231, 5, 20, 0, 0, 230, 229, 1, 0, 0, 0, 230, - 231, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 233, 3, 2, 1, 0, 233, 29, 1, - 0, 0, 0, 234, 236, 5, 18, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, - 0, 236, 237, 1, 0, 0, 0, 237, 249, 5, 32, 0, 0, 238, 249, 5, 33, 0, 0, - 239, 241, 5, 18, 0, 0, 240, 239, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, - 242, 1, 0, 0, 0, 242, 249, 5, 31, 0, 0, 243, 249, 5, 34, 0, 0, 244, 249, - 5, 35, 0, 0, 245, 249, 5, 26, 0, 0, 246, 249, 5, 27, 0, 0, 247, 249, 5, - 28, 0, 0, 248, 235, 1, 0, 0, 0, 248, 238, 1, 0, 0, 0, 248, 240, 1, 0, 0, - 0, 248, 243, 1, 0, 0, 0, 248, 244, 1, 0, 0, 0, 248, 245, 1, 0, 0, 0, 248, - 246, 1, 0, 0, 0, 248, 247, 1, 0, 0, 0, 249, 31, 1, 0, 0, 0, 35, 41, 48, - 56, 67, 79, 81, 88, 94, 97, 105, 113, 119, 124, 126, 130, 135, 138, 146, - 149, 154, 157, 161, 168, 173, 176, 180, 187, 195, 208, 212, 226, 230, 235, - 240, 248, -} - deserializer := antlr.NewATNDeserializer(nil) - staticData.atn = deserializer.Deserialize(staticData.serializedATN) - atn := staticData.atn - staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) - decisionToDFA := staticData.decisionToDFA - for index, state := range atn.DecisionToState { - decisionToDFA[index] = antlr.NewDFA(state, index) - } + staticData := &CELParserStaticData + staticData.LiteralNames = []string{ + "", "'=='", "'!='", "'in'", "'<'", "'<='", "'>='", "'>'", "'&&'", "'||'", + "'['", "']'", "'{'", "'}'", "'('", "')'", "'.'", "','", "'-'", "'!'", + "'?'", "':'", "'+'", "'*'", "'/'", "'%'", "'true'", "'false'", "'null'", + } + staticData.SymbolicNames = []string{ + "", "EQUALS", "NOT_EQUALS", "IN", "LESS", "LESS_EQUALS", "GREATER_EQUALS", + "GREATER", "LOGICAL_AND", "LOGICAL_OR", "LBRACKET", "RPRACKET", "LBRACE", + "RBRACE", "LPAREN", "RPAREN", "DOT", "COMMA", "MINUS", "EXCLAM", "QUESTIONMARK", + "COLON", "PLUS", "STAR", "SLASH", "PERCENT", "CEL_TRUE", "CEL_FALSE", + "NUL", "WHITESPACE", "COMMENT", "NUM_FLOAT", "NUM_INT", "NUM_UINT", + "STRING", "BYTES", "IDENTIFIER", "ESC_IDENTIFIER", + } + staticData.RuleNames = []string{ + "start", "expr", "conditionalOr", "conditionalAnd", "relation", "calc", + "unary", "member", "primary", "exprList", "listInit", "fieldInitializerList", + "optField", "mapInitializerList", "escapeIdent", "optExpr", "literal", + } + staticData.PredictionContextCache = antlr.NewPredictionContextCache() + staticData.serializedATN = []int32{ + 4, 1, 37, 259, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, + 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, + 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, + 2, 16, 7, 16, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 44, 8, 1, 1, 2, 1, 2, 1, 2, 5, 2, 49, 8, 2, 10, 2, 12, 2, 52, 9, 2, + 1, 3, 1, 3, 1, 3, 5, 3, 57, 8, 3, 10, 3, 12, 3, 60, 9, 3, 1, 4, 1, 4, 1, + 4, 1, 4, 1, 4, 1, 4, 5, 4, 68, 8, 4, 10, 4, 12, 4, 71, 9, 4, 1, 5, 1, 5, + 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 82, 8, 5, 10, 5, 12, 5, + 85, 9, 5, 1, 6, 1, 6, 4, 6, 89, 8, 6, 11, 6, 12, 6, 90, 1, 6, 1, 6, 4, + 6, 95, 8, 6, 11, 6, 12, 6, 96, 1, 6, 3, 6, 100, 8, 6, 1, 7, 1, 7, 1, 7, + 1, 7, 1, 7, 1, 7, 3, 7, 108, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, + 3, 7, 116, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 122, 8, 7, 1, 7, 1, 7, 1, + 7, 5, 7, 127, 8, 7, 10, 7, 12, 7, 130, 9, 7, 1, 8, 3, 8, 133, 8, 8, 1, + 8, 1, 8, 3, 8, 137, 8, 8, 1, 8, 1, 8, 1, 8, 3, 8, 142, 8, 8, 1, 8, 1, 8, + 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 151, 8, 8, 1, 8, 3, 8, 154, 8, 8, 1, + 8, 1, 8, 1, 8, 3, 8, 159, 8, 8, 1, 8, 3, 8, 162, 8, 8, 1, 8, 1, 8, 3, 8, + 166, 8, 8, 1, 8, 1, 8, 1, 8, 5, 8, 171, 8, 8, 10, 8, 12, 8, 174, 9, 8, + 1, 8, 1, 8, 3, 8, 178, 8, 8, 1, 8, 3, 8, 181, 8, 8, 1, 8, 1, 8, 3, 8, 185, + 8, 8, 1, 9, 1, 9, 1, 9, 5, 9, 190, 8, 9, 10, 9, 12, 9, 193, 9, 9, 1, 10, + 1, 10, 1, 10, 5, 10, 198, 8, 10, 10, 10, 12, 10, 201, 9, 10, 1, 11, 1, + 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 211, 8, 11, 10, 11, + 12, 11, 214, 9, 11, 1, 12, 3, 12, 217, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, + 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 229, 8, 13, 10, 13, 12, + 13, 232, 9, 13, 1, 14, 1, 14, 3, 14, 236, 8, 14, 1, 15, 3, 15, 239, 8, + 15, 1, 15, 1, 15, 1, 16, 3, 16, 244, 8, 16, 1, 16, 1, 16, 1, 16, 3, 16, + 249, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 257, 8, 16, + 1, 16, 0, 3, 8, 10, 14, 17, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, + 24, 26, 28, 30, 32, 0, 3, 1, 0, 1, 7, 1, 0, 23, 25, 2, 0, 18, 18, 22, 22, + 290, 0, 34, 1, 0, 0, 0, 2, 37, 1, 0, 0, 0, 4, 45, 1, 0, 0, 0, 6, 53, 1, + 0, 0, 0, 8, 61, 1, 0, 0, 0, 10, 72, 1, 0, 0, 0, 12, 99, 1, 0, 0, 0, 14, + 101, 1, 0, 0, 0, 16, 184, 1, 0, 0, 0, 18, 186, 1, 0, 0, 0, 20, 194, 1, + 0, 0, 0, 22, 202, 1, 0, 0, 0, 24, 216, 1, 0, 0, 0, 26, 220, 1, 0, 0, 0, + 28, 235, 1, 0, 0, 0, 30, 238, 1, 0, 0, 0, 32, 256, 1, 0, 0, 0, 34, 35, + 3, 2, 1, 0, 35, 36, 5, 0, 0, 1, 36, 1, 1, 0, 0, 0, 37, 43, 3, 4, 2, 0, + 38, 39, 5, 20, 0, 0, 39, 40, 3, 4, 2, 0, 40, 41, 5, 21, 0, 0, 41, 42, 3, + 2, 1, 0, 42, 44, 1, 0, 0, 0, 43, 38, 1, 0, 0, 0, 43, 44, 1, 0, 0, 0, 44, + 3, 1, 0, 0, 0, 45, 50, 3, 6, 3, 0, 46, 47, 5, 9, 0, 0, 47, 49, 3, 6, 3, + 0, 48, 46, 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, + 1, 0, 0, 0, 51, 5, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 58, 3, 8, 4, 0, + 54, 55, 5, 8, 0, 0, 55, 57, 3, 8, 4, 0, 56, 54, 1, 0, 0, 0, 57, 60, 1, + 0, 0, 0, 58, 56, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 7, 1, 0, 0, 0, 60, + 58, 1, 0, 0, 0, 61, 62, 6, 4, -1, 0, 62, 63, 3, 10, 5, 0, 63, 69, 1, 0, + 0, 0, 64, 65, 10, 1, 0, 0, 65, 66, 7, 0, 0, 0, 66, 68, 3, 8, 4, 2, 67, + 64, 1, 0, 0, 0, 68, 71, 1, 0, 0, 0, 69, 67, 1, 0, 0, 0, 69, 70, 1, 0, 0, + 0, 70, 9, 1, 0, 0, 0, 71, 69, 1, 0, 0, 0, 72, 73, 6, 5, -1, 0, 73, 74, + 3, 12, 6, 0, 74, 83, 1, 0, 0, 0, 75, 76, 10, 2, 0, 0, 76, 77, 7, 1, 0, + 0, 77, 82, 3, 10, 5, 3, 78, 79, 10, 1, 0, 0, 79, 80, 7, 2, 0, 0, 80, 82, + 3, 10, 5, 2, 81, 75, 1, 0, 0, 0, 81, 78, 1, 0, 0, 0, 82, 85, 1, 0, 0, 0, + 83, 81, 1, 0, 0, 0, 83, 84, 1, 0, 0, 0, 84, 11, 1, 0, 0, 0, 85, 83, 1, + 0, 0, 0, 86, 100, 3, 14, 7, 0, 87, 89, 5, 19, 0, 0, 88, 87, 1, 0, 0, 0, + 89, 90, 1, 0, 0, 0, 90, 88, 1, 0, 0, 0, 90, 91, 1, 0, 0, 0, 91, 92, 1, + 0, 0, 0, 92, 100, 3, 14, 7, 0, 93, 95, 5, 18, 0, 0, 94, 93, 1, 0, 0, 0, + 95, 96, 1, 0, 0, 0, 96, 94, 1, 0, 0, 0, 96, 97, 1, 0, 0, 0, 97, 98, 1, + 0, 0, 0, 98, 100, 3, 14, 7, 0, 99, 86, 1, 0, 0, 0, 99, 88, 1, 0, 0, 0, + 99, 94, 1, 0, 0, 0, 100, 13, 1, 0, 0, 0, 101, 102, 6, 7, -1, 0, 102, 103, + 3, 16, 8, 0, 103, 128, 1, 0, 0, 0, 104, 105, 10, 3, 0, 0, 105, 107, 5, + 16, 0, 0, 106, 108, 5, 20, 0, 0, 107, 106, 1, 0, 0, 0, 107, 108, 1, 0, + 0, 0, 108, 109, 1, 0, 0, 0, 109, 127, 3, 28, 14, 0, 110, 111, 10, 2, 0, + 0, 111, 112, 5, 16, 0, 0, 112, 113, 5, 36, 0, 0, 113, 115, 5, 14, 0, 0, + 114, 116, 3, 18, 9, 0, 115, 114, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, + 117, 1, 0, 0, 0, 117, 127, 5, 15, 0, 0, 118, 119, 10, 1, 0, 0, 119, 121, + 5, 10, 0, 0, 120, 122, 5, 20, 0, 0, 121, 120, 1, 0, 0, 0, 121, 122, 1, + 0, 0, 0, 122, 123, 1, 0, 0, 0, 123, 124, 3, 2, 1, 0, 124, 125, 5, 11, 0, + 0, 125, 127, 1, 0, 0, 0, 126, 104, 1, 0, 0, 0, 126, 110, 1, 0, 0, 0, 126, + 118, 1, 0, 0, 0, 127, 130, 1, 0, 0, 0, 128, 126, 1, 0, 0, 0, 128, 129, + 1, 0, 0, 0, 129, 15, 1, 0, 0, 0, 130, 128, 1, 0, 0, 0, 131, 133, 5, 16, + 0, 0, 132, 131, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, + 134, 185, 5, 36, 0, 0, 135, 137, 5, 16, 0, 0, 136, 135, 1, 0, 0, 0, 136, + 137, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 139, 5, 36, 0, 0, 139, 141, + 5, 14, 0, 0, 140, 142, 3, 18, 9, 0, 141, 140, 1, 0, 0, 0, 141, 142, 1, + 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 185, 5, 15, 0, 0, 144, 145, 5, 14, + 0, 0, 145, 146, 3, 2, 1, 0, 146, 147, 5, 15, 0, 0, 147, 185, 1, 0, 0, 0, + 148, 150, 5, 10, 0, 0, 149, 151, 3, 20, 10, 0, 150, 149, 1, 0, 0, 0, 150, + 151, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 154, 5, 17, 0, 0, 153, 152, + 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 185, 5, 11, + 0, 0, 156, 158, 5, 12, 0, 0, 157, 159, 3, 26, 13, 0, 158, 157, 1, 0, 0, + 0, 158, 159, 1, 0, 0, 0, 159, 161, 1, 0, 0, 0, 160, 162, 5, 17, 0, 0, 161, + 160, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 185, + 5, 13, 0, 0, 164, 166, 5, 16, 0, 0, 165, 164, 1, 0, 0, 0, 165, 166, 1, + 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 172, 5, 36, 0, 0, 168, 169, 5, 16, + 0, 0, 169, 171, 5, 36, 0, 0, 170, 168, 1, 0, 0, 0, 171, 174, 1, 0, 0, 0, + 172, 170, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 175, 1, 0, 0, 0, 174, + 172, 1, 0, 0, 0, 175, 177, 5, 12, 0, 0, 176, 178, 3, 22, 11, 0, 177, 176, + 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 181, 5, 17, + 0, 0, 180, 179, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, + 182, 185, 5, 13, 0, 0, 183, 185, 3, 32, 16, 0, 184, 132, 1, 0, 0, 0, 184, + 136, 1, 0, 0, 0, 184, 144, 1, 0, 0, 0, 184, 148, 1, 0, 0, 0, 184, 156, + 1, 0, 0, 0, 184, 165, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 17, 1, 0, + 0, 0, 186, 191, 3, 2, 1, 0, 187, 188, 5, 17, 0, 0, 188, 190, 3, 2, 1, 0, + 189, 187, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, + 192, 1, 0, 0, 0, 192, 19, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 199, 3, + 30, 15, 0, 195, 196, 5, 17, 0, 0, 196, 198, 3, 30, 15, 0, 197, 195, 1, + 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, + 0, 200, 21, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 203, 3, 24, 12, 0, 203, + 204, 5, 21, 0, 0, 204, 212, 3, 2, 1, 0, 205, 206, 5, 17, 0, 0, 206, 207, + 3, 24, 12, 0, 207, 208, 5, 21, 0, 0, 208, 209, 3, 2, 1, 0, 209, 211, 1, + 0, 0, 0, 210, 205, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, + 0, 212, 213, 1, 0, 0, 0, 213, 23, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, + 217, 5, 20, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, + 1, 0, 0, 0, 218, 219, 3, 28, 14, 0, 219, 25, 1, 0, 0, 0, 220, 221, 3, 30, + 15, 0, 221, 222, 5, 21, 0, 0, 222, 230, 3, 2, 1, 0, 223, 224, 5, 17, 0, + 0, 224, 225, 3, 30, 15, 0, 225, 226, 5, 21, 0, 0, 226, 227, 3, 2, 1, 0, + 227, 229, 1, 0, 0, 0, 228, 223, 1, 0, 0, 0, 229, 232, 1, 0, 0, 0, 230, + 228, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 27, 1, 0, 0, 0, 232, 230, 1, + 0, 0, 0, 233, 236, 5, 36, 0, 0, 234, 236, 5, 37, 0, 0, 235, 233, 1, 0, + 0, 0, 235, 234, 1, 0, 0, 0, 236, 29, 1, 0, 0, 0, 237, 239, 5, 20, 0, 0, + 238, 237, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, + 241, 3, 2, 1, 0, 241, 31, 1, 0, 0, 0, 242, 244, 5, 18, 0, 0, 243, 242, + 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 257, 5, 32, + 0, 0, 246, 257, 5, 33, 0, 0, 247, 249, 5, 18, 0, 0, 248, 247, 1, 0, 0, + 0, 248, 249, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 257, 5, 31, 0, 0, 251, + 257, 5, 34, 0, 0, 252, 257, 5, 35, 0, 0, 253, 257, 5, 26, 0, 0, 254, 257, + 5, 27, 0, 0, 255, 257, 5, 28, 0, 0, 256, 243, 1, 0, 0, 0, 256, 246, 1, + 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 251, 1, 0, 0, 0, 256, 252, 1, 0, 0, + 0, 256, 253, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 256, 255, 1, 0, 0, 0, 257, + 33, 1, 0, 0, 0, 36, 43, 50, 58, 69, 81, 83, 90, 96, 99, 107, 115, 121, + 126, 128, 132, 136, 141, 150, 153, 158, 161, 165, 172, 177, 180, 184, 191, + 199, 212, 216, 230, 235, 238, 243, 248, 256, + } + deserializer := antlr.NewATNDeserializer(nil) + staticData.atn = deserializer.Deserialize(staticData.serializedATN) + atn := staticData.atn + staticData.decisionToDFA = make([]*antlr.DFA, len(atn.DecisionToState)) + decisionToDFA := staticData.decisionToDFA + for index, state := range atn.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(state, index) + } } // CELParserInit initializes any static state used to implement CELParser. By default the @@ -182,8 +185,8 @@ func celParserInit() { // NewCELParser(). You can call this function if you wish to initialize the static state ahead // of time. func CELParserInit() { - staticData := &CELParserStaticData - staticData.once.Do(celParserInit) + staticData := &CELParserStaticData + staticData.once.Do(celParserInit) } // NewCELParser produces a new parser instance for the optional input antlr.TokenStream. @@ -191,7 +194,7 @@ func NewCELParser(input antlr.TokenStream) *CELParser { CELParserInit() this := new(CELParser) this.BaseParser = antlr.NewBaseParser(input) - staticData := &CELParserStaticData + staticData := &CELParserStaticData this.Interpreter = antlr.NewParserATNSimulator(this, staticData.atn, staticData.decisionToDFA, staticData.PredictionContextCache) this.RuleNames = staticData.RuleNames this.LiteralNames = staticData.LiteralNames @@ -201,66 +204,67 @@ func NewCELParser(input antlr.TokenStream) *CELParser { return this } - // CELParser tokens. const ( - CELParserEOF = antlr.TokenEOF - CELParserEQUALS = 1 - CELParserNOT_EQUALS = 2 - CELParserIN = 3 - CELParserLESS = 4 - CELParserLESS_EQUALS = 5 + CELParserEOF = antlr.TokenEOF + CELParserEQUALS = 1 + CELParserNOT_EQUALS = 2 + CELParserIN = 3 + CELParserLESS = 4 + CELParserLESS_EQUALS = 5 CELParserGREATER_EQUALS = 6 - CELParserGREATER = 7 - CELParserLOGICAL_AND = 8 - CELParserLOGICAL_OR = 9 - CELParserLBRACKET = 10 - CELParserRPRACKET = 11 - CELParserLBRACE = 12 - CELParserRBRACE = 13 - CELParserLPAREN = 14 - CELParserRPAREN = 15 - CELParserDOT = 16 - CELParserCOMMA = 17 - CELParserMINUS = 18 - CELParserEXCLAM = 19 - CELParserQUESTIONMARK = 20 - CELParserCOLON = 21 - CELParserPLUS = 22 - CELParserSTAR = 23 - CELParserSLASH = 24 - CELParserPERCENT = 25 - CELParserCEL_TRUE = 26 - CELParserCEL_FALSE = 27 - CELParserNUL = 28 - CELParserWHITESPACE = 29 - CELParserCOMMENT = 30 - CELParserNUM_FLOAT = 31 - CELParserNUM_INT = 32 - CELParserNUM_UINT = 33 - CELParserSTRING = 34 - CELParserBYTES = 35 - CELParserIDENTIFIER = 36 + CELParserGREATER = 7 + CELParserLOGICAL_AND = 8 + CELParserLOGICAL_OR = 9 + CELParserLBRACKET = 10 + CELParserRPRACKET = 11 + CELParserLBRACE = 12 + CELParserRBRACE = 13 + CELParserLPAREN = 14 + CELParserRPAREN = 15 + CELParserDOT = 16 + CELParserCOMMA = 17 + CELParserMINUS = 18 + CELParserEXCLAM = 19 + CELParserQUESTIONMARK = 20 + CELParserCOLON = 21 + CELParserPLUS = 22 + CELParserSTAR = 23 + CELParserSLASH = 24 + CELParserPERCENT = 25 + CELParserCEL_TRUE = 26 + CELParserCEL_FALSE = 27 + CELParserNUL = 28 + CELParserWHITESPACE = 29 + CELParserCOMMENT = 30 + CELParserNUM_FLOAT = 31 + CELParserNUM_INT = 32 + CELParserNUM_UINT = 33 + CELParserSTRING = 34 + CELParserBYTES = 35 + CELParserIDENTIFIER = 36 + CELParserESC_IDENTIFIER = 37 ) // CELParser rules. const ( - CELParserRULE_start = 0 - CELParserRULE_expr = 1 - CELParserRULE_conditionalOr = 2 - CELParserRULE_conditionalAnd = 3 - CELParserRULE_relation = 4 - CELParserRULE_calc = 5 - CELParserRULE_unary = 6 - CELParserRULE_member = 7 - CELParserRULE_primary = 8 - CELParserRULE_exprList = 9 - CELParserRULE_listInit = 10 + CELParserRULE_start = 0 + CELParserRULE_expr = 1 + CELParserRULE_conditionalOr = 2 + CELParserRULE_conditionalAnd = 3 + CELParserRULE_relation = 4 + CELParserRULE_calc = 5 + CELParserRULE_unary = 6 + CELParserRULE_member = 7 + CELParserRULE_primary = 8 + CELParserRULE_exprList = 9 + CELParserRULE_listInit = 10 CELParserRULE_fieldInitializerList = 11 - CELParserRULE_optField = 12 - CELParserRULE_mapInitializerList = 13 - CELParserRULE_optExpr = 14 - CELParserRULE_literal = 15 + CELParserRULE_optField = 12 + CELParserRULE_mapInitializerList = 13 + CELParserRULE_escapeIdent = 14 + CELParserRULE_optExpr = 15 + CELParserRULE_literal = 16 ) // IStartContext is an interface to support dynamic dispatch. @@ -273,11 +277,9 @@ type IStartContext interface { // GetE returns the e rule contexts. GetE() IExprContext - // SetE sets the e rule contexts. SetE(IExprContext) - // Getter signatures EOF() antlr.TerminalNode Expr() IExprContext @@ -289,7 +291,7 @@ type IStartContext interface { type StartContext struct { antlr.BaseParserRuleContext parser antlr.Parser - e IExprContext + e IExprContext } func NewEmptyStartContext() *StartContext { @@ -299,7 +301,7 @@ func NewEmptyStartContext() *StartContext { return p } -func InitEmptyStartContext(p *StartContext) { +func InitEmptyStartContext(p *StartContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_start } @@ -321,19 +323,17 @@ func (s *StartContext) GetParser() antlr.Parser { return s.parser } func (s *StartContext) GetE() IExprContext { return s.e } - func (s *StartContext) SetE(v IExprContext) { s.e = v } - func (s *StartContext) EOF() antlr.TerminalNode { return s.GetToken(CELParserEOF, 0) } func (s *StartContext) Expr() IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -353,7 +353,6 @@ func (s *StartContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *StartContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterStart(s) @@ -376,32 +375,26 @@ func (s *StartContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - func (p *CELParser) Start_() (localctx IStartContext) { localctx = NewStartContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 0, CELParserRULE_start) p.EnterOuterAlt(localctx, 1) { - p.SetState(32) + p.SetState(34) var _x = p.Expr() - localctx.(*StartContext).e = _x } { - p.SetState(33) + p.SetState(35) p.Match(CELParserEOF) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - - errorExit: if p.HasError() { v := p.GetError() @@ -415,7 +408,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IExprContext is an interface to support dynamic dispatch. type IExprContext interface { antlr.ParserRuleContext @@ -424,12 +416,10 @@ type IExprContext interface { GetParser() antlr.Parser // GetOp returns the op token. - GetOp() antlr.Token - + GetOp() antlr.Token // SetOp sets the op token. - SetOp(antlr.Token) - + SetOp(antlr.Token) // GetE returns the e rule contexts. GetE() IConditionalOrContext @@ -440,7 +430,6 @@ type IExprContext interface { // GetE2 returns the e2 rule contexts. GetE2() IExprContext - // SetE sets the e rule contexts. SetE(IConditionalOrContext) @@ -450,7 +439,6 @@ type IExprContext interface { // SetE2 sets the e2 rule contexts. SetE2(IExprContext) - // Getter signatures AllConditionalOr() []IConditionalOrContext ConditionalOr(i int) IConditionalOrContext @@ -465,10 +453,10 @@ type IExprContext interface { type ExprContext struct { antlr.BaseParserRuleContext parser antlr.Parser - e IConditionalOrContext - op antlr.Token - e1 IConditionalOrContext - e2 IExprContext + e IConditionalOrContext + op antlr.Token + e1 IConditionalOrContext + e2 IExprContext } func NewEmptyExprContext() *ExprContext { @@ -478,7 +466,7 @@ func NewEmptyExprContext() *ExprContext { return p } -func InitEmptyExprContext(p *ExprContext) { +func InitEmptyExprContext(p *ExprContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_expr } @@ -500,24 +488,20 @@ func (s *ExprContext) GetParser() antlr.Parser { return s.parser } func (s *ExprContext) GetOp() antlr.Token { return s.op } - func (s *ExprContext) SetOp(v antlr.Token) { s.op = v } - func (s *ExprContext) GetE() IConditionalOrContext { return s.e } func (s *ExprContext) GetE1() IConditionalOrContext { return s.e1 } func (s *ExprContext) GetE2() IExprContext { return s.e2 } - func (s *ExprContext) SetE(v IConditionalOrContext) { s.e = v } func (s *ExprContext) SetE1(v IConditionalOrContext) { s.e1 = v } func (s *ExprContext) SetE2(v IExprContext) { s.e2 = v } - func (s *ExprContext) AllConditionalOr() []IConditionalOrContext { children := s.GetChildren() len := 0 @@ -540,12 +524,12 @@ func (s *ExprContext) AllConditionalOr() []IConditionalOrContext { } func (s *ExprContext) ConditionalOr(i int) IConditionalOrContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IConditionalOrContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -568,10 +552,10 @@ func (s *ExprContext) QUESTIONMARK() antlr.TerminalNode { } func (s *ExprContext) Expr() IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -591,7 +575,6 @@ func (s *ExprContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) s return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *ExprContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterExpr(s) @@ -614,9 +597,6 @@ func (s *ExprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - func (p *CELParser) Expr() (localctx IExprContext) { localctx = NewExprContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 2, CELParserRULE_expr) @@ -624,62 +604,56 @@ func (p *CELParser) Expr() (localctx IExprContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(35) + p.SetState(37) var _x = p.ConditionalOr() - localctx.(*ExprContext).e = _x } - p.SetState(41) + p.SetState(43) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserQUESTIONMARK { { - p.SetState(36) + p.SetState(38) var _m = p.Match(CELParserQUESTIONMARK) localctx.(*ExprContext).op = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(37) + p.SetState(39) var _x = p.ConditionalOr() - localctx.(*ExprContext).e1 = _x } { - p.SetState(38) + p.SetState(40) p.Match(CELParserCOLON) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(39) + p.SetState(41) var _x = p.Expr() - localctx.(*ExprContext).e2 = _x } } - - errorExit: if p.HasError() { v := p.GetError() @@ -693,7 +667,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IConditionalOrContext is an interface to support dynamic dispatch. type IConditionalOrContext interface { antlr.ParserRuleContext @@ -702,42 +675,34 @@ type IConditionalOrContext interface { GetParser() antlr.Parser // GetS9 returns the s9 token. - GetS9() antlr.Token - + GetS9() antlr.Token // SetS9 sets the s9 token. - SetS9(antlr.Token) - + SetS9(antlr.Token) // GetOps returns the ops token list. GetOps() []antlr.Token - // SetOps sets the ops token list. SetOps([]antlr.Token) - // GetE returns the e rule contexts. GetE() IConditionalAndContext // Get_conditionalAnd returns the _conditionalAnd rule contexts. Get_conditionalAnd() IConditionalAndContext - // SetE sets the e rule contexts. SetE(IConditionalAndContext) // Set_conditionalAnd sets the _conditionalAnd rule contexts. Set_conditionalAnd(IConditionalAndContext) - // GetE1 returns the e1 rule context list. GetE1() []IConditionalAndContext - // SetE1 sets the e1 rule context list. - SetE1([]IConditionalAndContext) - + SetE1([]IConditionalAndContext) // Getter signatures AllConditionalAnd() []IConditionalAndContext @@ -751,12 +716,12 @@ type IConditionalOrContext interface { type ConditionalOrContext struct { antlr.BaseParserRuleContext - parser antlr.Parser - e IConditionalAndContext - s9 antlr.Token - ops []antlr.Token - _conditionalAnd IConditionalAndContext - e1 []IConditionalAndContext + parser antlr.Parser + e IConditionalAndContext + s9 antlr.Token + ops []antlr.Token + _conditionalAnd IConditionalAndContext + e1 []IConditionalAndContext } func NewEmptyConditionalOrContext() *ConditionalOrContext { @@ -766,7 +731,7 @@ func NewEmptyConditionalOrContext() *ConditionalOrContext { return p } -func InitEmptyConditionalOrContext(p *ConditionalOrContext) { +func InitEmptyConditionalOrContext(p *ConditionalOrContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_conditionalOr } @@ -788,32 +753,24 @@ func (s *ConditionalOrContext) GetParser() antlr.Parser { return s.parser } func (s *ConditionalOrContext) GetS9() antlr.Token { return s.s9 } - func (s *ConditionalOrContext) SetS9(v antlr.Token) { s.s9 = v } - func (s *ConditionalOrContext) GetOps() []antlr.Token { return s.ops } - func (s *ConditionalOrContext) SetOps(v []antlr.Token) { s.ops = v } - func (s *ConditionalOrContext) GetE() IConditionalAndContext { return s.e } func (s *ConditionalOrContext) Get_conditionalAnd() IConditionalAndContext { return s._conditionalAnd } - func (s *ConditionalOrContext) SetE(v IConditionalAndContext) { s.e = v } func (s *ConditionalOrContext) Set_conditionalAnd(v IConditionalAndContext) { s._conditionalAnd = v } - func (s *ConditionalOrContext) GetE1() []IConditionalAndContext { return s.e1 } - func (s *ConditionalOrContext) SetE1(v []IConditionalAndContext) { s.e1 = v } - func (s *ConditionalOrContext) AllConditionalAnd() []IConditionalAndContext { children := s.GetChildren() len := 0 @@ -836,12 +793,12 @@ func (s *ConditionalOrContext) AllConditionalAnd() []IConditionalAndContext { } func (s *ConditionalOrContext) ConditionalAnd(i int) IConditionalAndContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IConditionalAndContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -871,7 +828,6 @@ func (s *ConditionalOrContext) ToStringTree(ruleNames []string, recog antlr.Reco return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *ConditionalOrContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterConditionalOr(s) @@ -894,9 +850,6 @@ func (s *ConditionalOrContext) Accept(visitor antlr.ParseTreeVisitor) interface{ } } - - - func (p *CELParser) ConditionalOr() (localctx IConditionalOrContext) { localctx = NewConditionalOrContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 4, CELParserRULE_conditionalOr) @@ -904,55 +857,49 @@ func (p *CELParser) ConditionalOr() (localctx IConditionalOrContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(43) + p.SetState(45) var _x = p.ConditionalAnd() - localctx.(*ConditionalOrContext).e = _x } - p.SetState(48) + p.SetState(50) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - for _la == CELParserLOGICAL_OR { { - p.SetState(44) + p.SetState(46) var _m = p.Match(CELParserLOGICAL_OR) localctx.(*ConditionalOrContext).s9 = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*ConditionalOrContext).ops = append(localctx.(*ConditionalOrContext).ops, localctx.(*ConditionalOrContext).s9) { - p.SetState(45) + p.SetState(47) var _x = p.ConditionalAnd() - localctx.(*ConditionalOrContext)._conditionalAnd = _x } localctx.(*ConditionalOrContext).e1 = append(localctx.(*ConditionalOrContext).e1, localctx.(*ConditionalOrContext)._conditionalAnd) - - p.SetState(50) + p.SetState(52) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _la = p.GetTokenStream().LA(1) } - - errorExit: if p.HasError() { v := p.GetError() @@ -966,7 +913,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IConditionalAndContext is an interface to support dynamic dispatch. type IConditionalAndContext interface { antlr.ParserRuleContext @@ -975,42 +921,34 @@ type IConditionalAndContext interface { GetParser() antlr.Parser // GetS8 returns the s8 token. - GetS8() antlr.Token - + GetS8() antlr.Token // SetS8 sets the s8 token. - SetS8(antlr.Token) - + SetS8(antlr.Token) // GetOps returns the ops token list. GetOps() []antlr.Token - // SetOps sets the ops token list. SetOps([]antlr.Token) - // GetE returns the e rule contexts. GetE() IRelationContext // Get_relation returns the _relation rule contexts. Get_relation() IRelationContext - // SetE sets the e rule contexts. SetE(IRelationContext) // Set_relation sets the _relation rule contexts. Set_relation(IRelationContext) - // GetE1 returns the e1 rule context list. GetE1() []IRelationContext - // SetE1 sets the e1 rule context list. - SetE1([]IRelationContext) - + SetE1([]IRelationContext) // Getter signatures AllRelation() []IRelationContext @@ -1024,12 +962,12 @@ type IConditionalAndContext interface { type ConditionalAndContext struct { antlr.BaseParserRuleContext - parser antlr.Parser - e IRelationContext - s8 antlr.Token - ops []antlr.Token - _relation IRelationContext - e1 []IRelationContext + parser antlr.Parser + e IRelationContext + s8 antlr.Token + ops []antlr.Token + _relation IRelationContext + e1 []IRelationContext } func NewEmptyConditionalAndContext() *ConditionalAndContext { @@ -1039,7 +977,7 @@ func NewEmptyConditionalAndContext() *ConditionalAndContext { return p } -func InitEmptyConditionalAndContext(p *ConditionalAndContext) { +func InitEmptyConditionalAndContext(p *ConditionalAndContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_conditionalAnd } @@ -1061,32 +999,24 @@ func (s *ConditionalAndContext) GetParser() antlr.Parser { return s.parser } func (s *ConditionalAndContext) GetS8() antlr.Token { return s.s8 } - func (s *ConditionalAndContext) SetS8(v antlr.Token) { s.s8 = v } - func (s *ConditionalAndContext) GetOps() []antlr.Token { return s.ops } - func (s *ConditionalAndContext) SetOps(v []antlr.Token) { s.ops = v } - func (s *ConditionalAndContext) GetE() IRelationContext { return s.e } func (s *ConditionalAndContext) Get_relation() IRelationContext { return s._relation } - func (s *ConditionalAndContext) SetE(v IRelationContext) { s.e = v } func (s *ConditionalAndContext) Set_relation(v IRelationContext) { s._relation = v } - func (s *ConditionalAndContext) GetE1() []IRelationContext { return s.e1 } - func (s *ConditionalAndContext) SetE1(v []IRelationContext) { s.e1 = v } - func (s *ConditionalAndContext) AllRelation() []IRelationContext { children := s.GetChildren() len := 0 @@ -1109,12 +1039,12 @@ func (s *ConditionalAndContext) AllRelation() []IRelationContext { } func (s *ConditionalAndContext) Relation(i int) IRelationContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IRelationContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -1144,7 +1074,6 @@ func (s *ConditionalAndContext) ToStringTree(ruleNames []string, recog antlr.Rec return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *ConditionalAndContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterConditionalAnd(s) @@ -1167,9 +1096,6 @@ func (s *ConditionalAndContext) Accept(visitor antlr.ParseTreeVisitor) interface } } - - - func (p *CELParser) ConditionalAnd() (localctx IConditionalAndContext) { localctx = NewConditionalAndContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 6, CELParserRULE_conditionalAnd) @@ -1177,35 +1103,34 @@ func (p *CELParser) ConditionalAnd() (localctx IConditionalAndContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(51) + p.SetState(53) var _x = p.relation(0) localctx.(*ConditionalAndContext).e = _x } - p.SetState(56) + p.SetState(58) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - for _la == CELParserLOGICAL_AND { { - p.SetState(52) + p.SetState(54) var _m = p.Match(CELParserLOGICAL_AND) localctx.(*ConditionalAndContext).s8 = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*ConditionalAndContext).ops = append(localctx.(*ConditionalAndContext).ops, localctx.(*ConditionalAndContext).s8) { - p.SetState(53) + p.SetState(55) var _x = p.relation(0) @@ -1213,17 +1138,14 @@ func (p *CELParser) ConditionalAnd() (localctx IConditionalAndContext) { } localctx.(*ConditionalAndContext).e1 = append(localctx.(*ConditionalAndContext).e1, localctx.(*ConditionalAndContext)._relation) - - p.SetState(58) + p.SetState(60) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _la = p.GetTokenStream().LA(1) } - - errorExit: if p.HasError() { v := p.GetError() @@ -1237,7 +1159,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IRelationContext is an interface to support dynamic dispatch. type IRelationContext interface { antlr.ParserRuleContext @@ -1246,12 +1167,10 @@ type IRelationContext interface { GetParser() antlr.Parser // GetOp returns the op token. - GetOp() antlr.Token - + GetOp() antlr.Token // SetOp sets the op token. - SetOp(antlr.Token) - + SetOp(antlr.Token) // Getter signatures Calc() ICalcContext @@ -1272,7 +1191,7 @@ type IRelationContext interface { type RelationContext struct { antlr.BaseParserRuleContext parser antlr.Parser - op antlr.Token + op antlr.Token } func NewEmptyRelationContext() *RelationContext { @@ -1282,7 +1201,7 @@ func NewEmptyRelationContext() *RelationContext { return p } -func InitEmptyRelationContext(p *RelationContext) { +func InitEmptyRelationContext(p *RelationContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_relation } @@ -1304,15 +1223,13 @@ func (s *RelationContext) GetParser() antlr.Parser { return s.parser } func (s *RelationContext) GetOp() antlr.Token { return s.op } - func (s *RelationContext) SetOp(v antlr.Token) { s.op = v } - func (s *RelationContext) Calc() ICalcContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(ICalcContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -1346,12 +1263,12 @@ func (s *RelationContext) AllRelation() []IRelationContext { } func (s *RelationContext) Relation(i int) IRelationContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IRelationContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -1401,7 +1318,6 @@ func (s *RelationContext) ToStringTree(ruleNames []string, recog antlr.Recognize return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *RelationContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterRelation(s) @@ -1424,10 +1340,6 @@ func (s *RelationContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - - func (p *CELParser) Relation() (localctx IRelationContext) { return p.relation(0) } @@ -1447,12 +1359,12 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(60) + p.SetState(62) p.calc(0) } p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) - p.SetState(67) + p.SetState(69) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -1469,14 +1381,14 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { _prevctx = localctx localctx = NewRelationContext(p, _parentctx, _parentState) p.PushNewRecursionContext(localctx, _startState, CELParserRULE_relation) - p.SetState(62) + p.SetState(64) if !(p.Precpred(p.GetParserRuleContext(), 1)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 1)", "")) goto errorExit } { - p.SetState(63) + p.SetState(65) var _lt = p.GetTokenStream().LT(1) @@ -1484,7 +1396,7 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { _la = p.GetTokenStream().LA(1) - if !(((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 254) != 0)) { + if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&254) != 0) { var _ri = p.GetErrorHandler().RecoverInline(p) localctx.(*RelationContext).op = _ri @@ -1494,26 +1406,23 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { } } { - p.SetState(64) + p.SetState(66) p.relation(2) } - } - p.SetState(69) + p.SetState(71) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 3, p.GetParserRuleContext()) if p.HasError() { goto errorExit } } - - - errorExit: +errorExit: if p.HasError() { v := p.GetError() localctx.SetException(v) @@ -1526,7 +1435,6 @@ func (p *CELParser) relation(_p int) (localctx IRelationContext) { goto errorExit // Trick to prevent compiler error if the label is not used } - // ICalcContext is an interface to support dynamic dispatch. type ICalcContext interface { antlr.ParserRuleContext @@ -1535,12 +1443,10 @@ type ICalcContext interface { GetParser() antlr.Parser // GetOp returns the op token. - GetOp() antlr.Token - + GetOp() antlr.Token // SetOp sets the op token. - SetOp(antlr.Token) - + SetOp(antlr.Token) // Getter signatures Unary() IUnaryContext @@ -1559,7 +1465,7 @@ type ICalcContext interface { type CalcContext struct { antlr.BaseParserRuleContext parser antlr.Parser - op antlr.Token + op antlr.Token } func NewEmptyCalcContext() *CalcContext { @@ -1569,7 +1475,7 @@ func NewEmptyCalcContext() *CalcContext { return p } -func InitEmptyCalcContext(p *CalcContext) { +func InitEmptyCalcContext(p *CalcContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_calc } @@ -1591,15 +1497,13 @@ func (s *CalcContext) GetParser() antlr.Parser { return s.parser } func (s *CalcContext) GetOp() antlr.Token { return s.op } - func (s *CalcContext) SetOp(v antlr.Token) { s.op = v } - func (s *CalcContext) Unary() IUnaryContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IUnaryContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -1633,12 +1537,12 @@ func (s *CalcContext) AllCalc() []ICalcContext { } func (s *CalcContext) Calc(i int) ICalcContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(ICalcContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -1680,7 +1584,6 @@ func (s *CalcContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) s return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *CalcContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterCalc(s) @@ -1703,10 +1606,6 @@ func (s *CalcContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - - func (p *CELParser) Calc() (localctx ICalcContext) { return p.calc(0) } @@ -1726,12 +1625,12 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(71) + p.SetState(73) p.Unary() } p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) - p.SetState(81) + p.SetState(83) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -1746,7 +1645,7 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { p.TriggerExitRuleEvent() } _prevctx = localctx - p.SetState(79) + p.SetState(81) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -1756,14 +1655,14 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { case 1: localctx = NewCalcContext(p, _parentctx, _parentState) p.PushNewRecursionContext(localctx, _startState, CELParserRULE_calc) - p.SetState(73) + p.SetState(75) if !(p.Precpred(p.GetParserRuleContext(), 2)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 2)", "")) goto errorExit } { - p.SetState(74) + p.SetState(76) var _lt = p.GetTokenStream().LT(1) @@ -1771,7 +1670,7 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { _la = p.GetTokenStream().LA(1) - if !(((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 58720256) != 0)) { + if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&58720256) != 0) { var _ri = p.GetErrorHandler().RecoverInline(p) localctx.(*CalcContext).op = _ri @@ -1781,22 +1680,21 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { } } { - p.SetState(75) + p.SetState(77) p.calc(3) } - case 2: localctx = NewCalcContext(p, _parentctx, _parentState) p.PushNewRecursionContext(localctx, _startState, CELParserRULE_calc) - p.SetState(76) + p.SetState(78) if !(p.Precpred(p.GetParserRuleContext(), 1)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 1)", "")) goto errorExit } { - p.SetState(77) + p.SetState(79) var _lt = p.GetTokenStream().LT(1) @@ -1814,7 +1712,7 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { } } { - p.SetState(78) + p.SetState(80) p.calc(2) } @@ -1823,20 +1721,18 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { } } - p.SetState(83) + p.SetState(85) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 5, p.GetParserRuleContext()) if p.HasError() { goto errorExit } } - - - errorExit: +errorExit: if p.HasError() { v := p.GetError() localctx.SetException(v) @@ -1849,7 +1745,6 @@ func (p *CELParser) calc(_p int) (localctx ICalcContext) { goto errorExit // Trick to prevent compiler error if the label is not used } - // IUnaryContext is an interface to support dynamic dispatch. type IUnaryContext interface { antlr.ParserRuleContext @@ -1872,7 +1767,7 @@ func NewEmptyUnaryContext() *UnaryContext { return p } -func InitEmptyUnaryContext(p *UnaryContext) { +func InitEmptyUnaryContext(p *UnaryContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_unary } @@ -1904,9 +1799,6 @@ func (s *UnaryContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) return antlr.TreesStringTree(s, ruleNames, recog) } - - - type LogicalNotContext struct { UnaryContext s19 antlr.Token @@ -1923,16 +1815,12 @@ func NewLogicalNotContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Log return p } - func (s *LogicalNotContext) GetS19() antlr.Token { return s.s19 } - func (s *LogicalNotContext) SetS19(v antlr.Token) { s.s19 = v } - func (s *LogicalNotContext) GetOps() []antlr.Token { return s.ops } - func (s *LogicalNotContext) SetOps(v []antlr.Token) { s.ops = v } func (s *LogicalNotContext) GetRuleContext() antlr.RuleContext { @@ -1940,10 +1828,10 @@ func (s *LogicalNotContext) GetRuleContext() antlr.RuleContext { } func (s *LogicalNotContext) Member() IMemberContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IMemberContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -1963,7 +1851,6 @@ func (s *LogicalNotContext) EXCLAM(i int) antlr.TerminalNode { return s.GetToken(CELParserEXCLAM, i) } - func (s *LogicalNotContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterLogicalNot(s) @@ -1986,7 +1873,6 @@ func (s *LogicalNotContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type MemberExprContext struct { UnaryContext } @@ -2006,10 +1892,10 @@ func (s *MemberExprContext) GetRuleContext() antlr.RuleContext { } func (s *MemberExprContext) Member() IMemberContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IMemberContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2021,7 +1907,6 @@ func (s *MemberExprContext) Member() IMemberContext { return t.(IMemberContext) } - func (s *MemberExprContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterMemberExpr(s) @@ -2044,7 +1929,6 @@ func (s *MemberExprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type NegateContext struct { UnaryContext s18 antlr.Token @@ -2061,16 +1945,12 @@ func NewNegateContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *NegateC return p } - func (s *NegateContext) GetS18() antlr.Token { return s.s18 } - func (s *NegateContext) SetS18(v antlr.Token) { s.s18 = v } - func (s *NegateContext) GetOps() []antlr.Token { return s.ops } - func (s *NegateContext) SetOps(v []antlr.Token) { s.ops = v } func (s *NegateContext) GetRuleContext() antlr.RuleContext { @@ -2078,10 +1958,10 @@ func (s *NegateContext) GetRuleContext() antlr.RuleContext { } func (s *NegateContext) Member() IMemberContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IMemberContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2101,7 +1981,6 @@ func (s *NegateContext) MINUS(i int) antlr.TerminalNode { return s.GetToken(CELParserMINUS, i) } - func (s *NegateContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterNegate(s) @@ -2124,8 +2003,6 @@ func (s *NegateContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - func (p *CELParser) Unary() (localctx IUnaryContext) { localctx = NewUnaryContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 12, CELParserRULE_unary) @@ -2133,7 +2010,7 @@ func (p *CELParser) Unary() (localctx IUnaryContext) { var _alt int - p.SetState(97) + p.SetState(99) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -2144,54 +2021,50 @@ func (p *CELParser) Unary() (localctx IUnaryContext) { localctx = NewMemberExprContext(p, localctx) p.EnterOuterAlt(localctx, 1) { - p.SetState(84) + p.SetState(86) p.member(0) } - case 2: localctx = NewLogicalNotContext(p, localctx) p.EnterOuterAlt(localctx, 2) - p.SetState(86) + p.SetState(88) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - for ok := true; ok; ok = _la == CELParserEXCLAM { { - p.SetState(85) + p.SetState(87) var _m = p.Match(CELParserEXCLAM) localctx.(*LogicalNotContext).s19 = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*LogicalNotContext).ops = append(localctx.(*LogicalNotContext).ops, localctx.(*LogicalNotContext).s19) - - p.SetState(88) + p.SetState(90) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _la = p.GetTokenStream().LA(1) } { - p.SetState(90) + p.SetState(92) p.member(0) } - case 3: localctx = NewNegateContext(p, localctx) p.EnterOuterAlt(localctx, 3) - p.SetState(92) + p.SetState(94) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -2200,28 +2073,25 @@ func (p *CELParser) Unary() (localctx IUnaryContext) { for ok := true; ok; ok = _alt != 2 && _alt != antlr.ATNInvalidAltNumber { switch _alt { case 1: - { - p.SetState(91) + { + p.SetState(93) - var _m = p.Match(CELParserMINUS) + var _m = p.Match(CELParserMINUS) - localctx.(*NegateContext).s18 = _m - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } + localctx.(*NegateContext).s18 = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit } - localctx.(*NegateContext).ops = append(localctx.(*NegateContext).ops, localctx.(*NegateContext).s18) - - - + } + localctx.(*NegateContext).ops = append(localctx.(*NegateContext).ops, localctx.(*NegateContext).s18) default: p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) goto errorExit } - p.SetState(94) + p.SetState(96) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 7, p.GetParserRuleContext()) if p.HasError() { @@ -2229,7 +2099,7 @@ func (p *CELParser) Unary() (localctx IUnaryContext) { } } { - p.SetState(96) + p.SetState(98) p.member(0) } @@ -2237,7 +2107,6 @@ func (p *CELParser) Unary() (localctx IUnaryContext) { goto errorExit } - errorExit: if p.HasError() { v := p.GetError() @@ -2251,7 +2120,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IMemberContext is an interface to support dynamic dispatch. type IMemberContext interface { antlr.ParserRuleContext @@ -2274,7 +2142,7 @@ func NewEmptyMemberContext() *MemberContext { return p } -func InitEmptyMemberContext(p *MemberContext) { +func InitEmptyMemberContext(p *MemberContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_member } @@ -2306,16 +2174,12 @@ func (s *MemberContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) return antlr.TreesStringTree(s, ruleNames, recog) } - - - - type MemberCallContext struct { MemberContext - op antlr.Token - id antlr.Token + op antlr.Token + id antlr.Token open antlr.Token - args IExprListContext + args IExprListContext } func NewMemberCallContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *MemberCallContext { @@ -2328,24 +2192,20 @@ func NewMemberCallContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Mem return p } - func (s *MemberCallContext) GetOp() antlr.Token { return s.op } func (s *MemberCallContext) GetId() antlr.Token { return s.id } func (s *MemberCallContext) GetOpen() antlr.Token { return s.open } - func (s *MemberCallContext) SetOp(v antlr.Token) { s.op = v } func (s *MemberCallContext) SetId(v antlr.Token) { s.id = v } func (s *MemberCallContext) SetOpen(v antlr.Token) { s.open = v } - func (s *MemberCallContext) GetArgs() IExprListContext { return s.args } - func (s *MemberCallContext) SetArgs(v IExprListContext) { s.args = v } func (s *MemberCallContext) GetRuleContext() antlr.RuleContext { @@ -2353,10 +2213,10 @@ func (s *MemberCallContext) GetRuleContext() antlr.RuleContext { } func (s *MemberCallContext) Member() IMemberContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IMemberContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2385,10 +2245,10 @@ func (s *MemberCallContext) LPAREN() antlr.TerminalNode { } func (s *MemberCallContext) ExprList() IExprListContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprListContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2400,7 +2260,6 @@ func (s *MemberCallContext) ExprList() IExprListContext { return t.(IExprListContext) } - func (s *MemberCallContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterMemberCall(s) @@ -2423,12 +2282,11 @@ func (s *MemberCallContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type SelectContext struct { MemberContext - op antlr.Token + op antlr.Token opt antlr.Token - id antlr.Token + id IEscapeIdentContext } func NewSelectContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *SelectContext { @@ -2441,29 +2299,27 @@ func NewSelectContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *SelectC return p } - func (s *SelectContext) GetOp() antlr.Token { return s.op } func (s *SelectContext) GetOpt() antlr.Token { return s.opt } -func (s *SelectContext) GetId() antlr.Token { return s.id } - - func (s *SelectContext) SetOp(v antlr.Token) { s.op = v } func (s *SelectContext) SetOpt(v antlr.Token) { s.opt = v } -func (s *SelectContext) SetId(v antlr.Token) { s.id = v } +func (s *SelectContext) GetId() IEscapeIdentContext { return s.id } + +func (s *SelectContext) SetId(v IEscapeIdentContext) { s.id = v } func (s *SelectContext) GetRuleContext() antlr.RuleContext { return s } func (s *SelectContext) Member() IMemberContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IMemberContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2479,15 +2335,26 @@ func (s *SelectContext) DOT() antlr.TerminalNode { return s.GetToken(CELParserDOT, 0) } -func (s *SelectContext) IDENTIFIER() antlr.TerminalNode { - return s.GetToken(CELParserIDENTIFIER, 0) +func (s *SelectContext) EscapeIdent() IEscapeIdentContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IEscapeIdentContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } + + if t == nil { + return nil + } + + return t.(IEscapeIdentContext) } func (s *SelectContext) QUESTIONMARK() antlr.TerminalNode { return s.GetToken(CELParserQUESTIONMARK, 0) } - func (s *SelectContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterSelect(s) @@ -2510,7 +2377,6 @@ func (s *SelectContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type PrimaryExprContext struct { MemberContext } @@ -2530,10 +2396,10 @@ func (s *PrimaryExprContext) GetRuleContext() antlr.RuleContext { } func (s *PrimaryExprContext) Primary() IPrimaryContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IPrimaryContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2545,7 +2411,6 @@ func (s *PrimaryExprContext) Primary() IPrimaryContext { return t.(IPrimaryContext) } - func (s *PrimaryExprContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterPrimaryExpr(s) @@ -2568,12 +2433,11 @@ func (s *PrimaryExprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} } } - type IndexContext struct { MemberContext - op antlr.Token - opt antlr.Token - index IExprContext + op antlr.Token + opt antlr.Token + index IExprContext } func NewIndexContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *IndexContext { @@ -2586,20 +2450,16 @@ func NewIndexContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *IndexCon return p } - func (s *IndexContext) GetOp() antlr.Token { return s.op } func (s *IndexContext) GetOpt() antlr.Token { return s.opt } - func (s *IndexContext) SetOp(v antlr.Token) { s.op = v } func (s *IndexContext) SetOpt(v antlr.Token) { s.opt = v } - func (s *IndexContext) GetIndex() IExprContext { return s.index } - func (s *IndexContext) SetIndex(v IExprContext) { s.index = v } func (s *IndexContext) GetRuleContext() antlr.RuleContext { @@ -2607,10 +2467,10 @@ func (s *IndexContext) GetRuleContext() antlr.RuleContext { } func (s *IndexContext) Member() IMemberContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IMemberContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2631,10 +2491,10 @@ func (s *IndexContext) LBRACKET() antlr.TerminalNode { } func (s *IndexContext) Expr() IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -2650,7 +2510,6 @@ func (s *IndexContext) QUESTIONMARK() antlr.TerminalNode { return s.GetToken(CELParserQUESTIONMARK, 0) } - func (s *IndexContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterIndex(s) @@ -2673,8 +2532,6 @@ func (s *IndexContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - func (p *CELParser) Member() (localctx IMemberContext) { return p.member(0) } @@ -2698,12 +2555,12 @@ func (p *CELParser) member(_p int) (localctx IMemberContext) { _prevctx = localctx { - p.SetState(100) + p.SetState(102) p.Primary() } p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) - p.SetState(126) + p.SetState(128) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -2718,7 +2575,7 @@ func (p *CELParser) member(_p int) (localctx IMemberContext) { p.TriggerExitRuleEvent() } _prevctx = localctx - p.SetState(124) + p.SetState(126) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -2728,185 +2585,174 @@ func (p *CELParser) member(_p int) (localctx IMemberContext) { case 1: localctx = NewSelectContext(p, NewMemberContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, CELParserRULE_member) - p.SetState(102) + p.SetState(104) if !(p.Precpred(p.GetParserRuleContext(), 3)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 3)", "")) goto errorExit } { - p.SetState(103) + p.SetState(105) var _m = p.Match(CELParserDOT) localctx.(*SelectContext).op = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(105) + p.SetState(107) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserQUESTIONMARK { { - p.SetState(104) + p.SetState(106) var _m = p.Match(CELParserQUESTIONMARK) localctx.(*SelectContext).opt = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(107) + p.SetState(109) - var _m = p.Match(CELParserIDENTIFIER) + var _x = p.EscapeIdent() - localctx.(*SelectContext).id = _m - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } + localctx.(*SelectContext).id = _x } - case 2: localctx = NewMemberCallContext(p, NewMemberContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, CELParserRULE_member) - p.SetState(108) + p.SetState(110) if !(p.Precpred(p.GetParserRuleContext(), 2)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 2)", "")) goto errorExit } { - p.SetState(109) + p.SetState(111) var _m = p.Match(CELParserDOT) localctx.(*MemberCallContext).op = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(110) + p.SetState(112) var _m = p.Match(CELParserIDENTIFIER) localctx.(*MemberCallContext).id = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(111) + p.SetState(113) var _m = p.Match(CELParserLPAREN) localctx.(*MemberCallContext).open = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(113) + p.SetState(115) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - - if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 135762105344) != 0) { + if (int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&135762105344) != 0 { { - p.SetState(112) + p.SetState(114) var _x = p.ExprList() - localctx.(*MemberCallContext).args = _x } } { - p.SetState(115) + p.SetState(117) p.Match(CELParserRPAREN) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 3: localctx = NewIndexContext(p, NewMemberContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, CELParserRULE_member) - p.SetState(116) + p.SetState(118) if !(p.Precpred(p.GetParserRuleContext(), 1)) { p.SetError(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 1)", "")) goto errorExit } { - p.SetState(117) + p.SetState(119) var _m = p.Match(CELParserLBRACKET) localctx.(*IndexContext).op = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(119) + p.SetState(121) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserQUESTIONMARK { { - p.SetState(118) + p.SetState(120) var _m = p.Match(CELParserQUESTIONMARK) localctx.(*IndexContext).opt = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(121) + p.SetState(123) var _x = p.Expr() - localctx.(*IndexContext).index = _x } { - p.SetState(122) + p.SetState(124) p.Match(CELParserRPRACKET) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } @@ -2915,20 +2761,18 @@ func (p *CELParser) member(_p int) (localctx IMemberContext) { } } - p.SetState(128) + p.SetState(130) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 13, p.GetParserRuleContext()) if p.HasError() { goto errorExit } } - - - errorExit: +errorExit: if p.HasError() { v := p.GetError() localctx.SetException(v) @@ -2941,7 +2785,6 @@ func (p *CELParser) member(_p int) (localctx IMemberContext) { goto errorExit // Trick to prevent compiler error if the label is not used } - // IPrimaryContext is an interface to support dynamic dispatch. type IPrimaryContext interface { antlr.ParserRuleContext @@ -2964,7 +2807,7 @@ func NewEmptyPrimaryContext() *PrimaryContext { return p } -func InitEmptyPrimaryContext(p *PrimaryContext) { +func InitEmptyPrimaryContext(p *PrimaryContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_primary } @@ -2996,13 +2839,10 @@ func (s *PrimaryContext) ToStringTree(ruleNames []string, recog antlr.Recognizer return antlr.TreesStringTree(s, ruleNames, recog) } - - - type CreateListContext struct { PrimaryContext - op antlr.Token - elems IListInitContext + op antlr.Token + elems IListInitContext } func NewCreateListContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *CreateListContext { @@ -3015,16 +2855,12 @@ func NewCreateListContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Cre return p } - func (s *CreateListContext) GetOp() antlr.Token { return s.op } - func (s *CreateListContext) SetOp(v antlr.Token) { s.op = v } - func (s *CreateListContext) GetElems() IListInitContext { return s.elems } - func (s *CreateListContext) SetElems(v IListInitContext) { s.elems = v } func (s *CreateListContext) GetRuleContext() antlr.RuleContext { @@ -3044,10 +2880,10 @@ func (s *CreateListContext) COMMA() antlr.TerminalNode { } func (s *CreateListContext) ListInit() IListInitContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IListInitContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -3059,7 +2895,6 @@ func (s *CreateListContext) ListInit() IListInitContext { return t.(IListInitContext) } - func (s *CreateListContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterCreateList(s) @@ -3082,11 +2917,68 @@ func (s *CreateListContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } +type IdentContext struct { + PrimaryContext + leadingDot antlr.Token + id antlr.Token +} + +func NewIdentContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *IdentContext { + var p = new(IdentContext) + + InitEmptyPrimaryContext(&p.PrimaryContext) + p.parser = parser + p.CopyAll(ctx.(*PrimaryContext)) + + return p +} + +func (s *IdentContext) GetLeadingDot() antlr.Token { return s.leadingDot } + +func (s *IdentContext) GetId() antlr.Token { return s.id } + +func (s *IdentContext) SetLeadingDot(v antlr.Token) { s.leadingDot = v } + +func (s *IdentContext) SetId(v antlr.Token) { s.id = v } + +func (s *IdentContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *IdentContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(CELParserIDENTIFIER, 0) +} + +func (s *IdentContext) DOT() antlr.TerminalNode { + return s.GetToken(CELParserDOT, 0) +} + +func (s *IdentContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CELListener); ok { + listenerT.EnterIdent(s) + } +} + +func (s *IdentContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CELListener); ok { + listenerT.ExitIdent(s) + } +} + +func (s *IdentContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case CELVisitor: + return t.VisitIdent(s) + + default: + return t.VisitChildren(s) + } +} type CreateStructContext struct { PrimaryContext - op antlr.Token - entries IMapInitializerListContext + op antlr.Token + entries IMapInitializerListContext } func NewCreateStructContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *CreateStructContext { @@ -3099,16 +2991,12 @@ func NewCreateStructContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *C return p } - func (s *CreateStructContext) GetOp() antlr.Token { return s.op } - func (s *CreateStructContext) SetOp(v antlr.Token) { s.op = v } - func (s *CreateStructContext) GetEntries() IMapInitializerListContext { return s.entries } - func (s *CreateStructContext) SetEntries(v IMapInitializerListContext) { s.entries = v } func (s *CreateStructContext) GetRuleContext() antlr.RuleContext { @@ -3128,10 +3016,10 @@ func (s *CreateStructContext) COMMA() antlr.TerminalNode { } func (s *CreateStructContext) MapInitializerList() IMapInitializerListContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IMapInitializerListContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -3143,7 +3031,6 @@ func (s *CreateStructContext) MapInitializerList() IMapInitializerListContext { return t.(IMapInitializerListContext) } - func (s *CreateStructContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterCreateStruct(s) @@ -3166,7 +3053,6 @@ func (s *CreateStructContext) Accept(visitor antlr.ParseTreeVisitor) interface{} } } - type ConstantLiteralContext struct { PrimaryContext } @@ -3186,10 +3072,10 @@ func (s *ConstantLiteralContext) GetRuleContext() antlr.RuleContext { } func (s *ConstantLiteralContext) Literal() ILiteralContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(ILiteralContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -3201,7 +3087,6 @@ func (s *ConstantLiteralContext) Literal() ILiteralContext { return t.(ILiteralContext) } - func (s *ConstantLiteralContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterConstantLiteral(s) @@ -3224,10 +3109,9 @@ func (s *ConstantLiteralContext) Accept(visitor antlr.ParseTreeVisitor) interfac } } - type NestedContext struct { PrimaryContext - e IExprContext + e IExprContext } func NewNestedContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *NestedContext { @@ -3240,10 +3124,8 @@ func NewNestedContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *NestedC return p } - func (s *NestedContext) GetE() IExprContext { return s.e } - func (s *NestedContext) SetE(v IExprContext) { s.e = v } func (s *NestedContext) GetRuleContext() antlr.RuleContext { @@ -3259,10 +3141,10 @@ func (s *NestedContext) RPAREN() antlr.TerminalNode { } func (s *NestedContext) Expr() IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -3274,7 +3156,6 @@ func (s *NestedContext) Expr() IExprContext { return t.(IExprContext) } - func (s *NestedContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterNested(s) @@ -3297,16 +3178,15 @@ func (s *NestedContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type CreateMessageContext struct { PrimaryContext - leadingDot antlr.Token + leadingDot antlr.Token _IDENTIFIER antlr.Token - ids []antlr.Token - s16 antlr.Token - ops []antlr.Token - op antlr.Token - entries IFieldInitializerListContext + ids []antlr.Token + s16 antlr.Token + ops []antlr.Token + op antlr.Token + entries IFieldInitializerListContext } func NewCreateMessageContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *CreateMessageContext { @@ -3319,7 +3199,6 @@ func NewCreateMessageContext(parser antlr.Parser, ctx antlr.ParserRuleContext) * return p } - func (s *CreateMessageContext) GetLeadingDot() antlr.Token { return s.leadingDot } func (s *CreateMessageContext) Get_IDENTIFIER() antlr.Token { return s._IDENTIFIER } @@ -3328,7 +3207,6 @@ func (s *CreateMessageContext) GetS16() antlr.Token { return s.s16 } func (s *CreateMessageContext) GetOp() antlr.Token { return s.op } - func (s *CreateMessageContext) SetLeadingDot(v antlr.Token) { s.leadingDot = v } func (s *CreateMessageContext) Set_IDENTIFIER(v antlr.Token) { s._IDENTIFIER = v } @@ -3337,20 +3215,16 @@ func (s *CreateMessageContext) SetS16(v antlr.Token) { s.s16 = v } func (s *CreateMessageContext) SetOp(v antlr.Token) { s.op = v } - func (s *CreateMessageContext) GetIds() []antlr.Token { return s.ids } func (s *CreateMessageContext) GetOps() []antlr.Token { return s.ops } - func (s *CreateMessageContext) SetIds(v []antlr.Token) { s.ids = v } func (s *CreateMessageContext) SetOps(v []antlr.Token) { s.ops = v } - func (s *CreateMessageContext) GetEntries() IFieldInitializerListContext { return s.entries } - func (s *CreateMessageContext) SetEntries(v IFieldInitializerListContext) { s.entries = v } func (s *CreateMessageContext) GetRuleContext() antlr.RuleContext { @@ -3386,10 +3260,10 @@ func (s *CreateMessageContext) DOT(i int) antlr.TerminalNode { } func (s *CreateMessageContext) FieldInitializerList() IFieldInitializerListContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IFieldInitializerListContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -3401,7 +3275,6 @@ func (s *CreateMessageContext) FieldInitializerList() IFieldInitializerListConte return t.(IFieldInitializerListContext) } - func (s *CreateMessageContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterCreateMessage(s) @@ -3424,17 +3297,16 @@ func (s *CreateMessageContext) Accept(visitor antlr.ParseTreeVisitor) interface{ } } - -type IdentOrGlobalCallContext struct { +type GlobalCallContext struct { PrimaryContext leadingDot antlr.Token - id antlr.Token - op antlr.Token - args IExprListContext + id antlr.Token + op antlr.Token + args IExprListContext } -func NewIdentOrGlobalCallContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *IdentOrGlobalCallContext { - var p = new(IdentOrGlobalCallContext) +func NewGlobalCallContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *GlobalCallContext { + var p = new(GlobalCallContext) InitEmptyPrimaryContext(&p.PrimaryContext) p.parser = parser @@ -3443,51 +3315,47 @@ func NewIdentOrGlobalCallContext(parser antlr.Parser, ctx antlr.ParserRuleContex return p } +func (s *GlobalCallContext) GetLeadingDot() antlr.Token { return s.leadingDot } -func (s *IdentOrGlobalCallContext) GetLeadingDot() antlr.Token { return s.leadingDot } +func (s *GlobalCallContext) GetId() antlr.Token { return s.id } -func (s *IdentOrGlobalCallContext) GetId() antlr.Token { return s.id } +func (s *GlobalCallContext) GetOp() antlr.Token { return s.op } -func (s *IdentOrGlobalCallContext) GetOp() antlr.Token { return s.op } +func (s *GlobalCallContext) SetLeadingDot(v antlr.Token) { s.leadingDot = v } +func (s *GlobalCallContext) SetId(v antlr.Token) { s.id = v } -func (s *IdentOrGlobalCallContext) SetLeadingDot(v antlr.Token) { s.leadingDot = v } +func (s *GlobalCallContext) SetOp(v antlr.Token) { s.op = v } -func (s *IdentOrGlobalCallContext) SetId(v antlr.Token) { s.id = v } +func (s *GlobalCallContext) GetArgs() IExprListContext { return s.args } -func (s *IdentOrGlobalCallContext) SetOp(v antlr.Token) { s.op = v } +func (s *GlobalCallContext) SetArgs(v IExprListContext) { s.args = v } - -func (s *IdentOrGlobalCallContext) GetArgs() IExprListContext { return s.args } - - -func (s *IdentOrGlobalCallContext) SetArgs(v IExprListContext) { s.args = v } - -func (s *IdentOrGlobalCallContext) GetRuleContext() antlr.RuleContext { +func (s *GlobalCallContext) GetRuleContext() antlr.RuleContext { return s } -func (s *IdentOrGlobalCallContext) IDENTIFIER() antlr.TerminalNode { +func (s *GlobalCallContext) IDENTIFIER() antlr.TerminalNode { return s.GetToken(CELParserIDENTIFIER, 0) } -func (s *IdentOrGlobalCallContext) RPAREN() antlr.TerminalNode { +func (s *GlobalCallContext) RPAREN() antlr.TerminalNode { return s.GetToken(CELParserRPAREN, 0) } -func (s *IdentOrGlobalCallContext) DOT() antlr.TerminalNode { - return s.GetToken(CELParserDOT, 0) +func (s *GlobalCallContext) LPAREN() antlr.TerminalNode { + return s.GetToken(CELParserLPAREN, 0) } -func (s *IdentOrGlobalCallContext) LPAREN() antlr.TerminalNode { - return s.GetToken(CELParserLPAREN, 0) +func (s *GlobalCallContext) DOT() antlr.TerminalNode { + return s.GetToken(CELParserDOT, 0) } -func (s *IdentOrGlobalCallContext) ExprList() IExprListContext { - var t antlr.RuleContext; +func (s *GlobalCallContext) ExprList() IExprListContext { + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprListContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -3499,37 +3367,34 @@ func (s *IdentOrGlobalCallContext) ExprList() IExprListContext { return t.(IExprListContext) } - -func (s *IdentOrGlobalCallContext) EnterRule(listener antlr.ParseTreeListener) { +func (s *GlobalCallContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { - listenerT.EnterIdentOrGlobalCall(s) + listenerT.EnterGlobalCall(s) } } -func (s *IdentOrGlobalCallContext) ExitRule(listener antlr.ParseTreeListener) { +func (s *GlobalCallContext) ExitRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { - listenerT.ExitIdentOrGlobalCall(s) + listenerT.ExitGlobalCall(s) } } -func (s *IdentOrGlobalCallContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { +func (s *GlobalCallContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { switch t := visitor.(type) { case CELVisitor: - return t.VisitIdentOrGlobalCall(s) + return t.VisitGlobalCall(s) default: return t.VisitChildren(s) } } - - func (p *CELParser) Primary() (localctx IPrimaryContext) { localctx = NewPrimaryContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 16, CELParserRULE_primary) var _la int - p.SetState(180) + p.SetState(184) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -3537,386 +3402,393 @@ func (p *CELParser) Primary() (localctx IPrimaryContext) { switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 25, p.GetParserRuleContext()) { case 1: - localctx = NewIdentOrGlobalCallContext(p, localctx) + localctx = NewIdentContext(p, localctx) p.EnterOuterAlt(localctx, 1) - p.SetState(130) + p.SetState(132) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserDOT { { - p.SetState(129) + p.SetState(131) var _m = p.Match(CELParserDOT) - localctx.(*IdentOrGlobalCallContext).leadingDot = _m + localctx.(*IdentContext).leadingDot = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(132) + p.SetState(134) var _m = p.Match(CELParserIDENTIFIER) - localctx.(*IdentOrGlobalCallContext).id = _m + localctx.(*IdentContext).id = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(138) - p.GetErrorHandler().Sync(p) + case 2: + localctx = NewGlobalCallContext(p, localctx) + p.EnterOuterAlt(localctx, 2) + p.SetState(136) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) - if p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 16, p.GetParserRuleContext()) == 1 { + if _la == CELParserDOT { { - p.SetState(133) + p.SetState(135) - var _m = p.Match(CELParserLPAREN) + var _m = p.Match(CELParserDOT) - localctx.(*IdentOrGlobalCallContext).op = _m + localctx.(*GlobalCallContext).leadingDot = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(135) - p.GetErrorHandler().Sync(p) + + } + { + p.SetState(138) + + var _m = p.Match(CELParserIDENTIFIER) + + localctx.(*GlobalCallContext).id = _m if p.HasError() { + // Recognition error - abort rule goto errorExit } - _la = p.GetTokenStream().LA(1) + } + { + p.SetState(139) - if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 135762105344) != 0) { - { - p.SetState(134) + var _m = p.Match(CELParserLPAREN) - var _x = p.ExprList() + localctx.(*GlobalCallContext).op = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + p.SetState(141) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _la = p.GetTokenStream().LA(1) + if (int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&135762105344) != 0 { + { + p.SetState(140) - localctx.(*IdentOrGlobalCallContext).args = _x - } + var _x = p.ExprList() - } - { - p.SetState(137) - p.Match(CELParserRPAREN) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } + localctx.(*GlobalCallContext).args = _x } - } else if p.HasError() { // JIM + } + { + p.SetState(143) + p.Match(CELParserRPAREN) + if p.HasError() { + // Recognition error - abort rule goto errorExit + } } - - case 2: + case 3: localctx = NewNestedContext(p, localctx) - p.EnterOuterAlt(localctx, 2) + p.EnterOuterAlt(localctx, 3) { - p.SetState(140) + p.SetState(144) p.Match(CELParserLPAREN) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(141) + p.SetState(145) var _x = p.Expr() - localctx.(*NestedContext).e = _x } { - p.SetState(142) + p.SetState(146) p.Match(CELParserRPAREN) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - - case 3: + case 4: localctx = NewCreateListContext(p, localctx) - p.EnterOuterAlt(localctx, 3) + p.EnterOuterAlt(localctx, 4) { - p.SetState(144) + p.SetState(148) var _m = p.Match(CELParserLBRACKET) localctx.(*CreateListContext).op = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(146) + p.SetState(150) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - - if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 135763153920) != 0) { + if (int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&135763153920) != 0 { { - p.SetState(145) + p.SetState(149) var _x = p.ListInit() - localctx.(*CreateListContext).elems = _x } } - p.SetState(149) + p.SetState(153) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserCOMMA { { - p.SetState(148) + p.SetState(152) p.Match(CELParserCOMMA) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(151) + p.SetState(155) p.Match(CELParserRPRACKET) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - - case 4: + case 5: localctx = NewCreateStructContext(p, localctx) - p.EnterOuterAlt(localctx, 4) + p.EnterOuterAlt(localctx, 5) { - p.SetState(152) + p.SetState(156) var _m = p.Match(CELParserLBRACE) localctx.(*CreateStructContext).op = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(154) + p.SetState(158) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - - if ((int64(_la) & ^0x3f) == 0 && ((int64(1) << _la) & 135763153920) != 0) { + if (int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&135763153920) != 0 { { - p.SetState(153) + p.SetState(157) var _x = p.MapInitializerList() - localctx.(*CreateStructContext).entries = _x } } - p.SetState(157) + p.SetState(161) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserCOMMA { { - p.SetState(156) + p.SetState(160) p.Match(CELParserCOMMA) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(159) + p.SetState(163) p.Match(CELParserRBRACE) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - - case 5: + case 6: localctx = NewCreateMessageContext(p, localctx) - p.EnterOuterAlt(localctx, 5) - p.SetState(161) + p.EnterOuterAlt(localctx, 6) + p.SetState(165) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserDOT { { - p.SetState(160) + p.SetState(164) var _m = p.Match(CELParserDOT) localctx.(*CreateMessageContext).leadingDot = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(163) + p.SetState(167) var _m = p.Match(CELParserIDENTIFIER) localctx.(*CreateMessageContext)._IDENTIFIER = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*CreateMessageContext).ids = append(localctx.(*CreateMessageContext).ids, localctx.(*CreateMessageContext)._IDENTIFIER) - p.SetState(168) + p.SetState(172) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - for _la == CELParserDOT { { - p.SetState(164) + p.SetState(168) var _m = p.Match(CELParserDOT) localctx.(*CreateMessageContext).s16 = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*CreateMessageContext).ops = append(localctx.(*CreateMessageContext).ops, localctx.(*CreateMessageContext).s16) { - p.SetState(165) + p.SetState(169) var _m = p.Match(CELParserIDENTIFIER) localctx.(*CreateMessageContext)._IDENTIFIER = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*CreateMessageContext).ids = append(localctx.(*CreateMessageContext).ids, localctx.(*CreateMessageContext)._IDENTIFIER) - - p.SetState(170) + p.SetState(174) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _la = p.GetTokenStream().LA(1) } { - p.SetState(171) + p.SetState(175) var _m = p.Match(CELParserLBRACE) localctx.(*CreateMessageContext).op = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - p.SetState(173) + p.SetState(177) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - - if _la == CELParserQUESTIONMARK || _la == CELParserIDENTIFIER { + if (int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&206159478784) != 0 { { - p.SetState(172) + p.SetState(176) var _x = p.FieldInitializerList() - localctx.(*CreateMessageContext).entries = _x } } - p.SetState(176) + p.SetState(180) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserCOMMA { { - p.SetState(175) + p.SetState(179) p.Match(CELParserCOMMA) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(178) + p.SetState(182) p.Match(CELParserRBRACE) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - - case 6: + case 7: localctx = NewConstantLiteralContext(p, localctx) - p.EnterOuterAlt(localctx, 6) + p.EnterOuterAlt(localctx, 7) { - p.SetState(179) + p.SetState(183) p.Literal() } @@ -3924,7 +3796,6 @@ func (p *CELParser) Primary() (localctx IPrimaryContext) { goto errorExit } - errorExit: if p.HasError() { v := p.GetError() @@ -3938,7 +3809,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IExprListContext is an interface to support dynamic dispatch. type IExprListContext interface { antlr.ParserRuleContext @@ -3949,18 +3819,14 @@ type IExprListContext interface { // Get_expr returns the _expr rule contexts. Get_expr() IExprContext - // Set_expr sets the _expr rule contexts. Set_expr(IExprContext) - // GetE returns the e rule context list. GetE() []IExprContext - // SetE sets the e rule context list. - SetE([]IExprContext) - + SetE([]IExprContext) // Getter signatures AllExpr() []IExprContext @@ -3975,8 +3841,8 @@ type IExprListContext interface { type ExprListContext struct { antlr.BaseParserRuleContext parser antlr.Parser - _expr IExprContext - e []IExprContext + _expr IExprContext + e []IExprContext } func NewEmptyExprListContext() *ExprListContext { @@ -3986,7 +3852,7 @@ func NewEmptyExprListContext() *ExprListContext { return p } -func InitEmptyExprListContext(p *ExprListContext) { +func InitEmptyExprListContext(p *ExprListContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_exprList } @@ -4008,16 +3874,12 @@ func (s *ExprListContext) GetParser() antlr.Parser { return s.parser } func (s *ExprListContext) Get_expr() IExprContext { return s._expr } - func (s *ExprListContext) Set_expr(v IExprContext) { s._expr = v } - func (s *ExprListContext) GetE() []IExprContext { return s.e } - func (s *ExprListContext) SetE(v []IExprContext) { s.e = v } - func (s *ExprListContext) AllExpr() []IExprContext { children := s.GetChildren() len := 0 @@ -4040,12 +3902,12 @@ func (s *ExprListContext) AllExpr() []IExprContext { } func (s *ExprListContext) Expr(i int) IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -4075,7 +3937,6 @@ func (s *ExprListContext) ToStringTree(ruleNames []string, recog antlr.Recognize return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *ExprListContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterExprList(s) @@ -4098,9 +3959,6 @@ func (s *ExprListContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - func (p *CELParser) ExprList() (localctx IExprListContext) { localctx = NewExprListContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 18, CELParserRULE_exprList) @@ -4108,52 +3966,46 @@ func (p *CELParser) ExprList() (localctx IExprListContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(182) + p.SetState(186) var _x = p.Expr() - localctx.(*ExprListContext)._expr = _x } localctx.(*ExprListContext).e = append(localctx.(*ExprListContext).e, localctx.(*ExprListContext)._expr) - p.SetState(187) + p.SetState(191) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - for _la == CELParserCOMMA { { - p.SetState(183) + p.SetState(187) p.Match(CELParserCOMMA) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(184) + p.SetState(188) var _x = p.Expr() - localctx.(*ExprListContext)._expr = _x } localctx.(*ExprListContext).e = append(localctx.(*ExprListContext).e, localctx.(*ExprListContext)._expr) - - p.SetState(189) + p.SetState(193) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _la = p.GetTokenStream().LA(1) } - - errorExit: if p.HasError() { v := p.GetError() @@ -4167,7 +4019,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IListInitContext is an interface to support dynamic dispatch. type IListInitContext interface { antlr.ParserRuleContext @@ -4178,18 +4029,14 @@ type IListInitContext interface { // Get_optExpr returns the _optExpr rule contexts. Get_optExpr() IOptExprContext - // Set_optExpr sets the _optExpr rule contexts. Set_optExpr(IOptExprContext) - // GetElems returns the elems rule context list. GetElems() []IOptExprContext - // SetElems sets the elems rule context list. - SetElems([]IOptExprContext) - + SetElems([]IOptExprContext) // Getter signatures AllOptExpr() []IOptExprContext @@ -4203,9 +4050,9 @@ type IListInitContext interface { type ListInitContext struct { antlr.BaseParserRuleContext - parser antlr.Parser - _optExpr IOptExprContext - elems []IOptExprContext + parser antlr.Parser + _optExpr IOptExprContext + elems []IOptExprContext } func NewEmptyListInitContext() *ListInitContext { @@ -4215,7 +4062,7 @@ func NewEmptyListInitContext() *ListInitContext { return p } -func InitEmptyListInitContext(p *ListInitContext) { +func InitEmptyListInitContext(p *ListInitContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_listInit } @@ -4237,16 +4084,12 @@ func (s *ListInitContext) GetParser() antlr.Parser { return s.parser } func (s *ListInitContext) Get_optExpr() IOptExprContext { return s._optExpr } - func (s *ListInitContext) Set_optExpr(v IOptExprContext) { s._optExpr = v } - func (s *ListInitContext) GetElems() []IOptExprContext { return s.elems } - func (s *ListInitContext) SetElems(v []IOptExprContext) { s.elems = v } - func (s *ListInitContext) AllOptExpr() []IOptExprContext { children := s.GetChildren() len := 0 @@ -4269,12 +4112,12 @@ func (s *ListInitContext) AllOptExpr() []IOptExprContext { } func (s *ListInitContext) OptExpr(i int) IOptExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IOptExprContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -4304,7 +4147,6 @@ func (s *ListInitContext) ToStringTree(ruleNames []string, recog antlr.Recognize return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *ListInitContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterListInit(s) @@ -4327,9 +4169,6 @@ func (s *ListInitContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - func (p *CELParser) ListInit() (localctx IListInitContext) { localctx = NewListInitContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 20, CELParserRULE_listInit) @@ -4337,15 +4176,14 @@ func (p *CELParser) ListInit() (localctx IListInitContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(190) + p.SetState(194) var _x = p.OptExpr() - localctx.(*ListInitContext)._optExpr = _x } localctx.(*ListInitContext).elems = append(localctx.(*ListInitContext).elems, localctx.(*ListInitContext)._optExpr) - p.SetState(195) + p.SetState(199) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4357,38 +4195,34 @@ func (p *CELParser) ListInit() (localctx IListInitContext) { for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(191) + p.SetState(195) p.Match(CELParserCOMMA) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(192) + p.SetState(196) var _x = p.OptExpr() - localctx.(*ListInitContext)._optExpr = _x } localctx.(*ListInitContext).elems = append(localctx.(*ListInitContext).elems, localctx.(*ListInitContext)._optExpr) - } - p.SetState(197) + p.SetState(201) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 27, p.GetParserRuleContext()) if p.HasError() { goto errorExit } } - - errorExit: if p.HasError() { v := p.GetError() @@ -4402,7 +4236,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IFieldInitializerListContext is an interface to support dynamic dispatch. type IFieldInitializerListContext interface { antlr.ParserRuleContext @@ -4411,48 +4244,40 @@ type IFieldInitializerListContext interface { GetParser() antlr.Parser // GetS21 returns the s21 token. - GetS21() antlr.Token - + GetS21() antlr.Token // SetS21 sets the s21 token. - SetS21(antlr.Token) - + SetS21(antlr.Token) // GetCols returns the cols token list. GetCols() []antlr.Token - // SetCols sets the cols token list. SetCols([]antlr.Token) - // Get_optField returns the _optField rule contexts. Get_optField() IOptFieldContext // Get_expr returns the _expr rule contexts. Get_expr() IExprContext - // Set_optField sets the _optField rule contexts. Set_optField(IOptFieldContext) // Set_expr sets the _expr rule contexts. Set_expr(IExprContext) - // GetFields returns the fields rule context list. GetFields() []IOptFieldContext // GetValues returns the values rule context list. GetValues() []IExprContext - // SetFields sets the fields rule context list. - SetFields([]IOptFieldContext) + SetFields([]IOptFieldContext) // SetValues sets the values rule context list. - SetValues([]IExprContext) - + SetValues([]IExprContext) // Getter signatures AllOptField() []IOptFieldContext @@ -4470,13 +4295,13 @@ type IFieldInitializerListContext interface { type FieldInitializerListContext struct { antlr.BaseParserRuleContext - parser antlr.Parser - _optField IOptFieldContext - fields []IOptFieldContext - s21 antlr.Token - cols []antlr.Token - _expr IExprContext - values []IExprContext + parser antlr.Parser + _optField IOptFieldContext + fields []IOptFieldContext + s21 antlr.Token + cols []antlr.Token + _expr IExprContext + values []IExprContext } func NewEmptyFieldInitializerListContext() *FieldInitializerListContext { @@ -4486,7 +4311,7 @@ func NewEmptyFieldInitializerListContext() *FieldInitializerListContext { return p } -func InitEmptyFieldInitializerListContext(p *FieldInitializerListContext) { +func InitEmptyFieldInitializerListContext(p *FieldInitializerListContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_fieldInitializerList } @@ -4508,36 +4333,28 @@ func (s *FieldInitializerListContext) GetParser() antlr.Parser { return s.parser func (s *FieldInitializerListContext) GetS21() antlr.Token { return s.s21 } - func (s *FieldInitializerListContext) SetS21(v antlr.Token) { s.s21 = v } - func (s *FieldInitializerListContext) GetCols() []antlr.Token { return s.cols } - func (s *FieldInitializerListContext) SetCols(v []antlr.Token) { s.cols = v } - func (s *FieldInitializerListContext) Get_optField() IOptFieldContext { return s._optField } func (s *FieldInitializerListContext) Get_expr() IExprContext { return s._expr } - func (s *FieldInitializerListContext) Set_optField(v IOptFieldContext) { s._optField = v } func (s *FieldInitializerListContext) Set_expr(v IExprContext) { s._expr = v } - func (s *FieldInitializerListContext) GetFields() []IOptFieldContext { return s.fields } func (s *FieldInitializerListContext) GetValues() []IExprContext { return s.values } - func (s *FieldInitializerListContext) SetFields(v []IOptFieldContext) { s.fields = v } func (s *FieldInitializerListContext) SetValues(v []IExprContext) { s.values = v } - func (s *FieldInitializerListContext) AllOptField() []IOptFieldContext { children := s.GetChildren() len := 0 @@ -4560,12 +4377,12 @@ func (s *FieldInitializerListContext) AllOptField() []IOptFieldContext { } func (s *FieldInitializerListContext) OptField(i int) IOptFieldContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IOptFieldContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -4609,12 +4426,12 @@ func (s *FieldInitializerListContext) AllExpr() []IExprContext { } func (s *FieldInitializerListContext) Expr(i int) IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -4644,7 +4461,6 @@ func (s *FieldInitializerListContext) ToStringTree(ruleNames []string, recog ant return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *FieldInitializerListContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterFieldInitializerList(s) @@ -4667,9 +4483,6 @@ func (s *FieldInitializerListContext) Accept(visitor antlr.ParseTreeVisitor) int } } - - - func (p *CELParser) FieldInitializerList() (localctx IFieldInitializerListContext) { localctx = NewFieldInitializerListContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 22, CELParserRULE_fieldInitializerList) @@ -4677,36 +4490,34 @@ func (p *CELParser) FieldInitializerList() (localctx IFieldInitializerListContex p.EnterOuterAlt(localctx, 1) { - p.SetState(198) + p.SetState(202) var _x = p.OptField() - localctx.(*FieldInitializerListContext)._optField = _x } localctx.(*FieldInitializerListContext).fields = append(localctx.(*FieldInitializerListContext).fields, localctx.(*FieldInitializerListContext)._optField) { - p.SetState(199) + p.SetState(203) var _m = p.Match(CELParserCOLON) localctx.(*FieldInitializerListContext).s21 = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*FieldInitializerListContext).cols = append(localctx.(*FieldInitializerListContext).cols, localctx.(*FieldInitializerListContext).s21) { - p.SetState(200) + p.SetState(204) var _x = p.Expr() - localctx.(*FieldInitializerListContext)._expr = _x } localctx.(*FieldInitializerListContext).values = append(localctx.(*FieldInitializerListContext).values, localctx.(*FieldInitializerListContext)._expr) - p.SetState(208) + p.SetState(212) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit @@ -4718,59 +4529,54 @@ func (p *CELParser) FieldInitializerList() (localctx IFieldInitializerListContex for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(201) + p.SetState(205) p.Match(CELParserCOMMA) if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } { - p.SetState(202) + p.SetState(206) var _x = p.OptField() - localctx.(*FieldInitializerListContext)._optField = _x } localctx.(*FieldInitializerListContext).fields = append(localctx.(*FieldInitializerListContext).fields, localctx.(*FieldInitializerListContext)._optField) { - p.SetState(203) + p.SetState(207) var _m = p.Match(CELParserCOLON) localctx.(*FieldInitializerListContext).s21 = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } localctx.(*FieldInitializerListContext).cols = append(localctx.(*FieldInitializerListContext).cols, localctx.(*FieldInitializerListContext).s21) { - p.SetState(204) + p.SetState(208) var _x = p.Expr() - localctx.(*FieldInitializerListContext)._expr = _x } localctx.(*FieldInitializerListContext).values = append(localctx.(*FieldInitializerListContext).values, localctx.(*FieldInitializerListContext)._expr) - } - p.SetState(210) + p.SetState(214) p.GetErrorHandler().Sync(p) if p.HasError() { - goto errorExit - } + goto errorExit + } _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 28, p.GetParserRuleContext()) if p.HasError() { goto errorExit } } - - errorExit: if p.HasError() { v := p.GetError() @@ -4784,7 +4590,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IOptFieldContext is an interface to support dynamic dispatch. type IOptFieldContext interface { antlr.ParserRuleContext @@ -4793,15 +4598,13 @@ type IOptFieldContext interface { GetParser() antlr.Parser // GetOpt returns the opt token. - GetOpt() antlr.Token - + GetOpt() antlr.Token // SetOpt sets the opt token. - SetOpt(antlr.Token) - + SetOpt(antlr.Token) // Getter signatures - IDENTIFIER() antlr.TerminalNode + EscapeIdent() IEscapeIdentContext QUESTIONMARK() antlr.TerminalNode // IsOptFieldContext differentiates from other interfaces. @@ -4811,7 +4614,7 @@ type IOptFieldContext interface { type OptFieldContext struct { antlr.BaseParserRuleContext parser antlr.Parser - opt antlr.Token + opt antlr.Token } func NewEmptyOptFieldContext() *OptFieldContext { @@ -4821,7 +4624,7 @@ func NewEmptyOptFieldContext() *OptFieldContext { return p } -func InitEmptyOptFieldContext(p *OptFieldContext) { +func InitEmptyOptFieldContext(p *OptFieldContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_optField } @@ -4843,12 +4646,22 @@ func (s *OptFieldContext) GetParser() antlr.Parser { return s.parser } func (s *OptFieldContext) GetOpt() antlr.Token { return s.opt } - func (s *OptFieldContext) SetOpt(v antlr.Token) { s.opt = v } +func (s *OptFieldContext) EscapeIdent() IEscapeIdentContext { + var t antlr.RuleContext + for _, ctx := range s.GetChildren() { + if _, ok := ctx.(IEscapeIdentContext); ok { + t = ctx.(antlr.RuleContext) + break + } + } -func (s *OptFieldContext) IDENTIFIER() antlr.TerminalNode { - return s.GetToken(CELParserIDENTIFIER, 0) + if t == nil { + return nil + } + + return t.(IEscapeIdentContext) } func (s *OptFieldContext) QUESTIONMARK() antlr.TerminalNode { @@ -4863,7 +4676,6 @@ func (s *OptFieldContext) ToStringTree(ruleNames []string, recog antlr.Recognize return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *OptFieldContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterOptField(s) @@ -4886,48 +4698,38 @@ func (s *OptFieldContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - func (p *CELParser) OptField() (localctx IOptFieldContext) { localctx = NewOptFieldContext(p, p.GetParserRuleContext(), p.GetState()) p.EnterRule(localctx, 24, CELParserRULE_optField) var _la int p.EnterOuterAlt(localctx, 1) - p.SetState(212) + p.SetState(216) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserQUESTIONMARK { { - p.SetState(211) + p.SetState(215) var _m = p.Match(CELParserQUESTIONMARK) localctx.(*OptFieldContext).opt = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(214) - p.Match(CELParserIDENTIFIER) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } + p.SetState(218) + p.EscapeIdent() } - - errorExit: if p.HasError() { v := p.GetError() @@ -4941,7 +4743,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IMapInitializerListContext is an interface to support dynamic dispatch. type IMapInitializerListContext interface { antlr.ParserRuleContext @@ -4950,48 +4751,40 @@ type IMapInitializerListContext interface { GetParser() antlr.Parser // GetS21 returns the s21 token. - GetS21() antlr.Token - + GetS21() antlr.Token // SetS21 sets the s21 token. - SetS21(antlr.Token) - + SetS21(antlr.Token) // GetCols returns the cols token list. GetCols() []antlr.Token - // SetCols sets the cols token list. SetCols([]antlr.Token) - // Get_optExpr returns the _optExpr rule contexts. Get_optExpr() IOptExprContext // Get_expr returns the _expr rule contexts. Get_expr() IExprContext - // Set_optExpr sets the _optExpr rule contexts. Set_optExpr(IOptExprContext) // Set_expr sets the _expr rule contexts. Set_expr(IExprContext) - // GetKeys returns the keys rule context list. GetKeys() []IOptExprContext // GetValues returns the values rule context list. GetValues() []IExprContext - // SetKeys sets the keys rule context list. - SetKeys([]IOptExprContext) + SetKeys([]IOptExprContext) // SetValues sets the values rule context list. - SetValues([]IExprContext) - + SetValues([]IExprContext) // Getter signatures AllOptExpr() []IOptExprContext @@ -5009,13 +4802,13 @@ type IMapInitializerListContext interface { type MapInitializerListContext struct { antlr.BaseParserRuleContext - parser antlr.Parser - _optExpr IOptExprContext - keys []IOptExprContext - s21 antlr.Token - cols []antlr.Token - _expr IExprContext - values []IExprContext + parser antlr.Parser + _optExpr IOptExprContext + keys []IOptExprContext + s21 antlr.Token + cols []antlr.Token + _expr IExprContext + values []IExprContext } func NewEmptyMapInitializerListContext() *MapInitializerListContext { @@ -5025,7 +4818,7 @@ func NewEmptyMapInitializerListContext() *MapInitializerListContext { return p } -func InitEmptyMapInitializerListContext(p *MapInitializerListContext) { +func InitEmptyMapInitializerListContext(p *MapInitializerListContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_mapInitializerList } @@ -5047,36 +4840,28 @@ func (s *MapInitializerListContext) GetParser() antlr.Parser { return s.parser } func (s *MapInitializerListContext) GetS21() antlr.Token { return s.s21 } - func (s *MapInitializerListContext) SetS21(v antlr.Token) { s.s21 = v } - func (s *MapInitializerListContext) GetCols() []antlr.Token { return s.cols } - func (s *MapInitializerListContext) SetCols(v []antlr.Token) { s.cols = v } - func (s *MapInitializerListContext) Get_optExpr() IOptExprContext { return s._optExpr } func (s *MapInitializerListContext) Get_expr() IExprContext { return s._expr } - func (s *MapInitializerListContext) Set_optExpr(v IOptExprContext) { s._optExpr = v } func (s *MapInitializerListContext) Set_expr(v IExprContext) { s._expr = v } - func (s *MapInitializerListContext) GetKeys() []IOptExprContext { return s.keys } func (s *MapInitializerListContext) GetValues() []IExprContext { return s.values } - func (s *MapInitializerListContext) SetKeys(v []IOptExprContext) { s.keys = v } func (s *MapInitializerListContext) SetValues(v []IExprContext) { s.values = v } - func (s *MapInitializerListContext) AllOptExpr() []IOptExprContext { children := s.GetChildren() len := 0 @@ -5099,12 +4884,12 @@ func (s *MapInitializerListContext) AllOptExpr() []IOptExprContext { } func (s *MapInitializerListContext) OptExpr(i int) IOptExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IOptExprContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ @@ -5148,167 +4933,366 @@ func (s *MapInitializerListContext) AllExpr() []IExprContext { } func (s *MapInitializerListContext) Expr(i int) IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext j := 0 for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { if j == i { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } j++ } } - if t == nil { - return nil - } + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *MapInitializerListContext) AllCOMMA() []antlr.TerminalNode { + return s.GetTokens(CELParserCOMMA) +} + +func (s *MapInitializerListContext) COMMA(i int) antlr.TerminalNode { + return s.GetToken(CELParserCOMMA, i) +} + +func (s *MapInitializerListContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *MapInitializerListContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *MapInitializerListContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CELListener); ok { + listenerT.EnterMapInitializerList(s) + } +} + +func (s *MapInitializerListContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CELListener); ok { + listenerT.ExitMapInitializerList(s) + } +} + +func (s *MapInitializerListContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case CELVisitor: + return t.VisitMapInitializerList(s) + + default: + return t.VisitChildren(s) + } +} + +func (p *CELParser) MapInitializerList() (localctx IMapInitializerListContext) { + localctx = NewMapInitializerListContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 26, CELParserRULE_mapInitializerList) + var _alt int + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(220) + + var _x = p.OptExpr() + + localctx.(*MapInitializerListContext)._optExpr = _x + } + localctx.(*MapInitializerListContext).keys = append(localctx.(*MapInitializerListContext).keys, localctx.(*MapInitializerListContext)._optExpr) + { + p.SetState(221) + + var _m = p.Match(CELParserCOLON) + + localctx.(*MapInitializerListContext).s21 = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + localctx.(*MapInitializerListContext).cols = append(localctx.(*MapInitializerListContext).cols, localctx.(*MapInitializerListContext).s21) + { + p.SetState(222) + + var _x = p.Expr() + + localctx.(*MapInitializerListContext)._expr = _x + } + localctx.(*MapInitializerListContext).values = append(localctx.(*MapInitializerListContext).values, localctx.(*MapInitializerListContext)._expr) + p.SetState(230) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 30, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { + if _alt == 1 { + { + p.SetState(223) + p.Match(CELParserCOMMA) + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + { + p.SetState(224) + + var _x = p.OptExpr() + + localctx.(*MapInitializerListContext)._optExpr = _x + } + localctx.(*MapInitializerListContext).keys = append(localctx.(*MapInitializerListContext).keys, localctx.(*MapInitializerListContext)._optExpr) + { + p.SetState(225) + + var _m = p.Match(CELParserCOLON) + + localctx.(*MapInitializerListContext).s21 = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit + } + } + localctx.(*MapInitializerListContext).cols = append(localctx.(*MapInitializerListContext).cols, localctx.(*MapInitializerListContext).s21) + { + p.SetState(226) + + var _x = p.Expr() + + localctx.(*MapInitializerListContext)._expr = _x + } + localctx.(*MapInitializerListContext).values = append(localctx.(*MapInitializerListContext).values, localctx.(*MapInitializerListContext)._expr) + + } + p.SetState(232) + p.GetErrorHandler().Sync(p) + if p.HasError() { + goto errorExit + } + _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 30, p.GetParserRuleContext()) + if p.HasError() { + goto errorExit + } + } + +errorExit: + if p.HasError() { + v := p.GetError() + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + p.SetError(nil) + } + p.ExitRule() + return localctx + goto errorExit // Trick to prevent compiler error if the label is not used +} + +// IEscapeIdentContext is an interface to support dynamic dispatch. +type IEscapeIdentContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + // IsEscapeIdentContext differentiates from other interfaces. + IsEscapeIdentContext() +} + +type EscapeIdentContext struct { + antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyEscapeIdentContext() *EscapeIdentContext { + var p = new(EscapeIdentContext) + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = CELParserRULE_escapeIdent + return p +} + +func InitEmptyEscapeIdentContext(p *EscapeIdentContext) { + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) + p.RuleIndex = CELParserRULE_escapeIdent +} + +func (*EscapeIdentContext) IsEscapeIdentContext() {} + +func NewEscapeIdentContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *EscapeIdentContext { + var p = new(EscapeIdentContext) + + antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, parent, invokingState) + + p.parser = parser + p.RuleIndex = CELParserRULE_escapeIdent + + return p +} + +func (s *EscapeIdentContext) GetParser() antlr.Parser { return s.parser } + +func (s *EscapeIdentContext) CopyAll(ctx *EscapeIdentContext) { + s.CopyFrom(&ctx.BaseParserRuleContext) +} + +func (s *EscapeIdentContext) GetRuleContext() antlr.RuleContext { + return s +} - return t.(IExprContext) +func (s *EscapeIdentContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) } -func (s *MapInitializerListContext) AllCOMMA() []antlr.TerminalNode { - return s.GetTokens(CELParserCOMMA) +type EscapedIdentifierContext struct { + EscapeIdentContext + id antlr.Token } -func (s *MapInitializerListContext) COMMA(i int) antlr.TerminalNode { - return s.GetToken(CELParserCOMMA, i) +func NewEscapedIdentifierContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *EscapedIdentifierContext { + var p = new(EscapedIdentifierContext) + + InitEmptyEscapeIdentContext(&p.EscapeIdentContext) + p.parser = parser + p.CopyAll(ctx.(*EscapeIdentContext)) + + return p } -func (s *MapInitializerListContext) GetRuleContext() antlr.RuleContext { +func (s *EscapedIdentifierContext) GetId() antlr.Token { return s.id } + +func (s *EscapedIdentifierContext) SetId(v antlr.Token) { s.id = v } + +func (s *EscapedIdentifierContext) GetRuleContext() antlr.RuleContext { return s } -func (s *MapInitializerListContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { - return antlr.TreesStringTree(s, ruleNames, recog) +func (s *EscapedIdentifierContext) ESC_IDENTIFIER() antlr.TerminalNode { + return s.GetToken(CELParserESC_IDENTIFIER, 0) } - -func (s *MapInitializerListContext) EnterRule(listener antlr.ParseTreeListener) { +func (s *EscapedIdentifierContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { - listenerT.EnterMapInitializerList(s) + listenerT.EnterEscapedIdentifier(s) } } -func (s *MapInitializerListContext) ExitRule(listener antlr.ParseTreeListener) { +func (s *EscapedIdentifierContext) ExitRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { - listenerT.ExitMapInitializerList(s) + listenerT.ExitEscapedIdentifier(s) } } -func (s *MapInitializerListContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { +func (s *EscapedIdentifierContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { switch t := visitor.(type) { case CELVisitor: - return t.VisitMapInitializerList(s) + return t.VisitEscapedIdentifier(s) default: return t.VisitChildren(s) } } +type SimpleIdentifierContext struct { + EscapeIdentContext + id antlr.Token +} +func NewSimpleIdentifierContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *SimpleIdentifierContext { + var p = new(SimpleIdentifierContext) + InitEmptyEscapeIdentContext(&p.EscapeIdentContext) + p.parser = parser + p.CopyAll(ctx.(*EscapeIdentContext)) -func (p *CELParser) MapInitializerList() (localctx IMapInitializerListContext) { - localctx = NewMapInitializerListContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 26, CELParserRULE_mapInitializerList) - var _alt int - - p.EnterOuterAlt(localctx, 1) - { - p.SetState(216) + return p +} - var _x = p.OptExpr() +func (s *SimpleIdentifierContext) GetId() antlr.Token { return s.id } +func (s *SimpleIdentifierContext) SetId(v antlr.Token) { s.id = v } - localctx.(*MapInitializerListContext)._optExpr = _x - } - localctx.(*MapInitializerListContext).keys = append(localctx.(*MapInitializerListContext).keys, localctx.(*MapInitializerListContext)._optExpr) - { - p.SetState(217) +func (s *SimpleIdentifierContext) GetRuleContext() antlr.RuleContext { + return s +} - var _m = p.Match(CELParserCOLON) +func (s *SimpleIdentifierContext) IDENTIFIER() antlr.TerminalNode { + return s.GetToken(CELParserIDENTIFIER, 0) +} - localctx.(*MapInitializerListContext).s21 = _m - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } +func (s *SimpleIdentifierContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CELListener); ok { + listenerT.EnterSimpleIdentifier(s) } - localctx.(*MapInitializerListContext).cols = append(localctx.(*MapInitializerListContext).cols, localctx.(*MapInitializerListContext).s21) - { - p.SetState(218) +} - var _x = p.Expr() +func (s *SimpleIdentifierContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CELListener); ok { + listenerT.ExitSimpleIdentifier(s) + } +} +func (s *SimpleIdentifierContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case CELVisitor: + return t.VisitSimpleIdentifier(s) - localctx.(*MapInitializerListContext)._expr = _x + default: + return t.VisitChildren(s) } - localctx.(*MapInitializerListContext).values = append(localctx.(*MapInitializerListContext).values, localctx.(*MapInitializerListContext)._expr) - p.SetState(226) +} + +func (p *CELParser) EscapeIdent() (localctx IEscapeIdentContext) { + localctx = NewEscapeIdentContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 28, CELParserRULE_escapeIdent) + p.SetState(235) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 30, p.GetParserRuleContext()) - if p.HasError() { - goto errorExit - } - for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { - if _alt == 1 { - { - p.SetState(219) - p.Match(CELParserCOMMA) - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } - } - { - p.SetState(220) - - var _x = p.OptExpr() + switch p.GetTokenStream().LA(1) { + case CELParserIDENTIFIER: + localctx = NewSimpleIdentifierContext(p, localctx) + p.EnterOuterAlt(localctx, 1) + { + p.SetState(233) - localctx.(*MapInitializerListContext)._optExpr = _x - } - localctx.(*MapInitializerListContext).keys = append(localctx.(*MapInitializerListContext).keys, localctx.(*MapInitializerListContext)._optExpr) - { - p.SetState(221) - - var _m = p.Match(CELParserCOLON) + var _m = p.Match(CELParserIDENTIFIER) - localctx.(*MapInitializerListContext).s21 = _m - if p.HasError() { - // Recognition error - abort rule - goto errorExit - } + localctx.(*SimpleIdentifierContext).id = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit } - localctx.(*MapInitializerListContext).cols = append(localctx.(*MapInitializerListContext).cols, localctx.(*MapInitializerListContext).s21) - { - p.SetState(222) + } - var _x = p.Expr() + case CELParserESC_IDENTIFIER: + localctx = NewEscapedIdentifierContext(p, localctx) + p.EnterOuterAlt(localctx, 2) + { + p.SetState(234) + var _m = p.Match(CELParserESC_IDENTIFIER) - localctx.(*MapInitializerListContext)._expr = _x + localctx.(*EscapedIdentifierContext).id = _m + if p.HasError() { + // Recognition error - abort rule + goto errorExit } - localctx.(*MapInitializerListContext).values = append(localctx.(*MapInitializerListContext).values, localctx.(*MapInitializerListContext)._expr) - - - } - p.SetState(228) - p.GetErrorHandler().Sync(p) - if p.HasError() { - goto errorExit - } - _alt = p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 30, p.GetParserRuleContext()) - if p.HasError() { - goto errorExit } - } - + default: + p.SetError(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + goto errorExit + } errorExit: if p.HasError() { @@ -5323,7 +5307,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // IOptExprContext is an interface to support dynamic dispatch. type IOptExprContext interface { antlr.ParserRuleContext @@ -5332,21 +5315,17 @@ type IOptExprContext interface { GetParser() antlr.Parser // GetOpt returns the opt token. - GetOpt() antlr.Token - + GetOpt() antlr.Token // SetOpt sets the opt token. - SetOpt(antlr.Token) - + SetOpt(antlr.Token) // GetE returns the e rule contexts. GetE() IExprContext - // SetE sets the e rule contexts. SetE(IExprContext) - // Getter signatures Expr() IExprContext QUESTIONMARK() antlr.TerminalNode @@ -5358,8 +5337,8 @@ type IOptExprContext interface { type OptExprContext struct { antlr.BaseParserRuleContext parser antlr.Parser - opt antlr.Token - e IExprContext + opt antlr.Token + e IExprContext } func NewEmptyOptExprContext() *OptExprContext { @@ -5369,7 +5348,7 @@ func NewEmptyOptExprContext() *OptExprContext { return p } -func InitEmptyOptExprContext(p *OptExprContext) { +func InitEmptyOptExprContext(p *OptExprContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_optExpr } @@ -5391,21 +5370,17 @@ func (s *OptExprContext) GetParser() antlr.Parser { return s.parser } func (s *OptExprContext) GetOpt() antlr.Token { return s.opt } - func (s *OptExprContext) SetOpt(v antlr.Token) { s.opt = v } - func (s *OptExprContext) GetE() IExprContext { return s.e } - func (s *OptExprContext) SetE(v IExprContext) { s.e = v } - func (s *OptExprContext) Expr() IExprContext { - var t antlr.RuleContext; + var t antlr.RuleContext for _, ctx := range s.GetChildren() { if _, ok := ctx.(IExprContext); ok { - t = ctx.(antlr.RuleContext); + t = ctx.(antlr.RuleContext) break } } @@ -5429,7 +5404,6 @@ func (s *OptExprContext) ToStringTree(ruleNames []string, recog antlr.Recognizer return antlr.TreesStringTree(s, ruleNames, recog) } - func (s *OptExprContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterOptExpr(s) @@ -5452,48 +5426,41 @@ func (s *OptExprContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - - func (p *CELParser) OptExpr() (localctx IOptExprContext) { localctx = NewOptExprContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 28, CELParserRULE_optExpr) + p.EnterRule(localctx, 30, CELParserRULE_optExpr) var _la int p.EnterOuterAlt(localctx, 1) - p.SetState(230) + p.SetState(238) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserQUESTIONMARK { { - p.SetState(229) + p.SetState(237) var _m = p.Match(CELParserQUESTIONMARK) localctx.(*OptExprContext).opt = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(232) + p.SetState(240) var _x = p.Expr() - localctx.(*OptExprContext).e = _x } - - errorExit: if p.HasError() { v := p.GetError() @@ -5507,7 +5474,6 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - // ILiteralContext is an interface to support dynamic dispatch. type ILiteralContext interface { antlr.ParserRuleContext @@ -5530,7 +5496,7 @@ func NewEmptyLiteralContext() *LiteralContext { return p } -func InitEmptyLiteralContext(p *LiteralContext) { +func InitEmptyLiteralContext(p *LiteralContext) { antlr.InitBaseParserRuleContext(&p.BaseParserRuleContext, nil, -1) p.RuleIndex = CELParserRULE_literal } @@ -5562,9 +5528,6 @@ func (s *LiteralContext) ToStringTree(ruleNames []string, recog antlr.Recognizer return antlr.TreesStringTree(s, ruleNames, recog) } - - - type BytesContext struct { LiteralContext tok antlr.Token @@ -5580,10 +5543,8 @@ func NewBytesContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *BytesCon return p } - func (s *BytesContext) GetTok() antlr.Token { return s.tok } - func (s *BytesContext) SetTok(v antlr.Token) { s.tok = v } func (s *BytesContext) GetRuleContext() antlr.RuleContext { @@ -5594,7 +5555,6 @@ func (s *BytesContext) BYTES() antlr.TerminalNode { return s.GetToken(CELParserBYTES, 0) } - func (s *BytesContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterBytes(s) @@ -5617,7 +5577,6 @@ func (s *BytesContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type UintContext struct { LiteralContext tok antlr.Token @@ -5633,10 +5592,8 @@ func NewUintContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *UintConte return p } - func (s *UintContext) GetTok() antlr.Token { return s.tok } - func (s *UintContext) SetTok(v antlr.Token) { s.tok = v } func (s *UintContext) GetRuleContext() antlr.RuleContext { @@ -5647,7 +5604,6 @@ func (s *UintContext) NUM_UINT() antlr.TerminalNode { return s.GetToken(CELParserNUM_UINT, 0) } - func (s *UintContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterUint(s) @@ -5670,7 +5626,6 @@ func (s *UintContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type NullContext struct { LiteralContext tok antlr.Token @@ -5686,10 +5641,8 @@ func NewNullContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *NullConte return p } - func (s *NullContext) GetTok() antlr.Token { return s.tok } - func (s *NullContext) SetTok(v antlr.Token) { s.tok = v } func (s *NullContext) GetRuleContext() antlr.RuleContext { @@ -5700,7 +5653,6 @@ func (s *NullContext) NUL() antlr.TerminalNode { return s.GetToken(CELParserNUL, 0) } - func (s *NullContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterNull(s) @@ -5723,7 +5675,6 @@ func (s *NullContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type BoolFalseContext struct { LiteralContext tok antlr.Token @@ -5739,10 +5690,8 @@ func NewBoolFalseContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *Bool return p } - func (s *BoolFalseContext) GetTok() antlr.Token { return s.tok } - func (s *BoolFalseContext) SetTok(v antlr.Token) { s.tok = v } func (s *BoolFalseContext) GetRuleContext() antlr.RuleContext { @@ -5753,7 +5702,6 @@ func (s *BoolFalseContext) CEL_FALSE() antlr.TerminalNode { return s.GetToken(CELParserCEL_FALSE, 0) } - func (s *BoolFalseContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterBoolFalse(s) @@ -5776,7 +5724,6 @@ func (s *BoolFalseContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type StringContext struct { LiteralContext tok antlr.Token @@ -5792,10 +5739,8 @@ func NewStringContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *StringC return p } - func (s *StringContext) GetTok() antlr.Token { return s.tok } - func (s *StringContext) SetTok(v antlr.Token) { s.tok = v } func (s *StringContext) GetRuleContext() antlr.RuleContext { @@ -5806,7 +5751,6 @@ func (s *StringContext) STRING() antlr.TerminalNode { return s.GetToken(CELParserSTRING, 0) } - func (s *StringContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterString(s) @@ -5829,11 +5773,10 @@ func (s *StringContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type DoubleContext struct { LiteralContext sign antlr.Token - tok antlr.Token + tok antlr.Token } func NewDoubleContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *DoubleContext { @@ -5846,12 +5789,10 @@ func NewDoubleContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *DoubleC return p } - func (s *DoubleContext) GetSign() antlr.Token { return s.sign } func (s *DoubleContext) GetTok() antlr.Token { return s.tok } - func (s *DoubleContext) SetSign(v antlr.Token) { s.sign = v } func (s *DoubleContext) SetTok(v antlr.Token) { s.tok = v } @@ -5868,7 +5809,6 @@ func (s *DoubleContext) MINUS() antlr.TerminalNode { return s.GetToken(CELParserMINUS, 0) } - func (s *DoubleContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterDouble(s) @@ -5891,7 +5831,6 @@ func (s *DoubleContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type BoolTrueContext struct { LiteralContext tok antlr.Token @@ -5907,10 +5846,8 @@ func NewBoolTrueContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *BoolT return p } - func (s *BoolTrueContext) GetTok() antlr.Token { return s.tok } - func (s *BoolTrueContext) SetTok(v antlr.Token) { s.tok = v } func (s *BoolTrueContext) GetRuleContext() antlr.RuleContext { @@ -5921,7 +5858,6 @@ func (s *BoolTrueContext) CEL_TRUE() antlr.TerminalNode { return s.GetToken(CELParserCEL_TRUE, 0) } - func (s *BoolTrueContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterBoolTrue(s) @@ -5944,11 +5880,10 @@ func (s *BoolTrueContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - type IntContext struct { LiteralContext sign antlr.Token - tok antlr.Token + tok antlr.Token } func NewIntContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *IntContext { @@ -5961,12 +5896,10 @@ func NewIntContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *IntContext return p } - func (s *IntContext) GetSign() antlr.Token { return s.sign } func (s *IntContext) GetTok() antlr.Token { return s.tok } - func (s *IntContext) SetSign(v antlr.Token) { s.sign = v } func (s *IntContext) SetTok(v antlr.Token) { s.tok = v } @@ -5983,7 +5916,6 @@ func (s *IntContext) MINUS() antlr.TerminalNode { return s.GetToken(CELParserMINUS, 0) } - func (s *IntContext) EnterRule(listener antlr.ParseTreeListener) { if listenerT, ok := listener.(CELListener); ok { listenerT.EnterInt(s) @@ -6006,188 +5938,177 @@ func (s *IntContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } - - func (p *CELParser) Literal() (localctx ILiteralContext) { localctx = NewLiteralContext(p, p.GetParserRuleContext(), p.GetState()) - p.EnterRule(localctx, 30, CELParserRULE_literal) + p.EnterRule(localctx, 32, CELParserRULE_literal) var _la int - p.SetState(248) + p.SetState(256) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } - switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 34, p.GetParserRuleContext()) { + switch p.GetInterpreter().AdaptivePredict(p.BaseParser, p.GetTokenStream(), 35, p.GetParserRuleContext()) { case 1: localctx = NewIntContext(p, localctx) p.EnterOuterAlt(localctx, 1) - p.SetState(235) + p.SetState(243) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserMINUS { { - p.SetState(234) + p.SetState(242) var _m = p.Match(CELParserMINUS) localctx.(*IntContext).sign = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(237) + p.SetState(245) var _m = p.Match(CELParserNUM_INT) localctx.(*IntContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 2: localctx = NewUintContext(p, localctx) p.EnterOuterAlt(localctx, 2) { - p.SetState(238) + p.SetState(246) var _m = p.Match(CELParserNUM_UINT) localctx.(*UintContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 3: localctx = NewDoubleContext(p, localctx) p.EnterOuterAlt(localctx, 3) - p.SetState(240) + p.SetState(248) p.GetErrorHandler().Sync(p) if p.HasError() { goto errorExit } _la = p.GetTokenStream().LA(1) - if _la == CELParserMINUS { { - p.SetState(239) + p.SetState(247) var _m = p.Match(CELParserMINUS) localctx.(*DoubleContext).sign = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } } { - p.SetState(242) + p.SetState(250) var _m = p.Match(CELParserNUM_FLOAT) localctx.(*DoubleContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 4: localctx = NewStringContext(p, localctx) p.EnterOuterAlt(localctx, 4) { - p.SetState(243) + p.SetState(251) var _m = p.Match(CELParserSTRING) localctx.(*StringContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 5: localctx = NewBytesContext(p, localctx) p.EnterOuterAlt(localctx, 5) { - p.SetState(244) + p.SetState(252) var _m = p.Match(CELParserBYTES) localctx.(*BytesContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 6: localctx = NewBoolTrueContext(p, localctx) p.EnterOuterAlt(localctx, 6) { - p.SetState(245) + p.SetState(253) var _m = p.Match(CELParserCEL_TRUE) localctx.(*BoolTrueContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 7: localctx = NewBoolFalseContext(p, localctx) p.EnterOuterAlt(localctx, 7) { - p.SetState(246) + p.SetState(254) var _m = p.Match(CELParserCEL_FALSE) localctx.(*BoolFalseContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } - case 8: localctx = NewNullContext(p, localctx) p.EnterOuterAlt(localctx, 8) { - p.SetState(247) + p.SetState(255) var _m = p.Match(CELParserNUL) localctx.(*NullContext).tok = _m if p.HasError() { - // Recognition error - abort rule - goto errorExit + // Recognition error - abort rule + goto errorExit } } @@ -6195,7 +6116,6 @@ func (p *CELParser) Literal() (localctx ILiteralContext) { goto errorExit } - errorExit: if p.HasError() { v := p.GetError() @@ -6209,24 +6129,28 @@ errorExit: goto errorExit // Trick to prevent compiler error if the label is not used } - func (p *CELParser) Sempred(localctx antlr.RuleContext, ruleIndex, predIndex int) bool { switch ruleIndex { case 4: - var t *RelationContext = nil - if localctx != nil { t = localctx.(*RelationContext) } - return p.Relation_Sempred(t, predIndex) + var t *RelationContext = nil + if localctx != nil { + t = localctx.(*RelationContext) + } + return p.Relation_Sempred(t, predIndex) case 5: - var t *CalcContext = nil - if localctx != nil { t = localctx.(*CalcContext) } - return p.Calc_Sempred(t, predIndex) + var t *CalcContext = nil + if localctx != nil { + t = localctx.(*CalcContext) + } + return p.Calc_Sempred(t, predIndex) case 7: - var t *MemberContext = nil - if localctx != nil { t = localctx.(*MemberContext) } - return p.Member_Sempred(t, predIndex) - + var t *MemberContext = nil + if localctx != nil { + t = localctx.(*MemberContext) + } + return p.Member_Sempred(t, predIndex) default: panic("No predicate with index: " + fmt.Sprint(ruleIndex)) @@ -6236,7 +6160,7 @@ func (p *CELParser) Sempred(localctx antlr.RuleContext, ruleIndex, predIndex int func (p *CELParser) Relation_Sempred(localctx antlr.RuleContext, predIndex int) bool { switch predIndex { case 0: - return p.Precpred(p.GetParserRuleContext(), 1) + return p.Precpred(p.GetParserRuleContext(), 1) default: panic("No predicate with index: " + fmt.Sprint(predIndex)) @@ -6246,10 +6170,10 @@ func (p *CELParser) Relation_Sempred(localctx antlr.RuleContext, predIndex int) func (p *CELParser) Calc_Sempred(localctx antlr.RuleContext, predIndex int) bool { switch predIndex { case 1: - return p.Precpred(p.GetParserRuleContext(), 2) + return p.Precpred(p.GetParserRuleContext(), 2) case 2: - return p.Precpred(p.GetParserRuleContext(), 1) + return p.Precpred(p.GetParserRuleContext(), 1) default: panic("No predicate with index: " + fmt.Sprint(predIndex)) @@ -6259,16 +6183,15 @@ func (p *CELParser) Calc_Sempred(localctx antlr.RuleContext, predIndex int) bool func (p *CELParser) Member_Sempred(localctx antlr.RuleContext, predIndex int) bool { switch predIndex { case 3: - return p.Precpred(p.GetParserRuleContext(), 3) + return p.Precpred(p.GetParserRuleContext(), 3) case 4: - return p.Precpred(p.GetParserRuleContext(), 2) + return p.Precpred(p.GetParserRuleContext(), 2) case 5: - return p.Precpred(p.GetParserRuleContext(), 1) + return p.Precpred(p.GetParserRuleContext(), 1) default: panic("No predicate with index: " + fmt.Sprint(predIndex)) } } - diff --git a/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go b/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go index d2fbd563ab..7cefe5c571 100644 --- a/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go +++ b/vendor/github.com/google/cel-go/parser/gen/cel_visitor.go @@ -1,9 +1,8 @@ -// Code generated from /usr/local/google/home/tswadell/go/src/github.com/google/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. +// Code generated from /usr/local/google/home/jdtatum/github/cel-go/parser/gen/CEL.g4 by ANTLR 4.13.1. DO NOT EDIT. package gen // CEL import "github.com/antlr4-go/antlr/v4" - // A complete Visitor for a parse tree produced by CELParser. type CELVisitor interface { antlr.ParseTreeVisitor @@ -47,8 +46,11 @@ type CELVisitor interface { // Visit a parse tree produced by CELParser#Index. VisitIndex(ctx *IndexContext) interface{} - // Visit a parse tree produced by CELParser#IdentOrGlobalCall. - VisitIdentOrGlobalCall(ctx *IdentOrGlobalCallContext) interface{} + // Visit a parse tree produced by CELParser#Ident. + VisitIdent(ctx *IdentContext) interface{} + + // Visit a parse tree produced by CELParser#GlobalCall. + VisitGlobalCall(ctx *GlobalCallContext) interface{} // Visit a parse tree produced by CELParser#Nested. VisitNested(ctx *NestedContext) interface{} @@ -80,6 +82,12 @@ type CELVisitor interface { // Visit a parse tree produced by CELParser#mapInitializerList. VisitMapInitializerList(ctx *MapInitializerListContext) interface{} + // Visit a parse tree produced by CELParser#SimpleIdentifier. + VisitSimpleIdentifier(ctx *SimpleIdentifierContext) interface{} + + // Visit a parse tree produced by CELParser#EscapedIdentifier. + VisitEscapedIdentifier(ctx *EscapedIdentifierContext) interface{} + // Visit a parse tree produced by CELParser#optExpr. VisitOptExpr(ctx *OptExprContext) interface{} @@ -106,5 +114,4 @@ type CELVisitor interface { // Visit a parse tree produced by CELParser#Null. VisitNull(ctx *NullContext) interface{} - -} \ No newline at end of file +} diff --git a/vendor/github.com/google/cel-go/parser/helper.go b/vendor/github.com/google/cel-go/parser/helper.go index 9f09ead0e7..c13296dd5c 100644 --- a/vendor/github.com/google/cel-go/parser/helper.go +++ b/vendor/github.com/google/cel-go/parser/helper.go @@ -470,6 +470,11 @@ func (e *exprHelper) NewAccuIdent() ast.Expr { return e.exprFactory.NewAccuIdent(e.nextMacroID()) } +// AccuIdentName implements the ExprHelper interface method. +func (e *exprHelper) AccuIdentName() string { + return e.exprFactory.AccuIdentName() +} + // NewGlobalCall implements the ExprHelper interface method. func (e *exprHelper) NewCall(function string, args ...ast.Expr) ast.Expr { return e.exprFactory.NewCall(e.nextMacroID(), function, args...) diff --git a/vendor/github.com/google/cel-go/parser/macro.go b/vendor/github.com/google/cel-go/parser/macro.go index dcd2322544..1ef43c4b5e 100644 --- a/vendor/github.com/google/cel-go/parser/macro.go +++ b/vendor/github.com/google/cel-go/parser/macro.go @@ -24,38 +24,74 @@ import ( "github.com/google/cel-go/common/types/ref" ) +// MacroOpt defines a functional option for configuring macro behavior. +type MacroOpt func(*macro) *macro + +// MacroDocs configures a list of strings into a multiline description for the macro. +func MacroDocs(docs ...string) MacroOpt { + return func(m *macro) *macro { + m.doc = common.MultilineDescription(docs...) + return m + } +} + +// MacroExamples configures a list of examples, either as a string or common.MultilineString, +// into an example set to be provided with the macro Documentation() call. +func MacroExamples(examples ...string) MacroOpt { + return func(m *macro) *macro { + m.examples = examples + return m + } +} + // NewGlobalMacro creates a Macro for a global function with the specified arg count. -func NewGlobalMacro(function string, argCount int, expander MacroExpander) Macro { - return ¯o{ +func NewGlobalMacro(function string, argCount int, expander MacroExpander, opts ...MacroOpt) Macro { + m := ¯o{ function: function, argCount: argCount, expander: expander} + for _, opt := range opts { + m = opt(m) + } + return m } // NewReceiverMacro creates a Macro for a receiver function matching the specified arg count. -func NewReceiverMacro(function string, argCount int, expander MacroExpander) Macro { - return ¯o{ +func NewReceiverMacro(function string, argCount int, expander MacroExpander, opts ...MacroOpt) Macro { + m := ¯o{ function: function, argCount: argCount, expander: expander, receiverStyle: true} + for _, opt := range opts { + m = opt(m) + } + return m } // NewGlobalVarArgMacro creates a Macro for a global function with a variable arg count. -func NewGlobalVarArgMacro(function string, expander MacroExpander) Macro { - return ¯o{ +func NewGlobalVarArgMacro(function string, expander MacroExpander, opts ...MacroOpt) Macro { + m := ¯o{ function: function, expander: expander, varArgStyle: true} + for _, opt := range opts { + m = opt(m) + } + return m } // NewReceiverVarArgMacro creates a Macro for a receiver function matching a variable arg count. -func NewReceiverVarArgMacro(function string, expander MacroExpander) Macro { - return ¯o{ +func NewReceiverVarArgMacro(function string, expander MacroExpander, opts ...MacroOpt) Macro { + m := ¯o{ function: function, expander: expander, receiverStyle: true, varArgStyle: true} + for _, opt := range opts { + m = opt(m) + } + return m } // Macro interface for describing the function signature to match and the MacroExpander to apply. @@ -95,6 +131,8 @@ type macro struct { varArgStyle bool argCount int expander MacroExpander + doc string + examples []string } // Function returns the macro's function name (i.e. the function whose syntax it mimics). @@ -125,6 +163,15 @@ func (m *macro) MacroKey() string { return makeMacroKey(m.function, m.argCount, m.receiverStyle) } +// Documentation generates documentation and examples for the macro. +func (m *macro) Documentation() *common.Doc { + examples := make([]*common.Doc, len(m.examples)) + for i, ex := range m.examples { + examples[i] = common.NewExampleDoc(ex) + } + return common.NewMacroDoc(m.Function(), m.doc, examples...) +} + func makeMacroKey(name string, args int, receiverStyle bool) string { return fmt.Sprintf("%s:%d:%v", name, args, receiverStyle) } @@ -225,6 +272,9 @@ type ExprHelper interface { // NewAccuIdent returns an accumulator identifier for use with comprehension results. NewAccuIdent() ast.Expr + // AccuIdentName returns the name of the accumulator identifier. + AccuIdentName() string + // NewCall creates a function call Expr value for a global (free) function. NewCall(function string, args ...ast.Expr) ast.Expr @@ -247,37 +297,139 @@ type ExprHelper interface { var ( // HasMacro expands "has(m.f)" which tests the presence of a field, avoiding the need to // specify the field as a string. - HasMacro = NewGlobalMacro(operators.Has, 1, MakeHas) + HasMacro = NewGlobalMacro(operators.Has, 1, MakeHas, + MacroDocs( + `check a protocol buffer message for the presence of a field, or check a map`, + `for the presence of a string key.`, + `Only map accesses using the select notation are supported.`), + MacroExamples( + common.MultilineDescription( + `// true if the 'address' field exists in the 'user' message`, + `has(user.address)`), + common.MultilineDescription( + `// test whether the 'key_name' is set on the map which defines it`, + `has({'key_name': 'value'}.key_name) // true`), + common.MultilineDescription( + `// test whether the 'id' field is set to a non-default value on the Expr{} message literal`, + `has(Expr{}.id) // false`), + )) // AllMacro expands "range.all(var, predicate)" into a comprehension which ensures that all // elements in the range satisfy the predicate. - AllMacro = NewReceiverMacro(operators.All, 2, MakeAll) + AllMacro = NewReceiverMacro(operators.All, 2, MakeAll, + MacroDocs(`tests whether all elements in the input list or all keys in a map`, + `satisfy the given predicate. The all macro behaves in a manner consistent with`, + `the Logical AND operator including in how it absorbs errors and short-circuits.`), + MacroExamples( + `[1, 2, 3].all(x, x > 0) // true`, + `[1, 2, 0].all(x, x > 0) // false`, + `['apple', 'banana', 'cherry'].all(fruit, fruit.size() > 3) // true`, + `[3.14, 2.71, 1.61].all(num, num < 3.0) // false`, + `{'a': 1, 'b': 2, 'c': 3}.all(key, key != 'b') // false`, + common.MultilineDescription( + `// an empty list or map as the range will result in a trivially true result`, + `[].all(x, x > 0) // true`), + )) // ExistsMacro expands "range.exists(var, predicate)" into a comprehension which ensures that // some element in the range satisfies the predicate. - ExistsMacro = NewReceiverMacro(operators.Exists, 2, MakeExists) + ExistsMacro = NewReceiverMacro(operators.Exists, 2, MakeExists, + MacroDocs(`tests whether any value in the list or any key in the map`, + `satisfies the predicate expression. The exists macro behaves in a manner`, + `consistent with the Logical OR operator including in how it absorbs errors and`, + `short-circuits.`), + MacroExamples( + `[1, 2, 3].exists(i, i % 2 != 0) // true`, + `[0, -1, 5].exists(num, num < 0) // true`, + `{'x': 'foo', 'y': 'bar'}.exists(key, key.startsWith('z')) // false`, + common.MultilineDescription( + `// an empty list or map as the range will result in a trivially false result`, + `[].exists(i, i > 0) // false`), + common.MultilineDescription( + `// test whether a key name equalling 'iss' exists in the map and the`, + `// value contains the substring 'cel.dev'`, + `// tokens = {'sub': 'me', 'iss': 'https://issuer.cel.dev'}`, + `tokens.exists(k, k == 'iss' && tokens[k].contains('cel.dev'))`), + )) // ExistsOneMacro expands "range.exists_one(var, predicate)", which is true if for exactly one // element in range the predicate holds. // Deprecated: Use ExistsOneMacroNew - ExistsOneMacro = NewReceiverMacro(operators.ExistsOne, 2, MakeExistsOne) + ExistsOneMacro = NewReceiverMacro(operators.ExistsOne, 2, MakeExistsOne, + MacroDocs(`tests whether exactly one list element or map key satisfies`, + `the predicate expression. This macro does not short-circuit in order to remain`, + `consistent with logical operators being the only operators which can absorb`, + `errors within CEL.`), + MacroExamples( + `[1, 2, 2].exists_one(i, i < 2) // true`, + `{'a': 'hello', 'aa': 'hellohello'}.exists_one(k, k.startsWith('a')) // false`, + `[1, 2, 3, 4].exists_one(num, num % 2 == 0) // false`, + common.MultilineDescription( + `// ensure exactly one key in the map ends in @acme.co`, + `{'wiley@acme.co': 'coyote', 'aa@milne.co': 'bear'}.exists_one(k, k.endsWith('@acme.co')) // true`), + )) // ExistsOneMacroNew expands "range.existsOne(var, predicate)", which is true if for exactly one // element in range the predicate holds. - ExistsOneMacroNew = NewReceiverMacro("existsOne", 2, MakeExistsOne) + ExistsOneMacroNew = NewReceiverMacro("existsOne", 2, MakeExistsOne, + MacroDocs( + `tests whether exactly one list element or map key satisfies the predicate`, + `expression. This macro does not short-circuit in order to remain consistent`, + `with logical operators being the only operators which can absorb errors`, + `within CEL.`), + MacroExamples( + `[1, 2, 2].existsOne(i, i < 2) // true`, + `{'a': 'hello', 'aa': 'hellohello'}.existsOne(k, k.startsWith('a')) // false`, + `[1, 2, 3, 4].existsOne(num, num % 2 == 0) // false`, + common.MultilineDescription( + `// ensure exactly one key in the map ends in @acme.co`, + `{'wiley@acme.co': 'coyote', 'aa@milne.co': 'bear'}.existsOne(k, k.endsWith('@acme.co')) // true`), + )) // MapMacro expands "range.map(var, function)" into a comprehension which applies the function // to each element in the range to produce a new list. - MapMacro = NewReceiverMacro(operators.Map, 2, MakeMap) + MapMacro = NewReceiverMacro(operators.Map, 2, MakeMap, + MacroDocs("the three-argument form of map transforms all elements in the input range."), + MacroExamples( + `[1, 2, 3].map(x, x * 2) // [2, 4, 6]`, + `[5, 10, 15].map(x, x / 5) // [1, 2, 3]`, + `['apple', 'banana'].map(fruit, fruit.upperAscii()) // ['APPLE', 'BANANA']`, + common.MultilineDescription( + `// Combine all map key-value pairs into a list`, + `{'hi': 'you', 'howzit': 'bruv'}.map(k,`, + ` k + ":" + {'hi': 'you', 'howzit': 'bruv'}[k]) // ['hi:you', 'howzit:bruv']`), + )) // MapFilterMacro expands "range.map(var, predicate, function)" into a comprehension which // first filters the elements in the range by the predicate, then applies the transform function // to produce a new list. - MapFilterMacro = NewReceiverMacro(operators.Map, 3, MakeMap) + MapFilterMacro = NewReceiverMacro(operators.Map, 3, MakeMap, + MacroDocs(`the four-argument form of the map transforms only elements which satisfy`, + `the predicate which is equivalent to chaining the filter and three-argument`, + `map macros together.`), + MacroExamples( + common.MultilineDescription( + `// multiply only numbers divisible two, by 2`, + `[1, 2, 3, 4].map(num, num % 2 == 0, num * 2) // [4, 8]`), + )) // FilterMacro expands "range.filter(var, predicate)" into a comprehension which filters // elements in the range, producing a new list from the elements that satisfy the predicate. - FilterMacro = NewReceiverMacro(operators.Filter, 2, MakeFilter) + FilterMacro = NewReceiverMacro(operators.Filter, 2, MakeFilter, + MacroDocs(`returns a list containing only the elements from the input list`, + `that satisfy the given predicate`), + MacroExamples( + `[1, 2, 3].filter(x, x > 1) // [2, 3]`, + `['cat', 'dog', 'bird', 'fish'].filter(pet, pet.size() == 3) // ['cat', 'dog']`, + `[{'a': 10, 'b': 5, 'c': 20}].map(m, m.filter(key, m[key] > 10)) // [['c']]`, + common.MultilineDescription( + `// filter a list to select only emails with the @cel.dev suffix`, + `['alice@buf.io', 'tristan@cel.dev'].filter(v, v.endsWith('@cel.dev')) // ['tristan@cel.dev']`), + common.MultilineDescription( + `// filter a map into a list, selecting only the values for keys that start with 'http-auth'`, + `{'http-auth-agent': 'secret', 'user-agent': 'mozilla'}.filter(k,`, + ` k.startsWith('http-auth')) // ['secret']`), + )) // AllMacros includes the list of all spec-supported macros. AllMacros = []Macro{ @@ -298,6 +450,11 @@ var ( // AccumulatorName is the traditional variable name assigned to the fold accumulator variable. const AccumulatorName = "__result__" +// HiddenAccumulatorName is a proposed update to the default fold accumlator variable. +// @result is not normally accessible from source, preventing accidental or intentional collisions +// in user expressions. +const HiddenAccumulatorName = "@result" + type quantifierKind int const ( @@ -342,7 +499,8 @@ func MakeMap(eh ExprHelper, target ast.Expr, args []ast.Expr) (ast.Expr, *common if !found { return nil, eh.NewError(args[0].ID(), "argument is not an identifier") } - if v == AccumulatorName { + accu := eh.AccuIdentName() + if v == accu || v == AccumulatorName { return nil, eh.NewError(args[0].ID(), "iteration variable overwrites accumulator variable") } @@ -364,7 +522,7 @@ func MakeMap(eh ExprHelper, target ast.Expr, args []ast.Expr) (ast.Expr, *common if filter != nil { step = eh.NewCall(operators.Conditional, filter, step, eh.NewAccuIdent()) } - return eh.NewComprehension(target, v, AccumulatorName, init, condition, step, eh.NewAccuIdent()), nil + return eh.NewComprehension(target, v, accu, init, condition, step, eh.NewAccuIdent()), nil } // MakeFilter expands the input call arguments into a comprehension which produces a list which contains @@ -375,7 +533,8 @@ func MakeFilter(eh ExprHelper, target ast.Expr, args []ast.Expr) (ast.Expr, *com if !found { return nil, eh.NewError(args[0].ID(), "argument is not an identifier") } - if v == AccumulatorName { + accu := eh.AccuIdentName() + if v == accu || v == AccumulatorName { return nil, eh.NewError(args[0].ID(), "iteration variable overwrites accumulator variable") } @@ -384,7 +543,7 @@ func MakeFilter(eh ExprHelper, target ast.Expr, args []ast.Expr) (ast.Expr, *com condition := eh.NewLiteral(types.True) step := eh.NewCall(operators.Add, eh.NewAccuIdent(), eh.NewList(args[0])) step = eh.NewCall(operators.Conditional, filter, step, eh.NewAccuIdent()) - return eh.NewComprehension(target, v, AccumulatorName, init, condition, step, eh.NewAccuIdent()), nil + return eh.NewComprehension(target, v, accu, init, condition, step, eh.NewAccuIdent()), nil } // MakeHas expands the input call arguments into a presence test, e.g. has(.field) @@ -401,7 +560,8 @@ func makeQuantifier(kind quantifierKind, eh ExprHelper, target ast.Expr, args [] if !found { return nil, eh.NewError(args[0].ID(), "argument must be a simple name") } - if v == AccumulatorName { + accu := eh.AccuIdentName() + if v == accu || v == AccumulatorName { return nil, eh.NewError(args[0].ID(), "iteration variable overwrites accumulator variable") } @@ -431,7 +591,7 @@ func makeQuantifier(kind quantifierKind, eh ExprHelper, target ast.Expr, args [] default: return nil, eh.NewError(args[0].ID(), fmt.Sprintf("unrecognized quantifier '%v'", kind)) } - return eh.NewComprehension(target, v, AccumulatorName, init, condition, step, result), nil + return eh.NewComprehension(target, v, accu, init, condition, step, result), nil } func extractIdent(e ast.Expr) (string, bool) { diff --git a/vendor/github.com/google/cel-go/parser/options.go b/vendor/github.com/google/cel-go/parser/options.go index 61fc3adec4..4eb30f83e0 100644 --- a/vendor/github.com/google/cel-go/parser/options.go +++ b/vendor/github.com/google/cel-go/parser/options.go @@ -26,6 +26,8 @@ type options struct { populateMacroCalls bool enableOptionalSyntax bool enableVariadicOperatorASTs bool + enableIdentEscapeSyntax bool + enableHiddenAccumulatorName bool } // Option configures the behavior of the parser. @@ -127,6 +129,27 @@ func EnableOptionalSyntax(optionalSyntax bool) Option { } } +// EnableIdentEscapeSyntax enables backtick (`) escaped field identifiers. This +// supports extended types of characters in identifiers, e.g. foo.`baz-bar`. +func EnableIdentEscapeSyntax(enableIdentEscapeSyntax bool) Option { + return func(opts *options) error { + opts.enableIdentEscapeSyntax = enableIdentEscapeSyntax + return nil + } +} + +// EnableHiddenAccumulatorName uses an accumulator variable name that is not a +// normally accessible identifier in source for comprehension macros. Compatibility notes: +// with this option enabled, a parsed AST would be semantically the same as if disabled, but would +// have different internal identifiers in any of the built-in comprehension sub-expressions. When +// disabled, it is possible but almost certainly a logic error to access the accumulator variable. +func EnableHiddenAccumulatorName(enabled bool) Option { + return func(opts *options) error { + opts.enableHiddenAccumulatorName = enabled + return nil + } +} + // EnableVariadicOperatorASTs enables a compact representation of chained like-kind commutative // operators. e.g. `a || b || c || d` -> `call(op='||', args=[a, b, c, d])` // diff --git a/vendor/github.com/google/cel-go/parser/parser.go b/vendor/github.com/google/cel-go/parser/parser.go index 5cbb176727..b5ec73ec64 100644 --- a/vendor/github.com/google/cel-go/parser/parser.go +++ b/vendor/github.com/google/cel-go/parser/parser.go @@ -17,6 +17,7 @@ package parser import ( + "errors" "fmt" "regexp" "strconv" @@ -40,6 +41,7 @@ type Parser struct { // NewParser builds and returns a new Parser using the provided options. func NewParser(opts ...Option) (*Parser, error) { p := &Parser{} + p.enableHiddenAccumulatorName = true for _, opt := range opts { if err := opt(&p.options); err != nil { return nil, err @@ -88,7 +90,11 @@ func mustNewParser(opts ...Option) *Parser { // Parse parses the expression represented by source and returns the result. func (p *Parser) Parse(source common.Source) (*ast.AST, *common.Errors) { errs := common.NewErrors(source) - fac := ast.NewExprFactory() + accu := AccumulatorName + if p.enableHiddenAccumulatorName { + accu = HiddenAccumulatorName + } + fac := ast.NewExprFactoryWithAccumulator(accu) impl := parser{ errors: &parseErrors{errs}, exprFactory: fac, @@ -101,6 +107,7 @@ func (p *Parser) Parse(source common.Source) (*ast.AST, *common.Errors) { populateMacroCalls: p.populateMacroCalls, enableOptionalSyntax: p.enableOptionalSyntax, enableVariadicOperatorASTs: p.enableVariadicOperatorASTs, + enableIdentEscapeSyntax: p.enableIdentEscapeSyntax, } buf, ok := source.(runes.Buffer) if !ok { @@ -143,6 +150,27 @@ var reservedIds = map[string]struct{}{ "while": {}, } +func unescapeIdent(in string) (string, error) { + if len(in) <= 2 { + return "", errors.New("invalid escaped identifier: underflow") + } + return in[1 : len(in)-1], nil +} + +// normalizeIdent returns the interpreted identifier. +func (p *parser) normalizeIdent(ctx gen.IEscapeIdentContext) (string, error) { + switch ident := ctx.(type) { + case *gen.SimpleIdentifierContext: + return ident.GetId().GetText(), nil + case *gen.EscapedIdentifierContext: + if !p.enableIdentEscapeSyntax { + return "", errors.New("unsupported syntax: '`'") + } + return unescapeIdent(ident.GetId().GetText()) + } + return "", errors.New("unsupported ident kind") +} + // Parse converts a source input a parsed expression. // This function calls ParseWithMacros with AllMacros. // @@ -296,6 +324,7 @@ type parser struct { populateMacroCalls bool enableOptionalSyntax bool enableVariadicOperatorASTs bool + enableIdentEscapeSyntax bool } var _ gen.CELVisitor = (*parser)(nil) @@ -369,8 +398,10 @@ func (p *parser) Visit(tree antlr.ParseTree) any { return out case *gen.LogicalNotContext: return p.VisitLogicalNot(tree) - case *gen.IdentOrGlobalCallContext: - return p.VisitIdentOrGlobalCall(tree) + case *gen.IdentContext: + return p.VisitIdent(tree) + case *gen.GlobalCallContext: + return p.VisitGlobalCall(tree) case *gen.SelectContext: p.checkAndIncrementRecursionDepth() out := p.VisitSelect(tree) @@ -538,7 +569,10 @@ func (p *parser) VisitSelect(ctx *gen.SelectContext) any { if ctx.GetId() == nil || ctx.GetOp() == nil { return p.helper.newExpr(ctx) } - id := ctx.GetId().GetText() + id, err := p.normalizeIdent(ctx.GetId()) + if err != nil { + p.reportError(ctx.GetId(), "%v", err) + } if ctx.GetOpt() != nil { if !p.enableOptionalSyntax { return p.reportError(ctx.GetOp(), "unsupported syntax '.?'") @@ -622,12 +656,14 @@ func (p *parser) VisitIFieldInitializerList(ctx gen.IFieldInitializerListContext p.reportError(optField, "unsupported syntax '?'") continue } + // The field may be empty due to a prior error. - id := optField.IDENTIFIER() - if id == nil { - return []ast.EntryExpr{} + fieldName, err := p.normalizeIdent(optField.EscapeIdent()) + if err != nil { + p.reportError(ctx, "%v", err) + continue } - fieldName := id.GetText() + value := p.Visit(vals[i]).(ast.Expr) field := p.helper.newObjectField(initID, fieldName, value, optional) result[i] = field @@ -635,8 +671,8 @@ func (p *parser) VisitIFieldInitializerList(ctx gen.IFieldInitializerListContext return result } -// Visit a parse tree produced by CELParser#IdentOrGlobalCall. -func (p *parser) VisitIdentOrGlobalCall(ctx *gen.IdentOrGlobalCallContext) any { +// Visit a parse tree produced by CELParser#Ident. +func (p *parser) VisitIdent(ctx *gen.IdentContext) any { identName := "" if ctx.GetLeadingDot() != nil { identName = "." @@ -651,13 +687,30 @@ func (p *parser) VisitIdentOrGlobalCall(ctx *gen.IdentOrGlobalCallContext) any { return p.reportError(ctx, "reserved identifier: %s", id) } identName += id - if ctx.GetOp() != nil { - opID := p.helper.id(ctx.GetOp()) - return p.globalCallOrMacro(opID, identName, p.visitExprList(ctx.GetArgs())...) - } return p.helper.newIdent(ctx.GetId(), identName) } +// Visit a parse tree produced by CELParser#GlobalCallContext. +func (p *parser) VisitGlobalCall(ctx *gen.GlobalCallContext) any { + identName := "" + if ctx.GetLeadingDot() != nil { + identName = "." + } + // Handle the error case where no valid identifier is specified. + if ctx.GetId() == nil { + return p.helper.newExpr(ctx) + } + // Handle reserved identifiers. + id := ctx.GetId().GetText() + if _, ok := reservedIds[id]; ok { + return p.reportError(ctx, "reserved identifier: %s", id) + } + identName += id + opID := p.helper.id(ctx.GetOp()) + return p.globalCallOrMacro(opID, identName, p.visitExprList(ctx.GetArgs())...) + +} + // Visit a parse tree produced by CELParser#CreateList. func (p *parser) VisitCreateList(ctx *gen.CreateListContext) any { listID := p.helper.id(ctx.GetOp()) @@ -756,7 +809,7 @@ func (p *parser) VisitDouble(ctx *gen.DoubleContext) any { // Visit a parse tree produced by CELParser#String. func (p *parser) VisitString(ctx *gen.StringContext) any { - s := p.unquote(ctx, ctx.GetText(), false) + s := p.unquote(ctx, ctx.GetTok().GetText(), false) return p.helper.newLiteralString(ctx, s) } @@ -922,7 +975,7 @@ func (p *parser) expandMacro(exprID int64, function string, target ast.Expr, arg loc = p.helper.getLocation(exprID) } p.helper.deleteID(exprID) - return p.reportError(loc, err.Message), true + return p.reportError(loc, "%s", err.Message), true } // A nil value from the macro indicates that the macro implementation decided that // an expansion should not be performed. diff --git a/vendor/github.com/google/cel-go/parser/unescape.go b/vendor/github.com/google/cel-go/parser/unescape.go index 27c57a9f3a..43cc9b901b 100644 --- a/vendor/github.com/google/cel-go/parser/unescape.go +++ b/vendor/github.com/google/cel-go/parser/unescape.go @@ -15,7 +15,7 @@ package parser import ( - "fmt" + "errors" "strings" "unicode/utf8" ) @@ -30,7 +30,7 @@ func unescape(value string, isBytes bool) (string, error) { // Nothing to unescape / decode. if n < 2 { - return value, fmt.Errorf("unable to unescape string") + return value, errors.New("unable to unescape string") } // Raw string preceded by the 'r|R' prefix. @@ -43,7 +43,7 @@ func unescape(value string, isBytes bool) (string, error) { // Quoted string of some form, must have same first and last char. if value[0] != value[n-1] || (value[0] != '"' && value[0] != '\'') { - return value, fmt.Errorf("unable to unescape string") + return value, errors.New("unable to unescape string") } // Normalize the multi-line CEL string representation to a standard @@ -51,12 +51,12 @@ func unescape(value string, isBytes bool) (string, error) { if n >= 6 { if strings.HasPrefix(value, "'''") { if !strings.HasSuffix(value, "'''") { - return value, fmt.Errorf("unable to unescape string") + return value, errors.New("unable to unescape string") } value = "\"" + value[3:n-3] + "\"" } else if strings.HasPrefix(value, `"""`) { if !strings.HasSuffix(value, `"""`) { - return value, fmt.Errorf("unable to unescape string") + return value, errors.New("unable to unescape string") } value = "\"" + value[3:n-3] + "\"" } @@ -90,10 +90,10 @@ func unescape(value string, isBytes bool) (string, error) { // unescapeChar takes a string input and returns the following info: // -// value - the escaped unicode rune at the front of the string. -// encode - the value should be unicode-encoded -// tail - the remainder of the input string. -// err - error value, if the character could not be unescaped. +// value - the escaped unicode rune at the front of the string. +// encode - the value should be unicode-encoded +// tail - the remainder of the input string. +// err - error value, if the character could not be unescaped. // // When encode is true the return value may still fit within a single byte, // but unicode encoding is attempted which is more expensive than when the @@ -113,7 +113,7 @@ func unescapeChar(s string, isBytes bool) (value rune, encode bool, tail string, // 2. Last character is the start of an escape sequence. if len(s) <= 1 { - err = fmt.Errorf("unable to unescape string, found '\\' as last character") + err = errors.New("unable to unescape string, found '\\' as last character") return } @@ -157,32 +157,32 @@ func unescapeChar(s string, isBytes bool) (value rune, encode bool, tail string, case 'u': n = 4 if isBytes { - err = fmt.Errorf("unable to unescape string") + err = errors.New("unable to unescape string") return } case 'U': n = 8 if isBytes { - err = fmt.Errorf("unable to unescape string") + err = errors.New("unable to unescape string") return } } var v rune if len(s) < n { - err = fmt.Errorf("unable to unescape string") + err = errors.New("unable to unescape string") return } for j := 0; j < n; j++ { x, ok := unhex(s[j]) if !ok { - err = fmt.Errorf("unable to unescape string") + err = errors.New("unable to unescape string") return } v = v<<4 | x } s = s[n:] - if !isBytes && v > utf8.MaxRune { - err = fmt.Errorf("unable to unescape string") + if !isBytes && !utf8.ValidRune(v) { + err = errors.New("invalid unicode code point") return } value = v @@ -190,20 +190,20 @@ func unescapeChar(s string, isBytes bool) (value rune, encode bool, tail string, // 5. Octal escape sequences, must be three digits \[0-3][0-7][0-7] case '0', '1', '2', '3': if len(s) < 2 { - err = fmt.Errorf("unable to unescape octal sequence in string") + err = errors.New("unable to unescape octal sequence in string") return } v := rune(c - '0') for j := 0; j < 2; j++ { x := s[j] if x < '0' || x > '7' { - err = fmt.Errorf("unable to unescape octal sequence in string") + err = errors.New("unable to unescape octal sequence in string") return } v = v*8 + rune(x-'0') } - if !isBytes && v > utf8.MaxRune { - err = fmt.Errorf("unable to unescape string") + if !isBytes && !utf8.ValidRune(v) { + err = errors.New("invalid unicode code point") return } value = v @@ -212,7 +212,7 @@ func unescapeChar(s string, isBytes bool) (value rune, encode bool, tail string, // Unknown escape sequence. default: - err = fmt.Errorf("unable to unescape string") + err = errors.New("unable to unescape string") } tail = s diff --git a/vendor/github.com/google/cel-go/parser/unparser.go b/vendor/github.com/google/cel-go/parser/unparser.go index 91cf729447..ffd5b18e47 100644 --- a/vendor/github.com/google/cel-go/parser/unparser.go +++ b/vendor/github.com/google/cel-go/parser/unparser.go @@ -17,12 +17,14 @@ package parser import ( "errors" "fmt" + "regexp" "strconv" "strings" "github.com/google/cel-go/common/ast" "github.com/google/cel-go/common/operators" "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" ) // Unparse takes an input expression and source position information and generates a human-readable @@ -65,6 +67,15 @@ func Unparse(expr ast.Expr, info *ast.SourceInfo, opts ...UnparserOption) (strin return un.str.String(), nil } +var identifierPartPattern *regexp.Regexp = regexp.MustCompile(`^[A-Za-z_][0-9A-Za-z_]*$`) + +func maybeQuoteField(field string) string { + if !identifierPartPattern.MatchString(field) || field == "in" { + return "`" + field + "`" + } + return field +} + // unparser visits an expression to reconstruct a human-readable string from an AST. type unparser struct { str strings.Builder @@ -263,8 +274,17 @@ func (un *unparser) visitCallUnary(expr ast.Expr) error { return un.visitMaybeNested(args[0], nested) } -func (un *unparser) visitConst(expr ast.Expr) error { - val := expr.AsLiteral() +func (un *unparser) visitConstVal(val ref.Val) error { + optional := false + if optVal, ok := val.(*types.Optional); ok { + if !optVal.HasValue() { + un.str.WriteString("optional.none()") + return nil + } + optional = true + un.str.WriteString("optional.of(") + val = optVal.GetValue() + } switch val := val.(type) { case types.Bool: un.str.WriteString(strconv.FormatBool(bool(val))) @@ -293,7 +313,21 @@ func (un *unparser) visitConst(expr ast.Expr) error { ui := strconv.FormatUint(uint64(val), 10) un.str.WriteString(ui) un.str.WriteString("u") + case *types.Optional: + if err := un.visitConstVal(val); err != nil { + return err + } default: + return errors.New("unsupported constant") + } + if optional { + un.str.WriteString(")") + } + return nil +} +func (un *unparser) visitConst(expr ast.Expr) error { + val := expr.AsLiteral() + if err := un.visitConstVal(val); err != nil { return fmt.Errorf("unsupported constant: %v", expr) } return nil @@ -352,7 +386,7 @@ func (un *unparser) visitSelectInternal(operand ast.Expr, testOnly bool, op stri return err } un.str.WriteString(op) - un.str.WriteString(field) + un.str.WriteString(maybeQuoteField(field)) if testOnly { un.str.WriteString(")") } @@ -370,7 +404,7 @@ func (un *unparser) visitStructMsg(expr ast.Expr) error { if field.IsOptional() { un.str.WriteString("?") } - un.str.WriteString(f) + un.str.WriteString(maybeQuoteField(f)) un.str.WriteString(": ") v := field.Value() err := un.visit(v) diff --git a/vendor/github.com/google/gnostic-models/compiler/context.go b/vendor/github.com/google/gnostic-models/compiler/context.go index 1bfe961219..26b31e51e3 100644 --- a/vendor/github.com/google/gnostic-models/compiler/context.go +++ b/vendor/github.com/google/gnostic-models/compiler/context.go @@ -15,7 +15,7 @@ package compiler import ( - yaml "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) // Context contains state of the compiler as it traverses a document. diff --git a/vendor/github.com/google/gnostic-models/compiler/extensions.go b/vendor/github.com/google/gnostic-models/compiler/extensions.go index 16ae66faa3..efa07f2a90 100644 --- a/vendor/github.com/google/gnostic-models/compiler/extensions.go +++ b/vendor/github.com/google/gnostic-models/compiler/extensions.go @@ -20,9 +20,9 @@ import ( "os/exec" "strings" + yaml "go.yaml.in/yaml/v3" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" - yaml "gopkg.in/yaml.v3" extensions "github.com/google/gnostic-models/extensions" ) diff --git a/vendor/github.com/google/gnostic-models/compiler/helpers.go b/vendor/github.com/google/gnostic-models/compiler/helpers.go index 975d65e8f8..a83261eb6c 100644 --- a/vendor/github.com/google/gnostic-models/compiler/helpers.go +++ b/vendor/github.com/google/gnostic-models/compiler/helpers.go @@ -20,7 +20,7 @@ import ( "sort" "strconv" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/jsonschema" ) diff --git a/vendor/github.com/google/gnostic-models/compiler/reader.go b/vendor/github.com/google/gnostic-models/compiler/reader.go index be0e8b40c8..da409d6b36 100644 --- a/vendor/github.com/google/gnostic-models/compiler/reader.go +++ b/vendor/github.com/google/gnostic-models/compiler/reader.go @@ -24,7 +24,7 @@ import ( "strings" "sync" - yaml "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) var verboseReader = false diff --git a/vendor/github.com/google/gnostic-models/jsonschema/models.go b/vendor/github.com/google/gnostic-models/jsonschema/models.go index 4781bdc5f5..a42b8e0035 100644 --- a/vendor/github.com/google/gnostic-models/jsonschema/models.go +++ b/vendor/github.com/google/gnostic-models/jsonschema/models.go @@ -16,7 +16,7 @@ // of JSON Schemas. package jsonschema -import "gopkg.in/yaml.v3" +import "go.yaml.in/yaml/v3" // The Schema struct models a JSON Schema and, because schemas are // defined hierarchically, contains many references to itself. diff --git a/vendor/github.com/google/gnostic-models/jsonschema/reader.go b/vendor/github.com/google/gnostic-models/jsonschema/reader.go index b8583d4660..4f1fe0c08c 100644 --- a/vendor/github.com/google/gnostic-models/jsonschema/reader.go +++ b/vendor/github.com/google/gnostic-models/jsonschema/reader.go @@ -21,7 +21,7 @@ import ( "io/ioutil" "strconv" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) // This is a global map of all known Schemas. diff --git a/vendor/github.com/google/gnostic-models/jsonschema/writer.go b/vendor/github.com/google/gnostic-models/jsonschema/writer.go index 340dc5f933..19f5ddeae2 100644 --- a/vendor/github.com/google/gnostic-models/jsonschema/writer.go +++ b/vendor/github.com/google/gnostic-models/jsonschema/writer.go @@ -17,7 +17,7 @@ package jsonschema import ( "fmt" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) const indentation = " " diff --git a/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go b/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go index d71fe6d545..de337d80c8 100644 --- a/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go +++ b/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go @@ -21,7 +21,7 @@ import ( "regexp" "strings" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) @@ -60,7 +60,7 @@ func NewAdditionalPropertiesItem(in *yaml.Node, context *compiler.Context) (*Add // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid AdditionalPropertiesItem") + message := "contains an invalid AdditionalPropertiesItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -2543,7 +2543,7 @@ func NewNonBodyParameter(in *yaml.Node, context *compiler.Context) (*NonBodyPara // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid NonBodyParameter") + message := "contains an invalid NonBodyParameter" err := compiler.NewError(context, message) errors = []error{err} } @@ -3271,7 +3271,7 @@ func NewParameter(in *yaml.Node, context *compiler.Context) (*Parameter, error) // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid Parameter") + message := "contains an invalid Parameter" err := compiler.NewError(context, message) errors = []error{err} } @@ -3345,7 +3345,7 @@ func NewParametersItem(in *yaml.Node, context *compiler.Context) (*ParametersIte // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ParametersItem") + message := "contains an invalid ParametersItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -4561,7 +4561,7 @@ func NewResponseValue(in *yaml.Node, context *compiler.Context) (*ResponseValue, // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ResponseValue") + message := "contains an invalid ResponseValue" err := compiler.NewError(context, message) errors = []error{err} } @@ -5030,7 +5030,7 @@ func NewSchemaItem(in *yaml.Node, context *compiler.Context) (*SchemaItem, error // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SchemaItem") + message := "contains an invalid SchemaItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -5160,7 +5160,7 @@ func NewSecurityDefinitionsItem(in *yaml.Node, context *compiler.Context) (*Secu // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SecurityDefinitionsItem") + message := "contains an invalid SecurityDefinitionsItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -6930,7 +6930,7 @@ func (m *BodyParameter) ToRawInfo() *yaml.Node { // always include this required field. info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -7149,7 +7149,7 @@ func (m *FileSchema) ToRawInfo() *yaml.Node { // always include this required field. info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) - if m.ReadOnly != false { + if m.ReadOnly { info.Content = append(info.Content, compiler.NewScalarNodeForString("readOnly")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ReadOnly)) } @@ -7176,7 +7176,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { if m == nil { return info } - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -7192,7 +7192,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) } - if m.AllowEmptyValue != false { + if m.AllowEmptyValue { info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) } @@ -7220,7 +7220,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -7228,7 +7228,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -7252,7 +7252,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -7306,7 +7306,7 @@ func (m *Header) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -7314,7 +7314,7 @@ func (m *Header) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -7338,7 +7338,7 @@ func (m *Header) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -7373,7 +7373,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { if m == nil { return info } - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -7413,7 +7413,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -7421,7 +7421,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -7445,7 +7445,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -7940,7 +7940,7 @@ func (m *Operation) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("schemes")) info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Schemes)) } - if m.Deprecated != false { + if m.Deprecated { info.Content = append(info.Content, compiler.NewScalarNodeForString("deprecated")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Deprecated)) } @@ -8110,7 +8110,7 @@ func (m *PathParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8118,7 +8118,7 @@ func (m *PathParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8142,7 +8142,7 @@ func (m *PathParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8218,7 +8218,7 @@ func (m *PrimitivesItems) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8226,7 +8226,7 @@ func (m *PrimitivesItems) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8250,7 +8250,7 @@ func (m *PrimitivesItems) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8296,7 +8296,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { if m == nil { return info } - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -8312,7 +8312,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) } - if m.AllowEmptyValue != false { + if m.AllowEmptyValue { info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) } @@ -8340,7 +8340,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8348,7 +8348,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8372,7 +8372,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8514,7 +8514,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8522,7 +8522,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8546,7 +8546,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8610,7 +8610,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("discriminator")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Discriminator)) } - if m.ReadOnly != false { + if m.ReadOnly { info.Content = append(info.Content, compiler.NewScalarNodeForString("readOnly")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ReadOnly)) } @@ -8796,11 +8796,11 @@ func (m *Xml) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("prefix")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Prefix)) } - if m.Attribute != false { + if m.Attribute { info.Content = append(info.Content, compiler.NewScalarNodeForString("attribute")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Attribute)) } - if m.Wrapped != false { + if m.Wrapped { info.Content = append(info.Content, compiler.NewScalarNodeForString("wrapped")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Wrapped)) } diff --git a/vendor/github.com/google/gnostic-models/openapiv2/document.go b/vendor/github.com/google/gnostic-models/openapiv2/document.go index e96ac0d6da..89469a13ed 100644 --- a/vendor/github.com/google/gnostic-models/openapiv2/document.go +++ b/vendor/github.com/google/gnostic-models/openapiv2/document.go @@ -15,7 +15,7 @@ package openapi_v2 import ( - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) diff --git a/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go b/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go index 4b1131ce1c..662772dd95 100644 --- a/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go +++ b/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go @@ -21,7 +21,7 @@ import ( "regexp" "strings" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) @@ -60,7 +60,7 @@ func NewAdditionalPropertiesItem(in *yaml.Node, context *compiler.Context) (*Add // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid AdditionalPropertiesItem") + message := "contains an invalid AdditionalPropertiesItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -113,7 +113,7 @@ func NewAnyOrExpression(in *yaml.Node, context *compiler.Context) (*AnyOrExpress // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid AnyOrExpression") + message := "contains an invalid AnyOrExpression" err := compiler.NewError(context, message) errors = []error{err} } @@ -227,7 +227,7 @@ func NewCallbackOrReference(in *yaml.Node, context *compiler.Context) (*Callback // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid CallbackOrReference") + message := "contains an invalid CallbackOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -979,7 +979,7 @@ func NewExampleOrReference(in *yaml.Node, context *compiler.Context) (*ExampleOr // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ExampleOrReference") + message := "contains an invalid ExampleOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -1320,7 +1320,7 @@ func NewHeaderOrReference(in *yaml.Node, context *compiler.Context) (*HeaderOrRe // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid HeaderOrReference") + message := "contains an invalid HeaderOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -1713,7 +1713,7 @@ func NewLinkOrReference(in *yaml.Node, context *compiler.Context) (*LinkOrRefere // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid LinkOrReference") + message := "contains an invalid LinkOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -3090,7 +3090,7 @@ func NewParameterOrReference(in *yaml.Node, context *compiler.Context) (*Paramet // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ParameterOrReference") + message := "contains an invalid ParameterOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -3606,7 +3606,7 @@ func NewRequestBodyOrReference(in *yaml.Node, context *compiler.Context) (*Reque // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid RequestBodyOrReference") + message := "contains an invalid RequestBodyOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -3743,7 +3743,7 @@ func NewResponseOrReference(in *yaml.Node, context *compiler.Context) (*Response // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ResponseOrReference") + message := "contains an invalid ResponseOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -4310,7 +4310,7 @@ func NewSchemaOrReference(in *yaml.Node, context *compiler.Context) (*SchemaOrRe // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SchemaOrReference") + message := "contains an invalid SchemaOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -4543,7 +4543,7 @@ func NewSecuritySchemeOrReference(in *yaml.Node, context *compiler.Context) (*Se // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SecuritySchemeOrReference") + message := "contains an invalid SecuritySchemeOrReference" err := compiler.NewError(context, message) errors = []error{err} } diff --git a/vendor/github.com/google/gnostic-models/openapiv3/document.go b/vendor/github.com/google/gnostic-models/openapiv3/document.go index 1cee467735..499ff883c5 100644 --- a/vendor/github.com/google/gnostic-models/openapiv3/document.go +++ b/vendor/github.com/google/gnostic-models/openapiv3/document.go @@ -15,7 +15,7 @@ package openapi_v3 import ( - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/BUILD.bazel b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/BUILD.bazel new file mode 100644 index 0000000000..d71991e6e8 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/BUILD.bazel @@ -0,0 +1,44 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "options_proto_files", + srcs = [ + "annotations.proto", + "openapiv2.proto", + ], +) + +go_library( + name = "options", + embed = [":options_go_proto"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options", +) + +proto_library( + name = "options_proto", + srcs = [ + "annotations.proto", + "openapiv2.proto", + ], + deps = [ + "@com_google_protobuf//:descriptor_proto", + "@com_google_protobuf//:struct_proto", + ], +) + +go_proto_library( + name = "options_go_proto", + compilers = ["//:go_apiv2"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options", + proto = ":options_proto", +) + +alias( + name = "go_default_library", + actual = ":options", + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.pb.go new file mode 100644 index 0000000000..738c9754a6 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.pb.go @@ -0,0 +1,269 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/annotations.proto + +//go:build !protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +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) +) + +var file_protoc_gen_openapiv2_options_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FileOptions)(nil), + ExtensionType: (*Swagger)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger", + Tag: "bytes,1042,opt,name=openapiv2_swagger", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*Operation)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation", + Tag: "bytes,1042,opt,name=openapiv2_operation", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MessageOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema", + Tag: "bytes,1042,opt,name=openapiv2_schema", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.EnumOptions)(nil), + ExtensionType: (*EnumSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum", + Tag: "bytes,1042,opt,name=openapiv2_enum", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtensionType: (*Tag)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag", + Tag: "bytes,1042,opt,name=openapiv2_tag", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*JSONSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field", + Tag: "bytes,1042,opt,name=openapiv2_field", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, +} + +// Extension fields to descriptorpb.FileOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Swagger openapiv2_swagger = 1042; + E_Openapiv2Swagger = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Operation openapiv2_operation = 1042; + E_Openapiv2Operation = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[1] +) + +// Extension fields to descriptorpb.MessageOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Schema openapiv2_schema = 1042; + E_Openapiv2Schema = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[2] +) + +// Extension fields to descriptorpb.EnumOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.EnumSchema openapiv2_enum = 1042; + E_Openapiv2Enum = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[3] +) + +// Extension fields to descriptorpb.ServiceOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Tag openapiv2_tag = 1042; + E_Openapiv2Tag = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[4] +) + +// Extension fields to descriptorpb.FieldOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.JSONSchema openapiv2_field = 1042; + E_Openapiv2Field = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[5] +) + +var File_protoc_gen_openapiv2_options_annotations_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x29, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x7e, 0x0a, 0x11, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x3a, 0x86, 0x01, 0x0a, 0x13, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x12, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x7b, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x45, 0x6e, 0x75, + 0x6d, 0x3a, 0x75, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x74, + 0x61, 0x67, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x54, 0x61, 0x67, 0x3a, 0x7e, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, + 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, + 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_protoc_gen_openapiv2_options_annotations_proto_goTypes = []any{ + (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions + (*descriptorpb.EnumOptions)(nil), // 3: google.protobuf.EnumOptions + (*descriptorpb.ServiceOptions)(nil), // 4: google.protobuf.ServiceOptions + (*descriptorpb.FieldOptions)(nil), // 5: google.protobuf.FieldOptions + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Schema)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*Tag)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*JSONSchema)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema +} +var file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = []int32{ + 0, // 0: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:extendee -> google.protobuf.FileOptions + 1, // 1: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:extendee -> google.protobuf.MethodOptions + 2, // 2: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:extendee -> google.protobuf.MessageOptions + 3, // 3: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:extendee -> google.protobuf.EnumOptions + 4, // 4: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:extendee -> google.protobuf.ServiceOptions + 5, // 5: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:extendee -> google.protobuf.FieldOptions + 6, // 6: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger + 7, // 7: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation + 8, // 8: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 9, // 9: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + 10, // 10: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 11, // 11: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 6, // [6:12] is the sub-list for extension type_name + 0, // [0:6] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_annotations_proto_init() } +func file_protoc_gen_openapiv2_options_annotations_proto_init() { + if File_protoc_gen_openapiv2_options_annotations_proto != nil { + return + } + file_protoc_gen_openapiv2_options_openapiv2_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_annotations_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 6, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_annotations_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_annotations_proto_depIdxs, + ExtensionInfos: file_protoc_gen_openapiv2_options_annotations_proto_extTypes, + }.Build() + File_protoc_gen_openapiv2_options_annotations_proto = out.File + file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_annotations_proto_goTypes = nil + file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = nil +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.proto b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.proto new file mode 100644 index 0000000000..aecc5e709c --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.proto @@ -0,0 +1,51 @@ +syntax = "proto3"; + +package grpc.gateway.protoc_gen_openapiv2.options; + +import "google/protobuf/descriptor.proto"; +import "protoc-gen-openapiv2/options/openapiv2.proto"; + +option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options"; + +extend google.protobuf.FileOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Swagger openapiv2_swagger = 1042; +} +extend google.protobuf.MethodOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Operation openapiv2_operation = 1042; +} +extend google.protobuf.MessageOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Schema openapiv2_schema = 1042; +} +extend google.protobuf.EnumOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + EnumSchema openapiv2_enum = 1042; +} +extend google.protobuf.ServiceOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Tag openapiv2_tag = 1042; +} +extend google.protobuf.FieldOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + JSONSchema openapiv2_field = 1042; +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations_protoopaque.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations_protoopaque.pb.go new file mode 100644 index 0000000000..b570167836 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations_protoopaque.pb.go @@ -0,0 +1,269 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/annotations.proto + +//go:build protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +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) +) + +var file_protoc_gen_openapiv2_options_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FileOptions)(nil), + ExtensionType: (*Swagger)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger", + Tag: "bytes,1042,opt,name=openapiv2_swagger", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*Operation)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation", + Tag: "bytes,1042,opt,name=openapiv2_operation", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MessageOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema", + Tag: "bytes,1042,opt,name=openapiv2_schema", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.EnumOptions)(nil), + ExtensionType: (*EnumSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum", + Tag: "bytes,1042,opt,name=openapiv2_enum", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtensionType: (*Tag)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag", + Tag: "bytes,1042,opt,name=openapiv2_tag", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*JSONSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field", + Tag: "bytes,1042,opt,name=openapiv2_field", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, +} + +// Extension fields to descriptorpb.FileOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Swagger openapiv2_swagger = 1042; + E_Openapiv2Swagger = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Operation openapiv2_operation = 1042; + E_Openapiv2Operation = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[1] +) + +// Extension fields to descriptorpb.MessageOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Schema openapiv2_schema = 1042; + E_Openapiv2Schema = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[2] +) + +// Extension fields to descriptorpb.EnumOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.EnumSchema openapiv2_enum = 1042; + E_Openapiv2Enum = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[3] +) + +// Extension fields to descriptorpb.ServiceOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Tag openapiv2_tag = 1042; + E_Openapiv2Tag = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[4] +) + +// Extension fields to descriptorpb.FieldOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.JSONSchema openapiv2_field = 1042; + E_Openapiv2Field = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[5] +) + +var File_protoc_gen_openapiv2_options_annotations_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x29, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x7e, 0x0a, 0x11, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x3a, 0x86, 0x01, 0x0a, 0x13, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x12, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x7b, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x45, 0x6e, 0x75, + 0x6d, 0x3a, 0x75, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x74, + 0x61, 0x67, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x54, 0x61, 0x67, 0x3a, 0x7e, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, + 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, + 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_protoc_gen_openapiv2_options_annotations_proto_goTypes = []any{ + (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions + (*descriptorpb.EnumOptions)(nil), // 3: google.protobuf.EnumOptions + (*descriptorpb.ServiceOptions)(nil), // 4: google.protobuf.ServiceOptions + (*descriptorpb.FieldOptions)(nil), // 5: google.protobuf.FieldOptions + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Schema)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*Tag)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*JSONSchema)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema +} +var file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = []int32{ + 0, // 0: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:extendee -> google.protobuf.FileOptions + 1, // 1: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:extendee -> google.protobuf.MethodOptions + 2, // 2: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:extendee -> google.protobuf.MessageOptions + 3, // 3: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:extendee -> google.protobuf.EnumOptions + 4, // 4: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:extendee -> google.protobuf.ServiceOptions + 5, // 5: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:extendee -> google.protobuf.FieldOptions + 6, // 6: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger + 7, // 7: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation + 8, // 8: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 9, // 9: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + 10, // 10: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 11, // 11: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 6, // [6:12] is the sub-list for extension type_name + 0, // [0:6] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_annotations_proto_init() } +func file_protoc_gen_openapiv2_options_annotations_proto_init() { + if File_protoc_gen_openapiv2_options_annotations_proto != nil { + return + } + file_protoc_gen_openapiv2_options_openapiv2_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_annotations_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 6, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_annotations_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_annotations_proto_depIdxs, + ExtensionInfos: file_protoc_gen_openapiv2_options_annotations_proto_extTypes, + }.Build() + File_protoc_gen_openapiv2_options_annotations_proto = out.File + file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_annotations_proto_goTypes = nil + file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = nil +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/buf.gen.yaml b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/buf.gen.yaml new file mode 100644 index 0000000000..07dfb958f1 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/buf.gen.yaml @@ -0,0 +1,7 @@ +version: v2 +plugins: + - remote: buf.build/protocolbuffers/go:v1.36.0 + out: . + opt: + - paths=source_relative + - default_api_level=API_HYBRID diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.pb.go new file mode 100644 index 0000000000..3a34e664e0 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.pb.go @@ -0,0 +1,4263 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/openapiv2.proto + +//go:build !protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" +) + +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) +) + +// Scheme describes the schemes supported by the OpenAPI Swagger +// and Operation objects. +type Scheme int32 + +const ( + Scheme_UNKNOWN Scheme = 0 + Scheme_HTTP Scheme = 1 + Scheme_HTTPS Scheme = 2 + Scheme_WS Scheme = 3 + Scheme_WSS Scheme = 4 +) + +// Enum value maps for Scheme. +var ( + Scheme_name = map[int32]string{ + 0: "UNKNOWN", + 1: "HTTP", + 2: "HTTPS", + 3: "WS", + 4: "WSS", + } + Scheme_value = map[string]int32{ + "UNKNOWN": 0, + "HTTP": 1, + "HTTPS": 2, + "WS": 3, + "WSS": 4, + } +) + +func (x Scheme) Enum() *Scheme { + p := new(Scheme) + *p = x + return p +} + +func (x Scheme) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Scheme) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0].Descriptor() +} + +func (Scheme) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0] +} + +func (x Scheme) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Type` is a supported HTTP header type. +// See https://swagger.io/specification/v2/#parameterType. +type HeaderParameter_Type int32 + +const ( + HeaderParameter_UNKNOWN HeaderParameter_Type = 0 + HeaderParameter_STRING HeaderParameter_Type = 1 + HeaderParameter_NUMBER HeaderParameter_Type = 2 + HeaderParameter_INTEGER HeaderParameter_Type = 3 + HeaderParameter_BOOLEAN HeaderParameter_Type = 4 +) + +// Enum value maps for HeaderParameter_Type. +var ( + HeaderParameter_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "STRING", + 2: "NUMBER", + 3: "INTEGER", + 4: "BOOLEAN", + } + HeaderParameter_Type_value = map[string]int32{ + "UNKNOWN": 0, + "STRING": 1, + "NUMBER": 2, + "INTEGER": 3, + "BOOLEAN": 4, + } +) + +func (x HeaderParameter_Type) Enum() *HeaderParameter_Type { + p := new(HeaderParameter_Type) + *p = x + return p +} + +func (x HeaderParameter_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (HeaderParameter_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1].Descriptor() +} + +func (HeaderParameter_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1] +} + +func (x HeaderParameter_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +type JSONSchema_JSONSchemaSimpleTypes int32 + +const ( + JSONSchema_UNKNOWN JSONSchema_JSONSchemaSimpleTypes = 0 + JSONSchema_ARRAY JSONSchema_JSONSchemaSimpleTypes = 1 + JSONSchema_BOOLEAN JSONSchema_JSONSchemaSimpleTypes = 2 + JSONSchema_INTEGER JSONSchema_JSONSchemaSimpleTypes = 3 + JSONSchema_NULL JSONSchema_JSONSchemaSimpleTypes = 4 + JSONSchema_NUMBER JSONSchema_JSONSchemaSimpleTypes = 5 + JSONSchema_OBJECT JSONSchema_JSONSchemaSimpleTypes = 6 + JSONSchema_STRING JSONSchema_JSONSchemaSimpleTypes = 7 +) + +// Enum value maps for JSONSchema_JSONSchemaSimpleTypes. +var ( + JSONSchema_JSONSchemaSimpleTypes_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ARRAY", + 2: "BOOLEAN", + 3: "INTEGER", + 4: "NULL", + 5: "NUMBER", + 6: "OBJECT", + 7: "STRING", + } + JSONSchema_JSONSchemaSimpleTypes_value = map[string]int32{ + "UNKNOWN": 0, + "ARRAY": 1, + "BOOLEAN": 2, + "INTEGER": 3, + "NULL": 4, + "NUMBER": 5, + "OBJECT": 6, + "STRING": 7, + } +) + +func (x JSONSchema_JSONSchemaSimpleTypes) Enum() *JSONSchema_JSONSchemaSimpleTypes { + p := new(JSONSchema_JSONSchemaSimpleTypes) + *p = x + return p +} + +func (x JSONSchema_JSONSchemaSimpleTypes) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (JSONSchema_JSONSchemaSimpleTypes) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2].Descriptor() +} + +func (JSONSchema_JSONSchemaSimpleTypes) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2] +} + +func (x JSONSchema_JSONSchemaSimpleTypes) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The type of the security scheme. Valid values are "basic", +// "apiKey" or "oauth2". +type SecurityScheme_Type int32 + +const ( + SecurityScheme_TYPE_INVALID SecurityScheme_Type = 0 + SecurityScheme_TYPE_BASIC SecurityScheme_Type = 1 + SecurityScheme_TYPE_API_KEY SecurityScheme_Type = 2 + SecurityScheme_TYPE_OAUTH2 SecurityScheme_Type = 3 +) + +// Enum value maps for SecurityScheme_Type. +var ( + SecurityScheme_Type_name = map[int32]string{ + 0: "TYPE_INVALID", + 1: "TYPE_BASIC", + 2: "TYPE_API_KEY", + 3: "TYPE_OAUTH2", + } + SecurityScheme_Type_value = map[string]int32{ + "TYPE_INVALID": 0, + "TYPE_BASIC": 1, + "TYPE_API_KEY": 2, + "TYPE_OAUTH2": 3, + } +) + +func (x SecurityScheme_Type) Enum() *SecurityScheme_Type { + p := new(SecurityScheme_Type) + *p = x + return p +} + +func (x SecurityScheme_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3].Descriptor() +} + +func (SecurityScheme_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3] +} + +func (x SecurityScheme_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The location of the API key. Valid values are "query" or "header". +type SecurityScheme_In int32 + +const ( + SecurityScheme_IN_INVALID SecurityScheme_In = 0 + SecurityScheme_IN_QUERY SecurityScheme_In = 1 + SecurityScheme_IN_HEADER SecurityScheme_In = 2 +) + +// Enum value maps for SecurityScheme_In. +var ( + SecurityScheme_In_name = map[int32]string{ + 0: "IN_INVALID", + 1: "IN_QUERY", + 2: "IN_HEADER", + } + SecurityScheme_In_value = map[string]int32{ + "IN_INVALID": 0, + "IN_QUERY": 1, + "IN_HEADER": 2, + } +) + +func (x SecurityScheme_In) Enum() *SecurityScheme_In { + p := new(SecurityScheme_In) + *p = x + return p +} + +func (x SecurityScheme_In) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_In) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4].Descriptor() +} + +func (SecurityScheme_In) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4] +} + +func (x SecurityScheme_In) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The flow used by the OAuth2 security scheme. Valid values are +// "implicit", "password", "application" or "accessCode". +type SecurityScheme_Flow int32 + +const ( + SecurityScheme_FLOW_INVALID SecurityScheme_Flow = 0 + SecurityScheme_FLOW_IMPLICIT SecurityScheme_Flow = 1 + SecurityScheme_FLOW_PASSWORD SecurityScheme_Flow = 2 + SecurityScheme_FLOW_APPLICATION SecurityScheme_Flow = 3 + SecurityScheme_FLOW_ACCESS_CODE SecurityScheme_Flow = 4 +) + +// Enum value maps for SecurityScheme_Flow. +var ( + SecurityScheme_Flow_name = map[int32]string{ + 0: "FLOW_INVALID", + 1: "FLOW_IMPLICIT", + 2: "FLOW_PASSWORD", + 3: "FLOW_APPLICATION", + 4: "FLOW_ACCESS_CODE", + } + SecurityScheme_Flow_value = map[string]int32{ + "FLOW_INVALID": 0, + "FLOW_IMPLICIT": 1, + "FLOW_PASSWORD": 2, + "FLOW_APPLICATION": 3, + "FLOW_ACCESS_CODE": 4, + } +) + +func (x SecurityScheme_Flow) Enum() *SecurityScheme_Flow { + p := new(SecurityScheme_Flow) + *p = x + return p +} + +func (x SecurityScheme_Flow) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Flow) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5].Descriptor() +} + +func (SecurityScheme_Flow) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5] +} + +func (x SecurityScheme_Flow) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Swagger` is a representation of OpenAPI v2 specification's Swagger object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// schemes: HTTPS; +// consumes: "application/json"; +// produces: "application/json"; +// }; +type Swagger struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + Swagger string `protobuf:"bytes,1,opt,name=swagger,proto3" json:"swagger,omitempty"` + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + Host string `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty"` + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath,proto3" json:"base_path,omitempty"` + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + Schemes []Scheme `protobuf:"varint,5,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + Responses map[string]*Response `protobuf:"bytes,10,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Security scheme definitions that can be used across the specification. + SecurityDefinitions *SecurityDefinitions `protobuf:"bytes,11,opt,name=security_definitions,json=securityDefinitions,proto3" json:"security_definitions,omitempty"` + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []*Tag `protobuf:"bytes,13,rep,name=tags,proto3" json:"tags,omitempty"` + // Additional external documentation. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,14,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,15,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Swagger) Reset() { + *x = Swagger{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Swagger) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Swagger) ProtoMessage() {} + +func (x *Swagger) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Swagger) GetSwagger() string { + if x != nil { + return x.Swagger + } + return "" +} + +func (x *Swagger) GetInfo() *Info { + if x != nil { + return x.Info + } + return nil +} + +func (x *Swagger) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + +func (x *Swagger) GetBasePath() string { + if x != nil { + return x.BasePath + } + return "" +} + +func (x *Swagger) GetSchemes() []Scheme { + if x != nil { + return x.Schemes + } + return nil +} + +func (x *Swagger) GetConsumes() []string { + if x != nil { + return x.Consumes + } + return nil +} + +func (x *Swagger) GetProduces() []string { + if x != nil { + return x.Produces + } + return nil +} + +func (x *Swagger) GetResponses() map[string]*Response { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Swagger) GetSecurityDefinitions() *SecurityDefinitions { + if x != nil { + return x.SecurityDefinitions + } + return nil +} + +func (x *Swagger) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Swagger) GetTags() []*Tag { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Swagger) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Swagger) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Swagger) SetSwagger(v string) { + x.Swagger = v +} + +func (x *Swagger) SetInfo(v *Info) { + x.Info = v +} + +func (x *Swagger) SetHost(v string) { + x.Host = v +} + +func (x *Swagger) SetBasePath(v string) { + x.BasePath = v +} + +func (x *Swagger) SetSchemes(v []Scheme) { + x.Schemes = v +} + +func (x *Swagger) SetConsumes(v []string) { + x.Consumes = v +} + +func (x *Swagger) SetProduces(v []string) { + x.Produces = v +} + +func (x *Swagger) SetResponses(v map[string]*Response) { + x.Responses = v +} + +func (x *Swagger) SetSecurityDefinitions(v *SecurityDefinitions) { + x.SecurityDefinitions = v +} + +func (x *Swagger) SetSecurity(v []*SecurityRequirement) { + x.Security = v +} + +func (x *Swagger) SetTags(v []*Tag) { + x.Tags = v +} + +func (x *Swagger) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Swagger) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Swagger) HasInfo() bool { + if x == nil { + return false + } + return x.Info != nil +} + +func (x *Swagger) HasSecurityDefinitions() bool { + if x == nil { + return false + } + return x.SecurityDefinitions != nil +} + +func (x *Swagger) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Swagger) ClearInfo() { + x.Info = nil +} + +func (x *Swagger) ClearSecurityDefinitions() { + x.SecurityDefinitions = nil +} + +func (x *Swagger) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type Swagger_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + Swagger string + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info *Info + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + Host string + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + BasePath string + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + Schemes []Scheme + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Consumes []string + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Produces []string + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + Responses map[string]*Response + // Security scheme definitions that can be used across the specification. + SecurityDefinitions *SecurityDefinitions + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + Security []*SecurityRequirement + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []*Tag + // Additional external documentation. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Swagger_builder) Build() *Swagger { + m0 := &Swagger{} + b, x := &b0, m0 + _, _ = b, x + x.Swagger = b.Swagger + x.Info = b.Info + x.Host = b.Host + x.BasePath = b.BasePath + x.Schemes = b.Schemes + x.Consumes = b.Consumes + x.Produces = b.Produces + x.Responses = b.Responses + x.SecurityDefinitions = b.SecurityDefinitions + x.Security = b.Security + x.Tags = b.Tags + x.ExternalDocs = b.ExternalDocs + x.Extensions = b.Extensions + return m0 +} + +// `Operation` is a representation of OpenAPI v2 specification's Operation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject +// +// Example: +// +// service EchoService { +// rpc Echo(SimpleMessage) returns (SimpleMessage) { +// option (google.api.http) = { +// get: "/v1/example/echo/{id}" +// }; +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { +// summary: "Get a message."; +// operation_id: "getMessage"; +// tags: "echo"; +// responses: { +// key: "200" +// value: { +// description: "OK"; +// } +// } +// }; +// } +// } +type Operation struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Additional external documentation for this operation. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + // The list of possible responses as they are returned from executing this + // operation. + Responses map[string]*Response `protobuf:"bytes,9,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + Schemes []Scheme `protobuf:"varint,10,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + Deprecated bool `protobuf:"varint,11,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,13,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters *Parameters `protobuf:"bytes,14,opt,name=parameters,proto3" json:"parameters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Operation) Reset() { + *x = Operation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Operation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Operation) ProtoMessage() {} + +func (x *Operation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Operation) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Operation) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Operation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Operation) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Operation) GetOperationId() string { + if x != nil { + return x.OperationId + } + return "" +} + +func (x *Operation) GetConsumes() []string { + if x != nil { + return x.Consumes + } + return nil +} + +func (x *Operation) GetProduces() []string { + if x != nil { + return x.Produces + } + return nil +} + +func (x *Operation) GetResponses() map[string]*Response { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Operation) GetSchemes() []Scheme { + if x != nil { + return x.Schemes + } + return nil +} + +func (x *Operation) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Operation) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Operation) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Operation) GetParameters() *Parameters { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Operation) SetTags(v []string) { + x.Tags = v +} + +func (x *Operation) SetSummary(v string) { + x.Summary = v +} + +func (x *Operation) SetDescription(v string) { + x.Description = v +} + +func (x *Operation) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Operation) SetOperationId(v string) { + x.OperationId = v +} + +func (x *Operation) SetConsumes(v []string) { + x.Consumes = v +} + +func (x *Operation) SetProduces(v []string) { + x.Produces = v +} + +func (x *Operation) SetResponses(v map[string]*Response) { + x.Responses = v +} + +func (x *Operation) SetSchemes(v []Scheme) { + x.Schemes = v +} + +func (x *Operation) SetDeprecated(v bool) { + x.Deprecated = v +} + +func (x *Operation) SetSecurity(v []*SecurityRequirement) { + x.Security = v +} + +func (x *Operation) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Operation) SetParameters(v *Parameters) { + x.Parameters = v +} + +func (x *Operation) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Operation) HasParameters() bool { + if x == nil { + return false + } + return x.Parameters != nil +} + +func (x *Operation) ClearExternalDocs() { + x.ExternalDocs = nil +} + +func (x *Operation) ClearParameters() { + x.Parameters = nil +} + +type Operation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []string + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + Summary string + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + Description string + // Additional external documentation for this operation. + ExternalDocs *ExternalDocumentation + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + OperationId string + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Consumes []string + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Produces []string + // The list of possible responses as they are returned from executing this + // operation. + Responses map[string]*Response + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + Schemes []Scheme + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + Deprecated bool + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + Security []*SecurityRequirement + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters *Parameters +} + +func (b0 Operation_builder) Build() *Operation { + m0 := &Operation{} + b, x := &b0, m0 + _, _ = b, x + x.Tags = b.Tags + x.Summary = b.Summary + x.Description = b.Description + x.ExternalDocs = b.ExternalDocs + x.OperationId = b.OperationId + x.Consumes = b.Consumes + x.Produces = b.Produces + x.Responses = b.Responses + x.Schemes = b.Schemes + x.Deprecated = b.Deprecated + x.Security = b.Security + x.Extensions = b.Extensions + x.Parameters = b.Parameters + return m0 +} + +// `Parameters` is a representation of OpenAPI v2 specification's parameters object. +// Note: This technically breaks compatibility with the OpenAPI 2 definition structure as we only +// allow header parameters to be set here since we do not want users specifying custom non-header +// parameters beyond those inferred from the Protobuf schema. +// See: https://swagger.io/specification/v2/#parameter-object +type Parameters struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + Headers []*HeaderParameter `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Parameters) Reset() { + *x = Parameters{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Parameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameters) ProtoMessage() {} + +func (x *Parameters) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Parameters) GetHeaders() []*HeaderParameter { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Parameters) SetHeaders(v []*HeaderParameter) { + x.Headers = v +} + +type Parameters_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + Headers []*HeaderParameter +} + +func (b0 Parameters_builder) Build() *Parameters { + m0 := &Parameters{} + b, x := &b0, m0 + _, _ = b, x + x.Headers = b.Headers + return m0 +} + +// `HeaderParameter` a HTTP header parameter. +// See: https://swagger.io/specification/v2/#parameter-object +type HeaderParameter struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Name` is the header name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // `Description` is a short description of the header. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type HeaderParameter_Type `protobuf:"varint,3,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter_Type" json:"type,omitempty"` + // `Format` The extending format for the previously mentioned type. + Format string `protobuf:"bytes,4,opt,name=format,proto3" json:"format,omitempty"` + // `Required` indicates if the header is optional + Required bool `protobuf:"varint,5,opt,name=required,proto3" json:"required,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HeaderParameter) Reset() { + *x = HeaderParameter{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HeaderParameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderParameter) ProtoMessage() {} + +func (x *HeaderParameter) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *HeaderParameter) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *HeaderParameter) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *HeaderParameter) GetType() HeaderParameter_Type { + if x != nil { + return x.Type + } + return HeaderParameter_UNKNOWN +} + +func (x *HeaderParameter) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *HeaderParameter) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *HeaderParameter) SetName(v string) { + x.Name = v +} + +func (x *HeaderParameter) SetDescription(v string) { + x.Description = v +} + +func (x *HeaderParameter) SetType(v HeaderParameter_Type) { + x.Type = v +} + +func (x *HeaderParameter) SetFormat(v string) { + x.Format = v +} + +func (x *HeaderParameter) SetRequired(v bool) { + x.Required = v +} + +type HeaderParameter_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Name` is the header name. + Name string + // `Description` is a short description of the header. + Description string + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type HeaderParameter_Type + // `Format` The extending format for the previously mentioned type. + Format string + // `Required` indicates if the header is optional + Required bool +} + +func (b0 HeaderParameter_builder) Build() *HeaderParameter { + m0 := &HeaderParameter{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Description = b.Description + x.Type = b.Type + x.Format = b.Format + x.Required = b.Required + return m0 +} + +// `Header` is a representation of OpenAPI v2 specification's Header object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject +type Header struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Description` is a short description of the header. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + // `Format` The extending format for the previously mentioned type. + Format string `protobuf:"bytes,3,opt,name=format,proto3" json:"format,omitempty"` + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + Default string `protobuf:"bytes,6,opt,name=default,proto3" json:"default,omitempty"` + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + Pattern string `protobuf:"bytes,13,opt,name=pattern,proto3" json:"pattern,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Header) Reset() { + *x = Header{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Header) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Header) ProtoMessage() {} + +func (x *Header) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Header) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Header) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Header) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *Header) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *Header) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *Header) SetDescription(v string) { + x.Description = v +} + +func (x *Header) SetType(v string) { + x.Type = v +} + +func (x *Header) SetFormat(v string) { + x.Format = v +} + +func (x *Header) SetDefault(v string) { + x.Default = v +} + +func (x *Header) SetPattern(v string) { + x.Pattern = v +} + +type Header_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the header. + Description string + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + Type string + // `Format` The extending format for the previously mentioned type. + Format string + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + Default string + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + Pattern string +} + +func (b0 Header_builder) Build() *Header { + m0 := &Header{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Type = b.Type + x.Format = b.Format + x.Default = b.Default + x.Pattern = b.Pattern + return m0 +} + +// `Response` is a representation of OpenAPI v2 specification's Response object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject +type Response struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema *Schema `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + Headers map[string]*Header `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + Examples map[string]string `protobuf:"bytes,4,rep,name=examples,proto3" json:"examples,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,5,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Response) Reset() { + *x = Response{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Response) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Response) GetSchema() *Schema { + if x != nil { + return x.Schema + } + return nil +} + +func (x *Response) GetHeaders() map[string]*Header { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Response) GetExamples() map[string]string { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Response) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Response) SetDescription(v string) { + x.Description = v +} + +func (x *Response) SetSchema(v *Schema) { + x.Schema = v +} + +func (x *Response) SetHeaders(v map[string]*Header) { + x.Headers = v +} + +func (x *Response) SetExamples(v map[string]string) { + x.Examples = v +} + +func (x *Response) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Response) HasSchema() bool { + if x == nil { + return false + } + return x.Schema != nil +} + +func (x *Response) ClearSchema() { + x.Schema = nil +} + +type Response_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + Description string + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema *Schema + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + Headers map[string]*Header + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + Examples map[string]string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Response_builder) Build() *Response { + m0 := &Response{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Schema = b.Schema + x.Headers = b.Headers + x.Examples = b.Examples + x.Extensions = b.Extensions + return m0 +} + +// `Info` is a representation of OpenAPI v2 specification's Info object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// ... +// }; +type Info struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The title of the application. + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // A short description of the application. GFM syntax can be used for rich + // text representation. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // The Terms of Service for the API. + TermsOfService string `protobuf:"bytes,3,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"` + // The contact information for the exposed API. + Contact *Contact `protobuf:"bytes,4,opt,name=contact,proto3" json:"contact,omitempty"` + // The license information for the exposed API. + License *License `protobuf:"bytes,5,opt,name=license,proto3" json:"license,omitempty"` + // Provides the version of the application API (not to be confused + // with the specification version). + Version string `protobuf:"bytes,6,opt,name=version,proto3" json:"version,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,7,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Info) Reset() { + *x = Info{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Info) ProtoMessage() {} + +func (x *Info) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Info) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Info) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Info) GetTermsOfService() string { + if x != nil { + return x.TermsOfService + } + return "" +} + +func (x *Info) GetContact() *Contact { + if x != nil { + return x.Contact + } + return nil +} + +func (x *Info) GetLicense() *License { + if x != nil { + return x.License + } + return nil +} + +func (x *Info) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Info) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Info) SetTitle(v string) { + x.Title = v +} + +func (x *Info) SetDescription(v string) { + x.Description = v +} + +func (x *Info) SetTermsOfService(v string) { + x.TermsOfService = v +} + +func (x *Info) SetContact(v *Contact) { + x.Contact = v +} + +func (x *Info) SetLicense(v *License) { + x.License = v +} + +func (x *Info) SetVersion(v string) { + x.Version = v +} + +func (x *Info) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Info) HasContact() bool { + if x == nil { + return false + } + return x.Contact != nil +} + +func (x *Info) HasLicense() bool { + if x == nil { + return false + } + return x.License != nil +} + +func (x *Info) ClearContact() { + x.Contact = nil +} + +func (x *Info) ClearLicense() { + x.License = nil +} + +type Info_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The title of the application. + Title string + // A short description of the application. GFM syntax can be used for rich + // text representation. + Description string + // The Terms of Service for the API. + TermsOfService string + // The contact information for the exposed API. + Contact *Contact + // The license information for the exposed API. + License *License + // Provides the version of the application API (not to be confused + // with the specification version). + Version string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Info_builder) Build() *Info { + m0 := &Info{} + b, x := &b0, m0 + _, _ = b, x + x.Title = b.Title + x.Description = b.Description + x.TermsOfService = b.TermsOfService + x.Contact = b.Contact + x.License = b.License + x.Version = b.Version + x.Extensions = b.Extensions + return m0 +} + +// `Contact` is a representation of OpenAPI v2 specification's Contact object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// ... +// }; +// ... +// }; +type Contact struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The identifying name of the contact person/organization. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The URL pointing to the contact information. MUST be in the format of a + // URL. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + // The email address of the contact person/organization. MUST be in the format + // of an email address. + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Contact) Reset() { + *x = Contact{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Contact) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Contact) ProtoMessage() {} + +func (x *Contact) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Contact) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Contact) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Contact) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *Contact) SetName(v string) { + x.Name = v +} + +func (x *Contact) SetUrl(v string) { + x.Url = v +} + +func (x *Contact) SetEmail(v string) { + x.Email = v +} + +type Contact_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The identifying name of the contact person/organization. + Name string + // The URL pointing to the contact information. MUST be in the format of a + // URL. + Url string + // The email address of the contact person/organization. MUST be in the format + // of an email address. + Email string +} + +func (b0 Contact_builder) Build() *Contact { + m0 := &Contact{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Url = b.Url + x.Email = b.Email + return m0 +} + +// `License` is a representation of OpenAPI v2 specification's License object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// ... +// }; +// ... +// }; +type License struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The license name used for the API. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A URL to the license used for the API. MUST be in the format of a URL. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *License) Reset() { + *x = License{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *License) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *License) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *License) SetName(v string) { + x.Name = v +} + +func (x *License) SetUrl(v string) { + x.Url = v +} + +type License_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The license name used for the API. + Name string + // A URL to the license used for the API. MUST be in the format of a URL. + Url string +} + +func (b0 License_builder) Build() *License { + m0 := &License{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Url = b.Url + return m0 +} + +// `ExternalDocumentation` is a representation of OpenAPI v2 specification's +// ExternalDocumentation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// ... +// external_docs: { +// description: "More about gRPC-Gateway"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// } +// ... +// }; +type ExternalDocumentation struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // The URL for the target documentation. Value MUST be in the format + // of a URL. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalDocumentation) Reset() { + *x = ExternalDocumentation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalDocumentation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalDocumentation) ProtoMessage() {} + +func (x *ExternalDocumentation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *ExternalDocumentation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ExternalDocumentation) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *ExternalDocumentation) SetDescription(v string) { + x.Description = v +} + +func (x *ExternalDocumentation) SetUrl(v string) { + x.Url = v +} + +type ExternalDocumentation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + Description string + // The URL for the target documentation. Value MUST be in the format + // of a URL. + Url string +} + +func (b0 ExternalDocumentation_builder) Build() *ExternalDocumentation { + m0 := &ExternalDocumentation{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Url = b.Url + return m0 +} + +// `Schema` is a representation of OpenAPI v2 specification's Schema object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +type Schema struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + JsonSchema *JSONSchema `protobuf:"bytes,1,opt,name=json_schema,json=jsonSchema,proto3" json:"json_schema,omitempty"` + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + Discriminator string `protobuf:"bytes,2,opt,name=discriminator,proto3" json:"discriminator,omitempty"` + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,5,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + Example string `protobuf:"bytes,6,opt,name=example,proto3" json:"example,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Schema) Reset() { + *x = Schema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Schema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Schema) ProtoMessage() {} + +func (x *Schema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Schema) GetJsonSchema() *JSONSchema { + if x != nil { + return x.JsonSchema + } + return nil +} + +func (x *Schema) GetDiscriminator() string { + if x != nil { + return x.Discriminator + } + return "" +} + +func (x *Schema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *Schema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Schema) GetExample() string { + if x != nil { + return x.Example + } + return "" +} + +func (x *Schema) SetJsonSchema(v *JSONSchema) { + x.JsonSchema = v +} + +func (x *Schema) SetDiscriminator(v string) { + x.Discriminator = v +} + +func (x *Schema) SetReadOnly(v bool) { + x.ReadOnly = v +} + +func (x *Schema) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Schema) SetExample(v string) { + x.Example = v +} + +func (x *Schema) HasJsonSchema() bool { + if x == nil { + return false + } + return x.JsonSchema != nil +} + +func (x *Schema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Schema) ClearJsonSchema() { + x.JsonSchema = nil +} + +func (x *Schema) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type Schema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + JsonSchema *JSONSchema + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + Discriminator string + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + Example string +} + +func (b0 Schema_builder) Build() *Schema { + m0 := &Schema{} + b, x := &b0, m0 + _, _ = b, x + x.JsonSchema = b.JsonSchema + x.Discriminator = b.Discriminator + x.ReadOnly = b.ReadOnly + x.ExternalDocs = b.ExternalDocs + x.Example = b.Example + return m0 +} + +// `EnumSchema` is subset of fields from the OpenAPI v2 specification's Schema object. +// Only fields that are applicable to Enums are included +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = { +// ... +// title: "MyEnum"; +// description:"This is my nice enum"; +// example: "ZERO"; +// required: true; +// ... +// }; +type EnumSchema struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A short description of the schema. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Default string `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` + // The title of the schema. + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + ReadOnly bool `protobuf:"varint,5,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,6,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + Example string `protobuf:"bytes,7,opt,name=example,proto3" json:"example,omitempty"` + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string `protobuf:"bytes,8,opt,name=ref,proto3" json:"ref,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumSchema) Reset() { + *x = EnumSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumSchema) ProtoMessage() {} + +func (x *EnumSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *EnumSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *EnumSchema) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *EnumSchema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *EnumSchema) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *EnumSchema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *EnumSchema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *EnumSchema) GetExample() string { + if x != nil { + return x.Example + } + return "" +} + +func (x *EnumSchema) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *EnumSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *EnumSchema) SetDescription(v string) { + x.Description = v +} + +func (x *EnumSchema) SetDefault(v string) { + x.Default = v +} + +func (x *EnumSchema) SetTitle(v string) { + x.Title = v +} + +func (x *EnumSchema) SetRequired(v bool) { + x.Required = v +} + +func (x *EnumSchema) SetReadOnly(v bool) { + x.ReadOnly = v +} + +func (x *EnumSchema) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *EnumSchema) SetExample(v string) { + x.Example = v +} + +func (x *EnumSchema) SetRef(v string) { + x.Ref = v +} + +func (x *EnumSchema) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *EnumSchema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *EnumSchema) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type EnumSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the schema. + Description string + Default string + // The title of the schema. + Title string + Required bool + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + Example string + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 EnumSchema_builder) Build() *EnumSchema { + m0 := &EnumSchema{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Default = b.Default + x.Title = b.Title + x.Required = b.Required + x.ReadOnly = b.ReadOnly + x.ExternalDocs = b.ExternalDocs + x.Example = b.Example + x.Ref = b.Ref + x.Extensions = b.Extensions + return m0 +} + +// `JSONSchema` represents properties from JSON Schema taken, and as used, in +// the OpenAPI v2 spec. +// +// This includes changes made by OpenAPI v2. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// See also: https://cswr.github.io/JsonSchema/spec/basic_types/, +// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json +// +// Example: +// +// message SimpleMessage { +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { +// json_schema: { +// title: "SimpleMessage" +// description: "A simple message." +// required: ["id"] +// } +// }; +// +// // Id represents the message identifier. +// string id = 1; [ +// (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { +// description: "The unique identifier of the simple message." +// }]; +// } +type JSONSchema struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string `protobuf:"bytes,3,opt,name=ref,proto3" json:"ref,omitempty"` + // The title of the schema. + Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"` + // A short description of the schema. + Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + Default string `protobuf:"bytes,7,opt,name=default,proto3" json:"default,omitempty"` + ReadOnly bool `protobuf:"varint,8,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + Example string `protobuf:"bytes,9,opt,name=example,proto3" json:"example,omitempty"` + MultipleOf float64 `protobuf:"fixed64,10,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + Minimum float64 `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength uint64 `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength uint64 `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems uint64 `protobuf:"varint,20,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems uint64 `protobuf:"varint,21,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,22,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + MaxProperties uint64 `protobuf:"varint,24,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"` + MinProperties uint64 `protobuf:"varint,25,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"` + Required []string `protobuf:"bytes,26,rep,name=required,proto3" json:"required,omitempty"` + // Items in 'array' must be unique. + Array []string `protobuf:"bytes,34,rep,name=array,proto3" json:"array,omitempty"` + Type []JSONSchema_JSONSchemaSimpleTypes `protobuf:"varint,35,rep,packed,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.JSONSchema_JSONSchemaSimpleTypes" json:"type,omitempty"` + // `Format` + Format string `protobuf:"bytes,36,opt,name=format,proto3" json:"format,omitempty"` + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + Enum []string `protobuf:"bytes,46,rep,name=enum,proto3" json:"enum,omitempty"` + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration *JSONSchema_FieldConfiguration `protobuf:"bytes,1001,opt,name=field_configuration,json=fieldConfiguration,proto3" json:"field_configuration,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,48,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema) Reset() { + *x = JSONSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema) ProtoMessage() {} + +func (x *JSONSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *JSONSchema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *JSONSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *JSONSchema) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *JSONSchema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *JSONSchema) GetExample() string { + if x != nil { + return x.Example + } + return "" +} + +func (x *JSONSchema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *JSONSchema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *JSONSchema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *JSONSchema) GetMaxLength() uint64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *JSONSchema) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *JSONSchema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *JSONSchema) GetMaxItems() uint64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *JSONSchema) GetMinItems() uint64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *JSONSchema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *JSONSchema) GetMaxProperties() uint64 { + if x != nil { + return x.MaxProperties + } + return 0 +} + +func (x *JSONSchema) GetMinProperties() uint64 { + if x != nil { + return x.MinProperties + } + return 0 +} + +func (x *JSONSchema) GetRequired() []string { + if x != nil { + return x.Required + } + return nil +} + +func (x *JSONSchema) GetArray() []string { + if x != nil { + return x.Array + } + return nil +} + +func (x *JSONSchema) GetType() []JSONSchema_JSONSchemaSimpleTypes { + if x != nil { + return x.Type + } + return nil +} + +func (x *JSONSchema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *JSONSchema) GetEnum() []string { + if x != nil { + return x.Enum + } + return nil +} + +func (x *JSONSchema) GetFieldConfiguration() *JSONSchema_FieldConfiguration { + if x != nil { + return x.FieldConfiguration + } + return nil +} + +func (x *JSONSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *JSONSchema) SetRef(v string) { + x.Ref = v +} + +func (x *JSONSchema) SetTitle(v string) { + x.Title = v +} + +func (x *JSONSchema) SetDescription(v string) { + x.Description = v +} + +func (x *JSONSchema) SetDefault(v string) { + x.Default = v +} + +func (x *JSONSchema) SetReadOnly(v bool) { + x.ReadOnly = v +} + +func (x *JSONSchema) SetExample(v string) { + x.Example = v +} + +func (x *JSONSchema) SetMultipleOf(v float64) { + x.MultipleOf = v +} + +func (x *JSONSchema) SetMaximum(v float64) { + x.Maximum = v +} + +func (x *JSONSchema) SetExclusiveMaximum(v bool) { + x.ExclusiveMaximum = v +} + +func (x *JSONSchema) SetMinimum(v float64) { + x.Minimum = v +} + +func (x *JSONSchema) SetExclusiveMinimum(v bool) { + x.ExclusiveMinimum = v +} + +func (x *JSONSchema) SetMaxLength(v uint64) { + x.MaxLength = v +} + +func (x *JSONSchema) SetMinLength(v uint64) { + x.MinLength = v +} + +func (x *JSONSchema) SetPattern(v string) { + x.Pattern = v +} + +func (x *JSONSchema) SetMaxItems(v uint64) { + x.MaxItems = v +} + +func (x *JSONSchema) SetMinItems(v uint64) { + x.MinItems = v +} + +func (x *JSONSchema) SetUniqueItems(v bool) { + x.UniqueItems = v +} + +func (x *JSONSchema) SetMaxProperties(v uint64) { + x.MaxProperties = v +} + +func (x *JSONSchema) SetMinProperties(v uint64) { + x.MinProperties = v +} + +func (x *JSONSchema) SetRequired(v []string) { + x.Required = v +} + +func (x *JSONSchema) SetArray(v []string) { + x.Array = v +} + +func (x *JSONSchema) SetType(v []JSONSchema_JSONSchemaSimpleTypes) { + x.Type = v +} + +func (x *JSONSchema) SetFormat(v string) { + x.Format = v +} + +func (x *JSONSchema) SetEnum(v []string) { + x.Enum = v +} + +func (x *JSONSchema) SetFieldConfiguration(v *JSONSchema_FieldConfiguration) { + x.FieldConfiguration = v +} + +func (x *JSONSchema) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *JSONSchema) HasFieldConfiguration() bool { + if x == nil { + return false + } + return x.FieldConfiguration != nil +} + +func (x *JSONSchema) ClearFieldConfiguration() { + x.FieldConfiguration = nil +} + +type JSONSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // The title of the schema. + Title string + // A short description of the schema. + Description string + Default string + ReadOnly bool + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + Example string + MultipleOf float64 + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + Maximum float64 + ExclusiveMaximum bool + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + Minimum float64 + ExclusiveMinimum bool + MaxLength uint64 + MinLength uint64 + Pattern string + MaxItems uint64 + MinItems uint64 + UniqueItems bool + MaxProperties uint64 + MinProperties uint64 + Required []string + // Items in 'array' must be unique. + Array []string + Type []JSONSchema_JSONSchemaSimpleTypes + // `Format` + Format string + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + Enum []string + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration *JSONSchema_FieldConfiguration + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 JSONSchema_builder) Build() *JSONSchema { + m0 := &JSONSchema{} + b, x := &b0, m0 + _, _ = b, x + x.Ref = b.Ref + x.Title = b.Title + x.Description = b.Description + x.Default = b.Default + x.ReadOnly = b.ReadOnly + x.Example = b.Example + x.MultipleOf = b.MultipleOf + x.Maximum = b.Maximum + x.ExclusiveMaximum = b.ExclusiveMaximum + x.Minimum = b.Minimum + x.ExclusiveMinimum = b.ExclusiveMinimum + x.MaxLength = b.MaxLength + x.MinLength = b.MinLength + x.Pattern = b.Pattern + x.MaxItems = b.MaxItems + x.MinItems = b.MinItems + x.UniqueItems = b.UniqueItems + x.MaxProperties = b.MaxProperties + x.MinProperties = b.MinProperties + x.Required = b.Required + x.Array = b.Array + x.Type = b.Type + x.Format = b.Format + x.Enum = b.Enum + x.FieldConfiguration = b.FieldConfiguration + x.Extensions = b.Extensions + return m0 +} + +// `Tag` is a representation of OpenAPI v2 specification's Tag object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject +type Tag struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A short description for the tag. GFM syntax can be used for rich text + // representation. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // Additional external documentation for this tag. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,4,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Tag) Reset() { + *x = Tag{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Tag) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Tag) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Tag) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Tag) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Tag) SetName(v string) { + x.Name = v +} + +func (x *Tag) SetDescription(v string) { + x.Description = v +} + +func (x *Tag) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Tag) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Tag) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Tag) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type Tag_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + Name string + // A short description for the tag. GFM syntax can be used for rich text + // representation. + Description string + // Additional external documentation for this tag. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Tag_builder) Build() *Tag { + m0 := &Tag{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Description = b.Description + x.ExternalDocs = b.ExternalDocs + x.Extensions = b.Extensions + return m0 +} + +// `SecurityDefinitions` is a representation of OpenAPI v2 specification's +// Security Definitions object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject +// +// A declaration of the security schemes available to be used in the +// specification. This does not enforce the security schemes on the operations +// and only serves to provide the relevant details for each scheme. +type SecurityDefinitions struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + Security map[string]*SecurityScheme `protobuf:"bytes,1,rep,name=security,proto3" json:"security,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityDefinitions) Reset() { + *x = SecurityDefinitions{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityDefinitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityDefinitions) ProtoMessage() {} + +func (x *SecurityDefinitions) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityDefinitions) GetSecurity() map[string]*SecurityScheme { + if x != nil { + return x.Security + } + return nil +} + +func (x *SecurityDefinitions) SetSecurity(v map[string]*SecurityScheme) { + x.Security = v +} + +type SecurityDefinitions_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + Security map[string]*SecurityScheme +} + +func (b0 SecurityDefinitions_builder) Build() *SecurityDefinitions { + m0 := &SecurityDefinitions{} + b, x := &b0, m0 + _, _ = b, x + x.Security = b.Security + return m0 +} + +// `SecurityScheme` is a representation of OpenAPI v2 specification's +// Security Scheme object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject +// +// Allows the definition of a security scheme that can be used by the +// operations. Supported schemes are basic authentication, an API key (either as +// a header or as a query parameter) and OAuth2's common flows (implicit, +// password, application and access code). +type SecurityScheme struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type SecurityScheme_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Type" json:"type,omitempty"` + // A short description for security scheme. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // The name of the header or query parameter to be used. + // Valid for apiKey. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In SecurityScheme_In `protobuf:"varint,4,opt,name=in,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_In" json:"in,omitempty"` + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow SecurityScheme_Flow `protobuf:"varint,5,opt,name=flow,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Flow" json:"flow,omitempty"` + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + AuthorizationUrl string `protobuf:"bytes,6,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + TokenUrl string `protobuf:"bytes,7,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes *Scopes `protobuf:"bytes,8,opt,name=scopes,proto3" json:"scopes,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityScheme) Reset() { + *x = SecurityScheme{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityScheme) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityScheme) ProtoMessage() {} + +func (x *SecurityScheme) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityScheme) GetType() SecurityScheme_Type { + if x != nil { + return x.Type + } + return SecurityScheme_TYPE_INVALID +} + +func (x *SecurityScheme) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *SecurityScheme) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SecurityScheme) GetIn() SecurityScheme_In { + if x != nil { + return x.In + } + return SecurityScheme_IN_INVALID +} + +func (x *SecurityScheme) GetFlow() SecurityScheme_Flow { + if x != nil { + return x.Flow + } + return SecurityScheme_FLOW_INVALID +} + +func (x *SecurityScheme) GetAuthorizationUrl() string { + if x != nil { + return x.AuthorizationUrl + } + return "" +} + +func (x *SecurityScheme) GetTokenUrl() string { + if x != nil { + return x.TokenUrl + } + return "" +} + +func (x *SecurityScheme) GetScopes() *Scopes { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *SecurityScheme) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *SecurityScheme) SetType(v SecurityScheme_Type) { + x.Type = v +} + +func (x *SecurityScheme) SetDescription(v string) { + x.Description = v +} + +func (x *SecurityScheme) SetName(v string) { + x.Name = v +} + +func (x *SecurityScheme) SetIn(v SecurityScheme_In) { + x.In = v +} + +func (x *SecurityScheme) SetFlow(v SecurityScheme_Flow) { + x.Flow = v +} + +func (x *SecurityScheme) SetAuthorizationUrl(v string) { + x.AuthorizationUrl = v +} + +func (x *SecurityScheme) SetTokenUrl(v string) { + x.TokenUrl = v +} + +func (x *SecurityScheme) SetScopes(v *Scopes) { + x.Scopes = v +} + +func (x *SecurityScheme) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *SecurityScheme) HasScopes() bool { + if x == nil { + return false + } + return x.Scopes != nil +} + +func (x *SecurityScheme) ClearScopes() { + x.Scopes = nil +} + +type SecurityScheme_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type SecurityScheme_Type + // A short description for security scheme. + Description string + // The name of the header or query parameter to be used. + // Valid for apiKey. + Name string + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In SecurityScheme_In + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow SecurityScheme_Flow + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + AuthorizationUrl string + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + TokenUrl string + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes *Scopes + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 SecurityScheme_builder) Build() *SecurityScheme { + m0 := &SecurityScheme{} + b, x := &b0, m0 + _, _ = b, x + x.Type = b.Type + x.Description = b.Description + x.Name = b.Name + x.In = b.In + x.Flow = b.Flow + x.AuthorizationUrl = b.AuthorizationUrl + x.TokenUrl = b.TokenUrl + x.Scopes = b.Scopes + x.Extensions = b.Extensions + return m0 +} + +// `SecurityRequirement` is a representation of OpenAPI v2 specification's +// Security Requirement object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject +// +// Lists the required security schemes to execute this operation. The object can +// have multiple security schemes declared in it which are all required (that +// is, there is a logical AND between the schemes). +// +// The name used for each property MUST correspond to a security scheme +// declared in the Security Definitions. +type SecurityRequirement struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue `protobuf:"bytes,1,rep,name=security_requirement,json=securityRequirement,proto3" json:"security_requirement,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement) Reset() { + *x = SecurityRequirement{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement) ProtoMessage() {} + +func (x *SecurityRequirement) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement) GetSecurityRequirement() map[string]*SecurityRequirement_SecurityRequirementValue { + if x != nil { + return x.SecurityRequirement + } + return nil +} + +func (x *SecurityRequirement) SetSecurityRequirement(v map[string]*SecurityRequirement_SecurityRequirementValue) { + x.SecurityRequirement = v +} + +type SecurityRequirement_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue +} + +func (b0 SecurityRequirement_builder) Build() *SecurityRequirement { + m0 := &SecurityRequirement{} + b, x := &b0, m0 + _, _ = b, x + x.SecurityRequirement = b.SecurityRequirement + return m0 +} + +// `Scopes` is a representation of OpenAPI v2 specification's Scopes object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject +// +// Lists the available scopes for an OAuth2 security scheme. +type Scopes struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Maps between a name of a scope to a short description of it (as the value + // of the property). + Scope map[string]string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Scopes) Reset() { + *x = Scopes{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Scopes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Scopes) ProtoMessage() {} + +func (x *Scopes) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Scopes) GetScope() map[string]string { + if x != nil { + return x.Scope + } + return nil +} + +func (x *Scopes) SetScope(v map[string]string) { + x.Scope = v +} + +type Scopes_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Maps between a name of a scope to a short description of it (as the value + // of the property). + Scope map[string]string +} + +func (b0 Scopes_builder) Build() *Scopes { + m0 := &Scopes{} + b, x := &b0, m0 + _, _ = b, x + x.Scope = b.Scope + return m0 +} + +// 'FieldConfiguration' provides additional field level properties used when generating the OpenAPI v2 file. +// These properties are not defined by OpenAPIv2, but they are used to control the generation. +type JSONSchema_FieldConfiguration struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + PathParamName string `protobuf:"bytes,47,opt,name=path_param_name,json=pathParamName,proto3" json:"path_param_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema_FieldConfiguration) Reset() { + *x = JSONSchema_FieldConfiguration{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema_FieldConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema_FieldConfiguration) ProtoMessage() {} + +func (x *JSONSchema_FieldConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema_FieldConfiguration) GetPathParamName() string { + if x != nil { + return x.PathParamName + } + return "" +} + +func (x *JSONSchema_FieldConfiguration) SetPathParamName(v string) { + x.PathParamName = v +} + +type JSONSchema_FieldConfiguration_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + PathParamName string +} + +func (b0 JSONSchema_FieldConfiguration_builder) Build() *JSONSchema_FieldConfiguration { + m0 := &JSONSchema_FieldConfiguration{} + b, x := &b0, m0 + _, _ = b, x + x.PathParamName = b.PathParamName + return m0 +} + +// If the security scheme is of type "oauth2", then the value is a list of +// scope names required for the execution. For other security scheme types, +// the array MUST be empty. +type SecurityRequirement_SecurityRequirementValue struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Scope []string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement_SecurityRequirementValue) Reset() { + *x = SecurityRequirement_SecurityRequirementValue{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement_SecurityRequirementValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement_SecurityRequirementValue) ProtoMessage() {} + +func (x *SecurityRequirement_SecurityRequirementValue) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement_SecurityRequirementValue) GetScope() []string { + if x != nil { + return x.Scope + } + return nil +} + +func (x *SecurityRequirement_SecurityRequirementValue) SetScope(v []string) { + x.Scope = v +} + +type SecurityRequirement_SecurityRequirementValue_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Scope []string +} + +func (b0 SecurityRequirement_SecurityRequirementValue_builder) Build() *SecurityRequirement_SecurityRequirementValue { + m0 := &SecurityRequirement_SecurityRequirementValue{} + b, x := &b0, m0 + _, _ = b, x + x.Scope = b.Scope + return m0 +} + +var File_protoc_gen_openapiv2_options_openapiv2_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb3, 0x08, 0x0a, 0x07, 0x53, 0x77, 0x61, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x12, 0x43, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x61, 0x73, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xd6, 0x07, + 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, + 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x55, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0x62, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x0f, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x3f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x45, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, + 0x41, 0x4e, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, + 0x22, 0xd8, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, + 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, + 0x0b, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, + 0x0e, 0x10, 0x0f, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x10, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, + 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, 0x08, 0x12, 0x10, 0x13, 0x22, 0x9a, 0x05, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x5a, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x12, 0x63, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6d, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x03, 0x0a, 0x04, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x45, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2f, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x4b, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0xaa, 0x02, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x56, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x6a, + 0x73, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x22, 0xe8, 0x03, 0x0a, 0x0a, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, + 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x44, 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, + 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, + 0x0a, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x78, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, + 0x22, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x12, 0x5f, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x23, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x4b, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x2e, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x7a, 0x0a, 0x13, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x12, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3c, 0x0a, 0x12, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x74, + 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x77, 0x0a, 0x15, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x52, 0x52, 0x41, 0x59, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x06, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x12, + 0x10, 0x13, 0x4a, 0x04, 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x4a, 0x04, + 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x1c, 0x10, 0x1d, 0x4a, 0x04, 0x08, 0x1d, 0x10, 0x1e, + 0x4a, 0x04, 0x08, 0x1e, 0x10, 0x22, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x2a, 0x4a, 0x04, 0x08, 0x2a, + 0x10, 0x2b, 0x4a, 0x04, 0x08, 0x2b, 0x10, 0x2e, 0x22, 0xd9, 0x02, 0x0a, 0x03, 0x54, 0x61, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x5e, 0x0a, + 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, + 0x67, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf7, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x68, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x76, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, + 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, + 0x06, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x12, 0x52, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x02, 0x69, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x2b, 0x0a, + 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x10, + 0x03, 0x22, 0x31, 0x0a, 0x02, 0x49, 0x6e, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x5f, 0x51, 0x55, + 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x5f, 0x48, 0x45, 0x41, 0x44, + 0x45, 0x52, 0x10, 0x02, 0x22, 0x6a, 0x0a, 0x04, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x0c, + 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x11, + 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, + 0x52, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x41, 0x50, 0x50, + 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x04, + 0x22, 0xf6, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x30, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x6d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x96, 0x01, 0x0a, 0x06, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x2a, 0x3b, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x57, 0x53, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x57, 0x53, 0x53, 0x10, 0x04, 0x42, + 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = []any{ + (Scheme)(0), // 0: grpc.gateway.protoc_gen_openapiv2.options.Scheme + (HeaderParameter_Type)(0), // 1: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + (JSONSchema_JSONSchemaSimpleTypes)(0), // 2: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + (SecurityScheme_Type)(0), // 3: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + (SecurityScheme_In)(0), // 4: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + (SecurityScheme_Flow)(0), // 5: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Parameters)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Parameters + (*HeaderParameter)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + (*Header)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Header + (*Response)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.Response + (*Info)(nil), // 12: grpc.gateway.protoc_gen_openapiv2.options.Info + (*Contact)(nil), // 13: grpc.gateway.protoc_gen_openapiv2.options.Contact + (*License)(nil), // 14: grpc.gateway.protoc_gen_openapiv2.options.License + (*ExternalDocumentation)(nil), // 15: grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + (*Schema)(nil), // 16: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 17: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*JSONSchema)(nil), // 18: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + (*Tag)(nil), // 19: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*SecurityDefinitions)(nil), // 20: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + (*SecurityScheme)(nil), // 21: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + (*SecurityRequirement)(nil), // 22: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + (*Scopes)(nil), // 23: grpc.gateway.protoc_gen_openapiv2.options.Scopes + nil, // 24: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + nil, // 25: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + nil, // 26: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + nil, // 27: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + nil, // 28: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + nil, // 29: grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + nil, // 30: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + nil, // 31: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + nil, // 32: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + (*JSONSchema_FieldConfiguration)(nil), // 33: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + nil, // 34: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + nil, // 35: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + nil, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + nil, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + (*SecurityRequirement_SecurityRequirementValue)(nil), // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + nil, // 39: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + nil, // 40: grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + (*structpb.Value)(nil), // 41: google.protobuf.Value +} +var file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = []int32{ + 12, // 0: grpc.gateway.protoc_gen_openapiv2.options.Swagger.info:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info + 0, // 1: grpc.gateway.protoc_gen_openapiv2.options.Swagger.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 24, // 2: grpc.gateway.protoc_gen_openapiv2.options.Swagger.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + 20, // 3: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security_definitions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + 22, // 4: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 19, // 5: grpc.gateway.protoc_gen_openapiv2.options.Swagger.tags:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 15, // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 25, // 7: grpc.gateway.protoc_gen_openapiv2.options.Swagger.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + 15, // 8: grpc.gateway.protoc_gen_openapiv2.options.Operation.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 26, // 9: grpc.gateway.protoc_gen_openapiv2.options.Operation.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + 0, // 10: grpc.gateway.protoc_gen_openapiv2.options.Operation.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 22, // 11: grpc.gateway.protoc_gen_openapiv2.options.Operation.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 27, // 12: grpc.gateway.protoc_gen_openapiv2.options.Operation.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + 8, // 13: grpc.gateway.protoc_gen_openapiv2.options.Operation.parameters:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Parameters + 9, // 14: grpc.gateway.protoc_gen_openapiv2.options.Parameters.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + 1, // 15: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + 16, // 16: grpc.gateway.protoc_gen_openapiv2.options.Response.schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 28, // 17: grpc.gateway.protoc_gen_openapiv2.options.Response.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + 29, // 18: grpc.gateway.protoc_gen_openapiv2.options.Response.examples:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + 30, // 19: grpc.gateway.protoc_gen_openapiv2.options.Response.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + 13, // 20: grpc.gateway.protoc_gen_openapiv2.options.Info.contact:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Contact + 14, // 21: grpc.gateway.protoc_gen_openapiv2.options.Info.license:type_name -> grpc.gateway.protoc_gen_openapiv2.options.License + 31, // 22: grpc.gateway.protoc_gen_openapiv2.options.Info.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + 18, // 23: grpc.gateway.protoc_gen_openapiv2.options.Schema.json_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 15, // 24: grpc.gateway.protoc_gen_openapiv2.options.Schema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 15, // 25: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 32, // 26: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + 2, // 27: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + 33, // 28: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.field_configuration:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + 34, // 29: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + 15, // 30: grpc.gateway.protoc_gen_openapiv2.options.Tag.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 35, // 31: grpc.gateway.protoc_gen_openapiv2.options.Tag.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + 36, // 32: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + 3, // 33: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + 4, // 34: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.in:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + 5, // 35: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.flow:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + 23, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.scopes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes + 37, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + 39, // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.security_requirement:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + 40, // 39: grpc.gateway.protoc_gen_openapiv2.options.Scopes.scope:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + 11, // 40: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 41: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry.value:type_name -> google.protobuf.Value + 11, // 42: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 43: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry.value:type_name -> google.protobuf.Value + 10, // 44: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Header + 41, // 45: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 46: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 47: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 48: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 49: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry.value:type_name -> google.protobuf.Value + 21, // 50: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + 41, // 51: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry.value:type_name -> google.protobuf.Value + 38, // 52: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + 53, // [53:53] is the sub-list for method output_type + 53, // [53:53] is the sub-list for method input_type + 53, // [53:53] is the sub-list for extension type_name + 53, // [53:53] is the sub-list for extension extendee + 0, // [0:53] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_openapiv2_proto_init() } +func file_protoc_gen_openapiv2_options_openapiv2_proto_init() { + if File_protoc_gen_openapiv2_options_openapiv2_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc, + NumEnums: 6, + NumMessages: 35, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs, + EnumInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes, + MessageInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes, + }.Build() + File_protoc_gen_openapiv2_options_openapiv2_proto = out.File + file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = nil +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.proto b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.proto new file mode 100644 index 0000000000..5313f0818a --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.proto @@ -0,0 +1,759 @@ +syntax = "proto3"; + +package grpc.gateway.protoc_gen_openapiv2.options; + +import "google/protobuf/struct.proto"; + +option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options"; + +// Scheme describes the schemes supported by the OpenAPI Swagger +// and Operation objects. +enum Scheme { + UNKNOWN = 0; + HTTP = 1; + HTTPS = 2; + WS = 3; + WSS = 4; +} + +// `Swagger` is a representation of OpenAPI v2 specification's Swagger object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// schemes: HTTPS; +// consumes: "application/json"; +// produces: "application/json"; +// }; +// +message Swagger { + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + string swagger = 1; + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info info = 2; + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + string host = 3; + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + string base_path = 4; + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + repeated Scheme schemes = 5; + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + repeated string consumes = 6; + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + repeated string produces = 7; + // field 8 is reserved for 'paths'. + reserved 8; + // field 9 is reserved for 'definitions', which at this time are already + // exposed as and customizable as proto messages. + reserved 9; + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + map responses = 10; + // Security scheme definitions that can be used across the specification. + SecurityDefinitions security_definitions = 11; + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + repeated SecurityRequirement security = 12; + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + repeated Tag tags = 13; + // Additional external documentation. + ExternalDocumentation external_docs = 14; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 15; +} + +// `Operation` is a representation of OpenAPI v2 specification's Operation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject +// +// Example: +// +// service EchoService { +// rpc Echo(SimpleMessage) returns (SimpleMessage) { +// option (google.api.http) = { +// get: "/v1/example/echo/{id}" +// }; +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { +// summary: "Get a message."; +// operation_id: "getMessage"; +// tags: "echo"; +// responses: { +// key: "200" +// value: { +// description: "OK"; +// } +// } +// }; +// } +// } +message Operation { + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + repeated string tags = 1; + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + string summary = 2; + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + string description = 3; + // Additional external documentation for this operation. + ExternalDocumentation external_docs = 4; + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + string operation_id = 5; + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + repeated string consumes = 6; + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + repeated string produces = 7; + // field 8 is reserved for 'parameters'. + reserved 8; + // The list of possible responses as they are returned from executing this + // operation. + map responses = 9; + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + repeated Scheme schemes = 10; + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + bool deprecated = 11; + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + repeated SecurityRequirement security = 12; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 13; + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters parameters = 14; +} + +// `Parameters` is a representation of OpenAPI v2 specification's parameters object. +// Note: This technically breaks compatibility with the OpenAPI 2 definition structure as we only +// allow header parameters to be set here since we do not want users specifying custom non-header +// parameters beyond those inferred from the Protobuf schema. +// See: https://swagger.io/specification/v2/#parameter-object +message Parameters { + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + repeated HeaderParameter headers = 1; +} + +// `HeaderParameter` a HTTP header parameter. +// See: https://swagger.io/specification/v2/#parameter-object +message HeaderParameter { + // `Type` is a supported HTTP header type. + // See https://swagger.io/specification/v2/#parameterType. + enum Type { + UNKNOWN = 0; + STRING = 1; + NUMBER = 2; + INTEGER = 3; + BOOLEAN = 4; + } + + // `Name` is the header name. + string name = 1; + // `Description` is a short description of the header. + string description = 2; + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type type = 3; + // `Format` The extending format for the previously mentioned type. + string format = 4; + // `Required` indicates if the header is optional + bool required = 5; + // field 6 is reserved for 'items', but in OpenAPI-specific way. + reserved 6; + // field 7 is reserved `Collection Format`. Determines the format of the array if type array is used. + reserved 7; +} + +// `Header` is a representation of OpenAPI v2 specification's Header object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject +// +message Header { + // `Description` is a short description of the header. + string description = 1; + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + string type = 2; + // `Format` The extending format for the previously mentioned type. + string format = 3; + // field 4 is reserved for 'items', but in OpenAPI-specific way. + reserved 4; + // field 5 is reserved `Collection Format` Determines the format of the array if type array is used. + reserved 5; + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + string default = 6; + // field 7 is reserved for 'maximum'. + reserved 7; + // field 8 is reserved for 'exclusiveMaximum'. + reserved 8; + // field 9 is reserved for 'minimum'. + reserved 9; + // field 10 is reserved for 'exclusiveMinimum'. + reserved 10; + // field 11 is reserved for 'maxLength'. + reserved 11; + // field 12 is reserved for 'minLength'. + reserved 12; + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + string pattern = 13; + // field 14 is reserved for 'maxItems'. + reserved 14; + // field 15 is reserved for 'minItems'. + reserved 15; + // field 16 is reserved for 'uniqueItems'. + reserved 16; + // field 17 is reserved for 'enum'. + reserved 17; + // field 18 is reserved for 'multipleOf'. + reserved 18; +} + +// `Response` is a representation of OpenAPI v2 specification's Response object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject +// +message Response { + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + string description = 1; + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema schema = 2; + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + map headers = 3; + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + map examples = 4; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 5; +} + +// `Info` is a representation of OpenAPI v2 specification's Info object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// ... +// }; +// +message Info { + // The title of the application. + string title = 1; + // A short description of the application. GFM syntax can be used for rich + // text representation. + string description = 2; + // The Terms of Service for the API. + string terms_of_service = 3; + // The contact information for the exposed API. + Contact contact = 4; + // The license information for the exposed API. + License license = 5; + // Provides the version of the application API (not to be confused + // with the specification version). + string version = 6; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 7; +} + +// `Contact` is a representation of OpenAPI v2 specification's Contact object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// ... +// }; +// ... +// }; +// +message Contact { + // The identifying name of the contact person/organization. + string name = 1; + // The URL pointing to the contact information. MUST be in the format of a + // URL. + string url = 2; + // The email address of the contact person/organization. MUST be in the format + // of an email address. + string email = 3; +} + +// `License` is a representation of OpenAPI v2 specification's License object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// ... +// }; +// ... +// }; +// +message License { + // The license name used for the API. + string name = 1; + // A URL to the license used for the API. MUST be in the format of a URL. + string url = 2; +} + +// `ExternalDocumentation` is a representation of OpenAPI v2 specification's +// ExternalDocumentation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// ... +// external_docs: { +// description: "More about gRPC-Gateway"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// } +// ... +// }; +// +message ExternalDocumentation { + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + string description = 1; + // The URL for the target documentation. Value MUST be in the format + // of a URL. + string url = 2; +} + +// `Schema` is a representation of OpenAPI v2 specification's Schema object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +message Schema { + JSONSchema json_schema = 1; + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + string discriminator = 2; + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + bool read_only = 3; + // field 4 is reserved for 'xml'. + reserved 4; + // Additional external documentation for this schema. + ExternalDocumentation external_docs = 5; + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + string example = 6; +} + +// `EnumSchema` is subset of fields from the OpenAPI v2 specification's Schema object. +// Only fields that are applicable to Enums are included +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = { +// ... +// title: "MyEnum"; +// description:"This is my nice enum"; +// example: "ZERO"; +// required: true; +// ... +// }; +// +message EnumSchema { + // A short description of the schema. + string description = 1; + string default = 2; + // The title of the schema. + string title = 3; + bool required = 4; + bool read_only = 5; + // Additional external documentation for this schema. + ExternalDocumentation external_docs = 6; + string example = 7; + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // `ref: ".google.protobuf.Timestamp"`. + string ref = 8; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 9; +} + +// `JSONSchema` represents properties from JSON Schema taken, and as used, in +// the OpenAPI v2 spec. +// +// This includes changes made by OpenAPI v2. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// See also: https://cswr.github.io/JsonSchema/spec/basic_types/, +// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json +// +// Example: +// +// message SimpleMessage { +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { +// json_schema: { +// title: "SimpleMessage" +// description: "A simple message." +// required: ["id"] +// } +// }; +// +// // Id represents the message identifier. +// string id = 1; [ +// (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { +// description: "The unique identifier of the simple message." +// }]; +// } +// +message JSONSchema { + // field 1 is reserved for '$id', omitted from OpenAPI v2. + reserved 1; + // field 2 is reserved for '$schema', omitted from OpenAPI v2. + reserved 2; + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // `ref: ".google.protobuf.Timestamp"`. + string ref = 3; + // field 4 is reserved for '$comment', omitted from OpenAPI v2. + reserved 4; + // The title of the schema. + string title = 5; + // A short description of the schema. + string description = 6; + string default = 7; + bool read_only = 8; + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + string example = 9; + double multiple_of = 10; + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + double maximum = 11; + bool exclusive_maximum = 12; + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + double minimum = 13; + bool exclusive_minimum = 14; + uint64 max_length = 15; + uint64 min_length = 16; + string pattern = 17; + // field 18 is reserved for 'additionalItems', omitted from OpenAPI v2. + reserved 18; + // field 19 is reserved for 'items', but in OpenAPI-specific way. + // TODO(ivucica): add 'items'? + reserved 19; + uint64 max_items = 20; + uint64 min_items = 21; + bool unique_items = 22; + // field 23 is reserved for 'contains', omitted from OpenAPI v2. + reserved 23; + uint64 max_properties = 24; + uint64 min_properties = 25; + repeated string required = 26; + // field 27 is reserved for 'additionalProperties', but in OpenAPI-specific + // way. TODO(ivucica): add 'additionalProperties'? + reserved 27; + // field 28 is reserved for 'definitions', omitted from OpenAPI v2. + reserved 28; + // field 29 is reserved for 'properties', but in OpenAPI-specific way. + // TODO(ivucica): add 'additionalProperties'? + reserved 29; + // following fields are reserved, as the properties have been omitted from + // OpenAPI v2: + // patternProperties, dependencies, propertyNames, const + reserved 30 to 33; + // Items in 'array' must be unique. + repeated string array = 34; + + enum JSONSchemaSimpleTypes { + UNKNOWN = 0; + ARRAY = 1; + BOOLEAN = 2; + INTEGER = 3; + NULL = 4; + NUMBER = 5; + OBJECT = 6; + STRING = 7; + } + + repeated JSONSchemaSimpleTypes type = 35; + // `Format` + string format = 36; + // following fields are reserved, as the properties have been omitted from + // OpenAPI v2: contentMediaType, contentEncoding, if, then, else + reserved 37 to 41; + // field 42 is reserved for 'allOf', but in OpenAPI-specific way. + // TODO(ivucica): add 'allOf'? + reserved 42; + // following fields are reserved, as the properties have been omitted from + // OpenAPI v2: + // anyOf, oneOf, not + reserved 43 to 45; + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + repeated string enum = 46; + + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration field_configuration = 1001; + + // 'FieldConfiguration' provides additional field level properties used when generating the OpenAPI v2 file. + // These properties are not defined by OpenAPIv2, but they are used to control the generation. + message FieldConfiguration { + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + string path_param_name = 47; + } + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 48; +} + +// `Tag` is a representation of OpenAPI v2 specification's Tag object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject +// +message Tag { + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + string name = 1; + // A short description for the tag. GFM syntax can be used for rich text + // representation. + string description = 2; + // Additional external documentation for this tag. + ExternalDocumentation external_docs = 3; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 4; +} + +// `SecurityDefinitions` is a representation of OpenAPI v2 specification's +// Security Definitions object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject +// +// A declaration of the security schemes available to be used in the +// specification. This does not enforce the security schemes on the operations +// and only serves to provide the relevant details for each scheme. +message SecurityDefinitions { + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + map security = 1; +} + +// `SecurityScheme` is a representation of OpenAPI v2 specification's +// Security Scheme object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject +// +// Allows the definition of a security scheme that can be used by the +// operations. Supported schemes are basic authentication, an API key (either as +// a header or as a query parameter) and OAuth2's common flows (implicit, +// password, application and access code). +message SecurityScheme { + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + enum Type { + TYPE_INVALID = 0; + TYPE_BASIC = 1; + TYPE_API_KEY = 2; + TYPE_OAUTH2 = 3; + } + + // The location of the API key. Valid values are "query" or "header". + enum In { + IN_INVALID = 0; + IN_QUERY = 1; + IN_HEADER = 2; + } + + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + enum Flow { + FLOW_INVALID = 0; + FLOW_IMPLICIT = 1; + FLOW_PASSWORD = 2; + FLOW_APPLICATION = 3; + FLOW_ACCESS_CODE = 4; + } + + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type type = 1; + // A short description for security scheme. + string description = 2; + // The name of the header or query parameter to be used. + // Valid for apiKey. + string name = 3; + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In in = 4; + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow flow = 5; + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + string authorization_url = 6; + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + string token_url = 7; + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes scopes = 8; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 9; +} + +// `SecurityRequirement` is a representation of OpenAPI v2 specification's +// Security Requirement object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject +// +// Lists the required security schemes to execute this operation. The object can +// have multiple security schemes declared in it which are all required (that +// is, there is a logical AND between the schemes). +// +// The name used for each property MUST correspond to a security scheme +// declared in the Security Definitions. +message SecurityRequirement { + // If the security scheme is of type "oauth2", then the value is a list of + // scope names required for the execution. For other security scheme types, + // the array MUST be empty. + message SecurityRequirementValue { + repeated string scope = 1; + } + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + map security_requirement = 1; +} + +// `Scopes` is a representation of OpenAPI v2 specification's Scopes object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject +// +// Lists the available scopes for an OAuth2 security scheme. +message Scopes { + // Maps between a name of a scope to a short description of it (as the value + // of the property). + map scope = 1; +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2_protoopaque.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2_protoopaque.pb.go new file mode 100644 index 0000000000..1f0e0c2691 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2_protoopaque.pb.go @@ -0,0 +1,4055 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/openapiv2.proto + +//go:build protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" +) + +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) +) + +// Scheme describes the schemes supported by the OpenAPI Swagger +// and Operation objects. +type Scheme int32 + +const ( + Scheme_UNKNOWN Scheme = 0 + Scheme_HTTP Scheme = 1 + Scheme_HTTPS Scheme = 2 + Scheme_WS Scheme = 3 + Scheme_WSS Scheme = 4 +) + +// Enum value maps for Scheme. +var ( + Scheme_name = map[int32]string{ + 0: "UNKNOWN", + 1: "HTTP", + 2: "HTTPS", + 3: "WS", + 4: "WSS", + } + Scheme_value = map[string]int32{ + "UNKNOWN": 0, + "HTTP": 1, + "HTTPS": 2, + "WS": 3, + "WSS": 4, + } +) + +func (x Scheme) Enum() *Scheme { + p := new(Scheme) + *p = x + return p +} + +func (x Scheme) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Scheme) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0].Descriptor() +} + +func (Scheme) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0] +} + +func (x Scheme) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Type` is a supported HTTP header type. +// See https://swagger.io/specification/v2/#parameterType. +type HeaderParameter_Type int32 + +const ( + HeaderParameter_UNKNOWN HeaderParameter_Type = 0 + HeaderParameter_STRING HeaderParameter_Type = 1 + HeaderParameter_NUMBER HeaderParameter_Type = 2 + HeaderParameter_INTEGER HeaderParameter_Type = 3 + HeaderParameter_BOOLEAN HeaderParameter_Type = 4 +) + +// Enum value maps for HeaderParameter_Type. +var ( + HeaderParameter_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "STRING", + 2: "NUMBER", + 3: "INTEGER", + 4: "BOOLEAN", + } + HeaderParameter_Type_value = map[string]int32{ + "UNKNOWN": 0, + "STRING": 1, + "NUMBER": 2, + "INTEGER": 3, + "BOOLEAN": 4, + } +) + +func (x HeaderParameter_Type) Enum() *HeaderParameter_Type { + p := new(HeaderParameter_Type) + *p = x + return p +} + +func (x HeaderParameter_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (HeaderParameter_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1].Descriptor() +} + +func (HeaderParameter_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1] +} + +func (x HeaderParameter_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +type JSONSchema_JSONSchemaSimpleTypes int32 + +const ( + JSONSchema_UNKNOWN JSONSchema_JSONSchemaSimpleTypes = 0 + JSONSchema_ARRAY JSONSchema_JSONSchemaSimpleTypes = 1 + JSONSchema_BOOLEAN JSONSchema_JSONSchemaSimpleTypes = 2 + JSONSchema_INTEGER JSONSchema_JSONSchemaSimpleTypes = 3 + JSONSchema_NULL JSONSchema_JSONSchemaSimpleTypes = 4 + JSONSchema_NUMBER JSONSchema_JSONSchemaSimpleTypes = 5 + JSONSchema_OBJECT JSONSchema_JSONSchemaSimpleTypes = 6 + JSONSchema_STRING JSONSchema_JSONSchemaSimpleTypes = 7 +) + +// Enum value maps for JSONSchema_JSONSchemaSimpleTypes. +var ( + JSONSchema_JSONSchemaSimpleTypes_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ARRAY", + 2: "BOOLEAN", + 3: "INTEGER", + 4: "NULL", + 5: "NUMBER", + 6: "OBJECT", + 7: "STRING", + } + JSONSchema_JSONSchemaSimpleTypes_value = map[string]int32{ + "UNKNOWN": 0, + "ARRAY": 1, + "BOOLEAN": 2, + "INTEGER": 3, + "NULL": 4, + "NUMBER": 5, + "OBJECT": 6, + "STRING": 7, + } +) + +func (x JSONSchema_JSONSchemaSimpleTypes) Enum() *JSONSchema_JSONSchemaSimpleTypes { + p := new(JSONSchema_JSONSchemaSimpleTypes) + *p = x + return p +} + +func (x JSONSchema_JSONSchemaSimpleTypes) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (JSONSchema_JSONSchemaSimpleTypes) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2].Descriptor() +} + +func (JSONSchema_JSONSchemaSimpleTypes) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2] +} + +func (x JSONSchema_JSONSchemaSimpleTypes) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The type of the security scheme. Valid values are "basic", +// "apiKey" or "oauth2". +type SecurityScheme_Type int32 + +const ( + SecurityScheme_TYPE_INVALID SecurityScheme_Type = 0 + SecurityScheme_TYPE_BASIC SecurityScheme_Type = 1 + SecurityScheme_TYPE_API_KEY SecurityScheme_Type = 2 + SecurityScheme_TYPE_OAUTH2 SecurityScheme_Type = 3 +) + +// Enum value maps for SecurityScheme_Type. +var ( + SecurityScheme_Type_name = map[int32]string{ + 0: "TYPE_INVALID", + 1: "TYPE_BASIC", + 2: "TYPE_API_KEY", + 3: "TYPE_OAUTH2", + } + SecurityScheme_Type_value = map[string]int32{ + "TYPE_INVALID": 0, + "TYPE_BASIC": 1, + "TYPE_API_KEY": 2, + "TYPE_OAUTH2": 3, + } +) + +func (x SecurityScheme_Type) Enum() *SecurityScheme_Type { + p := new(SecurityScheme_Type) + *p = x + return p +} + +func (x SecurityScheme_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3].Descriptor() +} + +func (SecurityScheme_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3] +} + +func (x SecurityScheme_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The location of the API key. Valid values are "query" or "header". +type SecurityScheme_In int32 + +const ( + SecurityScheme_IN_INVALID SecurityScheme_In = 0 + SecurityScheme_IN_QUERY SecurityScheme_In = 1 + SecurityScheme_IN_HEADER SecurityScheme_In = 2 +) + +// Enum value maps for SecurityScheme_In. +var ( + SecurityScheme_In_name = map[int32]string{ + 0: "IN_INVALID", + 1: "IN_QUERY", + 2: "IN_HEADER", + } + SecurityScheme_In_value = map[string]int32{ + "IN_INVALID": 0, + "IN_QUERY": 1, + "IN_HEADER": 2, + } +) + +func (x SecurityScheme_In) Enum() *SecurityScheme_In { + p := new(SecurityScheme_In) + *p = x + return p +} + +func (x SecurityScheme_In) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_In) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4].Descriptor() +} + +func (SecurityScheme_In) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4] +} + +func (x SecurityScheme_In) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The flow used by the OAuth2 security scheme. Valid values are +// "implicit", "password", "application" or "accessCode". +type SecurityScheme_Flow int32 + +const ( + SecurityScheme_FLOW_INVALID SecurityScheme_Flow = 0 + SecurityScheme_FLOW_IMPLICIT SecurityScheme_Flow = 1 + SecurityScheme_FLOW_PASSWORD SecurityScheme_Flow = 2 + SecurityScheme_FLOW_APPLICATION SecurityScheme_Flow = 3 + SecurityScheme_FLOW_ACCESS_CODE SecurityScheme_Flow = 4 +) + +// Enum value maps for SecurityScheme_Flow. +var ( + SecurityScheme_Flow_name = map[int32]string{ + 0: "FLOW_INVALID", + 1: "FLOW_IMPLICIT", + 2: "FLOW_PASSWORD", + 3: "FLOW_APPLICATION", + 4: "FLOW_ACCESS_CODE", + } + SecurityScheme_Flow_value = map[string]int32{ + "FLOW_INVALID": 0, + "FLOW_IMPLICIT": 1, + "FLOW_PASSWORD": 2, + "FLOW_APPLICATION": 3, + "FLOW_ACCESS_CODE": 4, + } +) + +func (x SecurityScheme_Flow) Enum() *SecurityScheme_Flow { + p := new(SecurityScheme_Flow) + *p = x + return p +} + +func (x SecurityScheme_Flow) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Flow) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5].Descriptor() +} + +func (SecurityScheme_Flow) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5] +} + +func (x SecurityScheme_Flow) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Swagger` is a representation of OpenAPI v2 specification's Swagger object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// schemes: HTTPS; +// consumes: "application/json"; +// produces: "application/json"; +// }; +type Swagger struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Swagger string `protobuf:"bytes,1,opt,name=swagger,proto3" json:"swagger,omitempty"` + xxx_hidden_Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + xxx_hidden_Host string `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty"` + xxx_hidden_BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath,proto3" json:"base_path,omitempty"` + xxx_hidden_Schemes []Scheme `protobuf:"varint,5,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + xxx_hidden_Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + xxx_hidden_Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + xxx_hidden_Responses map[string]*Response `protobuf:"bytes,10,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_SecurityDefinitions *SecurityDefinitions `protobuf:"bytes,11,opt,name=security_definitions,json=securityDefinitions,proto3" json:"security_definitions,omitempty"` + xxx_hidden_Security *[]*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + xxx_hidden_Tags *[]*Tag `protobuf:"bytes,13,rep,name=tags,proto3" json:"tags,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,14,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,15,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Swagger) Reset() { + *x = Swagger{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Swagger) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Swagger) ProtoMessage() {} + +func (x *Swagger) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Swagger) GetSwagger() string { + if x != nil { + return x.xxx_hidden_Swagger + } + return "" +} + +func (x *Swagger) GetInfo() *Info { + if x != nil { + return x.xxx_hidden_Info + } + return nil +} + +func (x *Swagger) GetHost() string { + if x != nil { + return x.xxx_hidden_Host + } + return "" +} + +func (x *Swagger) GetBasePath() string { + if x != nil { + return x.xxx_hidden_BasePath + } + return "" +} + +func (x *Swagger) GetSchemes() []Scheme { + if x != nil { + return x.xxx_hidden_Schemes + } + return nil +} + +func (x *Swagger) GetConsumes() []string { + if x != nil { + return x.xxx_hidden_Consumes + } + return nil +} + +func (x *Swagger) GetProduces() []string { + if x != nil { + return x.xxx_hidden_Produces + } + return nil +} + +func (x *Swagger) GetResponses() map[string]*Response { + if x != nil { + return x.xxx_hidden_Responses + } + return nil +} + +func (x *Swagger) GetSecurityDefinitions() *SecurityDefinitions { + if x != nil { + return x.xxx_hidden_SecurityDefinitions + } + return nil +} + +func (x *Swagger) GetSecurity() []*SecurityRequirement { + if x != nil { + if x.xxx_hidden_Security != nil { + return *x.xxx_hidden_Security + } + } + return nil +} + +func (x *Swagger) GetTags() []*Tag { + if x != nil { + if x.xxx_hidden_Tags != nil { + return *x.xxx_hidden_Tags + } + } + return nil +} + +func (x *Swagger) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Swagger) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Swagger) SetSwagger(v string) { + x.xxx_hidden_Swagger = v +} + +func (x *Swagger) SetInfo(v *Info) { + x.xxx_hidden_Info = v +} + +func (x *Swagger) SetHost(v string) { + x.xxx_hidden_Host = v +} + +func (x *Swagger) SetBasePath(v string) { + x.xxx_hidden_BasePath = v +} + +func (x *Swagger) SetSchemes(v []Scheme) { + x.xxx_hidden_Schemes = v +} + +func (x *Swagger) SetConsumes(v []string) { + x.xxx_hidden_Consumes = v +} + +func (x *Swagger) SetProduces(v []string) { + x.xxx_hidden_Produces = v +} + +func (x *Swagger) SetResponses(v map[string]*Response) { + x.xxx_hidden_Responses = v +} + +func (x *Swagger) SetSecurityDefinitions(v *SecurityDefinitions) { + x.xxx_hidden_SecurityDefinitions = v +} + +func (x *Swagger) SetSecurity(v []*SecurityRequirement) { + x.xxx_hidden_Security = &v +} + +func (x *Swagger) SetTags(v []*Tag) { + x.xxx_hidden_Tags = &v +} + +func (x *Swagger) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Swagger) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Swagger) HasInfo() bool { + if x == nil { + return false + } + return x.xxx_hidden_Info != nil +} + +func (x *Swagger) HasSecurityDefinitions() bool { + if x == nil { + return false + } + return x.xxx_hidden_SecurityDefinitions != nil +} + +func (x *Swagger) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Swagger) ClearInfo() { + x.xxx_hidden_Info = nil +} + +func (x *Swagger) ClearSecurityDefinitions() { + x.xxx_hidden_SecurityDefinitions = nil +} + +func (x *Swagger) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type Swagger_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + Swagger string + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info *Info + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + Host string + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + BasePath string + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + Schemes []Scheme + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Consumes []string + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Produces []string + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + Responses map[string]*Response + // Security scheme definitions that can be used across the specification. + SecurityDefinitions *SecurityDefinitions + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + Security []*SecurityRequirement + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []*Tag + // Additional external documentation. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Swagger_builder) Build() *Swagger { + m0 := &Swagger{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Swagger = b.Swagger + x.xxx_hidden_Info = b.Info + x.xxx_hidden_Host = b.Host + x.xxx_hidden_BasePath = b.BasePath + x.xxx_hidden_Schemes = b.Schemes + x.xxx_hidden_Consumes = b.Consumes + x.xxx_hidden_Produces = b.Produces + x.xxx_hidden_Responses = b.Responses + x.xxx_hidden_SecurityDefinitions = b.SecurityDefinitions + x.xxx_hidden_Security = &b.Security + x.xxx_hidden_Tags = &b.Tags + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Operation` is a representation of OpenAPI v2 specification's Operation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject +// +// Example: +// +// service EchoService { +// rpc Echo(SimpleMessage) returns (SimpleMessage) { +// option (google.api.http) = { +// get: "/v1/example/echo/{id}" +// }; +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { +// summary: "Get a message."; +// operation_id: "getMessage"; +// tags: "echo"; +// responses: { +// key: "200" +// value: { +// description: "OK"; +// } +// } +// }; +// } +// } +type Operation struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` + xxx_hidden_Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + xxx_hidden_Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + xxx_hidden_Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + xxx_hidden_Responses map[string]*Response `protobuf:"bytes,9,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Schemes []Scheme `protobuf:"varint,10,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + xxx_hidden_Deprecated bool `protobuf:"varint,11,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + xxx_hidden_Security *[]*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,13,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Parameters *Parameters `protobuf:"bytes,14,opt,name=parameters,proto3" json:"parameters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Operation) Reset() { + *x = Operation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Operation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Operation) ProtoMessage() {} + +func (x *Operation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Operation) GetTags() []string { + if x != nil { + return x.xxx_hidden_Tags + } + return nil +} + +func (x *Operation) GetSummary() string { + if x != nil { + return x.xxx_hidden_Summary + } + return "" +} + +func (x *Operation) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Operation) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Operation) GetOperationId() string { + if x != nil { + return x.xxx_hidden_OperationId + } + return "" +} + +func (x *Operation) GetConsumes() []string { + if x != nil { + return x.xxx_hidden_Consumes + } + return nil +} + +func (x *Operation) GetProduces() []string { + if x != nil { + return x.xxx_hidden_Produces + } + return nil +} + +func (x *Operation) GetResponses() map[string]*Response { + if x != nil { + return x.xxx_hidden_Responses + } + return nil +} + +func (x *Operation) GetSchemes() []Scheme { + if x != nil { + return x.xxx_hidden_Schemes + } + return nil +} + +func (x *Operation) GetDeprecated() bool { + if x != nil { + return x.xxx_hidden_Deprecated + } + return false +} + +func (x *Operation) GetSecurity() []*SecurityRequirement { + if x != nil { + if x.xxx_hidden_Security != nil { + return *x.xxx_hidden_Security + } + } + return nil +} + +func (x *Operation) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Operation) GetParameters() *Parameters { + if x != nil { + return x.xxx_hidden_Parameters + } + return nil +} + +func (x *Operation) SetTags(v []string) { + x.xxx_hidden_Tags = v +} + +func (x *Operation) SetSummary(v string) { + x.xxx_hidden_Summary = v +} + +func (x *Operation) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Operation) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Operation) SetOperationId(v string) { + x.xxx_hidden_OperationId = v +} + +func (x *Operation) SetConsumes(v []string) { + x.xxx_hidden_Consumes = v +} + +func (x *Operation) SetProduces(v []string) { + x.xxx_hidden_Produces = v +} + +func (x *Operation) SetResponses(v map[string]*Response) { + x.xxx_hidden_Responses = v +} + +func (x *Operation) SetSchemes(v []Scheme) { + x.xxx_hidden_Schemes = v +} + +func (x *Operation) SetDeprecated(v bool) { + x.xxx_hidden_Deprecated = v +} + +func (x *Operation) SetSecurity(v []*SecurityRequirement) { + x.xxx_hidden_Security = &v +} + +func (x *Operation) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Operation) SetParameters(v *Parameters) { + x.xxx_hidden_Parameters = v +} + +func (x *Operation) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Operation) HasParameters() bool { + if x == nil { + return false + } + return x.xxx_hidden_Parameters != nil +} + +func (x *Operation) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +func (x *Operation) ClearParameters() { + x.xxx_hidden_Parameters = nil +} + +type Operation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []string + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + Summary string + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + Description string + // Additional external documentation for this operation. + ExternalDocs *ExternalDocumentation + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + OperationId string + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Consumes []string + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Produces []string + // The list of possible responses as they are returned from executing this + // operation. + Responses map[string]*Response + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + Schemes []Scheme + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + Deprecated bool + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + Security []*SecurityRequirement + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters *Parameters +} + +func (b0 Operation_builder) Build() *Operation { + m0 := &Operation{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Tags = b.Tags + x.xxx_hidden_Summary = b.Summary + x.xxx_hidden_Description = b.Description + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_OperationId = b.OperationId + x.xxx_hidden_Consumes = b.Consumes + x.xxx_hidden_Produces = b.Produces + x.xxx_hidden_Responses = b.Responses + x.xxx_hidden_Schemes = b.Schemes + x.xxx_hidden_Deprecated = b.Deprecated + x.xxx_hidden_Security = &b.Security + x.xxx_hidden_Extensions = b.Extensions + x.xxx_hidden_Parameters = b.Parameters + return m0 +} + +// `Parameters` is a representation of OpenAPI v2 specification's parameters object. +// Note: This technically breaks compatibility with the OpenAPI 2 definition structure as we only +// allow header parameters to be set here since we do not want users specifying custom non-header +// parameters beyond those inferred from the Protobuf schema. +// See: https://swagger.io/specification/v2/#parameter-object +type Parameters struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Headers *[]*HeaderParameter `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Parameters) Reset() { + *x = Parameters{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Parameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameters) ProtoMessage() {} + +func (x *Parameters) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Parameters) GetHeaders() []*HeaderParameter { + if x != nil { + if x.xxx_hidden_Headers != nil { + return *x.xxx_hidden_Headers + } + } + return nil +} + +func (x *Parameters) SetHeaders(v []*HeaderParameter) { + x.xxx_hidden_Headers = &v +} + +type Parameters_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + Headers []*HeaderParameter +} + +func (b0 Parameters_builder) Build() *Parameters { + m0 := &Parameters{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Headers = &b.Headers + return m0 +} + +// `HeaderParameter` a HTTP header parameter. +// See: https://swagger.io/specification/v2/#parameter-object +type HeaderParameter struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Type HeaderParameter_Type `protobuf:"varint,3,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter_Type" json:"type,omitempty"` + xxx_hidden_Format string `protobuf:"bytes,4,opt,name=format,proto3" json:"format,omitempty"` + xxx_hidden_Required bool `protobuf:"varint,5,opt,name=required,proto3" json:"required,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HeaderParameter) Reset() { + *x = HeaderParameter{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HeaderParameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderParameter) ProtoMessage() {} + +func (x *HeaderParameter) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *HeaderParameter) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *HeaderParameter) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *HeaderParameter) GetType() HeaderParameter_Type { + if x != nil { + return x.xxx_hidden_Type + } + return HeaderParameter_UNKNOWN +} + +func (x *HeaderParameter) GetFormat() string { + if x != nil { + return x.xxx_hidden_Format + } + return "" +} + +func (x *HeaderParameter) GetRequired() bool { + if x != nil { + return x.xxx_hidden_Required + } + return false +} + +func (x *HeaderParameter) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *HeaderParameter) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *HeaderParameter) SetType(v HeaderParameter_Type) { + x.xxx_hidden_Type = v +} + +func (x *HeaderParameter) SetFormat(v string) { + x.xxx_hidden_Format = v +} + +func (x *HeaderParameter) SetRequired(v bool) { + x.xxx_hidden_Required = v +} + +type HeaderParameter_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Name` is the header name. + Name string + // `Description` is a short description of the header. + Description string + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type HeaderParameter_Type + // `Format` The extending format for the previously mentioned type. + Format string + // `Required` indicates if the header is optional + Required bool +} + +func (b0 HeaderParameter_builder) Build() *HeaderParameter { + m0 := &HeaderParameter{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Format = b.Format + x.xxx_hidden_Required = b.Required + return m0 +} + +// `Header` is a representation of OpenAPI v2 specification's Header object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject +type Header struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + xxx_hidden_Format string `protobuf:"bytes,3,opt,name=format,proto3" json:"format,omitempty"` + xxx_hidden_Default string `protobuf:"bytes,6,opt,name=default,proto3" json:"default,omitempty"` + xxx_hidden_Pattern string `protobuf:"bytes,13,opt,name=pattern,proto3" json:"pattern,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Header) Reset() { + *x = Header{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Header) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Header) ProtoMessage() {} + +func (x *Header) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Header) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Header) GetType() string { + if x != nil { + return x.xxx_hidden_Type + } + return "" +} + +func (x *Header) GetFormat() string { + if x != nil { + return x.xxx_hidden_Format + } + return "" +} + +func (x *Header) GetDefault() string { + if x != nil { + return x.xxx_hidden_Default + } + return "" +} + +func (x *Header) GetPattern() string { + if x != nil { + return x.xxx_hidden_Pattern + } + return "" +} + +func (x *Header) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Header) SetType(v string) { + x.xxx_hidden_Type = v +} + +func (x *Header) SetFormat(v string) { + x.xxx_hidden_Format = v +} + +func (x *Header) SetDefault(v string) { + x.xxx_hidden_Default = v +} + +func (x *Header) SetPattern(v string) { + x.xxx_hidden_Pattern = v +} + +type Header_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the header. + Description string + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + Type string + // `Format` The extending format for the previously mentioned type. + Format string + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + Default string + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + Pattern string +} + +func (b0 Header_builder) Build() *Header { + m0 := &Header{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Format = b.Format + x.xxx_hidden_Default = b.Default + x.xxx_hidden_Pattern = b.Pattern + return m0 +} + +// `Response` is a representation of OpenAPI v2 specification's Response object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject +type Response struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Schema *Schema `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` + xxx_hidden_Headers map[string]*Header `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Examples map[string]string `protobuf:"bytes,4,rep,name=examples,proto3" json:"examples,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,5,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Response) Reset() { + *x = Response{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Response) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Response) GetSchema() *Schema { + if x != nil { + return x.xxx_hidden_Schema + } + return nil +} + +func (x *Response) GetHeaders() map[string]*Header { + if x != nil { + return x.xxx_hidden_Headers + } + return nil +} + +func (x *Response) GetExamples() map[string]string { + if x != nil { + return x.xxx_hidden_Examples + } + return nil +} + +func (x *Response) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Response) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Response) SetSchema(v *Schema) { + x.xxx_hidden_Schema = v +} + +func (x *Response) SetHeaders(v map[string]*Header) { + x.xxx_hidden_Headers = v +} + +func (x *Response) SetExamples(v map[string]string) { + x.xxx_hidden_Examples = v +} + +func (x *Response) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Response) HasSchema() bool { + if x == nil { + return false + } + return x.xxx_hidden_Schema != nil +} + +func (x *Response) ClearSchema() { + x.xxx_hidden_Schema = nil +} + +type Response_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + Description string + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema *Schema + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + Headers map[string]*Header + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + Examples map[string]string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Response_builder) Build() *Response { + m0 := &Response{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Schema = b.Schema + x.xxx_hidden_Headers = b.Headers + x.xxx_hidden_Examples = b.Examples + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Info` is a representation of OpenAPI v2 specification's Info object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// ... +// }; +type Info struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_TermsOfService string `protobuf:"bytes,3,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"` + xxx_hidden_Contact *Contact `protobuf:"bytes,4,opt,name=contact,proto3" json:"contact,omitempty"` + xxx_hidden_License *License `protobuf:"bytes,5,opt,name=license,proto3" json:"license,omitempty"` + xxx_hidden_Version string `protobuf:"bytes,6,opt,name=version,proto3" json:"version,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,7,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Info) Reset() { + *x = Info{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Info) ProtoMessage() {} + +func (x *Info) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Info) GetTitle() string { + if x != nil { + return x.xxx_hidden_Title + } + return "" +} + +func (x *Info) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Info) GetTermsOfService() string { + if x != nil { + return x.xxx_hidden_TermsOfService + } + return "" +} + +func (x *Info) GetContact() *Contact { + if x != nil { + return x.xxx_hidden_Contact + } + return nil +} + +func (x *Info) GetLicense() *License { + if x != nil { + return x.xxx_hidden_License + } + return nil +} + +func (x *Info) GetVersion() string { + if x != nil { + return x.xxx_hidden_Version + } + return "" +} + +func (x *Info) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Info) SetTitle(v string) { + x.xxx_hidden_Title = v +} + +func (x *Info) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Info) SetTermsOfService(v string) { + x.xxx_hidden_TermsOfService = v +} + +func (x *Info) SetContact(v *Contact) { + x.xxx_hidden_Contact = v +} + +func (x *Info) SetLicense(v *License) { + x.xxx_hidden_License = v +} + +func (x *Info) SetVersion(v string) { + x.xxx_hidden_Version = v +} + +func (x *Info) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Info) HasContact() bool { + if x == nil { + return false + } + return x.xxx_hidden_Contact != nil +} + +func (x *Info) HasLicense() bool { + if x == nil { + return false + } + return x.xxx_hidden_License != nil +} + +func (x *Info) ClearContact() { + x.xxx_hidden_Contact = nil +} + +func (x *Info) ClearLicense() { + x.xxx_hidden_License = nil +} + +type Info_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The title of the application. + Title string + // A short description of the application. GFM syntax can be used for rich + // text representation. + Description string + // The Terms of Service for the API. + TermsOfService string + // The contact information for the exposed API. + Contact *Contact + // The license information for the exposed API. + License *License + // Provides the version of the application API (not to be confused + // with the specification version). + Version string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Info_builder) Build() *Info { + m0 := &Info{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Title = b.Title + x.xxx_hidden_Description = b.Description + x.xxx_hidden_TermsOfService = b.TermsOfService + x.xxx_hidden_Contact = b.Contact + x.xxx_hidden_License = b.License + x.xxx_hidden_Version = b.Version + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Contact` is a representation of OpenAPI v2 specification's Contact object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// ... +// }; +// ... +// }; +type Contact struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + xxx_hidden_Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Contact) Reset() { + *x = Contact{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Contact) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Contact) ProtoMessage() {} + +func (x *Contact) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Contact) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *Contact) GetUrl() string { + if x != nil { + return x.xxx_hidden_Url + } + return "" +} + +func (x *Contact) GetEmail() string { + if x != nil { + return x.xxx_hidden_Email + } + return "" +} + +func (x *Contact) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *Contact) SetUrl(v string) { + x.xxx_hidden_Url = v +} + +func (x *Contact) SetEmail(v string) { + x.xxx_hidden_Email = v +} + +type Contact_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The identifying name of the contact person/organization. + Name string + // The URL pointing to the contact information. MUST be in the format of a + // URL. + Url string + // The email address of the contact person/organization. MUST be in the format + // of an email address. + Email string +} + +func (b0 Contact_builder) Build() *Contact { + m0 := &Contact{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Url = b.Url + x.xxx_hidden_Email = b.Email + return m0 +} + +// `License` is a representation of OpenAPI v2 specification's License object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// ... +// }; +// ... +// }; +type License struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *License) Reset() { + *x = License{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *License) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *License) GetUrl() string { + if x != nil { + return x.xxx_hidden_Url + } + return "" +} + +func (x *License) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *License) SetUrl(v string) { + x.xxx_hidden_Url = v +} + +type License_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The license name used for the API. + Name string + // A URL to the license used for the API. MUST be in the format of a URL. + Url string +} + +func (b0 License_builder) Build() *License { + m0 := &License{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Url = b.Url + return m0 +} + +// `ExternalDocumentation` is a representation of OpenAPI v2 specification's +// ExternalDocumentation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// ... +// external_docs: { +// description: "More about gRPC-Gateway"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// } +// ... +// }; +type ExternalDocumentation struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalDocumentation) Reset() { + *x = ExternalDocumentation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalDocumentation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalDocumentation) ProtoMessage() {} + +func (x *ExternalDocumentation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *ExternalDocumentation) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *ExternalDocumentation) GetUrl() string { + if x != nil { + return x.xxx_hidden_Url + } + return "" +} + +func (x *ExternalDocumentation) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *ExternalDocumentation) SetUrl(v string) { + x.xxx_hidden_Url = v +} + +type ExternalDocumentation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + Description string + // The URL for the target documentation. Value MUST be in the format + // of a URL. + Url string +} + +func (b0 ExternalDocumentation_builder) Build() *ExternalDocumentation { + m0 := &ExternalDocumentation{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Url = b.Url + return m0 +} + +// `Schema` is a representation of OpenAPI v2 specification's Schema object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +type Schema struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_JsonSchema *JSONSchema `protobuf:"bytes,1,opt,name=json_schema,json=jsonSchema,proto3" json:"json_schema,omitempty"` + xxx_hidden_Discriminator string `protobuf:"bytes,2,opt,name=discriminator,proto3" json:"discriminator,omitempty"` + xxx_hidden_ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,5,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Example string `protobuf:"bytes,6,opt,name=example,proto3" json:"example,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Schema) Reset() { + *x = Schema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Schema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Schema) ProtoMessage() {} + +func (x *Schema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Schema) GetJsonSchema() *JSONSchema { + if x != nil { + return x.xxx_hidden_JsonSchema + } + return nil +} + +func (x *Schema) GetDiscriminator() string { + if x != nil { + return x.xxx_hidden_Discriminator + } + return "" +} + +func (x *Schema) GetReadOnly() bool { + if x != nil { + return x.xxx_hidden_ReadOnly + } + return false +} + +func (x *Schema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Schema) GetExample() string { + if x != nil { + return x.xxx_hidden_Example + } + return "" +} + +func (x *Schema) SetJsonSchema(v *JSONSchema) { + x.xxx_hidden_JsonSchema = v +} + +func (x *Schema) SetDiscriminator(v string) { + x.xxx_hidden_Discriminator = v +} + +func (x *Schema) SetReadOnly(v bool) { + x.xxx_hidden_ReadOnly = v +} + +func (x *Schema) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Schema) SetExample(v string) { + x.xxx_hidden_Example = v +} + +func (x *Schema) HasJsonSchema() bool { + if x == nil { + return false + } + return x.xxx_hidden_JsonSchema != nil +} + +func (x *Schema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Schema) ClearJsonSchema() { + x.xxx_hidden_JsonSchema = nil +} + +func (x *Schema) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type Schema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + JsonSchema *JSONSchema + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + Discriminator string + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + Example string +} + +func (b0 Schema_builder) Build() *Schema { + m0 := &Schema{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_JsonSchema = b.JsonSchema + x.xxx_hidden_Discriminator = b.Discriminator + x.xxx_hidden_ReadOnly = b.ReadOnly + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Example = b.Example + return m0 +} + +// `EnumSchema` is subset of fields from the OpenAPI v2 specification's Schema object. +// Only fields that are applicable to Enums are included +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = { +// ... +// title: "MyEnum"; +// description:"This is my nice enum"; +// example: "ZERO"; +// required: true; +// ... +// }; +type EnumSchema struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Default string `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` + xxx_hidden_Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + xxx_hidden_Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + xxx_hidden_ReadOnly bool `protobuf:"varint,5,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,6,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Example string `protobuf:"bytes,7,opt,name=example,proto3" json:"example,omitempty"` + xxx_hidden_Ref string `protobuf:"bytes,8,opt,name=ref,proto3" json:"ref,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumSchema) Reset() { + *x = EnumSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumSchema) ProtoMessage() {} + +func (x *EnumSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *EnumSchema) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *EnumSchema) GetDefault() string { + if x != nil { + return x.xxx_hidden_Default + } + return "" +} + +func (x *EnumSchema) GetTitle() string { + if x != nil { + return x.xxx_hidden_Title + } + return "" +} + +func (x *EnumSchema) GetRequired() bool { + if x != nil { + return x.xxx_hidden_Required + } + return false +} + +func (x *EnumSchema) GetReadOnly() bool { + if x != nil { + return x.xxx_hidden_ReadOnly + } + return false +} + +func (x *EnumSchema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *EnumSchema) GetExample() string { + if x != nil { + return x.xxx_hidden_Example + } + return "" +} + +func (x *EnumSchema) GetRef() string { + if x != nil { + return x.xxx_hidden_Ref + } + return "" +} + +func (x *EnumSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *EnumSchema) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *EnumSchema) SetDefault(v string) { + x.xxx_hidden_Default = v +} + +func (x *EnumSchema) SetTitle(v string) { + x.xxx_hidden_Title = v +} + +func (x *EnumSchema) SetRequired(v bool) { + x.xxx_hidden_Required = v +} + +func (x *EnumSchema) SetReadOnly(v bool) { + x.xxx_hidden_ReadOnly = v +} + +func (x *EnumSchema) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *EnumSchema) SetExample(v string) { + x.xxx_hidden_Example = v +} + +func (x *EnumSchema) SetRef(v string) { + x.xxx_hidden_Ref = v +} + +func (x *EnumSchema) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *EnumSchema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *EnumSchema) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type EnumSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the schema. + Description string + Default string + // The title of the schema. + Title string + Required bool + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + Example string + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 EnumSchema_builder) Build() *EnumSchema { + m0 := &EnumSchema{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Default = b.Default + x.xxx_hidden_Title = b.Title + x.xxx_hidden_Required = b.Required + x.xxx_hidden_ReadOnly = b.ReadOnly + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Example = b.Example + x.xxx_hidden_Ref = b.Ref + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `JSONSchema` represents properties from JSON Schema taken, and as used, in +// the OpenAPI v2 spec. +// +// This includes changes made by OpenAPI v2. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// See also: https://cswr.github.io/JsonSchema/spec/basic_types/, +// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json +// +// Example: +// +// message SimpleMessage { +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { +// json_schema: { +// title: "SimpleMessage" +// description: "A simple message." +// required: ["id"] +// } +// }; +// +// // Id represents the message identifier. +// string id = 1; [ +// (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { +// description: "The unique identifier of the simple message." +// }]; +// } +type JSONSchema struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Ref string `protobuf:"bytes,3,opt,name=ref,proto3" json:"ref,omitempty"` + xxx_hidden_Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Default string `protobuf:"bytes,7,opt,name=default,proto3" json:"default,omitempty"` + xxx_hidden_ReadOnly bool `protobuf:"varint,8,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + xxx_hidden_Example string `protobuf:"bytes,9,opt,name=example,proto3" json:"example,omitempty"` + xxx_hidden_MultipleOf float64 `protobuf:"fixed64,10,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + xxx_hidden_Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` + xxx_hidden_ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + xxx_hidden_Minimum float64 `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"` + xxx_hidden_ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + xxx_hidden_MaxLength uint64 `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + xxx_hidden_MinLength uint64 `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + xxx_hidden_Pattern string `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"` + xxx_hidden_MaxItems uint64 `protobuf:"varint,20,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + xxx_hidden_MinItems uint64 `protobuf:"varint,21,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + xxx_hidden_UniqueItems bool `protobuf:"varint,22,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + xxx_hidden_MaxProperties uint64 `protobuf:"varint,24,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"` + xxx_hidden_MinProperties uint64 `protobuf:"varint,25,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"` + xxx_hidden_Required []string `protobuf:"bytes,26,rep,name=required,proto3" json:"required,omitempty"` + xxx_hidden_Array []string `protobuf:"bytes,34,rep,name=array,proto3" json:"array,omitempty"` + xxx_hidden_Type []JSONSchema_JSONSchemaSimpleTypes `protobuf:"varint,35,rep,packed,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.JSONSchema_JSONSchemaSimpleTypes" json:"type,omitempty"` + xxx_hidden_Format string `protobuf:"bytes,36,opt,name=format,proto3" json:"format,omitempty"` + xxx_hidden_Enum []string `protobuf:"bytes,46,rep,name=enum,proto3" json:"enum,omitempty"` + xxx_hidden_FieldConfiguration *JSONSchema_FieldConfiguration `protobuf:"bytes,1001,opt,name=field_configuration,json=fieldConfiguration,proto3" json:"field_configuration,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,48,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema) Reset() { + *x = JSONSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema) ProtoMessage() {} + +func (x *JSONSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema) GetRef() string { + if x != nil { + return x.xxx_hidden_Ref + } + return "" +} + +func (x *JSONSchema) GetTitle() string { + if x != nil { + return x.xxx_hidden_Title + } + return "" +} + +func (x *JSONSchema) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *JSONSchema) GetDefault() string { + if x != nil { + return x.xxx_hidden_Default + } + return "" +} + +func (x *JSONSchema) GetReadOnly() bool { + if x != nil { + return x.xxx_hidden_ReadOnly + } + return false +} + +func (x *JSONSchema) GetExample() string { + if x != nil { + return x.xxx_hidden_Example + } + return "" +} + +func (x *JSONSchema) GetMultipleOf() float64 { + if x != nil { + return x.xxx_hidden_MultipleOf + } + return 0 +} + +func (x *JSONSchema) GetMaximum() float64 { + if x != nil { + return x.xxx_hidden_Maximum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.xxx_hidden_ExclusiveMaximum + } + return false +} + +func (x *JSONSchema) GetMinimum() float64 { + if x != nil { + return x.xxx_hidden_Minimum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.xxx_hidden_ExclusiveMinimum + } + return false +} + +func (x *JSONSchema) GetMaxLength() uint64 { + if x != nil { + return x.xxx_hidden_MaxLength + } + return 0 +} + +func (x *JSONSchema) GetMinLength() uint64 { + if x != nil { + return x.xxx_hidden_MinLength + } + return 0 +} + +func (x *JSONSchema) GetPattern() string { + if x != nil { + return x.xxx_hidden_Pattern + } + return "" +} + +func (x *JSONSchema) GetMaxItems() uint64 { + if x != nil { + return x.xxx_hidden_MaxItems + } + return 0 +} + +func (x *JSONSchema) GetMinItems() uint64 { + if x != nil { + return x.xxx_hidden_MinItems + } + return 0 +} + +func (x *JSONSchema) GetUniqueItems() bool { + if x != nil { + return x.xxx_hidden_UniqueItems + } + return false +} + +func (x *JSONSchema) GetMaxProperties() uint64 { + if x != nil { + return x.xxx_hidden_MaxProperties + } + return 0 +} + +func (x *JSONSchema) GetMinProperties() uint64 { + if x != nil { + return x.xxx_hidden_MinProperties + } + return 0 +} + +func (x *JSONSchema) GetRequired() []string { + if x != nil { + return x.xxx_hidden_Required + } + return nil +} + +func (x *JSONSchema) GetArray() []string { + if x != nil { + return x.xxx_hidden_Array + } + return nil +} + +func (x *JSONSchema) GetType() []JSONSchema_JSONSchemaSimpleTypes { + if x != nil { + return x.xxx_hidden_Type + } + return nil +} + +func (x *JSONSchema) GetFormat() string { + if x != nil { + return x.xxx_hidden_Format + } + return "" +} + +func (x *JSONSchema) GetEnum() []string { + if x != nil { + return x.xxx_hidden_Enum + } + return nil +} + +func (x *JSONSchema) GetFieldConfiguration() *JSONSchema_FieldConfiguration { + if x != nil { + return x.xxx_hidden_FieldConfiguration + } + return nil +} + +func (x *JSONSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *JSONSchema) SetRef(v string) { + x.xxx_hidden_Ref = v +} + +func (x *JSONSchema) SetTitle(v string) { + x.xxx_hidden_Title = v +} + +func (x *JSONSchema) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *JSONSchema) SetDefault(v string) { + x.xxx_hidden_Default = v +} + +func (x *JSONSchema) SetReadOnly(v bool) { + x.xxx_hidden_ReadOnly = v +} + +func (x *JSONSchema) SetExample(v string) { + x.xxx_hidden_Example = v +} + +func (x *JSONSchema) SetMultipleOf(v float64) { + x.xxx_hidden_MultipleOf = v +} + +func (x *JSONSchema) SetMaximum(v float64) { + x.xxx_hidden_Maximum = v +} + +func (x *JSONSchema) SetExclusiveMaximum(v bool) { + x.xxx_hidden_ExclusiveMaximum = v +} + +func (x *JSONSchema) SetMinimum(v float64) { + x.xxx_hidden_Minimum = v +} + +func (x *JSONSchema) SetExclusiveMinimum(v bool) { + x.xxx_hidden_ExclusiveMinimum = v +} + +func (x *JSONSchema) SetMaxLength(v uint64) { + x.xxx_hidden_MaxLength = v +} + +func (x *JSONSchema) SetMinLength(v uint64) { + x.xxx_hidden_MinLength = v +} + +func (x *JSONSchema) SetPattern(v string) { + x.xxx_hidden_Pattern = v +} + +func (x *JSONSchema) SetMaxItems(v uint64) { + x.xxx_hidden_MaxItems = v +} + +func (x *JSONSchema) SetMinItems(v uint64) { + x.xxx_hidden_MinItems = v +} + +func (x *JSONSchema) SetUniqueItems(v bool) { + x.xxx_hidden_UniqueItems = v +} + +func (x *JSONSchema) SetMaxProperties(v uint64) { + x.xxx_hidden_MaxProperties = v +} + +func (x *JSONSchema) SetMinProperties(v uint64) { + x.xxx_hidden_MinProperties = v +} + +func (x *JSONSchema) SetRequired(v []string) { + x.xxx_hidden_Required = v +} + +func (x *JSONSchema) SetArray(v []string) { + x.xxx_hidden_Array = v +} + +func (x *JSONSchema) SetType(v []JSONSchema_JSONSchemaSimpleTypes) { + x.xxx_hidden_Type = v +} + +func (x *JSONSchema) SetFormat(v string) { + x.xxx_hidden_Format = v +} + +func (x *JSONSchema) SetEnum(v []string) { + x.xxx_hidden_Enum = v +} + +func (x *JSONSchema) SetFieldConfiguration(v *JSONSchema_FieldConfiguration) { + x.xxx_hidden_FieldConfiguration = v +} + +func (x *JSONSchema) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *JSONSchema) HasFieldConfiguration() bool { + if x == nil { + return false + } + return x.xxx_hidden_FieldConfiguration != nil +} + +func (x *JSONSchema) ClearFieldConfiguration() { + x.xxx_hidden_FieldConfiguration = nil +} + +type JSONSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // The title of the schema. + Title string + // A short description of the schema. + Description string + Default string + ReadOnly bool + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + Example string + MultipleOf float64 + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + Maximum float64 + ExclusiveMaximum bool + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + Minimum float64 + ExclusiveMinimum bool + MaxLength uint64 + MinLength uint64 + Pattern string + MaxItems uint64 + MinItems uint64 + UniqueItems bool + MaxProperties uint64 + MinProperties uint64 + Required []string + // Items in 'array' must be unique. + Array []string + Type []JSONSchema_JSONSchemaSimpleTypes + // `Format` + Format string + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + Enum []string + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration *JSONSchema_FieldConfiguration + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 JSONSchema_builder) Build() *JSONSchema { + m0 := &JSONSchema{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Ref = b.Ref + x.xxx_hidden_Title = b.Title + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Default = b.Default + x.xxx_hidden_ReadOnly = b.ReadOnly + x.xxx_hidden_Example = b.Example + x.xxx_hidden_MultipleOf = b.MultipleOf + x.xxx_hidden_Maximum = b.Maximum + x.xxx_hidden_ExclusiveMaximum = b.ExclusiveMaximum + x.xxx_hidden_Minimum = b.Minimum + x.xxx_hidden_ExclusiveMinimum = b.ExclusiveMinimum + x.xxx_hidden_MaxLength = b.MaxLength + x.xxx_hidden_MinLength = b.MinLength + x.xxx_hidden_Pattern = b.Pattern + x.xxx_hidden_MaxItems = b.MaxItems + x.xxx_hidden_MinItems = b.MinItems + x.xxx_hidden_UniqueItems = b.UniqueItems + x.xxx_hidden_MaxProperties = b.MaxProperties + x.xxx_hidden_MinProperties = b.MinProperties + x.xxx_hidden_Required = b.Required + x.xxx_hidden_Array = b.Array + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Format = b.Format + x.xxx_hidden_Enum = b.Enum + x.xxx_hidden_FieldConfiguration = b.FieldConfiguration + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Tag` is a representation of OpenAPI v2 specification's Tag object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject +type Tag struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,4,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Tag) Reset() { + *x = Tag{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Tag) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *Tag) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Tag) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Tag) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Tag) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *Tag) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Tag) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Tag) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Tag) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Tag) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type Tag_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + Name string + // A short description for the tag. GFM syntax can be used for rich text + // representation. + Description string + // Additional external documentation for this tag. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Tag_builder) Build() *Tag { + m0 := &Tag{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Description = b.Description + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `SecurityDefinitions` is a representation of OpenAPI v2 specification's +// Security Definitions object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject +// +// A declaration of the security schemes available to be used in the +// specification. This does not enforce the security schemes on the operations +// and only serves to provide the relevant details for each scheme. +type SecurityDefinitions struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Security map[string]*SecurityScheme `protobuf:"bytes,1,rep,name=security,proto3" json:"security,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityDefinitions) Reset() { + *x = SecurityDefinitions{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityDefinitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityDefinitions) ProtoMessage() {} + +func (x *SecurityDefinitions) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityDefinitions) GetSecurity() map[string]*SecurityScheme { + if x != nil { + return x.xxx_hidden_Security + } + return nil +} + +func (x *SecurityDefinitions) SetSecurity(v map[string]*SecurityScheme) { + x.xxx_hidden_Security = v +} + +type SecurityDefinitions_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + Security map[string]*SecurityScheme +} + +func (b0 SecurityDefinitions_builder) Build() *SecurityDefinitions { + m0 := &SecurityDefinitions{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Security = b.Security + return m0 +} + +// `SecurityScheme` is a representation of OpenAPI v2 specification's +// Security Scheme object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject +// +// Allows the definition of a security scheme that can be used by the +// operations. Supported schemes are basic authentication, an API key (either as +// a header or as a query parameter) and OAuth2's common flows (implicit, +// password, application and access code). +type SecurityScheme struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Type SecurityScheme_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Type" json:"type,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_In SecurityScheme_In `protobuf:"varint,4,opt,name=in,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_In" json:"in,omitempty"` + xxx_hidden_Flow SecurityScheme_Flow `protobuf:"varint,5,opt,name=flow,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Flow" json:"flow,omitempty"` + xxx_hidden_AuthorizationUrl string `protobuf:"bytes,6,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + xxx_hidden_TokenUrl string `protobuf:"bytes,7,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + xxx_hidden_Scopes *Scopes `protobuf:"bytes,8,opt,name=scopes,proto3" json:"scopes,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityScheme) Reset() { + *x = SecurityScheme{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityScheme) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityScheme) ProtoMessage() {} + +func (x *SecurityScheme) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityScheme) GetType() SecurityScheme_Type { + if x != nil { + return x.xxx_hidden_Type + } + return SecurityScheme_TYPE_INVALID +} + +func (x *SecurityScheme) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *SecurityScheme) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *SecurityScheme) GetIn() SecurityScheme_In { + if x != nil { + return x.xxx_hidden_In + } + return SecurityScheme_IN_INVALID +} + +func (x *SecurityScheme) GetFlow() SecurityScheme_Flow { + if x != nil { + return x.xxx_hidden_Flow + } + return SecurityScheme_FLOW_INVALID +} + +func (x *SecurityScheme) GetAuthorizationUrl() string { + if x != nil { + return x.xxx_hidden_AuthorizationUrl + } + return "" +} + +func (x *SecurityScheme) GetTokenUrl() string { + if x != nil { + return x.xxx_hidden_TokenUrl + } + return "" +} + +func (x *SecurityScheme) GetScopes() *Scopes { + if x != nil { + return x.xxx_hidden_Scopes + } + return nil +} + +func (x *SecurityScheme) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *SecurityScheme) SetType(v SecurityScheme_Type) { + x.xxx_hidden_Type = v +} + +func (x *SecurityScheme) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *SecurityScheme) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *SecurityScheme) SetIn(v SecurityScheme_In) { + x.xxx_hidden_In = v +} + +func (x *SecurityScheme) SetFlow(v SecurityScheme_Flow) { + x.xxx_hidden_Flow = v +} + +func (x *SecurityScheme) SetAuthorizationUrl(v string) { + x.xxx_hidden_AuthorizationUrl = v +} + +func (x *SecurityScheme) SetTokenUrl(v string) { + x.xxx_hidden_TokenUrl = v +} + +func (x *SecurityScheme) SetScopes(v *Scopes) { + x.xxx_hidden_Scopes = v +} + +func (x *SecurityScheme) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *SecurityScheme) HasScopes() bool { + if x == nil { + return false + } + return x.xxx_hidden_Scopes != nil +} + +func (x *SecurityScheme) ClearScopes() { + x.xxx_hidden_Scopes = nil +} + +type SecurityScheme_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type SecurityScheme_Type + // A short description for security scheme. + Description string + // The name of the header or query parameter to be used. + // Valid for apiKey. + Name string + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In SecurityScheme_In + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow SecurityScheme_Flow + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + AuthorizationUrl string + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + TokenUrl string + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes *Scopes + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 SecurityScheme_builder) Build() *SecurityScheme { + m0 := &SecurityScheme{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Name = b.Name + x.xxx_hidden_In = b.In + x.xxx_hidden_Flow = b.Flow + x.xxx_hidden_AuthorizationUrl = b.AuthorizationUrl + x.xxx_hidden_TokenUrl = b.TokenUrl + x.xxx_hidden_Scopes = b.Scopes + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `SecurityRequirement` is a representation of OpenAPI v2 specification's +// Security Requirement object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject +// +// Lists the required security schemes to execute this operation. The object can +// have multiple security schemes declared in it which are all required (that +// is, there is a logical AND between the schemes). +// +// The name used for each property MUST correspond to a security scheme +// declared in the Security Definitions. +type SecurityRequirement struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue `protobuf:"bytes,1,rep,name=security_requirement,json=securityRequirement,proto3" json:"security_requirement,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement) Reset() { + *x = SecurityRequirement{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement) ProtoMessage() {} + +func (x *SecurityRequirement) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement) GetSecurityRequirement() map[string]*SecurityRequirement_SecurityRequirementValue { + if x != nil { + return x.xxx_hidden_SecurityRequirement + } + return nil +} + +func (x *SecurityRequirement) SetSecurityRequirement(v map[string]*SecurityRequirement_SecurityRequirementValue) { + x.xxx_hidden_SecurityRequirement = v +} + +type SecurityRequirement_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue +} + +func (b0 SecurityRequirement_builder) Build() *SecurityRequirement { + m0 := &SecurityRequirement{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_SecurityRequirement = b.SecurityRequirement + return m0 +} + +// `Scopes` is a representation of OpenAPI v2 specification's Scopes object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject +// +// Lists the available scopes for an OAuth2 security scheme. +type Scopes struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Scope map[string]string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Scopes) Reset() { + *x = Scopes{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Scopes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Scopes) ProtoMessage() {} + +func (x *Scopes) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Scopes) GetScope() map[string]string { + if x != nil { + return x.xxx_hidden_Scope + } + return nil +} + +func (x *Scopes) SetScope(v map[string]string) { + x.xxx_hidden_Scope = v +} + +type Scopes_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Maps between a name of a scope to a short description of it (as the value + // of the property). + Scope map[string]string +} + +func (b0 Scopes_builder) Build() *Scopes { + m0 := &Scopes{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Scope = b.Scope + return m0 +} + +// 'FieldConfiguration' provides additional field level properties used when generating the OpenAPI v2 file. +// These properties are not defined by OpenAPIv2, but they are used to control the generation. +type JSONSchema_FieldConfiguration struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_PathParamName string `protobuf:"bytes,47,opt,name=path_param_name,json=pathParamName,proto3" json:"path_param_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema_FieldConfiguration) Reset() { + *x = JSONSchema_FieldConfiguration{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema_FieldConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema_FieldConfiguration) ProtoMessage() {} + +func (x *JSONSchema_FieldConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema_FieldConfiguration) GetPathParamName() string { + if x != nil { + return x.xxx_hidden_PathParamName + } + return "" +} + +func (x *JSONSchema_FieldConfiguration) SetPathParamName(v string) { + x.xxx_hidden_PathParamName = v +} + +type JSONSchema_FieldConfiguration_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + PathParamName string +} + +func (b0 JSONSchema_FieldConfiguration_builder) Build() *JSONSchema_FieldConfiguration { + m0 := &JSONSchema_FieldConfiguration{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_PathParamName = b.PathParamName + return m0 +} + +// If the security scheme is of type "oauth2", then the value is a list of +// scope names required for the execution. For other security scheme types, +// the array MUST be empty. +type SecurityRequirement_SecurityRequirementValue struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Scope []string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement_SecurityRequirementValue) Reset() { + *x = SecurityRequirement_SecurityRequirementValue{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement_SecurityRequirementValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement_SecurityRequirementValue) ProtoMessage() {} + +func (x *SecurityRequirement_SecurityRequirementValue) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement_SecurityRequirementValue) GetScope() []string { + if x != nil { + return x.xxx_hidden_Scope + } + return nil +} + +func (x *SecurityRequirement_SecurityRequirementValue) SetScope(v []string) { + x.xxx_hidden_Scope = v +} + +type SecurityRequirement_SecurityRequirementValue_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Scope []string +} + +func (b0 SecurityRequirement_SecurityRequirementValue_builder) Build() *SecurityRequirement_SecurityRequirementValue { + m0 := &SecurityRequirement_SecurityRequirementValue{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Scope = b.Scope + return m0 +} + +var File_protoc_gen_openapiv2_options_openapiv2_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb3, 0x08, 0x0a, 0x07, 0x53, 0x77, 0x61, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x12, 0x43, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x61, 0x73, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xd6, 0x07, + 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, + 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x55, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0x62, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x0f, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x3f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x45, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, + 0x41, 0x4e, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, + 0x22, 0xd8, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, + 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, + 0x0b, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, + 0x0e, 0x10, 0x0f, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x10, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, + 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, 0x08, 0x12, 0x10, 0x13, 0x22, 0x9a, 0x05, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x5a, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x12, 0x63, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6d, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x03, 0x0a, 0x04, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x45, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2f, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x4b, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0xaa, 0x02, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x56, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x6a, + 0x73, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x22, 0xe8, 0x03, 0x0a, 0x0a, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, + 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x44, 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, + 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, + 0x0a, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x78, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, + 0x22, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x12, 0x5f, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x23, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x4b, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x2e, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x7a, 0x0a, 0x13, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x12, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3c, 0x0a, 0x12, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x74, + 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x77, 0x0a, 0x15, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x52, 0x52, 0x41, 0x59, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x06, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x12, + 0x10, 0x13, 0x4a, 0x04, 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x4a, 0x04, + 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x1c, 0x10, 0x1d, 0x4a, 0x04, 0x08, 0x1d, 0x10, 0x1e, + 0x4a, 0x04, 0x08, 0x1e, 0x10, 0x22, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x2a, 0x4a, 0x04, 0x08, 0x2a, + 0x10, 0x2b, 0x4a, 0x04, 0x08, 0x2b, 0x10, 0x2e, 0x22, 0xd9, 0x02, 0x0a, 0x03, 0x54, 0x61, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x5e, 0x0a, + 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, + 0x67, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf7, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x68, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x76, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, + 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, + 0x06, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x12, 0x52, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x02, 0x69, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x2b, 0x0a, + 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x10, + 0x03, 0x22, 0x31, 0x0a, 0x02, 0x49, 0x6e, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x5f, 0x51, 0x55, + 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x5f, 0x48, 0x45, 0x41, 0x44, + 0x45, 0x52, 0x10, 0x02, 0x22, 0x6a, 0x0a, 0x04, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x0c, + 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x11, + 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, + 0x52, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x41, 0x50, 0x50, + 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x04, + 0x22, 0xf6, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x30, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x6d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x96, 0x01, 0x0a, 0x06, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x2a, 0x3b, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x57, 0x53, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x57, 0x53, 0x53, 0x10, 0x04, 0x42, + 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = []any{ + (Scheme)(0), // 0: grpc.gateway.protoc_gen_openapiv2.options.Scheme + (HeaderParameter_Type)(0), // 1: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + (JSONSchema_JSONSchemaSimpleTypes)(0), // 2: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + (SecurityScheme_Type)(0), // 3: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + (SecurityScheme_In)(0), // 4: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + (SecurityScheme_Flow)(0), // 5: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Parameters)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Parameters + (*HeaderParameter)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + (*Header)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Header + (*Response)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.Response + (*Info)(nil), // 12: grpc.gateway.protoc_gen_openapiv2.options.Info + (*Contact)(nil), // 13: grpc.gateway.protoc_gen_openapiv2.options.Contact + (*License)(nil), // 14: grpc.gateway.protoc_gen_openapiv2.options.License + (*ExternalDocumentation)(nil), // 15: grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + (*Schema)(nil), // 16: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 17: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*JSONSchema)(nil), // 18: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + (*Tag)(nil), // 19: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*SecurityDefinitions)(nil), // 20: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + (*SecurityScheme)(nil), // 21: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + (*SecurityRequirement)(nil), // 22: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + (*Scopes)(nil), // 23: grpc.gateway.protoc_gen_openapiv2.options.Scopes + nil, // 24: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + nil, // 25: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + nil, // 26: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + nil, // 27: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + nil, // 28: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + nil, // 29: grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + nil, // 30: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + nil, // 31: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + nil, // 32: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + (*JSONSchema_FieldConfiguration)(nil), // 33: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + nil, // 34: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + nil, // 35: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + nil, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + nil, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + (*SecurityRequirement_SecurityRequirementValue)(nil), // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + nil, // 39: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + nil, // 40: grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + (*structpb.Value)(nil), // 41: google.protobuf.Value +} +var file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = []int32{ + 12, // 0: grpc.gateway.protoc_gen_openapiv2.options.Swagger.info:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info + 0, // 1: grpc.gateway.protoc_gen_openapiv2.options.Swagger.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 24, // 2: grpc.gateway.protoc_gen_openapiv2.options.Swagger.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + 20, // 3: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security_definitions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + 22, // 4: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 19, // 5: grpc.gateway.protoc_gen_openapiv2.options.Swagger.tags:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 15, // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 25, // 7: grpc.gateway.protoc_gen_openapiv2.options.Swagger.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + 15, // 8: grpc.gateway.protoc_gen_openapiv2.options.Operation.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 26, // 9: grpc.gateway.protoc_gen_openapiv2.options.Operation.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + 0, // 10: grpc.gateway.protoc_gen_openapiv2.options.Operation.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 22, // 11: grpc.gateway.protoc_gen_openapiv2.options.Operation.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 27, // 12: grpc.gateway.protoc_gen_openapiv2.options.Operation.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + 8, // 13: grpc.gateway.protoc_gen_openapiv2.options.Operation.parameters:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Parameters + 9, // 14: grpc.gateway.protoc_gen_openapiv2.options.Parameters.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + 1, // 15: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + 16, // 16: grpc.gateway.protoc_gen_openapiv2.options.Response.schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 28, // 17: grpc.gateway.protoc_gen_openapiv2.options.Response.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + 29, // 18: grpc.gateway.protoc_gen_openapiv2.options.Response.examples:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + 30, // 19: grpc.gateway.protoc_gen_openapiv2.options.Response.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + 13, // 20: grpc.gateway.protoc_gen_openapiv2.options.Info.contact:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Contact + 14, // 21: grpc.gateway.protoc_gen_openapiv2.options.Info.license:type_name -> grpc.gateway.protoc_gen_openapiv2.options.License + 31, // 22: grpc.gateway.protoc_gen_openapiv2.options.Info.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + 18, // 23: grpc.gateway.protoc_gen_openapiv2.options.Schema.json_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 15, // 24: grpc.gateway.protoc_gen_openapiv2.options.Schema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 15, // 25: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 32, // 26: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + 2, // 27: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + 33, // 28: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.field_configuration:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + 34, // 29: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + 15, // 30: grpc.gateway.protoc_gen_openapiv2.options.Tag.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 35, // 31: grpc.gateway.protoc_gen_openapiv2.options.Tag.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + 36, // 32: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + 3, // 33: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + 4, // 34: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.in:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + 5, // 35: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.flow:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + 23, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.scopes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes + 37, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + 39, // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.security_requirement:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + 40, // 39: grpc.gateway.protoc_gen_openapiv2.options.Scopes.scope:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + 11, // 40: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 41: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry.value:type_name -> google.protobuf.Value + 11, // 42: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 43: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry.value:type_name -> google.protobuf.Value + 10, // 44: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Header + 41, // 45: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 46: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 47: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 48: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 49: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry.value:type_name -> google.protobuf.Value + 21, // 50: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + 41, // 51: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry.value:type_name -> google.protobuf.Value + 38, // 52: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + 53, // [53:53] is the sub-list for method output_type + 53, // [53:53] is the sub-list for method input_type + 53, // [53:53] is the sub-list for extension type_name + 53, // [53:53] is the sub-list for extension extendee + 0, // [0:53] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_openapiv2_proto_init() } +func file_protoc_gen_openapiv2_options_openapiv2_proto_init() { + if File_protoc_gen_openapiv2_options_openapiv2_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc, + NumEnums: 6, + NumMessages: 35, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs, + EnumInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes, + MessageInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes, + }.Build() + File_protoc_gen_openapiv2_options_openapiv2_proto = out.File + file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = nil +} diff --git a/vendor/github.com/modern-go/reflect2/safe_type.go b/vendor/github.com/modern-go/reflect2/safe_type.go index ee4e7bb6ed..5646309e09 100644 --- a/vendor/github.com/modern-go/reflect2/safe_type.go +++ b/vendor/github.com/modern-go/reflect2/safe_type.go @@ -6,10 +6,12 @@ import ( ) type safeType struct { - reflect.Type - cfg *frozenConfig + Type reflect.Type + cfg *frozenConfig } +var _ Type = &safeType{} + func (type2 *safeType) New() interface{} { return reflect.New(type2.Type).Interface() } @@ -18,6 +20,22 @@ func (type2 *safeType) UnsafeNew() unsafe.Pointer { panic("does not support unsafe operation") } +func (type2 *safeType) Kind() reflect.Kind { + return type2.Type.Kind() +} + +func (type2 *safeType) Len() int { + return type2.Type.Len() +} + +func (type2 *safeType) NumField() int { + return type2.Type.NumField() +} + +func (type2 *safeType) String() string { + return type2.Type.String() +} + func (type2 *safeType) Elem() Type { return type2.cfg.Type2(type2.Type.Elem()) } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go index 8e16d2bb03..f3439a3f0c 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go @@ -90,6 +90,9 @@ func FinalizeProfilesAndReportsForSuites(suites TestSuites, cliConfig types.CLIC if reporterConfig.JSONReport != "" { reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.JSONReport, GenerateFunc: reporters.GenerateJSONReport, MergeFunc: reporters.MergeAndCleanupJSONReports}) } + if reporterConfig.GoJSONReport != "" { + reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.GoJSONReport, GenerateFunc: reporters.GenerateGoTestJSONReport, MergeFunc: reporters.MergeAndCleanupGoTestJSONReports}) + } if reporterConfig.JUnitReport != "" { reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.JUnitReport, GenerateFunc: reporters.GenerateJUnitReport, MergeFunc: reporters.MergeAndCleanupJUnitReports}) } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go index 41052ea19d..30d8096cd6 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go @@ -107,6 +107,9 @@ func runSerial(suite TestSuite, ginkgoConfig types.SuiteConfig, reporterConfig t if reporterConfig.JSONReport != "" { reporterConfig.JSONReport = AbsPathForGeneratedAsset(reporterConfig.JSONReport, suite, cliConfig, 0) } + if reporterConfig.GoJSONReport != "" { + reporterConfig.GoJSONReport = AbsPathForGeneratedAsset(reporterConfig.GoJSONReport, suite, cliConfig, 0) + } if reporterConfig.JUnitReport != "" { reporterConfig.JUnitReport = AbsPathForGeneratedAsset(reporterConfig.JUnitReport, suite, cliConfig, 0) } @@ -179,6 +182,9 @@ func runParallel(suite TestSuite, ginkgoConfig types.SuiteConfig, reporterConfig if reporterConfig.JSONReport != "" { reporterConfig.JSONReport = AbsPathForGeneratedAsset(reporterConfig.JSONReport, suite, cliConfig, 0) } + if reporterConfig.GoJSONReport != "" { + reporterConfig.GoJSONReport = AbsPathForGeneratedAsset(reporterConfig.GoJSONReport, suite, cliConfig, 0) + } if reporterConfig.JUnitReport != "" { reporterConfig.JUnitReport = AbsPathForGeneratedAsset(reporterConfig.JUnitReport, suite, cliConfig, 0) } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go index bd6b8fbff3..419589b48c 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go @@ -3,7 +3,6 @@ package main import ( "fmt" "os" - _ "go.uber.org/automaxprocs" "github.com/onsi/ginkgo/v2/ginkgo/build" "github.com/onsi/ginkgo/v2/ginkgo/command" "github.com/onsi/ginkgo/v2/ginkgo/generators" diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/maxprocs.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/maxprocs.go new file mode 100644 index 0000000000..a7d2b37d6b --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/maxprocs.go @@ -0,0 +1,8 @@ +//go:build !go1.25 +// +build !go1.25 + +package main + +import ( + _ "go.uber.org/automaxprocs" +) diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go new file mode 100644 index 0000000000..8b7a9ceabf --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go @@ -0,0 +1,158 @@ +package reporters + +import ( + "errors" + "fmt" + "strings" + "time" + + "github.com/onsi/ginkgo/v2/types" + "golang.org/x/tools/go/packages" +) + +func ptr[T any](in T) *T { + return &in +} + +type encoder interface { + Encode(v any) error +} + +// gojsonEvent matches the format from go internals +// https://github.com/golang/go/blob/master/src/cmd/internal/test2json/test2json.go#L31-L41 +// https://pkg.go.dev/cmd/test2json +type gojsonEvent struct { + Time *time.Time `json:",omitempty"` + Action GoJSONAction + Package string `json:",omitempty"` + Test string `json:",omitempty"` + Elapsed *float64 `json:",omitempty"` + Output *string `json:",omitempty"` + FailedBuild string `json:",omitempty"` +} + +type GoJSONAction string + +const ( + // start - the test binary is about to be executed + GoJSONStart GoJSONAction = "start" + // run - the test has started running + GoJSONRun GoJSONAction = "run" + // pause - the test has been paused + GoJSONPause GoJSONAction = "pause" + // cont - the test has continued running + GoJSONCont GoJSONAction = "cont" + // pass - the test passed + GoJSONPass GoJSONAction = "pass" + // bench - the benchmark printed log output but did not fail + GoJSONBench GoJSONAction = "bench" + // fail - the test or benchmark failed + GoJSONFail GoJSONAction = "fail" + // output - the test printed output + GoJSONOutput GoJSONAction = "output" + // skip - the test was skipped or the package contained no tests + GoJSONSkip GoJSONAction = "skip" +) + +func goJSONActionFromSpecState(state types.SpecState) GoJSONAction { + switch state { + case types.SpecStateInvalid: + return GoJSONFail + case types.SpecStatePending: + return GoJSONSkip + case types.SpecStateSkipped: + return GoJSONSkip + case types.SpecStatePassed: + return GoJSONPass + case types.SpecStateFailed: + return GoJSONFail + case types.SpecStateAborted: + return GoJSONFail + case types.SpecStatePanicked: + return GoJSONFail + case types.SpecStateInterrupted: + return GoJSONFail + case types.SpecStateTimedout: + return GoJSONFail + default: + panic("unexpected state should not happen") + } +} + +// gojsonReport wraps types.Report and calcualtes extra fields requires by gojson +type gojsonReport struct { + o types.Report + // Extra calculated fields + goPkg string + elapsed float64 +} + +func newReport(in types.Report) *gojsonReport { + return &gojsonReport{ + o: in, + } +} + +func (r *gojsonReport) Fill() error { + // NOTE: could the types.Report include the go package name? + goPkg, err := suitePathToPkg(r.o.SuitePath) + if err != nil { + return err + } + r.goPkg = goPkg + r.elapsed = r.o.RunTime.Seconds() + return nil +} + +// gojsonSpecReport wraps types.SpecReport and calculates extra fields required by gojson +type gojsonSpecReport struct { + o types.SpecReport + // extra calculated fields + testName string + elapsed float64 + action GoJSONAction +} + +func newSpecReport(in types.SpecReport) *gojsonSpecReport { + return &gojsonSpecReport{ + o: in, + } +} + +func (sr *gojsonSpecReport) Fill() error { + sr.elapsed = sr.o.RunTime.Seconds() + sr.testName = createTestName(sr.o) + sr.action = goJSONActionFromSpecState(sr.o.State) + return nil +} + +func suitePathToPkg(dir string) (string, error) { + cfg := &packages.Config{ + Mode: packages.NeedFiles | packages.NeedSyntax, + } + pkgs, err := packages.Load(cfg, dir) + if err != nil { + return "", err + } + if len(pkgs) != 1 { + return "", errors.New("error") + } + return pkgs[0].ID, nil +} + +func createTestName(spec types.SpecReport) string { + name := fmt.Sprintf("[%s]", spec.LeafNodeType) + if spec.FullText() != "" { + name = name + " " + spec.FullText() + } + labels := spec.Labels() + if len(labels) > 0 { + name = name + " [" + strings.Join(labels, ", ") + "]" + } + semVerConstraints := spec.SemVerConstraints() + if len(semVerConstraints) > 0 { + name = name + " [" + strings.Join(semVerConstraints, ", ") + "]" + } + name = strings.TrimSpace(name) + return name +} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go new file mode 100644 index 0000000000..ec5311d069 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go @@ -0,0 +1,111 @@ +package reporters + +type GoJSONEventWriter struct { + enc encoder + specSystemErrFn specSystemExtractFn + specSystemOutFn specSystemExtractFn +} + +func NewGoJSONEventWriter(enc encoder, errFn specSystemExtractFn, outFn specSystemExtractFn) *GoJSONEventWriter { + return &GoJSONEventWriter{ + enc: enc, + specSystemErrFn: errFn, + specSystemOutFn: outFn, + } +} + +func (r *GoJSONEventWriter) writeEvent(e *gojsonEvent) error { + return r.enc.Encode(e) +} + +func (r *GoJSONEventWriter) WriteSuiteStart(report *gojsonReport) error { + e := &gojsonEvent{ + Time: &report.o.StartTime, + Action: GoJSONStart, + Package: report.goPkg, + Output: nil, + FailedBuild: "", + } + return r.writeEvent(e) +} + +func (r *GoJSONEventWriter) WriteSuiteResult(report *gojsonReport) error { + var action GoJSONAction + switch { + case report.o.PreRunStats.SpecsThatWillRun == 0: + action = GoJSONSkip + case report.o.SuiteSucceeded: + action = GoJSONPass + default: + action = GoJSONFail + } + e := &gojsonEvent{ + Time: &report.o.EndTime, + Action: action, + Package: report.goPkg, + Output: nil, + FailedBuild: "", + Elapsed: ptr(report.elapsed), + } + return r.writeEvent(e) +} + +func (r *GoJSONEventWriter) WriteSpecStart(report *gojsonReport, specReport *gojsonSpecReport) error { + e := &gojsonEvent{ + Time: &specReport.o.StartTime, + Action: GoJSONRun, + Test: specReport.testName, + Package: report.goPkg, + Output: nil, + FailedBuild: "", + } + return r.writeEvent(e) +} + +func (r *GoJSONEventWriter) WriteSpecOut(report *gojsonReport, specReport *gojsonSpecReport) error { + events := []*gojsonEvent{} + + stdErr := r.specSystemErrFn(specReport.o) + if stdErr != "" { + events = append(events, &gojsonEvent{ + Time: &specReport.o.EndTime, + Action: GoJSONOutput, + Test: specReport.testName, + Package: report.goPkg, + Output: ptr(stdErr), + FailedBuild: "", + }) + } + stdOut := r.specSystemOutFn(specReport.o) + if stdOut != "" { + events = append(events, &gojsonEvent{ + Time: &specReport.o.EndTime, + Action: GoJSONOutput, + Test: specReport.testName, + Package: report.goPkg, + Output: ptr(stdOut), + FailedBuild: "", + }) + } + + for _, ev := range events { + err := r.writeEvent(ev) + if err != nil { + return err + } + } + return nil +} + +func (r *GoJSONEventWriter) WriteSpecResult(report *gojsonReport, specReport *gojsonSpecReport) error { + e := &gojsonEvent{ + Time: &specReport.o.EndTime, + Action: specReport.action, + Test: specReport.testName, + Package: report.goPkg, + Elapsed: ptr(specReport.elapsed), + Output: nil, + FailedBuild: "", + } + return r.writeEvent(e) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go new file mode 100644 index 0000000000..633e49b88d --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go @@ -0,0 +1,45 @@ +package reporters + +import ( + "github.com/onsi/ginkgo/v2/types" +) + +type GoJSONReporter struct { + ev *GoJSONEventWriter +} + +type specSystemExtractFn func (spec types.SpecReport) string + +func NewGoJSONReporter(enc encoder, errFn specSystemExtractFn, outFn specSystemExtractFn) *GoJSONReporter { + return &GoJSONReporter{ + ev: NewGoJSONEventWriter(enc, errFn, outFn), + } +} + +func (r *GoJSONReporter) Write(originalReport types.Report) error { + // suite start events + report := newReport(originalReport) + err := report.Fill() + if err != nil { + return err + } + r.ev.WriteSuiteStart(report) + for _, originalSpecReport := range originalReport.SpecReports { + specReport := newSpecReport(originalSpecReport) + err := specReport.Fill() + if err != nil { + return err + } + if specReport.o.LeafNodeType == types.NodeTypeIt { + // handle any It leaf node as a spec + r.ev.WriteSpecStart(report, specReport) + r.ev.WriteSpecOut(report, specReport) + r.ev.WriteSpecResult(report, specReport) + } else { + // handle any other leaf node as generic output + r.ev.WriteSpecOut(report, specReport) + } + } + r.ev.WriteSuiteResult(report) + return nil +} diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go new file mode 100644 index 0000000000..d02fb7a1ae --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go @@ -0,0 +1,61 @@ +package reporters + +import ( + "encoding/json" + "fmt" + "os" + "path" + + "github.com/onsi/ginkgo/v2/internal/reporters" + "github.com/onsi/ginkgo/v2/types" +) + +// GenerateGoTestJSONReport produces a JSON-formatted in the test2json format used by `go test -json` +func GenerateGoTestJSONReport(report types.Report, destination string) error { + // walk report and generate test2json-compatible objects + // JSON-encode the objects into filename + if err := os.MkdirAll(path.Dir(destination), 0770); err != nil { + return err + } + f, err := os.Create(destination) + if err != nil { + return err + } + defer f.Close() + enc := json.NewEncoder(f) + r := reporters.NewGoJSONReporter( + enc, + systemErrForUnstructuredReporters, + systemOutForUnstructuredReporters, + ) + return r.Write(report) +} + +// MergeJSONReports produces a single JSON-formatted report at the passed in destination by merging the JSON-formatted reports provided in sources +// It skips over reports that fail to decode but reports on them via the returned messages []string +func MergeAndCleanupGoTestJSONReports(sources []string, destination string) ([]string, error) { + messages := []string{} + if err := os.MkdirAll(path.Dir(destination), 0770); err != nil { + return messages, err + } + f, err := os.Create(destination) + if err != nil { + return messages, err + } + defer f.Close() + + for _, source := range sources { + data, err := os.ReadFile(source) + if err != nil { + messages = append(messages, fmt.Sprintf("Could not open %s:\n%s", source, err.Error())) + continue + } + _, err = f.Write(data) + if err != nil { + messages = append(messages, fmt.Sprintf("Could not write to %s:\n%s", destination, err.Error())) + continue + } + os.Remove(source) + } + return messages, nil +} diff --git a/vendor/github.com/onsi/ginkgo/v2/types/config.go b/vendor/github.com/onsi/ginkgo/v2/types/config.go index b99a9e15e9..f847036046 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/config.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/config.go @@ -96,6 +96,7 @@ type ReporterConfig struct { ForceNewlines bool JSONReport string + GoJSONReport string JUnitReport string TeamcityReport string } @@ -112,7 +113,7 @@ func (rc ReporterConfig) Verbosity() VerbosityLevel { } func (rc ReporterConfig) WillGenerateReport() bool { - return rc.JSONReport != "" || rc.JUnitReport != "" || rc.TeamcityReport != "" + return rc.JSONReport != "" || rc.GoJSONReport != "" || rc.JUnitReport != "" || rc.TeamcityReport != "" } func NewDefaultReporterConfig() ReporterConfig { @@ -359,6 +360,8 @@ var ReporterConfigFlags = GinkgoFlags{ {KeyPath: "R.JSONReport", Name: "json-report", UsageArgument: "filename.json", SectionKey: "output", Usage: "If set, Ginkgo will generate a JSON-formatted test report at the specified location."}, + {KeyPath: "R.GoJSONReport", Name: "gojson-report", UsageArgument: "filename.json", SectionKey: "output", + Usage: "If set, Ginkgo will generate a Go JSON-formatted test report at the specified location."}, {KeyPath: "R.JUnitReport", Name: "junit-report", UsageArgument: "filename.xml", SectionKey: "output", DeprecatedName: "reportFile", DeprecatedDocLink: "improved-reporting-infrastructure", Usage: "If set, Ginkgo will generate a conformant junit test report in the specified file."}, {KeyPath: "R.TeamcityReport", Name: "teamcity-report", UsageArgument: "filename", SectionKey: "output", diff --git a/vendor/github.com/onsi/ginkgo/v2/types/version.go b/vendor/github.com/onsi/ginkgo/v2/types/version.go index 6aca6efa81..a30e68be1a 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/version.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/version.go @@ -1,3 +1,3 @@ package types -const VERSION = "2.25.3" +const VERSION = "2.26.0" diff --git a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml deleted file mode 100644 index e56801b1e7..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml +++ /dev/null @@ -1,164 +0,0 @@ -kind: CustomResourceDefinition -apiVersion: apiextensions.k8s.io/v1 -metadata: - name: clusteroperators.config.openshift.io - annotations: - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: ClusterOperator - listKind: ClusterOperatorList - plural: clusteroperators - singular: clusteroperator - shortNames: - - co - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.versions[?(@.name=="operator")].version - description: The version the operator is at. - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=="Available")].status - description: Whether the operator is running and stable. - name: Available - type: string - - jsonPath: .status.conditions[?(@.type=="Progressing")].status - description: Whether the operator is processing changes. - name: Progressing - type: string - - jsonPath: .status.conditions[?(@.type=="Degraded")].status - description: Whether the operator is degraded. - name: Degraded - type: string - - jsonPath: .status.conditions[?(@.type=="Available")].lastTransitionTime - description: The time the operator's Available status last changed. - name: Since - type: date - schema: - openAPIV3Schema: - description: ClusterOperator is the Custom Resource object which holds the - current state of an operator. This object is used by operators to convey - their state to the rest of the cluster. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds configuration that could apply to any operator. - type: object - status: - description: status holds the information about the state of an operator. It - is consistent with status information across the Kubernetes ecosystem. - type: object - properties: - conditions: - description: conditions describes the state of the operator's managed - and monitored components. - type: array - items: - description: ClusterOperatorStatusCondition represents the state - of the operator's managed and monitored components. - type: object - required: - - lastTransitionTime - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the time of the last update - to the current status property. - type: string - format: date-time - message: - description: message provides additional information about the - current condition. This is only to be consumed by humans. It - may contain Line Feed characters (U+000A), which should be - rendered as new lines. - type: string - reason: - description: reason is the CamelCase reason for the condition's - current status. - type: string - status: - description: status of the condition, one of True, False, Unknown. - type: string - type: - description: type specifies the aspect reported by this condition. - type: string - extension: - description: extension contains any additional status information - specific to the operator which owns this status object. - type: object - nullable: true - x-kubernetes-preserve-unknown-fields: true - relatedObjects: - description: 'relatedObjects is a list of objects that are "interesting" - or related to this operator. Common uses are: 1. the detailed resource - driving the operator 2. operator namespaces 3. operand namespaces' - type: array - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - type: object - required: - - group - - name - - resource - properties: - group: - description: group of the referent. - type: string - name: - description: name of the referent. - type: string - namespace: - description: namespace of the referent. - type: string - resource: - description: resource of the referent. - type: string - versions: - description: versions is a slice of operator and operand version tuples. Operators - which manage multiple operands will have multiple operand entries - in the array. Available operators must report the version of the - operator itself with the name "operator". An operator reports a - new "operator" version when it has rolled out the new version to - all of its operands. - type: array - items: - type: object - required: - - name - - version - properties: - name: - description: name is the name of the particular operand this - version is for. It usually matches container images, not - operators. - type: string - version: - description: version indicates which version of a particular - operand is currently being managed. It must always match - the Available operand. If 1.0.0 is Available, then this must - indicate 1.0.0 even if the operator is trying to rollout 1.1.0 - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml deleted file mode 100644 index c5be735b6a..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml +++ /dev/null @@ -1,334 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusterversions.config.openshift.io - annotations: - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - versions: - - name: v1 - served: true - storage: true - schema: - openAPIV3Schema: - description: ClusterVersion is the configuration for the ClusterVersionOperator. - This is where parameters related to automatic updates can be set. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec is the desired state of the cluster version - the operator - will work to ensure that the desired version is applied to the cluster. - type: object - required: - - clusterID - properties: - channel: - description: channel is an identifier for explicitly requesting that - a non-default set of updates be applied to this cluster. The default - channel will be contain stable updates that are appropriate for - production clusters. - type: string - clusterID: - description: clusterID uniquely identifies this cluster. This is expected - to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - in hexadecimal values). This is a required field. - type: string - desiredUpdate: - description: "desiredUpdate is an optional field that indicates the - desired value of the cluster version. Setting this value will trigger - an upgrade (if the current version does not match the desired version). - The set of recommended update values is listed as part of available - updates in status, and setting values outside that range may cause - the upgrade to fail. You may specify the version field without setting - image if an update exists with that version in the availableUpdates - or history. \n If an upgrade fails the operator will halt and report - status about the failing component. Setting the desired update value - back to the previous version will cause a rollback to be attempted. - Not all rollbacks will succeed." - type: object - properties: - force: - description: "force allows an administrator to update to an image - that has failed verification, does not appear in the availableUpdates - list, or otherwise would be blocked by normal protections on - update. This option should only be used when the authenticity - of the provided image has been verified out of band because - the provided image will run with full administrative access - to the cluster. Do not use this flag with images that comes - from unknown or potentially malicious sources. \n This flag - does not override other forms of consistency checking that are - required before a new update is deployed." - type: boolean - image: - description: image is a container image location that contains - the update. When this field is part of spec, image is optional - if version is specified and the availableUpdates field contains - a matching version. - type: string - version: - description: version is a semantic versioning identifying the - update version. When this field is part of spec, version is - optional if image is specified. - type: string - overrides: - description: overrides is list of overides for components that are - managed by cluster version operator. Marking a component unmanaged - will prevent the operator from creating or updating the object. - type: array - items: - description: ComponentOverride allows overriding cluster version - operator's behavior for a component. - type: object - required: - - group - - kind - - name - - namespace - - unmanaged - properties: - group: - description: group identifies the API group that the kind is - in. - type: string - kind: - description: kind indentifies which object to override. - type: string - name: - description: name is the component's name. - type: string - namespace: - description: namespace is the component's namespace. If the - resource is cluster scoped, the namespace should be empty. - type: string - unmanaged: - description: 'unmanaged controls if cluster version operator - should stop managing the resources in this cluster. Default: - false' - type: boolean - upstream: - description: upstream may be used to specify the preferred update - server. By default it will use the appropriate update server for - the cluster and region. - type: string - status: - description: status contains information about the available updates and - any in-progress updates. - type: object - required: - - availableUpdates - - desired - - observedGeneration - - versionHash - properties: - availableUpdates: - description: availableUpdates contains the list of updates that are - appropriate for this cluster. This list may be empty if no updates - are recommended, if the update service is unavailable, or if an - invalid channel has been specified. - type: array - items: - description: Release represents an OpenShift release image and associated - metadata. - type: object - properties: - channels: - description: channels is the set of Cincinnati channels to which - the release currently belongs. - type: array - items: - type: string - image: - description: image is a container image location that contains - the update. When this field is part of spec, image is optional - if version is specified and the availableUpdates field contains - a matching version. - type: string - url: - description: url contains information about this release. This - URL is set by the 'url' metadata property on a release or - the metadata returned by the update API and should be displayed - as a link in user interfaces. The URL field may not be set - for test or nightly releases. - type: string - version: - description: version is a semantic versioning identifying the - update version. When this field is part of spec, version is - optional if image is specified. - type: string - nullable: true - conditions: - description: conditions provides information about the cluster version. - The condition "Available" is set to true if the desiredUpdate has - been reached. The condition "Progressing" is set to true if an update - is being applied. The condition "Degraded" is set to true if an - update is currently blocked by a temporary or permanent error. Conditions - are only valid for the current desiredUpdate when metadata.generation - is equal to status.generation. - type: array - items: - description: ClusterOperatorStatusCondition represents the state - of the operator's managed and monitored components. - type: object - required: - - lastTransitionTime - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the time of the last update - to the current status property. - type: string - format: date-time - message: - description: message provides additional information about the - current condition. This is only to be consumed by humans. It - may contain Line Feed characters (U+000A), which should be - rendered as new lines. - type: string - reason: - description: reason is the CamelCase reason for the condition's - current status. - type: string - status: - description: status of the condition, one of True, False, Unknown. - type: string - type: - description: type specifies the aspect reported by this condition. - type: string - desired: - description: desired is the version that the cluster is reconciling - towards. If the cluster is not yet fully initialized desired will - be set with the information available, which may be an image or - a tag. - type: object - properties: - channels: - description: channels is the set of Cincinnati channels to which - the release currently belongs. - type: array - items: - type: string - image: - description: image is a container image location that contains - the update. When this field is part of spec, image is optional - if version is specified and the availableUpdates field contains - a matching version. - type: string - url: - description: url contains information about this release. This - URL is set by the 'url' metadata property on a release or the - metadata returned by the update API and should be displayed - as a link in user interfaces. The URL field may not be set for - test or nightly releases. - type: string - version: - description: version is a semantic versioning identifying the - update version. When this field is part of spec, version is - optional if image is specified. - type: string - history: - description: history contains a list of the most recent versions applied - to the cluster. This value may be empty during cluster startup, - and then will be updated when a new update is being applied. The - newest update is first in the list and it is ordered by recency. - Updates in the history have state Completed if the rollout completed - - if an update was failing or halfway applied the state will be - Partial. Only a limited amount of update history is preserved. - type: array - items: - description: UpdateHistory is a single attempted update to the cluster. - type: object - required: - - completionTime - - image - - startedTime - - state - - verified - properties: - completionTime: - description: completionTime, if set, is when the update was - fully applied. The update that is currently being applied - will have a null completion time. Completion time will always - be set for entries that are not the current update (usually - to the started time of the next update). - type: string - format: date-time - nullable: true - image: - description: image is a container image location that contains - the update. This value is always populated. - type: string - startedTime: - description: startedTime is the time at which the update was - started. - type: string - format: date-time - state: - description: state reflects whether the update was fully applied. - The Partial state indicates the update is not fully applied, - while the Completed state indicates the update was successfully - rolled out at least once (all parts of the update successfully - applied). - type: string - verified: - description: verified indicates whether the provided update - was properly verified before it was installed. If this is - false the cluster may not be trusted. - type: boolean - version: - description: version is a semantic versioning identifying the - update version. If the requested image does not define a version, - or if a failure occurs retrieving the image, this value may - be empty. - type: string - observedGeneration: - description: observedGeneration reports which version of the spec - is being synced. If this value is not equal to metadata.generation, - then the desired and conditions fields may represent a previous - version. - type: integer - format: int64 - versionHash: - description: versionHash is a fingerprint of the content that the - cluster will be updated with. It is used by the operator to avoid - unnecessary work and is for internal use only. - type: string - subresources: - status: {} - additionalPrinterColumns: - - name: Version - type: string - jsonPath: .status.history[?(@.state=="Completed")].version - - name: Available - type: string - jsonPath: .status.conditions[?(@.type=="Available")].status - - name: Progressing - type: string - jsonPath: .status.conditions[?(@.type=="Progressing")].status - - name: Since - type: date - jsonPath: .status.conditions[?(@.type=="Progressing")].lastTransitionTime - - name: Status - type: string - jsonPath: .status.conditions[?(@.type=="Progressing")].message - names: - plural: clusterversions - singular: clusterversion - kind: ClusterVersion diff --git a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_operatorhub.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_operatorhub.crd.yaml deleted file mode 100644 index 8ea625945a..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_operatorhub.crd.yaml +++ /dev/null @@ -1,105 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: operatorhubs.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: OperatorHub - listKind: OperatorHubList - plural: operatorhubs - singular: operatorhub - scope: Cluster - versions: - - name: v1 - subresources: - status: {} - served: true - storage: true - "schema": - "openAPIV3Schema": - description: OperatorHub is the Schema for the operatorhubs API. It can be - used to change the state of the default hub sources for OperatorHub on the - cluster from enabled to disabled and vice versa. - type: object - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OperatorHubSpec defines the desired state of OperatorHub - type: object - properties: - disableAllDefaultSources: - description: disableAllDefaultSources allows you to disable all the - default hub sources. If this is true, a specific entry in sources - can be used to enable a default source. If this is false, a specific - entry in sources can be used to disable or enable a default source. - type: boolean - sources: - description: sources is the list of default hub sources and their - configuration. If the list is empty, it implies that the default - hub sources are enabled on the cluster unless disableAllDefaultSources - is true. If disableAllDefaultSources is true and sources is not - empty, the configuration present in sources will take precedence. - The list of default hub sources and their current state will always - be reflected in the status block. - type: array - items: - description: HubSource is used to specify the hub source and its - configuration - type: object - properties: - disabled: - description: disabled is used to disable a default hub source - on cluster - type: boolean - name: - description: name is the name of one of the default hub sources - type: string - maxLength: 253 - minLength: 1 - status: - description: OperatorHubStatus defines the observed state of OperatorHub. - The current state of the default hub sources will always be reflected - here. - type: object - properties: - sources: - description: sources encapsulates the result of applying the configuration - for each hub source - type: array - items: - description: HubSourceStatus is used to reflect the current state - of applying the configuration to a default source - type: object - properties: - disabled: - description: disabled is used to disable a default hub source - on cluster - type: boolean - message: - description: message provides more information regarding failures - type: string - name: - description: name is the name of one of the default hub sources - type: string - maxLength: 253 - minLength: 1 - status: - description: status indicates success or failure in applying - the configuration - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml deleted file mode 100644 index ddd5d700de..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml +++ /dev/null @@ -1,103 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: proxies.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Proxy - listKind: ProxyList - plural: proxies - singular: proxy - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Proxy holds cluster-wide information on how to configure default - proxies for the cluster. The canonical name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec holds user-settable values for the proxy configuration - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. Empty - means unset and will not result in an env var. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS requests. Empty - means unset and will not result in an env var. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames and/or - CIDRs for which the proxy should not be used. Empty means unset - and will not result in an env var. - type: string - readinessEndpoints: - description: readinessEndpoints is a list of endpoints used to verify - readiness of the proxy. - type: array - items: - type: string - trustedCA: - description: "trustedCA is a reference to a ConfigMap containing a - CA certificate bundle. The trustedCA field should only be consumed - by a proxy validator. The validator is responsible for reading the - certificate bundle from the required key \"ca-bundle.crt\", merging - it with the system default trust bundle, and writing the merged - trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" - namespace. Clients that expect to make proxy connections must use - the trusted-ca-bundle for all HTTPS requests to the proxy, and may - use the trusted-ca-bundle for non-proxy HTTPS requests as well. - \n The namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". - Here is an example ConfigMap (in yaml): \n apiVersion: v1 kind: - ConfigMap metadata: name: user-ca-bundle namespace: openshift-config - \ data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- Custom - CA certificate bundle. -----END CERTIFICATE-----" - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS requests. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames and/or - CIDRs for which the proxy should not be used. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver.crd.yaml deleted file mode 100644 index bd730570ca..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver.crd.yaml +++ /dev/null @@ -1,260 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: apiservers.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: APIServer - singular: apiserver - plural: apiservers - listKind: APIServerList - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - "openAPIV3Schema": - description: APIServer holds configuration (like serving certificates, client - CA and CORS domains) shared by all API servers in the system, among them - especially kube-apiserver and openshift-apiserver. The canonical name of - an instance is 'cluster'. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - additionalCORSAllowedOrigins: - description: additionalCORSAllowedOrigins lists additional, user-defined - regular expressions describing hosts for which the API server allows - access using the CORS headers. This may be needed to access the - API and the integrated OAuth server from JavaScript applications. - The values are regular expressions that correspond to the Golang - regular expression language. - type: array - items: - type: string - audit: - description: audit specifies the settings for audit configuration - to be applied to all OpenShift-provided API servers in the cluster. - type: object - default: - profile: Default - properties: - profile: - description: "profile specifies the name of the desired audit - policy configuration to be deployed to all OpenShift-provided - API servers in the cluster. \n The following profiles are provided: - - Default: the existing default policy. - WriteRequestBodies: - like 'Default', but logs request and response HTTP payloads - for write requests (create, update, patch). - AllRequestBodies: - like 'WriteRequestBodies', but also logs request and response - HTTP payloads for read requests (get, list). \n If unset, the - 'Default' profile is used as the default." - type: string - default: Default - enum: - - Default - - WriteRequestBodies - - AllRequestBodies - clientCA: - description: 'clientCA references a ConfigMap containing a certificate - bundle for the signers that will be recognized for incoming client - certificates in addition to the operator managed signers. If this - is empty, then only operator managed signers are valid. You usually - only have to set this if you have your own PKI you wish to honor - client certificates from. The ConfigMap must exist in the openshift-config - namespace and contain the following required fields: - ConfigMap.Data["ca-bundle.crt"] - - CA bundle.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - encryption: - description: encryption allows the configuration of encryption of - resources at the datastore layer. - type: object - properties: - type: - description: "type defines what encryption type should be used - to encrypt resources at the datastore layer. When this field - is unset (i.e. when it is set to the empty string), identity - is implied. The behavior of unset can and will change over time. - \ Even if encryption is enabled by default, the meaning of unset - may change to a different encryption type based on changes in - best practices. \n When encryption is enabled, all sensitive - resources shipped with the platform are encrypted. This list - of sensitive resources can and will change over time. The current - authoritative list is: \n 1. secrets 2. configmaps 3. - routes.route.openshift.io 4. oauthaccesstokens.oauth.openshift.io - \ 5. oauthauthorizetokens.oauth.openshift.io" - type: string - enum: - - "" - - identity - - aescbc - servingCerts: - description: servingCert is the TLS cert info for serving secure traffic. - If not specified, operator managed certificates will be used for - serving secure traffic. - type: object - properties: - namedCertificates: - description: namedCertificates references secrets containing the - TLS cert info for serving secure traffic to specific hostnames. - If no named certificates are provided, or no named certificates - match the server name as understood by a client, the defaultServingCertificate - will be used. - type: array - items: - description: APIServerNamedServingCert maps a server DNS name, - as understood by a client, to a certificate. - type: object - properties: - names: - description: names is a optional list of explicit DNS names - (leading wildcards allowed) that should use this certificate - to serve secure traffic. If no names are provided, the - implicit names will be extracted from the certificates. - Exact names trump over wildcard names. Explicit names - defined here trump over extracted implicit names. - type: array - items: - type: string - servingCertificate: - description: 'servingCertificate references a kubernetes.io/tls - type secret containing the TLS cert info for serving secure - traffic. The secret must exist in the openshift-config - namespace and contain the following required fields: - - Secret.Data["tls.key"] - TLS private key. - Secret.Data["tls.crt"] - - TLS certificate.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - tlsSecurityProfile: - description: "tlsSecurityProfile specifies settings for TLS connections - for externally exposed servers. \n If unset, a default (which may - change between releases) is chosen. Note that only Old and Intermediate - profiles are currently supported, and the maximum available MinTLSVersions - is VersionTLS12." - type: object - properties: - custom: - description: "custom is a user-defined TLS security profile. Be - extremely careful using a custom profile as invalid configurations - can be catastrophic. An example custom profile looks like this: - \n ciphers: - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - \ - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 - \ minTLSVersion: TLSv1.1" - type: object - properties: - ciphers: - description: "ciphers is used to specify the cipher algorithms - that are negotiated during the TLS handshake. Operators - may remove entries their operands do not support. For example, - to use DES-CBC3-SHA (yaml): \n ciphers: - DES-CBC3-SHA" - type: array - items: - type: string - minTLSVersion: - description: "minTLSVersion is used to specify the minimal - version of the TLS protocol that is negotiated during the - TLS handshake. For example, to use TLS versions 1.1, 1.2 - and 1.3 (yaml): \n minTLSVersion: TLSv1.1 \n NOTE: currently - the highest minTLSVersion allowed is VersionTLS12" - type: string - enum: - - VersionTLS10 - - VersionTLS11 - - VersionTLS12 - - VersionTLS13 - nullable: true - intermediate: - description: "intermediate is a TLS security profile based on: - \n https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29 - \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - \ - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - \ - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - \ - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - \ - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - \ - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 - \ minTLSVersion: TLSv1.2" - type: object - nullable: true - modern: - description: "modern is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility - \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - \ - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - \ minTLSVersion: TLSv1.3 \n NOTE: Currently unsupported." - type: object - nullable: true - old: - description: "old is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility - \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - \ - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - \ - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - \ - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - \ - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - \ - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 - \ - DHE-RSA-CHACHA20-POLY1305 - ECDHE-ECDSA-AES128-SHA256 - \ - ECDHE-RSA-AES128-SHA256 - ECDHE-ECDSA-AES128-SHA - \ - ECDHE-RSA-AES128-SHA - ECDHE-ECDSA-AES256-SHA384 - \ - ECDHE-RSA-AES256-SHA384 - ECDHE-ECDSA-AES256-SHA - \ - ECDHE-RSA-AES256-SHA - DHE-RSA-AES128-SHA256 - - DHE-RSA-AES256-SHA256 - AES128-GCM-SHA256 - AES256-GCM-SHA384 - \ - AES128-SHA256 - AES256-SHA256 - AES128-SHA - - AES256-SHA - DES-CBC3-SHA minTLSVersion: TLSv1.0" - type: object - nullable: true - type: - description: "type is one of Old, Intermediate, Modern or Custom. - Custom provides the ability to specify individual TLS security - profile parameters. Old, Intermediate and Modern are TLS security - profiles based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations - \n The profiles are intent based, so they may change over time - as new ciphers are developed and existing ciphers are found - to be insecure. Depending on precisely which ciphers are available - to a process, the list may be reduced. \n Note that the Modern - profile is currently not supported because it is not yet well - adopted by common software libraries." - type: string - enum: - - Old - - Intermediate - - Modern - - Custom - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml deleted file mode 100644 index b90d578f3e..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml +++ /dev/null @@ -1,161 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: authentications.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Authentication - listKind: AuthenticationList - plural: authentications - singular: authentication - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Authentication specifies cluster-wide settings for authentication - (like OAuth and webhook token authenticators). The canonical name of an - instance is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - oauthMetadata: - description: 'oauthMetadata contains the discovery endpoint data for - OAuth 2.0 Authorization Server Metadata for an external OAuth server. - This discovery document can be viewed from its served location: - oc get --raw ''/.well-known/oauth-authorization-server'' For further - details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 - If oauthMetadata.name is non-empty, this value has precedence over - any metadata reference stored in status. The key "oauthMetadata" - is used to locate the data. If specified and the config map or expected - key is not found, no metadata is served. If the specified metadata - is not valid, no metadata is served. The namespace for this config - map is openshift-config.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - serviceAccountIssuer: - description: 'serviceAccountIssuer is the identifier of the bound - service account token issuer. The default is https://kubernetes.default.svc - WARNING: Updating this field will result in the invalidation of - all bound tokens with the previous issuer value. Unless the holder - of a bound token has explicit support for a change in issuer, they - will not request a new bound token until pod restart or until their - existing token exceeds 80% of its duration.' - type: string - type: - description: type identifies the cluster managed, user facing authentication - mode in use. Specifically, it manages the component that responds - to login attempts. The default is IntegratedOAuth. - type: string - webhookTokenAuthenticator: - description: webhookTokenAuthenticator configures a remote token reviewer. - These remote authentication webhooks can be used to verify bearer - tokens via the tokenreviews.authentication.k8s.io REST API. This - is required to honor bearer tokens that are provisioned by an external - authentication service. - type: object - required: - - kubeConfig - properties: - kubeConfig: - description: "kubeConfig references a secret that contains kube - config file data which describes how to access the remote webhook - service. The namespace for the referenced secret is openshift-config. - \n For further details, see: \n https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication - \n The key \"kubeConfig\" is used to locate the data. If the - secret or expected key is not found, the webhook is not honored. - If the specified kube config data is not valid, the webhook - is not honored." - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - webhookTokenAuthenticators: - description: webhookTokenAuthenticators is DEPRECATED, setting it - has no effect. - type: array - items: - description: deprecatedWebhookTokenAuthenticator holds the necessary - configuration options for a remote token authenticator. It's the - same as WebhookTokenAuthenticator but it's missing the 'required' - validation on KubeConfig field. - type: object - properties: - kubeConfig: - description: 'kubeConfig contains kube config file data which - describes how to access the remote webhook service. For further - details, see: https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication - The key "kubeConfig" is used to locate the data. If the secret - or expected key is not found, the webhook is not honored. - If the specified kube config data is not valid, the webhook - is not honored. The namespace for this secret is determined - by the point of use.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - integratedOAuthMetadata: - description: 'integratedOAuthMetadata contains the discovery endpoint - data for OAuth 2.0 Authorization Server Metadata for the in-cluster - integrated OAuth server. This discovery document can be viewed from - its served location: oc get --raw ''/.well-known/oauth-authorization-server'' - For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 - This contains the observed value based on cluster state. An explicitly - set value in spec.oauthMetadata has precedence over this field. - This field has no meaning if authentication spec.type is not set - to IntegratedOAuth. The key "oauthMetadata" is used to locate the - data. If the config map or expected key is not found, no metadata - is served. If the specified metadata is not valid, no metadata is - served. The namespace for this config map is openshift-config-managed.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml deleted file mode 100644 index fd0eea93c3..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml +++ /dev/null @@ -1,400 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: builds.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - preserveUnknownFields: false - names: - kind: Build - singular: build - plural: builds - listKind: BuildList - versions: - - name: v1 - subresources: - status: {} - served: true - storage: true - "schema": - "openAPIV3Schema": - description: "Build configures the behavior of OpenShift builds for the entire - cluster. This includes default settings that can be overridden in BuildConfig - objects, and overrides which are applied to all builds. \n The canonical - name is \"cluster\"" - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec holds user-settable values for the build controller - configuration - type: object - properties: - additionalTrustedCA: - description: "AdditionalTrustedCA is a reference to a ConfigMap containing - additional CAs that should be trusted for image pushes and pulls - during builds. The namespace for this config map is openshift-config. - \n DEPRECATED: Additional CAs for image pull and push should be - set on image.config.openshift.io/cluster instead." - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - buildDefaults: - description: BuildDefaults controls the default information for Builds - type: object - properties: - defaultProxy: - description: "DefaultProxy contains the default proxy settings - for all build operations, including image pull/push and source - download. \n Values can be overrode by setting the `HTTP_PROXY`, - `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build - config's strategy." - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. Empty - means unset and will not result in an env var. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS - requests. Empty means unset and will not result in an env - var. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames - and/or CIDRs for which the proxy should not be used. Empty - means unset and will not result in an env var. - type: string - readinessEndpoints: - description: readinessEndpoints is a list of endpoints used - to verify readiness of the proxy. - type: array - items: - type: string - trustedCA: - description: "trustedCA is a reference to a ConfigMap containing - a CA certificate bundle. The trustedCA field should only - be consumed by a proxy validator. The validator is responsible - for reading the certificate bundle from the required key - \"ca-bundle.crt\", merging it with the system default trust - bundle, and writing the merged trust bundle to a ConfigMap - named \"trusted-ca-bundle\" in the \"openshift-config-managed\" - namespace. Clients that expect to make proxy connections - must use the trusted-ca-bundle for all HTTPS requests to - the proxy, and may use the trusted-ca-bundle for non-proxy - HTTPS requests as well. \n The namespace for the ConfigMap - referenced by trustedCA is \"openshift-config\". Here is - an example ConfigMap (in yaml): \n apiVersion: v1 kind: - ConfigMap metadata: name: user-ca-bundle namespace: openshift-config - \ data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- - \ Custom CA certificate bundle. -----END CERTIFICATE-----" - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - env: - description: Env is a set of default environment variables that - will be applied to the build if the specified variables do not - exist on the build - type: array - items: - description: EnvVar represents an environment variable present - in a Container. - type: object - required: - - name - properties: - name: - description: Name of the environment variable. Must be a - C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in the - container and any service environment variables. If a - variable cannot be resolved, the reference in the input - string will be unchanged. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - type: object - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - type: object - required: - - key - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, - metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - type: object - required: - - fieldPath - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - resourceFieldRef: - description: 'Selects a resource of the container: only - resources limits and requests (limits.cpu, limits.memory, - limits.ephemeral-storage, requests.cpu, requests.memory - and requests.ephemeral-storage) are currently supported.' - type: object - required: - - resource - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - type: object - required: - - key - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - gitProxy: - description: "GitProxy contains the proxy settings for git operations - only. If set, this will override any Proxy settings for all - git commands, such as git clone. \n Values that are not set - here will be inherited from DefaultProxy." - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. Empty - means unset and will not result in an env var. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS - requests. Empty means unset and will not result in an env - var. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames - and/or CIDRs for which the proxy should not be used. Empty - means unset and will not result in an env var. - type: string - readinessEndpoints: - description: readinessEndpoints is a list of endpoints used - to verify readiness of the proxy. - type: array - items: - type: string - trustedCA: - description: "trustedCA is a reference to a ConfigMap containing - a CA certificate bundle. The trustedCA field should only - be consumed by a proxy validator. The validator is responsible - for reading the certificate bundle from the required key - \"ca-bundle.crt\", merging it with the system default trust - bundle, and writing the merged trust bundle to a ConfigMap - named \"trusted-ca-bundle\" in the \"openshift-config-managed\" - namespace. Clients that expect to make proxy connections - must use the trusted-ca-bundle for all HTTPS requests to - the proxy, and may use the trusted-ca-bundle for non-proxy - HTTPS requests as well. \n The namespace for the ConfigMap - referenced by trustedCA is \"openshift-config\". Here is - an example ConfigMap (in yaml): \n apiVersion: v1 kind: - ConfigMap metadata: name: user-ca-bundle namespace: openshift-config - \ data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- - \ Custom CA certificate bundle. -----END CERTIFICATE-----" - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - imageLabels: - description: ImageLabels is a list of docker labels that are applied - to the resulting image. User can override a default label by - providing a label with the same name in their Build/BuildConfig. - type: array - items: - type: object - properties: - name: - description: Name defines the name of the label. It must - have non-zero length. - type: string - value: - description: Value defines the literal value of the label. - type: string - resources: - description: Resources defines resource requirements to execute - the build. - type: object - properties: - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - buildOverrides: - description: BuildOverrides controls override settings for builds - type: object - properties: - forcePull: - description: ForcePull overrides, if set, the equivalent value - in the builds, i.e. false disables force pull for all builds, - true enables force pull for all builds, independently of what - each build specifies itself - type: boolean - imageLabels: - description: ImageLabels is a list of docker labels that are applied - to the resulting image. If user provided a label in their Build/BuildConfig - with the same name as one in this list, the user's label will - be overwritten. - type: array - items: - type: object - properties: - name: - description: Name defines the name of the label. It must - have non-zero length. - type: string - value: - description: Value defines the literal value of the label. - type: string - nodeSelector: - description: NodeSelector is a selector which must be true for - the build pod to fit on a node - type: object - additionalProperties: - type: string - tolerations: - description: Tolerations is a list of Tolerations that will override - any existing tolerations set on a build pod. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, allowed - values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match - all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to - the value. Valid operators are Exists and Equal. Defaults - to Equal. Exists is equivalent to wildcard for value, - so that a pod can tolerate all taints of a particular - category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of - time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the taint - forever (do not evict). Zero and negative values will - be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml deleted file mode 100644 index d7084ba8f7..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml +++ /dev/null @@ -1,73 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: consoles.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - scope: Cluster - group: config.openshift.io - names: - kind: Console - listKind: ConsoleList - plural: consoles - singular: console - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Console holds cluster-wide configuration for the web console, - including the logout URL, and reports the public URL of the console. The - canonical name is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - authentication: - description: ConsoleAuthentication defines a list of optional configuration - for console authentication. - type: object - properties: - logoutRedirect: - description: 'An optional, absolute URL to redirect web browsers - to after logging out of the console. If not specified, it will - redirect to the default login page. This is required when using - an identity provider that supports single sign-on (SSO) such - as: - OpenID (Keycloak, Azure) - RequestHeader (GSSAPI, SSPI, - SAML) - OAuth (GitHub, GitLab, Google) Logging out of the console - will destroy the user''s token. The logoutRedirect provides - the user the option to perform single logout (SLO) through the - identity provider to destroy their single sign-on session.' - type: string - pattern: ^$|^((https):\/\/?)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/?))$ - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - consoleURL: - description: The URL for the console. This will be derived from the - host for the route that is created for the console. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml deleted file mode 100644 index c05562e64a..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml +++ /dev/null @@ -1,103 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: dnses.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: DNS - listKind: DNSList - plural: dnses - singular: dns - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - "schema": - "openAPIV3Schema": - description: DNS holds cluster-wide information about DNS. The canonical name - is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - baseDomain: - description: "baseDomain is the base domain of the cluster. All managed - DNS records will be sub-domains of this base. \n For example, given - the base domain `openshift.example.com`, an API server DNS record - may be created for `cluster-api.openshift.example.com`. \n Once - set, this field cannot be changed." - type: string - privateZone: - description: "privateZone is the location where all the DNS records - that are only available internally to the cluster exist. \n If this - field is nil, no private records should be created. \n Once set, - this field cannot be changed." - type: object - properties: - id: - description: "id is the identifier that can be used to find the - DNS hosted zone. \n on AWS zone can be fetched using `ID` as - id in [1] on Azure zone can be fetched using `ID` as a pre-determined - name in [2], on GCP zone can be fetched using `ID` as a pre-determined - name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options - [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show - [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get" - type: string - tags: - description: "tags can be used to query the DNS hosted zone. \n - on AWS, resourcegroupstaggingapi [1] can be used to fetch a - zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options" - type: object - additionalProperties: - type: string - publicZone: - description: "publicZone is the location where all the DNS records - that are publicly accessible to the internet exist. \n If this field - is nil, no public records should be created. \n Once set, this field - cannot be changed." - type: object - properties: - id: - description: "id is the identifier that can be used to find the - DNS hosted zone. \n on AWS zone can be fetched using `ID` as - id in [1] on Azure zone can be fetched using `ID` as a pre-determined - name in [2], on GCP zone can be fetched using `ID` as a pre-determined - name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options - [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show - [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get" - type: string - tags: - description: "tags can be used to query the DNS hosted zone. \n - on AWS, resourcegroupstaggingapi [1] can be used to fetch a - zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options" - type: object - additionalProperties: - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml deleted file mode 100644 index 8bba554b46..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml +++ /dev/null @@ -1,78 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: featuregates.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: FeatureGate - listKind: FeatureGateList - plural: featuregates - singular: featuregate - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Feature holds cluster-wide information about feature gates. The - canonical name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - customNoUpgrade: - description: customNoUpgrade allows the enabling or disabling of any - feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE - UNDONE, and PREVENTS UPGRADES. Because of its nature, this setting - cannot be validated. If you have any typos or accidentally apply - invalid combinations your cluster may fail in an unrecoverable way. featureSet - must equal "CustomNoUpgrade" must be set to use this field. - type: object - properties: - disabled: - description: disabled is a list of all feature gates that you - want to force off - type: array - items: - type: string - enabled: - description: enabled is a list of all feature gates that you want - to force on - type: array - items: - type: string - nullable: true - featureSet: - description: featureSet changes the list of features in the cluster. The - default is empty. Be very careful adjusting this setting. Turning - on or off features may cause irreversible changes in your cluster - which cannot be undone. - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml deleted file mode 100644 index daed0de9fe..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml +++ /dev/null @@ -1,161 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: images.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Image - singular: image - plural: images - listKind: ImageList - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Image governs policies related to imagestream imports and runtime - configuration for external registries. It allows cluster admins to configure - which registries OpenShift is allowed to import images from, extra CA trust - bundles for external registries, and policies to block or allow registry - hostnames. When exposing OpenShift's image registry to the public, this - also lets cluster admins specify the external hostname. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - additionalTrustedCA: - description: additionalTrustedCA is a reference to a ConfigMap containing - additional CAs that should be trusted during imagestream import, - pod image pull, build image pull, and imageregistry pullthrough. - The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - allowedRegistriesForImport: - description: allowedRegistriesForImport limits the container image - registries that normal users may import images from. Set this list - to the registries that you trust to contain valid Docker images - and that you want applications to be able to import from. Users - with permission to create Images or ImageStreamMappings via the - API are not affected by this policy - typically only administrators - or system integrations will have those permissions. - type: array - items: - description: RegistryLocation contains a location of the registry - specified by the registry domain name. The domain name might include - wildcards, like '*' or '??'. - type: object - properties: - domainName: - description: domainName specifies a domain name for the registry - In case the registry use non-standard (80 or 443) port, the - port should be included in the domain name as well. - type: string - insecure: - description: insecure indicates whether the registry is secure - (https) or insecure (http) By default (if not specified) the - registry is assumed as secure. - type: boolean - externalRegistryHostnames: - description: externalRegistryHostnames provides the hostnames for - the default external image registry. The external hostname should - be set only when the image registry is exposed externally. The first - value is used in 'publicDockerImageRepository' field in ImageStreams. - The value must be in "hostname[:port]" format. - type: array - items: - type: string - registrySources: - description: registrySources contains configuration that determines - how the container runtime should treat individual registries when - accessing images for builds+pods. (e.g. whether or not to allow - insecure access). It does not contain configuration for the internal - cluster registry. - type: object - properties: - allowedRegistries: - description: "allowedRegistries are the only registries permitted - for image pull and push actions. All other registries are denied. - \n Only one of BlockedRegistries or AllowedRegistries may be - set." - type: array - items: - type: string - blockedRegistries: - description: "blockedRegistries cannot be used for image pull - and push actions. All other registries are permitted. \n Only - one of BlockedRegistries or AllowedRegistries may be set." - type: array - items: - type: string - containerRuntimeSearchRegistries: - description: 'containerRuntimeSearchRegistries are registries - that will be searched when pulling images that do not have fully - qualified domains in their pull specs. Registries will be searched - in the order provided in the list. Note: this search list only - works with the container runtime, i.e CRI-O. Will NOT work with - builds or imagestream imports.' - type: array - format: hostname - minItems: 1 - items: - type: string - x-kubernetes-list-type: set - insecureRegistries: - description: insecureRegistries are registries which do not have - a valid TLS certificates or only support HTTP connections. - type: array - items: - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - externalRegistryHostnames: - description: externalRegistryHostnames provides the hostnames for - the default external image registry. The external hostname should - be set only when the image registry is exposed externally. The first - value is used in 'publicDockerImageRepository' field in ImageStreams. - The value must be in "hostname[:port]" format. - type: array - items: - type: string - internalRegistryHostname: - description: internalRegistryHostname sets the hostname for the default - internal image registry. The value must be in "hostname[:port]" - format. This value is set by the image registry operator which controls - the internal registry hostname. For backward compatibility, users - can still use OPENSHIFT_DEFAULT_REGISTRY environment variable but - this setting overrides the environment variable. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml deleted file mode 100644 index d8623cd85f..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml +++ /dev/null @@ -1,541 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: infrastructures.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: Infrastructure - listKind: InfrastructureList - plural: infrastructures - singular: infrastructure - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Infrastructure holds cluster-wide information about Infrastructure. The - canonical name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - cloudConfig: - description: "cloudConfig is a reference to a ConfigMap containing - the cloud provider configuration file. This configuration file is - used to configure the Kubernetes cloud provider integration when - using the built-in cloud provider integration or the external cloud - controller manager. The namespace for this config map is openshift-config. - \n cloudConfig should only be consumed by the kube_cloud_config - controller. The controller is responsible for using the user configuration - in the spec for various platforms and combining that with the user - provided ConfigMap in this field to create a stitched kube cloud - config. The controller generates a ConfigMap `kube-cloud-config` - in `openshift-config-managed` namespace with the kube cloud config - is stored in `cloud.conf` key. All the clients are expected to use - the generated ConfigMap only." - type: object - properties: - key: - description: Key allows pointing to a specific key/value inside - of the configmap. This is useful for logical file references. - type: string - name: - type: string - platformSpec: - description: platformSpec holds desired information specific to the - underlying infrastructure provider. - type: object - properties: - aws: - description: AWS contains settings specific to the Amazon Web - Services infrastructure provider. - type: object - properties: - serviceEndpoints: - description: serviceEndpoints list contains custom endpoints - which will override default service endpoint of AWS Services. - There must be only one ServiceEndpoint for a service. - type: array - items: - description: AWSServiceEndpoint store the configuration - of a custom url to override existing defaults of AWS Services. - type: object - properties: - name: - description: name is the name of the AWS service. The - list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html - This must be provided and cannot be empty. - type: string - pattern: ^[a-z0-9-]+$ - url: - description: url is fully qualified URI with scheme - https, that overrides the default generated endpoint - for a client. This must be provided and cannot be - empty. - type: string - pattern: ^https:// - azure: - description: Azure contains settings specific to the Azure infrastructure - provider. - type: object - baremetal: - description: BareMetal contains settings specific to the BareMetal - platform. - type: object - equinixMetal: - description: EquinixMetal contains settings specific to the Equinix - Metal infrastructure provider. - type: object - gcp: - description: GCP contains settings specific to the Google Cloud - Platform infrastructure provider. - type: object - ibmcloud: - description: IBMCloud contains settings specific to the IBMCloud - infrastructure provider. - type: object - kubevirt: - description: Kubevirt contains settings specific to the kubevirt - infrastructure provider. - type: object - openstack: - description: OpenStack contains settings specific to the OpenStack - infrastructure provider. - type: object - ovirt: - description: Ovirt contains settings specific to the oVirt infrastructure - provider. - type: object - type: - description: type is the underlying infrastructure provider for - the cluster. This value controls whether infrastructure automation - such as service load balancers, dynamic volume provisioning, - machine creation and deletion, and other integrations are enabled. - If None, no infrastructure automation is enabled. Allowed values - are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", "OpenStack", - "VSphere", "oVirt", "KubeVirt", "EquinixMetal", and "None". - Individual components may not support all platforms, and must - handle unrecognized platforms as None if they do not support - that platform. - type: string - enum: - - "" - - AWS - - Azure - - BareMetal - - GCP - - Libvirt - - OpenStack - - None - - VSphere - - oVirt - - IBMCloud - - KubeVirt - - EquinixMetal - vsphere: - description: VSphere contains settings specific to the VSphere - infrastructure provider. - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - apiServerInternalURI: - description: apiServerInternalURL is a valid URI with scheme 'https', - address and optionally a port (defaulting to 443). apiServerInternalURL - can be used by components like kubelets, to contact the Kubernetes - API server using the infrastructure provider rather than Kubernetes - networking. - type: string - apiServerURL: - description: apiServerURL is a valid URI with scheme 'https', address - and optionally a port (defaulting to 443). apiServerURL can be - used by components like the web console to tell users where to find - the Kubernetes API. - type: string - controlPlaneTopology: - description: controlPlaneTopology expresses the expectations for operands - that normally run on control nodes. The default is 'HighlyAvailable', - which represents the behavior operators have in a "normal" cluster. - The 'SingleReplica' mode will be used in single-node deployments - and the operators should not configure the operand for highly-available - operation - type: string - default: HighlyAvailable - enum: - - HighlyAvailable - - SingleReplica - etcdDiscoveryDomain: - description: 'etcdDiscoveryDomain is the domain used to fetch the - SRV records for discovering etcd servers and clients. For more info: - https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery - deprecated: as of 4.7, this field is no longer set or honored. It - will be removed in a future release.' - type: string - infrastructureName: - description: infrastructureName uniquely identifies a cluster with - a human friendly name. Once set it should not be changed. Must be - of max length 27 and must have only alphanumeric or hyphen characters. - type: string - infrastructureTopology: - description: infrastructureTopology expresses the expectations for - infrastructure services that do not run on control plane nodes, - usually indicated by a node selector for a `role` value other than - `master`. The default is 'HighlyAvailable', which represents the - behavior operators have in a "normal" cluster. The 'SingleReplica' - mode will be used in single-node deployments and the operators should - not configure the operand for highly-available operation - type: string - default: HighlyAvailable - enum: - - HighlyAvailable - - SingleReplica - platform: - description: "platform is the underlying infrastructure provider for - the cluster. \n Deprecated: Use platformStatus.type instead." - type: string - enum: - - "" - - AWS - - Azure - - BareMetal - - GCP - - Libvirt - - OpenStack - - None - - VSphere - - oVirt - - IBMCloud - - KubeVirt - - EquinixMetal - platformStatus: - description: platformStatus holds status information specific to the - underlying infrastructure provider. - type: object - properties: - aws: - description: AWS contains settings specific to the Amazon Web - Services infrastructure provider. - type: object - properties: - region: - description: region holds the default AWS region for new AWS - resources created by the cluster. - type: string - resourceTags: - description: resourceTags is a list of additional tags to - apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html - for information on tagging AWS resources. AWS supports a - maximum of 50 tags per resource. OpenShift reserves 25 tags - for its use, leaving 25 tags available for the user. - type: array - maxItems: 25 - items: - description: AWSResourceTag is a tag to apply to AWS resources - created for the cluster. - type: object - required: - - key - - value - properties: - key: - description: key is the key of the tag - type: string - maxLength: 128 - minLength: 1 - pattern: ^[0-9A-Za-z_.:/=+-@]+$ - value: - description: value is the value of the tag. Some AWS - service do not support empty values. Since tags are - added to resources in many services, the length of - the tag value must meet the requirements of all services. - type: string - maxLength: 256 - minLength: 1 - pattern: ^[0-9A-Za-z_.:/=+-@]+$ - serviceEndpoints: - description: ServiceEndpoints list contains custom endpoints - which will override default service endpoint of AWS Services. - There must be only one ServiceEndpoint for a service. - type: array - items: - description: AWSServiceEndpoint store the configuration - of a custom url to override existing defaults of AWS Services. - type: object - properties: - name: - description: name is the name of the AWS service. The - list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html - This must be provided and cannot be empty. - type: string - pattern: ^[a-z0-9-]+$ - url: - description: url is fully qualified URI with scheme - https, that overrides the default generated endpoint - for a client. This must be provided and cannot be - empty. - type: string - pattern: ^https:// - azure: - description: Azure contains settings specific to the Azure infrastructure - provider. - type: object - properties: - cloudName: - description: cloudName is the name of the Azure cloud environment - which can be used to configure the Azure SDK with the appropriate - Azure API endpoints. If empty, the value is equal to `AzurePublicCloud`. - type: string - enum: - - "" - - AzurePublicCloud - - AzureUSGovernmentCloud - - AzureChinaCloud - - AzureGermanCloud - networkResourceGroupName: - description: networkResourceGroupName is the Resource Group - for network resources like the Virtual Network and Subnets - used by the cluster. If empty, the value is same as ResourceGroupName. - type: string - resourceGroupName: - description: resourceGroupName is the Resource Group for new - Azure resources created for the cluster. - type: string - baremetal: - description: BareMetal contains settings specific to the BareMetal - platform. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: nodeDNSIP is the IP address for the internal - DNS used by the nodes. Unlike the one managed by the DNS - operator, `NodeDNSIP` provides name resolution for the nodes - themselves. There is no DNS-as-a-service for BareMetal deployments. - In order to minimize necessary changes to the datacenter - DNS, a DNS service is hosted as a static pod to serve those - hostnames to the nodes in the cluster. - type: string - equinixMetal: - description: EquinixMetal contains settings specific to the Equinix - Metal infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - gcp: - description: GCP contains settings specific to the Google Cloud - Platform infrastructure provider. - type: object - properties: - projectID: - description: resourceGroupName is the Project ID for new GCP - resources created for the cluster. - type: string - region: - description: region holds the region for new GCP resources - created for the cluster. - type: string - ibmcloud: - description: IBMCloud contains settings specific to the IBMCloud - infrastructure provider. - type: object - properties: - location: - description: Location is where the cluster has been deployed - type: string - providerType: - description: ProviderType indicates the type of cluster that - was created - type: string - resourceGroupName: - description: ResourceGroupName is the Resource Group for new - IBMCloud resources created for the cluster. - type: string - kubevirt: - description: Kubevirt contains settings specific to the kubevirt - infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - openstack: - description: OpenStack contains settings specific to the OpenStack - infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - cloudName: - description: cloudName is the name of the desired OpenStack - cloud in the client configuration file (`clouds.yaml`). - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: nodeDNSIP is the IP address for the internal - DNS used by the nodes. Unlike the one managed by the DNS - operator, `NodeDNSIP` provides name resolution for the nodes - themselves. There is no DNS-as-a-service for OpenStack deployments. - In order to minimize necessary changes to the datacenter - DNS, a DNS service is hosted as a static pod to serve those - hostnames to the nodes in the cluster. - type: string - ovirt: - description: Ovirt contains settings specific to the oVirt infrastructure - provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: 'deprecated: as of 4.6, this field is no longer - set or honored. It will be removed in a future release.' - type: string - type: - description: "type is the underlying infrastructure provider for - the cluster. This value controls whether infrastructure automation - such as service load balancers, dynamic volume provisioning, - machine creation and deletion, and other integrations are enabled. - If None, no infrastructure automation is enabled. Allowed values - are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", - \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", and - \"None\". Individual components may not support all platforms, - and must handle unrecognized platforms as None if they do not - support that platform. \n This value will be synced with to - the `status.platform` and `status.platformStatus.type`. Currently - this value cannot be changed once set." - type: string - enum: - - "" - - AWS - - Azure - - BareMetal - - GCP - - Libvirt - - OpenStack - - None - - VSphere - - oVirt - - IBMCloud - - KubeVirt - - EquinixMetal - vsphere: - description: VSphere contains settings specific to the VSphere - infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: nodeDNSIP is the IP address for the internal - DNS used by the nodes. Unlike the one managed by the DNS - operator, `NodeDNSIP` provides name resolution for the nodes - themselves. There is no DNS-as-a-service for vSphere deployments. - In order to minimize necessary changes to the datacenter - DNS, a DNS service is hosted as a static pod to serve those - hostnames to the nodes in the cluster. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml deleted file mode 100644 index 7c1b4f6d7b..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml +++ /dev/null @@ -1,299 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ingresses.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: Ingress - listKind: IngressList - plural: ingresses - singular: ingress - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - "schema": - "openAPIV3Schema": - description: Ingress holds cluster-wide information about ingress, including - the default ingress domain used for routes. The canonical name is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - appsDomain: - description: appsDomain is an optional domain to use instead of the - one specified in the domain field when a Route is created without - specifying an explicit host. If appsDomain is nonempty, this value - is used to generate default host values for Route. Unlike domain, - appsDomain may be modified after installation. This assumes a new - ingresscontroller has been setup with a wildcard certificate. - type: string - componentRoutes: - description: "componentRoutes is an optional list of routes that are - managed by OpenShift components that a cluster-admin is able to - configure the hostname and serving certificate for. The namespace - and name of each route in this list should match an existing entry - in the status.componentRoutes list. \n To determine the set of configurable - Routes, look at namespace and name of entries in the .status.componentRoutes - list, where participating operators write the status of configurable - routes." - type: array - items: - description: ComponentRouteSpec allows for configuration of a route's - hostname and serving certificate. - type: object - required: - - hostname - - name - - namespace - properties: - hostname: - description: hostname is the hostname that should be used by - the route. - type: string - format: hostname - name: - description: "name is the logical name of the route to customize. - \n The namespace and name of this componentRoute must match - a corresponding entry in the list of status.componentRoutes - if the route is to be customized." - type: string - maxLength: 256 - minLength: 1 - namespace: - description: "namespace is the namespace of the route to customize. - \n The namespace and name of this componentRoute must match - a corresponding entry in the list of status.componentRoutes - if the route is to be customized." - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - servingCertKeyPairSecret: - description: servingCertKeyPairSecret is a reference to a secret - of type `kubernetes.io/tls` in the openshift-config namespace. - The serving cert/key pair must match and will be used by the - operator to fulfill the intent of serving with this name. - If the custom hostname uses the default routing suffix of - the cluster, the Secret specification for a serving certificate - will not be needed. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - domain: - description: "domain is used to generate a default host name for a - route when the route's host name is empty. The generated host name - will follow this pattern: \"..\". - \n It is also used as the default wildcard domain suffix for ingress. - The default ingresscontroller domain will follow this pattern: \"*.\". - \n Once set, changing domain is not currently supported." - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - componentRoutes: - description: componentRoutes is where participating operators place - the current route status for routes whose hostnames and serving - certificates can be customized by the cluster-admin. - type: array - items: - description: ComponentRouteStatus contains information allowing - configuration of a route's hostname and serving certificate. - type: object - required: - - defaultHostname - - name - - namespace - - relatedObjects - properties: - conditions: - description: "conditions are used to communicate the state of - the componentRoutes entry. \n Supported conditions include - Available, Degraded and Progressing. \n If available is true, - the content served by the route can be accessed by users. - This includes cases where a default may continue to serve - content while the customized route specified by the cluster-admin - is being configured. \n If Degraded is true, that means something - has gone wrong trying to handle the componentRoutes entry. - The currentHostnames field may or may not be in effect. \n - If Progressing is true, that means the component is taking - some action related to the componentRoutes entry." - type: array - items: - description: "Condition contains details for one aspect of - the current state of this API Resource. --- This struct - is intended for direct use as an array at the field path - .status.conditions. For example, type FooStatus struct{ - \ // Represents the observations of a foo's current state. - \ // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // - +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - type: object - required: - - lastTransitionTime - - message - - reason - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should - be when the underlying condition changed. If that is - not known, then using the time when the API field changed - is acceptable. - type: string - format: date-time - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - type: string - maxLength: 32768 - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, - if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the - current state of the instance. - type: integer - format: int64 - minimum: 0 - reason: - description: reason contains a programmatic identifier - indicating the reason for the condition's last transition. - Producers of specific condition types may define expected - values and meanings for this field, and whether the - values are considered a guaranteed API. The value should - be a CamelCase string. This field may not be empty. - type: string - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - status: - description: status of the condition, one of True, False, - Unknown. - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across - resources like Available, but because arbitrary conditions - can be useful (see .node.status.conditions), the ability - to deconflict is important. The regex it matches is - (dns1123SubdomainFmt/)?(qualifiedNameFmt) - type: string - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - consumingUsers: - description: consumingUsers is a slice of ServiceAccounts that - need to have read permission on the servingCertKeyPairSecret - secret. - type: array - maxItems: 5 - items: - description: ConsumingUser is an alias for string which we - add validation to. Currently only service accounts are supported. - type: string - maxLength: 512 - minLength: 1 - pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - currentHostnames: - description: currentHostnames is the list of current names used - by the route. Typically, this list should consist of a single - hostname, but if multiple hostnames are supported by the route - the operator may write multiple entries to this list. - type: array - minItems: 1 - items: - description: Hostname is an alias for hostname string validation. - type: string - format: hostname - defaultHostname: - description: defaultHostname is the hostname of this route prior - to customization. - type: string - format: hostname - name: - description: "name is the logical name of the route to customize. - It does not have to be the actual name of a route resource - but it cannot be renamed. \n The namespace and name of this - componentRoute must match a corresponding entry in the list - of spec.componentRoutes if the route is to be customized." - type: string - maxLength: 256 - minLength: 1 - namespace: - description: "namespace is the namespace of the route to customize. - It must be a real namespace. Using an actual namespace ensures - that no two components will conflict and the same component - can be installed multiple times. \n The namespace and name - of this componentRoute must match a corresponding entry in - the list of spec.componentRoutes if the route is to be customized." - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - relatedObjects: - description: relatedObjects is a list of resources which are - useful when debugging or inspecting how spec.componentRoutes - is applied. - type: array - minItems: 1 - items: - description: ObjectReference contains enough information to - let you inspect or modify the referred object. - type: object - required: - - group - - name - - resource - properties: - group: - description: group of the referent. - type: string - name: - description: name of the referent. - type: string - namespace: - description: namespace of the referent. - type: string - resource: - description: resource of the referent. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml deleted file mode 100644 index 10eb476ede..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml +++ /dev/null @@ -1,172 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: networks.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: Network - listKind: NetworkList - plural: networks - singular: network - scope: Cluster - preserveUnknownFields: false - versions: - - name: v1 - served: true - storage: true - "schema": - "openAPIV3Schema": - description: 'Network holds cluster-wide information about Network. The canonical - name is `cluster`. It is used to configure the desired network configuration, - such as: IP address pools for services/pod IPs, network plugin, etc. Please - view network.spec for an explanation on what applies when configuring this - resource.' - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration. As a general - rule, this SHOULD NOT be read directly. Instead, you should consume - the NetworkStatus, as it indicates the currently deployed configuration. - Currently, most spec fields are immutable after installation. Please - view the individual ones for further details on each. - type: object - properties: - clusterNetwork: - description: IP address pool to use for pod IPs. This field is immutable - after installation. - type: array - items: - description: ClusterNetworkEntry is a contiguous block of IP addresses - from which pod IPs are allocated. - type: object - properties: - cidr: - description: The complete block for pod IPs. - type: string - hostPrefix: - description: The size (prefix) of block to allocate to each - node. If this field is not used by the plugin, it can be left - unset. - type: integer - format: int32 - minimum: 0 - externalIP: - description: externalIP defines configuration for controllers that - affect Service.ExternalIP. If nil, then ExternalIP is not allowed - to be set. - type: object - properties: - autoAssignCIDRs: - description: autoAssignCIDRs is a list of CIDRs from which to - automatically assign Service.ExternalIP. These are assigned - when the service is of type LoadBalancer. In general, this is - only useful for bare-metal clusters. In Openshift 3.x, this - was misleadingly called "IngressIPs". Automatically assigned - External IPs are not affected by any ExternalIPPolicy rules. - Currently, only one entry may be provided. - type: array - items: - type: string - policy: - description: policy is a set of restrictions applied to the ExternalIP - field. If nil or empty, then ExternalIP is not allowed to be - set. - type: object - properties: - allowedCIDRs: - description: allowedCIDRs is the list of allowed CIDRs. - type: array - items: - type: string - rejectedCIDRs: - description: rejectedCIDRs is the list of disallowed CIDRs. - These take precedence over allowedCIDRs. - type: array - items: - type: string - networkType: - description: 'NetworkType is the plugin that is to be deployed (e.g. - OpenShiftSDN). This should match a value that the cluster-network-operator - understands, or else no networking will be installed. Currently - supported values are: - OpenShiftSDN This field is immutable after - installation.' - type: string - serviceNetwork: - description: IP address pool for services. Currently, we only support - a single entry here. This field is immutable after installation. - type: array - items: - type: string - serviceNodePortRange: - description: The port range allowed for Services of type NodePort. - If not specified, the default of 30000-32767 will be used. Such - Services without a NodePort specified will have one automatically - allocated from this range. This parameter can be updated after the - cluster is installed. - type: string - pattern: ^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - clusterNetwork: - description: IP address pool to use for pod IPs. - type: array - items: - description: ClusterNetworkEntry is a contiguous block of IP addresses - from which pod IPs are allocated. - type: object - properties: - cidr: - description: The complete block for pod IPs. - type: string - hostPrefix: - description: The size (prefix) of block to allocate to each - node. If this field is not used by the plugin, it can be left - unset. - type: integer - format: int32 - minimum: 0 - clusterNetworkMTU: - description: ClusterNetworkMTU is the MTU for inter-pod networking. - type: integer - migration: - description: Migration contains the cluster network migration configuration. - type: object - properties: - networkType: - description: 'NetworkType is the target plugin that is to be deployed. - Currently supported values are: OpenShiftSDN, OVNKubernetes' - type: string - enum: - - OpenShiftSDN - - OVNKubernetes - networkType: - description: NetworkType is the plugin that is deployed (e.g. OpenShiftSDN). - type: string - serviceNetwork: - description: IP address pool for services. Currently, we only support - a single entry here. - type: array - items: - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml deleted file mode 100644 index d3097b8745..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml +++ /dev/null @@ -1,676 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: oauths.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: OAuth - listKind: OAuthList - plural: oauths - singular: oauth - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: OAuth holds cluster-wide information about OAuth. The canonical - name is `cluster`. It is used to configure the integrated OAuth server. - This configuration is only honored when the top level Authentication config - has type set to IntegratedOAuth. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - identityProviders: - description: identityProviders is an ordered list of ways for a user - to identify themselves. When this list is empty, no identities are - provisioned for users. - type: array - items: - description: IdentityProvider provides identities for users authenticating - using credentials - type: object - properties: - basicAuth: - description: basicAuth contains configuration options for the - BasicAuth IdP - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - tlsClientCert: - description: tlsClientCert is an optional reference to a - secret by name that contains the PEM-encoded TLS client - certificate to present when connecting to the server. - The key "tls.crt" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - tlsClientKey: - description: tlsClientKey is an optional reference to a - secret by name that contains the PEM-encoded TLS private - key for the client certificate referenced in tlsClientCert. - The key "tls.key" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - url: - description: url is the remote URL to connect to - type: string - github: - description: github enables user authentication using GitHub - credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. This can only be configured when hostname is set - to a non-empty value. The namespace for this config map - is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - hostname: - description: hostname is the optional domain (e.g. "mycompany.com") - for use with a hosted instance of GitHub Enterprise. It - must match the GitHub Enterprise settings value configured - at /setup/settings#hostname. - type: string - organizations: - description: organizations optionally restricts which organizations - are allowed to log in - type: array - items: - type: string - teams: - description: teams optionally restricts which teams are - allowed to log in. Format is /. - type: array - items: - type: string - gitlab: - description: gitlab enables user authentication using GitLab - credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - url: - description: url is the oauth server base URL - type: string - google: - description: google enables user authentication using Google - credentials - type: object - properties: - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - hostedDomain: - description: hostedDomain is the optional Google App domain - (e.g. "mycompany.com") to restrict logins to - type: string - htpasswd: - description: htpasswd enables user authentication using an HTPasswd - file to validate credentials - type: object - properties: - fileData: - description: fileData is a required reference to a secret - by name containing the data to use as the htpasswd file. - The key "htpasswd" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. If the specified htpasswd data is not - valid, the identity provider is not honored. The namespace - for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - keystone: - description: keystone enables user authentication using keystone - password credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - domainName: - description: domainName is required for keystone v3 - type: string - tlsClientCert: - description: tlsClientCert is an optional reference to a - secret by name that contains the PEM-encoded TLS client - certificate to present when connecting to the server. - The key "tls.crt" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - tlsClientKey: - description: tlsClientKey is an optional reference to a - secret by name that contains the PEM-encoded TLS private - key for the client certificate referenced in tlsClientCert. - The key "tls.key" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - url: - description: url is the remote URL to connect to - type: string - ldap: - description: ldap enables user authentication using LDAP credentials - type: object - properties: - attributes: - description: attributes maps LDAP attributes to identities - type: object - properties: - email: - description: email is the list of attributes whose values - should be used as the email address. Optional. If - unspecified, no email is set for the identity - type: array - items: - type: string - id: - description: id is the list of attributes whose values - should be used as the user ID. Required. First non-empty - attribute is used. At least one attribute is required. - If none of the listed attribute have a value, authentication - fails. LDAP standard identity attribute is "dn" - type: array - items: - type: string - name: - description: name is the list of attributes whose values - should be used as the display name. Optional. If unspecified, - no display name is set for the identity LDAP standard - display name attribute is "cn" - type: array - items: - type: string - preferredUsername: - description: preferredUsername is the list of attributes - whose values should be used as the preferred username. - LDAP standard login attribute is "uid" - type: array - items: - type: string - bindDN: - description: bindDN is an optional DN to bind with during - the search phase. - type: string - bindPassword: - description: bindPassword is an optional reference to a - secret by name containing a password to bind with during - the search phase. The key "bindPassword" is used to locate - the data. If specified and the secret or expected key - is not found, the identity provider is not honored. The - namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - insecure: - description: 'insecure, if true, indicates the connection - should not use TLS WARNING: Should not be set to `true` - with the URL scheme "ldaps://" as "ldaps://" URLs always attempt - to connect using TLS, even when `insecure` is set to `true` - When `true`, "ldap://" URLS connect insecurely. When `false`, - "ldap://" URLs are upgraded to a TLS connection using - StartTLS as specified in https://tools.ietf.org/html/rfc2830.' - type: boolean - url: - description: 'url is an RFC 2255 URL which specifies the - LDAP search parameters to use. The syntax of the URL is: - ldap://host:port/basedn?attribute?scope?filter' - type: string - mappingMethod: - description: mappingMethod determines how identities from this - provider are mapped to users Defaults to "claim" - type: string - name: - description: 'name is used to qualify the identities returned - by this provider. - It MUST be unique and not shared by any - other identity provider used - It MUST be a valid path segment: - name cannot equal "." or ".." or contain "/" or "%" or ":" Ref: - https://godoc.org/github.com/openshift/origin/pkg/user/apis/user/validation#ValidateIdentityProviderName' - type: string - openID: - description: openID enables user authentication using OpenID - credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - claims: - description: claims mappings - type: object - properties: - email: - description: email is the list of claims whose values - should be used as the email address. Optional. If - unspecified, no email is set for the identity - type: array - items: - type: string - name: - description: name is the list of claims whose values - should be used as the display name. Optional. If unspecified, - no display name is set for the identity - type: array - items: - type: string - preferredUsername: - description: preferredUsername is the list of claims - whose values should be used as the preferred username. - If unspecified, the preferred username is determined - from the value of the sub claim - type: array - items: - type: string - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - extraAuthorizeParameters: - description: extraAuthorizeParameters are any custom parameters - to add to the authorize request. - type: object - additionalProperties: - type: string - extraScopes: - description: extraScopes are any scopes to request in addition - to the standard "openid" scope. - type: array - items: - type: string - issuer: - description: issuer is the URL that the OpenID Provider - asserts as its Issuer Identifier. It must use the https - scheme with no query or fragment component. - type: string - requestHeader: - description: requestHeader enables user authentication using - request header credentials - type: object - properties: - ca: - description: ca is a required reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. Specifically, it allows verification - of incoming requests to prevent header spoofing. The key - "ca.crt" is used to locate the data. If the config map - or expected key is not found, the identity provider is - not honored. If the specified ca data is not valid, the - identity provider is not honored. The namespace for this - config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - challengeURL: - description: challengeURL is a URL to redirect unauthenticated - /authorize requests to Unauthenticated requests from OAuth - clients which expect WWW-Authenticate challenges will - be redirected here. ${url} is replaced with the current - URL, escaped to be safe in a query parameter https://www.example.com/sso-login?then=${url} - ${query} is replaced with the current query string https://www.example.com/auth-proxy/oauth/authorize?${query} - Required when challenge is set to true. - type: string - clientCommonNames: - description: clientCommonNames is an optional list of common - names to require a match from. If empty, any client certificate - validated against the clientCA bundle is considered authoritative. - type: array - items: - type: string - emailHeaders: - description: emailHeaders is the set of headers to check - for the email address - type: array - items: - type: string - headers: - description: headers is the set of headers to check for - identity information - type: array - items: - type: string - loginURL: - description: loginURL is a URL to redirect unauthenticated - /authorize requests to Unauthenticated requests from OAuth - clients which expect interactive logins will be redirected - here ${url} is replaced with the current URL, escaped - to be safe in a query parameter https://www.example.com/sso-login?then=${url} - ${query} is replaced with the current query string https://www.example.com/auth-proxy/oauth/authorize?${query} - Required when login is set to true. - type: string - nameHeaders: - description: nameHeaders is the set of headers to check - for the display name - type: array - items: - type: string - preferredUsernameHeaders: - description: preferredUsernameHeaders is the set of headers - to check for the preferred username - type: array - items: - type: string - type: - description: type identifies the identity provider type for - this entry. - type: string - templates: - description: templates allow you to customize pages like the login - page. - type: object - properties: - error: - description: error is the name of a secret that specifies a go - template to use to render error pages during the authentication - or grant flow. The key "errors.html" is used to locate the template - data. If specified and the secret or expected key is not found, - the default error page is used. If the specified template is - not valid, the default error page is used. If unspecified, the - default error page is used. The namespace for this secret is - openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - login: - description: login is the name of a secret that specifies a go - template to use to render the login page. The key "login.html" - is used to locate the template data. If specified and the secret - or expected key is not found, the default login page is used. - If the specified template is not valid, the default login page - is used. If unspecified, the default login page is used. The - namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - providerSelection: - description: providerSelection is the name of a secret that specifies - a go template to use to render the provider selection page. - The key "providers.html" is used to locate the template data. - If specified and the secret or expected key is not found, the - default provider selection page is used. If the specified template - is not valid, the default provider selection page is used. If - unspecified, the default provider selection page is used. The - namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - tokenConfig: - description: tokenConfig contains options for authorization and access - tokens - type: object - properties: - accessTokenInactivityTimeout: - description: accessTokenInactivityTimeout defines the token inactivity - timeout for tokens granted by any client. The value represents - the maximum amount of time that can occur between consecutive - uses of the token. Tokens become invalid if they are not used - within this temporal window. The user will need to acquire a - new token to regain access once a token times out. Takes valid - time duration string such as "5m", "1.5h" or "2h45m". The minimum - allowed value for duration is 300s (5 minutes). If the timeout - is configured per client, then that value takes precedence. - If the timeout value is not specified and the client does not - override the value, then tokens are valid until their lifetime. - type: string - accessTokenInactivityTimeoutSeconds: - description: 'accessTokenInactivityTimeoutSeconds - DEPRECATED: - setting this field has no effect.' - type: integer - format: int32 - accessTokenMaxAgeSeconds: - description: accessTokenMaxAgeSeconds defines the maximum age - of access tokens - type: integer - format: int32 - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml deleted file mode 100644 index 6de3040722..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml +++ /dev/null @@ -1,66 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: projects.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Project - listKind: ProjectList - plural: projects - singular: project - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Project holds cluster-wide information about Project. The canonical - name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - projectRequestMessage: - description: projectRequestMessage is the string presented to a user - if they are unable to request a project via the projectrequest api - endpoint - type: string - projectRequestTemplate: - description: projectRequestTemplate is the template to use for creating - projects in response to projectrequest. This must point to a template - in 'openshift-config' namespace. It is optional. If it is not specified, - a default template is used. - type: object - properties: - name: - description: name is the metadata.name of the referenced project - request template - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml deleted file mode 100644 index c66ec6ad95..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml +++ /dev/null @@ -1,106 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: schedulers.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Scheduler - singular: scheduler - plural: schedulers - listKind: SchedulerList - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Scheduler holds cluster-wide config information to run the Kubernetes - Scheduler and influence its placement decisions. The canonical name for - this config is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - defaultNodeSelector: - description: 'defaultNodeSelector helps set the cluster-wide default - node selector to restrict pod placement to specific nodes. This - is applied to the pods created in all namespaces and creates an - intersection with any existing nodeSelectors already set on a pod, - additionally constraining that pod''s selector. For example, defaultNodeSelector: - "type=user-node,region=east" would set nodeSelector field in pod - spec to "type=user-node,region=east" to all pods created in all - namespaces. Namespaces having project-wide node selectors won''t - be impacted even if this field is set. This adds an annotation section - to the namespace. For example, if a new namespace is created with - node-selector=''type=user-node,region=east'', the annotation openshift.io/node-selector: - type=user-node,region=east gets added to the project. When the openshift.io/node-selector - annotation is set on the project the value is used in preference - to the value we are setting for defaultNodeSelector field. For instance, - openshift.io/node-selector: "type=user-node,region=west" means that - the default of "type=user-node,region=east" set in defaultNodeSelector - would not be applied.' - type: string - mastersSchedulable: - description: 'MastersSchedulable allows masters nodes to be schedulable. - When this flag is turned on, all the master nodes in the cluster - will be made schedulable, so that workload pods can run on them. - The default value for this field is false, meaning none of the master - nodes are schedulable. Important Note: Once the workload pods start - running on the master nodes, extreme care must be taken to ensure - that cluster-critical control plane components are not impacted. - Please turn on this field after doing due diligence.' - type: boolean - policy: - description: 'DEPRECATED: the scheduler Policy API has been deprecated - and will be removed in a future release. policy is a reference to - a ConfigMap containing scheduler policy which has user specified - predicates and priorities. If this ConfigMap is not available scheduler - will default to use DefaultAlgorithmProvider. The namespace for - this configmap is openshift-config.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - profile: - description: "profile sets which scheduling profile should be set - in order to configure scheduling decisions for new pods. \n Valid - values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" - Defaults to \"LowNodeUtilization\"" - type: string - enum: - - "" - - LowNodeUtilization - - HighNodeUtilization - - NoScoring - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/Makefile b/vendor/github.com/openshift/api/config/v1/Makefile new file mode 100644 index 0000000000..66bf636305 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/Makefile @@ -0,0 +1,3 @@ +.PHONY: test +test: + make -C ../../tests test GINKGO_EXTRA_ARGS=--focus="config.openshift.io/v1" diff --git a/vendor/github.com/openshift/api/config/v1/doc.go b/vendor/github.com/openshift/api/config/v1/doc.go index 4ff5208f2c..f994547583 100644 --- a/vendor/github.com/openshift/api/config/v1/doc.go +++ b/vendor/github.com/openshift/api/config/v1/doc.go @@ -1,6 +1,7 @@ // +k8s:deepcopy-gen=package,register // +k8s:defaulter-gen=TypeMeta // +k8s:openapi-gen=true +// +openshift:featuregated-schema-gen=true // +kubebuilder:validation:Optional // +groupName=config.openshift.io diff --git a/vendor/github.com/openshift/api/config/v1/register.go b/vendor/github.com/openshift/api/config/v1/register.go index 35eace3701..222c7f0cc7 100644 --- a/vendor/github.com/openshift/api/config/v1/register.go +++ b/vendor/github.com/openshift/api/config/v1/register.go @@ -52,6 +52,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &InfrastructureList{}, &Ingress{}, &IngressList{}, + &Node{}, + &NodeList{}, &Network{}, &NetworkList{}, &OAuth{}, @@ -64,6 +66,18 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ProxyList{}, &Scheduler{}, &SchedulerList{}, + &ImageContentPolicy{}, + &ImageContentPolicyList{}, + &ImageDigestMirrorSet{}, + &ImageDigestMirrorSetList{}, + &ImageTagMirrorSet{}, + &ImageTagMirrorSetList{}, + &ImagePolicy{}, + &ImagePolicyList{}, + &ClusterImagePolicy{}, + &ClusterImagePolicyList{}, + &InsightsDataGather{}, + &InsightsDataGatherList{}, ) metav1.AddToGroupVersion(scheme, GroupVersion) return nil diff --git a/vendor/github.com/openshift/api/config/v1/types.go b/vendor/github.com/openshift/api/config/v1/types.go index 1427484236..3e17ca0ccb 100644 --- a/vendor/github.com/openshift/api/config/v1/types.go +++ b/vendor/github.com/openshift/api/config/v1/types.go @@ -9,7 +9,7 @@ import ( // The namespace must be specified at the point of use. type ConfigMapFileReference struct { Name string `json:"name"` - // Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references. + // key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references. Key string `json:"key,omitempty"` } @@ -17,7 +17,6 @@ type ConfigMapFileReference struct { // The namespace must be specified at the point of use. type ConfigMapNameReference struct { // name is the metadata.name of the referenced config map - // +kubebuilder:validation:Required // +required Name string `json:"name"` } @@ -26,7 +25,6 @@ type ConfigMapNameReference struct { // The namespace must be specified at the point of use. type SecretNameReference struct { // name is the metadata.name of the referenced secret - // +kubebuilder:validation:Required // +required Name string `json:"name"` } @@ -35,47 +33,47 @@ type SecretNameReference struct { type HTTPServingInfo struct { // ServingInfo is the HTTP serving information ServingInfo `json:",inline"` - // MaxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit. + // maxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit. MaxRequestsInFlight int64 `json:"maxRequestsInFlight"` - // RequestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if + // requestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if // -1 there is no limit on requests. RequestTimeoutSeconds int64 `json:"requestTimeoutSeconds"` } // ServingInfo holds information about serving web pages type ServingInfo struct { - // BindAddress is the ip:port to serve on + // bindAddress is the ip:port to serve on BindAddress string `json:"bindAddress"` - // BindNetwork is the type of network to bind to - defaults to "tcp4", accepts "tcp", + // bindNetwork is the type of network to bind to - defaults to "tcp4", accepts "tcp", // "tcp4", and "tcp6" BindNetwork string `json:"bindNetwork"` // CertInfo is the TLS cert info for serving secure traffic. // this is anonymous so that we can inline it for serialization CertInfo `json:",inline"` - // ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates + // clientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates // +optional ClientCA string `json:"clientCA,omitempty"` - // NamedCertificates is a list of certificates to use to secure requests to specific hostnames + // namedCertificates is a list of certificates to use to secure requests to specific hostnames NamedCertificates []NamedCertificate `json:"namedCertificates,omitempty"` - // MinTLSVersion is the minimum TLS version supported. + // minTLSVersion is the minimum TLS version supported. // Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants MinTLSVersion string `json:"minTLSVersion,omitempty"` - // CipherSuites contains an overridden list of ciphers for the server to support. + // cipherSuites contains an overridden list of ciphers for the server to support. // Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants CipherSuites []string `json:"cipherSuites,omitempty"` } // CertInfo relates a certificate with a private key type CertInfo struct { - // CertFile is a file containing a PEM-encoded certificate + // certFile is a file containing a PEM-encoded certificate CertFile string `json:"certFile"` - // KeyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile + // keyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile KeyFile string `json:"keyFile"` } // NamedCertificate specifies a certificate/key, and the names it should be served for type NamedCertificate struct { - // Names is a list of DNS names this certificate should be used to secure + // names is a list of DNS names this certificate should be used to secure // A name can be a normal DNS name, or can contain leading wildcard segments. Names []string `json:"names,omitempty"` // CertInfo is the TLS cert info for serving secure traffic @@ -121,24 +119,24 @@ type StringSource struct { // StringSourceSpec specifies a string value, or external location type StringSourceSpec struct { - // Value specifies the cleartext value, or an encrypted value if keyFile is specified. + // value specifies the cleartext value, or an encrypted value if keyFile is specified. Value string `json:"value"` - // Env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified. + // env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified. Env string `json:"env"` - // File references a file containing the cleartext value, or an encrypted value if a keyFile is specified. + // file references a file containing the cleartext value, or an encrypted value if a keyFile is specified. File string `json:"file"` - // KeyFile references a file containing the key to use to decrypt the value. + // keyFile references a file containing the key to use to decrypt the value. KeyFile string `json:"keyFile"` } // RemoteConnectionInfo holds information necessary for establishing a remote connection type RemoteConnectionInfo struct { - // URL is the remote URL to connect to + // url is the remote URL to connect to URL string `json:"url"` - // CA is the CA for verifying TLS connections + // ca is the CA for verifying TLS connections CA string `json:"ca"` // CertInfo is the TLS client cert information to present // this is anonymous so that we can inline it for serialization @@ -160,11 +158,11 @@ type AdmissionConfig struct { // AdmissionPluginConfig holds the necessary configuration options for admission plugins type AdmissionPluginConfig struct { - // Location is the path to a configuration file that contains the plugin's + // location is the path to a configuration file that contains the plugin's // configuration Location string `json:"location"` - // Configuration is an embedded configuration object to be used as the plugin's + // configuration is an embedded configuration object to be used as the plugin's // configuration. If present, it will be used instead of the path to the configuration file. // +nullable // +kubebuilder:pruning:PreserveUnknownFields @@ -205,9 +203,9 @@ type AuditConfig struct { // Maximum size in megabytes of the log file before it gets rotated. Defaults to 100MB. MaximumFileSizeMegabytes int32 `json:"maximumFileSizeMegabytes"` - // PolicyFile is a path to the file that defines the audit policy configuration. + // policyFile is a path to the file that defines the audit policy configuration. PolicyFile string `json:"policyFile"` - // PolicyConfiguration is an embedded policy configuration object to be used + // policyConfiguration is an embedded policy configuration object to be used // as the audit policy configuration. If present, it will be used instead of // the path to the policy file. // +nullable @@ -225,9 +223,9 @@ type AuditConfig struct { // EtcdConnectionInfo holds information necessary for connecting to an etcd server type EtcdConnectionInfo struct { - // URLs are the URLs for etcd + // urls are the URLs for etcd URLs []string `json:"urls,omitempty"` - // CA is a file containing trusted roots for the etcd server certificates + // ca is a file containing trusted roots for the etcd server certificates CA string `json:"ca"` // CertInfo is the TLS client cert information for securing communication to etcd // this is anonymous so that we can inline it for serialization @@ -237,7 +235,7 @@ type EtcdConnectionInfo struct { type EtcdStorageConfig struct { EtcdConnectionInfo `json:",inline"` - // StoragePrefix is the path within etcd that the OpenShift resources will + // storagePrefix is the path within etcd that the OpenShift resources will // be rooted under. This value, if changed, will mean existing objects in etcd will // no longer be located. StoragePrefix string `json:"storagePrefix"` @@ -287,7 +285,7 @@ type ClientConnectionOverrides struct { // GenericControllerConfig provides information to configure a controller type GenericControllerConfig struct { - // ServingInfo is the HTTP serving information for the controller's endpoints + // servingInfo is the HTTP serving information for the controller's endpoints ServingInfo HTTPServingInfo `json:"servingInfo"` // leaderElection provides information to elect a leader. Only override this if you have a specific need @@ -310,3 +308,124 @@ type DelegatedAuthorization struct { // disabled indicates that authorization should be disabled. By default it will use delegated authorization. Disabled bool `json:"disabled,omitempty"` } +type RequiredHSTSPolicy struct { + // namespaceSelector specifies a label selector such that the policy applies only to those routes that + // are in namespaces with labels that match the selector, and are in one of the DomainPatterns. + // Defaults to the empty LabelSelector, which matches everything. + // +optional + NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty"` + + // domainPatterns is a list of domains for which the desired HSTS annotations are required. + // If domainPatterns is specified and a route is created with a spec.host matching one of the domains, + // the route must specify the HSTS Policy components described in the matching RequiredHSTSPolicy. + // + // The use of wildcards is allowed like this: *.foo.com matches everything under foo.com. + // foo.com only matches foo.com, so to cover foo.com and everything under it, you must specify *both*. + // +kubebuilder:validation:MinItems=1 + // +required + DomainPatterns []string `json:"domainPatterns"` + + // maxAge is the delta time range in seconds during which hosts are regarded as HSTS hosts. + // If set to 0, it negates the effect, and hosts are removed as HSTS hosts. + // If set to 0 and includeSubdomains is specified, all subdomains of the host are also removed as HSTS hosts. + // maxAge is a time-to-live value, and if this policy is not refreshed on a client, the HSTS + // policy will eventually expire on that client. + MaxAge MaxAgePolicy `json:"maxAge"` + + // preloadPolicy directs the client to include hosts in its host preload list so that + // it never needs to do an initial load to get the HSTS header (note that this is not defined + // in RFC 6797 and is therefore client implementation-dependent). + // +optional + PreloadPolicy PreloadPolicy `json:"preloadPolicy,omitempty"` + + // includeSubDomainsPolicy means the HSTS Policy should apply to any subdomains of the host's + // domain name. Thus, for the host bar.foo.com, if includeSubDomainsPolicy was set to RequireIncludeSubDomains: + // - the host app.bar.foo.com would inherit the HSTS Policy of bar.foo.com + // - the host bar.foo.com would inherit the HSTS Policy of bar.foo.com + // - the host foo.com would NOT inherit the HSTS Policy of bar.foo.com + // - the host def.foo.com would NOT inherit the HSTS Policy of bar.foo.com + // +optional + IncludeSubDomainsPolicy IncludeSubDomainsPolicy `json:"includeSubDomainsPolicy,omitempty"` +} + +// MaxAgePolicy contains a numeric range for specifying a compliant HSTS max-age for the enclosing RequiredHSTSPolicy +type MaxAgePolicy struct { + // The largest allowed value (in seconds) of the RequiredHSTSPolicy max-age + // This value can be left unspecified, in which case no upper limit is enforced. + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=2147483647 + LargestMaxAge *int32 `json:"largestMaxAge,omitempty"` + + // The smallest allowed value (in seconds) of the RequiredHSTSPolicy max-age + // Setting max-age=0 allows the deletion of an existing HSTS header from a host. This is a necessary + // tool for administrators to quickly correct mistakes. + // This value can be left unspecified, in which case no lower limit is enforced. + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=2147483647 + SmallestMaxAge *int32 `json:"smallestMaxAge,omitempty"` +} + +// PreloadPolicy contains a value for specifying a compliant HSTS preload policy for the enclosing RequiredHSTSPolicy +// +kubebuilder:validation:Enum=RequirePreload;RequireNoPreload;NoOpinion +type PreloadPolicy string + +const ( + // RequirePreloadPolicy means HSTS "preload" is required by the RequiredHSTSPolicy + RequirePreloadPolicy PreloadPolicy = "RequirePreload" + + // RequireNoPreloadPolicy means HSTS "preload" is forbidden by the RequiredHSTSPolicy + RequireNoPreloadPolicy PreloadPolicy = "RequireNoPreload" + + // NoOpinionPreloadPolicy means HSTS "preload" doesn't matter to the RequiredHSTSPolicy + NoOpinionPreloadPolicy PreloadPolicy = "NoOpinion" +) + +// IncludeSubDomainsPolicy contains a value for specifying a compliant HSTS includeSubdomains policy +// for the enclosing RequiredHSTSPolicy +// +kubebuilder:validation:Enum=RequireIncludeSubDomains;RequireNoIncludeSubDomains;NoOpinion +type IncludeSubDomainsPolicy string + +const ( + // RequireIncludeSubDomains means HSTS "includeSubDomains" is required by the RequiredHSTSPolicy + RequireIncludeSubDomains IncludeSubDomainsPolicy = "RequireIncludeSubDomains" + + // RequireNoIncludeSubDomains means HSTS "includeSubDomains" is forbidden by the RequiredHSTSPolicy + RequireNoIncludeSubDomains IncludeSubDomainsPolicy = "RequireNoIncludeSubDomains" + + // NoOpinionIncludeSubDomains means HSTS "includeSubDomains" doesn't matter to the RequiredHSTSPolicy + NoOpinionIncludeSubDomains IncludeSubDomainsPolicy = "NoOpinion" +) + +// IBMCloudServiceName contains a value specifying the name of an IBM Cloud Service, +// which are used by MAPI, CIRO, CIO, Installer, etc. +// +kubebuilder:validation:Enum=CIS;COS;COSConfig;DNSServices;GlobalCatalog;GlobalSearch;GlobalTagging;HyperProtect;IAM;KeyProtect;ResourceController;ResourceManager;VPC +type IBMCloudServiceName string + +const ( + // IBMCloudServiceCIS is the name for IBM Cloud CIS. + IBMCloudServiceCIS IBMCloudServiceName = "CIS" + // IBMCloudServiceCOS is the name for IBM Cloud COS. + IBMCloudServiceCOS IBMCloudServiceName = "COS" + // IBMCloudServiceCOSConfig is the name for IBM Cloud COS Config service. + IBMCloudServiceCOSConfig IBMCloudServiceName = "COSConfig" + // IBMCloudServiceDNSServices is the name for IBM Cloud DNS Services. + IBMCloudServiceDNSServices IBMCloudServiceName = "DNSServices" + // IBMCloudServiceGlobalCatalog is the name for IBM Cloud Global Catalog service. + IBMCloudServiceGlobalCatalog IBMCloudServiceName = "GlobalCatalog" + // IBMCloudServiceGlobalSearch is the name for IBM Cloud Global Search. + IBMCloudServiceGlobalSearch IBMCloudServiceName = "GlobalSearch" + // IBMCloudServiceGlobalTagging is the name for IBM Cloud Global Tagging. + IBMCloudServiceGlobalTagging IBMCloudServiceName = "GlobalTagging" + // IBMCloudServiceHyperProtect is the name for IBM Cloud Hyper Protect. + IBMCloudServiceHyperProtect IBMCloudServiceName = "HyperProtect" + // IBMCloudServiceIAM is the name for IBM Cloud IAM. + IBMCloudServiceIAM IBMCloudServiceName = "IAM" + // IBMCloudServiceKeyProtect is the name for IBM Cloud Key Protect. + IBMCloudServiceKeyProtect IBMCloudServiceName = "KeyProtect" + // IBMCloudServiceResourceController is the name for IBM Cloud Resource Controller. + IBMCloudServiceResourceController IBMCloudServiceName = "ResourceController" + // IBMCloudServiceResourceManager is the name for IBM Cloud Resource Manager. + IBMCloudServiceResourceManager IBMCloudServiceName = "ResourceManager" + // IBMCloudServiceVPC is the name for IBM Cloud VPC. + IBMCloudServiceVPC IBMCloudServiceName = "VPC" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_apiserver.go b/vendor/github.com/openshift/api/config/v1/types_apiserver.go index 42268db39b..0afe7b1d8d 100644 --- a/vendor/github.com/openshift/api/config/v1/types_apiserver.go +++ b/vendor/github.com/openshift/api/config/v1/types_apiserver.go @@ -11,11 +11,22 @@ import ( // APIServer holds configuration (like serving certificates, client CA and CORS domains) // shared by all API servers in the system, among them especially kube-apiserver // and openshift-apiserver. The canonical name of an instance is 'cluster'. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=apiservers,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type APIServer struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec APIServerSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -40,15 +51,15 @@ type APIServerSpec struct { // server from JavaScript applications. // The values are regular expressions that correspond to the Golang regular expression language. // +optional + // +listType=atomic AdditionalCORSAllowedOrigins []string `json:"additionalCORSAllowedOrigins,omitempty"` // encryption allows the configuration of encryption of resources at the datastore layer. // +optional Encryption APIServerEncryption `json:"encryption"` // tlsSecurityProfile specifies settings for TLS connections for externally exposed servers. // - // If unset, a default (which may change between releases) is chosen. Note that only Old and - // Intermediate profiles are currently supported, and the maximum available MinTLSVersions - // is VersionTLS12. + // When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. + // The current default is the Intermediate profile. // +optional TLSSecurityProfile *TLSSecurityProfile `json:"tlsSecurityProfile,omitempty"` // audit specifies the settings for audit configuration to be applied to all OpenShift-provided @@ -59,12 +70,15 @@ type APIServerSpec struct { } // AuditProfileType defines the audit policy profile type. -// +kubebuilder:validation:Enum=Default;WriteRequestBodies;AllRequestBodies +// +kubebuilder:validation:Enum=Default;WriteRequestBodies;AllRequestBodies;None type AuditProfileType string const ( + // "None" disables audit logs. + NoneAuditProfileType AuditProfileType = "None" + // "Default" is the existing default audit configuration policy. - AuditProfileDefaultType AuditProfileType = "Default" + DefaultAuditProfileType AuditProfileType = "Default" // "WriteRequestBodies" is similar to Default but it logs request and response // HTTP payloads for write requests (create, update, patch) @@ -76,6 +90,47 @@ const ( ) type Audit struct { + // profile specifies the name of the desired top-level audit profile to be applied to all requests + // sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, + // openshift-apiserver and oauth-apiserver), with the exception of those requests that match + // one or more of the customRules. + // + // The following profiles are provided: + // - Default: default policy which means MetaData level logging with the exception of events + // (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody + // level). + // - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for + // write requests (create, update, patch). + // - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response + // HTTP payloads for read requests (get, list). + // - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. + // + // Warning: It is not recommended to disable audit logging by using the `None` profile unless you + // are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. + // If you disable audit logging and a support situation arises, you might need to enable audit logging + // and reproduce the issue in order to troubleshoot properly. + // + // If unset, the 'Default' profile is used as the default. + // + // +kubebuilder:default=Default + Profile AuditProfileType `json:"profile,omitempty"` + // customRules specify profiles per group. These profile take precedence over the + // top-level profile field if they apply. They are evaluation from top to bottom and + // the first one that matches, applies. + // +listType=map + // +listMapKey=group + // +optional + CustomRules []AuditCustomRule `json:"customRules,omitempty"` +} + +// AuditCustomRule describes a custom rule for an audit profile that takes precedence over +// the top-level profile. +type AuditCustomRule struct { + // group is a name of group a request user must be member of in order to this profile to apply. + // + // +kubebuilder:validation:MinLength=1 + // +required + Group string `json:"group"` // profile specifies the name of the desired audit policy configuration to be deployed to // all OpenShift-provided API servers in the cluster. // @@ -85,10 +140,12 @@ type Audit struct { // write requests (create, update, patch). // - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response // HTTP payloads for read requests (get, list). + // - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. // // If unset, the 'Default' profile is used as the default. - // +kubebuilder:default=Default - Profile AuditProfileType `json:"profile,omitempty"` + // + // +required + Profile AuditProfileType `json:"profile"` } type APIServerServingCerts struct { @@ -96,6 +153,8 @@ type APIServerServingCerts struct { // If no named certificates are provided, or no named certificates match the server name as understood by a client, // the defaultServingCertificate will be used. // +optional + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 NamedCertificates []APIServerNamedServingCert `json:"namedCertificates,omitempty"` } @@ -105,6 +164,8 @@ type APIServerNamedServingCert struct { // serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. // Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names. // +optional + // +listType=atomic + // +kubebuilder:validation:MaxItems=64 Names []string `json:"names,omitempty"` // servingCertificate references a kubernetes.io/tls type secret containing the TLS cert info for serving secure traffic. // The secret must exist in the openshift-config namespace and contain the following required fields: @@ -113,6 +174,9 @@ type APIServerNamedServingCert struct { ServingCertificate SecretNameReference `json:"servingCertificate"` } +// APIServerEncryption is used to encrypt sensitive resources on the cluster. +// +openshift:validation:FeatureGateAwareXValidation:featureGate=KMSEncryptionProvider,rule="has(self.type) && self.type == 'KMS' ? has(self.kms) : !has(self.kms)",message="kms config is required when encryption type is KMS, and forbidden otherwise" +// +union type APIServerEncryption struct { // type defines what encryption type should be used to encrypt resources at the datastore layer. // When this field is unset (i.e. when it is set to the empty string), identity is implied. @@ -131,9 +195,23 @@ type APIServerEncryption struct { // +unionDiscriminator // +optional Type EncryptionType `json:"type,omitempty"` + + // kms defines the configuration for the external KMS instance that manages the encryption keys, + // when KMS encryption is enabled sensitive resources will be encrypted using keys managed by an + // externally configured KMS instance. + // + // The Key Management Service (KMS) instance provides symmetric encryption and is responsible for + // managing the lifecyle of the encryption keys outside of the control plane. + // This allows integration with an external provider to manage the data encryption keys securely. + // + // +openshift:enable:FeatureGate=KMSEncryptionProvider + // +unionMember + // +optional + KMS *KMSConfig `json:"kms,omitempty"` } -// +kubebuilder:validation:Enum="";identity;aescbc +// +openshift:validation:FeatureGateAwareEnum:featureGate="",enum="";identity;aescbc;aesgcm +// +openshift:validation:FeatureGateAwareEnum:featureGate=KMSEncryptionProvider,enum="";identity;aescbc;aesgcm;KMS type EncryptionType string const ( @@ -144,6 +222,15 @@ const ( // aescbc refers to a type where AES-CBC with PKCS#7 padding and a 32-byte key // is used to perform encryption at the datastore layer. EncryptionTypeAESCBC EncryptionType = "aescbc" + + // aesgcm refers to a type where AES-GCM with random nonce and a 32-byte key + // is used to perform encryption at the datastore layer. + EncryptionTypeAESGCM EncryptionType = "aesgcm" + + // kms refers to a type of encryption where the encryption keys are managed + // outside the control plane in a Key Management Service instance, + // encryption is still performed at the datastore layer. + EncryptionTypeKMS EncryptionType = "KMS" ) type APIServerStatus struct { @@ -151,8 +238,13 @@ type APIServerStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type APIServerList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []APIServer `json:"items"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_authentication.go b/vendor/github.com/openshift/api/config/v1/types_authentication.go index 0d1041bd5f..52a41b2fef 100644 --- a/vendor/github.com/openshift/api/config/v1/types_authentication.go +++ b/vendor/github.com/openshift/api/config/v1/types_authentication.go @@ -5,15 +5,27 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:validation:FeatureGateAwareXValidation:featureGate=ExternalOIDC;ExternalOIDCWithUIDAndExtraClaimMappings,rule="!has(self.spec.oidcProviders) || self.spec.oidcProviders.all(p, !has(p.oidcClients) || p.oidcClients.all(specC, self.status.oidcClients.exists(statusC, statusC.componentNamespace == specC.componentNamespace && statusC.componentName == specC.componentName) || (has(oldSelf.spec.oidcProviders) && oldSelf.spec.oidcProviders.exists(oldP, oldP.name == p.name && has(oldP.oidcClients) && oldP.oidcClients.exists(oldC, oldC.componentNamespace == specC.componentNamespace && oldC.componentName == specC.componentName)))))",message="all oidcClients in the oidcProviders must match their componentName and componentNamespace to either a previously configured oidcClient or they must exist in the status.oidcClients" // Authentication specifies cluster-wide settings for authentication (like OAuth and // webhook token authenticators). The canonical name of an instance is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=authentications,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Authentication struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec AuthenticationSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -44,26 +56,43 @@ type AuthenticationSpec struct { OAuthMetadata ConfigMapNameReference `json:"oauthMetadata"` // webhookTokenAuthenticators is DEPRECATED, setting it has no effect. + // +listType=atomic WebhookTokenAuthenticators []DeprecatedWebhookTokenAuthenticator `json:"webhookTokenAuthenticators,omitempty"` // webhookTokenAuthenticator configures a remote token reviewer. // These remote authentication webhooks can be used to verify bearer tokens // via the tokenreviews.authentication.k8s.io REST API. This is required to // honor bearer tokens that are provisioned by an external authentication service. + // + // Can only be set if "Type" is set to "None". + // // +optional WebhookTokenAuthenticator *WebhookTokenAuthenticator `json:"webhookTokenAuthenticator,omitempty"` // serviceAccountIssuer is the identifier of the bound service account token // issuer. // The default is https://kubernetes.default.svc - // WARNING: Updating this field will result in the invalidation of - // all bound tokens with the previous issuer value. Unless the - // holder of a bound token has explicit support for a change in - // issuer, they will not request a new bound token until pod - // restart or until their existing token exceeds 80% of its - // duration. + // WARNING: Updating this field will not result in immediate invalidation of all bound tokens with the + // previous issuer value. Instead, the tokens issued by previous service account issuer will continue to + // be trusted for a time period chosen by the platform (currently set to 24h). + // This time period is subject to change over time. + // This allows internal components to transition to use new service account issuer without service distruption. // +optional ServiceAccountIssuer string `json:"serviceAccountIssuer"` + + // oidcProviders are OIDC identity providers that can issue tokens + // for this cluster + // Can only be set if "Type" is set to "OIDC". + // + // At most one provider can be configured. + // + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MaxItems=1 + // +openshift:enable:FeatureGate=ExternalOIDC + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + // +optional + OIDCProviders []OIDCProvider `json:"oidcProviders,omitempty"` } type AuthenticationStatus struct { @@ -80,35 +109,54 @@ type AuthenticationStatus struct { // If the config map or expected key is not found, no metadata is served. // If the specified metadata is not valid, no metadata is served. // The namespace for this config map is openshift-config-managed. + // +optional IntegratedOAuthMetadata ConfigMapNameReference `json:"integratedOAuthMetadata"` - // TODO if we add support for an in-cluster operator managed Keycloak instance - // KeycloakOAuthMetadata ConfigMapNameReference `json:"keycloakOAuthMetadata"` + // oidcClients is where participating operators place the current OIDC client status + // for OIDC clients that can be customized by the cluster-admin. + // + // +listType=map + // +listMapKey=componentNamespace + // +listMapKey=componentName + // +kubebuilder:validation:MaxItems=20 + // +openshift:enable:FeatureGate=ExternalOIDC + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + // +optional + OIDCClients []OIDCClientStatus `json:"oidcClients"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type AuthenticationList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Authentication `json:"items"` } +// +openshift:validation:FeatureGateAwareEnum:featureGate="",enum="";None;IntegratedOAuth +// +openshift:validation:FeatureGateAwareEnum:featureGate=ExternalOIDC;ExternalOIDCWithUIDAndExtraClaimMappings,enum="";None;IntegratedOAuth;OIDC type AuthenticationType string const ( // None means that no cluster managed authentication system is in place. // Note that user login will only work if a manually configured system is in place and - // referenced in authentication spec via oauthMetadata and webhookTokenAuthenticators. + // referenced in authentication spec via oauthMetadata and + // webhookTokenAuthenticator/oidcProviders AuthenticationTypeNone AuthenticationType = "None" // IntegratedOAuth refers to the cluster managed OAuth server. // It is configured via the top level OAuth config. AuthenticationTypeIntegratedOAuth AuthenticationType = "IntegratedOAuth" - // TODO if we add support for an in-cluster operator managed Keycloak instance - // AuthenticationTypeKeycloak AuthenticationType = "Keycloak" + // AuthenticationTypeOIDC refers to a configuration with an external + // OIDC server configured directly with the kube-apiserver. + AuthenticationTypeOIDC AuthenticationType = "OIDC" ) // deprecatedWebhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator. @@ -137,7 +185,6 @@ type WebhookTokenAuthenticator struct { // The key "kubeConfig" is used to locate the data. // If the secret or expected key is not found, the webhook is not honored. // If the specified kube config data is not valid, the webhook is not honored. - // +kubebuilder:validation:Required // +required KubeConfig SecretNameReference `json:"kubeConfig"` } @@ -149,3 +196,578 @@ const ( // KubeConfigKey is the key for the kube config file data in a secret KubeConfigKey = "kubeConfig" ) + +type OIDCProvider struct { + // name is a required field that configures the unique human-readable identifier + // associated with the identity provider. + // It is used to distinguish between multiple identity providers + // and has no impact on token validation or authentication mechanics. + // + // name must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + Name string `json:"name"` + + // issuer is a required field that configures how the platform interacts + // with the identity provider and how tokens issued from the identity provider + // are evaluated by the Kubernetes API server. + // + // +required + Issuer TokenIssuer `json:"issuer"` + + // oidcClients is an optional field that configures how on-cluster, + // platform clients should request tokens from the identity provider. + // oidcClients must not exceed 20 entries and entries must have unique namespace/name pairs. + // + // +listType=map + // +listMapKey=componentNamespace + // +listMapKey=componentName + // +kubebuilder:validation:MaxItems=20 + // +optional + OIDCClients []OIDCClientConfig `json:"oidcClients"` + + // claimMappings is a required field that configures the rules to be used by + // the Kubernetes API server for translating claims in a JWT token, issued + // by the identity provider, to a cluster identity. + // + // +required + ClaimMappings TokenClaimMappings `json:"claimMappings"` + + // claimValidationRules is an optional field that configures the rules to + // be used by the Kubernetes API server for validating the claims in a JWT + // token issued by the identity provider. + // + // Validation rules are joined via an AND operation. + // + // +listType=atomic + // +optional + ClaimValidationRules []TokenClaimValidationRule `json:"claimValidationRules,omitempty"` +} + +// +kubebuilder:validation:MinLength=1 +type TokenAudience string + +type TokenIssuer struct { + // issuerURL is a required field that configures the URL used to issue tokens + // by the identity provider. + // The Kubernetes API server determines how authentication tokens should be handled + // by matching the 'iss' claim in the JWT to the issuerURL of configured identity providers. + // + // Must be at least 1 character and must not exceed 512 characters in length. + // Must be a valid URL that uses the 'https' scheme and does not contain a query, fragment or user. + // + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="must be a valid URL" + // +kubebuilder:validation:XValidation:rule="isURL(self) && url(self).getScheme() == 'https'",message="must use the 'https' scheme" + // +kubebuilder:validation:XValidation:rule="isURL(self) && url(self).getQuery() == {}",message="must not have a query" + // +kubebuilder:validation:XValidation:rule="self.find('#(.+)$') == ''",message="must not have a fragment" + // +kubebuilder:validation:XValidation:rule="self.find('@') == ''",message="must not have user info" + // +kubebuilder:validation:MaxLength=512 + // +kubebuilder:validation:MinLength=1 + // +required + URL string `json:"issuerURL"` + + // audiences is a required field that configures the acceptable audiences + // the JWT token, issued by the identity provider, must be issued to. + // At least one of the entries must match the 'aud' claim in the JWT token. + // + // audiences must contain at least one entry and must not exceed ten entries. + // + // +listType=set + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=10 + // +required + Audiences []TokenAudience `json:"audiences"` + + // issuerCertificateAuthority is an optional field that configures the + // certificate authority, used by the Kubernetes API server, to validate + // the connection to the identity provider when fetching discovery information. + // + // When not specified, the system trust is used. + // + // When specified, it must reference a ConfigMap in the openshift-config + // namespace containing the PEM-encoded CA certificates under the 'ca-bundle.crt' + // key in the data field of the ConfigMap. + // + // +optional + CertificateAuthority ConfigMapNameReference `json:"issuerCertificateAuthority"` +} + +type TokenClaimMappings struct { + // username is a required field that configures how the username of a cluster identity + // should be constructed from the claims in a JWT token issued by the identity provider. + // + // +required + Username UsernameClaimMapping `json:"username"` + + // groups is an optional field that configures how the groups of a cluster identity + // should be constructed from the claims in a JWT token issued + // by the identity provider. + // When referencing a claim, if the claim is present in the JWT + // token, its value must be a list of groups separated by a comma (','). + // For example - '"example"' and '"exampleOne", "exampleTwo", "exampleThree"' are valid claim values. + // + // +optional + Groups PrefixedClaimMapping `json:"groups,omitempty"` + + // uid is an optional field for configuring the claim mapping + // used to construct the uid for the cluster identity. + // + // When using uid.claim to specify the claim it must be a single string value. + // When using uid.expression the expression must result in a single string value. + // + // When omitted, this means the user has no opinion and the platform + // is left to choose a default, which is subject to change over time. + // The current default is to use the 'sub' claim. + // + // +optional + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + UID *TokenClaimOrExpressionMapping `json:"uid,omitempty"` + + // extra is an optional field for configuring the mappings + // used to construct the extra attribute for the cluster identity. + // When omitted, no extra attributes will be present on the cluster identity. + // key values for extra mappings must be unique. + // A maximum of 32 extra attribute mappings may be provided. + // + // +optional + // +kubebuilder:validation:MaxItems=32 + // +listType=map + // +listMapKey=key + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + Extra []ExtraMapping `json:"extra,omitempty"` +} + +// TokenClaimMapping allows specifying a JWT token +// claim to be used when mapping claims from an +// authentication token to cluster identities. +type TokenClaimMapping struct { + // claim is a required field that configures the JWT token + // claim whose value is assigned to the cluster identity + // field associated with this mapping. + // + // +required + Claim string `json:"claim"` +} + +// TokenClaimOrExpressionMapping allows specifying either a JWT +// token claim or CEL expression to be used when mapping claims +// from an authentication token to cluster identities. +// +kubebuilder:validation:XValidation:rule="has(self.claim) ? !has(self.expression) : has(self.expression)",message="precisely one of claim or expression must be set" +type TokenClaimOrExpressionMapping struct { + // claim is an optional field for specifying the + // JWT token claim that is used in the mapping. + // The value of this claim will be assigned to + // the field in which this mapping is associated. + // + // Precisely one of claim or expression must be set. + // claim must not be specified when expression is set. + // When specified, claim must be at least 1 character in length + // and must not exceed 256 characters in length. + // + // +optional + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:MinLength=1 + Claim string `json:"claim,omitempty"` + + // expression is an optional field for specifying a + // CEL expression that produces a string value from + // JWT token claims. + // + // CEL expressions have access to the token claims + // through a CEL variable, 'claims'. + // 'claims' is a map of claim names to claim values. + // For example, the 'sub' claim value can be accessed as 'claims.sub'. + // Nested claims can be accessed using dot notation ('claims.foo.bar'). + // + // Precisely one of claim or expression must be set. + // expression must not be specified when claim is set. + // When specified, expression must be at least 1 character in length + // and must not exceed 1024 characters in length. + // + // +optional + // +kubebuilder:validation:MaxLength=1024 + // +kubebuilder:validation:MinLength=1 + Expression string `json:"expression,omitempty"` +} + +// ExtraMapping allows specifying a key and CEL expression +// to evaluate the keys' value. It is used to create additional +// mappings and attributes added to a cluster identity from +// a provided authentication token. +type ExtraMapping struct { + // key is a required field that specifies the string + // to use as the extra attribute key. + // + // key must be a domain-prefix path (e.g 'example.org/foo'). + // key must not exceed 510 characters in length. + // key must contain the '/' character, separating the domain and path characters. + // key must not be empty. + // + // The domain portion of the key (string of characters prior to the '/') must be a valid RFC1123 subdomain. + // It must not exceed 253 characters in length. + // It must start and end with an alphanumeric character. + // It must only contain lower case alphanumeric characters and '-' or '.'. + // It must not use the reserved domains, or be subdomains of, "kubernetes.io", "k8s.io", and "openshift.io". + // + // The path portion of the key (string of characters after the '/') must not be empty and must consist of at least one + // alphanumeric character, percent-encoded octets, '-', '.', '_', '~', '!', '$', '&', ''', '(', ')', '*', '+', ',', ';', '=', and ':'. + // It must not exceed 256 characters in length. + // + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=510 + // +kubebuilder:validation:XValidation:rule="self.contains('/')",message="key must contain the '/' character" + // + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0].matches(\"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\")",message="the domain of the key must consist of only lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0].size() <= 253",message="the domain of the key must not exceed 253 characters in length" + // + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0] != 'kubernetes.io'",message="the domain 'kubernetes.io' is reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="!self.split('/', 2)[0].endsWith('.kubernetes.io')",message="the subdomains '*.kubernetes.io' are reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0] != 'k8s.io'",message="the domain 'k8s.io' is reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="!self.split('/', 2)[0].endsWith('.k8s.io')",message="the subdomains '*.k8s.io' are reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0] != 'openshift.io'",message="the domain 'openshift.io' is reserved for OpenShift use" + // +kubebuilder:validation:XValidation:rule="!self.split('/', 2)[0].endsWith('.openshift.io')",message="the subdomains '*.openshift.io' are reserved for OpenShift use" + // + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[1].matches('[A-Za-z0-9/\\\\-._~%!$&\\'()*+;=:]+')",message="the path of the key must not be empty and must consist of at least one alphanumeric character, percent-encoded octets, apostrophe, '-', '.', '_', '~', '!', '$', '&', '(', ')', '*', '+', ',', ';', '=', and ':'" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[1].size() <= 256",message="the path of the key must not exceed 256 characters in length" + Key string `json:"key"` + + // valueExpression is a required field to specify the CEL expression to extract + // the extra attribute value from a JWT token's claims. + // valueExpression must produce a string or string array value. + // "", [], and null are treated as the extra mapping not being present. + // Empty string values within an array are filtered out. + // + // CEL expressions have access to the token claims + // through a CEL variable, 'claims'. + // 'claims' is a map of claim names to claim values. + // For example, the 'sub' claim value can be accessed as 'claims.sub'. + // Nested claims can be accessed using dot notation ('claims.foo.bar'). + // + // valueExpression must not exceed 1024 characters in length. + // valueExpression must not be empty. + // + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=1024 + ValueExpression string `json:"valueExpression"` +} + +// OIDCClientConfig configures how platform clients +// interact with identity providers as an authentication +// method +type OIDCClientConfig struct { + // componentName is a required field that specifies the name of the platform + // component being configured to use the identity provider as an authentication mode. + // It is used in combination with componentNamespace as a unique identifier. + // + // componentName must not be an empty string ("") and must not exceed 256 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +required + ComponentName string `json:"componentName"` + + // componentNamespace is a required field that specifies the namespace in which the + // platform component being configured to use the identity provider as an authentication + // mode is running. + // It is used in combination with componentName as a unique identifier. + // + // componentNamespace must not be an empty string ("") and must not exceed 63 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +required + ComponentNamespace string `json:"componentNamespace"` + + // clientID is a required field that configures the client identifier, from + // the identity provider, that the platform component uses for authentication + // requests made to the identity provider. + // The identity provider must accept this identifier for platform components + // to be able to use the identity provider as an authentication mode. + // + // clientID must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + ClientID string `json:"clientID"` + + // clientSecret is an optional field that configures the client secret used + // by the platform component when making authentication requests to the identity provider. + // + // When not specified, no client secret will be used when making authentication requests + // to the identity provider. + // + // When specified, clientSecret references a Secret in the 'openshift-config' + // namespace that contains the client secret in the 'clientSecret' key of the '.data' field. + // The client secret will be used when making authentication requests to the identity provider. + // + // Public clients do not require a client secret but private + // clients do require a client secret to work with the identity provider. + // + // +optional + ClientSecret SecretNameReference `json:"clientSecret"` + + // extraScopes is an optional field that configures the extra scopes that should + // be requested by the platform component when making authentication requests to the + // identity provider. + // This is useful if you have configured claim mappings that requires specific + // scopes to be requested beyond the standard OIDC scopes. + // + // When omitted, no additional scopes are requested. + // + // +listType=set + // +optional + ExtraScopes []string `json:"extraScopes"` +} + +// OIDCClientStatus represents the current state +// of platform components and how they interact with +// the configured identity providers. +type OIDCClientStatus struct { + // componentName is a required field that specifies the name of the platform + // component using the identity provider as an authentication mode. + // It is used in combination with componentNamespace as a unique identifier. + // + // componentName must not be an empty string ("") and must not exceed 256 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +required + ComponentName string `json:"componentName"` + + // componentNamespace is a required field that specifies the namespace in which the + // platform component using the identity provider as an authentication + // mode is running. + // It is used in combination with componentName as a unique identifier. + // + // componentNamespace must not be an empty string ("") and must not exceed 63 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +required + ComponentNamespace string `json:"componentNamespace"` + + // currentOIDCClients is an optional list of clients that the component is currently using. + // Entries must have unique issuerURL/clientID pairs. + // + // +listType=map + // +listMapKey=issuerURL + // +listMapKey=clientID + // +optional + CurrentOIDCClients []OIDCClientReference `json:"currentOIDCClients"` + + // consumingUsers is an optional list of ServiceAccounts requiring + // read permissions on the `clientSecret` secret. + // + // consumingUsers must not exceed 5 entries. + // + // +kubebuilder:validation:MaxItems=5 + // +listType=set + // +optional + ConsumingUsers []ConsumingUser `json:"consumingUsers"` + + // conditions are used to communicate the state of the `oidcClients` entry. + // + // Supported conditions include Available, Degraded and Progressing. + // + // If Available is true, the component is successfully using the configured client. + // If Degraded is true, that means something has gone wrong trying to handle the client configuration. + // If Progressing is true, that means the component is taking some action related to the `oidcClients` entry. + // + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// OIDCClientReference is a reference to a platform component +// client configuration. +type OIDCClientReference struct { + // oidcProviderName is a required reference to the 'name' of the identity provider + // configured in 'oidcProviders' that this client is associated with. + // + // oidcProviderName must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + OIDCProviderName string `json:"oidcProviderName"` + + // issuerURL is a required field that specifies the URL of the identity + // provider that this client is configured to make requests against. + // + // issuerURL must use the 'https' scheme. + // + // +kubebuilder:validation:Pattern=`^https:\/\/[^\s]` + // +required + IssuerURL string `json:"issuerURL"` + + // clientID is a required field that specifies the client identifier, from + // the identity provider, that the platform component is using for authentication + // requests made to the identity provider. + // + // clientID must not be empty. + // + // +kubebuilder:validation:MinLength=1 + // +required + ClientID string `json:"clientID"` +} + +// +kubebuilder:validation:XValidation:rule="has(self.prefixPolicy) && self.prefixPolicy == 'Prefix' ? (has(self.prefix) && size(self.prefix.prefixString) > 0) : !has(self.prefix)",message="prefix must be set if prefixPolicy is 'Prefix', but must remain unset otherwise" +// +union +type UsernameClaimMapping struct { + // claim is a required field that configures the JWT token + // claim whose value is assigned to the cluster identity + // field associated with this mapping. + // + // claim must not be an empty string ("") and must not exceed 256 characters. + // + // +required + // +kubebuilder:validation:MinLength:=1 + // +kubebuilder:validation:MaxLength:=256 + Claim string `json:"claim"` + + // prefixPolicy is an optional field that configures how a prefix should be + // applied to the value of the JWT claim specified in the 'claim' field. + // + // Allowed values are 'Prefix', 'NoPrefix', and omitted (not provided or an empty string). + // + // When set to 'Prefix', the value specified in the prefix field will be + // prepended to the value of the JWT claim. + // The prefix field must be set when prefixPolicy is 'Prefix'. + // + // When set to 'NoPrefix', no prefix will be prepended to the value + // of the JWT claim. + // + // When omitted, this means no opinion and the platform is left to choose + // any prefixes that are applied which is subject to change over time. + // Currently, the platform prepends `{issuerURL}#` to the value of the JWT claim + // when the claim is not 'email'. + // As an example, consider the following scenario: + // `prefix` is unset, `issuerURL` is set to `https://myoidc.tld`, + // the JWT claims include "username":"userA" and "email":"userA@myoidc.tld", + // and `claim` is set to: + // - "username": the mapped value will be "https://myoidc.tld#userA" + // - "email": the mapped value will be "userA@myoidc.tld" + // + // +kubebuilder:validation:Enum={"", "NoPrefix", "Prefix"} + // +optional + // +unionDiscriminator + PrefixPolicy UsernamePrefixPolicy `json:"prefixPolicy"` + + // prefix configures the prefix that should be prepended to the value + // of the JWT claim. + // + // prefix must be set when prefixPolicy is set to 'Prefix' and must be unset otherwise. + // + // +optional + // +unionMember + Prefix *UsernamePrefix `json:"prefix"` +} + +// UsernamePrefixPolicy configures how prefixes should be applied +// to values extracted from the JWT claims during the process of mapping +// JWT claims to cluster identity attributes. +// +enum +type UsernamePrefixPolicy string + +var ( + // NoOpinion let's the cluster assign prefixes. If the username claim is email, there is no prefix + // If the username claim is anything else, it is prefixed by the issuerURL + NoOpinion UsernamePrefixPolicy = "" + + // NoPrefix means the username claim value will not have any prefix + NoPrefix UsernamePrefixPolicy = "NoPrefix" + + // Prefix means the prefix value must be specified. It cannot be empty + Prefix UsernamePrefixPolicy = "Prefix" +) + +// UsernamePrefix configures the string that should +// be used as a prefix for username claim mappings. +type UsernamePrefix struct { + // prefixString is a required field that configures the prefix that will + // be applied to cluster identity username attribute + // during the process of mapping JWT claims to cluster identity attributes. + // + // prefixString must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + PrefixString string `json:"prefixString"` +} + +// PrefixedClaimMapping configures a claim mapping +// that allows for an optional prefix. +type PrefixedClaimMapping struct { + TokenClaimMapping `json:",inline"` + + // prefix is an optional field that configures the prefix that will be + // applied to the cluster identity attribute during the process of mapping + // JWT claims to cluster identity attributes. + // + // When omitted (""), no prefix is applied to the cluster identity attribute. + // + // Example: if `prefix` is set to "myoidc:" and the `claim` in JWT contains + // an array of strings "a", "b" and "c", the mapping will result in an + // array of string "myoidc:a", "myoidc:b" and "myoidc:c". + // + // +optional + Prefix string `json:"prefix"` +} + +// TokenValidationRuleType represents the different +// claim validation rule types that can be configured. +// +enum +type TokenValidationRuleType string + +const ( + TokenValidationRuleTypeRequiredClaim = "RequiredClaim" +) + +type TokenClaimValidationRule struct { + // type is an optional field that configures the type of the validation rule. + // + // Allowed values are 'RequiredClaim' and omitted (not provided or an empty string). + // + // When set to 'RequiredClaim', the Kubernetes API server + // will be configured to validate that the incoming JWT + // contains the required claim and that its value matches + // the required value. + // + // Defaults to 'RequiredClaim'. + // + // +kubebuilder:validation:Enum={"RequiredClaim"} + // +kubebuilder:default="RequiredClaim" + Type TokenValidationRuleType `json:"type"` + + // requiredClaim is an optional field that configures the required claim + // and value that the Kubernetes API server will use to validate if an incoming + // JWT is valid for this identity provider. + // + // +optional + RequiredClaim *TokenRequiredClaim `json:"requiredClaim,omitempty"` +} + +type TokenRequiredClaim struct { + // claim is a required field that configures the name of the required claim. + // When taken from the JWT claims, claim must be a string value. + // + // claim must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + Claim string `json:"claim"` + + // requiredValue is a required field that configures the value that 'claim' must + // have when taken from the incoming JWT claims. + // If the value in the JWT claims does not match, the token + // will be rejected for authentication. + // + // requiredValue must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + RequiredValue string `json:"requiredValue"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_build.go b/vendor/github.com/openshift/api/config/v1/types_build.go index 16882e1caf..dcde1fc5b8 100644 --- a/vendor/github.com/openshift/api/config/v1/types_build.go +++ b/vendor/github.com/openshift/api/config/v1/types_build.go @@ -13,18 +13,29 @@ import ( // This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds. // // The canonical name is "cluster" +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=openshift-controller-manager,operatorOrdering=01 +// +openshift:capability=Build +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=builds,scope=Cluster +// +kubebuilder:subresource:status type Build struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` - // Spec holds user-settable values for the build controller configuration - // +kubebuilder:validation:Required + // spec holds user-settable values for the build controller configuration // +required Spec BuildSpec `json:"spec"` } type BuildSpec struct { - // AdditionalTrustedCA is a reference to a ConfigMap containing additional CAs that + // additionalTrustedCA is a reference to a ConfigMap containing additional CAs that // should be trusted for image pushes and pulls during builds. // The namespace for this config map is openshift-config. // @@ -33,16 +44,16 @@ type BuildSpec struct { // // +optional AdditionalTrustedCA ConfigMapNameReference `json:"additionalTrustedCA"` - // BuildDefaults controls the default information for Builds + // buildDefaults controls the default information for Builds // +optional BuildDefaults BuildDefaults `json:"buildDefaults"` - // BuildOverrides controls override settings for builds + // buildOverrides controls override settings for builds // +optional BuildOverrides BuildOverrides `json:"buildOverrides"` } type BuildDefaults struct { - // DefaultProxy contains the default proxy settings for all build operations, including image pull/push + // defaultProxy contains the default proxy settings for all build operations, including image pull/push // and source download. // // Values can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables @@ -50,55 +61,55 @@ type BuildDefaults struct { // +optional DefaultProxy *ProxySpec `json:"defaultProxy,omitempty"` - // GitProxy contains the proxy settings for git operations only. If set, this will override + // gitProxy contains the proxy settings for git operations only. If set, this will override // any Proxy settings for all git commands, such as git clone. // // Values that are not set here will be inherited from DefaultProxy. // +optional GitProxy *ProxySpec `json:"gitProxy,omitempty"` - // Env is a set of default environment variables that will be applied to the + // env is a set of default environment variables that will be applied to the // build if the specified variables do not exist on the build // +optional Env []corev1.EnvVar `json:"env,omitempty"` - // ImageLabels is a list of docker labels that are applied to the resulting image. + // imageLabels is a list of docker labels that are applied to the resulting image. // User can override a default label by providing a label with the same name in their // Build/BuildConfig. // +optional ImageLabels []ImageLabel `json:"imageLabels,omitempty"` - // Resources defines resource requirements to execute the build. + // resources defines resource requirements to execute the build. // +optional Resources corev1.ResourceRequirements `json:"resources"` } type ImageLabel struct { - // Name defines the name of the label. It must have non-zero length. + // name defines the name of the label. It must have non-zero length. Name string `json:"name"` - // Value defines the literal value of the label. + // value defines the literal value of the label. // +optional Value string `json:"value,omitempty"` } type BuildOverrides struct { - // ImageLabels is a list of docker labels that are applied to the resulting image. + // imageLabels is a list of docker labels that are applied to the resulting image. // If user provided a label in their Build/BuildConfig with the same name as one in this // list, the user's label will be overwritten. // +optional ImageLabels []ImageLabel `json:"imageLabels,omitempty"` - // NodeSelector is a selector which must be true for the build pod to fit on a node + // nodeSelector is a selector which must be true for the build pod to fit on a node // +optional NodeSelector map[string]string `json:"nodeSelector,omitempty"` - // Tolerations is a list of Tolerations that will override any existing + // tolerations is a list of Tolerations that will override any existing // tolerations set on a build pod. // +optional Tolerations []corev1.Toleration `json:"tolerations,omitempty"` - // ForcePull overrides, if set, the equivalent value in the builds, + // forcePull overrides, if set, the equivalent value in the builds, // i.e. false disables force pull for all builds, // true enables force pull for all builds, // independently of what each build specifies itself @@ -108,8 +119,13 @@ type BuildOverrides struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type BuildList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Build `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_image_policy.go b/vendor/github.com/openshift/api/config/v1/types_cluster_image_policy.go new file mode 100644 index 0000000000..ca604e05c5 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_image_policy.go @@ -0,0 +1,87 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterImagePolicy holds cluster-wide configuration for image signature verification +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=clusterimagepolicies,scope=Cluster +// +kubebuilder:subresource:status +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/2310 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +openshift:enable:FeatureGate=SigstoreImageVerification +// +openshift:compatibility-gen:level=1 +type ClusterImagePolicy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata"` + + // spec contains the configuration for the cluster image policy. + // +required + Spec ClusterImagePolicySpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ClusterImagePolicyStatus `json:"status"` +} + +// CLusterImagePolicySpec is the specification of the ClusterImagePolicy custom resource. +type ClusterImagePolicySpec struct { + // scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the "Docker Registry HTTP API V2". + // Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). + // More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository + // namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). + // Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. + // This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. + // In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories + // quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. + // If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. + // For additional details about the format, please refer to the document explaining the docker transport field, + // which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker + // +required + // +kubebuilder:validation:MaxItems=256 + // +listType=set + Scopes []ImageScope `json:"scopes"` + // policy is a required field that contains configuration to allow scopes to be verified, and defines how + // images not matching the verification policy will be treated. + // +required + Policy Policy `json:"policy"` +} + +// +k8s:deepcopy-gen=true +type ClusterImagePolicyStatus struct { + // conditions provide details on the status of this API Resource. + // +kubebuilder:validation:MaxItems=8 + // +kubebuilder:validation:MinItems=1 + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterImagePolicyList is a list of ClusterImagePolicy resources +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ClusterImagePolicyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +required + metav1.ListMeta `json:"metadata"` + + // items is a list of ClusterImagePolices + // +kubebuilder:validation:MaxItems=1000 + // +required + Items []ClusterImagePolicy `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go b/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go index 92f500dfd7..8323040389 100644 --- a/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go @@ -9,15 +9,30 @@ import ( // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// ClusterOperator is the Custom Resource object which holds the current state -// of an operator. This object is used by operators to convey their state to -// the rest of the cluster. +// ClusterOperator holds the status of a core or optional OpenShift component +// managed by the Cluster Version Operator (CVO). This object is used by +// operators to convey their state to the rest of the cluster. +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/497 +// +openshift:file-pattern=cvoRunLevel=0000_00,operatorName=cluster-version-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=clusteroperators,scope=Cluster,shortName=co +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name=Version,JSONPath=.status.versions[?(@.name=="operator")].version,type=string,description=The version the operator is at. +// +kubebuilder:printcolumn:name=Available,JSONPath=.status.conditions[?(@.type=="Available")].status,type=string,description=Whether the operator is running and stable. +// +kubebuilder:printcolumn:name=Progressing,JSONPath=.status.conditions[?(@.type=="Progressing")].status,type=string,description=Whether the operator is processing changes. +// +kubebuilder:printcolumn:name=Degraded,JSONPath=.status.conditions[?(@.type=="Degraded")].status,type=string,description=Whether the operator is degraded. +// +kubebuilder:printcolumn:name=Since,JSONPath=.status.conditions[?(@.type=="Available")].lastTransitionTime,type=date,description=The time the operator's Available status last changed. +// +kubebuilder:metadata:annotations=include.release.openshift.io/self-managed-high-availability=true type ClusterOperator struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata"` // spec holds configuration that could apply to any operator. - // +kubebuilder:validation:Required // +required Spec ClusterOperatorSpec `json:"spec"` @@ -37,6 +52,8 @@ type ClusterOperatorStatus struct { // conditions describes the state of the operator's managed and monitored components. // +patchMergeKey=type // +patchStrategy=merge + // +listType=map + // +listMapKey=type // +optional Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"` @@ -63,14 +80,12 @@ type ClusterOperatorStatus struct { type OperandVersion struct { // name is the name of the particular operand this version is for. It usually matches container images, not operators. - // +kubebuilder:validation:Required // +required Name string `json:"name"` // version indicates which version of a particular operand is currently being managed. It must always match the Available // operand. If 1.0.0 is Available, then this must indicate 1.0.0 even if the operator is trying to rollout // 1.1.0 - // +kubebuilder:validation:Required // +required Version string `json:"version"` } @@ -78,18 +93,15 @@ type OperandVersion struct { // ObjectReference contains enough information to let you inspect or modify the referred object. type ObjectReference struct { // group of the referent. - // +kubebuilder:validation:Required // +required Group string `json:"group"` // resource of the referent. - // +kubebuilder:validation:Required // +required Resource string `json:"resource"` // namespace of the referent. // +optional Namespace string `json:"namespace,omitempty"` // name of the referent. - // +kubebuilder:validation:Required // +required Name string `json:"name"` } @@ -111,17 +123,14 @@ const ( // +k8s:deepcopy-gen=true type ClusterOperatorStatusCondition struct { // type specifies the aspect reported by this condition. - // +kubebuilder:validation:Required // +required Type ClusterStatusConditionType `json:"type"` // status of the condition, one of True, False, Unknown. - // +kubebuilder:validation:Required // +required Status ConditionStatus `json:"status"` // lastTransitionTime is the time of the last update to the current status property. - // +kubebuilder:validation:Required // +required LastTransitionTime metav1.Time `json:"lastTransitionTime"` @@ -140,47 +149,76 @@ type ClusterOperatorStatusCondition struct { type ClusterStatusConditionType string const ( - // Available indicates that the operand (eg: openshift-apiserver for the - // openshift-apiserver-operator), is functional and available in the cluster. - // Available=False means at least part of the component is non-functional, - // and that the condition requires immediate administrator intervention. + // Available indicates that the component (operator and all configured operands) + // is functional and available in the cluster. Available=False means at least + // part of the component is non-functional, and that the condition requires + // immediate administrator intervention. + // A component must not report Available=False during the course of a normal upgrade. OperatorAvailable ClusterStatusConditionType = "Available" - // Progressing indicates that the operator is actively rolling out new code, - // propagating config changes, or otherwise moving from one steady state to - // another. Operators should not report progressing when they are reconciling - // a previously known state. + // Progressing indicates that the component (operator and all configured operands) + // is actively rolling out new code, propagating config changes (e.g, a version change), or otherwise + // moving from one steady state to another. Operators should not report + // Progressing when they are reconciling (without action) a previously known + // state. Operators should not report Progressing only because DaemonSets owned by them + // are adjusting to a new node from cluster scaleup or a node rebooting from cluster upgrade. + // If the observed cluster state has changed and the component is + // reacting to it (updated proxy configuration for instance), Progressing should become true + // since it is moving from one steady state to another. + // A component in a cluster with less than 250 nodes must complete a version + // change within a limited period of time: 90 minutes for Machine Config Operator and 20 minutes for others. + // Machine Config Operator is given more time as it needs to restart control plane nodes. OperatorProgressing ClusterStatusConditionType = "Progressing" - // Degraded indicates that the operator's current state does not match its - // desired state over a period of time resulting in a lower quality of service. - // The period of time may vary by component, but a Degraded state represents - // persistent observation of a condition. As a result, a component should not - // oscillate in and out of Degraded state. A service may be Available even - // if its degraded. For example, your service may desire 3 running pods, but 1 - // pod is crash-looping. The service is Available but Degraded because it - // may have a lower quality of service. A component may be Progressing but - // not Degraded because the transition from one state to another does not - // persist over a long enough period to report Degraded. A service should not - // report Degraded during the course of a normal upgrade. A service may report - // Degraded in response to a persistent infrastructure failure that requires - // eventual administrator intervention. For example, if a control plane host - // is unhealthy and must be replaced. An operator should report Degraded if - // unexpected errors occur over a period, but the expectation is that all - // unexpected errors are handled as operators mature. + // Degraded indicates that the component (operator and all configured operands) + // does not match its desired state over a period of time resulting in a lower + // quality of service. The period of time may vary by component, but a Degraded + // state represents persistent observation of a condition. As a result, a + // component should not oscillate in and out of Degraded state. A component may + // be Available even if its degraded. For example, a component may desire 3 + // running pods, but 1 pod is crash-looping. The component is Available but + // Degraded because it may have a lower quality of service. A component may be + // Progressing but not Degraded because the transition from one state to + // another does not persist over a long enough period to report Degraded. A + // component must not report Degraded during the course of a normal upgrade. + // A component may report Degraded in response to a persistent infrastructure + // failure that requires eventual administrator intervention. For example, if + // a control plane host is unhealthy and must be replaced. A component should + // report Degraded if unexpected errors occur over a period, but the + // expectation is that all unexpected errors are handled as operators mature. OperatorDegraded ClusterStatusConditionType = "Degraded" - // Upgradeable indicates whether the operator is in a state that is safe to upgrade. When status is `False` - // administrators should not upgrade their cluster and the message field should contain a human readable description - // of what the administrator should do to allow the operator to successfully update. A missing condition, True, - // and Unknown are all treated by the CVO as allowing an upgrade. + // Upgradeable indicates whether the component (operator and all configured + // operands) is safe to upgrade based on the current cluster state. When + // Upgradeable is False, the cluster-version operator will prevent the + // cluster from performing impacted updates unless forced. When set on + // ClusterVersion, the message will explain which updates (minor or patch) + // are impacted. When set on ClusterOperator, False will block minor + // OpenShift updates. The message field should contain a human readable + // description of what the administrator should do to allow the cluster or + // component to successfully update. The cluster-version operator will + // allow updates when this condition is not False, including when it is + // missing, True, or Unknown. OperatorUpgradeable ClusterStatusConditionType = "Upgradeable" + + // EvaluationConditionsDetected is used to indicate the result of the detection + // logic that was added to a component to evaluate the introduction of an + // invasive change that could potentially result in highly visible alerts, + // breakages or upgrade failures. You can concatenate multiple Reason using + // the "::" delimiter if you need to evaluate the introduction of multiple changes. + EvaluationConditionsDetected ClusterStatusConditionType = "EvaluationConditionsDetected" ) // ClusterOperatorList is a list of OperatorStatus resources. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 type ClusterOperatorList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []ClusterOperator `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_version.go b/vendor/github.com/openshift/api/config/v1/types_cluster_version.go index 58a65228da..7929f4b625 100644 --- a/vendor/github.com/openshift/api/config/v1/types_cluster_version.go +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_version.go @@ -10,13 +10,30 @@ import ( // ClusterVersion is the configuration for the ClusterVersionOperator. This is where // parameters related to automatic updates can be set. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/495 +// +openshift:file-pattern=cvoRunLevel=0000_00,operatorName=cluster-version-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:path=clusterversions,scope=Cluster +// +kubebuilder:validation:XValidation:rule="has(self.spec.capabilities) && has(self.spec.capabilities.additionalEnabledCapabilities) && self.spec.capabilities.baselineCapabilitySet == 'None' && 'marketplace' in self.spec.capabilities.additionalEnabledCapabilities ? 'OperatorLifecycleManager' in self.spec.capabilities.additionalEnabledCapabilities || (has(self.status) && has(self.status.capabilities) && has(self.status.capabilities.enabledCapabilities) && 'OperatorLifecycleManager' in self.status.capabilities.enabledCapabilities) : true",message="the `marketplace` capability requires the `OperatorLifecycleManager` capability, which is neither explicitly or implicitly enabled in this cluster, please enable the `OperatorLifecycleManager` capability" +// +kubebuilder:printcolumn:name=Version,JSONPath=.status.history[?(@.state=="Completed")].version,type=string +// +kubebuilder:printcolumn:name=Available,JSONPath=.status.conditions[?(@.type=="Available")].status,type=string +// +kubebuilder:printcolumn:name=Progressing,JSONPath=.status.conditions[?(@.type=="Progressing")].status,type=string +// +kubebuilder:printcolumn:name=Since,JSONPath=.status.conditions[?(@.type=="Progressing")].lastTransitionTime,type=date +// +kubebuilder:printcolumn:name=Status,JSONPath=.status.conditions[?(@.type=="Progressing")].message,type=string +// +kubebuilder:metadata:annotations=include.release.openshift.io/self-managed-high-availability=true type ClusterVersion struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec is the desired state of the cluster version - the operator will work // to ensure that the desired version is applied to the cluster. - // +kubebuilder:validation:Required // +required Spec ClusterVersionSpec `json:"spec"` // status contains information about the available updates and any in-progress @@ -33,7 +50,6 @@ type ClusterVersionSpec struct { // clusterID uniquely identifies this cluster. This is expected to be // an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in // hexadecimal values). This is a required field. - // +kubebuilder:validation:Required // +required ClusterID ClusterID `json:"clusterID"` @@ -42,13 +58,24 @@ type ClusterVersionSpec struct { // the current version does not match the desired version). The set of // recommended update values is listed as part of available updates in // status, and setting values outside that range may cause the upgrade - // to fail. You may specify the version field without setting image if - // an update exists with that version in the availableUpdates or history. + // to fail. + // + // Some of the fields are inter-related with restrictions and meanings described here. + // 1. image is specified, version is specified, architecture is specified. API validation error. + // 2. image is specified, version is specified, architecture is not specified. The version extracted from the referenced image must match the specified version. + // 3. image is specified, version is not specified, architecture is specified. API validation error. + // 4. image is specified, version is not specified, architecture is not specified. image is used. + // 5. image is not specified, version is specified, architecture is specified. version and desired architecture are used to select an image. + // 6. image is not specified, version is specified, architecture is not specified. version and current architecture are used to select an image. + // 7. image is not specified, version is not specified, architecture is specified. API validation error. + // 8. image is not specified, version is not specified, architecture is not specified. API validation error. // // If an upgrade fails the operator will halt and report status // about the failing component. Setting the desired update value back to - // the previous version will cause a rollback to be attempted. Not all - // rollbacks will succeed. + // the previous version will cause a rollback to be attempted if the + // previous version is within the current minor version. Not all + // rollbacks will succeed, and some may unrecoverably break the + // cluster. // // +optional DesiredUpdate *Update `json:"desiredUpdate,omitempty"` @@ -58,16 +85,45 @@ type ClusterVersionSpec struct { // // +optional Upstream URL `json:"upstream,omitempty"` - // channel is an identifier for explicitly requesting that a non-default - // set of updates be applied to this cluster. The default channel will be + // channel is an identifier for explicitly requesting a non-default set + // of updates to be applied to this cluster. The default channel will // contain stable updates that are appropriate for production clusters. // // +optional Channel string `json:"channel,omitempty"` + // capabilities configures the installation of optional, core + // cluster components. A null value here is identical to an + // empty object; see the child properties for default semantics. + // +optional + Capabilities *ClusterVersionCapabilitiesSpec `json:"capabilities,omitempty"` + + // signatureStores contains the upstream URIs to verify release signatures and optional + // reference to a config map by name containing the PEM-encoded CA bundle. + // + // By default, CVO will use existing signature stores if this property is empty. + // The CVO will check the release signatures in the local ConfigMaps first. It will search for a valid signature + // in these stores in parallel only when local ConfigMaps did not include a valid signature. + // Validation will fail if none of the signature stores reply with valid signature before timeout. + // Setting signatureStores will replace the default signature stores with custom signature stores. + // Default stores can be used with custom signature stores by adding them manually. + // + // A maximum of 32 signature stores may be configured. + // +kubebuilder:validation:MaxItems=32 + // +openshift:enable:FeatureGate=SignatureStores + // +listType=map + // +listMapKey=url + // +optional + SignatureStores []SignatureStore `json:"signatureStores"` + // overrides is list of overides for components that are managed by // cluster version operator. Marking a component unmanaged will prevent // the operator from creating or updating the object. + // +listType=map + // +listMapKey=kind + // +listMapKey=group + // +listMapKey=namespace + // +listMapKey=name // +optional Overrides []ComponentOverride `json:"overrides,omitempty"` } @@ -82,7 +138,6 @@ type ClusterVersionStatus struct { // desired is the version that the cluster is reconciling towards. // If the cluster is not yet fully initialized desired will be set // with the information available, which may be an image or a tag. - // +kubebuilder:validation:Required // +required Desired Release `json:"desired"` @@ -93,23 +148,26 @@ type ClusterVersionStatus struct { // Completed if the rollout completed - if an update was failing or halfway // applied the state will be Partial. Only a limited amount of update history // is preserved. + // +listType=atomic // +optional History []UpdateHistory `json:"history,omitempty"` // observedGeneration reports which version of the spec is being synced. // If this value is not equal to metadata.generation, then the desired // and conditions fields may represent a previous version. - // +kubebuilder:validation:Required // +required ObservedGeneration int64 `json:"observedGeneration"` // versionHash is a fingerprint of the content that the cluster will be // updated with. It is used by the operator to avoid unnecessary work // and is for internal use only. - // +kubebuilder:validation:Required // +required VersionHash string `json:"versionHash"` + // capabilities describes the state of optional, core cluster components. + // +optional + Capabilities ClusterVersionCapabilitiesStatus `json:"capabilities"` + // conditions provides information about the cluster version. The condition // "Available" is set to true if the desiredUpdate has been reached. The // condition "Progressing" is set to true if an update is being applied. @@ -117,17 +175,33 @@ type ClusterVersionStatus struct { // by a temporary or permanent error. Conditions are only valid for the // current desiredUpdate when metadata.generation is equal to // status.generation. + // +listType=map + // +listMapKey=type + // +patchMergeKey=type + // +patchStrategy=merge // +optional - Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty"` + Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"` - // availableUpdates contains the list of updates that are appropriate - // for this cluster. This list may be empty if no updates are recommended, - // if the update service is unavailable, or if an invalid channel has - // been specified. + // availableUpdates contains updates recommended for this + // cluster. Updates which appear in conditionalUpdates but not in + // availableUpdates may expose this cluster to known issues. This list + // may be empty if no updates are recommended, if the update service + // is unavailable, or if an invalid channel has been specified. // +nullable - // +kubebuilder:validation:Required + // +listType=atomic // +required AvailableUpdates []Release `json:"availableUpdates"` + + // conditionalUpdates contains the list of updates that may be + // recommended for this cluster if it meets specific required + // conditions. Consumers interested in the set of updates that are + // actually recommended for this cluster should use + // availableUpdates. This list may be empty if no updates are + // recommended, if the update service is unavailable, or if an empty + // or invalid channel has been specified. + // +listType=atomic + // +optional + ConditionalUpdates []ConditionalUpdate `json:"conditionalUpdates,omitempty"` } // UpdateState is a constant representing whether an update was successfully @@ -149,71 +223,463 @@ type UpdateHistory struct { // indicates the update is not fully applied, while the Completed state // indicates the update was successfully rolled out at least once (all // parts of the update successfully applied). - // +kubebuilder:validation:Required // +required State UpdateState `json:"state"` // startedTime is the time at which the update was started. - // +kubebuilder:validation:Required // +required StartedTime metav1.Time `json:"startedTime"` + // completionTime, if set, is when the update was fully applied. The update // that is currently being applied will have a null completion time. // Completion time will always be set for entries that are not the current // update (usually to the started time of the next update). - // +kubebuilder:validation:Required // +required // +nullable CompletionTime *metav1.Time `json:"completionTime"` - // version is a semantic versioning identifying the update version. If the + // version is a semantic version identifying the update version. If the // requested image does not define a version, or if a failure occurs // retrieving the image, this value may be empty. // // +optional Version string `json:"version"` + // image is a container image location that contains the update. This value // is always populated. - // +kubebuilder:validation:Required // +required Image string `json:"image"` + // verified indicates whether the provided update was properly verified // before it was installed. If this is false the cluster may not be trusted. - // +kubebuilder:validation:Required + // Verified does not cover upgradeable checks that depend on the cluster + // state at the time when the update target was accepted. // +required Verified bool `json:"verified"` + + // acceptedRisks records risks which were accepted to initiate the update. + // For example, it may menition an Upgradeable=False or missing signature + // that was overridden via desiredUpdate.force, or an update that was + // initiated despite not being in the availableUpdates set of recommended + // update targets. + // +optional + AcceptedRisks string `json:"acceptedRisks,omitempty"` } // ClusterID is string RFC4122 uuid. type ClusterID string +// ClusterVersionArchitecture enumerates valid cluster architectures. +// +kubebuilder:validation:Enum="Multi";"" +type ClusterVersionArchitecture string + +const ( + // ClusterVersionArchitectureMulti identifies a multi architecture. A multi + // architecture cluster is capable of running nodes with multiple architectures. + ClusterVersionArchitectureMulti ClusterVersionArchitecture = "Multi" +) + +// ClusterVersionCapability enumerates optional, core cluster components. +// +kubebuilder:validation:Enum=openshift-samples;baremetal;marketplace;Console;Insights;Storage;CSISnapshot;NodeTuning;MachineAPI;Build;DeploymentConfig;ImageRegistry;OperatorLifecycleManager;CloudCredential;Ingress;CloudControllerManager;OperatorLifecycleManagerV1 +type ClusterVersionCapability string + +const ( + // ClusterVersionCapabilityOpenShiftSamples manages the sample + // image streams and templates stored in the openshift + // namespace, and any registry credentials, stored as a secret, + // needed for the image streams to import the images they + // reference. + ClusterVersionCapabilityOpenShiftSamples ClusterVersionCapability = "openshift-samples" + + // ClusterVersionCapabilityBaremetal manages the cluster + // baremetal operator which is responsible for running the metal3 + // deployment. + ClusterVersionCapabilityBaremetal ClusterVersionCapability = "baremetal" + + // ClusterVersionCapabilityMarketplace manages the Marketplace operator which + // supplies Operator Lifecycle Manager (OLM) users with default catalogs of + // "optional" operators. + // + // Note that Marketplace has a hard requirement on OLM. OLM can not be disabled + // while Marketplace is enabled. + ClusterVersionCapabilityMarketplace ClusterVersionCapability = "marketplace" + + // ClusterVersionCapabilityConsole manages the Console operator which + // installs and maintains the web console. + ClusterVersionCapabilityConsole ClusterVersionCapability = "Console" + + // ClusterVersionCapabilityInsights manages the Insights operator which + // collects anonymized information about the cluster to generate + // recommendations for possible cluster issues. + ClusterVersionCapabilityInsights ClusterVersionCapability = "Insights" + + // ClusterVersionCapabilityStorage manages the storage operator which + // is responsible for providing cluster-wide storage defaults + // WARNING: Do not disable this capability when deployed to + // RHEV and OpenStack without reading the docs. + // These clusters heavily rely on that capability and may cause + // damage to the cluster. + ClusterVersionCapabilityStorage ClusterVersionCapability = "Storage" + + // ClusterVersionCapabilityCSISnapshot manages the csi snapshot + // controller operator which is responsible for watching the + // VolumeSnapshot CRD objects and manages the creation and deletion + // lifecycle of volume snapshots + ClusterVersionCapabilityCSISnapshot ClusterVersionCapability = "CSISnapshot" + + // ClusterVersionCapabilityNodeTuning manages the Node Tuning Operator + // which is responsible for watching the Tuned and Profile CRD + // objects and manages the containerized TuneD daemon which controls + // system level tuning of Nodes + ClusterVersionCapabilityNodeTuning ClusterVersionCapability = "NodeTuning" + + // ClusterVersionCapabilityMachineAPI manages + // machine-api-operator + // cluster-autoscaler-operator + // cluster-control-plane-machine-set-operator + // which is responsible for machines configuration and heavily + // targeted for SNO clusters. + // + // The following CRDs are disabled as well + // machines + // machineset + // controlplanemachineset + // + // WARNING: Do not disable that capability without reading + // documentation. This is important part of openshift system + // and may cause cluster damage + ClusterVersionCapabilityMachineAPI ClusterVersionCapability = "MachineAPI" + + // ClusterVersionCapabilityBuild manages the Build API which is responsible + // for watching the Build API objects and managing their lifecycle. + // The functionality is located under openshift-apiserver and openshift-controller-manager. + // + // The following resources are taken into account: + // - builds + // - buildconfigs + ClusterVersionCapabilityBuild ClusterVersionCapability = "Build" + + // ClusterVersionCapabilityDeploymentConfig manages the DeploymentConfig API + // which is responsible for watching the DeploymentConfig API and managing their lifecycle. + // The functionality is located under openshift-apiserver and openshift-controller-manager. + // + // The following resources are taken into account: + // - deploymentconfigs + ClusterVersionCapabilityDeploymentConfig ClusterVersionCapability = "DeploymentConfig" + + // ClusterVersionCapabilityImageRegistry manages the image registry which + // allows to distribute Docker images + ClusterVersionCapabilityImageRegistry ClusterVersionCapability = "ImageRegistry" + + // ClusterVersionCapabilityOperatorLifecycleManager manages the Operator Lifecycle Manager (legacy) + // which itself manages the lifecycle of operators + ClusterVersionCapabilityOperatorLifecycleManager ClusterVersionCapability = "OperatorLifecycleManager" + + // ClusterVersionCapabilityOperatorLifecycleManagerV1 manages the Operator Lifecycle Manager (v1) + // which itself manages the lifecycle of operators + ClusterVersionCapabilityOperatorLifecycleManagerV1 ClusterVersionCapability = "OperatorLifecycleManagerV1" + + // ClusterVersionCapabilityCloudCredential manages credentials for cloud providers + // in openshift cluster + ClusterVersionCapabilityCloudCredential ClusterVersionCapability = "CloudCredential" + + // ClusterVersionCapabilityIngress manages the cluster ingress operator + // which is responsible for running the ingress controllers (including OpenShift router). + // + // The following CRDs are part of the capability as well: + // IngressController + // DNSRecord + // GatewayClass + // Gateway + // HTTPRoute + // ReferenceGrant + // + // WARNING: This capability cannot be disabled on the standalone OpenShift. + ClusterVersionCapabilityIngress ClusterVersionCapability = "Ingress" + + // ClusterVersionCapabilityCloudControllerManager manages various Cloud Controller + // Managers deployed on top of OpenShift. They help you to work with cloud + // provider API and embeds cloud-specific control logic. + ClusterVersionCapabilityCloudControllerManager ClusterVersionCapability = "CloudControllerManager" +) + +// KnownClusterVersionCapabilities includes all known optional, core cluster components. +var KnownClusterVersionCapabilities = []ClusterVersionCapability{ + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityOperatorLifecycleManagerV1, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, +} + +// ClusterVersionCapabilitySet defines sets of cluster version capabilities. +// +kubebuilder:validation:Enum=None;v4.11;v4.12;v4.13;v4.14;v4.15;v4.16;v4.17;v4.18;vCurrent +type ClusterVersionCapabilitySet string + +const ( + // ClusterVersionCapabilitySetNone is an empty set enabling + // no optional capabilities. + ClusterVersionCapabilitySetNone ClusterVersionCapabilitySet = "None" + + // ClusterVersionCapabilitySet4_11 is the recommended set of + // optional capabilities to enable for the 4.11 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_11 ClusterVersionCapabilitySet = "v4.11" + + // ClusterVersionCapabilitySet4_12 is the recommended set of + // optional capabilities to enable for the 4.12 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_12 ClusterVersionCapabilitySet = "v4.12" + + // ClusterVersionCapabilitySet4_13 is the recommended set of + // optional capabilities to enable for the 4.13 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_13 ClusterVersionCapabilitySet = "v4.13" + + // ClusterVersionCapabilitySet4_14 is the recommended set of + // optional capabilities to enable for the 4.14 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_14 ClusterVersionCapabilitySet = "v4.14" + + // ClusterVersionCapabilitySet4_15 is the recommended set of + // optional capabilities to enable for the 4.15 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_15 ClusterVersionCapabilitySet = "v4.15" + + // ClusterVersionCapabilitySet4_16 is the recommended set of + // optional capabilities to enable for the 4.16 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_16 ClusterVersionCapabilitySet = "v4.16" + + // ClusterVersionCapabilitySet4_17 is the recommended set of + // optional capabilities to enable for the 4.17 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_17 ClusterVersionCapabilitySet = "v4.17" + + // ClusterVersionCapabilitySet4_18 is the recommended set of + // optional capabilities to enable for the 4.18 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_18 ClusterVersionCapabilitySet = "v4.18" + + // ClusterVersionCapabilitySetCurrent is the recommended set + // of optional capabilities to enable for the cluster's + // current version of OpenShift. + ClusterVersionCapabilitySetCurrent ClusterVersionCapabilitySet = "vCurrent" +) + +// ClusterVersionCapabilitySets defines sets of cluster version capabilities. +var ClusterVersionCapabilitySets = map[ClusterVersionCapabilitySet][]ClusterVersionCapability{ + ClusterVersionCapabilitySetNone: {}, + ClusterVersionCapabilitySet4_11: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityMachineAPI, + }, + ClusterVersionCapabilitySet4_12: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityMachineAPI, + }, + ClusterVersionCapabilitySet4_13: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + }, + ClusterVersionCapabilitySet4_14: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + }, + ClusterVersionCapabilitySet4_15: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityCloudCredential, + }, + ClusterVersionCapabilitySet4_16: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, + ClusterVersionCapabilitySet4_17: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, + ClusterVersionCapabilitySet4_18: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityOperatorLifecycleManagerV1, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, + ClusterVersionCapabilitySetCurrent: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityOperatorLifecycleManagerV1, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, +} + +// ClusterVersionCapabilitiesSpec selects the managed set of +// optional, core cluster components. +// +k8s:deepcopy-gen=true +type ClusterVersionCapabilitiesSpec struct { + // baselineCapabilitySet selects an initial set of + // optional capabilities to enable, which can be extended via + // additionalEnabledCapabilities. If unset, the cluster will + // choose a default, and the default may change over time. + // The current default is vCurrent. + // +optional + BaselineCapabilitySet ClusterVersionCapabilitySet `json:"baselineCapabilitySet,omitempty"` + + // additionalEnabledCapabilities extends the set of managed + // capabilities beyond the baseline defined in + // baselineCapabilitySet. The default is an empty set. + // +listType=atomic + // +optional + AdditionalEnabledCapabilities []ClusterVersionCapability `json:"additionalEnabledCapabilities,omitempty"` +} + +// ClusterVersionCapabilitiesStatus describes the state of optional, +// core cluster components. +// +k8s:deepcopy-gen=true +type ClusterVersionCapabilitiesStatus struct { + // enabledCapabilities lists all the capabilities that are currently managed. + // +listType=atomic + // +optional + EnabledCapabilities []ClusterVersionCapability `json:"enabledCapabilities,omitempty"` + + // knownCapabilities lists all the capabilities known to the current cluster. + // +listType=atomic + // +optional + KnownCapabilities []ClusterVersionCapability `json:"knownCapabilities,omitempty"` +} + // ComponentOverride allows overriding cluster version operator's behavior // for a component. // +k8s:deepcopy-gen=true type ComponentOverride struct { // kind indentifies which object to override. - // +kubebuilder:validation:Required // +required Kind string `json:"kind"` // group identifies the API group that the kind is in. - // +kubebuilder:validation:Required // +required Group string `json:"group"` // namespace is the component's namespace. If the resource is cluster // scoped, the namespace should be empty. - // +kubebuilder:validation:Required // +required Namespace string `json:"namespace"` // name is the component's name. - // +kubebuilder:validation:Required // +required Name string `json:"name"` // unmanaged controls if cluster version operator should stop managing the // resources in this cluster. // Default: false - // +kubebuilder:validation:Required // +required Unmanaged bool `json:"unmanaged"` } @@ -222,30 +688,48 @@ type ComponentOverride struct { type URL string // Update represents an administrator update request. +// +kubebuilder:validation:XValidation:rule="has(self.architecture) && has(self.image) ? (self.architecture == \"\" || self.image == \"\") : true",message="cannot set both Architecture and Image" +// +kubebuilder:validation:XValidation:rule="has(self.architecture) && self.architecture != \"\" ? self.version != \"\" : true",message="Version must be set if Architecture is set" // +k8s:deepcopy-gen=true type Update struct { - // version is a semantic versioning identifying the update version. When this - // field is part of spec, version is optional if image is specified. + // architecture is an optional field that indicates the desired + // value of the cluster architecture. In this context cluster + // architecture means either a single architecture or a multi + // architecture. architecture can only be set to Multi thereby + // only allowing updates from single to multi architecture. If + // architecture is set, image cannot be set and version must be + // set. + // Valid values are 'Multi' and empty. + // + // +optional + Architecture ClusterVersionArchitecture `json:"architecture"` + + // version is a semantic version identifying the update version. + // version is required if architecture is specified. + // If both version and image are set, the version extracted from the referenced image must match the specified version. // // +optional Version string `json:"version"` - // image is a container image location that contains the update. When this - // field is part of spec, image is optional if version is specified and the - // availableUpdates field contains a matching version. + + // image is a container image location that contains the update. + // image should be used when the desired version does not exist in availableUpdates or history. + // When image is set, architecture cannot be specified. + // If both version and image are set, the version extracted from the referenced image must match the specified version. // // +optional Image string `json:"image"` + // force allows an administrator to update to an image that has failed - // verification, does not appear in the availableUpdates list, or otherwise - // would be blocked by normal protections on update. This option should only - // be used when the authenticity of the provided image has been verified out - // of band because the provided image will run with full administrative access + // verification or upgradeable checks that are designed to keep your + // cluster safe. Only use this if: + // * you are testing unsigned release images in short-lived test clusters or + // * you are working around a known bug in the cluster-version + // operator and you have verified the authenticity of the provided + // image yourself. + // The provided image will run with full administrative access // to the cluster. Do not use this flag with images that comes from unknown // or potentially malicious sources. // - // This flag does not override other forms of consistency checking that are - // required before a new update is deployed. - // // +optional Force bool `json:"force"` } @@ -253,7 +737,17 @@ type Update struct { // Release represents an OpenShift release image and associated metadata. // +k8s:deepcopy-gen=true type Release struct { - // version is a semantic versioning identifying the update version. When this + // architecture is an optional field that indicates the + // value of the cluster architecture. In this context cluster + // architecture means either a single architecture or a multi + // architecture. + // Valid values are 'Multi' and empty. + // + // +openshift:enable:FeatureGate=ImageStreamImportMode + // +optional + Architecture ClusterVersionArchitecture `json:"architecture,omitempty"` + + // version is a semantic version identifying the update version. When this // field is part of spec, version is optional if image is specified. // +required Version string `json:"version"` @@ -274,6 +768,7 @@ type Release struct { // channels is the set of Cincinnati channels to which the release // currently belongs. + // +listType=set // +optional Channels []string `json:"channels,omitempty"` } @@ -284,11 +779,136 @@ type Release struct { // availableUpdates field is accurate and recent. const RetrievedUpdates ClusterStatusConditionType = "RetrievedUpdates" +// ConditionalUpdate represents an update which is recommended to some +// clusters on the version the current cluster is reconciling, but which +// may not be recommended for the current cluster. +type ConditionalUpdate struct { + // release is the target of the update. + // +required + Release Release `json:"release"` + + // risks represents the range of issues associated with + // updating to the target release. The cluster-version + // operator will evaluate all entries, and only recommend the + // update if there is at least one entry and all entries + // recommend the update. + // +kubebuilder:validation:MinItems=1 + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +required + Risks []ConditionalUpdateRisk `json:"risks" patchStrategy:"merge" patchMergeKey:"name"` + + // conditions represents the observations of the conditional update's + // current status. Known types are: + // * Recommended, for whether the update is recommended for the current cluster. + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// ConditionalUpdateRisk represents a reason and cluster-state +// for not recommending a conditional update. +// +k8s:deepcopy-gen=true +type ConditionalUpdateRisk struct { + // url contains information about this risk. + // +kubebuilder:validation:Format=uri + // +kubebuilder:validation:MinLength=1 + // +required + URL string `json:"url"` + + // name is the CamelCase reason for not recommending a + // conditional update, in the event that matchingRules match the + // cluster state. + // +kubebuilder:validation:MinLength=1 + // +required + Name string `json:"name"` + + // message provides additional information about the risk of + // updating, in the event that matchingRules match the cluster + // state. This is only to be consumed by humans. It may + // contain Line Feed characters (U+000A), which should be + // rendered as new lines. + // +kubebuilder:validation:MinLength=1 + // +required + Message string `json:"message"` + + // matchingRules is a slice of conditions for deciding which + // clusters match the risk and which do not. The slice is + // ordered by decreasing precedence. The cluster-version + // operator will walk the slice in order, and stop after the + // first it can successfully evaluate. If no condition can be + // successfully evaluated, the update will not be recommended. + // +kubebuilder:validation:MinItems=1 + // +listType=atomic + // +required + MatchingRules []ClusterCondition `json:"matchingRules"` +} + +// ClusterCondition is a union of typed cluster conditions. The 'type' +// property determines which of the type-specific properties are relevant. +// When evaluated on a cluster, the condition may match, not match, or +// fail to evaluate. +// +k8s:deepcopy-gen=true +type ClusterCondition struct { + // type represents the cluster-condition type. This defines + // the members and semantics of any additional properties. + // +kubebuilder:validation:Enum={"Always","PromQL"} + // +required + Type string `json:"type"` + + // promql represents a cluster condition based on PromQL. + // +optional + PromQL *PromQLClusterCondition `json:"promql,omitempty"` +} + +// PromQLClusterCondition represents a cluster condition based on PromQL. +type PromQLClusterCondition struct { + // promql is a PromQL query classifying clusters. This query + // query should return a 1 in the match case and a 0 in the + // does-not-match case. Queries which return no time + // series, or which return values besides 0 or 1, are + // evaluation failures. + // +required + PromQL string `json:"promql"` +} + // ClusterVersionList is a list of ClusterVersion resources. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 type ClusterVersionList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []ClusterVersion `json:"items"` } + +// SignatureStore represents the URL of custom Signature Store +type SignatureStore struct { + + // url contains the upstream custom signature store URL. + // url should be a valid absolute http/https URI of an upstream signature store as per rfc1738. + // This must be provided and cannot be empty. + // + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="url must be a valid absolute URL" + // +required + URL string `json:"url"` + + // ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // The key "ca.crt" is used to locate the data. + // If specified and the config map or expected key is not found, the signature store is not honored. + // If the specified ca data is not valid, the signature store is not honored. + // If empty, we fall back to the CA configured via Proxy, which is appended to the default system roots. + // The namespace for this config map is openshift-config. + // +optional + CA ConfigMapNameReference `json:"ca"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_console.go b/vendor/github.com/openshift/api/config/v1/types_console.go index d64219300d..dc6967bf15 100644 --- a/vendor/github.com/openshift/api/config/v1/types_console.go +++ b/vendor/github.com/openshift/api/config/v1/types_console.go @@ -11,12 +11,23 @@ import ( // Console holds cluster-wide configuration for the web console, including the // logout URL, and reports the public URL of the console. The canonical name is // `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=consoles,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Console struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec ConsoleSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -34,13 +45,19 @@ type ConsoleSpec struct { type ConsoleStatus struct { // The URL for the console. This will be derived from the host for the route that // is created for the console. + // +optional ConsoleURL string `json:"consoleURL"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ConsoleList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Console `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_dns.go b/vendor/github.com/openshift/api/config/v1/types_dns.go index 989ef99c3c..06eb75ccf7 100644 --- a/vendor/github.com/openshift/api/config/v1/types_dns.go +++ b/vendor/github.com/openshift/api/config/v1/types_dns.go @@ -7,12 +7,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // DNS holds cluster-wide information about DNS. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=dnses,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type DNS struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec DNSSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -47,6 +58,12 @@ type DNSSpec struct { // // +optional PrivateZone *DNSZone `json:"privateZone,omitempty"` + // platform holds configuration specific to the underlying + // infrastructure provider for DNS. + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // +optional + Platform DNSPlatformSpec `json:"platform,omitempty"` } // DNSZone is used to define a DNS hosted zone. @@ -79,9 +96,45 @@ type DNSStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type DNSList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []DNS `json:"items"` } + +// DNSPlatformSpec holds cloud-provider-specific configuration +// for DNS administration. +// +union +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'AWS' ? has(self.aws) : !has(self.aws)",message="aws configuration is required when platform is AWS, and forbidden otherwise" +type DNSPlatformSpec struct { + // type is the underlying infrastructure provider for the cluster. + // Allowed values: "", "AWS". + // + // Individual components may not support all platforms, + // and must handle unrecognized platforms with best-effort defaults. + // + // +unionDiscriminator + // +required + // +kubebuilder:validation:XValidation:rule="self in ['','AWS']",message="allowed values are '' and 'AWS'" + Type PlatformType `json:"type"` + + // aws contains DNS configuration specific to the Amazon Web Services cloud provider. + // +optional + AWS *AWSDNSSpec `json:"aws"` +} + +// AWSDNSSpec contains DNS configuration specific to the Amazon Web Services cloud provider. +type AWSDNSSpec struct { + // privateZoneIAMRole contains the ARN of an IAM role that should be assumed when performing + // operations on the cluster's private hosted zone specified in the cluster DNS config. + // When left empty, no role should be assumed. + // +kubebuilder:validation:Pattern:=`^arn:(aws|aws-cn|aws-us-gov):iam::[0-9]{12}:role\/.*$` + // +optional + PrivateZoneIAMRole string `json:"privateZoneIAMRole"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_feature.go b/vendor/github.com/openshift/api/config/v1/types_feature.go index b083e6d1f6..169e29c5c5 100644 --- a/vendor/github.com/openshift/api/config/v1/types_feature.go +++ b/vendor/github.com/openshift/api/config/v1/types_feature.go @@ -1,19 +1,33 @@ package v1 -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Feature holds cluster-wide information about feature gates. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=featuregates,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type FeatureGate struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required + // +kubebuilder:validation:XValidation:rule="has(oldSelf.featureSet) ? has(self.featureSet) : true",message=".spec.featureSet cannot be removed" Spec FeatureGateSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. // +optional @@ -30,16 +44,17 @@ var ( // this feature set on CANNOT BE UNDONE and PREVENTS UPGRADES. TechPreviewNoUpgrade FeatureSet = "TechPreviewNoUpgrade" + // DevPreviewNoUpgrade turns on dev preview features that are not part of the normal supported platform. Turning + // this feature set on CANNOT BE UNDONE and PREVENTS UPGRADES. + DevPreviewNoUpgrade FeatureSet = "DevPreviewNoUpgrade" + // CustomNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. // Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations // your cluster may fail in an unrecoverable way. CustomNoUpgrade FeatureSet = "CustomNoUpgrade" - // TopologyManager enables ToplogyManager support. Upgrades are enabled with this feature. - LatencySensitive FeatureSet = "LatencySensitive" - - // IPv6DualStackNoUpgrade enables dual-stack. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. - IPv6DualStackNoUpgrade FeatureSet = "IPv6DualStackNoUpgrade" + // AllFixedFeatureSets are the featuresets that have known featuregates. Custom doesn't for instance. LatencySensitive is dead + AllFixedFeatureSets = []FeatureSet{Default, TechPreviewNoUpgrade, DevPreviewNoUpgrade} ) type FeatureGateSpec struct { @@ -52,6 +67,10 @@ type FeatureGateSelection struct { // Turning on or off features may cause irreversible changes in your cluster which cannot be undone. // +unionDiscriminator // +optional + // +kubebuilder:validation:Enum=CustomNoUpgrade;DevPreviewNoUpgrade;TechPreviewNoUpgrade;"" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'CustomNoUpgrade' ? self == 'CustomNoUpgrade' : true",message="CustomNoUpgrade may not be changed" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'TechPreviewNoUpgrade' ? self == 'TechPreviewNoUpgrade' : true",message="TechPreviewNoUpgrade may not be changed" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'DevPreviewNoUpgrade' ? self == 'DevPreviewNoUpgrade' : true",message="DevPreviewNoUpgrade may not be changed" FeatureSet FeatureSet `json:"featureSet,omitempty"` // customNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. @@ -65,144 +84,70 @@ type FeatureGateSelection struct { type CustomFeatureGates struct { // enabled is a list of all feature gates that you want to force on // +optional - Enabled []string `json:"enabled,omitempty"` + Enabled []FeatureGateName `json:"enabled,omitempty"` // disabled is a list of all feature gates that you want to force off // +optional - Disabled []string `json:"disabled,omitempty"` + Disabled []FeatureGateName `json:"disabled,omitempty"` } -type FeatureGateStatus struct { -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// FeatureGateName is a string to enforce patterns on the name of a FeatureGate +// +kubebuilder:validation:Pattern=`^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$` +type FeatureGateName string -type FeatureGateList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []FeatureGate `json:"items"` -} - -type FeatureGateEnabledDisabled struct { - Enabled []string - Disabled []string -} - -// FeatureSets Contains a map of Feature names to Enabled/Disabled Feature. -// -// NOTE: The caller needs to make sure to check for the existence of the value -// using golang's existence field. A possible scenario is an upgrade where new -// FeatureSets are added and a controller has not been upgraded with a newer -// version of this file. In this upgrade scenario the map could return nil. -// -// example: -// if featureSet, ok := FeatureSets["SomeNewFeature"]; ok { } -// -// If you put an item in either of these lists, put your area and name on it so we can find owners. -var FeatureSets = map[FeatureSet]*FeatureGateEnabledDisabled{ - Default: defaultFeatures, - CustomNoUpgrade: { - Enabled: []string{}, - Disabled: []string{}, - }, - TechPreviewNoUpgrade: newDefaultFeatures(). - with("CSIDriverAzureDisk"). // sig-storage, jsafrane, OCP specific - with("CSIDriverVSphere"). // sig-storage, jsafrane, OCP specific - with("CSIMigrationAWS"). // sig-storage, jsafrane, Kubernetes feature gate - with("CSIMigrationOpenStack"). // sig-storage, jsafrane, Kubernetes feature gate - toFeatures(), - LatencySensitive: newDefaultFeatures(). - with( - "TopologyManager", // sig-pod, sjenning - ). - toFeatures(), - IPv6DualStackNoUpgrade: newDefaultFeatures(). - with( - "IPv6DualStack", // sig-network, danwinship - ). - toFeatures(), -} - -var defaultFeatures = &FeatureGateEnabledDisabled{ - Enabled: []string{ - "APIPriorityAndFairness", // sig-apimachinery, deads2k - "RotateKubeletServerCertificate", // sig-pod, sjenning - "SupportPodPidsLimit", // sig-pod, sjenning - "NodeDisruptionExclusion", // sig-scheduling, ccoleman - "ServiceNodeExclusion", // sig-scheduling, ccoleman - "DownwardAPIHugePages", // sig-node, rphillips - }, - Disabled: []string{ - "LegacyNodeRoleBehavior", // sig-scheduling, ccoleman - }, +type FeatureGateStatus struct { + // conditions represent the observations of the current state. + // Known .status.conditions.type are: "DeterminationDegraded" + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` + + // featureGates contains a list of enabled and disabled featureGates that are keyed by payloadVersion. + // Operators other than the CVO and cluster-config-operator, must read the .status.featureGates, locate + // the version they are managing, find the enabled/disabled featuregates and make the operand and operator match. + // The enabled/disabled values for a particular version may change during the life of the cluster as various + // .spec.featureSet values are selected. + // Operators may choose to restart their processes to pick up these changes, but remembering past enable/disable + // lists is beyond the scope of this API and is the responsibility of individual operators. + // Only featureGates with .version in the ClusterVersion.status will be present in this list. + // +listType=map + // +listMapKey=version + // +optional + FeatureGates []FeatureGateDetails `json:"featureGates"` } -type featureSetBuilder struct { - forceOn []string - forceOff []string +type FeatureGateDetails struct { + // version matches the version provided by the ClusterVersion and in the ClusterOperator.Status.Versions field. + // +required + Version string `json:"version"` + // enabled is a list of all feature gates that are enabled in the cluster for the named version. + // +optional + Enabled []FeatureGateAttributes `json:"enabled"` + // disabled is a list of all feature gates that are disabled in the cluster for the named version. + // +optional + Disabled []FeatureGateAttributes `json:"disabled"` } -func newDefaultFeatures() *featureSetBuilder { - return &featureSetBuilder{} -} +type FeatureGateAttributes struct { + // name is the name of the FeatureGate. + // +required + Name FeatureGateName `json:"name"` -func (f *featureSetBuilder) with(forceOn ...string) *featureSetBuilder { - f.forceOn = append(f.forceOn, forceOn...) - return f + // possible (probable?) future additions include + // 1. support level (Stable, ServiceDeliveryOnly, TechPreview, DevPreview) + // 2. description } -func (f *featureSetBuilder) without(forceOff ...string) *featureSetBuilder { - f.forceOff = append(f.forceOff, forceOff...) - return f -} +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -func (f *featureSetBuilder) isForcedOff(needle string) bool { - for _, forcedOff := range f.forceOff { - if needle == forcedOff { - return true - } - } - return false -} +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type FeatureGateList struct { + metav1.TypeMeta `json:",inline"` -func (f *featureSetBuilder) isForcedOn(needle string) bool { - for _, forceOn := range f.forceOn { - if needle == forceOn { - return true - } - } - return false -} + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` -func (f *featureSetBuilder) toFeatures() *FeatureGateEnabledDisabled { - finalOn := []string{} - finalOff := []string{} - - // only add the default enabled features if they haven't been explicitly set off - for _, defaultOn := range defaultFeatures.Enabled { - if !f.isForcedOff(defaultOn) { - finalOn = append(finalOn, defaultOn) - } - } - for _, currOn := range f.forceOn { - if f.isForcedOff(currOn) { - panic("coding error, you can't have features both on and off") - } - finalOn = append(finalOn, currOn) - } - - // only add the default disabled features if they haven't been explicitly set on - for _, defaultOff := range defaultFeatures.Disabled { - if !f.isForcedOn(defaultOff) { - finalOff = append(finalOff, defaultOff) - } - } - for _, currOff := range f.forceOff { - finalOff = append(finalOff, currOff) - } - - return &FeatureGateEnabledDisabled{ - Enabled: finalOn, - Disabled: finalOff, - } + Items []FeatureGate `json:"items"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_image.go b/vendor/github.com/openshift/api/config/v1/types_image.go index 8b762a5a69..82f46c8b6c 100644 --- a/vendor/github.com/openshift/api/config/v1/types_image.go +++ b/vendor/github.com/openshift/api/config/v1/types_image.go @@ -12,12 +12,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // registries, and policies to block or allow registry hostnames. // When exposing OpenShift's image registry to the public, this also lets cluster // admins specify the external hostname. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=images,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Image struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec ImageSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -25,6 +36,23 @@ type Image struct { Status ImageStatus `json:"status"` } +// ImportModeType describes how to import an image manifest. +// +enum +// +kubebuilder:validation:Enum:="";Legacy;PreserveOriginal +type ImportModeType string + +const ( + // ImportModeLegacy indicates that the legacy behaviour should be used. + // For manifest lists, the legacy behaviour will discard the manifest list and import a single + // sub-manifest. In this case, the platform is chosen in the following order of priority: + // 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. + // This mode is the default. + ImportModeLegacy ImportModeType = "Legacy" + // ImportModePreserveOriginal indicates that the original manifest will be preserved. + // For manifest lists, the manifest list and all its sub-manifests will be imported. + ImportModePreserveOriginal ImportModeType = "PreserveOriginal" +) + type ImageSpec struct { // allowedRegistriesForImport limits the container image registries that normal users may import // images from. Set this list to the registries that you trust to contain valid Docker @@ -33,6 +61,7 @@ type ImageSpec struct { // this policy - typically only administrators or system integrations will have those // permissions. // +optional + // +listType=atomic AllowedRegistriesForImport []RegistryLocation `json:"allowedRegistriesForImport,omitempty"` // externalRegistryHostnames provides the hostnames for the default external image @@ -40,6 +69,7 @@ type ImageSpec struct { // is exposed externally. The first value is used in 'publicDockerImageRepository' // field in ImageStreams. The value must be in "hostname[:port]" format. // +optional + // +listType=atomic ExternalRegistryHostnames []string `json:"externalRegistryHostnames,omitempty"` // additionalTrustedCA is a reference to a ConfigMap containing additional CAs that @@ -55,15 +85,28 @@ type ImageSpec struct { // internal cluster registry. // +optional RegistrySources RegistrySources `json:"registrySources"` + + // imageStreamImportMode controls the import mode behaviour of imagestreams. + // It can be set to `Legacy` or `PreserveOriginal` or the empty string. If this value + // is specified, this setting is applied to all newly created imagestreams which do not have the + // value set. `Legacy` indicates that the legacy behaviour should be used. + // For manifest lists, the legacy behaviour will discard the manifest list and import a single + // sub-manifest. In this case, the platform is chosen in the following order of priority: + // 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. + // `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, + // the manifest list and all its sub-manifests will be imported. When empty, the behaviour will be + // decided based on the payload type advertised by the ClusterVersion status, i.e single arch payload + // implies the import mode is Legacy and multi payload implies PreserveOriginal. + // +openshift:enable:FeatureGate=ImageStreamImportMode + // +optional + ImageStreamImportMode ImportModeType `json:"imageStreamImportMode"` } type ImageStatus struct { - // internalRegistryHostname sets the hostname for the default internal image // registry. The value must be in "hostname[:port]" format. // This value is set by the image registry operator which controls the internal registry - // hostname. For backward compatibility, users can still use OPENSHIFT_DEFAULT_REGISTRY - // environment variable but this setting overrides the environment variable. + // hostname. // +optional InternalRegistryHostname string `json:"internalRegistryHostname,omitempty"` @@ -72,13 +115,33 @@ type ImageStatus struct { // is exposed externally. The first value is used in 'publicDockerImageRepository' // field in ImageStreams. The value must be in "hostname[:port]" format. // +optional + // +listType=atomic ExternalRegistryHostnames []string `json:"externalRegistryHostnames,omitempty"` + + // imageStreamImportMode controls the import mode behaviour of imagestreams. It can be + // `Legacy` or `PreserveOriginal`. `Legacy` indicates that the legacy behaviour should be used. + // For manifest lists, the legacy behaviour will discard the manifest list and import a single + // sub-manifest. In this case, the platform is chosen in the following order of priority: + // 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. + // `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, + // the manifest list and all its sub-manifests will be imported. This value will be reconciled based + // on either the spec value or if no spec value is specified, the image registry operator would look + // at the ClusterVersion status to determine the payload type and set the import mode accordingly, + // i.e single arch payload implies the import mode is Legacy and multi payload implies PreserveOriginal. + // +openshift:enable:FeatureGate=ImageStreamImportMode + // +optional + ImageStreamImportMode ImportModeType `json:"imageStreamImportMode,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ImageList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Image `json:"items"` @@ -98,19 +161,24 @@ type RegistryLocation struct { } // RegistrySources holds cluster-wide information about how to handle the registries config. +// +// +kubebuilder:validation:XValidation:rule="has(self.blockedRegistries) ? !has(self.allowedRegistries) : true",message="Only one of blockedRegistries or allowedRegistries may be set" type RegistrySources struct { // insecureRegistries are registries which do not have a valid TLS certificates or only support HTTP connections. // +optional + // +listType=atomic InsecureRegistries []string `json:"insecureRegistries,omitempty"` // blockedRegistries cannot be used for image pull and push actions. All other registries are permitted. // // Only one of BlockedRegistries or AllowedRegistries may be set. // +optional + // +listType=atomic BlockedRegistries []string `json:"blockedRegistries,omitempty"` // allowedRegistries are the only registries permitted for image pull and push actions. All other registries are denied. // // Only one of BlockedRegistries or AllowedRegistries may be set. // +optional + // +listType=atomic AllowedRegistries []string `json:"allowedRegistries,omitempty"` // containerRuntimeSearchRegistries are registries that will be searched when pulling images that do not have fully qualified // domains in their pull specs. Registries will be searched in the order provided in the list. diff --git a/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go b/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go new file mode 100644 index 0000000000..0bd0d77705 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go @@ -0,0 +1,99 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageContentPolicy holds cluster-wide information about how to handle registry mirror rules. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/874 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagecontentpolicies,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type ImageContentPolicy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec ImageContentPolicySpec `json:"spec"` +} + +// ImageContentPolicySpec is the specification of the ImageContentPolicy CRD. +type ImageContentPolicySpec struct { + // repositoryDigestMirrors allows images referenced by image digests in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in RepositoryDigestMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To pull image from mirrors by tags, should set the "allowMirrorByTags". + // + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // +optional + // +listType=map + // +listMapKey=source + RepositoryDigestMirrors []RepositoryDigestMirrors `json:"repositoryDigestMirrors"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageContentPolicyList lists the items in the ImageContentPolicy CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageContentPolicyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageContentPolicy `json:"items"` +} + +// RepositoryDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type RepositoryDigestMirrors struct { + // source is the repository that users refer to, e.g. in image pull specifications. + // +required + // +kubebuilder:validation:Pattern=`^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$` + Source string `json:"source"` + // allowMirrorByTags if true, the mirrors can be used to pull the images that are referenced by their tags. Default is false, the mirrors only work when pulling the images that are referenced by their digests. + // Pulling images by tag can potentially yield different images, depending on which endpoint + // we pull from. Forcing digest-pulls for mirrors avoids that issue. + // +optional + AllowMirrorByTags bool `json:"allowMirrorByTags,omitempty"` + // mirrors is zero or more repositories that may also contain the same images. + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. No mirror will be configured. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. Other cluster configuration, + // including (but not limited to) other repositoryDigestMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // +optional + // +listType=set + Mirrors []Mirror `json:"mirrors,omitempty"` +} + +// +kubebuilder:validation:Pattern=`^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$` +type Mirror string diff --git a/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go b/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go new file mode 100644 index 0000000000..df2258d12f --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go @@ -0,0 +1,141 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageDigestMirrorSet holds cluster-wide information about how to handle registry mirror rules on using digest pull specification. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/1126 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagedigestmirrorsets,scope=Cluster,shortName=idms +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type ImageDigestMirrorSet struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec ImageDigestMirrorSetSpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImageDigestMirrorSetStatus `json:"status,omitempty"` +} + +// ImageDigestMirrorSetSpec is the specification of the ImageDigestMirrorSet CRD. +type ImageDigestMirrorSetSpec struct { + // imageDigestMirrors allows images referenced by image digests in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in imageDigestMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To use mirrors to pull images using tag specification, users should configure + // a list of mirrors using "ImageTagMirrorSet" CRD. + // + // If the image pull specification matches the repository of "source" in multiple imagedigestmirrorset objects, + // only the objects which define the most specific namespace match will be used. + // For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as + // the "source", only the objects using quay.io/libpod/busybox are going to apply + // for pull specification quay.io/libpod/busybox. + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // Users who want to use a specific order of mirrors, should configure them into one list of mirrors using the expected order. + // +optional + // +listType=atomic + ImageDigestMirrors []ImageDigestMirrors `json:"imageDigestMirrors"` +} + +type ImageDigestMirrorSetStatus struct{} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageDigestMirrorSetList lists the items in the ImageDigestMirrorSet CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageDigestMirrorSetList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageDigestMirrorSet `json:"items"` +} + +// +kubebuilder:validation:Pattern=`^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` +type ImageMirror string + +// MirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. +// +kubebuilder:validation:Enum=NeverContactSource;AllowContactingSource +type MirrorSourcePolicy string + +const ( + // NeverContactSource prevents image pull from the specified repository in the pull spec if the image pull from the mirror list fails. + NeverContactSource MirrorSourcePolicy = "NeverContactSource" + + // AllowContactingSource allows falling back to the specified repository in the pull spec if the image pull from the mirror list fails. + AllowContactingSource MirrorSourcePolicy = "AllowContactingSource" +) + +// ImageDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type ImageDigestMirrors struct { + // source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname + // e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. + // "source" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // [*.]host + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +required + // +kubebuilder:validation:Pattern=`^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` + Source string `json:"source"` + // mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. + // Images can be pulled from these mirrors only if they are referenced by their digests. + // The mirrored location is obtained by replacing the part of the input reference that + // matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, + // a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo + // repository to be used. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. + // If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be + // pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy" + // Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // "mirrors" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +optional + // +listType=set + Mirrors []ImageMirror `json:"mirrors,omitempty"` + // mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. + // If unset, the image will continue to be pulled from the the repository in the pull spec. + // sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + // +optional + MirrorSourcePolicy MirrorSourcePolicy `json:"mirrorSourcePolicy,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_image_policy.go b/vendor/github.com/openshift/api/config/v1/types_image_policy.go new file mode 100644 index 0000000000..54bd21adb4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_policy.go @@ -0,0 +1,322 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImagePolicy holds namespace-wide configuration for image signature verification +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagepolicies,scope=Namespaced +// +kubebuilder:subresource:status +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/2310 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +openshift:enable:FeatureGate=SigstoreImageVerification +// +openshift:compatibility-gen:level=1 +type ImagePolicy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata"` + + // spec holds user settable values for configuration + // +required + Spec ImagePolicySpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImagePolicyStatus `json:"status"` +} + +// ImagePolicySpec is the specification of the ImagePolicy CRD. +type ImagePolicySpec struct { + // scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the "Docker Registry HTTP API V2". + // Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). + // More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository + // namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). + // Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. + // This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. + // In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories + // quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. + // If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. + // For additional details about the format, please refer to the document explaining the docker transport field, + // which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker + // +required + // +kubebuilder:validation:MaxItems=256 + // +listType=set + Scopes []ImageScope `json:"scopes"` + // policy is a required field that contains configuration to allow scopes to be verified, and defines how + // images not matching the verification policy will be treated. + // +required + Policy Policy `json:"policy"` +} + +// +kubebuilder:validation:XValidation:rule="size(self.split('/')[0].split('.')) == 1 ? self.split('/')[0].split('.')[0].split(':')[0] == 'localhost' : true",message="invalid image scope format, scope must contain a fully qualified domain name or 'localhost'" +// +kubebuilder:validation:XValidation:rule=`self.contains('*') ? self.matches('^\\*(?:\\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$') : true`,message="invalid image scope with wildcard, a wildcard can only be at the start of the domain and is only supported for subdomain matching, not path matching" +// +kubebuilder:validation:XValidation:rule=`!self.contains('*') ? self.matches('^((((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+(?::[0-9]+)?)|(localhost(?::[0-9]+)?))(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?)(?::([\\w][\\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$') : true`,message="invalid repository namespace or image specification in the image scope" +// +kubebuilder:validation:MaxLength=512 +type ImageScope string + +// Policy defines the verification policy for the items in the scopes list. +type Policy struct { + // rootOfTrust is a required field that defines the root of trust for verifying image signatures during retrieval. + // This allows image consumers to specify policyType and corresponding configuration of the policy, matching how the policy was generated. + // +required + RootOfTrust PolicyRootOfTrust `json:"rootOfTrust"` + // signedIdentity is an optional field specifies what image identity the signature claims about the image. This is useful when the image identity in the signature differs from the original image spec, such as when mirror registry is configured for the image scope, the signature from the mirror registry contains the image identity of the mirror instead of the original scope. + // The required matchPolicy field specifies the approach used in the verification process to verify the identity in the signature and the actual image identity, the default matchPolicy is "MatchRepoDigestOrExact". + // +optional + SignedIdentity *PolicyIdentity `json:"signedIdentity,omitempty"` +} + +// PolicyRootOfTrust defines the root of trust based on the selected policyType. +// +union +// +kubebuilder:validation:XValidation:rule="has(self.policyType) && self.policyType == 'PublicKey' ? has(self.publicKey) : !has(self.publicKey)",message="publicKey is required when policyType is PublicKey, and forbidden otherwise" +// +kubebuilder:validation:XValidation:rule="has(self.policyType) && self.policyType == 'FulcioCAWithRekor' ? has(self.fulcioCAWithRekor) : !has(self.fulcioCAWithRekor)",message="fulcioCAWithRekor is required when policyType is FulcioCAWithRekor, and forbidden otherwise" +// +openshift:validation:FeatureGateAwareXValidation:featureGate=SigstoreImageVerificationPKI,rule="has(self.policyType) && self.policyType == 'PKI' ? has(self.pki) : !has(self.pki)",message="pki is required when policyType is PKI, and forbidden otherwise" +type PolicyRootOfTrust struct { + // policyType is a required field specifies the type of the policy for verification. This field must correspond to how the policy was generated. + // Allowed values are "PublicKey", "FulcioCAWithRekor", and "PKI". + // When set to "PublicKey", the policy relies on a sigstore publicKey and may optionally use a Rekor verification. + // When set to "FulcioCAWithRekor", the policy is based on the Fulcio certification and incorporates a Rekor verification. + // When set to "PKI", the policy is based on the certificates from Bring Your Own Public Key Infrastructure (BYOPKI). This value is enabled by turning on the SigstoreImageVerificationPKI feature gate. + // +unionDiscriminator + // +required + PolicyType PolicyType `json:"policyType"` + // publicKey defines the root of trust configuration based on a sigstore public key. Optionally include a Rekor public key for Rekor verification. + // publicKey is required when policyType is PublicKey, and forbidden otherwise. + // +optional + PublicKey *PublicKey `json:"publicKey,omitempty"` + // fulcioCAWithRekor defines the root of trust configuration based on the Fulcio certificate and the Rekor public key. + // fulcioCAWithRekor is required when policyType is FulcioCAWithRekor, and forbidden otherwise + // For more information about Fulcio and Rekor, please refer to the document at: + // https://github.com/sigstore/fulcio and https://github.com/sigstore/rekor + // +optional + FulcioCAWithRekor *FulcioCAWithRekor `json:"fulcioCAWithRekor,omitempty"` + // pki defines the root of trust configuration based on Bring Your Own Public Key Infrastructure (BYOPKI) Root CA(s) and corresponding intermediate certificates. + // pki is required when policyType is PKI, and forbidden otherwise. + // +optional + // +openshift:enable:FeatureGate=SigstoreImageVerificationPKI + PKI *PKI `json:"pki,omitempty"` +} + +// +openshift:validation:FeatureGateAwareEnum:featureGate="",enum=PublicKey;FulcioCAWithRekor +// +openshift:validation:FeatureGateAwareEnum:featureGate=SigstoreImageVerificationPKI,enum=PublicKey;FulcioCAWithRekor;PKI +type PolicyType string + +const ( + PublicKeyRootOfTrust PolicyType = "PublicKey" + FulcioCAWithRekorRootOfTrust PolicyType = "FulcioCAWithRekor" + PKIRootOfTrust PolicyType = "PKI" +) + +// PublicKey defines the root of trust based on a sigstore public key. +type PublicKey struct { + // keyData is a required field contains inline base64-encoded data for the PEM format public key. + // keyData must be at most 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:MinLength=68 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN PUBLIC KEY-----')",message="the keyData must start with base64 encoding of '-----BEGIN PUBLIC KEY-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END PUBLIC KEY-----\\n') || string(self).endsWith('-----END PUBLIC KEY-----')",message="the keyData must end with base64 encoding of '-----END PUBLIC KEY-----'." + KeyData []byte `json:"keyData"` + // rekorKeyData is an optional field contains inline base64-encoded data for the PEM format from the Rekor public key. + // rekorKeyData must be at most 8192 characters. + // +optional + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN PUBLIC KEY-----')",message="the rekorKeyData must start with base64 encoding of '-----BEGIN PUBLIC KEY-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END PUBLIC KEY-----\\n') || string(self).endsWith('-----END PUBLIC KEY-----')",message="the rekorKeyData must end with base64 encoding of '-----END PUBLIC KEY-----'." + RekorKeyData []byte `json:"rekorKeyData,omitempty"` +} + +// FulcioCAWithRekor defines the root of trust based on the Fulcio certificate and the Rekor public key. +type FulcioCAWithRekor struct { + // fulcioCAData is a required field contains inline base64-encoded data for the PEM format fulcio CA. + // fulcioCAData must be at most 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN CERTIFICATE-----')",message="the fulcioCAData must start with base64 encoding of '-----BEGIN CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END CERTIFICATE-----\\n') || string(self).endsWith('-----END CERTIFICATE-----')",message="the fulcioCAData must end with base64 encoding of '-----END CERTIFICATE-----'." + FulcioCAData []byte `json:"fulcioCAData"` + // rekorKeyData is a required field contains inline base64-encoded data for the PEM format from the Rekor public key. + // rekorKeyData must be at most 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN PUBLIC KEY-----')",message="the rekorKeyData must start with base64 encoding of '-----BEGIN PUBLIC KEY-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END PUBLIC KEY-----\\n') || string(self).endsWith('-----END PUBLIC KEY-----')",message="the rekorKeyData must end with base64 encoding of '-----END PUBLIC KEY-----'." + RekorKeyData []byte `json:"rekorKeyData"` + // fulcioSubject is a required field specifies OIDC issuer and the email of the Fulcio authentication configuration. + // +required + FulcioSubject PolicyFulcioSubject `json:"fulcioSubject"` +} + +// PolicyFulcioSubject defines the OIDC issuer and the email of the Fulcio authentication configuration. +type PolicyFulcioSubject struct { + // oidcIssuer is a required filed contains the expected OIDC issuer. The oidcIssuer must be a valid URL and at most 2048 characters in length. + // It will be verified that the Fulcio-issued certificate contains a (Fulcio-defined) certificate extension pointing at this OIDC issuer URL. + // When Fulcio issues certificates, it includes a value based on an URL inside the client-provided ID token. + // Example: "https://expected.OIDC.issuer/" + // +required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="oidcIssuer must be a valid URL" + OIDCIssuer string `json:"oidcIssuer"` + // signedEmail is a required field holds the email address that the Fulcio certificate is issued for. + // The signedEmail must be a valid email address and at most 320 characters in length. + // Example: "expected-signing-user@example.com" + // +required + // +kubebuilder:validation:MaxLength=320 + // +kubebuilder:validation:XValidation:rule=`self.matches('^\\S+@\\S+$')`,message="invalid email address" + SignedEmail string `json:"signedEmail"` +} + +// PKI defines the root of trust based on Root CA(s) and corresponding intermediate certificates. +type PKI struct { + // caRootsData contains base64-encoded data of a certificate bundle PEM file, which contains one or more CA roots in the PEM format. The total length of the data must not exceed 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:MinLength=72 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN CERTIFICATE-----')",message="the caRootsData must start with base64 encoding of '-----BEGIN CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END CERTIFICATE-----\\n') || string(self).endsWith('-----END CERTIFICATE-----')",message="the caRootsData must end with base64 encoding of '-----END CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).findAll('-----BEGIN CERTIFICATE-----').size() == string(self).findAll('-----END CERTIFICATE-----').size()",message="caRootsData must be base64 encoding of valid PEM format data contain the same number of '-----BEGIN CERTIFICATE-----' and '-----END CERTIFICATE-----' markers." + CertificateAuthorityRootsData []byte `json:"caRootsData"` + // caIntermediatesData contains base64-encoded data of a certificate bundle PEM file, which contains one or more intermediate certificates in the PEM format. The total length of the data must not exceed 8192 characters. + // caIntermediatesData requires caRootsData to be set. + // +optional + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN CERTIFICATE-----')",message="the caIntermediatesData must start with base64 encoding of '-----BEGIN CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END CERTIFICATE-----\\n') || string(self).endsWith('-----END CERTIFICATE-----')",message="the caIntermediatesData must end with base64 encoding of '-----END CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).findAll('-----BEGIN CERTIFICATE-----').size() == string(self).findAll('-----END CERTIFICATE-----').size()",message="caIntermediatesData must be base64 encoding of valid PEM format data contain the same number of '-----BEGIN CERTIFICATE-----' and '-----END CERTIFICATE-----' markers." + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:MinLength=72 + CertificateAuthorityIntermediatesData []byte `json:"caIntermediatesData,omitempty"` + + // pkiCertificateSubject defines the requirements imposed on the subject to which the certificate was issued. + // +required + PKICertificateSubject PKICertificateSubject `json:"pkiCertificateSubject"` +} + +// PKICertificateSubject defines the requirements imposed on the subject to which the certificate was issued. +// +kubebuilder:validation:XValidation:rule="has(self.email) || has(self.hostname)", message="at least one of email or hostname must be set in pkiCertificateSubject" +// +openshift:enable:FeatureGate=SigstoreImageVerificationPKI +type PKICertificateSubject struct { + // email specifies the expected email address imposed on the subject to which the certificate was issued, and must match the email address listed in the Subject Alternative Name (SAN) field of the certificate. + // The email must be a valid email address and at most 320 characters in length. + // +optional + // +kubebuilder:validation:MaxLength:=320 + // +kubebuilder:validation:XValidation:rule=`self.matches('^\\S+@\\S+$')`,message="invalid email address" + Email string `json:"email,omitempty"` + // hostname specifies the expected hostname imposed on the subject to which the certificate was issued, and it must match the hostname listed in the Subject Alternative Name (SAN) DNS field of the certificate. + // The hostname must be a valid dns 1123 subdomain name, optionally prefixed by '*.', and at most 253 characters in length. + // It must consist only of lowercase alphanumeric characters, hyphens, periods and the optional preceding asterisk. + // +optional + // +kubebuilder:validation:MaxLength:=253 + // +kubebuilder:validation:XValidation:rule="self.startsWith('*.') ? !format.dns1123Subdomain().validate(self.replace('*.', '', 1)).hasValue() : !format.dns1123Subdomain().validate(self).hasValue()",message="hostname must be a valid dns 1123 subdomain name, optionally prefixed by '*.'. It must consist only of lowercase alphanumeric characters, hyphens, periods and the optional preceding asterisk." + Hostname string `json:"hostname,omitempty"` +} + +// PolicyIdentity defines image identity the signature claims about the image. When omitted, the default matchPolicy is "MatchRepoDigestOrExact". +// +kubebuilder:validation:XValidation:rule="(has(self.matchPolicy) && self.matchPolicy == 'ExactRepository') ? has(self.exactRepository) : !has(self.exactRepository)",message="exactRepository is required when matchPolicy is ExactRepository, and forbidden otherwise" +// +kubebuilder:validation:XValidation:rule="(has(self.matchPolicy) && self.matchPolicy == 'RemapIdentity') ? has(self.remapIdentity) : !has(self.remapIdentity)",message="remapIdentity is required when matchPolicy is RemapIdentity, and forbidden otherwise" +// +union +type PolicyIdentity struct { + // matchPolicy is a required filed specifies matching strategy to verify the image identity in the signature against the image scope. + // Allowed values are "MatchRepoDigestOrExact", "MatchRepository", "ExactRepository", "RemapIdentity". When omitted, the default value is "MatchRepoDigestOrExact". + // When set to "MatchRepoDigestOrExact", the identity in the signature must be in the same repository as the image identity if the image identity is referenced by a digest. Otherwise, the identity in the signature must be the same as the image identity. + // When set to "MatchRepository", the identity in the signature must be in the same repository as the image identity. + // When set to "ExactRepository", the exactRepository must be specified. The identity in the signature must be in the same repository as a specific identity specified by "repository". + // When set to "RemapIdentity", the remapIdentity must be specified. The signature must be in the same as the remapped image identity. Remapped image identity is obtained by replacing the "prefix" with the specified “signedPrefix” if the the image identity matches the specified remapPrefix. + // +unionDiscriminator + // +required + MatchPolicy IdentityMatchPolicy `json:"matchPolicy"` + // exactRepository specifies the repository that must be exactly matched by the identity in the signature. + // exactRepository is required if matchPolicy is set to "ExactRepository". It is used to verify that the signature claims an identity matching this exact repository, rather than the original image identity. + // +optional + PolicyMatchExactRepository *PolicyMatchExactRepository `json:"exactRepository,omitempty"` + // remapIdentity specifies the prefix remapping rule for verifying image identity. + // remapIdentity is required if matchPolicy is set to "RemapIdentity". It is used to verify that the signature claims a different registry/repository prefix than the original image. + // +optional + PolicyMatchRemapIdentity *PolicyMatchRemapIdentity `json:"remapIdentity,omitempty"` +} + +// +kubebuilder:validation:MaxLength=512 +// +kubebuilder:validation:XValidation:rule=`self.matches('.*:([\\w][\\w.-]{0,127})$')? self.matches('^(localhost:[0-9]+)$'): true`,message="invalid repository or prefix in the signedIdentity, should not include the tag or digest" +// +kubebuilder:validation:XValidation:rule=`self.matches('^(((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+(?::[0-9]+)?)|(localhost(?::[0-9]+)?))(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$')`,message="invalid repository or prefix in the signedIdentity. The repository or prefix must starts with 'localhost' or a valid '.' separated domain. If contains registry paths, the path component names must start with at least one letter or number, with following parts able to be separated by one period, one or two underscore and multiple dashes." +type IdentityRepositoryPrefix string + +type PolicyMatchExactRepository struct { + // repository is the reference of the image identity to be matched. + // repository is required if matchPolicy is set to "ExactRepository". + // The value should be a repository name (by omitting the tag or digest) in a registry implementing the "Docker Registry HTTP API V2". For example, docker.io/library/busybox + // +required + Repository IdentityRepositoryPrefix `json:"repository"` +} + +type PolicyMatchRemapIdentity struct { + // prefix is required if matchPolicy is set to "RemapIdentity". + // prefix is the prefix of the image identity to be matched. + // If the image identity matches the specified prefix, that prefix is replaced by the specified “signedPrefix” (otherwise it is used as unchanged and no remapping takes place). + // This is useful when verifying signatures for a mirror of some other repository namespace that preserves the vendor’s repository structure. + // The prefix and signedPrefix values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, + // or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. + // For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox. + // +required + Prefix IdentityRepositoryPrefix `json:"prefix"` + // signedPrefix is required if matchPolicy is set to "RemapIdentity". + // signedPrefix is the prefix of the image identity to be matched in the signature. The format is the same as "prefix". The values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, + // or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. + // For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox. + // +required + SignedPrefix IdentityRepositoryPrefix `json:"signedPrefix"` +} + +// IdentityMatchPolicy defines the type of matching for "matchPolicy". +// +kubebuilder:validation:Enum=MatchRepoDigestOrExact;MatchRepository;ExactRepository;RemapIdentity +type IdentityMatchPolicy string + +const ( + IdentityMatchPolicyMatchRepoDigestOrExact IdentityMatchPolicy = "MatchRepoDigestOrExact" + IdentityMatchPolicyMatchRepository IdentityMatchPolicy = "MatchRepository" + IdentityMatchPolicyExactRepository IdentityMatchPolicy = "ExactRepository" + IdentityMatchPolicyRemapIdentity IdentityMatchPolicy = "RemapIdentity" +) + +// +k8s:deepcopy-gen=true +type ImagePolicyStatus struct { + // conditions provide details on the status of this API Resource. + // condition type 'Pending' indicates that the customer resource contains a policy that cannot take effect. It is either overwritten by a global policy or the image scope is not valid. + // +kubebuilder:validation:MaxItems=8 + // +kubebuilder:validation:MinItems=1 + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImagePolicyList is a list of ImagePolicy resources +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImagePolicyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +required + metav1.ListMeta `json:"metadata"` + + // items is a list of ImagePolicies + // +kubebuilder:validation:MaxItems=1000 + // +required + Items []ImagePolicy `json:"items"` +} + +const ( + // ImagePolicyPending indicates that the customer resource contains a policy that cannot take effect. It is either overwritten by a global policy or the image scope is not valid. + ImagePolicyPending = "Pending" + // ImagePolicyApplied indicates that the policy has been applied + ImagePolicyApplied = "Applied" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go b/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go new file mode 100644 index 0000000000..b7e1a6a873 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go @@ -0,0 +1,128 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTagMirrorSet holds cluster-wide information about how to handle registry mirror rules on using tag pull specification. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/1126 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagetagmirrorsets,scope=Cluster,shortName=itms +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type ImageTagMirrorSet struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec ImageTagMirrorSetSpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImageTagMirrorSetStatus `json:"status,omitempty"` +} + +// ImageTagMirrorSetSpec is the specification of the ImageTagMirrorSet CRD. +type ImageTagMirrorSetSpec struct { + // imageTagMirrors allows images referenced by image tags in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in imageTagMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To use mirrors to pull images using digest specification only, users should configure + // a list of mirrors using "ImageDigestMirrorSet" CRD. + // + // If the image pull specification matches the repository of "source" in multiple imagetagmirrorset objects, + // only the objects which define the most specific namespace match will be used. + // For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as + // the "source", only the objects using quay.io/libpod/busybox are going to apply + // for pull specification quay.io/libpod/busybox. + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // Users who want to use a deterministic order of mirrors, should configure them into one list of mirrors using the expected order. + // +optional + // +listType=atomic + ImageTagMirrors []ImageTagMirrors `json:"imageTagMirrors"` +} + +type ImageTagMirrorSetStatus struct{} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTagMirrorSetList lists the items in the ImageTagMirrorSet CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageTagMirrorSetList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageTagMirrorSet `json:"items"` +} + +// ImageTagMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type ImageTagMirrors struct { + // source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname + // e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. + // "source" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // [*.]host + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +required + // +kubebuilder:validation:Pattern=`^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` + Source string `json:"source"` + // mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. + // Images can be pulled from these mirrors only if they are referenced by their tags. + // The mirrored location is obtained by replacing the part of the input reference that + // matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, + // a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo + // repository to be used. + // Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. + // Configuring a list of mirrors using "ImageDigestMirrorSet" CRD and forcing digest-pulls for mirrors avoids that issue. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. + // If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be + // pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy". + // Other cluster configuration, including (but not limited to) other imageTagMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // "mirrors" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +optional + // +listType=set + Mirrors []ImageMirror `json:"mirrors,omitempty"` + // mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. + // If unset, the image will continue to be pulled from the repository in the pull spec. + // sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + // +optional + MirrorSourcePolicy MirrorSourcePolicy `json:"mirrorSourcePolicy,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go index 6e78d5ea6d..effafde644 100644 --- a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go +++ b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go @@ -1,6 +1,8 @@ package v1 -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) // +genclient // +genclient:nonNamespaced @@ -8,12 +10,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +kubebuilder:subresource:status // Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=infrastructures,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Infrastructure struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec InfrastructureSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -49,11 +62,13 @@ type InfrastructureStatus struct { // infrastructureName uniquely identifies a cluster with a human friendly name. // Once set it should not be changed. Must be of max length 27 and must have only // alphanumeric or hyphen characters. + // +optional InfrastructureName string `json:"infrastructureName"` // platform is the underlying infrastructure provider for the cluster. // // Deprecated: Use platformStatus.type instead. + // +optional Platform PlatformType `json:"platform,omitempty"` // platformStatus holds status information specific to the underlying @@ -65,24 +80,34 @@ type InfrastructureStatus struct { // etcd servers and clients. // For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery // deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release. + // +optional EtcdDiscoveryDomain string `json:"etcdDiscoveryDomain"` // apiServerURL is a valid URI with scheme 'https', address and // optionally a port (defaulting to 443). apiServerURL can be used by components like the web console // to tell users where to find the Kubernetes API. + // +optional APIServerURL string `json:"apiServerURL"` // apiServerInternalURL is a valid URI with scheme 'https', // address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components // like kubelets, to contact the Kubernetes API server using the // infrastructure provider rather than Kubernetes networking. + // +optional APIServerInternalURL string `json:"apiServerInternalURI"` // controlPlaneTopology expresses the expectations for operands that normally run on control nodes. // The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. // The 'SingleReplica' mode will be used in single-node deployments // and the operators should not configure the operand for highly-available operation + // The 'External' mode indicates that the control plane is hosted externally to the cluster and that + // its components are not visible within the cluster. // +kubebuilder:default=HighlyAvailable + // +openshift:validation:FeatureGateAwareEnum:featureGate="",enum=HighlyAvailable;SingleReplica;External + // +openshift:validation:FeatureGateAwareEnum:featureGate=HighlyAvailableArbiter,enum=HighlyAvailable;HighlyAvailableArbiter;SingleReplica;External + // +openshift:validation:FeatureGateAwareEnum:featureGate=DualReplica,enum=HighlyAvailable;SingleReplica;DualReplica;External + // +openshift:validation:FeatureGateAwareEnum:requiredFeatureGate=HighlyAvailableArbiter;DualReplica,enum=HighlyAvailable;HighlyAvailableArbiter;SingleReplica;DualReplica;External + // +optional ControlPlaneTopology TopologyMode `json:"controlPlaneTopology"` // infrastructureTopology expresses the expectations for infrastructure services that do not run on control @@ -91,24 +116,75 @@ type InfrastructureStatus struct { // The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. // The 'SingleReplica' mode will be used in single-node deployments // and the operators should not configure the operand for highly-available operation + // NOTE: External topology mode is not applicable for this field. // +kubebuilder:default=HighlyAvailable - InfrastructureTopology TopologyMode `json:"infrastructureTopology"` + // +kubebuilder:validation:Enum=HighlyAvailable;SingleReplica + // +optional + InfrastructureTopology TopologyMode `json:"infrastructureTopology,omitempty"` + + // cpuPartitioning expresses if CPU partitioning is a currently enabled feature in the cluster. + // CPU Partitioning means that this cluster can support partitioning workloads to specific CPU Sets. + // Valid values are "None" and "AllNodes". When omitted, the default value is "None". + // The default value of "None" indicates that no nodes will be setup with CPU partitioning. + // The "AllNodes" value indicates that all nodes have been setup with CPU partitioning, + // and can then be further configured via the PerformanceProfile API. + // +kubebuilder:default=None + // +default="None" + // +kubebuilder:validation:Enum=None;AllNodes + // +optional + CPUPartitioning CPUPartitioningMode `json:"cpuPartitioning,omitempty"` } // TopologyMode defines the topology mode of the control/infra nodes. -// +kubebuilder:validation:Enum=HighlyAvailable;SingleReplica +// NOTE: Enum validation is specified in each field that uses this type, +// given that External value is not applicable to the InfrastructureTopology +// field. type TopologyMode string const ( // "HighlyAvailable" is for operators to configure high-availability as much as possible. HighlyAvailableTopologyMode TopologyMode = "HighlyAvailable" + // "HighlyAvailableArbiter" is for operators to configure for an arbiter HA deployment. + HighlyAvailableArbiterMode TopologyMode = "HighlyAvailableArbiter" + // "SingleReplica" is for operators to avoid spending resources for high-availability purpose. SingleReplicaTopologyMode TopologyMode = "SingleReplica" + + // "DualReplica" is for operators to configure for two node topology. + DualReplicaTopologyMode TopologyMode = "DualReplica" + + // "External" indicates that the component is running externally to the cluster. When specified + // as the control plane topology, operators should avoid scheduling workloads to masters or assume + // that any of the control plane components such as kubernetes API server or etcd are visible within + // the cluster. + ExternalTopologyMode TopologyMode = "External" +) + +// CPUPartitioningMode defines the mode for CPU partitioning +type CPUPartitioningMode string + +const ( + // CPUPartitioningNone means that no CPU Partitioning is on in this cluster infrastructure + CPUPartitioningNone CPUPartitioningMode = "None" + + // CPUPartitioningAllNodes means that all nodes are configured with CPU Partitioning in this cluster + CPUPartitioningAllNodes CPUPartitioningMode = "AllNodes" +) + +// PlatformLoadBalancerType defines the type of load balancer used by the cluster. +type PlatformLoadBalancerType string + +const ( + // LoadBalancerTypeUserManaged is a load balancer with control-plane VIPs managed outside of the cluster by the customer. + LoadBalancerTypeUserManaged PlatformLoadBalancerType = "UserManaged" + + // LoadBalancerTypeOpenShiftManagedDefault is the default load balancer with control-plane VIPs managed by the OpenShift cluster. + LoadBalancerTypeOpenShiftManagedDefault PlatformLoadBalancerType = "OpenShiftManagedDefault" ) // PlatformType is a specific supported infrastructure provider. -// +kubebuilder:validation:Enum="";AWS;Azure;BareMetal;GCP;Libvirt;OpenStack;None;VSphere;oVirt;IBMCloud;KubeVirt;EquinixMetal +// +kubebuilder:validation:Enum="";AWS;Azure;BareMetal;GCP;Libvirt;OpenStack;None;VSphere;oVirt;IBMCloud;KubeVirt;EquinixMetal;PowerVS;AlibabaCloud;Nutanix;External type PlatformType string const ( @@ -147,6 +223,18 @@ const ( // EquinixMetalPlatformType represents Equinix Metal infrastructure. EquinixMetalPlatformType PlatformType = "EquinixMetal" + + // PowerVSPlatformType represents IBM Power Systems Virtual Servers infrastructure. + PowerVSPlatformType PlatformType = "PowerVS" + + // AlibabaCloudPlatformType represents Alibaba Cloud infrastructure. + AlibabaCloudPlatformType PlatformType = "AlibabaCloud" + + // NutanixPlatformType represents Nutanix infrastructure. + NutanixPlatformType PlatformType = "Nutanix" + + // ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately. + ExternalPlatformType PlatformType = "External" ) // IBMCloudProviderType is a specific supported IBM Cloud provider cluster type @@ -158,63 +246,157 @@ const ( // VPC means that the IBM Cloud cluster is using VPC infrastructure IBMCloudProviderTypeVPC IBMCloudProviderType = "VPC" + + // IBMCloudProviderTypeUPI means that the IBM Cloud cluster is using user provided infrastructure. + // This is utilized in IBM Cloud Satellite environments. + IBMCloudProviderTypeUPI IBMCloudProviderType = "UPI" +) + +// DNSType indicates whether the cluster DNS is hosted by the cluster or Core DNS . +type DNSType string + +const ( + // ClusterHosted indicates that a DNS solution other than the default provided by the + // cloud platform is in use. In this mode, the cluster hosts a DNS solution during installation and the + // user is expected to provide their own DNS solution post-install. + // When the DNS solution is `ClusterHosted`, the cluster will continue to use the + // default Load Balancers provided by the cloud platform. + ClusterHostedDNSType DNSType = "ClusterHosted" + + // PlatformDefault indicates that the cluster is using the default DNS solution for the + // cloud platform. OpenShift is responsible for all the LB and DNS configuration needed for the + // cluster to be functional with no intervention from the user. To accomplish this, OpenShift + // configures the default LB and DNS solutions provided by the underlying cloud. + PlatformDefaultDNSType DNSType = "PlatformDefault" ) +// ExternalPlatformSpec holds the desired state for the generic External infrastructure provider. +type ExternalPlatformSpec struct { + // platformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. + // This field is solely for informational and reporting purposes and is not expected to be used for decision-making. + // +kubebuilder:default:="Unknown" + // +default="Unknown" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'Unknown' || self == oldSelf",message="platform name cannot be changed once set" + // +optional + PlatformName string `json:"platformName,omitempty"` +} + // PlatformSpec holds the desired state specific to the underlying infrastructure provider // of the current cluster. Since these are used at spec-level for the underlying cluster, it // is supposed that only one of the spec structs is set. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.vsphere) && has(self.vsphere) ? size(self.vsphere.vcenters) < 2 : true",message="vcenters can have at most 1 item when configured post-install" type PlatformSpec struct { // type is the underlying infrastructure provider for the cluster. This // value controls whether infrastructure automation such as service load // balancers, dynamic volume provisioning, machine creation and deletion, and // other integrations are enabled. If None, no infrastructure automation is // enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", - // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", and "None". Individual components may not support - // all platforms, and must handle unrecognized platforms as None if they do - // not support that platform. + // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", + // "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, + // and must handle unrecognized platforms as None if they do not support that platform. // // +unionDiscriminator Type PlatformType `json:"type"` - // AWS contains settings specific to the Amazon Web Services infrastructure provider. + // aws contains settings specific to the Amazon Web Services infrastructure provider. // +optional AWS *AWSPlatformSpec `json:"aws,omitempty"` - // Azure contains settings specific to the Azure infrastructure provider. + // azure contains settings specific to the Azure infrastructure provider. // +optional Azure *AzurePlatformSpec `json:"azure,omitempty"` - // GCP contains settings specific to the Google Cloud Platform infrastructure provider. + // gcp contains settings specific to the Google Cloud Platform infrastructure provider. // +optional GCP *GCPPlatformSpec `json:"gcp,omitempty"` - // BareMetal contains settings specific to the BareMetal platform. + // baremetal contains settings specific to the BareMetal platform. // +optional BareMetal *BareMetalPlatformSpec `json:"baremetal,omitempty"` - // OpenStack contains settings specific to the OpenStack infrastructure provider. + // openstack contains settings specific to the OpenStack infrastructure provider. // +optional OpenStack *OpenStackPlatformSpec `json:"openstack,omitempty"` - // Ovirt contains settings specific to the oVirt infrastructure provider. + // ovirt contains settings specific to the oVirt infrastructure provider. // +optional Ovirt *OvirtPlatformSpec `json:"ovirt,omitempty"` - // VSphere contains settings specific to the VSphere infrastructure provider. + // vsphere contains settings specific to the VSphere infrastructure provider. // +optional VSphere *VSpherePlatformSpec `json:"vsphere,omitempty"` - // IBMCloud contains settings specific to the IBMCloud infrastructure provider. + // ibmcloud contains settings specific to the IBMCloud infrastructure provider. // +optional IBMCloud *IBMCloudPlatformSpec `json:"ibmcloud,omitempty"` - // Kubevirt contains settings specific to the kubevirt infrastructure provider. + // kubevirt contains settings specific to the kubevirt infrastructure provider. // +optional Kubevirt *KubevirtPlatformSpec `json:"kubevirt,omitempty"` - // EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + // equinixMetal contains settings specific to the Equinix Metal infrastructure provider. // +optional EquinixMetal *EquinixMetalPlatformSpec `json:"equinixMetal,omitempty"` + + // powervs contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider. + // +optional + PowerVS *PowerVSPlatformSpec `json:"powervs,omitempty"` + + // alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + // +optional + AlibabaCloud *AlibabaCloudPlatformSpec `json:"alibabaCloud,omitempty"` + + // nutanix contains settings specific to the Nutanix infrastructure provider. + // +optional + Nutanix *NutanixPlatformSpec `json:"nutanix,omitempty"` + + // ExternalPlatformType represents generic infrastructure provider. + // Platform-specific components should be supplemented separately. + // +optional + External *ExternalPlatformSpec `json:"external,omitempty"` +} + +// CloudControllerManagerState defines whether Cloud Controller Manager presence is expected or not +type CloudControllerManagerState string + +const ( + // Cloud Controller Manager is enabled and expected to be installed. + // This value indicates that new nodes should be tainted as uninitialized when created, + // preventing them from running workloads until they are initialized by the cloud controller manager. + CloudControllerManagerExternal CloudControllerManagerState = "External" + + // Cloud Controller Manager is disabled and not expected to be installed. + // This value indicates that new nodes should not be tainted + // and no extra node initialization is expected from the cloud controller manager. + CloudControllerManagerNone CloudControllerManagerState = "None" +) + +// CloudControllerManagerStatus holds the state of Cloud Controller Manager (a.k.a. CCM or CPI) related settings +// +kubebuilder:validation:XValidation:rule="(has(self.state) == has(oldSelf.state)) || (!has(oldSelf.state) && self.state != \"External\")",message="state may not be added or removed once set" +type CloudControllerManagerStatus struct { + // state determines whether or not an external Cloud Controller Manager is expected to + // be installed within the cluster. + // https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/#running-cloud-controller-manager + // + // Valid values are "External", "None" and omitted. + // When set to "External", new nodes will be tainted as uninitialized when created, + // preventing them from running workloads until they are initialized by the cloud controller manager. + // When omitted or set to "None", new nodes will be not tainted + // and no extra initialization from the cloud controller manager is expected. + // +kubebuilder:validation:Enum="";External;None + // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="state is immutable once set" + // +optional + State CloudControllerManagerState `json:"state"` +} + +// ExternalPlatformStatus holds the current status of the generic External infrastructure provider. +// +kubebuilder:validation:XValidation:rule="has(self.cloudControllerManager) == has(oldSelf.cloudControllerManager)",message="cloudControllerManager may not be added or removed once set" +type ExternalPlatformStatus struct { + // cloudControllerManager contains settings specific to the external Cloud Controller Manager (a.k.a. CCM or CPI). + // When omitted, new nodes will be not tainted + // and no extra initialization from the cloud controller manager is expected. + // +optional + CloudControllerManager CloudControllerManagerStatus `json:"cloudControllerManager"` } // PlatformStatus holds the current status specific to the underlying infrastructure provider @@ -226,53 +408,69 @@ type PlatformStatus struct { // balancers, dynamic volume provisioning, machine creation and deletion, and // other integrations are enabled. If None, no infrastructure automation is // enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", - // "OpenStack", "VSphere", "oVirt", "EquinixMetal", and "None". Individual components may not support - // all platforms, and must handle unrecognized platforms as None if they do - // not support that platform. + // "OpenStack", "VSphere", "oVirt", "EquinixMetal", "PowerVS", "AlibabaCloud", "Nutanix" and "None". + // Individual components may not support all platforms, and must handle + // unrecognized platforms as None if they do not support that platform. // // This value will be synced with to the `status.platform` and `status.platformStatus.type`. // Currently this value cannot be changed once set. Type PlatformType `json:"type"` - // AWS contains settings specific to the Amazon Web Services infrastructure provider. + // aws contains settings specific to the Amazon Web Services infrastructure provider. // +optional AWS *AWSPlatformStatus `json:"aws,omitempty"` - // Azure contains settings specific to the Azure infrastructure provider. + // azure contains settings specific to the Azure infrastructure provider. // +optional Azure *AzurePlatformStatus `json:"azure,omitempty"` - // GCP contains settings specific to the Google Cloud Platform infrastructure provider. + // gcp contains settings specific to the Google Cloud Platform infrastructure provider. // +optional GCP *GCPPlatformStatus `json:"gcp,omitempty"` - // BareMetal contains settings specific to the BareMetal platform. + // baremetal contains settings specific to the BareMetal platform. // +optional BareMetal *BareMetalPlatformStatus `json:"baremetal,omitempty"` - // OpenStack contains settings specific to the OpenStack infrastructure provider. + // openstack contains settings specific to the OpenStack infrastructure provider. // +optional OpenStack *OpenStackPlatformStatus `json:"openstack,omitempty"` - // Ovirt contains settings specific to the oVirt infrastructure provider. + // ovirt contains settings specific to the oVirt infrastructure provider. // +optional Ovirt *OvirtPlatformStatus `json:"ovirt,omitempty"` - // VSphere contains settings specific to the VSphere infrastructure provider. + // vsphere contains settings specific to the VSphere infrastructure provider. // +optional VSphere *VSpherePlatformStatus `json:"vsphere,omitempty"` - // IBMCloud contains settings specific to the IBMCloud infrastructure provider. + // ibmcloud contains settings specific to the IBMCloud infrastructure provider. // +optional IBMCloud *IBMCloudPlatformStatus `json:"ibmcloud,omitempty"` - // Kubevirt contains settings specific to the kubevirt infrastructure provider. + // kubevirt contains settings specific to the kubevirt infrastructure provider. // +optional Kubevirt *KubevirtPlatformStatus `json:"kubevirt,omitempty"` - // EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + // equinixMetal contains settings specific to the Equinix Metal infrastructure provider. // +optional EquinixMetal *EquinixMetalPlatformStatus `json:"equinixMetal,omitempty"` + + // powervs contains settings specific to the Power Systems Virtual Servers infrastructure provider. + // +optional + PowerVS *PowerVSPlatformStatus `json:"powervs,omitempty"` + + // alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + // +optional + AlibabaCloud *AlibabaCloudPlatformStatus `json:"alibabaCloud,omitempty"` + + // nutanix contains settings specific to the Nutanix infrastructure provider. + // +optional + Nutanix *NutanixPlatformStatus `json:"nutanix,omitempty"` + + // external contains settings specific to the generic External infrastructure provider. + // +optional + External *ExternalPlatformStatus `json:"external,omitempty"` } // AWSServiceEndpoint store the configuration of a custom url to @@ -299,6 +497,7 @@ type AWSPlatformSpec struct { // serviceEndpoints list contains custom endpoints which will override default // service endpoint of AWS Services. // There must be only one ServiceEndpoint for a service. + // +listType=atomic // +optional ServiceEndpoints []AWSServiceEndpoint `json:"serviceEndpoints,omitempty"` } @@ -308,9 +507,10 @@ type AWSPlatformStatus struct { // region holds the default AWS region for new AWS resources created by the cluster. Region string `json:"region"` - // ServiceEndpoints list contains custom endpoints which will override default + // serviceEndpoints list contains custom endpoints which will override default // service endpoint of AWS Services. // There must be only one ServiceEndpoint for a service. + // +listType=atomic // +optional ServiceEndpoints []AWSServiceEndpoint `json:"serviceEndpoints,omitempty"` @@ -319,26 +519,43 @@ type AWSPlatformStatus struct { // AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags // available for the user. // +kubebuilder:validation:MaxItems=25 + // +listType=atomic // +optional ResourceTags []AWSResourceTag `json:"resourceTags,omitempty"` + + // cloudLoadBalancerConfig holds configuration related to DNS and cloud + // load balancers. It allows configuration of in-cluster DNS as an alternative + // to the platform default DNS implementation. + // When using the ClusterHosted DNS type, Load Balancer IP addresses + // must be provided for the API and internal API load balancers as well as the + // ingress load balancer. + // + // +default={"dnsType": "PlatformDefault"} + // +kubebuilder:default={"dnsType": "PlatformDefault"} + // +openshift:enable:FeatureGate=AWSClusterHostedDNSInstall + // +optional + // +nullable + CloudLoadBalancerConfig *CloudLoadBalancerConfig `json:"cloudLoadBalancerConfig,omitempty"` } // AWSResourceTag is a tag to apply to AWS resources created for the cluster. type AWSResourceTag struct { - // key is the key of the tag - // +kubebuilder:validation:Required + // key sets the key of the AWS resource tag key-value pair. Key is required when defining an AWS resource tag. + // Key should consist of between 1 and 128 characters, and may + // contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'. // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=128 - // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$` + // +kubebuilder:validation:XValidation:rule=`self.matches('^[0-9A-Za-z_.:/=+-@ ]+$')`,message="invalid AWS resource tag key. The string can contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', '@'" // +required Key string `json:"key"` - // value is the value of the tag. + // value sets the value of the AWS resource tag key-value pair. Value is required when defining an AWS resource tag. + // Value should consist of between 1 and 256 characters, and may + // contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'. // Some AWS service do not support empty values. Since tags are added to resources in many services, the // length of the tag value must meet the requirements of all services. - // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=256 - // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$` + // +kubebuilder:validation:XValidation:rule=`self.matches('^[0-9A-Za-z_.:/=+-@ ]+$')`,message="invalid AWS resource tag value. The string can contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', '@'" // +required Value string `json:"value"` } @@ -348,6 +565,7 @@ type AWSResourceTag struct { type AzurePlatformSpec struct{} // AzurePlatformStatus holds the current status of the Azure infrastructure provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceTags) && !has(self.resourceTags) || has(oldSelf.resourceTags) && has(self.resourceTags)",message="resourceTags may only be configured during installation" type AzurePlatformStatus struct { // resourceGroupName is the Resource Group for new Azure resources created for the cluster. ResourceGroupName string `json:"resourceGroupName"` @@ -362,10 +580,56 @@ type AzurePlatformStatus struct { // If empty, the value is equal to `AzurePublicCloud`. // +optional CloudName AzureCloudEnvironment `json:"cloudName,omitempty"` + + // armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack. + // +optional + ARMEndpoint string `json:"armEndpoint,omitempty"` + + // resourceTags is a list of additional tags to apply to Azure resources created for the cluster. + // See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. + // Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags + // may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration. + // +kubebuilder:validation:MaxItems=10 + // +kubebuilder:validation:XValidation:rule="self.all(x, x in oldSelf) && oldSelf.all(x, x in self)",message="resourceTags are immutable and may only be configured during installation" + // +listType=atomic + // +optional + ResourceTags []AzureResourceTag `json:"resourceTags,omitempty"` + + // cloudLoadBalancerConfig holds configuration related to DNS and cloud + // load balancers. It allows configuration of in-cluster DNS as an alternative + // to the platform default DNS implementation. + // When using the ClusterHosted DNS type, Load Balancer IP addresses + // must be provided for the API and internal API load balancers as well as the + // ingress load balancer. + // + // +default={"dnsType": "PlatformDefault"} + // +kubebuilder:default={"dnsType": "PlatformDefault"} + // +openshift:enable:FeatureGate=AzureClusterHostedDNSInstall + // +optional + CloudLoadBalancerConfig *CloudLoadBalancerConfig `json:"cloudLoadBalancerConfig,omitempty"` +} + +// AzureResourceTag is a tag to apply to Azure resources created for the cluster. +type AzureResourceTag struct { + // key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key + // must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric + // characters and the following special characters `_ . -`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +kubebuilder:validation:Pattern=`^[a-zA-Z]([0-9A-Za-z_.-]*[0-9A-Za-z_])?$` + Key string `json:"key"` + // value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value + // must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.=+-@]+$` + Value string `json:"value"` } // AzureCloudEnvironment is the name of the Azure cloud environment -// +kubebuilder:validation:Enum="";AzurePublicCloud;AzureUSGovernmentCloud;AzureChinaCloud;AzureGermanCloud +// +kubebuilder:validation:Enum="";AzurePublicCloud;AzureUSGovernmentCloud;AzureChinaCloud;AzureGermanCloud;AzureStackCloud type AzureCloudEnvironment string const ( @@ -380,24 +644,341 @@ const ( // AzureGermanCloud is the Azure cloud environment used in Germany. AzureGermanCloud AzureCloudEnvironment = "AzureGermanCloud" + + // AzureStackCloud is the Azure cloud environment used at the edge and on premises. + AzureStackCloud AzureCloudEnvironment = "AzureStackCloud" ) +// GCPServiceEndpointName is the name of the GCP Service Endpoint. +// +kubebuilder:validation:Enum=Compute;Container;CloudResourceManager;DNS;File;IAM;IAMCredentials;OAuth;ServiceUsage;Storage;STS +type GCPServiceEndpointName string + +const ( + // GCPServiceEndpointNameCompute is the name used for the GCP Compute Service endpoint. + GCPServiceEndpointNameCompute GCPServiceEndpointName = "Compute" + + // GCPServiceEndpointNameContainer is the name used for the GCP Container Service endpoint. + GCPServiceEndpointNameContainer GCPServiceEndpointName = "Container" + + // GCPServiceEndpointNameCloudResource is the name used for the GCP Resource Manager Service endpoint. + GCPServiceEndpointNameCloudResource GCPServiceEndpointName = "CloudResourceManager" + + // GCPServiceEndpointNameDNS is the name used for the GCP DNS Service endpoint. + GCPServiceEndpointNameDNS GCPServiceEndpointName = "DNS" + + // GCPServiceEndpointNameFile is the name used for the GCP File Service endpoint. + GCPServiceEndpointNameFile GCPServiceEndpointName = "File" + + // GCPServiceEndpointNameIAM is the name used for the GCP IAM Service endpoint. + GCPServiceEndpointNameIAM GCPServiceEndpointName = "IAM" + + // GCPServiceEndpointNameIAMCredentials is the name used for the GCP IAM Credentials Service endpoint. + GCPServiceEndpointNameIAMCredentials GCPServiceEndpointName = "IAMCredentials" + + // GCPServiceEndpointNameOAuth is the name used for the GCP OAuth2 Service endpoint. + GCPServiceEndpointNameOAuth GCPServiceEndpointName = "OAuth" + + // GCPServiceEndpointNameServiceUsage is the name used for the GCP Service Usage Service endpoint. + GCPServiceEndpointNameServiceUsage GCPServiceEndpointName = "ServiceUsage" + + // GCPServiceEndpointNameStorage is the name used for the GCP Storage Service endpoint. + GCPServiceEndpointNameStorage GCPServiceEndpointName = "Storage" + + // GCPServiceEndpointNameSTS is the name used for the GCP STS Service endpoint. + GCPServiceEndpointNameSTS GCPServiceEndpointName = "STS" +) + +// GCPServiceEndpoint store the configuration of a custom url to +// override existing defaults of GCP Services. +type GCPServiceEndpoint struct { + // name is the name of the GCP service whose endpoint is being overridden. + // This must be provided and cannot be empty. + // + // Allowed values are Compute, Container, CloudResourceManager, DNS, File, IAM, ServiceUsage, + // Storage, and TagManager. + // + // As an example, when setting the name to Compute all requests made by the caller to the GCP Compute + // Service will be directed to the endpoint specified in the url field. + // + // +required + Name GCPServiceEndpointName `json:"name"` + + // url is a fully qualified URI that overrides the default endpoint for a client using the GCP service specified + // in the name field. + // url is required, must use the scheme https, must not be more than 253 characters in length, + // and must be a valid URL according to Go's net/url package (https://pkg.go.dev/net/url#URL) + // + // An example of a valid endpoint that overrides the Compute Service: "https://compute-myendpoint1.p.googleapis.com" + // + // +required + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="must be a valid URL" + // +kubebuilder:validation:XValidation:rule="isURL(self) ? (url(self).getScheme() == \"https\") : true",message="scheme must be https" + // +kubebuilder:validation:XValidation:rule="url(self).getEscapedPath() == \"\" || url(self).getEscapedPath() == \"/\"",message="url must consist only of a scheme and domain. The url path must be empty." + URL string `json:"url"` +} + // GCPPlatformSpec holds the desired state of the Google Cloud Platform infrastructure provider. // This only includes fields that can be modified in the cluster. type GCPPlatformSpec struct{} // GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceLabels) && !has(self.resourceLabels) || has(oldSelf.resourceLabels) && has(self.resourceLabels)",message="resourceLabels may only be configured during installation" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceTags) && !has(self.resourceTags) || has(oldSelf.resourceTags) && has(self.resourceTags)",message="resourceTags may only be configured during installation" type GCPPlatformStatus struct { // resourceGroupName is the Project ID for new GCP resources created for the cluster. ProjectID string `json:"projectID"` // region holds the region for new GCP resources created for the cluster. Region string `json:"region"` + + // resourceLabels is a list of additional labels to apply to GCP resources created for the cluster. + // See https://cloud.google.com/compute/docs/labeling-resources for information on labeling GCP resources. + // GCP supports a maximum of 64 labels per resource. OpenShift reserves 32 labels for internal use, + // allowing 32 labels for user configuration. + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, x in oldSelf) && oldSelf.all(x, x in self)",message="resourceLabels are immutable and may only be configured during installation" + // +listType=map + // +listMapKey=key + // +optional + ResourceLabels []GCPResourceLabel `json:"resourceLabels,omitempty"` + + // resourceTags is a list of additional tags to apply to GCP resources created for the cluster. + // See https://cloud.google.com/resource-manager/docs/tags/tags-overview for information on + // tagging GCP resources. GCP supports a maximum of 50 tags per resource. + // +kubebuilder:validation:MaxItems=50 + // +kubebuilder:validation:XValidation:rule="self.all(x, x in oldSelf) && oldSelf.all(x, x in self)",message="resourceTags are immutable and may only be configured during installation" + // +listType=map + // +listMapKey=key + // +optional + ResourceTags []GCPResourceTag `json:"resourceTags,omitempty"` + + // This field was introduced and removed under tech preview. + // To avoid conflicts with serialisation, this field name may never be used again. + // Tombstone the field as a reminder. + // ClusterHostedDNS ClusterHostedDNS `json:"clusterHostedDNS,omitempty"` + + // cloudLoadBalancerConfig holds configuration related to DNS and cloud + // load balancers. It allows configuration of in-cluster DNS as an alternative + // to the platform default DNS implementation. + // When using the ClusterHosted DNS type, Load Balancer IP addresses + // must be provided for the API and internal API load balancers as well as the + // ingress load balancer. + // + // +default={"dnsType": "PlatformDefault"} + // +kubebuilder:default={"dnsType": "PlatformDefault"} + // +openshift:enable:FeatureGate=GCPClusterHostedDNSInstall + // +optional + // +nullable + CloudLoadBalancerConfig *CloudLoadBalancerConfig `json:"cloudLoadBalancerConfig,omitempty"` + + // serviceEndpoints specifies endpoints that override the default endpoints + // used when creating clients to interact with GCP services. + // When not specified, the default endpoint for the GCP region will be used. + // Only 1 endpoint override is permitted for each GCP service. + // The maximum number of endpoint overrides allowed is 11. + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MaxItems=11 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x.name == y.name))",message="only 1 endpoint override is permitted per GCP service name" + // +optional + // +openshift:enable:FeatureGate=GCPCustomAPIEndpointsInstall + ServiceEndpoints []GCPServiceEndpoint `json:"serviceEndpoints,omitempty"` +} + +// GCPResourceLabel is a label to apply to GCP resources created for the cluster. +type GCPResourceLabel struct { + // key is the key part of the label. A label key can have a maximum of 63 characters and cannot be empty. + // Label key must begin with a lowercase letter, and must contain only lowercase letters, numeric characters, + // and the following special characters `_-`. Label key must not have the reserved prefixes `kubernetes-io` + // and `openshift-io`. + // +kubebuilder:validation:XValidation:rule="!self.startsWith('openshift-io') && !self.startsWith('kubernetes-io')",message="label keys must not start with either `openshift-io` or `kubernetes-io`" + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[a-z][0-9a-z_-]{0,62}$` + Key string `json:"key"` + + // value is the value part of the label. A label value can have a maximum of 63 characters and cannot be empty. + // Value must contain only lowercase letters, numeric characters, and the following special characters `_-`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[0-9a-z_-]{1,63}$` + Value string `json:"value"` +} + +// GCPResourceTag is a tag to apply to GCP resources created for the cluster. +type GCPResourceTag struct { + // parentID is the ID of the hierarchical resource where the tags are defined, + // e.g. at the Organization or the Project level. To find the Organization or Project ID refer to the following pages: + // https://cloud.google.com/resource-manager/docs/creating-managing-organization#retrieving_your_organization_id, + // https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects. + // An OrganizationID must consist of decimal numbers, and cannot have leading zeroes. + // A ProjectID must be 6 to 30 characters in length, can only contain lowercase letters, numbers, + // and hyphens, and must start with a letter, and cannot end with a hyphen. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=32 + // +kubebuilder:validation:Pattern=`(^[1-9][0-9]{0,31}$)|(^[a-z][a-z0-9-]{4,28}[a-z0-9]$)` + ParentID string `json:"parentID"` + + // key is the key part of the tag. A tag key can have a maximum of 63 characters and cannot be empty. + // Tag key must begin and end with an alphanumeric character, and must contain only uppercase, lowercase + // alphanumeric characters, and the following special characters `._-`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[a-zA-Z0-9]([0-9A-Za-z_.-]{0,61}[a-zA-Z0-9])?$` + Key string `json:"key"` + + // value is the value part of the tag. A tag value can have a maximum of 63 characters and cannot be empty. + // Tag value must begin and end with an alphanumeric character, and must contain only uppercase, lowercase + // alphanumeric characters, and the following special characters `_-.@%=+:,*#&(){}[]` and spaces. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[a-zA-Z0-9]([0-9A-Za-z_.@%=+:,*#&()\[\]{}\-\s]{0,61}[a-zA-Z0-9])?$` + Value string `json:"value"` +} + +// CloudLoadBalancerConfig contains an union discriminator indicating the type of DNS +// solution in use within the cluster. When the DNSType is `ClusterHosted`, the cloud's +// Load Balancer configuration needs to be provided so that the DNS solution hosted +// within the cluster can be configured with those values. +// +kubebuilder:validation:XValidation:rule="has(self.dnsType) && self.dnsType != 'ClusterHosted' ? !has(self.clusterHosted) : true",message="clusterHosted is permitted only when dnsType is ClusterHosted" +// +union +type CloudLoadBalancerConfig struct { + // dnsType indicates the type of DNS solution in use within the cluster. Its default value of + // `PlatformDefault` indicates that the cluster's DNS is the default provided by the cloud platform. + // It can be set to `ClusterHosted` to bypass the configuration of the cloud default DNS. In this mode, + // the cluster needs to provide a self-hosted DNS solution for the cluster's installation to succeed. + // The cluster's use of the cloud's Load Balancers is unaffected by this setting. + // The value is immutable after it has been set at install time. + // Currently, there is no way for the customer to add additional DNS entries into the cluster hosted DNS. + // Enabling this functionality allows the user to start their own DNS solution outside the cluster after + // installation is complete. The customer would be responsible for configuring this custom DNS solution, + // and it can be run in addition to the in-cluster DNS solution. + // +default="PlatformDefault" + // +kubebuilder:default:="PlatformDefault" + // +kubebuilder:validation:Enum="ClusterHosted";"PlatformDefault" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="dnsType is immutable" + // +optional + // +unionDiscriminator + DNSType DNSType `json:"dnsType,omitempty"` + + // clusterHosted holds the IP addresses of API, API-Int and Ingress Load + // Balancers on Cloud Platforms. The DNS solution hosted within the cluster + // use these IP addresses to provide resolution for API, API-Int and Ingress + // services. + // +optional + // +unionMember,optional + ClusterHosted *CloudLoadBalancerIPs `json:"clusterHosted,omitempty"` +} + +// CloudLoadBalancerIPs contains the Load Balancer IPs for the cloud's API, +// API-Int and Ingress Load balancers. They will be populated as soon as the +// respective Load Balancers have been configured. These values are utilized +// to configure the DNS solution hosted within the cluster. +type CloudLoadBalancerIPs struct { + // apiIntLoadBalancerIPs holds Load Balancer IPs for the internal API service. + // These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. + // Entries in the apiIntLoadBalancerIPs must be unique. + // A maximum of 16 IP addresses are permitted. + // +kubebuilder:validation:Format=ip + // +listType=set + // +kubebuilder:validation:MaxItems=16 + // +optional + APIIntLoadBalancerIPs []IP `json:"apiIntLoadBalancerIPs,omitempty"` + + // apiLoadBalancerIPs holds Load Balancer IPs for the API service. + // These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. + // Could be empty for private clusters. + // Entries in the apiLoadBalancerIPs must be unique. + // A maximum of 16 IP addresses are permitted. + // +kubebuilder:validation:Format=ip + // +listType=set + // +kubebuilder:validation:MaxItems=16 + // +optional + APILoadBalancerIPs []IP `json:"apiLoadBalancerIPs,omitempty"` + + // ingressLoadBalancerIPs holds IPs for Ingress Load Balancers. + // These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. + // Entries in the ingressLoadBalancerIPs must be unique. + // A maximum of 16 IP addresses are permitted. + // +kubebuilder:validation:Format=ip + // +listType=set + // +kubebuilder:validation:MaxItems=16 + // +optional + IngressLoadBalancerIPs []IP `json:"ingressLoadBalancerIPs,omitempty"` +} + +// BareMetalPlatformLoadBalancer defines the load balancer used by the cluster on BareMetal platform. +// +union +type BareMetalPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on BareMetal platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` } // BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. // This only includes fields that can be modified in the cluster. -type BareMetalPlatformSpec struct{} +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)",message="apiServerInternalIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.ingressIPs) || has(self.ingressIPs)",message="ingressIPs list is required once set" +type BareMetalPlatformSpec struct { + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.apiServerInternalIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + APIServerInternalIPs []IP `json:"apiServerInternalIPs"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.ingressIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + IngressIPs []IP `json:"ingressIPs"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster + // nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, + // for example "10.0.0.0/8" or "fd00::/8". + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} // BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. // For more information about the network architecture used with the BareMetal platform type, see: @@ -407,12 +988,39 @@ type BareMetalPlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + IngressIPs []string `json:"ingressIPs"` + // nodeDNSIP is the IP address for the internal DNS used by the // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` // provides name resolution for the nodes themselves. There is no DNS-as-a-service for @@ -420,11 +1028,87 @@ type BareMetalPlatformStatus struct { // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames // to the nodes in the cluster. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *BareMetalPlatformLoadBalancer `json:"loadBalancer,omitempty"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster nodes. + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} + +// OpenStackPlatformLoadBalancer defines the load balancer used by the cluster on OpenStack platform. +// +union +type OpenStackPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on OpenStack platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` } // OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. // This only includes fields that can be modified in the cluster. -type OpenStackPlatformSpec struct{} +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)",message="apiServerInternalIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.ingressIPs) || has(self.ingressIPs)",message="ingressIPs list is required once set" +type OpenStackPlatformSpec struct { + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.apiServerInternalIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + APIServerInternalIPs []IP `json:"apiServerInternalIPs"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.ingressIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + IngressIPs []IP `json:"ingressIPs"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster + // nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, + // for example "10.0.0.0/8" or "fd00::/8". + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} // OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider. type OpenStackPlatformStatus struct { @@ -432,16 +1116,43 @@ type OpenStackPlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // cloudName is the name of the desired OpenStack cloud in the // client configuration file (`clouds.yaml`). CloudName string `json:"cloudName,omitempty"` // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + IngressIPs []string `json:"ingressIPs"` + // nodeDNSIP is the IP address for the internal DNS used by the // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` // provides name resolution for the nodes themselves. There is no DNS-as-a-service for @@ -449,6 +1160,40 @@ type OpenStackPlatformStatus struct { // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames // to the nodes in the cluster. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *OpenStackPlatformLoadBalancer `json:"loadBalancer,omitempty"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster nodes. + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} + +// OvirtPlatformLoadBalancer defines the load balancer used by the cluster on Ovirt platform. +// +union +type OvirtPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on Ovirt platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` } // OvirtPlatformSpec holds the desired state of the oVirt infrastructure provider. @@ -461,19 +1206,442 @@ type OvirtPlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + IngressIPs []string `json:"ingressIPs"` + // deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *OvirtPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + +// VSpherePlatformLoadBalancer defines the load balancer used by the cluster on VSphere platform. +// +union +type VSpherePlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on VSphere platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// The VSphereFailureDomainZoneType is a string representation of a failure domain +// zone type. There are two supportable types HostGroup and ComputeCluster +// +enum +type VSphereFailureDomainZoneType string + +// The VSphereFailureDomainRegionType is a string representation of a failure domain +// region type. There are two supportable types ComputeCluster and Datacenter +// +enum +type VSphereFailureDomainRegionType string + +const ( + // HostGroupFailureDomainZone is a failure domain zone for a vCenter vm-host group. + HostGroupFailureDomainZone VSphereFailureDomainZoneType = "HostGroup" + // ComputeClusterFailureDomainZone is a failure domain zone for a vCenter compute cluster. + ComputeClusterFailureDomainZone VSphereFailureDomainZoneType = "ComputeCluster" + // DatacenterFailureDomainRegion is a failure domain region for a vCenter datacenter. + DatacenterFailureDomainRegion VSphereFailureDomainRegionType = "Datacenter" + // ComputeClusterFailureDomainRegion is a failure domain region for a vCenter compute cluster. + ComputeClusterFailureDomainRegion VSphereFailureDomainRegionType = "ComputeCluster" +) + +// VSpherePlatformFailureDomainSpec holds the region and zone failure domain and the vCenter topology of that failure domain. +// +openshift:validation:FeatureGateAwareXValidation:featureGate=VSphereHostVMGroupZonal,rule="has(self.zoneAffinity) && self.zoneAffinity.type == 'HostGroup' ? has(self.regionAffinity) && self.regionAffinity.type == 'ComputeCluster' : true",message="when zoneAffinity type is HostGroup, regionAffinity type must be ComputeCluster" +// +openshift:validation:FeatureGateAwareXValidation:featureGate=VSphereHostVMGroupZonal,rule="has(self.zoneAffinity) && self.zoneAffinity.type == 'ComputeCluster' ? has(self.regionAffinity) && self.regionAffinity.type == 'Datacenter' : true",message="when zoneAffinity type is ComputeCluster, regionAffinity type must be Datacenter" +type VSpherePlatformFailureDomainSpec struct { + // name defines the arbitrary but unique name + // of a failure domain. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + Name string `json:"name"` + + // region defines the name of a region tag that will + // be attached to a vCenter datacenter. The tag + // category in vCenter must be named openshift-region. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + Region string `json:"region"` + + // zone defines the name of a zone tag that will + // be attached to a vCenter cluster. The tag + // category in vCenter must be named openshift-zone. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + Zone string `json:"zone"` + + // regionAffinity holds the type of region, Datacenter or ComputeCluster. + // When set to Datacenter, this means the region is a vCenter Datacenter as defined in topology. + // When set to ComputeCluster, this means the region is a vCenter Cluster as defined in topology. + // +openshift:validation:featureGate=VSphereHostVMGroupZonal + // +optional + RegionAffinity *VSphereFailureDomainRegionAffinity `json:"regionAffinity,omitempty"` + + // zoneAffinity holds the type of the zone and the hostGroup which + // vmGroup and the hostGroup names in vCenter corresponds to + // a vm-host group of type Virtual Machine and Host respectively. Is also + // contains the vmHostRule which is an affinity vm-host rule in vCenter. + // +openshift:validation:featureGate=VSphereHostVMGroupZonal + // +optional + ZoneAffinity *VSphereFailureDomainZoneAffinity `json:"zoneAffinity,omitempty"` + + // server is the fully-qualified domain name or the IP address of the vCenter server. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=255 + // --- + // + Validation is applied via a patch, we validate the format as either ipv4, ipv6 or hostname + Server string `json:"server"` + + // topology describes a given failure domain using vSphere constructs + // +required + Topology VSpherePlatformTopology `json:"topology"` +} + +// VSpherePlatformTopology holds the required and optional vCenter objects - datacenter, +// computeCluster, networks, datastore and resourcePool - to provision virtual machines. +type VSpherePlatformTopology struct { + // datacenter is the name of vCenter datacenter in which virtual machines will be located. + // The maximum length of the datacenter name is 80 characters. + // +required + // +kubebuilder:validation:MaxLength=80 + Datacenter string `json:"datacenter"` + + // computeCluster the absolute path of the vCenter cluster + // in which virtual machine will be located. + // The absolute path is of the form //host/. + // The maximum length of the path is 2048 characters. + // +required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/host/.*?` + ComputeCluster string `json:"computeCluster"` + + // networks is the list of port group network names within this failure domain. + // If feature gate VSphereMultiNetworks is enabled, up to 10 network adapters may be defined. + // 10 is the maximum number of virtual network devices which may be attached to a VM as defined by: + // https://configmax.esp.vmware.com/guest?vmwareproduct=vSphere&release=vSphere%208.0&categories=1-0 + // The available networks (port groups) can be listed using + // `govc ls 'network/*'` + // Networks should be in the form of an absolute path: + // //network/. + // +required + // +openshift:validation:FeatureGateAwareMaxItems:featureGate="",maxItems=1 + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=VSphereMultiNetworks,maxItems=10 + // +kubebuilder:validation:MinItems=1 + // +listType=atomic + Networks []string `json:"networks"` + + // datastore is the absolute path of the datastore in which the + // virtual machine is located. + // The absolute path is of the form //datastore/ + // The maximum length of the path is 2048 characters. + // +required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/datastore/.*?` + Datastore string `json:"datastore"` + + // resourcePool is the absolute path of the resource pool where virtual machines will be + // created. The absolute path is of the form //host//Resources/. + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/host/.*?/Resources.*` + // +optional + ResourcePool string `json:"resourcePool,omitempty"` + + // folder is the absolute path of the folder where + // virtual machines are located. The absolute path + // is of the form //vm/. + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/vm/.*?` + // +optional + Folder string `json:"folder,omitempty"` + + // template is the full inventory path of the virtual machine or template + // that will be cloned when creating new machines in this failure domain. + // The maximum length of the path is 2048 characters. + // + // When omitted, the template will be calculated by the control plane + // machineset operator based on the region and zone defined in + // VSpherePlatformFailureDomainSpec. + // For example, for zone=zonea, region=region1, and infrastructure name=test, + // the template path would be calculated as //vm/test-rhcos-region1-zonea. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/vm/.*?` + // +optional + Template string `json:"template,omitempty"` +} + +// VSphereFailureDomainZoneAffinity contains the vCenter cluster vm-host group (virtual machine and host types) +// and the vm-host affinity rule that together creates an affinity configuration for vm-host based zonal. +// This configuration within vCenter creates the required association between a failure domain, virtual machines +// and ESXi hosts to create a vm-host based zone. +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'HostGroup' ? has(self.hostGroup) : !has(self.hostGroup)",message="hostGroup is required when type is HostGroup, and forbidden otherwise" +// +union +type VSphereFailureDomainZoneAffinity struct { + // type determines the vSphere object type for a zone within this failure domain. + // Available types are ComputeCluster and HostGroup. + // When set to ComputeCluster, this means the vCenter cluster defined is the zone. + // When set to HostGroup, hostGroup must be configured with hostGroup, vmGroup and vmHostRule and + // this means the zone is defined by the grouping of those fields. + // +kubebuilder:validation:Enum:=HostGroup;ComputeCluster + // +required + // +unionDiscriminator + Type VSphereFailureDomainZoneType `json:"type"` + + // hostGroup holds the vmGroup and the hostGroup names in vCenter + // corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also + // contains the vmHostRule which is an affinity vm-host rule in vCenter. + // +unionMember + // +optional + HostGroup *VSphereFailureDomainHostGroup `json:"hostGroup,omitempty"` +} + +// VSphereFailureDomainRegionAffinity contains the region type which is the string representation of the +// VSphereFailureDomainRegionType with available options of Datacenter and ComputeCluster. +// +union +type VSphereFailureDomainRegionAffinity struct { + // type determines the vSphere object type for a region within this failure domain. + // Available types are Datacenter and ComputeCluster. + // When set to Datacenter, this means the vCenter Datacenter defined is the region. + // When set to ComputeCluster, this means the vCenter cluster defined is the region. + // +kubebuilder:validation:Enum:=ComputeCluster;Datacenter + // +required + // +unionDiscriminator + Type VSphereFailureDomainRegionType `json:"type"` +} + +// VSphereFailureDomainHostGroup holds the vmGroup and the hostGroup names in vCenter +// corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also +// contains the vmHostRule which is an affinity vm-host rule in vCenter. +type VSphereFailureDomainHostGroup struct { + // vmGroup is the name of the vm-host group of type virtual machine within vCenter for this failure domain. + // vmGroup is limited to 80 characters. + // This field is required when the VSphereFailureDomain ZoneType is HostGroup + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + VMGroup string `json:"vmGroup"` + + // hostGroup is the name of the vm-host group of type host within vCenter for this failure domain. + // hostGroup is limited to 80 characters. + // This field is required when the VSphereFailureDomain ZoneType is HostGroup + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + HostGroup string `json:"hostGroup"` + + // vmHostRule is the name of the affinity vm-host rule within vCenter for this failure domain. + // vmHostRule is limited to 80 characters. + // This field is required when the VSphereFailureDomain ZoneType is HostGroup + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + VMHostRule string `json:"vmHostRule"` +} + +// VSpherePlatformVCenterSpec stores the vCenter connection fields. +// This is used by the vSphere CCM. +type VSpherePlatformVCenterSpec struct { + + // server is the fully-qualified domain name or the IP address of the vCenter server. + // +required + // +kubebuilder:validation:MaxLength=255 + // --- + // + Validation is applied via a patch, we validate the format as either ipv4, ipv6 or hostname + Server string `json:"server"` + + // port is the TCP port that will be used to communicate to + // the vCenter endpoint. + // When omitted, this means the user has no opinion and + // it is up to the platform to choose a sensible default, + // which is subject to change over time. + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=32767 + // +optional + Port int32 `json:"port,omitempty"` + + // The vCenter Datacenters in which the RHCOS + // vm guests are located. This field will + // be used by the Cloud Controller Manager. + // Each datacenter listed here should be used within + // a topology. + // +required + // +kubebuilder:validation:MinItems=1 + // +listType=set + Datacenters []string `json:"datacenters"` +} + +// VSpherePlatformNodeNetworkingSpec holds the network CIDR(s) and port group name for +// including and excluding IP ranges in the cloud provider. +// This would be used for example when multiple network adapters are attached to +// a guest to help determine which IP address the cloud config manager should use +// for the external and internal node networking. +type VSpherePlatformNodeNetworkingSpec struct { + // networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs + // that will be used in respective status.addresses fields. + // --- + // + Validation is applied via a patch, we validate the format as cidr + // +listType=set + // +optional + NetworkSubnetCIDR []string `json:"networkSubnetCidr,omitempty"` + + // network VirtualMachine's VM Network names that will be used to when searching + // for status.addresses fields. Note that if internal.networkSubnetCIDR and + // external.networkSubnetCIDR are not set, then the vNIC associated to this network must + // only have a single IP address assigned to it. + // The available networks (port groups) can be listed using + // `govc ls 'network/*'` + // +optional + Network string `json:"network,omitempty"` + + // excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting + // the IP address from the VirtualMachine's VM for use in the status.addresses fields. + // --- + // + Validation is applied via a patch, we validate the format as cidr + // +listType=atomic + // +optional + ExcludeNetworkSubnetCIDR []string `json:"excludeNetworkSubnetCidr,omitempty"` +} + +// VSpherePlatformNodeNetworking holds the external and internal node networking spec. +type VSpherePlatformNodeNetworking struct { + // external represents the network configuration of the node that is externally routable. + // +optional + External VSpherePlatformNodeNetworkingSpec `json:"external"` + // internal represents the network configuration of the node that is routable only within the cluster. + // +optional + Internal VSpherePlatformNodeNetworkingSpec `json:"internal"` } // VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. -// This only includes fields that can be modified in the cluster. -type VSpherePlatformSpec struct{} +// In the future the cloud provider operator, storage operator and machine operator will +// use these fields for configuration. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)",message="apiServerInternalIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.ingressIPs) || has(self.ingressIPs)",message="ingressIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.vcenters) && has(self.vcenters) ? size(self.vcenters) < 2 : true",message="vcenters can have at most 1 item when configured post-install" +type VSpherePlatformSpec struct { + // vcenters holds the connection details for services to communicate with vCenter. + // Currently, only a single vCenter is supported, but in tech preview 3 vCenters are supported. + // Once the cluster has been installed, you are unable to change the current number of defined + // vCenters except in the case where the cluster has been upgraded from a version of OpenShift + // where the vsphere platform spec was not present. You may make modifications to the existing + // vCenters that are defined in the vcenters list in order to match with any added or modified + // failure domains. + // --- + // + If VCenters is not defined use the existing cloud-config configmap defined + // + in openshift-config. + // +kubebuilder:validation:MinItems=0 + // +kubebuilder:validation:MaxItems=3 + // +kubebuilder:validation:XValidation:rule="size(self) != size(oldSelf) ? size(oldSelf) == 0 && size(self) < 2 : true",message="vcenters cannot be added or removed once set" + // +listType=atomic + // +optional + VCenters []VSpherePlatformVCenterSpec `json:"vcenters,omitempty"` + + // failureDomains contains the definition of region, zone and the vCenter topology. + // If this is omitted failure domains (regions and zones) will not be used. + // +listType=map + // +listMapKey=name + // +optional + FailureDomains []VSpherePlatformFailureDomainSpec `json:"failureDomains,omitempty"` + + // nodeNetworking contains the definition of internal and external network constraints for + // assigning the node's networking. + // If this field is omitted, networking defaults to the legacy + // address selection behavior which is to only support a single address and + // return the first one found. + // +optional + NodeNetworking VSpherePlatformNodeNetworking `json:"nodeNetworking,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.apiServerInternalIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + APIServerInternalIPs []IP `json:"apiServerInternalIPs"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.ingressIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + IngressIPs []IP `json:"ingressIPs"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster + // nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, + // for example "10.0.0.0/8" or "fd00::/8". + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} // VSpherePlatformStatus holds the current status of the vSphere infrastructure provider. type VSpherePlatformStatus struct { @@ -481,12 +1649,39 @@ type VSpherePlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + IngressIPs []string `json:"ingressIPs"` + // nodeDNSIP is the IP address for the internal DNS used by the // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` // provides name resolution for the nodes themselves. There is no DNS-as-a-service for @@ -494,22 +1689,96 @@ type VSpherePlatformStatus struct { // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames // to the nodes in the cluster. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *VSpherePlatformLoadBalancer `json:"loadBalancer,omitempty"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster nodes. + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} + +// IBMCloudServiceEndpoint stores the configuration of a custom url to +// override existing defaults of IBM Cloud Services. +type IBMCloudServiceEndpoint struct { + // name is the name of the IBM Cloud service. + // Possible values are: CIS, COS, COSConfig, DNSServices, GlobalCatalog, GlobalSearch, GlobalTagging, HyperProtect, IAM, KeyProtect, ResourceController, ResourceManager, or VPC. + // For example, the IBM Cloud Private IAM service could be configured with the + // service `name` of `IAM` and `url` of `https://private.iam.cloud.ibm.com` + // Whereas the IBM Cloud Private VPC service for US South (Dallas) could be configured + // with the service `name` of `VPC` and `url` of `https://us.south.private.iaas.cloud.ibm.com` + // + // +required + Name IBMCloudServiceName `json:"name"` + + // url is fully qualified URI with scheme https, that overrides the default generated + // endpoint for a client. + // This must be provided and cannot be empty. The path must follow the pattern + // /v[0,9]+ or /api/v[0,9]+ + // + // +required + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:MaxLength=300 + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="url must be a valid absolute URL" + // +openshift:validation:FeatureGateAwareXValidation:featureGate=DyanmicServiceEndpointIBMCloud,rule="url(self).getScheme() == \"https\"",message="url must use https scheme" + // +openshift:validation:FeatureGateAwareXValidation:featureGate=DyanmicServiceEndpointIBMCloud,rule=`matches((url(self).getEscapedPath()), '^/(api/)?v[0-9]+/{0,1}$')`,message="url path must match /v[0,9]+ or /api/v[0,9]+" + URL string `json:"url"` } // IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. // This only includes fields that can be modified in the cluster. -type IBMCloudPlatformSpec struct{} +type IBMCloudPlatformSpec struct { + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of an IBM service. These endpoints are used by components + // within the cluster when trying to reach the IBM Cloud Services that have been + // overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each + // endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus + // are updated to reflect the same custom endpoints. + // A maximum of 13 service endpoints overrides are supported. + // +kubebuilder:validation:MaxItems=13 + // +listType=map + // +listMapKey=name + // +optional + // +openshift:enable:FeatureGate=DyanmicServiceEndpointIBMCloud + ServiceEndpoints []IBMCloudServiceEndpoint `json:"serviceEndpoints,omitempty"` +} -//IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider. +// IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider. type IBMCloudPlatformStatus struct { - // Location is where the cluster has been deployed + // location is where the cluster has been deployed Location string `json:"location,omitempty"` - // ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster. + // resourceGroupName is the Resource Group for new IBMCloud resources created for the cluster. ResourceGroupName string `json:"resourceGroupName,omitempty"` - // ProviderType indicates the type of cluster that was created + // providerType indicates the type of cluster that was created ProviderType IBMCloudProviderType `json:"providerType,omitempty"` + + // cisInstanceCRN is the CRN of the Cloud Internet Services instance managing + // the DNS zone for the cluster's base domain + CISInstanceCRN string `json:"cisInstanceCRN,omitempty"` + + // dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone + // for the cluster's base domain + DNSInstanceCRN string `json:"dnsInstanceCRN,omitempty"` + + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of an IBM service. These endpoints are used by components + // within the cluster when trying to reach the IBM Cloud Services that have been + // overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each + // endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus + // are updated to reflect the same custom endpoints. + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=DyanmicServiceEndpointIBMCloud,maxItems=13 + // +listType=map + // +listMapKey=name + // +optional + ServiceEndpoints []IBMCloudServiceEndpoint `json:"serviceEndpoints,omitempty"` } // KubevirtPlatformSpec holds the desired state of the kubevirt infrastructure provider. @@ -546,12 +1815,329 @@ type EquinixMetalPlatformStatus struct { IngressIP string `json:"ingressIP,omitempty"` } +// PowervsServiceEndpoint stores the configuration of a custom url to +// override existing defaults of PowerVS Services. +type PowerVSServiceEndpoint struct { + // name is the name of the Power VS service. + // Few of the services are + // IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api + // ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller + // Power Cloud - https://cloud.ibm.com/apidocs/power-cloud + // + // +required + // +kubebuilder:validation:Enum=CIS;COS;COSConfig;DNSServices;GlobalCatalog;GlobalSearch;GlobalTagging;HyperProtect;IAM;KeyProtect;Power;ResourceController;ResourceManager;VPC + Name string `json:"name"` + + // url is fully qualified URI with scheme https, that overrides the default generated + // endpoint for a client. + // This must be provided and cannot be empty. + // + // +required + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Format=uri + // +kubebuilder:validation:Pattern=`^https://` + URL string `json:"url"` +} + +// PowerVSPlatformSpec holds the desired state of the IBM Power Systems Virtual Servers infrastructure provider. +// This only includes fields that can be modified in the cluster. +type PowerVSPlatformSpec struct { + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of a Power VS service. + // +listType=map + // +listMapKey=name + // +optional + ServiceEndpoints []PowerVSServiceEndpoint `json:"serviceEndpoints,omitempty"` +} + +// PowerVSPlatformStatus holds the current status of the IBM Power Systems Virtual Servers infrastrucutre provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceGroup) || has(self.resourceGroup)",message="cannot unset resourceGroup once set" +type PowerVSPlatformStatus struct { + // region holds the default Power VS region for new Power VS resources created by the cluster. + Region string `json:"region"` + + // zone holds the default zone for the new Power VS resources created by the cluster. + // Note: Currently only single-zone OCP clusters are supported + Zone string `json:"zone"` + + // resourceGroup is the resource group name for new IBMCloud resources created for a cluster. + // The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. + // More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. + // When omitted, the image registry operator won't be able to configure storage, + // which results in the image registry cluster operator not being in an available state. + // + // +kubebuilder:validation:Pattern=^[a-zA-Z0-9-_ ]+$ + // +kubebuilder:validation:MaxLength=40 + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="resourceGroup is immutable once set" + // +optional + ResourceGroup string `json:"resourceGroup"` + + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of a Power VS service. + // +listType=map + // +listMapKey=name + // +optional + ServiceEndpoints []PowerVSServiceEndpoint `json:"serviceEndpoints,omitempty"` + + // cisInstanceCRN is the CRN of the Cloud Internet Services instance managing + // the DNS zone for the cluster's base domain + CISInstanceCRN string `json:"cisInstanceCRN,omitempty"` + + // dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone + // for the cluster's base domain + DNSInstanceCRN string `json:"dnsInstanceCRN,omitempty"` +} + +// AlibabaCloudPlatformSpec holds the desired state of the Alibaba Cloud infrastructure provider. +// This only includes fields that can be modified in the cluster. +type AlibabaCloudPlatformSpec struct{} + +// AlibabaCloudPlatformStatus holds the current status of the Alibaba Cloud infrastructure provider. +type AlibabaCloudPlatformStatus struct { + // region specifies the region for Alibaba Cloud resources created for the cluster. + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z-]+$` + // +required + Region string `json:"region"` + // resourceGroupID is the ID of the resource group for the cluster. + // +kubebuilder:validation:Pattern=`^(rg-[0-9A-Za-z]+)?$` + // +optional + ResourceGroupID string `json:"resourceGroupID,omitempty"` + // resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster. + // +kubebuilder:validation:MaxItems=20 + // +listType=map + // +listMapKey=key + // +optional + ResourceTags []AlibabaCloudResourceTag `json:"resourceTags,omitempty"` +} + +// AlibabaCloudResourceTag is the set of tags to add to apply to resources. +type AlibabaCloudResourceTag struct { + // key is the key of the tag. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +required + Key string `json:"key"` + // value is the value of the tag. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +required + Value string `json:"value"` +} + +// NutanixPlatformLoadBalancer defines the load balancer used by the cluster on Nutanix platform. +// +union +type NutanixPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on Nutanix platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// NutanixPlatformSpec holds the desired state of the Nutanix infrastructure provider. +// This only includes fields that can be modified in the cluster. +type NutanixPlatformSpec struct { + // prismCentral holds the endpoint address and port to access the Nutanix Prism Central. + // When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. + // Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the + // proxy spec.noProxy list. + // +required + PrismCentral NutanixPrismEndpoint `json:"prismCentral"` + + // prismElements holds one or more endpoint address and port data to access the Nutanix + // Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one + // Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) + // used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) + // spread over multiple Prism Elements (clusters) of the Prism Central. + // +required + // +listType=map + // +listMapKey=name + PrismElements []NutanixPrismElementEndpoint `json:"prismElements"` + + // failureDomains configures failure domains information for the Nutanix platform. + // When set, the failure domains defined here may be used to spread Machines across + // prism element clusters to improve fault tolerance of the cluster. + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=NutanixMultiSubnets,maxItems=32 + // +listType=map + // +listMapKey=name + // +optional + FailureDomains []NutanixFailureDomain `json:"failureDomains"` +} + +// NutanixFailureDomain configures failure domain information for the Nutanix platform. +type NutanixFailureDomain struct { + // name defines the unique name of a failure domain. + // Name is required and must be at most 64 characters in length. + // It must consist of only lower case alphanumeric characters and hyphens (-). + // It must start and end with an alphanumeric character. + // This value is arbitrary and is used to identify the failure domain within the platform. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=64 + // +kubebuilder:validation:Pattern=`[a-z0-9]([-a-z0-9]*[a-z0-9])?` + Name string `json:"name"` + + // cluster is to identify the cluster (the Prism Element under management of the Prism Central), + // in which the Machine's VM will be created. The cluster identifier (uuid or name) can be obtained + // from the Prism Central console or using the prism_central API. + // +required + Cluster NutanixResourceIdentifier `json:"cluster"` + + // subnets holds a list of identifiers (one or more) of the cluster's network subnets + // If the feature gate NutanixMultiSubnets is enabled, up to 32 subnets may be configured. + // for the Machine's VM to connect to. The subnet identifiers (uuid or name) can be + // obtained from the Prism Central console or using the prism_central API. + // +required + // +kubebuilder:validation:MinItems=1 + // +openshift:validation:FeatureGateAwareMaxItems:featureGate="",maxItems=1 + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=NutanixMultiSubnets,maxItems=32 + // +openshift:validation:FeatureGateAwareXValidation:featureGate=NutanixMultiSubnets,rule="self.all(x, self.exists_one(y, x == y))",message="each subnet must be unique" + // +listType=atomic + Subnets []NutanixResourceIdentifier `json:"subnets"` +} + +// NutanixIdentifierType is an enumeration of different resource identifier types. +// +kubebuilder:validation:Enum:=UUID;Name +type NutanixIdentifierType string + +const ( + // NutanixIdentifierUUID is a resource identifier identifying the object by UUID. + NutanixIdentifierUUID NutanixIdentifierType = "UUID" + + // NutanixIdentifierName is a resource identifier identifying the object by Name. + NutanixIdentifierName NutanixIdentifierType = "Name" +) + +// NutanixResourceIdentifier holds the identity of a Nutanix PC resource (cluster, image, subnet, etc.) +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'UUID' ? has(self.uuid) : !has(self.uuid)",message="uuid configuration is required when type is UUID, and forbidden otherwise" +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'Name' ? has(self.name) : !has(self.name)",message="name configuration is required when type is Name, and forbidden otherwise" +// +union +type NutanixResourceIdentifier struct { + // type is the identifier type to use for this resource. + // +unionDiscriminator + // +required + Type NutanixIdentifierType `json:"type"` + + // uuid is the UUID of the resource in the PC. It cannot be empty if the type is UUID. + // +optional + UUID *string `json:"uuid,omitempty"` + + // name is the resource name in the PC. It cannot be empty if the type is Name. + // +optional + Name *string `json:"name,omitempty"` +} + +// NutanixPrismEndpoint holds the endpoint address and port to access the Nutanix Prism Central or Element (cluster) +type NutanixPrismEndpoint struct { + // address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster) + // +required + // +kubebuilder:validation:MaxLength=256 + Address string `json:"address"` + + // port is the port number to access the Nutanix Prism Central or Element (cluster) + // +required + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=65535 + Port int32 `json:"port"` +} + +// NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster) +type NutanixPrismElementEndpoint struct { + // name is the name of the Prism Element (cluster). This value will correspond with + // the cluster field configured on other resources (eg Machines, PVCs, etc). + // +required + // +kubebuilder:validation:MaxLength=256 + Name string `json:"name"` + + // endpoint holds the endpoint address and port data of the Prism Element (cluster). + // When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. + // Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the + // proxy spec.noProxy list. + // +required + Endpoint NutanixPrismEndpoint `json:"endpoint"` +} + +// NutanixPlatformStatus holds the current status of the Nutanix infrastructure provider. +type NutanixPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. + IngressIP string `json:"ingressIP,omitempty"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + IngressIPs []string `json:"ingressIPs"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *NutanixPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // InfrastructureList is +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type InfrastructureList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Infrastructure `json:"items"` } + +// IP is an IP address (for example, "10.0.0.0" or "fd00::"). +// +kubebuilder:validation:XValidation:rule="isIP(self)",message="value must be a valid IP address" +// +kubebuilder:validation:MaxLength:=39 +// +kubebuilder:validation:MinLength:=1 +type IP string + +// CIDR is an IP address range in CIDR notation (for example, "10.0.0.0/8" or "fd00::/8"). +// +kubebuilder:validation:XValidation:rule="isCIDR(self)",message="value must be a valid CIDR network address" +// +kubebuilder:validation:MaxLength:=43 +// +kubebuilder:validation:MinLength:=1 +type CIDR string diff --git a/vendor/github.com/openshift/api/config/v1/types_ingress.go b/vendor/github.com/openshift/api/config/v1/types_ingress.go index 9451adc278..f70fe8f440 100644 --- a/vendor/github.com/openshift/api/config/v1/types_ingress.go +++ b/vendor/github.com/openshift/api/config/v1/types_ingress.go @@ -10,12 +10,23 @@ import ( // Ingress holds cluster-wide information about ingress, including the default ingress domain // used for routes. The canonical name is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=ingresses,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Ingress struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec IngressSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -53,24 +64,153 @@ type IngressSpec struct { // .status.componentRoutes list, where participating operators write the status of // configurable routes. // +optional + // +listType=map + // +listMapKey=namespace + // +listMapKey=name ComponentRoutes []ComponentRouteSpec `json:"componentRoutes,omitempty"` + + // requiredHSTSPolicies specifies HSTS policies that are required to be set on newly created or updated routes + // matching the domainPattern/s and namespaceSelector/s that are specified in the policy. + // Each requiredHSTSPolicy must have at least a domainPattern and a maxAge to validate a route HSTS Policy route + // annotation, and affect route admission. + // + // A candidate route is checked for HSTS Policies if it has the HSTS Policy route annotation: + // "haproxy.router.openshift.io/hsts_header" + // E.g. haproxy.router.openshift.io/hsts_header: max-age=31536000;preload;includeSubDomains + // + // - For each candidate route, if it matches a requiredHSTSPolicy domainPattern and optional namespaceSelector, + // then the maxAge, preloadPolicy, and includeSubdomainsPolicy must be valid to be admitted. Otherwise, the route + // is rejected. + // - The first match, by domainPattern and optional namespaceSelector, in the ordering of the RequiredHSTSPolicies + // determines the route's admission status. + // - If the candidate route doesn't match any requiredHSTSPolicy domainPattern and optional namespaceSelector, + // then it may use any HSTS Policy annotation. + // + // The HSTS policy configuration may be changed after routes have already been created. An update to a previously + // admitted route may then fail if the updated route does not conform to the updated HSTS policy configuration. + // However, changing the HSTS policy configuration will not cause a route that is already admitted to stop working. + // + // Note that if there are no RequiredHSTSPolicies, any HSTS Policy annotation on the route is valid. + // +optional + RequiredHSTSPolicies []RequiredHSTSPolicy `json:"requiredHSTSPolicies,omitempty"` + + // loadBalancer contains the load balancer details in general which are not only specific to the underlying infrastructure + // provider of the current cluster and are required for Ingress Controller to work on OpenShift. + // +optional + LoadBalancer LoadBalancer `json:"loadBalancer,omitempty"` +} + +// IngressPlatformSpec holds the desired state of Ingress specific to the underlying infrastructure provider +// of the current cluster. Since these are used at spec-level for the underlying cluster, it +// is supposed that only one of the spec structs is set. +// +union +type IngressPlatformSpec struct { + // type is the underlying infrastructure provider for the cluster. + // Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", + // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", + // "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, + // and must handle unrecognized platforms as None if they do not support that platform. + // + // +unionDiscriminator + Type PlatformType `json:"type"` + + // aws contains settings specific to the Amazon Web Services infrastructure provider. + // +optional + AWS *AWSIngressSpec `json:"aws,omitempty"` +} + +type LoadBalancer struct { + // platform holds configuration specific to the underlying + // infrastructure provider for the ingress load balancers. + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // +optional + Platform IngressPlatformSpec `json:"platform,omitempty"` +} + +// AWSIngressSpec holds the desired state of the Ingress for Amazon Web Services infrastructure provider. +// This only includes fields that can be modified in the cluster. +// +union +type AWSIngressSpec struct { + // type allows user to set a load balancer type. + // When this field is set the default ingresscontroller will get created using the specified LBType. + // If this field is not set then the default ingress controller of LBType Classic will be created. + // Valid values are: + // + // * "Classic": A Classic Load Balancer that makes routing decisions at either + // the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See + // the following for additional details: + // + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb + // + // * "NLB": A Network Load Balancer that makes routing decisions at the + // transport layer (TCP/SSL). See the following for additional details: + // + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb + // +unionDiscriminator + // +kubebuilder:validation:Enum:=NLB;Classic + // +required + Type AWSLBType `json:"type"` } +type AWSLBType string + +const ( + // NLB is the Network Load Balancer Type of AWS. Using NLB one can set NLB load balancer type for the default ingress controller. + NLB AWSLBType = "NLB" + + // Classic is the Classic Load Balancer Type of AWS. Using CLassic one can set Classic load balancer type for the default ingress controller. + Classic AWSLBType = "Classic" +) + // ConsumingUser is an alias for string which we add validation to. Currently only service accounts are supported. // +kubebuilder:validation:Pattern="^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$" // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=512 type ConsumingUser string -// Hostname is an alias for hostname string validation. -// +kubebuilder:validation:Format=hostname +// Hostname is a host name as defined by RFC-1123. +// + --- +// + The left operand of the | is the original kubebuilder hostname validation format, which is incorrect because it +// + allows upper case letters, disallows hyphen or number in the TLD, and allows labels to start/end in non-alphanumeric +// + characters. See https://bugzilla.redhat.com/show_bug.cgi?id=2039256. +// + ^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$ +// + +// + The right operand of the | is a new pattern that mimics the current API route admission validation on hostname, +// + except that it allows hostnames longer than the maximum length: +// + ^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$ +// + +// + Both operand patterns are made available so that modifications on ingress spec can still happen after an invalid hostname +// + was saved via validation by the incorrect left operand of the | operator. +// + +// +kubebuilder:validation:Pattern=`^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$|^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$` type Hostname string type IngressStatus struct { // componentRoutes is where participating operators place the current route status for routes whose // hostnames and serving certificates can be customized by the cluster-admin. // +optional + // +listType=map + // +listMapKey=namespace + // +listMapKey=name ComponentRoutes []ComponentRouteStatus `json:"componentRoutes,omitempty"` + + // defaultPlacement is set at installation time to control which + // nodes will host the ingress router pods by default. The options are + // control-plane nodes or worker nodes. + // + // This field works by dictating how the Cluster Ingress Operator will + // consider unset replicas and nodePlacement fields in IngressController + // resources when creating the corresponding Deployments. + // + // See the documentation for the IngressController replicas and nodePlacement + // fields for more information. + // + // When omitted, the default value is Workers + // + // +kubebuilder:validation:Enum:="ControlPlane";"Workers";"" + // +optional + DefaultPlacement DefaultPlacement `json:"defaultPlacement"` } // ComponentRouteSpec allows for configuration of a route's hostname and serving certificate. @@ -82,7 +222,6 @@ type ComponentRouteSpec struct { // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=63 - // +kubebuilder:validation:Required // +required Namespace string `json:"namespace"` @@ -92,12 +231,10 @@ type ComponentRouteSpec struct { // entry in the list of status.componentRoutes if the route is to be customized. // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=256 - // +kubebuilder:validation:Required // +required Name string `json:"name"` // hostname is the hostname that should be used by the route. - // +kubebuilder:validation:Required // +required Hostname Hostname `json:"hostname"` @@ -119,7 +256,6 @@ type ComponentRouteStatus struct { // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=63 - // +kubebuilder:validation:Required // +required Namespace string `json:"namespace"` @@ -130,12 +266,10 @@ type ComponentRouteStatus struct { // entry in the list of spec.componentRoutes if the route is to be customized. // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=256 - // +kubebuilder:validation:Required // +required Name string `json:"name"` // defaultHostname is the hostname of this route prior to customization. - // +kubebuilder:validation:Required // +required DefaultHostname Hostname `json:"defaultHostname"` @@ -163,19 +297,36 @@ type ComponentRouteStatus struct { // // If Progressing is true, that means the component is taking some action related to the componentRoutes entry. // +optional + // +listType=map + // +listMapKey=type Conditions []metav1.Condition `json:"conditions,omitempty"` // relatedObjects is a list of resources which are useful when debugging or inspecting how spec.componentRoutes is applied. // +kubebuilder:validation:MinItems=1 - // +kubebuilder:validation:Required // +required RelatedObjects []ObjectReference `json:"relatedObjects"` } +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 type IngressList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Ingress `json:"items"` } + +// DefaultPlacement defines the default placement of ingress router pods. +type DefaultPlacement string + +const ( + // "Workers" is for having router pods placed on worker nodes by default. + DefaultPlacementWorkers DefaultPlacement = "Workers" + + // "ControlPlane" is for having router pods placed on control-plane nodes by default. + DefaultPlacementControlPlane DefaultPlacement = "ControlPlane" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_insights.go b/vendor/github.com/openshift/api/config/v1/types_insights.go new file mode 100644 index 0000000000..b0959881f1 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_insights.go @@ -0,0 +1,230 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// InsightsDataGather provides data gather configuration options for the Insights Operator. +// +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=insightsdatagathers,scope=Cluster +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/2448 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +openshift:enable:FeatureGate=InsightsConfig +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type InsightsDataGather struct { + metav1.TypeMeta `json:",inline"` + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + // spec holds user settable values for configuration + // +required + Spec InsightsDataGatherSpec `json:"spec,omitempty,omitzero"` +} + +// InsightsDataGatherSpec contains the configuration for the data gathering. +type InsightsDataGatherSpec struct { + // gatherConfig is a required spec attribute that includes all the configuration options related to gathering of the Insights data and its uploading to the ingress. + // +required + GatherConfig GatherConfig `json:"gatherConfig,omitempty,omitzero"` +} + +// GatherConfig provides data gathering configuration options. +type GatherConfig struct { + // dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. + // It may not exceed 2 items and must not contain duplicates. + // Valid values are ObfuscateNetworking and WorkloadNames. + // When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. + // When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. + // When omitted no obfuscation is applied. + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))",message="dataPolicy items must be unique" + // +listType=atomic + // +optional + DataPolicy []DataPolicyOption `json:"dataPolicy,omitempty"` + // gatherers is a required field that specifies the configuration of the gatherers. + // +required + Gatherers Gatherers `json:"gatherers,omitempty,omitzero"` + // storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. + // If omitted, the gathering job will use ephemeral storage. + // +optional + Storage Storage `json:"storage,omitempty,omitzero"` +} + +// Gatherers specifies the configuration of the gatherers +// +kubebuilder:validation:XValidation:rule="has(self.mode) && self.mode == 'Custom' ? has(self.custom) : !has(self.custom)",message="custom is required when mode is Custom, and forbidden otherwise" +// +union +type Gatherers struct { + // mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. + // When set to All, all gatherers will run and gather data. + // When set to None, all gatherers will be disabled and no data will be gathered. + // When set to Custom, the custom configuration from the custom field will be applied. + // +unionDiscriminator + // +required + Mode GatheringMode `json:"mode,omitempty"` + // custom provides gathering configuration. + // It is required when mode is Custom, and forbidden otherwise. + // Custom configuration allows user to disable only a subset of gatherers. + // Gatherers that are not explicitly disabled in custom configuration will run. + // +unionMember + // +optional + Custom Custom `json:"custom,omitempty,omitzero"` +} + +// Custom provides the custom configuration of gatherers +type Custom struct { + // configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. + // It may not exceed 100 items and each gatherer can be present only once. + // It is possible to disable an entire set of gatherers while allowing a specific function within that set. + // The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. + // Run the following command to get the names of last active gatherers: + // "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=100 + // +listType=map + // +listMapKey=name + // +required + Configs []GathererConfig `json:"configs,omitempty"` +} + +// GatheringMode defines the valid gathering modes. +// +kubebuilder:validation:Enum=All;None;Custom +type GatheringMode string + +const ( + // Enabled enables all gatherers + GatheringModeAll GatheringMode = "All" + // Disabled disables all gatherers + GatheringModeNone GatheringMode = "None" + // Custom applies the configuration from GatheringConfig. + GatheringModeCustom GatheringMode = "Custom" +) + +// DataPolicyOption declares valid data policy options +// +kubebuilder:validation:Enum=ObfuscateNetworking;WorkloadNames +type DataPolicyOption string + +const ( + // IP addresses and cluster domain name are obfuscated + DataPolicyOptionObfuscateNetworking DataPolicyOption = "ObfuscateNetworking" + // Data from Deployment Validation Operator are obfuscated + DataPolicyOptionObfuscateWorkloadNames DataPolicyOption = "WorkloadNames" +) + +// Storage provides persistent storage configuration options for gathering jobs. +// If the type is set to PersistentVolume, then the PersistentVolume must be defined. +// If the type is set to Ephemeral, then the PersistentVolume must not be defined. +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'PersistentVolume' ? has(self.persistentVolume) : !has(self.persistentVolume)",message="persistentVolume is required when type is PersistentVolume, and forbidden otherwise" +// +union +type Storage struct { + // type is a required field that specifies the type of storage that will be used to store the Insights data archive. + // Valid values are "PersistentVolume" and "Ephemeral". + // When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. + // When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. + // +unionDiscriminator + // +required + Type StorageType `json:"type,omitempty"` + // persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. + // The PersistentVolume must be created in the openshift-insights namespace. + // +unionMember + // +optional + PersistentVolume PersistentVolumeConfig `json:"persistentVolume,omitempty,omitzero"` +} + +// StorageType declares valid storage types +// +kubebuilder:validation:Enum=PersistentVolume;Ephemeral +type StorageType string + +const ( + // StorageTypePersistentVolume storage type + StorageTypePersistentVolume StorageType = "PersistentVolume" + // StorageTypeEphemeral storage type + StorageTypeEphemeral StorageType = "Ephemeral" +) + +// PersistentVolumeConfig provides configuration options for PersistentVolume storage. +type PersistentVolumeConfig struct { + // claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. + // The PersistentVolumeClaim must be created in the openshift-insights namespace. + // +required + Claim PersistentVolumeClaimReference `json:"claim,omitempty,omitzero"` + // mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. + // When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. + // The current default mount path is /var/lib/insights-operator + // The path may not exceed 1024 characters and must not contain a colon. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=1024 + // +kubebuilder:validation:XValidation:rule="!self.contains(':')",message="mountPath must not contain a colon" + // +optional + MountPath string `json:"mountPath,omitempty"` +} + +// PersistentVolumeClaimReference is a reference to a PersistentVolumeClaim. +type PersistentVolumeClaimReference struct { + // name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. + // It is a string that follows the DNS1123 subdomain format. + // It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. + // +kubebuilder:validation:XValidation:rule="!format.dns1123Subdomain().validate(self).hasValue()",message="a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character." + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 + // +required + Name string `json:"name,omitempty"` +} + +// GathererConfig allows to configure specific gatherers +type GathererConfig struct { + // name is the required name of a specific gatherer. + // It may not exceed 256 characters. + // The format for a gatherer name is: {gatherer}/{function} where the function is optional. + // Gatherer consists of a lowercase letters only that may include underscores (_). + // Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). + // The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. + // Run the following command to get the names of last active gatherers: + // "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:XValidation:rule=`self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$")`,message=`gatherer name must be in the format of {gatherer}/{function} where the gatherer and function are lowercase letters only that may include underscores (_) and are separated by a forward slash (/) if the function is provided` + // +required + Name string `json:"name,omitempty"` + // state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". + // When set to Enabled the gatherer will run. + // When set to Disabled the gatherer will not run. + // +required + State GathererState `json:"state,omitempty"` +} + +// GathererState declares valid gatherer state types. +// +kubebuilder:validation:Enum=Enabled;Disabled +type GathererState string + +const ( + // GathererStateEnabled gatherer state, which means that the gatherer will run. + GathererStateEnabled GathererState = "Enabled" + // GathererStateDisabled gatherer state, which means that the gatherer will not run. + GathererStateDisabled GathererState = "Disabled" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// InsightsDataGatherList is a collection of items +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type InsightsDataGatherList struct { + metav1.TypeMeta `json:",inline"` + // metadata is the required standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +required + metav1.ListMeta `json:"metadata,omitempty"` + // items is the required list of InsightsDataGather objects + // it may not exceed 100 items + // +kubebuilder:validation:MinItems=0 + // +kubebuilder:validation:MaxItems=100 + // +required + Items []InsightsDataGather `json:"items,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_kmsencryption.go b/vendor/github.com/openshift/api/config/v1/types_kmsencryption.go new file mode 100644 index 0000000000..3293204fa4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_kmsencryption.go @@ -0,0 +1,55 @@ +package v1 + +// KMSConfig defines the configuration for the KMS instance +// that will be used with KMSEncryptionProvider encryption +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'AWS' ? has(self.aws) : !has(self.aws)",message="aws config is required when kms provider type is AWS, and forbidden otherwise" +// +union +type KMSConfig struct { + // type defines the kind of platform for the KMS provider. + // Available provider types are AWS only. + // + // +unionDiscriminator + // +required + Type KMSProviderType `json:"type"` + + // aws defines the key config for using an AWS KMS instance + // for the encryption. The AWS KMS instance is managed + // by the user outside the purview of the control plane. + // + // +unionMember + // +optional + AWS *AWSKMSConfig `json:"aws,omitempty"` +} + +// AWSKMSConfig defines the KMS config specific to AWS KMS provider +type AWSKMSConfig struct { + // keyARN specifies the Amazon Resource Name (ARN) of the AWS KMS key used for encryption. + // The value must adhere to the format `arn:aws:kms:::key/`, where: + // - `` is the AWS region consisting of lowercase letters and hyphens followed by a number. + // - `` is a 12-digit numeric identifier for the AWS account. + // - `` is a unique identifier for the KMS key, consisting of lowercase hexadecimal characters and hyphens. + // + // +kubebuilder:validation:MaxLength=128 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:XValidation:rule="self.matches('^arn:aws:kms:[a-z0-9-]+:[0-9]{12}:key/[a-f0-9-]+$')",message="keyARN must follow the format `arn:aws:kms:::key/`. The account ID must be a 12 digit number and the region and key ID should consist only of lowercase hexadecimal characters and hyphens (-)." + // +required + KeyARN string `json:"keyARN"` + // region specifies the AWS region where the KMS instance exists, and follows the format + // `--`, e.g.: `us-east-1`. + // Only lowercase letters and hyphens followed by numbers are allowed. + // + // +kubebuilder:validation:MaxLength=64 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:XValidation:rule="self.matches('^[a-z0-9]+(-[a-z0-9]+)*$')",message="region must be a valid AWS region, consisting of lowercase characters, digits and hyphens (-) only." + // +required + Region string `json:"region"` +} + +// KMSProviderType is a specific supported KMS provider +// +kubebuilder:validation:Enum=AWS +type KMSProviderType string + +const ( + // AWSKMSProvider represents a supported KMS provider for use with AWS KMS + AWSKMSProvider KMSProviderType = "AWS" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_network.go b/vendor/github.com/openshift/api/config/v1/types_network.go index ebfdf01626..c0d1602b37 100644 --- a/vendor/github.com/openshift/api/config/v1/types_network.go +++ b/vendor/github.com/openshift/api/config/v1/types_network.go @@ -1,6 +1,9 @@ package v1 -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) // +genclient // +genclient:nonNamespaced @@ -8,15 +11,25 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. // Please view network.spec for an explanation on what applies when configuring this resource. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:compatibility-gen:level=1 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=networks,scope=Cluster +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Network struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration. // As a general rule, this SHOULD NOT be read directly. Instead, you should // consume the NetworkStatus, as it indicates the currently deployed configuration. // Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each. - // +kubebuilder:validation:Required // +required Spec NetworkSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -28,21 +41,24 @@ type Network struct { // As a general rule, this SHOULD NOT be read directly. Instead, you should // consume the NetworkStatus, as it indicates the currently deployed configuration. // Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each. +// +openshift:validation:FeatureGateAwareXValidation:featureGate=NetworkDiagnosticsConfig,rule="!has(self.networkDiagnostics) || !has(self.networkDiagnostics.mode) || self.networkDiagnostics.mode!='Disabled' || !has(self.networkDiagnostics.sourcePlacement) && !has(self.networkDiagnostics.targetPlacement)",message="cannot set networkDiagnostics.sourcePlacement and networkDiagnostics.targetPlacement when networkDiagnostics.mode is Disabled" type NetworkSpec struct { // IP address pool to use for pod IPs. // This field is immutable after installation. + // +listType=atomic ClusterNetwork []ClusterNetworkEntry `json:"clusterNetwork"` // IP address pool for services. // Currently, we only support a single entry here. // This field is immutable after installation. + // +listType=atomic ServiceNetwork []string `json:"serviceNetwork"` - // NetworkType is the plugin that is to be deployed (e.g. OpenShiftSDN). + // networkType is the plugin that is to be deployed (e.g. OVNKubernetes). // This should match a value that the cluster-network-operator understands, // or else no networking will be installed. // Currently supported values are: - // - OpenShiftSDN + // - OVNKubernetes // This field is immutable after installation. NetworkType string `json:"networkType"` @@ -60,25 +76,51 @@ type NetworkSpec struct { // installed. // +kubebuilder:validation:Pattern=`^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$` ServiceNodePortRange string `json:"serviceNodePortRange,omitempty"` + + // networkDiagnostics defines network diagnostics configuration. + // + // Takes precedence over spec.disableNetworkDiagnostics in network.operator.openshift.io. + // If networkDiagnostics is not specified or is empty, + // and the spec.disableNetworkDiagnostics flag in network.operator.openshift.io is set to true, + // the network diagnostics feature will be disabled. + // + // +optional + // +openshift:enable:FeatureGate=NetworkDiagnosticsConfig + NetworkDiagnostics NetworkDiagnostics `json:"networkDiagnostics"` } // NetworkStatus is the current network configuration. type NetworkStatus struct { // IP address pool to use for pod IPs. + // +listType=atomic + // +optional ClusterNetwork []ClusterNetworkEntry `json:"clusterNetwork,omitempty"` // IP address pool for services. // Currently, we only support a single entry here. + // +listType=atomic + // +optional ServiceNetwork []string `json:"serviceNetwork,omitempty"` - // NetworkType is the plugin that is deployed (e.g. OpenShiftSDN). + // networkType is the plugin that is deployed (e.g. OVNKubernetes). + // +optional NetworkType string `json:"networkType,omitempty"` - // ClusterNetworkMTU is the MTU for inter-pod networking. + // clusterNetworkMTU is the MTU for inter-pod networking. + // +optional ClusterNetworkMTU int `json:"clusterNetworkMTU,omitempty"` - // Migration contains the cluster network migration configuration. + // migration contains the cluster network migration configuration. + // +optional Migration *NetworkMigration `json:"migration,omitempty"` + + // conditions represents the observations of a network.config current state. + // Known .status.conditions.type are: "NetworkDiagnosticsAvailable" + // +optional + // +listType=map + // +listMapKey=type + // +openshift:enable:FeatureGate=NetworkDiagnosticsConfig + Conditions []metav1.Condition `json:"conditions,omitempty"` } // ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs @@ -110,6 +152,7 @@ type ExternalIPConfig struct { // ExternalIPPolicy rules. // Currently, only one entry may be provided. // +optional + // +listType=atomic AutoAssignCIDRs []string `json:"autoAssignCIDRs,omitempty"` } @@ -118,27 +161,148 @@ type ExternalIPConfig struct { // The policy controller always allows automatically assigned external IPs. type ExternalIPPolicy struct { // allowedCIDRs is the list of allowed CIDRs. + // +listType=atomic AllowedCIDRs []string `json:"allowedCIDRs,omitempty"` // rejectedCIDRs is the list of disallowed CIDRs. These take precedence // over allowedCIDRs. // +optional + // +listType=atomic RejectedCIDRs []string `json:"rejectedCIDRs,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type NetworkList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Network `json:"items"` } -// NetworkMigration represents the cluster network configuration. +// NetworkMigration represents the network migration status. type NetworkMigration struct { - // NetworkType is the target plugin that is to be deployed. - // Currently supported values are: OpenShiftSDN, OVNKubernetes - // +kubebuilder:validation:Enum={"OpenShiftSDN","OVNKubernetes"} - NetworkType string `json:"networkType"` + // networkType is the target plugin that is being deployed. + // DEPRECATED: network type migration is no longer supported, + // so this should always be unset. + // +optional + NetworkType string `json:"networkType,omitempty"` + + // mtu is the MTU configuration that is being deployed. + // +optional + MTU *MTUMigration `json:"mtu,omitempty"` +} + +// MTUMigration contains infomation about MTU migration. +type MTUMigration struct { + // network contains MTU migration configuration for the default network. + // +optional + Network *MTUMigrationValues `json:"network,omitempty"` + + // machine contains MTU migration configuration for the machine's uplink. + // +optional + Machine *MTUMigrationValues `json:"machine,omitempty"` +} + +// MTUMigrationValues contains the values for a MTU migration. +type MTUMigrationValues struct { + // to is the MTU to migrate to. + // +kubebuilder:validation:Minimum=0 + To *uint32 `json:"to"` + + // from is the MTU to migrate from. + // +kubebuilder:validation:Minimum=0 + // +optional + From *uint32 `json:"from,omitempty"` +} + +// NetworkDiagnosticsMode is an enumeration of the available network diagnostics modes +// Valid values are "", "All", "Disabled". +// +kubebuilder:validation:Enum:="";All;Disabled +type NetworkDiagnosticsMode string + +const ( + // NetworkDiagnosticsNoOpinion means that the user has no opinion and the platform is left + // to choose reasonable default. The current default is All and is a subject to change over time. + NetworkDiagnosticsNoOpinion NetworkDiagnosticsMode = "" + // NetworkDiagnosticsAll means that all network diagnostics checks are enabled + NetworkDiagnosticsAll NetworkDiagnosticsMode = "All" + // NetworkDiagnosticsDisabled means that network diagnostics is disabled + NetworkDiagnosticsDisabled NetworkDiagnosticsMode = "Disabled" +) + +// NetworkDiagnostics defines network diagnostics configuration + +type NetworkDiagnostics struct { + // mode controls the network diagnostics mode + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is All. + // + // +optional + Mode NetworkDiagnosticsMode `json:"mode"` + + // sourcePlacement controls the scheduling of network diagnostics source deployment + // + // See NetworkDiagnosticsSourcePlacement for more details about default values. + // + // +optional + SourcePlacement NetworkDiagnosticsSourcePlacement `json:"sourcePlacement"` + + // targetPlacement controls the scheduling of network diagnostics target daemonset + // + // See NetworkDiagnosticsTargetPlacement for more details about default values. + // + // +optional + TargetPlacement NetworkDiagnosticsTargetPlacement `json:"targetPlacement"` +} + +// NetworkDiagnosticsSourcePlacement defines node scheduling configuration network diagnostics source components +type NetworkDiagnosticsSourcePlacement struct { + // nodeSelector is the node selector applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is `kubernetes.io/os: linux`. + // + // +optional + NodeSelector map[string]string `json:"nodeSelector"` + + // tolerations is a list of tolerations applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is an empty list. + // + // +optional + // +listType=atomic + Tolerations []corev1.Toleration `json:"tolerations"` +} + +// NetworkDiagnosticsTargetPlacement defines node scheduling configuration network diagnostics target components +type NetworkDiagnosticsTargetPlacement struct { + // nodeSelector is the node selector applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is `kubernetes.io/os: linux`. + // + // +optional + NodeSelector map[string]string `json:"nodeSelector"` + + // tolerations is a list of tolerations applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is `- operator: "Exists"` which means that all taints are tolerated. + // + // +optional + // +listType=atomic + Tolerations []corev1.Toleration `json:"tolerations"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_node.go b/vendor/github.com/openshift/api/config/v1/types_node.go new file mode 100644 index 0000000000..1282f33158 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_node.go @@ -0,0 +1,142 @@ +package v1 + +import ( + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Node holds cluster-wide information about node specific features. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/1107 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=nodes,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type Node struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec NodeSpec `json:"spec"` + + // status holds observed values. + // +optional + Status NodeStatus `json:"status"` +} + +type NodeSpec struct { + // cgroupMode determines the cgroups version on the node + // +optional + CgroupMode CgroupMode `json:"cgroupMode,omitempty"` + + // workerLatencyProfile determins the how fast the kubelet is updating + // the status and corresponding reaction of the cluster + // +optional + WorkerLatencyProfile WorkerLatencyProfileType `json:"workerLatencyProfile,omitempty"` + + // minimumKubeletVersion is the lowest version of a kubelet that can join the cluster. + // Specifically, the apiserver will deny most authorization requests of kubelets that are older + // than the specified version, only allowing the kubelet to get and update its node object, and perform + // subjectaccessreviews. + // This means any kubelet that attempts to join the cluster will not be able to run any assigned workloads, + // and will eventually be marked as not ready. + // Its max length is 8, so maximum version allowed is either "9.999.99" or "99.99.99". + // Since the kubelet reports the version of the kubernetes release, not Openshift, this field references + // the underlying kubernetes version this version of Openshift is based off of. + // In other words: if an admin wishes to ensure no nodes run an older version than Openshift 4.17, then + // they should set the minimumKubeletVersion to 1.30.0. + // When comparing versions, the kubelet's version is stripped of any contents outside of major.minor.patch version. + // Thus, a kubelet with version "1.0.0-ec.0" will be compatible with minimumKubeletVersion "1.0.0" or earlier. + // +kubebuilder:validation:XValidation:rule="self == \"\" || self.matches('^[0-9]*.[0-9]*.[0-9]*$')",message="minmumKubeletVersion must be in a semver compatible format of x.y.z, or empty" + // +kubebuilder:validation:MaxLength:=8 + // +openshift:enable:FeatureGate=MinimumKubeletVersion + // +optional + MinimumKubeletVersion string `json:"minimumKubeletVersion"` +} + +type NodeStatus struct { + // conditions contain the details and the current state of the nodes.config object + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// +kubebuilder:validation:Enum=v2;"" +type CgroupMode string + +const ( + CgroupModeEmpty CgroupMode = "" // Empty string indicates to honor user set value on the system that should not be overridden by OpenShift + CgroupModeV1 CgroupMode = "v1" + CgroupModeV2 CgroupMode = "v2" + CgroupModeDefault CgroupMode = CgroupModeV2 +) + +// +kubebuilder:validation:Enum=Default;MediumUpdateAverageReaction;LowUpdateSlowReaction +type WorkerLatencyProfileType string + +const ( + // Medium Kubelet Update Frequency (heart-beat) and Average Reaction Time to unresponsive Node + MediumUpdateAverageReaction WorkerLatencyProfileType = "MediumUpdateAverageReaction" + + // Low Kubelet Update Frequency (heart-beat) and Slow Reaction Time to unresponsive Node + LowUpdateSlowReaction WorkerLatencyProfileType = "LowUpdateSlowReaction" + + // Default values of relavent Kubelet, Kube Controller Manager and Kube API Server + DefaultUpdateDefaultReaction WorkerLatencyProfileType = "Default" +) + +const ( + // DefaultNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNodeStatusUpdateFrequency = 10 * time.Second + // DefaultNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNodeMonitorGracePeriod = 40 * time.Second + // DefaultNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNotReadyTolerationSeconds = 300 + // DefaultUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultUnreachableTolerationSeconds = 300 + + // MediumNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNodeStatusUpdateFrequency = 20 * time.Second + // MediumNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNodeMonitorGracePeriod = 2 * time.Minute + // MediumNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNotReadyTolerationSeconds = 60 + // MediumUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumUnreachableTolerationSeconds = 60 + + // LowNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNodeStatusUpdateFrequency = 1 * time.Minute + // LowNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNodeMonitorGracePeriod = 5 * time.Minute + // LowNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNotReadyTolerationSeconds = 60 + // LowUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowUnreachableTolerationSeconds = 60 +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type NodeList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Node `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_oauth.go b/vendor/github.com/openshift/api/config/v1/types_oauth.go index fcbd191aa6..20845e4dbe 100644 --- a/vendor/github.com/openshift/api/config/v1/types_oauth.go +++ b/vendor/github.com/openshift/api/config/v1/types_oauth.go @@ -11,11 +11,22 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. // It is used to configure the integrated OAuth server. // This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=oauths,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type OAuth struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec OAuthSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -28,6 +39,7 @@ type OAuthSpec struct { // identityProviders is an ordered list of ways for a user to identify themselves. // When this list is empty, no identities are provisioned for users. // +optional + // +listType=atomic IdentityProviders []IdentityProvider `json:"identityProviders,omitempty"` // tokenConfig contains options for authorization and access tokens @@ -63,6 +75,8 @@ type TokenConfig struct { // per client, then that value takes precedence. If the timeout value is // not specified and the client does not override the value, then tokens // are valid until their lifetime. + // + // WARNING: existing tokens' timeout will not be affected (lowered) by changing this value // +optional AccessTokenInactivityTimeout *metav1.Duration `json:"accessTokenInactivityTimeout,omitempty"` } @@ -527,35 +541,56 @@ type OpenIDIdentityProvider struct { // UserIDClaim is the claim used to provide a stable identifier for OIDC identities. // Per http://openid.net/specs/openid-connect-core-1_0.html#ClaimStability -// "The sub (subject) and iss (issuer) Claims, used together, are the only Claims that an RP can -// rely upon as a stable identifier for the End-User, since the sub Claim MUST be locally unique -// and never reassigned within the Issuer for a particular End-User, as described in Section 2. -// Therefore, the only guaranteed unique identifier for a given End-User is the combination of the -// iss Claim and the sub Claim." +// +// "The sub (subject) and iss (issuer) Claims, used together, are the only Claims that an RP can +// rely upon as a stable identifier for the End-User, since the sub Claim MUST be locally unique +// and never reassigned within the Issuer for a particular End-User, as described in Section 2. +// Therefore, the only guaranteed unique identifier for a given End-User is the combination of the +// iss Claim and the sub Claim." const UserIDClaim = "sub" +// OpenIDClaim represents a claim retrieved from an OpenID provider's tokens or userInfo +// responses +// +kubebuilder:validation:MinLength=1 +type OpenIDClaim string + // OpenIDClaims contains a list of OpenID claims to use when authenticating with an OpenID identity provider type OpenIDClaims struct { // preferredUsername is the list of claims whose values should be used as the preferred username. // If unspecified, the preferred username is determined from the value of the sub claim + // +listType=atomic // +optional PreferredUsername []string `json:"preferredUsername,omitempty"` // name is the list of claims whose values should be used as the display name. Optional. // If unspecified, no display name is set for the identity + // +listType=atomic // +optional Name []string `json:"name,omitempty"` // email is the list of claims whose values should be used as the email address. Optional. // If unspecified, no email is set for the identity + // +listType=atomic // +optional Email []string `json:"email,omitempty"` + + // groups is the list of claims value of which should be used to synchronize groups + // from the OIDC provider to OpenShift for the user. + // If multiple claims are specified, the first one with a non-empty value is used. + // +listType=atomic + // +optional + Groups []OpenIDClaim `json:"groups,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type OAuthList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []OAuth `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_operatorhub.go b/vendor/github.com/openshift/api/config/v1/types_operatorhub.go index 1b2b7f82e9..a4971a20c5 100644 --- a/vendor/github.com/openshift/api/config/v1/types_operatorhub.go +++ b/vendor/github.com/openshift/api/config/v1/types_operatorhub.go @@ -28,6 +28,7 @@ type OperatorHubSpec struct { type OperatorHubStatus struct { // sources encapsulates the result of applying the configuration for each // hub source + // +optional Sources []HubSourceStatus `json:"sources,omitempty"` } @@ -36,11 +37,22 @@ type OperatorHubStatus struct { // OperatorHub is the Schema for the operatorhubs API. It can be used to change // the state of the default hub sources for OperatorHub on the cluster from // enabled to disabled and vice versa. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=operatorhubs,scope=Cluster // +kubebuilder:subresource:status // +genclient // +genclient:nonNamespaced +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_03,operatorName=marketplace,operatorOrdering=01 +// +openshift:capability=marketplace +// +openshift:compatibility-gen:level=1 type OperatorHub struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata"` Spec OperatorHubSpec `json:"spec"` @@ -50,8 +62,14 @@ type OperatorHub struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // OperatorHubList contains a list of OperatorHub +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type OperatorHubList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []OperatorHub `json:"items"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_project.go b/vendor/github.com/openshift/api/config/v1/types_project.go index 244ce3ef8f..3d219862be 100644 --- a/vendor/github.com/openshift/api/config/v1/types_project.go +++ b/vendor/github.com/openshift/api/config/v1/types_project.go @@ -7,12 +7,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Project holds cluster-wide information about Project. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=projects,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Project struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec ProjectSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -46,8 +57,13 @@ type ProjectStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ProjectList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Project `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_proxy.go b/vendor/github.com/openshift/api/config/v1/types_proxy.go index 211e501e08..ed40176ce3 100644 --- a/vendor/github.com/openshift/api/config/v1/types_proxy.go +++ b/vendor/github.com/openshift/api/config/v1/types_proxy.go @@ -9,12 +9,23 @@ import ( // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_03,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=proxies,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Proxy struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` - // Spec holds user-settable values for the proxy configuration - // +kubebuilder:validation:Required + // spec holds user-settable values for the proxy configuration // +required Spec ProxySpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -32,7 +43,7 @@ type ProxySpec struct { // +optional HTTPSProxy string `json:"httpsProxy,omitempty"` - // noProxy is a comma-separated list of hostnames and/or CIDRs for which the proxy should not be used. + // noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. // Empty means unset and will not result in an env var. // +optional NoProxy string `json:"noProxy,omitempty"` @@ -86,8 +97,13 @@ type ProxyStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ProxyList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Proxy `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_scheduling.go b/vendor/github.com/openshift/api/config/v1/types_scheduling.go index 570f8affce..c90d5633f6 100644 --- a/vendor/github.com/openshift/api/config/v1/types_scheduling.go +++ b/vendor/github.com/openshift/api/config/v1/types_scheduling.go @@ -8,12 +8,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // Scheduler holds cluster-wide config information to run the Kubernetes Scheduler // and influence its placement decisions. The canonical name for this config is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=schedulers,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Scheduler struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec SchedulerSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -36,6 +47,10 @@ type SchedulerSpec struct { // Defaults to "LowNodeUtilization" // +optional Profile SchedulerProfile `json:"profile,omitempty"` + // profileCustomizations contains configuration for modifying the default behavior of existing scheduler profiles. + // +openshift:enable:FeatureGate=DynamicResourceAllocation + // +optional + ProfileCustomizations ProfileCustomizations `json:"profileCustomizations"` // defaultNodeSelector helps set the cluster-wide default node selector to // restrict pod placement to specific nodes. This is applied to the pods // created in all namespaces and creates an intersection with any existing @@ -58,7 +73,7 @@ type SchedulerSpec struct { // would not be applied. // +optional DefaultNodeSelector string `json:"defaultNodeSelector,omitempty"` - // MastersSchedulable allows masters nodes to be schedulable. When this flag is + // mastersSchedulable allows masters nodes to be schedulable. When this flag is // turned on, all the master nodes in the cluster will be made schedulable, // so that workload pods can run on them. The default value for this field is false, // meaning none of the master nodes are schedulable. @@ -87,13 +102,42 @@ var ( NoScoring SchedulerProfile = "NoScoring" ) +// ProfileCustomizations contains various parameters for modifying the default behavior of certain profiles +type ProfileCustomizations struct { + // dynamicResourceAllocation allows to enable or disable dynamic resource allocation within the scheduler. + // Dynamic resource allocation is an API for requesting and sharing resources between pods and containers inside a pod. + // Third-party resource drivers are responsible for tracking and allocating resources. + // Different kinds of resources support arbitrary parameters for defining requirements and initialization. + // Valid values are Enabled, Disabled and omitted. + // When omitted, this means no opinion and the platform is left to choose a reasonable default, + // which is subject to change over time. + // The current default is Disabled. + // +optional + DynamicResourceAllocation DRAEnablement `json:"dynamicResourceAllocation"` +} + +// +kubebuilder:validation:Enum:="";"Enabled";"Disabled" +type DRAEnablement string + +var ( + // DRAEnablementEnabled enables dynamic resource allocation feature + DRAEnablementEnabled DRAEnablement = "Enabled" + // DRAEnablementDisabled disables dynamic resource allocation feature + DRAEnablementDisabled DRAEnablement = "Disabled" +) + type SchedulerStatus struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type SchedulerList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Scheduler `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_testreporting.go b/vendor/github.com/openshift/api/config/v1/types_testreporting.go new file mode 100644 index 0000000000..00953957f4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_testreporting.go @@ -0,0 +1,45 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// TestReporting is used for origin (and potentially others) to report the test names for a given FeatureGate into +// the payload for later analysis on a per-payload basis. +// This doesn't need any CRD because it's never stored in the cluster. +// +// Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support. +// +openshift:compatibility-gen:internal +type TestReporting struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +required + Spec TestReportingSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status TestReportingStatus `json:"status"` +} + +type TestReportingSpec struct { + // testsForFeatureGates is a list, indexed by FeatureGate and includes information about testing. + TestsForFeatureGates []FeatureGateTests `json:"testsForFeatureGates"` +} + +type FeatureGateTests struct { + // featureGate is the name of the FeatureGate as it appears in The FeatureGate CR instance. + FeatureGate string `json:"featureGate"` + + // tests contains an item for every TestName + Tests []TestDetails `json:"tests"` +} + +type TestDetails struct { + // testName is the name of the test as it appears in junit XMLs. + // It does not include the suite name since the same test can be executed in many suites. + TestName string `json:"testName"` +} + +type TestReportingStatus struct { +} diff --git a/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go b/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go index 9dbacb9966..b18ef647c2 100644 --- a/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go +++ b/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go @@ -27,36 +27,66 @@ type TLSSecurityProfile struct { // and looks like this (yaml): // // ciphers: + // // - TLS_AES_128_GCM_SHA256 + // // - TLS_AES_256_GCM_SHA384 + // // - TLS_CHACHA20_POLY1305_SHA256 + // // - ECDHE-ECDSA-AES128-GCM-SHA256 + // // - ECDHE-RSA-AES128-GCM-SHA256 + // // - ECDHE-ECDSA-AES256-GCM-SHA384 + // // - ECDHE-RSA-AES256-GCM-SHA384 + // // - ECDHE-ECDSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-CHACHA20-POLY1305 + // // - DHE-RSA-AES128-GCM-SHA256 + // // - DHE-RSA-AES256-GCM-SHA384 + // // - DHE-RSA-CHACHA20-POLY1305 + // // - ECDHE-ECDSA-AES128-SHA256 + // // - ECDHE-RSA-AES128-SHA256 + // // - ECDHE-ECDSA-AES128-SHA + // // - ECDHE-RSA-AES128-SHA + // // - ECDHE-ECDSA-AES256-SHA384 + // // - ECDHE-RSA-AES256-SHA384 + // // - ECDHE-ECDSA-AES256-SHA + // // - ECDHE-RSA-AES256-SHA + // // - DHE-RSA-AES128-SHA256 + // // - DHE-RSA-AES256-SHA256 + // // - AES128-GCM-SHA256 + // // - AES256-GCM-SHA384 + // // - AES128-SHA256 + // // - AES256-SHA256 + // // - AES128-SHA + // // - AES256-SHA + // // - DES-CBC3-SHA - // minTLSVersion: TLSv1.0 + // + // minTLSVersion: VersionTLS10 // // +optional // +nullable @@ -68,18 +98,30 @@ type TLSSecurityProfile struct { // and looks like this (yaml): // // ciphers: + // // - TLS_AES_128_GCM_SHA256 + // // - TLS_AES_256_GCM_SHA384 + // // - TLS_CHACHA20_POLY1305_SHA256 + // // - ECDHE-ECDSA-AES128-GCM-SHA256 + // // - ECDHE-RSA-AES128-GCM-SHA256 + // // - ECDHE-ECDSA-AES256-GCM-SHA384 + // // - ECDHE-RSA-AES256-GCM-SHA384 + // // - ECDHE-ECDSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-CHACHA20-POLY1305 + // // - DHE-RSA-AES128-GCM-SHA256 + // // - DHE-RSA-AES256-GCM-SHA384 - // minTLSVersion: TLSv1.2 + // + // minTLSVersion: VersionTLS12 // // +optional // +nullable @@ -91,12 +133,14 @@ type TLSSecurityProfile struct { // and looks like this (yaml): // // ciphers: + // // - TLS_AES_128_GCM_SHA256 + // // - TLS_AES_256_GCM_SHA384 + // // - TLS_CHACHA20_POLY1305_SHA256 - // minTLSVersion: TLSv1.3 // - // NOTE: Currently unsupported. + // minTLSVersion: VersionTLS13 // // +optional // +nullable @@ -106,11 +150,16 @@ type TLSSecurityProfile struct { // looks like this: // // ciphers: + // // - ECDHE-ECDSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-AES128-GCM-SHA256 + // // - ECDHE-ECDSA-AES128-GCM-SHA256 - // minTLSVersion: TLSv1.1 + // + // minTLSVersion: VersionTLS11 // // +optional // +nullable @@ -162,12 +211,13 @@ type TLSProfileSpec struct { // ciphers: // - DES-CBC3-SHA // + // +listType=atomic Ciphers []string `json:"ciphers"` // minTLSVersion is used to specify the minimal version of the TLS protocol // that is negotiated during the TLS handshake. For example, to use TLS // versions 1.1, 1.2 and 1.3 (yaml): // - // minTLSVersion: TLSv1.1 + // minTLSVersion: VersionTLS11 // // NOTE: currently the highest minTLSVersion allowed is VersionTLS12 // @@ -177,7 +227,7 @@ type TLSProfileSpec struct { // TLSProtocolVersion is a way to specify the protocol version used for TLS connections. // Protocol versions are based on the following most common TLS configurations: // -// https://ssl-config.mozilla.org/ +// https://ssl-config.mozilla.org/ // // Note that SSLv3.0 is not a supported protocol version due to well known // vulnerabilities such as POODLE: https://en.wikipedia.org/wiki/POODLE diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go index cb933dac08..0863934f22 100644 --- a/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go @@ -1,6 +1,7 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated -// Code generated by deepcopy-gen. DO NOT EDIT. +// Code generated by codegen. DO NOT EDIT. package v1 @@ -41,6 +42,11 @@ func (in *APIServer) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *APIServerEncryption) DeepCopyInto(out *APIServerEncryption) { *out = *in + if in.KMS != nil { + in, out := &in.KMS, &out.KMS + *out = new(KMSConfig) + (*in).DeepCopyInto(*out) + } return } @@ -142,13 +148,13 @@ func (in *APIServerSpec) DeepCopyInto(out *APIServerSpec) { *out = make([]string, len(*in)) copy(*out, *in) } - out.Encryption = in.Encryption + in.Encryption.DeepCopyInto(&out.Encryption) if in.TLSSecurityProfile != nil { in, out := &in.TLSSecurityProfile, &out.TLSSecurityProfile *out = new(TLSSecurityProfile) (*in).DeepCopyInto(*out) } - out.Audit = in.Audit + in.Audit.DeepCopyInto(&out.Audit) return } @@ -178,6 +184,54 @@ func (in *APIServerStatus) DeepCopy() *APIServerStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSDNSSpec) DeepCopyInto(out *AWSDNSSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSDNSSpec. +func (in *AWSDNSSpec) DeepCopy() *AWSDNSSpec { + if in == nil { + return nil + } + out := new(AWSDNSSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSIngressSpec) DeepCopyInto(out *AWSIngressSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSIngressSpec. +func (in *AWSIngressSpec) DeepCopy() *AWSIngressSpec { + if in == nil { + return nil + } + out := new(AWSIngressSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSKMSConfig) DeepCopyInto(out *AWSKMSConfig) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSKMSConfig. +func (in *AWSKMSConfig) DeepCopy() *AWSKMSConfig { + if in == nil { + return nil + } + out := new(AWSKMSConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AWSPlatformSpec) DeepCopyInto(out *AWSPlatformSpec) { *out = *in @@ -212,6 +266,11 @@ func (in *AWSPlatformStatus) DeepCopyInto(out *AWSPlatformStatus) { *out = make([]AWSResourceTag, len(*in)) copy(*out, *in) } + if in.CloudLoadBalancerConfig != nil { + in, out := &in.CloudLoadBalancerConfig, &out.CloudLoadBalancerConfig + *out = new(CloudLoadBalancerConfig) + (*in).DeepCopyInto(*out) + } return } @@ -307,9 +366,67 @@ func (in *AdmissionPluginConfig) DeepCopy() *AdmissionPluginConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudPlatformSpec) DeepCopyInto(out *AlibabaCloudPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudPlatformSpec. +func (in *AlibabaCloudPlatformSpec) DeepCopy() *AlibabaCloudPlatformSpec { + if in == nil { + return nil + } + out := new(AlibabaCloudPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudPlatformStatus) DeepCopyInto(out *AlibabaCloudPlatformStatus) { + *out = *in + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]AlibabaCloudResourceTag, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudPlatformStatus. +func (in *AlibabaCloudPlatformStatus) DeepCopy() *AlibabaCloudPlatformStatus { + if in == nil { + return nil + } + out := new(AlibabaCloudPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudResourceTag) DeepCopyInto(out *AlibabaCloudResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudResourceTag. +func (in *AlibabaCloudResourceTag) DeepCopy() *AlibabaCloudResourceTag { + if in == nil { + return nil + } + out := new(AlibabaCloudResourceTag) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Audit) DeepCopyInto(out *Audit) { *out = *in + if in.CustomRules != nil { + in, out := &in.CustomRules, &out.CustomRules + *out = make([]AuditCustomRule, len(*in)) + copy(*out, *in) + } return } @@ -340,13 +457,29 @@ func (in *AuditConfig) DeepCopy() *AuditConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuditCustomRule) DeepCopyInto(out *AuditCustomRule) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuditCustomRule. +func (in *AuditCustomRule) DeepCopy() *AuditCustomRule { + if in == nil { + return nil + } + out := new(AuditCustomRule) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Authentication) DeepCopyInto(out *Authentication) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -415,6 +548,13 @@ func (in *AuthenticationSpec) DeepCopyInto(out *AuthenticationSpec) { *out = new(WebhookTokenAuthenticator) **out = **in } + if in.OIDCProviders != nil { + in, out := &in.OIDCProviders, &out.OIDCProviders + *out = make([]OIDCProvider, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -432,6 +572,13 @@ func (in *AuthenticationSpec) DeepCopy() *AuthenticationSpec { func (in *AuthenticationStatus) DeepCopyInto(out *AuthenticationStatus) { *out = *in out.IntegratedOAuthMetadata = in.IntegratedOAuthMetadata + if in.OIDCClients != nil { + in, out := &in.OIDCClients, &out.OIDCClients + *out = make([]OIDCClientStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -464,6 +611,16 @@ func (in *AzurePlatformSpec) DeepCopy() *AzurePlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AzurePlatformStatus) DeepCopyInto(out *AzurePlatformStatus) { *out = *in + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]AzureResourceTag, len(*in)) + copy(*out, *in) + } + if in.CloudLoadBalancerConfig != nil { + in, out := &in.CloudLoadBalancerConfig, &out.CloudLoadBalancerConfig + *out = new(CloudLoadBalancerConfig) + (*in).DeepCopyInto(*out) + } return } @@ -477,9 +634,56 @@ func (in *AzurePlatformStatus) DeepCopy() *AzurePlatformStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureResourceTag) DeepCopyInto(out *AzureResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureResourceTag. +func (in *AzureResourceTag) DeepCopy() *AzureResourceTag { + if in == nil { + return nil + } + out := new(AzureResourceTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalPlatformLoadBalancer) DeepCopyInto(out *BareMetalPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalPlatformLoadBalancer. +func (in *BareMetalPlatformLoadBalancer) DeepCopy() *BareMetalPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(BareMetalPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BareMetalPlatformSpec) DeepCopyInto(out *BareMetalPlatformSpec) { *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } return } @@ -496,6 +700,26 @@ func (in *BareMetalPlatformSpec) DeepCopy() *BareMetalPlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BareMetalPlatformStatus) DeepCopyInto(out *BareMetalPlatformStatus) { *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(BareMetalPlatformLoadBalancer) + **out = **in + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } return } @@ -717,43 +941,116 @@ func (in *ClientConnectionOverrides) DeepCopy() *ClientConnectionOverrides { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterNetworkEntry) DeepCopyInto(out *ClusterNetworkEntry) { +func (in *CloudControllerManagerStatus) DeepCopyInto(out *CloudControllerManagerStatus) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterNetworkEntry. -func (in *ClusterNetworkEntry) DeepCopy() *ClusterNetworkEntry { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudControllerManagerStatus. +func (in *CloudControllerManagerStatus) DeepCopy() *CloudControllerManagerStatus { if in == nil { return nil } - out := new(ClusterNetworkEntry) + out := new(CloudControllerManagerStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperator) DeepCopyInto(out *ClusterOperator) { +func (in *CloudLoadBalancerConfig) DeepCopyInto(out *CloudLoadBalancerConfig) { + *out = *in + if in.ClusterHosted != nil { + in, out := &in.ClusterHosted, &out.ClusterHosted + *out = new(CloudLoadBalancerIPs) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudLoadBalancerConfig. +func (in *CloudLoadBalancerConfig) DeepCopy() *CloudLoadBalancerConfig { + if in == nil { + return nil + } + out := new(CloudLoadBalancerConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CloudLoadBalancerIPs) DeepCopyInto(out *CloudLoadBalancerIPs) { + *out = *in + if in.APIIntLoadBalancerIPs != nil { + in, out := &in.APIIntLoadBalancerIPs, &out.APIIntLoadBalancerIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.APILoadBalancerIPs != nil { + in, out := &in.APILoadBalancerIPs, &out.APILoadBalancerIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressLoadBalancerIPs != nil { + in, out := &in.IngressLoadBalancerIPs, &out.IngressLoadBalancerIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudLoadBalancerIPs. +func (in *CloudLoadBalancerIPs) DeepCopy() *CloudLoadBalancerIPs { + if in == nil { + return nil + } + out := new(CloudLoadBalancerIPs) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterCondition) DeepCopyInto(out *ClusterCondition) { + *out = *in + if in.PromQL != nil { + in, out := &in.PromQL, &out.PromQL + *out = new(PromQLClusterCondition) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterCondition. +func (in *ClusterCondition) DeepCopy() *ClusterCondition { + if in == nil { + return nil + } + out := new(ClusterCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterImagePolicy) DeepCopyInto(out *ClusterImagePolicy) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec + in.Spec.DeepCopyInto(&out.Spec) in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperator. -func (in *ClusterOperator) DeepCopy() *ClusterOperator { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicy. +func (in *ClusterImagePolicy) DeepCopy() *ClusterImagePolicy { if in == nil { return nil } - out := new(ClusterOperator) + out := new(ClusterImagePolicy) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterOperator) DeepCopyObject() runtime.Object { +func (in *ClusterImagePolicy) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -761,13 +1058,13 @@ func (in *ClusterOperator) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorList) DeepCopyInto(out *ClusterOperatorList) { +func (in *ClusterImagePolicyList) DeepCopyInto(out *ClusterImagePolicyList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]ClusterOperator, len(*in)) + *out = make([]ClusterImagePolicy, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -775,18 +1072,18 @@ func (in *ClusterOperatorList) DeepCopyInto(out *ClusterOperatorList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorList. -func (in *ClusterOperatorList) DeepCopy() *ClusterOperatorList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicyList. +func (in *ClusterImagePolicyList) DeepCopy() *ClusterImagePolicyList { if in == nil { return nil } - out := new(ClusterOperatorList) + out := new(ClusterImagePolicyList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterOperatorList) DeepCopyObject() runtime.Object { +func (in *ClusterImagePolicyList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -794,100 +1091,269 @@ func (in *ClusterOperatorList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorSpec) DeepCopyInto(out *ClusterOperatorSpec) { +func (in *ClusterImagePolicySpec) DeepCopyInto(out *ClusterImagePolicySpec) { *out = *in + if in.Scopes != nil { + in, out := &in.Scopes, &out.Scopes + *out = make([]ImageScope, len(*in)) + copy(*out, *in) + } + in.Policy.DeepCopyInto(&out.Policy) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorSpec. -func (in *ClusterOperatorSpec) DeepCopy() *ClusterOperatorSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicySpec. +func (in *ClusterImagePolicySpec) DeepCopy() *ClusterImagePolicySpec { if in == nil { return nil } - out := new(ClusterOperatorSpec) + out := new(ClusterImagePolicySpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorStatus) DeepCopyInto(out *ClusterOperatorStatus) { +func (in *ClusterImagePolicyStatus) DeepCopyInto(out *ClusterImagePolicyStatus) { *out = *in if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make([]ClusterOperatorStatusCondition, len(*in)) + *out = make([]metav1.Condition, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } } - if in.Versions != nil { - in, out := &in.Versions, &out.Versions - *out = make([]OperandVersion, len(*in)) - copy(*out, *in) - } - if in.RelatedObjects != nil { - in, out := &in.RelatedObjects, &out.RelatedObjects - *out = make([]ObjectReference, len(*in)) - copy(*out, *in) - } - in.Extension.DeepCopyInto(&out.Extension) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatus. -func (in *ClusterOperatorStatus) DeepCopy() *ClusterOperatorStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicyStatus. +func (in *ClusterImagePolicyStatus) DeepCopy() *ClusterImagePolicyStatus { if in == nil { return nil } - out := new(ClusterOperatorStatus) + out := new(ClusterImagePolicyStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorStatusCondition) DeepCopyInto(out *ClusterOperatorStatusCondition) { +func (in *ClusterNetworkEntry) DeepCopyInto(out *ClusterNetworkEntry) { *out = *in - in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatusCondition. -func (in *ClusterOperatorStatusCondition) DeepCopy() *ClusterOperatorStatusCondition { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterNetworkEntry. +func (in *ClusterNetworkEntry) DeepCopy() *ClusterNetworkEntry { if in == nil { return nil } - out := new(ClusterOperatorStatusCondition) + out := new(ClusterNetworkEntry) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterVersion) DeepCopyInto(out *ClusterVersion) { +func (in *ClusterOperator) DeepCopyInto(out *ClusterOperator) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) + out.Spec = in.Spec in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersion. -func (in *ClusterVersion) DeepCopy() *ClusterVersion { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperator. +func (in *ClusterOperator) DeepCopy() *ClusterOperator { if in == nil { return nil } - out := new(ClusterVersion) + out := new(ClusterOperator) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterVersion) DeepCopyObject() runtime.Object { +func (in *ClusterOperator) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorList) DeepCopyInto(out *ClusterOperatorList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterOperator, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorList. +func (in *ClusterOperatorList) DeepCopy() *ClusterOperatorList { + if in == nil { + return nil + } + out := new(ClusterOperatorList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterOperatorList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorSpec) DeepCopyInto(out *ClusterOperatorSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorSpec. +func (in *ClusterOperatorSpec) DeepCopy() *ClusterOperatorSpec { + if in == nil { + return nil + } + out := new(ClusterOperatorSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorStatus) DeepCopyInto(out *ClusterOperatorStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]ClusterOperatorStatusCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Versions != nil { + in, out := &in.Versions, &out.Versions + *out = make([]OperandVersion, len(*in)) + copy(*out, *in) + } + if in.RelatedObjects != nil { + in, out := &in.RelatedObjects, &out.RelatedObjects + *out = make([]ObjectReference, len(*in)) + copy(*out, *in) + } + in.Extension.DeepCopyInto(&out.Extension) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatus. +func (in *ClusterOperatorStatus) DeepCopy() *ClusterOperatorStatus { + if in == nil { + return nil + } + out := new(ClusterOperatorStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorStatusCondition) DeepCopyInto(out *ClusterOperatorStatusCondition) { + *out = *in + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatusCondition. +func (in *ClusterOperatorStatusCondition) DeepCopy() *ClusterOperatorStatusCondition { + if in == nil { + return nil + } + out := new(ClusterOperatorStatusCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersion) DeepCopyInto(out *ClusterVersion) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersion. +func (in *ClusterVersion) DeepCopy() *ClusterVersion { + if in == nil { + return nil + } + out := new(ClusterVersion) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterVersion) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionCapabilitiesSpec) DeepCopyInto(out *ClusterVersionCapabilitiesSpec) { + *out = *in + if in.AdditionalEnabledCapabilities != nil { + in, out := &in.AdditionalEnabledCapabilities, &out.AdditionalEnabledCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionCapabilitiesSpec. +func (in *ClusterVersionCapabilitiesSpec) DeepCopy() *ClusterVersionCapabilitiesSpec { + if in == nil { + return nil + } + out := new(ClusterVersionCapabilitiesSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionCapabilitiesStatus) DeepCopyInto(out *ClusterVersionCapabilitiesStatus) { + *out = *in + if in.EnabledCapabilities != nil { + in, out := &in.EnabledCapabilities, &out.EnabledCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + if in.KnownCapabilities != nil { + in, out := &in.KnownCapabilities, &out.KnownCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionCapabilitiesStatus. +func (in *ClusterVersionCapabilitiesStatus) DeepCopy() *ClusterVersionCapabilitiesStatus { + if in == nil { + return nil + } + out := new(ClusterVersionCapabilitiesStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ClusterVersionList) DeepCopyInto(out *ClusterVersionList) { *out = *in @@ -929,6 +1395,16 @@ func (in *ClusterVersionSpec) DeepCopyInto(out *ClusterVersionSpec) { *out = new(Update) **out = **in } + if in.Capabilities != nil { + in, out := &in.Capabilities, &out.Capabilities + *out = new(ClusterVersionCapabilitiesSpec) + (*in).DeepCopyInto(*out) + } + if in.SignatureStores != nil { + in, out := &in.SignatureStores, &out.SignatureStores + *out = make([]SignatureStore, len(*in)) + copy(*out, *in) + } if in.Overrides != nil { in, out := &in.Overrides, &out.Overrides *out = make([]ComponentOverride, len(*in)) @@ -958,6 +1434,7 @@ func (in *ClusterVersionStatus) DeepCopyInto(out *ClusterVersionStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + in.Capabilities.DeepCopyInto(&out.Capabilities) if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]ClusterOperatorStatusCondition, len(*in)) @@ -972,6 +1449,13 @@ func (in *ClusterVersionStatus) DeepCopyInto(out *ClusterVersionStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.ConditionalUpdates != nil { + in, out := &in.ConditionalUpdates, &out.ConditionalUpdates + *out = make([]ConditionalUpdate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -1056,6 +1540,60 @@ func (in *ComponentRouteStatus) DeepCopy() *ComponentRouteStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConditionalUpdate) DeepCopyInto(out *ConditionalUpdate) { + *out = *in + in.Release.DeepCopyInto(&out.Release) + if in.Risks != nil { + in, out := &in.Risks, &out.Risks + *out = make([]ConditionalUpdateRisk, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConditionalUpdate. +func (in *ConditionalUpdate) DeepCopy() *ConditionalUpdate { + if in == nil { + return nil + } + out := new(ConditionalUpdate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConditionalUpdateRisk) DeepCopyInto(out *ConditionalUpdateRisk) { + *out = *in + if in.MatchingRules != nil { + in, out := &in.MatchingRules, &out.MatchingRules + *out = make([]ClusterCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConditionalUpdateRisk. +func (in *ConditionalUpdateRisk) DeepCopy() *ConditionalUpdateRisk { + if in == nil { + return nil + } + out := new(ConditionalUpdateRisk) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ConfigMapFileReference) DeepCopyInto(out *ConfigMapFileReference) { *out = *in @@ -1198,17 +1736,38 @@ func (in *ConsoleStatus) DeepCopy() *ConsoleStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Custom) DeepCopyInto(out *Custom) { + *out = *in + if in.Configs != nil { + in, out := &in.Configs, &out.Configs + *out = make([]GathererConfig, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Custom. +func (in *Custom) DeepCopy() *Custom { + if in == nil { + return nil + } + out := new(Custom) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomFeatureGates) DeepCopyInto(out *CustomFeatureGates) { *out = *in if in.Enabled != nil { in, out := &in.Enabled, &out.Enabled - *out = make([]string, len(*in)) + *out = make([]FeatureGateName, len(*in)) copy(*out, *in) } if in.Disabled != nil { in, out := &in.Disabled, &out.Disabled - *out = make([]string, len(*in)) + *out = make([]FeatureGateName, len(*in)) copy(*out, *in) } return @@ -1302,6 +1861,27 @@ func (in *DNSList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNSPlatformSpec) DeepCopyInto(out *DNSPlatformSpec) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSDNSSpec) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSPlatformSpec. +func (in *DNSPlatformSpec) DeepCopy() *DNSPlatformSpec { + if in == nil { + return nil + } + out := new(DNSPlatformSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DNSSpec) DeepCopyInto(out *DNSSpec) { *out = *in @@ -1315,6 +1895,7 @@ func (in *DNSSpec) DeepCopyInto(out *DNSSpec) { *out = new(DNSZone) (*in).DeepCopyInto(*out) } + in.Platform.DeepCopyInto(&out.Platform) return } @@ -1540,55 +2121,120 @@ func (in *ExternalIPPolicy) DeepCopy() *ExternalIPPolicy { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FeatureGate) DeepCopyInto(out *FeatureGate) { +func (in *ExternalPlatformSpec) DeepCopyInto(out *ExternalPlatformSpec) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGate. -func (in *FeatureGate) DeepCopy() *FeatureGate { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalPlatformSpec. +func (in *ExternalPlatformSpec) DeepCopy() *ExternalPlatformSpec { if in == nil { return nil } - out := new(FeatureGate) + out := new(ExternalPlatformSpec) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *FeatureGate) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FeatureGateEnabledDisabled) DeepCopyInto(out *FeatureGateEnabledDisabled) { +func (in *ExternalPlatformStatus) DeepCopyInto(out *ExternalPlatformStatus) { *out = *in - if in.Enabled != nil { - in, out := &in.Enabled, &out.Enabled - *out = make([]string, len(*in)) + out.CloudControllerManager = in.CloudControllerManager + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalPlatformStatus. +func (in *ExternalPlatformStatus) DeepCopy() *ExternalPlatformStatus { + if in == nil { + return nil + } + out := new(ExternalPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExtraMapping) DeepCopyInto(out *ExtraMapping) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtraMapping. +func (in *ExtraMapping) DeepCopy() *ExtraMapping { + if in == nil { + return nil + } + out := new(ExtraMapping) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGate) DeepCopyInto(out *FeatureGate) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGate. +func (in *FeatureGate) DeepCopy() *FeatureGate { + if in == nil { + return nil + } + out := new(FeatureGate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *FeatureGate) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateAttributes) DeepCopyInto(out *FeatureGateAttributes) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateAttributes. +func (in *FeatureGateAttributes) DeepCopy() *FeatureGateAttributes { + if in == nil { + return nil + } + out := new(FeatureGateAttributes) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateDetails) DeepCopyInto(out *FeatureGateDetails) { + *out = *in + if in.Enabled != nil { + in, out := &in.Enabled, &out.Enabled + *out = make([]FeatureGateAttributes, len(*in)) copy(*out, *in) } if in.Disabled != nil { in, out := &in.Disabled, &out.Disabled - *out = make([]string, len(*in)) + *out = make([]FeatureGateAttributes, len(*in)) copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateEnabledDisabled. -func (in *FeatureGateEnabledDisabled) DeepCopy() *FeatureGateEnabledDisabled { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateDetails. +func (in *FeatureGateDetails) DeepCopy() *FeatureGateDetails { if in == nil { return nil } - out := new(FeatureGateEnabledDisabled) + out := new(FeatureGateDetails) in.DeepCopyInto(out) return out } @@ -1667,6 +2313,20 @@ func (in *FeatureGateSpec) DeepCopy() *FeatureGateSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FeatureGateStatus) DeepCopyInto(out *FeatureGateStatus) { *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FeatureGates != nil { + in, out := &in.FeatureGates, &out.FeatureGates + *out = make([]FeatureGateDetails, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -1680,6 +2340,54 @@ func (in *FeatureGateStatus) DeepCopy() *FeatureGateStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateTests) DeepCopyInto(out *FeatureGateTests) { + *out = *in + if in.Tests != nil { + in, out := &in.Tests, &out.Tests + *out = make([]TestDetails, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateTests. +func (in *FeatureGateTests) DeepCopy() *FeatureGateTests { + if in == nil { + return nil + } + out := new(FeatureGateTests) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FulcioCAWithRekor) DeepCopyInto(out *FulcioCAWithRekor) { + *out = *in + if in.FulcioCAData != nil { + in, out := &in.FulcioCAData, &out.FulcioCAData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.RekorKeyData != nil { + in, out := &in.RekorKeyData, &out.RekorKeyData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + out.FulcioSubject = in.FulcioSubject + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FulcioCAWithRekor. +func (in *FulcioCAWithRekor) DeepCopy() *FulcioCAWithRekor { + if in == nil { + return nil + } + out := new(FulcioCAWithRekor) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GCPPlatformSpec) DeepCopyInto(out *GCPPlatformSpec) { *out = *in @@ -1699,6 +2407,26 @@ func (in *GCPPlatformSpec) DeepCopy() *GCPPlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GCPPlatformStatus) DeepCopyInto(out *GCPPlatformStatus) { *out = *in + if in.ResourceLabels != nil { + in, out := &in.ResourceLabels, &out.ResourceLabels + *out = make([]GCPResourceLabel, len(*in)) + copy(*out, *in) + } + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]GCPResourceTag, len(*in)) + copy(*out, *in) + } + if in.CloudLoadBalancerConfig != nil { + in, out := &in.CloudLoadBalancerConfig, &out.CloudLoadBalancerConfig + *out = new(CloudLoadBalancerConfig) + (*in).DeepCopyInto(*out) + } + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]GCPServiceEndpoint, len(*in)) + copy(*out, *in) + } return } @@ -1712,6 +2440,110 @@ func (in *GCPPlatformStatus) DeepCopy() *GCPPlatformStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPResourceLabel) DeepCopyInto(out *GCPResourceLabel) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPResourceLabel. +func (in *GCPResourceLabel) DeepCopy() *GCPResourceLabel { + if in == nil { + return nil + } + out := new(GCPResourceLabel) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPResourceTag) DeepCopyInto(out *GCPResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPResourceTag. +func (in *GCPResourceTag) DeepCopy() *GCPResourceTag { + if in == nil { + return nil + } + out := new(GCPResourceTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPServiceEndpoint) DeepCopyInto(out *GCPServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPServiceEndpoint. +func (in *GCPServiceEndpoint) DeepCopy() *GCPServiceEndpoint { + if in == nil { + return nil + } + out := new(GCPServiceEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GatherConfig) DeepCopyInto(out *GatherConfig) { + *out = *in + if in.DataPolicy != nil { + in, out := &in.DataPolicy, &out.DataPolicy + *out = make([]DataPolicyOption, len(*in)) + copy(*out, *in) + } + in.Gatherers.DeepCopyInto(&out.Gatherers) + out.Storage = in.Storage + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GatherConfig. +func (in *GatherConfig) DeepCopy() *GatherConfig { + if in == nil { + return nil + } + out := new(GatherConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GathererConfig) DeepCopyInto(out *GathererConfig) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GathererConfig. +func (in *GathererConfig) DeepCopy() *GathererConfig { + if in == nil { + return nil + } + out := new(GathererConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Gatherers) DeepCopyInto(out *Gatherers) { + *out = *in + in.Custom.DeepCopyInto(&out.Custom) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Gatherers. +func (in *Gatherers) DeepCopy() *Gatherers { + if in == nil { + return nil + } + out := new(Gatherers) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GenericAPIServerConfig) DeepCopyInto(out *GenericAPIServerConfig) { *out = *in @@ -1891,6 +2723,11 @@ func (in *HubSourceStatus) DeepCopy() *HubSourceStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IBMCloudPlatformSpec) DeepCopyInto(out *IBMCloudPlatformSpec) { *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]IBMCloudServiceEndpoint, len(*in)) + copy(*out, *in) + } return } @@ -1907,6 +2744,11 @@ func (in *IBMCloudPlatformSpec) DeepCopy() *IBMCloudPlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IBMCloudPlatformStatus) DeepCopyInto(out *IBMCloudPlatformStatus) { *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]IBMCloudServiceEndpoint, len(*in)) + copy(*out, *in) + } return } @@ -1920,6 +2762,22 @@ func (in *IBMCloudPlatformStatus) DeepCopy() *IBMCloudPlatformStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IBMCloudServiceEndpoint) DeepCopyInto(out *IBMCloudServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IBMCloudServiceEndpoint. +func (in *IBMCloudServiceEndpoint) DeepCopy() *IBMCloudServiceEndpoint { + if in == nil { + return nil + } + out := new(IBMCloudServiceEndpoint) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IdentityProvider) DeepCopyInto(out *IdentityProvider) { *out = *in @@ -2027,29 +2885,40 @@ func (in *Image) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageLabel) DeepCopyInto(out *ImageLabel) { +func (in *ImageContentPolicy) DeepCopyInto(out *ImageContentPolicy) { *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageLabel. -func (in *ImageLabel) DeepCopy() *ImageLabel { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicy. +func (in *ImageContentPolicy) DeepCopy() *ImageContentPolicy { if in == nil { return nil } - out := new(ImageLabel) + out := new(ImageContentPolicy) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageContentPolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageList) DeepCopyInto(out *ImageList) { +func (in *ImageContentPolicyList) DeepCopyInto(out *ImageContentPolicyList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Image, len(*in)) + *out = make([]ImageContentPolicy, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2057,18 +2926,18 @@ func (in *ImageList) DeepCopyInto(out *ImageList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageList. -func (in *ImageList) DeepCopy() *ImageList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicyList. +func (in *ImageContentPolicyList) DeepCopy() *ImageContentPolicyList { if in == nil { return nil } - out := new(ImageList) + out := new(ImageContentPolicyList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ImageList) DeepCopyObject() runtime.Object { +func (in *ImageContentPolicyList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2076,76 +2945,50 @@ func (in *ImageList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageSpec) DeepCopyInto(out *ImageSpec) { +func (in *ImageContentPolicySpec) DeepCopyInto(out *ImageContentPolicySpec) { *out = *in - if in.AllowedRegistriesForImport != nil { - in, out := &in.AllowedRegistriesForImport, &out.AllowedRegistriesForImport - *out = make([]RegistryLocation, len(*in)) - copy(*out, *in) - } - if in.ExternalRegistryHostnames != nil { - in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames - *out = make([]string, len(*in)) - copy(*out, *in) + if in.RepositoryDigestMirrors != nil { + in, out := &in.RepositoryDigestMirrors, &out.RepositoryDigestMirrors + *out = make([]RepositoryDigestMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - out.AdditionalTrustedCA = in.AdditionalTrustedCA - in.RegistrySources.DeepCopyInto(&out.RegistrySources) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageSpec. -func (in *ImageSpec) DeepCopy() *ImageSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicySpec. +func (in *ImageContentPolicySpec) DeepCopy() *ImageContentPolicySpec { if in == nil { return nil } - out := new(ImageSpec) + out := new(ImageContentPolicySpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageStatus) DeepCopyInto(out *ImageStatus) { - *out = *in - if in.ExternalRegistryHostnames != nil { - in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageStatus. -func (in *ImageStatus) DeepCopy() *ImageStatus { - if in == nil { - return nil - } - out := new(ImageStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Infrastructure) DeepCopyInto(out *Infrastructure) { +func (in *ImageDigestMirrorSet) DeepCopyInto(out *ImageDigestMirrorSet) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Infrastructure. -func (in *Infrastructure) DeepCopy() *Infrastructure { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSet. +func (in *ImageDigestMirrorSet) DeepCopy() *ImageDigestMirrorSet { if in == nil { return nil } - out := new(Infrastructure) + out := new(ImageDigestMirrorSet) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Infrastructure) DeepCopyObject() runtime.Object { +func (in *ImageDigestMirrorSet) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2153,13 +2996,13 @@ func (in *Infrastructure) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InfrastructureList) DeepCopyInto(out *InfrastructureList) { +func (in *ImageDigestMirrorSetList) DeepCopyInto(out *ImageDigestMirrorSetList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Infrastructure, len(*in)) + *out = make([]ImageDigestMirrorSet, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2167,18 +3010,18 @@ func (in *InfrastructureList) DeepCopyInto(out *InfrastructureList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureList. -func (in *InfrastructureList) DeepCopy() *InfrastructureList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetList. +func (in *ImageDigestMirrorSetList) DeepCopy() *ImageDigestMirrorSetList { if in == nil { return nil } - out := new(InfrastructureList) + out := new(ImageDigestMirrorSetList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *InfrastructureList) DeepCopyObject() runtime.Object { +func (in *ImageDigestMirrorSetList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2186,80 +3029,89 @@ func (in *InfrastructureList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InfrastructureSpec) DeepCopyInto(out *InfrastructureSpec) { +func (in *ImageDigestMirrorSetSpec) DeepCopyInto(out *ImageDigestMirrorSetSpec) { *out = *in - out.CloudConfig = in.CloudConfig - in.PlatformSpec.DeepCopyInto(&out.PlatformSpec) + if in.ImageDigestMirrors != nil { + in, out := &in.ImageDigestMirrors, &out.ImageDigestMirrors + *out = make([]ImageDigestMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureSpec. -func (in *InfrastructureSpec) DeepCopy() *InfrastructureSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetSpec. +func (in *ImageDigestMirrorSetSpec) DeepCopy() *ImageDigestMirrorSetSpec { if in == nil { return nil } - out := new(InfrastructureSpec) + out := new(ImageDigestMirrorSetSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InfrastructureStatus) DeepCopyInto(out *InfrastructureStatus) { +func (in *ImageDigestMirrorSetStatus) DeepCopyInto(out *ImageDigestMirrorSetStatus) { *out = *in - if in.PlatformStatus != nil { - in, out := &in.PlatformStatus, &out.PlatformStatus - *out = new(PlatformStatus) - (*in).DeepCopyInto(*out) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureStatus. -func (in *InfrastructureStatus) DeepCopy() *InfrastructureStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetStatus. +func (in *ImageDigestMirrorSetStatus) DeepCopy() *ImageDigestMirrorSetStatus { if in == nil { return nil } - out := new(InfrastructureStatus) + out := new(ImageDigestMirrorSetStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Ingress) DeepCopyInto(out *Ingress) { +func (in *ImageDigestMirrors) DeepCopyInto(out *ImageDigestMirrors) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]ImageMirror, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ingress. -func (in *Ingress) DeepCopy() *Ingress { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrors. +func (in *ImageDigestMirrors) DeepCopy() *ImageDigestMirrors { if in == nil { return nil } - out := new(Ingress) + out := new(ImageDigestMirrors) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Ingress) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageLabel) DeepCopyInto(out *ImageLabel) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageLabel. +func (in *ImageLabel) DeepCopy() *ImageLabel { + if in == nil { + return nil } - return nil + out := new(ImageLabel) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IngressList) DeepCopyInto(out *IngressList) { +func (in *ImageList) DeepCopyInto(out *ImageList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Ingress, len(*in)) + *out = make([]Image, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2267,18 +3119,18 @@ func (in *IngressList) DeepCopyInto(out *IngressList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressList. -func (in *IngressList) DeepCopy() *IngressList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageList. +func (in *ImageList) DeepCopy() *ImageList { if in == nil { return nil } - out := new(IngressList) + out := new(ImageList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *IngressList) DeepCopyObject() runtime.Object { +func (in *ImageList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2286,32 +3138,41 @@ func (in *IngressList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IngressSpec) DeepCopyInto(out *IngressSpec) { +func (in *ImagePolicy) DeepCopyInto(out *ImagePolicy) { *out = *in - if in.ComponentRoutes != nil { - in, out := &in.ComponentRoutes, &out.ComponentRoutes - *out = make([]ComponentRouteSpec, len(*in)) - copy(*out, *in) - } + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressSpec. -func (in *IngressSpec) DeepCopy() *IngressSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicy. +func (in *ImagePolicy) DeepCopy() *ImagePolicy { if in == nil { return nil } - out := new(IngressSpec) + out := new(ImagePolicy) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImagePolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IngressStatus) DeepCopyInto(out *IngressStatus) { +func (in *ImagePolicyList) DeepCopyInto(out *ImagePolicyList) { *out = *in - if in.ComponentRoutes != nil { - in, out := &in.ComponentRoutes, &out.ComponentRoutes - *out = make([]ComponentRouteStatus, len(*in)) + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImagePolicy, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2319,212 +3180,341 @@ func (in *IngressStatus) DeepCopyInto(out *IngressStatus) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressStatus. -func (in *IngressStatus) DeepCopy() *IngressStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicyList. +func (in *ImagePolicyList) DeepCopy() *ImagePolicyList { if in == nil { return nil } - out := new(IngressStatus) + out := new(ImagePolicyList) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImagePolicyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IntermediateTLSProfile) DeepCopyInto(out *IntermediateTLSProfile) { +func (in *ImagePolicySpec) DeepCopyInto(out *ImagePolicySpec) { *out = *in + if in.Scopes != nil { + in, out := &in.Scopes, &out.Scopes + *out = make([]ImageScope, len(*in)) + copy(*out, *in) + } + in.Policy.DeepCopyInto(&out.Policy) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IntermediateTLSProfile. -func (in *IntermediateTLSProfile) DeepCopy() *IntermediateTLSProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicySpec. +func (in *ImagePolicySpec) DeepCopy() *ImagePolicySpec { if in == nil { return nil } - out := new(IntermediateTLSProfile) + out := new(ImagePolicySpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KeystoneIdentityProvider) DeepCopyInto(out *KeystoneIdentityProvider) { +func (in *ImagePolicyStatus) DeepCopyInto(out *ImagePolicyStatus) { *out = *in - out.OAuthRemoteConnectionInfo = in.OAuthRemoteConnectionInfo + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeystoneIdentityProvider. -func (in *KeystoneIdentityProvider) DeepCopy() *KeystoneIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicyStatus. +func (in *ImagePolicyStatus) DeepCopy() *ImagePolicyStatus { if in == nil { return nil } - out := new(KeystoneIdentityProvider) + out := new(ImagePolicyStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeClientConfig) DeepCopyInto(out *KubeClientConfig) { +func (in *ImageSpec) DeepCopyInto(out *ImageSpec) { *out = *in - out.ConnectionOverrides = in.ConnectionOverrides + if in.AllowedRegistriesForImport != nil { + in, out := &in.AllowedRegistriesForImport, &out.AllowedRegistriesForImport + *out = make([]RegistryLocation, len(*in)) + copy(*out, *in) + } + if in.ExternalRegistryHostnames != nil { + in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.AdditionalTrustedCA = in.AdditionalTrustedCA + in.RegistrySources.DeepCopyInto(&out.RegistrySources) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeClientConfig. -func (in *KubeClientConfig) DeepCopy() *KubeClientConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageSpec. +func (in *ImageSpec) DeepCopy() *ImageSpec { if in == nil { return nil } - out := new(KubeClientConfig) + out := new(ImageSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevirtPlatformSpec) DeepCopyInto(out *KubevirtPlatformSpec) { +func (in *ImageStatus) DeepCopyInto(out *ImageStatus) { *out = *in + if in.ExternalRegistryHostnames != nil { + in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames + *out = make([]string, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformSpec. -func (in *KubevirtPlatformSpec) DeepCopy() *KubevirtPlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageStatus. +func (in *ImageStatus) DeepCopy() *ImageStatus { if in == nil { return nil } - out := new(KubevirtPlatformSpec) + out := new(ImageStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevirtPlatformStatus) DeepCopyInto(out *KubevirtPlatformStatus) { +func (in *ImageTagMirrorSet) DeepCopyInto(out *ImageTagMirrorSet) { *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformStatus. -func (in *KubevirtPlatformStatus) DeepCopy() *KubevirtPlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSet. +func (in *ImageTagMirrorSet) DeepCopy() *ImageTagMirrorSet { if in == nil { return nil } - out := new(KubevirtPlatformStatus) + out := new(ImageTagMirrorSet) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTagMirrorSet) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LDAPAttributeMapping) DeepCopyInto(out *LDAPAttributeMapping) { +func (in *ImageTagMirrorSetList) DeepCopyInto(out *ImageTagMirrorSetList) { *out = *in - if in.ID != nil { - in, out := &in.ID, &out.ID - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.PreferredUsername != nil { - in, out := &in.PreferredUsername, &out.PreferredUsername - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Name != nil { - in, out := &in.Name, &out.Name - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Email != nil { - in, out := &in.Email, &out.Email - *out = make([]string, len(*in)) - copy(*out, *in) + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImageTagMirrorSet, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPAttributeMapping. -func (in *LDAPAttributeMapping) DeepCopy() *LDAPAttributeMapping { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetList. +func (in *ImageTagMirrorSetList) DeepCopy() *ImageTagMirrorSetList { if in == nil { return nil } - out := new(LDAPAttributeMapping) + out := new(ImageTagMirrorSetList) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTagMirrorSetList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LDAPIdentityProvider) DeepCopyInto(out *LDAPIdentityProvider) { +func (in *ImageTagMirrorSetSpec) DeepCopyInto(out *ImageTagMirrorSetSpec) { *out = *in - out.BindPassword = in.BindPassword - out.CA = in.CA - in.Attributes.DeepCopyInto(&out.Attributes) + if in.ImageTagMirrors != nil { + in, out := &in.ImageTagMirrors, &out.ImageTagMirrors + *out = make([]ImageTagMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPIdentityProvider. -func (in *LDAPIdentityProvider) DeepCopy() *LDAPIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetSpec. +func (in *ImageTagMirrorSetSpec) DeepCopy() *ImageTagMirrorSetSpec { if in == nil { return nil } - out := new(LDAPIdentityProvider) + out := new(ImageTagMirrorSetSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LeaderElection) DeepCopyInto(out *LeaderElection) { +func (in *ImageTagMirrorSetStatus) DeepCopyInto(out *ImageTagMirrorSetStatus) { *out = *in - out.LeaseDuration = in.LeaseDuration - out.RenewDeadline = in.RenewDeadline - out.RetryPeriod = in.RetryPeriod return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaderElection. -func (in *LeaderElection) DeepCopy() *LeaderElection { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetStatus. +func (in *ImageTagMirrorSetStatus) DeepCopy() *ImageTagMirrorSetStatus { if in == nil { return nil } - out := new(LeaderElection) + out := new(ImageTagMirrorSetStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ModernTLSProfile) DeepCopyInto(out *ModernTLSProfile) { +func (in *ImageTagMirrors) DeepCopyInto(out *ImageTagMirrors) { *out = *in + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]ImageMirror, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModernTLSProfile. -func (in *ModernTLSProfile) DeepCopy() *ModernTLSProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrors. +func (in *ImageTagMirrors) DeepCopy() *ImageTagMirrors { if in == nil { return nil } - out := new(ModernTLSProfile) + out := new(ImageTagMirrors) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedCertificate) DeepCopyInto(out *NamedCertificate) { +func (in *Infrastructure) DeepCopyInto(out *Infrastructure) { *out = *in - if in.Names != nil { - in, out := &in.Names, &out.Names - *out = make([]string, len(*in)) - copy(*out, *in) + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Infrastructure. +func (in *Infrastructure) DeepCopy() *Infrastructure { + if in == nil { + return nil + } + out := new(Infrastructure) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Infrastructure) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *InfrastructureList) DeepCopyInto(out *InfrastructureList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Infrastructure, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - out.CertInfo = in.CertInfo return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedCertificate. -func (in *NamedCertificate) DeepCopy() *NamedCertificate { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureList. +func (in *InfrastructureList) DeepCopy() *InfrastructureList { if in == nil { return nil } - out := new(NamedCertificate) + out := new(InfrastructureList) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *InfrastructureList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Network) DeepCopyInto(out *Network) { +func (in *InfrastructureSpec) DeepCopyInto(out *InfrastructureSpec) { + *out = *in + out.CloudConfig = in.CloudConfig + in.PlatformSpec.DeepCopyInto(&out.PlatformSpec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureSpec. +func (in *InfrastructureSpec) DeepCopy() *InfrastructureSpec { + if in == nil { + return nil + } + out := new(InfrastructureSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *InfrastructureStatus) DeepCopyInto(out *InfrastructureStatus) { + *out = *in + if in.PlatformStatus != nil { + in, out := &in.PlatformStatus, &out.PlatformStatus + *out = new(PlatformStatus) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureStatus. +func (in *InfrastructureStatus) DeepCopy() *InfrastructureStatus { + if in == nil { + return nil + } + out := new(InfrastructureStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Ingress) DeepCopyInto(out *Ingress) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) @@ -2533,18 +3523,18 @@ func (in *Network) DeepCopyInto(out *Network) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Network. -func (in *Network) DeepCopy() *Network { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ingress. +func (in *Ingress) DeepCopy() *Ingress { if in == nil { return nil } - out := new(Network) + out := new(Ingress) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Network) DeepCopyObject() runtime.Object { +func (in *Ingress) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2552,13 +3542,13 @@ func (in *Network) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkList) DeepCopyInto(out *NetworkList) { +func (in *IngressList) DeepCopyInto(out *IngressList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Network, len(*in)) + *out = make([]Ingress, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2566,18 +3556,18 @@ func (in *NetworkList) DeepCopyInto(out *NetworkList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkList. -func (in *NetworkList) DeepCopy() *NetworkList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressList. +func (in *IngressList) DeepCopy() *IngressList { if in == nil { return nil } - out := new(NetworkList) + out := new(IngressList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NetworkList) DeepCopyObject() runtime.Object { +func (in *IngressList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2585,105 +3575,99 @@ func (in *NetworkList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkMigration) DeepCopyInto(out *NetworkMigration) { +func (in *IngressPlatformSpec) DeepCopyInto(out *IngressPlatformSpec) { *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSIngressSpec) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkMigration. -func (in *NetworkMigration) DeepCopy() *NetworkMigration { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressPlatformSpec. +func (in *IngressPlatformSpec) DeepCopy() *IngressPlatformSpec { if in == nil { return nil } - out := new(NetworkMigration) + out := new(IngressPlatformSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { +func (in *IngressSpec) DeepCopyInto(out *IngressSpec) { *out = *in - if in.ClusterNetwork != nil { - in, out := &in.ClusterNetwork, &out.ClusterNetwork - *out = make([]ClusterNetworkEntry, len(*in)) - copy(*out, *in) - } - if in.ServiceNetwork != nil { - in, out := &in.ServiceNetwork, &out.ServiceNetwork - *out = make([]string, len(*in)) + if in.ComponentRoutes != nil { + in, out := &in.ComponentRoutes, &out.ComponentRoutes + *out = make([]ComponentRouteSpec, len(*in)) copy(*out, *in) } - if in.ExternalIP != nil { - in, out := &in.ExternalIP, &out.ExternalIP - *out = new(ExternalIPConfig) - (*in).DeepCopyInto(*out) + if in.RequiredHSTSPolicies != nil { + in, out := &in.RequiredHSTSPolicies, &out.RequiredHSTSPolicies + *out = make([]RequiredHSTSPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } + in.LoadBalancer.DeepCopyInto(&out.LoadBalancer) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkSpec. -func (in *NetworkSpec) DeepCopy() *NetworkSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressSpec. +func (in *IngressSpec) DeepCopy() *IngressSpec { if in == nil { return nil } - out := new(NetworkSpec) + out := new(IngressSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { +func (in *IngressStatus) DeepCopyInto(out *IngressStatus) { *out = *in - if in.ClusterNetwork != nil { - in, out := &in.ClusterNetwork, &out.ClusterNetwork - *out = make([]ClusterNetworkEntry, len(*in)) - copy(*out, *in) - } - if in.ServiceNetwork != nil { - in, out := &in.ServiceNetwork, &out.ServiceNetwork - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Migration != nil { - in, out := &in.Migration, &out.Migration - *out = new(NetworkMigration) - **out = **in + if in.ComponentRoutes != nil { + in, out := &in.ComponentRoutes, &out.ComponentRoutes + *out = make([]ComponentRouteStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkStatus. -func (in *NetworkStatus) DeepCopy() *NetworkStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressStatus. +func (in *IngressStatus) DeepCopy() *IngressStatus { if in == nil { return nil } - out := new(NetworkStatus) + out := new(IngressStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuth) DeepCopyInto(out *OAuth) { +func (in *InsightsDataGather) DeepCopyInto(out *InsightsDataGather) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuth. -func (in *OAuth) DeepCopy() *OAuth { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InsightsDataGather. +func (in *InsightsDataGather) DeepCopy() *InsightsDataGather { if in == nil { return nil } - out := new(OAuth) + out := new(InsightsDataGather) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OAuth) DeepCopyObject() runtime.Object { +func (in *InsightsDataGather) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2691,13 +3675,13 @@ func (in *OAuth) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthList) DeepCopyInto(out *OAuthList) { +func (in *InsightsDataGatherList) DeepCopyInto(out *InsightsDataGatherList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]OAuth, len(*in)) + *out = make([]InsightsDataGather, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2705,18 +3689,18 @@ func (in *OAuthList) DeepCopyInto(out *OAuthList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthList. -func (in *OAuthList) DeepCopy() *OAuthList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InsightsDataGatherList. +func (in *InsightsDataGatherList) DeepCopy() *InsightsDataGatherList { if in == nil { return nil } - out := new(OAuthList) + out := new(InsightsDataGatherList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OAuthList) DeepCopyObject() runtime.Object { +func (in *InsightsDataGatherList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2724,120 +3708,134 @@ func (in *OAuthList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthRemoteConnectionInfo) DeepCopyInto(out *OAuthRemoteConnectionInfo) { +func (in *InsightsDataGatherSpec) DeepCopyInto(out *InsightsDataGatherSpec) { *out = *in - out.CA = in.CA - out.TLSClientCert = in.TLSClientCert - out.TLSClientKey = in.TLSClientKey + in.GatherConfig.DeepCopyInto(&out.GatherConfig) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthRemoteConnectionInfo. -func (in *OAuthRemoteConnectionInfo) DeepCopy() *OAuthRemoteConnectionInfo { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InsightsDataGatherSpec. +func (in *InsightsDataGatherSpec) DeepCopy() *InsightsDataGatherSpec { if in == nil { return nil } - out := new(OAuthRemoteConnectionInfo) + out := new(InsightsDataGatherSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthSpec) DeepCopyInto(out *OAuthSpec) { +func (in *IntermediateTLSProfile) DeepCopyInto(out *IntermediateTLSProfile) { *out = *in - if in.IdentityProviders != nil { - in, out := &in.IdentityProviders, &out.IdentityProviders - *out = make([]IdentityProvider, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.TokenConfig.DeepCopyInto(&out.TokenConfig) - out.Templates = in.Templates return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthSpec. -func (in *OAuthSpec) DeepCopy() *OAuthSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IntermediateTLSProfile. +func (in *IntermediateTLSProfile) DeepCopy() *IntermediateTLSProfile { if in == nil { return nil } - out := new(OAuthSpec) + out := new(IntermediateTLSProfile) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthStatus) DeepCopyInto(out *OAuthStatus) { +func (in *KMSConfig) DeepCopyInto(out *KMSConfig) { *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSKMSConfig) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthStatus. -func (in *OAuthStatus) DeepCopy() *OAuthStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KMSConfig. +func (in *KMSConfig) DeepCopy() *KMSConfig { if in == nil { return nil } - out := new(OAuthStatus) + out := new(KMSConfig) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthTemplates) DeepCopyInto(out *OAuthTemplates) { +func (in *KeystoneIdentityProvider) DeepCopyInto(out *KeystoneIdentityProvider) { *out = *in - out.Login = in.Login - out.ProviderSelection = in.ProviderSelection - out.Error = in.Error + out.OAuthRemoteConnectionInfo = in.OAuthRemoteConnectionInfo return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthTemplates. -func (in *OAuthTemplates) DeepCopy() *OAuthTemplates { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeystoneIdentityProvider. +func (in *KeystoneIdentityProvider) DeepCopy() *KeystoneIdentityProvider { if in == nil { return nil } - out := new(OAuthTemplates) + out := new(KeystoneIdentityProvider) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ObjectReference) DeepCopyInto(out *ObjectReference) { +func (in *KubeClientConfig) DeepCopyInto(out *KubeClientConfig) { *out = *in + out.ConnectionOverrides = in.ConnectionOverrides return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference. -func (in *ObjectReference) DeepCopy() *ObjectReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeClientConfig. +func (in *KubeClientConfig) DeepCopy() *KubeClientConfig { if in == nil { return nil } - out := new(ObjectReference) + out := new(KubeClientConfig) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OldTLSProfile) DeepCopyInto(out *OldTLSProfile) { +func (in *KubevirtPlatformSpec) DeepCopyInto(out *KubevirtPlatformSpec) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OldTLSProfile. -func (in *OldTLSProfile) DeepCopy() *OldTLSProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformSpec. +func (in *KubevirtPlatformSpec) DeepCopy() *KubevirtPlatformSpec { if in == nil { return nil } - out := new(OldTLSProfile) + out := new(KubevirtPlatformSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenIDClaims) DeepCopyInto(out *OpenIDClaims) { +func (in *KubevirtPlatformStatus) DeepCopyInto(out *KubevirtPlatformStatus) { *out = *in - if in.PreferredUsername != nil { + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformStatus. +func (in *KubevirtPlatformStatus) DeepCopy() *KubevirtPlatformStatus { + if in == nil { + return nil + } + out := new(KubevirtPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LDAPAttributeMapping) DeepCopyInto(out *LDAPAttributeMapping) { + *out = *in + if in.ID != nil { + in, out := &in.ID, &out.ID + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PreferredUsername != nil { in, out := &in.PreferredUsername, &out.PreferredUsername *out = make([]string, len(*in)) copy(*out, *in) @@ -2855,384 +3853,439 @@ func (in *OpenIDClaims) DeepCopyInto(out *OpenIDClaims) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDClaims. -func (in *OpenIDClaims) DeepCopy() *OpenIDClaims { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPAttributeMapping. +func (in *LDAPAttributeMapping) DeepCopy() *LDAPAttributeMapping { if in == nil { return nil } - out := new(OpenIDClaims) + out := new(LDAPAttributeMapping) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenIDIdentityProvider) DeepCopyInto(out *OpenIDIdentityProvider) { +func (in *LDAPIdentityProvider) DeepCopyInto(out *LDAPIdentityProvider) { *out = *in - out.ClientSecret = in.ClientSecret + out.BindPassword = in.BindPassword out.CA = in.CA - if in.ExtraScopes != nil { - in, out := &in.ExtraScopes, &out.ExtraScopes - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.ExtraAuthorizeParameters != nil { - in, out := &in.ExtraAuthorizeParameters, &out.ExtraAuthorizeParameters - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - in.Claims.DeepCopyInto(&out.Claims) + in.Attributes.DeepCopyInto(&out.Attributes) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDIdentityProvider. -func (in *OpenIDIdentityProvider) DeepCopy() *OpenIDIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPIdentityProvider. +func (in *LDAPIdentityProvider) DeepCopy() *LDAPIdentityProvider { if in == nil { return nil } - out := new(OpenIDIdentityProvider) + out := new(LDAPIdentityProvider) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenStackPlatformSpec) DeepCopyInto(out *OpenStackPlatformSpec) { +func (in *LeaderElection) DeepCopyInto(out *LeaderElection) { *out = *in + out.LeaseDuration = in.LeaseDuration + out.RenewDeadline = in.RenewDeadline + out.RetryPeriod = in.RetryPeriod return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformSpec. -func (in *OpenStackPlatformSpec) DeepCopy() *OpenStackPlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaderElection. +func (in *LeaderElection) DeepCopy() *LeaderElection { if in == nil { return nil } - out := new(OpenStackPlatformSpec) + out := new(LeaderElection) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenStackPlatformStatus) DeepCopyInto(out *OpenStackPlatformStatus) { +func (in *LoadBalancer) DeepCopyInto(out *LoadBalancer) { *out = *in + in.Platform.DeepCopyInto(&out.Platform) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformStatus. -func (in *OpenStackPlatformStatus) DeepCopy() *OpenStackPlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancer. +func (in *LoadBalancer) DeepCopy() *LoadBalancer { if in == nil { return nil } - out := new(OpenStackPlatformStatus) + out := new(LoadBalancer) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperandVersion) DeepCopyInto(out *OperandVersion) { +func (in *MTUMigration) DeepCopyInto(out *MTUMigration) { *out = *in + if in.Network != nil { + in, out := &in.Network, &out.Network + *out = new(MTUMigrationValues) + (*in).DeepCopyInto(*out) + } + if in.Machine != nil { + in, out := &in.Machine, &out.Machine + *out = new(MTUMigrationValues) + (*in).DeepCopyInto(*out) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperandVersion. -func (in *OperandVersion) DeepCopy() *OperandVersion { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MTUMigration. +func (in *MTUMigration) DeepCopy() *MTUMigration { if in == nil { return nil } - out := new(OperandVersion) + out := new(MTUMigration) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHub) DeepCopyInto(out *OperatorHub) { +func (in *MTUMigrationValues) DeepCopyInto(out *MTUMigrationValues) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + if in.To != nil { + in, out := &in.To, &out.To + *out = new(uint32) + **out = **in + } + if in.From != nil { + in, out := &in.From, &out.From + *out = new(uint32) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHub. -func (in *OperatorHub) DeepCopy() *OperatorHub { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MTUMigrationValues. +func (in *MTUMigrationValues) DeepCopy() *MTUMigrationValues { if in == nil { return nil } - out := new(OperatorHub) + out := new(MTUMigrationValues) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OperatorHub) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHubList) DeepCopyInto(out *OperatorHubList) { +func (in *MaxAgePolicy) DeepCopyInto(out *MaxAgePolicy) { *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]OperatorHub, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } + if in.LargestMaxAge != nil { + in, out := &in.LargestMaxAge, &out.LargestMaxAge + *out = new(int32) + **out = **in + } + if in.SmallestMaxAge != nil { + in, out := &in.SmallestMaxAge, &out.SmallestMaxAge + *out = new(int32) + **out = **in } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubList. -func (in *OperatorHubList) DeepCopy() *OperatorHubList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MaxAgePolicy. +func (in *MaxAgePolicy) DeepCopy() *MaxAgePolicy { if in == nil { return nil } - out := new(OperatorHubList) + out := new(MaxAgePolicy) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OperatorHubList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHubSpec) DeepCopyInto(out *OperatorHubSpec) { +func (in *ModernTLSProfile) DeepCopyInto(out *ModernTLSProfile) { *out = *in - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make([]HubSource, len(*in)) - copy(*out, *in) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubSpec. -func (in *OperatorHubSpec) DeepCopy() *OperatorHubSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModernTLSProfile. +func (in *ModernTLSProfile) DeepCopy() *ModernTLSProfile { if in == nil { return nil } - out := new(OperatorHubSpec) + out := new(ModernTLSProfile) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHubStatus) DeepCopyInto(out *OperatorHubStatus) { +func (in *NamedCertificate) DeepCopyInto(out *NamedCertificate) { *out = *in - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make([]HubSourceStatus, len(*in)) + if in.Names != nil { + in, out := &in.Names, &out.Names + *out = make([]string, len(*in)) copy(*out, *in) } + out.CertInfo = in.CertInfo return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubStatus. -func (in *OperatorHubStatus) DeepCopy() *OperatorHubStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedCertificate. +func (in *NamedCertificate) DeepCopy() *NamedCertificate { if in == nil { return nil } - out := new(OperatorHubStatus) + out := new(NamedCertificate) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OvirtPlatformSpec) DeepCopyInto(out *OvirtPlatformSpec) { +func (in *Network) DeepCopyInto(out *Network) { *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformSpec. -func (in *OvirtPlatformSpec) DeepCopy() *OvirtPlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Network. +func (in *Network) DeepCopy() *Network { if in == nil { return nil } - out := new(OvirtPlatformSpec) + out := new(Network) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Network) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OvirtPlatformStatus) DeepCopyInto(out *OvirtPlatformStatus) { +func (in *NetworkDiagnostics) DeepCopyInto(out *NetworkDiagnostics) { *out = *in + in.SourcePlacement.DeepCopyInto(&out.SourcePlacement) + in.TargetPlacement.DeepCopyInto(&out.TargetPlacement) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformStatus. -func (in *OvirtPlatformStatus) DeepCopy() *OvirtPlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDiagnostics. +func (in *NetworkDiagnostics) DeepCopy() *NetworkDiagnostics { if in == nil { return nil } - out := new(OvirtPlatformStatus) + out := new(NetworkDiagnostics) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PlatformSpec) DeepCopyInto(out *PlatformSpec) { +func (in *NetworkDiagnosticsSourcePlacement) DeepCopyInto(out *NetworkDiagnosticsSourcePlacement) { *out = *in - if in.AWS != nil { - in, out := &in.AWS, &out.AWS - *out = new(AWSPlatformSpec) - (*in).DeepCopyInto(*out) - } - if in.Azure != nil { - in, out := &in.Azure, &out.Azure - *out = new(AzurePlatformSpec) - **out = **in - } - if in.GCP != nil { - in, out := &in.GCP, &out.GCP - *out = new(GCPPlatformSpec) - **out = **in - } - if in.BareMetal != nil { - in, out := &in.BareMetal, &out.BareMetal - *out = new(BareMetalPlatformSpec) - **out = **in - } - if in.OpenStack != nil { - in, out := &in.OpenStack, &out.OpenStack - *out = new(OpenStackPlatformSpec) - **out = **in - } - if in.Ovirt != nil { - in, out := &in.Ovirt, &out.Ovirt - *out = new(OvirtPlatformSpec) - **out = **in + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } } - if in.VSphere != nil { - in, out := &in.VSphere, &out.VSphere - *out = new(VSpherePlatformSpec) - **out = **in + if in.Tolerations != nil { + in, out := &in.Tolerations, &out.Tolerations + *out = make([]corev1.Toleration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - if in.IBMCloud != nil { - in, out := &in.IBMCloud, &out.IBMCloud - *out = new(IBMCloudPlatformSpec) - **out = **in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDiagnosticsSourcePlacement. +func (in *NetworkDiagnosticsSourcePlacement) DeepCopy() *NetworkDiagnosticsSourcePlacement { + if in == nil { + return nil } - if in.Kubevirt != nil { - in, out := &in.Kubevirt, &out.Kubevirt - *out = new(KubevirtPlatformSpec) - **out = **in + out := new(NetworkDiagnosticsSourcePlacement) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkDiagnosticsTargetPlacement) DeepCopyInto(out *NetworkDiagnosticsTargetPlacement) { + *out = *in + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } } - if in.EquinixMetal != nil { - in, out := &in.EquinixMetal, &out.EquinixMetal - *out = new(EquinixMetalPlatformSpec) - **out = **in + if in.Tolerations != nil { + in, out := &in.Tolerations, &out.Tolerations + *out = make([]corev1.Toleration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformSpec. -func (in *PlatformSpec) DeepCopy() *PlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDiagnosticsTargetPlacement. +func (in *NetworkDiagnosticsTargetPlacement) DeepCopy() *NetworkDiagnosticsTargetPlacement { if in == nil { return nil } - out := new(PlatformSpec) + out := new(NetworkDiagnosticsTargetPlacement) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PlatformStatus) DeepCopyInto(out *PlatformStatus) { +func (in *NetworkList) DeepCopyInto(out *NetworkList) { *out = *in - if in.AWS != nil { - in, out := &in.AWS, &out.AWS - *out = new(AWSPlatformStatus) + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Network, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkList. +func (in *NetworkList) DeepCopy() *NetworkList { + if in == nil { + return nil + } + out := new(NetworkList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NetworkList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkMigration) DeepCopyInto(out *NetworkMigration) { + *out = *in + if in.MTU != nil { + in, out := &in.MTU, &out.MTU + *out = new(MTUMigration) (*in).DeepCopyInto(*out) } - if in.Azure != nil { - in, out := &in.Azure, &out.Azure - *out = new(AzurePlatformStatus) - **out = **in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkMigration. +func (in *NetworkMigration) DeepCopy() *NetworkMigration { + if in == nil { + return nil } - if in.GCP != nil { - in, out := &in.GCP, &out.GCP - *out = new(GCPPlatformStatus) - **out = **in + out := new(NetworkMigration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { + *out = *in + if in.ClusterNetwork != nil { + in, out := &in.ClusterNetwork, &out.ClusterNetwork + *out = make([]ClusterNetworkEntry, len(*in)) + copy(*out, *in) } - if in.BareMetal != nil { - in, out := &in.BareMetal, &out.BareMetal - *out = new(BareMetalPlatformStatus) - **out = **in + if in.ServiceNetwork != nil { + in, out := &in.ServiceNetwork, &out.ServiceNetwork + *out = make([]string, len(*in)) + copy(*out, *in) } - if in.OpenStack != nil { - in, out := &in.OpenStack, &out.OpenStack - *out = new(OpenStackPlatformStatus) - **out = **in + if in.ExternalIP != nil { + in, out := &in.ExternalIP, &out.ExternalIP + *out = new(ExternalIPConfig) + (*in).DeepCopyInto(*out) } - if in.Ovirt != nil { - in, out := &in.Ovirt, &out.Ovirt - *out = new(OvirtPlatformStatus) - **out = **in + in.NetworkDiagnostics.DeepCopyInto(&out.NetworkDiagnostics) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkSpec. +func (in *NetworkSpec) DeepCopy() *NetworkSpec { + if in == nil { + return nil } - if in.VSphere != nil { - in, out := &in.VSphere, &out.VSphere - *out = new(VSpherePlatformStatus) - **out = **in + out := new(NetworkSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { + *out = *in + if in.ClusterNetwork != nil { + in, out := &in.ClusterNetwork, &out.ClusterNetwork + *out = make([]ClusterNetworkEntry, len(*in)) + copy(*out, *in) } - if in.IBMCloud != nil { - in, out := &in.IBMCloud, &out.IBMCloud - *out = new(IBMCloudPlatformStatus) - **out = **in + if in.ServiceNetwork != nil { + in, out := &in.ServiceNetwork, &out.ServiceNetwork + *out = make([]string, len(*in)) + copy(*out, *in) } - if in.Kubevirt != nil { - in, out := &in.Kubevirt, &out.Kubevirt - *out = new(KubevirtPlatformStatus) - **out = **in + if in.Migration != nil { + in, out := &in.Migration, &out.Migration + *out = new(NetworkMigration) + (*in).DeepCopyInto(*out) } - if in.EquinixMetal != nil { - in, out := &in.EquinixMetal, &out.EquinixMetal - *out = new(EquinixMetalPlatformStatus) - **out = **in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformStatus. -func (in *PlatformStatus) DeepCopy() *PlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkStatus. +func (in *NetworkStatus) DeepCopy() *NetworkStatus { if in == nil { return nil } - out := new(PlatformStatus) + out := new(NetworkStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Project) DeepCopyInto(out *Project) { +func (in *Node) DeepCopyInto(out *Node) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) out.Spec = in.Spec - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Project. -func (in *Project) DeepCopy() *Project { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Node. +func (in *Node) DeepCopy() *Node { if in == nil { return nil } - out := new(Project) + out := new(Node) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Project) DeepCopyObject() runtime.Object { +func (in *Node) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -3240,13 +4293,13 @@ func (in *Project) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProjectList) DeepCopyInto(out *ProjectList) { +func (in *NodeList) DeepCopyInto(out *NodeList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Project, len(*in)) + *out = make([]Node, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -3254,18 +4307,18 @@ func (in *ProjectList) DeepCopyInto(out *ProjectList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectList. -func (in *ProjectList) DeepCopy() *ProjectList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeList. +func (in *NodeList) DeepCopy() *NodeList { if in == nil { return nil } - out := new(ProjectList) + out := new(NodeList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ProjectList) DeepCopyObject() runtime.Object { +func (in *NodeList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -3273,74 +4326,96 @@ func (in *ProjectList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProjectSpec) DeepCopyInto(out *ProjectSpec) { +func (in *NodeSpec) DeepCopyInto(out *NodeSpec) { *out = *in - out.ProjectRequestTemplate = in.ProjectRequestTemplate return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectSpec. -func (in *ProjectSpec) DeepCopy() *ProjectSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSpec. +func (in *NodeSpec) DeepCopy() *NodeSpec { if in == nil { return nil } - out := new(ProjectSpec) + out := new(NodeSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProjectStatus) DeepCopyInto(out *ProjectStatus) { +func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectStatus. -func (in *ProjectStatus) DeepCopy() *ProjectStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeStatus. +func (in *NodeStatus) DeepCopy() *NodeStatus { if in == nil { return nil } - out := new(ProjectStatus) + out := new(NodeStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Proxy) DeepCopyInto(out *Proxy) { +func (in *NutanixFailureDomain) DeepCopyInto(out *NutanixFailureDomain) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Cluster.DeepCopyInto(&out.Cluster) + if in.Subnets != nil { + in, out := &in.Subnets, &out.Subnets + *out = make([]NutanixResourceIdentifier, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. -func (in *Proxy) DeepCopy() *Proxy { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixFailureDomain. +func (in *NutanixFailureDomain) DeepCopy() *NutanixFailureDomain { if in == nil { return nil } - out := new(Proxy) + out := new(NutanixFailureDomain) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Proxy) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NutanixPlatformLoadBalancer) DeepCopyInto(out *NutanixPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformLoadBalancer. +func (in *NutanixPlatformLoadBalancer) DeepCopy() *NutanixPlatformLoadBalancer { + if in == nil { + return nil } - return nil + out := new(NutanixPlatformLoadBalancer) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProxyList) DeepCopyInto(out *ProxyList) { +func (in *NutanixPlatformSpec) DeepCopyInto(out *NutanixPlatformSpec) { *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Proxy, len(*in)) + out.PrismCentral = in.PrismCentral + if in.PrismElements != nil { + in, out := &in.PrismElements, &out.PrismElements + *out = make([]NutanixPrismElementEndpoint, len(*in)) + copy(*out, *in) + } + if in.FailureDomains != nil { + in, out := &in.FailureDomains, &out.FailureDomains + *out = make([]NutanixFailureDomain, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -3348,525 +4423,2423 @@ func (in *ProxyList) DeepCopyInto(out *ProxyList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyList. -func (in *ProxyList) DeepCopy() *ProxyList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformSpec. +func (in *NutanixPlatformSpec) DeepCopy() *NutanixPlatformSpec { if in == nil { return nil } - out := new(ProxyList) + out := new(NutanixPlatformSpec) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ProxyList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProxySpec) DeepCopyInto(out *ProxySpec) { +func (in *NutanixPlatformStatus) DeepCopyInto(out *NutanixPlatformStatus) { *out = *in - if in.ReadinessEndpoints != nil { - in, out := &in.ReadinessEndpoints, &out.ReadinessEndpoints + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs *out = make([]string, len(*in)) copy(*out, *in) } - out.TrustedCA = in.TrustedCA + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(NutanixPlatformLoadBalancer) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxySpec. -func (in *ProxySpec) DeepCopy() *ProxySpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformStatus. +func (in *NutanixPlatformStatus) DeepCopy() *NutanixPlatformStatus { if in == nil { return nil } - out := new(ProxySpec) + out := new(NutanixPlatformStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProxyStatus) DeepCopyInto(out *ProxyStatus) { +func (in *NutanixPrismElementEndpoint) DeepCopyInto(out *NutanixPrismElementEndpoint) { *out = *in + out.Endpoint = in.Endpoint return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyStatus. -func (in *ProxyStatus) DeepCopy() *ProxyStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPrismElementEndpoint. +func (in *NutanixPrismElementEndpoint) DeepCopy() *NutanixPrismElementEndpoint { if in == nil { return nil } - out := new(ProxyStatus) + out := new(NutanixPrismElementEndpoint) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RegistryLocation) DeepCopyInto(out *RegistryLocation) { +func (in *NutanixPrismEndpoint) DeepCopyInto(out *NutanixPrismEndpoint) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistryLocation. -func (in *RegistryLocation) DeepCopy() *RegistryLocation { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPrismEndpoint. +func (in *NutanixPrismEndpoint) DeepCopy() *NutanixPrismEndpoint { if in == nil { return nil } - out := new(RegistryLocation) + out := new(NutanixPrismEndpoint) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RegistrySources) DeepCopyInto(out *RegistrySources) { +func (in *NutanixResourceIdentifier) DeepCopyInto(out *NutanixResourceIdentifier) { *out = *in - if in.InsecureRegistries != nil { - in, out := &in.InsecureRegistries, &out.InsecureRegistries - *out = make([]string, len(*in)) - copy(*out, *in) + if in.UUID != nil { + in, out := &in.UUID, &out.UUID + *out = new(string) + **out = **in } - if in.BlockedRegistries != nil { - in, out := &in.BlockedRegistries, &out.BlockedRegistries - *out = make([]string, len(*in)) - copy(*out, *in) + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in } - if in.AllowedRegistries != nil { - in, out := &in.AllowedRegistries, &out.AllowedRegistries - *out = make([]string, len(*in)) - copy(*out, *in) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixResourceIdentifier. +func (in *NutanixResourceIdentifier) DeepCopy() *NutanixResourceIdentifier { + if in == nil { + return nil } - if in.ContainerRuntimeSearchRegistries != nil { - in, out := &in.ContainerRuntimeSearchRegistries, &out.ContainerRuntimeSearchRegistries + out := new(NutanixResourceIdentifier) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuth) DeepCopyInto(out *OAuth) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuth. +func (in *OAuth) DeepCopy() *OAuth { + if in == nil { + return nil + } + out := new(OAuth) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OAuth) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthList) DeepCopyInto(out *OAuthList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]OAuth, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthList. +func (in *OAuthList) DeepCopy() *OAuthList { + if in == nil { + return nil + } + out := new(OAuthList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OAuthList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthRemoteConnectionInfo) DeepCopyInto(out *OAuthRemoteConnectionInfo) { + *out = *in + out.CA = in.CA + out.TLSClientCert = in.TLSClientCert + out.TLSClientKey = in.TLSClientKey + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthRemoteConnectionInfo. +func (in *OAuthRemoteConnectionInfo) DeepCopy() *OAuthRemoteConnectionInfo { + if in == nil { + return nil + } + out := new(OAuthRemoteConnectionInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthSpec) DeepCopyInto(out *OAuthSpec) { + *out = *in + if in.IdentityProviders != nil { + in, out := &in.IdentityProviders, &out.IdentityProviders + *out = make([]IdentityProvider, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.TokenConfig.DeepCopyInto(&out.TokenConfig) + out.Templates = in.Templates + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthSpec. +func (in *OAuthSpec) DeepCopy() *OAuthSpec { + if in == nil { + return nil + } + out := new(OAuthSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthStatus) DeepCopyInto(out *OAuthStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthStatus. +func (in *OAuthStatus) DeepCopy() *OAuthStatus { + if in == nil { + return nil + } + out := new(OAuthStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthTemplates) DeepCopyInto(out *OAuthTemplates) { + *out = *in + out.Login = in.Login + out.ProviderSelection = in.ProviderSelection + out.Error = in.Error + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthTemplates. +func (in *OAuthTemplates) DeepCopy() *OAuthTemplates { + if in == nil { + return nil + } + out := new(OAuthTemplates) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCClientConfig) DeepCopyInto(out *OIDCClientConfig) { + *out = *in + out.ClientSecret = in.ClientSecret + if in.ExtraScopes != nil { + in, out := &in.ExtraScopes, &out.ExtraScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCClientConfig. +func (in *OIDCClientConfig) DeepCopy() *OIDCClientConfig { + if in == nil { + return nil + } + out := new(OIDCClientConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCClientReference) DeepCopyInto(out *OIDCClientReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCClientReference. +func (in *OIDCClientReference) DeepCopy() *OIDCClientReference { + if in == nil { + return nil + } + out := new(OIDCClientReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCClientStatus) DeepCopyInto(out *OIDCClientStatus) { + *out = *in + if in.CurrentOIDCClients != nil { + in, out := &in.CurrentOIDCClients, &out.CurrentOIDCClients + *out = make([]OIDCClientReference, len(*in)) + copy(*out, *in) + } + if in.ConsumingUsers != nil { + in, out := &in.ConsumingUsers, &out.ConsumingUsers + *out = make([]ConsumingUser, len(*in)) + copy(*out, *in) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCClientStatus. +func (in *OIDCClientStatus) DeepCopy() *OIDCClientStatus { + if in == nil { + return nil + } + out := new(OIDCClientStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCProvider) DeepCopyInto(out *OIDCProvider) { + *out = *in + in.Issuer.DeepCopyInto(&out.Issuer) + if in.OIDCClients != nil { + in, out := &in.OIDCClients, &out.OIDCClients + *out = make([]OIDCClientConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.ClaimMappings.DeepCopyInto(&out.ClaimMappings) + if in.ClaimValidationRules != nil { + in, out := &in.ClaimValidationRules, &out.ClaimValidationRules + *out = make([]TokenClaimValidationRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCProvider. +func (in *OIDCProvider) DeepCopy() *OIDCProvider { + if in == nil { + return nil + } + out := new(OIDCProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ObjectReference) DeepCopyInto(out *ObjectReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference. +func (in *ObjectReference) DeepCopy() *ObjectReference { + if in == nil { + return nil + } + out := new(ObjectReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OldTLSProfile) DeepCopyInto(out *OldTLSProfile) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OldTLSProfile. +func (in *OldTLSProfile) DeepCopy() *OldTLSProfile { + if in == nil { + return nil + } + out := new(OldTLSProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenIDClaims) DeepCopyInto(out *OpenIDClaims) { + *out = *in + if in.PreferredUsername != nil { + in, out := &in.PreferredUsername, &out.PreferredUsername + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Email != nil { + in, out := &in.Email, &out.Email + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Groups != nil { + in, out := &in.Groups, &out.Groups + *out = make([]OpenIDClaim, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDClaims. +func (in *OpenIDClaims) DeepCopy() *OpenIDClaims { + if in == nil { + return nil + } + out := new(OpenIDClaims) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenIDIdentityProvider) DeepCopyInto(out *OpenIDIdentityProvider) { + *out = *in + out.ClientSecret = in.ClientSecret + out.CA = in.CA + if in.ExtraScopes != nil { + in, out := &in.ExtraScopes, &out.ExtraScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExtraAuthorizeParameters != nil { + in, out := &in.ExtraAuthorizeParameters, &out.ExtraAuthorizeParameters + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + in.Claims.DeepCopyInto(&out.Claims) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDIdentityProvider. +func (in *OpenIDIdentityProvider) DeepCopy() *OpenIDIdentityProvider { + if in == nil { + return nil + } + out := new(OpenIDIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformLoadBalancer) DeepCopyInto(out *OpenStackPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformLoadBalancer. +func (in *OpenStackPlatformLoadBalancer) DeepCopy() *OpenStackPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(OpenStackPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformSpec) DeepCopyInto(out *OpenStackPlatformSpec) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformSpec. +func (in *OpenStackPlatformSpec) DeepCopy() *OpenStackPlatformSpec { + if in == nil { + return nil + } + out := new(OpenStackPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformStatus) DeepCopyInto(out *OpenStackPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(OpenStackPlatformLoadBalancer) + **out = **in + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformStatus. +func (in *OpenStackPlatformStatus) DeepCopy() *OpenStackPlatformStatus { + if in == nil { + return nil + } + out := new(OpenStackPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperandVersion) DeepCopyInto(out *OperandVersion) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperandVersion. +func (in *OperandVersion) DeepCopy() *OperandVersion { + if in == nil { + return nil + } + out := new(OperandVersion) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHub) DeepCopyInto(out *OperatorHub) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHub. +func (in *OperatorHub) DeepCopy() *OperatorHub { + if in == nil { + return nil + } + out := new(OperatorHub) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperatorHub) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubList) DeepCopyInto(out *OperatorHubList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]OperatorHub, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubList. +func (in *OperatorHubList) DeepCopy() *OperatorHubList { + if in == nil { + return nil + } + out := new(OperatorHubList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperatorHubList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubSpec) DeepCopyInto(out *OperatorHubSpec) { + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]HubSource, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubSpec. +func (in *OperatorHubSpec) DeepCopy() *OperatorHubSpec { + if in == nil { + return nil + } + out := new(OperatorHubSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubStatus) DeepCopyInto(out *OperatorHubStatus) { + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]HubSourceStatus, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubStatus. +func (in *OperatorHubStatus) DeepCopy() *OperatorHubStatus { + if in == nil { + return nil + } + out := new(OperatorHubStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformLoadBalancer) DeepCopyInto(out *OvirtPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformLoadBalancer. +func (in *OvirtPlatformLoadBalancer) DeepCopy() *OvirtPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(OvirtPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformSpec) DeepCopyInto(out *OvirtPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformSpec. +func (in *OvirtPlatformSpec) DeepCopy() *OvirtPlatformSpec { + if in == nil { + return nil + } + out := new(OvirtPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformStatus) DeepCopyInto(out *OvirtPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(OvirtPlatformLoadBalancer) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformStatus. +func (in *OvirtPlatformStatus) DeepCopy() *OvirtPlatformStatus { + if in == nil { + return nil + } + out := new(OvirtPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PKI) DeepCopyInto(out *PKI) { + *out = *in + if in.CertificateAuthorityRootsData != nil { + in, out := &in.CertificateAuthorityRootsData, &out.CertificateAuthorityRootsData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.CertificateAuthorityIntermediatesData != nil { + in, out := &in.CertificateAuthorityIntermediatesData, &out.CertificateAuthorityIntermediatesData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + out.PKICertificateSubject = in.PKICertificateSubject + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PKI. +func (in *PKI) DeepCopy() *PKI { + if in == nil { + return nil + } + out := new(PKI) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PKICertificateSubject) DeepCopyInto(out *PKICertificateSubject) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PKICertificateSubject. +func (in *PKICertificateSubject) DeepCopy() *PKICertificateSubject { + if in == nil { + return nil + } + out := new(PKICertificateSubject) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PersistentVolumeClaimReference) DeepCopyInto(out *PersistentVolumeClaimReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimReference. +func (in *PersistentVolumeClaimReference) DeepCopy() *PersistentVolumeClaimReference { + if in == nil { + return nil + } + out := new(PersistentVolumeClaimReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PersistentVolumeConfig) DeepCopyInto(out *PersistentVolumeConfig) { + *out = *in + out.Claim = in.Claim + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeConfig. +func (in *PersistentVolumeConfig) DeepCopy() *PersistentVolumeConfig { + if in == nil { + return nil + } + out := new(PersistentVolumeConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlatformSpec) DeepCopyInto(out *PlatformSpec) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzurePlatformSpec) + **out = **in + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPPlatformSpec) + **out = **in + } + if in.BareMetal != nil { + in, out := &in.BareMetal, &out.BareMetal + *out = new(BareMetalPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.OpenStack != nil { + in, out := &in.OpenStack, &out.OpenStack + *out = new(OpenStackPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.Ovirt != nil { + in, out := &in.Ovirt, &out.Ovirt + *out = new(OvirtPlatformSpec) + **out = **in + } + if in.VSphere != nil { + in, out := &in.VSphere, &out.VSphere + *out = new(VSpherePlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.IBMCloud != nil { + in, out := &in.IBMCloud, &out.IBMCloud + *out = new(IBMCloudPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.Kubevirt != nil { + in, out := &in.Kubevirt, &out.Kubevirt + *out = new(KubevirtPlatformSpec) + **out = **in + } + if in.EquinixMetal != nil { + in, out := &in.EquinixMetal, &out.EquinixMetal + *out = new(EquinixMetalPlatformSpec) + **out = **in + } + if in.PowerVS != nil { + in, out := &in.PowerVS, &out.PowerVS + *out = new(PowerVSPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.AlibabaCloud != nil { + in, out := &in.AlibabaCloud, &out.AlibabaCloud + *out = new(AlibabaCloudPlatformSpec) + **out = **in + } + if in.Nutanix != nil { + in, out := &in.Nutanix, &out.Nutanix + *out = new(NutanixPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalPlatformSpec) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformSpec. +func (in *PlatformSpec) DeepCopy() *PlatformSpec { + if in == nil { + return nil + } + out := new(PlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlatformStatus) DeepCopyInto(out *PlatformStatus) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzurePlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.BareMetal != nil { + in, out := &in.BareMetal, &out.BareMetal + *out = new(BareMetalPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.OpenStack != nil { + in, out := &in.OpenStack, &out.OpenStack + *out = new(OpenStackPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Ovirt != nil { + in, out := &in.Ovirt, &out.Ovirt + *out = new(OvirtPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.VSphere != nil { + in, out := &in.VSphere, &out.VSphere + *out = new(VSpherePlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.IBMCloud != nil { + in, out := &in.IBMCloud, &out.IBMCloud + *out = new(IBMCloudPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Kubevirt != nil { + in, out := &in.Kubevirt, &out.Kubevirt + *out = new(KubevirtPlatformStatus) + **out = **in + } + if in.EquinixMetal != nil { + in, out := &in.EquinixMetal, &out.EquinixMetal + *out = new(EquinixMetalPlatformStatus) + **out = **in + } + if in.PowerVS != nil { + in, out := &in.PowerVS, &out.PowerVS + *out = new(PowerVSPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.AlibabaCloud != nil { + in, out := &in.AlibabaCloud, &out.AlibabaCloud + *out = new(AlibabaCloudPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Nutanix != nil { + in, out := &in.Nutanix, &out.Nutanix + *out = new(NutanixPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalPlatformStatus) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformStatus. +func (in *PlatformStatus) DeepCopy() *PlatformStatus { + if in == nil { + return nil + } + out := new(PlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Policy) DeepCopyInto(out *Policy) { + *out = *in + in.RootOfTrust.DeepCopyInto(&out.RootOfTrust) + if in.SignedIdentity != nil { + in, out := &in.SignedIdentity, &out.SignedIdentity + *out = new(PolicyIdentity) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Policy. +func (in *Policy) DeepCopy() *Policy { + if in == nil { + return nil + } + out := new(Policy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyFulcioSubject) DeepCopyInto(out *PolicyFulcioSubject) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyFulcioSubject. +func (in *PolicyFulcioSubject) DeepCopy() *PolicyFulcioSubject { + if in == nil { + return nil + } + out := new(PolicyFulcioSubject) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyIdentity) DeepCopyInto(out *PolicyIdentity) { + *out = *in + if in.PolicyMatchExactRepository != nil { + in, out := &in.PolicyMatchExactRepository, &out.PolicyMatchExactRepository + *out = new(PolicyMatchExactRepository) + **out = **in + } + if in.PolicyMatchRemapIdentity != nil { + in, out := &in.PolicyMatchRemapIdentity, &out.PolicyMatchRemapIdentity + *out = new(PolicyMatchRemapIdentity) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyIdentity. +func (in *PolicyIdentity) DeepCopy() *PolicyIdentity { + if in == nil { + return nil + } + out := new(PolicyIdentity) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyMatchExactRepository) DeepCopyInto(out *PolicyMatchExactRepository) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyMatchExactRepository. +func (in *PolicyMatchExactRepository) DeepCopy() *PolicyMatchExactRepository { + if in == nil { + return nil + } + out := new(PolicyMatchExactRepository) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyMatchRemapIdentity) DeepCopyInto(out *PolicyMatchRemapIdentity) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyMatchRemapIdentity. +func (in *PolicyMatchRemapIdentity) DeepCopy() *PolicyMatchRemapIdentity { + if in == nil { + return nil + } + out := new(PolicyMatchRemapIdentity) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyRootOfTrust) DeepCopyInto(out *PolicyRootOfTrust) { + *out = *in + if in.PublicKey != nil { + in, out := &in.PublicKey, &out.PublicKey + *out = new(PublicKey) + (*in).DeepCopyInto(*out) + } + if in.FulcioCAWithRekor != nil { + in, out := &in.FulcioCAWithRekor, &out.FulcioCAWithRekor + *out = new(FulcioCAWithRekor) + (*in).DeepCopyInto(*out) + } + if in.PKI != nil { + in, out := &in.PKI, &out.PKI + *out = new(PKI) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyRootOfTrust. +func (in *PolicyRootOfTrust) DeepCopy() *PolicyRootOfTrust { + if in == nil { + return nil + } + out := new(PolicyRootOfTrust) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSPlatformSpec) DeepCopyInto(out *PowerVSPlatformSpec) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]PowerVSServiceEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSPlatformSpec. +func (in *PowerVSPlatformSpec) DeepCopy() *PowerVSPlatformSpec { + if in == nil { + return nil + } + out := new(PowerVSPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSPlatformStatus) DeepCopyInto(out *PowerVSPlatformStatus) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]PowerVSServiceEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSPlatformStatus. +func (in *PowerVSPlatformStatus) DeepCopy() *PowerVSPlatformStatus { + if in == nil { + return nil + } + out := new(PowerVSPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSServiceEndpoint) DeepCopyInto(out *PowerVSServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSServiceEndpoint. +func (in *PowerVSServiceEndpoint) DeepCopy() *PowerVSServiceEndpoint { + if in == nil { + return nil + } + out := new(PowerVSServiceEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PrefixedClaimMapping) DeepCopyInto(out *PrefixedClaimMapping) { + *out = *in + out.TokenClaimMapping = in.TokenClaimMapping + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrefixedClaimMapping. +func (in *PrefixedClaimMapping) DeepCopy() *PrefixedClaimMapping { + if in == nil { + return nil + } + out := new(PrefixedClaimMapping) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProfileCustomizations) DeepCopyInto(out *ProfileCustomizations) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProfileCustomizations. +func (in *ProfileCustomizations) DeepCopy() *ProfileCustomizations { + if in == nil { + return nil + } + out := new(ProfileCustomizations) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Project) DeepCopyInto(out *Project) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Project. +func (in *Project) DeepCopy() *Project { + if in == nil { + return nil + } + out := new(Project) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Project) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectList) DeepCopyInto(out *ProjectList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Project, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectList. +func (in *ProjectList) DeepCopy() *ProjectList { + if in == nil { + return nil + } + out := new(ProjectList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ProjectList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectSpec) DeepCopyInto(out *ProjectSpec) { + *out = *in + out.ProjectRequestTemplate = in.ProjectRequestTemplate + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectSpec. +func (in *ProjectSpec) DeepCopy() *ProjectSpec { + if in == nil { + return nil + } + out := new(ProjectSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectStatus) DeepCopyInto(out *ProjectStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectStatus. +func (in *ProjectStatus) DeepCopy() *ProjectStatus { + if in == nil { + return nil + } + out := new(ProjectStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromQLClusterCondition) DeepCopyInto(out *PromQLClusterCondition) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromQLClusterCondition. +func (in *PromQLClusterCondition) DeepCopy() *PromQLClusterCondition { + if in == nil { + return nil + } + out := new(PromQLClusterCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Proxy) DeepCopyInto(out *Proxy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. +func (in *Proxy) DeepCopy() *Proxy { + if in == nil { + return nil + } + out := new(Proxy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Proxy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxyList) DeepCopyInto(out *ProxyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Proxy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyList. +func (in *ProxyList) DeepCopy() *ProxyList { + if in == nil { + return nil + } + out := new(ProxyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ProxyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxySpec) DeepCopyInto(out *ProxySpec) { + *out = *in + if in.ReadinessEndpoints != nil { + in, out := &in.ReadinessEndpoints, &out.ReadinessEndpoints + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.TrustedCA = in.TrustedCA + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxySpec. +func (in *ProxySpec) DeepCopy() *ProxySpec { + if in == nil { + return nil + } + out := new(ProxySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxyStatus) DeepCopyInto(out *ProxyStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyStatus. +func (in *ProxyStatus) DeepCopy() *ProxyStatus { + if in == nil { + return nil + } + out := new(ProxyStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PublicKey) DeepCopyInto(out *PublicKey) { + *out = *in + if in.KeyData != nil { + in, out := &in.KeyData, &out.KeyData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.RekorKeyData != nil { + in, out := &in.RekorKeyData, &out.RekorKeyData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PublicKey. +func (in *PublicKey) DeepCopy() *PublicKey { + if in == nil { + return nil + } + out := new(PublicKey) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RegistryLocation) DeepCopyInto(out *RegistryLocation) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistryLocation. +func (in *RegistryLocation) DeepCopy() *RegistryLocation { + if in == nil { + return nil + } + out := new(RegistryLocation) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RegistrySources) DeepCopyInto(out *RegistrySources) { + *out = *in + if in.InsecureRegistries != nil { + in, out := &in.InsecureRegistries, &out.InsecureRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.BlockedRegistries != nil { + in, out := &in.BlockedRegistries, &out.BlockedRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.AllowedRegistries != nil { + in, out := &in.AllowedRegistries, &out.AllowedRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ContainerRuntimeSearchRegistries != nil { + in, out := &in.ContainerRuntimeSearchRegistries, &out.ContainerRuntimeSearchRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistrySources. +func (in *RegistrySources) DeepCopy() *RegistrySources { + if in == nil { + return nil + } + out := new(RegistrySources) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Release) DeepCopyInto(out *Release) { + *out = *in + if in.Channels != nil { + in, out := &in.Channels, &out.Channels + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Release. +func (in *Release) DeepCopy() *Release { + if in == nil { + return nil + } + out := new(Release) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RemoteConnectionInfo) DeepCopyInto(out *RemoteConnectionInfo) { + *out = *in + out.CertInfo = in.CertInfo + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteConnectionInfo. +func (in *RemoteConnectionInfo) DeepCopy() *RemoteConnectionInfo { + if in == nil { + return nil + } + out := new(RemoteConnectionInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RepositoryDigestMirrors) DeepCopyInto(out *RepositoryDigestMirrors) { + *out = *in + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]Mirror, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepositoryDigestMirrors. +func (in *RepositoryDigestMirrors) DeepCopy() *RepositoryDigestMirrors { + if in == nil { + return nil + } + out := new(RepositoryDigestMirrors) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RequestHeaderIdentityProvider) DeepCopyInto(out *RequestHeaderIdentityProvider) { + *out = *in + out.ClientCA = in.ClientCA + if in.ClientCommonNames != nil { + in, out := &in.ClientCommonNames, &out.ClientCommonNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Headers != nil { + in, out := &in.Headers, &out.Headers + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PreferredUsernameHeaders != nil { + in, out := &in.PreferredUsernameHeaders, &out.PreferredUsernameHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NameHeaders != nil { + in, out := &in.NameHeaders, &out.NameHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.EmailHeaders != nil { + in, out := &in.EmailHeaders, &out.EmailHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestHeaderIdentityProvider. +func (in *RequestHeaderIdentityProvider) DeepCopy() *RequestHeaderIdentityProvider { + if in == nil { + return nil + } + out := new(RequestHeaderIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RequiredHSTSPolicy) DeepCopyInto(out *RequiredHSTSPolicy) { + *out = *in + if in.NamespaceSelector != nil { + in, out := &in.NamespaceSelector, &out.NamespaceSelector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.DomainPatterns != nil { + in, out := &in.DomainPatterns, &out.DomainPatterns + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.MaxAge.DeepCopyInto(&out.MaxAge) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequiredHSTSPolicy. +func (in *RequiredHSTSPolicy) DeepCopy() *RequiredHSTSPolicy { + if in == nil { + return nil + } + out := new(RequiredHSTSPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Scheduler) DeepCopyInto(out *Scheduler) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Scheduler. +func (in *Scheduler) DeepCopy() *Scheduler { + if in == nil { + return nil + } + out := new(Scheduler) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Scheduler) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerList) DeepCopyInto(out *SchedulerList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Scheduler, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerList. +func (in *SchedulerList) DeepCopy() *SchedulerList { + if in == nil { + return nil + } + out := new(SchedulerList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SchedulerList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerSpec) DeepCopyInto(out *SchedulerSpec) { + *out = *in + out.Policy = in.Policy + out.ProfileCustomizations = in.ProfileCustomizations + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerSpec. +func (in *SchedulerSpec) DeepCopy() *SchedulerSpec { + if in == nil { + return nil + } + out := new(SchedulerSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerStatus) DeepCopyInto(out *SchedulerStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerStatus. +func (in *SchedulerStatus) DeepCopy() *SchedulerStatus { + if in == nil { + return nil + } + out := new(SchedulerStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretNameReference) DeepCopyInto(out *SecretNameReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNameReference. +func (in *SecretNameReference) DeepCopy() *SecretNameReference { + if in == nil { + return nil + } + out := new(SecretNameReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServingInfo) DeepCopyInto(out *ServingInfo) { + *out = *in + out.CertInfo = in.CertInfo + if in.NamedCertificates != nil { + in, out := &in.NamedCertificates, &out.NamedCertificates + *out = make([]NamedCertificate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.CipherSuites != nil { + in, out := &in.CipherSuites, &out.CipherSuites + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServingInfo. +func (in *ServingInfo) DeepCopy() *ServingInfo { + if in == nil { + return nil + } + out := new(ServingInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SignatureStore) DeepCopyInto(out *SignatureStore) { + *out = *in + out.CA = in.CA + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SignatureStore. +func (in *SignatureStore) DeepCopy() *SignatureStore { + if in == nil { + return nil + } + out := new(SignatureStore) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Storage) DeepCopyInto(out *Storage) { + *out = *in + out.PersistentVolume = in.PersistentVolume + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Storage. +func (in *Storage) DeepCopy() *Storage { + if in == nil { + return nil + } + out := new(Storage) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StringSource) DeepCopyInto(out *StringSource) { + *out = *in + out.StringSourceSpec = in.StringSourceSpec + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSource. +func (in *StringSource) DeepCopy() *StringSource { + if in == nil { + return nil + } + out := new(StringSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StringSourceSpec) DeepCopyInto(out *StringSourceSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSourceSpec. +func (in *StringSourceSpec) DeepCopy() *StringSourceSpec { + if in == nil { + return nil + } + out := new(StringSourceSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TLSProfileSpec) DeepCopyInto(out *TLSProfileSpec) { + *out = *in + if in.Ciphers != nil { + in, out := &in.Ciphers, &out.Ciphers *out = make([]string, len(*in)) copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistrySources. -func (in *RegistrySources) DeepCopy() *RegistrySources { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSProfileSpec. +func (in *TLSProfileSpec) DeepCopy() *TLSProfileSpec { + if in == nil { + return nil + } + out := new(TLSProfileSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TLSSecurityProfile) DeepCopyInto(out *TLSSecurityProfile) { + *out = *in + if in.Old != nil { + in, out := &in.Old, &out.Old + *out = new(OldTLSProfile) + **out = **in + } + if in.Intermediate != nil { + in, out := &in.Intermediate, &out.Intermediate + *out = new(IntermediateTLSProfile) + **out = **in + } + if in.Modern != nil { + in, out := &in.Modern, &out.Modern + *out = new(ModernTLSProfile) + **out = **in + } + if in.Custom != nil { + in, out := &in.Custom, &out.Custom + *out = new(CustomTLSProfile) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSSecurityProfile. +func (in *TLSSecurityProfile) DeepCopy() *TLSSecurityProfile { + if in == nil { + return nil + } + out := new(TLSSecurityProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TemplateReference) DeepCopyInto(out *TemplateReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateReference. +func (in *TemplateReference) DeepCopy() *TemplateReference { + if in == nil { + return nil + } + out := new(TemplateReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestDetails) DeepCopyInto(out *TestDetails) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestDetails. +func (in *TestDetails) DeepCopy() *TestDetails { + if in == nil { + return nil + } + out := new(TestDetails) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestReporting) DeepCopyInto(out *TestReporting) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestReporting. +func (in *TestReporting) DeepCopy() *TestReporting { + if in == nil { + return nil + } + out := new(TestReporting) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestReportingSpec) DeepCopyInto(out *TestReportingSpec) { + *out = *in + if in.TestsForFeatureGates != nil { + in, out := &in.TestsForFeatureGates, &out.TestsForFeatureGates + *out = make([]FeatureGateTests, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestReportingSpec. +func (in *TestReportingSpec) DeepCopy() *TestReportingSpec { + if in == nil { + return nil + } + out := new(TestReportingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestReportingStatus) DeepCopyInto(out *TestReportingStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestReportingStatus. +func (in *TestReportingStatus) DeepCopy() *TestReportingStatus { + if in == nil { + return nil + } + out := new(TestReportingStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TokenClaimMapping) DeepCopyInto(out *TokenClaimMapping) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimMapping. +func (in *TokenClaimMapping) DeepCopy() *TokenClaimMapping { + if in == nil { + return nil + } + out := new(TokenClaimMapping) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TokenClaimMappings) DeepCopyInto(out *TokenClaimMappings) { + *out = *in + in.Username.DeepCopyInto(&out.Username) + out.Groups = in.Groups + if in.UID != nil { + in, out := &in.UID, &out.UID + *out = new(TokenClaimOrExpressionMapping) + **out = **in + } + if in.Extra != nil { + in, out := &in.Extra, &out.Extra + *out = make([]ExtraMapping, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimMappings. +func (in *TokenClaimMappings) DeepCopy() *TokenClaimMappings { + if in == nil { + return nil + } + out := new(TokenClaimMappings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TokenClaimOrExpressionMapping) DeepCopyInto(out *TokenClaimOrExpressionMapping) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimOrExpressionMapping. +func (in *TokenClaimOrExpressionMapping) DeepCopy() *TokenClaimOrExpressionMapping { if in == nil { return nil } - out := new(RegistrySources) + out := new(TokenClaimOrExpressionMapping) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Release) DeepCopyInto(out *Release) { +func (in *TokenClaimValidationRule) DeepCopyInto(out *TokenClaimValidationRule) { *out = *in - if in.Channels != nil { - in, out := &in.Channels, &out.Channels - *out = make([]string, len(*in)) - copy(*out, *in) + if in.RequiredClaim != nil { + in, out := &in.RequiredClaim, &out.RequiredClaim + *out = new(TokenRequiredClaim) + **out = **in } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Release. -func (in *Release) DeepCopy() *Release { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimValidationRule. +func (in *TokenClaimValidationRule) DeepCopy() *TokenClaimValidationRule { if in == nil { return nil } - out := new(Release) + out := new(TokenClaimValidationRule) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RemoteConnectionInfo) DeepCopyInto(out *RemoteConnectionInfo) { +func (in *TokenConfig) DeepCopyInto(out *TokenConfig) { *out = *in - out.CertInfo = in.CertInfo + if in.AccessTokenInactivityTimeout != nil { + in, out := &in.AccessTokenInactivityTimeout, &out.AccessTokenInactivityTimeout + *out = new(metav1.Duration) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteConnectionInfo. -func (in *RemoteConnectionInfo) DeepCopy() *RemoteConnectionInfo { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenConfig. +func (in *TokenConfig) DeepCopy() *TokenConfig { if in == nil { return nil } - out := new(RemoteConnectionInfo) + out := new(TokenConfig) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RequestHeaderIdentityProvider) DeepCopyInto(out *RequestHeaderIdentityProvider) { +func (in *TokenIssuer) DeepCopyInto(out *TokenIssuer) { *out = *in - out.ClientCA = in.ClientCA - if in.ClientCommonNames != nil { - in, out := &in.ClientCommonNames, &out.ClientCommonNames - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Headers != nil { - in, out := &in.Headers, &out.Headers - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.PreferredUsernameHeaders != nil { - in, out := &in.PreferredUsernameHeaders, &out.PreferredUsernameHeaders - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.NameHeaders != nil { - in, out := &in.NameHeaders, &out.NameHeaders - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.EmailHeaders != nil { - in, out := &in.EmailHeaders, &out.EmailHeaders - *out = make([]string, len(*in)) + if in.Audiences != nil { + in, out := &in.Audiences, &out.Audiences + *out = make([]TokenAudience, len(*in)) copy(*out, *in) } + out.CertificateAuthority = in.CertificateAuthority return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestHeaderIdentityProvider. -func (in *RequestHeaderIdentityProvider) DeepCopy() *RequestHeaderIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenIssuer. +func (in *TokenIssuer) DeepCopy() *TokenIssuer { if in == nil { return nil } - out := new(RequestHeaderIdentityProvider) + out := new(TokenIssuer) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Scheduler) DeepCopyInto(out *Scheduler) { +func (in *TokenRequiredClaim) DeepCopyInto(out *TokenRequiredClaim) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Scheduler. -func (in *Scheduler) DeepCopy() *Scheduler { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenRequiredClaim. +func (in *TokenRequiredClaim) DeepCopy() *TokenRequiredClaim { if in == nil { return nil } - out := new(Scheduler) + out := new(TokenRequiredClaim) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Scheduler) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerList) DeepCopyInto(out *SchedulerList) { +func (in *Update) DeepCopyInto(out *Update) { *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Scheduler, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerList. -func (in *SchedulerList) DeepCopy() *SchedulerList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Update. +func (in *Update) DeepCopy() *Update { if in == nil { return nil } - out := new(SchedulerList) + out := new(Update) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *SchedulerList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerSpec) DeepCopyInto(out *SchedulerSpec) { +func (in *UpdateHistory) DeepCopyInto(out *UpdateHistory) { *out = *in - out.Policy = in.Policy + in.StartedTime.DeepCopyInto(&out.StartedTime) + if in.CompletionTime != nil { + in, out := &in.CompletionTime, &out.CompletionTime + *out = (*in).DeepCopy() + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerSpec. -func (in *SchedulerSpec) DeepCopy() *SchedulerSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdateHistory. +func (in *UpdateHistory) DeepCopy() *UpdateHistory { if in == nil { return nil } - out := new(SchedulerSpec) + out := new(UpdateHistory) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerStatus) DeepCopyInto(out *SchedulerStatus) { +func (in *UsernameClaimMapping) DeepCopyInto(out *UsernameClaimMapping) { *out = *in + if in.Prefix != nil { + in, out := &in.Prefix, &out.Prefix + *out = new(UsernamePrefix) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerStatus. -func (in *SchedulerStatus) DeepCopy() *SchedulerStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UsernameClaimMapping. +func (in *UsernameClaimMapping) DeepCopy() *UsernameClaimMapping { if in == nil { return nil } - out := new(SchedulerStatus) + out := new(UsernameClaimMapping) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SecretNameReference) DeepCopyInto(out *SecretNameReference) { +func (in *UsernamePrefix) DeepCopyInto(out *UsernamePrefix) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNameReference. -func (in *SecretNameReference) DeepCopy() *SecretNameReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UsernamePrefix. +func (in *UsernamePrefix) DeepCopy() *UsernamePrefix { if in == nil { return nil } - out := new(SecretNameReference) + out := new(UsernamePrefix) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServingInfo) DeepCopyInto(out *ServingInfo) { +func (in *VSphereFailureDomainHostGroup) DeepCopyInto(out *VSphereFailureDomainHostGroup) { *out = *in - out.CertInfo = in.CertInfo - if in.NamedCertificates != nil { - in, out := &in.NamedCertificates, &out.NamedCertificates - *out = make([]NamedCertificate, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.CipherSuites != nil { - in, out := &in.CipherSuites, &out.CipherSuites - *out = make([]string, len(*in)) - copy(*out, *in) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServingInfo. -func (in *ServingInfo) DeepCopy() *ServingInfo { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereFailureDomainHostGroup. +func (in *VSphereFailureDomainHostGroup) DeepCopy() *VSphereFailureDomainHostGroup { if in == nil { return nil } - out := new(ServingInfo) + out := new(VSphereFailureDomainHostGroup) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *StringSource) DeepCopyInto(out *StringSource) { +func (in *VSphereFailureDomainRegionAffinity) DeepCopyInto(out *VSphereFailureDomainRegionAffinity) { *out = *in - out.StringSourceSpec = in.StringSourceSpec return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSource. -func (in *StringSource) DeepCopy() *StringSource { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereFailureDomainRegionAffinity. +func (in *VSphereFailureDomainRegionAffinity) DeepCopy() *VSphereFailureDomainRegionAffinity { if in == nil { return nil } - out := new(StringSource) + out := new(VSphereFailureDomainRegionAffinity) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *StringSourceSpec) DeepCopyInto(out *StringSourceSpec) { +func (in *VSphereFailureDomainZoneAffinity) DeepCopyInto(out *VSphereFailureDomainZoneAffinity) { *out = *in + if in.HostGroup != nil { + in, out := &in.HostGroup, &out.HostGroup + *out = new(VSphereFailureDomainHostGroup) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSourceSpec. -func (in *StringSourceSpec) DeepCopy() *StringSourceSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereFailureDomainZoneAffinity. +func (in *VSphereFailureDomainZoneAffinity) DeepCopy() *VSphereFailureDomainZoneAffinity { if in == nil { return nil } - out := new(StringSourceSpec) + out := new(VSphereFailureDomainZoneAffinity) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TLSProfileSpec) DeepCopyInto(out *TLSProfileSpec) { +func (in *VSpherePlatformFailureDomainSpec) DeepCopyInto(out *VSpherePlatformFailureDomainSpec) { *out = *in - if in.Ciphers != nil { - in, out := &in.Ciphers, &out.Ciphers - *out = make([]string, len(*in)) - copy(*out, *in) + if in.RegionAffinity != nil { + in, out := &in.RegionAffinity, &out.RegionAffinity + *out = new(VSphereFailureDomainRegionAffinity) + **out = **in + } + if in.ZoneAffinity != nil { + in, out := &in.ZoneAffinity, &out.ZoneAffinity + *out = new(VSphereFailureDomainZoneAffinity) + (*in).DeepCopyInto(*out) } + in.Topology.DeepCopyInto(&out.Topology) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSProfileSpec. -func (in *TLSProfileSpec) DeepCopy() *TLSProfileSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformFailureDomainSpec. +func (in *VSpherePlatformFailureDomainSpec) DeepCopy() *VSpherePlatformFailureDomainSpec { if in == nil { return nil } - out := new(TLSProfileSpec) + out := new(VSpherePlatformFailureDomainSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TLSSecurityProfile) DeepCopyInto(out *TLSSecurityProfile) { +func (in *VSpherePlatformLoadBalancer) DeepCopyInto(out *VSpherePlatformLoadBalancer) { *out = *in - if in.Old != nil { - in, out := &in.Old, &out.Old - *out = new(OldTLSProfile) - **out = **in - } - if in.Intermediate != nil { - in, out := &in.Intermediate, &out.Intermediate - *out = new(IntermediateTLSProfile) - **out = **in - } - if in.Modern != nil { - in, out := &in.Modern, &out.Modern - *out = new(ModernTLSProfile) - **out = **in - } - if in.Custom != nil { - in, out := &in.Custom, &out.Custom - *out = new(CustomTLSProfile) - (*in).DeepCopyInto(*out) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSSecurityProfile. -func (in *TLSSecurityProfile) DeepCopy() *TLSSecurityProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformLoadBalancer. +func (in *VSpherePlatformLoadBalancer) DeepCopy() *VSpherePlatformLoadBalancer { if in == nil { return nil } - out := new(TLSSecurityProfile) + out := new(VSpherePlatformLoadBalancer) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TemplateReference) DeepCopyInto(out *TemplateReference) { +func (in *VSpherePlatformNodeNetworking) DeepCopyInto(out *VSpherePlatformNodeNetworking) { *out = *in + in.External.DeepCopyInto(&out.External) + in.Internal.DeepCopyInto(&out.Internal) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateReference. -func (in *TemplateReference) DeepCopy() *TemplateReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformNodeNetworking. +func (in *VSpherePlatformNodeNetworking) DeepCopy() *VSpherePlatformNodeNetworking { if in == nil { return nil } - out := new(TemplateReference) + out := new(VSpherePlatformNodeNetworking) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TokenConfig) DeepCopyInto(out *TokenConfig) { +func (in *VSpherePlatformNodeNetworkingSpec) DeepCopyInto(out *VSpherePlatformNodeNetworkingSpec) { *out = *in - if in.AccessTokenInactivityTimeout != nil { - in, out := &in.AccessTokenInactivityTimeout, &out.AccessTokenInactivityTimeout - *out = new(metav1.Duration) - **out = **in + if in.NetworkSubnetCIDR != nil { + in, out := &in.NetworkSubnetCIDR, &out.NetworkSubnetCIDR + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExcludeNetworkSubnetCIDR != nil { + in, out := &in.ExcludeNetworkSubnetCIDR, &out.ExcludeNetworkSubnetCIDR + *out = make([]string, len(*in)) + copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenConfig. -func (in *TokenConfig) DeepCopy() *TokenConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformNodeNetworkingSpec. +func (in *VSpherePlatformNodeNetworkingSpec) DeepCopy() *VSpherePlatformNodeNetworkingSpec { if in == nil { return nil } - out := new(TokenConfig) + out := new(VSpherePlatformNodeNetworkingSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Update) DeepCopyInto(out *Update) { +func (in *VSpherePlatformSpec) DeepCopyInto(out *VSpherePlatformSpec) { *out = *in + if in.VCenters != nil { + in, out := &in.VCenters, &out.VCenters + *out = make([]VSpherePlatformVCenterSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FailureDomains != nil { + in, out := &in.FailureDomains, &out.FailureDomains + *out = make([]VSpherePlatformFailureDomainSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.NodeNetworking.DeepCopyInto(&out.NodeNetworking) + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Update. -func (in *Update) DeepCopy() *Update { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformSpec. +func (in *VSpherePlatformSpec) DeepCopy() *VSpherePlatformSpec { if in == nil { return nil } - out := new(Update) + out := new(VSpherePlatformSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *UpdateHistory) DeepCopyInto(out *UpdateHistory) { +func (in *VSpherePlatformStatus) DeepCopyInto(out *VSpherePlatformStatus) { *out = *in - in.StartedTime.DeepCopyInto(&out.StartedTime) - if in.CompletionTime != nil { - in, out := &in.CompletionTime, &out.CompletionTime - *out = (*in).DeepCopy() + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(VSpherePlatformLoadBalancer) + **out = **in + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdateHistory. -func (in *UpdateHistory) DeepCopy() *UpdateHistory { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformStatus. +func (in *VSpherePlatformStatus) DeepCopy() *VSpherePlatformStatus { if in == nil { return nil } - out := new(UpdateHistory) + out := new(VSpherePlatformStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSpherePlatformSpec) DeepCopyInto(out *VSpherePlatformSpec) { +func (in *VSpherePlatformTopology) DeepCopyInto(out *VSpherePlatformTopology) { *out = *in + if in.Networks != nil { + in, out := &in.Networks, &out.Networks + *out = make([]string, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformSpec. -func (in *VSpherePlatformSpec) DeepCopy() *VSpherePlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformTopology. +func (in *VSpherePlatformTopology) DeepCopy() *VSpherePlatformTopology { if in == nil { return nil } - out := new(VSpherePlatformSpec) + out := new(VSpherePlatformTopology) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSpherePlatformStatus) DeepCopyInto(out *VSpherePlatformStatus) { +func (in *VSpherePlatformVCenterSpec) DeepCopyInto(out *VSpherePlatformVCenterSpec) { *out = *in + if in.Datacenters != nil { + in, out := &in.Datacenters, &out.Datacenters + *out = make([]string, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformStatus. -func (in *VSpherePlatformStatus) DeepCopy() *VSpherePlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformVCenterSpec. +func (in *VSpherePlatformVCenterSpec) DeepCopy() *VSpherePlatformVCenterSpec { if in == nil { return nil } - out := new(VSpherePlatformStatus) + out := new(VSpherePlatformVCenterSpec) in.DeepCopyInto(out) return out } diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml b/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml new file mode 100644 index 0000000000..d8d6b502ee --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml @@ -0,0 +1,589 @@ +apiservers.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: apiservers.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - KMSEncryptionProvider + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: APIServer + Labels: {} + PluralName: apiservers + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +authentications.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: authentications.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - ExternalOIDC + - ExternalOIDCWithUIDAndExtraClaimMappings + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Authentication + Labels: {} + PluralName: authentications + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +builds.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: builds.config.openshift.io + Capability: Build + Category: "" + FeatureGates: [] + FilenameOperatorName: openshift-controller-manager + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Build + Labels: {} + PluralName: builds + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +clusterimagepolicies.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/2310 + CRDName: clusterimagepolicies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - SigstoreImageVerification + - SigstoreImageVerificationPKI + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ClusterImagePolicy + Labels: {} + PluralName: clusterimagepolicies + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: + - SigstoreImageVerification + Version: v1 + +clusteroperators.config.openshift.io: + Annotations: + include.release.openshift.io/self-managed-high-availability: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/497 + CRDName: clusteroperators.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: cluster-version-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_00" + GroupName: config.openshift.io + HasStatus: true + KindName: ClusterOperator + Labels: {} + PluralName: clusteroperators + PrinterColumns: + - description: The version the operator is at. + jsonPath: .status.versions[?(@.name=="operator")].version + name: Version + type: string + - description: Whether the operator is running and stable. + jsonPath: .status.conditions[?(@.type=="Available")].status + name: Available + type: string + - description: Whether the operator is processing changes. + jsonPath: .status.conditions[?(@.type=="Progressing")].status + name: Progressing + type: string + - description: Whether the operator is degraded. + jsonPath: .status.conditions[?(@.type=="Degraded")].status + name: Degraded + type: string + - description: The time the operator's Available status last changed. + jsonPath: .status.conditions[?(@.type=="Available")].lastTransitionTime + name: Since + type: date + Scope: Cluster + ShortNames: + - co + TopLevelFeatureGates: [] + Version: v1 + +clusterversions.config.openshift.io: + Annotations: + include.release.openshift.io/self-managed-high-availability: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/495 + CRDName: clusterversions.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - ImageStreamImportMode + - SignatureStores + FilenameOperatorName: cluster-version-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_00" + GroupName: config.openshift.io + HasStatus: true + KindName: ClusterVersion + Labels: {} + PluralName: clusterversions + PrinterColumns: + - jsonPath: .status.history[?(@.state=="Completed")].version + name: Version + type: string + - jsonPath: .status.conditions[?(@.type=="Available")].status + name: Available + type: string + - jsonPath: .status.conditions[?(@.type=="Progressing")].status + name: Progressing + type: string + - jsonPath: .status.conditions[?(@.type=="Progressing")].lastTransitionTime + name: Since + type: date + - jsonPath: .status.conditions[?(@.type=="Progressing")].message + name: Status + type: string + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +consoles.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: consoles.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Console + Labels: {} + PluralName: consoles + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +dnses.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: dnses.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: DNS + Labels: {} + PluralName: dnses + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +featuregates.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: featuregates.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: FeatureGate + Labels: {} + PluralName: featuregates + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +images.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: images.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - ImageStreamImportMode + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Image + Labels: {} + PluralName: images + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +imagecontentpolicies.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/874 + CRDName: imagecontentpolicies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImageContentPolicy + Labels: {} + PluralName: imagecontentpolicies + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +imagedigestmirrorsets.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/1126 + CRDName: imagedigestmirrorsets.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImageDigestMirrorSet + Labels: {} + PluralName: imagedigestmirrorsets + PrinterColumns: [] + Scope: Cluster + ShortNames: + - idms + TopLevelFeatureGates: [] + Version: v1 + +imagepolicies.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/2310 + CRDName: imagepolicies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - SigstoreImageVerification + - SigstoreImageVerificationPKI + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImagePolicy + Labels: {} + PluralName: imagepolicies + PrinterColumns: [] + Scope: Namespaced + ShortNames: null + TopLevelFeatureGates: + - SigstoreImageVerification + Version: v1 + +imagetagmirrorsets.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/1126 + CRDName: imagetagmirrorsets.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImageTagMirrorSet + Labels: {} + PluralName: imagetagmirrorsets + PrinterColumns: [] + Scope: Cluster + ShortNames: + - itms + TopLevelFeatureGates: [] + Version: v1 + +infrastructures.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: infrastructures.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - AWSClusterHostedDNSInstall + - AzureClusterHostedDNSInstall + - DualReplica + - DyanmicServiceEndpointIBMCloud + - GCPClusterHostedDNSInstall + - GCPCustomAPIEndpointsInstall + - HighlyAvailableArbiter + - HighlyAvailableArbiter+DualReplica + - NutanixMultiSubnets + - VSphereHostVMGroupZonal + - VSphereMultiNetworks + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Infrastructure + Labels: {} + PluralName: infrastructures + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +ingresses.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: ingresses.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Ingress + Labels: {} + PluralName: ingresses + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +insightsdatagathers.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/2448 + CRDName: insightsdatagathers.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - InsightsConfig + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: false + KindName: InsightsDataGather + Labels: {} + PluralName: insightsdatagathers + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: + - InsightsConfig + Version: v1 + +networks.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: networks.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - NetworkDiagnosticsConfig + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: false + KindName: Network + Labels: {} + PluralName: networks + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +nodes.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/1107 + CRDName: nodes.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - MinimumKubeletVersion + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Node + Labels: {} + PluralName: nodes + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +oauths.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: oauths.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: OAuth + Labels: {} + PluralName: oauths + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +operatorhubs.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: operatorhubs.config.openshift.io + Capability: marketplace + Category: "" + FeatureGates: [] + FilenameOperatorName: marketplace + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_03" + GroupName: config.openshift.io + HasStatus: true + KindName: OperatorHub + Labels: {} + PluralName: operatorhubs + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +projects.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: projects.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Project + Labels: {} + PluralName: projects + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +proxies.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: proxies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_03" + GroupName: config.openshift.io + HasStatus: true + KindName: Proxy + Labels: {} + PluralName: proxies + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +schedulers.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: schedulers.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - DynamicResourceAllocation + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Scheduler + Labels: {} + PluralName: schedulers + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go index 22de664b22..18a75a9d51 100644 --- a/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go @@ -22,8 +22,8 @@ func (AdmissionConfig) SwaggerDoc() map[string]string { var map_AdmissionPluginConfig = map[string]string{ "": "AdmissionPluginConfig holds the necessary configuration options for admission plugins", - "location": "Location is the path to a configuration file that contains the plugin's configuration", - "configuration": "Configuration is an embedded configuration object to be used as the plugin's configuration. If present, it will be used instead of the path to the configuration file.", + "location": "location is the path to a configuration file that contains the plugin's configuration", + "configuration": "configuration is an embedded configuration object to be used as the plugin's configuration. If present, it will be used instead of the path to the configuration file.", } func (AdmissionPluginConfig) SwaggerDoc() map[string]string { @@ -37,8 +37,8 @@ var map_AuditConfig = map[string]string{ "maximumFileRetentionDays": "Maximum number of days to retain old log files based on the timestamp encoded in their filename.", "maximumRetainedFiles": "Maximum number of old log files to retain.", "maximumFileSizeMegabytes": "Maximum size in megabytes of the log file before it gets rotated. Defaults to 100MB.", - "policyFile": "PolicyFile is a path to the file that defines the audit policy configuration.", - "policyConfiguration": "PolicyConfiguration is an embedded policy configuration object to be used as the audit policy configuration. If present, it will be used instead of the path to the policy file.", + "policyFile": "policyFile is a path to the file that defines the audit policy configuration.", + "policyConfiguration": "policyConfiguration is an embedded policy configuration object to be used as the audit policy configuration. If present, it will be used instead of the path to the policy file.", "logFormat": "Format of saved audits (legacy or json).", "webHookKubeConfig": "Path to a .kubeconfig formatted file that defines the audit webhook configuration.", "webHookMode": "Strategy for sending audit events (block or batch).", @@ -50,8 +50,8 @@ func (AuditConfig) SwaggerDoc() map[string]string { var map_CertInfo = map[string]string{ "": "CertInfo relates a certificate with a private key", - "certFile": "CertFile is a file containing a PEM-encoded certificate", - "keyFile": "KeyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile", + "certFile": "certFile is a file containing a PEM-encoded certificate", + "keyFile": "keyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile", } func (CertInfo) SwaggerDoc() map[string]string { @@ -71,7 +71,7 @@ func (ClientConnectionOverrides) SwaggerDoc() map[string]string { var map_ConfigMapFileReference = map[string]string{ "": "ConfigMapFileReference references a config map in a specific namespace. The namespace must be specified at the point of use.", - "key": "Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references.", + "key": "key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references.", } func (ConfigMapFileReference) SwaggerDoc() map[string]string { @@ -107,8 +107,8 @@ func (DelegatedAuthorization) SwaggerDoc() map[string]string { var map_EtcdConnectionInfo = map[string]string{ "": "EtcdConnectionInfo holds information necessary for connecting to an etcd server", - "urls": "URLs are the URLs for etcd", - "ca": "CA is a file containing trusted roots for the etcd server certificates", + "urls": "urls are the URLs for etcd", + "ca": "ca is a file containing trusted roots for the etcd server certificates", } func (EtcdConnectionInfo) SwaggerDoc() map[string]string { @@ -116,7 +116,7 @@ func (EtcdConnectionInfo) SwaggerDoc() map[string]string { } var map_EtcdStorageConfig = map[string]string{ - "storagePrefix": "StoragePrefix is the path within etcd that the OpenShift resources will be rooted under. This value, if changed, will mean existing objects in etcd will no longer be located.", + "storagePrefix": "storagePrefix is the path within etcd that the OpenShift resources will be rooted under. This value, if changed, will mean existing objects in etcd will no longer be located.", } func (EtcdStorageConfig) SwaggerDoc() map[string]string { @@ -138,7 +138,7 @@ func (GenericAPIServerConfig) SwaggerDoc() map[string]string { var map_GenericControllerConfig = map[string]string{ "": "GenericControllerConfig provides information to configure a controller", - "servingInfo": "ServingInfo is the HTTP serving information for the controller's endpoints", + "servingInfo": "servingInfo is the HTTP serving information for the controller's endpoints", "leaderElection": "leaderElection provides information to elect a leader. Only override this if you have a specific need", "authentication": "authentication allows configuration of authentication for the endpoints", "authorization": "authorization allows configuration of authentication for the endpoints", @@ -150,8 +150,8 @@ func (GenericControllerConfig) SwaggerDoc() map[string]string { var map_HTTPServingInfo = map[string]string{ "": "HTTPServingInfo holds configuration for serving HTTP", - "maxRequestsInFlight": "MaxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit.", - "requestTimeoutSeconds": "RequestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if -1 there is no limit on requests.", + "maxRequestsInFlight": "maxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit.", + "requestTimeoutSeconds": "requestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if -1 there is no limit on requests.", } func (HTTPServingInfo) SwaggerDoc() map[string]string { @@ -181,9 +181,19 @@ func (LeaderElection) SwaggerDoc() map[string]string { return map_LeaderElection } +var map_MaxAgePolicy = map[string]string{ + "": "MaxAgePolicy contains a numeric range for specifying a compliant HSTS max-age for the enclosing RequiredHSTSPolicy", + "largestMaxAge": "The largest allowed value (in seconds) of the RequiredHSTSPolicy max-age This value can be left unspecified, in which case no upper limit is enforced.", + "smallestMaxAge": "The smallest allowed value (in seconds) of the RequiredHSTSPolicy max-age Setting max-age=0 allows the deletion of an existing HSTS header from a host. This is a necessary tool for administrators to quickly correct mistakes. This value can be left unspecified, in which case no lower limit is enforced.", +} + +func (MaxAgePolicy) SwaggerDoc() map[string]string { + return map_MaxAgePolicy +} + var map_NamedCertificate = map[string]string{ "": "NamedCertificate specifies a certificate/key, and the names it should be served for", - "names": "Names is a list of DNS names this certificate should be used to secure A name can be a normal DNS name, or can contain leading wildcard segments.", + "names": "names is a list of DNS names this certificate should be used to secure A name can be a normal DNS name, or can contain leading wildcard segments.", } func (NamedCertificate) SwaggerDoc() map[string]string { @@ -192,14 +202,26 @@ func (NamedCertificate) SwaggerDoc() map[string]string { var map_RemoteConnectionInfo = map[string]string{ "": "RemoteConnectionInfo holds information necessary for establishing a remote connection", - "url": "URL is the remote URL to connect to", - "ca": "CA is the CA for verifying TLS connections", + "url": "url is the remote URL to connect to", + "ca": "ca is the CA for verifying TLS connections", } func (RemoteConnectionInfo) SwaggerDoc() map[string]string { return map_RemoteConnectionInfo } +var map_RequiredHSTSPolicy = map[string]string{ + "namespaceSelector": "namespaceSelector specifies a label selector such that the policy applies only to those routes that are in namespaces with labels that match the selector, and are in one of the DomainPatterns. Defaults to the empty LabelSelector, which matches everything.", + "domainPatterns": "domainPatterns is a list of domains for which the desired HSTS annotations are required. If domainPatterns is specified and a route is created with a spec.host matching one of the domains, the route must specify the HSTS Policy components described in the matching RequiredHSTSPolicy.\n\nThe use of wildcards is allowed like this: *.foo.com matches everything under foo.com. foo.com only matches foo.com, so to cover foo.com and everything under it, you must specify *both*.", + "maxAge": "maxAge is the delta time range in seconds during which hosts are regarded as HSTS hosts. If set to 0, it negates the effect, and hosts are removed as HSTS hosts. If set to 0 and includeSubdomains is specified, all subdomains of the host are also removed as HSTS hosts. maxAge is a time-to-live value, and if this policy is not refreshed on a client, the HSTS policy will eventually expire on that client.", + "preloadPolicy": "preloadPolicy directs the client to include hosts in its host preload list so that it never needs to do an initial load to get the HSTS header (note that this is not defined in RFC 6797 and is therefore client implementation-dependent).", + "includeSubDomainsPolicy": "includeSubDomainsPolicy means the HSTS Policy should apply to any subdomains of the host's domain name. Thus, for the host bar.foo.com, if includeSubDomainsPolicy was set to RequireIncludeSubDomains: - the host app.bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host foo.com would NOT inherit the HSTS Policy of bar.foo.com - the host def.foo.com would NOT inherit the HSTS Policy of bar.foo.com", +} + +func (RequiredHSTSPolicy) SwaggerDoc() map[string]string { + return map_RequiredHSTSPolicy +} + var map_SecretNameReference = map[string]string{ "": "SecretNameReference references a secret in a specific namespace. The namespace must be specified at the point of use.", "name": "name is the metadata.name of the referenced secret", @@ -211,12 +233,12 @@ func (SecretNameReference) SwaggerDoc() map[string]string { var map_ServingInfo = map[string]string{ "": "ServingInfo holds information about serving web pages", - "bindAddress": "BindAddress is the ip:port to serve on", - "bindNetwork": "BindNetwork is the type of network to bind to - defaults to \"tcp4\", accepts \"tcp\", \"tcp4\", and \"tcp6\"", - "clientCA": "ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates", - "namedCertificates": "NamedCertificates is a list of certificates to use to secure requests to specific hostnames", - "minTLSVersion": "MinTLSVersion is the minimum TLS version supported. Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants", - "cipherSuites": "CipherSuites contains an overridden list of ciphers for the server to support. Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants", + "bindAddress": "bindAddress is the ip:port to serve on", + "bindNetwork": "bindNetwork is the type of network to bind to - defaults to \"tcp4\", accepts \"tcp\", \"tcp4\", and \"tcp6\"", + "clientCA": "clientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates", + "namedCertificates": "namedCertificates is a list of certificates to use to secure requests to specific hostnames", + "minTLSVersion": "minTLSVersion is the minimum TLS version supported. Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants", + "cipherSuites": "cipherSuites contains an overridden list of ciphers for the server to support. Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants", } func (ServingInfo) SwaggerDoc() map[string]string { @@ -233,10 +255,10 @@ func (StringSource) SwaggerDoc() map[string]string { var map_StringSourceSpec = map[string]string{ "": "StringSourceSpec specifies a string value, or external location", - "value": "Value specifies the cleartext value, or an encrypted value if keyFile is specified.", - "env": "Env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified.", - "file": "File references a file containing the cleartext value, or an encrypted value if a keyFile is specified.", - "keyFile": "KeyFile references a file containing the key to use to decrypt the value.", + "value": "value specifies the cleartext value, or an encrypted value if keyFile is specified.", + "env": "env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified.", + "file": "file references a file containing the cleartext value, or an encrypted value if a keyFile is specified.", + "keyFile": "keyFile references a file containing the key to use to decrypt the value.", } func (StringSourceSpec) SwaggerDoc() map[string]string { @@ -244,9 +266,10 @@ func (StringSourceSpec) SwaggerDoc() map[string]string { } var map_APIServer = map[string]string{ - "": "APIServer holds configuration (like serving certificates, client CA and CORS domains) shared by all API servers in the system, among them especially kube-apiserver and openshift-apiserver. The canonical name of an instance is 'cluster'.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "APIServer holds configuration (like serving certificates, client CA and CORS domains) shared by all API servers in the system, among them especially kube-apiserver and openshift-apiserver. The canonical name of an instance is 'cluster'.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (APIServer) SwaggerDoc() map[string]string { @@ -254,13 +277,24 @@ func (APIServer) SwaggerDoc() map[string]string { } var map_APIServerEncryption = map[string]string{ + "": "APIServerEncryption is used to encrypt sensitive resources on the cluster.", "type": "type defines what encryption type should be used to encrypt resources at the datastore layer. When this field is unset (i.e. when it is set to the empty string), identity is implied. The behavior of unset can and will change over time. Even if encryption is enabled by default, the meaning of unset may change to a different encryption type based on changes in best practices.\n\nWhen encryption is enabled, all sensitive resources shipped with the platform are encrypted. This list of sensitive resources can and will change over time. The current authoritative list is:\n\n 1. secrets\n 2. configmaps\n 3. routes.route.openshift.io\n 4. oauthaccesstokens.oauth.openshift.io\n 5. oauthauthorizetokens.oauth.openshift.io", + "kms": "kms defines the configuration for the external KMS instance that manages the encryption keys, when KMS encryption is enabled sensitive resources will be encrypted using keys managed by an externally configured KMS instance.\n\nThe Key Management Service (KMS) instance provides symmetric encryption and is responsible for managing the lifecyle of the encryption keys outside of the control plane. This allows integration with an external provider to manage the data encryption keys securely.", } func (APIServerEncryption) SwaggerDoc() map[string]string { return map_APIServerEncryption } +var map_APIServerList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (APIServerList) SwaggerDoc() map[string]string { + return map_APIServerList +} + var map_APIServerNamedServingCert = map[string]string{ "": "APIServerNamedServingCert maps a server DNS name, as understood by a client, to a certificate.", "names": "names is a optional list of explicit DNS names (leading wildcards allowed) that should use this certificate to serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names.", @@ -284,7 +318,7 @@ var map_APIServerSpec = map[string]string{ "clientCA": "clientCA references a ConfigMap containing a certificate bundle for the signers that will be recognized for incoming client certificates in addition to the operator managed signers. If this is empty, then only operator managed signers are valid. You usually only have to set this if you have your own PKI you wish to honor client certificates from. The ConfigMap must exist in the openshift-config namespace and contain the following required fields: - ConfigMap.Data[\"ca-bundle.crt\"] - CA bundle.", "additionalCORSAllowedOrigins": "additionalCORSAllowedOrigins lists additional, user-defined regular expressions describing hosts for which the API server allows access using the CORS headers. This may be needed to access the API and the integrated OAuth server from JavaScript applications. The values are regular expressions that correspond to the Golang regular expression language.", "encryption": "encryption allows the configuration of encryption of resources at the datastore layer.", - "tlsSecurityProfile": "tlsSecurityProfile specifies settings for TLS connections for externally exposed servers.\n\nIf unset, a default (which may change between releases) is chosen. Note that only Old and Intermediate profiles are currently supported, and the maximum available MinTLSVersions is VersionTLS12.", + "tlsSecurityProfile": "tlsSecurityProfile specifies settings for TLS connections for externally exposed servers.\n\nWhen omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. The current default is the Intermediate profile.", "audit": "audit specifies the settings for audit configuration to be applied to all OpenShift-provided API servers in the cluster.", } @@ -293,29 +327,51 @@ func (APIServerSpec) SwaggerDoc() map[string]string { } var map_Audit = map[string]string{ - "profile": "profile specifies the name of the desired audit policy configuration to be deployed to all OpenShift-provided API servers in the cluster.\n\nThe following profiles are provided: - Default: the existing default policy. - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list).\n\nIf unset, the 'Default' profile is used as the default.", + "profile": "profile specifies the name of the desired top-level audit profile to be applied to all requests sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, openshift-apiserver and oauth-apiserver), with the exception of those requests that match one or more of the customRules.\n\nThe following profiles are provided: - Default: default policy which means MetaData level logging with the exception of events\n (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody\n level).\n- WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens.\n\nWarning: It is not recommended to disable audit logging by using the `None` profile unless you are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. If you disable audit logging and a support situation arises, you might need to enable audit logging and reproduce the issue in order to troubleshoot properly.\n\nIf unset, the 'Default' profile is used as the default.", + "customRules": "customRules specify profiles per group. These profile take precedence over the top-level profile field if they apply. They are evaluation from top to bottom and the first one that matches, applies.", } func (Audit) SwaggerDoc() map[string]string { return map_Audit } +var map_AuditCustomRule = map[string]string{ + "": "AuditCustomRule describes a custom rule for an audit profile that takes precedence over the top-level profile.", + "group": "group is a name of group a request user must be member of in order to this profile to apply.", + "profile": "profile specifies the name of the desired audit policy configuration to be deployed to all OpenShift-provided API servers in the cluster.\n\nThe following profiles are provided: - Default: the existing default policy. - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens.\n\nIf unset, the 'Default' profile is used as the default.", +} + +func (AuditCustomRule) SwaggerDoc() map[string]string { + return map_AuditCustomRule +} + var map_Authentication = map[string]string{ - "": "Authentication specifies cluster-wide settings for authentication (like OAuth and webhook token authenticators). The canonical name of an instance is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Authentication specifies cluster-wide settings for authentication (like OAuth and webhook token authenticators). The canonical name of an instance is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Authentication) SwaggerDoc() map[string]string { return map_Authentication } +var map_AuthenticationList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (AuthenticationList) SwaggerDoc() map[string]string { + return map_AuthenticationList +} + var map_AuthenticationSpec = map[string]string{ "type": "type identifies the cluster managed, user facing authentication mode in use. Specifically, it manages the component that responds to login attempts. The default is IntegratedOAuth.", "oauthMetadata": "oauthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for an external OAuth server. This discovery document can be viewed from its served location: oc get --raw '/.well-known/oauth-authorization-server' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 If oauthMetadata.name is non-empty, this value has precedence over any metadata reference stored in status. The key \"oauthMetadata\" is used to locate the data. If specified and the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config.", "webhookTokenAuthenticators": "webhookTokenAuthenticators is DEPRECATED, setting it has no effect.", - "webhookTokenAuthenticator": "webhookTokenAuthenticator configures a remote token reviewer. These remote authentication webhooks can be used to verify bearer tokens via the tokenreviews.authentication.k8s.io REST API. This is required to honor bearer tokens that are provisioned by an external authentication service.", - "serviceAccountIssuer": "serviceAccountIssuer is the identifier of the bound service account token issuer. The default is https://kubernetes.default.svc WARNING: Updating this field will result in the invalidation of all bound tokens with the previous issuer value. Unless the holder of a bound token has explicit support for a change in issuer, they will not request a new bound token until pod restart or until their existing token exceeds 80% of its duration.", + "webhookTokenAuthenticator": "webhookTokenAuthenticator configures a remote token reviewer. These remote authentication webhooks can be used to verify bearer tokens via the tokenreviews.authentication.k8s.io REST API. This is required to honor bearer tokens that are provisioned by an external authentication service.\n\nCan only be set if \"Type\" is set to \"None\".", + "serviceAccountIssuer": "serviceAccountIssuer is the identifier of the bound service account token issuer. The default is https://kubernetes.default.svc WARNING: Updating this field will not result in immediate invalidation of all bound tokens with the previous issuer value. Instead, the tokens issued by previous service account issuer will continue to be trusted for a time period chosen by the platform (currently set to 24h). This time period is subject to change over time. This allows internal components to transition to use new service account issuer without service distruption.", + "oidcProviders": "oidcProviders are OIDC identity providers that can issue tokens for this cluster Can only be set if \"Type\" is set to \"OIDC\".\n\nAt most one provider can be configured.", } func (AuthenticationSpec) SwaggerDoc() map[string]string { @@ -324,6 +380,7 @@ func (AuthenticationSpec) SwaggerDoc() map[string]string { var map_AuthenticationStatus = map[string]string{ "integratedOAuthMetadata": "integratedOAuthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for the in-cluster integrated OAuth server. This discovery document can be viewed from its served location: oc get --raw '/.well-known/oauth-authorization-server' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 This contains the observed value based on cluster state. An explicitly set value in spec.oauthMetadata has precedence over this field. This field has no meaning if authentication spec.type is not set to IntegratedOAuth. The key \"oauthMetadata\" is used to locate the data. If the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config-managed.", + "oidcClients": "oidcClients is where participating operators place the current OIDC client status for OIDC clients that can be customized by the cluster-admin.", } func (AuthenticationStatus) SwaggerDoc() map[string]string { @@ -339,6 +396,151 @@ func (DeprecatedWebhookTokenAuthenticator) SwaggerDoc() map[string]string { return map_DeprecatedWebhookTokenAuthenticator } +var map_ExtraMapping = map[string]string{ + "": "ExtraMapping allows specifying a key and CEL expression to evaluate the keys' value. It is used to create additional mappings and attributes added to a cluster identity from a provided authentication token.", + "key": "key is a required field that specifies the string to use as the extra attribute key.\n\nkey must be a domain-prefix path (e.g 'example.org/foo'). key must not exceed 510 characters in length. key must contain the '/' character, separating the domain and path characters. key must not be empty.\n\nThe domain portion of the key (string of characters prior to the '/') must be a valid RFC1123 subdomain. It must not exceed 253 characters in length. It must start and end with an alphanumeric character. It must only contain lower case alphanumeric characters and '-' or '.'. It must not use the reserved domains, or be subdomains of, \"kubernetes.io\", \"k8s.io\", and \"openshift.io\".\n\nThe path portion of the key (string of characters after the '/') must not be empty and must consist of at least one alphanumeric character, percent-encoded octets, '-', '.', '_', '~', '!', '$', '&', ''', '(', ')', '*', '+', ',', ';', '=', and ':'. It must not exceed 256 characters in length.", + "valueExpression": "valueExpression is a required field to specify the CEL expression to extract the extra attribute value from a JWT token's claims. valueExpression must produce a string or string array value. \"\", [], and null are treated as the extra mapping not being present. Empty string values within an array are filtered out.\n\nCEL expressions have access to the token claims through a CEL variable, 'claims'. 'claims' is a map of claim names to claim values. For example, the 'sub' claim value can be accessed as 'claims.sub'. Nested claims can be accessed using dot notation ('claims.foo.bar').\n\nvalueExpression must not exceed 1024 characters in length. valueExpression must not be empty.", +} + +func (ExtraMapping) SwaggerDoc() map[string]string { + return map_ExtraMapping +} + +var map_OIDCClientConfig = map[string]string{ + "": "OIDCClientConfig configures how platform clients interact with identity providers as an authentication method", + "componentName": "componentName is a required field that specifies the name of the platform component being configured to use the identity provider as an authentication mode. It is used in combination with componentNamespace as a unique identifier.\n\ncomponentName must not be an empty string (\"\") and must not exceed 256 characters in length.", + "componentNamespace": "componentNamespace is a required field that specifies the namespace in which the platform component being configured to use the identity provider as an authentication mode is running. It is used in combination with componentName as a unique identifier.\n\ncomponentNamespace must not be an empty string (\"\") and must not exceed 63 characters in length.", + "clientID": "clientID is a required field that configures the client identifier, from the identity provider, that the platform component uses for authentication requests made to the identity provider. The identity provider must accept this identifier for platform components to be able to use the identity provider as an authentication mode.\n\nclientID must not be an empty string (\"\").", + "clientSecret": "clientSecret is an optional field that configures the client secret used by the platform component when making authentication requests to the identity provider.\n\nWhen not specified, no client secret will be used when making authentication requests to the identity provider.\n\nWhen specified, clientSecret references a Secret in the 'openshift-config' namespace that contains the client secret in the 'clientSecret' key of the '.data' field. The client secret will be used when making authentication requests to the identity provider.\n\nPublic clients do not require a client secret but private clients do require a client secret to work with the identity provider.", + "extraScopes": "extraScopes is an optional field that configures the extra scopes that should be requested by the platform component when making authentication requests to the identity provider. This is useful if you have configured claim mappings that requires specific scopes to be requested beyond the standard OIDC scopes.\n\nWhen omitted, no additional scopes are requested.", +} + +func (OIDCClientConfig) SwaggerDoc() map[string]string { + return map_OIDCClientConfig +} + +var map_OIDCClientReference = map[string]string{ + "": "OIDCClientReference is a reference to a platform component client configuration.", + "oidcProviderName": "oidcProviderName is a required reference to the 'name' of the identity provider configured in 'oidcProviders' that this client is associated with.\n\noidcProviderName must not be an empty string (\"\").", + "issuerURL": "issuerURL is a required field that specifies the URL of the identity provider that this client is configured to make requests against.\n\nissuerURL must use the 'https' scheme.", + "clientID": "clientID is a required field that specifies the client identifier, from the identity provider, that the platform component is using for authentication requests made to the identity provider.\n\nclientID must not be empty.", +} + +func (OIDCClientReference) SwaggerDoc() map[string]string { + return map_OIDCClientReference +} + +var map_OIDCClientStatus = map[string]string{ + "": "OIDCClientStatus represents the current state of platform components and how they interact with the configured identity providers.", + "componentName": "componentName is a required field that specifies the name of the platform component using the identity provider as an authentication mode. It is used in combination with componentNamespace as a unique identifier.\n\ncomponentName must not be an empty string (\"\") and must not exceed 256 characters in length.", + "componentNamespace": "componentNamespace is a required field that specifies the namespace in which the platform component using the identity provider as an authentication mode is running. It is used in combination with componentName as a unique identifier.\n\ncomponentNamespace must not be an empty string (\"\") and must not exceed 63 characters in length.", + "currentOIDCClients": "currentOIDCClients is an optional list of clients that the component is currently using. Entries must have unique issuerURL/clientID pairs.", + "consumingUsers": "consumingUsers is an optional list of ServiceAccounts requiring read permissions on the `clientSecret` secret.\n\nconsumingUsers must not exceed 5 entries.", + "conditions": "conditions are used to communicate the state of the `oidcClients` entry.\n\nSupported conditions include Available, Degraded and Progressing.\n\nIf Available is true, the component is successfully using the configured client. If Degraded is true, that means something has gone wrong trying to handle the client configuration. If Progressing is true, that means the component is taking some action related to the `oidcClients` entry.", +} + +func (OIDCClientStatus) SwaggerDoc() map[string]string { + return map_OIDCClientStatus +} + +var map_OIDCProvider = map[string]string{ + "name": "name is a required field that configures the unique human-readable identifier associated with the identity provider. It is used to distinguish between multiple identity providers and has no impact on token validation or authentication mechanics.\n\nname must not be an empty string (\"\").", + "issuer": "issuer is a required field that configures how the platform interacts with the identity provider and how tokens issued from the identity provider are evaluated by the Kubernetes API server.", + "oidcClients": "oidcClients is an optional field that configures how on-cluster, platform clients should request tokens from the identity provider. oidcClients must not exceed 20 entries and entries must have unique namespace/name pairs.", + "claimMappings": "claimMappings is a required field that configures the rules to be used by the Kubernetes API server for translating claims in a JWT token, issued by the identity provider, to a cluster identity.", + "claimValidationRules": "claimValidationRules is an optional field that configures the rules to be used by the Kubernetes API server for validating the claims in a JWT token issued by the identity provider.\n\nValidation rules are joined via an AND operation.", +} + +func (OIDCProvider) SwaggerDoc() map[string]string { + return map_OIDCProvider +} + +var map_PrefixedClaimMapping = map[string]string{ + "": "PrefixedClaimMapping configures a claim mapping that allows for an optional prefix.", + "prefix": "prefix is an optional field that configures the prefix that will be applied to the cluster identity attribute during the process of mapping JWT claims to cluster identity attributes.\n\nWhen omitted (\"\"), no prefix is applied to the cluster identity attribute.\n\nExample: if `prefix` is set to \"myoidc:\" and the `claim` in JWT contains an array of strings \"a\", \"b\" and \"c\", the mapping will result in an array of string \"myoidc:a\", \"myoidc:b\" and \"myoidc:c\".", +} + +func (PrefixedClaimMapping) SwaggerDoc() map[string]string { + return map_PrefixedClaimMapping +} + +var map_TokenClaimMapping = map[string]string{ + "": "TokenClaimMapping allows specifying a JWT token claim to be used when mapping claims from an authentication token to cluster identities.", + "claim": "claim is a required field that configures the JWT token claim whose value is assigned to the cluster identity field associated with this mapping.", +} + +func (TokenClaimMapping) SwaggerDoc() map[string]string { + return map_TokenClaimMapping +} + +var map_TokenClaimMappings = map[string]string{ + "username": "username is a required field that configures how the username of a cluster identity should be constructed from the claims in a JWT token issued by the identity provider.", + "groups": "groups is an optional field that configures how the groups of a cluster identity should be constructed from the claims in a JWT token issued by the identity provider. When referencing a claim, if the claim is present in the JWT token, its value must be a list of groups separated by a comma (','). For example - '\"example\"' and '\"exampleOne\", \"exampleTwo\", \"exampleThree\"' are valid claim values.", + "uid": "uid is an optional field for configuring the claim mapping used to construct the uid for the cluster identity.\n\nWhen using uid.claim to specify the claim it must be a single string value. When using uid.expression the expression must result in a single string value.\n\nWhen omitted, this means the user has no opinion and the platform is left to choose a default, which is subject to change over time. The current default is to use the 'sub' claim.", + "extra": "extra is an optional field for configuring the mappings used to construct the extra attribute for the cluster identity. When omitted, no extra attributes will be present on the cluster identity. key values for extra mappings must be unique. A maximum of 32 extra attribute mappings may be provided.", +} + +func (TokenClaimMappings) SwaggerDoc() map[string]string { + return map_TokenClaimMappings +} + +var map_TokenClaimOrExpressionMapping = map[string]string{ + "": "TokenClaimOrExpressionMapping allows specifying either a JWT token claim or CEL expression to be used when mapping claims from an authentication token to cluster identities.", + "claim": "claim is an optional field for specifying the JWT token claim that is used in the mapping. The value of this claim will be assigned to the field in which this mapping is associated.\n\nPrecisely one of claim or expression must be set. claim must not be specified when expression is set. When specified, claim must be at least 1 character in length and must not exceed 256 characters in length.", + "expression": "expression is an optional field for specifying a CEL expression that produces a string value from JWT token claims.\n\nCEL expressions have access to the token claims through a CEL variable, 'claims'. 'claims' is a map of claim names to claim values. For example, the 'sub' claim value can be accessed as 'claims.sub'. Nested claims can be accessed using dot notation ('claims.foo.bar').\n\nPrecisely one of claim or expression must be set. expression must not be specified when claim is set. When specified, expression must be at least 1 character in length and must not exceed 1024 characters in length.", +} + +func (TokenClaimOrExpressionMapping) SwaggerDoc() map[string]string { + return map_TokenClaimOrExpressionMapping +} + +var map_TokenClaimValidationRule = map[string]string{ + "type": "type is an optional field that configures the type of the validation rule.\n\nAllowed values are 'RequiredClaim' and omitted (not provided or an empty string).\n\nWhen set to 'RequiredClaim', the Kubernetes API server will be configured to validate that the incoming JWT contains the required claim and that its value matches the required value.\n\nDefaults to 'RequiredClaim'.", + "requiredClaim": "requiredClaim is an optional field that configures the required claim and value that the Kubernetes API server will use to validate if an incoming JWT is valid for this identity provider.", +} + +func (TokenClaimValidationRule) SwaggerDoc() map[string]string { + return map_TokenClaimValidationRule +} + +var map_TokenIssuer = map[string]string{ + "issuerURL": "issuerURL is a required field that configures the URL used to issue tokens by the identity provider. The Kubernetes API server determines how authentication tokens should be handled by matching the 'iss' claim in the JWT to the issuerURL of configured identity providers.\n\nMust be at least 1 character and must not exceed 512 characters in length. Must be a valid URL that uses the 'https' scheme and does not contain a query, fragment or user.", + "audiences": "audiences is a required field that configures the acceptable audiences the JWT token, issued by the identity provider, must be issued to. At least one of the entries must match the 'aud' claim in the JWT token.\n\naudiences must contain at least one entry and must not exceed ten entries.", + "issuerCertificateAuthority": "issuerCertificateAuthority is an optional field that configures the certificate authority, used by the Kubernetes API server, to validate the connection to the identity provider when fetching discovery information.\n\nWhen not specified, the system trust is used.\n\nWhen specified, it must reference a ConfigMap in the openshift-config namespace containing the PEM-encoded CA certificates under the 'ca-bundle.crt' key in the data field of the ConfigMap.", +} + +func (TokenIssuer) SwaggerDoc() map[string]string { + return map_TokenIssuer +} + +var map_TokenRequiredClaim = map[string]string{ + "claim": "claim is a required field that configures the name of the required claim. When taken from the JWT claims, claim must be a string value.\n\nclaim must not be an empty string (\"\").", + "requiredValue": "requiredValue is a required field that configures the value that 'claim' must have when taken from the incoming JWT claims. If the value in the JWT claims does not match, the token will be rejected for authentication.\n\nrequiredValue must not be an empty string (\"\").", +} + +func (TokenRequiredClaim) SwaggerDoc() map[string]string { + return map_TokenRequiredClaim +} + +var map_UsernameClaimMapping = map[string]string{ + "claim": "claim is a required field that configures the JWT token claim whose value is assigned to the cluster identity field associated with this mapping.\n\nclaim must not be an empty string (\"\") and must not exceed 256 characters.", + "prefixPolicy": "prefixPolicy is an optional field that configures how a prefix should be applied to the value of the JWT claim specified in the 'claim' field.\n\nAllowed values are 'Prefix', 'NoPrefix', and omitted (not provided or an empty string).\n\nWhen set to 'Prefix', the value specified in the prefix field will be prepended to the value of the JWT claim. The prefix field must be set when prefixPolicy is 'Prefix'.\n\nWhen set to 'NoPrefix', no prefix will be prepended to the value of the JWT claim.\n\nWhen omitted, this means no opinion and the platform is left to choose any prefixes that are applied which is subject to change over time. Currently, the platform prepends `{issuerURL}#` to the value of the JWT claim when the claim is not 'email'. As an example, consider the following scenario:\n `prefix` is unset, `issuerURL` is set to `https://myoidc.tld`,\n the JWT claims include \"username\":\"userA\" and \"email\":\"userA@myoidc.tld\",\n and `claim` is set to:\n - \"username\": the mapped value will be \"https://myoidc.tld#userA\"\n - \"email\": the mapped value will be \"userA@myoidc.tld\"", + "prefix": "prefix configures the prefix that should be prepended to the value of the JWT claim.\n\nprefix must be set when prefixPolicy is set to 'Prefix' and must be unset otherwise.", +} + +func (UsernameClaimMapping) SwaggerDoc() map[string]string { + return map_UsernameClaimMapping +} + +var map_UsernamePrefix = map[string]string{ + "": "UsernamePrefix configures the string that should be used as a prefix for username claim mappings.", + "prefixString": "prefixString is a required field that configures the prefix that will be applied to cluster identity username attribute during the process of mapping JWT claims to cluster identity attributes.\n\nprefixString must not be an empty string (\"\").", +} + +func (UsernamePrefix) SwaggerDoc() map[string]string { + return map_UsernamePrefix +} + var map_WebhookTokenAuthenticator = map[string]string{ "": "webhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator", "kubeConfig": "kubeConfig references a secret that contains kube config file data which describes how to access the remote webhook service. The namespace for the referenced secret is openshift-config.\n\nFor further details, see:\n\nhttps://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication\n\nThe key \"kubeConfig\" is used to locate the data. If the secret or expected key is not found, the webhook is not honored. If the specified kube config data is not valid, the webhook is not honored.", @@ -349,8 +551,9 @@ func (WebhookTokenAuthenticator) SwaggerDoc() map[string]string { } var map_Build = map[string]string{ - "": "Build configures the behavior of OpenShift builds for the entire cluster. This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds.\n\nThe canonical name is \"cluster\"", - "spec": "Spec holds user-settable values for the build controller configuration", + "": "Build configures the behavior of OpenShift builds for the entire cluster. This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds.\n\nThe canonical name is \"cluster\"\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user-settable values for the build controller configuration", } func (Build) SwaggerDoc() map[string]string { @@ -358,22 +561,31 @@ func (Build) SwaggerDoc() map[string]string { } var map_BuildDefaults = map[string]string{ - "defaultProxy": "DefaultProxy contains the default proxy settings for all build operations, including image pull/push and source download.\n\nValues can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build config's strategy.", - "gitProxy": "GitProxy contains the proxy settings for git operations only. If set, this will override any Proxy settings for all git commands, such as git clone.\n\nValues that are not set here will be inherited from DefaultProxy.", - "env": "Env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build", - "imageLabels": "ImageLabels is a list of docker labels that are applied to the resulting image. User can override a default label by providing a label with the same name in their Build/BuildConfig.", - "resources": "Resources defines resource requirements to execute the build.", + "defaultProxy": "defaultProxy contains the default proxy settings for all build operations, including image pull/push and source download.\n\nValues can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build config's strategy.", + "gitProxy": "gitProxy contains the proxy settings for git operations only. If set, this will override any Proxy settings for all git commands, such as git clone.\n\nValues that are not set here will be inherited from DefaultProxy.", + "env": "env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build", + "imageLabels": "imageLabels is a list of docker labels that are applied to the resulting image. User can override a default label by providing a label with the same name in their Build/BuildConfig.", + "resources": "resources defines resource requirements to execute the build.", } func (BuildDefaults) SwaggerDoc() map[string]string { return map_BuildDefaults } +var map_BuildList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (BuildList) SwaggerDoc() map[string]string { + return map_BuildList +} + var map_BuildOverrides = map[string]string{ - "imageLabels": "ImageLabels is a list of docker labels that are applied to the resulting image. If user provided a label in their Build/BuildConfig with the same name as one in this list, the user's label will be overwritten.", - "nodeSelector": "NodeSelector is a selector which must be true for the build pod to fit on a node", - "tolerations": "Tolerations is a list of Tolerations that will override any existing tolerations set on a build pod.", - "forcePull": "ForcePull overrides, if set, the equivalent value in the builds, i.e. false disables force pull for all builds, true enables force pull for all builds, independently of what each build specifies itself", + "imageLabels": "imageLabels is a list of docker labels that are applied to the resulting image. If user provided a label in their Build/BuildConfig with the same name as one in this list, the user's label will be overwritten.", + "nodeSelector": "nodeSelector is a selector which must be true for the build pod to fit on a node", + "tolerations": "tolerations is a list of Tolerations that will override any existing tolerations set on a build pod.", + "forcePull": "forcePull overrides, if set, the equivalent value in the builds, i.e. false disables force pull for all builds, true enables force pull for all builds, independently of what each build specifies itself", } func (BuildOverrides) SwaggerDoc() map[string]string { @@ -381,9 +593,9 @@ func (BuildOverrides) SwaggerDoc() map[string]string { } var map_BuildSpec = map[string]string{ - "additionalTrustedCA": "AdditionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted for image pushes and pulls during builds. The namespace for this config map is openshift-config.\n\nDEPRECATED: Additional CAs for image pull and push should be set on image.config.openshift.io/cluster instead.", - "buildDefaults": "BuildDefaults controls the default information for Builds", - "buildOverrides": "BuildOverrides controls override settings for builds", + "additionalTrustedCA": "additionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted for image pushes and pulls during builds. The namespace for this config map is openshift-config.\n\nDEPRECATED: Additional CAs for image pull and push should be set on image.config.openshift.io/cluster instead.", + "buildDefaults": "buildDefaults controls the default information for Builds", + "buildOverrides": "buildOverrides controls override settings for builds", } func (BuildSpec) SwaggerDoc() map[string]string { @@ -391,18 +603,58 @@ func (BuildSpec) SwaggerDoc() map[string]string { } var map_ImageLabel = map[string]string{ - "name": "Name defines the name of the label. It must have non-zero length.", - "value": "Value defines the literal value of the label.", + "name": "name defines the name of the label. It must have non-zero length.", + "value": "value defines the literal value of the label.", } func (ImageLabel) SwaggerDoc() map[string]string { return map_ImageLabel } +var map_ClusterImagePolicy = map[string]string{ + "": "ClusterImagePolicy holds cluster-wide configuration for image signature verification\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec contains the configuration for the cluster image policy.", + "status": "status contains the observed state of the resource.", +} + +func (ClusterImagePolicy) SwaggerDoc() map[string]string { + return map_ClusterImagePolicy +} + +var map_ClusterImagePolicyList = map[string]string{ + "": "ClusterImagePolicyList is a list of ClusterImagePolicy resources\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is a list of ClusterImagePolices", +} + +func (ClusterImagePolicyList) SwaggerDoc() map[string]string { + return map_ClusterImagePolicyList +} + +var map_ClusterImagePolicySpec = map[string]string{ + "": "CLusterImagePolicySpec is the specification of the ClusterImagePolicy custom resource.", + "scopes": "scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker", + "policy": "policy is a required field that contains configuration to allow scopes to be verified, and defines how images not matching the verification policy will be treated.", +} + +func (ClusterImagePolicySpec) SwaggerDoc() map[string]string { + return map_ClusterImagePolicySpec +} + +var map_ClusterImagePolicyStatus = map[string]string{ + "conditions": "conditions provide details on the status of this API Resource.", +} + +func (ClusterImagePolicyStatus) SwaggerDoc() map[string]string { + return map_ClusterImagePolicyStatus +} + var map_ClusterOperator = map[string]string{ - "": "ClusterOperator is the Custom Resource object which holds the current state of an operator. This object is used by operators to convey their state to the rest of the cluster.", - "spec": "spec holds configuration that could apply to any operator.", - "status": "status holds the information about the state of an operator. It is consistent with status information across the Kubernetes ecosystem.", + "": "ClusterOperator holds the status of a core or optional OpenShift component managed by the Cluster Version Operator (CVO). This object is used by operators to convey their state to the rest of the cluster. Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds configuration that could apply to any operator.", + "status": "status holds the information about the state of an operator. It is consistent with status information across the Kubernetes ecosystem.", } func (ClusterOperator) SwaggerDoc() map[string]string { @@ -410,7 +662,8 @@ func (ClusterOperator) SwaggerDoc() map[string]string { } var map_ClusterOperatorList = map[string]string{ - "": "ClusterOperatorList is a list of OperatorStatus resources.", + "": "ClusterOperatorList is a list of OperatorStatus resources.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (ClusterOperatorList) SwaggerDoc() map[string]string { @@ -471,18 +724,50 @@ func (OperandVersion) SwaggerDoc() map[string]string { return map_OperandVersion } +var map_ClusterCondition = map[string]string{ + "": "ClusterCondition is a union of typed cluster conditions. The 'type' property determines which of the type-specific properties are relevant. When evaluated on a cluster, the condition may match, not match, or fail to evaluate.", + "type": "type represents the cluster-condition type. This defines the members and semantics of any additional properties.", + "promql": "promql represents a cluster condition based on PromQL.", +} + +func (ClusterCondition) SwaggerDoc() map[string]string { + return map_ClusterCondition +} + var map_ClusterVersion = map[string]string{ - "": "ClusterVersion is the configuration for the ClusterVersionOperator. This is where parameters related to automatic updates can be set.", - "spec": "spec is the desired state of the cluster version - the operator will work to ensure that the desired version is applied to the cluster.", - "status": "status contains information about the available updates and any in-progress updates.", + "": "ClusterVersion is the configuration for the ClusterVersionOperator. This is where parameters related to automatic updates can be set.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec is the desired state of the cluster version - the operator will work to ensure that the desired version is applied to the cluster.", + "status": "status contains information about the available updates and any in-progress updates.", } func (ClusterVersion) SwaggerDoc() map[string]string { return map_ClusterVersion } +var map_ClusterVersionCapabilitiesSpec = map[string]string{ + "": "ClusterVersionCapabilitiesSpec selects the managed set of optional, core cluster components.", + "baselineCapabilitySet": "baselineCapabilitySet selects an initial set of optional capabilities to enable, which can be extended via additionalEnabledCapabilities. If unset, the cluster will choose a default, and the default may change over time. The current default is vCurrent.", + "additionalEnabledCapabilities": "additionalEnabledCapabilities extends the set of managed capabilities beyond the baseline defined in baselineCapabilitySet. The default is an empty set.", +} + +func (ClusterVersionCapabilitiesSpec) SwaggerDoc() map[string]string { + return map_ClusterVersionCapabilitiesSpec +} + +var map_ClusterVersionCapabilitiesStatus = map[string]string{ + "": "ClusterVersionCapabilitiesStatus describes the state of optional, core cluster components.", + "enabledCapabilities": "enabledCapabilities lists all the capabilities that are currently managed.", + "knownCapabilities": "knownCapabilities lists all the capabilities known to the current cluster.", +} + +func (ClusterVersionCapabilitiesStatus) SwaggerDoc() map[string]string { + return map_ClusterVersionCapabilitiesStatus +} + var map_ClusterVersionList = map[string]string{ - "": "ClusterVersionList is a list of ClusterVersion resources.", + "": "ClusterVersionList is a list of ClusterVersion resources.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (ClusterVersionList) SwaggerDoc() map[string]string { @@ -490,12 +775,14 @@ func (ClusterVersionList) SwaggerDoc() map[string]string { } var map_ClusterVersionSpec = map[string]string{ - "": "ClusterVersionSpec is the desired version state of the cluster. It includes the version the cluster should be at, how the cluster is identified, and where the cluster should look for version updates.", - "clusterID": "clusterID uniquely identifies this cluster. This is expected to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in hexadecimal values). This is a required field.", - "desiredUpdate": "desiredUpdate is an optional field that indicates the desired value of the cluster version. Setting this value will trigger an upgrade (if the current version does not match the desired version). The set of recommended update values is listed as part of available updates in status, and setting values outside that range may cause the upgrade to fail. You may specify the version field without setting image if an update exists with that version in the availableUpdates or history.\n\nIf an upgrade fails the operator will halt and report status about the failing component. Setting the desired update value back to the previous version will cause a rollback to be attempted. Not all rollbacks will succeed.", - "upstream": "upstream may be used to specify the preferred update server. By default it will use the appropriate update server for the cluster and region.", - "channel": "channel is an identifier for explicitly requesting that a non-default set of updates be applied to this cluster. The default channel will be contain stable updates that are appropriate for production clusters.", - "overrides": "overrides is list of overides for components that are managed by cluster version operator. Marking a component unmanaged will prevent the operator from creating or updating the object.", + "": "ClusterVersionSpec is the desired version state of the cluster. It includes the version the cluster should be at, how the cluster is identified, and where the cluster should look for version updates.", + "clusterID": "clusterID uniquely identifies this cluster. This is expected to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in hexadecimal values). This is a required field.", + "desiredUpdate": "desiredUpdate is an optional field that indicates the desired value of the cluster version. Setting this value will trigger an upgrade (if the current version does not match the desired version). The set of recommended update values is listed as part of available updates in status, and setting values outside that range may cause the upgrade to fail.\n\nSome of the fields are inter-related with restrictions and meanings described here. 1. image is specified, version is specified, architecture is specified. API validation error. 2. image is specified, version is specified, architecture is not specified. The version extracted from the referenced image must match the specified version. 3. image is specified, version is not specified, architecture is specified. API validation error. 4. image is specified, version is not specified, architecture is not specified. image is used. 5. image is not specified, version is specified, architecture is specified. version and desired architecture are used to select an image. 6. image is not specified, version is specified, architecture is not specified. version and current architecture are used to select an image. 7. image is not specified, version is not specified, architecture is specified. API validation error. 8. image is not specified, version is not specified, architecture is not specified. API validation error.\n\nIf an upgrade fails the operator will halt and report status about the failing component. Setting the desired update value back to the previous version will cause a rollback to be attempted if the previous version is within the current minor version. Not all rollbacks will succeed, and some may unrecoverably break the cluster.", + "upstream": "upstream may be used to specify the preferred update server. By default it will use the appropriate update server for the cluster and region.", + "channel": "channel is an identifier for explicitly requesting a non-default set of updates to be applied to this cluster. The default channel will contain stable updates that are appropriate for production clusters.", + "capabilities": "capabilities configures the installation of optional, core cluster components. A null value here is identical to an empty object; see the child properties for default semantics.", + "signatureStores": "signatureStores contains the upstream URIs to verify release signatures and optional reference to a config map by name containing the PEM-encoded CA bundle.\n\nBy default, CVO will use existing signature stores if this property is empty. The CVO will check the release signatures in the local ConfigMaps first. It will search for a valid signature in these stores in parallel only when local ConfigMaps did not include a valid signature. Validation will fail if none of the signature stores reply with valid signature before timeout. Setting signatureStores will replace the default signature stores with custom signature stores. Default stores can be used with custom signature stores by adding them manually.\n\nA maximum of 32 signature stores may be configured.", + "overrides": "overrides is list of overides for components that are managed by cluster version operator. Marking a component unmanaged will prevent the operator from creating or updating the object.", } func (ClusterVersionSpec) SwaggerDoc() map[string]string { @@ -508,8 +795,10 @@ var map_ClusterVersionStatus = map[string]string{ "history": "history contains a list of the most recent versions applied to the cluster. This value may be empty during cluster startup, and then will be updated when a new update is being applied. The newest update is first in the list and it is ordered by recency. Updates in the history have state Completed if the rollout completed - if an update was failing or halfway applied the state will be Partial. Only a limited amount of update history is preserved.", "observedGeneration": "observedGeneration reports which version of the spec is being synced. If this value is not equal to metadata.generation, then the desired and conditions fields may represent a previous version.", "versionHash": "versionHash is a fingerprint of the content that the cluster will be updated with. It is used by the operator to avoid unnecessary work and is for internal use only.", + "capabilities": "capabilities describes the state of optional, core cluster components.", "conditions": "conditions provides information about the cluster version. The condition \"Available\" is set to true if the desiredUpdate has been reached. The condition \"Progressing\" is set to true if an update is being applied. The condition \"Degraded\" is set to true if an update is currently blocked by a temporary or permanent error. Conditions are only valid for the current desiredUpdate when metadata.generation is equal to status.generation.", - "availableUpdates": "availableUpdates contains the list of updates that are appropriate for this cluster. This list may be empty if no updates are recommended, if the update service is unavailable, or if an invalid channel has been specified.", + "availableUpdates": "availableUpdates contains updates recommended for this cluster. Updates which appear in conditionalUpdates but not in availableUpdates may expose this cluster to known issues. This list may be empty if no updates are recommended, if the update service is unavailable, or if an invalid channel has been specified.", + "conditionalUpdates": "conditionalUpdates contains the list of updates that may be recommended for this cluster if it meets specific required conditions. Consumers interested in the set of updates that are actually recommended for this cluster should use availableUpdates. This list may be empty if no updates are recommended, if the update service is unavailable, or if an empty or invalid channel has been specified.", } func (ClusterVersionStatus) SwaggerDoc() map[string]string { @@ -529,23 +818,67 @@ func (ComponentOverride) SwaggerDoc() map[string]string { return map_ComponentOverride } +var map_ConditionalUpdate = map[string]string{ + "": "ConditionalUpdate represents an update which is recommended to some clusters on the version the current cluster is reconciling, but which may not be recommended for the current cluster.", + "release": "release is the target of the update.", + "risks": "risks represents the range of issues associated with updating to the target release. The cluster-version operator will evaluate all entries, and only recommend the update if there is at least one entry and all entries recommend the update.", + "conditions": "conditions represents the observations of the conditional update's current status. Known types are: * Recommended, for whether the update is recommended for the current cluster.", +} + +func (ConditionalUpdate) SwaggerDoc() map[string]string { + return map_ConditionalUpdate +} + +var map_ConditionalUpdateRisk = map[string]string{ + "": "ConditionalUpdateRisk represents a reason and cluster-state for not recommending a conditional update.", + "url": "url contains information about this risk.", + "name": "name is the CamelCase reason for not recommending a conditional update, in the event that matchingRules match the cluster state.", + "message": "message provides additional information about the risk of updating, in the event that matchingRules match the cluster state. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines.", + "matchingRules": "matchingRules is a slice of conditions for deciding which clusters match the risk and which do not. The slice is ordered by decreasing precedence. The cluster-version operator will walk the slice in order, and stop after the first it can successfully evaluate. If no condition can be successfully evaluated, the update will not be recommended.", +} + +func (ConditionalUpdateRisk) SwaggerDoc() map[string]string { + return map_ConditionalUpdateRisk +} + +var map_PromQLClusterCondition = map[string]string{ + "": "PromQLClusterCondition represents a cluster condition based on PromQL.", + "promql": "promql is a PromQL query classifying clusters. This query query should return a 1 in the match case and a 0 in the does-not-match case. Queries which return no time series, or which return values besides 0 or 1, are evaluation failures.", +} + +func (PromQLClusterCondition) SwaggerDoc() map[string]string { + return map_PromQLClusterCondition +} + var map_Release = map[string]string{ - "": "Release represents an OpenShift release image and associated metadata.", - "version": "version is a semantic versioning identifying the update version. When this field is part of spec, version is optional if image is specified.", - "image": "image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version.", - "url": "url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases.", - "channels": "channels is the set of Cincinnati channels to which the release currently belongs.", + "": "Release represents an OpenShift release image and associated metadata.", + "architecture": "architecture is an optional field that indicates the value of the cluster architecture. In this context cluster architecture means either a single architecture or a multi architecture. Valid values are 'Multi' and empty.", + "version": "version is a semantic version identifying the update version. When this field is part of spec, version is optional if image is specified.", + "image": "image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version.", + "url": "url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases.", + "channels": "channels is the set of Cincinnati channels to which the release currently belongs.", } func (Release) SwaggerDoc() map[string]string { return map_Release } +var map_SignatureStore = map[string]string{ + "": "SignatureStore represents the URL of custom Signature Store", + "url": "url contains the upstream custom signature store URL. url should be a valid absolute http/https URI of an upstream signature store as per rfc1738. This must be provided and cannot be empty.", + "ca": "ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key \"ca.crt\" is used to locate the data. If specified and the config map or expected key is not found, the signature store is not honored. If the specified ca data is not valid, the signature store is not honored. If empty, we fall back to the CA configured via Proxy, which is appended to the default system roots. The namespace for this config map is openshift-config.", +} + +func (SignatureStore) SwaggerDoc() map[string]string { + return map_SignatureStore +} + var map_Update = map[string]string{ - "": "Update represents an administrator update request.", - "version": "version is a semantic versioning identifying the update version. When this field is part of spec, version is optional if image is specified.", - "image": "image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version.", - "force": "force allows an administrator to update to an image that has failed verification, does not appear in the availableUpdates list, or otherwise would be blocked by normal protections on update. This option should only be used when the authenticity of the provided image has been verified out of band because the provided image will run with full administrative access to the cluster. Do not use this flag with images that comes from unknown or potentially malicious sources.\n\nThis flag does not override other forms of consistency checking that are required before a new update is deployed.", + "": "Update represents an administrator update request.", + "architecture": "architecture is an optional field that indicates the desired value of the cluster architecture. In this context cluster architecture means either a single architecture or a multi architecture. architecture can only be set to Multi thereby only allowing updates from single to multi architecture. If architecture is set, image cannot be set and version must be set. Valid values are 'Multi' and empty.", + "version": "version is a semantic version identifying the update version. version is required if architecture is specified. If both version and image are set, the version extracted from the referenced image must match the specified version.", + "image": "image is a container image location that contains the update. image should be used when the desired version does not exist in availableUpdates or history. When image is set, architecture cannot be specified. If both version and image are set, the version extracted from the referenced image must match the specified version.", + "force": "force allows an administrator to update to an image that has failed verification or upgradeable checks that are designed to keep your cluster safe. Only use this if: * you are testing unsigned release images in short-lived test clusters or * you are working around a known bug in the cluster-version\n operator and you have verified the authenticity of the provided\n image yourself.\nThe provided image will run with full administrative access to the cluster. Do not use this flag with images that comes from unknown or potentially malicious sources.", } func (Update) SwaggerDoc() map[string]string { @@ -557,9 +890,10 @@ var map_UpdateHistory = map[string]string{ "state": "state reflects whether the update was fully applied. The Partial state indicates the update is not fully applied, while the Completed state indicates the update was successfully rolled out at least once (all parts of the update successfully applied).", "startedTime": "startedTime is the time at which the update was started.", "completionTime": "completionTime, if set, is when the update was fully applied. The update that is currently being applied will have a null completion time. Completion time will always be set for entries that are not the current update (usually to the started time of the next update).", - "version": "version is a semantic versioning identifying the update version. If the requested image does not define a version, or if a failure occurs retrieving the image, this value may be empty.", + "version": "version is a semantic version identifying the update version. If the requested image does not define a version, or if a failure occurs retrieving the image, this value may be empty.", "image": "image is a container image location that contains the update. This value is always populated.", - "verified": "verified indicates whether the provided update was properly verified before it was installed. If this is false the cluster may not be trusted.", + "verified": "verified indicates whether the provided update was properly verified before it was installed. If this is false the cluster may not be trusted. Verified does not cover upgradeable checks that depend on the cluster state at the time when the update target was accepted.", + "acceptedRisks": "acceptedRisks records risks which were accepted to initiate the update. For example, it may menition an Upgradeable=False or missing signature that was overridden via desiredUpdate.force, or an update that was initiated despite not being in the availableUpdates set of recommended update targets.", } func (UpdateHistory) SwaggerDoc() map[string]string { @@ -567,9 +901,10 @@ func (UpdateHistory) SwaggerDoc() map[string]string { } var map_Console = map[string]string{ - "": "Console holds cluster-wide configuration for the web console, including the logout URL, and reports the public URL of the console. The canonical name is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Console holds cluster-wide configuration for the web console, including the logout URL, and reports the public URL of the console. The canonical name is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Console) SwaggerDoc() map[string]string { @@ -585,6 +920,15 @@ func (ConsoleAuthentication) SwaggerDoc() map[string]string { return map_ConsoleAuthentication } +var map_ConsoleList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ConsoleList) SwaggerDoc() map[string]string { + return map_ConsoleList +} + var map_ConsoleSpec = map[string]string{ "": "ConsoleSpec is the specification of the desired behavior of the Console.", } @@ -602,20 +946,50 @@ func (ConsoleStatus) SwaggerDoc() map[string]string { return map_ConsoleStatus } +var map_AWSDNSSpec = map[string]string{ + "": "AWSDNSSpec contains DNS configuration specific to the Amazon Web Services cloud provider.", + "privateZoneIAMRole": "privateZoneIAMRole contains the ARN of an IAM role that should be assumed when performing operations on the cluster's private hosted zone specified in the cluster DNS config. When left empty, no role should be assumed.", +} + +func (AWSDNSSpec) SwaggerDoc() map[string]string { + return map_AWSDNSSpec +} + var map_DNS = map[string]string{ - "": "DNS holds cluster-wide information about DNS. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "DNS holds cluster-wide information about DNS. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (DNS) SwaggerDoc() map[string]string { return map_DNS } +var map_DNSList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (DNSList) SwaggerDoc() map[string]string { + return map_DNSList +} + +var map_DNSPlatformSpec = map[string]string{ + "": "DNSPlatformSpec holds cloud-provider-specific configuration for DNS administration.", + "type": "type is the underlying infrastructure provider for the cluster. Allowed values: \"\", \"AWS\".\n\nIndividual components may not support all platforms, and must handle unrecognized platforms with best-effort defaults.", + "aws": "aws contains DNS configuration specific to the Amazon Web Services cloud provider.", +} + +func (DNSPlatformSpec) SwaggerDoc() map[string]string { + return map_DNSPlatformSpec +} + var map_DNSSpec = map[string]string{ "baseDomain": "baseDomain is the base domain of the cluster. All managed DNS records will be sub-domains of this base.\n\nFor example, given the base domain `openshift.example.com`, an API server DNS record may be created for `cluster-api.openshift.example.com`.\n\nOnce set, this field cannot be changed.", "publicZone": "publicZone is the location where all the DNS records that are publicly accessible to the internet exist.\n\nIf this field is nil, no public records should be created.\n\nOnce set, this field cannot be changed.", "privateZone": "privateZone is the location where all the DNS records that are only available internally to the cluster exist.\n\nIf this field is nil, no private records should be created.\n\nOnce set, this field cannot be changed.", + "platform": "platform holds configuration specific to the underlying infrastructure provider for DNS. When omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time.", } func (DNSSpec) SwaggerDoc() map[string]string { @@ -642,15 +1016,43 @@ func (CustomFeatureGates) SwaggerDoc() map[string]string { } var map_FeatureGate = map[string]string{ - "": "Feature holds cluster-wide information about feature gates. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Feature holds cluster-wide information about feature gates. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (FeatureGate) SwaggerDoc() map[string]string { return map_FeatureGate } +var map_FeatureGateAttributes = map[string]string{ + "name": "name is the name of the FeatureGate.", +} + +func (FeatureGateAttributes) SwaggerDoc() map[string]string { + return map_FeatureGateAttributes +} + +var map_FeatureGateDetails = map[string]string{ + "version": "version matches the version provided by the ClusterVersion and in the ClusterOperator.Status.Versions field.", + "enabled": "enabled is a list of all feature gates that are enabled in the cluster for the named version.", + "disabled": "disabled is a list of all feature gates that are disabled in the cluster for the named version.", +} + +func (FeatureGateDetails) SwaggerDoc() map[string]string { + return map_FeatureGateDetails +} + +var map_FeatureGateList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (FeatureGateList) SwaggerDoc() map[string]string { + return map_FeatureGateList +} + var map_FeatureGateSelection = map[string]string{ "featureSet": "featureSet changes the list of features in the cluster. The default is empty. Be very careful adjusting this setting. Turning on or off features may cause irreversible changes in your cluster which cannot be undone.", "customNoUpgrade": "customNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations your cluster may fail in an unrecoverable way. featureSet must equal \"CustomNoUpgrade\" must be set to use this field.", @@ -660,21 +1062,41 @@ func (FeatureGateSelection) SwaggerDoc() map[string]string { return map_FeatureGateSelection } +var map_FeatureGateStatus = map[string]string{ + "conditions": "conditions represent the observations of the current state. Known .status.conditions.type are: \"DeterminationDegraded\"", + "featureGates": "featureGates contains a list of enabled and disabled featureGates that are keyed by payloadVersion. Operators other than the CVO and cluster-config-operator, must read the .status.featureGates, locate the version they are managing, find the enabled/disabled featuregates and make the operand and operator match. The enabled/disabled values for a particular version may change during the life of the cluster as various .spec.featureSet values are selected. Operators may choose to restart their processes to pick up these changes, but remembering past enable/disable lists is beyond the scope of this API and is the responsibility of individual operators. Only featureGates with .version in the ClusterVersion.status will be present in this list.", +} + +func (FeatureGateStatus) SwaggerDoc() map[string]string { + return map_FeatureGateStatus +} + var map_Image = map[string]string{ - "": "Image governs policies related to imagestream imports and runtime configuration for external registries. It allows cluster admins to configure which registries OpenShift is allowed to import images from, extra CA trust bundles for external registries, and policies to block or allow registry hostnames. When exposing OpenShift's image registry to the public, this also lets cluster admins specify the external hostname.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Image governs policies related to imagestream imports and runtime configuration for external registries. It allows cluster admins to configure which registries OpenShift is allowed to import images from, extra CA trust bundles for external registries, and policies to block or allow registry hostnames. When exposing OpenShift's image registry to the public, this also lets cluster admins specify the external hostname.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Image) SwaggerDoc() map[string]string { return map_Image } +var map_ImageList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageList) SwaggerDoc() map[string]string { + return map_ImageList +} + var map_ImageSpec = map[string]string{ "allowedRegistriesForImport": "allowedRegistriesForImport limits the container image registries that normal users may import images from. Set this list to the registries that you trust to contain valid Docker images and that you want applications to be able to import from. Users with permission to create Images or ImageStreamMappings via the API are not affected by this policy - typically only administrators or system integrations will have those permissions.", "externalRegistryHostnames": "externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in \"hostname[:port]\" format.", "additionalTrustedCA": "additionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted during imagestream import, pod image pull, build image pull, and imageregistry pullthrough. The namespace for this config map is openshift-config.", "registrySources": "registrySources contains configuration that determines how the container runtime should treat individual registries when accessing images for builds+pods. (e.g. whether or not to allow insecure access). It does not contain configuration for the internal cluster registry.", + "imageStreamImportMode": "imageStreamImportMode controls the import mode behaviour of imagestreams. It can be set to `Legacy` or `PreserveOriginal` or the empty string. If this value is specified, this setting is applied to all newly created imagestreams which do not have the value set. `Legacy` indicates that the legacy behaviour should be used. For manifest lists, the legacy behaviour will discard the manifest list and import a single sub-manifest. In this case, the platform is chosen in the following order of priority: 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, the manifest list and all its sub-manifests will be imported. When empty, the behaviour will be decided based on the payload type advertised by the ClusterVersion status, i.e single arch payload implies the import mode is Legacy and multi payload implies PreserveOriginal.", } func (ImageSpec) SwaggerDoc() map[string]string { @@ -682,8 +1104,9 @@ func (ImageSpec) SwaggerDoc() map[string]string { } var map_ImageStatus = map[string]string{ - "internalRegistryHostname": "internalRegistryHostname sets the hostname for the default internal image registry. The value must be in \"hostname[:port]\" format. This value is set by the image registry operator which controls the internal registry hostname. For backward compatibility, users can still use OPENSHIFT_DEFAULT_REGISTRY environment variable but this setting overrides the environment variable.", + "internalRegistryHostname": "internalRegistryHostname sets the hostname for the default internal image registry. The value must be in \"hostname[:port]\" format. This value is set by the image registry operator which controls the internal registry hostname.", "externalRegistryHostnames": "externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in \"hostname[:port]\" format.", + "imageStreamImportMode": "imageStreamImportMode controls the import mode behaviour of imagestreams. It can be `Legacy` or `PreserveOriginal`. `Legacy` indicates that the legacy behaviour should be used. For manifest lists, the legacy behaviour will discard the manifest list and import a single sub-manifest. In this case, the platform is chosen in the following order of priority: 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, the manifest list and all its sub-manifests will be imported. This value will be reconciled based on either the spec value or if no spec value is specified, the image registry operator would look at the ClusterVersion status to determine the payload type and set the import mode accordingly, i.e single arch payload implies the import mode is Legacy and multi payload implies PreserveOriginal.", } func (ImageStatus) SwaggerDoc() map[string]string { @@ -712,6 +1135,266 @@ func (RegistrySources) SwaggerDoc() map[string]string { return map_RegistrySources } +var map_ImageContentPolicy = map[string]string{ + "": "ImageContentPolicy holds cluster-wide information about how to handle registry mirror rules. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", +} + +func (ImageContentPolicy) SwaggerDoc() map[string]string { + return map_ImageContentPolicy +} + +var map_ImageContentPolicyList = map[string]string{ + "": "ImageContentPolicyList lists the items in the ImageContentPolicy CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageContentPolicyList) SwaggerDoc() map[string]string { + return map_ImageContentPolicyList +} + +var map_ImageContentPolicySpec = map[string]string{ + "": "ImageContentPolicySpec is the specification of the ImageContentPolicy CRD.", + "repositoryDigestMirrors": "repositoryDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in RepositoryDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To pull image from mirrors by tags, should set the \"allowMirrorByTags\".\n\nEach “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified.", +} + +func (ImageContentPolicySpec) SwaggerDoc() map[string]string { + return map_ImageContentPolicySpec +} + +var map_RepositoryDigestMirrors = map[string]string{ + "": "RepositoryDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source is the repository that users refer to, e.g. in image pull specifications.", + "allowMirrorByTags": "allowMirrorByTags if true, the mirrors can be used to pull the images that are referenced by their tags. Default is false, the mirrors only work when pulling the images that are referenced by their digests. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Forcing digest-pulls for mirrors avoids that issue.", + "mirrors": "mirrors is zero or more repositories that may also contain the same images. If the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec. No mirror will be configured. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. Other cluster configuration, including (but not limited to) other repositoryDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering.", +} + +func (RepositoryDigestMirrors) SwaggerDoc() map[string]string { + return map_RepositoryDigestMirrors +} + +var map_ImageDigestMirrorSet = map[string]string{ + "": "ImageDigestMirrorSet holds cluster-wide information about how to handle registry mirror rules on using digest pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImageDigestMirrorSet) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSet +} + +var map_ImageDigestMirrorSetList = map[string]string{ + "": "ImageDigestMirrorSetList lists the items in the ImageDigestMirrorSet CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageDigestMirrorSetList) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSetList +} + +var map_ImageDigestMirrorSetSpec = map[string]string{ + "": "ImageDigestMirrorSetSpec is the specification of the ImageDigestMirrorSet CRD.", + "imageDigestMirrors": "imageDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using tag specification, users should configure a list of mirrors using \"ImageTagMirrorSet\" CRD.\n\nIf the image pull specification matches the repository of \"source\" in multiple imagedigestmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a specific order of mirrors, should configure them into one list of mirrors using the expected order.", +} + +func (ImageDigestMirrorSetSpec) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSetSpec +} + +var map_ImageDigestMirrors = map[string]string{ + "": "ImageDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. \"source\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrors": "mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their digests. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by \"mirrorSourcePolicy\" Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. \"mirrors\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrorSourcePolicy": "mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list.", +} + +func (ImageDigestMirrors) SwaggerDoc() map[string]string { + return map_ImageDigestMirrors +} + +var map_FulcioCAWithRekor = map[string]string{ + "": "FulcioCAWithRekor defines the root of trust based on the Fulcio certificate and the Rekor public key.", + "fulcioCAData": "fulcioCAData is a required field contains inline base64-encoded data for the PEM format fulcio CA. fulcioCAData must be at most 8192 characters. ", + "rekorKeyData": "rekorKeyData is a required field contains inline base64-encoded data for the PEM format from the Rekor public key. rekorKeyData must be at most 8192 characters. ", + "fulcioSubject": "fulcioSubject is a required field specifies OIDC issuer and the email of the Fulcio authentication configuration.", +} + +func (FulcioCAWithRekor) SwaggerDoc() map[string]string { + return map_FulcioCAWithRekor +} + +var map_ImagePolicy = map[string]string{ + "": "ImagePolicy holds namespace-wide configuration for image signature verification\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImagePolicy) SwaggerDoc() map[string]string { + return map_ImagePolicy +} + +var map_ImagePolicyList = map[string]string{ + "": "ImagePolicyList is a list of ImagePolicy resources\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is a list of ImagePolicies", +} + +func (ImagePolicyList) SwaggerDoc() map[string]string { + return map_ImagePolicyList +} + +var map_ImagePolicySpec = map[string]string{ + "": "ImagePolicySpec is the specification of the ImagePolicy CRD.", + "scopes": "scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker", + "policy": "policy is a required field that contains configuration to allow scopes to be verified, and defines how images not matching the verification policy will be treated.", +} + +func (ImagePolicySpec) SwaggerDoc() map[string]string { + return map_ImagePolicySpec +} + +var map_ImagePolicyStatus = map[string]string{ + "conditions": "conditions provide details on the status of this API Resource. condition type 'Pending' indicates that the customer resource contains a policy that cannot take effect. It is either overwritten by a global policy or the image scope is not valid.", +} + +func (ImagePolicyStatus) SwaggerDoc() map[string]string { + return map_ImagePolicyStatus +} + +var map_PKI = map[string]string{ + "": "PKI defines the root of trust based on Root CA(s) and corresponding intermediate certificates.", + "caRootsData": "caRootsData contains base64-encoded data of a certificate bundle PEM file, which contains one or more CA roots in the PEM format. The total length of the data must not exceed 8192 characters. ", + "caIntermediatesData": "caIntermediatesData contains base64-encoded data of a certificate bundle PEM file, which contains one or more intermediate certificates in the PEM format. The total length of the data must not exceed 8192 characters. caIntermediatesData requires caRootsData to be set. ", + "pkiCertificateSubject": "pkiCertificateSubject defines the requirements imposed on the subject to which the certificate was issued.", +} + +func (PKI) SwaggerDoc() map[string]string { + return map_PKI +} + +var map_PKICertificateSubject = map[string]string{ + "": "PKICertificateSubject defines the requirements imposed on the subject to which the certificate was issued.", + "email": "email specifies the expected email address imposed on the subject to which the certificate was issued, and must match the email address listed in the Subject Alternative Name (SAN) field of the certificate. The email must be a valid email address and at most 320 characters in length.", + "hostname": "hostname specifies the expected hostname imposed on the subject to which the certificate was issued, and it must match the hostname listed in the Subject Alternative Name (SAN) DNS field of the certificate. The hostname must be a valid dns 1123 subdomain name, optionally prefixed by '*.', and at most 253 characters in length. It must consist only of lowercase alphanumeric characters, hyphens, periods and the optional preceding asterisk.", +} + +func (PKICertificateSubject) SwaggerDoc() map[string]string { + return map_PKICertificateSubject +} + +var map_Policy = map[string]string{ + "": "Policy defines the verification policy for the items in the scopes list.", + "rootOfTrust": "rootOfTrust is a required field that defines the root of trust for verifying image signatures during retrieval. This allows image consumers to specify policyType and corresponding configuration of the policy, matching how the policy was generated.", + "signedIdentity": "signedIdentity is an optional field specifies what image identity the signature claims about the image. This is useful when the image identity in the signature differs from the original image spec, such as when mirror registry is configured for the image scope, the signature from the mirror registry contains the image identity of the mirror instead of the original scope. The required matchPolicy field specifies the approach used in the verification process to verify the identity in the signature and the actual image identity, the default matchPolicy is \"MatchRepoDigestOrExact\".", +} + +func (Policy) SwaggerDoc() map[string]string { + return map_Policy +} + +var map_PolicyFulcioSubject = map[string]string{ + "": "PolicyFulcioSubject defines the OIDC issuer and the email of the Fulcio authentication configuration.", + "oidcIssuer": "oidcIssuer is a required filed contains the expected OIDC issuer. The oidcIssuer must be a valid URL and at most 2048 characters in length. It will be verified that the Fulcio-issued certificate contains a (Fulcio-defined) certificate extension pointing at this OIDC issuer URL. When Fulcio issues certificates, it includes a value based on an URL inside the client-provided ID token. Example: \"https://expected.OIDC.issuer/\"", + "signedEmail": "signedEmail is a required field holds the email address that the Fulcio certificate is issued for. The signedEmail must be a valid email address and at most 320 characters in length. Example: \"expected-signing-user@example.com\"", +} + +func (PolicyFulcioSubject) SwaggerDoc() map[string]string { + return map_PolicyFulcioSubject +} + +var map_PolicyIdentity = map[string]string{ + "": "PolicyIdentity defines image identity the signature claims about the image. When omitted, the default matchPolicy is \"MatchRepoDigestOrExact\".", + "matchPolicy": "matchPolicy is a required filed specifies matching strategy to verify the image identity in the signature against the image scope. Allowed values are \"MatchRepoDigestOrExact\", \"MatchRepository\", \"ExactRepository\", \"RemapIdentity\". When omitted, the default value is \"MatchRepoDigestOrExact\". When set to \"MatchRepoDigestOrExact\", the identity in the signature must be in the same repository as the image identity if the image identity is referenced by a digest. Otherwise, the identity in the signature must be the same as the image identity. When set to \"MatchRepository\", the identity in the signature must be in the same repository as the image identity. When set to \"ExactRepository\", the exactRepository must be specified. The identity in the signature must be in the same repository as a specific identity specified by \"repository\". When set to \"RemapIdentity\", the remapIdentity must be specified. The signature must be in the same as the remapped image identity. Remapped image identity is obtained by replacing the \"prefix\" with the specified “signedPrefix” if the the image identity matches the specified remapPrefix.", + "exactRepository": "exactRepository specifies the repository that must be exactly matched by the identity in the signature. exactRepository is required if matchPolicy is set to \"ExactRepository\". It is used to verify that the signature claims an identity matching this exact repository, rather than the original image identity.", + "remapIdentity": "remapIdentity specifies the prefix remapping rule for verifying image identity. remapIdentity is required if matchPolicy is set to \"RemapIdentity\". It is used to verify that the signature claims a different registry/repository prefix than the original image.", +} + +func (PolicyIdentity) SwaggerDoc() map[string]string { + return map_PolicyIdentity +} + +var map_PolicyMatchExactRepository = map[string]string{ + "repository": "repository is the reference of the image identity to be matched. repository is required if matchPolicy is set to \"ExactRepository\". The value should be a repository name (by omitting the tag or digest) in a registry implementing the \"Docker Registry HTTP API V2\". For example, docker.io/library/busybox", +} + +func (PolicyMatchExactRepository) SwaggerDoc() map[string]string { + return map_PolicyMatchExactRepository +} + +var map_PolicyMatchRemapIdentity = map[string]string{ + "prefix": "prefix is required if matchPolicy is set to \"RemapIdentity\". prefix is the prefix of the image identity to be matched. If the image identity matches the specified prefix, that prefix is replaced by the specified “signedPrefix” (otherwise it is used as unchanged and no remapping takes place). This is useful when verifying signatures for a mirror of some other repository namespace that preserves the vendor’s repository structure. The prefix and signedPrefix values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox.", + "signedPrefix": "signedPrefix is required if matchPolicy is set to \"RemapIdentity\". signedPrefix is the prefix of the image identity to be matched in the signature. The format is the same as \"prefix\". The values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox.", +} + +func (PolicyMatchRemapIdentity) SwaggerDoc() map[string]string { + return map_PolicyMatchRemapIdentity +} + +var map_PolicyRootOfTrust = map[string]string{ + "": "PolicyRootOfTrust defines the root of trust based on the selected policyType.", + "policyType": "policyType is a required field specifies the type of the policy for verification. This field must correspond to how the policy was generated. Allowed values are \"PublicKey\", \"FulcioCAWithRekor\", and \"PKI\". When set to \"PublicKey\", the policy relies on a sigstore publicKey and may optionally use a Rekor verification. When set to \"FulcioCAWithRekor\", the policy is based on the Fulcio certification and incorporates a Rekor verification. When set to \"PKI\", the policy is based on the certificates from Bring Your Own Public Key Infrastructure (BYOPKI). This value is enabled by turning on the SigstoreImageVerificationPKI feature gate.", + "publicKey": "publicKey defines the root of trust configuration based on a sigstore public key. Optionally include a Rekor public key for Rekor verification. publicKey is required when policyType is PublicKey, and forbidden otherwise.", + "fulcioCAWithRekor": "fulcioCAWithRekor defines the root of trust configuration based on the Fulcio certificate and the Rekor public key. fulcioCAWithRekor is required when policyType is FulcioCAWithRekor, and forbidden otherwise For more information about Fulcio and Rekor, please refer to the document at: https://github.com/sigstore/fulcio and https://github.com/sigstore/rekor", + "pki": "pki defines the root of trust configuration based on Bring Your Own Public Key Infrastructure (BYOPKI) Root CA(s) and corresponding intermediate certificates. pki is required when policyType is PKI, and forbidden otherwise.", +} + +func (PolicyRootOfTrust) SwaggerDoc() map[string]string { + return map_PolicyRootOfTrust +} + +var map_PublicKey = map[string]string{ + "": "PublicKey defines the root of trust based on a sigstore public key.", + "keyData": "keyData is a required field contains inline base64-encoded data for the PEM format public key. keyData must be at most 8192 characters. ", + "rekorKeyData": "rekorKeyData is an optional field contains inline base64-encoded data for the PEM format from the Rekor public key. rekorKeyData must be at most 8192 characters. ", +} + +func (PublicKey) SwaggerDoc() map[string]string { + return map_PublicKey +} + +var map_ImageTagMirrorSet = map[string]string{ + "": "ImageTagMirrorSet holds cluster-wide information about how to handle registry mirror rules on using tag pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImageTagMirrorSet) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSet +} + +var map_ImageTagMirrorSetList = map[string]string{ + "": "ImageTagMirrorSetList lists the items in the ImageTagMirrorSet CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageTagMirrorSetList) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSetList +} + +var map_ImageTagMirrorSetSpec = map[string]string{ + "": "ImageTagMirrorSetSpec is the specification of the ImageTagMirrorSet CRD.", + "imageTagMirrors": "imageTagMirrors allows images referenced by image tags in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageTagMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using digest specification only, users should configure a list of mirrors using \"ImageDigestMirrorSet\" CRD.\n\nIf the image pull specification matches the repository of \"source\" in multiple imagetagmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a deterministic order of mirrors, should configure them into one list of mirrors using the expected order.", +} + +func (ImageTagMirrorSetSpec) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSetSpec +} + +var map_ImageTagMirrors = map[string]string{ + "": "ImageTagMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. \"source\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrors": "mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their tags. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Configuring a list of mirrors using \"ImageDigestMirrorSet\" CRD and forcing digest-pulls for mirrors avoids that issue. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by \"mirrorSourcePolicy\". Other cluster configuration, including (but not limited to) other imageTagMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. \"mirrors\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrorSourcePolicy": "mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list.", +} + +func (ImageTagMirrors) SwaggerDoc() map[string]string { + return map_ImageTagMirrors +} + var map_AWSPlatformSpec = map[string]string{ "": "AWSPlatformSpec holds the desired state of the Amazon Web Services infrastructure provider. This only includes fields that can be modified in the cluster.", "serviceEndpoints": "serviceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", @@ -722,10 +1405,11 @@ func (AWSPlatformSpec) SwaggerDoc() map[string]string { } var map_AWSPlatformStatus = map[string]string{ - "": "AWSPlatformStatus holds the current status of the Amazon Web Services infrastructure provider.", - "region": "region holds the default AWS region for new AWS resources created by the cluster.", - "serviceEndpoints": "ServiceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", - "resourceTags": "resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user.", + "": "AWSPlatformStatus holds the current status of the Amazon Web Services infrastructure provider.", + "region": "region holds the default AWS region for new AWS resources created by the cluster.", + "serviceEndpoints": "serviceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", + "resourceTags": "resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user.", + "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.", } func (AWSPlatformStatus) SwaggerDoc() map[string]string { @@ -734,8 +1418,8 @@ func (AWSPlatformStatus) SwaggerDoc() map[string]string { var map_AWSResourceTag = map[string]string{ "": "AWSResourceTag is a tag to apply to AWS resources created for the cluster.", - "key": "key is the key of the tag", - "value": "value is the value of the tag. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services.", + "key": "key sets the key of the AWS resource tag key-value pair. Key is required when defining an AWS resource tag. Key should consist of between 1 and 128 characters, and may contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'.", + "value": "value sets the value of the AWS resource tag key-value pair. Value is required when defining an AWS resource tag. Value should consist of between 1 and 256 characters, and may contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services.", } func (AWSResourceTag) SwaggerDoc() map[string]string { @@ -752,6 +1436,35 @@ func (AWSServiceEndpoint) SwaggerDoc() map[string]string { return map_AWSServiceEndpoint } +var map_AlibabaCloudPlatformSpec = map[string]string{ + "": "AlibabaCloudPlatformSpec holds the desired state of the Alibaba Cloud infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (AlibabaCloudPlatformSpec) SwaggerDoc() map[string]string { + return map_AlibabaCloudPlatformSpec +} + +var map_AlibabaCloudPlatformStatus = map[string]string{ + "": "AlibabaCloudPlatformStatus holds the current status of the Alibaba Cloud infrastructure provider.", + "region": "region specifies the region for Alibaba Cloud resources created for the cluster.", + "resourceGroupID": "resourceGroupID is the ID of the resource group for the cluster.", + "resourceTags": "resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster.", +} + +func (AlibabaCloudPlatformStatus) SwaggerDoc() map[string]string { + return map_AlibabaCloudPlatformStatus +} + +var map_AlibabaCloudResourceTag = map[string]string{ + "": "AlibabaCloudResourceTag is the set of tags to add to apply to resources.", + "key": "key is the key of the tag.", + "value": "value is the value of the tag.", +} + +func (AlibabaCloudResourceTag) SwaggerDoc() map[string]string { + return map_AlibabaCloudResourceTag +} + var map_AzurePlatformSpec = map[string]string{ "": "AzurePlatformSpec holds the desired state of the Azure infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -765,14 +1478,39 @@ var map_AzurePlatformStatus = map[string]string{ "resourceGroupName": "resourceGroupName is the Resource Group for new Azure resources created for the cluster.", "networkResourceGroupName": "networkResourceGroupName is the Resource Group for network resources like the Virtual Network and Subnets used by the cluster. If empty, the value is same as ResourceGroupName.", "cloudName": "cloudName is the name of the Azure cloud environment which can be used to configure the Azure SDK with the appropriate Azure API endpoints. If empty, the value is equal to `AzurePublicCloud`.", + "armEndpoint": "armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack.", + "resourceTags": "resourceTags is a list of additional tags to apply to Azure resources created for the cluster. See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration.", + "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.", } func (AzurePlatformStatus) SwaggerDoc() map[string]string { return map_AzurePlatformStatus } +var map_AzureResourceTag = map[string]string{ + "": "AzureResourceTag is a tag to apply to Azure resources created for the cluster.", + "key": "key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric characters and the following special characters `_ . -`.", + "value": "value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`.", +} + +func (AzureResourceTag) SwaggerDoc() map[string]string { + return map_AzureResourceTag +} + +var map_BareMetalPlatformLoadBalancer = map[string]string{ + "": "BareMetalPlatformLoadBalancer defines the load balancer used by the cluster on BareMetal platform.", + "type": "type defines the type of load balancer used by the cluster on BareMetal platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (BareMetalPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_BareMetalPlatformLoadBalancer +} + var map_BareMetalPlatformSpec = map[string]string{ - "": "BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. This only includes fields that can be modified in the cluster.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.apiServerInternalIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.ingressIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, for example \"10.0.0.0/8\" or \"fd00::/8\".", } func (BareMetalPlatformSpec) SwaggerDoc() map[string]string { @@ -780,16 +1518,50 @@ func (BareMetalPlatformSpec) SwaggerDoc() map[string]string { } var map_BareMetalPlatformStatus = map[string]string{ - "": "BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. For more information about the network architecture used with the BareMetal platform type, see: https://github.com/openshift/installer/blob/master/docs/design/baremetal/networking-infrastructure.md", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for BareMetal deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "": "BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. For more information about the network architecture used with the BareMetal platform type, see: https://github.com/openshift/installer/blob/master/docs/design/baremetal/networking-infrastructure.md", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for BareMetal deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes.", } func (BareMetalPlatformStatus) SwaggerDoc() map[string]string { return map_BareMetalPlatformStatus } +var map_CloudControllerManagerStatus = map[string]string{ + "": "CloudControllerManagerStatus holds the state of Cloud Controller Manager (a.k.a. CCM or CPI) related settings", + "state": "state determines whether or not an external Cloud Controller Manager is expected to be installed within the cluster. https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/#running-cloud-controller-manager\n\nValid values are \"External\", \"None\" and omitted. When set to \"External\", new nodes will be tainted as uninitialized when created, preventing them from running workloads until they are initialized by the cloud controller manager. When omitted or set to \"None\", new nodes will be not tainted and no extra initialization from the cloud controller manager is expected.", +} + +func (CloudControllerManagerStatus) SwaggerDoc() map[string]string { + return map_CloudControllerManagerStatus +} + +var map_CloudLoadBalancerConfig = map[string]string{ + "": "CloudLoadBalancerConfig contains an union discriminator indicating the type of DNS solution in use within the cluster. When the DNSType is `ClusterHosted`, the cloud's Load Balancer configuration needs to be provided so that the DNS solution hosted within the cluster can be configured with those values.", + "dnsType": "dnsType indicates the type of DNS solution in use within the cluster. Its default value of `PlatformDefault` indicates that the cluster's DNS is the default provided by the cloud platform. It can be set to `ClusterHosted` to bypass the configuration of the cloud default DNS. In this mode, the cluster needs to provide a self-hosted DNS solution for the cluster's installation to succeed. The cluster's use of the cloud's Load Balancers is unaffected by this setting. The value is immutable after it has been set at install time. Currently, there is no way for the customer to add additional DNS entries into the cluster hosted DNS. Enabling this functionality allows the user to start their own DNS solution outside the cluster after installation is complete. The customer would be responsible for configuring this custom DNS solution, and it can be run in addition to the in-cluster DNS solution.", + "clusterHosted": "clusterHosted holds the IP addresses of API, API-Int and Ingress Load Balancers on Cloud Platforms. The DNS solution hosted within the cluster use these IP addresses to provide resolution for API, API-Int and Ingress services.", +} + +func (CloudLoadBalancerConfig) SwaggerDoc() map[string]string { + return map_CloudLoadBalancerConfig +} + +var map_CloudLoadBalancerIPs = map[string]string{ + "": "CloudLoadBalancerIPs contains the Load Balancer IPs for the cloud's API, API-Int and Ingress Load balancers. They will be populated as soon as the respective Load Balancers have been configured. These values are utilized to configure the DNS solution hosted within the cluster.", + "apiIntLoadBalancerIPs": "apiIntLoadBalancerIPs holds Load Balancer IPs for the internal API service. These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. Entries in the apiIntLoadBalancerIPs must be unique. A maximum of 16 IP addresses are permitted.", + "apiLoadBalancerIPs": "apiLoadBalancerIPs holds Load Balancer IPs for the API service. These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. Could be empty for private clusters. Entries in the apiLoadBalancerIPs must be unique. A maximum of 16 IP addresses are permitted.", + "ingressLoadBalancerIPs": "ingressLoadBalancerIPs holds IPs for Ingress Load Balancers. These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. Entries in the ingressLoadBalancerIPs must be unique. A maximum of 16 IP addresses are permitted.", +} + +func (CloudLoadBalancerIPs) SwaggerDoc() map[string]string { + return map_CloudLoadBalancerIPs +} + var map_EquinixMetalPlatformSpec = map[string]string{ "": "EquinixMetalPlatformSpec holds the desired state of the Equinix Metal infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -808,6 +1580,24 @@ func (EquinixMetalPlatformStatus) SwaggerDoc() map[string]string { return map_EquinixMetalPlatformStatus } +var map_ExternalPlatformSpec = map[string]string{ + "": "ExternalPlatformSpec holds the desired state for the generic External infrastructure provider.", + "platformName": "platformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. This field is solely for informational and reporting purposes and is not expected to be used for decision-making.", +} + +func (ExternalPlatformSpec) SwaggerDoc() map[string]string { + return map_ExternalPlatformSpec +} + +var map_ExternalPlatformStatus = map[string]string{ + "": "ExternalPlatformStatus holds the current status of the generic External infrastructure provider.", + "cloudControllerManager": "cloudControllerManager contains settings specific to the external Cloud Controller Manager (a.k.a. CCM or CPI). When omitted, new nodes will be not tainted and no extra initialization from the cloud controller manager is expected.", +} + +func (ExternalPlatformStatus) SwaggerDoc() map[string]string { + return map_ExternalPlatformStatus +} + var map_GCPPlatformSpec = map[string]string{ "": "GCPPlatformSpec holds the desired state of the Google Cloud Platform infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -817,17 +1607,53 @@ func (GCPPlatformSpec) SwaggerDoc() map[string]string { } var map_GCPPlatformStatus = map[string]string{ - "": "GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider.", - "projectID": "resourceGroupName is the Project ID for new GCP resources created for the cluster.", - "region": "region holds the region for new GCP resources created for the cluster.", + "": "GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider.", + "projectID": "resourceGroupName is the Project ID for new GCP resources created for the cluster.", + "region": "region holds the region for new GCP resources created for the cluster.", + "resourceLabels": "resourceLabels is a list of additional labels to apply to GCP resources created for the cluster. See https://cloud.google.com/compute/docs/labeling-resources for information on labeling GCP resources. GCP supports a maximum of 64 labels per resource. OpenShift reserves 32 labels for internal use, allowing 32 labels for user configuration.", + "resourceTags": "resourceTags is a list of additional tags to apply to GCP resources created for the cluster. See https://cloud.google.com/resource-manager/docs/tags/tags-overview for information on tagging GCP resources. GCP supports a maximum of 50 tags per resource.", + "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.", + "serviceEndpoints": "serviceEndpoints specifies endpoints that override the default endpoints used when creating clients to interact with GCP services. When not specified, the default endpoint for the GCP region will be used. Only 1 endpoint override is permitted for each GCP service. The maximum number of endpoint overrides allowed is 11.", } func (GCPPlatformStatus) SwaggerDoc() map[string]string { return map_GCPPlatformStatus } +var map_GCPResourceLabel = map[string]string{ + "": "GCPResourceLabel is a label to apply to GCP resources created for the cluster.", + "key": "key is the key part of the label. A label key can have a maximum of 63 characters and cannot be empty. Label key must begin with a lowercase letter, and must contain only lowercase letters, numeric characters, and the following special characters `_-`. Label key must not have the reserved prefixes `kubernetes-io` and `openshift-io`.", + "value": "value is the value part of the label. A label value can have a maximum of 63 characters and cannot be empty. Value must contain only lowercase letters, numeric characters, and the following special characters `_-`.", +} + +func (GCPResourceLabel) SwaggerDoc() map[string]string { + return map_GCPResourceLabel +} + +var map_GCPResourceTag = map[string]string{ + "": "GCPResourceTag is a tag to apply to GCP resources created for the cluster.", + "parentID": "parentID is the ID of the hierarchical resource where the tags are defined, e.g. at the Organization or the Project level. To find the Organization or Project ID refer to the following pages: https://cloud.google.com/resource-manager/docs/creating-managing-organization#retrieving_your_organization_id, https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects. An OrganizationID must consist of decimal numbers, and cannot have leading zeroes. A ProjectID must be 6 to 30 characters in length, can only contain lowercase letters, numbers, and hyphens, and must start with a letter, and cannot end with a hyphen.", + "key": "key is the key part of the tag. A tag key can have a maximum of 63 characters and cannot be empty. Tag key must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `._-`.", + "value": "value is the value part of the tag. A tag value can have a maximum of 63 characters and cannot be empty. Tag value must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%=+:,*#&(){}[]` and spaces.", +} + +func (GCPResourceTag) SwaggerDoc() map[string]string { + return map_GCPResourceTag +} + +var map_GCPServiceEndpoint = map[string]string{ + "": "GCPServiceEndpoint store the configuration of a custom url to override existing defaults of GCP Services.", + "name": "name is the name of the GCP service whose endpoint is being overridden. This must be provided and cannot be empty.\n\nAllowed values are Compute, Container, CloudResourceManager, DNS, File, IAM, ServiceUsage, Storage, and TagManager.\n\nAs an example, when setting the name to Compute all requests made by the caller to the GCP Compute Service will be directed to the endpoint specified in the url field.", + "url": "url is a fully qualified URI that overrides the default endpoint for a client using the GCP service specified in the name field. url is required, must use the scheme https, must not be more than 253 characters in length, and must be a valid URL according to Go's net/url package (https://pkg.go.dev/net/url#URL)\n\nAn example of a valid endpoint that overrides the Compute Service: \"https://compute-myendpoint1.p.googleapis.com\"", +} + +func (GCPServiceEndpoint) SwaggerDoc() map[string]string { + return map_GCPServiceEndpoint +} + var map_IBMCloudPlatformSpec = map[string]string{ - "": "IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. This only includes fields that can be modified in the cluster.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of an IBM service. These endpoints are used by components within the cluster when trying to reach the IBM Cloud Services that have been overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus are updated to reflect the same custom endpoints. A maximum of 13 service endpoints overrides are supported.", } func (IBMCloudPlatformSpec) SwaggerDoc() map[string]string { @@ -836,19 +1662,33 @@ func (IBMCloudPlatformSpec) SwaggerDoc() map[string]string { var map_IBMCloudPlatformStatus = map[string]string{ "": "IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider.", - "location": "Location is where the cluster has been deployed", - "resourceGroupName": "ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster.", - "providerType": "ProviderType indicates the type of cluster that was created", + "location": "location is where the cluster has been deployed", + "resourceGroupName": "resourceGroupName is the Resource Group for new IBMCloud resources created for the cluster.", + "providerType": "providerType indicates the type of cluster that was created", + "cisInstanceCRN": "cisInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain", + "dnsInstanceCRN": "dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of an IBM service. These endpoints are used by components within the cluster when trying to reach the IBM Cloud Services that have been overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus are updated to reflect the same custom endpoints.", } func (IBMCloudPlatformStatus) SwaggerDoc() map[string]string { return map_IBMCloudPlatformStatus } +var map_IBMCloudServiceEndpoint = map[string]string{ + "": "IBMCloudServiceEndpoint stores the configuration of a custom url to override existing defaults of IBM Cloud Services.", + "name": "name is the name of the IBM Cloud service. Possible values are: CIS, COS, COSConfig, DNSServices, GlobalCatalog, GlobalSearch, GlobalTagging, HyperProtect, IAM, KeyProtect, ResourceController, ResourceManager, or VPC. For example, the IBM Cloud Private IAM service could be configured with the service `name` of `IAM` and `url` of `https://private.iam.cloud.ibm.com` Whereas the IBM Cloud Private VPC service for US South (Dallas) could be configured with the service `name` of `VPC` and `url` of `https://us.south.private.iaas.cloud.ibm.com`", + "url": "url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. The path must follow the pattern /v[0,9]+ or /api/v[0,9]+", +} + +func (IBMCloudServiceEndpoint) SwaggerDoc() map[string]string { + return map_IBMCloudServiceEndpoint +} + var map_Infrastructure = map[string]string{ - "": "Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Infrastructure) SwaggerDoc() map[string]string { @@ -856,7 +1696,8 @@ func (Infrastructure) SwaggerDoc() map[string]string { } var map_InfrastructureList = map[string]string{ - "": "InfrastructureList is", + "": "InfrastructureList is\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (InfrastructureList) SwaggerDoc() map[string]string { @@ -881,8 +1722,9 @@ var map_InfrastructureStatus = map[string]string{ "etcdDiscoveryDomain": "etcdDiscoveryDomain is the domain used to fetch the SRV records for discovering etcd servers and clients. For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release.", "apiServerURL": "apiServerURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerURL can be used by components like the web console to tell users where to find the Kubernetes API.", "apiServerInternalURI": "apiServerInternalURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components like kubelets, to contact the Kubernetes API server using the infrastructure provider rather than Kubernetes networking.", - "controlPlaneTopology": "controlPlaneTopology expresses the expectations for operands that normally run on control nodes. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation", - "infrastructureTopology": "infrastructureTopology expresses the expectations for infrastructure services that do not run on control plane nodes, usually indicated by a node selector for a `role` value other than `master`. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation", + "controlPlaneTopology": "controlPlaneTopology expresses the expectations for operands that normally run on control nodes. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation The 'External' mode indicates that the control plane is hosted externally to the cluster and that its components are not visible within the cluster.", + "infrastructureTopology": "infrastructureTopology expresses the expectations for infrastructure services that do not run on control plane nodes, usually indicated by a node selector for a `role` value other than `master`. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation NOTE: External topology mode is not applicable for this field.", + "cpuPartitioning": "cpuPartitioning expresses if CPU partitioning is a currently enabled feature in the cluster. CPU Partitioning means that this cluster can support partitioning workloads to specific CPU Sets. Valid values are \"None\" and \"AllNodes\". When omitted, the default value is \"None\". The default value of \"None\" indicates that no nodes will be setup with CPU partitioning. The \"AllNodes\" value indicates that all nodes have been setup with CPU partitioning, and can then be further configured via the PerformanceProfile API.", } func (InfrastructureStatus) SwaggerDoc() map[string]string { @@ -907,8 +1749,95 @@ func (KubevirtPlatformStatus) SwaggerDoc() map[string]string { return map_KubevirtPlatformStatus } +var map_NutanixFailureDomain = map[string]string{ + "": "NutanixFailureDomain configures failure domain information for the Nutanix platform.", + "name": "name defines the unique name of a failure domain. Name is required and must be at most 64 characters in length. It must consist of only lower case alphanumeric characters and hyphens (-). It must start and end with an alphanumeric character. This value is arbitrary and is used to identify the failure domain within the platform.", + "cluster": "cluster is to identify the cluster (the Prism Element under management of the Prism Central), in which the Machine's VM will be created. The cluster identifier (uuid or name) can be obtained from the Prism Central console or using the prism_central API.", + "subnets": "subnets holds a list of identifiers (one or more) of the cluster's network subnets If the feature gate NutanixMultiSubnets is enabled, up to 32 subnets may be configured. for the Machine's VM to connect to. The subnet identifiers (uuid or name) can be obtained from the Prism Central console or using the prism_central API.", +} + +func (NutanixFailureDomain) SwaggerDoc() map[string]string { + return map_NutanixFailureDomain +} + +var map_NutanixPlatformLoadBalancer = map[string]string{ + "": "NutanixPlatformLoadBalancer defines the load balancer used by the cluster on Nutanix platform.", + "type": "type defines the type of load balancer used by the cluster on Nutanix platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (NutanixPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_NutanixPlatformLoadBalancer +} + +var map_NutanixPlatformSpec = map[string]string{ + "": "NutanixPlatformSpec holds the desired state of the Nutanix infrastructure provider. This only includes fields that can be modified in the cluster.", + "prismCentral": "prismCentral holds the endpoint address and port to access the Nutanix Prism Central. When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list.", + "prismElements": "prismElements holds one or more endpoint address and port data to access the Nutanix Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) spread over multiple Prism Elements (clusters) of the Prism Central.", + "failureDomains": "failureDomains configures failure domains information for the Nutanix platform. When set, the failure domains defined here may be used to spread Machines across prism element clusters to improve fault tolerance of the cluster.", +} + +func (NutanixPlatformSpec) SwaggerDoc() map[string]string { + return map_NutanixPlatformSpec +} + +var map_NutanixPlatformStatus = map[string]string{ + "": "NutanixPlatformStatus holds the current status of the Nutanix infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", +} + +func (NutanixPlatformStatus) SwaggerDoc() map[string]string { + return map_NutanixPlatformStatus +} + +var map_NutanixPrismElementEndpoint = map[string]string{ + "": "NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster)", + "name": "name is the name of the Prism Element (cluster). This value will correspond with the cluster field configured on other resources (eg Machines, PVCs, etc).", + "endpoint": "endpoint holds the endpoint address and port data of the Prism Element (cluster). When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list.", +} + +func (NutanixPrismElementEndpoint) SwaggerDoc() map[string]string { + return map_NutanixPrismElementEndpoint +} + +var map_NutanixPrismEndpoint = map[string]string{ + "": "NutanixPrismEndpoint holds the endpoint address and port to access the Nutanix Prism Central or Element (cluster)", + "address": "address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster)", + "port": "port is the port number to access the Nutanix Prism Central or Element (cluster)", +} + +func (NutanixPrismEndpoint) SwaggerDoc() map[string]string { + return map_NutanixPrismEndpoint +} + +var map_NutanixResourceIdentifier = map[string]string{ + "": "NutanixResourceIdentifier holds the identity of a Nutanix PC resource (cluster, image, subnet, etc.)", + "type": "type is the identifier type to use for this resource.", + "uuid": "uuid is the UUID of the resource in the PC. It cannot be empty if the type is UUID.", + "name": "name is the resource name in the PC. It cannot be empty if the type is Name.", +} + +func (NutanixResourceIdentifier) SwaggerDoc() map[string]string { + return map_NutanixResourceIdentifier +} + +var map_OpenStackPlatformLoadBalancer = map[string]string{ + "": "OpenStackPlatformLoadBalancer defines the load balancer used by the cluster on OpenStack platform.", + "type": "type defines the type of load balancer used by the cluster on OpenStack platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (OpenStackPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_OpenStackPlatformLoadBalancer +} + var map_OpenStackPlatformSpec = map[string]string{ - "": "OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. This only includes fields that can be modified in the cluster.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.apiServerInternalIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.ingressIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, for example \"10.0.0.0/8\" or \"fd00::/8\".", } func (OpenStackPlatformSpec) SwaggerDoc() map[string]string { @@ -916,17 +1845,30 @@ func (OpenStackPlatformSpec) SwaggerDoc() map[string]string { } var map_OpenStackPlatformStatus = map[string]string{ - "": "OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider.", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "cloudName": "cloudName is the name of the desired OpenStack cloud in the client configuration file (`clouds.yaml`).", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for OpenStack deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "": "OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "cloudName": "cloudName is the name of the desired OpenStack cloud in the client configuration file (`clouds.yaml`).", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for OpenStack deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes.", } func (OpenStackPlatformStatus) SwaggerDoc() map[string]string { return map_OpenStackPlatformStatus } +var map_OvirtPlatformLoadBalancer = map[string]string{ + "": "OvirtPlatformLoadBalancer defines the load balancer used by the cluster on Ovirt platform.", + "type": "type defines the type of load balancer used by the cluster on Ovirt platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (OvirtPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_OvirtPlatformLoadBalancer +} + var map_OvirtPlatformSpec = map[string]string{ "": "OvirtPlatformSpec holds the desired state of the oVirt infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -936,10 +1878,13 @@ func (OvirtPlatformSpec) SwaggerDoc() map[string]string { } var map_OvirtPlatformStatus = map[string]string{ - "": "OvirtPlatformStatus holds the current status of the oVirt infrastructure provider.", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release.", + "": "OvirtPlatformStatus holds the current status of the oVirt infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", } func (OvirtPlatformStatus) SwaggerDoc() map[string]string { @@ -948,17 +1893,21 @@ func (OvirtPlatformStatus) SwaggerDoc() map[string]string { var map_PlatformSpec = map[string]string{ "": "PlatformSpec holds the desired state specific to the underlying infrastructure provider of the current cluster. Since these are used at spec-level for the underlying cluster, it is supposed that only one of the spec structs is set.", - "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", - "aws": "AWS contains settings specific to the Amazon Web Services infrastructure provider.", - "azure": "Azure contains settings specific to the Azure infrastructure provider.", - "gcp": "GCP contains settings specific to the Google Cloud Platform infrastructure provider.", - "baremetal": "BareMetal contains settings specific to the BareMetal platform.", - "openstack": "OpenStack contains settings specific to the OpenStack infrastructure provider.", - "ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.", - "vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.", - "ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.", - "kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.", - "equinixMetal": "EquinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", + "aws": "aws contains settings specific to the Amazon Web Services infrastructure provider.", + "azure": "azure contains settings specific to the Azure infrastructure provider.", + "gcp": "gcp contains settings specific to the Google Cloud Platform infrastructure provider.", + "baremetal": "baremetal contains settings specific to the BareMetal platform.", + "openstack": "openstack contains settings specific to the OpenStack infrastructure provider.", + "ovirt": "ovirt contains settings specific to the oVirt infrastructure provider.", + "vsphere": "vsphere contains settings specific to the VSphere infrastructure provider.", + "ibmcloud": "ibmcloud contains settings specific to the IBMCloud infrastructure provider.", + "kubevirt": "kubevirt contains settings specific to the kubevirt infrastructure provider.", + "equinixMetal": "equinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "powervs": "powervs contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider.", + "alibabaCloud": "alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider.", + "nutanix": "nutanix contains settings specific to the Nutanix infrastructure provider.", + "external": "ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately.", } func (PlatformSpec) SwaggerDoc() map[string]string { @@ -967,25 +1916,143 @@ func (PlatformSpec) SwaggerDoc() map[string]string { var map_PlatformStatus = map[string]string{ "": "PlatformStatus holds the current status specific to the underlying infrastructure provider of the current cluster. Since these are used at status-level for the underlying cluster, it is supposed that only one of the status structs is set.", - "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.\n\nThis value will be synced with to the `status.platform` and `status.platformStatus.type`. Currently this value cannot be changed once set.", - "aws": "AWS contains settings specific to the Amazon Web Services infrastructure provider.", - "azure": "Azure contains settings specific to the Azure infrastructure provider.", - "gcp": "GCP contains settings specific to the Google Cloud Platform infrastructure provider.", - "baremetal": "BareMetal contains settings specific to the BareMetal platform.", - "openstack": "OpenStack contains settings specific to the OpenStack infrastructure provider.", - "ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.", - "vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.", - "ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.", - "kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.", - "equinixMetal": "EquinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.\n\nThis value will be synced with to the `status.platform` and `status.platformStatus.type`. Currently this value cannot be changed once set.", + "aws": "aws contains settings specific to the Amazon Web Services infrastructure provider.", + "azure": "azure contains settings specific to the Azure infrastructure provider.", + "gcp": "gcp contains settings specific to the Google Cloud Platform infrastructure provider.", + "baremetal": "baremetal contains settings specific to the BareMetal platform.", + "openstack": "openstack contains settings specific to the OpenStack infrastructure provider.", + "ovirt": "ovirt contains settings specific to the oVirt infrastructure provider.", + "vsphere": "vsphere contains settings specific to the VSphere infrastructure provider.", + "ibmcloud": "ibmcloud contains settings specific to the IBMCloud infrastructure provider.", + "kubevirt": "kubevirt contains settings specific to the kubevirt infrastructure provider.", + "equinixMetal": "equinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "powervs": "powervs contains settings specific to the Power Systems Virtual Servers infrastructure provider.", + "alibabaCloud": "alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider.", + "nutanix": "nutanix contains settings specific to the Nutanix infrastructure provider.", + "external": "external contains settings specific to the generic External infrastructure provider.", } func (PlatformStatus) SwaggerDoc() map[string]string { return map_PlatformStatus } +var map_PowerVSPlatformSpec = map[string]string{ + "": "PowerVSPlatformSpec holds the desired state of the IBM Power Systems Virtual Servers infrastructure provider. This only includes fields that can be modified in the cluster.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service.", +} + +func (PowerVSPlatformSpec) SwaggerDoc() map[string]string { + return map_PowerVSPlatformSpec +} + +var map_PowerVSPlatformStatus = map[string]string{ + "": "PowerVSPlatformStatus holds the current status of the IBM Power Systems Virtual Servers infrastrucutre provider.", + "region": "region holds the default Power VS region for new Power VS resources created by the cluster.", + "zone": "zone holds the default zone for the new Power VS resources created by the cluster. Note: Currently only single-zone OCP clusters are supported", + "resourceGroup": "resourceGroup is the resource group name for new IBMCloud resources created for a cluster. The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. When omitted, the image registry operator won't be able to configure storage, which results in the image registry cluster operator not being in an available state.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service.", + "cisInstanceCRN": "cisInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain", + "dnsInstanceCRN": "dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain", +} + +func (PowerVSPlatformStatus) SwaggerDoc() map[string]string { + return map_PowerVSPlatformStatus +} + +var map_PowerVSServiceEndpoint = map[string]string{ + "": "PowervsServiceEndpoint stores the configuration of a custom url to override existing defaults of PowerVS Services.", + "name": "name is the name of the Power VS service. Few of the services are IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller Power Cloud - https://cloud.ibm.com/apidocs/power-cloud", + "url": "url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty.", +} + +func (PowerVSServiceEndpoint) SwaggerDoc() map[string]string { + return map_PowerVSServiceEndpoint +} + +var map_VSphereFailureDomainHostGroup = map[string]string{ + "": "VSphereFailureDomainHostGroup holds the vmGroup and the hostGroup names in vCenter corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also contains the vmHostRule which is an affinity vm-host rule in vCenter.", + "vmGroup": "vmGroup is the name of the vm-host group of type virtual machine within vCenter for this failure domain. vmGroup is limited to 80 characters. This field is required when the VSphereFailureDomain ZoneType is HostGroup", + "hostGroup": "hostGroup is the name of the vm-host group of type host within vCenter for this failure domain. hostGroup is limited to 80 characters. This field is required when the VSphereFailureDomain ZoneType is HostGroup", + "vmHostRule": "vmHostRule is the name of the affinity vm-host rule within vCenter for this failure domain. vmHostRule is limited to 80 characters. This field is required when the VSphereFailureDomain ZoneType is HostGroup", +} + +func (VSphereFailureDomainHostGroup) SwaggerDoc() map[string]string { + return map_VSphereFailureDomainHostGroup +} + +var map_VSphereFailureDomainRegionAffinity = map[string]string{ + "": "VSphereFailureDomainRegionAffinity contains the region type which is the string representation of the VSphereFailureDomainRegionType with available options of Datacenter and ComputeCluster.", + "type": "type determines the vSphere object type for a region within this failure domain. Available types are Datacenter and ComputeCluster. When set to Datacenter, this means the vCenter Datacenter defined is the region. When set to ComputeCluster, this means the vCenter cluster defined is the region.", +} + +func (VSphereFailureDomainRegionAffinity) SwaggerDoc() map[string]string { + return map_VSphereFailureDomainRegionAffinity +} + +var map_VSphereFailureDomainZoneAffinity = map[string]string{ + "": "VSphereFailureDomainZoneAffinity contains the vCenter cluster vm-host group (virtual machine and host types) and the vm-host affinity rule that together creates an affinity configuration for vm-host based zonal. This configuration within vCenter creates the required association between a failure domain, virtual machines and ESXi hosts to create a vm-host based zone.", + "type": "type determines the vSphere object type for a zone within this failure domain. Available types are ComputeCluster and HostGroup. When set to ComputeCluster, this means the vCenter cluster defined is the zone. When set to HostGroup, hostGroup must be configured with hostGroup, vmGroup and vmHostRule and this means the zone is defined by the grouping of those fields.", + "hostGroup": "hostGroup holds the vmGroup and the hostGroup names in vCenter corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also contains the vmHostRule which is an affinity vm-host rule in vCenter.", +} + +func (VSphereFailureDomainZoneAffinity) SwaggerDoc() map[string]string { + return map_VSphereFailureDomainZoneAffinity +} + +var map_VSpherePlatformFailureDomainSpec = map[string]string{ + "": "VSpherePlatformFailureDomainSpec holds the region and zone failure domain and the vCenter topology of that failure domain.", + "name": "name defines the arbitrary but unique name of a failure domain.", + "region": "region defines the name of a region tag that will be attached to a vCenter datacenter. The tag category in vCenter must be named openshift-region.", + "zone": "zone defines the name of a zone tag that will be attached to a vCenter cluster. The tag category in vCenter must be named openshift-zone.", + "regionAffinity": "regionAffinity holds the type of region, Datacenter or ComputeCluster. When set to Datacenter, this means the region is a vCenter Datacenter as defined in topology. When set to ComputeCluster, this means the region is a vCenter Cluster as defined in topology.", + "zoneAffinity": "zoneAffinity holds the type of the zone and the hostGroup which vmGroup and the hostGroup names in vCenter corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also contains the vmHostRule which is an affinity vm-host rule in vCenter.", + "server": "server is the fully-qualified domain name or the IP address of the vCenter server.", + "topology": "topology describes a given failure domain using vSphere constructs", +} + +func (VSpherePlatformFailureDomainSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformFailureDomainSpec +} + +var map_VSpherePlatformLoadBalancer = map[string]string{ + "": "VSpherePlatformLoadBalancer defines the load balancer used by the cluster on VSphere platform.", + "type": "type defines the type of load balancer used by the cluster on VSphere platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (VSpherePlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_VSpherePlatformLoadBalancer +} + +var map_VSpherePlatformNodeNetworking = map[string]string{ + "": "VSpherePlatformNodeNetworking holds the external and internal node networking spec.", + "external": "external represents the network configuration of the node that is externally routable.", + "internal": "internal represents the network configuration of the node that is routable only within the cluster.", +} + +func (VSpherePlatformNodeNetworking) SwaggerDoc() map[string]string { + return map_VSpherePlatformNodeNetworking +} + +var map_VSpherePlatformNodeNetworkingSpec = map[string]string{ + "": "VSpherePlatformNodeNetworkingSpec holds the network CIDR(s) and port group name for including and excluding IP ranges in the cloud provider. This would be used for example when multiple network adapters are attached to a guest to help determine which IP address the cloud config manager should use for the external and internal node networking.", + "networkSubnetCidr": "networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs that will be used in respective status.addresses fields.", + "network": "network VirtualMachine's VM Network names that will be used to when searching for status.addresses fields. Note that if internal.networkSubnetCIDR and external.networkSubnetCIDR are not set, then the vNIC associated to this network must only have a single IP address assigned to it. The available networks (port groups) can be listed using `govc ls 'network/*'`", + "excludeNetworkSubnetCidr": "excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting the IP address from the VirtualMachine's VM for use in the status.addresses fields.", +} + +func (VSpherePlatformNodeNetworkingSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformNodeNetworkingSpec +} + var map_VSpherePlatformSpec = map[string]string{ - "": "VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. In the future the cloud provider operator, storage operator and machine operator will use these fields for configuration.", + "vcenters": "vcenters holds the connection details for services to communicate with vCenter. Currently, only a single vCenter is supported, but in tech preview 3 vCenters are supported. Once the cluster has been installed, you are unable to change the current number of defined vCenters except in the case where the cluster has been upgraded from a version of OpenShift where the vsphere platform spec was not present. You may make modifications to the existing vCenters that are defined in the vcenters list in order to match with any added or modified failure domains.", + "failureDomains": "failureDomains contains the definition of region, zone and the vCenter topology. If this is omitted failure domains (regions and zones) will not be used.", + "nodeNetworking": "nodeNetworking contains the definition of internal and external network constraints for assigning the node's networking. If this field is omitted, networking defaults to the legacy address selection behavior which is to only support a single address and return the first one found.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.apiServerInternalIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.ingressIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, for example \"10.0.0.0/8\" or \"fd00::/8\".", } func (VSpherePlatformSpec) SwaggerDoc() map[string]string { @@ -993,16 +2060,55 @@ func (VSpherePlatformSpec) SwaggerDoc() map[string]string { } var map_VSpherePlatformStatus = map[string]string{ - "": "VSpherePlatformStatus holds the current status of the vSphere infrastructure provider.", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for vSphere deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "": "VSpherePlatformStatus holds the current status of the vSphere infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for vSphere deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes.", } func (VSpherePlatformStatus) SwaggerDoc() map[string]string { return map_VSpherePlatformStatus } +var map_VSpherePlatformTopology = map[string]string{ + "": "VSpherePlatformTopology holds the required and optional vCenter objects - datacenter, computeCluster, networks, datastore and resourcePool - to provision virtual machines.", + "datacenter": "datacenter is the name of vCenter datacenter in which virtual machines will be located. The maximum length of the datacenter name is 80 characters.", + "computeCluster": "computeCluster the absolute path of the vCenter cluster in which virtual machine will be located. The absolute path is of the form //host/. The maximum length of the path is 2048 characters.", + "networks": "networks is the list of port group network names within this failure domain. If feature gate VSphereMultiNetworks is enabled, up to 10 network adapters may be defined. 10 is the maximum number of virtual network devices which may be attached to a VM as defined by: https://configmax.esp.vmware.com/guest?vmwareproduct=vSphere&release=vSphere%208.0&categories=1-0 The available networks (port groups) can be listed using `govc ls 'network/*'` Networks should be in the form of an absolute path: //network/.", + "datastore": "datastore is the absolute path of the datastore in which the virtual machine is located. The absolute path is of the form //datastore/ The maximum length of the path is 2048 characters.", + "resourcePool": "resourcePool is the absolute path of the resource pool where virtual machines will be created. The absolute path is of the form //host//Resources/. The maximum length of the path is 2048 characters.", + "folder": "folder is the absolute path of the folder where virtual machines are located. The absolute path is of the form //vm/. The maximum length of the path is 2048 characters.", + "template": "template is the full inventory path of the virtual machine or template that will be cloned when creating new machines in this failure domain. The maximum length of the path is 2048 characters.\n\nWhen omitted, the template will be calculated by the control plane machineset operator based on the region and zone defined in VSpherePlatformFailureDomainSpec. For example, for zone=zonea, region=region1, and infrastructure name=test, the template path would be calculated as //vm/test-rhcos-region1-zonea.", +} + +func (VSpherePlatformTopology) SwaggerDoc() map[string]string { + return map_VSpherePlatformTopology +} + +var map_VSpherePlatformVCenterSpec = map[string]string{ + "": "VSpherePlatformVCenterSpec stores the vCenter connection fields. This is used by the vSphere CCM.", + "server": "server is the fully-qualified domain name or the IP address of the vCenter server.", + "port": "port is the TCP port that will be used to communicate to the vCenter endpoint. When omitted, this means the user has no opinion and it is up to the platform to choose a sensible default, which is subject to change over time.", + "datacenters": "The vCenter Datacenters in which the RHCOS vm guests are located. This field will be used by the Cloud Controller Manager. Each datacenter listed here should be used within a topology.", +} + +func (VSpherePlatformVCenterSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformVCenterSpec +} + +var map_AWSIngressSpec = map[string]string{ + "": "AWSIngressSpec holds the desired state of the Ingress for Amazon Web Services infrastructure provider. This only includes fields that can be modified in the cluster.", + "type": "type allows user to set a load balancer type. When this field is set the default ingresscontroller will get created using the specified LBType. If this field is not set then the default ingress controller of LBType Classic will be created. Valid values are:\n\n* \"Classic\": A Classic Load Balancer that makes routing decisions at either\n the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See\n the following for additional details:\n\n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb\n\n* \"NLB\": A Network Load Balancer that makes routing decisions at the\n transport layer (TCP/SSL). See the following for additional details:\n\n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb", +} + +func (AWSIngressSpec) SwaggerDoc() map[string]string { + return map_AWSIngressSpec +} + var map_ComponentRouteSpec = map[string]string{ "": "ComponentRouteSpec allows for configuration of a route's hostname and serving certificate.", "namespace": "namespace is the namespace of the route to customize.\n\nThe namespace and name of this componentRoute must match a corresponding entry in the list of status.componentRoutes if the route is to be customized.", @@ -1031,19 +2137,41 @@ func (ComponentRouteStatus) SwaggerDoc() map[string]string { } var map_Ingress = map[string]string{ - "": "Ingress holds cluster-wide information about ingress, including the default ingress domain used for routes. The canonical name is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Ingress holds cluster-wide information about ingress, including the default ingress domain used for routes. The canonical name is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Ingress) SwaggerDoc() map[string]string { return map_Ingress } +var map_IngressList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (IngressList) SwaggerDoc() map[string]string { + return map_IngressList +} + +var map_IngressPlatformSpec = map[string]string{ + "": "IngressPlatformSpec holds the desired state of Ingress specific to the underlying infrastructure provider of the current cluster. Since these are used at spec-level for the underlying cluster, it is supposed that only one of the spec structs is set.", + "type": "type is the underlying infrastructure provider for the cluster. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", + "aws": "aws contains settings specific to the Amazon Web Services infrastructure provider.", +} + +func (IngressPlatformSpec) SwaggerDoc() map[string]string { + return map_IngressPlatformSpec +} + var map_IngressSpec = map[string]string{ - "domain": "domain is used to generate a default host name for a route when the route's host name is empty. The generated host name will follow this pattern: \"..\".\n\nIt is also used as the default wildcard domain suffix for ingress. The default ingresscontroller domain will follow this pattern: \"*.\".\n\nOnce set, changing domain is not currently supported.", - "appsDomain": "appsDomain is an optional domain to use instead of the one specified in the domain field when a Route is created without specifying an explicit host. If appsDomain is nonempty, this value is used to generate default host values for Route. Unlike domain, appsDomain may be modified after installation. This assumes a new ingresscontroller has been setup with a wildcard certificate.", - "componentRoutes": "componentRoutes is an optional list of routes that are managed by OpenShift components that a cluster-admin is able to configure the hostname and serving certificate for. The namespace and name of each route in this list should match an existing entry in the status.componentRoutes list.\n\nTo determine the set of configurable Routes, look at namespace and name of entries in the .status.componentRoutes list, where participating operators write the status of configurable routes.", + "domain": "domain is used to generate a default host name for a route when the route's host name is empty. The generated host name will follow this pattern: \"..\".\n\nIt is also used as the default wildcard domain suffix for ingress. The default ingresscontroller domain will follow this pattern: \"*.\".\n\nOnce set, changing domain is not currently supported.", + "appsDomain": "appsDomain is an optional domain to use instead of the one specified in the domain field when a Route is created without specifying an explicit host. If appsDomain is nonempty, this value is used to generate default host values for Route. Unlike domain, appsDomain may be modified after installation. This assumes a new ingresscontroller has been setup with a wildcard certificate.", + "componentRoutes": "componentRoutes is an optional list of routes that are managed by OpenShift components that a cluster-admin is able to configure the hostname and serving certificate for. The namespace and name of each route in this list should match an existing entry in the status.componentRoutes list.\n\nTo determine the set of configurable Routes, look at namespace and name of entries in the .status.componentRoutes list, where participating operators write the status of configurable routes.", + "requiredHSTSPolicies": "requiredHSTSPolicies specifies HSTS policies that are required to be set on newly created or updated routes matching the domainPattern/s and namespaceSelector/s that are specified in the policy. Each requiredHSTSPolicy must have at least a domainPattern and a maxAge to validate a route HSTS Policy route annotation, and affect route admission.\n\nA candidate route is checked for HSTS Policies if it has the HSTS Policy route annotation: \"haproxy.router.openshift.io/hsts_header\" E.g. haproxy.router.openshift.io/hsts_header: max-age=31536000;preload;includeSubDomains\n\n- For each candidate route, if it matches a requiredHSTSPolicy domainPattern and optional namespaceSelector, then the maxAge, preloadPolicy, and includeSubdomainsPolicy must be valid to be admitted. Otherwise, the route is rejected. - The first match, by domainPattern and optional namespaceSelector, in the ordering of the RequiredHSTSPolicies determines the route's admission status. - If the candidate route doesn't match any requiredHSTSPolicy domainPattern and optional namespaceSelector, then it may use any HSTS Policy annotation.\n\nThe HSTS policy configuration may be changed after routes have already been created. An update to a previously admitted route may then fail if the updated route does not conform to the updated HSTS policy configuration. However, changing the HSTS policy configuration will not cause a route that is already admitted to stop working.\n\nNote that if there are no RequiredHSTSPolicies, any HSTS Policy annotation on the route is valid.", + "loadBalancer": "loadBalancer contains the load balancer details in general which are not only specific to the underlying infrastructure provider of the current cluster and are required for Ingress Controller to work on OpenShift.", } func (IngressSpec) SwaggerDoc() map[string]string { @@ -1051,13 +2179,140 @@ func (IngressSpec) SwaggerDoc() map[string]string { } var map_IngressStatus = map[string]string{ - "componentRoutes": "componentRoutes is where participating operators place the current route status for routes whose hostnames and serving certificates can be customized by the cluster-admin.", + "componentRoutes": "componentRoutes is where participating operators place the current route status for routes whose hostnames and serving certificates can be customized by the cluster-admin.", + "defaultPlacement": "defaultPlacement is set at installation time to control which nodes will host the ingress router pods by default. The options are control-plane nodes or worker nodes.\n\nThis field works by dictating how the Cluster Ingress Operator will consider unset replicas and nodePlacement fields in IngressController resources when creating the corresponding Deployments.\n\nSee the documentation for the IngressController replicas and nodePlacement fields for more information.\n\nWhen omitted, the default value is Workers", } func (IngressStatus) SwaggerDoc() map[string]string { return map_IngressStatus } +var map_LoadBalancer = map[string]string{ + "platform": "platform holds configuration specific to the underlying infrastructure provider for the ingress load balancers. When omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time.", +} + +func (LoadBalancer) SwaggerDoc() map[string]string { + return map_LoadBalancer +} + +var map_Custom = map[string]string{ + "": "Custom provides the custom configuration of gatherers", + "configs": "configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. It may not exceed 100 items and each gatherer can be present only once. It is possible to disable an entire set of gatherers while allowing a specific function within that set. The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. Run the following command to get the names of last active gatherers: \"oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'\"", +} + +func (Custom) SwaggerDoc() map[string]string { + return map_Custom +} + +var map_GatherConfig = map[string]string{ + "": "GatherConfig provides data gathering configuration options.", + "dataPolicy": "dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. It may not exceed 2 items and must not contain duplicates. Valid values are ObfuscateNetworking and WorkloadNames. When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. When omitted no obfuscation is applied.", + "gatherers": "gatherers is a required field that specifies the configuration of the gatherers.", + "storage": "storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. If omitted, the gathering job will use ephemeral storage.", +} + +func (GatherConfig) SwaggerDoc() map[string]string { + return map_GatherConfig +} + +var map_GathererConfig = map[string]string{ + "": "GathererConfig allows to configure specific gatherers", + "name": "name is the required name of a specific gatherer. It may not exceed 256 characters. The format for a gatherer name is: {gatherer}/{function} where the function is optional. Gatherer consists of a lowercase letters only that may include underscores (_). Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. Run the following command to get the names of last active gatherers: \"oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'\"", + "state": "state is a required field that allows you to configure specific gatherer. Valid values are \"Enabled\" and \"Disabled\". When set to Enabled the gatherer will run. When set to Disabled the gatherer will not run.", +} + +func (GathererConfig) SwaggerDoc() map[string]string { + return map_GathererConfig +} + +var map_Gatherers = map[string]string{ + "": "Gatherers specifies the configuration of the gatherers", + "mode": "mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. When set to All, all gatherers will run and gather data. When set to None, all gatherers will be disabled and no data will be gathered. When set to Custom, the custom configuration from the custom field will be applied.", + "custom": "custom provides gathering configuration. It is required when mode is Custom, and forbidden otherwise. Custom configuration allows user to disable only a subset of gatherers. Gatherers that are not explicitly disabled in custom configuration will run.", +} + +func (Gatherers) SwaggerDoc() map[string]string { + return map_Gatherers +} + +var map_InsightsDataGather = map[string]string{ + "": "InsightsDataGather provides data gather configuration options for the Insights Operator.\n\n\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", +} + +func (InsightsDataGather) SwaggerDoc() map[string]string { + return map_InsightsDataGather +} + +var map_InsightsDataGatherList = map[string]string{ + "": "InsightsDataGatherList is a collection of items Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the required standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is the required list of InsightsDataGather objects it may not exceed 100 items", +} + +func (InsightsDataGatherList) SwaggerDoc() map[string]string { + return map_InsightsDataGatherList +} + +var map_InsightsDataGatherSpec = map[string]string{ + "": "InsightsDataGatherSpec contains the configuration for the data gathering.", + "gatherConfig": "gatherConfig is a required spec attribute that includes all the configuration options related to gathering of the Insights data and its uploading to the ingress.", +} + +func (InsightsDataGatherSpec) SwaggerDoc() map[string]string { + return map_InsightsDataGatherSpec +} + +var map_PersistentVolumeClaimReference = map[string]string{ + "": "PersistentVolumeClaimReference is a reference to a PersistentVolumeClaim.", + "name": "name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. It is a string that follows the DNS1123 subdomain format. It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character.", +} + +func (PersistentVolumeClaimReference) SwaggerDoc() map[string]string { + return map_PersistentVolumeClaimReference +} + +var map_PersistentVolumeConfig = map[string]string{ + "": "PersistentVolumeConfig provides configuration options for PersistentVolume storage.", + "claim": "claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. The PersistentVolumeClaim must be created in the openshift-insights namespace.", + "mountPath": "mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. The current default mount path is /var/lib/insights-operator The path may not exceed 1024 characters and must not contain a colon.", +} + +func (PersistentVolumeConfig) SwaggerDoc() map[string]string { + return map_PersistentVolumeConfig +} + +var map_Storage = map[string]string{ + "": "Storage provides persistent storage configuration options for gathering jobs. If the type is set to PersistentVolume, then the PersistentVolume must be defined. If the type is set to Ephemeral, then the PersistentVolume must not be defined.", + "type": "type is a required field that specifies the type of storage that will be used to store the Insights data archive. Valid values are \"PersistentVolume\" and \"Ephemeral\". When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field.", + "persistentVolume": "persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. The PersistentVolume must be created in the openshift-insights namespace.", +} + +func (Storage) SwaggerDoc() map[string]string { + return map_Storage +} + +var map_AWSKMSConfig = map[string]string{ + "": "AWSKMSConfig defines the KMS config specific to AWS KMS provider", + "keyARN": "keyARN specifies the Amazon Resource Name (ARN) of the AWS KMS key used for encryption. The value must adhere to the format `arn:aws:kms:::key/`, where: - `` is the AWS region consisting of lowercase letters and hyphens followed by a number. - `` is a 12-digit numeric identifier for the AWS account. - `` is a unique identifier for the KMS key, consisting of lowercase hexadecimal characters and hyphens.", + "region": "region specifies the AWS region where the KMS instance exists, and follows the format `--`, e.g.: `us-east-1`. Only lowercase letters and hyphens followed by numbers are allowed.", +} + +func (AWSKMSConfig) SwaggerDoc() map[string]string { + return map_AWSKMSConfig +} + +var map_KMSConfig = map[string]string{ + "": "KMSConfig defines the configuration for the KMS instance that will be used with KMSEncryptionProvider encryption", + "type": "type defines the kind of platform for the KMS provider. Available provider types are AWS only.", + "aws": "aws defines the key config for using an AWS KMS instance for the encryption. The AWS KMS instance is managed by the user outside the purview of the control plane.", +} + +func (KMSConfig) SwaggerDoc() map[string]string { + return map_KMSConfig +} + var map_ClusterNetworkEntry = map[string]string{ "": "ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs are allocated.", "cidr": "The complete block for pod IPs.", @@ -1088,19 +2343,80 @@ func (ExternalIPPolicy) SwaggerDoc() map[string]string { return map_ExternalIPPolicy } +var map_MTUMigration = map[string]string{ + "": "MTUMigration contains infomation about MTU migration.", + "network": "network contains MTU migration configuration for the default network.", + "machine": "machine contains MTU migration configuration for the machine's uplink.", +} + +func (MTUMigration) SwaggerDoc() map[string]string { + return map_MTUMigration +} + +var map_MTUMigrationValues = map[string]string{ + "": "MTUMigrationValues contains the values for a MTU migration.", + "to": "to is the MTU to migrate to.", + "from": "from is the MTU to migrate from.", +} + +func (MTUMigrationValues) SwaggerDoc() map[string]string { + return map_MTUMigrationValues +} + var map_Network = map[string]string{ - "": "Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. Please view network.spec for an explanation on what applies when configuring this resource.", - "spec": "spec holds user settable values for configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. Please view network.spec for an explanation on what applies when configuring this resource.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Network) SwaggerDoc() map[string]string { return map_Network } +var map_NetworkDiagnostics = map[string]string{ + "mode": "mode controls the network diagnostics mode\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is All.", + "sourcePlacement": "sourcePlacement controls the scheduling of network diagnostics source deployment\n\nSee NetworkDiagnosticsSourcePlacement for more details about default values.", + "targetPlacement": "targetPlacement controls the scheduling of network diagnostics target daemonset\n\nSee NetworkDiagnosticsTargetPlacement for more details about default values.", +} + +func (NetworkDiagnostics) SwaggerDoc() map[string]string { + return map_NetworkDiagnostics +} + +var map_NetworkDiagnosticsSourcePlacement = map[string]string{ + "": "NetworkDiagnosticsSourcePlacement defines node scheduling configuration network diagnostics source components", + "nodeSelector": "nodeSelector is the node selector applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is `kubernetes.io/os: linux`.", + "tolerations": "tolerations is a list of tolerations applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is an empty list.", +} + +func (NetworkDiagnosticsSourcePlacement) SwaggerDoc() map[string]string { + return map_NetworkDiagnosticsSourcePlacement +} + +var map_NetworkDiagnosticsTargetPlacement = map[string]string{ + "": "NetworkDiagnosticsTargetPlacement defines node scheduling configuration network diagnostics target components", + "nodeSelector": "nodeSelector is the node selector applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is `kubernetes.io/os: linux`.", + "tolerations": "tolerations is a list of tolerations applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is `- operator: \"Exists\"` which means that all taints are tolerated.", +} + +func (NetworkDiagnosticsTargetPlacement) SwaggerDoc() map[string]string { + return map_NetworkDiagnosticsTargetPlacement +} + +var map_NetworkList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (NetworkList) SwaggerDoc() map[string]string { + return map_NetworkList +} + var map_NetworkMigration = map[string]string{ - "": "NetworkMigration represents the cluster network configuration.", - "networkType": "NetworkType is the target plugin that is to be deployed. Currently supported values are: OpenShiftSDN, OVNKubernetes", + "": "NetworkMigration represents the network migration status.", + "networkType": "networkType is the target plugin that is being deployed. DEPRECATED: network type migration is no longer supported, so this should always be unset.", + "mtu": "mtu is the MTU configuration that is being deployed.", } func (NetworkMigration) SwaggerDoc() map[string]string { @@ -1111,9 +2427,10 @@ var map_NetworkSpec = map[string]string{ "": "NetworkSpec is the desired network configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", "clusterNetwork": "IP address pool to use for pod IPs. This field is immutable after installation.", "serviceNetwork": "IP address pool for services. Currently, we only support a single entry here. This field is immutable after installation.", - "networkType": "NetworkType is the plugin that is to be deployed (e.g. OpenShiftSDN). This should match a value that the cluster-network-operator understands, or else no networking will be installed. Currently supported values are: - OpenShiftSDN This field is immutable after installation.", + "networkType": "networkType is the plugin that is to be deployed (e.g. OVNKubernetes). This should match a value that the cluster-network-operator understands, or else no networking will be installed. Currently supported values are: - OVNKubernetes This field is immutable after installation.", "externalIP": "externalIP defines configuration for controllers that affect Service.ExternalIP. If nil, then ExternalIP is not allowed to be set.", "serviceNodePortRange": "The port range allowed for Services of type NodePort. If not specified, the default of 30000-32767 will be used. Such Services without a NodePort specified will have one automatically allocated from this range. This parameter can be updated after the cluster is installed.", + "networkDiagnostics": "networkDiagnostics defines network diagnostics configuration.\n\nTakes precedence over spec.disableNetworkDiagnostics in network.operator.openshift.io. If networkDiagnostics is not specified or is empty, and the spec.disableNetworkDiagnostics flag in network.operator.openshift.io is set to true, the network diagnostics feature will be disabled.", } func (NetworkSpec) SwaggerDoc() map[string]string { @@ -1124,15 +2441,54 @@ var map_NetworkStatus = map[string]string{ "": "NetworkStatus is the current network configuration.", "clusterNetwork": "IP address pool to use for pod IPs.", "serviceNetwork": "IP address pool for services. Currently, we only support a single entry here.", - "networkType": "NetworkType is the plugin that is deployed (e.g. OpenShiftSDN).", - "clusterNetworkMTU": "ClusterNetworkMTU is the MTU for inter-pod networking.", - "migration": "Migration contains the cluster network migration configuration.", + "networkType": "networkType is the plugin that is deployed (e.g. OVNKubernetes).", + "clusterNetworkMTU": "clusterNetworkMTU is the MTU for inter-pod networking.", + "migration": "migration contains the cluster network migration configuration.", + "conditions": "conditions represents the observations of a network.config current state. Known .status.conditions.type are: \"NetworkDiagnosticsAvailable\"", } func (NetworkStatus) SwaggerDoc() map[string]string { return map_NetworkStatus } +var map_Node = map[string]string{ + "": "Node holds cluster-wide information about node specific features.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values.", +} + +func (Node) SwaggerDoc() map[string]string { + return map_Node +} + +var map_NodeList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (NodeList) SwaggerDoc() map[string]string { + return map_NodeList +} + +var map_NodeSpec = map[string]string{ + "cgroupMode": "cgroupMode determines the cgroups version on the node", + "workerLatencyProfile": "workerLatencyProfile determins the how fast the kubelet is updating the status and corresponding reaction of the cluster", + "minimumKubeletVersion": "minimumKubeletVersion is the lowest version of a kubelet that can join the cluster. Specifically, the apiserver will deny most authorization requests of kubelets that are older than the specified version, only allowing the kubelet to get and update its node object, and perform subjectaccessreviews. This means any kubelet that attempts to join the cluster will not be able to run any assigned workloads, and will eventually be marked as not ready. Its max length is 8, so maximum version allowed is either \"9.999.99\" or \"99.99.99\". Since the kubelet reports the version of the kubernetes release, not Openshift, this field references the underlying kubernetes version this version of Openshift is based off of. In other words: if an admin wishes to ensure no nodes run an older version than Openshift 4.17, then they should set the minimumKubeletVersion to 1.30.0. When comparing versions, the kubelet's version is stripped of any contents outside of major.minor.patch version. Thus, a kubelet with version \"1.0.0-ec.0\" will be compatible with minimumKubeletVersion \"1.0.0\" or earlier.", +} + +func (NodeSpec) SwaggerDoc() map[string]string { + return map_NodeSpec +} + +var map_NodeStatus = map[string]string{ + "conditions": "conditions contain the details and the current state of the nodes.config object", +} + +func (NodeStatus) SwaggerDoc() map[string]string { + return map_NodeStatus +} + var map_BasicAuthIdentityProvider = map[string]string{ "": "BasicAuthPasswordIdentityProvider provides identities for users authenticating using HTTP basic auth credentials", } @@ -1251,15 +2607,25 @@ func (LDAPIdentityProvider) SwaggerDoc() map[string]string { } var map_OAuth = map[string]string{ - "": "OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. It is used to configure the integrated OAuth server. This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. It is used to configure the integrated OAuth server. This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (OAuth) SwaggerDoc() map[string]string { return map_OAuth } +var map_OAuthList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (OAuthList) SwaggerDoc() map[string]string { + return map_OAuthList +} + var map_OAuthRemoteConnectionInfo = map[string]string{ "": "OAuthRemoteConnectionInfo holds information necessary for establishing a remote connection", "url": "url is the remote URL to connect to", @@ -1307,6 +2673,7 @@ var map_OpenIDClaims = map[string]string{ "preferredUsername": "preferredUsername is the list of claims whose values should be used as the preferred username. If unspecified, the preferred username is determined from the value of the sub claim", "name": "name is the list of claims whose values should be used as the display name. Optional. If unspecified, no display name is set for the identity", "email": "email is the list of claims whose values should be used as the email address. Optional. If unspecified, no email is set for the identity", + "groups": "groups is the list of claims value of which should be used to synchronize groups from the OIDC provider to OpenShift for the user. If multiple claims are specified, the first one with a non-empty value is used.", } func (OpenIDClaims) SwaggerDoc() map[string]string { @@ -1348,7 +2715,7 @@ var map_TokenConfig = map[string]string{ "": "TokenConfig holds the necessary configuration options for authorization and access tokens", "accessTokenMaxAgeSeconds": "accessTokenMaxAgeSeconds defines the maximum age of access tokens", "accessTokenInactivityTimeoutSeconds": "accessTokenInactivityTimeoutSeconds - DEPRECATED: setting this field has no effect.", - "accessTokenInactivityTimeout": "accessTokenInactivityTimeout defines the token inactivity timeout for tokens granted by any client. The value represents the maximum amount of time that can occur between consecutive uses of the token. Tokens become invalid if they are not used within this temporal window. The user will need to acquire a new token to regain access once a token times out. Takes valid time duration string such as \"5m\", \"1.5h\" or \"2h45m\". The minimum allowed value for duration is 300s (5 minutes). If the timeout is configured per client, then that value takes precedence. If the timeout value is not specified and the client does not override the value, then tokens are valid until their lifetime.", + "accessTokenInactivityTimeout": "accessTokenInactivityTimeout defines the token inactivity timeout for tokens granted by any client. The value represents the maximum amount of time that can occur between consecutive uses of the token. Tokens become invalid if they are not used within this temporal window. The user will need to acquire a new token to regain access once a token times out. Takes valid time duration string such as \"5m\", \"1.5h\" or \"2h45m\". The minimum allowed value for duration is 300s (5 minutes). If the timeout is configured per client, then that value takes precedence. If the timeout value is not specified and the client does not override the value, then tokens are valid until their lifetime.\n\nWARNING: existing tokens' timeout will not be affected (lowered) by changing this value", } func (TokenConfig) SwaggerDoc() map[string]string { @@ -1376,7 +2743,8 @@ func (HubSourceStatus) SwaggerDoc() map[string]string { } var map_OperatorHub = map[string]string{ - "": "OperatorHub is the Schema for the operatorhubs API. It can be used to change the state of the default hub sources for OperatorHub on the cluster from enabled to disabled and vice versa.", + "": "OperatorHub is the Schema for the operatorhubs API. It can be used to change the state of the default hub sources for OperatorHub on the cluster from enabled to disabled and vice versa.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (OperatorHub) SwaggerDoc() map[string]string { @@ -1384,7 +2752,8 @@ func (OperatorHub) SwaggerDoc() map[string]string { } var map_OperatorHubList = map[string]string{ - "": "OperatorHubList contains a list of OperatorHub", + "": "OperatorHubList contains a list of OperatorHub\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (OperatorHubList) SwaggerDoc() map[string]string { @@ -1411,15 +2780,25 @@ func (OperatorHubStatus) SwaggerDoc() map[string]string { } var map_Project = map[string]string{ - "": "Project holds cluster-wide information about Project. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Project holds cluster-wide information about Project. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Project) SwaggerDoc() map[string]string { return map_Project } +var map_ProjectList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ProjectList) SwaggerDoc() map[string]string { + return map_ProjectList +} + var map_ProjectSpec = map[string]string{ "": "ProjectSpec holds the project creation configuration.", "projectRequestMessage": "projectRequestMessage is the string presented to a user if they are unable to request a project via the projectrequest api endpoint", @@ -1440,20 +2819,30 @@ func (TemplateReference) SwaggerDoc() map[string]string { } var map_Proxy = map[string]string{ - "": "Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster`", - "spec": "Spec holds user-settable values for the proxy configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user-settable values for the proxy configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Proxy) SwaggerDoc() map[string]string { return map_Proxy } +var map_ProxyList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ProxyList) SwaggerDoc() map[string]string { + return map_ProxyList +} + var map_ProxySpec = map[string]string{ "": "ProxySpec contains cluster proxy creation configuration.", "httpProxy": "httpProxy is the URL of the proxy for HTTP requests. Empty means unset and will not result in an env var.", "httpsProxy": "httpsProxy is the URL of the proxy for HTTPS requests. Empty means unset and will not result in an env var.", - "noProxy": "noProxy is a comma-separated list of hostnames and/or CIDRs for which the proxy should not be used. Empty means unset and will not result in an env var.", + "noProxy": "noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. Empty means unset and will not result in an env var.", "readinessEndpoints": "readinessEndpoints is a list of endpoints used to verify readiness of the proxy.", "trustedCA": "trustedCA is a reference to a ConfigMap containing a CA certificate bundle. The trustedCA field should only be consumed by a proxy validator. The validator is responsible for reading the certificate bundle from the required key \"ca-bundle.crt\", merging it with the system default trust bundle, and writing the merged trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" namespace. Clients that expect to make proxy connections must use the trusted-ca-bundle for all HTTPS requests to the proxy, and may use the trusted-ca-bundle for non-proxy HTTPS requests as well.\n\nThe namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". Here is an example ConfigMap (in yaml):\n\napiVersion: v1 kind: ConfigMap metadata:\n name: user-ca-bundle\n namespace: openshift-config\n data:\n ca-bundle.crt: |", } @@ -1473,27 +2862,82 @@ func (ProxyStatus) SwaggerDoc() map[string]string { return map_ProxyStatus } +var map_ProfileCustomizations = map[string]string{ + "": "ProfileCustomizations contains various parameters for modifying the default behavior of certain profiles", + "dynamicResourceAllocation": "dynamicResourceAllocation allows to enable or disable dynamic resource allocation within the scheduler. Dynamic resource allocation is an API for requesting and sharing resources between pods and containers inside a pod. Third-party resource drivers are responsible for tracking and allocating resources. Different kinds of resources support arbitrary parameters for defining requirements and initialization. Valid values are Enabled, Disabled and omitted. When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. The current default is Disabled.", +} + +func (ProfileCustomizations) SwaggerDoc() map[string]string { + return map_ProfileCustomizations +} + var map_Scheduler = map[string]string{ - "": "Scheduler holds cluster-wide config information to run the Kubernetes Scheduler and influence its placement decisions. The canonical name for this config is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Scheduler holds cluster-wide config information to run the Kubernetes Scheduler and influence its placement decisions. The canonical name for this config is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Scheduler) SwaggerDoc() map[string]string { return map_Scheduler } +var map_SchedulerList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (SchedulerList) SwaggerDoc() map[string]string { + return map_SchedulerList +} + var map_SchedulerSpec = map[string]string{ - "policy": "DEPRECATED: the scheduler Policy API has been deprecated and will be removed in a future release. policy is a reference to a ConfigMap containing scheduler policy which has user specified predicates and priorities. If this ConfigMap is not available scheduler will default to use DefaultAlgorithmProvider. The namespace for this configmap is openshift-config.", - "profile": "profile sets which scheduling profile should be set in order to configure scheduling decisions for new pods.\n\nValid values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" Defaults to \"LowNodeUtilization\"", - "defaultNodeSelector": "defaultNodeSelector helps set the cluster-wide default node selector to restrict pod placement to specific nodes. This is applied to the pods created in all namespaces and creates an intersection with any existing nodeSelectors already set on a pod, additionally constraining that pod's selector. For example, defaultNodeSelector: \"type=user-node,region=east\" would set nodeSelector field in pod spec to \"type=user-node,region=east\" to all pods created in all namespaces. Namespaces having project-wide node selectors won't be impacted even if this field is set. This adds an annotation section to the namespace. For example, if a new namespace is created with node-selector='type=user-node,region=east', the annotation openshift.io/node-selector: type=user-node,region=east gets added to the project. When the openshift.io/node-selector annotation is set on the project the value is used in preference to the value we are setting for defaultNodeSelector field. For instance, openshift.io/node-selector: \"type=user-node,region=west\" means that the default of \"type=user-node,region=east\" set in defaultNodeSelector would not be applied.", - "mastersSchedulable": "MastersSchedulable allows masters nodes to be schedulable. When this flag is turned on, all the master nodes in the cluster will be made schedulable, so that workload pods can run on them. The default value for this field is false, meaning none of the master nodes are schedulable. Important Note: Once the workload pods start running on the master nodes, extreme care must be taken to ensure that cluster-critical control plane components are not impacted. Please turn on this field after doing due diligence.", + "policy": "DEPRECATED: the scheduler Policy API has been deprecated and will be removed in a future release. policy is a reference to a ConfigMap containing scheduler policy which has user specified predicates and priorities. If this ConfigMap is not available scheduler will default to use DefaultAlgorithmProvider. The namespace for this configmap is openshift-config.", + "profile": "profile sets which scheduling profile should be set in order to configure scheduling decisions for new pods.\n\nValid values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" Defaults to \"LowNodeUtilization\"", + "profileCustomizations": "profileCustomizations contains configuration for modifying the default behavior of existing scheduler profiles.", + "defaultNodeSelector": "defaultNodeSelector helps set the cluster-wide default node selector to restrict pod placement to specific nodes. This is applied to the pods created in all namespaces and creates an intersection with any existing nodeSelectors already set on a pod, additionally constraining that pod's selector. For example, defaultNodeSelector: \"type=user-node,region=east\" would set nodeSelector field in pod spec to \"type=user-node,region=east\" to all pods created in all namespaces. Namespaces having project-wide node selectors won't be impacted even if this field is set. This adds an annotation section to the namespace. For example, if a new namespace is created with node-selector='type=user-node,region=east', the annotation openshift.io/node-selector: type=user-node,region=east gets added to the project. When the openshift.io/node-selector annotation is set on the project the value is used in preference to the value we are setting for defaultNodeSelector field. For instance, openshift.io/node-selector: \"type=user-node,region=west\" means that the default of \"type=user-node,region=east\" set in defaultNodeSelector would not be applied.", + "mastersSchedulable": "mastersSchedulable allows masters nodes to be schedulable. When this flag is turned on, all the master nodes in the cluster will be made schedulable, so that workload pods can run on them. The default value for this field is false, meaning none of the master nodes are schedulable. Important Note: Once the workload pods start running on the master nodes, extreme care must be taken to ensure that cluster-critical control plane components are not impacted. Please turn on this field after doing due diligence.", } func (SchedulerSpec) SwaggerDoc() map[string]string { return map_SchedulerSpec } +var map_FeatureGateTests = map[string]string{ + "featureGate": "featureGate is the name of the FeatureGate as it appears in The FeatureGate CR instance.", + "tests": "tests contains an item for every TestName", +} + +func (FeatureGateTests) SwaggerDoc() map[string]string { + return map_FeatureGateTests +} + +var map_TestDetails = map[string]string{ + "testName": "testName is the name of the test as it appears in junit XMLs. It does not include the suite name since the same test can be executed in many suites.", +} + +func (TestDetails) SwaggerDoc() map[string]string { + return map_TestDetails +} + +var map_TestReporting = map[string]string{ + "": "TestReporting is used for origin (and potentially others) to report the test names for a given FeatureGate into the payload for later analysis on a per-payload basis. This doesn't need any CRD because it's never stored in the cluster.\n\nCompatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (TestReporting) SwaggerDoc() map[string]string { + return map_TestReporting +} + +var map_TestReportingSpec = map[string]string{ + "testsForFeatureGates": "testsForFeatureGates is a list, indexed by FeatureGate and includes information about testing.", +} + +func (TestReportingSpec) SwaggerDoc() map[string]string { + return map_TestReportingSpec +} + var map_CustomTLSProfile = map[string]string{ "": "CustomTLSProfile is a user-defined TLS security profile. Be extremely careful using a custom TLS profile as invalid configurations can be catastrophic.", } @@ -1529,7 +2973,7 @@ func (OldTLSProfile) SwaggerDoc() map[string]string { var map_TLSProfileSpec = map[string]string{ "": "TLSProfileSpec is the desired behavior of a TLSSecurityProfile.", "ciphers": "ciphers is used to specify the cipher algorithms that are negotiated during the TLS handshake. Operators may remove entries their operands do not support. For example, to use DES-CBC3-SHA (yaml):\n\n ciphers:\n - DES-CBC3-SHA", - "minTLSVersion": "minTLSVersion is used to specify the minimal version of the TLS protocol that is negotiated during the TLS handshake. For example, to use TLS versions 1.1, 1.2 and 1.3 (yaml):\n\n minTLSVersion: TLSv1.1\n\nNOTE: currently the highest minTLSVersion allowed is VersionTLS12", + "minTLSVersion": "minTLSVersion is used to specify the minimal version of the TLS protocol that is negotiated during the TLS handshake. For example, to use TLS versions 1.1, 1.2 and 1.3 (yaml):\n\n minTLSVersion: VersionTLS11\n\nNOTE: currently the highest minTLSVersion allowed is VersionTLS12", } func (TLSProfileSpec) SwaggerDoc() map[string]string { @@ -1539,10 +2983,10 @@ func (TLSProfileSpec) SwaggerDoc() map[string]string { var map_TLSSecurityProfile = map[string]string{ "": "TLSSecurityProfile defines the schema for a TLS security profile. This object is used by operators to apply TLS security settings to operands.", "type": "type is one of Old, Intermediate, Modern or Custom. Custom provides the ability to specify individual TLS security profile parameters. Old, Intermediate and Modern are TLS security profiles based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations\n\nThe profiles are intent based, so they may change over time as new ciphers are developed and existing ciphers are found to be insecure. Depending on precisely which ciphers are available to a process, the list may be reduced.\n\nNote that the Modern profile is currently not supported because it is not yet well adopted by common software libraries.", - "old": "old is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES256-GCM-SHA384\n - ECDHE-RSA-AES256-GCM-SHA384\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - DHE-RSA-AES128-GCM-SHA256\n - DHE-RSA-AES256-GCM-SHA384\n - DHE-RSA-CHACHA20-POLY1305\n - ECDHE-ECDSA-AES128-SHA256\n - ECDHE-RSA-AES128-SHA256\n - ECDHE-ECDSA-AES128-SHA\n - ECDHE-RSA-AES128-SHA\n - ECDHE-ECDSA-AES256-SHA384\n - ECDHE-RSA-AES256-SHA384\n - ECDHE-ECDSA-AES256-SHA\n - ECDHE-RSA-AES256-SHA\n - DHE-RSA-AES128-SHA256\n - DHE-RSA-AES256-SHA256\n - AES128-GCM-SHA256\n - AES256-GCM-SHA384\n - AES128-SHA256\n - AES256-SHA256\n - AES128-SHA\n - AES256-SHA\n - DES-CBC3-SHA\n minTLSVersion: TLSv1.0", - "intermediate": "intermediate is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES256-GCM-SHA384\n - ECDHE-RSA-AES256-GCM-SHA384\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - DHE-RSA-AES128-GCM-SHA256\n - DHE-RSA-AES256-GCM-SHA384\n minTLSVersion: TLSv1.2", - "modern": "modern is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n minTLSVersion: TLSv1.3\n\nNOTE: Currently unsupported.", - "custom": "custom is a user-defined TLS security profile. Be extremely careful using a custom profile as invalid configurations can be catastrophic. An example custom profile looks like this:\n\n ciphers:\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n minTLSVersion: TLSv1.1", + "old": "old is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n\n - TLS_AES_128_GCM_SHA256\n\n - TLS_AES_256_GCM_SHA384\n\n - TLS_CHACHA20_POLY1305_SHA256\n\n - ECDHE-ECDSA-AES128-GCM-SHA256\n\n - ECDHE-RSA-AES128-GCM-SHA256\n\n - ECDHE-ECDSA-AES256-GCM-SHA384\n\n - ECDHE-RSA-AES256-GCM-SHA384\n\n - ECDHE-ECDSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-CHACHA20-POLY1305\n\n - DHE-RSA-AES128-GCM-SHA256\n\n - DHE-RSA-AES256-GCM-SHA384\n\n - DHE-RSA-CHACHA20-POLY1305\n\n - ECDHE-ECDSA-AES128-SHA256\n\n - ECDHE-RSA-AES128-SHA256\n\n - ECDHE-ECDSA-AES128-SHA\n\n - ECDHE-RSA-AES128-SHA\n\n - ECDHE-ECDSA-AES256-SHA384\n\n - ECDHE-RSA-AES256-SHA384\n\n - ECDHE-ECDSA-AES256-SHA\n\n - ECDHE-RSA-AES256-SHA\n\n - DHE-RSA-AES128-SHA256\n\n - DHE-RSA-AES256-SHA256\n\n - AES128-GCM-SHA256\n\n - AES256-GCM-SHA384\n\n - AES128-SHA256\n\n - AES256-SHA256\n\n - AES128-SHA\n\n - AES256-SHA\n\n - DES-CBC3-SHA\n\n minTLSVersion: VersionTLS10", + "intermediate": "intermediate is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29\n\nand looks like this (yaml):\n\n ciphers:\n\n - TLS_AES_128_GCM_SHA256\n\n - TLS_AES_256_GCM_SHA384\n\n - TLS_CHACHA20_POLY1305_SHA256\n\n - ECDHE-ECDSA-AES128-GCM-SHA256\n\n - ECDHE-RSA-AES128-GCM-SHA256\n\n - ECDHE-ECDSA-AES256-GCM-SHA384\n\n - ECDHE-RSA-AES256-GCM-SHA384\n\n - ECDHE-ECDSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-CHACHA20-POLY1305\n\n - DHE-RSA-AES128-GCM-SHA256\n\n - DHE-RSA-AES256-GCM-SHA384\n\n minTLSVersion: VersionTLS12", + "modern": "modern is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n\n - TLS_AES_128_GCM_SHA256\n\n - TLS_AES_256_GCM_SHA384\n\n - TLS_CHACHA20_POLY1305_SHA256\n\n minTLSVersion: VersionTLS13", + "custom": "custom is a user-defined TLS security profile. Be extremely careful using a custom profile as invalid configurations can be catastrophic. An example custom profile looks like this:\n\n ciphers:\n\n - ECDHE-ECDSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-AES128-GCM-SHA256\n\n - ECDHE-ECDSA-AES128-GCM-SHA256\n\n minTLSVersion: VersionTLS11", } func (TLSSecurityProfile) SwaggerDoc() map[string]string { diff --git a/vendor/github.com/openshift/client-go/config/clientset/versioned/clientset.go b/vendor/github.com/openshift/client-go/config/clientset/versioned/clientset.go index 70cd52cc07..992f9b22c9 100644 --- a/vendor/github.com/openshift/client-go/config/clientset/versioned/clientset.go +++ b/vendor/github.com/openshift/client-go/config/clientset/versioned/clientset.go @@ -4,6 +4,7 @@ package versioned import ( "fmt" + "net/http" configv1 "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1" discovery "k8s.io/client-go/discovery" @@ -39,22 +40,41 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { // NewForConfig creates a new Clientset for the given config. // If config's RateLimiter is not set and QPS and Burst are acceptable, // NewForConfig will generate a rate-limiter in configShallowCopy. +// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), +// where httpClient was generated with rest.HTTPClientFor(c). func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c + + // share the transport between all clients + httpClient, err := rest.HTTPClientFor(&configShallowCopy) + if err != nil { + return nil, err + } + + return NewForConfigAndClient(&configShallowCopy, httpClient) +} + +// NewForConfigAndClient creates a new Clientset for the given config and http client. +// Note the http client provided takes precedence over the configured transport values. +// If config's RateLimiter is not set and QPS and Burst are acceptable, +// NewForConfigAndClient will generate a rate-limiter in configShallowCopy. +func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset, error) { + configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { if configShallowCopy.Burst <= 0 { return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") } configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) } + var cs Clientset var err error - cs.configV1, err = configv1.NewForConfig(&configShallowCopy) + cs.configV1, err = configv1.NewForConfigAndClient(&configShallowCopy, httpClient) if err != nil { return nil, err } - cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) + cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfigAndClient(&configShallowCopy, httpClient) if err != nil { return nil, err } @@ -64,11 +84,11 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // NewForConfigOrDie creates a new Clientset for the given config and // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { - var cs Clientset - cs.configV1 = configv1.NewForConfigOrDie(c) - - cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) - return &cs + cs, err := NewForConfig(c) + if err != nil { + panic(err) + } + return cs } // New creates a new Clientset for the given RESTClient. diff --git a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/config_client.go b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/config_client.go index 0f2182d2f5..de4f2fa32a 100644 --- a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/config_client.go +++ b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/config_client.go @@ -3,6 +3,8 @@ package v1 import ( + "net/http" + v1 "github.com/openshift/api/config/v1" "github.com/openshift/client-go/config/clientset/versioned/scheme" rest "k8s.io/client-go/rest" @@ -19,9 +21,13 @@ type ConfigV1Interface interface { DNSesGetter FeatureGatesGetter ImagesGetter + ImageContentPoliciesGetter + ImageDigestMirrorSetsGetter + ImageTagMirrorSetsGetter InfrastructuresGetter IngressesGetter NetworksGetter + NodesGetter OAuthsGetter OperatorHubsGetter ProjectsGetter @@ -70,6 +76,18 @@ func (c *ConfigV1Client) Images() ImageInterface { return newImages(c) } +func (c *ConfigV1Client) ImageContentPolicies() ImageContentPolicyInterface { + return newImageContentPolicies(c) +} + +func (c *ConfigV1Client) ImageDigestMirrorSets() ImageDigestMirrorSetInterface { + return newImageDigestMirrorSets(c) +} + +func (c *ConfigV1Client) ImageTagMirrorSets() ImageTagMirrorSetInterface { + return newImageTagMirrorSets(c) +} + func (c *ConfigV1Client) Infrastructures() InfrastructureInterface { return newInfrastructures(c) } @@ -82,6 +100,10 @@ func (c *ConfigV1Client) Networks() NetworkInterface { return newNetworks(c) } +func (c *ConfigV1Client) Nodes() NodeInterface { + return newNodes(c) +} + func (c *ConfigV1Client) OAuths() OAuthInterface { return newOAuths(c) } @@ -103,12 +125,28 @@ func (c *ConfigV1Client) Schedulers() SchedulerInterface { } // NewForConfig creates a new ConfigV1Client for the given config. +// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), +// where httpClient was generated with rest.HTTPClientFor(c). func NewForConfig(c *rest.Config) (*ConfigV1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err } - client, err := rest.RESTClientFor(&config) + httpClient, err := rest.HTTPClientFor(&config) + if err != nil { + return nil, err + } + return NewForConfigAndClient(&config, httpClient) +} + +// NewForConfigAndClient creates a new ConfigV1Client for the given config and http client. +// Note the http client provided takes precedence over the configured transport values. +func NewForConfigAndClient(c *rest.Config, h *http.Client) (*ConfigV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientForConfigAndClient(&config, h) if err != nil { return nil, err } diff --git a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/generated_expansion.go b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/generated_expansion.go index 50a4ec7f8f..a56721ba9d 100644 --- a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/generated_expansion.go +++ b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/generated_expansion.go @@ -20,12 +20,20 @@ type FeatureGateExpansion interface{} type ImageExpansion interface{} +type ImageContentPolicyExpansion interface{} + +type ImageDigestMirrorSetExpansion interface{} + +type ImageTagMirrorSetExpansion interface{} + type InfrastructureExpansion interface{} type IngressExpansion interface{} type NetworkExpansion interface{} +type NodeExpansion interface{} + type OAuthExpansion interface{} type OperatorHubExpansion interface{} diff --git a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagecontentpolicy.go b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagecontentpolicy.go new file mode 100644 index 0000000000..17c441e5be --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagecontentpolicy.go @@ -0,0 +1,152 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + "time" + + v1 "github.com/openshift/api/config/v1" + scheme "github.com/openshift/client-go/config/clientset/versioned/scheme" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// ImageContentPoliciesGetter has a method to return a ImageContentPolicyInterface. +// A group's client should implement this interface. +type ImageContentPoliciesGetter interface { + ImageContentPolicies() ImageContentPolicyInterface +} + +// ImageContentPolicyInterface has methods to work with ImageContentPolicy resources. +type ImageContentPolicyInterface interface { + Create(ctx context.Context, imageContentPolicy *v1.ImageContentPolicy, opts metav1.CreateOptions) (*v1.ImageContentPolicy, error) + Update(ctx context.Context, imageContentPolicy *v1.ImageContentPolicy, opts metav1.UpdateOptions) (*v1.ImageContentPolicy, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.ImageContentPolicy, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.ImageContentPolicyList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImageContentPolicy, err error) + ImageContentPolicyExpansion +} + +// imageContentPolicies implements ImageContentPolicyInterface +type imageContentPolicies struct { + client rest.Interface +} + +// newImageContentPolicies returns a ImageContentPolicies +func newImageContentPolicies(c *ConfigV1Client) *imageContentPolicies { + return &imageContentPolicies{ + client: c.RESTClient(), + } +} + +// Get takes name of the imageContentPolicy, and returns the corresponding imageContentPolicy object, and an error if there is any. +func (c *imageContentPolicies) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.ImageContentPolicy, err error) { + result = &v1.ImageContentPolicy{} + err = c.client.Get(). + Resource("imagecontentpolicies"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ImageContentPolicies that match those selectors. +func (c *imageContentPolicies) List(ctx context.Context, opts metav1.ListOptions) (result *v1.ImageContentPolicyList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.ImageContentPolicyList{} + err = c.client.Get(). + Resource("imagecontentpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested imageContentPolicies. +func (c *imageContentPolicies) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("imagecontentpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a imageContentPolicy and creates it. Returns the server's representation of the imageContentPolicy, and an error, if there is any. +func (c *imageContentPolicies) Create(ctx context.Context, imageContentPolicy *v1.ImageContentPolicy, opts metav1.CreateOptions) (result *v1.ImageContentPolicy, err error) { + result = &v1.ImageContentPolicy{} + err = c.client.Post(). + Resource("imagecontentpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imageContentPolicy). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a imageContentPolicy and updates it. Returns the server's representation of the imageContentPolicy, and an error, if there is any. +func (c *imageContentPolicies) Update(ctx context.Context, imageContentPolicy *v1.ImageContentPolicy, opts metav1.UpdateOptions) (result *v1.ImageContentPolicy, err error) { + result = &v1.ImageContentPolicy{} + err = c.client.Put(). + Resource("imagecontentpolicies"). + Name(imageContentPolicy.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imageContentPolicy). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the imageContentPolicy and deletes it. Returns an error if one occurs. +func (c *imageContentPolicies) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Resource("imagecontentpolicies"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *imageContentPolicies) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("imagecontentpolicies"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched imageContentPolicy. +func (c *imageContentPolicies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImageContentPolicy, err error) { + result = &v1.ImageContentPolicy{} + err = c.client.Patch(pt). + Resource("imagecontentpolicies"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagedigestmirrorset.go b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagedigestmirrorset.go new file mode 100644 index 0000000000..d13aa8f3cc --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagedigestmirrorset.go @@ -0,0 +1,152 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + "time" + + v1 "github.com/openshift/api/config/v1" + scheme "github.com/openshift/client-go/config/clientset/versioned/scheme" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// ImageDigestMirrorSetsGetter has a method to return a ImageDigestMirrorSetInterface. +// A group's client should implement this interface. +type ImageDigestMirrorSetsGetter interface { + ImageDigestMirrorSets() ImageDigestMirrorSetInterface +} + +// ImageDigestMirrorSetInterface has methods to work with ImageDigestMirrorSet resources. +type ImageDigestMirrorSetInterface interface { + Create(ctx context.Context, imageDigestMirrorSet *v1.ImageDigestMirrorSet, opts metav1.CreateOptions) (*v1.ImageDigestMirrorSet, error) + Update(ctx context.Context, imageDigestMirrorSet *v1.ImageDigestMirrorSet, opts metav1.UpdateOptions) (*v1.ImageDigestMirrorSet, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.ImageDigestMirrorSet, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.ImageDigestMirrorSetList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImageDigestMirrorSet, err error) + ImageDigestMirrorSetExpansion +} + +// imageDigestMirrorSets implements ImageDigestMirrorSetInterface +type imageDigestMirrorSets struct { + client rest.Interface +} + +// newImageDigestMirrorSets returns a ImageDigestMirrorSets +func newImageDigestMirrorSets(c *ConfigV1Client) *imageDigestMirrorSets { + return &imageDigestMirrorSets{ + client: c.RESTClient(), + } +} + +// Get takes name of the imageDigestMirrorSet, and returns the corresponding imageDigestMirrorSet object, and an error if there is any. +func (c *imageDigestMirrorSets) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.ImageDigestMirrorSet, err error) { + result = &v1.ImageDigestMirrorSet{} + err = c.client.Get(). + Resource("imagedigestmirrorsets"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ImageDigestMirrorSets that match those selectors. +func (c *imageDigestMirrorSets) List(ctx context.Context, opts metav1.ListOptions) (result *v1.ImageDigestMirrorSetList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.ImageDigestMirrorSetList{} + err = c.client.Get(). + Resource("imagedigestmirrorsets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested imageDigestMirrorSets. +func (c *imageDigestMirrorSets) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("imagedigestmirrorsets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a imageDigestMirrorSet and creates it. Returns the server's representation of the imageDigestMirrorSet, and an error, if there is any. +func (c *imageDigestMirrorSets) Create(ctx context.Context, imageDigestMirrorSet *v1.ImageDigestMirrorSet, opts metav1.CreateOptions) (result *v1.ImageDigestMirrorSet, err error) { + result = &v1.ImageDigestMirrorSet{} + err = c.client.Post(). + Resource("imagedigestmirrorsets"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imageDigestMirrorSet). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a imageDigestMirrorSet and updates it. Returns the server's representation of the imageDigestMirrorSet, and an error, if there is any. +func (c *imageDigestMirrorSets) Update(ctx context.Context, imageDigestMirrorSet *v1.ImageDigestMirrorSet, opts metav1.UpdateOptions) (result *v1.ImageDigestMirrorSet, err error) { + result = &v1.ImageDigestMirrorSet{} + err = c.client.Put(). + Resource("imagedigestmirrorsets"). + Name(imageDigestMirrorSet.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imageDigestMirrorSet). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the imageDigestMirrorSet and deletes it. Returns an error if one occurs. +func (c *imageDigestMirrorSets) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Resource("imagedigestmirrorsets"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *imageDigestMirrorSets) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("imagedigestmirrorsets"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched imageDigestMirrorSet. +func (c *imageDigestMirrorSets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImageDigestMirrorSet, err error) { + result = &v1.ImageDigestMirrorSet{} + err = c.client.Patch(pt). + Resource("imagedigestmirrorsets"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagetagmirrorset.go b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagetagmirrorset.go new file mode 100644 index 0000000000..bf2958d805 --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/imagetagmirrorset.go @@ -0,0 +1,152 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + "time" + + v1 "github.com/openshift/api/config/v1" + scheme "github.com/openshift/client-go/config/clientset/versioned/scheme" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// ImageTagMirrorSetsGetter has a method to return a ImageTagMirrorSetInterface. +// A group's client should implement this interface. +type ImageTagMirrorSetsGetter interface { + ImageTagMirrorSets() ImageTagMirrorSetInterface +} + +// ImageTagMirrorSetInterface has methods to work with ImageTagMirrorSet resources. +type ImageTagMirrorSetInterface interface { + Create(ctx context.Context, imageTagMirrorSet *v1.ImageTagMirrorSet, opts metav1.CreateOptions) (*v1.ImageTagMirrorSet, error) + Update(ctx context.Context, imageTagMirrorSet *v1.ImageTagMirrorSet, opts metav1.UpdateOptions) (*v1.ImageTagMirrorSet, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.ImageTagMirrorSet, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.ImageTagMirrorSetList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImageTagMirrorSet, err error) + ImageTagMirrorSetExpansion +} + +// imageTagMirrorSets implements ImageTagMirrorSetInterface +type imageTagMirrorSets struct { + client rest.Interface +} + +// newImageTagMirrorSets returns a ImageTagMirrorSets +func newImageTagMirrorSets(c *ConfigV1Client) *imageTagMirrorSets { + return &imageTagMirrorSets{ + client: c.RESTClient(), + } +} + +// Get takes name of the imageTagMirrorSet, and returns the corresponding imageTagMirrorSet object, and an error if there is any. +func (c *imageTagMirrorSets) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.ImageTagMirrorSet, err error) { + result = &v1.ImageTagMirrorSet{} + err = c.client.Get(). + Resource("imagetagmirrorsets"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of ImageTagMirrorSets that match those selectors. +func (c *imageTagMirrorSets) List(ctx context.Context, opts metav1.ListOptions) (result *v1.ImageTagMirrorSetList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.ImageTagMirrorSetList{} + err = c.client.Get(). + Resource("imagetagmirrorsets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested imageTagMirrorSets. +func (c *imageTagMirrorSets) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("imagetagmirrorsets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a imageTagMirrorSet and creates it. Returns the server's representation of the imageTagMirrorSet, and an error, if there is any. +func (c *imageTagMirrorSets) Create(ctx context.Context, imageTagMirrorSet *v1.ImageTagMirrorSet, opts metav1.CreateOptions) (result *v1.ImageTagMirrorSet, err error) { + result = &v1.ImageTagMirrorSet{} + err = c.client.Post(). + Resource("imagetagmirrorsets"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imageTagMirrorSet). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a imageTagMirrorSet and updates it. Returns the server's representation of the imageTagMirrorSet, and an error, if there is any. +func (c *imageTagMirrorSets) Update(ctx context.Context, imageTagMirrorSet *v1.ImageTagMirrorSet, opts metav1.UpdateOptions) (result *v1.ImageTagMirrorSet, err error) { + result = &v1.ImageTagMirrorSet{} + err = c.client.Put(). + Resource("imagetagmirrorsets"). + Name(imageTagMirrorSet.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(imageTagMirrorSet). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the imageTagMirrorSet and deletes it. Returns an error if one occurs. +func (c *imageTagMirrorSets) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Resource("imagetagmirrorsets"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *imageTagMirrorSets) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("imagetagmirrorsets"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched imageTagMirrorSet. +func (c *imageTagMirrorSets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ImageTagMirrorSet, err error) { + result = &v1.ImageTagMirrorSet{} + err = c.client.Patch(pt). + Resource("imagetagmirrorsets"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/node.go b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/node.go new file mode 100644 index 0000000000..b277992378 --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/node.go @@ -0,0 +1,168 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + "time" + + v1 "github.com/openshift/api/config/v1" + scheme "github.com/openshift/client-go/config/clientset/versioned/scheme" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// NodesGetter has a method to return a NodeInterface. +// A group's client should implement this interface. +type NodesGetter interface { + Nodes() NodeInterface +} + +// NodeInterface has methods to work with Node resources. +type NodeInterface interface { + Create(ctx context.Context, node *v1.Node, opts metav1.CreateOptions) (*v1.Node, error) + Update(ctx context.Context, node *v1.Node, opts metav1.UpdateOptions) (*v1.Node, error) + UpdateStatus(ctx context.Context, node *v1.Node, opts metav1.UpdateOptions) (*v1.Node, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Node, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.NodeList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Node, err error) + NodeExpansion +} + +// nodes implements NodeInterface +type nodes struct { + client rest.Interface +} + +// newNodes returns a Nodes +func newNodes(c *ConfigV1Client) *nodes { + return &nodes{ + client: c.RESTClient(), + } +} + +// Get takes name of the node, and returns the corresponding node object, and an error if there is any. +func (c *nodes) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.Node, err error) { + result = &v1.Node{} + err = c.client.Get(). + Resource("nodes"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Nodes that match those selectors. +func (c *nodes) List(ctx context.Context, opts metav1.ListOptions) (result *v1.NodeList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.NodeList{} + err = c.client.Get(). + Resource("nodes"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested nodes. +func (c *nodes) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("nodes"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a node and creates it. Returns the server's representation of the node, and an error, if there is any. +func (c *nodes) Create(ctx context.Context, node *v1.Node, opts metav1.CreateOptions) (result *v1.Node, err error) { + result = &v1.Node{} + err = c.client.Post(). + Resource("nodes"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(node). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a node and updates it. Returns the server's representation of the node, and an error, if there is any. +func (c *nodes) Update(ctx context.Context, node *v1.Node, opts metav1.UpdateOptions) (result *v1.Node, err error) { + result = &v1.Node{} + err = c.client.Put(). + Resource("nodes"). + Name(node.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(node). + Do(ctx). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *nodes) UpdateStatus(ctx context.Context, node *v1.Node, opts metav1.UpdateOptions) (result *v1.Node, err error) { + result = &v1.Node{} + err = c.client.Put(). + Resource("nodes"). + Name(node.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(node). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the node and deletes it. Returns an error if one occurs. +func (c *nodes) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Resource("nodes"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *nodes) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("nodes"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched node. +func (c *nodes) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Node, err error) { + result = &v1.Node{} + err = c.client.Patch(pt). + Resource("nodes"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagecontentpolicy.go b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagecontentpolicy.go new file mode 100644 index 0000000000..c50ea7b1b2 --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagecontentpolicy.go @@ -0,0 +1,73 @@ +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + configv1 "github.com/openshift/api/config/v1" + versioned "github.com/openshift/client-go/config/clientset/versioned" + internalinterfaces "github.com/openshift/client-go/config/informers/externalversions/internalinterfaces" + v1 "github.com/openshift/client-go/config/listers/config/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// ImageContentPolicyInformer provides access to a shared informer and lister for +// ImageContentPolicies. +type ImageContentPolicyInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.ImageContentPolicyLister +} + +type imageContentPolicyInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// NewImageContentPolicyInformer constructs a new informer for ImageContentPolicy type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewImageContentPolicyInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredImageContentPolicyInformer(client, resyncPeriod, indexers, nil) +} + +// NewFilteredImageContentPolicyInformer constructs a new informer for ImageContentPolicy type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredImageContentPolicyInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().ImageContentPolicies().List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().ImageContentPolicies().Watch(context.TODO(), options) + }, + }, + &configv1.ImageContentPolicy{}, + resyncPeriod, + indexers, + ) +} + +func (f *imageContentPolicyInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredImageContentPolicyInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *imageContentPolicyInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&configv1.ImageContentPolicy{}, f.defaultInformer) +} + +func (f *imageContentPolicyInformer) Lister() v1.ImageContentPolicyLister { + return v1.NewImageContentPolicyLister(f.Informer().GetIndexer()) +} diff --git a/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagedigestmirrorset.go b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagedigestmirrorset.go new file mode 100644 index 0000000000..8953cfd890 --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagedigestmirrorset.go @@ -0,0 +1,73 @@ +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + configv1 "github.com/openshift/api/config/v1" + versioned "github.com/openshift/client-go/config/clientset/versioned" + internalinterfaces "github.com/openshift/client-go/config/informers/externalversions/internalinterfaces" + v1 "github.com/openshift/client-go/config/listers/config/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// ImageDigestMirrorSetInformer provides access to a shared informer and lister for +// ImageDigestMirrorSets. +type ImageDigestMirrorSetInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.ImageDigestMirrorSetLister +} + +type imageDigestMirrorSetInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// NewImageDigestMirrorSetInformer constructs a new informer for ImageDigestMirrorSet type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewImageDigestMirrorSetInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredImageDigestMirrorSetInformer(client, resyncPeriod, indexers, nil) +} + +// NewFilteredImageDigestMirrorSetInformer constructs a new informer for ImageDigestMirrorSet type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredImageDigestMirrorSetInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().ImageDigestMirrorSets().List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().ImageDigestMirrorSets().Watch(context.TODO(), options) + }, + }, + &configv1.ImageDigestMirrorSet{}, + resyncPeriod, + indexers, + ) +} + +func (f *imageDigestMirrorSetInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredImageDigestMirrorSetInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *imageDigestMirrorSetInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&configv1.ImageDigestMirrorSet{}, f.defaultInformer) +} + +func (f *imageDigestMirrorSetInformer) Lister() v1.ImageDigestMirrorSetLister { + return v1.NewImageDigestMirrorSetLister(f.Informer().GetIndexer()) +} diff --git a/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagetagmirrorset.go b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagetagmirrorset.go new file mode 100644 index 0000000000..a0951a190f --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/imagetagmirrorset.go @@ -0,0 +1,73 @@ +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + configv1 "github.com/openshift/api/config/v1" + versioned "github.com/openshift/client-go/config/clientset/versioned" + internalinterfaces "github.com/openshift/client-go/config/informers/externalversions/internalinterfaces" + v1 "github.com/openshift/client-go/config/listers/config/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// ImageTagMirrorSetInformer provides access to a shared informer and lister for +// ImageTagMirrorSets. +type ImageTagMirrorSetInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.ImageTagMirrorSetLister +} + +type imageTagMirrorSetInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// NewImageTagMirrorSetInformer constructs a new informer for ImageTagMirrorSet type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewImageTagMirrorSetInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredImageTagMirrorSetInformer(client, resyncPeriod, indexers, nil) +} + +// NewFilteredImageTagMirrorSetInformer constructs a new informer for ImageTagMirrorSet type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredImageTagMirrorSetInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().ImageTagMirrorSets().List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().ImageTagMirrorSets().Watch(context.TODO(), options) + }, + }, + &configv1.ImageTagMirrorSet{}, + resyncPeriod, + indexers, + ) +} + +func (f *imageTagMirrorSetInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredImageTagMirrorSetInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *imageTagMirrorSetInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&configv1.ImageTagMirrorSet{}, f.defaultInformer) +} + +func (f *imageTagMirrorSetInformer) Lister() v1.ImageTagMirrorSetLister { + return v1.NewImageTagMirrorSetLister(f.Informer().GetIndexer()) +} diff --git a/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/interface.go b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/interface.go index 00054daf31..f49b1d2287 100644 --- a/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/interface.go +++ b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/interface.go @@ -26,12 +26,20 @@ type Interface interface { FeatureGates() FeatureGateInformer // Images returns a ImageInformer. Images() ImageInformer + // ImageContentPolicies returns a ImageContentPolicyInformer. + ImageContentPolicies() ImageContentPolicyInformer + // ImageDigestMirrorSets returns a ImageDigestMirrorSetInformer. + ImageDigestMirrorSets() ImageDigestMirrorSetInformer + // ImageTagMirrorSets returns a ImageTagMirrorSetInformer. + ImageTagMirrorSets() ImageTagMirrorSetInformer // Infrastructures returns a InfrastructureInformer. Infrastructures() InfrastructureInformer // Ingresses returns a IngressInformer. Ingresses() IngressInformer // Networks returns a NetworkInformer. Networks() NetworkInformer + // Nodes returns a NodeInformer. + Nodes() NodeInformer // OAuths returns a OAuthInformer. OAuths() OAuthInformer // OperatorHubs returns a OperatorHubInformer. @@ -100,6 +108,21 @@ func (v *version) Images() ImageInformer { return &imageInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} } +// ImageContentPolicies returns a ImageContentPolicyInformer. +func (v *version) ImageContentPolicies() ImageContentPolicyInformer { + return &imageContentPolicyInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} +} + +// ImageDigestMirrorSets returns a ImageDigestMirrorSetInformer. +func (v *version) ImageDigestMirrorSets() ImageDigestMirrorSetInformer { + return &imageDigestMirrorSetInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} +} + +// ImageTagMirrorSets returns a ImageTagMirrorSetInformer. +func (v *version) ImageTagMirrorSets() ImageTagMirrorSetInformer { + return &imageTagMirrorSetInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} +} + // Infrastructures returns a InfrastructureInformer. func (v *version) Infrastructures() InfrastructureInformer { return &infrastructureInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} @@ -115,6 +138,11 @@ func (v *version) Networks() NetworkInformer { return &networkInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} } +// Nodes returns a NodeInformer. +func (v *version) Nodes() NodeInformer { + return &nodeInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} +} + // OAuths returns a OAuthInformer. func (v *version) OAuths() OAuthInformer { return &oAuthInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} diff --git a/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/node.go b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/node.go new file mode 100644 index 0000000000..6a9f806dff --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/node.go @@ -0,0 +1,73 @@ +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + configv1 "github.com/openshift/api/config/v1" + versioned "github.com/openshift/client-go/config/clientset/versioned" + internalinterfaces "github.com/openshift/client-go/config/informers/externalversions/internalinterfaces" + v1 "github.com/openshift/client-go/config/listers/config/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// NodeInformer provides access to a shared informer and lister for +// Nodes. +type NodeInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.NodeLister +} + +type nodeInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// NewNodeInformer constructs a new informer for Node type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewNodeInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredNodeInformer(client, resyncPeriod, indexers, nil) +} + +// NewFilteredNodeInformer constructs a new informer for Node type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredNodeInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().Nodes().List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ConfigV1().Nodes().Watch(context.TODO(), options) + }, + }, + &configv1.Node{}, + resyncPeriod, + indexers, + ) +} + +func (f *nodeInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredNodeInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *nodeInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&configv1.Node{}, f.defaultInformer) +} + +func (f *nodeInformer) Lister() v1.NodeLister { + return v1.NewNodeLister(f.Informer().GetIndexer()) +} diff --git a/vendor/github.com/openshift/client-go/config/informers/externalversions/generic.go b/vendor/github.com/openshift/client-go/config/informers/externalversions/generic.go index 2795d10e95..a9250c4084 100644 --- a/vendor/github.com/openshift/client-go/config/informers/externalversions/generic.go +++ b/vendor/github.com/openshift/client-go/config/informers/externalversions/generic.go @@ -55,12 +55,20 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().FeatureGates().Informer()}, nil case v1.SchemeGroupVersion.WithResource("images"): return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().Images().Informer()}, nil + case v1.SchemeGroupVersion.WithResource("imagecontentpolicies"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().ImageContentPolicies().Informer()}, nil + case v1.SchemeGroupVersion.WithResource("imagedigestmirrorsets"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().ImageDigestMirrorSets().Informer()}, nil + case v1.SchemeGroupVersion.WithResource("imagetagmirrorsets"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().ImageTagMirrorSets().Informer()}, nil case v1.SchemeGroupVersion.WithResource("infrastructures"): return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().Infrastructures().Informer()}, nil case v1.SchemeGroupVersion.WithResource("ingresses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().Ingresses().Informer()}, nil case v1.SchemeGroupVersion.WithResource("networks"): return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().Networks().Informer()}, nil + case v1.SchemeGroupVersion.WithResource("nodes"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().Nodes().Informer()}, nil case v1.SchemeGroupVersion.WithResource("oauths"): return &genericInformer{resource: resource.GroupResource(), informer: f.Config().V1().OAuths().Informer()}, nil case v1.SchemeGroupVersion.WithResource("operatorhubs"): diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/apiserver.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/apiserver.go index 63bb7ecfdc..247e40017b 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/apiserver.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/apiserver.go @@ -10,10 +10,13 @@ import ( ) // APIServerLister helps list APIServers. +// All objects returned here must be treated as read-only. type APIServerLister interface { // List lists all APIServers in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.APIServer, err error) // Get retrieves the APIServer from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.APIServer, error) APIServerListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/authentication.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/authentication.go index 27c113a902..99cc824851 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/authentication.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/authentication.go @@ -10,10 +10,13 @@ import ( ) // AuthenticationLister helps list Authentications. +// All objects returned here must be treated as read-only. type AuthenticationLister interface { // List lists all Authentications in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Authentication, err error) // Get retrieves the Authentication from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Authentication, error) AuthenticationListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/build.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/build.go index e8fa1c564f..77a1a36ff8 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/build.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/build.go @@ -10,10 +10,13 @@ import ( ) // BuildLister helps list Builds. +// All objects returned here must be treated as read-only. type BuildLister interface { // List lists all Builds in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Build, err error) // Get retrieves the Build from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Build, error) BuildListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/clusteroperator.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/clusteroperator.go index bb88edee61..e4c95773a0 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/clusteroperator.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/clusteroperator.go @@ -10,10 +10,13 @@ import ( ) // ClusterOperatorLister helps list ClusterOperators. +// All objects returned here must be treated as read-only. type ClusterOperatorLister interface { // List lists all ClusterOperators in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.ClusterOperator, err error) // Get retrieves the ClusterOperator from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.ClusterOperator, error) ClusterOperatorListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/clusterversion.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/clusterversion.go index c053383a16..ab309a1b20 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/clusterversion.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/clusterversion.go @@ -10,10 +10,13 @@ import ( ) // ClusterVersionLister helps list ClusterVersions. +// All objects returned here must be treated as read-only. type ClusterVersionLister interface { // List lists all ClusterVersions in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.ClusterVersion, err error) // Get retrieves the ClusterVersion from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.ClusterVersion, error) ClusterVersionListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/console.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/console.go index 8a17d3e2b0..daaf7aa92f 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/console.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/console.go @@ -10,10 +10,13 @@ import ( ) // ConsoleLister helps list Consoles. +// All objects returned here must be treated as read-only. type ConsoleLister interface { // List lists all Consoles in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Console, err error) // Get retrieves the Console from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Console, error) ConsoleListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/dns.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/dns.go index 84ee547706..89441b3a9d 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/dns.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/dns.go @@ -10,10 +10,13 @@ import ( ) // DNSLister helps list DNSes. +// All objects returned here must be treated as read-only. type DNSLister interface { // List lists all DNSes in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.DNS, err error) // Get retrieves the DNS from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.DNS, error) DNSListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/expansion_generated.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/expansion_generated.go index 56b41a0445..b5d6fc088b 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/expansion_generated.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/expansion_generated.go @@ -38,6 +38,18 @@ type FeatureGateListerExpansion interface{} // ImageLister. type ImageListerExpansion interface{} +// ImageContentPolicyListerExpansion allows custom methods to be added to +// ImageContentPolicyLister. +type ImageContentPolicyListerExpansion interface{} + +// ImageDigestMirrorSetListerExpansion allows custom methods to be added to +// ImageDigestMirrorSetLister. +type ImageDigestMirrorSetListerExpansion interface{} + +// ImageTagMirrorSetListerExpansion allows custom methods to be added to +// ImageTagMirrorSetLister. +type ImageTagMirrorSetListerExpansion interface{} + // InfrastructureListerExpansion allows custom methods to be added to // InfrastructureLister. type InfrastructureListerExpansion interface{} @@ -50,6 +62,10 @@ type IngressListerExpansion interface{} // NetworkLister. type NetworkListerExpansion interface{} +// NodeListerExpansion allows custom methods to be added to +// NodeLister. +type NodeListerExpansion interface{} + // OAuthListerExpansion allows custom methods to be added to // OAuthLister. type OAuthListerExpansion interface{} diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/featuregate.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/featuregate.go index cb2b6cf163..4c796e80ff 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/featuregate.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/featuregate.go @@ -10,10 +10,13 @@ import ( ) // FeatureGateLister helps list FeatureGates. +// All objects returned here must be treated as read-only. type FeatureGateLister interface { // List lists all FeatureGates in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.FeatureGate, err error) // Get retrieves the FeatureGate from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.FeatureGate, error) FeatureGateListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/image.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/image.go index 0696e718a6..f563f919a4 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/image.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/image.go @@ -10,10 +10,13 @@ import ( ) // ImageLister helps list Images. +// All objects returned here must be treated as read-only. type ImageLister interface { // List lists all Images in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Image, err error) // Get retrieves the Image from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Image, error) ImageListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/imagecontentpolicy.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/imagecontentpolicy.go new file mode 100644 index 0000000000..c9dadb9235 --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/imagecontentpolicy.go @@ -0,0 +1,52 @@ +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "github.com/openshift/api/config/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ImageContentPolicyLister helps list ImageContentPolicies. +// All objects returned here must be treated as read-only. +type ImageContentPolicyLister interface { + // List lists all ImageContentPolicies in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.ImageContentPolicy, err error) + // Get retrieves the ImageContentPolicy from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.ImageContentPolicy, error) + ImageContentPolicyListerExpansion +} + +// imageContentPolicyLister implements the ImageContentPolicyLister interface. +type imageContentPolicyLister struct { + indexer cache.Indexer +} + +// NewImageContentPolicyLister returns a new ImageContentPolicyLister. +func NewImageContentPolicyLister(indexer cache.Indexer) ImageContentPolicyLister { + return &imageContentPolicyLister{indexer: indexer} +} + +// List lists all ImageContentPolicies in the indexer. +func (s *imageContentPolicyLister) List(selector labels.Selector) (ret []*v1.ImageContentPolicy, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.ImageContentPolicy)) + }) + return ret, err +} + +// Get retrieves the ImageContentPolicy from the index for a given name. +func (s *imageContentPolicyLister) Get(name string) (*v1.ImageContentPolicy, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("imagecontentpolicy"), name) + } + return obj.(*v1.ImageContentPolicy), nil +} diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/imagedigestmirrorset.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/imagedigestmirrorset.go new file mode 100644 index 0000000000..03c0e72d2d --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/imagedigestmirrorset.go @@ -0,0 +1,52 @@ +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "github.com/openshift/api/config/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ImageDigestMirrorSetLister helps list ImageDigestMirrorSets. +// All objects returned here must be treated as read-only. +type ImageDigestMirrorSetLister interface { + // List lists all ImageDigestMirrorSets in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.ImageDigestMirrorSet, err error) + // Get retrieves the ImageDigestMirrorSet from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.ImageDigestMirrorSet, error) + ImageDigestMirrorSetListerExpansion +} + +// imageDigestMirrorSetLister implements the ImageDigestMirrorSetLister interface. +type imageDigestMirrorSetLister struct { + indexer cache.Indexer +} + +// NewImageDigestMirrorSetLister returns a new ImageDigestMirrorSetLister. +func NewImageDigestMirrorSetLister(indexer cache.Indexer) ImageDigestMirrorSetLister { + return &imageDigestMirrorSetLister{indexer: indexer} +} + +// List lists all ImageDigestMirrorSets in the indexer. +func (s *imageDigestMirrorSetLister) List(selector labels.Selector) (ret []*v1.ImageDigestMirrorSet, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.ImageDigestMirrorSet)) + }) + return ret, err +} + +// Get retrieves the ImageDigestMirrorSet from the index for a given name. +func (s *imageDigestMirrorSetLister) Get(name string) (*v1.ImageDigestMirrorSet, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("imagedigestmirrorset"), name) + } + return obj.(*v1.ImageDigestMirrorSet), nil +} diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/imagetagmirrorset.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/imagetagmirrorset.go new file mode 100644 index 0000000000..57b4431c02 --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/imagetagmirrorset.go @@ -0,0 +1,52 @@ +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "github.com/openshift/api/config/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ImageTagMirrorSetLister helps list ImageTagMirrorSets. +// All objects returned here must be treated as read-only. +type ImageTagMirrorSetLister interface { + // List lists all ImageTagMirrorSets in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.ImageTagMirrorSet, err error) + // Get retrieves the ImageTagMirrorSet from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.ImageTagMirrorSet, error) + ImageTagMirrorSetListerExpansion +} + +// imageTagMirrorSetLister implements the ImageTagMirrorSetLister interface. +type imageTagMirrorSetLister struct { + indexer cache.Indexer +} + +// NewImageTagMirrorSetLister returns a new ImageTagMirrorSetLister. +func NewImageTagMirrorSetLister(indexer cache.Indexer) ImageTagMirrorSetLister { + return &imageTagMirrorSetLister{indexer: indexer} +} + +// List lists all ImageTagMirrorSets in the indexer. +func (s *imageTagMirrorSetLister) List(selector labels.Selector) (ret []*v1.ImageTagMirrorSet, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.ImageTagMirrorSet)) + }) + return ret, err +} + +// Get retrieves the ImageTagMirrorSet from the index for a given name. +func (s *imageTagMirrorSetLister) Get(name string) (*v1.ImageTagMirrorSet, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("imagetagmirrorset"), name) + } + return obj.(*v1.ImageTagMirrorSet), nil +} diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/infrastructure.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/infrastructure.go index 90e4e54a96..33f4b229e2 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/infrastructure.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/infrastructure.go @@ -10,10 +10,13 @@ import ( ) // InfrastructureLister helps list Infrastructures. +// All objects returned here must be treated as read-only. type InfrastructureLister interface { // List lists all Infrastructures in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Infrastructure, err error) // Get retrieves the Infrastructure from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Infrastructure, error) InfrastructureListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/ingress.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/ingress.go index 7fff5b0554..78b0fd1254 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/ingress.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/ingress.go @@ -10,10 +10,13 @@ import ( ) // IngressLister helps list Ingresses. +// All objects returned here must be treated as read-only. type IngressLister interface { // List lists all Ingresses in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Ingress, err error) // Get retrieves the Ingress from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Ingress, error) IngressListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/network.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/network.go index 18c2fa73d7..174fdb45b7 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/network.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/network.go @@ -10,10 +10,13 @@ import ( ) // NetworkLister helps list Networks. +// All objects returned here must be treated as read-only. type NetworkLister interface { // List lists all Networks in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Network, err error) // Get retrieves the Network from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Network, error) NetworkListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/node.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/node.go new file mode 100644 index 0000000000..b35c27117d --- /dev/null +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/node.go @@ -0,0 +1,52 @@ +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "github.com/openshift/api/config/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// NodeLister helps list Nodes. +// All objects returned here must be treated as read-only. +type NodeLister interface { + // List lists all Nodes in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.Node, err error) + // Get retrieves the Node from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.Node, error) + NodeListerExpansion +} + +// nodeLister implements the NodeLister interface. +type nodeLister struct { + indexer cache.Indexer +} + +// NewNodeLister returns a new NodeLister. +func NewNodeLister(indexer cache.Indexer) NodeLister { + return &nodeLister{indexer: indexer} +} + +// List lists all Nodes in the indexer. +func (s *nodeLister) List(selector labels.Selector) (ret []*v1.Node, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.Node)) + }) + return ret, err +} + +// Get retrieves the Node from the index for a given name. +func (s *nodeLister) Get(name string) (*v1.Node, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("node"), name) + } + return obj.(*v1.Node), nil +} diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/oauth.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/oauth.go index b09ca24b31..8d9882471b 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/oauth.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/oauth.go @@ -10,10 +10,13 @@ import ( ) // OAuthLister helps list OAuths. +// All objects returned here must be treated as read-only. type OAuthLister interface { // List lists all OAuths in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.OAuth, err error) // Get retrieves the OAuth from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.OAuth, error) OAuthListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/operatorhub.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/operatorhub.go index 21acaf91e1..b69a49471c 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/operatorhub.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/operatorhub.go @@ -10,10 +10,13 @@ import ( ) // OperatorHubLister helps list OperatorHubs. +// All objects returned here must be treated as read-only. type OperatorHubLister interface { // List lists all OperatorHubs in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.OperatorHub, err error) // Get retrieves the OperatorHub from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.OperatorHub, error) OperatorHubListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/project.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/project.go index 18c7fbd08d..30273ba6be 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/project.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/project.go @@ -10,10 +10,13 @@ import ( ) // ProjectLister helps list Projects. +// All objects returned here must be treated as read-only. type ProjectLister interface { // List lists all Projects in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Project, err error) // Get retrieves the Project from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Project, error) ProjectListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/proxy.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/proxy.go index 032f5d125d..8ecb633c3e 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/proxy.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/proxy.go @@ -10,10 +10,13 @@ import ( ) // ProxyLister helps list Proxies. +// All objects returned here must be treated as read-only. type ProxyLister interface { // List lists all Proxies in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Proxy, err error) // Get retrieves the Proxy from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Proxy, error) ProxyListerExpansion } diff --git a/vendor/github.com/openshift/client-go/config/listers/config/v1/scheduler.go b/vendor/github.com/openshift/client-go/config/listers/config/v1/scheduler.go index 7074a8b71a..3e2f81ea44 100644 --- a/vendor/github.com/openshift/client-go/config/listers/config/v1/scheduler.go +++ b/vendor/github.com/openshift/client-go/config/listers/config/v1/scheduler.go @@ -10,10 +10,13 @@ import ( ) // SchedulerLister helps list Schedulers. +// All objects returned here must be treated as read-only. type SchedulerLister interface { // List lists all Schedulers in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Scheduler, err error) // Get retrieves the Scheduler from the index for a given name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Scheduler, error) SchedulerListerExpansion } diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml index f8924f9af4..2b10463bac 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml @@ -631,8 +631,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml index 20bb1a0394..b957a9badb 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml @@ -1382,8 +1382,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1767,7 +1767,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1822,6 +1824,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1872,8 +1910,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1900,7 +1938,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2544,7 +2584,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2597,10 +2637,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2612,6 +2652,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3213,7 +3304,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3268,6 +3361,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3318,8 +3447,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3346,7 +3475,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3969,7 +4100,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4023,9 +4154,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4541,7 +4714,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4566,6 +4741,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4653,7 +4841,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4708,6 +4898,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4758,8 +4984,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4786,7 +5012,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5430,7 +5658,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5483,10 +5711,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5498,6 +5726,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6007,6 +6286,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6158,7 +6438,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6172,7 +6452,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7406,15 +7686,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7583,16 +7861,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7667,7 +7942,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8060,6 +8335,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8186,7 +8565,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml index c388b9181e..10f465665c 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml @@ -618,8 +618,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -968,7 +968,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1023,6 +1025,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1098,7 +1136,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1137,7 +1177,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1987,15 +2027,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2164,16 +2202,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2248,7 +2283,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2641,6 +2676,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2767,7 +2906,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/vendor/github.com/operator-framework/api/crds/zz_defs.go b/vendor/github.com/operator-framework/api/crds/zz_defs.go index 50b1b0352a..06bb23be58 100644 --- a/vendor/github.com/operator-framework/api/crds/zz_defs.go +++ b/vendor/github.com/operator-framework/api/crds/zz_defs.go @@ -85,7 +85,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x70\x17\x52\xbd\x85\xbb\x90\xc2\x5d\x48\xe1\x2e\x24\xdb\xc2\x5d\x48\xe1\x2e\xa4\x50\xc3\x2f\xd4\xf0\x0b\x35\xfc\xfa\x7f\x15\x6a\xf8\x35\xb7\x50\xc3\x6f\x48\x0b\x35\xfc\x7a\x8f\x1e\x6a\xf8\x85\x1a\x7e\xc3\x06\x0e\x35\xfc\x48\xa8\xe1\x17\x6a\xf8\x7d\xc1\x35\xfc\xc2\x5d\x48\x5f\xc4\x85\x20\xe1\x36\x90\x01\x63\x7f\x5e\xb7\x81\x84\xbb\x90\x5a\x07\x09\x77\x21\x05\xd6\x17\xee\x42\xfa\xdd\x72\xbf\x70\x17\x52\x8f\x41\xc2\x5d\x48\xe1\x2e\xa4\xd6\x16\xee\x42\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\xbb\x90\xc2\x5d\x48\xe1\x2e\xa4\x62\xe4\x70\x17\x52\xb8\x0b\x09\x5b\xb8\x0b\xa9\xc7\x08\xe1\x2e\xa4\x2f\xf5\x2e\xa4\x5a\x3e\xd0\x97\x7b\x21\xd2\xf0\x65\x84\x5b\x91\xc2\xad\x48\x0d\x2d\xdc\x8a\x14\x6e\x45\xda\xd5\xc2\xad\x48\xe1\x56\xa4\x96\x16\x2a\x20\xf6\x6c\xa1\x02\x62\xdf\x16\x2a\x20\x36\xb5\x50\x01\x71\xb3\x85\x0a\x88\xa1\x02\x62\xa8\x80\x18\x2a\x20\x6e\x0f\x18\x2a\x20\x86\x0a\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\xa8\x80\x18\x6e\x45\xfa\x2c\xaf\x14\x09\xf7\x89\x74\xb4\xcf\xe7\x3e\x91\x70\x2b\x52\xad\xf3\x70\x2b\x52\x60\x61\xe1\x56\xa4\x2f\x8e\x8b\x85\x5b\x91\x76\x74\x1e\x6e\x45\x0a\xb7\x22\x85\x5b\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\xb7\x22\x85\x5b\x91\xc2\xad\x48\xd8\xc2\xad\x48\xe1\x56\xa4\x70\x2b\xd2\xce\x8f\xe1\x5a\x4b\x1a\xe9\x63\xc1\x35\xf0\xc6\x9c\x9b\xbe\xe8\xfc\xb2\xd6\x9b\x39\x5d\x17\x6c\x99\x4b\xa7\xf7\x2f\xdf\x9f\x1e\x93\x88\x6a\x9a\x88\x25\x39\x15\xb1\x35\x2d\xe3\x17\xc5\xcf\x29\x68\x1a\x53\x4d\x0b\xaf\x84\xd1\x8f\x2f\x59\x8c\x4c\x35\x86\x6b\xc2\x52\xba\x04\xc3\xbc\x1a\x27\x91\x2b\x20\x94\x5c\x41\x92\x4c\x2f\xb8\xb8\xe2\xe4\x12\xa4\xaa\xb0\xeb\x4f\x22\x4b\x3f\x11\x05\xf2\xd2\xde\x2c\x04\xd7\x99\x41\x34\xa6\xed\xb9\xef\x67\x52\x1d\xae\x0c\x52\x3f\xb6\x4f\xcf\x30\xa8\xb7\xed\x92\x9e\x62\xed\xb8\x4c\x33\xa7\xa7\x46\xb0\x7f\x6a\x88\x3a\x57\x3e\xa2\x7e\xc1\x12\x98\xce\xa9\x82\xd8\x8f\xab\x0c\xad\x09\x19\xdb\xb9\xe5\x9a\x25\xec\x57\x70\xa7\x09\x50\x9d\xcb\xc6\x3c\x89\x1e\x02\x47\xb7\x21\x64\xea\xe7\xf1\x82\x35\x19\x31\xfa\x18\x2c\x22\x1a\xad\xe0\x05\x6b\x55\xe1\x6b\x48\x75\xec\x3e\xf0\x26\x89\x3d\x91\x59\x39\x68\x9f\xc4\x4c\x22\x13\x5a\x13\xa5\x85\xf4\x90\xcb\x24\x4c\x23\x9a\x44\x79\x82\x2c\xe7\xe8\xf4\xc4\x0e\xda\x7d\x5d\x56\x07\x29\x95\xeb\x1f\x30\x79\xff\x89\x9f\xfe\xee\x39\x6f\xef\x36\x0a\xa0\x68\x8f\xbc\xc9\xb4\x53\x48\x85\x5c\x9f\x53\xb9\x84\x1b\x93\xf0\x9b\x4a\x5f\x9b\x04\xfc\x87\x57\xef\xde\xbc\x7c\xf3\xfa\xe4\xcd\xc9\xb9\xe3\xcb\xde\x19\xb6\x49\xda\x4e\x6d\xb5\x16\x46\xb1\xd0\x6e\x8a\x24\x61\x29\xd3\xc5\x57\x96\x06\x9b\x55\x66\xcb\xb7\x31\x81\x2e\xe7\x9a\xa5\x60\x3d\x5f\x54\x6b\x23\xd2\x18\xfa\x48\x01\x34\xde\xcf\x95\xd2\x0b\x30\xcc\x95\x2c\x73\x2a\x29\xd7\xe0\x8f\x02\xa6\xed\x47\xb1\x20\x4a\x38\x45\x9e\xa9\xd2\x4b\xa6\x40\xdb\xb4\xa1\x53\xd1\xcc\x52\xb0\x87\x15\xbd\xb4\x17\x28\x2d\x84\xe1\xdf\x66\x53\x53\x11\xb3\x05\x8b\xac\x65\x88\xa4\x34\x2e\x52\x5d\x9c\x62\x01\xb2\x38\xfe\xca\x05\xb7\x51\xdf\x26\x98\x81\x5f\x32\x29\x38\x2a\x4c\x97\x54\x32\x3a\x4f\xa0\xf0\xff\x29\xd0\x76\xbc\x72\x41\x9c\xcc\xd7\x1a\x9a\xd9\x92\x1d\xc1\xed\x86\xbb\x79\xab\xb9\xbf\x47\x8d\xfd\x9c\x97\x39\x69\xa5\xb0\x62\xbe\x67\x2e\x59\x21\x06\xc5\x1c\xf3\x93\x10\xe7\x91\x07\x9d\xd0\x99\x64\x56\xfb\xa3\x05\xc6\x38\x66\x4c\x15\x49\x73\x73\x52\x1b\x29\x48\x29\x36\x4f\x60\x62\x64\x1d\xd6\x9c\x4c\x53\xf6\x31\x07\x03\x65\xec\x09\x25\x90\x4b\x30\xf8\x66\xf0\xd8\x8a\xba\x00\x46\x10\x12\x78\x09\x16\xb5\xe2\x8c\x77\x99\x9a\xf3\x38\x72\x0e\xf3\x93\x05\x59\x8b\x5c\xd6\xd8\xff\x8a\x1a\x3c\x46\xea\x6d\x9c\x88\x4b\x80\x43\x1e\x34\x21\x31\x18\xc5\x81\x71\x73\x12\x2d\x85\x88\x8d\xfe\x20\xc5\x35\x4b\x71\x14\x47\x00\xc5\xae\xcd\xd7\x24\x16\xf9\x3c\x29\xd0\xc4\xb0\x7c\x77\x5a\x65\x34\xba\x30\x73\xc0\x8e\xdb\x52\x17\x0f\x74\x9a\x1d\xe0\x5b\xee\xbf\xee\x4b\x35\xfb\x59\x09\x5e\x3a\x9d\x8b\x65\xcd\x7a\xed\x2e\x53\x64\x0e\x4a\x4f\x61\xb1\x10\x52\xff\xcd\xec\x6f\xce\x91\x68\xb8\x28\x00\xe8\x11\x08\x03\x0c\x10\xda\x98\x82\x52\xa7\x7a\x21\x77\x30\x90\x0a\xea\x35\xb1\xc0\xcc\xd0\xbb\xe4\x87\xe4\xff\xec\xfd\xfb\x8f\xbf\x4d\xf7\xbf\xdb\xdb\xfb\xf0\x6c\xfa\xd7\x8f\x7f\xdc\xfb\xf7\x0c\xff\xf1\x74\xff\xbb\xfd\xdf\xfc\x1f\x7f\xdc\xdf\xdf\xdb\xfb\xf0\xc3\x9b\x57\xe7\xa7\x2f\x3f\xb2\xfd\xdf\x3e\xf0\x3c\xbd\xb0\x7f\xfd\xb6\xf7\x01\x5e\x7e\xec\xd9\xc9\xfe\xfe\x77\x7f\x68\x98\x10\xe5\xeb\x77\x8b\x56\x22\xee\x95\xbd\x3b\xed\x73\x1e\xd5\x44\x3a\xc6\xf5\x54\xc8\xa9\xfd\xe0\x90\x68\x99\xef\x16\x65\x8d\xdc\xdb\xe5\x1a\xee\x7b\x1e\xbc\xad\xf4\xb5\xe1\x31\x72\x57\xd8\x39\x73\xa5\x99\x4d\xc1\xd9\x33\x2b\xdd\x2d\xcc\xb6\x7b\xb1\xbf\xf9\x88\x3b\xdb\xd1\x23\xca\xf3\xee\xcb\x27\xca\x47\x3e\x6c\xf4\xbf\x91\x84\x6b\x39\x7e\xdb\x58\x3d\x64\xa4\x61\x26\x98\xce\x2d\xcc\x24\x13\x92\xe9\xf5\x71\x42\x95\x7a\x4b\x53\xb8\xe9\x86\x9c\x2c\x4a\x35\x6c\x62\xe8\xd9\x9c\x3f\xee\x80\x76\xa1\x28\x6e\xc8\x66\x80\x9f\x2c\x50\x0f\xa9\xf4\xe3\x81\xea\xbf\x2d\x08\xd3\x93\xb8\x90\xe4\x57\x90\xc2\x5d\x66\x28\xc1\xea\x32\x8d\x23\xb8\xcf\xda\xf7\xa1\x05\x6c\x0a\xa2\x1c\xc1\x66\xe4\xa3\x6b\xa3\x51\x2c\xd8\xf2\xa6\xa0\x3b\xdb\xd5\x29\x89\x28\x37\x0b\xc5\xeb\x39\x17\xe4\x53\x02\x4b\x1a\xad\x3f\x99\x05\x7f\x92\x60\xa6\x68\x74\xc0\x4f\x56\x39\xa8\x89\xff\x2e\xea\x87\x29\x02\x0c\x6f\x6c\x65\xfc\x67\xab\x30\x7a\xed\xbb\x71\x26\x12\xeb\x0f\x64\x22\x9e\x99\x3d\x98\x6d\xac\x16\x59\x68\xf1\xb0\x10\x25\x3e\x3c\xfd\xb8\xf5\xa6\xb3\x66\x6a\x61\x95\xca\x2a\x71\xc8\x1c\xb9\x7e\x9b\x5c\xe3\x01\x42\x8e\xe2\x94\xa1\x09\x96\xec\x9d\x9e\x1d\xed\xd7\x56\x6e\xa4\x1c\x7b\x0e\xc7\x02\x7c\xdc\x8d\x19\x48\x95\xc6\x54\x3c\x43\x31\xc5\xd1\x92\x30\xe6\x38\xfa\xb9\x18\x00\xa3\x7d\xb5\x25\xad\xd7\x4f\xf6\xec\x88\x7c\x32\x12\x72\xc2\x38\xd8\x3d\xc8\x24\xbb\x64\x09\x2c\xcd\x4c\x2a\x81\x0c\xde\x25\xb3\x7b\x4f\x99\x32\xa7\x54\x1d\xbd\x53\xcc\xd1\xb5\x68\xdd\x82\xb7\xee\xe0\x76\x31\x25\x15\xeb\xde\x13\x85\xd3\xf3\x32\x71\x29\x2f\xd4\xde\x42\x74\xe0\x0b\x21\x23\x73\x9a\xef\x80\xa3\x76\x49\xec\x06\x34\xed\x02\x27\x9a\x7f\x0a\x2d\x92\x2a\x43\x7b\xb5\x0e\xaf\x68\xa5\x52\xc0\x8c\xbc\x33\x48\x78\xc5\x14\x4c\x0a\xa9\x77\x67\x17\x1e\xc3\xaf\x68\xb3\x9c\x58\xe9\xf6\x0c\xff\xb9\xb6\xde\x26\x67\x8e\x41\x74\x47\x39\xaa\x89\x5e\x88\x04\x65\xf8\x06\xe3\xf6\x2b\x16\x5b\xd1\x07\xa4\x14\x72\x66\x53\xf9\xad\x1e\x2c\x92\xb8\xe5\x94\x2c\xd4\x71\x23\xb2\xa0\xb1\xc9\xe2\x17\x47\x0e\xe6\xd0\x66\x37\x98\x1b\x70\xa3\x2e\xaf\x6a\x51\x2c\xa1\x45\x20\x7a\x23\x30\xff\xdf\x16\xd9\x30\xcb\xa0\x73\x91\x6b\x8b\x0f\x96\x7d\x2c\x44\xce\x63\x62\x38\xe3\x21\x59\x69\x9d\xa9\xc3\x83\x83\xf2\xe8\x9e\x31\x71\x10\x8b\x48\x1d\x44\x82\x47\x90\x69\x75\xe0\x09\xf9\x20\x13\xf1\xd4\xff\x31\xa5\x9e\x0e\x0f\xc6\x32\x4e\x42\x80\xe7\x2d\xb7\x79\x4e\x89\x5d\x6d\xcb\x0b\x25\x30\x77\xbe\xa4\x45\xe2\x22\x26\x1b\xcf\xc5\xfa\x1d\xaf\xe5\xfb\xc5\x1d\xb4\x85\xe0\x5f\x61\xa4\x4f\x54\xb5\xeb\xf6\x93\xa3\xcd\xb2\xdc\x61\x4b\xee\x6f\x9a\x3d\xf7\xbc\xd4\x48\xc3\xe5\x2a\x50\x0a\xd2\x9a\xe2\xf5\xb4\x46\x5d\xb2\x4f\x0c\x1b\xe4\x6b\x62\x58\xb5\x76\x77\x25\x5b\x93\x64\x9b\x66\xbf\x32\x72\x13\xd6\xb0\xf8\xa6\x70\xbb\x4d\x60\xb1\x80\x48\x7f\x5b\x31\x13\x15\x55\x18\x0a\xb7\xd6\x37\xfe\x5f\xdf\x36\x9f\xf2\xbd\x3c\x50\xfd\xc2\x4f\xec\x94\xda\x6d\xdf\xc3\x6c\xde\x2f\xb1\xc7\x0d\xf9\xc5\x02\xcf\x0e\x86\xea\x3d\xfa\xa6\x9d\x21\xd5\x7a\x25\x9c\x5c\x98\x24\xb5\x97\x3b\x03\x30\x90\xdf\x54\x0e\x04\x67\x82\x2d\xbd\x81\x40\xde\x0a\x57\xce\x06\x26\xe4\x14\xaf\x0c\x2e\x7f\xc1\x13\xf9\xad\xb0\x85\x6d\x3a\x2a\x95\xf4\x34\xd8\x76\xc6\xef\x0c\x83\xe7\x0f\x65\x38\x8f\x05\x4c\x2d\x9c\xa7\x24\xac\xaa\x1f\xac\x15\xb0\x17\xb0\xee\x84\xaa\x3b\xfc\x5c\x28\x11\xfa\x99\x26\x25\x8e\x7a\xcd\xc0\x46\x4a\xfc\xcd\x55\x3f\x10\xe9\x9c\x71\x3b\x15\x3b\xb0\xdf\x67\x1c\xdb\xef\x07\x8f\xf1\xcf\xee\x49\xf4\x84\x76\xbf\x98\xa2\x61\x20\x7f\x37\x20\x5e\xa8\xf0\x3c\x77\x81\x74\x57\x5c\x50\x25\x18\xe8\xe5\x2f\x39\x4d\x66\xe4\x85\x15\xaf\x11\x78\xf6\xa7\x2e\x72\xb3\x5d\x6c\xf9\xe3\xaf\x58\x12\x47\x54\xc6\xa8\x59\x59\xf6\x43\x94\xb0\x88\x43\xbd\xf4\xd6\xd1\xb7\x67\x80\x25\xf2\xd8\xcb\xbc\x49\x46\xa5\x66\x51\x9e\x50\x69\x18\x3e\x2c\x85\xec\x88\x47\xef\xb9\x99\x25\x36\x9f\x41\x24\x78\xdc\xe1\x39\x1c\xb6\xab\xe7\x9b\x9d\x57\xb7\x17\xe5\x36\x90\xcc\x55\x54\x61\x29\x6c\x92\xd7\x5e\x4d\x2b\xee\x18\x4b\x2c\x3c\xb3\x2b\x78\xcb\xc4\x0a\x57\x46\x8c\xab\x16\x7e\x62\xca\x47\xfb\xef\x57\x0e\x9c\x82\xda\x67\xe4\x1f\x6b\xaf\x73\x75\x85\x20\x31\xed\xfd\x50\x68\xc6\x71\xf3\x75\xa4\xe8\x76\xb2\x64\x23\x0b\x21\xe1\x12\x24\xd9\x8b\x05\x7e\x83\x05\x9c\xf6\x67\xe4\x5f\x46\x19\x6c\x73\xc3\xd8\xc6\x61\x69\x4b\x00\x39\xc2\x2e\x92\x30\x24\xa0\xdd\x9e\x2a\xf2\x8c\xec\xd9\xaa\x50\x2c\x4d\x21\x66\x54\x43\xb2\xde\xf7\xd2\xb7\x35\xab\xf5\xc1\x9a\x3e\xc5\xd2\x2a\x45\xd2\xbe\xfe\x73\xcb\x9b\x38\xd9\xdb\x44\xaa\x9f\xbc\xb9\xb9\x04\xac\x95\xa4\x37\xb0\xa7\xf0\x62\x76\x06\x29\x34\x46\xa4\x4d\x4a\x5e\x53\x11\x75\x3d\x6f\x2e\x70\xeb\x67\x83\xa0\x94\x48\x58\x22\x7d\x5a\x9a\xbb\x01\x75\xb2\x68\x77\xb9\xb7\x0e\x21\xa4\xdd\x23\x35\x25\x46\x17\xfc\xfa\xcf\x31\xd5\xb4\xe1\x05\x8b\x32\xeb\x6c\x17\xa9\x75\xc9\x36\x65\xe7\x4d\x7b\xdd\xc3\xf5\xe2\x86\x1f\xd5\x03\x2a\x35\xbb\xbe\xec\x83\x5d\x27\x68\x9b\xb6\xb1\x92\x1e\x0d\xa6\x12\x96\x4c\x69\xb9\xae\x38\x20\x9c\x0b\x53\x10\xc6\x95\xa6\x5c\x33\x64\xd5\xc4\xbf\x39\x75\xc6\xf7\x2b\xa6\x1b\xc2\x00\xdf\x19\xdd\x1d\x4d\xbb\x98\x89\x63\x8d\x1f\xe7\xeb\x0c\xc8\xdf\x2b\x7f\xbc\x92\x59\xb4\xfb\xfb\x93\x05\x71\x0c\xd4\xe2\x26\x8d\x63\x09\x6a\x9b\xb3\xed\xfa\xba\x15\x7c\xde\x58\x35\x16\x82\xa7\xde\xd8\xe5\x6a\x04\x2a\xc5\x96\x46\x49\xf1\xf5\x21\xbd\x2f\xa7\xa6\xac\x98\x5f\xdd\xc0\xd6\x33\x0b\x69\x71\x62\x32\xed\xd5\xc1\x48\x70\x95\xa7\xa5\x15\x21\x86\x0c\x78\x0c\x3c\x5a\x63\x49\xa8\xe4\x12\x1a\xc2\x78\x7e\x54\x0d\x28\x41\xc8\xff\x62\x4b\xa3\x76\xbb\xc9\x55\x25\x67\xef\x9d\xde\x98\x29\x53\x06\xf0\x0b\x90\x46\xf9\xc7\xcc\x1d\x23\xf4\xfa\x1e\x2a\x5e\x48\x57\xa3\xca\x07\x95\x6e\x4e\x16\x0b\x05\xee\x9e\xee\x79\x51\xdd\xd2\xfb\x2b\x3c\x4c\x2d\x07\x32\xe0\x58\x0a\xeb\xcd\xcf\x84\x62\xbe\x1c\x5c\x71\x2e\xd4\x2a\x64\x8a\x85\xad\x5f\xd9\x3c\x56\x3d\xcb\x0d\x03\xb1\x37\x16\x8d\xb6\xb7\x9c\xdb\xcd\x84\xaa\x45\xd3\xf3\xc2\x86\x1a\x9c\xe7\xdb\x5b\x5d\x44\xd1\x60\x6a\x5c\x7d\x69\xe5\x59\x26\x29\xbf\x80\x98\x24\x70\xcd\x22\xb1\x94\x34\x5b\xb1\x08\x8b\x1d\x5a\x57\xaf\xd1\x18\xb5\x0d\xa1\x6a\xc6\xf0\xa6\xd3\x2b\xcb\xe7\x09\x53\xab\xdd\x4e\xc3\x56\xe2\x50\x10\x49\xd0\x3b\x39\x5f\x1f\xda\x38\xb3\x9f\x97\xc2\x8f\x0f\x78\x77\xfd\xba\x7c\x11\x8b\xed\x3e\xb1\x94\x46\x91\x21\x6c\xef\x00\x05\x27\x09\x56\x88\xa8\x81\x43\x68\xef\x67\x32\xbd\x5c\x00\x64\x16\x9f\x31\x50\x4d\xa5\x68\x5b\x54\x8c\x47\x80\xc5\x1b\x5d\x11\x4e\x00\xef\x03\xd0\x92\x81\x95\x60\x01\xbd\x7e\x7e\x17\x81\xeb\xdd\x12\x67\xbb\x11\xa1\xc5\x80\xd0\x0e\xf1\x82\x17\x76\x02\xbd\xc2\x43\xbd\x50\x60\xfe\x6d\xc0\x8b\x4f\x86\x6e\xb6\xad\xd5\x79\x66\x43\xc1\x47\xf3\xc3\x1f\x6b\xbd\xb8\x18\x2e\x45\x56\xe2\xca\x0d\xb0\xc9\x31\x9c\x55\xce\xa3\x41\xcc\x54\x64\xd8\x4c\x83\xe1\xe8\x58\x70\xe5\x6b\x73\x52\x6e\xcb\x69\x5e\xd2\xc4\x25\xc8\xba\xc1\x32\x91\xa0\x1f\x34\xce\xbd\xbe\x6a\x53\x8f\x20\x9d\x43\x1c\x43\xec\xe3\xdd\xd7\xa4\xe1\xd0\xef\x10\x38\xba\x64\x02\x7f\x2c\x9e\x8a\x24\x69\x3f\xd3\x5b\x0d\x2b\x7d\xcc\x2a\x1e\x00\xbd\xe3\x4c\x3a\xc4\xcc\x13\x0f\x50\xa6\x0a\x8a\x2c\x1d\xd1\x88\x64\x46\x61\x29\xe0\x3e\x07\x7d\x05\xc0\x49\xb4\x82\xe8\x42\x95\x31\x76\xda\xd0\xe1\xc6\x46\xbb\x18\xaa\x76\x01\xb1\xca\x41\x0b\xc1\xd4\x6c\xa8\x4b\x72\x07\xc2\x8c\x5a\xc8\xe1\x6a\x33\x26\x6b\xfb\xe0\xa2\x97\x94\x25\x74\x9e\x74\x28\xcc\x27\x8b\xf2\xcd\x49\x75\xfe\xcc\x4b\x47\x59\x9e\x24\xce\x2b\x8d\x51\x2a\x5a\xd2\xc5\x82\x45\x18\xa4\x88\x51\x3a\x65\x54\xef\xce\xa5\x8f\x8a\xcc\x51\x9a\xea\x7c\x6b\xeb\x5b\xf0\xa6\x0d\x5f\x8c\x16\xca\x1a\xed\xad\x7d\x30\xe4\x7d\x5d\x83\x35\xb3\x03\xab\xa2\xd7\x1c\x5a\x33\xf2\x56\x68\x17\xed\xf6\x06\x94\x72\x91\x76\xe4\x3d\x50\x25\x78\xe5\x28\x40\xcd\x43\xb2\x25\xe3\x74\x77\x95\x02\xbb\xfe\xaa\xc5\xbc\x50\x34\xe9\x1a\x8b\x17\xb3\xa5\xa4\xba\xe0\xe0\xe5\x12\xdd\xa1\xe9\xc4\x82\x45\x8e\x11\x6f\xe4\x88\xaf\x11\x6d\x5c\x08\xdc\x6e\x9b\x2a\xe3\x5a\x8a\x38\x8f\xc0\x95\x69\xce\x55\xb5\xe3\x5b\x3d\x07\xea\xe1\x5f\x7e\x8c\x32\x9d\x20\x06\x4d\x99\xf3\x57\x0b\x0e\x84\xaa\xcc\x68\xf9\x1e\xdb\x73\x29\xf1\x44\xf5\xfb\x80\x87\xdd\xd1\xe9\x09\x79\x0f\x6d\x48\xd7\xc9\x77\xba\xe2\xfb\xa6\x24\xa1\x4a\x9f\x4b\xca\x15\x4e\xf8\x9c\xa5\x4d\x26\x0a\xa3\x59\x21\x06\x34\x3e\x97\x88\x15\x8d\x8f\x2d\x0a\x34\x3e\x6e\xe0\xde\x7d\x38\xe7\xf6\x1a\x6e\xc3\xda\xbf\xdd\x6b\x99\x1e\x69\xe4\x12\x6f\xeb\x29\x30\xca\x70\x12\xf7\x36\xb8\x52\xd6\x66\xab\x1d\xea\x63\xae\x0b\xaa\xdb\x6d\x0c\x04\x03\x6d\x4a\x2d\xfd\xca\xfb\x06\x73\x1e\x83\x4c\xd0\xe7\x56\x8e\x17\xad\x8c\x90\x1c\xcf\x9c\xf2\x4f\x0b\x3b\x0e\x86\xb9\x3a\xcf\x62\xe9\x34\xb0\x01\x73\xbe\x47\x83\x5d\xae\x86\xb8\xed\x06\x99\x6c\x14\x41\xa6\xdb\xb9\x6c\x2f\x9b\x9c\x37\xac\x18\x21\x61\xaa\x9b\xb1\xca\xe1\xd4\x6d\xec\x97\xeb\xca\xc6\xa4\xac\xf2\x94\x1a\x06\x45\x63\x0c\x90\x2b\x9e\x59\x1d\xc9\xea\x34\x96\x22\xad\xe3\xce\x3a\x5e\xfc\xf6\x75\xee\x90\x63\x5a\xb4\x48\xb5\xef\xb0\x96\xf4\x82\x59\x4a\xaf\x5f\x03\x5f\xea\xd5\x21\xf9\xd3\x57\xff\xf3\xeb\xbf\x34\xbc\x28\xe6\x36\xa6\xed\x15\x70\x67\x25\xba\x0d\xe8\x6d\xf7\xba\x69\xe6\x9c\xf9\x50\xec\xd9\xb2\x7c\xa7\x70\x28\x94\x58\x89\x4e\x68\xd0\x8e\x6f\xe7\x59\x3b\x38\xbf\xc7\x64\x02\xa5\x29\x8f\x60\x62\xc4\x81\x9d\xc3\x18\x55\xd6\xf2\xc8\x64\x4d\x9e\x7f\x35\xc1\x10\x4f\x9c\x94\xa5\xae\x59\xc9\xd6\x3f\x5c\x7f\x9c\xed\x58\x0c\x53\xe4\xaf\x93\x8d\x99\x32\x45\xcc\xde\x8b\x05\xa2\x69\xcb\x24\x51\xed\x93\x60\x79\xb6\x37\x02\x6c\xf3\x6c\x28\x56\xd2\x85\x09\x5d\xb6\xc9\x7e\x76\xc9\x94\x71\x96\xe6\xe9\x21\x79\xd6\xf0\x8a\xe5\xc8\xb7\x81\x1e\xb6\xa7\xf2\x3c\xa3\x86\x2d\x2f\x25\x4d\x53\xcc\xb8\x62\x31\x70\xcd\x16\x0c\x63\x5e\x0a\x12\x43\x3d\xde\x7e\xe8\xe3\xb4\x0a\xe0\x63\x08\x97\x61\xa3\xbd\x88\xee\xd4\x9e\xe3\x12\x85\x52\xe7\xb5\x8b\xaa\x9c\x77\x9d\x81\xa5\x4a\xab\x36\x10\xb8\xce\xac\x24\x57\xf1\x1f\xa5\x40\x39\xe3\x4b\x55\x46\x5b\x22\xff\x6b\x33\x8f\x9b\xcf\xae\x56\xe0\xa2\x1b\xa0\xea\x1d\xf4\xa5\x82\x8c\x28\x59\x06\x19\x63\xe0\x79\x3b\xfb\xd8\xb6\xc5\x1a\xa9\x2b\x85\xe4\x98\x2a\xe8\x61\x77\xad\xc4\x62\xfa\x6b\x15\x8a\xe4\xe0\x5b\x63\x40\xcf\x9f\x7d\xd5\x8a\x77\xc5\x7b\x8d\x2f\x95\x51\x9a\x1f\x8e\xa6\xff\xa2\xd3\x5f\x3f\xee\xb9\x7f\x3c\x9b\xfe\xf5\xff\x4e\x0e\x3f\x3e\xad\xfc\xf9\xb1\x39\xb8\x72\xb7\xe4\x5c\xb6\x1a\x0e\xbb\xb3\xd6\x8b\x55\x1e\x3f\x26\x3e\x98\xeb\x5c\xe6\x30\x21\xdf\xd3\x44\xc1\x84\xfc\xc8\xf1\x9c\xbc\x21\xd0\xda\xa3\x2b\x8c\x64\xf3\xd8\x8c\xfa\xb8\xfd\x15\x9c\x52\xfb\x3b\x6e\xba\x6d\x2a\x68\x3f\x20\x79\xcb\x42\x85\x11\xf2\x0a\x06\xda\xec\xae\x85\x10\x33\xb8\xa6\x69\x96\xc0\x2c\x12\xe9\x41\xf1\xfc\x16\x0f\xb9\xe7\x5f\xf7\xc0\x9e\xbd\x0f\x16\x47\x3e\xee\x7d\x98\xba\x7f\x3d\xf5\x3f\xed\x7f\xb7\xf7\xef\x59\xeb\xf3\xfd\xa7\x07\x18\xda\x5b\xa0\xda\xc7\x0f\xd3\x12\xed\x66\x1f\x9f\xee\x7f\x57\x79\xb6\xbf\x0b\x09\xb7\x93\xa8\x52\x9a\x4d\x2f\x1a\x2b\xc6\x35\x8a\xb2\x4d\xd9\x58\x29\xcd\x76\xa9\x78\x0b\xb6\x7c\x43\xb3\xf7\xb0\x00\x09\x3c\xea\x36\x21\x1d\x6f\x7d\x42\xf6\x62\x73\x84\x63\x0e\xde\xbe\x17\x5e\x65\xf1\xd4\x1d\x64\xc5\x77\x9e\xbb\x17\x17\x1e\x6d\xc6\xe4\xd4\x22\xdd\x26\xa5\x28\xb9\x43\x59\x2f\x7b\xbd\x7d\x17\x10\xa7\x0d\xe2\xe4\xb4\x8c\xba\x1b\x61\xe8\x31\xc7\x91\x35\x78\xb5\x69\x10\x3d\x90\xbc\x9f\xec\xcb\x5b\x42\x7f\x3b\x07\x29\xd6\x39\xba\x07\x7f\x0f\xc5\x4f\xd6\xee\x32\xba\x9f\x9c\x35\x2a\x97\x7d\xa5\x8b\x1f\x4f\x5e\x58\x9c\x41\xc6\x84\x12\xe5\x4a\x24\xb1\x22\x39\x67\xbf\xe4\x40\x4e\x5e\x14\xd5\x87\x18\x8f\x92\x1c\xef\xed\xf9\xf1\xc7\x93\x17\x6a\x46\xc8\x3f\x20\xa2\x46\xaf\xbf\x6a\x09\xe1\xc4\x52\x7b\xef\xde\xbe\xfe\xdf\x68\x01\xc0\x2f\xdd\xb5\x19\xae\xb0\x48\xc2\xa8\xb5\x48\xd9\xc3\xd7\xf4\x6a\xa3\x1b\x71\x46\x11\xcd\x9a\x6d\x0c\xc4\xd9\xed\xb8\x0d\xd2\x5d\x41\x92\x29\x4c\x3e\x22\x2a\x97\x6e\x35\x66\x40\x9b\x05\x81\x69\xe8\xce\x71\xee\xf3\xa9\x30\x5f\x6d\x54\x5c\x74\x24\x38\x87\x08\x23\x13\x8c\x10\xda\x87\x43\x54\xdf\xdf\x14\xf0\x77\x4a\xb4\x9b\x01\xce\xe5\x98\x9e\x7f\x78\x03\xe9\xed\x13\xba\xa1\xc8\x77\x4e\x94\xc7\x19\x8f\xa0\x6a\xe7\x5b\x1c\x8d\xdf\x66\x0e\x0e\x6e\x77\xce\x12\xb6\xd6\x3b\x6a\x44\x6b\xb4\x44\x67\xf0\xfb\x0e\xdb\x75\x3d\x2c\x73\xcb\xb2\xb1\x91\xdb\x8a\x06\xd4\xc2\x9f\xbc\xa2\x8a\xcc\x01\x38\xda\x73\xad\xdd\x0e\xb8\xc3\x79\x28\xad\xad\x79\x36\xd5\x62\xda\xa0\x5f\x75\x40\xae\x1b\x6a\x2d\xe6\x83\xda\xda\x8e\x06\x1b\x04\xae\x56\xeb\x5d\x30\x50\xe5\xad\x3d\x5e\x7a\x1a\xec\xa5\x6e\xd6\xca\x6a\x73\x76\x46\xd6\xe2\xd8\xc6\xbf\xb6\xa7\x64\xd4\xed\x9a\xe1\x49\x0b\x74\x2f\xd6\xa8\x79\xc4\x1c\xed\x36\x9f\x81\xbc\x64\x3d\x84\x8f\xf7\xf5\xf7\x7b\xb1\x96\x57\xef\x4f\x8f\x31\x3f\xcf\x7c\xe0\xfd\x13\x88\xfd\x55\xa9\xe2\xf6\x3d\x3a\x91\x0d\x35\x3a\xba\x7b\x82\xce\x84\x1c\x3f\x48\x26\x85\x16\x91\xe8\x70\x3a\xb5\xa6\xcc\x20\x68\xdb\x72\x8c\x86\xf4\x31\x54\xde\xb0\x7c\xac\x96\x95\xa6\xb4\x90\x86\x5c\x6b\xbf\xe5\xf3\xe2\x4e\xac\xb2\x77\xa7\xf5\x91\xff\xfc\xf7\xd1\xff\x0b\x00\x00\xff\xff\xbd\xa3\xb8\x4f\x69\x56\x01\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x7b\xbc\x0b\x49\xe5\x73\x2d\x69\xa4\x07\x5d\x88\xe4\x1d\x8e\xe1\x4a\xa4\xad\x16\xae\x44\x0a\x57\x22\x85\x2b\x91\xc2\x95\x48\xa1\x94\x5f\x28\xe5\x57\x6d\x9f\x8d\x1f\x8f\x84\x52\x7e\x03\x3f\x0d\xa5\xfc\xba\x5a\x28\xe5\x17\x4a\xf9\x35\x8d\x1e\x4a\xf9\x85\x52\x7e\xc3\x06\x0e\xa5\xfc\x48\x28\xe5\x17\x4a\xf9\x7d\xc1\xa5\xfc\xc2\x95\x48\x5f\xc4\xbd\x20\xe1\x52\x90\x01\x63\x7f\x5e\x97\x82\x84\x2b\x91\x5a\x07\x09\x57\x22\x05\xd6\x17\xae\x44\xfa\xdd\x72\xbf\x70\x25\x52\x8f\x41\xc2\x95\x48\xe1\x4a\xa4\xd6\x16\xae\x44\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\x2b\x91\xc2\x95\x48\xe1\x4a\xa4\x62\xe4\x70\x25\x52\xb8\x12\x09\x5b\xb8\x12\xa9\xc7\x08\xe1\x4a\xa4\x2f\xf5\x4a\xa4\x5a\x5a\xd0\x97\x7b\x2f\xd2\xf0\x65\x84\xcb\x91\xc2\xe5\x48\x0d\x2d\x5c\x8e\x14\x2e\x47\xda\xd5\xc2\xe5\x48\xe1\x72\xa4\x96\x16\x0a\x21\xf6\x6c\xa1\x10\x62\xdf\x16\x0a\x21\x36\xb5\x50\x08\x71\xb3\x85\x42\x88\xa1\x10\x62\x28\x84\x18\x0a\x21\x6e\x0f\x18\x0a\x21\x86\x42\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\x28\x84\x18\x2e\x47\xfa\x2c\x6f\x16\x09\xd7\x8a\x74\xb4\xcf\xe7\x5a\x91\x70\x39\x52\xad\xf3\x70\x39\x52\x60\x61\xe1\x72\xa4\x2f\x8e\x8b\x85\xcb\x91\x76\x74\x1e\x2e\x47\x0a\x97\x23\x85\xcb\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\x97\x23\x85\xcb\x91\xc2\xe5\x48\xd8\xc2\xe5\x48\xe1\x72\xa4\x70\x39\xd2\xce\x8f\xe1\x1a\x2f\x37\x39\x16\x5c\x03\x6f\xcc\xb9\xe9\x8b\xce\x2f\x6b\xbd\x99\xd3\x75\xc1\x96\xb9\x74\x7a\xff\xf2\xfd\xe9\x31\x89\xa8\xa6\x89\x58\x92\x53\x11\x5b\xd3\x32\x7e\x51\xfc\x9c\x82\xa6\x31\xd5\xb4\xbc\x41\x25\x93\xe2\x92\xc5\xc8\x54\x63\xb8\x26\x2c\xa5\x4b\x30\xcc\xab\x71\x12\xb9\x02\x42\xc9\x15\x24\xc9\xf4\x82\x8b\x2b\x4e\x2e\x41\xaa\x0a\xbb\xfe\x24\xb2\xf4\x13\x51\x20\x2f\xed\x05\x43\x70\x9d\x19\x44\x63\xda\x9e\xfb\x7e\x26\xd5\xe1\xca\x20\xf5\x63\xfb\xf4\x0c\x83\x7a\xdb\xee\xea\x29\xd6\x8e\xcb\x34\x73\x7a\x6a\x04\xfb\xa7\x86\xa8\x73\xe5\x23\xea\x17\x2c\x81\xe9\x9c\x2a\x88\xfd\xb8\xca\xd0\x9a\x90\xb1\x9d\x5b\xae\x59\xc2\x7e\x05\x77\x9a\x00\xd5\xb9\x6c\xcc\x93\xe8\x21\x70\x74\x1b\x42\xa6\x7e\x1e\x2f\x58\x93\x11\xa3\x8f\xc1\x22\xa2\xd1\x0a\x5e\xb0\x56\x15\xbe\x86\x54\xc7\xee\x03\x6f\x92\xd8\x13\x99\x95\x83\xf6\x49\xcc\x24\x32\xa1\x35\x51\x5a\x48\x0f\xb9\x4c\xc2\x34\xa2\x49\x94\x27\xc8\x72\x8e\x4e\x4f\xec\xa0\xdd\xb7\x66\x75\x90\x52\xb9\xfe\x01\x93\xf7\x9f\xf8\xe9\xef\x9e\xf3\xf6\x6e\xa3\x00\x8a\xf6\xc8\x9b\x4c\x3b\x85\x54\xc8\xf5\x39\x95\x4b\xb8\x31\x09\xbf\xa9\xf4\xb5\x49\xc0\x7f\x78\xf5\xee\xcd\xcb\x37\xaf\x4f\xde\x9c\x9c\x3b\xbe\xec\x9d\x61\x9b\xa4\xed\xd4\x56\x6b\x61\x14\x0b\xed\xa6\x48\x12\x96\x32\x5d\x7c\x65\x69\xb0\x59\x65\xb6\x7c\x1b\x13\xe8\x72\xae\x59\x0a\xd6\xf3\x45\xb5\x36\x22\x8d\xa1\x8f\x14\x40\xe3\x35\x5d\x29\xbd\x00\xc3\x5c\xc9\x32\xa7\x92\x72\x0d\xfe\x28\x60\xda\x7e\x14\x0b\xa2\x84\x53\xe4\x99\x2a\xbd\x64\x0a\xb4\x4d\x1b\x3a\x15\xcd\x2c\x05\x7b\x58\xd1\x4b\x7b\x81\xd2\x42\x18\xfe\x6d\x36\x35\x15\x31\x5b\xb0\xc8\x5a\x86\x48\x4a\xe3\x22\xd5\xc5\x29\x16\x20\x8b\xe3\xaf\x5c\x70\x1b\xf5\x6d\x82\x19\xf8\x25\x93\x82\xa3\xc2\x74\x49\x25\xa3\xf3\x04\x0a\xff\x9f\x02\x6d\xc7\x2b\x17\xc4\xc9\x7c\xad\xa1\x99\x2d\xd9\x11\xdc\x6e\xb8\x0b\xb8\x9a\xfb\x7b\xd4\xd8\xcf\x79\x99\x93\x56\x0a\x2b\xe6\x7b\xe6\x92\x15\x62\x50\xcc\x31\x3f\x09\x71\x1e\x79\xd0\x09\x9d\x49\x66\xb5\x3f\x5a\x60\x8c\x63\xc6\x54\x91\x34\x37\x27\xb5\x91\x82\x94\x62\xf3\x04\x26\x46\xd6\x61\xcd\xc9\x34\x65\x1f\x73\x30\x50\xc6\x9e\x50\x02\xb9\x04\x83\x6f\x06\x8f\xad\xa8\x0b\x60\x04\x21\x81\x97\x60\x51\x2b\xce\x78\x97\xa9\x39\x8f\x23\xe7\x30\x3f\x59\x90\xb5\xc8\x65\x8d\xfd\xaf\xa8\xc1\x63\xa4\xde\xc6\x89\xb8\x04\x38\xe4\x41\x13\x12\x83\x51\x1c\x18\x37\x27\xd1\x52\x88\xd8\xe8\x0f\x52\x5c\xb3\x14\x47\x71\x04\x50\xec\xda\x7c\x4d\x62\x91\xcf\x93\x02\x4d\x0c\xcb\x77\xa7\x55\x46\xa3\x0b\x33\x07\xec\xb8\x2d\x75\xf1\x40\xa7\xd9\x01\xbe\xe5\xfe\xeb\xbe\x54\xb3\x9f\x95\xe0\xa5\xd3\xb9\x58\xd6\xac\xd7\xee\x32\x45\xe6\xa0\xf4\x14\x16\x0b\x21\xf5\xdf\xcc\xfe\xe6\x1c\x89\x86\x8b\x02\x80\x1e\x81\x30\xc0\x00\xa1\x8d\x29\x28\x75\xaa\x17\x72\x07\x03\xa9\xa0\x5e\x13\x0b\xcc\x0c\xbd\x4b\x7e\x48\xfe\xcf\xde\xbf\xff\xf8\xdb\x74\xff\xbb\xbd\xbd\x0f\xcf\xa6\x7f\xfd\xf8\xc7\xbd\x7f\xcf\xf0\x1f\x4f\xf7\xbf\xdb\xff\xcd\xff\xf1\xc7\xfd\xfd\xbd\xbd\x0f\x3f\xbc\x79\x75\x7e\xfa\xf2\x23\xdb\xff\xed\x03\xcf\xd3\x0b\xfb\xd7\x6f\x7b\x1f\xe0\xe5\xc7\x9e\x9d\xec\xef\x7f\xf7\x87\x86\x09\x51\xbe\x7e\xb7\x68\x25\xe2\x5e\xd9\xbb\xd3\x3e\xe7\x51\x4d\xa4\x63\x5c\x4f\x85\x9c\xda\x0f\x0e\x89\x96\xf9\x6e\x51\xd6\xc8\xbd\x5d\xae\xe1\xbe\xe7\xc1\xdb\x4a\x5f\x1b\x1e\x23\x77\x85\x9d\x33\x57\x9a\xd9\x14\x9c\x3d\xb3\xd2\xdd\xc2\x6c\xbb\x17\xfb\x9b\x8f\xb8\xb3\x1d\x3d\xa2\x3c\xef\xbe\x7c\xa2\x7c\xe4\xc3\x46\xff\x1b\x49\xb8\x96\xe3\xb7\x8d\xd5\x43\x46\x1a\x66\x82\xe9\xdc\xc2\x4c\x32\x21\x99\x5e\x1f\x27\x54\xa9\xb7\x34\x85\x9b\x6e\xc8\xc9\xa2\x54\xc3\x26\x86\x9e\xcd\xf9\xe3\x0e\x68\x17\x8a\xe2\x86\x6c\x06\xf8\xc9\x02\xf5\x90\x4a\x3f\x1e\xa8\xfe\xdb\x82\x30\x3d\x89\x0b\x49\x7e\x05\x29\xdc\x65\x86\x12\xac\x2e\xd3\x38\x82\xfb\xac\x7d\x1f\x5a\xc0\xa6\x20\xca\x11\x6c\x46\x3e\xba\x36\x1a\xc5\x82\x2d\x6f\x0a\xba\xb3\x5d\x9d\x92\x88\x72\xb3\x50\xbc\xa5\x73\x41\x3e\x25\xb0\xa4\xd1\xfa\x93\x59\xf0\x27\x09\x66\x8a\x46\x07\xfc\x64\x95\x83\x9a\xf8\xef\xa2\x7e\x98\x22\xc0\xf0\xe2\x56\xc6\x7f\xb6\x0a\xa3\xd7\xbe\x1b\x67\x22\xb1\xfe\x40\x26\xe2\x99\xd9\x83\xd9\xc6\x6a\x91\x85\x16\x0f\x0b\x51\xe2\xc3\xd3\x8f\x5b\x6f\x3a\x6b\xa6\x16\x56\xa9\xac\x12\x87\xcc\x91\xeb\xb7\xc9\x35\x1e\x20\xe4\x28\x4e\x19\x9a\x60\xc9\xde\xe9\xd9\xd1\x7e\x6d\xe5\x46\xca\xb1\xe7\x70\x2c\xc0\xc7\xdd\x98\x81\x54\x69\x4c\xc5\x33\x14\x53\x1c\x2d\x09\x63\x8e\xa3\x9f\x8b\x01\x30\xda\x57\x5b\xd2\x7a\xfd\x64\xcf\x8e\xc8\x27\x23\x21\x27\x8c\x83\xdd\x83\x4c\xb2\x4b\x96\xc0\xd2\xcc\xa4\x12\xc8\xe0\x5d\x32\xbb\xf7\x94\x29\x73\x4a\xd5\xd1\x3b\xc5\x1c\x5d\x8b\xd6\x2d\x78\xeb\x0e\x6e\x17\x53\x52\xb1\xee\x3d\x51\x38\x3d\x2f\x13\x97\xf2\x42\xed\x2d\x44\x07\xbe\x10\x32\x32\xa7\xf9\x0e\x38\x6a\x97\xc4\x6e\x40\xd3\x2e\x70\xa2\xf9\xa7\xd0\x22\xa9\x32\xb4\x57\xeb\xf0\x8a\x56\x2a\x05\xcc\xc8\x3b\x83\x84\x57\x4c\xc1\xa4\x90\x7a\x77\x76\xe1\x31\xfc\x8a\x36\xcb\x89\x95\x6e\xcf\xf0\x9f\x6b\xeb\x6d\x72\xe6\x18\x44\x77\x94\xa3\x9a\xe8\x85\x48\x50\x86\x6f\x30\x6e\xbf\x62\xb1\x15\x7d\x40\x4a\x21\x67\x36\x95\xdf\xea\xc1\x22\x89\x5b\x4e\xc9\x42\x1d\x37\x22\x0b\x1a\x9b\x2c\x7e\x71\xe4\x60\x0e\x6d\x76\x83\xb9\x01\x37\xea\xf2\xaa\x16\xc5\x12\x5a\x04\xa2\x37\x02\xf3\xff\x6d\x91\x0d\xb3\x0c\x3a\x17\xb9\xb6\xf8\x60\xd9\xc7\x42\xe4\x3c\x26\x86\x33\x1e\x92\x95\xd6\x99\x3a\x3c\x38\x28\x8f\xee\x19\x13\x07\xb1\x88\xd4\x41\x24\x78\x04\x99\x56\x07\x9e\x90\x0f\x32\x11\x4f\xfd\x1f\x53\xea\xe9\xf0\x60\x2c\xe3\x24\x04\x78\xde\x72\x9b\xe7\x94\xd8\xd5\xb6\xbc\x50\x02\x73\xe7\x4b\x5a\x24\x2e\x62\xb2\xf1\x5c\xac\xdf\xf1\x5a\xbe\x5f\xdc\x41\x5b\x08\xfe\x15\x46\xfa\x44\x55\xbb\x6e\x3f\x39\xda\x2c\xcb\x1d\xb6\xe4\xfe\xa6\xd9\x73\xcf\x4b\x8d\x34\x5c\xae\x02\xa5\x20\xad\x29\x5e\x4f\x6b\xd4\x25\xfb\xc4\xb0\x41\xbe\x26\x86\x55\x6b\x77\x65\xb2\x35\x49\xb6\x69\xf6\x2b\x23\x37\x61\x0d\x8b\x6f\x0a\xb7\xdb\x04\x16\x0b\x88\xf4\xb7\x15\x33\x51\x51\x85\xa1\x70\x6b\x7d\xe3\xff\xf5\x6d\xf3\x29\xdf\xcb\x03\xd5\x2f\xfc\xc4\x4e\xa9\xdd\xf6\x3d\xcc\xe6\xfd\x12\x7b\xdc\x90\x5f\x2c\xf0\xec\x60\xa8\xde\xa3\x6f\xda\x19\x52\xad\x57\xc2\xc9\x85\x49\x52\x7b\xb9\x33\x00\x03\xf9\x4d\xe5\x40\x70\x26\xd8\xd2\x1b\x08\xe4\xad\x70\xe5\x6c\x60\x42\x4e\xf1\xca\xe0\xf2\x17\x3c\x91\xdf\x0a\x5b\xd8\xa6\xa3\x52\x49\x4f\x83\x6d\x67\xfc\xce\x30\x78\xfe\x50\x86\xf3\x58\xc0\xd4\xc2\x79\x4a\xc2\xaa\xfa\xc1\x5a\x01\x7b\x01\xeb\x4e\xa8\xba\xc3\xcf\x85\x12\xa1\x9f\x69\x52\xe2\xa8\xd7\x0c\x6c\xa4\xc4\xdf\x5c\xf5\x03\x91\xce\x19\xb7\x53\xb1\x03\xfb\x7d\xc6\xb1\xfd\x7e\xf0\x18\xff\xec\x9e\x44\x4f\x68\xf7\x8b\x29\x1a\x06\xf2\x77\x03\xe2\x85\x0a\xcf\x73\x17\x48\x77\xc5\x05\x55\x82\x81\x5e\xfe\x92\xd3\x64\x46\x5e\x58\xf1\x1a\x81\x67\x7f\xea\x22\x37\xdb\xc5\x96\x3f\xfe\x8a\x25\x71\x44\x65\x8c\x9a\x95\x65\x3f\x44\x09\x8b\x38\xd4\x4b\x6f\x1d\x7d\x7b\x06\x58\x22\x8f\xbd\xcc\x9b\x64\x54\x6a\x16\xe5\x09\x95\x86\xe1\xc3\x52\xc8\x8e\x78\xf4\x9e\x9b\x59\x62\xf3\x19\x44\x82\xc7\x1d\x9e\xc3\x61\xbb\x7a\xbe\xd9\x79\x75\x7b\x51\x6e\x03\xc9\x5c\x45\x15\x96\xc2\x26\x79\xed\xd5\xb4\xe2\x8e\xb1\xc4\xc2\x33\xbb\x82\xb7\x4c\xac\x70\x65\xc4\xb8\x6a\xe1\x27\xa6\x7c\xb4\xff\x7e\xe5\xc0\x29\xa8\x7d\x46\xfe\xb1\xf6\x3a\x57\x57\x08\x12\xd3\xde\x0f\x85\x66\x1c\x37\x5f\x47\x8a\x6e\x27\x4b\x36\xb2\x10\x12\x2e\x41\x92\xbd\x58\xe0\x37\x58\xc0\x69\x7f\x46\xfe\x65\x94\xc1\x36\x37\x8c\x6d\x1c\x96\xb6\x04\x90\x23\xec\x22\x09\x43\x02\xda\xed\xa9\x22\xcf\xc8\x9e\xad\x0a\xc5\xd2\x14\x62\x46\x35\x24\xeb\x7d\x2f\x7d\x5b\xb3\x5a\x1f\xac\xe9\x53\x2c\xad\x52\x24\xed\xeb\x3f\xb7\xbc\x89\x93\xbd\x4d\xa4\xfa\xc9\x9b\x9b\x4b\xc0\x5a\x49\x7a\x03\x7b\x0a\x2f\x66\x67\x90\x42\x63\x44\xda\xa4\xe4\x35\x15\x51\xd7\xf3\xe6\x02\xb7\x7e\x36\x08\x4a\x89\x84\x25\xd2\xa7\xa5\xb9\x1b\x50\x27\x8b\x76\x97\x7b\xeb\x10\x42\xda\x3d\x52\x53\x62\x74\xc1\xaf\xff\x1c\x53\x4d\x1b\x5e\xb0\x28\xb3\xce\x76\x91\x5a\x97\x6c\x53\x76\xde\xb4\xd7\x3d\x5c\x2f\x6e\xf8\x51\x3d\xa0\x52\xb3\xeb\xcb\x3e\xd8\x75\x82\xb6\x69\x1b\x2b\xe9\xd1\x60\x2a\x61\xc9\x94\x96\xeb\x8a\x03\xc2\xb9\x30\x05\x61\x5c\x69\xca\x35\x43\x56\x4d\xfc\x9b\x53\x67\x7c\xbf\x62\xba\x21\x0c\xf0\x9d\xd1\xdd\xd1\xb4\x8b\x99\x38\xd6\xf8\x71\xbe\xce\x80\xfc\xbd\xf2\xc7\x2b\x99\x45\xbb\xbf\x3f\x59\x10\xc7\x40\x2d\x6e\xd2\x38\x96\xa0\xb6\x39\xdb\xae\xaf\x5b\xc1\xe7\x8d\x55\x63\x21\x78\xea\x8d\x5d\xae\x46\xa0\x52\x6c\x69\x94\x14\x5f\x1f\xd2\xfb\x72\x6a\xca\x8a\xf9\xd5\x0d\x6c\x3d\xb3\x90\x16\x27\x26\xd3\x5e\x1d\x8c\x04\x57\x79\x5a\x5a\x11\x62\xc8\x80\xc7\xc0\xa3\x35\x96\x84\x4a\x2e\xa1\x21\x8c\xe7\x47\xd5\x80\x12\x84\xfc\x2f\xb6\x34\x6a\xb7\x9b\x5c\x55\x72\xf6\xde\xe9\x8d\x99\x32\x65\x00\xbf\x00\x69\x94\x7f\xcc\xdc\x31\x42\xaf\xef\xa1\xe2\x85\x74\x35\xaa\x7c\x50\xe9\xe6\x64\xb1\x50\xe0\xee\xe9\x9e\x17\xd5\x2d\xbd\xbf\xc2\xc3\xd4\x72\x20\x03\x8e\xa5\xb0\xde\xfc\x4c\x28\xe6\xcb\xc1\x15\xe7\x42\xad\x42\xa6\x58\xd8\xfa\x95\xcd\x63\xd5\xb3\xdc\x30\x10\x7b\x63\xd1\x68\x7b\xcb\xb9\xdd\x4c\xa8\x5a\x34\x3d\x2f\x6c\xa8\xc1\x79\xbe\xbd\xd5\x45\x14\x0d\xa6\xc6\xd5\x97\x56\x9e\x65\x92\xf2\x0b\x88\x49\x02\xd7\x2c\x12\x4b\x49\xb3\x15\x8b\xb0\xd8\xa1\x75\xf5\x1a\x8d\x51\xdb\x10\xaa\x66\x0c\x6f\x3a\xbd\xb2\x7c\x9e\x30\xb5\xda\xed\x34\x6c\x25\x0e\x05\x91\x04\xbd\x93\xf3\xf5\xa1\x8d\x33\xfb\x79\x29\xfc\xf8\x80\x77\xd7\xaf\xcb\x17\xb1\xd8\xee\x13\x4b\x69\x14\x19\xc2\xf6\x0e\x50\x70\x92\x60\x85\x88\x1a\x38\x84\xf6\x7e\x26\xd3\xcb\x05\x40\x66\xf1\x19\x03\xd5\x54\x8a\xb6\x45\xc5\x78\x04\x58\xbc\xd1\x15\xe1\x04\xf0\x3e\x00\x2d\x19\x58\x09\x16\xd0\xeb\xe7\x77\x11\xb8\xde\x2d\x71\xb6\x1b\x11\x5a\x0c\x08\xed\x10\x2f\x78\x61\x27\xd0\x2b\x3c\xd4\x0b\x05\xe6\xdf\x06\xbc\xf8\x64\xe8\x66\xdb\x5a\x9d\x67\x36\x14\x7c\x34\x3f\xfc\xb1\xd6\x8b\x8b\xe1\x52\x64\x25\xae\xdc\x00\x9b\x1c\xc3\x59\xe5\x3c\x1a\xc4\x4c\x45\x86\xcd\x34\x18\x8e\x8e\x05\x57\xbe\x36\x27\xe5\xb6\x9c\xe6\x25\x4d\x5c\x82\xac\x1b\x2c\x13\x09\xfa\x41\xe3\xdc\xeb\xab\x36\xf5\x08\xd2\x39\xc4\x31\xc4\x3e\xde\x7d\x4d\x1a\x0e\xfd\x0e\x81\xa3\x4b\x26\xf0\xc7\xe2\xa9\x48\x92\xf6\x33\xbd\xd5\xb0\xd2\xc7\xac\xe2\x01\xd0\x3b\xce\xa4\x43\xcc\x3c\xf1\x00\x65\xaa\xa0\xc8\xd2\x11\x8d\x48\x66\x14\x96\x02\xee\x73\xd0\x57\x00\x9c\x44\x2b\x88\x2e\x54\x19\x63\xa7\x0d\x1d\x6e\x6c\xb4\x8b\xa1\x6a\x17\x10\xab\x1c\xb4\x10\x4c\xcd\x86\xba\x24\x77\x20\xcc\xa8\x85\x1c\xae\x36\x63\xb2\xb6\x0f\x2e\x7a\x49\x59\x42\xe7\x49\x87\xc2\x7c\xb2\x28\xdf\x9c\x54\xe7\xcf\xbc\x74\x94\xe5\x49\xe2\xbc\xd2\x18\xa5\xa2\x25\x5d\x2c\x58\x84\x41\x8a\x18\xa5\x53\x46\xf5\xee\x5c\xfa\xa8\xc8\x1c\xa5\xa9\xce\xb7\xb6\xbe\x05\x6f\xda\xf0\xc5\x68\xa1\xac\xd1\xde\xda\x07\x43\xde\xd7\x35\x58\x33\x3b\xb0\x2a\x7a\xcd\xa1\x35\x23\x6f\x85\x76\xd1\x6e\x6f\x40\x29\x17\x69\x47\xde\x03\x55\x82\x57\x8e\x02\xd4\x3c\x24\x5b\x32\x4e\x77\x57\x29\xb0\xeb\xaf\x5a\xcc\x0b\x45\x93\xae\xb1\x78\x31\x5b\x4a\xaa\x0b\x0e\x5e\x2e\xd1\x1d\x9a\x4e\x2c\x58\xe4\x18\xf1\x46\x8e\xf8\x1a\xd1\xc6\x85\xc0\xed\xb6\xa9\x32\xae\xa5\x88\xf3\x08\x5c\x99\xe6\x5c\x55\x3b\xbe\xd5\x73\xa0\x1e\xfe\xe5\xc7\x28\xd3\x09\x62\xd0\x94\x39\x7f\xb5\xe0\x40\xa8\xca\x8c\x96\xef\xb1\x3d\x97\x12\x4f\x54\xbf\x0f\x78\xd8\x1d\x9d\x9e\x90\xf7\xd0\x86\x74\x9d\x7c\xa7\x2b\xbe\x6f\x4a\x12\xaa\xf4\xb9\xa4\x5c\xe1\x84\xcf\x59\xda\x64\xa2\x30\x9a\x15\x62\x40\xe3\x73\x89\x58\xd1\xf8\xd8\xa2\x40\xe3\xe3\x06\xee\xdd\x87\x73\x6e\xaf\xe1\x36\xac\xfd\xdb\xbd\x96\xe9\x91\x46\x2e\xf1\xb6\x9e\x02\xa3\x0c\x27\x71\x6f\x83\x2b\x65\x6d\xb6\xda\xa1\x3e\xe6\xba\xa0\xba\xdd\xc6\x40\x30\xd0\xa6\xd4\xd2\xaf\xbc\x6f\x30\xe7\x31\xc8\x04\x7d\x6e\xe5\x78\xd1\xca\x08\xc9\xf1\xcc\x29\xff\xb4\xb0\xe3\x60\x98\xab\xf3\x2c\x96\x4e\x03\x1b\x30\xe7\x7b\x34\xd8\xe5\x6a\x88\xdb\x6e\x90\xc9\x46\x11\x64\xba\x9d\xcb\xf6\xb2\xc9\x79\xc3\x8a\x11\x12\xa6\xba\x19\xab\x1c\x4e\xdd\xc6\x7e\xb9\xae\x6c\x4c\xca\x2a\x4f\xa9\x61\x50\x34\xc6\x00\xb9\xe2\x99\xd5\x91\xac\x4e\x63\x29\xd2\x3a\xee\xac\xe3\xc5\x6f\x5f\xe7\x0e\x39\xa6\x45\x8b\x54\xfb\x0e\x6b\x49\x2f\x98\xa5\xf4\xfa\x35\xf0\xa5\x5e\x1d\x92\x3f\x7d\xf5\x3f\xbf\xfe\x4b\xc3\x8b\x62\x6e\x63\xda\x5e\x01\x77\x56\xa2\xdb\x80\xde\x76\xaf\x9b\x66\xce\x99\x0f\xc5\x9e\x2d\xcb\x77\x0a\x87\x42\x89\x95\xe8\x84\x06\xed\xf8\x76\x9e\xb5\x83\xf3\x7b\x4c\x26\x50\x9a\xf2\x08\x26\x46\x1c\xd8\x39\x8c\x51\x65\x2d\x8f\x4c\xd6\xe4\xf9\x57\x13\x0c\xf1\xc4\x49\x59\xea\x9a\x95\x6c\xfd\xc3\xf5\xc7\xd9\x8e\xc5\x30\x45\xfe\x3a\xd9\x98\x29\x53\xc4\xec\xbd\x58\x20\x9a\xb6\x4c\x12\xd5\x3e\x09\x96\x67\x7b\x23\xc0\x36\xcf\x86\x62\x25\x5d\x98\xd0\x65\x9b\xec\x67\x97\x4c\x19\x67\x69\x9e\x1e\x92\x67\x0d\xaf\x58\x8e\x7c\x1b\xe8\x61\x7b\x2a\xcf\x33\x6a\xd8\xf2\x52\xd2\x34\xc5\x8c\x2b\x16\x03\xd7\x6c\xc1\x30\xe6\xa5\x20\x31\xd4\xe3\xed\x87\x3e\x4e\xab\x00\x3e\x86\x70\x19\x36\xda\x8b\xe8\x4e\xed\x39\x2e\x51\x28\x75\x5e\xbb\xa8\xca\x79\xd7\x19\x58\xaa\xb4\x6a\x03\x81\xeb\xcc\x4a\x72\x15\xff\x51\x0a\x94\x33\xbe\x54\x65\xb4\x25\xf2\xbf\x36\xf3\xb8\xf9\xec\x6a\x05\x2e\xba\x01\xaa\xde\x41\x5f\x2a\xc8\x88\x92\x65\x90\x31\x06\x9e\xb7\xb3\x8f\x6d\x5b\xac\x91\xba\x52\x48\x8e\xa9\x82\x1e\x76\xd7\x4a\x2c\xa6\xbf\x56\xa1\x48\x0e\xbe\x35\x06\xf4\xfc\xd9\x57\xad\x78\x57\xbc\xd7\xf8\x52\x19\xa5\xf9\xe1\x68\xfa\x2f\x3a\xfd\xf5\xe3\x9e\xfb\xc7\xb3\xe9\x5f\xff\xef\xe4\xf0\xe3\xd3\xca\x9f\x1f\x9b\x83\x2b\x77\x4b\xce\x65\xab\xe1\xb0\x3b\x6b\xbd\x58\xe5\xf1\x63\xe2\x83\xb9\xce\x65\x0e\x13\xf2\x3d\x4d\x14\x4c\xc8\x8f\x1c\xcf\xc9\x1b\x02\xad\x3d\xba\xc2\x48\x36\x8f\xcd\xa8\x8f\xdb\x5f\xc1\x29\xb5\xbf\xe3\xa6\xdb\xa6\x82\xf6\x03\x92\xb7\x2c\x54\x18\x21\xaf\x60\xa0\xcd\xee\x5a\x08\x31\x83\x6b\x9a\x66\x09\xcc\x22\x91\x1e\x14\xcf\x6f\xf1\x90\x7b\xfe\x75\x0f\xec\xd9\xfb\x60\x71\xe4\xe3\xde\x87\xa9\xfb\xd7\x53\xff\xd3\xfe\x77\x7b\xff\x9e\xb5\x3e\xdf\x7f\x7a\x80\xa1\xbd\x05\xaa\x7d\xfc\x30\x2d\xd1\x6e\xf6\xf1\xe9\xfe\x77\x95\x67\xfb\xbb\x90\x70\x3b\x89\x2a\xa5\xd9\xf4\xa2\xb1\x62\x5c\xa3\x28\xdb\x94\x8d\x95\xd2\x6c\x97\x8a\xb7\x60\xcb\x37\x34\x7b\x0f\x0b\x90\xc0\xa3\x6e\x13\xd2\xf1\xd6\x27\x64\x2f\x36\x47\x38\xe6\xe0\xed\x7b\xe1\x55\x16\x4f\xdd\x41\x56\x7c\xe7\xb9\x7b\x71\xe1\xd1\x66\x4c\x4e\x2d\xd2\x6d\x52\x8a\x92\x3b\x94\xf5\xb2\xd7\xdb\x77\x01\x71\xda\x20\x4e\x4e\xcb\xa8\xbb\x11\x86\x1e\x73\x1c\x59\x83\x57\x9b\x06\xd1\x03\xc9\xfb\xc9\xbe\xbc\x25\xf4\xb7\x73\x90\x62\x9d\xa3\x7b\xf0\xf7\x50\xfc\x64\xed\x2e\xa3\xfb\xc9\x59\xa3\x72\xd9\x57\xba\xf8\xf1\xe4\x85\xc5\x19\x64\x4c\x28\x51\xae\x44\x12\x2b\x92\x73\xf6\x4b\x0e\xe4\xe4\x45\x51\x7d\x88\xf1\x28\xc9\xf1\xde\x9e\x1f\x7f\x3c\x79\xa1\x66\x84\xfc\x03\x22\x6a\xf4\xfa\xab\x96\x10\x4e\x2c\xb5\xf7\xee\xed\xeb\xff\x8d\x16\x00\xfc\xd2\x5d\x9b\xe1\x0a\x8b\x24\x8c\x5a\x8b\x94\x3d\x7c\x4d\xaf\x36\xba\x11\x67\x14\xd1\xac\xd9\xc6\x40\x9c\xdd\x8e\xdb\x20\xdd\x15\x24\x99\xc2\xe4\x23\xa2\x72\xe9\x56\x63\x06\xb4\x59\x10\x98\x86\xee\x1c\xe7\x3e\x9f\x0a\xf3\xd5\x46\xc5\x45\x47\x82\x73\x88\x30\x32\xc1\x08\xa1\x7d\x38\x44\xf5\xfd\x4d\x01\x7f\xa7\x44\xbb\x19\xe0\x5c\x8e\xe9\xf9\x87\x37\x90\xde\x3e\xa1\x1b\x8a\x7c\xe7\x44\x79\x9c\xf1\x08\xaa\x76\xbe\xc5\xd1\xf8\x6d\xe6\xe0\xe0\x76\xe7\x2c\x61\x6b\xbd\xa3\x46\xb4\x46\x4b\x74\x06\xbf\xef\xb0\x5d\xd7\xc3\x32\xb7\x2c\x1b\x1b\xb9\xad\x68\x40\x2d\xfc\xc9\x2b\xaa\xc8\x1c\x80\xa3\x3d\xd7\xda\xed\x80\x3b\x9c\x87\xd2\xda\x9a\x67\x53\x2d\xa6\x0d\xfa\x55\x07\xe4\xba\xa1\xd6\x62\x3e\xa8\xad\xed\x68\xb0\x41\xe0\x6a\xb5\xde\x05\x03\x55\xde\xda\xe3\xa5\xa7\xc1\x5e\xea\x66\xad\xac\x36\x67\x67\x64\x2d\x8e\x6d\xfc\x6b\x7b\x4a\x46\xdd\xae\x19\x9e\xb4\x40\xf7\x62\x8d\x9a\x47\xcc\xd1\x6e\xf3\x19\xc8\x4b\xd6\x43\xf8\x78\x5f\x7f\xbf\x17\x6b\x79\xf5\xfe\xf4\x18\xf3\xf3\xcc\x07\xde\x3f\x81\xd8\x5f\x95\x2a\x6e\xdf\xa3\x13\xd9\x50\xa3\xa3\xbb\x27\xe8\x4c\xc8\xf1\x83\x64\x52\x68\x11\x89\x0e\xa7\x53\x6b\xca\x0c\x82\xb6\x2d\xc7\x68\x48\x1f\x43\xe5\x0d\xcb\xc7\x6a\x59\x69\x4a\x0b\x69\xc8\xb5\xf6\x5b\x3e\x2f\xee\xc4\x2a\x7b\x77\x5a\x1f\xf9\xcf\x7f\x1f\xfd\xbf\x00\x00\x00\xff\xff\x78\xea\x72\xfc\x70\x56\x01\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -105,7 +105,7 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\x23\xb9\x95\x2f\xf8\xbf\x3f\x05\x42\xf6\xac\xa4\x31\x49\x55\xd9\x63\xef\x4c\xdd\xd9\x71\xe8\xaa\xd4\xdd\xda\xee\x52\x29\x24\xb9\xbc\x8e\x9e\xbe\x36\x98\x79\x48\x62\x94\x09\xe4\x00\x48\xaa\xe8\xdb\xf7\xbb\x6f\xe0\x00\xc8\x07\x1f\x12\x99\x80\x44\x56\x75\xc2\x11\xee\x12\x99\x04\x4e\xe2\x71\x70\x9e\xbf\x43\x0b\xf6\x09\xa4\x62\x82\xbf\x23\xb4\x60\xf0\x59\x03\x37\x7f\xa9\xd1\xc3\xbf\xaa\x11\x13\x67\xf3\xb7\xbf\x7a\x60\x3c\x7d\x47\x2e\x4a\xa5\x45\x7e\x0b\x4a\x94\x32\x81\xf7\x30\x61\x9c\x69\x26\xf8\xaf\x72\xd0\x34\xa5\x9a\xbe\xfb\x15\x21\x94\x73\xa1\xa9\xf9\x58\x99\x3f\x09\x49\x04\xd7\x52\x64\x19\xc8\xe1\x14\xf8\xe8\xa1\x1c\xc3\xb8\x64\x59\x0a\x12\x3b\xf7\x43\xcf\xdf\x8c\xde\xfe\xeb\xe8\xcd\xaf\x08\xe1\x34\x87\x77\x24\xc9\x4a\xa5\x41\x2a\x90\x73\x96\x80\x7b\x4c\x8d\x44\x01\x92\x6a\x21\xd5\x28\x11\x12\x84\xf9\x4f\xfe\x2b\x55\x40\x62\x06\x9b\x4a\x51\x16\xef\xc8\xda\x67\x6c\xbf\x9e\x26\xaa\x61\x2a\x24\xf3\x7f\x13\x32\x24\x22\xcb\xf1\xdf\xee\x5d\xed\xf0\x77\x76\x78\x37\x41\xf8\x7d\xc6\x94\xfe\x7e\xf3\x33\x3f\x30\xa5\xf1\xb9\x22\x2b\x25\xcd\x36\xbd\x08\x3e\xa2\x66\x42\xea\xeb\x9a\x2c\x43\x46\xa2\xe6\xcd\x7f\xbb\x07\x19\x9f\x96\x19\x95\x1b\x7a\xfb\x15\x21\x2a\x11\x05\xbc\x23\xd8\x59\x41\x13\x48\x7f\x45\x88\x1f\xcb\x76\x3e\x24\x34\x4d\x71\xbd\x68\x76\x23\x19\xd7\x20\x2f\x44\x56\xe6\xbc\x1a\xdc\x3c\x93\x82\x4a\x24\x2b\x34\xae\xc9\xfd\x0c\x70\xd6\x88\x98\x10\x3d\x03\x72\x71\xf7\xa9\x7a\x94\x90\xff\x52\x82\xdf\x50\x3d\x7b\x47\x46\x66\x01\x46\x29\x53\x45\x46\x17\x86\x84\xc6\x53\x76\x35\xdf\xdb\xef\x1a\x9f\xeb\x85\xa1\x57\x69\xc9\xf8\xf4\xa9\xf1\xdd\x4b\x6c\x47\xc2\xbc\xb1\x4e\xcd\xe1\x3f\xad\x7c\xbe\xed\xf0\xfe\xf5\xa9\x19\x99\xe8\x19\xd5\x44\xcf\x98\x22\x82\x03\x91\x50\x64\x34\x01\xf5\x04\x41\x6b\x1e\xb1\x14\xdd\xae\x7e\xb1\x81\xa4\x66\x97\x9a\xea\x52\x8d\x8a\x19\x55\xab\x53\x7c\xb3\xf4\xe9\x9a\xee\xec\x83\xf3\xb7\x34\x2b\x66\xf4\xad\xfb\x50\x25\x33\xc8\x69\xbd\x07\x44\x01\xfc\xfc\xe6\xea\xd3\xef\xef\x96\xbe\x20\xed\xd9\x59\xbb\xfb\x09\x53\x66\xaa\x90\x51\x10\xcf\x29\x70\xed\x16\x05\x90\xbf\xaf\xfd\xcd\x5d\x01\xc9\xdf\x47\x2b\x94\x8b\xf1\x7f\x41\xa2\x1b\x1f\x4b\xf8\xef\x92\x49\x48\x9b\x14\x99\x09\xf2\xdc\x67\xe9\x63\x33\xff\x8d\x8f\x0a\x69\xd8\x82\x6e\x1c\x79\xdb\x1a\xec\xaf\xf5\xf9\xd2\xdb\xfe\x3c\x5c\xfa\x96\x10\x33\x49\xee\xad\x53\xc3\x0b\x41\xe1\x0e\x75\x7b\x10\x52\x37\xb3\x76\xe7\x32\x65\xb6\x8b\x04\x05\xdc\x72\x47\xdc\x54\xdc\xbd\xe5\x68\xa5\x73\x33\x45\x20\x95\x61\x11\x65\x96\x1a\x26\x3a\x07\xa9\x89\x84\x44\x4c\x39\xfb\x47\xd5\xbb\x22\x5a\xe0\xb0\x19\xd5\xa0\x34\xc1\x73\xcd\x69\x46\xe6\x34\x2b\x61\x40\x28\x4f\x57\xfa\xce\xe9\x82\x48\x30\xe3\x92\x92\x37\x7a\xc4\x9f\xa8\x55\x5a\x3e\x08\x09\x84\xf1\x89\x78\x47\x66\x5a\x17\xea\xdd\xd9\xd9\x94\x69\x7f\x3d\x24\x22\xcf\x4b\xce\xf4\xe2\x0c\x39\x3d\x1b\x97\x86\xf5\x9e\xa5\x30\x87\xec\x4c\xb1\xe9\x90\xca\x64\xc6\x34\x24\xba\x94\x70\x46\x0b\x36\xc4\x97\xe1\x78\x45\x8c\xf2\xf4\xd7\xd2\x6d\x13\xb5\x34\xf0\xda\xf3\x40\x3c\x87\xde\x71\xb1\x0c\xc7\xb6\x9b\xd3\x76\x68\x5f\xb6\x5e\x13\xf3\x91\x99\xc6\xdb\xcb\xbb\x7b\xe2\x29\x72\x47\x1d\x97\xa8\x7e\x74\xcd\x0c\xf9\xd5\x32\x33\xcb\xf8\x04\xa4\xfd\xe5\x44\x8a\x1c\x7b\x05\x9e\x16\x82\x71\x8d\x7f\x24\x19\x03\xae\x89\x2a\xc7\x39\xd3\x0a\xb7\x35\x28\x6d\x16\x72\xb5\xe3\x0b\xbc\x4e\xc9\x18\x48\x59\xa4\x54\x43\xba\xfa\xc8\x15\x27\x17\x34\x87\xec\x82\x2a\x78\xf5\xb5\x33\x6b\xa4\x86\x66\x41\xb6\x5e\xbd\xa6\xb0\xb0\xfa\x83\x95\x53\x4f\x88\xbf\xdd\x77\x59\xee\x8d\x8c\x86\xa4\x90\x64\x54\x5a\x01\x85\x68\xc8\x32\xf2\xf1\x87\x0f\x64\x26\x1e\xcd\x41\x62\x5c\x69\x9a\x65\x78\x30\x9d\x10\xb1\xd2\x35\xde\x01\x09\xe5\x24\xa7\x9c\x4e\x81\xd0\xa2\x50\x64\x22\x24\xa1\x64\xca\xe6\xc0\x3d\x03\x58\x5e\x8b\x8d\xef\xb7\x89\xb3\x11\x7b\x23\xad\xbd\x55\xfd\xb7\x8e\xe0\xa5\x6f\x36\xf1\x3a\xd3\x56\xe4\xb3\xdd\x26\xd6\xb4\xf3\xba\x0b\x3c\x52\x9c\x94\x5c\x69\x59\xe2\x2e\x49\xc9\x03\x2c\xdc\xe9\xca\x69\x41\x94\x16\xe6\xc3\x47\xa6\x67\x84\x36\x4f\x16\xd5\x78\x5c\xc6\xab\xaf\x65\x9a\x02\x4d\xc6\x0b\x62\xa4\x51\x64\x67\x5a\x88\x0c\x79\x1d\xf6\x67\xd8\x1a\x91\xa0\x25\x83\x39\x10\x2a\xc7\x4c\x4b\x2a\x17\xd5\xde\x5a\x3d\x07\x4f\xce\x3f\xce\x4b\x43\x38\xda\x3c\x7b\xe4\xa9\x9d\x4d\xec\x75\xe2\x64\xb3\xb4\x92\x8f\xbb\x4f\xf4\xcd\x95\xdb\xc1\xb5\xb0\xad\xdc\x0e\x06\x45\xcc\x4e\x75\x62\x51\x25\xb5\x23\x01\x6e\x6b\xa6\x44\xc8\x6a\x6f\x91\xf1\x62\xed\x18\x8d\xad\x4e\xc6\x60\xd8\xa0\xa4\xdc\x4c\xfd\xda\x23\xd4\x61\x62\x9f\xda\x8c\xa6\x89\x47\xbe\x6e\xe7\x37\xfb\xa6\x52\xd2\xf5\xd4\x13\xc2\x34\xe4\x1b\x7a\x26\xcb\xd3\xdc\x9c\xcf\xea\x63\x43\xe0\x9c\xa5\x60\x26\x56\x53\x66\x77\x99\xe1\x09\x74\x2c\x4a\x6d\xe7\xd3\x3d\x92\x92\x39\xa3\x84\x4e\xa7\x12\xa6\xb8\xff\x37\x0e\xfb\xcc\x9c\xd8\xb6\xf9\xd8\xd7\x6d\x68\x95\x9a\x27\x9f\x30\xec\xf7\xc9\x07\xf8\x3a\xe6\xd1\x7c\x60\x55\x6e\x6e\xb7\xe7\xd6\xd0\x36\x9a\x98\x39\xf1\x53\x2b\xe4\x93\x0f\x6f\xb3\xb6\xb6\x3d\xb3\xc2\xb6\xb5\xd7\x79\x89\x10\xf7\xed\xd8\x9c\x99\xfa\x02\x30\x9c\x03\x1f\xac\x59\xfa\x18\x48\x01\x72\x22\x64\x6e\x0e\x0f\x27\x94\x24\x56\x94\xad\xf8\x16\x32\x5c\x9e\x3c\x35\x9d\x64\xdb\xf5\xb7\x6d\x9b\x5d\x60\xdb\x90\x14\x54\xcf\x9e\x79\x6c\xbb\xa5\xb2\xad\x39\x69\xcf\x3e\xfc\x0c\xe3\x5b\xe9\xbb\xbe\xb7\xa2\xf7\x6d\xa6\x21\x7a\xa7\x78\x65\x6d\xd3\xeb\x36\x9c\x7b\xb9\xdd\xd2\xc7\x0f\xa0\x94\x91\x17\x50\x08\x95\xf4\x91\x00\x4f\x84\xe1\x29\xff\xef\xdd\xc7\x6b\x3b\xfa\x3a\xee\xba\xda\xae\x34\x61\x79\x91\x41\x6e\x64\x51\xf2\xe3\x07\x2a\xd5\x8c\x66\x20\x7f\xc2\x5b\xf1\xc7\x3f\xf3\xbc\xfd\x49\x42\x37\x1f\xec\x66\x33\x42\xa6\x82\xd4\xb0\xbf\x14\x32\xba\xb0\x84\xa5\x90\x88\xd4\x5c\x0b\x42\x92\xc2\x28\x0b\x79\x51\x6a\x20\xd4\x7e\x8b\xef\xc0\xf8\x74\x1b\xca\x77\x5a\x0d\x62\x44\xaa\x9c\xea\x77\x64\xbc\xd0\xcf\x9d\x36\x42\x3e\x0f\xd3\x6d\xd9\x4e\x93\x98\xe7\x99\x8f\x6d\x5b\xb1\xa0\x66\xc7\xcf\xbe\xa5\x91\xb7\x29\xe3\x20\x6f\x84\xd4\xdb\xf0\x49\xa3\xd8\x4d\x61\x55\x1c\x6d\x36\x3f\x65\x8c\xeb\xdf\xff\xee\x89\x27\x53\x28\x32\xb1\x30\xfb\xe7\xf9\xe3\xb9\xe5\xfb\x6c\xcd\x4a\xb6\xed\x6f\x5b\xf6\xb1\x65\x7f\xd6\x34\x18\xa3\xa7\x75\xda\x67\xa7\x8e\x78\xac\x77\xab\x14\xe8\xbd\xdd\xb7\x37\x57\xde\xd6\x73\x0b\x13\x90\xc0\x13\xcf\xe7\xaa\x3f\xb5\x20\x94\x7c\x5f\x8e\x41\x72\xd0\xa0\x1a\x9a\xc0\xa2\x00\x6f\x58\x03\xfb\x03\x09\x92\x94\x9a\x65\xec\x1f\xeb\xcc\x11\xeb\xde\x2a\xfa\x4d\xfb\x8c\x4c\xe5\x1f\x7b\x46\xb2\xf2\x8f\x3d\x27\x5f\xd9\xb6\xcb\xd5\xfd\xfc\x2e\xb4\xad\xb5\x4e\x68\x04\x71\x1a\x43\xb5\x32\x69\x7b\x29\xa2\x73\xf2\xe7\xb7\xf9\x1a\x4a\x6f\xd0\x78\xde\x32\x3e\x6f\x22\x98\x9c\x6c\xf2\x4b\x8c\x8c\xc2\x3f\x42\x93\xf8\x8f\x3f\x8d\x6c\x97\xa7\x23\x72\x99\x17\x7a\xe1\xcd\x40\xec\x99\xce\x99\x22\x5c\xe8\x55\x41\x30\xfa\x34\xcd\xd7\x1b\x21\x9f\x9d\xa9\xf3\x9b\x2b\x6f\xde\x7e\xc5\xa5\x55\x05\x24\x07\x20\xe8\xdf\xb5\xc8\x68\x89\xf9\x13\x06\x59\x4a\x98\x91\xe1\x0d\xb1\x64\x9c\x89\xe4\xc1\x59\xf2\x6f\xdf\x13\x25\x2c\xcf\x31\x8a\x9e\x91\xfc\x13\xc1\x55\x99\x03\x61\xcf\x31\x91\x5e\xb2\xef\x25\xfb\x66\xeb\x25\xfb\x5e\xb2\x6f\x35\xeb\xa4\x3b\x04\xe6\xb8\x44\xc8\x46\xf6\x88\xcf\xf5\x0c\xf2\xa9\xd6\x33\x48\x6c\x3d\x83\xec\x19\xe4\x73\x1d\x3f\xfb\x96\x5b\x49\xba\xcf\xf6\xf5\x1c\xef\xe8\x3d\x07\xbd\xe7\xa0\xf7\x1c\xb8\xd6\x5f\x9f\xae\xf5\xd7\x67\x7f\x7d\xb6\xdb\x17\x77\x7d\xf6\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\x41\xb3\xf5\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\xc1\x86\xd6\x4b\xf6\x1d\x3b\xed\x25\xfb\x5e\xb2\xdf\xd4\x7a\xcf\x41\xef\x39\xe8\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\xe7\x20\xc9\x80\xf2\xf5\xea\xfc\x52\x72\x23\x3e\x87\x02\x20\x9b\x30\x97\xda\xe7\x7e\x4d\xc6\x30\xa3\x73\x26\x4a\x49\x1e\x67\xc0\x7d\x5e\x2a\x99\x82\x56\x66\x17\x80\x86\x75\x1a\xe0\x33\xec\xed\x69\x96\x36\x24\xc0\xe9\x38\x5b\xdb\xf1\x73\xdc\xcb\xfd\xf2\x69\x4f\xc9\x58\x08\xf3\x76\xab\x33\x86\xda\x8b\xd7\x06\x22\x24\xb5\x6c\xd2\xb9\xd6\x27\xb6\x5c\xdc\xbe\x7f\xd1\x74\x96\xb5\x9d\x5c\x55\x63\x13\x74\xe1\x60\xda\x9f\xb9\xf2\xcc\xa7\x1f\x1f\x39\xa4\x98\x05\x3e\x20\x4c\x9b\x07\x0c\x63\x61\x09\xd3\xd9\xa2\x22\xef\xcb\xce\x93\xb9\xb8\x7d\xbf\xbd\x9b\xcb\xaf\xd2\xc6\xae\x23\x7a\xb4\x7a\x7f\x55\xef\xaf\xaa\x5a\x2f\xb4\x75\xec\xb4\x17\xda\x7a\xa1\x6d\x53\x8b\x2f\xb4\x1d\xba\x7f\xa7\xf7\xca\x90\xde\x2b\xe3\x1f\xeb\xbd\x32\xcf\x3e\xde\x7b\x65\x7a\xaf\x4c\xef\x95\x79\xba\xf5\xf2\xab\x6b\xbd\xfc\xda\xcb\xaf\xed\xf6\xc5\xc9\xaf\xbd\x57\xa6\x67\x90\x3d\x83\xac\x5b\xcf\x20\x7b\x06\xd9\x6a\x5f\x62\x3e\x47\x6f\xe1\xee\x2d\xdc\xbd\x85\xbb\xbf\x00\xfb\x0b\xb0\xbf\x00\x9f\xeb\xb8\xb7\x70\xfb\xd6\x5b\xb8\x7b\x0b\x77\xab\xf5\x16\xee\xde\xc2\xdd\x5b\xb8\x7b\x0b\xf7\x86\xd6\xcb\xaf\x1d\x3b\xed\xe5\xd7\x5e\x7e\xdd\xd4\x7a\x0b\x77\x6f\xe1\xee\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\x85\xfb\x99\xc3\xbb\xcd\x2e\x6d\xda\xab\x9d\xd8\xec\x23\xdd\x47\xe4\x82\x72\xc2\x78\x92\x95\x29\xe0\x37\x13\xa0\xba\x94\xa0\x06\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x98\x50\x05\xca\xf5\xb1\x76\xa8\xaa\xdf\x35\xdf\x3e\xfd\x9a\x4f\xf3\x91\x27\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x99\x0c\x96\x6c\x31\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7d\xed\x4d\x5b\xf0\x89\x2d\xf7\xec\xe5\xf2\xdc\x95\x32\x24\x63\xaa\xe0\x8f\xff\xb2\x52\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\xb5\x4f\x3c\x7f\xcd\xd4\x43\x6c\xde\xe4\x5b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\x95\xed\xe3\x4e\x4b\xaa\x61\xba\x68\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x43\x09\x33\xaf\x81\xae\x1d\xe2\x71\x06\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x97\xff\xe3\xc7\x59\xf3\xf5\x73\xeb\xbb\xae\x82\x92\x6f\xdb\x5e\x90\x7e\x3e\xdf\x5b\x0f\xd9\xfb\x0a\x08\x66\x79\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xec\x7f\x69\xd9\x36\xdd\x51\x5b\xc8\x6a\xcf\xcb\x68\xc3\x06\x8e\xcd\x26\xaf\xde\x36\xa2\x99\x2b\xc6\x78\x03\x32\x67\x4a\x6d\x4a\x8a\x6a\x93\xfe\xdc\x2d\xb6\xc5\xed\xb5\x24\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x4c\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xed\xf6\xde\xe2\xee\xdb\x42\x82\xde\x56\x7e\x1e\x5a\x3a\x9f\x7d\xca\xbd\xc3\xb9\x7d\x85\xb5\x45\xb2\x9a\x6d\x7b\x79\x1b\x87\x7f\x5e\x88\xd8\x45\x32\xd9\x5a\x2e\xe9\x22\xb3\xde\x88\x8c\x25\x8b\xdb\x32\x03\x32\x13\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x01\x19\x97\x9a\xa4\x02\xac\xd9\xd0\xa1\x4b\x35\x7f\xbe\xd5\xf8\xd6\x53\xfe\x38\xb3\xc5\x08\x4d\xc7\x84\x16\x45\x86\x99\x93\xc2\x08\x1e\x8f\x33\x96\xcc\x6c\x0d\xd6\x82\x26\xb0\xee\xb1\xed\xe5\xd2\xad\x74\x35\xb2\x93\xbe\x46\xbc\xd9\x7b\xfc\xdc\xae\x23\x3b\x2a\x6e\xc4\x96\x05\xfb\x56\x8a\xb2\xd8\xf2\xf1\x6e\x7b\x80\xd8\x92\x61\x76\x20\x73\x1d\xe9\x25\x11\xcb\x7f\xe9\x9c\xe4\x76\xa9\x95\xb3\xc0\x3a\x8f\xcc\x08\xd3\x1f\xf3\x32\xd3\xac\xc8\xf0\x27\x16\x01\x4b\x11\x2a\xa1\xbe\xe0\x06\x84\xf2\x85\xf7\xb9\xbb\x12\x86\x90\x12\x3a\x35\x3d\x6a\x2c\x8f\x2a\x26\x5b\x53\x6d\x6b\x24\x96\xb9\x91\xbf\x1a\x36\x60\x85\xea\x3e\x5f\xd4\x54\x90\x47\x96\x65\x46\xf9\xa1\x59\x26\x1e\x21\x1d\x91\xa3\xa3\xe5\x0b\x28\x11\xb2\x41\x37\xb2\xba\xa3\x7f\x6e\x3d\x65\xf8\x5a\xfd\x62\xdb\x29\x72\xbb\x6a\x21\x64\x37\x4d\x84\xec\xae\x73\x11\x54\xa5\x1e\x2a\x07\xd5\x30\x63\x4a\x0f\x1d\x95\x5a\xe4\x2c\xd9\xaa\x13\x2e\xb8\x77\x44\xfc\xf9\xf6\x87\x17\xdf\xa0\xd7\xed\xe1\x5c\x4d\x4e\xd0\x66\x8f\x16\x54\x6a\x46\x33\x52\xca\x4c\xd9\x3d\x4a\x8d\xc2\x22\x7d\x15\xd4\x19\xc5\x38\x8f\x04\x14\xb2\x0b\x42\xfe\xd9\xee\x4a\xb7\x19\x2c\x2b\x13\x3c\x5b\x10\x6a\xb7\xc2\xa4\xcc\xb2\x01\x99\x30\x4e\xcd\x45\x06\x85\xcf\xe1\xdd\xc2\x34\x53\xb7\x3b\xc6\x13\x30\xd3\x34\xac\x7c\x13\x48\xb9\x19\xd9\xb0\xcc\x8a\xa7\xa5\x03\x57\xf6\xd3\x5a\xaa\x94\x23\xc5\xf0\xb7\x84\x8e\x33\x40\x4d\xc3\xc9\x9c\xb7\x22\x43\x97\x62\xe5\xf7\xc0\x5a\xa1\xb4\xf9\xf5\xff\x64\x7c\x5b\x6d\xdd\xb6\x5b\xbc\xda\x13\xca\x09\x30\x3d\x03\x89\x43\x2f\x0c\xff\x35\x9b\xbd\x3e\x54\x27\xaa\x4c\x66\x66\x8a\x8e\x0a\x91\xaa\x23\xc3\x9d\x8f\x14\x24\x12\xb4\x3a\x3a\x35\x7f\x2d\xbf\x2b\xce\x57\xf3\x77\x67\xb4\x60\x47\xa7\x03\x82\x13\x8e\x05\x4a\x85\x9e\xfd\xc2\xcf\x91\x9f\xb0\x56\x3d\xef\xe7\x5a\xeb\x14\xdd\x36\x7b\x70\x95\x35\x45\x61\x8b\x52\x9a\xfb\x53\x03\xa6\x9d\x9b\x93\x82\x7b\xae\xe1\x83\x5e\xba\x48\x09\x39\xe7\x04\xac\xd7\x10\x34\xc9\x81\x72\xf7\x34\xcc\x41\x2e\xf4\x0c\x1d\x89\xaa\xe2\xa2\xfd\xca\x6d\x11\x8d\x50\xb7\xb5\xab\xe6\x58\x99\x5f\xa1\xfa\xb8\xd9\xe2\xcf\xcb\x2b\x74\xfc\xcf\xc7\xcb\x57\x52\x7d\x07\xff\xb2\xd7\x03\x85\xb0\x4e\x6b\xf1\xc9\xfc\xb2\xbd\x0e\xf6\x23\x7b\x99\x54\xec\xf0\x87\x1f\x6c\xb1\x67\x37\xe1\xdf\x33\x9e\xaa\x0a\x58\x35\xb5\xb7\x84\x5b\xb4\xb5\x2b\x85\x14\xfe\x62\x57\x69\x55\xe9\xda\x56\x51\x7a\x86\xc6\x86\x56\x7e\x08\x8a\x34\xd6\x8b\x6e\x49\xc9\x86\xed\x0e\xac\x77\xde\x88\x95\x19\x1d\x43\xa6\x9c\x01\x11\x1a\xe4\x93\xf3\x1f\x3e\x54\xa5\xdb\x25\xd0\x67\x8c\xe2\x2f\xa0\x3e\x6f\x11\xe6\xb3\x52\x22\x7f\xb5\x6d\xaf\xe6\xe0\x54\xec\xe6\xc4\x22\x77\xa0\xed\x59\xcd\x69\x61\x8e\xaa\xed\xc3\x3a\x57\x96\x1c\x27\x3f\xe0\x4c\x3f\x7f\xe2\x76\x52\x0f\xb7\x2f\xf9\xbc\x6e\x90\xad\xce\xdb\x76\xa1\x44\x3b\x74\xf8\x94\x29\xaf\x6e\xad\x69\x5e\xda\xd0\x4e\x2f\x74\x9a\x5c\x42\x9b\x0e\x85\x14\x94\x05\xd7\xb1\x00\x47\xd2\x7f\x5e\x77\x11\x79\x09\x76\xd1\xcf\x87\x44\x41\x06\xc9\xba\x9a\xec\xeb\x1e\xd6\x90\x17\xd9\x73\x27\x8f\xec\xac\xcb\xe7\x8c\xdf\x02\x4d\x17\x77\x90\x08\x9e\x6e\xc9\xa5\xbb\x29\x4b\x1f\x18\x67\x79\x99\x13\x5e\xe6\x63\xc0\xb5\x50\x76\x50\xe4\x38\xd6\xa0\x42\x09\x87\xc7\x6c\xe1\xb8\x4c\x4a\x0a\x91\x7a\xc6\x33\x36\x5a\x3d\x4d\xb7\xbd\x74\x1e\x99\x9e\x61\xd9\x0a\xbe\x30\x43\x31\x5d\xdf\x88\x92\x24\x92\x2a\x23\x34\x0e\x70\x68\xa6\xcd\x2d\x3a\x06\x74\xb1\xb3\x14\xcc\x96\xa1\x73\xca\x32\xa3\xe5\x6c\x7b\x2d\xbe\x87\x09\x2d\x33\x8d\xf6\xa1\x37\xe4\xc4\x10\xee\x95\xfb\x75\xdd\x1a\xbd\x43\x09\xc1\xcd\x7f\x2d\xec\x12\xbe\xdc\xe9\x0e\x7e\xbe\x6d\x80\xd0\x7d\xdb\x16\x10\xdd\xb7\x82\x96\x6a\x5b\x33\x53\x6b\x37\x5c\xf1\xd4\x1c\xc2\xa6\x34\xdf\xb8\x47\x98\x72\x3d\x6f\x37\xab\x4f\x43\x79\xad\xa1\x5a\x8a\xa9\x04\xa5\xde\x03\x4d\x33\xc6\xe1\x15\x36\xf5\xfd\x0c\x48\x4e\x3f\xe3\xc6\xd6\x2c\x07\x23\x6c\x35\xb7\x35\x6d\xbe\xbe\x16\x24\xa7\x0f\x50\xd1\x49\xc6\x30\x11\x72\x8b\x90\x0e\xdf\x98\x6a\x6e\x26\xbb\x69\x27\x94\x65\x90\x8e\x90\x92\xc6\x58\x66\xb3\x4b\x91\x65\x20\xed\x3e\x34\x7f\x33\x5e\x02\xd1\x62\xcb\xc1\x0a\x29\xd0\x34\x61\x07\x68\x4a\x33\x28\x2d\x50\xd3\xa5\xbd\x71\xf0\xb0\x11\x4a\x6e\x96\xe6\xff\xf2\x73\x82\x46\xf8\x2d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x84\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x91\x6b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x5b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xfd\xde\x6d\x9d\xf5\x3f\xbe\x79\xb3\xa5\xe8\xfc\xf2\xa7\x56\x02\xda\x66\x5e\x74\xc3\x5f\x57\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xb4\x64\x6a\x46\xc6\xa0\x1f\x01\x38\x81\xcf\x16\x5e\x6e\xcb\xf1\xfe\x01\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xf6\x70\x16\x60\xce\x14\x13\xfc\x3b\xa6\xb4\x90\x8b\x1f\x58\xce\x9e\xa9\x69\xe1\x5b\x77\xee\x53\x5f\xa7\x22\x4b\xc9\xad\xdd\x02\x77\x60\x67\x46\x02\xba\x3f\xb4\xb0\xb6\x11\x62\x38\xc2\x98\x26\x0f\xdb\xde\x6a\x3b\xaf\xea\xa6\xf5\xea\x70\x8b\xbe\x7d\x73\x28\xcb\xea\x05\xb5\x97\x5c\x4a\x54\x09\xaa\x91\xf0\xee\xb0\x07\xeb\xf2\xb3\x9d\xee\xd6\xd2\x3e\xce\x84\x02\x7c\x80\x50\xf9\xbc\x4c\xd8\x7c\x0d\xef\x13\x65\xaa\xe2\xb4\x18\xaf\xc2\x41\x11\x3a\x99\xb4\x9f\x48\x77\x90\x94\x6d\xbb\xd2\x24\x2f\x95\x26\x39\xd5\xc9\xcc\x5a\xa7\x45\x5a\x49\xaf\xc7\xca\x69\x99\xbb\x2c\xed\xd6\xee\xb1\xdd\x1d\x59\xc4\xd2\x79\xf9\xb9\x30\x97\xc7\x73\x2e\xef\x76\x6b\xad\xf3\x72\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\x3f\xbf\x7e\xbf\xfd\xa9\xe9\x62\x94\xd9\xd9\x2c\xd3\xdd\x47\x62\xda\xf9\x13\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x35\x20\x94\x3c\xc0\x62\x60\x25\x8f\x06\x28\xaa\x79\x78\x27\x42\x24\x64\x4e\x3c\x05\xd3\x23\x76\x68\xc7\xd8\x7e\xb6\x3b\x6c\x4c\x3f\xf8\x2e\xfe\x5b\xdf\x86\x86\xd0\x1d\x7f\xe1\x27\x68\x87\x9f\xed\x7e\x76\x6c\x7b\x80\xc5\x6e\x3f\x58\xda\x49\x66\x15\x9c\x16\x6f\xf7\x88\xf9\xa0\xd2\x1e\xaa\x6d\xb1\x9b\x63\xbd\xd9\x3a\x18\x14\x6d\xf3\x93\x18\xf4\x7a\x3b\x1e\x94\xe6\xb8\x2d\x3b\xad\x99\x96\x63\x65\xf7\xaf\xe1\x30\x33\x56\xd8\x9c\x3e\xe7\x6d\xdc\x7d\x13\xdb\xf6\x89\x66\x2c\xad\x86\xb4\xdc\xe7\x8a\x0f\x8c\x6c\x6d\xfe\x83\xd7\x8f\x95\xf8\xdf\x0b\x50\xd7\x42\xe3\x27\xaf\xb6\x06\xf6\xb5\x5e\x7b\x05\xec\xa8\xce\x69\x85\x6c\x15\xed\x15\x36\x65\xcd\xcd\xb4\xc7\x55\xae\x23\x3d\x15\xb9\xe2\x44\x48\x37\x75\x3b\x0f\x6a\x3a\x73\x03\xdb\x21\xf1\x22\x1d\x5b\x67\x2d\xba\xbf\xd6\x8e\xe9\x56\x48\xc8\xd6\x02\x45\x1c\xde\x0d\x8d\xb2\xa0\xfd\x06\xcd\x15\x45\x86\xda\x99\x53\x9a\xa8\x0f\xad\xda\xd2\x2b\xd2\x6c\x39\xc8\x29\x7a\xb1\x93\xad\xbd\xae\x15\xd1\x1d\x2e\x3e\xdb\x76\xbe\xfe\x9a\x03\x76\xd8\xc8\x51\x7c\x49\xd1\xba\x41\x79\xc5\x9a\xa1\x3b\x4a\x3c\x3b\x9d\xaa\xc6\x70\x2d\x1b\xf9\xff\x36\x97\x3a\x6e\xba\xff\x43\x0a\xca\xa4\x1a\x91\x73\xa2\x18\x9f\x66\xd0\xfa\xce\x99\x00\x1a\xdd\xec\x34\x78\x61\x06\x35\x77\xef\x9c\x66\xce\x10\x43\x39\x01\x6b\x8e\x37\x74\x2c\x8b\x6f\x03\x27\x61\x9b\xab\xa8\x8a\x7f\x38\x7a\x80\xc5\xd1\x60\x63\x98\xf9\xfa\xd6\x3c\xa9\x47\x57\xfc\xc8\x8a\x30\x2b\x67\xad\x92\x77\x30\xc8\xe2\x08\xbf\x3b\x8a\x29\x1b\xee\x28\xab\x74\x75\x26\xb4\x07\xdd\xe1\x98\xb4\x76\x75\x4e\x8b\x5d\x37\xb5\x0f\xec\xec\xa0\xa3\xdd\x2f\x1b\x97\x5c\x04\xb4\x16\xa4\x54\x60\xd5\x68\x64\x76\x04\xbc\x2e\x86\x9a\x17\x5a\xbd\x38\x3c\xa2\xee\x74\x30\x0a\x8d\x51\xf1\x19\x9f\xfe\xb9\x48\xa9\xde\x2a\xa7\xc8\xb6\xee\x67\xfb\xd6\x0e\x48\x4a\x1c\xd1\xec\xe4\x09\x9b\x92\x82\x4a\x9a\xab\x11\xb9\x71\xe5\x06\x70\x5f\xb3\x49\xd3\x7d\xe3\xe6\xf9\x7e\x51\x00\xf9\x7f\x76\x1f\xd0\xbe\xe1\x0b\x9f\x83\x6e\x42\x71\x4e\x3f\xdf\x95\x72\xba\xc3\xf4\x93\x60\xa1\xa5\x69\x89\xae\x6d\x42\xb8\x51\x9b\x20\x42\x2a\x99\x41\x5a\x66\x90\x12\x3a\x16\x73\x68\xf9\xc9\xaa\x9f\xed\x38\x34\x1a\x2a\x76\xfc\xcd\x27\xc3\xe1\x3c\x51\x46\xc8\x1a\x2b\x91\x95\xba\xb2\x67\x9d\xc0\xe7\x77\xe4\x0f\x18\xbf\x45\x49\x01\x32\x01\xae\xe9\x14\x96\x0d\x8f\xf6\xb9\xb7\x6f\xfe\xe9\x74\x57\x02\x50\x9c\x31\xe3\x3b\x33\xf0\x1b\xb3\x3b\x3f\xd0\xcf\x7f\xe6\xb5\x93\x86\x29\xb2\xa5\x11\xaa\x6e\xe7\x4b\x2f\x82\xa3\x64\x49\x99\xa1\x89\x19\xe3\xe2\x1a\xaf\x33\x5e\x10\x29\x4a\x8c\x8c\x23\x65\xb1\xeb\x58\x4d\x73\xd9\xef\xfe\xf0\x4f\xbb\xfe\xfc\xf2\x33\xcd\x8b\x0c\xde\xf9\xba\x2f\xd6\xd6\x67\xf4\x09\x2d\xc8\xef\xdf\xfc\xd3\xc0\x46\x09\xc0\x63\xc3\xf6\x54\xef\x23\x6a\x36\x51\x59\x10\x96\xdb\x3c\x19\xc8\x16\xd8\xd1\xae\x12\x9c\xb9\xe2\xda\x2c\x44\x69\x2a\xb5\x1a\x10\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x96\xcc\x9d\x68\x68\x84\x47\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x91\x8a\xb7\xbf\x7f\xf3\x4f\xab\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x31\x00\x27\x0f\x2c\xcb\x20\xdd\x55\xc4\x7e\x6e\x22\x27\xa5\xd4\x33\x90\x03\x02\x5c\x79\x4f\x84\x79\xf7\xa5\xf7\x46\x5a\x64\xc9\xf9\xee\x12\x28\xb5\xfe\x50\x74\x6e\x34\x9c\x1d\x6e\xda\x8d\x60\xa6\x49\x2e\x94\x5e\x3f\x1d\x3b\x0d\x46\xf9\xe2\xe3\x64\x57\xf1\x7a\xd8\xc1\x98\xbb\xfa\xeb\x0e\xc2\x79\x4b\xfa\x60\x5c\x0f\x85\x1c\xda\x6e\xde\x11\x2d\xcb\x5d\x04\xbe\xbc\xc5\x42\x0e\xf0\x06\x28\x1b\x0c\x6e\x65\x13\x7c\x71\x6c\xbc\x3b\xbb\x4d\xc5\x23\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x15\x16\xde\xf6\x0c\x2d\x71\x1e\x33\x0f\xe6\xe9\xff\x7b\xf5\xc8\xef\xaa\x52\x2f\xdd\x04\x9b\x79\xbb\x63\xad\x15\xeb\x36\x6a\x0d\x06\x40\x0c\x96\x68\xdd\x91\x82\x35\x6f\x56\x71\xd5\x89\xb0\xe1\xc1\x66\x13\x98\x07\x2c\x51\x6b\xae\xb8\x9a\x01\xef\x7c\x95\x6d\xb8\xaa\xec\x3b\xd6\xb1\x1f\x1a\xc3\x2e\x0d\x1b\x56\x9b\xf8\xf0\x8e\x43\x67\x40\x95\x5e\xb7\x84\x3d\xd7\x7e\xb6\x3d\x9d\xe1\xbb\xdc\xda\xaa\xa3\xd1\x5d\x70\xc6\x2b\x3f\x19\x26\xaf\x8f\x81\x1c\xdd\x82\x8d\x62\xb2\x19\x09\x2d\xa5\xe5\xa8\xf2\x5f\x9b\xc5\x0e\xd2\x67\xb6\x9e\x36\xef\x82\x7b\x51\x7f\xb4\x1b\xa3\x91\x9d\xe7\x3c\x80\xee\x0a\xaa\x42\xa2\x6c\x7c\xd7\xf6\x6e\x68\x70\xd9\x27\xee\x08\xfb\x97\x19\xa9\x02\x92\x91\x04\xe4\x2a\x36\x69\xd0\xda\x55\xd0\xdc\x72\x9e\x3d\xd2\x85\x3a\x3a\x18\xd5\x3c\x07\x4d\x9f\x4e\x4a\x5f\x6e\xdd\x05\x82\x3b\x4d\x79\x4a\x65\xea\xde\xe8\x58\x55\xa3\xef\xc2\x11\x3e\x60\x78\x12\x9f\x88\x77\x64\xa6\x75\xa1\xde\x9d\x9d\x4d\x99\x1e\x3d\xfc\xab\x1a\x31\x71\x96\x88\x3c\x2f\x39\xd3\x8b\x33\x8c\x36\x62\xe3\x52\x0b\xa9\xce\x52\x98\x43\x76\xa6\xd8\x74\x48\x65\x32\x63\x1a\x12\x5d\x4a\x38\xa3\x05\x1b\x26\x82\xcf\x81\xa3\xff\x62\x94\xa7\xbf\xf6\x24\xbd\xac\x0e\xdf\x62\x13\xe8\x50\x91\x73\x18\x96\xfc\x81\x8b\x47\x3e\x44\xf3\x9e\xda\x89\x61\x6c\x17\xb5\xea\x5b\xc0\x1a\xee\x12\xd4\x5a\x88\x1d\x6c\x82\x2f\xbe\xb2\x66\x8a\x86\x94\xa7\x43\x1b\xaa\xf5\xb2\x0b\xdc\xc5\xad\x3a\xac\xc3\x41\xb7\xa7\xae\x9b\x35\x88\x26\x9a\xcd\xa1\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x02\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\xce\x77\x08\x1d\xf4\xed\xce\xb0\xe5\x7b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x94\x86\xdc\x5e\x05\x76\xb4\x6c\x41\xb4\x5c\xd8\xf0\x48\xf9\x40\x98\xf6\x31\x87\x46\xbd\x7f\xc0\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5b\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xff\x65\x97\x7d\x34\x41\x60\xcd\x1d\xbd\xed\xed\xf0\xdc\x49\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8c\x25\xb1\xbe\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x9e\x77\x9a\x14\xb2\x9a\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x8e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x51\xdf\xb8\xab\xde\xeb\x6a\xca\x45\xf5\xf1\xe5\x67\x48\xca\x6d\x31\xd9\x56\x5b\xa8\xdb\xdd\x36\x23\xed\x79\x33\xb5\x8b\x5e\xb6\xd4\x1b\x0e\xe1\xbf\x70\x42\xa5\xc0\xf5\x72\xd2\xa5\xa2\x9a\xa9\xc9\xae\x8e\x60\xdf\xcc\xaa\x56\xeb\x0e\x8d\x50\xae\xea\xc4\x54\x61\x71\x28\x33\xd8\xfc\x6c\xa6\x91\x73\x26\x33\x21\xd4\x2e\x66\xa2\x66\xa3\x76\xd3\xe1\x3b\xcc\x99\xb0\x01\x4a\x88\x39\x20\x49\x6e\xd8\xa6\xbb\xe2\x1b\x44\x59\xd7\x60\xfd\x33\xb6\xab\xae\xee\x1b\x9a\xfb\xaa\xcd\xe1\x03\x71\xcc\xe0\xe8\xde\x32\x7f\x4c\x51\x58\x57\x9a\xa8\x32\x37\xa4\x3c\x02\x9b\xce\xb4\x1a\x10\x36\xda\xd9\x5e\xe4\x9b\x39\x46\x40\x93\x59\xe3\x15\x72\x00\xdd\x2a\x96\xdd\x3c\x7b\x4d\x1f\xe8\xc9\x93\x90\x46\xcf\x37\x87\xef\x30\xa8\xe4\x86\xe5\x23\xb1\x76\x1b\x0c\x08\xe8\x64\x74\xba\x7b\x5c\x85\x6d\x35\x78\x9d\x99\xc5\xf1\x82\x30\x0d\xe6\x32\x46\xd5\x5f\x8a\x72\x6a\xe7\x1a\x7c\x8a\x18\xce\x41\x95\x7d\x8f\x61\x6f\x69\xba\xbb\x49\xc2\xb7\x23\xbb\x68\x47\xe6\xc4\xe0\xdc\x96\xb9\x87\x5e\xc6\x15\x40\x07\x38\x54\x88\x13\x12\x54\x21\xac\x99\x6c\xd9\x35\xfe\x3f\x76\x74\x80\x37\x9b\x19\xea\x44\x9d\xd6\x5b\x6b\xc6\xa6\x33\xbf\xb3\xa8\x93\x0f\xda\x3b\xb2\xdb\x06\xeb\x1e\x16\x62\x5b\xc7\xe0\x10\xdb\xe2\x70\xc1\x46\xd2\x7b\x7d\x3c\x1b\x47\x42\x83\xcc\xab\x65\xc3\x53\x83\xd7\x8a\x73\x4b\xfb\x22\xee\xee\xb0\x92\x37\x9d\xa9\x38\x31\xa7\x9c\x30\xa3\x41\x1a\x3e\x35\x14\xc5\xe9\x88\x9c\x13\x5e\x56\x6c\xf9\x29\xc2\xb8\xa8\xe8\x72\x1d\x19\x62\x95\xa8\xfb\xea\xca\xad\x43\xae\x52\xdb\xba\x45\x63\x36\xdb\xd0\xcd\x00\x3c\x5f\x76\xe5\xa9\x4e\xec\x1a\x75\xec\x20\x4c\x2c\xf0\x7d\xf8\xb7\xe8\xde\xc7\x32\x2c\xba\xe5\x2b\x75\x54\x2f\xc8\x7c\xd0\x94\xe3\x2b\x1e\xd0\x66\x37\x76\x2e\xba\xee\x0a\x12\x67\x67\x90\x48\xf3\x4a\x82\x02\xcc\xd7\xb7\xa5\x59\xae\x20\x34\x5a\xb3\xdd\xba\x2f\xc7\x0b\xfc\x76\xc7\xd8\xfb\xcd\x2d\x94\xb9\xd6\x2d\x88\xcd\xd6\x2d\x16\xc3\xad\xdb\xf2\xee\x8d\x13\xad\x1e\x81\x30\x1c\x2e\x4e\x0c\xfb\x86\x01\xe2\x9c\x1e\xdb\xc2\x39\x6c\xdd\x76\x8f\x82\xdf\xd4\x4f\xb4\xe5\x88\xc5\x22\x6c\xeb\x10\x47\xbf\xbe\xad\x04\xb7\xbd\x4c\x58\xfd\xfa\x16\x10\x1f\xbb\xae\x75\x0d\xc1\x5f\xdf\xe2\x33\x0a\xd3\x6e\x5f\x21\x4a\x7f\x7d\xdb\x2a\x76\x7f\xd0\x0e\xdc\x27\xdf\x6a\xcb\x98\x7e\x08\xba\x65\xeb\x16\x79\xc5\xbb\x05\xfc\xaf\x6f\x2f\xb3\xde\xe7\xaf\x97\x12\xb0\xbe\xed\x39\x51\x60\x47\xa2\x36\x13\xf4\xad\x36\xc4\xfc\xa0\x07\x8d\x1f\x47\xa2\xa6\x41\x82\x85\xd9\xf3\x51\xe5\x4e\xc1\x1e\x38\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xe6\xb6\x75\xf6\x44\x48\x36\xc4\xfa\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xd5\x3b\x47\x3d\xe1\x1b\xeb\x8c\xdc\xa3\x8a\x60\xdd\xa1\xbd\x8a\xf0\x6c\xeb\x55\x84\x5e\x45\x78\xbe\xf5\x2a\xc2\x6a\xeb\x55\x84\x5e\x45\x08\x6a\xbd\x8a\xf0\x6c\xeb\x55\x84\x67\x5b\xaf\x22\xd4\xad\x57\x11\x0e\x5f\x45\x08\xcd\x90\x5d\xdf\xac\xbf\x25\x9a\xdb\xe7\x2f\xd6\xdd\xb8\xec\xe7\x41\xe5\xc6\x87\xb9\xb7\x1d\x3e\x46\x8a\xbe\x73\xa2\xc6\x3d\x3a\x89\x5c\xb2\xb7\xa4\x7c\x0a\xe4\xed\xf0\xed\x9b\x9d\x93\x2a\x9a\x2d\x24\x36\xbd\xd9\x76\x05\x8d\x5a\x6d\xd1\x77\xc6\xa6\xf8\x85\xc3\x0b\xe9\x71\x9c\xbd\x8a\xab\x68\x29\x9f\x1b\xe2\x6b\xaa\x8a\x04\x39\xe8\xdd\x13\x22\x7c\x6b\x3a\xa6\x59\x0e\x55\xd0\x9b\x65\xeb\x2e\x8d\xa7\x4e\x8a\x15\xdc\x05\x48\x98\x6d\xd9\x75\xdb\x75\x7a\xdb\x04\xa8\x4d\x36\x1f\x83\x79\xe3\xae\xa1\x44\x9a\x28\x91\x83\x85\x6b\xf3\x57\x87\x79\x5d\xf0\xdb\x80\x9c\xc0\x68\x3a\x22\x69\x09\x0e\x06\xc1\x66\x9d\x9c\x0e\x1a\xc1\x99\x5d\x63\x89\x8c\xc0\x23\xf1\x3f\x66\x62\x5d\x4c\x27\xcc\x81\xeb\x92\x66\xd9\x82\xc0\x9c\x25\xba\x5a\x01\x4c\xce\x62\x5a\x05\xcc\x75\xb0\x2a\x1a\xaa\x7e\x0e\x57\xf8\x57\x37\xf1\x24\x5c\x4f\x5c\xa1\xa3\x3b\x4f\x5f\x2a\x08\x60\x67\x68\xb4\xd1\x92\xa4\xcd\x68\x36\x20\x0d\xff\x89\x07\xf7\xe3\x6d\xd7\xd8\x1d\x12\x49\x1e\x09\x96\x41\x62\xaa\x06\x2e\x60\x46\x48\x17\xd2\xb3\x3a\x83\x6b\x42\x66\xd6\xe0\x7f\xec\x9c\x9b\xdf\x6e\x7a\x06\x79\x17\x0c\x91\x75\xcd\xd0\x76\x2f\x0a\x91\x89\xe9\xa2\xb9\xf1\x5c\xdd\xfe\x1a\xed\x9c\x12\x55\x8e\x9d\x72\x6b\xce\xfe\xf5\xd2\x4e\xed\x83\x3d\x36\xb6\x3e\xd8\x63\xa5\xf5\x96\xdc\xde\x92\xbb\x43\x3f\xbd\x25\xb7\xb7\xe4\xf6\x96\xdc\xde\x92\xdb\xb5\xf5\x96\xdc\x9d\x88\xea\x2d\xb9\xa4\xb7\xe4\x6e\x6c\xbd\x25\xd7\xb5\x3e\xd8\x63\x6d\xeb\x55\x84\x5d\x5b\xaf\x22\x84\xf7\xd3\xab\x08\xbd\x8a\xd0\xab\x08\xbd\x8a\xd0\xb5\xf5\x2a\xc2\x4e\x44\xf5\x2a\x02\xe9\x55\x84\x8d\xad\x57\x11\x56\x3b\x8e\x16\xec\xf1\x02\xe4\xc6\x24\xb4\x10\x69\x74\x38\x97\x42\xa4\x4f\xa0\xb9\x58\x5f\x78\x22\x86\x99\x48\x28\xd6\x12\x64\xf6\x27\x2e\x06\x45\xd1\xdc\x86\x02\x0c\xc8\x3f\x04\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x01\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x7b\x34\x98\x6d\x5a\x8f\x06\xd3\xa3\xc1\xf4\x68\x30\xaf\x8b\x06\x33\xa3\xca\x95\xb8\x40\xa1\x68\x33\x38\x4c\x83\x63\xdf\x83\xcc\x7b\x6c\x98\xe7\xda\x8a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\x6f\xda\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\xa1\x3d\x3c\x82\x4c\x98\xab\x30\xb3\x74\x9a\xdd\x0c\x77\x65\x88\x07\x02\xb8\xd2\x9e\x89\x80\x9e\xf6\x8f\xba\xd2\x7e\x95\x68\xa1\x4a\xcd\x88\xad\x96\xf8\xf3\xc5\x61\xb0\xc4\xb1\x17\x0e\x89\x76\x61\x4a\xdf\x07\x59\x0c\x63\x99\xf7\xd0\xfc\x76\xb7\x53\x4d\xd9\xcd\x2d\xb6\x49\xc3\x17\xea\xfc\xef\x12\xe4\x82\x88\x39\xc8\xda\x58\xe5\x6f\x5a\xe5\x62\xb4\x11\x0b\xdf\xd5\xa1\x0d\x57\x4d\xaf\x26\x16\x65\x8a\x97\x59\x36\xb0\xbd\x2f\xb3\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\x1c\x58\xc5\xda\xcd\x2d\xae\x79\x22\xa2\x71\xe2\x85\xac\x87\x87\x52\x19\x77\x73\x7b\x49\xff\x12\x89\xed\x63\x22\x91\xfd\x4c\x24\xa2\xaf\x89\xc4\xf5\x37\x91\xe8\x3e\x27\x12\xd3\xef\x44\x5e\xbd\xd2\xef\xe6\x16\xdd\xac\x18\xdb\x15\x45\x5e\x8c\xc1\x90\xd7\xae\x28\xbc\xb9\xbd\x4e\xad\xe1\xcd\xed\x05\x76\x41\x4c\xf7\x14\x79\xd1\x3d\xb0\x97\x9a\xc6\x9b\xdb\x41\x3a\xad\x9e\x24\xec\xc5\xeb\x20\x6f\x6e\xd1\x7d\x40\xe4\x05\xfc\x40\x24\xb6\x2f\x88\xbc\xcc\x91\x7d\x61\x9f\xd0\x2b\x0c\xd0\xa9\x7a\xf3\xe6\xf6\x12\x3c\x67\xaf\x15\x9f\x9f\x22\x6b\x8f\xb5\xa0\x37\xb7\xfd\x57\x89\xde\xdc\x22\x4b\xe7\xa1\x95\xa5\x9f\x23\x34\x0a\xab\x78\x19\xf7\x2b\x69\x9d\x8b\xef\x61\x11\x37\xf8\x33\xc2\xc9\xfd\xd0\xa2\xce\xab\x9f\xda\xd5\xb0\xab\xa5\x76\xf4\xb5\x59\x81\xdd\xf9\x08\x5c\x45\xec\x2c\x0b\xa6\x61\x0c\x44\xd3\x07\xc0\x88\x0b\x81\xe5\x48\x58\x0a\xb6\x6e\x8d\xdd\xea\x38\xbe\xd9\xe2\xa5\x82\xd4\x10\x92\x09\xf1\x50\x16\xfe\xa8\x60\x5a\x71\x8c\x83\xc9\x78\x22\x72\x9f\x3f\x6d\xb3\xe9\xcc\x89\x77\xbc\x60\x68\xeb\x8c\xd9\xcf\x91\x1c\xbc\xa4\x9d\x51\xf5\xef\x2d\x23\xdf\xdf\x09\x55\xe4\xef\xa8\xfe\x70\x72\x82\x3f\x3c\xfd\x7b\x78\x68\x66\xb5\x04\xd6\x2f\x27\x4a\xe4\xb0\x4b\x45\xca\xdb\xab\xf3\xd4\xec\x06\x13\xe4\x6b\xa3\x34\x27\xee\xd8\xfa\xd3\x4f\x28\xd7\xec\xb4\x32\x45\x8f\x08\xee\x2f\xd4\xfd\x52\xc1\x8f\xb5\xa5\xda\x73\x7d\xdf\x41\x78\x44\x66\xb5\x72\x75\x64\x8f\xf5\x70\x8f\x5c\xd9\x77\x5b\x85\xaf\xaa\x19\x67\x65\xbc\xe0\x71\xef\x7d\xec\x80\x53\x79\x27\x42\x8e\x59\x9a\x02\x16\xda\xac\x5e\x75\x2c\x3c\x34\x46\x7d\xe4\x0c\xdf\x6f\xed\x9d\x70\x62\xce\x33\x25\x06\xcb\xe3\x24\x94\x7b\xf0\x03\xd0\xb6\x5a\x67\x6b\x58\xc2\x94\x59\x16\x05\xc1\xea\xd7\xc1\x85\x87\xbf\xd4\x3d\x11\x39\x45\x80\xa9\x03\xbf\x2b\x96\x09\xec\xaf\x8b\xe8\xd7\x05\x17\xba\xbf\x31\xfa\x1b\x63\xe9\xc6\x58\x39\x78\x2f\x77\x69\xac\x0c\xd5\xdf\x1b\x07\x7e\x6f\x70\x9a\x83\x2a\x68\x02\x5f\x90\x87\xd9\x9a\xff\x6d\xde\x9a\x27\x5f\x35\xca\x69\x83\xcc\xa3\x7a\x05\x3c\x54\x0d\xde\x58\xd8\x6f\xea\x43\xa1\x4a\xde\xa8\xb5\xda\x20\xc6\xf2\xcd\xe5\xa8\xbf\x60\x4a\xbc\x9a\x2f\x38\x28\x74\xbe\x42\x15\x7b\xda\x18\x1c\xc7\x0a\x7f\x6d\x84\xa0\xa9\xdd\x2c\x3c\x5d\x06\xa5\xa9\x47\x44\x3f\x70\x0e\x94\x2b\x72\xe4\x83\x62\x8f\x55\xfd\xc4\x96\x45\x95\x9f\x6a\x55\x79\xab\x8a\xa2\x93\xff\xfd\x7f\x4e\x5b\x25\xad\x6a\x82\x7a\x2f\xff\xd6\xad\xf7\xf2\x07\xb5\xde\xcb\xdf\x7b\xf9\x63\xf4\xd5\x7b\xf9\x7b\x2f\xff\xda\xd6\x7b\xf9\x7b\x2f\x7f\xef\xe5\xef\xbd\xfc\xab\xad\xf7\xf2\xf7\x5e\xfe\x46\xeb\xbd\xfc\xdd\xc9\xea\xbd\xfc\x3b\xb6\xde\xcb\x1f\xd3\xcb\x5f\x1b\x2e\x0e\xcd\xfa\xd6\x34\x69\xb9\x4c\x56\xd4\x3e\x35\xd5\x2c\xa9\xd1\xa3\xfc\x53\xf6\x5f\x87\x65\x8a\x6b\x9a\xc9\x5e\xc6\x10\xd7\x34\xf6\xad\xd8\x53\x23\xd9\xe1\x36\x5a\xdd\x2a\xbb\xdc\xca\xc8\x2f\x6a\x90\xeb\xcd\xed\xdd\xa8\xac\x53\xcb\x0e\xed\xa8\xdf\x7b\x30\x03\x35\x13\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd6\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x61\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x25\x72\xa5\xe6\x8b\x31\x85\xfb\x83\x66\x99\x78\x0c\x97\x36\xa2\x9c\xeb\xc8\x65\x6b\x02\x4f\xdb\xe3\xce\x55\x6f\x96\x72\x7f\xc3\x34\xdb\xbe\x60\xce\x96\xad\x2f\x98\xf3\x7c\xeb\x0b\xe6\x3c\x5d\x30\xa7\x11\xd9\xd4\xac\x9c\xd3\x75\xb6\xb1\xde\xce\x1e\x2a\xe7\x10\xf2\x97\x19\x20\xdf\x90\x60\xc3\x91\xca\x4c\xb3\xa2\x46\x44\x53\x76\xe5\x33\x6b\x88\x9b\x38\x64\x9d\x36\x17\x33\x34\xd2\x64\xd6\x91\x80\x25\x1e\x88\x54\x20\xee\x9a\xc2\x9b\xcd\x22\xca\xa0\x1f\xd8\x96\x95\xf1\x16\x3a\x0b\xec\xc3\xbe\x7c\xfc\x8f\x80\x5b\xe7\x3d\x8a\x3d\xed\x78\x3b\x45\x4e\x8c\xb4\x94\x2d\x5c\xd4\x59\xeb\xfa\x69\x89\x59\x9d\x87\xb5\x5e\x84\x39\x78\x15\x6d\xca\xe6\xc0\x6b\x19\xed\x44\x9d\x9e\x7a\x5d\x71\x59\xf6\xec\x3c\x66\x88\xcc\xda\xfd\x5e\xdd\x55\xd6\x5c\x92\x15\x3b\x8f\xbb\x46\xc6\xfc\xf7\x86\x2c\xf6\x1f\xcf\x4b\x99\x9d\x87\xb6\xac\xcd\xc3\x2d\x35\xb6\x55\x2d\x5d\x76\xec\xfb\x40\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\xb5\x0f\xd8\x8f\x3d\x40\x7e\xfc\x92\x0a\x46\x1d\x64\xf0\xcf\xc1\xd9\x99\x5e\x02\x2d\xfe\xa0\x83\x7d\x7a\xb8\xf8\xa0\x7e\x7e\x51\x70\xf1\x7b\x0a\xe6\xf9\x05\xa2\xc6\x1f\x40\xf0\xce\x3e\x03\x77\x7e\x71\xa8\xf1\x07\x14\xa8\x73\x90\x41\x3a\x87\x16\xa0\xd3\xc3\xb0\x07\xb5\x2f\x13\x86\x3d\x6a\x10\x4e\x6c\x3e\x72\x80\xc1\x37\x07\x18\x78\x73\xa8\x41\x37\x11\x25\xe5\x97\x09\xb6\x89\xc4\x02\x5e\x26\xc8\x26\x5e\x6a\x74\xcc\x53\xb9\x6f\xf8\x8c\x83\xc8\x85\x3e\x64\xd8\x8c\x83\x4a\x80\x3e\xac\xe4\xe7\x7d\x24\x3e\x1f\x0c\x4c\xc6\x1e\x21\x32\xe2\x88\x81\x11\x84\xbf\x97\xe0\xf7\xf1\x64\xb1\xa8\x70\x18\x51\x79\xfe\xfe\x61\x30\xbe\x5a\xb6\x1f\x11\xfe\xa2\xe7\xfc\x1b\xdb\xa1\x73\xfe\x97\x86\xbb\xd8\x2f\xd4\x45\xcf\xff\xb7\x6a\x51\x61\x2d\x5e\xd8\x73\xfa\x9a\x70\x16\x87\x01\x65\xf1\x6a\x30\x16\x87\x03\x61\xf1\x6a\xf0\x15\xbd\xc7\xba\xf7\x58\xb7\x5b\xef\xb1\xee\x3d\xd6\xbb\xf4\xd3\x7b\xac\x7b\x8f\x75\xef\xb1\xee\x3d\xd6\x81\xad\xf7\x58\x77\x24\xaa\xf7\x58\xaf\x6f\xbd\xc7\xba\xf7\x58\xf7\x1e\xeb\x95\xd6\x7b\xac\x83\x08\x3c\x50\x8f\x75\x1c\x48\x88\x98\x27\xf2\x90\xa0\x20\x0e\x01\x06\xe2\xb5\x20\x20\x0e\x0e\xfe\xa1\x37\x41\x6f\x47\x5d\x1c\xa8\x87\x98\x47\xf8\xb0\x21\x1e\x0e\x19\xde\xe1\x40\xa1\x1d\x5e\x06\xd6\xe1\x25\x21\x1d\x82\xcf\x6c\xd4\xd3\x5a\x88\xf4\x9c\x6b\xe6\x53\xc8\x76\x3f\xa7\xad\xd3\xf9\x1e\xff\x18\x83\x3d\x63\xad\x03\xd3\xcc\x93\x97\x65\x06\xca\xa5\x89\xd3\xb9\x60\x29\x29\x4a\xad\x6d\xe6\xad\x3b\x9f\x7e\xe3\xd3\xdc\x66\xca\x0f\xc8\x3f\x04\x87\x01\x01\x9d\x8c\xcc\xe6\xc6\x1c\x74\xa1\x67\x20\xcd\xe3\x27\xea\xf4\x74\xf7\x35\x09\x92\xcf\xc2\x4c\x7b\x85\x84\x09\xc8\x2f\x02\x59\x01\x3d\xcf\x0e\xbe\x40\x5a\x87\xb7\xa5\x1e\x43\x04\xdc\x17\xf6\xf8\x69\xe1\xb2\xde\xf1\xd8\xdb\xb4\xf3\xae\x37\x24\xe2\x1b\xb4\x36\x10\x34\xdc\x1c\x1b\x30\x0e\x06\x64\x5c\x6a\xc2\x34\x02\x03\x24\x33\x21\x54\x57\xee\xe2\x92\x94\xf1\x45\xe6\x4c\x58\x73\xba\xe0\x80\xa8\x03\x42\x56\x3c\xb0\x41\x94\x55\x25\xea\x9f\xb1\xae\xca\x56\x2e\x94\xae\x77\x88\x37\xce\x9a\xc1\xab\x3b\x67\x2a\xc1\x50\xa4\x89\x2a\x73\x43\x8a\x05\x54\x51\x16\x02\xa0\xe3\xb0\x13\x23\x62\xd1\x64\xd6\x78\x85\x1c\x40\x5b\xd7\x9c\xcf\x72\x6e\x1c\xe2\xa6\xce\x74\xe2\x73\x5e\x3b\x8e\x6d\x3a\x03\xa5\x07\x1b\x11\x47\x36\xef\x05\xcb\x13\x4e\xbb\x1a\xa5\x12\x91\x17\xa5\x06\x23\xc7\x97\xb9\xd9\x4d\x4c\x63\xc4\x0a\x32\x23\x29\xca\xa9\x9d\x70\x0f\xf2\x60\x27\xa2\x46\x10\xe1\x29\xea\x66\x9d\x2f\xfe\x23\xbb\x72\x47\x5e\x78\x37\x44\xb0\x49\x05\x10\x42\x66\x54\x35\x43\x6d\xea\x7b\xf5\x19\x80\x9c\xff\x11\x70\xb3\x9a\x81\x4f\x54\x43\xc2\x99\xb1\xe9\xcc\x6f\x36\xa3\x1d\xa3\x4d\xa1\xb5\x49\xbf\x74\x64\x09\x73\x72\xdd\x19\x42\x71\xa5\xde\xf1\x76\xc6\x53\xf2\x17\xfc\x16\xd2\xe5\x7c\x6b\xdc\x07\xd6\x68\x40\xd3\xd4\x08\x22\x20\x87\xf6\x04\x09\x32\x61\x4e\x45\x5a\x3a\xd2\x6e\x86\xbb\xb2\xc6\xc3\x40\x07\x58\xda\x71\x01\x3d\xd9\x99\xef\xd8\x41\x0c\x1f\xdb\xd2\xab\x44\xd3\x56\x6e\xdd\x34\x8f\xc8\xb9\x95\x88\x3c\xff\x32\xaa\xfb\x60\x05\xff\x6a\xf5\x54\xdb\x99\x39\x80\x68\x88\x38\x8e\xda\x18\x90\x12\x24\xa2\x5f\x35\x1a\xb4\x04\x79\x9d\xba\x3f\xaf\x00\x31\x41\xf6\x03\x33\x41\xfa\x9a\x33\x87\x15\xc4\x43\xfa\x9a\x33\x07\x16\xd4\x43\xfa\x9a\x33\x7d\xcd\x99\xee\xed\x10\x82\x7e\x48\x5f\x73\xe6\x00\x82\x80\x48\x5f\x73\x66\x9b\xd6\xd7\x9c\xe9\x6b\xce\xac\xb6\xbe\xe6\x4c\x5f\x73\xa6\xd1\xfa\x9a\x33\xdd\xc9\x3a\xb8\x40\x22\x72\xc0\xc1\x44\xa4\xaf\x39\x13\xb9\xe6\x4c\xbc\xf4\x68\xf2\x02\x27\x77\xdf\xd0\x18\xe4\x50\xf2\xa4\xc9\x81\x43\x64\x90\x43\x4b\x96\x26\x07\x97\x30\x4d\xf6\x94\x34\x4d\x0e\x09\x32\x83\xec\x17\x36\x83\x1c\x62\x62\xde\x97\x51\xb2\x28\x2a\x94\x06\x79\x89\xbb\x62\xff\x90\x1a\xe4\x6b\xbf\x2e\x22\x42\x6b\x90\xfe\xc6\xd8\xa6\x7d\x09\x37\xc6\x4b\x43\x6d\x90\xbd\xc3\x6d\x90\xfe\xde\xe8\xda\xa2\x42\x70\x90\xd7\xf1\x30\xbf\x26\x14\x07\x39\x18\x38\x0e\xf2\x9a\x90\x1c\xe4\xa0\x60\x39\xc8\x6b\x42\x73\x90\xde\xcb\xdf\x7b\xf9\xb7\x6e\xbd\x97\xbf\xf7\xf2\xc7\xe8\xab\xf7\xf2\xf7\x5e\xfe\xb5\xad\xf7\xf2\xf7\x5e\xfe\xde\xcb\xdf\x7b\xf9\x57\x5b\xef\xe5\xef\xbd\xfc\x8d\xd6\x7b\xf9\xbb\x93\xd5\x7b\xf9\x77\x6c\xbd\x97\x3f\xa6\x97\x3f\x0e\x8c\x08\x79\x81\x53\x7b\x48\x70\x22\xe4\x40\x20\x45\xc8\x2b\xc2\x8a\x90\x43\x84\x16\x21\xbd\xb9\xbd\x33\x95\x71\xe0\x46\xc8\x0b\x1c\xf5\xc3\x86\x1d\x21\x07\x0e\x3d\x42\x0e\x17\x7e\x84\xbc\x18\x04\x09\x79\x61\x18\x12\x12\xeb\x5c\xdb\x14\xd5\x43\x01\xf8\xb1\xd4\xac\x64\xd6\xb6\x4a\xfb\x3f\x99\x38\x1f\xa6\xd9\xba\x43\x23\x29\x9f\x02\x79\x3b\x7c\xfb\xe6\x4d\x78\xee\x2e\xe3\x1a\xa6\x10\x62\xbd\x9c\x08\x99\x53\x8d\x3d\xfd\xfe\x77\x9d\xfa\x89\xce\xb6\x37\xe1\x3c\x1c\x1e\xfe\x89\xb3\x89\xb4\xf1\x27\x5a\xd2\xff\x06\x30\x12\xd4\x0a\xcc\x69\xcd\x41\x93\xce\xbe\x81\x06\xe2\x86\x66\x39\x0c\x3c\xef\xb7\x31\x11\x3e\x00\xc0\xc1\xb0\xa4\x44\x70\x27\xb2\x19\x76\xd7\x75\xef\x75\x7f\xe5\x04\xa8\x42\xe4\x83\x31\x98\xd7\xee\x38\x3e\xd5\x16\xdf\xa7\x10\x8c\x6b\x6f\xe8\x31\xef\x0c\x7e\x43\x38\xf0\xa0\xb4\x04\x6b\x41\xad\x63\x9c\xca\x22\xa5\x1a\x4e\x43\x54\x45\xb5\x50\x1a\x72\xc4\x90\x31\x92\x1e\xc5\xe0\x1f\xa2\xe5\x02\x03\x40\xe6\xc0\x75\x49\xb3\x6c\x41\x60\xce\x5c\xfc\x8e\x19\x1e\xa3\x97\x98\x56\x41\x33\xff\x97\x19\x20\x07\x91\x60\x03\x93\xca\x4c\xb3\x22\xab\xe1\x47\xec\xf2\x67\xd6\x24\x37\x71\x68\x3b\x6d\x7e\x66\x68\xa4\xc9\xac\x23\x01\x4b\xdc\x10\xa9\x30\x0c\x48\x2a\xbc\xe3\x2c\xc0\x0c\x7a\x84\x8d\xaa\xa0\x2a\x5b\x9d\x05\xfb\x61\x5f\x3e\x12\x48\xc0\xfd\xf3\x1e\x05\xa0\x76\xe4\x9d\x22\x27\x46\x6e\xca\x16\x2e\xfe\xac\x75\x11\xb5\x04\xae\xce\xc3\x5a\x7f\xc2\x1c\xbc\xb2\x36\x65\x73\xe0\xb5\xb4\x76\xa2\x4e\x4f\xbd\xd6\xb8\x2c\x85\x76\x1e\x33\x44\x7a\xed\x7e\xc3\xee\x2a\x75\x2e\x49\x8d\x9d\xc7\x5d\x23\x6d\xfe\x7b\x43\x2a\xfb\x8f\xe7\xe5\xcd\xce\x43\x5b\xd6\xe6\xd1\x97\x1a\xdb\xaa\x96\x33\x3b\xf6\x7d\x20\x28\x32\xe1\x80\x20\x31\x3c\xb2\xd1\x80\x40\x5e\xb8\x52\xd2\x2b\x00\x80\xec\x01\xfc\xa3\xaf\xd8\xd3\x57\xec\x69\xb7\xbe\x62\x4f\x5f\xb1\x67\x97\x7e\xfa\x8a\x3d\x7d\xc5\x9e\xbe\x62\x4f\x5f\xb1\x27\xb0\x1d\x50\xc8\xce\x41\x86\xeb\x1c\x5a\xa8\x4e\x5f\xb1\x27\xa8\xf5\x15\x7b\xfa\x8a\x3d\x7d\xc5\x9e\x46\xeb\x2b\xf6\x84\x1c\xcd\x78\x49\xd2\x31\x4f\xe5\xbe\x81\x34\x0e\x22\x2b\xfa\x90\x01\x34\x0e\x2a\x15\xfa\xb0\xd2\xa0\xf7\x91\x02\x7d\x30\x80\x19\x7b\x04\xcb\xe8\x0b\x3c\x6d\xd5\xa2\x02\x63\x44\xe5\xf9\xfb\x07\xc4\xf8\x6a\xd9\x7e\x44\x20\x8c\x9e\xf3\x6f\x6c\x87\xce\xf9\x5f\x1a\xf8\x62\xbf\xa0\x17\x3d\xff\xdf\xaa\x45\x05\xb8\x78\x61\xcf\xe9\x6b\x02\x5b\x1c\x06\xa8\xc5\xab\x01\x5a\x1c\x0e\x98\xc5\xab\x01\x59\xf4\x1e\xeb\xde\x63\xdd\x6e\xbd\xc7\xba\xf7\x58\xef\xd2\x4f\xef\xb1\xee\x3d\xd6\xbd\xc7\xba\xf7\x58\x07\xb6\xde\x63\xdd\x91\xa8\xde\x63\xbd\xbe\xf5\x1e\xeb\xde\x63\xdd\x7b\xac\x57\x5a\xef\xb1\x0e\x22\xf0\x40\x3d\xd6\x71\xc0\x21\x62\x9e\xc8\x43\x02\x85\x38\x04\x40\x88\xd7\x02\x83\x38\x38\x20\x88\xde\x04\xbd\x1d\x75\x71\x40\x1f\x62\x1e\xe1\xc3\x06\x7b\x38\x64\xa0\x87\x03\x05\x79\x78\x19\x80\x87\x97\x04\x77\x08\x3e\xb3\xd1\x4e\x2b\x2d\xb5\xc8\x45\xc9\xf5\x1d\xc8\x39\x4b\xe0\x3c\x49\xcc\x5f\xf7\xe2\x01\x76\xcc\xea\x6f\x1d\xd1\xf3\x27\xba\x25\x8c\xa7\x2c\x41\xdb\xe4\xe3\x0c\xf4\xcc\xa5\xcd\xe1\x73\x84\xda\x07\x89\xc6\x27\xeb\x13\x8a\x74\x9a\x3b\x16\x33\xbb\xb1\xeb\x5d\x97\xc0\xce\xd0\x58\x88\x0c\xe8\x2e\xae\x68\x27\x33\x82\xdc\x91\x51\x87\xf1\xac\x1f\x9c\x28\x51\x8f\x4e\xc6\x90\x09\x3e\x75\x39\xe4\x8e\xeb\xec\xba\x0b\x2f\xea\xee\x9c\xab\x36\x29\xa5\x04\xae\xb3\x05\x4e\x73\x9a\x42\x4a\xd0\x3c\x95\x8b\xf9\xee\x9b\xfc\x1e\xd9\x91\xd7\xe1\xa9\x26\x19\x50\xf3\x1e\x1c\xea\x17\x31\x0c\x8d\x92\x9b\x0e\xb4\x57\xbe\x65\x0b\x22\xd0\x69\xfd\x77\xbf\xb1\x3b\xdd\xd1\xed\xd3\xe0\xf5\x32\x94\xd2\x12\x34\xf2\x35\xe6\x03\x19\xe4\x42\x94\xe4\x91\x5a\x55\x4a\x96\x1c\x59\x2a\x4e\x54\x87\x45\x0e\x50\x3a\xba\x1b\xe3\x87\x78\x2f\xed\xf8\xb3\x10\xe3\x38\x95\xd3\x4e\xa2\x53\x0c\x59\xe2\x5c\x4e\x4b\xab\x29\xba\xa3\x08\x5c\xcb\x05\xe2\x61\x74\xbb\x17\xee\x67\xad\x13\x92\xd3\x29\x1c\x2b\x72\xf1\xe1\xbd\xb9\x75\x30\x02\x89\x4d\xac\xcc\xee\x6e\xa1\x42\x8a\x39\x4b\xbb\x5e\x43\x9f\xa8\x64\x74\x9c\x19\xad\x77\x02\x12\xb8\x91\xa4\x7f\x73\xf2\xe9\xfc\xf6\x6f\xd7\xe7\x1f\x2e\x4f\x51\xff\x85\xcf\x05\xe5\x86\x1d\x94\xaa\x46\xe6\x71\x14\x1e\x2b\x02\x7c\xce\xa4\xe0\x66\x16\xd0\x6e\x48\xc9\xdc\x75\xda\x89\xa2\x3a\x70\x44\x82\x12\xd9\x1c\x52\x8b\xa5\x51\x11\x58\x87\xef\x14\xa5\xf6\x16\x54\x1f\x7b\x53\xf2\x64\x46\xf9\x14\xd2\x11\x79\x2f\x4a\xf3\x62\xbf\xf9\x0d\xbe\x84\x84\xb4\x4c\xa0\x9b\x8e\x63\x4d\xf0\xf6\xe4\xfe\x66\xe0\x65\x16\x73\xfb\x63\xec\x0d\x01\x95\xd0\xc2\x4f\x4d\x73\xf6\xd4\x82\x6b\xfa\xf9\x9d\xc5\xe2\x38\xfa\x4d\xe3\xab\xa3\xee\x81\x6b\x85\x14\xe6\x55\xac\x2c\x68\xdf\x3e\x63\x1a\x24\xcd\xc8\x51\x73\x84\x11\xb9\x34\x74\x41\xda\x5c\x5b\x0b\x46\x03\x73\x90\x68\x5b\x75\x2b\x3b\x20\x12\xa6\x54\xa6\x19\xa8\x6e\x46\x21\x31\xa9\xae\x70\x6b\x6a\x71\xbb\x0a\x2a\x9b\x31\x17\x7a\x14\xca\xb8\x7d\xfb\x20\x10\xec\x64\x22\xde\x91\x99\xd6\x85\x7a\x77\x76\x56\x4b\x41\x23\x26\xce\x52\x91\xa8\x33\x4d\xd5\x83\x3a\x63\xdc\x30\xbf\x61\x4a\x35\x1d\x36\xb8\xee\x99\x95\x8d\x87\x89\xc8\x73\xca\xd3\x21\x75\xe7\x78\x58\xed\xec\xb3\x5f\x3b\xe9\x71\x48\xab\xa7\x18\x1f\xd2\xa1\x9a\x41\xa7\x95\x0b\x53\x14\x03\x14\xc4\x40\x21\x33\xb2\x42\xe8\xe6\x72\x5f\x0c\xfb\xb2\xe2\xcf\x76\x29\x46\xe4\x5a\x68\x87\x57\xe4\x22\x2a\xf1\xb6\xc5\x55\x8e\xc9\xc2\x2f\xaf\xef\x6f\xff\x7a\xf3\xf1\xea\xfa\xbe\xe7\xe4\x3d\x27\xc7\xd6\x73\xf2\x9e\x93\x77\x18\xf8\x50\x38\x39\xf0\xf9\xbe\xb8\xb8\x57\x8a\x1b\x1c\xab\xda\xaa\x2e\x51\xa0\x0a\xf3\xae\xf6\x41\xb7\x2d\x1a\x65\xa7\xef\x6d\xc7\xb4\x26\xfb\x92\xcf\x3f\xd1\x76\xc4\x09\x5f\x3b\x85\xc4\x3d\x60\x35\xf4\x8b\xb0\x09\x0c\xf6\x7c\x85\xc6\x85\x75\x52\x48\x6d\x0b\x8f\xd9\x32\x43\x77\x37\x78\xb7\x96\xef\x9a\xe6\x95\xb9\x75\xdd\xaa\x8d\xc8\x07\x6f\x6f\x21\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\x6d\x77\x03\x65\x04\x97\x02\x1a\x89\x23\x4d\x40\x90\xbd\x7f\x17\xf9\x28\x60\x98\x5a\xb2\x2a\x24\xcc\x99\x28\x55\xb6\xa8\x0c\xf1\xeb\xd9\xd5\x32\x9f\x22\x94\x87\x50\x40\xf9\xa2\xb2\xa2\xae\x1d\x70\x49\xb6\x5b\x27\xa7\x85\x98\xb4\xf7\x2b\xe1\x39\x22\x62\xc8\x79\x01\xe3\xaf\x91\x10\xb7\x97\xf6\x02\xc6\xed\x24\x27\x6e\x92\xf9\x02\xe8\x68\x4b\x8b\x01\x1d\xbd\xb7\xe9\x53\x78\xa7\x1f\x05\x4c\x4d\x2c\x4e\xf6\x8d\x14\x79\x24\x6e\x76\x87\xb8\x80\x55\x3a\xdb\xba\xa3\x7a\xec\x62\xc4\x5b\xf2\xb6\xd3\x1c\xab\x84\x32\xf3\x79\x60\x52\x59\x94\xe0\x94\x38\xf1\xcd\x89\xe0\x13\x36\xfd\x40\x8b\xef\x61\x71\x0b\x93\x30\x97\x78\x7b\xbe\xd1\x3b\xe8\xa2\x6c\xd1\x0f\x69\x24\x1b\x3b\x58\x98\x87\x30\x5a\x6c\x4f\xac\x08\xf8\xf0\xe8\xf7\x78\xc1\xea\x51\x02\xd5\x5b\x0b\xe9\x92\x72\xeb\xac\xd4\x58\x79\x0c\x51\xe2\x1f\xc3\x04\x3e\xdf\xe2\x07\x21\x37\xa5\x47\x77\x3d\x44\x89\xe5\xbe\xaf\x41\xc5\x99\x22\x30\x99\x40\xa2\xd9\x1c\xb2\x0a\x88\x3c\x1d\x90\x71\xa9\x3d\x04\xf8\x98\x26\x0f\x8f\x54\xa6\x8a\x24\x22\x2f\xa8\x66\x63\x96\x31\xbd\x20\x2c\x46\x19\x2b\xe7\x91\x77\xb8\xe6\x3e\x94\x99\x2b\x4d\xf1\x2a\x14\xce\xde\x66\x56\xdb\x86\x2a\x50\x9f\x87\x66\xb9\xa9\xc7\xf3\x8e\x42\x4a\x2e\x94\x26\x09\x48\x23\xd4\x65\x0b\xf2\x28\x45\x8c\x52\x13\xdb\xda\x4c\x12\xc1\x13\x28\xb4\x3a\x13\x73\x23\x0b\xc2\xe3\xd9\xa3\x90\x0f\x8c\x4f\x87\xe6\xc5\x87\x96\x59\xa9\x33\x0c\x21\x39\xfb\x35\xfe\xe7\x90\x4e\x11\xf1\x89\xd3\xef\xc8\xd1\x51\x60\x5f\xa2\xb0\xd1\x92\x91\x4f\xe5\x1d\xc6\xe1\x2c\x5a\xa2\x53\x75\xa1\x18\xd1\x87\x69\x85\x7c\xca\x7b\xc1\x9d\x16\x10\x69\x9a\x77\x8f\x5f\x58\x6d\x2f\x55\xcd\x0b\xd9\x41\xdc\xdb\x3b\x98\x07\xd6\xd7\xbf\x65\x56\x8e\x15\x16\x22\x7d\x47\x54\x59\x14\x42\x6a\x45\x72\xd0\x34\xa5\x9a\x8e\xcc\x81\x18\xb4\xff\xc4\x48\xab\x01\xf9\x7b\xf5\xa1\x4d\xfb\xff\xf1\xf8\xdf\xbf\xbf\xfc\xeb\x7f\x1c\xff\xf4\xf7\xe6\x77\x28\xae\xd9\x24\x9e\xc6\x03\x81\xaf\xa0\x0a\x48\x46\x5c\xa4\x70\x8d\xd4\xe1\x9f\xaa\x15\x57\xe3\xbe\xd0\x54\x97\x6a\x34\x13\x4a\x5f\xdd\x54\x7f\x16\x22\x5d\xfe\x2b\x30\x95\xe8\x00\xe5\x1e\x5c\xdb\x1b\xaa\xbb\x03\xb9\x93\xa8\xd2\x0f\x2d\xd8\x27\x90\xaa\x73\x69\x94\x66\x6b\x9d\x07\xd7\x6b\x85\x38\x9f\xcc\x20\xa7\xf8\xcf\x6f\xfc\x14\x98\xfb\xf8\x51\x32\xad\x31\xd4\xca\xd5\x81\x10\x93\x81\x67\xad\x56\xa9\x9a\xbf\x0d\xae\x83\x16\x95\xf3\x57\x2b\x18\x79\xc2\x70\x46\xdc\x6c\x59\x0e\x50\xa3\x9a\xac\x44\x56\x9e\xdf\x5c\x91\xb9\x9d\xe1\x03\x9a\x9c\x97\x62\xd7\x1e\xa3\xfe\x9b\x83\x66\xdb\x9e\x4a\xbf\x88\x95\xbd\xec\x9d\x4d\xe2\xa8\x90\xf6\x49\xc6\x72\xe6\x32\x17\x0d\x67\x01\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\x13\x8a\x19\xe4\x20\x69\x36\x54\x5a\x48\x3a\x85\x41\x35\xb8\xfd\x59\xf5\x97\xfd\x61\x8b\xbc\xd5\x5f\x5b\x83\x64\x1d\x93\xe7\xae\xa8\xd0\x44\x94\x03\x64\xd9\x7e\xdd\x0e\x84\x63\x57\xdb\xea\x3a\xbe\x22\x77\x5c\xb9\x52\xac\x9a\x58\xcd\x22\x5a\x81\xe6\x22\x2b\x73\x50\x83\x4a\x60\xb5\xa6\x4a\x3e\x27\x73\x2a\xd5\xf1\xe1\xf0\x21\x42\x52\x36\x67\x2a\x46\x82\xf5\x1a\x89\x9a\x39\xac\x02\x51\xea\xa2\xd4\xae\x26\x5a\xe5\xf7\xf8\x5c\x08\x85\x06\xce\xaa\xac\x46\xeb\x36\x7b\x1b\xaa\x2c\x10\x52\x50\xad\x41\xf2\x77\xe4\x7f\x9d\xfc\xe7\x6f\x7f\x1e\x9e\xfe\xe9\xe4\xe4\xc7\x37\xc3\x7f\xfb\xe9\xb7\x27\xff\x39\xc2\x7f\xfc\xf3\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xf6\xf4\xf4\xe4\xe4\xc7\xef\x3f\x7c\x7b\x7f\x73\xf9\x13\x3b\xfd\xf9\x47\x5e\xe6\x0f\xf6\xaf\x9f\x4f\x7e\x84\xcb\x9f\xb6\xec\xe4\xf4\xf4\x4f\xbf\x09\x26\x9d\xf2\xc5\xc7\x40\xee\x6d\xdb\x30\x5a\x49\xbb\xe5\x1e\x23\x69\x87\xad\xab\x90\x71\x3d\x14\x72\x68\xbb\x7e\x47\xb4\x2c\x43\x35\x78\xbf\xbd\x62\x9f\xff\x5b\xcf\x35\xeb\xdb\xac\x92\x42\x0e\xe8\x80\xbf\x94\xa0\xa1\x20\x91\xa0\x5f\xc3\xb2\x6b\x47\xf2\x82\xdd\x52\xbe\xd7\xd7\x76\x83\xfe\x12\x8c\xbd\x55\x65\x2d\x5c\xd7\x5a\x74\x9f\x48\x91\x8f\x48\xc3\xf3\x3d\x47\x54\x0b\xf7\xdc\x03\x04\x42\xed\x91\xde\x38\x1c\xd2\x7a\xe3\xf0\x06\x52\x7a\xe3\x70\x50\xfb\x22\x8d\xc3\x77\x96\x27\xfd\x22\x2d\xc3\xab\xa1\x87\xa6\xd3\x87\xce\x50\xc4\x9d\x63\xba\x36\xc5\x40\xe6\xb4\xe8\x12\x00\xd9\x35\x1e\x20\x66\x10\xa4\x37\x7b\x68\x41\x0a\x51\x94\x19\xd5\x1b\x02\x7f\x22\x45\x44\x56\xa0\xc8\x3e\xac\xa9\x0e\x9a\xb7\x22\x6d\xbe\x3e\x0c\x8d\x9c\x67\x19\x61\xdc\x5e\xd0\xa6\x83\x4e\xa3\xfb\xe8\x21\x09\xd6\x1e\x42\xa8\x0d\x63\x9c\x9b\x57\x7d\x74\x65\x79\x9b\xf1\xf7\x8a\x28\x4d\xa5\x66\x7c\x3a\xb2\x65\x7b\xad\x98\xe8\x42\x54\x18\xaf\x8a\xf7\x76\x22\xa7\x52\x43\x2b\x88\x91\x95\x9a\xe6\x36\x3d\x5a\x69\x3f\x3d\xf8\x06\x9a\x3e\x60\x88\x58\x02\x29\xf0\xa4\x63\xb0\xd1\x27\x0b\x69\xe2\xd7\x61\xbc\x30\x33\x71\xc9\xe7\xee\xfe\x22\x69\x69\xc3\xa4\xad\x08\x15\x6f\xdc\xaf\x2b\x26\xd6\x9c\x61\x17\x8c\xd3\x08\x8d\x45\x69\xb3\x32\x38\x56\x10\x6c\x95\x87\x0f\xa3\x9b\x2c\x4b\xef\xb6\x91\x83\x15\x89\x70\xb1\xbd\x0a\xb6\x09\xd2\xc7\x56\xe4\xf5\xda\x0b\xda\x96\xd3\xbf\x86\xf8\xa4\x70\x09\x3e\xae\xf4\xfe\x12\x92\xfb\xa1\x48\xed\x07\x22\xb1\xbf\x8c\xb4\x7e\x98\x92\x7a\x34\x29\x3d\x8e\x84\x1e\x47\x3a\xdf\x21\x6c\x23\xa6\x44\x1e\x47\x1a\x7f\x09\x5b\x5c\x21\x61\xc2\x3e\x47\xe2\xf8\x1f\xbd\xb7\x42\xc3\x67\xb4\xcc\x14\x12\x0a\xe0\x15\x04\x15\x77\x1c\x0a\x68\x32\xfb\x72\xf2\x16\xac\x01\x29\xee\xbd\x78\xb7\xce\x78\xd5\x5f\x8a\xa4\xbf\x14\x77\x68\xfd\xa5\xd8\x5f\x8a\xaf\x72\x29\x3a\x6e\xf5\xf5\xdf\x88\x91\xd3\x62\x31\xe1\x7f\x5f\x36\xa1\x8b\x36\xee\x00\x72\xe6\x97\x4c\xcd\xae\x8e\x62\x0d\x4f\x75\x86\x23\x77\x3b\x71\x6d\x26\x5b\xc5\x41\x68\x61\xd9\x1e\x99\xb1\xa9\xd9\x9e\x19\xcc\x21\x73\xda\x2b\xc9\x29\xa7\x53\x8b\x37\xab\x45\x55\x6f\x49\x48\x2c\x27\x23\x59\x47\xa8\xbb\x25\x00\x07\x34\x14\x19\x2e\x93\x09\x9a\xe2\x97\x52\x64\x19\x48\x45\x32\xf6\x00\xe4\x3d\x14\x99\x58\x38\xc8\x58\x9e\x92\x3b\x4d\x35\x4c\xca\xec\x0e\x74\xa7\x18\xcb\x20\x8e\x83\x04\xdf\x94\x59\x76\x23\x32\x96\x74\x72\xc8\xc5\xd8\x8a\x57\xb8\x01\x8b\x32\xcb\x48\x81\x84\x74\xdb\x87\x1f\x39\x5e\xe5\xe7\xd9\x23\x5d\xa8\x01\xb9\x86\x39\xc8\x01\xb9\x9a\x5c\x0b\x7d\x63\x6d\x35\xdd\xfa\x6d\x66\x96\xd9\xce\x09\x9b\x90\x77\x58\x2b\x43\x13\x4d\xa7\x68\x39\xf4\x11\x81\x03\xb3\xa1\x9a\x83\x12\x61\x18\xe5\x23\x53\xfb\x34\xa1\x85\x9f\xd2\x5f\xe3\xe8\xe6\xea\xec\x7c\x6a\x83\xf6\x6a\xc6\x26\x90\x2c\x92\x6c\x6f\x0c\xf3\x3c\xc1\x20\xed\x1a\x99\xb7\xc1\x4e\xd4\x42\x69\xc8\x3d\xf8\x20\x5a\x4e\x19\x27\x12\x54\x21\xb8\x42\x29\xaf\xe6\x12\xd5\x8b\x58\x4b\x74\xc7\xc8\xea\x88\x86\xd5\xce\x8a\x41\xa8\x4a\x50\x08\xa5\xef\x34\x95\xba\xab\x7c\x12\x4b\x17\xb8\xf1\x84\x98\x93\x9c\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\xe4\x76\x3a\xd1\x08\x39\xd9\xf2\x15\x24\x12\x70\xde\x7d\x05\x84\x19\xe5\x69\x06\x92\x4c\x28\xcb\x54\xf7\x00\xfe\x15\x9f\x84\x06\x99\x33\x8e\x4e\x02\x1b\x08\x8a\x4e\x0a\xf3\x57\x92\x08\x99\x3a\x70\x47\xa6\x95\xff\x2a\x88\x89\x9a\xf6\x11\x25\xbb\xc6\xf6\x5e\x8e\xa3\x25\xe3\x4c\x24\x0f\x8a\x94\x5c\xb3\xcc\xbe\xbc\x10\x0f\xa8\xbf\x64\xc8\x4e\x3a\x0f\xdd\x9d\x4b\x55\xff\x1c\x56\x07\x6c\x68\xa8\x52\x67\xbf\xae\xbf\xc2\x0f\x3a\x12\x17\x41\x8b\x8e\xa1\x43\xc3\x67\x48\xa2\xe1\x22\x5f\x7e\x86\xa4\x85\x4a\xee\x50\x6f\x6c\x79\x48\x44\xba\x8a\xe4\x0a\xb4\xed\xc0\x8a\xac\x05\x20\x8c\x35\x5b\xec\x28\x9b\x0b\xb7\x08\xae\xbe\x92\x5f\x93\x8c\x71\x68\x2f\x8c\x62\x29\xb4\x17\xc7\x7a\x17\x9d\x92\x4b\x52\x26\x11\x10\x7a\xe1\x73\xc7\x83\x49\xf3\xb4\x20\x66\xb2\x10\x9a\x9c\x1c\x9f\x1d\x9f\xae\xec\x91\x63\x23\x9b\x67\x60\xaf\xc5\x91\xc3\x39\xab\x5e\x4a\xb1\xbc\xc8\x16\xf8\x1e\xc7\xe9\x80\x30\x1d\x23\x6c\xc7\xdc\x86\xb2\xe4\x7e\x56\x1c\x2e\xdb\x80\x28\x41\xb4\xa4\xbe\x0e\x82\xfd\xd4\x3c\xa4\x65\xe9\x2e\xf4\x93\xe3\x9f\x8f\x07\x04\x74\x72\x4a\x1e\xb1\xf6\xab\x99\xbe\x11\xb9\x17\xa4\x54\xe1\x33\x56\x11\xb2\x10\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x16\x78\xdd\x10\x51\x6a\x6b\x04\xa5\x3a\x04\x4f\xae\xd9\x2e\x3f\x33\xed\x52\xb8\x0c\xff\x7e\x83\xbb\xc9\x5e\x59\x84\x1a\x65\x64\x0e\x67\x33\xa0\x99\x9e\xd9\x04\x03\x2e\xf8\xf0\x1f\x20\x05\x62\xce\x71\xf7\xcd\x57\x57\xd3\x2f\x62\x6c\xd1\x0b\xc1\xdf\x9b\x6b\xef\x5b\xe8\x2c\x12\x91\x65\x7e\xf4\xdd\xfd\xfd\xcd\xb7\xa0\x9b\x5c\x9e\xe3\x87\xe4\xdb\xcb\x7b\x9f\x56\x82\xc6\x78\x90\x13\x21\xf3\x03\x60\xef\x71\xe2\x5d\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\xfd\x2d\x56\x37\xe1\x58\xb2\x5b\xb4\x73\x24\x5c\x40\x34\xb9\xba\x19\x91\xbf\x8a\xd2\x4c\xc8\x98\x8e\xb3\x45\x85\x3a\xad\x20\xbc\x96\xe3\x91\x21\xe5\xc8\xdc\x20\x66\xe7\x7f\x07\x34\x05\xa9\x90\x41\x03\x8d\x54\x4b\x27\xc2\x71\x6f\xd0\x16\x75\x29\x2f\x4a\xa5\x45\x4e\x66\xee\xb5\xdb\x78\x74\xee\x70\x8e\xec\x71\x75\xa0\x44\x12\x0a\xcb\xc4\xdd\x6f\xbe\x3a\x16\xbd\xc2\xbd\xec\xbc\xbb\xcf\xc7\x56\x4c\x6d\x4e\x9b\x73\x70\x58\xb8\x1b\xc7\xdb\xcc\x56\x8d\x16\x8a\x7a\x90\x55\x4b\x3b\x23\xd5\x2d\x77\x84\xce\x9e\xe0\x9e\xe2\xd6\x2c\x8d\x13\xfd\x4e\x5e\xac\x46\xa3\x11\x68\xdd\xe6\xb3\x36\xe8\xee\xd6\xf3\x75\x9d\x33\x55\x05\x2f\x26\x94\x0b\xce\x12\x9a\xb1\x7f\x40\x4a\xca\x42\x70\x97\xee\x86\x92\x6d\x42\x15\x0c\xd1\x3b\xce\xb5\x2b\x1c\x55\x63\xa6\x19\xee\xa0\x85\x40\x71\x0f\x63\xd4\x0c\xbb\xb7\x54\x1f\x6e\x69\xce\x17\x58\xf5\x95\xc5\x8a\xb3\xe3\xc9\x17\x21\x4e\x12\x9b\xa7\x18\x9c\x23\xbf\x9a\x21\xaf\x05\xa1\x49\x82\xa8\x70\xf6\xba\x42\xc6\xab\x40\xce\xc3\xf7\x57\xb4\x79\x35\x22\xe0\xa1\xc9\x5e\x36\xe6\x40\x12\x5e\xe6\x63\x90\x35\xbc\x88\xd4\xab\x73\x1a\xc5\xea\xe2\x86\xb5\xc3\x79\x2f\xad\x97\x31\x28\x9f\x02\x79\x6b\x46\xfe\xe3\x1f\xfe\xf0\xfb\x3f\x44\x18\xc7\xbc\x5e\x15\xd8\xcd\xc9\xd5\xf9\xf5\xf9\xdf\xee\x3e\x5d\x20\x68\x61\x68\xf7\x91\xf2\x56\x63\x67\xad\x46\xcd\x59\x7d\xd1\x8c\x55\x84\xff\x08\xe6\xb2\xb1\x8f\xc4\x1d\x52\x65\x36\x61\xa9\x2c\xd0\xa1\xd3\x49\x1a\xa5\x8b\x8c\x1a\x15\xbe\x3b\x9b\xce\x3c\xc3\xb0\x0e\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x99\xde\xda\xd5\xc2\xd3\x52\xda\x12\x42\x95\xf3\xaa\xb6\xe5\x3b\xa7\x15\xd2\xf0\x15\x29\xff\x0a\x12\xc1\xd3\x10\x15\x20\x96\x48\xeb\x28\x89\x7a\xe6\xee\x6c\x9f\xde\x44\x5c\x5f\x25\x6e\x30\xd4\x24\x43\x57\x94\x54\xab\x1a\x87\x4f\x5a\x80\x06\xec\xed\x8f\xff\xd2\xdd\x41\x96\x14\x77\x22\x79\x88\x68\x22\x0b\x64\x60\xef\xcd\x49\x4b\xac\x2f\xf0\xfe\xe2\xc6\x12\x67\x56\xe6\xfa\xe3\x7d\x8d\xc6\x82\xd9\x47\xe4\x07\xef\x9b\xfa\xce\x79\x0b\x29\x4f\xc9\x03\x14\x61\xda\xa5\x61\x98\x3e\x8c\xb0\x1d\x45\x38\x72\xf5\xd5\x10\xfd\xd5\x66\x3c\x5b\x46\xe0\xa3\xff\xac\x44\x1c\x86\x23\xdd\x70\xce\xa3\x23\xd0\x29\x21\x13\xca\x32\x42\xd1\x2a\xaf\x59\x0e\x36\xe5\x0a\x8d\xfd\x75\xb4\xc4\x57\xc4\x70\xbe\x56\x6b\xe3\xb1\x0f\xdb\x7e\xb7\xb3\xd5\x30\x14\xa8\xe2\xeb\x56\x03\x1c\xcf\x96\x55\xdc\x7b\xaf\x06\x6c\xdb\x7a\x35\xa0\xa3\x1a\x50\x48\xb8\xd3\xa2\xb3\xac\x19\x2d\xe0\xc6\x92\xb1\x21\xdc\x66\x0c\x13\x21\x61\x39\xde\xa6\x11\x07\xe3\x22\xe7\x03\x22\x83\xcf\x6f\xae\x2a\xdf\x97\x68\xc5\xba\xd8\xf4\x60\x55\x26\x33\xef\x26\xe5\xa0\xd4\x19\x46\xd6\x94\x85\x35\x2c\xe3\xd5\x56\x4a\xe8\x1e\xe5\x53\x48\x80\x1c\xe7\x71\x50\x03\xfc\x98\xd7\x05\x6e\x3f\x04\x9d\x58\xbf\xb9\x0f\x2b\x72\xf8\xed\x7e\xba\xc2\x6a\x20\xd7\x13\x9b\x48\xaa\x66\x80\x29\xaa\xf0\x99\x69\x65\x07\xbd\x41\x18\x1c\x3f\xe3\x46\x5e\x98\x4a\x9a\x00\x29\x40\x32\x61\x44\x8c\x92\xeb\x54\x3c\x72\x32\x86\x29\xe3\xca\xaf\x58\x08\x49\x7e\x4b\x60\x24\x11\x53\x55\xa1\xb5\x11\xb9\x6d\xd5\x1f\x70\x80\x5f\x89\xa8\x79\xa6\x9b\xa2\x41\xa4\x29\x41\xe1\x05\xb7\x41\x89\xa5\x83\xab\x8d\xe7\xd3\xd7\xf5\xe6\x19\xea\xbe\x21\xec\xcc\x9e\x94\x1c\x5f\x34\x85\x8c\x2e\x6c\xa2\xf6\x84\x71\xb4\xfe\x4a\x75\x3a\x0a\x0f\xcd\xea\x4c\xa0\x90\x8d\x3e\x37\xee\x0c\xa6\x88\x04\x9a\xcc\x42\x24\xbb\x3e\x06\xec\xb9\xd6\xc7\x80\xf5\x31\x60\x7d\x0c\xd8\x6a\xeb\x63\xc0\xda\xad\x8f\x01\xdb\x4c\xd0\x21\x3b\xed\xfa\x18\xb0\xde\x2a\xb3\xda\xfa\x18\xb0\x4e\xad\x8f\x01\x7b\xb6\x1d\x1c\x8b\xee\x63\xc0\xb6\x68\x7d\x0c\xd8\x96\xad\x8f\x01\xeb\x63\xc0\xfa\x18\xb0\x3e\x06\x2c\xa0\xf5\x31\x60\xbb\xbf\x5e\xef\xfc\xe9\xde\xfa\x18\xb0\x3e\x06\x6c\xc7\xd6\xc7\x80\x2d\xb5\x3e\x06\xac\x8f\x01\x7b\xaa\xf5\x31\x60\x7d\x0c\x98\x6b\xbd\xb5\x71\xa5\xf5\x31\x60\x6b\x5a\x1f\x03\xb6\xdb\x38\xbd\x1a\x10\xd6\xd9\x8b\xa8\x01\x4a\x8b\xe2\x8e\x4d\x03\x70\x21\x63\x1d\x83\xbb\x8a\x12\x07\x1a\xa9\xc8\xe3\x8c\x25\x33\xa2\xec\x87\xde\x8e\xa5\x1c\x64\x5f\x33\x22\xac\x71\x93\x8c\xc1\xa8\x08\xe6\xb5\x8a\x90\xdb\xe4\x6a\x82\x0e\xe4\x06\x92\x9b\x39\x15\x1e\x26\x90\xb5\xaa\x27\xb4\xc5\x67\x7f\xbb\x31\x6e\x74\x97\xee\x14\x34\xe6\x23\xa1\xdc\x16\x2b\xc5\xd7\xc7\xe2\x86\xe4\x46\xa4\xca\x17\x6c\xe0\x82\x0f\x2d\x58\xeb\x08\xab\x3b\x0b\x35\x0a\xb0\x06\x07\x22\xb3\xd9\x18\xb9\x1b\x29\xc6\x7b\x43\x67\xbb\xc1\xf8\x23\x96\xb8\x00\x3d\x31\x69\x21\xae\x59\x02\x3b\x22\xad\xb5\x03\xc3\xb0\xa0\x88\x87\xe0\x62\x8e\x61\x57\x41\x81\xfb\x44\x73\xdb\x39\x72\xca\xa3\x54\xaa\xb3\x42\xd8\xff\xab\xe3\xa6\x1a\x01\x53\x9d\xfd\x28\x7b\x86\x97\x0b\x89\x92\xda\x5b\x84\xd4\x81\x44\x98\x45\x88\x8a\x8a\x29\x2b\x1d\x68\x34\xd4\x61\x46\x42\x1d\x62\x14\xd4\x3e\x22\xa0\xf6\x1e\xfd\x14\xc7\xad\x1e\xc1\xa5\x1e\x49\x22\x7d\x01\xf7\x94\x0b\xa4\xbf\x9f\x49\x50\x33\x91\x75\x66\x38\xb1\x98\xcd\x07\xc6\x59\x5e\xe6\xe6\xec\x2a\xc3\x53\xd8\xbc\x0a\xf6\x57\x9e\x65\xb8\xeb\xde\x46\x1c\x98\x07\x59\x0a\x58\x99\x9b\xb2\xcc\x6c\x2d\x04\x0b\x9d\xd1\x39\x0a\xa5\x65\x92\x00\xa4\x21\x62\x69\xd3\x5a\xfd\xfb\x51\x45\xa1\xc5\xe8\x67\x8a\xbc\x0d\xbb\x6a\xc2\xf4\x9e\x86\x39\xef\xf7\xbf\xeb\xd4\xc7\x54\x16\x71\x6e\xe9\x6f\x6f\x6f\x2e\x5a\xb7\x34\x7e\xf0\x1d\x1e\xe3\x8b\x19\x24\x0f\xb7\x2e\x94\x66\x7f\x37\x73\xb8\x99\x29\xc8\xc4\x14\x43\x30\x08\xb5\xa2\xb4\x7d\xc8\x42\xea\x25\x17\xe8\x14\x57\x11\xe4\x9c\x25\x30\x7a\x05\x43\x45\x2c\xe5\x3f\xfc\x20\x10\x74\x13\xe0\x8b\x1f\x8a\xd8\x75\x67\xc9\xa9\x3c\x0c\x0d\x1b\x95\xa3\x14\x83\x46\x33\x9a\x54\x6b\x33\x5d\x7f\xe8\x82\xc8\x38\x51\x00\x95\x42\x33\x65\x7a\x56\x8e\x47\x89\xc8\xcf\x0c\xeb\xb0\xff\x37\xce\xc4\xf8\x2c\xa7\x4a\x83\x34\x3a\x8e\xbb\xd6\x87\x89\xa1\x80\xf1\xe9\x28\x4f\x4f\x47\xbf\x0a\xa2\xe1\xca\xd9\xca\x5d\x1a\xd6\x06\x23\xc1\x18\x0c\xdf\x17\x72\xc9\x5a\x60\x26\x25\x7c\x93\x06\xdf\xdf\xa1\x45\x45\x02\xc3\x92\xf7\x12\x92\xdc\x73\x6d\x12\xc1\x21\x10\x93\xa9\x1c\x46\xd8\xf1\x8b\x85\x1c\x47\x39\xab\x91\x42\x8d\x0f\x28\xcc\xf8\x60\x74\xa1\x43\x09\x2d\x8e\x16\x56\x1c\x2b\xa4\x38\x4a\x38\x71\x8c\x50\xe2\x78\x61\xc4\x71\x42\x88\xe3\x87\x0f\xbf\x58\xe8\xf0\x17\x11\x36\x1c\xd1\x3f\x16\x29\x5c\xf8\x35\x42\x85\x0f\xd7\x06\x43\x22\x84\x07\xbf\x5e\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x3d\x84\x02\xbf\x86\xff\xff\xc5\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\x2f\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x2a\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x43\x46\x17\x77\x61\x81\xa0\xb1\x56\xe2\x7a\x25\x58\xd4\x9a\xad\xdb\x71\x0d\x33\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\x0e\xcf\x73\x4d\x0e\xc6\x3c\x6e\x71\x55\x0e\x64\xd7\x7c\x27\x1e\x89\x98\x68\xe0\xe4\x84\x71\xbf\x73\x4e\x1b\x56\x9a\xda\x3d\x12\xec\xef\x30\xbd\xbe\x7d\xe3\x07\xf9\xfa\xfc\x1e\xe8\x19\x52\xea\xa0\x3d\x5f\x8e\xc6\xe7\x5d\x5f\xee\xc1\x49\x99\xb5\xdd\x5f\xd6\x25\x16\xc7\xf7\xf5\xb6\xae\xfe\xfe\x16\xe9\xa9\x58\x11\xe5\x29\x71\xf8\x5c\x5f\xdf\x3e\x09\x0e\x75\x6f\x2b\x37\x55\x6c\x7a\x3b\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\xdd\x53\x04\xf6\xd7\xa7\x6d\xbd\x7e\xc4\x75\xaf\x6d\xfd\x52\xb4\xad\x06\x2c\xde\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x75\x22\x60\x2d\xc3\x55\xec\x82\x03\xd8\xc4\xb1\x1a\xf4\x10\xf1\xfd\x26\x65\x96\x2d\xac\x0d\xb1\x85\x80\xd9\x7d\x6b\xdd\xcf\x60\x05\x3a\x10\x5d\xa9\x6b\xa8\xab\x75\x93\x42\x0a\x27\x91\xc8\x92\x73\x23\x62\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x5b\xc0\x86\x2e\x08\x1d\x03\x3d\x67\x40\xea\xfc\xa5\x36\x21\x66\xd4\x89\x90\x09\x1b\x67\x0b\x32\xa3\x99\x51\x96\x5c\x90\xf6\x03\xcb\x32\xd7\x4d\x40\x50\x38\x68\xeb\x7a\xb6\x12\x4d\x26\xf8\x14\x27\x83\x5a\x42\xe0\x73\x01\x89\x19\x33\xc9\x80\xf2\xb2\xb0\x74\x1a\xf9\x68\x21\x4a\xe9\xe9\x0c\x8a\x8a\x6f\x8c\xce\x14\xe1\x2c\x1b\xf8\x29\x6f\x43\x60\xae\xee\xf9\xda\xa4\xac\x20\x75\xe8\x95\x8f\x4c\xc1\x00\xfb\xec\x4c\x93\xa5\xc5\x57\xed\xb7\xfb\xc6\x7e\x56\x48\x31\x67\x69\x1d\xa3\x6f\xb6\x05\xc6\xc7\x77\x1e\xeb\x13\xf6\xeb\x59\x2b\x17\x7c\xc8\x61\x4a\x51\x3c\x76\x0c\xcd\x46\x74\xda\xf1\x6d\xfc\x20\x4f\x59\x42\x35\x28\xcc\x49\x68\x41\xdb\xce\x19\xed\x4c\x89\x79\x9f\xc6\x8e\x22\x27\x5c\x10\x81\x99\x85\x25\x67\x7a\x81\x1e\xbd\x59\xa9\x49\x2a\x1e\xf9\x69\xc8\xc1\xb4\x61\x0e\x94\x8c\x41\xd3\x3a\x39\xd0\x8b\x64\x8a\x00\xa7\xe3\xcc\x9c\x3d\x8c\xf8\xbf\x5f\xbb\x01\xc8\x04\xa8\x2e\x25\x90\x29\xd5\x01\x5c\x62\x8d\x34\x6f\xd7\xf3\xe9\x6d\xc7\x94\xf3\xd7\x4d\x48\xc9\x15\x04\x0a\xb2\xd1\x54\x80\x8e\x19\xaf\xe6\x44\x8b\x52\x1f\xc8\x3d\xb2\xc9\x74\x64\x33\x77\x1a\x4a\x22\xcb\x41\x11\x51\x06\x58\xf2\x5a\xea\x9f\x1b\x2e\xa6\x86\xd7\xdb\x9d\xd6\xb6\xae\x6e\xd3\x18\x3b\xec\xba\x21\x95\x37\xf0\x09\x7c\xb8\x95\xcd\xa0\x7e\x7f\x7d\xf7\xb7\x1f\xce\xff\xe7\xe5\x0f\xdd\x16\xfe\x92\x26\xb3\x26\xb6\x38\x27\x14\x2f\x0a\x64\xf2\x33\x3a\x07\x42\x49\xc9\xd9\x7f\x97\x2e\xe4\xed\xa4\x1a\xaf\x23\x5b\x8d\x92\xde\x13\x24\xf8\x9a\x5b\xa2\x13\xe7\x88\xb1\xa6\x3f\x30\x85\x40\xd5\x48\x84\x0b\xfc\x17\x0a\xc8\x44\x8a\x7c\x49\xd1\x22\xd7\x55\x70\xdd\xc2\xdc\x30\xd4\xaa\x66\x33\x90\xdd\x24\xf2\xf7\x1f\x2f\xef\x30\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x11\x39\xe7\x0b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x19\xe1\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xce\x32\xeb\x34\xb2\xd5\x5f\xd9\x38\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x94\x25\x24\x07\x39\x05\x52\x50\x9d\xcc\x48\x4e\x17\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x46\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\xef\xd6\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xec\xed\x9b\x7f\xfd\xdd\x1f\x3a\xaa\xd7\x11\x0f\x6e\xd7\xd0\xa7\x80\x90\xa7\x76\xf8\x97\xdf\x60\x18\x74\xdd\x42\x86\x71\x3b\xc4\xee\x7c\xe4\x86\x8a\xf1\x69\x16\x6c\x00\x09\x36\x03\x86\x1a\x01\x87\xf5\x1b\xdc\x74\xb5\x05\x86\x5b\x02\x5b\x34\x74\x37\xa5\xc4\xb3\x82\xd5\x12\x9c\xb7\x7b\x39\x86\x2c\x78\x43\xb1\xbb\xba\xf1\x5c\x2a\xc4\x7e\x84\xda\x44\x65\x98\xb2\xe8\x23\x76\x58\x1b\xef\x30\x20\x6f\xc8\xbf\x93\xcf\xe4\xdf\xd1\x0a\xf6\xc7\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x09\xa5\xaf\x6e\x22\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x19\x33\x67\x8e\x80\xcf\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xa5\xec\xee\xd0\xe0\x82\xab\x49\x3b\xfa\xff\x95\xf6\x37\x0e\xfc\x9d\x50\xfa\xda\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x33\x16\xc0\x1c\x0e\xe7\xc4\x86\xc5\x89\xc6\xdb\xba\x4f\x6d\xad\x25\x9b\x3e\x5a\x64\x9c\x92\xd2\x28\x4b\x53\x88\x74\x84\xfa\x4d\x00\x15\x66\x36\xd2\x86\x30\xf0\x84\x6a\x34\xb2\xfa\x5a\xe5\x1d\xc6\x03\x67\x38\x56\x42\x79\x57\x19\xd6\x36\x09\x13\x90\xd2\xe6\x09\x8f\x17\x3e\xdd\x28\x78\xb7\x05\x71\xb9\x42\x0a\x2d\x12\xd1\x19\x36\x25\xe6\x56\xb9\x71\xb4\xe0\xdc\xa3\xaf\xb6\xf2\x8e\xff\xf9\xfd\xcd\x80\xdc\x5f\xdc\x0c\x88\x90\xe4\xee\x22\x2c\xf8\xa9\x69\x82\x39\xba\xbf\xb8\x39\xda\xeb\x0a\x34\x72\x98\xee\x2f\x6e\x3a\x74\xb2\x1a\x3e\x9b\xd3\x62\xf8\x00\x8b\x8e\xd2\x5d\x0c\x09\x73\x58\x6d\xac\x28\x2f\x64\xa7\x39\xa7\xc5\xce\xbd\x49\xa0\x29\x3b\x68\x24\x17\x9f\x75\x58\x51\x1a\x0f\xd2\x25\x17\x73\x48\xad\xd6\xec\x47\x01\x9e\x16\x82\x19\x1d\xa9\xc7\x79\x79\xaa\xf5\x38\x2f\xbb\xb7\x1e\xe7\x65\x5d\xeb\x71\x5e\x76\x68\x3d\xce\x8b\x6d\x3d\xce\x4b\x9b\x90\x43\xcc\x31\xea\x71\x5e\x9e\x6d\x3d\xce\xcb\xc6\xd6\xe3\xbc\xec\xd4\x7a\x9c\x97\xd5\xd6\xe3\xbc\x3c\xd1\x7a\x9c\x97\xaa\xf5\x38\x2f\x3d\xce\xcb\x97\xcb\xb5\x7b\x9c\x97\xe5\xd6\xe3\xbc\xf4\x38\x2f\x3d\xce\x4b\xb3\xf5\x38\x2f\x1b\x5a\x8f\xf3\xd2\xe3\xbc\xf4\x38\x2f\x4f\xb7\x1e\xe7\xa5\x73\xeb\x71\x5e\x76\x6b\x7d\xe6\xe1\x8e\xad\xc7\x79\xe9\x71\x5e\x96\x5b\x8f\xf3\xf2\x6c\x3b\x0c\xf3\x78\x8f\xf3\xd2\xe3\xbc\x3c\xd9\x7a\x9c\x97\x1e\xe7\xe5\xc9\xd6\xe3\xbc\x74\x68\x07\x67\x74\xed\x71\x5e\x7a\x9c\x97\xa7\xc6\xe8\xb5\xad\xdd\x5a\x8f\xf3\xd2\xe3\xbc\xac\xb4\x1e\xe7\x65\xb5\xf5\x38\x2f\x3d\xce\x4b\x8f\xf3\xd2\xe3\xbc\x54\xad\xc7\x79\xf9\xda\xed\x4e\x12\x14\xfb\x07\xdc\x88\x8c\x25\x8b\xe0\x6c\x9f\x5b\x50\xa2\x94\x89\xb9\xb1\xb1\x5b\x52\x60\xbf\x95\x45\x21\x48\xc8\x3e\x30\x08\x85\xdb\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\x97\x98\x82\x83\x80\x53\xf0\x2f\x78\xdd\x3d\x82\x60\xe8\xcb\x67\xdb\xe9\xeb\x66\x2c\x0d\xd6\xda\x9b\x2f\x72\x08\xe9\x9c\x4d\xd8\xa3\x6a\x17\x69\x51\x31\x5b\xb6\x71\x73\xd1\xa2\xc8\x58\x48\x62\x2c\x21\x77\x25\x4a\x17\xe0\x5c\xe0\xea\x1d\x49\x8a\x72\x40\x72\xc8\x85\x0c\x48\x8c\x88\xa0\xc1\xb5\xb6\xca\x21\xac\xd3\xad\x25\xc8\x4f\xbe\x16\x38\xff\x0b\xab\x2f\xd4\x28\x55\xd5\x5a\x31\xcf\x0e\x83\x62\xcd\xae\x26\xcb\xc1\xa8\x4c\xb7\xac\x40\xd7\x42\xdf\xba\xc3\xbd\xb7\xf5\x8a\x1c\xb1\xe0\xa7\x70\x6f\xa8\x55\x17\x22\x2f\x4a\x0d\xad\x8b\xcd\x4e\xb1\x55\x3a\x98\x0a\x65\xe8\xfb\xc9\x06\x4d\x04\x9f\xb0\xa9\xd3\xbe\xcf\x72\xca\xe9\x14\x86\xd5\x6c\x0f\x6b\xa8\x87\xb3\xce\x17\xf5\xde\x52\x41\x93\x8c\xb2\xee\x81\x83\xb1\xd8\xc4\x05\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x3c\xa8\xc2\xc6\x99\xe5\x1b\x23\xff\x95\xfd\xf1\x20\x40\x7b\xa4\x1a\x6d\x15\xa8\x18\xad\xd9\xa9\xe1\x0a\x23\x27\x34\x2b\x66\x4f\xab\x8c\x21\x29\x97\xef\x17\x9c\xe6\x2c\xf1\x07\xef\x3c\xcb\x44\x62\x4d\x35\x6d\x65\x33\xec\x4d\x2c\xf5\xe6\x95\xf2\xbc\xd4\x74\x9c\xc1\x88\x5c\x59\xe4\x0a\xc1\xb3\x85\x39\x96\x0a\xb4\x8f\x5c\x70\x67\x22\x4c\xc1\x0c\x09\x8b\x0d\x0c\x89\x5d\x2b\xab\xe3\x5e\xb3\x50\x1b\xc0\x0d\x87\x13\x1c\x08\x70\x2d\x17\x66\x5b\xde\x88\xf4\xce\xec\xcc\xd6\xd3\xc1\x08\x1c\x81\x91\xb0\x31\xa2\x60\x03\x23\x60\xe3\xc4\xad\x86\xc7\xac\xc6\x8d\x57\xad\x3d\x0b\x16\x40\xa8\x99\x08\xd4\xda\x16\x85\x48\x47\x6b\x38\x16\x11\x93\x40\x0a\xcc\x88\x37\x22\x35\xb2\x94\x04\xcb\xb6\xaa\x33\x6a\xed\x8a\x57\x86\xb8\x07\x34\x04\x52\x5d\x0b\x59\x74\x4e\x59\x66\x0e\x70\x20\x01\xab\x60\x8c\x61\xce\x9a\x48\x2e\x0c\x17\xb3\x7f\x48\x9b\xc5\x65\x7b\xb5\x12\xc6\x92\x99\x50\xc0\x91\x5f\xd2\x2a\xb1\xa7\x4a\x3b\x70\x2c\x26\xb5\x57\x74\x68\x70\xf1\xd5\x84\x40\x5e\xe8\xc5\x80\xc0\x1c\xe4\x42\xcf\x30\x08\xa1\x82\x13\x45\xb6\xc6\x14\xc9\x69\xda\xd8\x1d\x03\x22\xbc\x5d\x3a\x70\x78\xbc\x1f\x9c\xaa\x56\x66\xda\x2a\x6e\x4c\x55\xd9\x15\xfb\xde\x35\xb1\x51\x6e\x48\x28\xd3\x8c\x89\x52\x43\x10\x61\x35\x67\xdd\xf0\x6c\x49\xc4\xb3\xf0\x03\x52\xd1\xc8\x28\x31\x5b\x22\xa7\x9f\xd1\x6a\x49\x73\x51\x72\x6d\xe1\x6b\xac\x22\x51\x09\x7f\x36\xef\xe6\x15\xc3\xe8\x5e\x54\xe4\x27\x71\xae\x76\x9a\x7a\xc4\x8a\x9b\x18\xe9\xcb\x54\x6b\x90\xfc\x1d\xf9\x5f\x27\xff\xf9\xdb\x9f\x87\xa7\x7f\x3a\x39\xf9\xf1\xcd\xf0\xdf\x7e\xfa\xed\xc9\x7f\x8e\xf0\x1f\xff\x7c\xfa\xa7\xd3\x9f\xfd\x1f\xbf\x3d\x3d\x3d\x39\xf9\xf1\xfb\x0f\xdf\xde\xdf\x5c\xfe\xc4\x4e\x7f\xfe\x91\x97\xf9\x83\xfd\xeb\xe7\x93\x1f\xe1\xf2\xa7\x2d\x3b\x39\x3d\xfd\xd3\x6f\xba\x3b\x25\x43\x3d\xf0\xf1\xfc\xef\x91\xbc\xef\x2f\xe2\x7b\x77\x3c\x76\xef\x87\xdf\x5d\x81\x2b\xc7\xdf\x39\x2d\x9e\x3a\xfe\x32\xd8\x54\x73\x35\xa9\xc7\x67\x8a\x88\x9c\x69\x0d\xa9\xbb\x7b\x1b\x90\x38\x4b\x66\x22\xc7\xb0\x10\xcd\x8a\xe2\xed\xdd\x80\x66\xa9\xad\x4b\x9d\xc9\xaa\xee\x57\x34\x8c\x71\xc2\xf2\x22\x83\x1c\xb8\x46\xc6\x33\xf4\x2a\x2f\x5a\x19\x47\xf5\x1b\x24\xd6\x0e\x02\x9f\x13\x80\xd4\x11\xd9\xf3\xc6\x46\xeb\x79\x63\xcf\x1b\x9f\x6b\xc1\xa6\xf2\x18\x8c\xf1\xb6\x49\x84\x33\x71\x29\x2f\x29\xa3\xe1\xbc\x42\x4e\x10\x13\x8c\x9f\x98\xb3\xb4\xa4\x59\x13\x60\xd6\x63\x8e\x76\xe3\x00\x0d\xd3\x4e\x4e\x17\x2b\x96\x1c\xc6\x59\x13\xcd\x76\x50\x45\xfd\xe0\x83\x4e\x2e\xab\x3d\xce\x47\xe7\xd9\x23\x5d\xa8\x8e\xa0\x97\xdf\x08\x89\x81\x24\x4b\x83\x12\x21\x7d\x7c\x51\x53\xc5\x6d\x5b\xf8\xbb\x79\x08\xd7\x4d\x74\x1b\xa2\xc2\x29\xd9\xc7\xaa\x7a\xd0\xfb\x91\xdc\x44\xd4\x59\x21\x66\x9f\x77\x7b\xf1\x3b\xd0\xda\x19\x01\x97\xb6\x04\xad\xe7\xb4\x72\x8b\xb6\xa7\xc7\x86\x12\x21\xd4\xac\xf9\x72\x22\xcc\x9a\x60\x91\x86\xc9\x04\x92\x8e\x5a\xb0\x85\xf4\x58\x33\x8e\x0d\x6f\xd7\x8c\x97\x34\xcb\x16\x7e\x4e\x20\x25\x82\x77\x1a\x08\x3e\x33\x4d\x4a\xae\x59\x66\x36\x13\x91\x30\x2d\x33\xda\x34\x20\xba\x37\xf3\x51\x77\xe9\x88\x7c\xe4\x09\x34\x1f\xee\x66\xf8\x5e\x1a\xc0\x08\x1d\x19\x68\x48\x07\xd8\xf5\xf2\x0e\xc4\xb8\xb5\x16\xc7\xa8\x96\xa5\xd3\xf0\x7e\x2e\xab\xb8\xa4\x91\x3d\x88\x55\xd0\x04\x49\xd9\x64\x62\x46\x46\x25\x9d\x0b\x99\xd3\x55\xaa\x28\x4f\x3b\x8d\x6e\x24\x20\xcc\x56\x69\x82\x06\x63\xa1\x98\x23\xc5\x52\x48\xa8\x3c\x6a\x96\x18\x39\xcf\xf4\x4c\x94\xd3\x59\xbd\x2b\xc2\xa6\x9c\x28\x8d\xd1\x5a\x66\x32\x95\xb7\x78\x2c\x6d\x36\x65\x64\x1d\x9e\x80\x15\xc9\x04\xd8\xe3\xfe\x48\x3b\x8e\xbd\x12\x51\x60\x43\xc4\xed\x9a\xfb\x14\x2e\x0c\x09\x84\xb4\x91\x6f\xc7\xe1\xb3\x8e\xf0\xc2\x23\x72\x65\xf1\x33\x06\xed\x5e\x5b\x53\x62\x27\xa3\x11\x12\xe7\x83\x3b\x3b\xc6\x03\x2e\x0d\xc0\xaa\x8c\x35\x84\x39\xb6\x9d\x53\xbe\xf0\x09\x22\x18\xb2\x66\x13\xdb\xaa\x9c\x95\xac\x9b\xed\xbd\x3a\x4b\xaf\x5e\xb5\x47\x41\x52\x4a\xa6\x17\x17\x82\x6b\xf8\xdc\x89\xf7\xc5\xb8\xd5\xef\xda\x64\xb4\xee\x75\x4f\x22\x11\x85\xc5\x96\x5c\x2a\xdc\x34\x13\x65\x96\x22\xc2\x6e\xc9\x91\xed\x74\xbb\x51\xae\x26\xe6\x0a\xb7\xfb\x0d\x6f\x4c\x74\xa7\x2d\x13\xe6\x23\x45\x6d\xc0\xec\x7f\x97\x6c\x4e\x33\xe0\xba\xf1\x8b\x1b\x8c\x1d\x6c\xfe\xe8\x25\x7d\xae\x9a\xaa\x87\x5a\xc3\x80\x61\x21\xd2\x5a\xa1\x38\xf3\x53\x87\x1f\xc1\x67\xfd\x05\xfa\x5b\x51\x60\xba\x91\x6c\xce\x32\x98\xc2\xa5\x4a\x68\x86\x7a\xd4\xbe\x95\xf3\xf3\x0d\x74\xe1\xce\x94\x22\x53\x46\x00\x33\xca\xaa\x11\x35\x6d\xe4\x34\x3a\xfe\xa6\x94\x71\xac\x3a\x14\xe0\x1c\x72\x83\x2a\x1b\xba\x6d\xf4\xed\x82\x4a\xb3\x0b\x7d\x88\xb6\xbd\x1a\xc7\x42\x64\x0e\xa6\x36\x5b\xd4\x74\xb1\xee\x5e\x14\xe4\xc5\xe2\x6f\x1c\x1e\xff\x66\xa8\x50\x64\x92\xd1\x69\x7d\x35\x83\x5e\xc9\x77\x09\x8f\x1a\xdf\x38\xd1\x88\xc1\x5a\x1a\xc1\xc6\x48\x15\x75\x3c\x7d\x93\x83\x77\x57\xe8\xde\x9e\x22\x3f\xa1\x8a\x54\x63\x77\x13\x1d\x4c\xfb\xdd\x29\xde\x13\x17\xe7\x37\x7f\xbb\xfb\xeb\xdd\xdf\xce\xdf\x7f\xb8\xba\xee\x1e\x35\x2b\x34\x58\xeb\x4a\x43\xba\x4f\xaa\x40\x0f\xb3\x0a\x55\xac\xd0\x48\xa8\x11\xba\x4e\x10\xcc\x85\xa7\xe2\x31\xd0\xbf\x6c\xf6\x14\xd0\x6e\x92\x2b\x2d\x8a\x73\x99\x0b\x79\x23\xc5\x84\x65\x9d\x5d\x93\xb1\x4e\xf0\x12\x39\xde\xd3\x74\xee\x3e\xae\xaf\x1b\x8b\x2f\xb0\x1a\xe7\xd0\xb8\x32\x18\x66\xb1\x9b\x6e\xba\x5b\xb6\x5a\x39\x08\x36\x23\x62\x89\xc4\xee\x87\x68\xaf\x7b\x66\xef\xd9\x9b\x86\x8c\x8e\x3f\x8f\xe1\x89\xcf\x44\x42\x33\xac\x5f\x14\xb6\xf1\x49\x64\x27\xeb\x32\x5d\x8d\x6c\x13\xea\xb7\x33\xc9\x04\x4d\x51\x59\x75\xcc\x3f\x05\x8f\xaa\xed\xc5\x2e\x74\x9c\x07\x11\x72\x6f\x23\xfd\x71\x3c\x9f\x1e\x53\x48\xa8\xa4\x9a\xa5\xe1\x05\xe9\x5e\x6d\xd0\xb7\x0f\xed\x30\x04\xf7\x96\xad\x44\xce\xd0\x33\x57\x0d\xe3\x0e\x18\x9b\xa0\x05\x04\xcd\x40\x6c\x82\x9b\x12\x0d\x40\x3f\xf8\x65\x08\x28\x7c\x12\x29\x12\x00\x3b\x39\x90\xdd\x69\xe7\xa7\xda\x91\x36\x4c\xf9\x81\x99\x19\x9c\xd4\x4c\xda\x6f\x1b\x2f\x83\xd8\x58\xe5\xc0\xfd\xf8\x09\x4b\x6c\x79\xfe\x4f\x65\x30\x2e\x58\xb5\xc4\x64\xd8\x38\x5a\x85\x84\xe1\xea\xf1\x0a\x0d\x5c\xb8\x2d\xb9\x66\x39\x78\xec\x8b\xe1\x92\x4c\x24\xed\xd7\xc7\xaa\x42\x9a\x8d\xb2\xd1\x09\xf9\x33\xc7\xf3\xca\x21\x25\x43\xc2\x45\xbd\x44\xc0\x27\x42\x26\xe8\xa4\xd9\xeb\x06\x4f\x68\x41\xc7\x2c\x63\x21\xcc\x3c\xd6\x06\xc7\xc2\x0d\x0d\x7a\xd0\x9c\x94\xa6\x67\xa9\x14\x85\xbd\x89\x7d\x52\x6a\x78\x60\x60\x3b\xf9\xa9\x89\x31\x8c\x02\xfb\xa4\x4d\xc8\x54\x52\xae\x6b\x43\xee\xca\xc6\xf9\x25\xca\x20\x31\x84\x00\x9a\xc6\x2b\x81\x72\x9e\x1a\x9e\xd1\x5c\xb6\xe0\x73\x75\x68\x70\xaa\x17\xfe\xe5\x1a\xd9\x4f\xe4\xe6\xe3\xdd\xd5\xff\xb7\x74\x6e\xba\x8b\x76\xb6\x1d\x36\x98\xa2\xe1\x07\xd1\xb6\xcd\xad\xab\x40\xd5\x6f\x9c\xaf\x7b\xe3\x54\x06\xa2\xbd\x23\x41\xdd\x96\xbc\x5d\x05\xbf\x26\x8d\xe4\x41\xb2\xce\x4d\x05\x9a\xd0\xee\xb5\xe9\xeb\x91\x40\xcc\x23\x5c\x33\xf4\xbc\x35\xac\xb5\x5a\xd8\x22\x4b\x51\xea\xb5\x36\x6f\xd7\x09\xcd\xd4\x97\x7a\x45\x86\x98\x76\x0a\x29\x92\x0f\xa2\xe4\x71\xa0\xa5\x02\x76\x5c\x45\x08\x49\x81\x0b\xed\xac\x29\xa8\x4b\x88\x09\x7e\x4b\x6c\xd8\x54\x03\x35\xb2\x25\xe7\x04\x88\x59\xf7\x0d\xd1\xaa\xf2\xef\x7b\x39\xdc\xea\x2f\xa5\x82\x65\xff\x85\x93\xab\xea\x28\xaa\x89\xe8\x1e\x3c\x22\x81\xa6\xa8\x60\x16\x54\xcf\x2c\x9c\x59\x4e\xd5\x03\xa4\xf6\x83\x40\x28\x87\x2a\x07\x07\x5d\xfc\x7e\xa6\xef\xcd\xe4\xfa\xb4\x19\x34\x08\x5b\x50\x37\x4c\xd4\x09\x51\xc5\xf6\x7a\x1a\x02\x18\xbb\x59\x84\x8f\x3c\x5b\xdc\x0a\xa1\xbf\xa9\xaa\xb5\xed\xfb\x64\xfc\xc5\xb9\x23\xda\x46\x4c\xb4\x4b\x53\x24\x79\x88\x1b\x07\xf9\x62\xa3\xc6\x5c\x28\x5b\x34\x0b\xf2\x4b\xe5\x8a\xb2\xe4\xe7\xea\x5b\x29\xca\xce\x32\x5c\x4c\x7d\xf3\xdb\xab\xf7\x78\xf1\x95\x0e\xed\x87\x6b\xb9\xc0\xe2\xa3\xde\xe2\x15\xd1\x69\xf3\x67\x87\xab\xd4\xe4\x6c\xc1\x10\x2a\x84\x7c\xa0\x0b\x42\x33\x25\x2a\x93\x1a\x5f\xe7\x6e\xf5\xbe\x5c\xf3\xf5\x58\xe8\xd9\x8a\x13\xb7\x6b\x14\x88\x69\xab\xe3\x0d\x1a\xa0\x41\x75\x7e\x36\xe3\x2b\xc3\x6a\x4c\x2c\x2a\x24\x24\x90\x02\x4f\xbe\xd4\x13\xb1\x6f\x0c\x1b\x3c\x55\xd7\x82\x1b\xf6\xba\xef\x73\x75\x55\xd9\x27\xdd\x6a\x34\x4f\x11\x9a\xb2\x9d\x13\x91\x62\x98\x1e\x32\xd7\x52\x85\x64\x7d\x5d\x4d\xd0\xeb\x69\x37\xdd\xf7\xe5\x18\x32\xb3\xd8\x2c\xcb\xcc\x0e\x64\x29\xd5\x36\x34\x81\xe5\x74\x0a\x84\xea\xea\x10\x6a\x41\x80\xab\x52\xba\x7d\xd3\x31\x40\xc7\xb4\x2a\xb6\xc8\xbd\xda\x9f\xaf\xde\x93\x37\xe4\xc4\xbc\xdb\x29\x4a\x1c\x13\xca\x32\x84\x90\xc2\xe0\xbf\x25\x97\xec\xc4\x87\x27\x05\x4d\x01\xf2\x11\x22\xa4\xbd\x5a\x06\x84\x0b\xa2\xca\x64\xe6\xe7\x80\x09\x5e\x59\x84\x1d\x9e\x70\x50\x2e\x4c\xcf\x76\xe2\xdd\x87\x7f\x56\x20\xf7\x7d\x6c\xcd\x75\xf8\xe7\x57\xbc\x0e\x9b\x2a\xa2\x39\xfe\xed\x05\xb3\x67\x35\x07\x4d\x53\xaa\xa9\xbb\x26\xfd\x03\xfd\xae\xed\x2f\xcb\x80\xcb\x52\xc1\x0f\x8c\x97\x9f\x2d\x62\xe7\x41\xb8\x3d\xee\x2e\x91\x22\x92\xf8\x85\x16\x0d\xbf\x9d\xf7\x50\x44\x48\x8f\xbe\x6a\x1d\xa3\xc1\x06\xad\x1b\x6f\x09\x6a\xe1\x1f\xc0\x28\x42\x94\xa7\x22\x5f\x21\x72\x22\x24\x01\x9a\xcc\x3a\x53\xd3\x88\x1a\xe9\x0f\xa6\x6b\xbf\x6c\x87\x50\x06\x73\xc8\xa2\xd9\xf6\x7f\x30\xbd\x99\xc9\xf1\x3b\x17\xbb\x27\x19\x1d\x43\xe6\x00\x5b\x2c\x8a\x57\xc4\x13\x16\xc9\x06\x2e\x45\xc4\x90\x98\x5b\x61\x23\xb9\x68\x35\x11\xa6\xfb\x2f\x62\x1e\xa2\x06\x5f\xdc\xbb\xe8\x92\x7a\x1e\xd0\x06\xfa\x25\xcc\x43\x19\x20\x20\x92\xe5\x79\x30\xd2\x66\x7b\x1e\x50\xfe\x3a\xf4\x79\x50\x90\x24\x22\x2f\x0e\x24\x52\xf2\xde\x46\xe1\x1b\x8a\xb6\x8d\x8a\x6c\x3f\x4c\x83\xc2\x9d\x1d\x0e\x33\xd5\xf6\x1e\xf4\x60\xcc\xff\x57\xe3\x3a\x47\x6e\xb7\x7c\xc7\xbb\xd1\x83\x23\x32\xab\x11\x5d\x87\xbf\xc4\x1b\xaf\x0f\xc3\x6c\xb5\x57\x0f\xc3\x6c\x60\xb9\x51\x34\xcf\xb7\x42\x22\xbf\x86\x60\x4c\xa3\x04\xe0\xbc\x02\xc7\x84\xb2\x82\xea\xd9\x80\x48\xc8\x2c\x42\xba\x63\xcf\x0f\xd6\xe2\x75\x8c\x1c\xc7\x13\xe4\xd9\x4d\x1d\xb3\x6a\xc1\xdc\xa2\xc6\x6e\xae\x8b\xd7\xb4\xcf\x5c\x7f\xbc\x6f\x26\x00\x53\xbe\xb0\x30\x05\x01\xe9\xad\xb6\x1d\x9e\x58\xf1\x92\x31\x9d\xcb\xab\xf8\xd2\x21\x9d\x41\xfd\xad\x8f\xe8\x7c\xbd\x53\xba\x5d\x94\xe7\x72\x8c\x67\x54\x12\x96\x03\x3e\x57\xc7\x88\xb0\x72\xc1\x47\xc0\x5d\x9d\x07\x64\x00\xf9\x8b\xa5\xc8\x6b\xd9\x89\x61\x1c\x9a\xf1\xa9\x6a\x1a\x41\x68\x96\x45\x89\x49\x58\x67\x05\xf1\xa7\xa0\x42\x33\x5b\xb5\x06\xb4\xab\x6d\x84\x8c\xfe\x8c\x05\xe3\xcb\xb6\x44\x64\x46\xa3\xf8\xc2\xed\x10\xd3\x5c\xd1\x0b\x69\x66\x50\x33\x9a\xdd\x15\x90\x1c\xca\x6d\xf1\xed\x87\xbb\xf3\x36\x65\x28\x0b\x3b\xec\x46\xc0\xef\x09\x4d\x73\xa6\x14\x3a\x7c\x60\x3c\x13\xe2\x21\x68\xc8\x13\x9f\x6a\x3b\x65\x7a\x56\x8e\x47\x89\xc8\x1b\x59\xb7\x43\xc5\xa6\xea\xcc\x71\x94\xa1\x99\xb8\x53\xc2\x78\x56\x65\x2a\xa3\xb5\x90\x6b\xe5\x3c\x08\xc1\x2f\x4f\x92\xea\xed\x71\xeb\x61\x7e\x4a\x15\x9a\xbd\x3a\x3d\x08\xb0\x89\x9b\x77\xef\x52\xc7\xea\xae\x0a\xc3\xc1\x5f\xda\x59\x1b\xde\xbd\x09\x16\xe9\xbc\x38\x6b\xe7\xd1\x2a\xaf\x7b\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\xef\x6a\x92\x48\x0a\x16\x44\x04\x10\xcf\x8b\x6e\xcc\xb9\x47\xf7\xf6\x31\xd6\x12\x74\x3f\x3d\x8e\x85\x6f\x7a\x9e\x65\x66\x21\xa9\x03\x94\x69\x44\x77\xa2\x6a\x52\x61\xb8\x28\xb3\xe2\x16\xbe\xc5\x28\x0b\xcd\xb7\x08\xaf\xb9\x7f\xc2\xb4\x47\xcf\xf1\xf0\x3d\x5a\xd8\xb1\x29\xc9\xd9\x67\x43\x61\x73\xc4\x36\xde\x08\x3a\xfe\xd7\x7f\x1d\x50\x5a\x89\x60\xf0\x41\x05\xdb\x35\x30\x2b\xd4\x1c\xc4\x27\x47\x6b\x73\x6d\x99\x2f\xae\x41\x1b\x45\xcd\xce\x5b\xd3\xfb\x60\x14\x2b\x59\x46\x38\x0c\x21\x9e\x61\xd2\xf4\x0e\x47\xe5\x14\x81\xe7\x01\x3d\xc5\x8e\x26\x23\x83\x78\xe1\xed\xb5\x3c\xc7\x64\x4d\xfa\xce\xab\x79\x90\xc9\xf6\x5e\xe4\x17\xf4\x55\x91\x43\xf1\x57\x85\x42\xad\x34\x60\x63\xf6\x86\xb3\xd2\x84\xae\x61\xab\xc1\x4b\x37\x22\x5d\x41\xb4\xf1\x45\xe7\xbb\x97\x18\x31\x9b\xa3\x56\x41\xb8\x70\xe6\x91\x46\xdd\x77\xf8\x0c\x49\xa9\x21\x75\xc0\x56\xce\xa4\x6c\x41\x71\xda\xd4\x74\xa6\xc0\x27\xe9\xbb\x8a\x93\x6a\x50\xa3\x81\x3b\x5d\xa7\x82\xe6\x1a\x90\xff\x42\x2e\xe9\x70\x2c\xeb\x52\xf5\x37\xd5\xcf\xbb\x4e\x05\xc6\x51\x27\x94\x7b\xdd\x0a\x2b\x9e\x5b\x0b\xb7\x03\xb0\x72\x38\x1e\x63\x20\x05\x95\x34\x37\x77\xb0\x22\x6e\x79\xc6\x30\x65\x36\x2d\xb0\x71\x29\x56\x08\x58\xdd\x10\xdd\x50\xb1\x61\x9a\xe4\x6c\x3a\xb3\xa7\x85\x50\x2c\x0d\x49\x7c\xdc\x58\x26\x68\x4a\x90\xb1\x08\x49\x1e\xa9\xcc\x8d\x2c\x40\x93\x19\x06\xa1\x51\x4e\xd2\xd2\x9c\x07\x82\x78\x4d\x8b\xa1\xd2\x54\x1b\x1d\x13\x64\x80\x0d\xce\x4f\xd3\x1e\x8a\x97\xbc\x74\x61\xb6\x3d\xe3\xe9\x98\x93\x16\xc5\x0a\x72\xf9\x19\x92\xa5\xd2\xdf\x79\x8e\x10\x7f\xc2\x1f\x67\x8f\x54\x16\x2c\x0c\x1e\x88\xaa\xec\xde\xf0\x50\x64\x93\x0b\x37\xe1\xcc\x6b\x9f\xf6\x4f\xa3\x8f\xb6\x17\x41\x79\x27\x56\x03\xb7\xd7\xfc\x69\xb6\xba\x39\xb9\x16\x23\x48\xc8\xaa\x8e\x5c\x10\x59\x9e\x0e\xac\x4c\x25\x84\x26\x27\xc7\x67\xc7\xa7\x2b\x7b\xe1\x58\x35\xd3\x0c\x6c\x46\x74\xfd\x42\x8a\xe5\x45\xb6\xc0\x77\x38\xb6\xc5\xa8\x02\x8a\xbc\x9a\xe6\x03\x56\xab\x0a\x0c\x6a\x06\x59\x36\x20\xca\x88\xbf\xd4\x83\xdf\xda\x4f\xcd\x43\x5a\x96\x89\x35\x93\x9d\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xb6\x0e\x0f\x72\x8f\x3a\x64\x10\x4d\x15\x11\x0b\x51\x62\xbd\x64\xbb\x6c\x15\x5e\x72\x42\x8d\xfa\x53\x5a\x19\xdd\x82\x6e\x40\x16\x50\xff\xd7\xb4\xcb\xcf\x4c\x1b\x51\x44\x97\x68\xa6\x78\x63\x35\x05\x30\xec\xd5\x5c\x78\xe6\xa6\x3b\x9b\x01\xcd\xf4\x6c\x51\x69\x2f\xb6\x14\xad\x22\x25\x77\xdf\x84\xcb\x50\x07\x90\x36\x7a\xb8\x09\x9c\xae\x22\xf6\xfd\x4c\x82\x9a\x89\x6c\xef\x69\x9c\xbe\x4c\x6a\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\xb9\x52\xad\xc2\x01\x9e\x9a\x53\x26\x21\x75\xc2\x92\x43\x4f\x9c\xd1\x39\x4a\x0a\x46\x9e\x83\x34\x44\x35\x69\xea\x44\xbf\x8f\x59\xc8\x75\xff\x35\x53\x4d\x9b\xca\x22\xce\x2d\xfd\xed\xed\xcd\x45\xeb\x96\xc6\x0f\xbe\xc3\x63\x7c\x31\x83\xe4\xe1\x36\xac\xa0\xc8\x81\x84\x16\x14\x42\xee\x53\x30\x30\xc3\x47\x93\x0a\x6e\x84\xd4\x84\x57\xa5\x91\xcd\xd9\x9a\xe2\x2a\x82\x9c\xb3\x04\x46\xbe\x6c\xb2\x77\xce\xfb\x02\x38\x94\x4f\x81\xbc\x35\x07\xe2\x8f\x7f\xf8\xc3\xef\xff\x10\xce\xa3\xc3\x91\xcc\xc3\x0f\x02\xc1\x60\x28\x7c\xf1\x43\x11\xbb\xee\x2c\x39\xeb\x8c\xcd\x8e\x52\x54\xea\x32\x9a\x54\x6b\x33\x5d\x7f\xe8\xc2\xac\x92\x0a\x80\xac\x71\x57\x18\xd6\x61\xff\x6f\x9c\x89\xf1\x59\x4e\x95\x06\x69\x74\x1c\x77\xad\x0f\x13\x43\x01\xe3\xd3\x51\x9e\x9e\x06\x54\xb8\x23\x0d\xb5\x7a\x05\x5b\xbc\x05\x33\xb3\x01\x27\xdc\x4c\xca\xde\x4d\xf0\xc4\x53\xf9\x8e\x1c\x75\x03\xa6\x36\x4b\xf0\x2d\xc4\xc9\x44\xfb\xee\xfe\xfe\xe6\x5b\xd0\x4d\x86\xcd\xf1\x43\xf2\xed\xe5\x7d\x55\xf1\xca\xec\x2e\x9b\xd4\xd4\x73\xed\x10\xae\x3d\x13\x61\x25\xcf\x62\xfb\x5d\x2c\x2b\x41\x98\x6d\xce\x21\x31\x0b\x3d\x68\x15\x57\xf1\x71\x88\x57\x37\x23\xf2\x57\x51\xa2\xc8\x45\xc7\xd9\x82\x3c\x52\x8b\x68\xa0\x20\x8c\xa7\x1c\x19\x32\x8e\x0c\xd7\x32\xbb\xfa\x3b\xa0\xa9\x2d\x97\x80\xa6\x9d\xbd\x9f\xd5\x06\x4d\xd1\x96\xed\xa2\x54\x5a\xe4\x64\xe6\x5e\xd5\xce\x61\x5d\x53\xce\xca\x46\xf6\x08\xa2\xef\x47\x11\x09\x85\xd5\x96\xdc\x6f\xbe\x0a\x5d\x68\x85\x0b\xd9\x79\x6e\x54\x1e\xa2\x24\x69\x4e\x95\x13\xf4\xd1\x84\xc9\x1c\x8f\xea\x6c\x12\xab\x5b\x94\x02\x9e\x24\x52\x11\x4f\x12\x5e\xc8\xd3\x77\x12\xee\x84\x8c\x53\x12\x94\x44\x29\x0b\x4a\xa2\x57\x7b\x24\xce\xd5\xe6\x36\x97\x0d\xc0\x31\x84\x86\xa2\x12\x12\x6f\x4c\xae\x6a\x71\x50\x2e\x38\x4b\xac\x3b\x83\x94\x85\xe0\x44\x94\xba\x28\x35\x9a\x82\x12\xaa\x60\x38\xa7\x92\x19\x86\x6a\x6b\x2a\x57\x91\x50\xdc\x9c\x76\x2d\x04\xda\x49\x2a\xa7\xb3\xa5\x38\x9c\xcc\x48\xd2\x8c\x69\xb8\xd9\x22\xaf\xf0\xca\xe2\x84\xef\x68\x72\xd0\x36\x18\x62\xcb\x58\xcd\xe2\xa9\x75\x54\xcf\x30\xb2\x0f\x7d\x59\x3e\x30\x14\x19\xa7\x51\x1b\x0e\x20\xf1\x26\xaa\x16\x1b\xc8\x12\xd0\xdf\x2e\xe4\x92\x1e\x6c\x28\x5c\x9d\xc3\x48\xb1\x26\x2f\xaf\x56\x37\x4b\x20\x8f\xc1\xc8\xf6\x57\xe7\xd7\xe7\x7f\xbb\xfb\x74\xf1\xb7\xeb\xf3\x0f\x97\x21\x5d\x07\x97\x2f\x8b\x59\xc0\x2c\x5a\x09\xb3\x17\x2a\xf0\x68\x9a\x4a\x66\x70\x38\x61\x26\x77\x48\x4d\x13\x94\xcc\xe9\x00\x8d\xd2\x3a\x61\x28\x75\x64\xc9\x68\x6a\x18\xcf\x5e\x39\x8e\x8b\x2a\x78\x0f\x19\x5d\xdc\x41\x22\x78\xba\xf7\xe8\xec\xeb\x8a\xd9\x28\x4b\x50\x55\x51\x08\x96\x10\xb3\x7c\x0d\x2f\x57\x07\xc9\xc7\x07\x34\x43\x1a\xec\xfb\x75\xf6\x5a\x93\xc3\xf3\x5c\x93\x83\x31\x8f\x17\x20\x19\x46\x04\x1d\xc2\xae\xf9\x4e\x3c\xba\xe2\x60\x27\x8c\xfb\x9d\x73\xda\xb0\xd2\xd4\xee\x91\x70\x34\x35\x2d\xc8\xdb\x37\x7e\x90\xaf\xcf\xef\xe1\x22\x7d\x0e\xda\xf3\xe5\x68\x7c\xde\xf5\x55\x87\x2d\xb5\xdd\x5f\x21\xf1\x43\x64\x89\x8d\xbf\x1d\x55\x79\x6a\x6f\x91\x9e\x8a\x15\x51\x9e\xfa\x90\xb3\xaf\x6f\x9f\xe8\xa4\xb8\x13\xc9\x43\x24\xb3\xeb\xfd\xc5\x8d\xed\x6d\x29\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\x3d\xb6\x69\x5d\x34\x7b\xb7\xb3\x01\xf5\xb8\xd7\xb6\xea\xe6\x05\x1f\xd9\xae\x80\xd2\x6b\x5b\x1b\x5a\xaf\x6d\xed\xd0\x7c\x25\x5a\x26\xf8\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x24\x75\xf5\xd9\x49\x2d\xc3\x55\xec\x82\x03\xa4\x96\x7f\xf8\xa2\xba\x64\x6a\xde\xc4\x86\x47\xa3\x0d\xb1\x0e\x2c\x2e\x65\x80\x98\x77\x3f\x73\x5d\x3b\x11\xd7\x3b\x99\xd7\x51\x57\xeb\x26\x45\x05\x86\xee\xab\x86\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x9a\xe9\xf2\xb5\x9c\x2d\x88\x96\x2f\xbd\x57\x13\x62\x46\x9d\x08\x99\xb0\x71\xb6\x20\x33\x9a\x19\x65\x09\x4b\x02\x53\xf2\x80\xa5\x6c\xb1\x9b\xee\x13\x75\x07\x2e\x57\xd3\x4a\x34\x99\xe0\x53\x9c\x0c\xea\x72\x32\x3e\x17\x90\x98\x31\x93\x0c\x28\x2f\x0b\x4b\xa7\x91\x8f\x16\xa2\x8c\x90\x96\xe1\x1d\xdf\x95\x3c\xc5\x99\x83\x1f\xb1\x85\xdb\x9e\xdc\xf3\xed\xe4\x5a\xf2\x51\xcf\x40\x3e\x32\x05\x83\xee\xa5\x6b\x89\x37\xfb\x2e\x95\x91\xb3\x9f\x55\x10\x2a\x2e\x73\xd0\x6c\x0b\x4c\x65\xed\x3c\xd6\x27\xec\xd7\xb3\x56\x2e\xf8\x90\xc3\xd4\x02\x35\x38\x86\x66\x23\x3a\xed\xf8\x36\x7e\xb0\xca\x36\x50\x5a\x14\xad\xba\xbd\x73\x46\x3b\x53\x82\xa0\x10\xf5\x8e\x22\x27\x5c\x10\x51\x98\xab\xab\xe4\x4c\x2f\xd0\xa3\xe7\x4b\x46\x07\xe4\x5b\xdd\xbb\x30\x07\x4a\xc6\xa0\xa9\xb3\x81\x9b\x43\x50\x61\xa2\x23\xdc\xb9\x39\x7b\x98\x24\x70\xbf\x76\x03\x54\x30\xe9\x53\xaa\x03\xb8\xc4\x1a\x69\xde\xae\xe7\xd3\xdb\x8e\x29\xe7\xaf\x0b\xc4\x61\x3e\x0c\x64\x43\x73\xa2\x45\xa9\x0f\xe4\x1e\xd9\x64\x3a\xb2\x10\x17\x0d\x25\x91\xe5\xa0\x88\x28\x23\xd5\x9b\x78\xeb\x86\x8b\xa9\xe1\xf5\x76\xa7\xb5\x4d\xe9\x94\x75\xaa\x3a\x1c\x63\x8b\x6d\x00\xef\x77\x79\xb8\x0d\xfc\xca\x71\x39\x99\x80\xc4\x9b\x0e\x09\x5e\x09\xbb\xaf\xea\x78\xf9\x3b\xac\x9b\xf1\xd6\x05\x7c\x81\x1e\x60\xed\x00\x07\x26\xb1\x61\x48\x07\xb2\x89\x65\x7a\x25\x28\xc4\x82\xe7\xe4\xf2\xe3\x37\xdd\xb6\x68\x8c\xca\x02\x61\x29\xab\xf8\x9e\x1f\x79\xb7\x98\xc4\xb8\xfb\x61\x1d\xea\x8b\xdb\x16\x49\x26\x94\x4b\x8f\xc6\x75\x49\x66\x94\x73\xf0\xc6\x28\xa6\xd1\x92\x3d\x06\xe0\x44\x14\x60\x83\xf2\x3a\x11\x43\x89\x62\x7c\x9a\x01\xa1\x5a\xd3\x64\x36\x32\xd4\x71\xbf\x17\xea\x3c\x64\xf7\x89\xd2\x12\x68\x6e\xf7\x84\x84\x9c\x32\x3b\x3c\xa1\x89\x14\x4a\x91\xbc\xcc\x34\x2b\xaa\xce\xba\x59\x11\x01\x11\x21\x94\x4d\x4b\xf5\x6b\x85\x69\x25\x75\xc2\xf3\xa0\xa6\xd0\xbd\xbe\x68\x16\x2b\x42\xd3\xd9\xc0\x7c\x0b\x79\xa1\x17\x55\x62\x62\x37\x1d\x68\xc2\xa4\xd2\x24\xc9\x18\x70\xed\xde\xcc\x42\x0e\x22\x0d\x03\x2f\x4e\x73\x37\x23\xca\x4d\x09\x4f\x51\xf9\x2e\xb4\xb2\xf9\x77\x15\x11\xbe\xab\x94\x29\x67\xeb\x50\xdd\xb2\xff\xa8\xaf\x4c\x63\x37\x8e\x9f\x11\xdc\x3a\x5e\xc0\xb1\x14\xb9\x8f\x1a\x24\x34\xea\x6c\xd7\xb9\x93\x61\x7c\x05\xcb\xc7\xf8\x73\x3d\x68\x61\x0e\xd4\xba\x05\xa6\xc2\xac\x70\x1d\xdc\x50\x1c\xe6\xe6\x1c\x40\x02\x46\x14\xa5\x11\x99\xcc\xab\xf3\x98\x86\x2c\xf7\x01\x94\xa2\x53\xb8\xe9\x18\x8e\x10\x83\xe1\xd4\x86\x36\x8c\x63\xa8\xb7\xcd\x0c\x2c\xd0\x95\x16\x8d\x4f\x9a\x49\x5e\x4d\xe5\x31\xb7\x2f\xd2\x89\x02\xaf\x34\x3d\x4a\xa6\x35\xe0\x2e\xc5\x4a\x4e\x18\x80\xb6\x0c\xde\xd9\x4e\x2e\xeb\x34\x9e\x9b\xf4\xe6\x78\x46\xfc\xe0\xa9\x4d\xd3\x1a\x03\x19\x4b\x06\x13\x32\x61\x98\x37\x86\x19\x55\x03\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x90\x29\x66\x71\x39\x25\xf8\x5f\xde\xfc\xdb\x1f\xc9\x78\x61\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xd4\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfd\xdd\xc3\x38\xe8\xe8\x21\x7f\x3c\x4b\x61\x7e\xd6\xd8\x42\xc3\x4c\x4c\xbb\xf5\x7a\x11\x23\x9b\x38\xc8\xce\xb6\xe6\x44\x8b\x8c\x25\x8b\x7d\x9d\x69\x5f\xbc\x84\xcc\xc4\xa3\x35\xe6\xac\x1e\xd5\x06\xd4\x4b\x21\x8a\x32\xc3\x89\x23\xdf\x54\xf8\x7c\xa5\x82\x65\xe8\xa3\x50\x23\x61\x83\xdb\xa1\x13\xd5\x0d\xbb\x74\xe7\xb8\x14\x46\x4f\xa6\x70\xc0\x13\xce\xe7\x56\xd5\x21\xe9\x6c\x8d\xfb\x86\x66\xd9\x98\x26\x0f\xf7\xe2\x07\x31\x55\x1f\xf9\xa5\x94\x42\xb6\xdf\x39\xa3\xe6\x4e\x9f\x95\xfc\x01\xab\xe8\xd6\x60\xb4\x62\xea\x62\x0a\x3d\x7e\x40\xe3\xed\x3a\x11\xe3\xdf\xd2\xc2\x83\x7a\x91\xc4\xdb\xe0\xea\x91\xe1\x33\xab\x0d\x6d\x9c\x80\xa1\xb9\x6b\x02\x3e\xb4\xde\x43\x35\x8f\xf6\xef\xde\xfc\xcb\xbf\x5a\xe6\x42\x84\x24\xff\xfa\x06\x53\x8e\xd5\xc0\x5e\x00\x78\x03\x1b\x51\x2b\xa7\x59\xd6\xd5\x4b\xd0\x64\x01\xdf\x74\x2e\x4e\x7d\x00\x47\x5e\xef\xed\x74\x6f\xad\x32\xde\xdf\xff\x15\xf5\x45\xa6\x15\x64\x93\x81\x45\x7b\xa9\xcc\x5a\xc7\x28\x5d\x1d\xbb\x2b\xaf\x3b\x52\xd0\xfe\x95\xb6\xb9\xc8\xca\x1c\xde\xc3\x9c\x25\xdd\x1c\x98\xad\x55\x69\xf5\xe6\xcd\xf4\x19\x53\x08\x02\x34\xce\x44\xf2\x40\x52\xf7\x65\x23\x54\x7e\xb9\xaa\x76\xf7\x59\xe8\x9a\x34\x10\x90\x2c\xb0\xf1\xfd\x5b\x69\x02\x39\x2d\x8a\x0a\xa1\x44\xd2\xc7\xd6\x64\x20\x6b\x42\x74\xd4\x40\x37\x62\xb0\x33\x3d\xd4\x95\x3e\x74\x6f\x64\xae\xa9\xce\x5d\x74\xce\x2d\x08\xf7\xc4\xd7\xd4\x77\xf7\x63\xb6\x36\x44\xdd\xa1\x3f\x0d\x05\xfe\xdb\xe2\x2d\xac\x20\x63\x55\x90\x43\xd5\xc6\xb0\x12\xa4\xd9\x3e\x78\xcb\x74\x37\x5f\x46\x70\x86\x86\xe5\x48\xb4\xe6\x85\x57\x4e\xe8\x9c\x6a\xa7\x1f\x79\x2f\x3b\x25\x05\x48\xc5\x94\x11\x9d\x3e\xe1\x81\xba\xc8\x28\xcb\x1b\xee\xbb\x7d\x4d\xc2\x6a\x44\x7d\x4e\x8b\xe1\x03\x2c\x3a\x6e\xb8\xc0\xe3\xb2\x29\xc0\x3f\xa7\x45\xc7\x7b\x00\x4b\xd7\x86\x5f\x03\x1d\x2f\xe7\x1b\x91\x3a\x3a\xf0\x7a\xb0\x25\x89\x5f\x44\x8d\x8d\x28\x03\xed\xfb\xca\xf9\x54\x2f\x5c\xfb\xc6\x31\x9f\x54\x57\x8e\x7d\xea\x6b\xba\x68\xf0\xfd\xbe\xd4\x7b\xa6\x22\x3e\x12\x3b\x0d\x8a\x74\xc2\xdb\xc9\xed\x8c\xf6\x75\xd4\x32\x68\xd9\x93\xd9\x50\x7d\x9d\xa1\x69\x64\x8b\x02\x04\x10\x60\x8e\xa2\x1b\x94\x1c\xbf\x3b\xde\xeb\x1d\x67\x57\x46\x8a\x82\x4e\x51\x33\x3d\x84\x05\x5a\xa6\xa9\x89\x41\x3b\x13\x8f\xf6\x7b\x1b\x5d\x52\xb8\xa7\x20\xad\x81\xcc\x67\x22\x68\x75\x6c\xe4\xa0\xdf\x11\x4e\xbb\xb6\x58\x85\x8f\x74\x41\xa8\x14\x25\x0f\x4a\x83\x46\xc7\x48\xe5\x38\xfb\xb0\xf4\xb2\xd7\x82\x83\x77\xd2\x87\x8c\x72\x5f\x63\x98\x33\x65\xe3\x15\x18\x27\x6f\x47\x6f\xdf\x04\xd3\x7e\x0b\x49\x29\x15\x9b\xc3\xad\xab\x71\xde\x70\xaa\x5c\x4d\x6e\x84\x52\x6c\x9c\x61\xe2\x96\x16\xe4\xd2\x16\x80\x5f\x7d\xd1\x2a\x70\x04\xdf\x58\xc8\x26\x5a\x69\x00\x85\x27\xf6\x04\x37\x03\x3e\xcd\x00\x01\x51\x1f\x87\x25\x49\xe2\xba\x2e\x49\x92\xd7\x95\x24\x69\xef\xbd\xbd\xbe\xab\x2f\x7c\x7f\x08\x9c\xe4\x83\xf3\x0d\xd4\x95\xed\x99\xaf\x9c\x8c\x1f\x3d\x4a\xa6\xdd\xe1\x7e\x64\x0a\xc8\x09\x5a\x25\x96\x36\x63\x10\x40\x73\xd3\x86\x15\x58\x01\x3f\x06\xc0\xb2\x5c\x3e\xba\x87\xb0\x4a\xab\xfc\xa4\x8e\xc0\x7f\x74\x06\xac\x7a\x05\x1d\xf7\xaf\xef\xe5\x19\xe5\x69\x16\xc4\x33\xaa\x59\xc9\x16\x41\x58\x38\x57\x13\xd2\x64\x89\xce\x7f\xd9\xa8\x26\x31\xa3\x8a\x70\x41\x72\xa0\x18\xa0\x69\x6e\x17\xcf\x05\x5b\x58\xcd\xf1\x68\xb0\x9b\xdd\x5e\x63\xcd\x0b\xc1\xb1\xeb\xf7\x4c\x39\xf6\x6c\xf8\x88\xd3\x40\x6c\x58\x47\x4e\xd3\x90\xd4\xee\xc6\x9c\xd6\x8b\x37\xaa\x83\x26\x97\x29\xa9\x2f\x8e\x25\x5a\x5e\x82\x8e\x81\x2b\x41\x6e\x86\x2f\x31\x4e\x70\x8d\x59\xae\x0e\x92\x09\xf2\x66\xdb\xb6\xfc\xba\xd5\xb5\xb8\xf2\xae\xeb\x29\xae\x08\x0e\xa0\xe1\xf9\x57\x1d\x34\x78\xa1\x8f\x11\xb5\x2e\x75\x57\x03\xc5\x65\x3c\x86\x21\x79\x7b\xa7\x44\x65\xee\x99\x02\x07\x49\x9d\x5f\xc1\x87\x88\x3a\xf0\x15\xaa\x04\x0f\x3d\x10\xcf\x6c\x38\xc3\xef\x9f\x17\x53\xec\xcf\x02\x08\x41\x39\xe7\x44\xc8\xa5\xd3\xee\x3c\x26\xeb\x24\x96\x98\x6f\xbd\x04\xcd\x65\x37\x7f\x03\xf3\xd3\x2c\xca\x7f\x97\x6c\x4e\x33\xb0\x18\xf6\x9e\x35\xec\x55\x98\x50\xe5\xf8\x50\xd5\x46\xa7\x1f\xa2\xda\xb1\x3e\xe8\x61\xa3\x06\x19\x49\x9e\x38\x3a\x22\x27\x76\x8c\x63\x0b\xb2\xbb\x5f\x21\xd7\xad\xd5\xe5\xe7\x22\xa0\x72\x6b\xbc\xf5\xba\xfc\x5c\x50\x8c\xd3\x28\x0e\x62\xe1\xfe\x27\xcc\xe8\x1c\x10\xd3\x98\x65\x54\x66\x18\x94\x7e\x67\xa7\x8c\x8c\x4b\x4d\x80\xcf\x99\x14\x3c\x37\xc7\x0f\xc1\x67\x0c\x67\x92\x80\x60\xf0\x09\x28\xf2\x9b\x93\x4f\xe7\xb7\x98\xb4\x74\xea\xd0\xf2\xdd\xfb\x95\x0a\xf1\x01\x96\xde\xa1\xd1\xdd\x21\xee\x37\xe2\xdf\xdd\x6c\x17\x94\x4f\xfc\x5c\x98\x77\xcb\x4b\x5d\xd2\x0c\xa1\x9f\x93\xac\x34\x77\xe1\xde\x76\x76\x7c\x1b\x78\x88\x25\x2f\xa6\x09\xdc\x01\x7f\xbf\x67\x9d\x8e\x6b\x8c\x83\x7a\xd1\xd8\xaf\x2b\x30\xe4\x9d\x6b\x3c\xac\x01\xa1\x5c\x11\x74\x8e\x55\x05\x4c\xd9\xcc\xc3\x71\x77\x71\xb7\xf0\x0c\x2c\x9d\x60\x93\xbf\x7d\x4d\xd2\x15\x0b\x23\xd6\x68\xd9\xbb\x0d\xbf\xc3\x61\x88\x77\x0c\x3a\x18\xa2\xe3\xec\xfa\x94\xab\x0b\x5c\x9a\xdd\x28\x0e\xdb\xe8\x77\x95\x26\x6b\x36\xc2\xfb\xeb\xbb\x66\x41\x0f\xeb\xfc\x13\x3b\xaf\xe4\x4d\xdd\x45\x5d\xf5\x06\x2b\xe2\x55\x0e\x54\x90\x53\x2b\x4e\x23\xf2\x6c\x25\x5f\xbf\xbf\xbe\xdb\x71\x2c\xbf\x9b\xad\x30\x3c\xa6\xca\xc6\x48\xbf\xbf\xbe\xb3\x71\x6b\xbb\xd1\xde\xd9\x91\xd2\xdd\x07\x81\x00\x6e\x88\xad\xd5\x81\x63\x87\x73\xb9\xf3\x2a\x1e\xc4\x2c\x3e\xfa\x7c\x2d\x35\xe4\xea\x86\xd0\x34\x95\x18\xce\xdc\xe5\x2c\xb7\x10\xed\x68\x51\x54\x51\xa9\x58\x24\x86\x2a\x68\xbe\x7a\x63\x0f\xa0\xe0\xd3\x71\xfd\x6c\x7b\x5f\x16\x19\xb3\xe1\xa7\xcd\x21\xea\x12\x3a\xb9\x98\x77\xe1\x4f\x21\x1e\xc6\xce\xfe\xc5\x20\xf9\x20\x2a\xe6\x9c\xe8\x5a\x9e\x36\xf6\x2e\x95\xa0\x44\x36\xaf\x8b\xe7\x07\xef\x4e\xc7\x8e\x30\x24\xb1\xda\x9d\xbe\x02\xed\x0b\xed\x4c\xe0\x5a\x32\x58\xdd\x95\xe4\xd6\xbc\x5d\x89\xec\xac\x22\x81\xcd\x01\x53\x96\x5c\x85\xe0\x0e\x23\xe3\x30\x3e\xef\x96\xe8\x99\xcd\xba\xa1\x1a\x4f\x26\x95\x5e\x14\xc0\x37\x0f\x78\xc5\xbd\x1c\x91\x25\x64\xfa\xf4\xfd\xf5\x9d\xbd\x49\xed\x74\x39\x3c\x6f\xb5\x76\xef\x74\xbe\xe4\xc8\xfe\xcb\x24\x85\xb8\x6d\xa2\xe5\x94\x56\x25\x4d\xd9\xda\x09\x3e\x56\x81\x10\xa9\xb7\x2e\x34\x21\x2c\x11\x38\xc0\x72\x10\x84\x54\xda\x8e\x0d\xf1\x69\xaf\x4f\x4c\x16\x8e\xb6\x97\x77\x8d\x7a\x57\x28\xa0\x32\x99\x75\xd9\xd8\xb1\x2f\x0b\x4b\x09\x49\x85\xcd\x10\x9b\x08\x89\x1e\xf8\x21\x8a\x3a\x99\x10\x0f\x65\xf1\x32\xd2\x8d\x1b\xb8\xa0\x7a\xf6\x62\x97\x48\x6b\x8c\x5e\xbe\xe9\xbe\x67\x53\xae\xba\xe4\xb9\x04\x2a\x5f\xa0\xad\xca\x85\x23\xd7\x48\x6d\xbb\x5f\x46\x2d\x33\xd8\x45\x56\x2a\x0d\xf2\x1b\x26\x95\x3e\xda\xb5\xa7\x4f\x34\x63\x0e\x38\xd9\x86\xb0\x1c\x37\xbb\xfb\x0b\xd3\x33\x57\xa8\xf7\x78\xd0\xfe\xca\xfc\xed\xc8\x38\x26\x42\x92\xe3\x6b\xc1\x61\xe7\xe0\xa1\x25\x0d\xb4\x12\x7c\xaa\x2b\x7d\xa3\xcc\xe6\x26\x51\x41\x66\x41\x55\xf0\x8b\xce\xe7\xec\xde\xd5\x4e\x36\xf4\x78\x49\x41\x81\x26\x14\x8b\x4e\x62\xdf\xb3\xba\x60\xb1\x2d\x8e\x66\x0b\x3d\x0b\xa7\xf3\x2e\x1a\x4b\xbb\xe3\xe0\x8d\xea\x6a\x5a\x6c\x5e\x80\x2e\xaa\xed\xce\xe7\x0c\x11\x43\xc0\x95\x93\xf9\x81\xf1\x87\x1d\x0f\x79\xd8\x09\xb9\x5c\x19\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\xb1\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xba\x2a\x6b\x0c\xe0\x6a\x60\xc3\x5c\xbc\x85\x5b\x2d\xb8\xa6\x58\x6b\xfb\xbd\x48\x1e\x40\x92\xcc\xd0\xbc\xeb\xe6\xab\xf3\x58\x5b\x55\x95\x77\x4e\x6b\xe9\x1a\x91\x01\xc5\x0c\x72\x90\x34\xab\x0c\xa0\xaf\xba\xe8\x3f\xb8\xdb\xbb\x22\xa3\x99\xc4\x69\xcb\x23\xba\x42\xb9\x22\x1d\x91\xcb\x75\x4f\xe5\x74\xe1\x0b\xbf\x33\x8e\xbe\xc3\xcf\x4c\xe9\xdd\x6f\x98\x42\xa4\x4d\x8c\xd4\x52\x81\x1c\x56\x98\xb9\x84\xba\xe2\x8b\x3e\x9f\x36\x85\x71\x39\x9d\x32\x3e\x1d\x59\xf1\x00\xc5\x90\xba\x40\x6c\x6d\x0b\x7b\x9c\xc1\xae\x11\x32\x89\x04\x8a\xf1\xc3\xa8\xac\xd8\x90\x09\xd6\xec\x3d\x17\xa9\xed\x7c\xbc\xb0\x16\x58\xbf\x27\x2b\x20\x25\x72\xc5\x89\x90\xae\x2e\x06\x4d\x53\xb2\x73\x98\xce\x9a\x15\xc1\xbe\xea\xf9\xb5\xc4\x95\xb5\x7f\xfe\x58\xd5\xbf\x6a\x2c\x90\x2a\xc7\x46\xf6\x2d\xe5\xae\xb5\xae\xbb\xca\x28\x9d\xe4\x93\x50\x59\xf4\x9c\xd7\xdb\xf3\xa2\x89\x44\x40\x89\x86\xbc\x10\x92\xca\xc5\x72\xba\x89\xb9\x49\xcc\xf6\x35\x0b\xb4\x34\xb7\x37\x22\x35\x42\xc2\xce\x64\xac\xd9\xb6\x73\x66\xd4\xce\x75\x3b\x77\xed\x79\xc2\xab\x8d\x0b\xe2\xd7\x8c\x74\xa0\x42\x25\x33\x48\x4b\x44\x9f\x9a\x96\x54\x52\xae\xc1\xf0\x4f\x17\xc2\xba\x68\x05\x72\x54\x48\x0d\x15\x6c\xdb\x02\xf3\x46\xb1\xb8\xb3\xf9\x04\xeb\x4a\x77\x09\x37\x71\xc2\xb1\xe9\xa8\x01\x07\x71\x3f\x03\x62\x24\xc9\x0c\x34\x4e\x3e\xcc\x59\xa2\xfd\x20\x13\x5c\x84\x35\x5b\x3f\xa1\xa5\x85\x7a\xd8\x3d\x00\xe8\x46\xb8\x3a\xaa\x09\x98\x3b\x49\xab\x7a\x6a\x5d\xd6\x23\xeb\x14\x57\x72\xef\x4f\xf6\x3a\x82\xeb\x83\xf9\xcc\x91\x44\xa3\x48\x67\xa6\x89\x6f\xf7\x04\x63\xae\xd6\x78\xcd\x4a\xec\x38\x54\x80\x01\xa6\x7b\xca\x43\xa7\x54\x85\x10\x5b\x0f\x95\xd3\xbd\x25\x01\x9d\xcb\x69\x99\x63\xd2\xbc\xd3\x6d\x81\x6b\xb9\x28\x04\xeb\xea\xb7\x37\x47\x0d\xdd\x8c\xc7\x8a\x5c\x7c\x78\xdf\x04\x7c\x6b\x96\xe9\xf3\x70\x80\xdd\x06\xf9\x14\x37\x40\x81\x5c\x4d\x08\xad\x84\xbe\x4e\x14\xd5\x17\xb5\xb3\xf9\x38\xd7\x6f\x45\xa0\xb7\xc0\x32\x5e\x18\x09\x16\xe5\xf4\x46\x5d\x9f\x64\x46\xf9\xd4\xb0\xaa\xf7\xa2\x34\x2f\xf6\x9b\xdf\xe0\x4b\x48\x48\xcb\xa4\x63\x70\x29\x02\x46\x3b\x54\xa4\xdf\xf8\x30\x2f\x57\x40\xcc\xe8\xa2\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x95\x72\xdf\x11\x36\x82\x11\x39\xfa\x4d\xe3\xab\x23\xa4\xb8\x13\x35\x85\x14\xe6\x55\x1c\x08\x13\xbe\x7d\xc6\x34\xf2\x8f\xa3\xe6\x08\x23\x72\x69\xe8\xc2\xa8\xe9\x6a\x6d\x1b\xb8\x3a\xe3\x7a\x65\x07\x44\xc2\x94\xca\x34\x83\x8e\x00\x22\x62\x52\x29\x19\x16\xa8\xd2\xed\x2a\x64\x8c\x88\x2b\xc0\x85\x1e\xc5\x71\x7d\x6f\x8b\x68\xa7\xa9\x7a\x50\x67\x56\x9d\x19\xa6\x54\xd3\x21\x2d\xac\x3d\x88\x09\x7e\x66\x4d\xdd\x43\x57\xa4\x7c\x48\xdd\xe9\x1d\x56\x3b\xfb\xec\xd7\x0e\x7e\x75\x48\xab\xa7\x18\x1f\xd2\x21\x96\xed\xee\x6c\xbf\xd9\x43\xda\x5d\xf4\xc0\x99\xa0\x72\x4c\x01\x65\xf7\x63\xb0\xe9\xcb\x8a\x2b\xdb\xa5\x18\x91\x6b\xa1\x7d\x75\xfd\xb4\x4e\x34\x0c\x28\xce\xde\x64\xdc\x97\xd7\xf7\xb7\x7f\xbd\xf9\x78\x75\x7d\xdf\xf3\xef\x9e\x7f\x63\xeb\xf9\x77\xcf\xbf\x3b\x0c\x7c\x28\xfc\x1b\xf8\x7c\x5f\xbc\xbb\xb2\x77\xad\x33\x30\x2e\x55\x7b\x0d\x4c\x14\xff\x8a\x12\xed\x2f\xf9\xfc\x13\x35\xaa\x63\x21\x41\xa1\x82\x62\x34\xd6\x75\x41\xca\xee\x01\xb4\x04\xd6\x31\x9d\x5f\x6c\xa6\xfd\x1e\xf3\xe4\x23\xe6\x89\x5e\x37\x6a\x78\xac\x5b\xb5\xba\x64\x10\x25\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\xed\x5e\x53\x08\x02\x8b\x96\xc6\x4b\x1e\xd8\x45\x3e\x0a\x18\xa6\x96\xac\x0a\x09\x73\x26\x4a\x95\x2d\xaa\xea\xf8\xeb\xd9\xd5\x2a\x68\x41\x60\x2e\xd6\xc2\x7b\x73\xd6\x0f\xb8\x24\xdb\xad\x93\xd3\x02\x86\xdf\xb3\x84\xe7\x88\x88\x21\xe7\x05\x8c\xbf\x46\x42\xdc\x5e\xda\x0b\x18\xb7\x93\x9c\xb8\x49\xe6\x0b\xa0\xa3\x2d\x2d\x06\x74\xd4\x4e\x56\xd9\x3f\x27\xfb\x46\x8a\x3c\x12\x37\xbb\xb3\x76\x63\x1f\xc2\xb0\xee\xa8\x56\xc1\x4d\x4d\x29\xc4\x69\x8e\x75\x89\x12\xa3\xb5\xe6\x85\xee\x98\x5e\x41\x62\x95\x67\x8f\x53\xc9\xdc\x06\xa7\x7f\xa0\xc5\xf7\xb0\xb8\x85\xc0\x62\x4c\xed\xf9\xc6\x30\x07\x45\x28\x79\x80\x85\x8d\x61\xbc\xf0\x83\x85\xd5\xa3\x3a\xc0\xea\xf6\x0f\xd0\x0d\xf3\xdd\xb7\x78\x65\xe9\x1f\x20\x00\x91\xc0\xb7\x95\x9a\xe5\x66\x09\x51\xcc\x37\x6b\x7a\x50\x55\xda\x0f\xb5\x0c\x7f\x53\x7a\x74\xd7\x43\x84\x89\x5b\x46\xa5\x81\xc9\x04\x12\xed\x33\xdd\xed\x6e\x1e\x60\x32\x64\x5a\xda\x52\x9a\x34\x79\x78\xa4\x32\x55\x24\x11\x79\x41\x35\x1b\xb3\x8c\xe9\x45\x58\x1a\xbc\x6f\x78\xc3\x57\x38\xde\x96\x29\x92\x2b\xae\x34\xc5\xab\x50\x38\x7b\x9b\x59\xed\x1a\x4c\x17\x31\x77\x2d\x37\xc5\x84\x1b\x2a\xc3\xeb\xdf\x1b\x52\x72\xa1\x34\x49\x40\x1a\xa1\x2e\x5b\x90\x47\x29\x78\x47\x88\xeb\x76\xdb\xb1\x8a\x8b\x98\x1b\x59\x10\x1e\xcf\x5c\x3a\xde\xd0\xbc\xf8\xd0\x32\x2b\x75\x86\xc9\x1e\x67\xbf\xc6\xff\x1c\xd2\x29\x22\x3e\x99\xef\x1d\x39\x3a\x0a\xec\x4b\xf8\xd8\xa0\xb8\xa7\xf2\xce\xc5\xac\x35\x45\xa7\xea\x42\x21\x16\x78\x17\xf9\x94\x87\x1b\x70\x5a\x40\xa4\x69\x0e\x43\x8d\xb1\xad\x65\x10\xca\x69\x11\x66\x0f\xaa\x1b\xb2\x83\xb8\xb7\x77\x30\x0f\xac\xaf\x7f\xcb\xac\xaa\x62\x98\xe9\x3b\x0f\xa3\xa1\x48\x0e\x9a\xa6\x54\xd3\x91\x39\x10\x83\xf6\x9f\xaa\xa0\x09\x0c\xc8\xdf\xab\x0f\x33\x3a\x86\x4c\xfd\x78\xfc\xef\xdf\x5f\xfe\xf5\x3f\x8e\x7f\xfa\x7b\xf3\x3b\x14\xd7\xd0\x3e\xd9\x7c\x20\xf0\x15\x30\x24\x89\x8b\x14\xae\x91\x3a\xfc\xd3\x69\x7a\xe7\x49\x22\x4a\xae\xdd\x17\x88\xa1\x3e\x9a\x09\xa5\xaf\x6e\xaa\x3f\x0b\x91\x2e\xff\x15\x50\x29\x8f\x1c\xa6\xdc\x83\x6b\x1b\x80\xa9\x68\x5b\x3c\xe9\x87\x16\xec\x13\x48\x15\x04\xc3\xe7\x5b\x3b\x31\xc2\xf6\xea\xb7\xb1\x4a\x66\x90\x53\xfc\xe7\x37\x7e\x0a\xcc\x7d\x5c\x55\xb9\xe0\x08\x56\x6f\xee\xc0\x76\xe9\xdc\xa3\xf9\xdb\x20\x8d\xd3\xb6\x88\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x4a\x7e\xf4\x56\x8a\x3a\xda\xf0\xfc\xe6\x8a\xcc\xed\x0c\x1f\xd0\xe4\xbc\x14\xbb\xf6\x31\x4c\xdf\x1c\x34\xdb\x6e\x46\x5a\xb5\xec\x65\xef\x08\xc2\x29\xf9\xef\x5d\x49\x03\x55\x95\x71\x04\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\xb3\x8a\x0f\x1b\x2a\x2d\x24\x9d\x22\x20\x9d\x1d\xdc\xfe\xac\xfa\xcb\xfe\xb0\x45\xde\xea\xaf\xad\x41\x32\x29\xa5\x91\xd3\xb3\x45\x8d\xf4\xf4\xd5\xb1\x6c\xbf\x6e\x07\xc2\xb1\xab\x6d\x75\x1d\x5f\x91\x3b\xae\x23\x5a\x51\x4d\xac\x66\x11\xad\x40\x0e\x38\x7a\x50\x09\xac\xd6\x54\xc9\xe7\x64\x4e\xa5\x0a\x29\x6c\x6e\x5b\x44\x26\x9d\xb2\x39\x53\x22\x00\x14\xa8\xea\x68\x55\xa2\xf6\xc8\x0a\xae\x44\x89\x4d\x54\xa8\xfc\x1e\x9f\x0b\x2c\x57\x56\x1d\xf6\xa5\xdb\xec\x6d\xa8\xb2\x40\x48\x41\xb5\x06\xc9\xdf\x91\xff\x75\xf2\x9f\xbf\xfd\x79\x78\xfa\xa7\x93\x93\x1f\xdf\x0c\xff\xed\xa7\xdf\x9e\xfc\xe7\x08\xff\xf1\xcf\xa7\x7f\x3a\xfd\xd9\xff\xf1\xdb\xd3\xd3\x93\x93\x1f\xbf\xff\xf0\xed\xfd\xcd\xe5\x4f\xec\xf4\xe7\x1f\x79\x99\x3f\xd8\xbf\x7e\x3e\xf9\x11\x2e\x7f\xda\xb2\x93\xd3\xd3\x3f\xfd\x26\x98\xf4\x08\xf5\xcb\x6d\x8b\x59\xc5\xbc\xdd\x63\x24\xed\xf0\x45\x2a\x9a\xd7\xcd\x6f\xaf\xd8\xe7\xdf\x67\xe6\xbe\xab\x6f\xb3\x4a\x0a\x39\xa0\x03\xfe\x52\x82\x86\x82\x44\x82\x7e\x0d\xcb\xae\x1d\xa9\x51\x70\xc1\x25\x55\xa3\x12\xf7\xb5\xdd\xa0\xbf\x04\x63\xaf\xd7\x73\xec\xba\xd6\xa2\xfb\x44\x8a\xdc\xe1\xb7\x5b\xcf\xf7\x1c\xb3\x31\xdd\x73\x0f\x10\xe0\x15\xf1\xad\x37\x0e\x77\x6e\xbd\x71\x78\x03\x29\xbd\x71\x38\xa8\x7d\x91\xc6\xe1\x3b\xcb\x93\x7e\x91\x96\xe1\xf8\x98\x8b\x1d\x63\xba\x62\xc2\x2d\x02\x9f\x77\x8d\x07\x88\x19\x04\xe9\xcd\x1e\xcd\xa2\x9a\xdb\x45\x1a\x75\x8f\x6a\x37\x2b\x57\x85\x35\xd5\xa1\xf2\x56\xa4\xcd\xd7\x87\xa1\x91\xf3\x2c\x23\x8c\xdb\x0b\xda\x74\xd0\x69\xf4\x1a\xb2\xc3\x21\x5f\x3b\xa4\xe3\xb9\x79\x55\x9f\xfa\xd8\x2e\x62\x8d\x99\x72\x98\xa9\xf9\x17\x9b\x08\xf9\x60\x73\x23\x95\xc6\x29\xf1\xa5\xc9\x3b\x91\x53\xa9\xa1\x36\x72\xc6\x5c\x14\x54\x29\x91\xd8\xbc\xd1\x0a\x6a\x01\x6b\x8a\xba\xe9\xc1\x37\xd0\xf4\x01\x43\xc4\x12\x48\x81\xef\x9a\xd1\xeb\xdb\x27\x8b\x39\xe1\xd7\x61\xbc\xc0\xd2\xd8\x7c\xee\xee\x2f\x92\x7a\xd8\x13\x7c\xe3\x78\xe3\x7e\x5d\x31\xb1\xe6\x0c\xbb\x60\x9c\x46\x68\x2c\x4a\x9b\x75\x6a\x27\x46\x14\x8b\x49\xed\xe1\xc3\xe8\x26\xcb\xd2\xbb\x6d\xe4\x60\x45\x22\x5c\x6c\xaf\x82\x6d\x82\xf4\xb1\x15\x79\xbd\xf6\x82\xb6\xe5\xf4\xaf\x21\x3e\x29\x5c\x82\x8f\x2b\xbd\xbf\x84\xe4\x7e\x28\x52\xfb\x81\x48\xec\x2f\x23\xad\x1f\xa6\xa4\x1e\x4d\x4a\x8f\x23\xa1\xc7\x91\xce\x77\x08\xdb\x88\x29\x91\xc7\x91\xc6\x5f\xc2\x16\x57\x48\x98\xb0\xcf\x91\x38\xbe\x87\xde\x21\x1a\x3e\xa3\x65\xa6\x90\x50\x00\xaf\x90\xdd\x7c\x51\x54\xa0\xc9\xec\xcb\xc9\x5b\xb0\x06\xa4\xb8\xf7\xe2\xdd\x3a\xe3\x55\x7f\x29\x92\xfe\x52\xdc\xa1\xf5\x97\x62\x7f\x29\xbe\xca\xa5\xe8\xb8\xd5\xd7\x7f\x23\x46\x4e\x8b\xc5\x84\xff\xbd\xd7\xdf\xb0\x64\x04\x00\x09\xef\x78\x14\x6b\xc0\xa2\x33\x1c\xb9\xcb\x89\x0b\x3a\x67\x38\xea\x4d\x99\x65\x5d\x40\x49\x6d\x8b\xb1\x00\x57\x38\xed\x45\x99\x65\x0e\xc8\xb2\xdb\xec\x7f\xe4\x78\x81\x9d\x67\x8f\x74\xa1\x06\xe4\x1a\xe6\x20\x07\xe4\x6a\x72\x2d\xf4\x8d\xb5\x50\x74\xeb\xb7\x99\x4f\x65\x3b\x27\x6c\x42\xde\x65\x54\x83\xd2\x44\xd3\x29\xda\xcb\xea\x52\x2b\x42\xb6\x06\xad\x8b\xc9\xed\xd1\x70\x14\xbe\x37\x7f\xed\xd1\xfe\x86\xfb\xd9\xab\x19\x9b\x40\xb2\x48\xb2\x70\x36\xf1\x83\xef\xc9\x67\x82\x79\xf1\x00\x43\x87\xd6\xc0\x89\x7d\x81\x98\xed\x85\x50\xfa\x4e\x53\xa9\xf7\x0d\xdc\x7e\xe3\x09\x31\x93\x9d\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\x04\x41\x3a\xd1\x20\x9b\xa5\xe9\xf1\x39\x5b\x90\x6f\x64\xeb\xf7\xf9\xda\xa6\x92\x4c\x28\xcb\x54\xf7\x88\xf0\x15\x23\xb7\xad\xa7\x4d\x5d\x2d\xc7\x06\x1c\x20\x4d\x12\x21\x53\x4c\x76\x15\x1e\x36\x0f\x5f\x22\x84\x3f\x99\xf6\x11\x45\x85\x9c\x72\x3a\x85\xdc\x95\x18\x6c\x93\x35\xce\x44\xf2\xa0\x48\xc9\x35\xcb\x5c\x21\x6f\xf1\x80\x02\x71\x86\x27\xb5\xf3\xd0\xdd\x19\x40\xf5\xcf\x61\x75\x08\x87\x86\x2a\x75\xf6\xeb\xfa\x2b\xfc\xa0\x23\x71\x11\xd4\xb2\x18\x4a\x19\x7c\x86\x24\x44\x40\x6c\x1b\xc9\x3f\x43\xd2\xa8\xe0\x4b\x3d\x74\x93\xc5\x63\x44\xc0\xa4\x48\xbe\x25\xdb\x22\xc5\xd8\xc4\x8a\x6b\x09\x00\xaa\x6a\xb6\xd8\x61\x1b\x17\x6e\x11\x98\x72\x33\x6f\xff\xcc\x18\x87\xf6\xc2\x28\x5b\xbf\x04\x9a\xb0\x96\xe6\xcf\x95\x02\x6d\x3e\x19\x39\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xd9\xf1\xe9\xca\x1e\x39\x36\x1a\x75\x06\x6a\xa1\x34\xe4\x16\x52\x34\xa9\x5f\x4a\xb1\xbc\xc0\x82\x81\x90\x1c\xfb\xfa\xa6\xc1\x94\x99\x3b\xd2\x62\x1c\xe3\xac\x38\x78\xaf\x01\x51\x82\x68\x49\x53\xe6\x6c\x59\xf8\xa9\x79\x48\xcb\xd2\x41\x16\x9f\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xc6\xe9\x1b\x91\x7b\x41\x4a\x15\x3e\x63\x15\x21\x0b\x51\x12\x0e\xe0\xce\x56\x85\x6a\x6e\xae\x1b\x22\x4a\x6d\xad\x6a\x54\x87\xc0\x92\x35\xdb\xe5\x67\xa6\x5d\x4e\x90\xe1\xdf\x6f\x96\x6a\xc8\x66\x6c\x0e\x67\x33\xa0\x99\x9e\xd9\x88\x75\x2e\xf8\xf0\x1f\x20\x05\x82\x98\x71\xf7\x4d\x28\x19\x61\xae\xc0\x66\x0b\x70\x0b\xae\x12\x14\x25\x58\x25\xb2\x76\xe9\x9b\xb9\xf6\xbe\x85\xce\x22\x11\x59\xe6\x47\xdf\xdd\xdf\xdf\x7c\x0b\xba\xc9\xe5\x39\x7e\x48\xbe\xbd\xbc\xf7\x79\x0a\x0d\x60\xef\x03\x60\xef\x71\x02\x28\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\x0d\xf8\x5a\x18\xb6\xcd\x21\x31\x9b\xa0\x1d\x74\xef\x11\xd3\xaf\x6e\x46\xe4\xaf\xa2\x34\x13\x32\xa6\xe3\x6c\x41\x1e\x29\x77\xd6\xee\xb0\x48\x59\xd3\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x3b\xa0\x29\x48\x85\x0c\x1a\x68\x60\x4e\x4c\xc4\xe3\xde\xa0\x2d\xea\x52\x5e\x94\x4a\x8b\x9c\xcc\xdc\x6b\xb7\x01\xce\xdc\xe1\x1c\xd9\xe3\xea\x50\x6e\x24\x14\x96\x89\xbb\xdf\x7c\x75\x2c\x7a\x85\x7b\xd9\x79\x77\x9f\x8f\xad\x98\xda\x9c\x36\x67\x31\xb7\xf8\x29\x8e\xb7\x99\xad\x1a\x2d\xb6\x31\x42\x4c\x38\x89\x18\x17\x4e\xc2\xa0\xcf\x96\x3b\x42\xef\x41\x70\x4f\xf1\x42\xcd\x49\xb4\x70\x6a\xf2\x22\x21\xd5\xc4\x45\xca\xb9\xcd\x67\x3d\x47\x61\x75\xdd\x96\x3b\x6f\x94\xd3\x4a\x28\x17\x9c\x25\x34\x63\xff\x80\x94\x94\x85\xe0\x2e\x7f\x0a\x25\xdb\x84\x2a\x18\xa2\xbb\x95\x5b\x76\xae\x1a\x20\x5c\x86\x3b\x68\x21\x50\xdc\xc3\xa0\x27\xc3\xee\x2d\xd5\x71\x48\x8d\x1a\xf9\x1b\x8c\x28\xd7\x6c\x2b\x1e\xda\xd6\x62\xc5\xd9\xf1\xe4\x8b\x10\x27\x89\x4d\x7c\x0b\x4e\xba\x5e\x4d\xb9\xd6\x82\xd0\x24\x41\x98\x31\x7b\x5d\x21\xe3\xb5\x05\x66\x0f\xe6\xde\x36\x22\xe0\xa1\xc9\x5e\xd6\x89\x2d\x09\x2f\xf3\x31\xc8\x1a\xaf\x42\xea\xd5\x39\x8d\x62\x75\x71\xc3\xda\xe1\xbc\xdb\xcf\xcb\x18\x94\x4f\x81\xbc\x35\x23\xff\xf1\x0f\x7f\xf8\xfd\x1f\x22\x8c\x63\x5e\xaf\x8a\x14\xe6\xe4\xea\xfc\xfa\xfc\x6f\x77\x9f\x2e\x10\x05\x2f\xb4\xfb\x48\x89\x90\xb1\xd3\x20\xa3\x26\x41\xbe\x68\x0a\x24\xe2\x49\x04\x73\xd9\xd8\x47\xe2\x0e\xa9\x32\x9b\xb0\x54\x16\x39\xcf\xe9\x24\xce\xba\x6d\x4d\xcc\x2a\x42\xea\x52\xd3\x4f\x66\x18\xd6\x41\x70\x2a\x95\x01\x14\xd1\x34\xfe\x3b\xd3\x5b\x0b\x0c\x98\xa4\xbe\x28\x3c\x5a\x98\xda\xb6\x7c\x57\x17\x0e\x69\xf8\x8a\x94\x7f\x05\x89\xe0\x69\x88\x0a\x10\x4b\xa4\x75\x94\x44\x3d\x73\x77\xb6\x4f\x6f\x22\xae\xaf\x12\x37\x18\x6a\x92\xa1\x2b\x4a\xaa\x55\x8d\xc3\x27\x6d\xc6\x3f\xf6\xf6\xc7\x7f\xe9\xee\x20\x4b\x8a\x3b\x91\x3c\x44\x34\x91\x05\x32\xb0\xf7\xe6\xa4\x25\xd6\x17\x78\x7f\x71\x63\x89\x33\x2b\x73\xfd\xf1\xbe\x86\xf7\xc0\x74\x96\xda\xad\xfb\x9d\xf3\x16\x52\x9e\x92\x07\x28\xc2\xb4\x4b\xc3\x30\x7d\x5c\x5a\x3b\x2c\x0d\x6d\xef\xd2\x39\x91\x6d\x0a\xad\x65\x04\x3e\x9c\xcc\x4a\xc4\x61\xc0\xc4\x0d\xbf\x37\x3a\x02\x9d\x12\x32\xa1\x2c\x23\x14\xad\xf2\x9a\xe5\x60\x73\x78\xd0\xd8\x5f\x07\x22\x7c\x45\x0c\xe7\x6b\xb5\x36\x1e\xd7\x25\x38\x77\xb5\x1a\x86\x22\x1f\x7c\xdd\x6a\x80\xe3\xd9\xb2\x0a\xa4\xee\xd5\x80\x6d\x5b\xaf\x06\x74\x54\x03\x0a\x09\x77\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\x36\x84\xdb\x8c\x61\x22\x24\x2c\xc7\xdb\x34\xe2\x60\x5c\x28\x76\x40\xa8\xe9\xf9\xcd\x55\xe5\xfb\x12\xad\x58\x17\x9b\x6f\xea\x8b\x81\x66\x6c\x0e\x1c\x94\x3a\xc3\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x0e\x6a\xc4\x18\xf3\xba\xc0\xed\x87\xa0\x13\xeb\x37\xf7\x61\x45\x2e\x0c\xcc\x4f\xd7\x24\xc8\x9d\xdf\xa8\xdb\x29\xa9\x9a\x01\xe6\x3c\xc2\x67\xa6\x95\x1d\xf4\x06\x71\x55\xfc\x8c\x1b\x79\x61\x2a\x69\x02\xa4\x00\xc9\x84\x11\x31\x4a\xae\x53\xf1\xc8\xc9\x18\xa6\x8c\x2b\xbf\x62\x21\x24\xf9\x2d\x81\x91\x44\x4c\x55\xf5\xba\x46\xe4\xb6\x05\x68\xef\x10\xa4\x12\x51\xf3\x4c\x37\x45\x83\x48\x53\x82\xc2\x0b\x6e\x83\x92\x66\xd9\xa2\xde\x78\x3e\x1f\x5a\x6f\x9e\xa1\xee\x1b\xc2\xce\xec\x49\xc9\xf1\x45\x53\xc8\xe8\xc2\x66\xfe\x4e\x18\x47\xeb\xaf\x54\xa7\xa3\xf0\xd0\xac\xce\x04\x0a\xd9\xe8\x73\xe3\xce\x60\x8a\x48\xa0\xc9\x2c\x44\xb2\xeb\x63\xc0\x9e\x6b\x7d\x0c\x58\x1f\x03\xd6\xc7\x80\xad\xb6\x3e\x06\xac\xdd\xfa\x18\xb0\xcd\x04\x1d\xb2\xd3\xae\x8f\x01\xeb\xad\x32\xab\xad\x8f\x01\xeb\xd4\xfa\x18\xb0\x67\xdb\xc1\xb1\xe8\x3e\x06\x6c\x8b\xd6\xc7\x80\x6d\xd9\xfa\x18\xb0\x3e\x06\xac\x8f\x01\xeb\x63\xc0\x02\x5a\x1f\x03\xb6\xfb\xeb\xf5\xce\x9f\xee\xad\x8f\x01\xeb\x63\xc0\x76\x6c\x7d\x0c\xd8\x52\xeb\x63\xc0\xfa\x18\xb0\xa7\x5a\x1f\x03\xd6\xc7\x80\xb9\xd6\x5b\x1b\x57\x5a\x1f\x03\xb6\xa6\xf5\x31\x60\xbb\x8d\xd3\xab\x01\x61\x9d\xbd\x88\x1a\xa0\xb4\x28\xee\xd8\x34\x00\x68\x30\xd6\x31\xb8\xab\x28\x71\x28\x84\x8a\x3c\xce\x58\x32\x23\xca\x7e\xe8\xed\x58\x88\x50\x66\x0e\x44\x33\x4a\xa7\xbe\x49\xc6\x60\x54\x04\xf3\x5a\x45\xc8\x6d\x72\x35\x41\x07\x72\x03\x24\xcd\x9c\x0a\xc7\xd6\xcc\x38\x0d\x38\xfe\xb6\xf8\xec\x6f\x37\xc6\x8d\xee\xd2\x9d\x82\xc6\x7c\x24\x94\xdb\xea\x97\xf8\xfa\x58\x2d\x8f\xdc\x88\x54\xf9\x0a\x00\xfc\xff\x67\xef\xdd\x7b\xdb\xc8\xb1\xbc\xe1\xff\x9f\x4f\x41\x64\x06\x8f\xed\x6d\xc9\x4e\xe6\x86\x99\xc6\xe2\x6d\x78\x1d\x77\xda\x98\xc4\x11\x6c\x27\xf3\x0c\x7a\x7a\x7b\xa9\x2a\x4a\xe2\xba\x8a\xac\x26\x59\xb2\x35\xe8\x0f\xff\x82\x87\x97\x62\x49\x72\x12\x91\xb4\x25\xa7\x55\x0b\xcc\x76\x24\xb9\x78\x3f\x3c\x97\xdf\xf9\x1d\xce\x86\x86\xfd\xf3\x18\xca\x05\x73\x79\x9c\xe0\x0d\x4e\x24\x3d\x33\x18\xb9\x91\xe0\xe3\x74\xe2\x33\x78\x8b\x84\x22\x99\x5f\x29\xed\x59\x0a\x7a\x67\x6b\xc8\x9d\x1d\x41\x3e\x65\x40\xeb\xe4\xbc\xc3\x77\x14\xa5\xb3\x9b\x08\x9d\x5d\x44\xe7\x6c\x03\x99\xb3\x75\x54\x4e\x9e\x70\x6f\x86\x50\x6f\x26\x4d\xe9\x11\xc2\x26\x16\xe0\x7d\x33\x13\x44\xce\x78\x15\x2d\x70\x72\x09\x9b\x77\x94\xd1\xba\xad\xf5\xd9\x95\x5a\xa6\xd0\xb9\x07\xa1\x4b\x27\x32\x2c\x36\xdd\x44\xc2\xf5\x0f\x69\x49\xa0\x04\x31\xa6\x95\xde\x5a\x40\x62\x39\xc3\x73\x50\x96\xda\xa2\x20\xa4\x4c\x51\x97\x42\x2f\xea\x1f\x8f\x7d\x0f\x0d\x19\x39\x95\xe8\x55\xda\x55\x93\xa6\x8f\x07\x6e\xa6\x3f\xfe\x21\xea\x1d\x53\xd1\xe4\xb9\xa5\xdf\x5c\x8d\xce\x7a\xb7\x34\x7c\xf0\x03\x1c\xe3\xb3\x19\x29\x6e\xaf\x2c\xc4\x63\x7b\x37\x73\xba\xfb\x23\xc9\xf5\x91\x43\x31\x48\xb5\xee\xfb\x3a\xa8\x36\xc0\xfb\xa1\xb9\x29\xac\x22\x11\x73\x5a\x90\xe3\x27\x30\xa0\x73\x19\xa5\xe9\x07\x01\x81\xfb\x1a\x06\xbe\x2b\x6a\xd7\xb5\xe9\x8e\xf7\x7c\x07\xbe\x13\xdb\x53\x00\x33\x56\xb8\xf0\x6b\x33\x5d\x7f\xe8\x92\xba\x71\x28\x09\xf1\x29\x0a\x53\xaa\x66\xed\xf8\xb8\xe0\xf5\x89\x16\x1d\xe6\x7f\xc6\x15\x1f\x9f\xd4\x58\x2a\x22\x4e\x4a\x5e\xd8\x6b\x7d\x58\xe8\x1e\x50\x36\x3d\xae\xcb\xa3\xe3\xff\x93\xd4\x87\x0b\xeb\xc3\xb5\xe9\x41\x0f\x18\xaf\x63\xa2\xe5\x3e\x17\x4b\x56\xac\x9e\x94\xf4\x4d\x9a\x7c\x7f\xa7\x56\x4f\x48\x84\xcb\x6e\x05\x2a\xbb\x97\xda\x28\x83\xa3\x3a\xa7\x50\xd9\x0d\x38\xec\xa3\x41\x61\xb3\x9c\xd5\x4c\x10\xd8\x1d\x82\xbf\xee\x8c\x2d\xb4\x2b\x90\xd7\x1d\x2c\x83\x9f\x01\xe6\x9a\x03\xe2\x9a\x0f\xde\xba\xab\xd5\xe2\x1f\x0d\xd2\xfa\x2c\xe0\xac\x19\xe3\x36\x99\x60\xac\x4f\x01\x61\xdd\x5d\x1f\x0c\xca\x00\x5b\x7d\x3a\xc8\x6a\x96\x79\xcc\x6a\xc5\x26\x8a\x84\x2d\x40\x54\x9f\x22\x2e\xfd\x68\x31\xe9\x0c\xf1\xe8\x9c\xb1\xe8\x6c\x71\xe8\x47\x83\xa2\xa6\xc3\x50\xb3\xfa\x14\x9e\x04\x7e\x9a\x13\x7a\x9a\xbc\xbe\x94\x51\x45\x71\xf5\x9a\x54\x78\x71\x9d\x06\x50\xcc\xb5\x12\x97\x2b\x20\x46\xe3\xb6\xee\xc7\xdb\x67\xd8\xd6\xfe\x27\xa5\xa3\x1e\x71\x41\x68\xab\x02\x43\xfc\xd8\x8c\x2f\xba\x18\x19\xda\x9c\x8b\xe2\x8e\x8b\xdb\x8a\xe3\x52\x9e\x34\xdc\xfc\x4f\xc7\x44\x11\x50\x50\x24\xa9\xe9\xbb\xe1\x1e\x37\x7c\x1f\x3b\xb2\x6b\x7e\xe0\x77\x88\x4f\x14\x61\xe8\x90\x32\xb7\x73\x8e\x02\x2f\x4d\x17\x1e\x49\x8e\x77\xe8\xb7\xbe\x7a\xe9\x1a\xf9\xfa\xe2\x1e\x10\x19\x92\x72\xa7\x23\x5f\xb6\x8f\x9f\x0f\x7d\xd9\x1f\x4e\xda\xaa\x1f\xfe\x32\x21\xb1\x3c\xb1\xaf\x57\x5d\x99\xeb\x57\xd0\x1f\x2f\x8a\x30\x2b\x91\xe5\x8d\xfa\xfa\xf6\x49\x32\x04\xbb\x6f\xdc\x78\xcc\x74\x1f\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xaf\x40\x01\xdd\x3b\x5d\x77\xc6\xe9\xba\x25\x64\xf0\xd7\x67\x6d\x3d\x3d\x12\x78\x6f\x6d\xfd\x56\xac\xad\x80\xae\xed\x8d\xc0\x05\x19\xed\x92\xf2\xe6\x04\x48\x97\xa0\xd6\xe9\x70\x5e\x5c\x30\x42\x4c\x42\x53\x47\xc6\x07\xbc\x73\x93\xb6\xaa\x16\xc6\x87\xd8\x63\x66\x8c\xdf\x5a\x37\x33\xb2\x42\x69\x07\xa1\xd4\x35\xbd\xeb\x6c\x93\x46\x70\xab\x91\x88\x96\x31\xad\x62\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\xf7\x08\xf7\x2c\x38\x1a\x80\x9e\x33\x82\xba\xbc\x9a\x7e\x47\x74\xab\x13\x2e\x0a\x3a\xae\x16\x68\x86\x2b\x6d\x2c\x59\xf0\xf0\x2d\xad\x2a\xfb\x9a\x04\xb0\x32\x51\x26\xf4\x6c\x34\x9a\x8a\xb3\x29\x4c\x06\x36\x1d\x21\xf7\x0d\x29\x74\x9b\x45\x45\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x2b\x5c\x3f\x93\xd0\xda\x41\xeb\x54\x22\x46\xab\x81\x9b\xf2\x3e\x35\xe3\xea\x9e\xef\x5c\xca\x92\x94\x96\x55\xf1\x8e\x4a\x32\x80\x77\x46\xf7\xc9\xf4\x85\xcf\x89\x10\xb4\x24\x66\xdf\x98\xcf\x1a\xc1\xe7\xb4\xec\xb0\xe3\x7a\x5b\x00\x6e\x3b\xba\xad\x8f\xf0\x5e\x27\x5a\x19\x67\x43\x46\xa6\x18\xd4\x63\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\xac\xa4\x05\x56\x44\x02\x56\xbe\x47\xb9\x3a\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x19\x6f\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x69\xcd\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\x21\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\xc4\xd4\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\xa3\x24\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\xf9\x9a\x3c\x94\x0e\x78\x65\x72\x7c\x5f\x5f\x5e\xff\xfc\xf6\xf4\xbf\xce\xdf\xc6\x6d\x01\x90\x75\x2c\xd4\x9d\x5b\x46\x7f\x69\x09\xc2\x35\x67\x53\x84\xab\x30\x05\x66\x00\x8e\xce\xe0\x03\x90\x8a\x79\x93\x65\x22\xf5\x5a\x7d\x09\x44\x09\x86\x15\x38\xe6\x53\x64\x04\xc5\xa2\x40\x12\xd0\x1f\x7d\x24\x8c\x1b\x03\xe0\x4f\x7b\xe4\x0d\x8c\x28\x7d\xc6\x8d\x41\x48\x19\xc2\x48\x52\x36\xad\x92\x6d\xc1\x64\x8f\x48\xaa\x3f\x64\xd8\x8d\x60\x14\xeb\x16\x49\x77\x8a\xf4\xfa\x10\x6f\x55\xe6\x73\x08\x74\x97\x99\x73\x01\x90\xfb\x86\x4b\xe2\x5c\x00\x46\xc7\xbd\x18\x21\x5c\x96\x22\x49\x8f\xb6\xc2\xc6\xdb\xe8\x86\x20\xc0\x34\x6b\x42\xbf\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x0e\x81\xbf\xc4\x37\x95\xc7\xdc\xce\x81\x68\x9e\x71\xa9\x2e\x46\x99\x16\xfa\x1f\x33\xac\xe0\x8d\x7a\x3d\x14\x47\x63\x6a\x2d\x33\x72\xaf\x88\xd0\x1a\xb1\x5d\xc3\xd4\x99\x4b\x72\x2e\xe8\x0e\x3e\x97\xdd\x9d\x1a\x67\xbd\x98\xf4\x81\xd0\x4f\xb4\xbf\xa1\xe1\x1f\xb8\x54\x97\x56\x5a\x87\x2c\x17\x61\x3f\x6a\xac\x8a\x59\x5f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xe0\xfa\x2f\x39\x5c\x94\x26\x9d\x6d\x46\x13\x84\xc3\xee\x9c\xd8\x34\xc8\x5c\xbe\xad\xfb\xa9\xad\xb5\xe4\xde\x04\x35\xcc\xea\x6d\x41\xe5\x88\x86\x97\xc7\xe8\x1c\x17\xb3\x84\x5e\xe8\xd9\x28\x03\x65\xa0\xe1\xa5\xe9\xc6\x0c\xcf\xf5\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4e\xc1\x8f\x09\x32\x21\x42\x98\x94\xc9\xf1\xc2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x91\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\xc3\xeb\xd1\x00\xdd\x9c\x8d\x06\x88\x0b\x74\x7d\x96\x86\x03\x09\xad\xd1\x17\x37\x67\xa3\x17\x5b\x5d\x81\x20\x9d\xe3\xe6\x6c\x14\xf1\x92\x55\x24\x61\x8d\x9b\xe1\x2d\x59\x44\x6a\x77\x39\x34\xcc\xa1\xdf\x58\x59\x06\x64\xa6\xb9\xc6\xcd\xc6\x6f\x13\x04\x97\x74\x4f\xb6\xf0\xe5\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\x76\x17\xe8\xbf\x27\x5b\xf8\xec\xb3\x27\x5b\x78\xf0\xd9\x93\x2d\x6c\xf4\xec\xc9\x16\x56\x9f\x3d\xd9\xc2\x27\x9e\x3d\xd9\x82\x7f\xf6\x64\x0b\x7b\xb2\x85\xe7\x2b\xb5\xf7\x64\x0b\xcb\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\x08\x9f\x3d\xd9\xc2\x03\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xf8\xf4\xb3\x27\x5b\x88\x7e\xf6\x64\x0b\x9b\x3d\xfb\xf4\x9f\x0d\x9f\x3d\xd9\xc2\x9e\x6c\x61\xf9\xd9\x93\x2d\x7c\xf6\xd9\x0d\xf7\xf8\x9e\x6c\x61\x4f\xb6\xf0\xc9\x67\x4f\xb6\xb0\x27\x5b\xf8\xe4\xb3\x27\x5b\x88\x78\x76\xce\xe9\xba\x27\x5b\xd8\x93\x2d\x7c\xaa\x8d\xbd\xb5\xb5\xd9\xb3\x27\x5b\xd8\x93\x2d\xac\x3c\x7b\xb2\x85\xd5\x67\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\xfc\xb3\x27\x5b\xf8\xda\xfd\x4e\x82\x48\xfa\x6f\x32\xe2\x15\x2d\x16\xc9\x79\x26\x57\x44\xf2\x56\x14\xfa\xc6\x86\xd7\xa2\x06\xde\xeb\x3d\x0a\x49\x4a\xf6\x8e\x25\xef\x5f\x05\x13\x17\x26\xf1\x0b\x3b\x07\x8f\x31\x05\x3b\x91\xc8\xef\x06\x78\x19\x8f\x20\x80\x97\x28\x2c\x94\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\x12\x09\x43\xee\x11\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x25\x13\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x23\x88\xf1\x6b\x45\x9d\x38\x4c\xc2\x9a\xad\x96\xad\xa6\xaa\xe7\x05\xba\xe4\xea\xca\x1e\xee\xad\xad\x57\x66\xc4\x82\x9b\xc2\x74\x6e\x99\xc8\x05\xef\x2e\xb4\x2f\xce\x9d\x44\xe7\x6b\x3e\x85\xf8\xa7\x6c\xf4\x4b\xfc\x98\xa2\x3a\x84\x2b\x41\x70\xb9\x80\x6e\x14\x80\xd7\xeb\xfc\x7f\xcf\x30\x6d\xb3\xa8\x30\x8d\x07\xf9\xe5\x3a\xd2\x67\xd0\x0b\xa4\xf7\x6b\x07\x7e\x87\x3c\x32\xbf\x58\x03\x0f\xf1\xa6\xe6\x8c\x1f\xbb\xaf\xcc\x1f\x0f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x6e\xdc\x31\x84\xab\x66\xf6\x69\xf3\x2e\x25\x3d\xf2\xf5\x82\xe1\x9a\x16\xee\xb0\x9c\x9a\xbd\x49\x39\x5b\x32\x0c\xd3\x46\x62\x7a\xaf\x87\x54\xd7\xad\xc2\xe3\x8a\x1c\xa3\x0b\xb5\xb6\x82\x7e\x5a\x2a\x33\xca\x02\x61\x4d\x84\xaf\xae\xd5\xab\x61\xaf\x19\x42\x06\xc2\xb4\x54\xe2\x8c\x20\xc2\x94\x58\xe8\x6d\x39\xe2\xe5\xb5\xde\x99\xbd\x5f\x27\xf3\x34\x24\xa2\x56\x73\x20\x56\x13\xd1\xaa\x79\x30\xa6\xe9\xf8\xd2\xbc\xd8\xd2\x2e\x0a\x60\x68\x66\xc2\xa4\x9d\xde\xb6\xd0\x37\xc3\x1a\x89\x85\xf8\x24\xb1\x07\xba\xc5\x11\x2f\xb5\xde\x23\x88\x11\x5b\xfe\x8c\x1a\x1f\xe0\x85\xee\xdc\x2d\x38\xed\xb0\xea\x14\x22\x3c\xc7\xb4\xd2\x07\x38\xb1\x03\x3e\xe9\x39\x53\xf0\x26\x53\xb8\xc1\xe2\xeb\x77\x69\xb3\xd8\xcc\xac\x5e\x72\x57\x31\xe3\x92\x30\x90\x97\xd8\x27\xe1\xf8\x14\x01\x2b\x62\x4a\x73\x45\xa7\x02\x81\x2f\x26\x88\xd4\x8d\x5a\x0c\x10\x99\x13\xb1\x50\x33\x00\x0c\x08\x6e\x40\x24\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x0c\x10\x77\x3e\xe4\xc4\xe6\xe1\x7e\xb0\x66\x55\x5b\x29\x63\x64\x81\x5a\x9e\x94\x25\x6a\x9e\x0c\xbb\x26\x37\x17\x0a\x4a\x15\x9a\x39\xb9\x4c\xf4\x53\xd1\x9a\xc6\x31\x44\xa2\x8c\x67\xe1\x2d\xf4\x22\xc8\xfe\xd0\x5b\xa2\xc6\xf7\xe0\x61\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x4d\xdd\x29\xfd\x4f\xe6\x7a\x2c\x38\x9b\xd0\xa9\x0d\x8e\x9d\xd4\x98\xe1\x29\x19\xfa\xee\x0c\x3b\xf5\xe6\x64\x7b\xa0\x0d\x5c\x3a\x76\x89\x51\x8e\x54\x63\xac\x14\x11\xec\x5b\xf4\xdf\x87\xff\xfa\xe6\xd7\xe1\xd1\x77\x87\x87\x3f\xbe\x1c\xfe\xed\xa7\x6f\x0e\xff\x75\x0c\xff\xf1\x1f\x47\xdf\x1d\xfd\xea\xfe\xf1\xcd\xd1\xd1\xe1\xe1\x8f\x7f\x7f\xf7\xe6\x66\x74\xfe\x13\x3d\xfa\xf5\x47\xd6\xd6\xb7\xe6\x5f\xbf\x1e\xfe\x48\xce\x7f\xfa\xc2\x97\x1c\x1d\x7d\xf7\xfb\xf8\x00\x62\x6a\xb4\x3c\x5f\xac\x3c\x53\xa4\xfc\x51\xe2\xe4\x56\xc6\x6e\xfd\xf0\xdb\x2b\x70\xe5\xf8\xdb\x00\xc3\xa7\x8e\xbf\x48\x76\xab\x5c\x4c\xba\xf6\xa9\x44\xbc\xa6\x4a\x59\x27\x02\x0e\xe9\x6b\x96\x5c\x3a\x56\x60\xd1\x89\x51\xa0\xa8\x0c\x69\x54\x3a\x4f\x50\x74\xb7\xfc\xfd\x0a\x4e\x2c\x86\x68\xdd\x54\xa4\x26\x4c\x81\xe0\x19\x3a\x93\x17\x3c\x82\xc7\xdd\x08\x0a\xcc\x18\x57\x88\xdc\x17\x84\x94\xb6\x93\x7b\xd9\x18\x3c\x7b\xd9\xb8\x97\x8d\x9f\x7b\x92\xdd\xda\x99\xfc\x9b\xa1\x2b\x7b\x25\x48\xa5\xe5\x82\x39\x62\x4e\x7d\x86\x9f\x7b\xea\x03\x3e\x41\x24\x96\xe2\xb2\x6b\xc4\xb2\x66\xe2\x58\x27\xa6\xe3\x36\xc6\x8b\x15\x4f\xd0\x12\x65\xba\x49\x30\xb7\xf2\x4b\x3a\xb0\x8d\xb1\x5a\x39\x8b\x6a\x7a\x27\x08\xd8\x25\x29\x5a\x41\xd5\xe2\x8c\x33\x45\xee\xa3\x4c\xcf\x1c\xdb\xa9\xc3\xad\x5e\xf7\x3b\x64\xbd\xa7\x36\xc1\xd4\x7e\x87\x78\x63\xa8\xc8\x1e\x24\xdb\x9f\xf1\xb6\x2a\xf5\x72\x8a\x96\xc1\x2e\x89\xdb\x1d\x17\x13\xbd\xd6\x06\xc8\x04\x6b\x0d\xbe\xdd\xe5\x2e\x3a\x88\x91\xe9\xce\x2f\x2d\x9d\xe3\x8a\x30\x15\xfc\xc5\x08\x40\x27\xe1\x1f\x3d\x43\x97\x3b\xd8\x32\x23\x41\xe7\xb4\x22\x53\x72\x2e\x0b\x5c\xc1\x55\xba\x6d\xfd\xec\xf4\x81\x7e\xc1\x7e\x10\xbc\x92\xe8\x6e\x46\xb4\xbe\xa2\xe5\x84\x01\xba\x81\xef\x77\x8a\x29\x43\x35\x17\x29\xfe\x41\xdb\xa8\x34\x48\x3b\xad\x72\x35\x58\xe8\xb5\x77\x88\x3a\x23\x60\xc6\x9c\x57\x96\x55\xb0\x5a\x74\xfd\xa2\xf1\x8e\x34\x70\xc6\xf0\x9f\x19\xb9\xfb\x59\xf7\x42\xa2\x49\x85\xa7\x1e\x48\xa7\x05\xd4\x32\x3c\x39\x1d\xe4\xf7\xe0\x44\x03\x65\x5e\x4b\x10\xae\xee\xf0\x42\x76\xf0\xc7\xae\x6d\x9a\xa0\xc5\xbc\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xc3\x11\xe4\xab\x9d\x9d\x8e\x7e\xbe\xfe\xe7\xf5\xcf\xa7\xaf\xdf\x5d\x5c\xc6\x83\x9c\xb8\x22\x46\xc1\x0e\x6e\x03\x7b\x47\xd8\x55\xf0\xa1\xdd\x63\x2e\x8f\xc1\x7b\x06\xb9\xf7\xac\xe4\x77\x89\x21\x06\xbd\xa7\x08\x8e\xbb\x7a\x70\xd3\x9c\x8a\x9a\x8b\x91\xe0\x13\x5a\x45\x7b\xa7\x73\x9d\xe0\xa5\xee\x38\x67\xe3\xa9\xfd\xb8\x13\xf7\x26\x1d\x74\x35\xd4\x15\x08\x6a\x0a\x49\x87\xfa\x35\xf1\xc6\x4d\x0f\x32\x6a\x00\xac\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\x4f\xb6\xd1\xdd\x88\xfc\xf3\x1c\xc1\x98\x8a\x17\xb8\x82\x42\x07\x69\x1b\x1f\x65\xf6\xb3\x2f\xf7\x2b\x00\x07\x63\xb7\x9d\x51\xc5\x71\x49\x4a\x27\xd7\x19\x2f\x89\x23\x41\x75\xca\x0e\xc4\x4e\x92\x3a\x72\x63\x80\x99\xd0\x9e\x43\x33\x37\x82\x38\xd3\x79\xb9\x79\x6e\xb8\x5f\x93\x9a\x7c\xd7\x8f\x44\xd9\x51\xf6\xf2\x6e\x52\xcf\x9c\x6f\xc6\x1e\x30\x3a\x81\x58\x36\xa8\xfc\x74\x02\x9b\x52\x1f\xb1\x17\x6f\xdd\x32\x24\x30\xa4\x67\x0a\x06\xc1\x4b\x76\x64\x77\x9a\xf9\xf1\x3b\xd2\xa0\xca\x6e\xa9\x9e\xc1\x49\x27\xa4\xdd\xb6\x71\x3a\x88\x81\x96\x25\xee\xc7\x8f\x50\x8b\xc3\xc9\x7f\x2c\x92\x69\x5c\xfc\x12\xa3\x61\x70\xb4\x1a\x41\x86\xab\xc7\x2b\x35\x76\x75\xd5\x32\x45\x6b\xe2\x52\x95\x87\x4b\x3a\x91\x30\x5f\x1f\x48\x4f\x0c\x98\x65\xa3\x23\xf4\x81\xc1\x79\x65\xa4\x44\x43\xc4\x78\xb7\x44\x84\x4d\xb8\x28\xc0\x4f\xb7\xd5\x0d\x5e\xe0\x06\x8f\x69\x45\x53\x84\x79\xae\x0d\x0e\x3c\xdb\x41\x7f\xc0\xa1\x59\x96\x27\xa5\xe0\x8d\xb9\x89\x5d\x0e\x51\x3a\x36\xa4\x8f\x55\x0f\x29\x21\x41\x61\x9f\xf4\x3b\x32\x15\x98\xa9\x2e\x49\x65\x65\xe3\xfc\x16\x75\x90\x1c\x4a\x00\x2e\xf3\x31\xd6\x9f\x96\x5a\x66\x84\xcb\x96\x7c\xae\x76\x8d\xfd\xee\xcc\x0d\x2e\x00\xab\xa3\xd1\xfb\xeb\x8b\xff\xb7\x74\x6e\xe2\x55\x3b\xf3\xec\x36\xf7\x95\x96\x07\xd9\xb6\xcd\x15\xa9\xf9\x7c\xbf\x71\xbe\xfa\x8d\xe3\x1d\x44\x5b\x27\xee\xb8\x6a\x59\xe8\x8e\x61\x41\xd7\x50\x9d\xa4\xeb\x8c\x7c\x8e\x6b\xff\xad\x61\xb9\x51\x41\x90\xfe\x09\x53\x14\x57\xd5\x22\xf4\x91\x2a\x6e\x6a\x62\x64\x29\xec\x16\xde\xae\x13\x5c\xc9\xe7\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\x77\xbc\x65\x79\x98\x40\x12\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x13\xf8\x16\x99\xc8\x79\x40\xf2\xd5\xd3\x73\x12\xd4\xac\x9b\x40\xb5\xf2\x09\x80\x4e\x0f\x37\xf6\x4b\x2b\x89\x5c\xaf\x57\x75\x81\xf4\x09\x8f\x8f\x1f\x0a\x82\x4b\x30\x30\x1b\xac\x66\x86\x7d\xa6\xc6\xf2\x96\x94\xe6\x83\xc4\xcc\x5b\x0f\xc3\x06\x28\xa5\x9b\xe9\x1b\x3d\xb9\x0e\x39\x0d\x0e\x61\xc3\xc1\x03\x58\xed\x14\x53\x6c\xab\xa7\x21\x41\xb0\xeb\x45\x78\xcf\xaa\xc5\x15\xe7\xea\x7b\x5f\x5c\x67\xdb\x27\xe3\x1f\x36\x1c\xd1\x77\x62\x82\x5f\x1a\x43\x97\x87\xb0\x71\x40\x2e\x06\x25\x81\x52\xc5\xa2\x5e\x90\xdf\xaa\x54\x14\x2d\x3b\x95\x6f\x04\x6f\xa3\x75\xb8\x9c\xf6\xe6\x9b\x8b\xd7\x70\xf1\xb5\x96\x9c\x81\x29\xb1\x68\x38\x65\xca\x79\xbc\x32\x06\x6d\x3e\x58\x1a\x8c\x50\xb2\x25\x67\xbc\x23\xf4\x0e\x2f\x10\xae\x24\xf7\x2e\x35\xb6\x2e\xc8\xe9\x22\xa8\xfa\xeb\x31\x57\xb3\x95\xd0\x29\x66\xf1\xa1\x9c\xd5\xf6\x06\x01\xc7\x43\x97\x4e\x47\xd9\x4a\xb3\x0a\xb0\xe5\x8d\x20\x05\x29\x09\x2b\x9e\xeb\x89\xd8\x36\xe5\x00\x9c\xaa\x4b\xce\xb4\x78\xdd\xf6\xb9\xba\xf0\xfe\x49\xbb\x1a\xe1\x29\x02\x57\xb6\x0d\x22\x62\xa0\xe7\x00\xe1\xda\xca\x14\xe0\xff\xc5\x04\xa2\x9e\x66\xd3\xfd\xbd\x1d\x93\x4a\x2f\x36\xad\x2a\x53\x41\x18\x2b\x03\x08\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\xa1\xf1\x29\x32\x25\x27\xd2\x17\x72\xc3\x12\x7d\xb8\x78\x8d\x5e\xa2\x43\x3d\xb6\x23\xd0\x38\x26\x98\x56\xc0\xf8\x01\xe0\x9b\xa5\x90\xec\x04\x40\x83\x3c\x25\xfb\xf7\xc2\xca\x11\xc4\x85\xb9\x5a\x06\x88\x71\x24\xdb\x62\xe6\xe6\x80\x72\xe6\x3d\xc2\x96\xfe\x31\x09\x0e\xbd\x17\x3b\xf9\xee\xc3\x0f\x92\x88\x6d\x1f\x5b\x7d\x1d\x7e\x78\xc2\xeb\x30\x34\x11\xf5\xf1\xef\x2f\x98\x39\xab\x35\x51\xb8\xc4\x0a\xdb\x6b\xd2\xfd\x60\xbf\x6b\xf7\x97\x65\xc2\x65\x29\xc9\x5b\xca\xda\x7b\x83\x74\xdb\x89\xb0\xc7\xf5\x39\xf4\x08\x8e\x17\x2c\x34\x0f\xe2\x76\x2e\x42\x91\x21\x43\xee\xa2\x77\x8c\x06\x0f\x58\xdd\x70\x4b\xb8\xec\x74\x6d\x08\x61\x56\xf2\x7a\xa5\x93\x90\x3e\x9f\x52\x1c\x3d\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x42\x41\xf8\xa5\x43\xf9\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x6c\xce\xbe\x21\x5d\xc9\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf0\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x6d\x26\x56\xe6\x1e\x74\xdc\x99\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x9d\x0f\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x58\x49\xd9\x14\x02\x56\x03\x24\x48\x65\x08\x6d\xad\x78\xbe\x35\x1e\xaf\x03\x90\x38\xae\x43\x4e\xdc\x74\x98\x55\xc3\xe7\x93\x15\xbb\xb9\x0e\xaf\x69\x7e\x73\xf9\xfe\x26\xcc\xe1\xc2\x6c\x61\x32\x55\xe1\x4f\xb6\x7e\x9d\x3e\x1b\x4c\xe7\xf2\x2a\x3e\x36\xa4\x33\xe9\x7d\xeb\x11\x9d\x4f\x77\x4a\xbf\x0c\xe5\xb9\x8c\xf1\xcc\xda\x85\x65\xc0\xe7\x6a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x87\x1c\x20\xff\x30\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2a\x43\x27\x08\xae\x52\x13\x34\xcd\xb3\xce\x0b\xe2\x4e\x81\x27\xb4\x59\xf5\x06\xf4\xc9\xd1\x53\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x7d\x17\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x6b\x4a\xf9\x07\xf8\x3c\x49\xa7\xf2\xc4\x4a\x94\xa1\x9e\xb8\x23\x44\x59\xe5\x33\x85\xc1\x5b\xc8\x94\xb4\x11\x84\xe4\xc1\xa3\xc2\x8f\x1e\xb6\x1e\xe4\xa7\x78\x68\xf6\xea\xf4\x00\xc7\x1a\x6c\xde\xad\x6b\x1d\xab\xbb\x2a\x8d\xb6\x78\x69\x67\x3d\x30\xf6\x90\x2f\xcc\x46\x71\xd6\xce\xa3\x31\x5e\xb7\x3e\x49\x56\xe9\x2f\x88\xcc\x57\x4a\x3d\x43\x05\x7c\xdb\x25\x54\x12\x53\xc9\x80\x00\xa5\x0b\x7e\x30\xd3\x1d\xc2\xdb\x07\x50\xfa\xc9\xfe\xe9\x41\x2e\x8a\xbb\xd3\xaa\xd2\x0b\x89\xf5\x35\x71\x20\x43\x74\x27\x98\x26\x33\x3c\x27\x5d\x11\x68\x32\x99\x90\x02\x8c\x85\x70\x14\xe9\x25\x92\x0f\x29\xa0\x98\x42\x3a\x5d\xc5\x4d\xdb\x18\xd5\xf4\x5e\xf7\x30\x6c\x31\xc4\xa0\xb2\x12\x02\xff\xeb\xbf\x4e\xa8\x84\x81\x00\x7c\xe0\x99\x5b\x06\x7a\x85\xc2\x46\x5c\x72\xb4\xd2\xd7\x96\xfe\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2a\x72\x8c\xd6\xa4\xef\x3c\x59\x04\x19\x7d\x79\x14\xf9\x11\x63\x55\x68\x57\xe2\x55\xa9\xa4\x27\xa6\x0c\x24\x14\xa6\x49\x66\x3c\x19\x75\x25\x6e\xbf\x88\xe6\x3b\xa2\xbd\x2d\x13\x7f\x90\xfb\x78\x4d\xb4\x37\x55\xe7\xf7\xa4\x58\x2a\x29\x59\xd7\x50\x39\x8b\x43\x23\xad\xf2\x85\xef\x92\x6f\xad\x1d\xd1\xe9\xed\x08\x77\x45\x88\x9e\xd9\x09\xa7\x4e\x4d\x36\xff\xd4\x8a\x73\x7f\x11\xa4\xf3\xb6\x07\x1c\x73\xfa\x9f\xfa\xe6\xa2\x6c\x6a\xc9\x4c\xb8\xf0\xd4\x4f\x49\xdd\x72\xfd\x80\x8a\x07\x9c\x2b\x74\x78\x70\x72\x70\xb4\xb2\x17\x0e\x64\x88\x87\x36\xa9\x9b\xdd\x80\x24\xad\x9b\x6a\x01\x63\x38\x30\x45\x0e\x12\x8a\x87\xe9\xc7\x21\xeb\x3c\x5b\xb0\x9c\x91\xaa\x1a\x20\xa9\xef\x69\xec\x88\xda\xcc\xa7\xfa\x47\x4a\xb4\x85\xb1\xe7\x0f\x0f\x7e\x3d\x18\x20\xa2\x8a\x23\x74\xc7\xd9\x81\x32\x9e\x59\x74\x03\xca\x6e\x52\x9f\x7c\x27\x16\xbc\x85\x3a\x7c\x66\xd9\x3c\xb7\x5f\x81\xb5\x9e\xd6\x1a\x65\xc2\xb0\x03\x90\x2a\xa1\xae\x9c\x7e\xce\xef\xa9\xd2\x32\x53\xb5\x60\x4f\xbd\x34\x2a\x0d\x81\x22\x02\x58\x42\x85\xdd\x93\x19\xc1\x95\x9a\x2d\xbc\x9a\x65\x4a\x9c\x49\xd4\x32\xfb\x4d\xba\xb0\xdf\x81\xfc\xb6\xdd\xcd\x34\xb3\x95\x16\x77\xba\x50\xb4\xed\xe3\x67\xeb\x44\x9b\x7a\xd0\xfd\x1a\xd1\x50\x3b\x9a\x94\xb9\xca\x44\xff\xf1\xeb\x2b\x01\x3d\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\x2a\x8d\xfc\x7a\x47\x62\xa0\x5b\xae\xfb\x9c\xb5\xdc\xf1\x88\x0b\x85\x98\x2f\xb9\xa7\xcf\xd6\x14\x56\x91\x88\x39\x2d\xc8\xf1\x13\x54\x17\xce\xc5\xba\x99\x7e\x10\x10\xa0\x36\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xac\xf3\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\xae\x3f\x74\x69\xee\x13\x49\x08\x5a\xe3\x57\xd5\xa2\xc3\xfc\xcf\xb8\xe2\xe3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x0f\x0b\xdd\x03\xca\xa6\xc7\x75\x79\x94\x50\x8d\x05\x05\x95\x62\xad\x1b\x67\x29\x20\xe2\xa2\x64\x9e\x27\x94\x4a\x1f\xca\x1b\x2f\x60\x52\xb6\xee\x2b\x44\xae\x97\xdf\xa2\x17\x2f\xa2\xde\xa2\x97\xe0\x4d\xa6\x5a\xfd\x3f\xdc\xdc\x8c\xde\xf4\x2b\xf5\x33\xf8\x10\xbd\x39\xbf\xf1\xd5\x19\xf4\xee\x32\xd9\x17\x7b\xa9\xbd\x33\xd5\xfa\x33\x38\x88\x37\xa9\xf0\x0f\x0c\xb6\x5a\xe5\xc2\xe3\x6a\x81\xee\xb0\x49\xbd\x96\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x12\x21\xc1\x1a\x22\x78\xfb\xc1\x8f\xa0\x4f\xd9\x96\xed\xac\x95\x8a\xd7\x68\x66\x87\x6a\xe6\xb0\xab\x7f\x62\x74\x23\x73\x04\xc1\x19\x24\x91\x20\x8d\xb1\x96\xec\xdf\x7c\x15\xb6\xd0\x8a\x14\x32\xf3\x1c\xb0\xe4\x63\x54\x84\x53\x65\x15\x7d\x53\x72\xd9\xca\xa8\xa4\x1a\xb8\xe6\xc9\x52\x6c\x0a\x65\x2a\x38\x85\xd2\x8b\x4e\xb9\x97\xa4\x47\x4b\xf2\x94\xaf\x42\x59\x4a\x58\xa1\xec\x95\x89\x90\x8d\x09\xd8\xcd\x65\x90\x02\xba\xa3\xa9\xf4\x69\xc8\x91\x2c\x38\xe4\x45\x81\x19\x67\xb4\xc0\x15\xfd\x37\x29\x51\xdb\x70\x86\x78\xab\x9a\x56\x81\x2b\xa8\xc0\x92\x0c\xe7\x58\x50\x2d\x50\x4d\xfd\x3f\x0f\xd9\x60\xfa\xb4\x2b\xce\xc1\x4f\xe2\xa3\x63\xa6\xc7\xe9\xdd\xcc\xa4\xcd\x20\x57\x2b\x3f\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\xe4\xc2\x2c\x9f\x59\x87\xd5\x0c\x20\x48\x05\x44\x12\x2d\x82\x0d\x04\xa7\x36\x1b\x76\x20\x43\x20\xab\x15\x9b\x28\x12\x4c\x15\x64\xb1\x64\x07\xeb\x1e\xae\xce\x61\xa6\xa0\xf8\xe3\x9b\xd5\x61\xb9\xbe\x31\xd1\xba\xfd\xc5\xe9\xe5\xe9\xcf\xd7\x1f\xcf\x7e\xbe\x3c\x7d\x77\x9e\xf2\xea\xe4\x52\x1b\x39\x8b\x6d\x64\x2b\xb7\xf1\x48\xc5\x88\xf4\x23\x8b\x19\xd9\x9d\x78\xf8\x35\xf4\x26\x64\x4f\xb2\x36\x00\x14\x65\xe5\x19\xe8\xb4\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\xca\xa8\xa2\xb8\x7a\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\x61\xa4\x97\x5e\xd8\x48\xd3\x21\xeb\xb6\xee\x83\x0f\x66\x58\x9a\xa0\x33\x29\xd1\x98\x4c\xb8\x20\x10\x35\x61\x5a\x22\x35\x5d\xfc\xd8\x8c\x4f\x3d\x61\xbd\xb8\x3b\x2e\x6e\x2b\x8e\x4b\x79\xd2\x70\xf3\x3f\xc3\x8a\x4e\x48\xb1\x28\x2a\xf2\x3b\xdf\xff\x61\x92\x9a\xbe\x1b\xee\xf1\x86\x08\x0a\xd0\x85\x5d\xd8\x35\x3f\xf0\x3b\xc4\x27\x8a\x30\x74\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xd3\x3e\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x88\x0c\x49\xb9\xd3\x91\x2f\xdb\xc7\xcf\x87\xbe\xec\x0f\x27\x6d\xd5\x0f\x7f\x99\x90\x58\x9e\xd8\xd7\xab\x63\x9f\x50\xf3\x0a\xfa\xe3\x45\x11\x66\xa5\xc3\xc6\x7c\x7d\xfb\x44\x15\xcd\x35\x2f\x6e\x33\xb9\x5d\x6f\xce\x46\xe6\x6d\x4b\x78\x16\x73\x03\x6b\x2d\x93\x23\xac\x7f\x05\x0a\xe8\xde\xe9\xba\x33\x4e\xd7\x83\xae\xd4\xd4\xa6\x0e\xd4\x83\xbd\xb5\xd5\x3d\x4e\xf1\x11\xfd\x52\x0d\x7b\x6b\xeb\x81\x67\x6f\x6d\x6d\xf0\x18\xb4\x3b\x64\x8e\xbe\x11\xb8\x20\xa3\x5d\x52\xde\x9c\x00\x41\xa5\xad\x25\x8a\x3a\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x53\x3d\x92\x49\x5b\x55\x0b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\xeb\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\xd7\xb6\x88\x24\x2c\xde\x9d\x8e\xc3\x15\x44\x92\x4e\xf5\x74\x01\xd0\x73\x46\x90\x61\xfb\x71\x35\xc2\xba\x8e\xe8\x56\x27\x5c\x14\x74\x5c\x2d\xd0\x0c\x57\xda\x58\xba\xa3\x6a\x86\x30\xba\xa5\x55\x65\x5f\x13\x3f\x51\xd7\xae\x6a\xa3\xd1\x68\x2a\xce\xa6\x30\x19\xd8\x82\xc7\xef\x1b\x52\x28\xa8\x5b\x4f\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x9b\x01\x3f\xee\x02\xdf\x5e\x9f\x62\xd4\xf2\x24\x98\x0a\x53\x9f\xdc\xf3\xfd\x2c\x40\xf4\xde\x95\xdf\x35\x15\xaf\xa2\xfb\x64\xfa\xd2\xaf\x77\x65\x3e\xf3\x5c\x0f\x36\xc5\x49\x6f\x0b\xc8\xb9\x8b\x6e\xeb\x23\xbc\xd7\x89\x56\xc6\xd9\x90\x91\xa9\xc9\x28\xb7\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xf3\x93\xa5\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x0b\x34\xa7\x38\xba\x27\x90\xbd\xde\xed\x28\x74\xc8\x38\xe2\x8d\xbe\xba\x5a\x46\xd5\x02\x22\x7a\xb3\x56\xa1\x92\xdf\xb1\x84\xc4\x90\x1b\x0b\x73\xc0\x68\x4c\x14\xb6\x3e\x70\x7d\x08\x3c\x79\x33\xf0\x32\xeb\xb3\x07\x18\xf2\x9b\xb5\x1b\xc0\xf3\x39\x4f\xb1\x4a\x90\x12\x6b\xb4\x79\xb3\x9e\x9f\xde\x76\x54\xda\x78\x5d\x22\x61\xec\x6e\x50\xb0\xe9\x13\xcd\x5b\xb5\x23\xf7\xc8\x43\xae\x23\x93\x8b\x1f\x18\x89\xb4\x26\x12\xf1\x36\x13\x31\xfe\x2b\xdb\x5c\x4e\x0b\x6f\xef\x77\x5a\xfb\x48\x55\xd2\xa8\xf2\xa8\x39\xb6\xd8\x03\x2c\xe3\x36\x61\x30\x20\xda\x1b\xb7\x93\x09\x11\x70\xd3\x41\x87\x57\x60\xf7\xbe\xe0\x90\xbb\xc3\xe2\x9c\xb7\x16\xf0\x45\xd4\x00\x48\xce\x6d\xd6\xfb\x03\x4d\x5a\x36\x40\xa8\x27\x2a\x88\x04\xd2\x6a\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x50\xa0\xa7\xe5\xd6\xc1\x38\xdf\xb3\x38\x4c\x62\xde\xfd\xb0\x8e\x9e\xc2\x6e\x8b\xa2\xe2\xd2\xe6\x71\xc2\xba\x14\x33\xcc\x18\x71\xce\x28\xaa\xc0\x93\x3d\x26\x84\x21\xde\x10\x03\xca\x8b\xea\x0c\x46\x92\xb2\x69\x45\x10\x56\x0a\x17\xb3\x63\xdd\x3b\xe6\xf6\x42\x97\x30\x69\x3f\x91\x4a\x10\x5c\x9b\x3d\x21\x48\x8d\xa9\x69\x1e\xe1\x42\x70\x29\x51\xdd\x56\x8a\x36\xfe\x65\x71\x5e\x44\x02\xa9\xeb\xd2\xe4\xcf\xb9\xb5\x82\xb4\x92\x2e\x33\x73\xd0\xf5\xd0\x0e\x9f\x87\x55\x55\xc0\x75\x36\xd0\xdf\x92\xba\x51\x0b\xa4\xa7\xb6\x8a\xce\x8d\x99\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\xdc\x68\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x22\xc8\x40\xf4\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x39\x88\x5b\x3b\x57\x42\xc3\x6c\x1c\x37\x23\xb0\x75\x9c\x82\x63\x7a\x64\x3f\x0a\xba\x10\x14\x04\x76\x35\xe1\xb5\x3e\x9b\x22\x57\xa0\xce\x85\x3b\xd7\x83\x5e\x72\x74\x67\x5b\x40\x2a\xcc\x8a\xd4\x81\x0d\xc5\xc8\x5c\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xc9\x65\x8c\xc2\x62\x4a\xd4\x99\x1b\x7f\x6c\xf6\x6e\x0e\x69\x13\x56\x4e\x0f\x1d\x44\xdd\xe2\xc0\x3a\x8c\x78\x09\x6c\x12\x1d\xe3\xc7\xba\x72\xee\x66\x5c\x91\xb6\xd7\xcd\x03\x35\xe2\x9d\x45\x65\x32\xbc\x7c\x47\x65\x83\x0b\x22\xd1\xe1\xc5\xe8\x6c\x80\x46\x17\xaf\x6d\x1a\x17\x9f\x2c\xb3\xeb\xc5\x4e\x8b\xbd\x04\xcd\xd9\x7d\xa8\x80\xbd\xaf\x4e\x13\x74\x29\xa0\xd9\xb2\xfd\x1d\x79\xa3\x2c\x7a\x66\x56\x6f\x02\xb0\xd0\x68\xdd\x54\x50\x27\x12\xc9\x16\x2c\x23\x1b\xb8\xd0\x5b\xdb\xd8\x23\xf6\xd0\x92\x8e\xe0\xc8\x92\xd1\x47\x06\x71\x4c\x2b\x7e\xb8\x76\xcd\x21\x96\xed\x26\xca\xea\x01\xa0\x30\x2b\xfb\x95\xe7\x88\x81\x5c\x33\x0b\x15\x8f\xbf\xdd\x23\xdd\x61\x81\x11\xf5\x8e\x48\x89\xa7\x64\x14\x89\x03\xca\x71\xf6\x3a\x0f\x37\x00\x88\x3a\x79\x3d\x23\x86\x0a\x4b\xf1\xe0\x93\x30\xbb\x32\xf4\xda\xd4\x66\x20\x51\x3d\x70\x67\xeb\x4e\x50\xa5\x08\x5c\x0f\x50\xeb\x09\xb6\xee\x32\xbd\x67\x3f\xab\x33\xaa\x3d\x3b\xe9\x61\x7b\x5a\xef\x67\xa5\xc9\x8f\x1c\x13\x34\x16\x94\x4c\xd0\x84\x42\xc2\x26\xa4\x32\x0e\x4c\x9d\x02\x0c\x80\x79\x2c\x25\x11\x30\x6c\xeb\x8f\x73\xc3\x8f\xeb\xcf\x3f\xec\xf8\x95\x68\x59\x81\x83\x22\x9e\xc0\x3e\x46\x27\x68\x0a\xe9\x93\xd6\xfb\xf4\xa7\x97\x7f\xfb\x0b\x1a\x2f\xb4\xa1\x04\x67\x52\x71\x85\x2b\xd7\x01\x54\x11\x36\xd5\xab\x08\xba\x4e\xdc\x85\xdd\x63\xb0\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\xba\xf3\x40\x31\x39\x29\xc9\xfc\x24\xd8\x42\xc3\x8a\x4f\xe3\xde\x7a\xe6\x09\x9f\xda\xa6\x8c\x05\x44\xe4\x3e\xd1\xbc\xa2\xc5\x62\x6b\xf7\xa9\x75\x85\xa1\x19\xbf\x33\x5e\xd4\xd5\xa3\x1a\x90\xc1\x34\xbc\x69\x2b\x98\x38\xf4\xbd\x67\xf0\x6b\x25\x59\x26\x47\x4a\xf5\xce\x07\xd2\x0e\xd0\x0b\xb6\xd9\xa5\xab\xde\xe6\x0e\xbb\x6e\x72\x4b\x4d\x61\x83\xdd\xbe\x52\x49\xb4\x1b\xfc\x7b\x5c\x55\x63\x5c\xdc\xde\xf0\xb7\x7c\x2a\xdf\xb3\x73\x21\xb8\xe8\x8f\xb9\xc2\x5a\x99\x9e\xb5\xec\x16\xea\xec\x76\x74\xb5\x7c\x6a\xc1\xbc\xc0\x2c\xd9\x9f\xd8\xa8\xce\xb8\x51\x1a\x02\x51\x67\x0b\x38\xe7\x77\xd7\x32\xb9\xa7\x9d\x87\x9b\x21\xa2\xfb\x1c\xaf\xe1\x84\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\xc8\xf5\x97\x03\x73\x01\x80\xea\xab\x6d\x9c\x1a\x57\x55\xac\x4e\x13\x8a\x80\xef\xa3\xcb\x57\xef\xc0\x91\x57\x5b\x3b\xdd\x5f\xec\xab\xb9\xb9\xf9\x27\x68\x62\x54\x49\x52\x4d\x06\x86\x0f\xc6\xfb\x93\x0f\xc0\xac\x39\xb0\x57\x5e\x3c\x97\xd0\xf6\xbd\x25\x73\x5e\xb5\x35\x79\x4d\xe6\xb4\x88\x43\x0e\xf4\x56\xa5\xf7\x36\x17\x1f\xab\xa8\x04\x5d\x72\x5c\xf1\xe2\x16\x95\xf6\xcb\x20\x47\x65\xb9\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x38\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x5d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x0c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\xff\x36\x44\x27\x2b\xa6\xba\xaf\xa8\xe6\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\x3e\x6e\x90\x01\x85\x90\x96\x9c\xd4\x9b\x17\xe6\xd1\x1f\x35\x56\xd6\x3e\x72\xde\x0b\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xdb\x9a\x84\xd5\x54\x96\x1a\x37\xc3\x5b\xb2\x88\xdc\x70\x89\xc7\xe5\xa1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x11\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x67\xc6\xa2\xeb\x76\x0c\x67\x0a\x7e\xfe\xb8\xf4\x60\x59\x95\xa7\x6d\xdf\x55\x1f\xbb\x15\xef\x5f\x55\xfa\x13\x7f\x57\x99\x5f\x7d\x4d\x37\x14\x8c\xef\xb9\x5e\x50\xbe\xf3\x99\xe4\x70\x12\x36\x11\xae\x35\xbb\x33\xfa\xf7\x58\xcf\x13\x66\x8e\x74\x60\x33\x5b\x0f\xd5\xb1\xa9\x37\x90\xd0\x01\x7d\x14\x6d\xa3\xe8\xe0\xdb\x83\xad\x5e\x8e\x66\x65\x04\x6f\xf0\x14\x4c\xda\x5d\x58\xa0\xe5\x3e\x85\xf4\xb6\x33\x7e\x17\x8a\xcc\xc6\xfe\x4a\x4b\x4c\xc7\x91\x3e\xe3\x49\xab\x63\xb0\xbe\x6e\x47\x58\xb3\xdc\x54\x89\xb8\xc3\x0b\x84\x05\x6f\x59\x12\x71\x01\x84\x32\x7d\xa8\xfb\xdd\xd2\x60\x2f\x39\x23\x0e\x56\x93\xd2\xca\x4d\xcf\xf5\x0d\x08\x23\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x3a\x27\x57\xb6\x7c\x7a\x10\x06\xbd\x98\x8c\xb8\x94\x74\x5c\x41\xaa\xa5\xe2\xe8\xdc\xd4\x96\x5f\x1d\xa8\x87\x7a\xc1\x88\xb9\x08\x89\x50\x13\x7a\x78\x68\x4e\x70\x08\xd1\xd6\x0d\x24\xe0\xb4\x76\x4b\x05\x85\x75\x5d\x52\x41\x2f\xbd\x0a\x6a\xee\xbd\xad\x8e\xd5\xd5\xd4\xdf\x05\x49\xf2\xce\x06\x15\xba\xa2\xf9\xd4\x15\x65\x86\x8f\xee\x04\x55\xf6\x70\xdf\x51\x49\xd0\x21\xb8\x33\x96\x36\x63\x12\xf7\x73\xe8\xfc\x4a\x2c\xae\x9f\x83\xbb\x59\x2c\x1f\xdd\x5d\x58\xa5\x55\x79\xd2\xe5\xcc\xdc\x59\xcf\x57\xb7\x82\x56\xfa\x77\xf7\xf2\x0c\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x45\x12\x7b\xd5\xc5\x04\x85\x22\xd1\x22\x0e\x82\x20\xe4\x0c\x4b\xc4\x38\xaa\x09\x06\x48\xb5\xbe\x5d\x9c\x14\xec\xd1\x40\xe7\xeb\x83\xd9\xec\xe6\x1a\x0b\x2f\x04\x2b\xae\x5f\x53\x69\xc5\xb3\x96\x23\xd6\x74\x31\x40\xac\x1a\x97\x29\x64\x0c\xc1\x9c\x76\x8b\x77\xdc\xc1\x9c\x97\x7b\xd2\x5d\x1c\x4b\x7d\x79\x8c\x7e\x0c\x6c\x75\x73\xdd\xbc\x89\x2c\xaf\xf1\xe7\x75\xb0\xb6\x24\xfc\x89\x79\x96\x87\xeb\xaf\xc5\x95\xb1\xae\xef\xb1\xef\x70\x42\x1f\x3e\x3f\xd4\x41\x20\x0b\x1d\xaa\xdb\x80\x60\x6c\x79\x15\x9b\xa3\x9c\x46\x12\xee\xa2\x19\xde\x4f\x34\x25\x8c\x08\x6c\x03\x12\x0e\xd4\x6d\x43\xfa\x58\x72\x96\x7a\x20\x3e\xb3\xe1\xb4\xbc\xff\xbc\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x74\xda\x6d\xa8\x65\x9d\xc6\x92\x73\xd4\x4b\x64\x7a\x66\xf3\x07\x2c\xbd\x7a\x51\x7e\x69\xe9\x1c\x57\xc4\xd0\xe3\x3b\xd1\xb0\x55\x65\x42\xb6\xe3\x5d\x35\x1b\xad\x7d\x08\x66\xc7\x7a\xb4\xc4\x83\x16\x64\x26\x7d\xe2\xc5\x0b\x74\x68\xda\x38\x30\xb4\xd8\xdb\x55\x72\xed\x5a\x9d\xdf\x37\x09\x45\x61\xf3\xad\xd7\xf9\x7d\x83\x01\xe0\xd1\xec\xc4\xc2\xfd\x17\x99\xe1\x39\x01\x16\x72\x5a\x61\x51\x41\x1a\xc9\xb5\x99\x32\x34\x6e\x15\x22\x6c\x4e\x05\x67\x00\xaa\x02\xba\x28\x2d\x99\x04\x99\x10\x41\x58\x41\x24\xfa\xfd\xe1\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x14\x0e\x48\x03\x50\xf6\x69\x63\x57\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x74\xa6\x2c\x5d\xc3\x12\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xed\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\x3f\xe3\x52\x9d\x56\x14\xcb\x4d\xfd\xd8\x69\x5b\xfd\x87\xae\x59\xc8\xf6\x63\xb6\xaa\x23\xae\x3c\xc4\x40\xf7\xcc\xc0\x9c\x2e\x46\x16\x8b\xee\x76\x25\x65\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd8\x13\x83\x38\x9a\xa0\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x66\xbc\xb2\x79\xd7\x0e\xcd\x30\x26\xea\x8e\x10\x86\x2e\x46\x30\xe7\x7a\x2a\x0d\x2f\xe3\xfa\x99\xb7\xca\x31\x53\x62\x61\x0f\xf4\xc6\xbd\x09\xd6\x0c\x56\x61\xd3\xa3\x9b\x10\x7f\x8a\x8f\x3c\x0d\x11\xdd\xf4\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\x7e\xf0\x0b\xea\xd8\x74\xf0\x98\xcf\x09\xac\x77\x59\x8a\xc8\x2c\xed\xad\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xe4\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x86\xc7\x2d\xdf\xad\x78\x31\x3a\x7b\xca\x1b\xf1\x83\xf5\x2e\xe9\xa6\x0f\x24\xa2\x4d\xd1\xe5\x75\x6c\xba\xf4\x5d\x2e\x43\x40\x67\x16\xe1\x68\x8f\x75\xae\xcf\xba\x82\x8d\x4f\xad\x54\x20\x66\xda\xd5\x57\x9a\xa5\x15\xb7\xc0\x11\xf0\xfc\x34\xbc\x3c\x5e\x9e\x6a\xfb\x17\xf1\xd3\xed\xdc\x4a\x46\x85\xb1\xde\xb4\x81\xa7\xf6\x59\xba\x42\x01\x26\xe9\xfd\x67\xb1\x55\x0e\xb7\xb7\xb0\xa3\x8b\xd7\x5b\x3c\x17\x0d\x2d\x9f\xf7\xb9\xf8\x20\x37\xa6\xd5\xcf\x3a\x81\x50\x7d\x33\xef\x0c\xc6\x60\xa6\x6d\xc1\x4d\xfb\xd7\xc0\x88\xc5\x15\x6a\x04\x91\x84\xf9\xb3\x53\xae\xcb\x37\x84\x6b\xb1\x3f\x8a\x81\xfe\xf7\xa4\xad\x36\x55\xfd\xb9\x08\x28\x75\x3c\xff\x10\xf6\xec\x21\x10\x63\xc0\x73\x4c\x2b\xf0\x3b\x05\xfc\xb0\x2b\x1d\xb0\x69\x51\x1b\xf6\xa0\xe2\xb8\x84\x98\x17\xba\xd5\x77\x56\x85\x6a\x5e\xb6\x95\x81\x68\xa1\xb3\xd3\xd1\xcf\xd7\xff\xbc\xfe\xf9\xdd\xfb\xd7\x1f\xde\x6e\x4c\xa3\x65\x72\xc3\x49\xb7\xc5\x07\x08\x23\x46\xee\xa0\xe7\x0c\xac\xae\xc2\x3a\xba\x3d\xbd\xa2\x16\x8e\xd7\x36\x4b\xd0\x04\x7d\x0d\xe6\x62\xd2\x56\xfa\x47\x1b\xf6\xa0\xa6\x8a\x4e\x31\xbc\xac\xb3\xf5\xc7\x82\xe0\x5b\xde\x2a\x34\x6f\x2b\x46\x04\x1e\xd3\x8a\x6a\xd5\x18\x91\x39\x61\x06\xe8\xa7\xff\x40\x77\x32\xac\x52\x4b\x37\x6d\x3c\x2c\x62\x6c\xcb\x23\xea\x49\xd5\x2d\xe3\xc2\xfa\xd1\x2c\x4d\x24\x7c\xd9\x08\x3a\xa7\x15\x99\x12\xcf\xbf\x16\x43\x03\xdc\xc7\x97\xe0\xaa\x99\xe1\x61\x45\xe6\xc4\xf0\x38\xe9\x2b\x42\xef\xa8\x19\x67\x5c\x98\x80\x93\x61\x24\xb7\x37\x04\x30\xdb\x98\xc3\xea\x6a\xf6\x9a\x2c\xd6\x6b\x97\x4e\x6a\xb3\x48\x9f\x4c\x58\x6d\x0e\xd1\x48\x93\x55\xd7\x3e\xc4\xed\x56\x20\x4c\x83\x1e\x6d\x8c\x16\x5e\xef\xf8\xea\x0c\x4f\x78\xbb\x93\x31\xf6\xb0\x60\x64\xd0\xa8\x43\x57\x42\x09\x98\x5e\x62\xe6\x7c\x63\xbd\x1b\x1c\x61\xa3\xb6\xaa\xae\x49\x21\xc8\xa6\xe0\xdd\xb4\xa9\xbf\x58\x6a\xfb\x21\xb7\x4c\xe0\x7c\x87\x22\x2e\xf6\xc7\xac\xab\xd4\x10\xa4\x23\x77\x34\xdb\x4d\x5b\x55\x26\xba\xbf\x70\xcb\x09\xa3\x95\x41\xda\x08\x95\x2e\xb5\x3d\xe6\x36\xe9\xad\xb1\x24\xbe\x6b\x6e\x79\x1b\x2c\x65\x17\x4c\x9d\xd3\xb2\xc5\x15\x74\x0b\x3c\x90\x36\x73\x1b\x9b\x52\xa4\x56\x22\xd6\x91\x95\xf6\x37\xe4\xf5\xe9\x64\xd5\x89\x99\x93\xdf\x99\xc1\x2c\x28\x9b\x0e\xe1\x13\xdd\x4d\x3b\x9e\x21\x67\x43\x3c\xdc\x14\x38\xff\xac\xdc\x54\x6f\x79\x81\xab\xf7\xe0\xd7\xb9\x72\xbb\xcd\x09\x74\x89\x08\xe3\xed\x74\x06\xd3\x2b\x6a\xec\x68\x63\x2b\xa2\xa0\xba\xab\x4d\xfa\x8a\xf1\x47\xf9\x9d\x5d\x5a\xa7\x52\x58\xd1\xb7\xbf\xb3\x9f\xd0\x55\x95\xe2\x3d\x8a\x45\xd8\xe5\x08\x63\x5c\x06\x82\xdb\xce\x6c\x64\xcc\xad\x7f\xa9\x92\xc9\x84\x14\xca\x01\x41\x8c\x1b\x6f\x00\xb1\xc2\xb2\x35\xdc\xd0\xb8\xb8\xbd\xc3\xa2\x94\xa8\xe0\x75\x83\x15\x05\x15\x63\x11\x8b\x12\x71\xb9\x07\x26\xc7\x0d\xf2\x52\x8f\xd1\x05\x93\x0a\x83\x0c\x74\x14\x17\x7a\x85\xbb\xb4\x54\xc8\x5e\x35\x0c\x61\x33\x22\x08\xc2\x22\x0e\xad\x83\xab\x5a\x2b\x9b\x05\x11\x7a\xef\x57\x0b\x74\x27\x38\x8b\x4c\x0f\xdf\x50\x28\xf1\x39\x11\x73\x4a\xee\x4e\xac\x35\x3d\xd4\x83\x1b\x9a\x2d\x2c\x4f\xe0\x24\x9c\xfc\x0e\xfe\xdf\xf3\xf1\x4b\x2d\xb9\x87\x6a\xdc\xc4\xbb\xfd\xbe\x82\xd8\x0f\x65\xb4\xe3\xbd\x79\x52\x65\xe3\xad\x55\x26\x6c\x6d\x0a\xfa\x6f\x23\xc7\x03\xa5\x7d\x4c\x2a\xce\xa6\x41\x55\x0e\x6d\x9c\x6c\xaa\x15\x30\xaa\x7a\x86\x00\x00\x04\xa0\x58\x3b\x44\x21\xb9\x28\x81\xef\x88\x1a\x50\x76\xaf\x75\x28\x9f\x1c\x30\x2d\x61\xb6\xa9\x83\x9b\xf6\x5a\x87\x5c\x7d\xd9\x19\xb6\x26\x65\xd9\x31\xd8\x2b\xae\x8d\x11\xe2\x8b\x38\x1b\x63\xc1\x62\x38\x11\x2e\x0a\x2e\xca\xcd\x8f\x8a\x56\x75\x94\xa7\x8c\x32\x54\x0c\x86\x2c\x03\xf4\x5e\xad\xe4\x60\xb6\xdc\x4f\xb0\xc4\x45\xdd\x23\xd6\xb1\xde\xaa\x0d\x9b\x6f\x19\xfd\xa5\x25\x08\xd7\x5c\xeb\x7d\x55\x4a\xc2\xd6\xf2\x4a\xd6\x78\x01\x8a\x3d\x4c\xda\x5b\xc7\x81\xa8\x2d\x3b\xad\xbe\x0d\x00\xec\x49\x83\x42\x21\x03\xf4\xb6\x5f\x39\x64\xa0\xc7\x79\x6d\x58\xfb\xed\x47\x9b\xdb\x7a\x40\xae\xc3\x5b\x51\x90\x2b\x73\x11\xd5\x96\x20\x62\xcd\xb4\xea\xbd\xa7\xf0\x2d\x61\x26\x66\xa9\x97\x14\x92\xb5\x5a\x01\x3b\xad\x98\x91\xb2\xad\x36\x5f\xe2\xf1\x02\x4d\xb4\x3a\x6b\xb1\x2e\x33\x3a\x9d\x11\xa9\x9c\xe7\xf3\x04\x28\x0d\x4c\xda\x1c\x2e\x66\xbe\xbb\x20\x7f\x03\x32\xb4\x0e\x2c\x53\xe3\xfb\xcd\x09\x2e\xc0\x78\xb5\xac\xb8\xc6\x93\x20\xdb\xda\xdd\xfd\xcb\x9b\x49\x1e\xa3\xb7\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf1\x69\x03\x7a\x3c\x80\x11\xa1\x09\x96\x33\xca\x59\xea\x2e\x2b\x0c\xb8\xa0\x68\x85\x56\x5e\xaa\x05\xb0\x9b\x97\xa5\xd6\x0f\x05\x12\xa4\xe6\xf3\xcd\xfd\xb6\xc9\x80\x85\x34\xce\x50\x3d\xc9\xc3\xc0\xde\x78\x26\x46\xc4\xa9\x67\x3e\xd4\xfb\xa5\x58\xba\x2d\xcc\x06\xd4\xda\xbf\xab\xcf\x2a\x5a\xd6\xa5\x39\x46\xdc\x1c\x5b\x0a\x2d\x47\x24\x23\xa6\x98\x07\x58\x4c\xb7\x96\x1f\x7c\x2a\xa6\xad\x11\x97\xf6\x7e\x87\x18\x67\xc3\x69\xbc\x95\xb0\x02\x29\x3a\x90\xe8\xec\xdd\xeb\x90\x8e\x39\x2c\xa2\xed\xc8\xba\xe3\x9a\xfb\x98\x17\x8c\x08\x2a\x86\x47\x38\x46\xf5\xa8\xf0\x92\x45\x8b\xf9\x6a\xee\xbc\x5d\xbe\x83\xce\x49\x43\x59\xd3\x2a\xab\x7c\x07\x55\x37\x8b\x19\x66\x53\xad\xed\xbc\xe6\xad\x1e\xd8\xef\x7f\x0f\x83\x10\xa4\x6c\x8b\xc8\x44\x12\xe3\x4d\x33\x27\xf7\xf7\x0e\xd2\x6d\xcb\xfb\xc2\xa5\x24\x0b\xdc\xb8\xa9\x09\x67\x4f\x2e\x98\xc2\xf7\xdf\x22\x7a\x4c\x8e\xd1\x8b\xdf\x07\x5f\xbd\x80\x1e\x47\xf5\xa6\x11\x5c\x0f\xc5\x52\xa4\xc2\xe8\x2b\xaa\x20\x95\xfc\x45\xd8\xc2\x31\x3a\xd7\xfd\x82\x0c\x29\xbf\xb6\x01\xeb\xe5\xb8\x5b\xd9\x01\x12\x64\x8a\x45\x59\x91\x48\x96\x31\x3e\xf1\xc9\x3c\x86\x46\xde\xee\x2a\x72\x4f\xa5\x92\x36\x2c\x72\x9c\x07\xe6\xf6\xa5\x77\x87\xc2\xf2\x56\xdf\x14\x5a\xf8\x0d\x4b\xac\xf0\x30\x90\xba\x27\xc6\x2b\x3a\x2c\x78\x5d\x63\x56\x0e\xb1\x3d\xc7\xdd\xa5\x72\xf2\x3b\x5b\x1c\x61\x88\xfd\xaf\x28\x1b\xe2\xa1\x9c\x91\xa8\x95\xdb\x63\x4c\xe0\xb1\x73\xb9\x2d\x81\x7d\xee\xe5\xb3\x59\x8a\x63\x74\xc9\x55\x67\x4e\xf9\xdb\x16\x56\x39\xa7\x08\x3f\xbf\xbc\xb9\xfa\xe7\xe8\xfd\xc5\xe5\xcd\x5e\x92\xef\x25\x39\x3c\x7b\x49\xbe\x97\xe4\x11\x0d\xef\x8a\x24\x27\x6c\xbe\x2d\x29\xee\x1c\x6f\xeb\xf2\x6a\x6c\x40\x4f\xad\x00\xf4\xb7\x0e\xcd\xdf\x36\xbd\xce\x39\x9b\x7f\xc4\xda\xe4\xb7\xf8\x14\x8b\x7d\x5e\x93\x9a\x64\x7f\x60\xdc\x11\x67\xcf\x9e\x5f\x67\x8b\xec\x38\x19\xd9\x21\xc2\x50\xd4\xba\x55\xeb\x4a\x7b\x62\x74\xf6\xf3\xc5\xeb\xf3\xcb\x9b\x8b\xef\x2f\xce\xaf\xb6\x9a\x38\x08\xfe\xb4\x5d\x48\x19\xdc\x44\x3f\x4a\x68\xa6\xd3\xac\x1a\x41\xe6\x94\xb7\xb2\x5a\x20\x07\xc1\x58\x2f\xae\x56\xa9\x8a\x12\x33\xb0\x0d\x1e\x87\x16\xeb\xb7\x89\x5c\xd2\xed\xd6\xe9\x69\x09\xcd\x6f\x59\xc3\xb3\x9d\xc8\xa1\xe7\x25\xb4\xbf\x46\x43\xfc\x72\x6d\x2f\xa1\xdd\x28\x3d\xf1\x21\x9d\x2f\xa1\x1f\x7d\x6d\x31\xe1\x45\xfd\x14\xd5\xed\x4b\xb2\xef\x05\xaf\x33\x49\xb3\x6b\x13\xc3\x70\xa8\xc5\x75\x47\xf5\xc0\x56\x0c\xec\xe9\xdb\xd6\x72\xec\x4a\x09\x6a\xfb\x15\xe2\xf9\x89\xb3\x93\x54\x6a\x38\x4f\xb5\x5f\x64\x13\x2c\xdf\xe1\xe6\xef\x64\x71\x45\x12\x8b\xa6\xf6\xe7\x9b\x54\xa4\xd0\x3a\x0f\xba\x25\x0b\xc3\xa8\x74\xe6\x1a\x4b\xab\x1b\x9b\x65\xfa\x50\x96\x7a\xcd\xe6\x19\xea\x21\x26\xbd\x23\xcf\x62\xea\xe7\x96\x24\xf0\x10\xb9\x67\x89\x25\x8b\xc0\x12\x82\x9a\xaf\xd7\x34\x6d\xf5\x50\xae\x0a\xcd\xe6\x49\x53\xf8\xdc\x93\xb3\x5a\xb3\x79\xf2\x01\x99\xfa\xcf\x76\x61\x4d\xfd\x67\xab\x20\xa7\xe5\xae\xe4\x83\x3c\xf5\x9f\x5d\x02\x40\xf5\x9f\x8c\xa7\x28\x05\x1c\xb5\xfc\x38\xec\x6f\xe6\x53\x69\x40\xde\x8b\x9e\xea\xe4\x2f\x14\x64\x78\xfa\x41\x4e\xb9\x24\x29\x6b\x05\x64\x9a\xe6\x34\xae\x38\xf3\xe4\x83\x91\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x46\x58\xf9\xa2\xf5\xe5\xb7\x8e\x3c\x4b\xa2\x9a\x28\x5c\x62\x85\x8f\xf5\x81\x18\xf4\xff\x69\x33\x64\xfe\xc7\x7f\x58\xe1\x31\xa9\xe4\x8f\x07\xff\xf9\xf7\xf3\x7f\xfe\x7f\x07\x3f\xfd\x4f\xf8\x1d\xa8\x6b\x06\x85\x1d\xfc\x20\x71\x08\x50\xee\x8b\xf1\x92\x5c\x42\xef\xe0\x9f\xd6\xd2\x3b\x35\x40\x1c\xfb\x05\x94\x5c\x39\x36\xd9\x9f\xfe\x9f\x0d\x2f\x97\xff\x95\x50\xd1\x1a\xed\xa6\xde\x03\x6b\x9b\xc0\xa4\x6c\x9e\x7c\xda\x0f\x6e\xe8\x47\x22\x64\x12\xf9\xae\x7b\xfa\x54\xd9\xe6\xad\x6e\x1b\xcb\x62\x46\x6a\x0c\xff\xf9\xbd\x9b\x02\x7d\x1f\xfb\xa2\x58\x0c\x6a\xdb\xe8\x3b\x70\xd0\x63\x23\x7b\x31\x7f\x95\x64\x71\x9a\x27\xa3\xe4\xf7\x2b\x98\x79\xc2\x60\x46\xec\x6c\x19\x09\xe0\xf5\x47\x9f\xf6\xe1\x72\x2f\xd0\xe9\xe8\x02\xcd\xcd\x0c\xef\xd0\xe4\x3c\x96\xb8\x76\x78\xba\xef\x77\x5a\x6c\x7b\xd4\xdf\x72\x89\x8a\x6f\x4d\x3a\x9a\xfb\xde\x56\x40\x92\xbe\xdc\x3a\xd9\x9c\x4d\x65\xf9\x39\x34\xaf\x3c\x2e\x9a\x76\x60\x5f\x7f\x5c\x93\x9a\x8b\x85\xff\xa7\x27\xf4\x1f\x4a\xc5\x05\x9e\x02\x0d\xad\x69\xdc\xfc\x99\xff\x97\xf9\xc3\x5e\xf7\x56\xff\xda\x38\x24\x3b\xcc\x9e\xe7\x77\xfc\xea\x44\xb6\x5b\xb7\x1d\x91\xd8\x45\x6a\x05\xd5\xfe\xd3\x3b\x0d\x07\x3e\x94\x62\xcc\x44\x3f\x8b\xe0\x05\xb2\x75\x26\x06\x5d\xb2\x1a\xb8\x2a\xd9\x1c\xcd\xb1\x90\x07\xbb\x23\x87\x10\x2a\xe9\x9c\x4a\x9e\x40\x05\xe8\x5f\xb4\xaa\x51\xbb\xb4\x49\x5b\xd1\xcc\xa4\x47\xf9\xb8\xc7\x7d\x03\x65\x85\xfd\x61\x5f\xba\xcd\x5e\xa5\x1a\x0b\x08\x35\x58\x29\x22\xd8\xb7\xe8\xbf\x0f\xff\xf5\xcd\xaf\xc3\xa3\xef\x0e\x0f\x7f\x7c\x39\xfc\xdb\x4f\xdf\x1c\xfe\xeb\x18\xfe\xe3\x3f\x8e\xbe\x3b\xfa\xd5\xfd\xe3\x9b\xa3\xa3\xc3\xc3\x1f\xff\xfe\xee\xcd\xcd\xe8\xfc\x27\x7a\xf4\xeb\x8f\xac\xad\x6f\xcd\xbf\x7e\x3d\xfc\x91\x9c\xff\xf4\x85\x2f\x39\x3a\xfa\xee\xf7\xc9\x5d\xc7\x6c\xf1\x3e\x51\x7a\x9b\x67\x98\xa5\x80\xfe\xba\x37\x66\xb2\x0e\x7b\x57\x21\x65\x6a\xc8\xc5\xd0\xbc\xfa\x5b\xc8\xc4\x4f\x6c\xc0\x6d\xaf\xdc\xe7\xff\xca\x49\xcd\x00\xc3\xee\xb4\x90\x1d\x3a\xe0\x8f\xa5\x68\x98\xdc\xcf\xa7\xf0\xec\x9a\x96\x82\xfa\x4c\x07\xb2\x4b\x7b\xfc\xda\x6e\xd0\xdf\x82\xb3\xd7\xd9\x39\x66\x5d\x3b\xd5\x7d\x22\x78\x6d\xab\xb6\x98\xc8\xf7\x1c\x57\xb4\x74\xbf\xbb\x25\x09\x51\x11\xf7\xec\x9d\xc3\xd1\xcf\xde\x39\xfc\x40\x57\xf6\xce\xe1\xa4\xe7\x59\x3a\x87\x0d\x23\xc5\x6f\xd3\x33\x9c\x9f\x69\x39\x12\xd3\x95\x93\x64\x99\xb0\x79\x2c\x1e\x20\x27\x08\xd2\xb9\x3d\xc2\x1a\xdc\x5f\x86\x34\x8a\xc7\xb7\xeb\x95\xf3\xb0\xa6\x0e\x34\x6f\x54\xda\x7a\x3d\x0c\x0d\x9d\x56\x15\xa2\xcc\x5c\xd0\xfa\x05\x51\xad\x7b\x2a\x2d\x62\xeb\x5d\x58\x0a\xd7\xb9\x1e\xaa\xa7\xc1\x0a\xf0\xf7\xd2\x24\x40\x53\x36\x3d\x36\x6c\x52\x46\x4d\xb4\x10\x15\xca\x50\xdd\x56\x8a\x36\x91\x78\x17\x6f\x86\x1a\xe4\x8c\xbe\x28\xb0\x94\xbc\xa0\xd8\x17\xf8\xf6\x25\xc8\xed\xf4\xc0\x08\x14\xbe\x05\x88\x58\x41\x4a\xc2\x36\x67\xe2\x30\xcf\x47\xdd\x5e\xb7\x0e\xe3\x85\x9e\x89\x73\x36\xb7\xf7\x17\x2a\x5b\x03\x93\x36\x2a\x54\xbe\x76\xbf\x2e\x4c\xac\x3e\xc3\x16\x8c\x13\x40\x63\x41\xdb\xf4\x0e\x47\x0c\x88\x62\x3e\xe9\x22\x7c\x80\x6e\xb2\x24\x43\xdb\xc1\xc5\xa6\xab\xed\x1e\x6c\x93\x64\x8f\xad\xe8\xeb\x5d\x14\xb4\xaf\xa7\x7f\x0d\xf8\xa4\x74\x0d\x3e\xaf\xf6\xfe\x18\x9a\xfb\xae\x68\xed\x3b\xa2\xb1\x3f\x8e\xb6\xbe\x9b\x9a\x7a\x36\x2d\x3d\x8f\x86\x9e\x47\x3b\xdf\x00\xb6\x91\x53\x23\xcf\xa3\x8d\x3f\x86\x2f\xae\x11\x64\x42\xef\x33\x49\x7c\xc7\xa5\x8a\x14\xb9\x07\xcf\x4c\x23\x48\x43\x58\xe9\x32\xe2\x1d\xf5\x21\x50\x77\x3c\x9b\xbc\x05\xe3\x40\xca\x7b\x2f\x5e\xaf\x73\x5e\xed\x2f\x45\xb4\xbf\x14\x37\x78\xf6\x97\xe2\xfe\x52\x7c\x92\x4b\xd1\x4a\xab\xaf\xff\x46\xcc\x5d\x44\xa3\xc6\xd3\xad\xd1\x55\x9e\xf5\x79\x07\x40\x32\x3f\x09\xcf\xe2\x0a\xf9\x6b\xa4\x6b\x29\x14\xb2\x1e\x07\xa1\xb8\x11\x7b\x86\x18\x4c\x20\xc3\x45\x6d\xac\x57\x54\x63\x86\xa7\xc0\x59\xa6\x7f\xe7\x2a\x7f\x71\x81\xb4\x74\x10\x34\xb2\xc0\xec\x12\x81\x03\x38\x8a\x1c\x09\x15\x7c\x29\x78\x55\x11\x21\x51\x45\x6f\x09\x7a\x4d\x9a\x8a\x2f\x6a\x9b\x53\x5b\xa2\x6b\x85\x15\x99\xb4\xd5\x35\x51\x09\xf5\x68\x22\x25\x8e\xa7\x5f\x36\x54\x79\xdb\xda\x8a\xc0\xc4\x0c\xcc\xc4\xa8\x31\x9c\x7d\x51\xaf\x79\xcf\xe0\x2a\x3f\xad\xee\xf0\x42\x0e\xd0\x25\x99\x13\x31\x40\x17\x93\x4b\xae\x46\xc6\x57\x13\xf7\xde\x30\xb3\xcc\xbc\x1c\xd1\x09\xfa\xb6\xc2\x8a\x48\x85\x14\x9e\x82\xe7\xb0\x63\x63\xe6\xa2\xd7\x68\x57\x4c\x77\x8b\x2e\xb4\x0c\x14\xcd\xd0\xba\x27\x68\x7e\x72\x12\xd4\xca\x91\x1e\x6e\x8d\xc0\xcb\x70\x2d\x1a\xee\x35\x43\x1d\xe8\xc5\x89\x21\x50\x77\xa5\x42\xc1\x73\x4a\x19\x12\x44\x36\x9c\x49\xd2\xe3\xda\xec\x06\x62\x3c\xd1\x91\xc8\xea\x8c\x8e\xd5\x68\xc3\x20\xd5\x24\x68\xb8\x54\x40\x49\x19\xab\x9f\xe4\xb2\x05\x46\xae\x23\xc0\x52\x8a\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x13\x45\x04\xc2\xfd\x58\x81\x2d\x26\x71\x6c\xaa\xe1\xb8\x02\xf4\x8e\xf7\x34\xde\x58\x5b\x8e\x49\x28\x22\x6a\xca\xb0\x2d\xb8\xed\xc8\x4d\x43\x96\xd4\x25\xde\xd3\x24\x21\xaa\x9f\xf7\xa0\xd9\x05\xdb\x7b\x19\x47\x8b\xc6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\x5c\xc0\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x7f\x0e\xfd\x01\x1b\xea\x5e\xc9\x93\xdf\x75\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x3d\x29\x52\xf4\xf9\x7e\x4c\xe3\x9e\x14\xfe\xea\x92\xb0\xc3\x81\xf5\x46\xef\x28\xcb\x74\x95\x29\x14\x68\x9e\x4c\x90\xa8\x5c\x30\xa4\x04\x86\xb1\xf0\xc9\x8d\xb2\x39\xb3\x8b\x40\xa5\x9d\x79\xf3\xcf\x8a\x32\xd2\x5f\x18\x4f\xd6\xef\x17\xc7\x44\x17\x57\xaa\xe8\xba\xdc\xf1\xe4\xae\xb9\xbe\xe8\xbe\x41\x19\x99\xc3\x83\x93\x83\xa3\x95\x3d\x72\x60\x0a\x5c\x9a\x6b\xf1\xd8\xf2\x9c\xf9\x41\x49\x5a\x37\x50\xd5\x99\x14\x07\xae\x08\x7d\x72\xcf\xf4\x6d\x68\x8a\x26\xc1\xac\x58\x5e\xb6\x01\x92\x1c\x29\x81\x4b\x6a\x0d\x04\xf8\x54\xff\x48\x89\xd6\x5e\xe8\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\xc1\xf4\x1d\xa3\x1b\xa8\x84\x91\x8e\xb4\x75\x1d\x59\xf0\x16\xea\x2d\x99\x25\x6c\x2a\x5a\x50\x55\x2d\xe0\xba\x41\xbc\x35\x95\xa1\xb4\x6a\x91\xc0\x27\x17\x3e\xe7\xf7\x54\xd9\x14\x2e\x2d\xbf\x5f\x2e\x15\xfa\xaf\xe8\x9c\x9c\xcc\x08\xae\xd4\xcc\x24\x18\x30\xce\x86\xff\x26\x82\x03\xe7\x1c\xb3\xdf\xa4\x76\x23\x2d\x72\x1b\x3e\x09\x51\xdc\xd5\x0e\x65\xc1\x16\x65\x76\x06\xb8\x47\x5f\x7b\x6f\x48\xb4\x4a\x84\x56\xca\xa0\xde\xdc\x8c\xde\x10\x15\x4a\x79\x06\x1f\xa2\x37\xe7\x37\x2e\xad\x04\x9c\xf1\x44\x4c\xb8\xa8\x77\x40\xbc\xe7\xc1\xbb\x0e\xa1\x16\xe1\x0e\xdc\x32\x33\x2e\x93\x96\x13\x3d\xc2\x15\x63\x2a\x47\xe2\xda\xd9\x26\x8c\x14\x7a\x13\xf4\x73\x24\x1c\x75\xff\xc5\xe8\x18\xfd\x93\xb7\x40\x1b\x8f\xc7\xd5\xc2\xb3\x4e\x4b\x92\x06\x6c\xd6\xcf\x0b\xdd\x95\x17\xfa\x06\xd1\x3b\xff\x07\x82\x4b\x22\x24\x08\x68\x82\x13\x53\x98\x32\x1e\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x66\x87\xdd\xe7\xa3\xb3\x87\xf3\xd8\x1c\x57\x4b\x4a\x24\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x48\x2f\x33\xef\xf6\xf3\xb1\x51\x53\xc3\x69\xb3\x01\x0e\x43\x77\x63\x65\x9b\xa9\x70\x90\xe9\xba\xc8\x00\xe1\x47\x19\x61\xfc\x28\x8d\xa9\x6e\xf9\x45\x10\xec\x49\x7e\x53\xbe\xcc\x00\x94\x0d\xfd\x8e\x1e\x05\x01\x8f\x2c\xb0\xd1\x6e\x3e\xe3\x83\x8e\xf7\x9e\xaf\x7b\x39\xed\x8a\xb8\x15\x98\x71\x46\x0b\x5c\xd1\x7f\x93\x12\xb5\x0d\x67\x36\xdd\x0d\x34\xdb\x02\x4b\x32\x84\xe8\x38\x33\xe2\x5c\x06\x9c\x69\x5a\x3a\x28\xce\x41\xdd\xf3\x15\xbd\x4c\xaf\xf3\x74\x35\x2b\x50\x3b\x99\x00\x30\x7c\x56\x02\xea\xbd\xc5\xca\xb3\xe3\xd1\xb3\x50\x27\x91\xc9\x53\x4c\xce\x91\x5f\xcd\x90\x37\x45\x5d\x80\x15\xce\x5c\x57\x20\x78\x4d\x7d\xcf\x9d\xb9\xb7\xb5\x0a\xb8\x6b\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4c\x44\x47\x2f\x22\xd4\xea\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xa6\x04\xbd\xd2\x2d\xff\xe5\xcf\x7f\xfe\xe3\x9f\x33\xb4\xa3\x87\xe7\x81\xdd\x0c\x5d\x9c\x5e\x9e\xfe\x7c\xfd\xf1\x0c\x48\x0b\x53\x5f\x9f\x29\x6f\x35\x77\xd6\x6a\xd6\x9c\xd5\x47\xcd\x58\x05\xfa\x8f\x64\x29\x9b\xfb\x48\x5c\x43\xaf\xc2\xf2\xa9\xd6\x26\x09\xea\xa1\xc5\x94\x27\x5e\x7d\xc2\x60\x9e\x16\x58\x3b\x21\xa9\x64\x45\x48\x93\xcd\xe2\xbf\xd6\x6f\xeb\x71\x37\xa3\xb2\x15\xb6\x70\xa8\x0b\x5e\x75\xbe\x7c\x1b\xb4\x82\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x82\x06\x78\xdb\x5f\xfe\x14\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x32\x9d\xd3\x2b\x73\xf9\xfe\xa6\x63\x63\x81\xec\xa3\xae\x74\xdf\x0f\x36\x5a\x88\x59\x89\x6e\x49\x93\x66\x5d\x6a\x81\xe9\x60\x84\x7d\x14\x21\xf8\xde\x85\x65\x7f\x35\x19\xcf\x46\x10\x38\xf4\x9f\xd1\x88\xd3\x78\xa4\x83\xe0\x3c\x04\x02\xad\x11\x32\xc1\xb4\x42\x18\xbc\xf2\x8a\xd6\xc4\xa4\x5c\x81\xb3\xbf\x43\x4b\x7c\x45\x02\xe7\x6b\xf5\x36\x1e\x38\xd8\xf6\xb7\x1b\x7b\x0d\x53\x89\x2a\xbe\x6e\x33\xc0\xca\x6c\x81\xc2\x92\xff\x7b\x33\xe0\x4b\x9e\xbd\x19\x10\x69\x06\x34\x82\x5c\x2b\x1e\xad\x6b\x66\x03\xdc\x98\x6e\x3c\x00\xb7\x19\x93\x09\x17\x64\x19\x6f\x13\xe0\x60\x2c\x72\x3e\x01\x19\x7c\x3a\xba\xf0\xb1\x2f\xde\xc3\xba\x98\xf4\x60\xd9\x16\x33\x17\x26\x65\x44\xca\x13\x19\x96\xce\x85\xab\xad\x15\x24\x1e\xe5\xd3\x08\x42\x6a\x98\xc7\x41\x47\xf0\xa3\x87\x4b\x98\xf9\x90\xa8\xc2\xc4\xcd\x1d\xac\xc8\xf2\xb7\xbb\xe9\x9a\x24\x85\xf3\xbb\x89\x2d\x04\x96\x33\x02\x29\xaa\xe4\x9e\x2a\x69\x1a\x1d\x01\x0d\x8e\x9b\x71\xad\x2f\x4c\x05\x2e\x08\x6a\x88\xa0\x5c\xab\x18\x2d\x53\x25\xbf\x63\x68\x4c\xa6\x94\x49\xb7\x62\x29\x5d\x72\x5b\x02\x90\x44\x54\xfa\x42\x6b\xc7\xe8\xaa\x57\x7f\xc0\x12\x7e\x15\xbc\x93\x99\x76\x8a\x06\x99\xa6\x04\x94\x17\xd8\x06\x2d\xae\xaa\x45\xb7\xf1\x5c\xfa\xba\x7a\x78\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\x85\x49\xd4\x9e\x50\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\x83\x3b\x83\x4a\x24\x08\x2e\x66\x29\x9a\xdd\x1e\x03\xf6\xb9\x67\x8f\x01\xdb\x63\xc0\xf6\x18\xb0\xd5\x67\x8f\x01\xeb\x3f\x7b\x0c\xd8\xc3\x1d\xda\xe5\xa0\xdd\x1e\x03\xb6\xf7\xca\xac\x3e\x7b\x0c\x58\xd4\xb3\xc7\x80\x7d\xf6\xd9\x39\x11\xbd\xc7\x80\x7d\xc1\xb3\xc7\x80\x7d\xe1\xb3\xc7\x80\xed\x31\x60\x7b\x0c\xd8\x1e\x03\x96\xf0\xec\x31\x60\x9b\x0f\x6f\x1f\xfc\x89\x7f\xf6\x18\xb0\x3d\x06\x6c\xc3\x67\x8f\x01\x5b\x7a\xf6\x18\xb0\x3d\x06\xec\x53\xcf\x1e\x03\xb6\xc7\x80\xd9\x67\xef\x6d\x5c\x79\xf6\x18\xb0\x35\xcf\x1e\x03\xb6\x59\x3b\x7b\x33\x20\xed\x65\x8f\x62\x06\x48\xc5\x9b\x6b\x3a\x4d\xe0\x85\xcc\x75\x0c\xae\x7d\x4f\x2c\x69\xa4\x44\x77\x33\x5a\xcc\x90\x34\x1f\x3a\x3f\x96\xb4\x94\x7d\x21\x22\x2c\xb8\x49\xc6\x44\x9b\x08\x7a\x58\x4d\xca\x6d\x72\x31\x81\x00\x72\xc0\xe4\xa6\x4f\x85\xa3\x09\xa4\xbd\xea\x09\x7d\xf5\xd9\xdd\x6e\x94\x69\xdb\x25\xbe\x07\xc1\x7c\x14\x98\x99\x62\xa5\x30\x7c\x28\x6e\x88\x46\xbc\x94\xae\x60\x03\xe3\x6c\x68\xc8\x5a\x8f\xa1\xba\x33\x97\xc7\x09\xde\xe0\x44\x66\x36\x83\x91\x1b\x09\x3e\xde\x1a\x3b\xdb\x08\xf0\x47\xb4\xb0\x00\x3d\x3e\xe9\x31\xae\x99\x0e\x46\x32\xad\xf5\x81\x61\x50\x50\xc4\x51\x70\x51\x2b\xb0\x3d\x28\x70\x9b\x6c\x6e\x1b\x23\xa7\x1c\x4b\xa5\x3c\x69\xb8\xf9\x9f\x0e\x37\x15\x00\xa6\xa2\xe3\x28\x5b\xa6\x97\x4b\x41\x49\x6d\x0d\x21\xb5\x23\x08\xb3\x0c\xa8\xa8\x9c\xba\xd2\x8e\xa2\xa1\x76\x13\x09\xb5\x8b\x28\xa8\x6d\x20\xa0\xb6\x8e\x7e\xca\x13\x56\xcf\x10\x52\xcf\xa4\x91\x3e\x42\x78\xca\x02\xe9\x6f\x66\x82\xc8\x19\xaf\xa2\x05\x4e\x2e\x61\xf3\x8e\x32\x5a\xb7\xb5\x3e\xbb\x52\xcb\x14\x3a\xf7\x60\x7f\xe9\x44\x86\xbd\xee\x0d\xe2\x40\xff\x90\x96\x04\x2a\x73\x63\x5a\xe9\xad\x05\x64\xa1\x33\x3c\x07\xa5\xb4\x2d\x0a\x42\xca\x14\xb5\x34\xf4\x56\xff\xf1\xd8\xf7\xd0\x70\xf4\x53\x89\x5e\xa5\x5d\x35\x69\x76\x4f\xe0\xce\xfb\xe3\x1f\xa2\xde\x31\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\xca\x42\x69\xb6\x77\x33\xa7\xbb\x99\x92\x5c\x4c\x39\x14\x83\x54\x2f\x4a\x3f\x86\xcc\x85\x5a\x0a\x81\x4e\x61\x15\x89\x98\xd3\x82\x1c\x3f\x81\xa3\x22\x97\xf1\x9f\x7e\x10\x10\x84\x09\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xf8\x08\x43\xe0\xa3\xb2\x3d\x05\xd0\x68\x85\x0b\xbf\x36\xd3\xf5\x87\x2e\xa9\x1b\x87\x92\x10\x6f\xd0\x4c\xa9\x9a\xb5\xe3\xe3\x82\xd7\x27\x5a\x74\x98\xff\x19\x57\x7c\x7c\x52\x63\xa9\x88\xd0\x36\x8e\xbd\xd6\x87\x85\xee\x01\x65\xd3\xe3\xba\x3c\x3a\xfe\x3f\x49\x7d\xb8\xb0\xbe\x72\x9b\x86\xf5\x80\x93\x60\x4c\xb4\xdc\xe7\x62\xc9\x5b\xa0\x27\x25\x7d\x93\x26\xdf\xdf\xa9\x45\x45\x12\x61\xc9\x5b\x81\x24\xef\xa5\x36\xca\x10\x10\xc8\x29\x54\x76\x03\x76\xfc\x68\x90\xe3\x2c\x67\x35\x13\xd4\x78\x87\x60\xc6\x3b\x63\x0b\xed\x0a\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xd1\xa0\xc3\xcf\x02\x36\x9c\x31\x3e\x96\x09\x2e\xfc\x14\x50\xe1\xdd\xf5\xc1\xa0\x0c\xf0\xe0\xa7\x83\x06\x67\x99\xc7\xac\x56\x6c\xa2\x48\xd8\x02\x14\xf8\x29\xe2\xff\x8f\x16\xfb\xcf\x10\xf7\xcf\x19\xf3\xcf\x16\xef\x7f\x34\xc8\x6f\x3a\xdc\x37\xab\x4f\xe1\x49\x60\xbe\x39\x21\xbe\xc9\xeb\x4b\x19\x55\x14\x57\xaf\x49\x85\x17\xd7\x69\x40\xd0\x5c\x2b\x71\xb9\x02\x16\x35\x6e\xeb\x3e\xae\x61\x86\x25\x72\xa1\x6e\x4b\xf1\xe2\x62\xe9\x56\x05\x46\x18\x22\xce\x7a\x7c\xd1\x51\x6b\xb4\x7b\x91\x6b\xb4\x33\xee\x71\xc3\xab\xb2\x23\xbb\xe6\x07\x7e\x87\xf8\x44\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\x77\x3a\xf2\x65\xfb\xf8\xf9\xd0\x97\xfd\xe1\xa4\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\xd5\x55\x7f\x7f\x05\xfd\xf1\xa2\x08\xb3\x12\x59\x7e\xae\xaf\x6f\x9f\x24\x43\xdd\xfb\xc6\x8d\xc7\xa6\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\xff\x0a\x14\xd0\xbd\xd3\x75\x67\x9c\xae\x5b\x42\x60\x7f\x7d\xd6\xd6\xd3\x23\xae\xf7\xd6\xd6\x6f\xc5\xda\x0a\x68\xf1\xde\x08\x5c\x90\xd1\x2e\x29\x6f\x4e\x80\x74\x89\x80\x9d\x0e\xe7\xc5\x05\x23\xc4\x24\x8e\x75\xa4\x87\xc0\xef\x37\x69\xab\x6a\x61\x7c\x88\x3d\x06\xcc\xf8\xad\x75\x33\x23\x2b\xd4\x81\x10\x4a\x5d\xd3\xbb\xce\x36\x69\x04\xb7\x1a\x89\x68\x19\xd3\x2a\x86\x3d\x4e\xba\xf3\xda\x16\x91\x84\xc5\xbb\xd3\x71\x8f\xd8\xd0\x82\xd0\x01\xe8\x39\x23\xa8\xcb\x5f\xea\x77\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x92\x05\x69\xdf\xd2\xaa\xb2\xaf\x49\x00\x85\x13\x65\x42\xcf\x46\xa3\xa9\x38\x9b\xc2\x64\x60\xd3\x11\x72\xdf\x90\x42\xb7\x59\x54\x04\xb3\xb6\x31\xfd\xd4\xfa\xd1\x82\xb7\xc2\xf5\x33\x09\x15\x1f\xb4\x4e\x25\x62\xb4\x1a\xb8\x29\xef\x53\x60\xae\xee\xf9\xce\xa5\x2c\x49\x69\xd9\x2b\xef\xa8\x24\x03\x78\x67\x74\x9f\x4c\x5f\x5c\xd5\x7e\xb3\x6f\xcc\x67\x8d\xe0\x73\x5a\x76\x18\x7d\xbd\x2d\x00\x1f\x1f\xdd\xd6\x47\x78\xaf\x13\xad\x8c\xb3\x21\x23\x53\x0c\xea\xb1\x15\x68\x06\xd1\x69\xda\x37\xf8\x41\x56\xd2\x02\x2b\x22\x21\x27\xa1\x47\x6d\x3b\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x99\x85\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x39\xd0\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\xf8\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\x78\xd5\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\x73\x27\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\x79\xc0\x4f\xe0\xe0\x56\x26\x83\xfa\xf5\xe5\xf5\xcf\x6f\x4f\xff\xeb\xfc\x6d\xdc\xc2\x9f\xe3\x62\x16\x72\x8b\x33\x84\xe1\xa2\x00\x21\x3f\xc3\x73\x82\x30\x6a\x19\xfd\xa5\xb5\x90\xb7\x43\xdf\x5e\xa4\x58\xcd\x92\xde\x93\xa4\xf8\xea\x5b\x22\x4a\x72\xe4\x58\xd3\xb7\x54\x02\x51\x35\x74\xc2\x02\xff\xb9\x24\x68\x22\x78\xbd\x64\x68\xa1\x4b\x0f\xae\x5b\xe8\x1b\x06\x1b\xd3\x6c\x46\x44\x9c\x46\xfe\xfa\xfd\xf9\x35\xe4\xe0\x37\xc2\x10\xbb\x43\x72\x01\xbc\x13\x5a\x37\xa9\x83\xa6\x3f\xe5\x31\x3a\x65\x0b\xf3\xa5\x11\x66\x91\x2a\x4a\x45\xa5\x22\xa0\x9c\x5a\x43\xd2\xc1\x03\x5f\xbc\x3c\x86\xff\x7b\x81\x70\x59\x0a\x6d\x69\xfa\x1c\x8d\x62\x39\xcb\x2c\xaa\x65\x63\xbf\xd2\x71\x15\x4c\x2e\x23\x0a\xd2\x38\xa2\x5e\xf8\x8e\x97\x76\x25\x40\x09\x04\xfc\x8e\xd1\x6e\xa5\x12\x58\x91\x29\x2d\x50\x4d\xc4\x94\xa0\x06\xab\x62\x86\x6a\xbc\x40\x05\x17\xa2\x6d\x0c\xc5\x48\x89\x15\x8e\x6b\xf9\x7b\x2e\x50\xed\xa4\xb3\x96\x66\x5a\x25\xbf\x5e\x0f\x04\xed\x44\x76\xf8\x9f\x54\xca\x96\xc8\x93\x57\x2f\xff\xfa\x87\x3f\x47\x9a\xd7\x19\x0f\x6e\x2c\xf4\x29\x01\xf2\xd4\x87\x7f\xb9\x0d\x06\xa0\xeb\x1e\x33\x8c\xdd\x21\x66\xe7\x83\x34\x94\x94\x4d\xab\x64\x07\x48\xb2\x1b\x30\xd5\x09\x38\xec\x46\x30\x8a\xf5\x05\xa6\x7b\x02\x7b\x7d\x88\x77\xa5\xe4\xf3\x82\x75\x1a\x9c\xf3\x7b\x59\x81\xcc\x59\x60\xd8\x5d\x8c\x9c\x94\x4a\xf1\x1f\x81\x35\xe1\x1d\x53\x86\x7d\xc4\x34\x6b\xf0\x0e\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x5e\xb0\xbf\xc4\x37\x95\xc7\xc7\x94\x03\xc6\x3f\xe3\x52\x5d\x8c\x32\x2d\xf4\x3f\xf4\x7d\xa5\xdf\xa8\xd7\x43\x71\x34\xa6\xd6\x1d\x41\xee\x15\x11\xda\x0c\xb4\x6b\x98\x3a\x73\x49\x1e\x35\xdd\xc1\xe7\xb2\xbb\x53\xc1\x05\x17\x93\x3e\xfa\xff\x89\xf6\x37\x34\xfc\x03\x97\xea\xd2\x4a\xeb\x90\x42\x27\xec\x47\x0d\x17\x71\x4f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xae\xc6\x06\x2a\x39\x24\x40\x98\x1c\xce\x19\x4d\x10\x0e\xbb\x73\x62\xd3\x70\xa2\xf9\xb6\xee\xa7\xb6\xd6\x92\x4f\x1f\x3c\x32\xd6\x48\x09\xca\xd2\x34\xbc\x3c\x06\xfb\x26\xa1\x17\x7a\x36\xca\x40\x19\xf8\x84\x69\x74\x6c\xec\x35\x1f\x1d\x86\x03\xa7\x25\x56\x81\x59\xac\x0e\x6b\x1e\x41\x26\x44\x08\x93\x27\x3c\x5e\xb8\x74\xa3\xe4\xdd\x96\x24\xe5\x1a\xc1\x15\x2f\x78\x34\x6d\x4a\xce\xad\x32\xb2\x7d\x81\xb9\x87\x58\xad\x8f\x8e\x7f\x78\x3d\x1a\xa0\x9b\xb3\xd1\x00\x71\x81\xae\xcf\xd2\xc0\x4f\xa1\x0b\xe6\xc5\xcd\xd9\xe8\xc5\x56\x57\x20\xc8\x61\xba\x39\x1b\x45\xbc\x64\x15\x3e\x5b\xe3\x66\x78\x4b\x16\x91\xda\x5d\x0e\x0d\x73\xe8\x37\x56\x96\x01\x99\x69\xae\x71\xb3\xf1\xdb\x04\xc1\x25\xdd\x69\x26\x17\x97\x75\xe8\x7b\x9a\x8f\xd2\xa5\xe6\x73\x52\x1a\xab\xd9\xb5\x42\x58\xd9\x70\xaa\x6d\xa4\x3d\xcf\xcb\xa7\x9e\x3d\xcf\xcb\xe6\xcf\x9e\xe7\x65\xdd\xb3\xe7\x79\xd9\xe0\xd9\xf3\xbc\x98\x67\xcf\xf3\xd2\xef\xc8\x2e\xe6\x18\xed\x79\x5e\x3e\xfb\xec\x79\x5e\x1e\x7c\xf6\x3c\x2f\x1b\x3d\x7b\x9e\x97\xd5\x67\xcf\xf3\xf2\x89\x67\xcf\xf3\xe2\x9f\x3d\xcf\xcb\x9e\xe7\xe5\xf9\x4a\xed\x3d\xcf\xcb\xf2\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\xc2\x67\xcf\xf3\xf2\xc0\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\x3e\xfd\xec\x79\x5e\xa2\x9f\x3d\xcf\xcb\x66\xcf\x3e\xf3\x70\xc3\x67\xcf\xf3\xb2\xe7\x79\x59\x7e\xf6\x3c\x2f\x9f\x7d\x76\xc3\x3d\xbe\xe7\x79\xd9\xf3\xbc\x7c\xf2\xd9\xf3\xbc\xec\x79\x5e\x3e\xf9\xec\x79\x5e\x22\x9e\x9d\x73\xba\xee\x79\x5e\xf6\x3c\x2f\x9f\x6a\x63\x6f\x6d\x6d\xf6\xec\x79\x5e\xf6\x3c\x2f\x2b\xcf\x9e\xe7\x65\xf5\xd9\xf3\xbc\xec\x79\x5e\xf6\x3c\x2f\x7b\x9e\x17\xff\xec\x79\x5e\xbe\x76\xbf\x93\x20\x92\xfe\x9b\x8c\x78\x45\x8b\x45\x72\xb6\xcf\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x63\x14\x0a\x57\xc1\xc4\x85\x54\x0a\xc2\xce\xc1\x63\x4c\xc1\x4e\xd0\x29\xb8\x01\x5e\xc6\x23\x08\x86\xae\x7c\xb6\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\xd2\x39\x43\xda\x23\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x31\x16\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x63\xa9\xf2\x6b\x45\x9d\x38\x4c\xc2\x9a\x5d\x4c\x96\xc1\xa8\x54\xf5\xbc\x40\x97\x5c\x5d\xd9\xc3\xbd\xb5\xf5\xca\x8c\x58\x70\x53\xb8\x35\xd6\xaa\x33\x5e\x37\xad\x22\xbd\x8b\xcd\x4c\xb1\x31\x3a\xa8\x4c\x15\xe8\xdb\xc9\x06\x2d\x38\x9b\xd0\xa9\xb5\xbe\x4f\x6a\xcc\xf0\x94\x0c\xfd\x6c\x0f\x3b\xaa\x87\x93\xe8\x8b\x7a\x6b\xa9\xa0\x45\x85\x69\x3c\x70\x30\x97\x98\x38\x83\x5e\x00\x0d\x58\x07\xa8\x87\xdc\x34\x3f\xcd\x03\x0f\x1b\xa7\x46\x6e\x1c\xbb\xaf\xcc\x1f\x0f\x12\xac\x47\xac\xc0\x57\x01\x86\xd1\x9a\x9d\x9a\x6e\x30\x32\x84\xab\x66\xf6\x69\x93\x31\x25\xe5\xf2\xf5\x82\xe1\x9a\x16\xee\xe0\x9d\x56\x15\x2f\x8c\xab\xa6\x6f\x6c\xa6\x8d\xc4\xf4\x5e\x0f\xa9\xae\x5b\x85\xc7\x15\x39\x46\x17\x86\xb9\x82\xb3\x6a\xa1\x8f\xa5\x24\xca\x21\x17\xec\x99\x48\x33\x30\x53\x60\xb1\x89\x90\xd8\xb5\xba\x3a\xec\x35\x43\xb5\x41\x98\x96\x70\x9c\x11\x44\x98\x12\x0b\xbd\x2d\x47\xbc\xbc\xd6\x3b\xb3\xf7\xeb\x64\x06\x8e\x44\x24\x6c\x0e\x14\x6c\x22\x02\x36\x0f\x6e\x35\x1d\xb3\x9a\x17\xaf\xda\x45\x16\x0c\x81\x50\x98\x08\xd4\xdb\x16\x0d\x2f\x8f\xd7\x48\x2c\xc4\x27\x89\x3d\xd0\x2d\x8e\x78\xa9\x75\x29\x41\x8c\xd8\xf2\x67\xd4\xf8\x15\x2f\x74\xe7\x6e\xc1\x11\x88\x55\xa7\x64\xe1\x39\xa6\x95\x3e\xc0\x89\x1d\x58\x25\x63\x4c\x0b\xd6\x64\x0a\x61\x58\xcc\xfe\x2e\x6d\x16\x9b\xed\xd5\x4b\x18\x2b\x66\x5c\x12\x06\xf2\x12\xfb\xc4\x1e\x9f\x76\x60\x45\x4c\x69\xae\xe8\x54\x70\xf1\xc5\x04\x91\xba\x51\x8b\x01\x22\x73\x22\x16\x6a\x06\x20\x04\x4f\x27\x0a\x62\x8d\x4a\x54\xe3\x32\xd8\x1d\x03\xc4\x9d\x5f\x3a\xb1\x79\xb8\x1f\xac\xa9\xd6\x56\xca\x18\x6e\x54\xfa\xec\x8a\x6d\xef\x9a\xdc\x2c\x37\x28\x55\x68\xe6\x64\xa9\x41\xc0\xb0\x5a\xd3\x38\x3e\x5b\x94\xf1\x2c\xbc\x85\x5e\x04\x19\x25\x7a\x4b\xd4\xf8\x1e\xbc\x96\xb8\xe6\x2d\x53\x86\xbe\xc6\x18\x12\x5e\xf9\x33\x79\x37\x4f\x08\xa3\x7b\x54\x95\x1f\xe5\xb9\xda\x71\xe9\x18\x2b\x46\x39\xd2\x97\xb1\x52\x44\xb0\x6f\xd1\x7f\x1f\xfe\xeb\x9b\x5f\x87\x47\xdf\x1d\x1e\xfe\xf8\x72\xf8\xb7\x9f\xbe\x39\xfc\xd7\x31\xfc\xc7\x7f\x1c\x7d\x77\xf4\xab\xfb\xc7\x37\x47\x47\x87\x87\x3f\xfe\xfd\xdd\x9b\x9b\xd1\xf9\x4f\xf4\xe8\xd7\x1f\x59\x5b\xdf\x9a\x7f\xfd\x7a\xf8\x23\x39\xff\xe9\x0b\x5f\x72\x74\xf4\xdd\xef\xe3\x83\x92\xa9\x11\xf8\x7c\xf1\xf7\x4c\xd1\xf7\x47\x89\xbd\x5b\x19\xbb\xf5\xc3\x6f\xaf\xc0\x95\xe3\x6f\x83\x16\x9f\x3a\xfe\x22\xd9\x55\x73\x31\xe9\xda\xa7\x12\xf1\x9a\x2a\x45\x4a\x7b\xf7\x06\x94\x38\x4b\x6e\x22\x2b\xb0\x80\xcd\x0a\xc3\xed\x1d\x50\xb3\x74\xde\xa5\xe8\x6e\xf9\xfb\x15\x1c\x63\x0c\xd1\xba\xa9\x48\x4d\x98\x02\xc1\x33\x74\x26\x2f\x78\x19\x8f\xbb\x11\x14\xc6\x0f\x42\xee\x0b\x42\x4a\xdb\xc9\xbd\x6c\x0c\x9e\xbd\x6c\xdc\xcb\xc6\xcf\x3d\xc9\xae\xf2\x1c\x82\xf1\x2a\xec\x84\x75\x71\x49\xa7\x29\x83\xe3\xdc\x33\x27\xf0\x09\xe0\x27\xe6\xb4\x6c\x71\x15\x12\xcc\x3a\xce\xd1\x38\x09\x10\xb8\x76\x6a\xbc\x58\xf1\xe4\x50\x46\x43\x36\xdb\x81\x47\xfd\xc0\x0f\xad\x5e\xd6\x45\x9c\x5f\x9c\x56\x77\x78\x21\x23\x49\x2f\xbf\xe7\x02\x80\x24\x4b\x8d\x22\x2e\x1c\xbe\x28\x34\x71\xfb\x1e\xfe\xb8\x08\xe1\xba\x89\xee\x53\x54\x58\x23\xfb\x40\xfa\x1f\xba\x38\x92\x9d\x88\x2e\x2b\x44\xef\xf3\xb8\x81\x5f\x13\xa5\xac\x13\x70\x69\x4b\xe0\x6e\x4e\x7d\x58\xb4\x3f\x3d\x06\x4a\x04\x54\xb3\xfa\xcb\x09\xd7\x6b\x02\x45\x1a\x26\x13\x52\x44\x5a\xc1\x86\xd2\x63\x4d\x3b\x06\xde\xae\x28\x6b\x71\x55\x2d\xdc\x9c\x90\x12\x71\x16\xd5\x10\xb9\xa7\x0a\xb5\x4c\xd1\x4a\x6f\x26\x24\xc8\xb4\xad\x70\xe8\x40\xb4\x23\x73\xa8\xbb\xf2\x18\xbd\x67\x05\x09\x7f\x1c\xe7\xf8\x5e\x6a\x40\x2b\x1d\x15\x51\xa4\x1c\xc0\xab\x97\x77\x20\xe0\xd6\x7a\x12\xc3\x2f\x4b\x54\xf3\x6e\x2e\x3d\x2e\xe9\xd8\x1c\x44\x0f\x9a\x40\x25\x9d\x4c\x74\xcb\x60\xa4\x33\x2e\x6a\xbc\xda\x2b\xcc\xca\xa8\xd6\xb5\x06\x04\xd9\x2a\x21\x69\x30\x14\x8a\x79\x21\x69\x49\x0a\x2c\x5e\x84\x25\x46\x4e\x2b\x35\xe3\xed\x74\xd6\xed\x8a\xb4\x29\x47\x52\x01\x5a\x4b\x4f\xa6\x74\x1e\x8f\xa5\xcd\x26\xb5\xae\xc3\x0a\x62\x54\x32\x4e\xcc\x71\xbf\xc3\x91\x6d\xaf\x20\x0a\x0c\x44\xdc\xac\xb9\x4b\xe1\x02\x48\x20\x29\x83\x7c\x3b\x46\xee\x55\x86\x01\x1f\xa3\x0b\xc3\x9f\x31\xe8\xbf\xb5\x37\x25\x66\x32\x02\x48\x9c\x03\x77\x46\xe2\x01\x97\x1a\xa0\x3e\x63\x0d\x68\x8e\xcd\xcb\x31\x5b\xb8\x04\x11\x80\xac\x99\xc4\x36\x9f\xb3\x52\xc5\xf9\xde\xfd\x59\x7a\xf2\xaa\x3d\x92\x14\xad\xa0\x6a\x71\xc6\x99\x22\xf7\x51\xb2\x2f\xc7\xad\x7e\xdd\xef\x46\xef\x5e\x77\x5d\x44\xbc\x31\xdc\x92\x4b\x85\x9b\x66\xbc\xad\x4a\x60\xd8\x6d\x19\x88\x9d\xb8\x1b\xe5\x62\xa2\xaf\x70\xb3\xdf\xe0\xc6\x84\x70\xda\x72\xc7\x1c\x52\xd4\x00\x66\x7f\x69\xe9\x1c\x57\x84\xa9\xe0\x2f\x46\x80\x1d\x0c\xff\xe8\x31\x63\xae\x0a\xcb\xdb\xce\xc2\x20\xc3\x86\x97\x9d\x41\x71\xe2\xa6\x0e\x3e\x22\xf7\xea\x19\xc6\x5b\x41\x61\x1a\x09\x3a\xa7\x15\x99\x92\x73\x59\xe0\x0a\xec\xa8\x6d\x1b\xe7\xa7\x0f\xf4\x0b\x76\xa6\xe0\x95\xd4\x0a\x98\x36\x56\xb5\xaa\x69\x90\xd3\x10\xf8\x9b\x62\xca\xa0\xea\x50\x42\x70\xc8\x36\x2a\x0d\x74\x5b\xdb\xdb\x0d\x16\x7a\x17\x3a\x88\xb6\xb9\x1a\xc7\x9c\x57\x96\xa6\xb6\x5a\x74\xfd\xa2\xf1\x51\x14\x90\xc5\xfc\x67\x46\xee\x7e\xd6\xbd\x90\x68\x52\xe1\x69\x77\x35\x13\xb5\x92\xef\x92\x8e\x1a\x7f\x70\xa2\x81\x83\xb5\xd5\x8a\x8d\xd6\x2a\x3a\x3c\x7d\x28\xc1\xe3\x0d\xba\x57\x47\x20\x4f\xb0\x44\xbe\xed\x38\xd5\x41\x3f\x7f\x38\x82\x7b\xe2\xec\x74\xf4\xf3\xf5\x3f\xaf\x7f\x3e\x7d\xfd\xee\xe2\x32\x1e\x35\xcb\x15\x31\xde\x95\x40\xbb\x2f\x3c\xd0\x43\xaf\x82\xc7\x0a\x1d\x73\x79\x0c\xa1\x13\x20\x73\x61\x25\xbf\x4b\x8c\x2f\xeb\x3d\x45\x70\x9c\xe6\x8a\x9b\xe6\x54\xd4\x5c\x8c\x04\x9f\xd0\x2a\x3a\x34\x99\xeb\x04\x2f\x75\xc7\x45\x9a\x4e\xed\xc7\xdd\x75\x63\xf8\x05\x56\x71\x0e\xc1\x95\x41\x21\x8b\x5d\xbf\x26\xde\xb3\xd5\xcb\x41\x30\x19\x11\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\xcf\xde\xd4\xdd\x88\xfc\xf3\x1c\x91\xf8\x8a\x17\xb8\x82\xfa\x45\x69\x1b\x1f\x65\x0e\xb2\x2e\xf7\x2b\xc8\x36\xc1\x6e\x3b\xa3\x8a\xe3\x12\x8c\x55\x2b\xfc\x4b\xe2\x58\xb5\x9d\xda\x05\x81\xf3\xa4\x8e\xdc\x18\xa4\x3f\xb4\xe7\xd2\x63\x1a\x41\xbc\x56\xb3\xd4\x3c\x47\xf1\xd5\x06\xdd\xf3\xae\x0f\x43\xb0\xa3\xec\x25\x72\xa6\x9e\x39\xdf\x8c\x3d\x60\x74\x02\x1e\x10\x70\x03\xd1\x09\x6c\x4a\x70\x00\xbd\x75\xcb\x90\x50\xf8\x24\x13\x12\x00\x5e\xb2\x23\xbb\xd3\xcc\x8f\xdf\x91\x06\xa6\x7c\x4b\xf5\x0c\x4e\x3a\x21\xed\xb6\x8d\xd3\x41\x0c\x56\x39\x71\x3f\x7e\x84\x12\x5b\x4e\xfe\x63\x91\xcc\x0b\xe6\x97\x18\x0d\x83\xa3\xd5\x08\x32\x5c\x3d\x5e\xa9\xc0\x85\xab\x96\x29\x5a\x13\xc7\x7d\x31\x5c\xd2\x89\x84\xf9\xfa\x40\x7a\xa6\xd9\x2c\x1b\x1d\xa1\x0f\x0c\xce\x2b\x23\x25\x1a\x22\xc6\xbb\x25\x22\x6c\xc2\x45\x01\x41\x9a\xad\x6e\xf0\x02\x37\x78\x4c\x2b\x9a\x22\xcc\x73\x6d\x70\x28\xdc\x10\xf4\x07\xdc\x49\x65\x79\x52\x0a\xde\x98\x9b\xd8\x25\xa5\xa6\x03\x03\xfb\xc9\x4f\x21\xc7\x30\x28\xec\x93\x7e\x47\xa6\x02\x33\xd5\x39\x72\x57\x36\xce\x6f\x51\x07\xc9\xa1\x04\xe0\x32\x5f\x09\x94\xd3\x52\xcb\x8c\x70\xd9\x92\xcf\xd5\xae\xd1\xa9\x9e\xb9\xc1\x05\xd9\x4f\x68\xf4\xfe\xfa\xe2\xff\x2d\x9d\x9b\x78\xd5\xce\x3c\xbb\x4d\xa6\xa8\xe5\x41\xb6\x6d\x73\x65\x2b\x50\xed\x37\xce\xd7\xbd\x71\xbc\x83\x68\xeb\x4c\x50\x57\x2d\xeb\x57\xc1\xef\xba\x86\xea\x24\x5d\x67\xe4\x49\x13\xfa\x6f\x0d\x63\x3d\x82\x20\xfd\x13\xa6\x28\x44\xde\x02\x6f\xad\xe2\xa6\xc8\x52\x96\x7a\xad\xe1\xed\x3a\xc1\x95\x7c\xae\x57\x64\x8a\x6b\xa7\x11\xbc\x78\xc7\x5b\x96\x87\x5a\x2a\x61\xc7\xf9\x8e\xa0\x92\x30\xae\xac\x37\x05\x6c\x09\x3e\x81\x6f\x91\x81\x4d\x05\xac\x91\x3d\x3d\x27\x41\xcd\xba\x09\x54\x2b\x1f\xdf\x77\x7a\xb8\xb1\x5f\x5a\x49\x96\xe3\x17\x56\xaf\xea\x50\x54\x13\x1e\x0f\x1e\x11\x04\x97\x60\x60\x36\x58\xcd\x0c\x9d\x59\x8d\xe5\x2d\x29\xcd\x07\x89\x54\x0e\x3e\x07\x07\x42\xfc\x6e\xa6\x6f\xf4\xe4\xba\xb4\x19\x70\x08\x1b\x52\x37\x48\xd4\x49\x31\xc5\xb6\x7a\x1a\x12\x04\xbb\x5e\x84\xf7\xac\x5a\x5c\x71\xae\xbe\xf7\xd5\xda\xb6\x7d\x32\xfe\x61\xc3\x11\x7d\x27\x26\xf8\xa5\x31\x74\x79\x08\x1b\x07\xe4\x62\x50\x63\x2e\x55\x2c\xea\x05\xf9\xad\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xd9\x7e\x98\x12\x0b\x28\x3e\xea\x3c\x5e\x19\x83\x36\x1f\x2c\xaf\x52\x28\xd9\x92\x29\x54\x10\x7a\x87\x17\x08\x57\x92\x7b\x97\x1a\x5b\x17\x6e\x75\xb1\x5c\xfd\xf5\x98\xab\xd9\x4a\x10\x37\x16\x05\xa2\x9f\xd5\xf6\x06\x01\x69\x50\x97\x9f\x4d\xd9\x4a\xb3\x0a\x12\x8b\x1a\x41\x0a\x52\x12\x56\x3c\xd7\x13\xb1\x6d\x0e\x1b\x38\x55\x97\x9c\x69\xf1\xba\xed\x73\x75\xe1\xfd\x93\x76\x35\xc2\x53\x04\xae\x6c\x1b\x44\xc4\x00\xd3\x03\xe1\xda\xca\x94\xac\xaf\x8b\x09\x44\x3d\xcd\xa6\xfb\x7b\x3b\x26\x95\x5e\x6c\x5a\x55\x7a\x07\xd2\x12\x2b\x03\x4d\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\x89\x04\xe8\xe8\xc7\x63\x8b\xec\xd0\x3e\x5c\xbc\x46\x2f\xd1\xa1\x1e\xdb\x11\x68\x1c\x13\x4c\x2b\xa0\x90\x02\xf0\xdf\x52\x48\x76\xe2\xe0\x49\x49\x53\x00\x72\x04\x71\x61\xae\x96\x01\x62\x1c\xc9\xb6\x98\xb9\x39\xa0\x9c\x79\x8f\xb0\xe5\x13\x4e\xca\x85\xd9\x8b\x9d\x7c\xf7\xe1\x07\x49\xc4\xb6\x8f\xad\xbe\x0e\x3f\x3c\xe1\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\x7e\xb0\xdf\xb5\xfb\xcb\x32\xe1\xb2\x94\xe4\x2d\x65\xed\xbd\x61\xec\xdc\x89\xb0\xc7\xf5\x39\xf4\x08\x15\x6e\xa1\x79\x10\xb7\x73\x11\x8a\x0c\xe9\xd1\x17\xbd\x63\x34\x78\xc0\xea\x86\x5b\x02\x1b\xfa\x07\xa2\x0d\x21\xcc\x4a\x5e\xaf\x74\x72\xc2\x05\x22\xb8\x98\x45\xf7\x26\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x95\xcd\xb7\xff\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x2c\x61\x8b\x61\xf1\xca\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf8\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x0f\x33\x56\xe6\x1e\x74\x64\xcc\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x97\x1b\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x18\x24\x94\x35\x58\xcd\x06\x48\x90\xca\x30\xa4\x5b\xf1\x7c\x6b\x3c\x5e\x07\x20\x71\x5c\x87\x9c\xb8\xe9\x30\xab\x86\xcc\x2d\x2b\x76\x73\x1d\x5e\xd3\xfc\xe6\xf2\xfd\x4d\x98\x00\x8c\xd9\xc2\xd0\x14\x24\xa4\xb7\x9a\x67\xf7\xd4\x8a\xc7\xc4\x74\x2e\xaf\xe2\x63\x43\x3a\x93\xde\xb7\x1e\xd1\xf9\x74\xa7\xf4\xcb\x50\x9e\xcb\x18\xcf\xac\x5d\x58\x06\x7c\xae\xb6\x91\x61\xe5\x92\x8f\x80\xbd\x3a\x77\xc8\x01\xf2\x0f\xd3\x23\x67\x65\x17\x5a\x70\x28\xca\xa6\x32\x74\x82\xe0\xaa\xca\x82\x49\x58\xe7\x05\x71\xa7\xc0\xb3\x99\xad\x7a\x03\xfa\xd5\x36\x52\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x77\x23\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x2e\xd5\x76\x4a\xd5\xac\x1d\x1f\x17\xbc\x0e\xb2\x6e\x87\x92\x4e\xe5\x89\x95\x28\x43\x3d\x71\x47\x88\xb2\xca\x67\x2a\x83\xb7\x90\x29\x69\x23\x08\xc9\x83\x47\x85\x1f\x3d\x6c\x3d\xc8\x4f\xf1\xd0\xec\xd5\xe9\x01\x82\x4d\xd8\xbc\x5b\xd7\x3a\x56\x77\x55\x1a\x0f\xfe\xd2\xce\x7a\x60\xec\x21\x59\xa4\x8d\xe2\xac\x9d\x47\x63\xbc\x6e\x7d\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\x7e\xe8\xba\x84\x4a\x62\x48\x44\x08\xf0\x79\xe1\x07\x73\xee\x21\xbc\x7d\x00\xb5\x04\xed\x9f\x1e\xe4\xe2\x37\x3d\xad\x2a\xbd\x90\xd8\x12\xca\x04\xe8\x4e\x30\x4d\x3c\x87\x8b\xd4\x2b\x6e\xe8\x5b\xb4\xb1\x10\x8e\x22\xbd\xe6\xfe\x21\x55\x8e\x3d\xc7\xd1\xf7\x28\x6e\xda\xc6\xa8\xa6\xf7\xba\x87\x61\x8b\x7d\xbe\x11\x08\xfc\xaf\xff\x3a\xa1\xb4\x12\x02\xf0\x81\xa7\xed\x1a\xe8\x15\x0a\x1b\x71\xc9\xd1\x4a\x5f\x5b\xfa\x8b\x4b\xa2\xb4\xa1\x66\xe6\x2d\x8c\x3e\x68\xc3\x4a\xb4\x19\x0e\x43\x4a\x64\x18\x85\xd1\xe1\xac\x92\x22\xf1\x3c\x40\xa4\xd8\xf6\x49\xeb\x20\x4e\x79\x7b\xaa\xc8\x31\x5a\x93\xbe\xf3\x64\x11\x64\xf4\xe5\x51\xe4\x47\x8c\x55\xa1\x5d\x89\x57\xa5\x52\xad\x04\xb4\x31\x5b\xe3\x59\x09\xa9\x6b\xe8\x2a\x78\x69\xc4\xcb\x15\x46\x1b\x57\x74\x3e\xbe\xc4\x88\xde\x1c\x9d\x09\xc2\xb8\x75\x8f\x04\x75\xdf\xc9\x3d\x29\x5a\x45\x4a\x4b\x6c\x65\x5d\xca\x86\x14\xa7\xdf\x9b\xe8\x1e\xb8\x24\x7d\x5b\x71\x52\x0e\x3a\x36\x70\x6b\xeb\x78\x6a\xae\x01\xfa\x5f\x90\x92\x96\xc7\xb2\x2b\x55\x3f\xf2\x7f\x1e\x3b\x15\x80\xa3\x2e\x30\x73\xb6\x15\x54\x3c\x37\x1e\x6e\x4b\x60\x65\x79\x3c\xc6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x19\x93\x29\x35\x69\x81\xc1\xa5\xe8\x19\xb0\xe2\x18\xdd\xc0\xb0\xa1\x0a\xd5\x74\x3a\x33\xa7\x05\x61\x28\x0d\x89\x1c\x6e\xac\xe2\xb8\x44\x20\x58\xb8\x40\x77\x58\xd4\x5a\x17\xc0\xc5\x0c\x40\x68\x98\xa1\xb2\xd5\xe7\x01\x01\x5f\xd3\x62\x28\x15\x56\xda\xc6\x24\x22\xc1\x07\xe7\xa6\x69\x0b\xc5\x4b\x1e\xbb\x30\xdb\x96\xf9\x74\xf4\x49\xcb\xe2\x05\x39\xbf\x27\xc5\x52\xe9\xef\xba\x06\x8a\x3f\xee\x8e\xb3\x63\x2a\x4b\x56\x06\x77\xc4\x54\xb6\x23\xdc\x15\xdd\xe4\xcc\x4e\x38\x75\xd6\xa7\xf9\xa7\xb6\x47\xfb\x8b\x20\x5d\x10\x2b\xe0\xed\xd5\xff\xd4\x5b\x5d\x9f\x5c\xc3\x11\xc4\x85\xaf\x23\x97\xd4\x2d\xd7\x0f\xa8\x4c\xc5\xb9\x42\x87\x07\x27\x07\x47\x2b\x7b\xe1\x40\x86\x69\x06\x26\x23\xba\x1b\x90\xa4\x75\x53\x2d\x60\x0c\x07\xa6\x18\x55\x42\x91\x57\xfd\x38\xc0\xaa\xaf\xc0\x20\x67\xa4\xaa\x06\x48\x6a\xf5\x17\x3b\xf2\x5b\xf3\xa9\xfe\x91\x12\x6d\x61\xdc\x64\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\x99\x80\x07\xba\x01\x1b\x32\xa9\x4f\xbe\x13\x0b\xde\x42\xbd\x64\xb3\x6c\x9e\x2f\xb9\xc0\xda\xfc\x69\x8d\x8e\x6e\x48\x37\x48\x95\x50\xff\x57\x3f\xe7\xf7\x54\x69\x55\x44\xb5\xe0\xa6\x78\x69\x2c\x05\xa2\xc5\xab\xbe\xf0\xf4\x4d\x77\x32\x23\xb8\x52\xb3\x85\xb7\x5e\x4c\x29\x5a\x89\x5a\x66\xbf\x49\xd7\xa1\x76\x20\x6d\x74\x77\x13\x38\x6d\x45\xec\x9b\x99\x20\x72\xc6\xab\xad\xa7\x71\xba\x32\xa9\x05\x67\x52\xcb\x14\x6d\x62\xdb\x3e\x4a\x9f\x41\x67\x4b\xb5\x72\x4b\x78\xaa\x4f\x99\x20\xa5\x55\x96\x2c\x7b\xe2\x0c\xcf\x41\x53\xd0\xfa\x1c\x29\x53\x4c\x93\xd0\x26\xfa\x63\xce\x42\xae\xdb\xaf\x99\xaa\x9f\xa9\x68\xf2\xdc\xd2\x6f\xae\x46\x67\xbd\x5b\x1a\x3e\xf8\x01\x8e\xf1\xd9\x8c\x14\xb7\x57\x69\x05\x45\x76\x04\x5a\xd0\x70\xb1\x4d\xc5\x40\x37\x9f\x4d\x2b\x18\x71\xa1\x10\xf3\xa5\x91\xf5\xd9\x9a\xc2\x2a\x12\x31\xa7\x05\x39\x76\x65\x93\x5d\x70\xde\x15\xc0\xc1\x6c\x4a\xd0\x2b\x7d\x20\xfe\xf2\xe7\x3f\xff\xf1\xcf\xe9\x32\x3a\x9d\xc9\x3c\xfd\x20\x20\x00\x43\xc1\xc0\x77\x45\xed\xba\x36\xdd\x59\xe7\x6c\xb6\x3d\x05\xa3\xae\xc2\x85\x5f\x9b\xe9\xfa\x43\x97\xe6\x95\x94\x84\xa0\x35\xe1\x0a\x2d\x3a\xcc\xff\x8c\x2b\x3e\x3e\xa9\xb1\x54\x44\x68\x1b\xc7\x5e\xeb\xc3\x42\xf7\x80\xb2\xe9\x71\x5d\x1e\x25\x54\xb8\x43\x81\x59\xbd\xc2\x2d\xde\xa3\x99\x79\x80\x27\x5c\x4f\xca\xd6\x5d\xf0\xc8\xf5\xf2\x5b\xf4\x22\x8e\x98\x5a\x2f\xc1\x1b\x92\x27\x13\xed\x87\x9b\x9b\xd1\x1b\xa2\x42\x81\xcd\xe0\x43\xf4\xe6\xfc\xc6\x57\xbc\xd2\xbb\xcb\x24\x35\xed\xa5\x76\x8a\xd4\x9e\xf1\xb4\x92\x67\xb9\xe3\x2e\x46\x94\x00\xcd\x36\x63\xa4\xd0\x0b\x3d\xe8\x15\x57\x71\x38\xc4\x8b\xd1\x31\xfa\x27\x6f\x41\xe5\xc2\xe3\x6a\x81\xee\xb0\x61\x34\x90\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x9a\x72\x09\xe0\xda\xd9\xfa\x59\x0d\xfa\x94\x6d\xd9\xce\x5a\xa9\x78\x8d\x66\x76\xa8\x66\x0e\xbb\x9a\x72\x46\x37\x32\x47\x10\x62\x3f\x12\x09\xd2\x18\x6b\xc9\xfe\xcd\x57\x61\x0b\xad\x48\x21\x33\xcf\x41\xe5\x21\x8c\x8a\x70\xaa\xac\xa2\x0f\x2e\x4c\x6a\x65\x54\xb4\x4b\xac\x7b\xb2\x14\xf0\x44\x99\x8a\x78\xa2\xf4\x42\x9e\xee\x25\xe9\x41\xc8\x3c\x25\x41\x51\x96\xb2\xa0\x28\x7b\xb5\x47\x64\x43\x6d\x76\x73\x19\x00\x8e\xee\x68\x2a\x2b\x21\x72\xce\x64\x5f\x8b\x03\x33\xce\x68\x61\xc2\x19\xa8\x6d\x38\x43\xbc\x55\x4d\xab\xc0\x15\x54\x60\x49\x86\x73\x2c\xa8\x16\xa8\xa6\xa6\xb2\x47\x42\x31\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\xf4\x03\x9b\x2d\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\x8c\xd5\x2c\x9f\x59\x87\xd5\x0c\x90\x7d\x10\xcb\x72\xc0\x50\x10\x9c\xda\x6c\xd8\x81\xc4\x9b\xac\x56\x6c\xa2\x48\x80\x78\x3b\x17\x4b\x76\xb0\xee\xe1\xea\x1c\x66\xc2\x9a\x3c\xbe\x59\x1d\x96\x40\x1e\x13\xad\xdb\x5f\x9c\x5e\x9e\xfe\x7c\xfd\xf1\xec\xe7\xcb\xd3\x77\xe7\x29\xaf\x4e\x2e\x5f\x96\xb3\x80\x59\xb6\x12\x66\x8f\x54\xe0\x51\x3f\xb2\x98\x91\xdd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xa5\x75\xd2\x58\xea\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x51\x88\x2c\x31\x66\xb9\x1a\x5e\xb6\x0e\x92\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbd\xc8\x35\xda\x19\xf7\x78\x43\x04\x05\x44\xd0\x2e\xec\x9a\x1f\xf8\x9d\x2d\x0e\x76\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xb3\xa9\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x8b\xf4\xd9\xe9\xc8\x97\xed\xe3\xe7\x43\x5f\x1d\x6c\xa9\x1f\xfe\x4a\xc1\x0f\xa1\x25\x31\xfe\xea\xd8\xe7\xa9\xbd\x82\xfe\x78\x51\x84\x59\xe9\x20\x67\x5f\xdf\x3e\x51\x45\x73\xcd\x8b\xdb\x4c\x6e\xd7\x9b\xb3\x91\x79\xdb\x12\x9e\xc5\xdc\xc0\x5a\xcb\xe4\x08\xeb\x5f\x81\x02\xba\x77\xba\xee\x8c\xd3\xf5\xc0\xa4\x75\xe1\xea\xdb\x8d\x1d\xa8\x07\x7b\x6b\xab\x7b\x9c\xe2\x23\xfa\x15\x50\xf6\xd6\xd6\x03\xcf\xde\xda\xda\xe0\x71\x95\x68\x29\x67\x6f\x04\x2e\xc8\x68\x97\x94\x37\x27\x40\x50\x69\xeb\xb3\xa3\x4e\x87\xf3\xe2\x82\x11\x52\x1a\xf9\xe1\x8a\xea\xa2\xa9\x1e\x89\x81\x47\x83\x0f\xb1\x03\x16\xb7\x22\x41\xcd\xbb\x99\xd9\x57\x5b\x15\xd7\x05\x99\xd7\xf5\xae\xb3\x4d\x1a\x4f\x86\xee\xaa\x86\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\x87\x2b\x88\x24\x9d\xea\xe9\x72\xb5\x9c\x0d\x89\x96\x2b\xbd\xd7\x75\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x12\x94\x04\xc6\xe8\x16\x4a\xd9\xc2\x6b\xe2\x27\xea\x9a\xd8\x5c\x4d\xa3\xd1\x54\x9c\x4d\x61\x32\xb0\xcd\xc9\xb8\x6f\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc1\xdb\x0c\x69\x19\x2e\xf0\xed\xf5\x29\x46\x2d\xfd\x88\x29\xdc\xf6\xc9\x3d\xdf\x4f\xae\x45\xef\xd5\x8c\x88\x3b\x2a\xc9\x20\xbe\x74\x2d\x72\x6e\xdf\xa5\x32\x72\xe6\x33\x4f\xa1\x62\x33\x07\xf5\xb6\x80\x54\xd6\xe8\xb6\x3e\xc2\x7b\x9d\x68\x65\x9c\x0d\x19\x99\x1a\xa2\x06\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\x3e\xdb\x40\x2a\xde\xf4\xea\xf6\xce\x29\x8e\xee\x09\x90\x42\x74\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x80\x88\x9e\x2b\x19\x9d\x90\x6f\x75\x63\x61\x0e\x18\x8d\x89\xc2\xd6\x07\xae\x0f\x81\xe7\x44\x07\xba\x73\x7d\xf6\x20\x49\xe0\x66\xed\x06\xf0\x34\xe9\x53\xac\x12\xa4\xc4\x1a\x6d\xde\xac\xe7\xa7\xb7\x1d\x95\x36\x5e\x97\xc8\xc3\xbc\x1b\xcc\x86\xfa\x44\xf3\x56\xed\xc8\x3d\xf2\x90\xeb\xc8\x50\x5c\x04\x46\x22\xad\x89\x44\xbc\xcd\x54\x6f\xe2\x95\x6d\x2e\xa7\x85\xb7\xf7\x3b\xad\x7d\xa4\x2a\x69\x54\xd5\xe1\x1c\x5b\xec\x01\xf2\x7e\x9b\x87\x1b\xf0\x57\x8e\xdb\xc9\x84\x08\xb8\xe9\xa0\xc3\x2b\xb0\x7b\x5f\xc7\xcb\xdd\x61\x71\xce\x5b\x0b\xf8\x22\x6a\x00\xb5\x03\x2c\x99\xc4\x03\x4d\x5a\x92\x4d\x28\xd3\x2b\x88\x04\x2e\x78\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x54\x16\x48\x4b\x59\x85\x71\xbe\x67\x71\x98\xc4\xbc\xfb\x61\x1d\xeb\x8b\xdd\x16\x45\xc5\xa5\x4d\x8f\x86\x75\x29\x66\x98\x31\xe2\x9c\x51\x54\x81\x27\x7b\x4c\x08\x43\xbc\x21\x06\x94\x17\xd5\x19\x8c\x24\x65\xd3\x8a\x20\xac\x14\x2e\x66\xc7\xba\x77\xcc\xed\x85\x2e\x0f\xd9\x7e\x22\x95\x20\xb8\x36\x7b\x42\x90\x1a\x53\xd3\x3c\xc2\x85\xe0\x52\xa2\xba\xad\x14\x6d\xfc\xcb\xe2\xbc\x88\x04\x18\x21\xa4\x49\x4b\x75\x6b\x05\x69\x25\x5d\xc2\xf3\xa0\xeb\xa1\x1d\x3e\x0f\x8b\x15\x81\xeb\x6c\xa0\xbf\x25\x75\xa3\x16\x3e\x31\x31\xce\x06\x9a\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\x94\x83\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x9a\xfc\x3b\xdf\x09\xf7\xaa\x92\x4a\xeb\xeb\x90\x71\xd9\x7f\xd8\x55\xa6\x31\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x75\xb6\xbb\xdc\xc9\x34\xb9\x02\xe5\x63\xdc\xb9\x1e\xf4\x38\x07\x3a\xdb\x02\x52\x61\x56\xa4\x0e\x6c\x28\x46\xe6\xfa\x1c\x90\x82\x68\x55\x14\x67\x14\x32\x4f\x2e\x63\x02\x5d\xee\x1d\x91\x12\x4f\xc9\x28\x12\x8e\x90\x43\xe0\x74\x8e\x36\xc0\x31\x74\xdb\x66\x46\x0c\xd1\x95\xe2\xc1\x27\x61\x92\x57\x68\x3c\xd6\x66\x20\x51\x3d\x70\x46\xd3\x9d\xa0\x4a\x11\xd8\xa5\x50\xc9\x09\x00\x68\xcb\xe4\x9d\xfd\xe4\xb2\xa8\xf6\xec\xa4\x87\xed\x69\xf5\x83\x95\x26\x4d\x6b\x4c\xd0\x58\x50\x32\x41\x13\x0a\x79\x63\x90\x51\x35\x30\x55\x08\x30\xe0\x76\xb1\x94\x44\xc0\xb0\xad\x5b\xc0\x0d\x3f\xae\x3f\xff\xb0\xe3\x57\xa2\x65\x05\x0e\x4a\x74\x02\xb7\x18\x9d\xa0\x29\x64\x71\x59\x23\xf8\x4f\x2f\xff\xf6\x17\x34\x5e\x68\x7d\x0d\x0c\x31\xc5\x15\xae\x5c\x07\x50\x45\xd8\x54\xaf\x22\x88\xdc\x38\xb9\xd1\xe3\xa7\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\x3a\x7a\x20\x1f\x4f\x4a\x32\x3f\x09\xb6\xd0\xb0\xe2\xd3\xb8\xb7\x9e\xe5\xc8\x26\x4e\xf2\xb3\xad\x39\xd1\xbc\xa2\xc5\x62\x5b\x67\xda\x15\x2f\x41\x33\x7e\x67\x9c\x39\xab\x47\x35\xa0\x7a\x69\x78\xd3\x56\x30\x71\xe8\x7b\xcf\xcf\xd7\x4a\xb2\x4c\x7d\x94\xea\x24\x0c\xa4\x1d\x04\x51\x6d\xb3\x4b\x77\x8e\x4d\x61\x74\xdd\xe4\x96\x78\xc2\xc6\xdc\x7c\x1d\x92\x68\x6f\xdc\xf7\xb8\xaa\xc6\xb8\xb8\xbd\xe1\x6f\xf9\x54\xbe\x67\xe7\x42\x70\xd1\x1f\x73\x85\xf5\x9d\x3e\x6b\xd9\x2d\x54\xd1\xed\xc8\x68\xf9\xd4\x62\x0a\x1d\x7f\x40\x30\xba\xa8\xce\xb8\x51\x1a\x7a\x50\xa7\x92\x38\x1f\x5c\xd7\x32\xb9\xa7\x9d\xa3\x8d\x21\xa2\xfb\x1c\x9b\x80\x4f\x7a\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\x48\x39\x96\x03\x73\x01\xc0\x0d\xac\x55\xad\x1a\x57\x55\x6c\x94\x20\x14\x01\xdf\x47\x17\xa7\xde\x81\x23\xaf\xb6\x76\xba\xbf\xd8\x64\xbc\xb9\xf9\x27\xd8\x8b\x54\x49\x52\x4d\x06\x86\xed\xc5\xbb\xb5\x0e\x40\xbb\x3a\xb0\x57\x5e\x3c\x53\xd0\xf6\x8d\xb6\x39\xaf\xda\x9a\xbc\x26\x73\x5a\xc4\x05\x30\x7b\xab\xd2\x7b\x9b\x73\xd3\x57\x54\x02\x09\xd0\xb8\xe2\xc5\x2d\x2a\xed\x97\x01\x54\x7e\xb9\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x38\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xd7\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\x87\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\x7f\x1b\xbe\x85\x15\x66\x2c\x4f\x39\xe4\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\xde\x7d\x99\x21\x18\x9a\x96\x23\xd1\x9b\x17\xe6\x83\xd0\x35\x56\xd6\x3e\x72\x51\x76\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xdb\x9a\x84\x55\x44\x7d\x8d\x9b\xe1\x2d\x59\x44\x6e\xb8\xc4\xe3\xf2\x10\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc4\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x47\x31\x63\x33\xea\x40\xdb\xbe\x72\x3e\x76\x0b\xd7\xbf\x71\xf4\x27\xfe\xca\x31\xbf\xfa\x9a\x2e\x1a\x18\xdf\x73\xbd\x67\x7c\xe7\x33\x89\xd3\x24\xa4\x13\xdc\x4e\x76\x67\xf4\xaf\xa3\x9e\x43\xcb\x9c\xcc\xc0\xf4\xb5\x8e\xa6\x63\x53\x14\x20\xa1\x03\xfa\x28\xda\x46\xd1\xc1\xb7\x07\x5b\xbd\xe3\xcc\xca\x08\xde\xe0\x29\x58\xa6\xbb\xb0\x40\xcb\x7d\x0a\x39\x68\x67\xfc\xce\x7c\x6f\xd0\x25\x8d\xfd\x15\x29\x3b\x22\xf3\x19\x4f\x5a\x1d\x83\x1c\x74\x3b\xc2\x5a\xd7\x86\xab\xf0\x0e\x2f\x10\x16\xbc\x65\x49\x69\xd0\x10\x18\xf1\x81\xb3\x77\x4b\x83\xbd\xe4\x8c\xb8\x20\x7d\x4a\x2b\x37\x1d\x87\x39\x95\x06\xaf\x40\x19\x7a\x75\xfc\xea\x65\x72\xdf\xaf\x48\xd1\x0a\x49\xe7\xe4\xca\xd6\x38\x0f\x82\x2a\x17\x93\x11\x97\x92\x8e\x2b\x48\xdc\x52\x1c\x9d\x9b\x02\xf0\xab\x03\xf5\xc0\x11\x18\x31\x17\x21\x5b\x69\x42\x0f\x0f\xcd\x09\x0e\x01\x9f\xba\x81\x04\xd4\xc7\x6e\x69\x92\xb0\xae\x4b\x9a\xe4\xa5\xd7\x24\xcd\xbd\xb7\xd5\xb1\xba\xc2\xf7\xbb\x20\x49\xde\xd9\xd8\x40\x57\xd9\x9e\xba\xca\xc9\xf0\xd1\x9d\xa0\xca\x1e\xee\x3b\x2a\x09\x3a\x04\xaf\xc4\xd2\x66\x4c\x22\x68\x0e\x7d\x58\x89\x15\xf0\x73\x10\x2c\x8b\xe5\xa3\xbb\x0b\xab\xb4\x2a\x4f\x3a\x04\xfe\x9d\x75\x60\x75\x2b\x68\xa5\x7f\x77\x2f\xcf\x30\x2b\xab\x24\x99\xe1\x67\xa5\x5a\x24\x71\xe1\x5c\x4c\x50\x28\x12\x6d\xfc\x32\xa8\x26\x31\xc3\x12\x31\x8e\x6a\x82\x01\xa0\xa9\x6f\x17\x27\x05\x7b\x5c\xcd\xf9\xfa\x60\x36\xbb\xb9\xc6\xc2\x0b\xc1\x8a\xeb\xd7\x54\x5a\xf1\xac\xe5\x88\xb5\x40\x0c\xac\xa3\xc6\x65\x4a\x6a\x77\x30\xa7\xdd\xe2\x1d\x77\xa0\xc9\xe5\x9e\x74\x17\xc7\x52\x5f\x1e\xa3\x1f\x03\x5b\x82\x5c\x37\xdf\x02\x4e\x70\x8d\x5b\xae\x03\xc9\x24\x45\xb3\xcd\xb3\x3c\x5c\x7f\x2d\xae\x8c\x75\x7d\x8f\x7d\x87\x13\xfa\xf0\xf9\xa1\x0e\x02\x59\xe8\x30\xa2\x26\xa4\x6e\x6b\xa0\xd8\x8c\xc7\x34\x26\x6f\x17\x94\xf0\xee\x9e\x29\x61\x44\x60\x1b\x57\x70\x10\x51\x4b\xbe\x82\x25\x67\xa9\x07\xe2\x33\x1b\x4e\xcb\xfb\xcf\xab\x29\xe6\xcf\x12\x3a\x02\x7a\xce\x21\x17\x4b\xa7\xdd\x46\x4c\xd6\x69\x2c\x39\x47\xbd\x44\xcd\x65\x36\x7f\xc0\xf9\xa9\x17\xe5\x97\x96\xce\x71\x45\x0c\x87\xbd\x13\x0d\x5b\x55\x26\x64\x3b\xde\x55\xb3\xd1\xda\x87\x60\x76\xac\x07\x3d\x3c\x68\x41\x66\xd2\x27\x5e\xbc\x40\x87\xa6\x8d\x03\x43\xb2\xbb\x5d\x25\xd7\xae\xd5\xf9\x7d\x93\x50\xb9\x35\xdf\x7a\x9d\xdf\x37\x18\x70\x1a\xcd\x4e\x2c\xdc\x7f\x91\x19\x9e\x13\xe0\x34\xa6\x15\x16\x15\x80\xd2\xaf\xcd\x94\xa1\x71\xab\x10\x61\x73\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xfb\xc3\x8f\xa7\x57\x90\xb4\x74\x64\xd9\xf2\xed\xf8\x5a\x09\xfc\x00\x4b\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xfa\xb9\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\xf7\x81\xa7\x78\xf2\x72\xba\xc0\x2d\xf1\xf7\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\xd0\x90\x47\xd7\x78\x58\x43\x42\xb9\xa2\xe8\x1c\x48\x4f\x4c\x19\xe6\xe1\xd8\xbb\x38\x0e\x9e\x01\xa5\x13\x4c\xf2\xb7\xab\x49\xba\xe2\x61\x84\x1a\x2d\x5b\xf7\xe1\x47\x1c\x86\x7c\xc7\x20\xc2\x11\x9d\x67\xd7\x33\x5e\x92\xcd\xab\x0a\xa5\xed\xf3\x4b\xdb\x66\x90\xf8\x44\x99\xbd\x75\x4c\xe9\x5c\x28\x48\x62\x72\xfc\x64\x31\x23\x65\x1b\xa1\x72\x5d\x4c\x0c\x18\x68\xd0\x7b\x1d\x46\x05\x66\x25\xd5\x7b\xc5\xa4\x02\x98\xd7\xeb\x43\x66\xf5\x7f\xd7\xa0\x08\x6b\x96\xfa\x0f\x2f\x23\x98\xd7\x00\x62\xbd\xa2\x6e\x0f\xc2\xaa\xbd\x96\x30\x01\x54\xd2\x92\xa0\x31\x29\x78\x4d\x00\x3b\xdc\x70\x66\xf4\x71\x47\xa9\xe0\x13\x48\x4c\xe4\xd8\x0c\x6d\xd3\x2e\x05\x8e\x50\x7b\xa1\xbb\x63\x24\x3d\xd7\xbe\x00\xb4\x98\x5e\x6b\x2a\xba\xe6\xf5\x3c\x1a\xd8\x86\x5f\x19\xc4\x19\xc2\x5d\xd1\x4e\x3d\x82\x4d\xfb\xf3\x25\xc9\x34\xdd\x52\x0d\xc9\x9c\x02\xfd\xc0\x09\x96\x92\x4e\xd9\xb0\xe1\xe5\x50\x37\x7b\xf2\x3b\xfd\xbf\x1b\x1f\xa5\x48\x01\xa0\xdb\xba\x26\x15\x48\xe6\xa7\x3e\x3f\xae\x5d\xb3\xa7\xa5\xfb\x97\x39\x44\xce\x3a\x83\xfc\x82\xa5\x85\x9b\x50\x65\xd6\x2b\x66\x99\xae\xd7\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4c\x2a\xf9\xb9\xed\x02\x18\x87\x98\x1e\x6c\x98\x80\xe5\xae\x1d\xbc\x76\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x51\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x61\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xfe\x7a\x05\x24\x23\x03\x20\xc8\xc6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xcd\x2f\x21\x3b\x82\x65\x4f\x0b\x14\xc8\x35\x77\xc0\x84\x57\x15\xbf\x03\xfe\x1b\xd3\x87\xc0\xfd\xb9\x39\x8f\xcb\x50\x2e\x55\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x41\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x46\x67\xf1\x7f\xfc\x41\x12\xb1\xa9\x57\xd1\xfe\xf9\xf2\xf4\xe3\xa6\x39\x15\x35\x17\x23\x53\x04\x3c\xcf\x4b\x25\x79\xab\xf7\x8f\x5b\xd3\x4c\xef\x84\x2a\xf3\x59\xfb\x39\x91\x6f\x04\x6f\x37\x35\xc3\x3e\xfd\xb2\xb3\x19\x66\x2e\x41\x20\xd3\xc8\x17\xb2\x50\x55\xec\x34\xce\xb0\x20\xb6\xb8\xa8\xd6\x0e\x65\x83\x8b\x4c\xb3\xe7\xeb\x7e\x66\x7c\x5d\xc6\xf5\x90\x6d\xd3\x54\xa4\x26\x4c\xe1\x0a\x5e\x9b\x6b\x23\xae\xbc\x37\x65\xb1\xbb\x3b\xe3\xc7\xff\xf8\xe9\x71\x4e\xe7\xa7\x9b\xc8\x71\x56\x3f\xd7\x42\xfa\xc9\xfd\x74\x0b\x05\x6e\xf0\x98\x56\x54\xeb\x2e\x8f\xf1\x7e\x17\x1f\xbf\xe2\x5c\x7d\xef\x71\x7d\x8f\xd1\x52\x23\xe8\x9c\x56\x64\xba\x71\x6c\xf4\xcb\xb6\x93\xbe\x09\x47\xae\x89\x73\x59\xe0\x2a\x26\xb7\xe5\x0b\x47\xc2\x0b\x08\xcc\x3c\xca\x82\xa4\x89\x9e\x2f\x78\xf9\xe6\x82\x28\x5a\x03\x8f\x05\x1a\x46\x78\x65\xe2\x61\x81\x71\x70\x98\x74\x8f\xe3\x43\xe5\xe1\x6d\x9d\x52\x36\x45\xbd\x42\x84\xad\x10\x84\xa9\x6a\x11\x04\x4e\x81\x58\xc3\x68\xce\xa0\xd5\x82\x62\x6d\xb5\xc3\x18\x7f\xdc\xa9\x37\x98\x2c\x67\x47\x8d\x17\x5a\x9d\x0c\xfc\x31\x93\x16\xc8\x62\x40\x83\x37\x25\x63\x01\x2f\x15\xc5\x3c\xb6\xa6\x52\x10\x6f\x08\xeb\xb6\xf0\x89\xf5\x8f\x0e\xf5\xd6\xee\xd5\x0e\x32\xe6\xe5\x71\x5d\xfe\xae\xa9\xb0\x9a\x70\x51\x0f\x9d\x1b\x64\xd8\x33\x3d\x23\xba\x75\x06\x79\xec\x1e\xd3\x61\x78\x9b\x4c\x79\x75\x56\x56\x24\x30\x2b\xfd\x02\xb0\xd2\x04\x2f\x51\xcb\x04\x29\xf8\x94\x01\x93\xbf\xfd\x16\x0c\x26\xef\xf5\xc1\x52\x9b\x74\x88\xb5\x55\xb5\x71\xdf\x22\x8d\x51\x3e\x27\x62\x46\xf0\x86\xa7\x30\x6d\x83\xbf\xb7\x6d\x22\x41\x1a\x41\x24\x4c\xa8\x09\xa1\x4b\xde\x8a\x82\xf8\x4e\x21\x2c\x25\x2f\x80\x95\xd8\x24\x09\x3a\xbe\x30\x0c\xa6\xe2\x84\x0b\x84\xd1\x94\xce\x09\x43\x57\x66\x37\x9c\x55\x78\x73\x9e\xac\xc0\xef\xe6\x5c\xec\xb8\x55\xdc\x27\x90\x22\xac\x10\x2e\x6b\x0a\x2c\x0d\x86\x79\xc0\xba\x25\xc3\x56\x83\x9f\xe8\x5d\x2a\x38\xa4\x13\xa2\x8b\x4d\x13\x4c\xbf\xe8\xbd\x90\x55\xe9\x80\x00\x7e\xba\xc0\xc4\x73\x00\x08\x5f\xfc\x1c\x15\x10\x3b\x77\xe5\x61\x22\xa6\xe7\x4b\x3a\x64\x09\x32\xf4\x35\xb0\xae\x51\xeb\x9c\x9a\xe1\xb9\x81\x4b\x74\x4b\x5c\x69\x35\x63\x53\x35\x52\x9b\xfd\x00\x20\x0a\xfb\x65\x12\x07\x5d\x44\x03\x08\x65\xc1\x35\xd6\x85\x37\x46\xbc\xbc\x6e\x48\x31\xe8\xb6\xa0\x5b\x70\xc7\xb4\xe1\x48\xc0\x36\xec\x4f\x20\x05\x8d\x4b\x44\x18\x2f\x71\xa9\x77\x6b\xd8\xc9\x10\xb7\x42\x55\x8f\x56\x04\x0c\xf3\x4e\x5e\x18\xb0\xc3\xbf\x89\xd8\x38\xb5\x68\x8d\x3b\x6e\x4a\xd5\xf1\xed\x5f\xc1\x17\x47\xd8\x0c\xb3\x02\x34\x79\x79\x72\x4b\x1a\x79\x22\xe9\xd4\xb8\xde\xfe\xf2\xd7\xbf\x82\x1f\xce\x2d\xce\xc9\xd5\xf9\xe9\xeb\x77\xe7\xc7\xf5\x66\x6a\xd9\x56\x9d\x72\x0d\x56\x8a\x08\xf6\x2d\xfa\xef\xc3\x7f\x7d\xf3\xeb\xf0\xe8\xbb\xc3\xc3\x1f\x5f\x0e\xff\xf6\xd3\x37\x87\xff\x3a\x86\xff\xf8\x8f\xa3\xef\x8e\x7e\x75\xff\xf8\xe6\xe8\xe8\xf0\xf0\xc7\xbf\xbf\x7b\x73\x33\x3a\xff\x89\x1e\xfd\xfa\x23\x6b\xeb\x5b\xf3\xaf\x5f\x0f\x7f\x24\xe7\x3f\x7d\xe1\x4b\x8e\x8e\xbe\xfb\xfd\x86\x1d\x8d\x24\xe5\x4c\x25\xe2\x4c\x22\xdf\xcc\x48\xb8\xd9\x08\x42\x6a\xb8\x41\x62\x58\x05\xd2\x2e\xa0\xd1\x52\xdb\x4e\xd3\xb2\xff\xd2\xf7\x8a\xeb\x1e\x9b\xea\xab\x46\x9a\xeb\xa7\xe2\x77\xc0\xec\x42\xb9\x56\x9c\x37\x8f\x38\x81\x1a\x77\x49\xe6\x44\x0c\x5c\x1f\xde\xea\x57\x8e\x22\xdf\x18\x42\x1e\xd6\xbd\x2f\x92\x3a\x2f\x72\x83\xb8\x79\x79\xca\x95\xbc\x01\xa6\x3a\x3b\x5a\x10\xdc\xc7\xe8\x23\x16\x94\xb7\xd2\x6a\xc8\x48\x1b\xe1\x9c\x81\x92\x61\x98\x10\xfc\x65\x0f\x81\x17\x93\x36\xb1\xa9\x90\x71\x4d\x7a\xea\xe1\xd2\xd2\x48\xf9\xa9\x3f\xf5\x97\xe4\xd9\xfa\x5b\x9b\x6e\x6a\x22\x36\x82\xcc\xdd\x30\x84\xe3\x12\x22\xca\xd4\xdc\xf0\xa3\x32\x16\xc1\xda\x2b\xda\x29\x34\x9b\x3a\x0b\x82\x29\x83\x46\xdd\x18\xe1\x42\x8b\x89\xbd\x42\x75\x26\x3a\x75\x8c\x60\xb0\x6e\xc6\xeb\x1e\x7c\x1a\x77\xcc\xe2\x85\x63\x2c\xdd\x5e\xb3\x3c\x1b\x4f\xb9\xff\x2f\x26\x3d\xa8\xa4\x0f\xdd\x77\xd4\xae\x7e\x1a\xd1\x0b\x73\x20\xe0\xaa\x1f\x16\x82\x2a\x5a\xe0\xea\x45\x04\x42\xd6\xbd\xa8\xa8\x5a\x6d\x70\x85\xef\x12\x04\xa9\x3b\x6e\xfa\x84\x2b\x74\x4b\x16\x77\x5c\x94\x4e\xfb\x0b\x01\xb3\x9b\xc6\xa2\xf5\xc6\x90\xca\x0d\x07\x00\xf7\x5a\x24\x9b\x50\x8d\xa8\x89\x40\x63\xe2\xd0\x65\x4b\x3f\x5e\x1c\xa3\x53\xb6\x30\x8a\x57\x84\xfd\xef\x23\x27\x41\x31\x58\xd0\x6e\x8d\x25\xd2\x3b\x0d\x56\xeb\x71\x7d\xc3\x2a\xaa\x2a\xdc\x7a\x68\x90\x36\x79\xbc\xe0\x71\x7a\xab\xc3\x06\x71\x61\x69\x6b\x41\x20\x09\x43\xf2\xbb\x29\x06\xd8\xbe\xec\x49\x6e\x0b\xad\xf5\x53\x46\xa4\x7c\xa3\x37\xec\xf6\xce\x0c\x06\x05\xdc\xf6\x05\x88\x6e\x3b\x7a\x28\xa2\x25\x93\x49\xd9\xd3\x2a\x01\x2f\xbb\x5f\x6e\xba\xa4\xa7\x0e\xeb\x02\xd6\x8e\xa1\xa0\xd6\x4d\x53\x25\xc3\x00\xaa\x09\x74\xea\x5f\x9c\x5e\x6e\x1a\x66\xb3\x1c\x57\x46\x85\x96\xdd\x18\xbb\xf2\xa0\xfd\x51\x82\x2d\x66\x79\x89\xc8\x2f\x2d\xae\x00\x39\x79\x23\x5a\xb2\x69\x65\xe1\x28\x83\x83\xa8\x3b\x2e\x6e\x4f\xfe\xfc\xd7\x97\x60\x73\xf8\xde\x0d\xa7\x1b\x5f\x51\xb1\xf9\xde\x51\x99\xde\x4b\xc5\xcf\xcb\xab\x70\x23\xbb\xb5\x74\x0e\x0d\x8b\x89\x35\x15\x39\xf4\x0e\xf0\x0b\x14\x85\x35\x88\xca\xeb\x8e\xcf\xe8\x1e\x76\xdd\xbd\x59\x34\x9b\x2b\x49\xf1\xc9\xd8\xbd\x76\x93\x41\x9f\x67\xe1\xdb\xcc\xaa\x48\xb3\x24\xbe\x9d\x00\xba\x70\x20\x83\x8f\x81\x22\x07\xa4\x39\x40\x6a\xe0\x86\x59\x34\x09\x74\x40\x59\x10\x8d\x91\x78\x11\xe7\x60\x03\xd6\x8e\x27\x95\xb9\x57\xbd\x96\xed\x4d\xea\xd4\x82\xa5\x2f\x7d\x05\x0c\xcb\xf9\xb4\xa9\x7a\x62\x58\x40\xa1\x48\xa5\xaf\x78\x66\x9d\x3f\x00\xcc\xaa\xb4\x19\x57\x1a\x36\x53\x2c\x94\x51\x98\xdd\xd4\x6c\xaa\x1b\x77\x3c\x30\x25\x41\x78\x8e\x69\x05\x68\x78\x70\x25\x71\xd9\x03\xc7\x98\xc1\x16\x9c\xc9\xb6\x86\x1e\x6d\x1a\x4a\x1b\x2f\xac\x36\x11\xe3\xdf\xa4\x86\xe4\xb1\x6a\x66\x9f\xa6\x83\xdf\x5c\x35\x7b\xbd\x60\xb8\xa6\x85\x5b\xc5\x53\xb3\x6c\x40\x24\xd9\xa3\x8f\x8f\xf7\xca\xea\xee\xd7\x75\xab\xf4\xd4\xc6\x28\x27\xdb\xb8\x19\x22\xc2\x3e\x70\x99\x04\x47\x21\xcc\xa9\x20\xf7\xb8\x50\xd5\x02\x22\x2a\xbd\x1f\x0d\x10\xa1\x90\x77\x6a\xe0\xe8\xd5\xe6\x8c\x27\x5c\xd8\x9d\x65\xf4\xd9\xde\xdb\x6f\x48\xdd\x00\x9b\xa1\x55\xe0\xa5\xa1\xfd\x55\xad\x60\x8e\xc8\x74\xe9\x2f\x36\x6e\x3e\x00\x25\x46\xe4\x91\x5d\x28\x84\xcb\x52\x22\xec\x8b\x29\x51\x65\x14\xef\x96\xd1\x5f\x5a\x52\x2d\x10\x2d\x09\x53\x1d\x70\xad\x3f\xc5\x96\xef\xc9\xca\x87\xcd\xc5\xfa\x59\x77\xbe\x8d\xba\x4f\x48\xe9\x2a\x10\x59\x7f\xf2\x03\x6b\x6a\xdc\xbf\x60\x26\x68\x5d\x3d\xc2\x4c\xd8\x92\x4e\x10\xc1\xce\x92\xa2\x0a\xc4\x32\x12\xe4\x48\xfb\x80\x30\xec\xfa\x8d\x64\x48\xa4\x4d\xbc\xaa\x58\xde\x4a\x11\x00\x48\xf3\x74\x9c\x09\xfa\x02\x44\xaf\x2f\xaf\x7f\x7e\x7b\xfa\x5f\xe7\x6f\x9f\x9c\x09\xb2\xa7\x2a\x6c\xee\xd5\x30\x4f\x8e\x25\xb8\x5a\xee\xc8\x72\x58\x7c\x49\xfe\x38\x0b\xdc\xea\x73\x32\x96\x4a\x88\x39\xd4\x98\x29\x9f\xee\x10\xfd\x51\xef\x3a\x0f\x84\x37\x9f\xac\x19\x92\xbe\x8a\xd7\xca\x5d\x5f\x12\x2c\xaa\x5d\x13\xd7\xda\xee\xde\x09\x47\xb2\x13\x7b\xa8\x37\xb5\x9f\xde\x4b\xee\xa7\x51\x8d\xae\xee\xc3\xac\x7b\x0a\x58\xb2\xfd\xed\x1c\x64\x86\x01\x2d\x90\x09\xbe\x62\xc4\xc8\xdd\xb2\xba\x60\x6e\x72\xfd\x17\xb1\x7b\x6a\xcc\x5b\x56\x9a\xdb\xcd\x0e\xc1\xf8\xbe\xc3\x94\x9e\x92\x54\x44\x39\xcf\x55\x9a\x82\x80\x9c\x9a\x0d\x4c\xaf\xe0\xf3\x82\x77\x1b\xc5\x1d\x0a\x9e\xb9\x33\xe4\x25\xb2\xfe\x64\x80\x70\xc5\xd9\xd4\xd2\x0b\x47\x35\xdb\xa5\xfb\xfb\x28\xc2\x60\x65\xb2\xa1\x66\x2e\xb6\xd7\x84\xe9\x8b\xd5\x69\xd2\x37\x6b\xb8\x5c\xba\x4d\x41\x0a\x2e\x4a\xe3\xd3\xd1\x13\x6f\xdc\x37\xc7\xbd\x13\x77\x0d\x9f\x11\x19\xbd\xb1\xd6\xea\xdd\x30\xbf\x8c\x43\x55\x8e\x69\xe0\x23\x03\xc3\xc7\x68\x3a\x51\xcd\x2d\x85\xca\x7b\xa2\x3c\x20\x7f\x10\xbc\x42\x4d\x85\x19\xb1\xe5\x40\xbc\x03\x36\xcb\x34\xef\xe5\xfa\xe7\x9e\xaf\x20\xab\xd2\x9b\xf8\xdb\x70\x7c\x78\xce\x65\x53\xd9\x00\x1b\x22\x15\x3e\x41\x67\xa3\x0f\xb0\x4d\xde\x91\x9a\x8b\x45\xd7\x49\xaf\xa2\xeb\x53\x80\x37\x16\xd6\xeb\x93\x72\xb4\xb9\x64\x21\x82\xce\x41\xbc\x30\xc7\xce\xa2\x74\x74\x4f\xde\xd2\x9a\x2a\x48\x16\xdb\x34\x2e\x54\x34\x2d\xc4\x93\xd0\x8b\x1a\x46\xf3\xa2\x2f\x90\x25\x32\xcc\x3a\x4b\xfe\x1e\x2c\x88\x09\x77\x38\xec\x62\x8a\xab\xc0\x84\x57\xf5\xbf\x18\x19\x4e\x05\x86\x80\x8d\x13\x20\xdc\x54\x5b\xb1\x5d\xc2\x81\xa3\x22\x4a\x5e\x6b\x6b\x40\xc0\xc4\x0e\x8c\x57\x49\x4f\xa5\x7f\xbd\x9c\x61\x01\x16\x75\xad\x2f\xa1\xfe\x7a\xe0\xa8\x8b\x7f\x53\x3f\x8e\xb6\x68\xdf\x92\x39\xa9\xba\x4d\x68\x3d\x32\x1b\x36\xbc\x79\xf9\xbf\x68\xd3\x34\xde\x52\x2c\x22\x9c\x9a\x28\x8b\x82\x69\xf7\xb1\x16\x4c\x9d\x3a\x29\xf5\xe1\xf6\xa7\x79\xd0\xcb\x5b\x6e\x48\xd1\xbf\xb2\xa3\xaa\x21\x81\xbf\x41\x1f\x9e\x8e\xaa\x3d\xa4\xce\x8f\xba\xd3\x1e\xd9\x55\x88\x1e\xcf\x5d\x88\x3e\xe1\x32\xd4\x62\xaf\xc0\x0c\xc4\x8f\x03\xfb\xe9\x23\xdf\x1d\xca\xcd\xef\xd2\x14\x8e\xe1\x68\x86\xe1\xde\x5e\x7d\xd0\x57\xa8\xd5\x11\xc2\x94\x58\x58\x00\xe8\xb5\xde\x6f\x7d\xa1\x1b\xaf\x3b\x44\x53\x0b\xa7\x11\x0b\x47\x93\x02\xa7\x52\x02\xa7\x10\x62\x66\xab\xd6\xf9\x09\x4e\xf6\xde\x62\x83\x49\xb0\x2a\x5d\x62\xab\xdc\x20\x0b\x47\x1e\xf1\x12\xdd\x01\xaa\xa0\x4f\x98\x60\x0a\x02\x5f\xe8\x6e\xdd\x76\x85\xce\xdc\xf5\xea\x82\x21\xd1\x4d\x5b\x87\x5a\x32\x27\x76\x06\xce\x28\x0b\x63\xde\xf6\x46\xb0\x7a\x5a\xcf\x6d\x51\xcc\xb8\x24\xcc\x82\xe1\x85\xfb\x01\xeb\x07\xa0\x4b\x73\x3d\x26\x55\x90\xb6\xc4\x1d\x64\x4e\xc4\x42\x41\x24\xd4\x13\x19\x5b\x07\xa8\x5c\x0a\x83\x05\x60\xe7\xe8\x86\x41\x66\xdb\xec\x00\x00\xba\x4c\x9c\xf3\x15\x46\xba\x95\x1d\x91\x97\x69\x29\x52\xb4\xe5\x23\x58\x82\x52\x49\x5b\xd1\x9c\xac\xa9\xd1\xb1\xe3\x03\xc7\x24\xbe\x87\xd2\xc0\x9d\x8d\x54\xf0\xba\x69\x55\x10\xa4\x75\x41\xdc\x98\xd5\x4f\x22\xab\xa8\x31\xc3\x53\x32\xf4\x1d\x19\x06\x09\x49\x91\x2a\x44\xe4\x85\x9a\x03\x2b\x8f\x9e\x13\x5e\x1e\xc5\x63\xe6\x51\x06\xdc\x3c\x4a\xc5\xce\xa3\xbc\xf8\x79\xd4\xdd\x4a\x5b\x39\xba\xde\x65\xb0\x74\x78\x6d\x5d\xef\x4f\x1d\x5e\xa7\x09\xc6\x9c\x5e\x20\x0d\xb6\x2d\x53\x89\x78\x4d\x95\xc3\xe7\x05\x7a\x02\xb0\x86\x86\x34\xa5\x56\xd0\x00\x3a\x12\xc3\xfd\x49\xee\x9b\x8a\x16\x54\x05\x1c\xce\x65\x8c\x15\x16\xd0\xd0\x72\x6d\x36\xd1\xda\xa5\xc9\x43\xfd\x47\x67\xf6\x59\x6c\xba\xef\x7b\x61\x38\xd2\xc8\x7d\x41\x88\x73\xb9\xec\xa5\xd9\x5e\x9a\x7d\xe1\xf3\xb5\x49\x33\x5b\x8f\xf9\xe9\x53\x81\xae\x4c\xc3\xa8\xe9\x52\x7f\x56\x6a\xc5\x7a\x3e\xd6\x88\xb0\xbe\x4d\xfa\x39\x85\x6a\xf2\x03\xf4\x9e\x7d\x6f\xaa\x7c\x0e\x4c\x1e\xd0\x31\xba\x60\x48\xf2\xda\x56\x24\xbd\x57\x72\x60\x34\x5e\x8c\x64\x3b\x96\xc4\xea\xbb\x5c\x12\x97\x31\x6c\xd3\xae\x1b\x22\x8c\xe8\x8b\xcc\x19\xd2\xd2\xca\x74\xea\x91\xc9\xbe\xee\xb8\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\xff\x0c\x3d\x59\xde\xc9\xef\xec\xba\x0f\x9b\xcd\xb9\x44\x62\x71\xe7\x41\x32\xe6\x53\x67\x6b\x5c\x2d\xb5\xdd\x83\xa2\xf6\x52\x59\xfb\xc1\x63\xe0\x64\x33\x68\x6a\x34\x15\xbc\x6d\x5c\x58\xb0\xe3\xfd\xd5\xa6\xf8\xa6\xf0\x21\xae\x27\x23\x08\xe2\x9a\xbc\x83\x7e\x47\xbc\x39\x0f\x9e\x07\xd2\xd9\x9d\x60\x51\x4a\x39\x58\xcb\xbe\x2e\x5a\x16\x91\xf3\x60\x12\x60\xb9\xe8\x28\x22\x09\x7a\x51\x91\x29\x2e\x16\x2f\xfa\xbd\x5a\xc3\x84\x6a\xbd\x96\xfa\xfa\xd5\xd7\xba\xe9\x9d\x2b\x2d\xbb\xa9\x63\x1f\xea\xd5\xc2\xd5\x6d\x50\xc0\x06\x50\x26\xed\xf0\x5d\xce\x85\xdd\x4a\x36\xf7\x7f\x63\xe7\x44\x74\x9a\xee\x9f\xff\xfa\xe7\xa1\x63\x3f\x80\x61\x3e\xc5\xb9\xe9\x91\x6d\x6e\x2f\x5d\xa3\xb7\xdb\xc6\x04\x95\x54\x36\xb0\x33\xc1\x03\xde\xe5\x3c\xf8\xee\xe6\xcb\xbd\x59\xdf\xa4\xdb\x0c\x91\x0d\xa6\xad\x06\x65\xd3\x27\x4f\x9f\xb9\xee\x37\x6d\xcf\x1d\x6f\xf0\x2f\x6d\x57\x51\xd6\x5e\x56\x46\xd9\x0e\x16\xd0\x4e\x22\x94\x58\x0d\x58\x5e\x23\x2f\x57\xbd\x35\x56\x7b\x03\x7a\x75\x27\x41\xfc\xd2\x49\x85\x17\x4e\xa2\xf6\x07\x51\x42\x1a\x0c\x71\x35\xb4\x36\xec\x45\xc7\x4d\xeb\x45\xa0\xd6\x42\xeb\x06\x2e\x59\xf7\x6d\x34\xc6\x75\x79\xbe\x97\x03\x19\x58\x99\xc4\x12\x00\x44\x58\x7e\x0a\x53\x47\x05\xf0\x22\x35\x9f\x03\xbb\xa7\xd6\x29\x26\x8a\x88\x3b\x2c\xca\x0d\xef\xfc\xad\xa6\xd7\xf4\x87\x0f\xbb\xad\x23\x05\x81\x8b\x73\x64\xd8\x4c\xa7\x2d\x16\x25\xe4\x53\x75\x7b\x62\x8f\xa8\x5d\xf7\x6c\x1d\x51\x6b\xb3\xa6\x03\x01\xb0\x79\x84\xd9\x3d\xe7\x58\xeb\x41\xfd\x37\x99\x58\x09\xe4\xb7\x2d\xe1\xb2\x20\x43\x7a\x8f\x9b\xd9\xc8\x45\xbc\x44\x14\xf6\xa4\x77\x4d\xbf\x69\x34\xe3\x55\x09\xca\xea\xb0\x22\x73\x52\xf9\xae\x69\x81\x2b\xe8\xb8\x55\x96\x70\xa9\xe0\x75\x6d\x73\xdf\x6d\x19\x79\x93\x27\xbf\xb1\xb1\x63\xf8\x01\x71\xf5\x6d\x8f\x6b\x01\x6e\x97\x63\xdd\x3d\x02\x3b\x23\x1c\x25\x98\x90\x4e\x29\xb0\xd7\x20\x9f\x20\xa2\xb7\x69\xc4\xf6\xdb\x02\x90\x62\x89\x7d\x71\x1b\xce\xc5\xa5\x2e\xb8\x78\xd7\xa9\xfd\x18\x71\x43\xdb\xa8\xd7\xa2\x95\x64\xa5\x48\x54\xc7\xab\x15\x09\xc4\xbf\xe4\x90\xa4\x0e\x25\xbf\x7d\xc0\xb3\xf0\x65\x0d\xf4\xb5\x0b\x19\xbc\x10\x6b\xe5\xf2\x98\x59\x2c\x71\x34\xbf\x5a\x92\xf3\x2c\x25\xb2\x6e\x9c\x40\x1b\xff\x61\x5a\x54\xbd\xe2\x05\xae\x80\x4b\x38\x76\x8b\xa1\x6c\x41\xd5\xe5\xbe\x04\x24\x0a\x58\x0f\x13\x3e\xab\x38\x2e\x1d\x47\x3a\x71\xe5\x10\xb0\x5a\xb2\xbf\x63\x63\x91\x86\xc4\xc4\xb4\xe4\x72\x3f\x1a\x41\x02\x2e\xab\x5e\xc3\x1c\x2a\x90\xc4\x36\xf6\xae\x0f\x23\xb0\x23\x0b\x39\x06\x6d\x57\x92\x1a\x70\x04\x64\x13\x10\xc7\xbe\x9e\xa5\x96\x95\x54\xa2\x17\x6f\xdd\xa4\xbf\x48\xa9\x72\x1d\xed\xb8\x54\x91\x49\xc5\xb9\xf6\x9c\x99\x07\xbf\xcf\x8c\xff\xe2\x96\xea\x99\x9a\x74\x42\xce\x6d\x09\xcf\x49\xd7\x34\x15\x8d\xdf\x65\x1f\x71\x45\x4b\x2f\x39\xb1\x48\x28\xf3\xea\x97\x0f\x0d\x83\x43\xd2\x08\x32\x5c\x3d\x28\xf1\x90\x03\xeb\xf1\x71\x0e\xcb\xe1\x67\xeb\xe3\x24\x6e\x5c\x84\x3e\x30\x38\x73\x8c\x94\x5a\xdb\xe2\xdd\x52\x10\x36\xe1\xc2\x38\x63\x9e\x7c\xc3\x5a\x82\xed\x6d\x5c\xc3\xa7\x9e\xc8\x25\x64\x7f\x36\x2e\x48\x0b\x3f\x84\x3d\x69\x3c\x98\x7d\xb7\x79\x87\x72\xdd\xbc\x5d\x28\x06\x60\x4b\x9b\xe9\x99\xb3\xf1\x7e\xd8\x00\x7f\xb7\xb5\x59\x94\x4b\x45\x30\x74\x82\x77\xba\xd1\x19\x6d\x8c\x10\xc3\xca\xfe\x79\x8c\x70\x80\x1c\x13\xfd\x42\x5f\x7d\xb2\xe1\xe5\xb7\x31\x78\xc4\x57\x26\x45\x85\xdf\x01\x69\xe5\x9b\x8b\xd7\xfe\x2c\xeb\xb7\x7e\x7f\x1d\x43\xfb\xad\x9f\x3f\x98\xf7\x4a\xa2\xa6\xb4\x44\x63\x5b\x1e\x94\x28\x74\xc8\xc8\x1d\xd2\x67\x40\xda\x14\x20\x4f\xfe\x61\x67\xd3\xb5\xef\x87\x67\x3b\x71\x14\xd1\x8b\x3f\xda\x04\x1c\x22\x1c\xd7\xd4\x98\xda\x62\xe7\xef\xaf\x0e\x1c\x63\xe7\xdd\x50\xdc\x0d\x87\xc3\x61\xcc\xfc\x39\x9f\xf0\xa0\xb7\xf2\xde\xcb\x52\xf3\x92\x4e\x16\x4b\xeb\xaf\xef\x9b\xae\x4b\xa0\x7b\x63\xb6\xb0\xe3\x7f\x46\xba\x60\x6c\x64\x2f\xa0\xb1\xfa\xcb\x9f\xe2\x44\x4d\xc8\xe5\xbf\x0d\xb1\xb3\xa6\x1b\x9e\x31\x62\x4c\x66\x78\x4e\xb5\x09\x30\x31\xe7\x5f\x9f\xac\x87\x56\xdf\x69\x34\xd1\xb2\xc0\xb2\x47\x18\x66\x29\x72\xdf\x70\x09\x27\x0a\x60\x89\x23\x0e\x19\x68\x7d\xea\x58\xe3\x67\x6b\x1a\x28\x9a\x18\xd1\x60\x4f\xe8\xd9\x18\x8f\x49\x8b\x70\xb3\x82\xc6\x58\x77\xc2\x0f\xf9\x70\x69\xc3\x47\x55\x3a\xbc\xb0\xa7\x0a\x5c\x26\x8c\x23\x32\x99\x90\x02\x4a\x12\x91\x66\x46\x6a\x22\x70\xd5\xef\x9a\x6c\x8b\x19\xc2\xf2\x5b\x6d\x81\x0b\x7d\x40\x8d\xb2\x5a\xe3\x8d\xcb\x0d\x20\xcb\xd8\x01\x36\x75\x49\xa3\x20\x9e\x46\xb5\x09\x18\xaf\x5f\xbc\x67\x57\x9c\xab\x77\x54\x82\xa6\x6b\x93\x52\x4c\xbc\xf3\xc5\xf1\x1a\x1f\xbf\xfb\xce\xa3\x5a\x9f\x8f\xa0\x88\x52\x2a\x3a\xb2\xf7\x6d\x1c\x70\x7d\x6d\xe8\xdb\xd0\x47\x20\x2d\x84\xb9\xe1\x94\xa9\x95\xb2\x42\x5a\xaf\x2b\x22\x28\xb7\xf4\xf3\x41\x12\xe9\xe3\x74\x4e\x4f\x8c\x63\xc5\x34\xcf\x3b\xbc\xf0\x79\xa8\x96\x62\x79\xc9\x49\x65\xe2\xa8\xf6\xbb\x31\x57\xb3\x15\x2f\x56\x5c\x4d\xea\x11\x2f\x97\x5e\x34\xe8\xd8\x13\xfb\x6c\x5f\xcb\x0d\x2a\x80\x67\x6b\x93\x92\x94\x84\x6d\x5c\x08\x05\x79\x96\x0e\xac\xd2\xb0\xd8\xbf\xa1\xbb\x14\x4e\xd8\x25\x07\x39\xb4\x8d\x33\x76\x11\x70\x41\xc2\x7c\x87\x27\x0a\xbc\x0c\xfa\xe8\x61\x60\x4e\xe1\x6c\x28\x38\x87\x08\x77\xd4\xb2\x5e\x4c\x6c\xf5\xfe\x15\x35\x6d\xae\x25\xb3\x2b\x91\x0e\x25\x45\x11\xee\x02\xe7\x8a\x23\xc2\x64\x2b\xec\x9e\xd8\x98\x11\x55\x3f\x25\x27\x26\xe4\x67\x87\xf3\xe1\xe2\x35\x7a\x89\x0e\xa1\xe8\x2f\x88\xfd\x09\xa6\x95\x27\x7b\x5a\x2e\x72\x0a\xa5\xea\xf5\x2b\x22\x87\xed\x21\x0b\x13\x5c\x49\x32\xd0\x77\x27\x5c\x8d\x76\xdc\x5a\x07\x71\x2a\x77\x43\x04\x10\x55\xc6\x81\x96\xbf\x06\xb1\x13\x7b\x7c\xc7\x9c\x57\x64\x63\x10\x87\x2f\x96\xb2\xad\x1b\xee\xc3\x93\xdc\x70\x61\x5c\x42\x9f\xdf\xfe\x92\x98\x23\x57\x13\x85\x4b\xac\xb0\xbd\xf9\xdc\x0f\x7e\xb3\x1b\x71\x7f\xff\x7d\xd9\x93\x72\xff\xd9\x02\x5b\xdb\xb6\x25\xd7\x74\xc3\xdb\x92\x33\xeb\x52\x0a\x8b\xd1\x5f\x9f\xc3\xef\x4d\xc5\x54\x40\x1b\x18\xaf\xab\xf3\x70\x19\x2b\x48\x06\x39\xb7\x91\xc4\x61\x60\x74\xcd\xb0\xec\x9b\x5b\x8c\x97\xee\xc6\x2e\x79\x98\x15\xef\x3b\xa6\xf7\x21\xf7\xdd\xf0\xb7\xdf\xd2\xcf\xf2\x58\x51\x50\xc8\xca\x84\x40\xad\x09\x75\xa5\x4f\x96\xa4\x73\xf2\x22\x2a\x41\x37\xf8\x7b\x54\x13\xcc\x24\x12\x04\x66\x1a\xac\xf8\x09\xcc\xb0\x71\x5f\x71\x43\x8f\x3b\xe2\xa5\x1f\xeb\x72\x94\xcf\xa9\x11\x31\x63\x35\x3c\x5b\x06\x4a\x2b\x2b\x7e\x07\xe7\xbb\xc2\x62\xea\x9c\x05\x72\x80\xc6\xad\x32\x7e\x47\x89\x6a\x7a\x0f\x95\x00\x7c\x99\x32\x98\x8d\x96\x05\x1f\x8c\x78\x29\x7d\xce\xbf\x67\xfc\xb1\x46\x33\x0f\x49\x80\xc0\x29\x1e\x33\x79\xbd\xe5\x80\xfc\x0a\x70\x8c\x22\x52\xd1\x29\x54\xa3\x0e\x67\x0b\xbc\x6f\xff\x33\xe4\x0e\x58\xfc\x3f\xc8\x66\x64\xc0\xdf\x47\xcf\x99\xcf\x02\xb7\xab\x23\x5d\x20\x0c\x5b\x96\xcd\x70\xd8\x36\x3c\xeb\x3f\xee\x1d\xae\xc8\x23\x63\x01\x5e\x0d\x97\xa6\x02\xb7\xd6\xec\xd6\x36\x6e\x78\x17\x3e\xb7\x64\x31\xbd\x38\x77\xf3\xed\xe6\x1a\x03\x90\x73\xa8\x04\x21\xe8\x7b\x3a\x16\x44\x8b\x1b\x46\x2a\x68\x92\x5e\x9f\x5d\x5f\x74\xbb\x4a\x7f\xa4\xe7\x2e\xf8\x30\xa2\x0b\x77\x00\x09\xd7\xef\x28\x05\x9d\x13\x81\xf4\x1d\xd2\x42\xf6\xb7\x9b\x64\x27\x11\xc6\x0b\x5f\x25\xc0\x16\x76\x84\xef\x61\x33\x19\x9c\xbe\xf5\x11\xd3\x98\x34\x82\xb3\xeb\x8b\xd7\xa6\x07\x94\x49\x85\xb5\x96\x87\xde\x03\x1f\x65\x38\x39\x18\xbc\x2b\x48\x90\x21\x2c\x7d\x45\x4a\x24\x9c\x24\xa8\x36\x2e\x7b\x81\x56\x0e\x83\xd1\x01\x02\x72\x57\xf0\xc3\xc1\x55\x6a\xa7\x03\x7e\xde\x63\x18\x08\x8a\x31\x44\x1d\xc7\x65\x27\x12\xac\xec\x97\xb4\x36\x58\xea\x7c\x82\xcb\x69\xf3\x3e\x94\x54\x7e\xaa\x13\x20\x07\xaf\x08\x2e\xff\x21\xa8\x22\xef\x59\x41\x02\x99\x12\xe9\xd9\x0b\x85\xbe\xcb\xaf\xe0\xe1\x16\x49\xe5\x7a\xc0\x70\x7d\x1a\x76\x99\x40\x26\x81\x33\xb3\x7f\x9f\x43\x2c\xc1\xf2\xa5\x5a\x6e\x84\x25\x55\x91\x8b\x75\x0a\xa4\xbd\x9a\x42\xbe\x88\x98\x70\x5a\x4f\x64\xf6\x24\xa3\x95\x59\x16\x4f\xd0\xfb\x6a\x8d\x06\x13\x16\x91\x92\xb6\x70\xb6\x01\x86\x4e\x89\x42\x52\xb5\xc5\xad\x1e\x85\xe7\x26\x3d\x73\x64\x59\x00\x73\x7d\x46\x8a\x6b\x94\x6f\xb3\x5f\xda\x75\x5b\xd6\x9f\xdb\x78\x85\xb3\x41\x78\x10\xc3\x5f\x8d\x97\xc6\xfb\x1f\xfa\x40\xf5\x15\xed\xc8\x51\xe7\x19\x2e\x6d\x84\x91\xc0\xac\xe4\xf5\x4a\xff\xf4\xc9\x24\xb8\x98\x45\xf4\xa3\x33\x89\x36\xb5\x0f\x63\x42\x32\x0f\x58\x94\x09\xf6\x61\x4c\x90\x78\xc9\xa2\x7c\xde\xf6\x61\x24\xee\x2c\x11\x04\x46\xe6\xa4\xca\x80\xc2\x01\x86\x2b\x3d\x09\x5e\xd4\xc3\x07\x46\xe0\x2f\x83\x14\x7a\x47\x64\x2b\xd8\x23\xc1\xb3\xe0\xdd\xae\xb8\x81\x45\x62\x3f\x6c\xfd\xe2\x9d\x1d\x75\x26\xc4\xd5\x8d\x05\x90\x75\xa3\x06\x28\xd5\xae\x8e\xba\x8d\xf2\x3e\xa2\xe5\x51\x7f\x90\xa6\x74\x58\x37\x6a\x70\xf4\xed\xe2\xa8\xfb\x45\xcf\xb7\x75\xf7\xda\x5e\xec\x61\xc2\xbd\x67\x0f\x13\x7e\x6c\x98\x70\xc0\xf1\x87\xc1\x8f\xd5\x03\xee\x3e\x57\xb0\x30\x30\xd1\xeb\x59\x24\x86\xa3\xb7\xc1\x6a\x36\x00\xc7\x9d\xa2\x73\xc7\xfd\x8b\x6e\x4d\xd8\xef\xa0\x57\x83\xd7\x1d\xc4\x0e\x47\x6d\xa8\xfe\x32\x61\x8b\xd7\xe1\x89\xcd\x6f\x2e\xdf\xdf\x84\x44\x7f\xd8\x95\x7f\x8b\x2e\xde\xb3\x2b\x37\xe0\xe3\x60\x8e\x97\xd7\xe9\xf1\x20\xc7\x91\x6f\x5a\x8f\x38\x7e\x8a\xf3\xf6\x65\x28\xe4\x65\x0c\x72\xa6\xc6\x97\x01\xc9\xab\x6f\x4f\x5a\xa1\x94\x8b\x3e\x00\x04\x03\x8e\x68\x2b\x86\xf6\xa9\x4f\x38\x06\x4c\x72\x2f\x5a\x03\x95\x21\xa9\x80\x32\x90\x10\x5d\x85\x48\x2c\x65\x26\x15\x2b\xa4\x0a\x8a\x31\x43\x1d\x61\xcd\x8a\xca\x65\x4a\x6e\xd6\x58\x2c\x00\xe2\x04\x08\x04\x8b\xdc\x3b\x0c\x33\xa1\x8f\xc0\x0e\x8e\x11\x24\x33\x82\xae\x57\x66\xdf\x95\x2e\xb6\xee\xbe\xd0\xdb\x18\x47\xd3\xba\xba\xc0\xae\x09\xd0\x72\x4a\xa2\x88\xa8\x6d\x11\x2f\xa2\x6c\xd1\x56\x49\xac\x2f\xdc\xcf\x4f\x1c\x00\x9b\x1b\x77\x32\xc1\xa5\xc3\xef\x1a\xcc\x79\x4d\xea\xb1\x81\x3d\xca\xd5\x92\xeb\x1e\xd4\x51\xe3\x69\x94\x8c\x5f\xf6\xa7\x30\x1e\xf0\x12\xf9\x1d\x26\x88\xfe\xd4\x4c\x2c\x6f\xa7\xb3\xd5\xae\xc5\xa0\x58\x3e\x39\x18\x88\x54\x49\xd5\x23\xbd\x28\x49\x63\xef\x63\x23\xf3\xb2\x2f\xf1\x33\x52\x88\x9f\x98\x85\x37\x95\x7a\x29\x25\xac\x9e\xb1\x1a\x20\xfa\xc4\x16\xd8\x86\x30\x7f\x1d\x84\xe5\x57\xf3\x4d\xa4\x43\xcd\x18\x99\xbe\x82\x9d\xb1\x91\xa6\x02\x57\x05\x14\xb9\x8e\xda\xbf\x6b\x42\xe0\x44\x4c\x89\x0d\x7e\x5f\x2b\x41\x0b\xb5\x1e\x3f\x6c\x7f\x97\x10\xcb\x39\x3c\xad\x9a\x19\x3e\x42\x1f\xa4\x8b\x20\x9b\xe3\xe3\x23\xae\x5f\x24\xf8\x21\xce\x63\x7c\xcd\xf6\x02\x88\x8c\xda\xac\x57\x73\xc0\xe2\xf0\x14\x77\x1d\x36\x1d\xbc\x9f\xd4\xf3\xcb\x3f\x23\xd9\x11\xa7\xfd\x2c\x64\xa1\xaa\xad\xa8\x3c\xd7\xa6\x69\x48\x85\x47\xd8\xeb\x3f\xbe\xb4\x50\xe9\x3a\xd7\xc5\xf3\x7c\xf5\x07\x08\x3e\x01\x30\xa0\x65\xbe\xda\x42\xcc\xc5\x61\x5b\x38\x7c\x08\x92\x71\x84\x6a\x3a\x9d\x29\x8f\xbd\xac\x70\xcb\x8a\xd9\x33\xda\x15\xdb\xe4\x75\x37\x2b\xec\x51\x4a\x18\xdd\x6a\x69\x5f\xa1\x06\x0b\x5c\x6b\xb5\xcb\x9e\x6f\x49\xa2\x22\x17\xcf\x92\xc5\x5d\xff\x29\x88\xe5\x88\xbf\xdd\x19\x06\xf8\x4b\x5f\x65\xcc\x76\x69\x01\xe8\x95\xa8\x65\x44\x39\x58\xcd\x61\x46\xb3\x0c\xed\x23\x04\xd9\x76\x65\x6c\x59\x55\x24\x2b\x49\xb6\x1c\x4e\xfe\x87\xe9\x85\xd3\x39\x0a\xcf\x68\xf2\xf8\x21\x65\xe7\xbf\xb1\x44\x98\xb8\x8f\x97\x5c\x8a\xc4\x86\xcc\x7c\x91\x1d\xf8\x0c\x74\x78\xbb\x88\xf4\xf8\x1b\xa9\x8a\xc3\x65\x6e\x31\x42\x3b\xad\x25\x3e\x13\x04\xaa\x9e\xe2\xea\xba\x21\xc5\x36\x1d\x98\x6f\xde\x5d\x9f\xf6\x7b\x03\xf7\xbc\x2d\x4b\x41\xe0\x7b\x84\x4b\x97\xfa\x79\x47\xc6\x33\xce\x6f\x23\x1b\x3b\x0c\x18\x19\x67\xed\xf8\xb8\xe0\x75\xc0\x72\x3a\x94\x74\x2a\x4f\xac\x60\x18\xea\x69\x3a\x42\x94\x55\x70\x5d\x3b\x7d\x88\x30\xe5\x4c\x96\x84\x01\xa3\xc2\x8f\x18\x36\x94\xa5\xde\xb4\x7a\xd7\xea\x94\x5c\x26\xb1\x5c\x25\x5f\x29\xab\x3b\x26\xb6\xec\xe7\xd2\xae\x79\x60\xa4\x4b\xe5\x3b\xfd\x36\x58\x9e\x35\x13\x00\xdc\xca\x94\xd8\x98\x91\x36\x51\xb7\x79\x7a\x7e\xe8\xba\x11\xfa\xee\xe8\x24\x94\xe7\x81\x5f\xd9\x27\x87\x1d\xe8\xbf\x44\xf6\x4f\x0f\xd2\x4b\xb1\x9c\x56\x95\xd1\x13\x46\xbc\x3c\x90\x61\x30\xb6\x23\x6d\xf3\xd8\x37\x03\x8c\xa7\x73\xd2\xeb\x7f\xac\x22\xa8\x9f\x43\xea\x21\xc4\x0e\x2b\xaa\xb8\xa3\x8a\xab\xe9\xbd\xee\x5b\xd8\x56\xd0\x3f\x53\x00\x93\x0d\xd7\x7f\x1d\x95\x77\x8d\x20\x51\xcf\x7b\x19\x07\x7a\x3d\xc2\xd7\xeb\xfd\x2d\x5a\x62\x8a\xae\xeb\x2f\x2e\x89\xba\xe3\xe2\xd6\xcc\x55\x88\xb3\x52\x1c\x7e\x99\xb2\xc5\xe3\xd2\xac\x50\x98\x6a\x95\xe9\xb4\x47\xef\x72\x48\xbb\xb2\xfd\xd0\xf7\xbf\xd3\x9a\x1e\x3f\x0d\x0b\x2d\xa5\x62\xfd\xff\xec\xbd\x7b\x73\x23\xb7\xb5\x20\xfe\xff\x7e\x0a\x94\xb2\x55\x92\x1c\x92\x33\x63\xe7\xb5\xb3\xf9\x25\x25\x4b\x9a\x44\xeb\x19\x8d\xee\x68\x6c\xd7\xfd\xc5\xd9\x1b\xb0\x1b\x24\x71\xd5\x0d\xb4\x01\xb4\x24\xfa\xe6\x7e\xf7\x2d\x9c\x03\xa0\xd1\x14\x45\x91\xdd\x90\x48\x4d\x84\x54\x65\x2c\xb2\x09\x9c\x06\x0e\xce\xfb\x61\x27\x7e\x82\x74\x2c\xb2\x3c\x25\xeb\xae\x88\x34\x7a\x9c\xa4\x2c\xb2\xed\x0c\x41\xd2\xa3\x86\x2e\x53\xd7\x3c\x63\x47\x59\x06\xa1\xf0\x1b\x2d\xdd\x0f\x5d\x4f\x98\x7d\x65\x6a\x58\x7e\xd9\x82\x01\x83\x7c\xf2\xf0\x2d\xa1\x05\xa7\xd0\x89\x93\xb4\x1f\xb4\xf8\xbd\x79\xe1\x77\x3f\x2d\x44\x14\x2d\xbc\xbe\xbb\x31\xe0\x73\x79\x9a\x0a\xc6\x77\x96\x7f\xda\xc2\x92\x77\x5f\xfe\xae\x2c\xb1\x70\x3a\x3e\x9d\x65\xa1\x6e\xfa\x86\x4b\xaf\x57\x3f\xdf\x50\x7d\xd5\xb4\xeb\x60\xc3\x4a\xe6\x4d\x77\x8e\xe8\x73\xb7\x8d\x43\x8a\x30\x6e\xd6\xb6\xa3\xf3\xd1\x19\xcb\x8b\xec\x4e\x1d\xe9\x77\xff\x76\x72\xfe\xc4\xe5\xc0\x3d\x4b\xb4\xbb\xbf\xaf\x41\xc2\x82\x53\xf3\xba\x67\x14\x80\x42\x75\xf4\xa0\x05\x75\x40\x14\x75\xde\x4a\x8a\x0c\xa1\x60\x14\xcd\xa7\xe4\x20\x2a\xee\xbe\x31\x3b\x3f\x13\xa4\x09\xa8\x46\x91\x60\x80\x38\x82\x89\x6e\x3e\x07\x07\x2a\x3f\xfd\xdb\xc9\xb9\x77\xf5\x05\xe8\x51\x91\x74\x98\xe7\x4c\x7e\x07\x3e\x98\xa1\xfd\x84\x36\xaa\xce\x0c\xa9\x8d\xb6\x9f\x77\x01\xd5\x33\xc6\x35\x80\x55\x6c\xca\xb5\x51\x73\x47\xcf\xe5\x24\x02\xd9\x19\x97\xc3\x23\x57\x6c\x4e\xfe\xfa\xdd\xe9\xbf\xff\xc7\xfb\x8f\xc7\x47\xef\xff\xe3\xc3\xd1\xf1\x5f\xcf\xce\x4f\x7f\xfa\xe9\xf2\xdf\x2f\x3f\x9f\x7e\xf8\xe9\xa7\xe3\x5a\x29\x26\xcc\x31\xf6\xe3\xbd\x64\xe6\xa7\x9f\xdc\x1d\xd3\x3f\xfd\xf4\x39\xab\x78\xf5\xd3\x4f\x17\xde\xcc\x09\x7c\xd4\x6e\x55\x87\xb2\xe0\x50\x7a\xac\xc9\x8e\x04\xf9\x0e\x8f\x1f\xde\xb2\x95\x77\xd9\xa3\x83\x06\x64\xfd\x77\x21\x97\x9b\xcb\x5a\x90\xe4\xe6\xe4\xc2\x73\x6f\xec\x7f\x52\x92\x09\x59\x76\x94\x68\x2e\xa6\x50\xed\x0f\x45\xd4\xe0\x78\x20\x63\x66\x6e\x18\xc3\xbc\xcd\x45\xd1\xaa\x7b\x3d\xb8\x1f\xad\xe8\x6b\x5c\x5b\x5a\x2b\xc0\xb4\x5a\xb3\xb8\x30\x25\x97\x08\x78\xcd\xd9\x0d\x88\xe9\x9a\x4f\x05\x2d\x22\xd7\x20\x74\x2a\xc4\x08\xb0\xe6\xf7\x1b\x42\xc2\xa3\x24\x4e\xec\xf9\xec\xdc\x64\xed\x28\x93\x3b\x11\x26\xad\xce\x18\x54\x5b\xd8\x58\x4e\x2e\xce\x4e\xc8\x9b\x4d\x37\x03\x74\x03\x17\x55\x72\xb9\x0c\x21\x82\x21\xca\x8a\x78\xdd\xda\xc4\xdf\x29\x79\xfc\xd4\x88\x5e\x8f\x73\x59\x52\x2e\xb6\xdb\x64\x62\x52\x17\xc5\x9c\xfc\x5c\xd3\x02\xa5\xd7\x0b\x99\xdf\xe5\x34\x7b\x7f\xf4\x1f\xfd\x69\xf4\xc7\x00\xf8\x9f\x46\x7f\xb4\xd4\x27\xdc\x8c\x3f\x8d\xf4\x75\x36\xfa\x63\x56\xd4\xda\x30\x45\xdc\x43\x1b\x97\x3e\x7d\xa0\x33\x45\xa0\x73\xd4\xad\x00\x90\x52\xd0\x73\x9f\x44\xa2\x43\xa3\x02\xc4\x77\xfe\x45\xd1\x8c\x5d\x30\xc5\x41\x35\x90\x22\x7f\xd2\x0e\x15\x1e\x83\x49\xee\x1a\x9d\x41\xd3\x6d\x84\x23\xec\x99\x60\x2c\x47\x4d\xcd\x81\xcd\xc8\xd4\x42\x0d\xe7\x3e\x02\xa5\x6a\x6c\xa5\x81\x4c\x31\x8a\x55\xdf\x48\xce\x0a\x06\x8d\xec\x3a\x75\x1e\x45\x17\x89\x0f\xd9\x15\x52\x0c\x05\x9b\x62\x08\xad\x0b\x25\xc1\x7a\x8a\xc8\x66\x7f\x61\x4a\x46\xe1\x9a\xda\xc8\x8a\xf0\xb2\x64\x39\xa7\x86\x15\x73\x72\xcd\xe9\x86\xeb\x83\x58\x01\x7d\x30\x90\x38\x1e\x08\x49\x24\xf8\x80\x6b\xc1\x9d\xbb\x66\x56\x1b\x92\xcb\x1b\xb1\xb9\x48\xe1\xba\xb2\x86\x44\x5c\xc1\x8b\x41\xab\x59\x0e\x6c\x2e\xa9\x00\x27\x5a\x5e\x82\x6e\x5a\x07\xea\xfa\xad\x49\x9d\x00\xbf\xec\xd0\xa1\xf3\x85\x2f\x6e\xec\x58\x82\xaa\x05\x94\xe5\x6c\x7a\x7b\x41\xc4\x87\x66\x62\x53\x3b\x3b\x8d\x51\xdf\x6f\xaf\x67\x0e\x98\x83\x87\x4c\x8c\x2d\x04\xab\x4c\xa4\xca\xf8\xb8\x98\x93\x19\x2d\x0c\x73\x15\x33\x69\x7c\x4a\x9b\x6e\xca\x25\x33\xf1\x41\x14\x52\x4c\x63\x59\x97\xdd\x56\x2c\x33\xd0\xbb\x89\x51\x51\x57\x08\x9d\x15\xe3\xe6\xb2\xee\x6c\xff\x88\xed\x1e\xdf\xbc\xf6\x9b\xde\x85\xe6\x74\x89\xa9\xea\x1a\x4d\x65\x64\xc1\x10\x53\xfa\x10\xa7\xa5\xdd\x89\xf6\x75\x3c\xfb\x73\x69\xb6\xd2\xc1\xea\xf6\xd9\x5d\x1c\x40\xb9\xcf\xe1\x95\xc1\x8e\x61\x0c\x85\x1e\x49\x96\xc4\xe2\x37\xd0\x9c\x61\x4e\xac\x54\x64\xd0\x83\xe6\x9a\x8a\x6d\xee\x14\xb3\x17\x4b\xf1\xaa\x60\xe4\x8f\x57\x6c\x3e\x00\x6c\x1f\xa0\x38\xff\x27\x52\x87\x08\x2a\x98\x1f\x62\x24\x2b\x0b\x80\x54\xe4\x8f\xfe\xbf\xfe\xf4\x84\xbd\x61\xfa\xb8\xe1\xf0\xa5\xb6\xd5\xae\xe5\x14\x2b\xd3\xf0\xa8\x98\x1c\x73\x07\xe8\x8a\xd6\x18\x89\xbb\x3c\x22\xa7\xd0\x35\x0d\x15\x48\x2c\x30\x6f\x35\x81\xf8\xe1\x8e\x96\xd5\x1f\xbd\x3b\xd5\xdd\x32\x6f\xb8\x8f\xe2\xf4\xce\xa5\xeb\x13\xc4\x06\xe4\x02\xba\xea\x35\x9f\x00\x29\x3e\x97\xa7\xb7\x2c\xab\xbb\x65\xbf\xf7\x72\x01\x5d\xb1\x0e\xd1\x94\x69\x4e\xef\x3b\x36\xf7\x5c\x11\x8f\xc1\xea\xe7\xa1\x1c\x60\x43\xa2\xa2\xfc\xc1\xd5\xc7\x78\xc5\x36\xef\x17\x89\xe3\xcc\xdb\x35\x00\x22\xd7\x9e\x2b\xdc\x4a\x2f\x15\x9d\xde\x72\x6d\xf4\xff\x46\x7a\x92\xc9\x72\xec\x99\x2a\x82\xe3\x71\x0d\x2b\x31\xb9\xd3\x77\xf5\x54\xba\x82\xd6\xeb\x6c\xfd\x0b\x6c\xeb\x80\x3f\xfa\x0d\x54\xac\x52\x4c\x83\xcf\x99\xda\xad\xd8\xd7\x2e\x41\x4b\x0a\xa8\x8b\xec\x3c\x12\xd8\x85\xb8\xd3\x52\x3e\x97\x07\x17\xc4\x5b\x87\xc7\x05\x47\x70\x6a\x35\xa5\x51\x4b\x14\xc0\x8f\xba\x91\x1d\x9c\xd8\x62\xca\xcf\x35\xbf\xa6\x05\x43\xf3\xeb\x0d\x2f\xf2\x8c\x2a\x0c\x6b\x44\xa2\x4f\xb4\x74\x39\xb0\xd8\x06\xad\x93\x03\x2b\x48\x03\xac\x41\x76\xed\xc2\x99\xa8\x32\x3c\xab\x0b\xaa\x88\xa5\x80\x53\xa9\x3a\xd5\xab\xe9\x85\x66\xcd\x4d\xed\xa4\x4d\xe1\x48\x81\x6f\x9f\x17\x01\x89\x11\xcf\xcc\x82\x28\x2e\x27\x28\x59\x2e\x90\x99\x03\xcc\x3a\x73\xb7\xbd\x13\x04\x72\xe2\x19\x4f\xa0\xe8\x71\x35\x94\x28\x24\x87\x6b\xc2\xa7\x42\x2a\x96\x1f\x46\x02\x48\xa0\x85\x23\xf2\x6d\x68\xde\xd8\xa5\xef\xb7\x95\xb8\xbc\x27\x19\xca\xca\xb8\x77\x73\x84\xca\x61\x53\x43\x7a\x27\x52\xb1\x6b\xa6\xc8\x81\xab\xeb\xc6\xae\x79\x66\x0e\x47\xe4\xff\xb7\x8a\x5e\x57\xe7\x5b\xd0\x20\x1d\x31\x0c\xed\x05\x5c\xf1\x7f\xaa\xc9\x6b\x72\x00\x4b\xc5\xda\xe3\xa1\x0f\x20\xd1\x73\x6d\x58\xd9\x1d\x9f\xb7\x95\x03\xd1\x39\x70\x31\xc5\x25\xf8\xc1\xeb\xb8\xcd\xe1\xa2\xb6\xb5\x80\xed\xa1\x63\xae\xec\xc5\x32\x03\x93\xe4\xda\xd1\xc5\x96\x7b\x35\x44\x6c\x78\x9e\x1a\xee\xc2\x7f\x42\x8c\x00\x51\x6c\x0a\xd4\x0b\x69\xcf\x96\x9b\xdf\x75\x8c\xc3\x34\xb2\x92\x85\x9c\xce\x2f\x2b\xc5\x68\x7e\x2c\x85\x36\x0a\x68\xf4\x53\x9a\x95\x3e\xdf\x07\x84\x9b\x77\xec\x72\x57\xa8\xcb\x08\x93\x13\xac\xcb\x24\xeb\xe9\x0c\x5b\x81\xc2\x0f\x09\xcd\x94\xd4\x3a\xbc\xd3\xa6\x2a\x1b\xd8\xf6\xf4\xc8\xf7\x05\xf5\xf6\xe5\xd0\x67\x14\xd6\x04\x6b\xfb\x0d\x9d\x3b\xaa\x44\xc7\x3c\x6f\x55\x50\xf4\xa0\x6f\x8a\x0e\x47\x96\x3b\xde\xbb\x0f\x56\x26\x38\x3a\x3f\xd9\x34\x94\x61\x7b\x2a\xef\x7d\x47\x1a\xb4\x0d\x57\x24\x34\x9c\x5d\x50\x28\x61\x97\xb1\xc4\xa0\xdd\xd2\x29\xbf\x66\x22\xec\xcc\x33\x69\x3b\x5a\xd2\xdb\xcb\x2b\x76\xd3\xe1\x97\xfe\x45\xbf\x63\x9b\x27\x49\x0c\xc1\x1a\xf6\xbd\xd0\xd4\x70\x3d\xe1\x74\x5c\x3c\x65\xef\x53\x28\x9a\x72\xc9\x0a\x96\x6d\x51\x6c\x7f\x1f\x03\x11\x4a\xef\x19\x49\x26\x5c\x2c\xe0\x58\x37\xd6\xd1\x54\x99\xf3\x9d\xde\xb8\x0e\x25\xf0\xdc\xb2\x90\x2d\x27\x6b\xe1\xfa\xe8\x86\xa0\x40\x8c\x82\xa8\xcb\x31\x53\x9e\x84\x75\x13\x8f\x5c\x51\x49\x92\x49\xa5\x98\xae\x24\x66\xab\x7a\xd4\x71\x84\xac\x3b\x3f\xea\x9c\xc2\xd2\x37\x1f\x04\xb6\xf4\xf4\xd6\xca\xbd\xba\x5b\x4a\x00\x8e\x16\x26\x2d\x4e\x8a\xa1\x40\x3e\xbb\x6b\xe1\xe8\xdc\xa5\x87\xde\xf0\xe8\x34\x88\x3f\xe9\x4a\x86\x9b\xd1\x27\x07\x0a\x47\xe7\x4c\x28\x1c\x69\xa2\x01\x09\x56\x08\xb8\x77\xef\x70\x8f\xc3\x37\x71\xf9\x36\x67\x40\xd7\x03\x54\xa7\x5d\xd9\x56\xd1\x08\x63\xf6\xe1\x1e\x60\x81\x72\xee\xd4\x91\x2b\x36\x87\xe9\x71\xc5\xee\xdd\xeb\x7a\x5e\x0b\x0f\x58\x9f\xfc\x2e\x1c\x43\xfb\x4a\xbd\x7e\xef\xb7\xb9\xf3\x24\x7d\xef\x38\x8e\x8e\xa6\xbb\x66\xb4\xf0\xf8\xaa\xb1\xc6\x21\x4e\xb6\xac\x71\x0d\x5d\x6e\x6c\x71\xbd\xd6\xee\x9d\x1d\x86\xa3\x8f\x89\xab\x19\xe9\x2e\x74\x0c\xd3\x3a\x66\x2f\x0a\x41\x23\x72\xd2\xfb\x7a\xe1\x58\x66\x06\x3b\x13\x03\x72\x2e\x8d\xfd\x27\xb2\x88\x9d\x48\xa6\xcf\xa5\x81\x4f\x76\xe2\x24\x71\x03\x76\xe9\x1c\x9d\xd5\xc2\x92\x61\x81\xec\xc6\x45\xb7\x59\x41\xc1\x9d\xd7\x32\x35\xf8\x4c\x10\xa9\xdc\x96\xf7\x04\x21\x68\xd2\xda\x01\x10\x3b\xe8\x5d\x9f\xef\x7b\x15\x71\x0b\x45\x7c\xcc\x8f\x06\x8c\x03\x04\x6a\x1e\xe3\x37\x50\x8a\xbd\x2a\x20\xe1\x3b\xaf\x61\xc3\xa8\xdd\x39\x6a\xd8\x74\xe3\x14\xc7\xc5\x51\x32\x35\x65\xa4\x02\xb7\x4e\x02\xcc\xed\x23\x48\xe0\xe8\x29\x4e\xc4\xc0\xf4\xbe\x46\x89\xd3\x4b\x1f\x71\x52\x90\x29\x41\xd7\x48\x23\xa3\xf6\xb8\xef\x11\x28\x28\x75\x95\x14\x0c\x24\xff\x15\xbc\xb7\xff\x4d\x2a\xca\x95\x1e\x91\x23\x1f\x61\x18\x7f\xe7\x82\x34\xa2\x69\x7a\x80\x52\xdd\x75\x2c\x50\x41\x98\xab\x69\x21\x27\x77\x84\xf1\x81\xab\xb7\x6f\x19\x76\x30\x2e\xef\x5d\xb1\xf9\x5e\xd7\xea\x4a\x38\x62\x8a\xb2\x77\x26\xf6\x9a\x90\xc2\x16\x15\x08\x32\x29\x14\x38\xdf\x83\xef\xf6\x1e\x4f\xee\xef\x25\x41\x36\x05\x93\x2e\x12\x88\x60\x3d\xaf\x6c\xeb\x4e\x95\xb4\xea\x77\xa5\x1a\xe4\xfb\x8e\xcd\xb7\xe6\x82\xf9\xd0\x82\xc2\xab\x30\xc6\xa9\xea\x8d\x64\xa9\x31\xff\xbe\x00\x1f\xfd\xcc\x99\x05\xe5\x35\x53\x68\x12\xec\xb4\x36\x1a\xc1\x2c\xaf\x09\xa1\xf6\x4d\xb9\x1d\xc0\x47\x58\xd8\xe2\xa1\xb7\x68\x14\x52\x5e\xd5\x95\xc7\x67\x08\xc3\xed\x7a\x63\xb8\xc8\x64\xe9\xec\x22\xf8\x9e\x60\x09\x77\x17\x73\xe8\x22\x9e\x90\xc6\x84\xab\x80\x31\x55\x2d\xab\x4f\x47\xff\x60\xbc\x99\xc1\xc0\xcb\x2c\xdb\x0f\xf6\xc0\x66\x7b\x57\x6e\x55\x27\x00\x7c\xac\x7d\xbc\x0b\xae\x0d\x34\x2d\x83\x63\x7d\x22\xd5\x98\xe7\x39\xd8\x22\x11\xb8\x90\xf0\xb5\x80\x38\x96\xd2\xb4\xec\x50\xdd\x88\xc6\xc2\xac\x4b\xf2\xe0\x17\x8d\x5d\x62\xdf\x74\x09\x4b\xc6\x01\x8b\xb8\xf6\x48\x76\xa2\xf0\x8a\x8b\x5b\xe3\x11\xc1\xee\x7e\xa7\x95\xc6\xcc\xbb\x0f\x2d\x4b\x12\x75\x51\x58\x69\x0f\x04\x31\x34\xcb\xa0\xa7\x0f\x48\xb2\x0b\x4a\x98\x5a\x22\x6d\xda\xc8\xd6\xa9\x51\x84\xeb\x6e\x01\x77\x7b\xcc\x0c\xf5\x7d\x2e\xc4\x42\x35\xa8\xf6\xe6\x9f\x89\x0b\x99\xb7\x2d\xda\x2b\xca\x42\x91\x03\xff\x1f\xe3\x79\xe7\xa4\x17\xd2\x5b\xc6\xeb\x21\xd9\xa5\x64\x0e\xfd\x05\x2e\x67\x4c\xdf\x1e\x5b\x80\xe5\x23\x57\x14\x06\xdf\x4e\x15\xc3\x2a\xc0\x40\x95\x80\x4a\xb9\xb6\x57\xb5\x60\xd7\xcc\x62\x6f\xce\xed\x1e\x8e\xeb\x8e\x35\xd3\x5c\x7c\xd6\x3f\xee\x58\xf5\xff\xbf\x13\x79\x2e\x8d\x77\x53\xfd\x63\xe0\x1c\xe6\x28\xc7\xdd\xf2\xb2\x2e\xb1\x6f\xb5\x31\x56\x87\xe1\x93\x09\x53\x1d\x9b\xf3\x91\x90\x7b\xd2\xb6\x5d\xb7\xbd\x35\x8e\x4a\x18\xaa\xa6\x90\x30\xed\xec\xd0\x5e\xe4\x9a\x16\x72\x4c\x0b\x52\x72\x61\x41\xeb\xb6\x13\x9f\xef\xcc\x13\xde\xd8\xfd\xb9\x02\x38\x90\x41\x5d\x67\x29\x34\x8e\x77\x8b\x90\x50\x2e\x78\x7c\xb2\xb0\x1b\x0b\x93\x03\x7d\x29\x98\xd6\x18\x1e\xfc\x81\x8b\x13\xe7\x5a\xec\xb4\xec\x3b\x4b\x1d\x6f\x69\x59\x15\x6c\x80\xee\xc7\x6f\x86\xbf\x48\xc1\x88\x4b\x7b\x18\x04\x14\x75\x79\x3c\x46\x92\x37\x28\xf0\x56\xa1\x2c\x99\xcf\xaf\xe9\x04\x41\x8b\xee\x06\x67\xab\x26\x5f\xbf\xfa\xfa\xd5\x9b\x6e\x24\xe6\xcc\xa5\x1e\x65\x54\xbb\xee\xb6\x77\x4f\x77\xe3\x24\x1e\x1c\xff\x24\x76\x77\xde\xb8\x7f\xbf\x76\xff\x7e\x43\xfe\xd9\x71\x36\x72\x41\x2e\x5a\xff\xda\x7f\x3a\xce\x36\xb4\xc8\x13\x1d\xd7\x9b\x41\x9b\xb7\x66\x54\x20\xe3\xb3\x7c\xde\xdd\x6f\x90\xf6\xf0\x15\x80\xcf\x64\xb2\x64\xb0\xf5\x5f\xff\xef\x6e\xb2\x26\xce\x0b\x11\xfa\x86\x48\xe1\x66\x7f\x73\x00\xdb\x75\x48\x6e\x20\xee\xa1\xa4\x57\xe8\xb0\x3a\xca\x4c\x4d\x0b\x0b\xf0\xc1\x37\xc3\x37\x87\x44\x8a\xd6\xe3\x9d\x40\xb8\xe6\xd2\xca\x6b\x7e\x27\x0e\xde\x74\xac\xf1\xb0\xb8\x9d\x5f\x2f\xd9\xce\xd6\x4e\xc2\xdb\x52\x31\x87\x57\x48\x4b\x93\x3d\x39\x3e\x12\xf3\x1b\x3a\x0f\x44\xd9\x8b\xeb\x53\x7e\xcd\xc8\x8c\x4f\x67\x50\x0d\xa1\x47\xbf\x54\x82\x71\xdf\x40\x63\xb9\x6f\x69\x89\x80\xcc\x09\xef\x28\xfd\x9d\x99\x7d\x0d\x11\x2d\xe8\xa3\x70\x85\x6e\x42\x9e\x5a\x48\x3e\x79\x03\x64\xe5\xf5\x42\xa1\x8f\x2d\x87\x39\x7d\xf3\xf5\xe6\x32\x45\xa0\xc9\x5b\x13\x2b\x02\x04\xad\x86\x07\x77\xb9\xd9\x22\x73\xe9\x81\xb5\x0f\x70\x2d\x60\x14\x81\x79\x06\x36\x7e\xe5\xb4\xe1\x86\xa3\x35\xbb\xd7\xcd\x2e\x7b\x21\xf3\x10\x20\x42\x9c\x3c\x0d\x81\x75\x9a\xec\xb5\xd9\xc0\x1e\x04\xda\x05\xeb\x8d\xab\xe1\xec\xf4\x3d\x2e\x85\x7d\x0f\x7f\xf9\x7b\xb5\x01\x27\xe4\x48\xe4\x4d\x36\x51\xc7\x5d\x62\x3f\xd7\xb4\x00\xe3\xf5\x14\xe2\x04\x55\x9a\xfd\x8a\xf2\x8e\xee\xf4\xb5\x6d\xa8\x79\xc7\xd7\xc6\x7b\xaf\xeb\x02\x22\x2d\x1f\x7e\xff\xa4\x98\xa0\x9b\x50\x2b\xd0\x3a\x43\xac\x55\x29\xb1\x77\xbd\xf0\xe2\xbf\x8b\xbc\x90\xce\x2e\xd1\xeb\x32\x9c\x4d\x96\xa4\xd3\x35\xb1\x5b\x64\xcc\x66\xf4\xda\x5e\x47\x28\xe3\x14\xdf\x54\x77\xc4\x20\x62\xf5\x89\xf6\x8e\x12\x2c\x1c\x09\xd4\x6d\x94\x79\xdd\xe3\x9a\x37\xef\x26\x0d\xbe\xdf\x8f\x8b\xdc\x2a\xf8\x3f\x5a\x9a\x44\x47\x95\xba\x8b\x80\xfa\xf5\x60\x61\x5f\xdd\xe7\xbf\x7d\x2a\xb9\xf5\xeb\x6e\x72\xeb\xa3\x0b\x97\xf8\x6f\x67\x1d\xa9\xb9\xb8\x4b\xef\xeb\x6f\x0f\x9a\x5d\x3f\x84\x08\xff\x3b\x04\x17\x2a\x63\x35\x41\xce\x1d\x6f\x98\x13\xef\x35\x37\x35\xc5\x02\x5c\x82\xdd\xb8\x94\xea\xe8\x58\x17\x8e\x28\x32\x72\x79\x91\xad\x1b\x5d\x19\xb3\x8c\xd6\xda\x5e\xea\xb2\xb2\xea\x37\xd1\x16\xfd\xbc\xc1\xf0\x9b\x83\x6f\xc8\x90\xbc\x3e\xb4\xb7\x5b\x20\x69\x01\x14\x8c\x05\x6e\x68\x6c\x83\x8a\x9e\x99\x59\x55\xdf\x9e\x73\x47\x2a\xc7\x5d\xf5\xce\x05\xb1\xf7\xf9\x89\x4d\x42\xe6\xec\x68\x32\xe1\x82\x9b\x79\xd7\x72\xf6\x69\xc4\xa7\xf3\x3b\x90\x44\x62\xd4\x4c\xde\x90\x1b\x57\x4b\x00\x70\xd9\x95\xc4\x8b\xc1\x7f\x65\xff\xe8\x65\xb8\x06\x66\x19\x64\x11\xa7\x71\x04\x79\xc0\x51\x1b\x8b\x77\x23\x97\x37\xef\x1a\xf5\x74\x59\x6b\x48\xfe\x2a\x85\x54\x6f\x51\x39\xc4\x5e\xf6\x41\x06\xb9\xf7\xb5\x1c\x7f\xc9\x8a\x3a\x8f\x3a\x60\x34\xd2\x53\x47\xf6\x39\x24\x67\x60\xbf\x7d\xfb\xd0\xca\xc1\xca\x0b\x45\x14\xf2\xc0\xf0\x56\x01\xd4\x3d\xa0\x7f\x69\x92\x3c\xb0\x72\x8e\x8e\xc0\xb6\x63\xd2\x7e\x0b\x9b\x4a\x2a\xc0\x9f\x27\xcf\x3d\xb2\x3b\xf2\x19\xc2\xbb\xb7\x7f\x95\x62\x38\x56\x5e\x24\xec\x7d\x86\x41\xe9\x8b\x17\xa0\xd3\xea\x4f\x71\x69\x10\xf7\x2c\xe3\x91\xb5\x71\xd0\x0f\x08\x2d\x24\x38\x91\x2c\x3b\xb2\x1f\xb1\xdc\x3d\x38\x91\xde\xd7\xb4\xe8\xfb\xe8\x04\xc6\x0c\xaa\x7d\x36\xe9\x2b\x83\xd6\x2d\x48\x71\x05\xfd\x81\xac\x71\xe9\x9e\xf8\x82\x21\x94\xdb\xba\x61\x51\x30\xfd\xf6\xf2\xfa\x02\x08\xde\x60\x7d\xc5\x40\xb2\x80\x83\x43\x5f\xda\x08\xee\x60\xdc\x5c\x9d\x3a\x77\xb3\x13\x96\xb8\xee\x1c\xf8\x69\xc5\x69\x0e\x25\x7b\x33\x5a\xc4\x7a\x87\xd5\x77\x78\xce\x14\x8a\x3b\x63\xd6\xaa\xc2\xd4\x35\xdf\x02\xc7\x8f\xcd\xec\x58\xb1\x09\x4a\x09\xe0\xe2\x7f\xc2\xe2\xb7\x7b\xe3\x3a\xbb\x62\xc6\x07\x66\x28\xa8\x92\x52\xd5\x86\x8c\x69\x41\x45\x66\xef\x22\x48\xb2\xdd\x0c\xf5\x13\x6f\xfa\x37\x12\x01\xc0\xd5\x3a\xbf\x0d\x76\x8c\x08\xf5\x7f\xf0\x15\xa2\xfc\x55\x2e\xb4\xb1\x50\x63\x62\x6b\xbf\xcd\x3b\x2a\xb4\x1c\x58\xaa\xeb\x17\xbd\xe3\xbc\xc0\xe5\xdd\x7f\x63\xfc\x8c\x93\x08\x18\x33\xae\x6c\x5c\x14\xbc\x22\xbb\xf4\x42\x5b\x26\xeb\xb9\x3a\xbd\x6d\x6e\xd1\xed\x25\xd9\x68\x0a\xd1\x7f\x0b\xd7\x63\xaf\x5d\xaf\xd1\x97\x80\xda\x1b\xe0\x29\xda\x5b\xe2\x2a\x79\xe2\xcb\x83\x80\x4e\x4d\xdf\x1d\x17\x39\xd4\x07\x5e\x04\x26\xcc\xda\x86\xca\x2a\x02\x1e\x22\x50\x73\xd3\x43\xb4\xdc\x1c\xfb\xd4\xe4\xf3\x8e\x8d\x7b\x5b\x44\xf4\xae\xf9\xa2\x2d\xa2\x40\x92\x0d\x2d\x7c\x95\x1f\x2b\x52\xf0\x89\xd5\xba\x72\xc9\x30\x2a\x02\xcd\xe3\x1d\x8d\x6f\xcc\xcb\x25\x8d\x89\xa8\x2b\xd7\x6e\x99\x5b\xc8\x81\x8f\x0e\x20\x86\x15\x05\x72\x87\xc6\x22\x66\x35\x61\x23\x1b\x93\x58\x57\xdb\xfe\x90\xb4\x5d\x13\x4b\x17\x8b\x17\xf2\x45\x9b\xc0\x73\x3a\x0f\xad\x65\xbb\xc6\xe0\x8e\x6b\x43\xa6\xfc\xda\x8a\x50\x77\xfc\x1f\xcb\x7c\x19\xe8\x7f\x9a\xb1\xa2\x22\x8a\xe5\x75\xc6\x7a\x44\x02\xea\x8e\x6a\x36\x21\x47\xb1\x41\x10\x6a\x66\x04\x76\xb9\xd7\xc2\xc5\x3d\xd7\x07\xb7\xbf\xa0\xc8\x27\x40\x61\x41\xc5\xe3\x13\xc2\xae\x99\x9a\x93\x4a\x6a\x0d\xb4\x1f\xe4\x05\x2c\x72\x08\xd1\x94\x13\x9f\x58\x03\x46\x15\xd8\x33\x67\x5f\xe8\xb4\xf8\x9e\x33\x4a\xec\x81\x51\x59\xf6\x96\x01\x76\xd7\x6b\xfd\xcd\xab\x37\x5d\xbd\xd6\xa9\xad\x7f\x17\xf0\xbf\xe0\x52\xee\xe5\x5a\x3e\x9b\x2c\xa3\x93\x61\x6f\x5b\x94\x67\x1d\xaf\x73\x57\xd7\x24\xec\x0c\x38\x87\xbf\x39\x8c\x1c\xd6\xdf\xbc\xfa\xfa\xd5\x9b\x03\xbb\xf7\x5f\x1f\xda\x53\x88\xdc\xca\x5f\x47\x6e\xe5\xf0\x4b\xf7\x16\x1d\x4a\x58\x91\x26\x68\xe7\xe0\xcd\xe1\x08\x72\x1a\xa0\x3e\xe9\x8d\x54\xb9\x4b\xf1\xf7\x15\x23\xed\x9b\x87\xf6\x9f\xbc\xf4\xc2\xe7\x00\x88\x56\xa0\x8e\xdd\xcc\x43\xe0\xd0\x00\x37\x3a\x37\xe4\xab\x52\x2a\xf6\x55\xb4\xc4\x73\x15\x0c\xee\x06\x77\x95\xb4\x1a\x5e\x75\x88\xdb\xed\x93\xec\xdc\x37\xd5\xf9\xbe\x10\xb5\x92\x56\x1b\xcc\x73\x2d\x8b\xba\xdc\x34\x0a\xbb\x9f\x40\xf4\xde\xe5\xad\xba\xa5\x5d\x6a\x25\x86\x39\x94\x2e\xe7\x78\x3c\x8f\x4b\xf9\x8e\x59\x21\xc5\x14\x7d\x95\xa1\x61\xe1\x86\xab\xae\x57\x59\x3d\x93\x22\x63\x95\xd1\xaf\xb4\x91\x8a\x4e\xd9\x2b\x07\xe4\x46\x8b\x6d\xaf\x64\xc1\x0f\x00\x6d\x3b\xf3\x0d\x9b\x02\xe1\x7b\x84\x42\xcb\x3e\xff\x1b\xe8\x25\xcd\xa0\xec\x24\xec\xba\x95\x96\xa2\x06\xc3\xa2\xeb\x76\x6f\xa9\x6a\x41\x87\x0e\x82\x7d\xb2\x41\xe9\x8d\x3e\x2d\xa8\x36\x3c\xfb\xb6\x90\xd9\xd5\xa5\x91\xdd\x0c\x7d\x29\x34\x8c\x65\xb0\xb4\x30\x41\x90\xa3\x1f\x2f\xc9\x09\xd7\x57\x44\x31\x2d\x6b\x95\xb9\x56\x65\x0b\x05\x19\x37\xad\x1d\x8b\xc3\x5e\xa6\x82\x19\x57\x72\x9f\x94\x34\x9b\xa1\xea\xef\xa2\x1e\xd8\x6d\x25\x75\xd3\x7c\xbd\x03\x4a\xe1\x88\x3b\x55\x1c\xfd\x78\x79\xf7\x95\xb9\x8e\x9a\x64\xa0\x0d\x11\x53\x69\xc0\x12\xdb\x44\xca\x0f\x8d\x62\xdd\xa4\xb2\xa5\x3b\x6d\x11\x1e\x8c\x52\x8a\xe5\x5c\x61\x21\x55\xf7\xae\x6c\xac\x47\x99\xe6\x23\x7a\xa3\x47\x99\x2c\xc9\xf1\xe5\x19\xc9\x15\xbf\xee\xda\x27\xa9\x1f\x29\xfb\x15\xbd\xd1\x0c\xc1\x1f\x5b\xf0\xed\xd7\x5d\xf6\x61\xcb\xbd\x42\xf1\x6d\xce\x4e\x3a\xfc\xbc\x6f\xfe\xf7\x44\x7f\xb6\xef\xde\x51\x9f\x4b\x95\x35\x87\x50\x78\x8b\xec\x84\x17\x0c\x0b\x76\x21\x26\x3a\xbf\xaf\x23\xfb\x70\xcd\xe7\xb2\x26\x37\x14\x0d\xdb\xc0\x67\xbb\xa7\x6f\x7e\xe6\xd5\x5b\x72\x2a\x74\xad\x58\x93\xa4\xbe\x08\x82\x15\xdc\x7d\x1f\x61\x5f\x5d\x08\x68\x83\xbb\x8e\x62\xda\xa3\xc4\x18\x8e\x53\xd4\xce\xf4\x5b\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x55\xc1\x33\x6e\xac\x3a\x2a\x26\x4c\x35\xa6\x62\xfc\x41\xa2\x2e\x4b\xbb\x72\x27\x49\x8a\x4c\x56\x30\x0a\x03\x7a\x6e\x19\xc3\x03\x20\x1e\xc9\xa3\x0f\xc4\x63\xa2\xf7\xd9\x84\x48\x4c\x3d\x68\x97\x29\xe7\x3a\x4c\x6e\x11\xda\xad\x2e\x3a\xf4\x5b\x6a\x46\x83\xc2\xef\xa4\xf2\x53\xbe\xca\xd9\xf5\x2b\x9d\xd3\x37\x03\x78\x2d\xc4\xcf\xf9\xc2\x1e\x50\x4d\xf6\xde\x6c\xdc\x28\xa0\x19\x97\xbc\xe4\x05\x55\xc5\x7c\x10\xef\x65\x33\xbf\x65\x95\x1e\x10\x30\x26\xbf\xde\x23\x07\x58\x0d\x1c\xc4\xf5\x82\xf9\x76\x7c\xa1\xab\x2f\x64\x40\x75\x6e\x76\xd7\x37\x30\x84\xf4\x0e\x0e\x21\xc0\x98\x68\xfe\x51\x14\x9d\x8b\x7b\xa4\xc2\x7e\x0f\x87\xaf\x1f\xa8\x6a\xe7\xc5\x9e\x48\x94\xdc\x58\xf3\x88\x6f\xc9\xc3\x85\x53\x01\x3e\x58\x1c\xed\x51\xcf\x62\xd7\xc8\x59\xf7\xf6\x83\x24\x48\x0a\xdb\x3e\x50\x0f\x07\x84\xd4\x0b\xfe\x73\xcd\xc8\xd9\x89\x67\xd4\x15\x53\x9a\x6b\xc3\x84\x21\x79\x4b\x42\xe7\x28\xb6\x1f\x1c\x95\xf4\x17\x29\xc8\xe9\xb7\x97\x6e\xa2\xce\xd7\x6c\xf7\x4e\xb7\x23\xb3\xa2\xbf\xd4\x8a\x59\x7d\x66\x6b\x2a\x97\x07\x60\x51\xcf\xb2\x9f\x93\x13\x6a\x28\xaa\x5b\xc8\x31\x64\xd3\xd3\x0b\xd4\xa2\x31\xd4\x73\xf3\xcd\xe3\xd2\x29\x45\x01\xa8\x8d\x34\xa1\xe8\x65\xec\xa1\x74\xdb\x8f\xa5\xea\x8f\xc5\x67\xd4\x7f\xec\x0a\x09\x34\xa0\x2d\x6b\x1e\xf6\x7d\xce\xbb\x5a\xf4\xf1\xe7\xdf\x7f\x3a\xdb\x82\xde\x92\x81\x4e\x3e\xfd\x20\xf3\x34\xca\xcb\x7e\x34\xa1\x17\xd1\xa0\x21\xf0\x31\x7e\x4e\x4a\xbb\x12\x39\x97\x82\x0d\xc8\x27\x46\x73\x62\x99\x95\xfb\xcf\x1f\x15\x37\x6c\xb4\xbf\x2d\x21\xd7\x1f\x62\x92\x8d\xf0\x93\xf9\x4d\x38\x8f\xda\x44\x42\x2f\x57\x20\xe9\x4e\x66\x1d\x17\x72\x4c\x1c\x49\xdd\xe6\xdb\x7f\xff\xe9\x2c\xd9\xcb\x7f\xff\xe9\xcc\xbf\xbb\xfd\x4f\x39\xd9\xcd\xd7\xde\x35\xc5\xfd\xdd\x82\xc6\xdc\x5f\x73\xf9\xe0\x72\x22\xe8\x1d\x6d\xfc\xf1\x55\xf1\xd1\x96\x95\xf0\x04\x25\x9c\x9c\xa2\xf7\x96\x58\xb8\xba\x99\x41\xb9\xe8\x5c\x1e\xb1\x4d\x5c\xed\x4c\x4d\x4f\xa6\x28\xea\x0d\x7a\xfb\xe5\x6f\x49\x59\x17\x06\xba\xdc\xc0\xd5\xb2\x77\x0d\x12\xc8\xfc\x25\x23\xae\xeb\xab\x95\x0e\x30\xd2\x24\x7f\xeb\xab\x27\x85\x5f\x2c\xff\xc1\x07\x2a\xe8\xd4\x3e\x0e\x1c\x9b\x94\xf8\x67\x74\xa7\x0f\xd0\xc1\x2f\xc2\x57\xf4\x9a\xf2\x82\x8e\x79\xc1\x0d\x68\x23\x87\x23\xbf\x97\x58\x6a\x06\x40\xde\x1a\xb1\xdf\x39\x95\x2e\xee\x84\x01\xdd\x13\xc9\x81\xfd\xee\xd5\x8d\x65\x8a\x87\x23\xe0\x90\xf0\xe0\x8c\xa9\x58\xeb\xeb\xbc\xb2\xbd\xf0\x9f\x1e\x49\x5b\xec\xaf\xa1\x45\x17\x0f\x76\xa3\x9b\x26\x60\xa9\xe9\x56\x35\x01\x0b\xc0\x52\x4d\x00\xbe\x70\xbd\x6c\xb7\xa0\x0c\xc0\xf2\x1d\x94\x01\xf8\x5d\x62\x65\xc0\xb2\xa5\x2f\x49\x19\xd0\x2c\x53\xcc\xf4\x50\x07\x80\x34\x76\xfc\x7d\x5f\x85\x60\xe7\xe8\x62\xfe\x42\x17\xe3\xd1\x20\x57\x92\x13\x6a\xa6\xf3\xc2\x7a\x68\x68\x8f\x5f\x2d\x54\xb9\x46\xe2\x75\xe9\xa4\x03\xdf\xe8\x1e\x7e\x6f\x49\x56\x97\xfa\xfe\x38\x7a\x33\xf4\x70\x69\xd2\xec\x8b\x9f\xcd\x6f\x0b\x8a\x3d\xf0\x31\xe9\x7c\xb5\x7b\xbe\x66\xc6\xaa\xd9\x64\x6b\xa5\x1d\xec\xea\xef\x2e\xdb\x81\x24\xc7\xac\x9a\x91\x77\x97\x4b\x18\x18\xd6\xef\xb0\xdb\xa5\x31\xbc\x64\x5f\x93\x82\x4f\x98\xe1\x5d\x3d\x23\x31\x0f\x3b\x46\x58\x5a\x0c\x2c\x14\x66\xf2\x0c\x0b\xb7\x2b\x38\x1e\x85\xf4\xed\x4d\x83\xde\xf3\x0c\x99\x4b\x29\x05\x37\x72\xe3\x5e\xe4\x24\x45\x1f\x03\xb7\xf4\xb6\x59\x83\x87\xc3\x1e\xea\x27\xbf\x9d\xe4\x43\xf4\x29\x25\x99\x2c\x0a\x96\xf9\x5a\x1a\x80\xa6\x3d\x76\x0e\xc7\x12\x13\xb9\x0b\x05\xd6\xa3\xab\x3f\x80\x91\xdc\x99\xc3\x5f\x21\xea\xbd\xfa\x74\x7a\x74\xf2\xe1\x74\x54\xe6\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\x5a\x2a\x75\xeb\x5d\x16\x12\x68\xd3\x8f\x50\xb5\xb8\xa2\x66\x96\x46\xbd\xb6\x33\x59\xf4\x69\x3a\xda\x7f\xaf\xb1\x5e\x00\x54\x64\x73\x71\x88\x4a\x4a\x33\x20\x8a\x42\xf0\x6d\xe8\x94\x3c\xa9\x8b\x02\xf1\xcc\xd2\x9e\x41\xec\x1f\x7e\xf5\xa2\xe4\x7a\x71\xaa\xb5\xb9\x5f\x94\xc6\xbb\x2b\xe4\xa1\xbf\x6c\xd9\x55\x67\x26\x09\x11\xa6\x81\xa4\x8d\x32\x97\xad\xcf\x31\xf6\xc1\xcc\x2c\x02\x5d\xb1\x39\x81\xaa\xf6\x56\x6d\xfd\x5e\x33\xd5\xbe\x82\xcc\x64\xb0\xeb\xaf\x6a\xcd\xd4\x08\xa7\x7f\xe6\x27\xdd\x47\x56\x86\xf7\xff\xc4\x26\xbb\x71\xce\x9f\xd8\x64\xd9\x31\xbb\x8f\xa1\x3b\x73\xc8\xaa\xb2\xa2\x78\x6d\x66\x98\xf9\x8b\xfd\xf3\x51\x4f\x59\x7a\xee\xd8\x07\xe1\x99\x1f\x74\xaf\xfa\xea\x29\x1a\xdb\x88\x1e\x5a\x15\x49\xdc\x04\x24\xf6\xa3\x39\xcc\xe8\xd9\x2d\xe5\x73\xab\x05\x2c\x96\x20\xe3\xd7\xac\x98\x07\x59\x1d\xf3\x66\xf2\x1a\x2b\x22\xd3\xec\xea\x86\xaa\x1c\xfa\x4d\x57\xd4\x70\x67\xe1\xe6\xdd\x05\x4b\x3b\x7c\x8f\x72\x57\x73\xd9\x35\x12\x71\x09\xd8\x1a\xdf\x98\x3b\x65\x06\x13\x42\x85\x2b\x2e\xed\x2a\xa8\x59\x1e\x49\x3b\x07\x5d\x78\x20\x4a\xab\xbb\x65\x4c\x59\x6d\xbf\x98\x93\x1b\x25\xbb\x56\x60\xf3\x63\xc3\xc0\x12\x79\xcd\xd4\x35\x67\x37\xaf\x6e\xa4\xba\xe2\x62\x3a\xb4\x2f\x3b\xc4\x2b\xa0\x5f\x59\x4c\xd4\xaf\x7e\x05\xff\xf4\x80\x2a\x51\x67\x8f\x60\xa1\xde\xdb\x4b\x21\x0e\xf7\x6e\x38\x60\x87\xe5\x6f\xdb\xa6\xea\x16\x06\x7b\x97\x64\x2c\x47\x2b\xcf\xb1\x15\xcd\xa5\xc6\x67\xec\x39\xb6\xe8\x35\xcd\xcb\x8e\x55\x8c\xc9\xce\x90\xeb\xae\xc6\x1d\x2e\xf2\x6e\x47\x97\xc4\xb8\x03\xab\xb7\x8d\x3b\xee\x33\x17\x04\x1a\xd2\x41\xa8\xf7\x4a\x40\xe1\x59\x9f\xe4\xd1\xce\xf1\x48\x60\xe1\xc1\xc5\x37\x73\x51\x38\x88\x13\xfb\x27\x70\x56\xf0\x50\xc8\x8a\x59\x92\x9c\x5d\x8d\xa4\x9a\x3e\x46\xd2\xc6\x22\xbe\x96\x73\xfd\x73\x31\x44\x08\x86\x55\xde\x20\xec\xf3\xb3\x5c\xbd\x64\x67\xac\xcc\xce\x78\xde\x81\x1e\x3b\x9c\x73\xf1\x98\x57\x8a\x7c\x91\x56\x9a\x2f\xca\xe5\xb6\x45\x9c\xe8\x6f\x8b\xd9\x35\x15\xbd\x91\xe8\x2a\x09\xb5\xd9\x5c\xc3\x4c\xd0\xc0\x91\xb3\x78\x5f\x21\x54\x61\xa0\x8a\x96\xcc\x30\xd5\x14\x8c\xcf\xa4\x10\x7d\xfa\xcd\x1a\x49\x3e\x56\x4c\x5c\x02\x13\x7e\x51\xab\x5f\xd4\xea\xd5\xe3\x45\xad\x7e\x51\xab\x53\xa8\xd5\x3b\x97\x30\xe4\xe9\x29\x16\x41\x74\x89\x80\x4d\x45\x07\xa7\xb3\x3c\x3f\x9e\xd9\x55\x7b\x96\x62\xc2\xa7\x1f\x68\xd5\x5b\x81\x0e\x33\x2d\x28\xc3\xe1\x63\x17\xd9\x00\xa5\xa9\x2a\x59\x41\x8b\x3e\x57\x46\x14\xb6\xff\xe9\x35\xb3\xbe\xcc\xc8\x5d\xb8\x64\x49\x20\x3d\xf0\x3b\x02\xa5\x2d\x6f\x94\xf6\x93\x31\x37\x8d\x24\xa1\x99\xc1\x7e\x60\xd8\x73\x95\x48\x41\x32\x57\xe1\x1d\xf4\x9f\xa8\x4f\x5d\x02\x9d\x4a\x10\x99\x19\x5f\x6a\x34\xb4\x0f\x7b\xfd\xfa\xf5\x6b\xec\x1d\xf3\xfb\xdf\xff\x9e\x48\x45\x28\xc9\x59\xc6\xcb\xbb\x0f\xc2\x53\xbf\x7d\xd3\xb1\xbd\x82\x1d\xff\x7e\xf4\xe1\x3d\xd4\x65\xa9\x8c\xc6\x0e\x8d\x08\x91\x9d\xb8\xb5\xa8\x1e\x90\xff\x73\xf9\xf1\xbc\x69\xfd\xd7\xfe\x16\xac\x26\x61\x3b\xbb\xc3\x13\xbb\x6f\x5f\xff\xee\x37\xbf\xe9\x31\x13\x18\x5c\xa4\xe2\xae\x9c\xb1\x2f\x31\x43\x2d\x3f\x56\x0c\x7b\xf2\x80\x00\xe1\x35\x58\x2c\x00\x66\x3a\xb7\x07\x21\x5e\x40\x29\xf9\x74\x66\x5c\x99\x58\x7b\xc5\x0b\x9e\x19\x14\x04\xb0\xb8\x96\x74\xd5\x9a\xe1\xd2\x23\x0c\x41\x7b\xef\x11\xc0\x92\xb3\x01\x29\xf8\x15\x23\x13\xfd\x17\x25\xeb\xaa\x69\xe4\x8b\x3d\x4b\x7c\xed\x23\x04\xa2\xc1\xfd\xce\x7d\x30\x77\x25\x93\xba\x57\x04\x4a\x2a\x22\x03\x40\x2c\x98\x1c\x5c\xe5\xd3\xa6\x31\x6c\x45\x79\x28\x76\x04\x69\x9b\x28\xcb\xb6\x65\xe4\xac\x63\x41\x39\x3b\x8e\x03\x47\xf1\x0d\x1c\x2a\x25\xff\x13\x91\x1c\x4a\xfc\x46\x1c\x1d\x4a\xe3\x5a\x9c\xf3\x85\x71\x9b\xc8\xc4\xce\xeb\x5f\x31\x2c\x7d\x6b\xf5\x35\x26\x42\xab\x45\x78\x7b\xa8\x62\x1b\xed\x8d\xfd\xa2\xe0\xda\x82\x06\x1d\x81\x1c\xc4\x9d\xd7\x5e\xf2\xa6\x61\x35\xb8\xf7\x1a\x6f\x44\x2d\xee\xac\x8a\x9d\x34\x7a\xac\x0c\x2c\x1d\x5e\x90\xfa\x2e\xb8\xcd\xda\x58\x20\xdd\x35\x99\x71\xcf\x7a\x2c\x08\x07\xd6\xbd\x6d\x7f\x74\xa4\x9a\x99\xda\x1d\x3d\x53\x4a\x2a\xfb\xae\x4c\x6b\xd7\x5f\xad\xa4\xea\x8a\xe5\x81\xff\x8d\xc8\x85\xdd\x14\xdf\xdf\xa6\x87\x89\xa7\xa0\x56\x0b\x43\x23\x3e\x9d\xc3\x6b\x3a\x85\x1d\x80\xdb\x1f\x8d\xf6\x91\xf0\x4a\x45\xb4\xa1\xca\x51\x43\xfb\x79\x3f\xca\xb3\xc5\xb8\xb5\x16\xdd\xf8\x40\x2b\x68\x81\x0d\x72\x26\x20\x00\xd8\x30\xe0\x9d\x1d\xf3\xa1\xee\x8c\xba\xf3\x96\x04\x16\x86\xbe\x06\x77\x1c\xc3\xce\x15\xd6\xfd\xef\xed\xc6\xf4\xb9\xe7\xbd\xcd\x24\x40\xa9\xfa\xfc\x7c\x01\x01\xae\xda\x35\xeb\x8d\xf4\xd4\xa8\x9f\x42\x9e\x48\xf9\x2d\x7b\x08\xe1\x38\x52\x9a\x85\x10\x9e\x76\x70\xce\x5a\x92\xb8\x41\xeb\x4f\xd1\xe3\x0e\xe1\xd8\x21\x01\x1c\xc7\xae\x89\xe1\x38\xce\x26\x40\xca\x17\x58\xb6\x63\x35\xb1\x52\xe5\x65\x0d\x7b\x76\x7d\x17\xdd\x9e\x04\x8d\x63\x2b\x72\x34\x8e\x14\xd2\x34\x8e\xfe\x32\x35\x8e\x3e\x61\xd0\x38\xd2\x12\x0e\x1f\x4c\x8d\x87\xe1\xc4\x0e\x94\x2c\x26\x01\x01\xc0\xeb\x09\x36\x15\x4f\x8c\x7b\xd3\x0b\x27\xd4\x20\xc9\xa0\x63\x2d\x8b\xda\xe0\xc2\xa9\xa6\x8e\xe5\x25\x78\x21\x56\x40\x4f\x8a\x5e\x42\xd2\xe2\x22\x91\xec\x05\xd2\x31\x8a\x2b\xfd\x57\xd8\xcd\x18\xfe\x3e\xae\x90\x54\x68\x9b\xd6\x05\xb2\x7d\xf7\xc7\xd6\x5d\x1f\xa9\xdd\x1e\xbb\xe6\xf2\x48\x59\x5c\xa2\xa3\xab\x23\xd8\x47\x53\xdc\x1d\x3f\x59\xa8\x2d\x78\x33\x63\x2e\xc9\x25\x52\x7e\xad\x90\x65\x59\x28\x68\xe4\xbe\xdf\x2a\x36\xf5\xd9\x96\xb7\x3c\xad\xbb\x27\xd3\xbc\xbf\x13\x41\x73\x72\x70\x1c\x6a\x66\xfb\x7c\xd9\x33\x61\x98\x9a\xd0\x8c\x1d\xc6\xce\x05\x56\xcd\x58\xc9\x94\xdd\x78\xf7\x9c\x2f\xc1\x3c\xa3\x22\x2f\x5c\xe9\x73\xbc\x45\x84\xdd\x1a\xa6\xec\x21\x35\xc1\x67\x9d\x84\xc7\x6d\x17\xcc\x02\xc8\xb7\xe1\xeb\x80\x85\xb7\xcd\x6b\x10\x0a\x2f\x1e\x89\x88\xf3\x34\xc7\xea\xfb\xa6\x59\x14\xd0\xb1\x83\xa9\x3b\x05\x3d\x96\x02\xa4\x62\x20\xf7\x73\x59\x2b\x0c\xb8\x0d\x71\x94\x99\x54\xca\xca\xe7\x00\x10\xd5\x44\xb1\x29\xd7\x06\xba\xc3\xf8\xae\x96\xd8\x61\x62\x6b\xf5\x78\x76\x2a\x92\x2f\x84\xec\xad\xa8\x74\xd4\x79\x0d\xa7\xd1\x55\x4a\x5e\xf3\xdc\x2b\x74\x31\x7f\xe6\x9a\x54\x54\x47\xf5\xd3\xa9\xd6\x32\xe3\xe0\x00\x6b\xb0\xa8\xf3\xfa\x68\x09\x05\x75\x31\x67\xc6\x6a\xf7\x82\xb5\x2a\xdf\xc6\x41\x86\x92\xd0\xaa\x2a\x3a\x67\xda\xf4\x46\x0b\x21\x73\x76\x51\x8f\x0b\xae\x67\x97\xbb\x12\x38\xb5\x0c\x26\x4c\x4e\xbe\x93\xd1\x74\x5f\x00\x55\x8f\xa0\x2d\xa1\x39\x68\x5c\x56\x5e\xb2\x0a\x26\x97\x02\x4c\x5d\x54\x6b\xbf\x6a\x4c\x6a\x24\xc8\x9d\x05\x33\xcc\x7f\xd5\x5d\x8e\x6e\xde\xdb\xf5\x9e\xb0\x3a\xb9\xfd\xf4\x7b\x51\xb5\x3e\xcf\x68\x51\xf4\xb0\x7c\xb4\x45\x6c\x2f\xbd\xa0\x09\xc0\xf7\xb1\xc0\x0b\xc3\xed\x5d\xf2\xbb\x0c\x29\x65\xc8\xbd\x46\xd8\x01\xb4\xbb\x88\xbb\xf4\xe0\x74\xd4\xe6\x5f\x0a\x7f\xba\x03\x2b\x90\xfb\x1f\x04\x0c\xc0\xf2\x5d\x78\x8f\x5f\xc2\xd9\x5e\xc2\xd9\x1e\x18\x5b\xd7\xe9\xc8\x4b\x38\xdb\xa6\x63\x17\xc3\xd9\x76\x2e\xe4\xdc\x1b\xae\x91\x3d\xd2\x7c\x08\xd5\x04\x31\xe8\xaa\xc6\x74\x9f\x20\xa5\xf6\x95\x82\x1f\xa8\x3b\xb0\xb5\x90\x6f\x7c\xaf\x23\x63\x14\x1f\xd7\xa6\x3b\x29\x4e\x1b\x6b\xd8\xc0\x03\xea\x29\xd3\x4e\x66\x18\xba\x23\xcb\x22\xe6\xe1\x8c\xfc\x81\xa3\x45\x92\x46\x4f\x55\x69\x14\x74\x17\x50\x5b\xf0\xc3\x7d\x4d\x72\x99\xd5\x25\x13\xa6\xc1\x90\x26\xd7\x05\xfd\x2c\x5b\xe4\xaa\x34\xcf\x39\x0a\x25\x17\x09\xf8\x6b\x2f\x72\x94\xcb\x1b\x61\xf9\xd1\xd1\x45\xa7\x0a\xbf\xed\xea\xbe\xcd\x5c\xb1\x19\xc3\x7f\x4c\xec\xe7\x74\x0c\x3d\xe9\x5d\xcb\xd5\x97\x90\xc9\xa5\x53\xa4\xb9\xa6\xcb\x3c\xb3\x46\x92\x5a\xb3\x95\x21\x91\x8d\x67\x35\xe9\xca\x2f\xd1\x99\xbb\xe1\x16\x7e\x89\xce\xec\xba\xf2\x4b\x74\x66\xb7\xe5\x5b\xf4\xec\x0c\x43\x2c\xad\x38\x57\xb8\xde\x9e\x2d\xfe\xe0\x22\x13\x7a\x1c\xd4\x6e\x45\x95\x9d\x34\x3c\x11\x8d\x1b\x8b\x85\x7f\x17\xec\x30\x48\x0b\x1b\x3f\x78\x94\x34\xe7\x99\x26\x28\x9b\x5f\x42\x04\xda\x0e\x44\x90\xc1\x5e\xf6\xb0\x09\xe2\x68\x57\x8b\x6b\x4a\x0f\x62\x37\x6e\x0c\xd1\x8d\x62\x84\x2b\x99\xbf\xc5\x06\xd4\x54\x08\x89\x22\xaa\x1e\x60\x03\x6f\x3d\x70\xc5\x2f\x40\x49\xad\x68\x86\x56\xb2\x9a\xe7\x40\x53\x9b\x0a\x95\x5d\x6b\xc7\xe1\x48\x82\x05\x24\x11\x26\x10\xc0\x06\xd8\xa2\x8b\x3e\x28\x41\x92\xa1\x85\x1d\xb4\xe2\x3f\x30\xa5\x7b\xf4\xb6\x6b\x46\xbb\xf1\x2e\xce\xea\xb1\x41\x67\x33\x56\x52\xf8\xcf\x77\x7e\x0b\x2c\x81\xb4\x5a\xa7\x61\xd8\xbe\x8e\xa9\x52\x13\x39\x19\xb4\x32\xb0\xf7\xae\xfb\x74\x74\xf3\x23\x91\x31\x83\xf8\xcb\x74\xd1\x3b\xdc\x88\x2c\x6e\xd8\x45\x2b\x38\xc8\x5e\x24\x90\x23\xed\xdd\xf2\xee\xa7\x26\x50\x1b\x98\x08\xee\xf0\x0e\x6d\x4e\x7a\x4b\x0d\x8e\x5d\x8b\x0a\xed\x1a\x0d\x3a\x08\x11\x03\x6d\x91\xbd\x27\x38\x2f\xd1\xa0\xed\xf1\x12\x0d\xfa\x12\x0d\x9a\x34\x1a\x34\x12\x76\x3c\xdf\x5a\x12\xd8\x19\xc7\x31\xf8\xe8\xce\x31\xf3\x7a\xbf\xb3\x38\xf8\xe0\x4c\x1f\x99\x29\x55\x3b\x01\x65\x7f\x34\xda\xc7\x14\x94\xc6\x44\x51\x9b\xc9\xf0\x0f\x84\x89\x4c\xe6\x76\x9e\xcf\x30\xbf\xd2\x06\x44\xf8\xc6\xcf\x13\xc3\x52\xfa\xb5\xe2\x24\x16\x98\x3b\x85\x44\xd5\x9b\x55\xf8\x5e\x8e\xef\xd2\x0b\xa6\xbd\x89\x7b\x23\xce\x86\x8e\x93\x6e\x8b\x33\x1f\xd1\xe4\xe4\x5a\xff\xbd\x26\x05\x2f\x39\xb4\x37\xc9\x81\xc2\x31\x6d\xfa\x39\xba\x08\x39\xc0\x29\x47\x59\x55\x0f\xdc\xf4\xa3\x92\x95\x52\xcd\x07\x61\x09\xfb\x65\x6b\x4d\xf7\xc4\x21\x08\xd1\x59\xad\x14\x13\xa6\x98\xf7\x2b\xf8\xde\x8c\x1d\x94\xa6\xfd\x09\xec\x88\x30\x1d\x10\xa4\x4f\x23\x86\x66\xb4\x69\x50\x13\x4f\x07\xae\xe6\xb0\x8b\xc0\x3b\x5d\x61\xbf\x41\x13\xc5\x68\x3f\x65\xe2\x9a\x5c\x53\xa5\xfb\xdd\x79\x92\x56\x7e\xce\xf9\x35\xd7\xb2\x73\x0c\x5a\x34\x51\xbc\x3d\x97\xc1\x83\x66\x6f\xaa\xac\x4d\x55\x1b\xc7\x4e\xfc\xf5\x65\xb7\x95\xb4\x42\x5a\xb8\xb6\x0b\x8a\xc6\x9b\xae\x0e\xca\x66\x54\xd4\x18\xa6\xc4\x5b\xf2\x7f\x0f\x7e\xfa\xf5\x3f\x87\x87\x7f\x3e\x38\xf8\xdb\xeb\xe1\xff\xfa\xfb\xaf\x0f\x7e\x1a\xc1\x7f\x7c\x75\xf8\xe7\xc3\x7f\xfa\x3f\x7e\x7d\x78\x78\x70\xf0\xb7\xef\x3e\xfc\xe5\xf3\xc5\xe9\xdf\xf9\xe1\x3f\xff\x26\xea\xf2\x0a\xff\xfa\xe7\xc1\xdf\xd8\xe9\xdf\xd7\x9c\xe4\xf0\xf0\xcf\xff\xb3\x37\xe8\x54\xcc\x3f\xf6\xa4\xc3\x38\x86\x09\xe5\x81\xf6\x8c\x49\xd0\x6f\x41\x4b\xe1\xc2\x0c\xa5\x1a\xe2\xd4\x6f\xa1\xa7\x74\xcf\x05\x3c\x7a\xa5\xbe\xff\x8d\x0c\x12\xf8\x52\x50\x10\x77\xe8\x82\x3f\x86\x0e\x98\x38\xe5\x02\x42\x42\x4e\xf8\xd6\xaa\x8d\xfa\xf5\xdb\x25\x56\x0c\x2b\x2b\xa9\xa8\x9a\x93\xdc\xb9\x1c\xe6\x8f\xd0\x46\xa6\x67\xa3\x6b\x00\x3d\xe7\x5d\x6e\xf5\x96\x5d\x96\x25\xcb\x79\x5d\x6e\xdb\x5b\x89\x50\xc4\x07\x7f\x63\x8f\x18\x22\x96\xe4\x24\x44\xc0\xbb\xc7\x9c\xcf\x78\x4c\xb3\x2b\x34\x22\x04\xcc\xe8\xe3\x59\x62\x71\xc9\xe1\xbd\x3d\x17\xea\x5a\x32\x2a\x82\xe7\x14\xc2\xb2\x65\xce\xf6\x75\x78\x16\x41\x4a\xe2\xac\xc4\x90\x2c\x97\xd3\x75\xe0\x16\x38\xb4\xaa\xd0\x07\x90\x5f\xb7\xd6\xc6\xbd\x07\x76\x93\x24\x8d\x09\xf8\x2f\xec\xbd\x95\xf5\xb7\x8d\xa6\x01\x10\x1f\xa3\x6f\x24\x98\x75\x5c\xa3\xab\x09\x29\x64\x16\x25\x6c\xb4\x44\x51\x40\xd4\x53\x4f\xe2\xfa\x46\x2b\x59\x74\xb5\xd0\xa0\x0e\x04\x2e\xb5\x42\x63\xbc\x35\xcf\xe8\xb8\x60\x68\x3a\x02\xbc\xe9\x8d\xa3\x76\xb1\x92\xde\xf2\xb2\x2e\x49\xad\xed\x9b\x49\xd1\x9e\xbb\x79\xb1\x1b\xbc\x9a\x78\x57\x4a\x2e\xe0\x47\x2d\x33\x5b\x77\xe7\xd5\x8c\x91\xcb\x70\x02\x8d\xd1\x17\xc3\x17\x9d\x4d\x47\xd7\xa0\xfa\x3b\xe8\x9c\x02\x2a\x27\x10\x66\x1b\xf4\x10\x4d\xa0\x9e\x43\xe7\xc6\x99\xe4\x2e\xc1\x10\xbc\x68\x53\x0c\xa0\x5f\xb3\xe8\x80\x6a\xe1\xf2\xa1\x9e\xeb\x3d\x7e\x76\x52\x7c\x4f\xd9\x3d\x95\xc4\x9e\x44\x4e\x4f\x2e\x9d\x87\xfc\xb2\xad\x89\x7b\x21\xc1\xad\x25\xef\x39\x7b\xf4\x92\x64\x37\xea\xf3\x8c\x02\x81\xed\x53\x66\xfd\x73\xb0\x7d\x3b\xe1\x31\x9b\x67\xae\x81\x10\x6f\x62\x14\x43\x9c\x1a\xde\x5d\x28\xc4\x33\xb4\xff\xe7\x6d\xe4\x3e\x7c\x69\xcc\x26\x18\xde\x8f\xbf\x01\xfb\xa2\xee\x56\x12\x08\xbd\x04\x05\x33\x50\x79\x88\x89\x30\x29\xe4\x28\x94\xf2\xda\x92\x90\x4e\x33\x7f\xaf\x5d\x80\x1d\xef\x78\x2d\xe8\x61\xab\xa2\xa4\x46\x83\x9f\x60\x2c\xc7\x2a\x49\x45\xb3\x03\xaa\x16\x1d\xdf\x7f\x7c\x48\x26\x8c\x9a\x5a\x61\xec\xba\x90\x0a\x3c\x22\x48\xc4\xd0\x94\xaf\x98\x45\x01\x68\xec\xa4\x64\x49\xb4\xa0\x95\x9e\x49\x03\x66\x63\x5a\xd1\x8c\x9b\xce\xe5\x6d\x8c\xa2\xd9\x95\x9d\x19\xa2\x98\xe0\xcd\xba\xbd\x46\x76\xe8\x72\xf4\x63\x5c\x6d\xd7\x95\x32\x33\x25\xeb\xe9\x0c\x0a\x0f\xe1\x53\x59\x41\x35\x56\xb9\xea\x16\x80\xb8\x74\x4d\x67\xe8\xd4\x24\x9f\x0b\x5a\xf2\xcc\x9f\x1f\x64\x91\x69\x2e\x5d\x80\x09\xc0\xd2\x75\xdb\x28\xb9\x60\x4a\x73\x6d\x98\x30\x18\xeb\x72\x5c\x50\x5e\x92\x03\xcd\x18\x39\xf5\x57\x1d\xbf\xb9\x44\x35\x1d\x9d\x5b\xdd\xd3\x0e\xe2\xe0\x19\xd7\x64\xd4\xd5\x91\xb6\x9f\x78\xa7\x5e\x14\x50\xda\xbd\x05\x84\xbb\x95\x4b\x5f\xf1\xb0\xc7\x65\x5c\xbe\x67\x52\x41\x86\x90\xb3\xcf\x5d\x33\x91\xcb\x26\xb0\xba\xd3\x5a\x47\x17\x67\x3a\x36\x88\x22\x4d\xab\x70\x75\xf8\xc2\x35\x41\x0d\x9d\x0b\x03\x45\xec\xb4\x9e\x15\xb8\x04\xe1\x22\xe7\xd7\x3c\xaf\x69\x81\xa2\x56\xe7\x6d\x3a\xbe\x3c\x43\x20\xf9\x74\x66\x86\x37\x0c\xdc\x89\x28\x6b\x37\x5c\xc4\xbf\x1a\xbf\x93\x32\xcb\x35\x08\x65\x86\x18\xd9\x8d\x20\x31\xe7\xc6\xb6\x9b\x76\x43\xe7\xd0\xcd\xdb\xa5\x3d\xb6\x22\xcd\xdd\x89\xb9\x65\x27\xb2\x9b\xcc\x50\x7a\x29\xcf\x21\x77\xc7\x8d\x3b\x02\x32\x9c\x51\x01\xaa\x2b\x78\xa1\x2d\xfe\x03\x4d\xbd\xbb\x6b\x5d\x29\x4e\x15\x30\xb8\x99\x0a\x05\x5f\x4d\xed\x8d\xeb\x68\x91\xd9\xb2\x55\xe4\xba\xb9\x8d\x9f\x59\x59\x15\xd4\x6c\x3d\xa0\xfb\xc7\xc8\x29\x1f\xc5\x0a\x5a\xd6\x41\x45\x3e\xa4\x85\x25\x19\x17\x3f\x1c\xbb\xd2\x65\x48\xd8\x93\x64\xc6\x7c\xf6\xe2\x87\x70\x1a\x0e\xaa\xb2\x4b\x69\x3a\x74\xd7\x1b\xb3\x1c\xe4\x01\x07\x71\x9f\x54\x4a\x79\x23\x98\xf2\xf7\xea\xe2\x87\xe3\x01\xe1\x23\x36\xf2\x7f\x85\x25\xbc\xb8\x64\xe4\x14\x8b\x53\xf8\x12\x39\xdd\x23\x0c\x65\x3e\xc2\x57\x8f\xfd\xd7\xf1\x9a\xff\xf8\xa3\xdd\x14\xfb\xed\x9f\x86\x7f\x74\x0c\x06\xfe\xfa\x87\x95\xda\x7a\x64\xd3\xfd\x63\x61\xb6\xb8\x1e\x00\x88\x3b\xf6\xaf\x7f\x5c\xc8\xfc\xb2\x62\xd9\x08\xb7\x5f\xff\xa3\x57\xd0\x2b\x21\x4c\x18\x35\x1f\x91\x0b\x09\x19\x32\x3c\x47\x82\x06\xef\xaa\xd8\x7f\xfa\x80\x0c\x40\x83\xe0\xf5\xcd\xa8\x61\x02\xa4\x5f\xd1\xbd\xf7\x39\xf1\x75\x35\x61\x59\x20\xf3\x14\xf6\xf9\x00\x5c\x75\x58\x5e\x7c\x40\x8c\xc4\x46\xdd\x5d\xb9\xad\x1d\x47\x82\xb0\x5b\xae\xa1\x8f\x08\x9e\x24\x20\x09\x75\xa5\x0d\xbc\xca\x61\x81\xb1\x78\x17\xfa\xe2\x54\xb2\x7b\xc4\x2d\xec\xe0\x57\x42\x9a\xaf\xc2\xe5\xf5\x19\x6b\xa0\x5b\x48\x42\xaf\x25\xcf\x49\xad\x41\xe6\x14\xa4\x16\x10\xb2\xd0\xa3\x84\xac\xc3\x9e\xf1\x9c\x94\x5c\x1b\x7a\xc5\x46\xe4\xd2\xaa\x23\x71\x18\x31\xe2\x94\x20\xe3\x42\x66\x57\x2c\x27\xb5\x30\xbc\xe8\x65\x99\x09\x70\xc3\xd6\x46\xaa\x0a\x14\x8d\xad\x33\x2b\xe5\x56\x8a\x0d\xbd\xc2\x84\x4f\xf5\xb0\x18\x23\x43\x0f\xbb\xda\x9c\xd5\x20\x5c\xd5\x19\x45\xd3\x6d\x95\xc3\x92\x2e\xf7\xb5\x27\x31\xba\x93\xa7\x6f\xf7\x53\xc2\xdf\xee\x0f\x40\x32\x3d\x22\xe7\xa0\xb9\x14\xdd\x2f\x25\x26\x4d\xa0\xb5\xdb\x45\xc8\x08\x96\x31\xad\xa9\x9a\x63\x62\x31\x37\x3e\xa7\xbd\xd6\x6c\x52\x17\xa0\x30\x76\xdf\x54\x2a\x6a\x0b\x30\x51\x2c\x93\x42\x1b\x55\x67\x80\x35\x94\x8c\x95\xbc\x62\xa2\x29\xf4\xd1\x83\x99\xc4\x19\xd3\x4d\x52\xa7\x15\xaf\x85\x24\xd9\x8c\x8a\x29\x0b\xa5\x84\x49\x49\x73\xc0\xe4\xef\x82\xf1\xa3\xfb\x66\xca\x80\x17\x74\x62\xac\x58\x68\x00\x41\xc6\x56\x4b\xf0\xd1\x48\xdd\x5f\xec\x53\x48\xf8\x2e\xa3\x80\x26\xc1\x8b\x2d\xa6\x1a\xf6\x8f\x28\x19\x82\xb6\xda\xd5\x60\x98\x20\x82\xa4\x64\x86\xe6\xd4\xd0\x5d\xa9\x21\xf0\x81\xce\x43\x64\x1a\xc6\xec\x03\xea\x46\xb1\xfc\x4e\x4d\xf0\xf6\x21\x59\xf1\xb8\xa0\xf5\xc5\x0f\xc7\xbd\xd6\x07\x83\x10\x60\x2b\x74\xc3\x32\x96\xca\xb8\xd0\x45\xb8\x55\x58\x3a\xc2\x57\x04\xb0\xa0\x79\x48\x90\x8d\xb3\x9c\xe4\x75\x6f\x6f\x76\x23\x22\xf4\x89\x9d\x4a\x12\x39\x65\xf1\x73\x57\x90\xe3\x73\x13\x8c\x9e\xb5\xb3\xd3\x97\x2a\xfa\x18\xb3\xc8\x84\xe1\x8a\x45\x05\xd7\x7b\x81\xe0\xf0\xad\x16\x48\x49\xdb\x98\x87\xa8\x39\x65\x46\x37\x69\x97\x28\x50\xf6\x5c\xd5\x38\x25\x09\xdf\x08\x34\x3f\x8f\x8d\xce\xd7\xb2\x74\x03\x7a\xad\x89\x78\xae\xa5\x13\x1c\xad\xc8\xbd\x75\x64\x4c\x17\x35\x47\x33\xcb\xe7\x3f\xc8\xbc\x7f\xf8\x5d\xda\x38\xd0\x16\x68\x4d\x71\x1b\xac\x01\xa5\xc1\xdd\x89\x0f\x40\x28\xb5\x6e\x15\xb7\x47\x49\x66\x46\xaf\x7b\x17\x80\xee\xec\x0b\x6b\xec\x15\x43\xef\x16\x43\x70\x87\x00\xee\xf0\x4d\x4f\xc0\xfa\x27\x20\xfa\xd1\x33\x11\xb1\x0d\x50\x92\x18\xb1\x47\x28\xf1\xea\x87\x65\xf1\x97\x49\xe2\xc3\x52\x63\x7b\x03\x99\x13\x5b\x5d\xba\x40\x48\x6c\x71\x65\x31\x19\xb7\x4c\xb8\xff\x79\x7d\xd5\x52\x53\x9d\x71\x25\xf8\x37\xb0\xa4\xd4\x81\x77\x78\x8c\x1c\x5a\xfb\xee\x5b\xed\xc7\x0f\x13\x03\x03\x5a\xf9\x72\x1b\x78\xef\x95\xce\x5c\x76\xa4\xb7\x5c\x31\x05\x99\x3a\x51\x69\x4b\x4b\x6a\x94\x2c\x0a\xa6\xe0\x08\x9c\x53\x63\x21\x01\xcc\x9e\x16\xc1\x30\xc0\xee\xfd\x38\xfc\xf0\x6e\xbe\x60\x6a\x13\xec\x26\x68\xd7\x54\x63\xa7\x6b\x1f\x01\x0f\xee\x4b\x9f\xd5\xb7\x0c\x9e\xfe\x24\xef\x47\xef\x0c\x3c\x12\x73\xdc\xfc\x93\x08\x39\xd1\x65\x46\xa6\x16\x54\xae\x09\x13\x74\x5c\x58\x75\x24\x42\xe0\x00\xe7\x82\x74\x6a\x64\xf4\xd4\x27\x36\xe9\xbf\x75\xe0\xc3\x8c\xa7\x5c\x6f\x6d\x14\x6f\x5b\x3f\x1c\x35\xb9\xb0\xce\x36\x93\xa0\x21\xb0\x1f\x0e\xeb\x5a\x4b\xb4\xf3\xa3\x16\xa0\x89\xbb\xcd\x2c\x7d\x83\xbe\x30\x25\xcb\x26\x48\x97\x4f\x00\xfd\x42\x78\x47\xff\x40\x7b\x9a\x5e\x76\x42\x1c\xe9\xd2\x12\x20\xcb\x17\x52\xc2\x52\xc4\x77\xa7\xe6\x3b\x04\xdd\x76\x00\x9f\x37\x01\x4f\xe1\x0f\xaf\x53\x84\x78\xe7\x31\xb3\xd4\xb9\x69\x3e\xd5\xff\x5e\x10\xbc\x1b\xf1\xfa\x4b\x52\x07\x1b\x32\xf7\x1d\x17\x79\x48\xe2\xf4\x45\x61\xad\x80\x76\x74\x71\x86\x50\xa7\x81\xe9\x1d\xf0\x84\xb9\x53\x78\xcd\x8c\xab\x7c\x58\x51\x65\xe6\xe8\xda\x1a\xb4\x20\x0e\xf5\x1c\x13\x2c\x9d\x34\xd2\xde\x5e\xa6\xe4\x28\x07\x47\xe0\xc3\x12\x5d\xdc\xec\xbd\x18\xb2\x6b\x3b\xd2\xb7\x4a\xa4\x1f\xad\x1d\x39\x6f\xda\xa1\x05\x27\xce\x33\xd9\x91\xc7\xca\x18\x27\x6d\x6e\xb6\xbb\xb2\xb6\x65\xb5\xba\x9d\xbb\x84\xa2\x2f\xd8\x2b\x9c\x1b\x52\xc6\x65\xc3\x82\x96\x09\x56\x7e\x3b\xd3\x80\xf0\x89\x15\xda\xa4\x18\x42\xe4\x63\x6f\xf0\x9a\xb0\x27\xa7\xe9\x8e\x5c\x7a\x33\x5a\xe0\x81\x30\x45\x50\x46\x4b\x37\x74\x90\x1c\x08\xd9\xdd\x40\xef\x07\xd0\x56\x5c\xeb\x10\x33\xda\xef\x89\x24\x19\xf7\x6f\x61\x45\x1a\xc9\x33\x36\xdd\x47\xbc\xc0\x8b\xc4\x5c\xe4\xf6\x52\x81\x88\x04\x46\x7d\x5d\x67\x19\x63\xc1\x65\xe8\xc8\x52\x7f\x95\xb6\xc5\x7b\xdc\x96\x97\xd4\x64\x33\xa6\x89\x96\xd0\xeb\x58\x1b\x5a\x14\x2c\x0f\xa1\x4e\x88\x28\x12\xb4\x0a\x17\x06\xd5\x1b\x8e\x48\x59\xe9\xbf\xc5\x91\x63\xc4\x79\x5d\xab\x82\x3a\xa7\xd2\xa4\x16\x19\xe6\x2f\x72\x33\x0f\x51\x26\x8b\x8a\x29\xd8\xa1\x35\xf8\xda\xfa\xab\x3e\x13\x8c\x18\x89\x6c\xca\x01\x99\x81\xf9\xcf\x91\xdd\xcf\xe8\x35\x6b\xa2\x3d\x5c\x97\x48\xcb\xa5\x43\xa9\xdb\x04\xb8\x1e\x95\xca\x1d\xa0\x86\x10\x0b\xec\x62\x3f\x0e\x06\xe7\x22\xb5\x2a\x13\xef\xc3\x41\xb4\xe9\x77\x54\x9c\xc3\xa0\xda\x68\x66\x42\x11\xef\xfe\x12\x2f\x71\xf1\xf3\xb4\x36\xb2\xa4\x86\x67\xe0\xa2\xe3\x93\x28\x48\xac\xc4\xc0\x0b\x4b\x69\x7c\x20\x3c\x8a\x48\x20\xb8\xb9\x73\x4b\x44\x06\x96\x2b\x4b\x8f\xb0\xf1\xd1\x5e\xbb\x53\x6e\x6f\xab\xdf\x96\x48\xf4\x4c\xf4\x9e\x9f\x7d\x45\x64\x62\x66\x8a\x31\xc2\xcb\x4a\x2a\x43\x85\x21\x39\x9f\x84\x1a\xdd\x3e\xc2\x70\x15\x4e\xa4\xb0\x07\xfd\x08\x71\xb5\xd1\x2a\xe8\x30\x2d\x0a\x79\xa3\x89\xb9\x91\xc1\xe5\xd0\xc4\x77\xb9\x9a\xc7\x83\x36\x30\x09\x64\x1c\xb7\xaa\x65\x75\x16\xaf\x22\x3e\x34\xb0\xb4\xe7\x86\x15\x85\xfd\x77\x15\x37\xea\x5d\xc7\x64\xe9\x9e\xf0\xa9\xc0\x32\xb4\x5c\x7b\xe7\x97\xab\xa1\x72\x90\x2b\x59\x55\x2e\xf8\xa1\x3c\x4c\xbf\x27\x10\xbc\xae\xae\x99\x86\x24\x13\x5f\xd7\xc5\xa2\xc2\x94\x09\xa6\xa8\x81\xf0\x3a\xd7\xcf\x15\x44\x92\x45\x20\xfb\x3a\x7d\x70\x24\xb4\x8b\x3c\x80\x74\x18\x7a\xb9\x1c\xc9\xfc\x33\xee\xdb\x04\xef\xc5\x05\xe2\x9b\xa7\x3b\x09\x10\xe8\xe0\x5b\x66\xe8\x21\xf9\x5e\x23\x5a\x04\xce\x1b\xea\xf0\xac\x65\x65\x73\xf5\xd6\xd1\xd0\x96\x00\xa8\xa3\xa2\x9a\x45\x50\xc5\x76\xa9\x50\x42\xae\xbd\xd7\x2d\x78\x8f\x95\xd4\xfa\xdc\xff\xe4\x09\x41\x7f\xb1\x59\x3d\x30\x5e\x6c\x56\x2f\x36\xab\x17\x9b\x15\x8c\x17\x9b\xd5\xe2\xf8\x52\x6c\x56\xa4\x61\x57\xbb\x4a\x9b\xce\x63\xd5\xa5\xcd\x60\x1f\x79\x9f\x09\x39\x97\xc6\x85\x18\x83\x06\x4b\xef\x75\x3a\x51\xe0\xd0\x37\x74\x3e\x12\xcc\xb8\x4e\x26\xde\xbf\xfb\xc9\xc3\xf4\x17\x65\xb5\x11\x67\xfa\x88\xe8\x86\x27\x64\xbe\xbd\x4d\xb4\x8a\x91\x28\x9a\x35\x11\xcf\xf0\xf9\xbe\x76\x71\xad\xf6\x7b\x28\x59\x18\x4f\x90\xb1\x11\xb9\x74\xb9\x2e\x0b\x8b\xdf\x6d\xb2\x90\x33\x43\x79\x9f\xde\x4d\xf1\xf0\xd2\xd0\xe7\x7b\xa4\xb3\xad\x49\x3b\x24\xe5\xb5\x09\x45\x97\x76\xcd\x14\xdb\x14\x71\x8b\xb2\x73\xe3\x9c\xfe\xe6\x81\xc7\x8a\xf0\x39\x9b\x90\x4f\x2c\x93\xd7\x4c\xe1\xe9\x9e\xde\x56\x54\x68\x2e\xc5\x3b\xca\x0b\x7b\xb6\xfe\x8c\x1b\x6f\x37\xa9\x35\x53\xed\x10\xc8\x28\x44\x23\x5c\x70\x87\x48\x16\x7b\xfb\x2b\x28\xa1\xbb\x89\x5d\xcf\x65\xd0\x55\x8a\x5d\x73\x59\x6b\x5f\xf9\xa0\x36\x28\x69\x68\xe3\x2c\x44\x33\x3e\x9d\xf9\x87\x7d\xc6\x2a\x44\x5d\xab\x3c\x5c\xe2\xde\x90\x69\x43\x4d\xad\xdb\xe5\xa7\x33\x08\x3c\xdc\xa1\xe8\xab\x80\x47\xbb\xa3\x84\xa4\x14\xd7\xb1\x02\xc5\xae\x32\xc4\xf7\x58\x1f\x03\xa7\x1e\xbb\xbb\xec\x4b\x7d\x34\x65\x4d\x32\x59\x56\xb5\x61\xd1\x9d\x77\xb7\x2b\x0d\xa9\xdf\x10\x99\x5a\xfd\x9f\x5e\x95\x54\xd0\x29\x1b\x06\xd0\x86\x4d\x95\x8f\x57\xc9\x28\x7d\x12\xb4\x22\xc9\x9b\xff\xc4\xe3\xd9\x55\xe7\x68\x8f\x64\x75\xf6\xc8\xa3\xd4\xda\x23\xe9\xeb\xed\x91\xc7\xaf\xb9\x47\x42\x09\xd4\x5d\x25\x40\x9f\x1c\x7c\x8b\x24\xc8\x09\x19\xab\x48\x50\x4a\x55\xd9\x09\x1b\x0e\x16\xae\x89\x2c\xb9\x31\xcc\xa7\x23\x06\x92\x32\x20\xdc\xb4\xaa\x63\x3a\x02\x0a\x0e\x4e\xcc\x1e\x64\xb7\x55\xc1\x33\x6e\xa2\xf6\x75\x1d\x0b\x48\x2c\x0e\x30\x20\xdc\x70\x8d\xa2\xbc\x20\xbc\xac\x0a\x16\x24\xf0\xa1\xab\x2e\xe4\x9d\x70\xe1\x6d\x32\xc8\x4d\x21\xec\x16\x5c\xb1\x08\xf0\x0b\xdd\xde\x70\xbc\xd0\xed\x7b\xc6\x0b\xdd\x4e\x4e\xb7\xb1\x76\x69\xff\x52\xc0\x2d\x7a\xed\x27\x75\xdd\x97\xe8\x98\x15\xe4\xe7\x9a\xa9\x39\xb1\x0a\x56\x53\x17\x44\x5a\x62\xa7\x79\x8e\xf5\x2b\x7c\x4c\xc7\x0e\x79\x08\x52\x0a\xe7\x10\x33\x72\x7a\x6b\xf5\x5b\xe8\x4a\x91\x9c\x4b\x2e\x2e\xd0\xee\x7d\x85\xa7\x10\x4e\x26\xd6\x4a\x31\x91\x2a\xfe\x04\x54\xcc\xa3\xf3\x93\x94\x06\x8c\x14\x69\x2a\x24\x5d\xaa\x0a\x79\x24\x21\x83\x90\xa3\x15\x7b\x8d\x67\x12\xbe\x01\x3e\x1e\xd2\x9a\x82\x37\x97\x5c\xb1\xf9\xc0\xa5\x7a\x12\x8b\x81\xd4\x3f\x9c\x08\x44\xcc\x9e\x47\xf1\xe7\x8a\x61\x1c\x47\xbf\x5e\xa5\xed\x91\x98\x21\xa6\x74\xd5\xe1\x18\xda\xd7\x4e\x36\x97\x3f\xa2\x34\x3c\x3a\x31\xcf\x27\xf6\x55\x53\x4d\xb5\x70\x67\x2c\xee\x38\xeb\x36\xe2\xbc\xfd\x20\x54\xa3\x0c\x68\x0e\x95\x42\x81\xe0\xa7\x41\x2f\x92\xda\x99\x80\xc3\x1f\xe3\x23\x6d\x56\x32\x02\x43\x22\x58\xdb\xf5\x0c\xaf\xd8\x7c\x5f\xbb\x36\x24\x52\xe8\x19\xaf\x40\x7c\x87\x60\x26\x39\x49\x7a\xc5\x71\xfc\x00\xe9\xb0\x1e\x18\xe4\x1b\x67\x62\x40\xce\xa5\xb1\xff\x9c\x42\x71\x0a\x20\x2f\x27\x92\xe9\x73\x69\xe0\x93\x9d\xc6\x02\xdc\xa4\xe7\x80\x03\x2e\xe6\x88\x43\xc4\x0f\xb0\x57\xac\x5f\x0d\xb5\x0a\xdd\x59\xfb\xac\xa3\x80\x2f\x5c\x93\x33\x41\xa4\x72\x47\x94\x10\x1c\x30\xcd\x23\x48\x08\x8c\xf7\x77\x37\x41\x81\xcb\xa0\x71\x38\x22\x55\x0b\x45\x9e\x04\x30\x07\x14\x78\x7d\xf0\x1b\xf0\x6e\x41\x2c\xac\x2f\x5d\x00\x45\xaf\x14\x35\x6c\x9a\x20\x88\xb7\x19\x25\x53\x53\xe8\x13\x94\xcd\x52\xdf\x86\x54\x82\x16\x8e\x84\xe2\x16\x8e\x47\xb8\xb2\x8f\x9a\x2d\xfc\x24\x0b\x80\xec\xfe\x1e\x4a\x7c\xec\xaa\xf5\x2c\x02\x11\xa5\xd8\x92\x56\x96\xde\xfc\x97\x15\x56\xe1\x7a\xfd\x37\xa9\x28\x57\x7a\x44\x8e\x88\xe6\x62\x5a\xb0\xd6\x77\xce\x59\x1c\x4d\x93\x08\x2c\x88\x65\xb1\xf2\xe1\x35\x2d\x18\xd6\x69\xa2\x82\x30\x34\x57\x41\x7d\xee\x05\xc5\x68\x40\x6e\x66\x52\xa3\xe4\x1b\x52\x0c\xf6\xae\xd8\x7c\x6f\x90\xc4\x15\x46\x62\xfe\x6c\xa7\x3e\x13\x7b\x4d\x23\xb8\x16\x25\x0a\xb2\x3f\x44\x3c\xee\xc1\x77\x7b\x4f\xa3\x8f\x3d\x03\x73\xd5\xb3\x48\x72\x72\xee\xc6\xe3\x82\x62\x88\xc0\xae\x39\xd7\x17\xe1\x5b\x8c\xf8\x81\x4a\xf7\xd1\x33\x4d\x78\x87\xab\x72\xb6\x73\x5e\x5c\xa8\x5b\x9c\xa8\x78\x46\x02\xe4\x42\xb0\x8e\x8c\x51\x7c\x5c\x1b\xa6\x77\x16\x13\xee\x05\x34\x2a\xeb\x16\xfa\xa7\xda\x93\xff\x61\xd9\x0f\xa2\x0a\x78\x5c\xa7\x42\x8e\xb3\xc9\x62\xec\x64\x54\x52\x37\xae\x8b\x20\x95\xab\xb0\x77\x27\x0b\xcf\xfe\x4d\x03\xa8\xae\x86\x7a\xff\x70\xaa\x26\x58\x53\x31\x5d\x49\xcc\x3a\x5b\xba\x31\x4e\x90\x9c\x51\x0d\x51\xf7\x13\x17\x14\x55\xd5\xaa\x92\x50\x0b\x9d\x8a\x3b\x97\x31\x49\xdd\x08\x57\x24\xc4\x17\x61\xc2\x82\x73\xe1\xe6\xda\xfb\x1e\xfa\x5f\x1e\x2d\x74\x7e\xc1\x90\x91\xa8\x8b\x84\x90\xcb\x5f\xae\x37\x9c\x3e\x5d\x09\x6d\x01\xa1\xe6\x3d\x82\x88\xd5\x05\xf7\x31\x88\x36\x0a\xa6\xb1\x9a\xad\x89\x63\xe6\x8d\x6c\xc3\x0f\xa5\x10\xb1\xe5\x45\xef\x16\xaa\x04\xf1\xb0\x16\x4d\xd8\xae\xe7\xd9\xcb\x53\x4c\xa0\xcf\xc6\x58\xd6\xc2\xa1\xac\xef\xd0\xf1\xb8\x1b\x68\x77\xc4\xd7\x9f\x0c\x60\xb9\x8b\x10\x95\x2d\xe1\x13\xbb\x2f\xae\x3a\x64\x8a\x7d\x69\x45\x54\x43\xc4\x9e\xc2\x43\x1a\xcf\x97\x53\x16\x92\x4b\x86\x27\x0a\x50\x0c\xf0\x1c\x97\x6f\xa5\x7b\xb9\xfe\xcc\x0e\xb3\xb6\x28\xb9\x60\x78\x53\xb5\xa1\x86\x41\xba\x90\x62\x93\x02\x6b\xd2\xb9\xdd\x2b\x65\xce\x27\x2e\xeb\xe2\x32\x8a\x5e\x1a\x60\x81\x52\x57\x47\x34\x6e\x42\xda\x1b\xbc\x54\xc7\xd1\xab\x37\xcb\xb0\xa1\x92\x43\x60\xa5\x2c\x81\x13\x74\xad\x24\x97\xe5\xfc\xe4\xfe\xe8\x49\x72\x20\x27\x13\x7b\x5c\xbe\x3f\x55\x1a\xd7\x50\x32\x9e\xff\xa1\x77\x4f\xf4\xc7\x62\xf2\xd0\x5a\xdb\xb7\x11\x69\xb5\x37\x6b\xf2\xca\x1f\x49\xce\xfb\x01\x58\x8a\x9c\x90\x77\xbc\x60\x7a\xae\x0d\x26\x8c\xf2\x12\xe9\x3e\xa6\xd4\x4a\x43\xb8\xc8\x8a\xda\x05\x20\x22\x17\xb0\x74\x77\xc7\x4e\x38\xb9\x18\xd7\x4c\xeb\xe5\x70\x9f\xc9\x7e\xa7\xd4\xef\x22\xa5\x84\x34\xe7\x70\xbd\x92\x9c\x56\xaf\xdd\x9a\x74\x2a\x85\xd9\xda\x8d\x49\xd6\xb6\x5f\xbf\xe3\x63\xc5\xc8\xf1\x8c\x0a\xc1\x8a\xa8\xc7\xa6\x0b\x77\xa1\xc6\xd0\x6c\x86\x5c\x87\x12\x4b\xf1\x0a\x66\xa5\x86\x99\xd4\x86\x94\x34\x9b\x71\x11\x9a\x73\x89\xd0\x6b\xb6\xa9\x9c\xfc\x0c\x9b\x03\x4c\xf4\x67\x0b\x40\xc7\x73\x4e\x45\x5c\x10\x0a\x8f\xb1\x93\xe6\x62\x03\x55\x31\x92\x40\xe8\x54\x82\xc6\x84\x77\xe6\x0e\x7d\xb3\x3d\x95\x82\xb3\x46\xeb\x0a\xf0\x77\x78\xb6\xfb\xca\xa7\xb7\x23\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x21\xb8\x8a\x8b\x48\xdc\x61\xee\x07\x56\xc4\x8a\x84\xc5\x7e\xa5\x97\x7b\x50\xac\xa2\x16\x49\xf0\x63\xbf\xa8\x85\x3d\xe2\x8f\xae\x7d\xf5\x5b\xf2\xee\x98\x18\xaa\xa6\xcc\xd8\x35\x88\xa8\xcb\x31\x53\x5d\xdb\xdc\xa6\x08\xb6\xc1\x2e\x25\x30\xcb\x37\x5f\x77\x9a\x43\x31\x9a\x7f\x14\x45\x67\x7f\x68\xaa\x0b\xe5\xe1\x68\xef\xf7\x49\x14\xec\x37\xa1\x85\x66\xe4\xc0\x3e\xf8\xea\x46\x71\xc3\x0e\x47\xe4\x93\xff\x15\x94\x0c\x00\x99\x79\x22\xfb\xc8\xa5\x98\x69\xe3\x26\xd5\xcc\x60\x9d\x67\xe1\x04\xb5\x0f\xf6\x52\x77\x96\x56\xf1\xc0\xc7\x52\x16\xac\x63\x19\x7c\xc4\xbd\x1f\x7f\x3c\xef\x6c\x4e\x6c\xe3\x77\x33\xdf\x7d\x68\x7e\x23\x55\x91\xdf\xf0\xdc\x25\x6b\x91\x03\xfb\xf0\x61\x3f\x94\xef\xe3\x8e\xe9\xe9\x7c\x49\xdd\x0a\x30\x8d\xdf\xe3\xe6\x86\xe7\x69\x4e\xb4\xc7\x05\x04\x20\xda\x38\xe0\x8d\x49\x16\x07\x08\x20\x01\xcf\x99\x30\x96\xb8\x2b\x4d\x0e\xe0\x17\xdd\x6b\x8f\x9e\x72\xec\x15\x03\xeb\x4a\x45\x32\x59\x8e\xb9\x68\x5a\x39\x35\xb8\x69\x05\x18\x4b\x6f\xbd\x97\x52\x33\x83\xfd\x17\xa0\x12\xa4\x34\x33\xa2\x79\x59\x17\x86\x0a\x26\x6b\x5d\x74\x2e\x41\xf2\x82\x9e\x77\xc6\xa4\x60\xb7\x48\xfb\xb6\xd5\xa8\xb2\x81\xa0\x2d\x19\x43\x75\x8f\xa6\x9b\xde\xa2\x68\xdc\x69\xad\xa6\xa4\x54\xfe\x2a\x88\xd6\xa1\x37\x0c\xbb\x65\x99\xab\x3c\x5b\x15\xf5\x94\x77\xac\xbe\x7f\x62\xdf\x22\xa3\x86\xe5\x6f\xc9\xbb\xe6\xe5\xa0\xae\x99\xff\x66\x44\x8e\x7d\x1c\xa8\x5b\x9e\x1c\x5f\x9e\x9d\xb8\x86\x6a\x42\x1b\x46\xb7\x21\xbb\xf7\x0b\x3a\x1b\x3a\xf3\xf5\x16\x94\x06\x5c\x38\x09\x89\x6d\xba\xda\x2d\xfa\x8c\xdc\x37\xae\x5b\x79\xe8\x3a\xdd\xaf\x01\x58\x6f\x92\xf0\xa2\x2f\x6d\x4d\x5f\x8a\x9b\x54\x47\x60\xe5\xac\x62\xc2\xf2\x3c\x11\xdf\x7f\xdc\xe7\xad\xa1\x89\x84\x33\x4e\x24\x57\xba\xc9\xda\x42\x65\x64\x03\x9d\xc9\x22\xd7\x84\xdd\x1a\x45\x2d\xdb\x2f\x2d\x83\x0f\xbf\x99\x10\x2a\xe6\xa3\x7e\x22\x66\x2f\x57\x7e\x5a\xf7\x7d\xef\x93\xd9\x6d\x0d\x2d\x7f\xd1\xd0\xe2\xa1\x59\xa6\x98\xe9\x51\x7a\x2e\xd5\x69\x05\x40\xda\xc7\xd5\xfa\xf8\x8e\x81\x15\xbf\xf5\x85\x2d\x5c\x28\x4e\x1f\xbb\xb1\x66\x42\x73\xc3\xaf\x5b\x1d\x55\xa1\x74\x2c\xd5\x3a\xd8\x21\x41\x98\x72\x04\x50\xb7\xaa\xba\x76\x5e\x18\x7d\xa2\x7c\x42\x84\x5c\x78\xab\xb8\xdc\x47\x08\xbf\x6c\x3d\xd2\x79\xd1\x10\xbb\x54\x62\x33\x72\x2a\xa0\x48\x24\x4e\x3e\x80\xfa\x74\xf8\xdf\x18\xbe\x64\xf7\x20\xb2\xc6\xc2\x2e\x74\xdf\x69\xb7\x7b\xdb\x23\x9b\x29\xc2\xf4\xfb\x56\xf5\x49\xe9\x3b\x3a\x8f\x44\x3b\x5f\xd0\xa5\x9f\x7b\xa1\xdd\x7d\x8f\x4d\x26\x2c\xb3\x77\x03\x3a\xfe\xf9\xf6\x75\x56\xad\xcd\x6b\x74\xfb\xf9\x22\xae\xed\x22\xac\x7d\xcb\x15\x46\xd1\x04\x4d\xc4\xef\x99\xd0\x86\x42\x5d\x4d\x78\x63\x2b\xa7\x59\xe1\xc9\xf5\x6c\x74\xd7\x09\x63\x23\x7c\x75\xce\x9e\x40\x94\x56\x0c\xcb\x98\xb2\x37\xa6\x98\x93\x1b\x25\xfb\x26\xba\x6d\xe8\x03\x96\xd7\x4c\x5d\x73\x76\xf3\xca\x55\xf9\x19\xda\x97\x1d\xba\xc2\x89\xaf\xc0\xdc\xf5\xea\x57\xf0\x4f\x0f\xa8\x12\x79\xdf\x1c\x97\x7d\x4b\xf6\xf6\x52\xd8\x05\x7a\x87\xfb\x4d\xa0\x71\x69\x27\x85\x2a\x8d\x4d\x00\x96\x5f\x70\x95\xb9\x0f\x9d\x41\x60\x1d\xd7\x98\xe3\x35\x91\x40\x6e\x2f\xbb\x9f\xc8\xc5\x8e\x10\x6d\xf1\xa4\x29\x4c\x55\x0b\xd1\x39\x27\xb3\xad\xfb\xe3\x32\x2d\xc5\x3f\x04\xd8\x70\x31\x34\x8a\xb1\xf0\xaa\xc6\xa9\x4f\x42\xfa\x66\xf1\x41\xb1\x79\x86\x4e\xbc\x9c\x1a\xaa\x99\xe9\xe3\x4c\x4e\x45\xea\x23\x50\xec\xfe\xc6\x54\xdf\x7d\x05\x31\x6a\x0c\xaa\x7b\xfb\x7e\x98\x64\xf8\x27\xa7\xfa\x8b\xd6\x93\x56\xe9\x77\xe7\xda\x9d\x93\x63\x15\x27\xe8\x70\x83\x36\x20\x5c\xbb\x41\x92\x6d\xe9\x88\xee\x2d\xbf\xff\xfe\xec\x24\x8d\x29\xa5\x99\xcf\x5b\x06\xe0\xbf\xdb\xdb\xef\x2e\x29\xc4\x96\xf1\x9f\xeb\xd8\x08\x6d\x9f\x6c\x2e\xbe\x7b\x7e\x1b\xbb\x33\xcd\x58\x13\x9c\x70\xc2\xf5\xd5\xb6\x28\xe3\x1d\x40\xda\x34\xf2\x2f\xc7\xa7\xc4\x7d\xba\x2a\x92\xa0\xd3\xd2\x4f\x13\x7d\xd0\xa6\xa1\x7f\x39\x3e\x5d\x78\xdd\x05\x33\xea\x51\x51\x78\x5b\x8f\x14\x3a\x14\x42\x75\xd4\x35\xd1\x16\x03\x6d\xb6\x12\xbd\x62\x39\x57\x18\x52\xe7\xdf\x32\x1f\x65\x9a\x87\x46\x71\xd3\x2b\x36\xe2\x32\x0a\xe5\xed\xb6\x05\xbd\xa2\xdd\xf4\xaf\xa6\x19\x6b\x02\x25\x73\xae\xaf\x9e\x9f\x25\xb9\xca\xcf\xbb\x15\x06\xfe\xd2\xc2\x4f\x16\xcd\x9d\x8e\x76\x3a\x21\x08\x6e\xf7\x5c\xd6\xe4\xc6\xf5\x6b\xef\x69\x66\xfd\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\x26\xab\x79\x11\x04\xab\x61\x3f\xba\xd1\x95\x96\x55\xc1\xf4\xdb\x2d\x87\xaa\xec\xc4\x55\x24\x29\x78\x7b\x45\x95\x01\xab\xe7\xb6\x51\x3b\x00\xe2\x45\x82\xe8\x03\xf1\x98\xb8\x7d\x36\xf1\x75\xa7\xda\xc1\xeb\x5c\x87\xc9\x9b\xc8\x6e\x90\xfe\x52\xe0\xef\x3b\x19\x34\x96\x57\x39\xbb\x7e\xa5\x73\xfa\x66\x00\xaf\xe5\xeb\x66\xb6\xf7\x80\x6a\xb2\xf7\x66\xaf\xfb\xca\x97\xbc\xe4\x05\x55\x05\xf6\x91\x09\x0d\x7a\xc2\xfc\x96\x43\x7a\x40\x20\x55\xef\xf5\x1e\x39\x90\x0a\x20\xca\xa8\x20\x05\xf3\x3d\x67\x1c\x25\x9d\xa3\x71\xa0\x47\x24\xf2\x4e\x5d\xa1\x6d\xc7\x63\x21\x63\xdb\xfa\x25\xcc\xbd\x3e\xe4\x64\xee\xd8\xcf\x79\x71\xd2\x88\x8f\x5c\x58\x19\x6c\x44\xbe\x77\x92\x9d\x93\xcd\x11\x6b\x73\x10\xc8\xf0\x89\x2f\x03\x3b\xbe\x24\x37\xce\x82\x43\xe6\x51\x1d\x2b\xe4\x6e\x24\xdf\x17\x82\x11\x5d\x9d\x45\x53\x6e\x3e\xb1\x4a\x6e\x4d\x4f\xc4\xe5\x17\x42\x6a\xb8\xb1\x1f\x48\xcd\x8d\x54\x73\x42\x0d\xa1\xc8\x19\xb2\xba\xa0\x8a\x28\x86\xc1\x31\x09\xd4\x36\xb7\xfa\x82\xb2\xf6\x59\x36\x11\x38\x71\xdd\x47\x67\x86\x0e\xf0\x0d\x1c\x37\xee\xe8\xa3\x3b\xb5\xfc\xea\x84\x2b\x4b\xa5\x21\x33\xfe\x4c\x70\x73\x1c\x16\xc3\x12\x54\x85\x14\x2e\x47\xc7\xae\xe8\xa2\x70\xa6\xdc\xb8\xb6\xc4\x08\x80\xfd\xda\xcf\xd6\x09\x14\x80\x00\x68\xaa\xcc\xf7\x75\xf3\xc6\xcf\x30\xb6\xa7\x41\x9c\x6d\xd8\x13\x41\xed\x96\x6a\xeb\xd4\x35\x00\x12\x1a\x6b\x60\x1c\x6d\xf3\x79\x3f\xc1\x11\xe2\x5c\x84\x0c\xce\x59\x22\x15\xd1\x86\x2a\x83\x77\x64\x7f\x34\xda\x1f\x81\x28\xbb\x3f\xda\xf7\x8a\x58\x11\x52\x88\x9d\xb4\xd7\x00\xe3\x53\x28\xfb\x14\x79\x68\x53\x8d\x11\x21\x1f\x7d\xa5\x54\x68\x01\xba\x90\xc5\x1c\x12\x94\x8b\x22\xbc\x03\x34\xaa\x69\xd3\x9e\x1e\x9e\x50\xf0\xe7\xd6\xe3\xf8\x25\x5d\x32\xf4\x94\x5f\xbb\x0e\x7a\x5b\x0b\xb3\x69\x5e\x31\x09\xa6\xc6\x3b\xe6\x0c\xa8\x9f\xde\x6f\xef\xdd\x90\x74\x27\x7a\x33\xc7\x07\xdc\x7b\x65\xb2\x2c\xb9\x21\x33\xaa\x67\xc1\x8a\xd7\xa4\x25\xf7\x63\x4d\x7d\x8d\xbf\x45\xad\x0d\x53\x93\x4e\xb4\x2b\x09\x33\xf7\x00\x2c\x18\x7b\xc3\xc7\xae\x8e\xb3\x68\x4c\x31\xc0\xe4\xf4\x8c\x2a\x66\x9f\xac\x80\xfb\x14\x7c\xc2\x0c\xef\x7a\x39\x5a\xfc\x3d\xac\xbc\xda\xb9\xd5\x00\x9e\xd8\xbd\xb5\x54\x48\x64\x4e\xe9\xf6\xed\x5c\x9c\x40\xf8\x2a\x40\xf1\xea\xd3\xe9\xd1\xc9\x87\xd3\x51\xd9\xc5\xc3\xb2\x65\xf6\xcb\x44\x5e\x49\xde\xb5\xa3\xc6\x90\x54\xd4\x74\xe9\x5b\xdb\x97\x71\x07\xb0\xb7\xcd\xb8\x03\x20\x9e\xe0\xf8\x0f\x50\xf5\x85\xfb\xe2\x3a\xec\x44\xe8\x6d\x64\x25\x0b\x39\xed\xd1\xf4\xb4\x1f\x9e\xfe\x0a\xeb\x58\x0c\xe9\xb0\x92\x5b\x73\x0b\x5a\xd4\xd9\xf6\xf1\x59\x18\xfc\xc9\x35\xc7\x13\xac\x5b\xa6\x47\x4d\xb9\x2f\xe0\x84\x9e\x85\xed\xe1\xce\xb1\xa1\xbd\x1e\x78\x17\xcb\x51\x8a\xb3\x13\x0c\xa1\x32\x58\xc5\x54\xc9\xb1\x7a\xd9\xae\x1a\x25\xb6\x82\x25\x5d\xed\x11\x56\x2a\xb8\xe8\x78\x91\x53\xa0\x87\x5f\xbf\x2d\xc2\x54\x8a\x0d\xa1\x44\x88\xd5\xbe\x27\xbc\x80\x72\x47\x8d\x64\x1f\x49\x34\x9d\x16\xf5\x3e\x6a\xef\x04\xc7\x99\x8b\xf9\xa2\xaf\xba\xd1\xcb\x43\x2c\x02\x36\x17\x2e\x8a\x6e\x99\x62\x50\x31\xca\x8a\xb1\xce\x6f\x46\xa7\xf0\xc2\x52\xb9\x3e\x95\x95\xe2\xd7\xbc\x60\x53\x0b\xc2\x8c\x8b\xa9\x6e\xfa\x5c\xb9\xf0\xbd\x4e\xcb\x42\x25\x2b\xd6\x48\x81\x21\x0c\xea\x03\x04\xe3\x85\x16\x10\x78\x35\xcf\x3f\x7e\x26\x82\x21\x08\x1d\x2f\x59\x4f\x53\x9d\x05\xb2\xa3\x60\xb2\x6d\xff\xf4\x76\xc4\xa9\x9d\x61\xc5\x3e\x84\x67\xd9\x55\xed\xe5\xa2\x43\x6f\x18\x32\x7b\x4a\xf4\xbc\x2c\xb8\xb8\x82\xc6\x30\x8e\x9d\xb8\x26\x8b\x8c\xd8\x2f\xfc\x05\x56\x8c\x16\xe9\xc5\x80\x27\x42\x65\x92\x42\x04\x30\x3b\x10\xb5\x00\x4a\x9e\xa5\x7a\x7f\xf5\xc4\x1e\x7d\x0b\x49\xf8\x77\xe7\xc8\xd8\x67\x7d\xb4\xbc\xa4\xd3\xad\xa5\xe6\xc2\xe2\x2d\x86\x2d\xc8\xc7\xe3\x33\x9f\x69\x71\x10\x9b\xf0\xf1\x59\xa9\x08\x55\x86\x4f\x68\x66\x0e\x49\x55\x17\x85\x33\x0a\x78\x21\xcf\x51\x89\x7b\xa2\x75\x3b\x01\xf9\xb9\x31\x3a\x42\xca\x8b\x96\xc5\xb5\x5d\xd5\x90\x4a\xe6\x68\x3b\xad\x2b\x17\x02\x8c\x05\xf4\xc8\xcd\x8c\x67\x33\x72\x51\x17\xc5\x85\x2c\x78\xe6\x03\xdf\xb9\x46\xf7\x44\x6e\xd9\x42\x47\xbe\x70\x54\xdc\xd0\xb9\x7e\x1b\xbf\x25\xa1\xf0\x19\xa1\xc6\xb0\xb2\x42\x64\xb6\x5b\xb3\xd8\x08\xb6\xf1\x50\x80\xb0\xc8\x2d\xa0\x40\xf2\x28\x2f\x02\x65\xac\xdd\x07\x1d\xf9\xf5\x90\x9c\xb3\x6b\xa6\xda\xf0\x09\xfb\x11\x4c\xad\xdb\x30\xc1\xd1\x81\x34\x5e\x6b\xb0\x23\x15\x32\xa3\xc5\xdd\xa3\x7e\x00\x76\x3e\x59\x98\x96\x6b\xb1\x6f\x88\xc3\xaa\xae\x2f\x72\x36\x39\x97\xe6\x02\xe7\x68\xbf\x0f\xbe\xc9\x3d\xab\xd2\xc2\xea\x18\x73\xbf\xba\x45\x87\x9c\xeb\xab\x5e\xaf\x10\xec\x5e\xf1\xf1\xf4\x45\xe6\x29\x33\x16\x9d\x87\x01\xa3\x1d\x0c\x16\xab\xe1\xbb\xdc\xbe\xac\xbb\x5f\x8a\xb9\x82\x97\x03\x87\xdc\x71\x81\x4b\x76\x43\x14\x2b\xa5\x41\x39\xd7\xc2\xeb\xdc\x02\x99\x2c\x19\xa1\xd7\x94\x17\x74\x5c\x40\xac\xb3\x9d\xdc\xcd\xd5\xd9\xda\x7a\x04\x3b\x00\x11\x64\xd2\xdf\x47\x8b\x2d\x01\xe7\x11\x7f\x5c\xb1\xf9\xf8\x92\x22\x58\x85\xcc\xae\x62\x59\x75\xa2\x64\x89\x8f\x60\x9e\x7e\x0e\xb9\x63\x34\xcf\x89\xe6\x53\xc1\x27\x3c\xa3\xc2\x90\x82\x1a\x26\xb2\xf9\x88\xb8\xf6\xb5\x3a\xf8\x3e\x14\x33\x8a\x87\x3c\x7f\x21\x55\x49\x0b\xbf\xc9\x63\x9a\x5d\xc9\xc9\x04\x66\x6d\x9e\x77\xa1\x6d\x8e\x58\xe1\x9e\x50\x2d\x05\x2e\xce\xb4\xa6\xd3\x1e\xc4\x0a\xfa\xd2\x5b\x01\xca\xa5\xa2\xe0\x29\xb9\x82\xb4\x9e\x50\xfa\x6a\xb3\x3e\xd9\x41\xf9\xe2\x76\x4d\xf1\xba\x80\xaf\xaa\x16\x86\x5b\xf2\xd7\xea\x58\x47\xc0\xc7\x7a\x27\x54\xd7\x2e\xe5\xda\xff\x41\xb9\x0d\x57\x94\x0e\x92\xd7\xae\xa1\xb7\x05\xc2\x77\x27\xc2\x6f\x91\xd4\x43\x9e\x53\xf7\x5d\x88\xf8\x08\x60\xb3\x7f\x71\x6e\xa1\x76\xc5\xd4\x1b\xe9\xf2\x00\x2a\xe5\x35\x48\xf1\xb7\xaf\xfe\x3e\xba\x8e\xe3\x16\xe0\xe7\x56\xe4\x38\xb4\xf0\x96\x4c\x4d\xb1\x6e\x1c\x23\x25\x15\x7c\xc2\xb4\xc5\x90\xb9\x45\x27\xe7\x8f\xd2\xb4\x64\xe4\xc6\x22\x12\x46\x0d\x2f\xbc\x5e\x47\xfa\xfa\x79\xc1\x03\x16\x9d\x68\x63\xda\x38\x50\xf2\x10\xce\x02\xda\x44\xdc\xb2\xac\x36\x70\xff\x20\xce\x92\x1c\x08\x69\x3f\xeb\x18\x6f\x75\x59\x8f\x51\x7c\x86\x65\x17\x5e\x0d\xd3\x12\x85\x34\xd1\xe9\x3e\xb8\xb3\xba\x1e\x57\xb8\xaf\x6c\x62\xe5\xa8\x37\xa3\x6f\xbe\xe9\xbe\x39\x98\x1d\x07\x6b\x6a\x96\xd5\x8a\x9b\xb9\x25\xbc\xec\xd6\x8c\x26\xfa\x2f\x4a\xd6\xd5\x31\x14\xf5\x75\x8c\x79\x46\xc1\x65\x80\xa9\x74\x78\x21\x9b\x4b\x61\x11\xf5\x19\xe6\xc6\x54\x41\xee\xd8\xb6\xbc\xee\x36\x79\xe2\x88\xb3\xbd\x31\xcd\xb5\xd4\x23\x72\x21\xb5\xe6\x16\x33\x43\x05\xff\x1e\xc9\x9b\x3b\x2e\x19\xd9\xf1\x85\xc8\x46\x04\x34\xe9\xdd\x96\x8e\xba\xbe\x57\xac\x11\x22\x46\xd9\xd5\xdf\x42\x73\x37\x43\x0c\x9d\xb6\xf2\xbf\x07\xf6\x24\xe2\xad\x68\xba\xbc\x6e\x31\x42\xc0\xed\xd2\xb6\x6f\xff\x27\x6f\x02\x23\x67\x8b\x48\xdb\xae\x1c\xe0\xea\xe4\x77\x3f\xb4\x6f\xd9\x8c\x5e\xb3\xa5\xac\xb7\x92\xf9\x68\x09\x07\x82\x6b\xd4\x7d\x41\xab\xda\x85\x54\xfc\x50\x87\x5d\x6b\x56\x42\x91\xe5\x7b\x44\x80\x65\x52\xce\x78\x4e\x0a\x29\xa1\x08\x6d\x5d\x11\x21\x73\x66\x2f\x00\x04\xc1\xd2\x42\x0f\xc8\xe5\x91\x7b\xb0\x8a\x96\xc4\xd6\x27\x20\xd9\x56\x2c\x5b\xf2\xc0\x93\x59\xa9\xa2\xae\xbf\x28\xd6\x74\xcf\x0c\x69\xe5\xb6\x4b\x57\x70\x02\xb2\xc9\xc0\x22\x37\xe3\xd3\x19\x53\xa4\x60\xd7\x0c\x02\x7f\x26\x7c\x4a\xb0\x09\x71\xe9\x5a\xd4\xf8\x78\x7b\xa9\xa0\x29\xaa\xe2\x79\x77\xc3\xd0\xa2\xb4\x66\x8f\xf4\x46\xaa\xab\x42\xd2\x3c\xaa\x09\xaf\x49\xc1\xaf\x18\x39\x61\x55\x21\xe7\xae\xaf\x8c\xc8\xc9\xa5\xa1\x86\x4d\xea\xe2\xb2\xc7\x51\xf4\xb3\xea\xe8\x4c\xf3\xad\x59\x75\xec\xe2\x0b\x56\x9d\xb3\xcb\xe3\xcb\xb3\x67\x9f\x39\xb8\x81\x8f\x0e\x36\xe1\x39\xc7\x83\xf0\x9f\xbb\x45\xd0\x0d\x49\x51\x77\xfd\x25\xc6\x3a\x5e\x48\x65\x68\xb1\x05\xc1\x39\x9b\xd1\xea\xa8\x36\xb3\x13\xae\x33\x4b\x41\xd2\xc8\xcf\x77\x66\x8d\xaa\xc8\x33\x70\xd6\x39\x65\x89\x70\x7f\x49\xdc\x73\xc7\x7f\x3d\xba\x20\xb4\xb6\x28\x6c\x78\x06\x42\xd1\x56\x5c\xbb\x24\xda\x9b\x4b\xec\xf8\x95\x74\x67\xdc\x9c\x0f\xec\x8b\x7f\x6a\x97\x76\x65\xd7\x92\x39\x97\x65\x53\xbe\x24\x74\x3e\xab\x84\x4e\x60\x1c\xdb\xd2\x1d\xb8\xe0\x86\x53\x23\xd5\x2e\xe4\x90\xb5\x80\x09\x61\xbc\xb5\x36\xb2\x74\x24\xe1\xcc\x3f\x01\x55\x37\x7a\xb9\x85\xef\x2c\xd6\xc4\x06\x43\xe0\x10\x1c\xcb\x99\x30\x4c\x4d\x68\xc6\x16\xea\x05\x0f\xc0\x06\x8e\x30\x71\xff\x4c\x67\x68\xfe\xe8\x42\xfe\x2b\xe0\x83\x7f\x7a\xfb\xc7\x28\x63\xf4\x4f\x41\xdb\x70\xf6\xf8\x58\xb1\x10\x2c\xeb\x6e\x55\x4f\x81\x3d\x3f\xa7\xe1\x0b\xfc\x67\xb1\x90\xfd\x80\x5b\xfb\x6f\x35\x2d\xf0\x48\xfa\x1c\x77\xff\xd7\x6c\xa1\xc2\xd6\x6f\x49\x1b\x31\xdd\xbe\x05\x2c\xc4\x7a\x34\x40\x99\xd1\x8e\x24\xdc\x66\x1a\x45\x85\xb6\x28\x96\xc6\x56\xb2\xef\xb4\xaf\x7d\x72\x60\xb2\xaa\x73\x32\x6f\x82\x72\x57\xa1\xd4\x95\xfb\x8f\x4e\xd3\xa4\xea\x00\x51\xd4\x22\xd6\x84\x70\xeb\x3f\x23\x52\xbf\x0f\x1d\x20\xfa\xed\xd6\xd6\x33\x8e\x81\x4e\x6d\x3d\x00\xdb\x81\x11\x6e\x40\xbc\xd5\xa8\x52\x90\xf7\x5c\x1b\xac\xaa\x8b\x0f\x43\x15\x3d\xac\x22\x6f\x75\xd4\x0b\x22\x15\xe1\xd5\x7f\xd0\x3c\x57\x6f\x51\xf2\xf4\x2e\x51\xd5\xbd\xa8\x23\xd7\x2e\x26\x0f\xea\x39\x7a\x23\xc5\x81\x99\x57\x3c\xa3\x45\x31\x27\x9f\x8f\x2f\x60\x05\x4d\xfe\xf0\xbb\xd7\xa0\xb4\x7e\xf3\xf5\xef\x5e\xf7\xbc\x42\x2f\x45\xe8\x17\xc6\xb3\x08\x61\x7e\x06\xe9\xd3\xbb\x56\xe2\xb6\x55\x90\x16\xda\x9c\x5a\xfd\xf0\x12\xeb\xb1\x5a\xe1\xc8\xb1\x3b\x24\x04\xf6\x76\x05\x51\x2f\xa5\x16\xf9\x52\xf9\x34\x1a\x2f\x95\x4f\x5f\x2a\x9f\xbe\x54\x3e\xbd\x7f\xc4\x76\xce\x6d\xf3\xa3\x18\x16\xe8\x2a\x79\x57\x6e\x42\x91\xe9\xe2\x4b\x17\x99\x3a\xa2\x5a\x57\xc2\x9b\xe2\x00\xe3\xaa\x3a\x7d\xda\x84\x34\xdd\x2f\x4e\xce\x2f\xff\xe3\xfd\xd1\xb7\xa7\xef\x61\x57\x5d\xf1\x1e\x7b\xbd\xb9\x48\xee\x3b\xd9\x1a\x89\xe9\x77\xde\xdb\xcb\xd3\x16\x0b\x19\xda\x82\x9c\xbf\xbb\xdc\x30\x39\xfb\x29\x0e\x6f\xd1\xa6\x29\x26\xdd\x4f\xe9\xb9\x65\xe0\xd8\x9f\x6a\xa6\xb6\xd3\xa6\x68\x67\xd2\x77\xbc\x6f\x97\xdd\xb6\xad\xfe\x16\x5f\x71\x77\xb6\x66\x60\xef\x86\x8c\xe4\x5f\x26\x8d\xd6\x1e\x11\x1e\xdb\xb3\x4f\xa0\x7d\x4a\xb4\xe8\xa7\x11\xab\x54\xdd\xc5\x7a\x75\x7c\x51\x51\x63\x32\xcb\x48\x50\xbc\x50\x56\xcc\xb3\x02\x1e\xd3\xda\x0b\x1b\xff\xba\xf7\xb8\x5a\xe8\x21\x7e\x5c\x50\x5e\x6e\x4b\x20\x58\x0a\x0c\xfe\xe7\x25\x06\xd9\xb4\xb2\xa1\x5b\x51\x77\xdd\x42\x6d\x16\x5b\xa8\xc3\x8a\xad\x80\x37\x10\xca\x2a\x9a\x75\x15\x45\xbb\x61\x45\xb3\x13\x43\x8f\x20\xcd\x47\xf8\x09\xf4\x77\x7f\x86\x82\x08\xc0\xbd\xa5\x6a\xd5\x61\xed\x6d\x13\xa7\x00\xc8\x62\xe3\x44\xba\x09\x4a\x12\xaa\x43\xca\x0d\xa6\xeb\x24\xe8\xb0\xb8\x93\x38\x4b\xbe\x48\x79\xe5\xc7\x27\x36\x97\x6f\xd3\x54\x5e\xcd\xa4\x91\x62\x37\xba\x42\x2c\x83\xa5\xcd\x5a\x2e\xe0\x89\xe3\x10\x19\x1b\xb1\x26\x2c\xe3\x1b\xa2\x3c\x17\xd2\x75\x5d\xec\x66\x8a\x4c\xdd\xb8\x82\xd8\xc5\x32\x88\x57\x17\x13\x5b\xfa\x92\xbb\xd5\x36\xa7\x7f\xd7\x83\xb3\x93\x2d\x70\x91\xe7\x10\x26\xf7\x85\xb6\x90\x7d\xa2\xb0\xb7\xfe\x35\xc0\xf2\x44\x3d\x81\xec\x44\xfe\x8c\xcf\x4e\x9c\x21\xc2\x37\xfc\xd1\x8e\x2e\x90\xfb\x09\xd5\x56\x74\x0a\xa9\xcc\x8d\x54\x5b\x6e\x94\xde\x86\x62\xa1\x8e\x92\xfb\xee\x4e\x73\xb4\x27\xa2\xe6\x6d\xd0\x36\xea\xd1\xb3\xf8\x5e\xf6\xa4\x3a\x01\x74\x4f\x83\x9e\xdb\x7c\xe4\x57\x18\x65\xb2\x8c\x7a\xf3\x90\x9b\x19\x43\x29\xf4\xf8\xf2\xec\x03\x9f\x22\x80\xfe\x5d\xc8\x84\x51\x53\x2b\x36\x9c\x52\xd3\x0d\x20\xae\x49\xb7\x68\xbf\x2d\x73\x21\xc4\xa1\x7f\x65\x4e\x74\x09\x9c\x28\xba\x61\xab\x38\xd2\x97\xc0\x90\x9e\x0f\x23\xda\x39\x9d\xe7\xa5\x41\x76\x6b\x78\xe2\x91\xe4\x7c\xfc\x64\xce\xd1\x69\x71\xb3\x11\x15\x68\x60\x3b\xee\xb9\xad\x88\x06\x4a\xfe\x27\xf0\x9b\xde\x52\x41\x98\x09\xe3\xfb\x80\x4d\xd2\xa2\xb0\x27\x2b\x05\x0b\x69\x79\xba\x49\x32\xc5\x2c\xcb\x92\x56\x2e\xe1\x34\x97\x37\xe2\x86\xaa\x9c\x1c\x5d\x9c\x3d\x3d\xd7\xe9\x5d\xe2\x1f\xef\xd1\x07\x99\x6f\x9d\xfe\x47\xa0\x80\x54\x01\x65\x44\xec\x1f\x63\x6e\x34\xd6\x76\x84\x4a\x8b\x26\x76\xb2\x58\xf1\x2a\x04\xfd\x43\x25\x8f\x71\x20\x0e\x09\x94\x16\x41\x64\x66\x68\xe1\x22\x95\xc6\xcc\xdc\x30\x26\xc8\xeb\xd7\xaf\x31\xbe\xe2\xf5\xef\x7f\xff\x7b\xc8\xe0\x26\x39\xcb\x78\x79\xf7\x41\x78\xea\xb7\x6f\xde\x74\x07\xe5\xdf\x8f\x3e\xbc\x27\x34\x03\x1b\x19\x19\x4b\x33\x73\x10\x01\xea\xc5\x8b\xea\x01\xf9\x3f\x97\x1f\xcf\xbd\x1c\xa2\x17\xbe\x05\xcc\x0e\xdb\xd9\xc3\x06\xe4\xaa\xc3\x70\xa8\xf5\xd3\x44\x40\x50\x33\x0b\x75\x4e\x28\x44\xa2\x45\xf5\x74\x1c\xbd\xec\x91\x50\x05\xcd\xeb\xf9\x74\x06\xc7\xc2\x05\xdc\xc2\x82\x67\xae\x41\x03\xc6\xc5\x60\x7a\xb4\x2f\xea\x89\xc5\x4b\xbc\x08\xd1\x79\x65\xbb\x65\x03\x4c\x68\x76\xa5\x52\x06\xc1\x46\xa2\x98\xae\x0b\x03\x0d\xbc\xc6\xcc\x01\xd1\x60\xac\x66\x9d\x31\x70\x37\x42\xd8\x1d\xe9\xdb\x36\x5d\xf0\x14\xd8\xa9\xaf\x05\xb7\x42\xd9\x24\x54\xa1\x46\x02\x0e\x0e\x57\x72\x4a\xb3\x19\x61\xc2\x40\xab\x0b\x44\x3d\xfb\x78\xe7\xa5\x67\x54\xe4\x96\xa6\x58\x56\x80\x60\x3c\xdb\xf8\xf3\x74\x91\xac\x17\x61\xc7\x5b\x35\xb4\x1a\x4e\x4a\x0b\x29\xa6\xf1\xc5\x6c\x04\xeb\xa8\x86\x50\x0f\x1a\x04\x89\x8d\x50\x51\xd8\x1e\x0c\x3a\x5f\xb5\xab\x72\xa4\xb1\xc0\xd6\x98\xf5\xb9\x7f\x49\xe2\x97\xd3\x44\x30\x13\x92\x61\x61\xeb\xcf\xaa\xd6\xe6\xdb\xda\x22\x64\x9f\xd9\xd2\xc6\x34\x13\x72\x7c\x07\x3a\x0c\x08\x76\x31\x56\xe0\x53\xcd\x32\xa6\xf1\xf2\xfe\x03\xcb\x8e\x98\xe6\xe9\x7f\xe0\xb1\xf5\x84\x42\x4e\x96\x01\xe2\x4b\xbd\x71\x61\x39\x39\xad\x8d\x1c\xd6\x55\x4e\x43\xd9\xeb\x8e\xe5\x02\x9b\x71\x54\x54\x33\x3a\x20\x53\x1a\x29\x8d\x77\xe1\x88\x2e\x8c\xb3\x6e\xc0\x2f\x7a\xaf\xbe\xe2\x8d\x2d\x4b\x72\x01\xa9\x70\x13\x8a\xc0\x8f\x05\x2d\x19\x14\xe8\x41\x70\x7b\x82\x90\xc9\x72\xcc\x85\xab\x7c\x37\x81\xd2\x80\x4c\xa1\x17\x12\xca\xde\x91\x82\x8e\x59\xe1\x00\x90\xaa\xf7\x2b\x7f\xe7\xcb\x29\x31\x65\xf9\x9b\x26\x74\x3a\x55\x4c\x6b\x7e\xcd\x5c\x8d\x41\xfe\x4b\x80\x06\x3a\x80\x9d\x7e\xf0\xf5\x17\x35\xb1\xca\xa1\x61\xdd\x7b\x20\xe1\x08\xdd\xc5\x2c\x7a\x37\x36\x84\x11\x21\xa7\x5a\x1a\xa6\x78\x06\xab\xba\xa3\xd6\x44\xd7\xd9\x8c\x50\x8d\xd9\x87\x43\x28\xb4\xd8\x7f\xd7\x9b\xb2\x2a\x58\xb9\x71\xc6\x68\xee\x4b\xcd\x59\xa5\xaa\xaa\x58\x3e\x22\xe4\xd8\x92\x9f\x09\xcf\xa8\xc1\x42\x62\x24\x67\x79\x5d\x15\x1c\x6d\x84\x3d\xc1\xf8\x3c\x63\x44\xaa\x9c\x41\x45\x49\x39\x81\xe0\xfb\xb0\x58\x24\x1b\x42\x85\x79\x6e\xd7\x1f\x73\xa3\xa8\x9a\xa3\x04\xe5\xce\xb2\x27\x10\x96\xfb\x64\x50\xbc\x0e\xd6\x02\x78\xa0\xd2\x0d\xe9\xde\x74\xc7\x8f\x24\x4c\x80\xf4\xb6\x0d\x36\xa3\x47\xfc\xa5\x1f\x69\x78\x92\x1d\x70\xb5\x2f\xdd\xcd\xee\x3b\x59\x6a\xb6\x64\x07\xc2\x06\xea\xfc\x5d\x52\x19\x0a\x80\x9a\x6c\xe6\x24\xc5\x36\xa9\x22\x04\xed\x47\xb4\x5f\x76\x0c\x0e\x57\x4a\x91\x7b\x12\x19\xf2\xe9\x99\x19\x59\x75\xd3\xd4\xb4\x28\xe6\x43\x76\x6b\x99\xbd\x25\x66\x20\x3d\x41\x4f\x35\x48\xc4\xaf\x85\x66\x66\x90\x00\x10\x20\x42\x95\xc2\x12\xb6\x9a\xec\xe1\xfb\x0b\x09\xfd\x10\xf6\x70\x31\xab\x62\x8f\x6b\x83\x49\x3a\x83\xe5\x3f\x49\xb1\x27\xd7\x4c\xcd\xdd\xba\xbd\xa7\x4b\x76\x55\x49\xd2\x3b\x42\x80\x42\x99\x6c\x76\x7a\x5b\x29\x2c\xd5\x92\x64\xce\x85\xeb\xb2\xb8\x04\x96\xf1\xf7\x9a\x52\x1b\xb1\x3d\x31\x02\x0e\x82\x49\x2c\xf1\x27\xc0\x25\x8e\xce\x4f\xfa\xb3\x07\x1c\xfd\x15\x9f\xf6\xe8\xa9\x06\xb5\x47\x7a\x9a\x83\xe3\x68\xc5\x9e\xbb\x16\x0b\xfe\x1b\xec\x8b\x8a\x85\xd5\x74\xb0\xe4\x50\x72\xc5\x1c\x9b\xa4\xc2\xb9\x20\xdc\xc3\xc9\x80\x54\x0c\xea\x37\x62\x99\x4a\x36\x87\xc5\x70\xfd\x34\x27\x9f\xf8\x52\xe2\x48\xc5\x49\x9b\x31\xb4\x2f\x9f\x70\x36\x7f\x58\x89\xa6\x4c\x4b\x8b\x70\x5c\xb1\xce\x8e\x9c\x65\xa3\x75\x8b\x2c\x26\x79\x4b\x0d\xdc\x01\xfb\x41\xa8\x81\x14\xd0\x9e\x42\x03\x55\x4d\x8c\x4c\x85\x6c\x24\x5d\x76\x64\x7b\xf8\x03\x7d\xb4\x2d\x4b\x48\x78\x48\x04\x6f\x3b\x56\xe1\x8a\xcd\xf7\x35\xde\x79\xcb\x21\x66\xbc\x02\xd5\x1c\x98\xbd\x9c\x24\xbe\xf8\x38\x7e\x80\xc2\xe6\x1e\x1c\xe4\x2c\x67\x62\x40\xce\xa5\xb1\xff\x9c\xde\x72\xed\x74\x98\x13\xc9\xf4\xb9\x34\xf0\xc9\xce\xe3\x03\x6e\xd5\x73\xc1\x06\x67\xfd\xe7\x90\x18\x07\x6c\x18\x14\x75\xd8\x12\x7f\xea\xbe\x9a\x73\xc0\x1c\xae\xc9\x19\x34\x41\xc6\xa3\x4a\x0a\x10\x64\x65\xfa\xca\xd6\x16\x1c\x6f\xaf\x83\xba\xec\x2e\x7b\xfc\x2e\x3c\x0e\x5b\xa4\x6a\x21\xcb\x13\x81\xe6\xc0\x02\x2f\x04\x7e\x03\x4d\x4f\xaa\x82\x66\x2c\xf7\x3d\x15\xa8\xdd\x55\x6a\xd8\xb4\x63\xfe\xf3\x7d\xa3\x64\x6a\x0a\x0e\x96\xac\x47\x9f\xa5\xbb\x23\xb5\x60\x86\x23\xa9\x78\x86\xe3\x51\x2e\xf1\xa3\x54\x53\x79\xf2\x25\x40\xee\x7f\x6f\xd9\xec\x63\x68\x15\xc9\x28\x51\x04\x26\x4a\xbf\x25\xad\x2c\x15\xfa\x2f\x2b\xe4\xc2\x85\xfb\x6f\x52\x51\xae\xf4\x88\x1c\xf9\x2e\x14\xf1\x77\xce\x8e\x14\x4d\x93\x0c\xb0\x0a\xf2\x31\x7f\xae\xf9\x35\x2d\x5c\xc5\x64\x2a\x08\xc3\x8e\x1e\x16\xc6\x45\xd5\x6a\x40\x6e\x66\x52\xa3\xc4\x1c\x4a\x6f\xec\x5d\xb1\xf9\xde\x20\x81\x3d\xd5\x8f\x98\xf2\xed\x9d\x89\xbd\xc6\xe7\xd8\xa2\x4f\x41\x6f\x80\xdc\xc3\x3d\xf8\x6e\xef\xa9\x74\xba\x84\x72\x3d\xcd\x73\x8e\xa5\xad\x2f\x92\x8b\xbb\x49\xc9\x47\xfa\xaa\x17\xcd\xe8\x5b\xab\x06\xc7\xe3\x99\xd1\xfc\xcd\x5c\xe2\x76\x18\xcf\x7d\x57\x19\x67\xb2\xba\x6b\xd1\x4a\x00\x08\xd8\xc4\x22\xfb\x99\xbd\x12\x2d\x23\x64\x2a\x33\x52\x12\x64\xf1\xc5\xda\x77\xf1\x48\xad\x7c\xa5\x6a\x36\x20\xb9\x14\xfb\xc6\xb9\x10\xe2\x9e\x50\x8b\xbd\x25\xf2\x25\xa7\x7e\xa0\x0f\x13\x80\x42\x15\x83\x16\x18\xbe\x1f\x96\xb3\x77\x62\xd7\x28\xf0\x55\x19\x1f\x2f\x6c\xff\x5c\x06\x48\xdf\x02\x46\x0e\x10\x57\xc6\x48\x48\xe0\x02\xd0\x1f\x37\x06\xa6\x41\xbc\x08\xa4\xb6\xff\x2b\x01\x14\xab\xd0\x1b\x78\x67\x53\x6c\x09\x4d\xb7\xbf\x30\x25\x13\xac\xbb\xc4\x40\x9e\xea\x36\xf5\x89\x6b\x6c\x46\x9f\x22\x0e\xcd\x68\x5d\xa5\x4f\xa0\x0c\x5f\xbb\xe0\x25\x68\x78\x16\xd5\x84\x56\x12\x11\x01\x22\x4a\xe1\x8b\x31\xec\xcb\x4e\x11\x99\x06\x5d\x76\x91\xcc\x6c\xe8\x80\x89\xbc\xc7\x29\xe4\x94\x07\xbc\x2a\x9f\x67\xac\xf1\x0c\xcb\x09\x40\xe9\x1d\xe5\x8f\x73\xa1\x42\x95\xe2\x5a\x60\xc1\x5e\x8c\xe1\x4b\xe7\x90\x4d\x86\x5a\x18\xe3\xfa\x81\x56\x09\x23\x4d\xc2\x9c\x90\x13\xac\x4a\x24\x9a\x74\x2c\x6b\xe3\x4b\x35\xbb\xef\x73\x6a\x28\x34\xa5\xc2\xb8\x89\xdd\x70\xe1\xa6\xb3\xc3\x26\x52\x91\xd3\x5f\x57\x8c\x80\x6e\x67\x1c\x0c\x08\xa3\xd9\xcc\x6a\x3b\x43\x0c\x6d\xb5\x7a\x9a\x57\xc8\x4e\xec\x41\xa1\x12\x24\x17\x05\x86\x14\x57\x28\x60\x84\xbf\x38\x51\xb4\xb6\x0f\xc2\xf0\xa9\x57\xda\x25\x74\x38\xf5\x4c\x34\x49\xf1\x09\x20\xf1\xee\x11\xdf\xc9\xd3\x19\xb8\x61\x47\xc0\x5a\x15\xed\x97\x8f\x51\x64\xb9\xfd\x59\xb8\xf4\x09\xa0\x58\xf2\xf6\x4d\x3d\x76\xcb\xc3\x5c\x44\x7a\x2d\xee\xac\x6f\x85\x9a\x44\x30\x60\x8b\x34\xfb\xd2\xd4\x1b\xfb\xa3\xaa\xf0\xd0\x06\x15\x32\x83\x9b\x4e\x64\x0e\x5b\xc2\x71\xa6\x30\xda\x45\x47\xaf\x59\xe8\x62\xca\x94\x92\xca\xbe\x3f\xd3\x9a\x70\x38\xa7\x92\xaa\x2b\x96\x07\x69\x7c\x44\x2e\xec\x46\x79\xcb\x5e\x02\x48\x94\x97\x22\x7c\x8f\x54\xfb\xea\x4e\x31\x07\x30\xf7\x47\xa3\x7d\xd7\xbe\x5d\xa1\x80\x8d\x7c\xc8\x7e\x9e\x8a\xe2\xa7\x31\xe3\x25\x33\xde\xb5\x68\xd3\x07\x5a\x69\x34\x8e\x5a\x31\x1a\xdc\x41\x92\x50\xdc\x11\x17\x25\x44\x7b\x17\x9b\x68\x46\x62\xe3\x44\x5a\x87\x63\x3a\x67\x63\x82\x50\x20\x1c\xa9\x1d\x8c\x09\x9d\x8b\xf7\x39\x16\x1d\x0e\x39\x7a\x98\xd6\x5b\x9d\xd0\xce\x5c\xf6\x48\xaa\x59\x1c\x8f\xe5\x22\x82\x74\x05\xae\xc9\x47\x6f\xad\x58\x2f\xe5\xc6\x60\xe5\xe1\x14\xda\x90\x1f\x3b\x94\x73\xb3\x38\x76\x2d\x07\x67\x71\x9c\x4d\xb0\xbd\x70\x5b\x08\x71\xec\x31\x4e\xab\x0a\x0a\x48\xaf\xc6\x92\x8b\x63\x7b\xc9\x39\x8b\x63\x2b\xc9\x3a\x8b\x23\x45\xf2\xce\xe2\xe8\x9f\xcc\xb3\x38\xd2\xd8\x53\x70\x3c\x16\x71\x02\x11\x81\xfb\x16\xc0\xb1\xb1\xc6\xa9\x1b\x20\xf0\x83\x29\xac\x8a\x18\x43\x42\x9a\xe4\xc4\x39\x24\x4b\x74\xac\x65\x51\x1b\x04\x21\xfd\x22\xb1\xcc\x08\x2f\xe9\xbd\x50\x69\x04\xc5\xc5\xe5\x22\x49\x14\x34\x09\x14\xcf\x52\xae\xf5\x78\x9e\x97\xd4\xbe\xd4\x5d\x75\xbd\xa4\x6f\x19\x80\x63\x37\x1a\x07\xe0\xd8\x89\xf6\x01\x1e\x94\xf4\x4d\x04\x70\xec\x52\x9d\xef\xf6\x48\x7a\x49\xfb\xb7\x15\xf0\xe3\x91\xbc\x67\xa1\x83\x32\xca\x4a\xf3\xd0\x55\xb3\x65\xa0\x80\xf2\xfd\x46\xa3\xfd\xc4\xc7\x00\x61\x1f\xce\xfe\x76\xad\x74\x4e\x91\xc7\x72\x46\xfb\x8a\x06\x47\x17\x67\x09\xed\xbf\xd1\xac\xf7\x58\x80\xe3\x27\x5e\x6c\xc0\xeb\x8c\xd6\x06\x9f\xa1\xf9\x36\x8e\xfc\x3f\x69\x76\xd4\xd5\x79\x4a\x22\x6e\xef\xbe\xcd\xe9\xce\x8b\xbf\xb3\x92\x62\xdc\x73\x2e\xc2\x40\x23\x5d\x09\x89\x46\xa6\x74\xb2\x18\xd6\x42\xf5\x99\x7e\xfd\xd3\x54\xc9\xee\xdb\xa7\x76\xd4\xaa\x04\xbb\xdf\xa3\x3b\xd6\xe2\x68\x61\xcb\xfe\x27\xbf\x89\xce\x65\x89\xce\x84\xc8\xaf\x51\xc9\xfc\x2d\x06\x59\x51\x21\xa4\xc1\x18\xea\x01\xba\xe7\xf5\xc0\x05\x2a\x44\x05\x75\x45\x4e\x6a\x9e\x63\x36\x66\xa8\x8c\xb9\xff\xaf\x95\x56\x01\x1b\x78\x91\x06\x9d\xc8\x23\x65\x42\xd0\x8a\xff\xc0\x54\x9f\xde\xdd\xcb\x46\x0b\xb9\xdc\xfc\x1e\x93\x74\x36\x63\x25\x85\xff\x7c\xe7\x37\xc8\x12\x6d\x97\x9b\x0c\xce\x12\xa6\x4a\x2b\xf8\x0e\x5a\x55\xae\xf6\xae\xdf\x24\xc8\x93\x6b\xc6\xa3\x84\xd5\x86\x33\x7f\xb4\xed\xbc\x68\xa9\xff\xf6\x8a\x82\x85\x12\x02\x0d\x7c\x75\xeb\xe0\x8e\xb2\x92\xc4\x35\xee\xff\x8e\x6f\xdd\x63\x06\x16\xe2\x78\x0e\xd6\xe8\xae\x56\xe8\x41\x90\xd2\xdb\xd6\xe3\x64\x80\xbd\x58\xa1\x1f\x1e\x2f\x56\x68\x37\x5e\xac\xd0\x6b\x8f\x47\xb3\x42\x47\x22\x9d\xe7\xb0\x4b\xcc\xc8\x71\xa7\x38\x6f\x4b\x6e\xba\xc8\x8f\xd0\x27\xe5\x0d\xc0\xde\xfa\x2b\x55\xdb\xbd\xbf\x3f\x1a\xed\xa3\x83\x7f\x14\x9c\x58\xb5\x99\x0c\xff\x40\x98\xc8\x64\x6e\xe7\xf9\x0c\xf3\x2b\x6d\x40\xdd\x69\x2c\x7a\x31\x2c\xa5\x5f\x2b\x0e\x11\x80\xb9\xd3\xca\x8d\x09\xd9\x96\xaf\x8e\xf8\xee\x31\x85\xf3\x84\xec\xa5\x11\xee\x3d\xe4\xfe\x28\xdc\x81\x32\xe5\xa4\xfc\xa6\xee\x63\xc1\x4b\xee\xb2\x14\x2d\x3d\x65\xda\xa4\x4a\x3e\x21\xe4\x00\x27\x1f\x65\x55\x3d\x70\x0b\x8d\x4a\x56\x4a\x35\x1f\x84\xc5\xec\x97\xad\xd5\xdd\x13\x87\xa0\x5c\x64\xb5\x52\x4c\x98\x62\xde\xaf\x00\xff\xb2\xf1\x4c\xb4\x0c\x7f\x52\x3b\xac\x64\x04\xe4\x4a\x13\xa7\xdb\x8c\x36\xc5\x3b\xf6\xcb\xa0\x3b\x23\xec\x36\xf0\x7b\xd7\x4a\x65\xd0\x58\x40\xed\xa7\x4c\x5c\x93\x6b\xaa\x74\x2a\x0a\x43\x1e\x4b\xaf\xc8\xf9\x35\xd7\x8f\x98\x82\x7d\xe9\x84\x16\xf4\x35\xca\xda\x54\xb5\x71\xec\xce\x93\x08\x76\x5b\x49\x2b\x8a\x06\xd2\xb0\xa0\x9e\xbd\xe9\x6b\xf2\x8e\x47\x45\x8d\x61\x4a\xbc\x25\xff\xf7\xe0\xa7\x5f\xff\x73\x78\xf8\xe7\x83\x83\xbf\xbd\x1e\xfe\xaf\xbf\xff\xfa\xe0\xa7\x11\xfc\xc7\x57\x87\x7f\x3e\xfc\xa7\xff\xe3\xd7\x87\x87\x07\x07\x7f\xfb\xee\xc3\x5f\x3e\x5f\x9c\xfe\x9d\x1f\xfe\xf3\x6f\xa2\x2e\xaf\xf0\xaf\x7f\x1e\xfc\x8d\x9d\xfe\x7d\xcd\x49\x0e\x0f\xff\xfc\x3f\x13\xbe\x04\x15\xf3\x8f\xc9\x78\x02\x8e\xe1\xa3\xc8\x35\xed\xb9\x1f\x37\xd3\x94\x0b\x33\x94\x6a\x88\x8b\xbc\x85\x34\x9c\x64\x4b\x79\xd4\x7c\x3c\x1a\xd3\x48\x55\x81\x83\x06\xf5\x7b\xc7\x89\xc8\xe3\x6a\xd8\x8f\xe6\x9e\xc6\xba\xd3\x09\xfd\x30\x38\xe1\x3d\x2e\x18\xf7\xe5\x8b\xf7\x65\x9d\xf1\xe5\x47\xe0\x5f\x22\x3a\xbc\x84\xdf\x93\xe7\x1f\x7e\x8f\x67\xf9\x12\x7b\xff\x12\x7b\xff\x12\x7b\xdf\x7b\xa6\x1d\xf5\x92\xbe\xc4\xde\xfb\xf1\x1c\xbc\x1d\x2f\xb1\xf7\x6b\x8c\x17\xaf\xc7\xca\xf1\xe2\xf5\x68\x8d\x7f\x71\xaf\xc7\x4b\xec\x7d\xc7\x45\x5e\x62\xef\x57\x8d\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x0e\x30\x2d\x8b\xbd\x47\xe4\x5f\x16\x81\xef\xec\x4d\x4d\xf8\xfd\xbf\x60\xf4\xbd\xb6\xe8\x97\xb1\xa3\x2c\x93\xb5\x30\x9f\xe5\x15\xeb\x19\x9b\xb8\x60\xfd\xbd\x33\xbb\x25\x43\xf7\x59\x83\xef\x3e\xbc\x93\xa6\xe1\x2f\xb2\xbf\x06\xad\x73\xce\x44\x0a\x6f\x4e\x7a\xe6\xe8\x61\xf3\x12\xa2\x95\xb8\x45\xce\xf2\xe6\x0b\xc7\x39\x8d\x45\x9a\x11\x39\x22\x8a\x65\xbc\xe2\xae\xa8\x26\xc5\xcf\x13\x00\x02\xf4\xc1\xb5\x27\x9d\x5b\xaa\xc1\x8a\x49\x60\x55\xa1\x6d\xa9\x8a\x6c\xa4\x4e\xca\x5b\x00\x34\x85\xf1\xcb\xbe\x12\xea\x3c\xa0\xe1\xdc\x70\xcd\x88\x9e\xc9\xba\xc8\x89\x62\xff\xe9\x95\x2e\xb7\x23\x9f\x63\x18\x62\x47\x72\x1a\x60\xa2\x57\x77\x27\x41\x2b\x6e\xef\x33\xdb\xad\x2a\x89\xec\xb6\xe2\xd8\x01\xfc\x92\x65\x52\xe4\x3b\xe9\x96\xb9\x03\x64\xa3\x18\x41\x4c\x0e\xd6\x80\x0e\x7d\xa7\xae\x69\xc1\x73\x2b\xa3\xf9\x90\x6f\x24\xa3\x29\xae\x1d\x52\xe2\x70\xab\x74\x83\x51\x84\x56\x95\x92\x34\x9b\x31\x1d\xc1\x8b\xd6\x08\xd7\x7f\xbe\x5f\xc3\xde\x78\x54\x45\x3d\xe5\x02\x4d\x1a\xb0\xaa\x97\x60\xa5\xf1\x69\x34\xee\xa5\x17\x41\xfe\x1c\x81\x63\x7f\x9e\x00\x18\x54\xa6\x8c\x9a\x43\xb6\x8e\x8c\x81\xc0\x9d\xe1\x93\xf8\x0f\x4d\x64\x91\x83\xbc\x41\x05\xf9\xc3\x6b\x52\x31\x95\x21\x59\x4a\xe2\xc0\xd3\xd0\x77\xca\xc2\x51\x58\x8d\xd9\x8a\x32\xf7\x2f\xff\xf5\x6f\xc8\x4c\xd6\x4a\x8f\x4e\x22\x02\xf0\x06\x3e\x4b\x81\x2d\x22\x6f\xe2\xa2\x0d\x29\x18\xd5\x86\xbc\x79\x4d\x4a\x2e\x6a\x93\xae\xbe\x63\x2a\x6b\x4b\x64\x67\xf9\xdd\x6f\x7a\xce\xf6\x08\xd5\x22\x93\x50\x92\xd8\xaa\x02\xff\x1d\x4c\x2b\xce\xa3\x08\xbd\xed\x49\x25\xb9\x30\x8b\x86\x16\x27\x71\xa5\xe4\x56\xe0\xc9\xdc\x09\x7e\x90\xd8\xc4\xf0\x73\x2d\xc7\x73\xd3\x49\x74\x4a\x71\xe8\x6e\xf9\x76\x07\x8e\x7f\x73\x1f\xe2\x11\x4b\x14\x43\x66\x56\xe9\x05\xbb\xac\x9e\x51\xc5\x5c\xd7\xcc\x7d\x4d\x0a\x3e\x61\xdd\x3b\xd8\x9d\xd8\x85\xa1\xa6\xe4\xdb\xb0\x2e\xd7\x24\x0f\x1f\x07\xd3\x2c\x17\x43\xa3\x18\x0b\x20\x83\xae\x0f\x1e\x64\x52\x48\x31\x8d\xbb\xb7\x76\x01\xa5\xa7\x88\xdf\x4f\xb0\x1f\x12\xc5\xa6\x5c\x1b\xd5\xcd\xed\x37\xec\xce\x30\xfb\x6a\x01\x53\x25\xeb\xce\xc5\x37\x53\x91\x2d\x00\xc2\x9b\x78\x7d\xa0\x87\xeb\xe5\xda\xbd\xe6\xb0\x63\x75\x0e\xc7\x60\x8d\x8e\x73\xf5\x26\x3b\x8a\xd1\xfc\xa3\x28\x3a\xfb\x4c\x53\x6d\xb4\x87\x03\xed\x69\x20\x55\x4d\x24\xc4\xd6\xcd\x58\xb8\xbe\xbe\x75\x32\x98\xea\x80\x86\xb0\x1c\x35\x1d\xfb\xf3\x21\x84\xad\x47\x9e\xc2\x1e\x1d\xde\x23\x59\x64\x42\x0b\xdd\xb3\xe7\x75\x1f\x5b\x8b\xbf\xbe\xdb\x3f\x20\x84\xa3\x4d\xd0\x5d\x3d\x7c\xa9\x48\x59\x17\x86\x57\x45\x73\x58\x9f\xfc\x0f\x9c\x18\xdc\xdd\x56\xd8\x28\xae\x34\x8a\xe4\xa0\x1a\x38\xc7\x5b\x4b\x98\x31\x20\xec\x20\xc0\xc0\x84\x81\xee\xfc\x90\x7c\xcc\x2a\xaa\x68\xc0\x94\x4c\x96\x25\xed\x51\xb6\x1d\xe3\x8b\x28\xe4\x50\xa0\x10\x63\x45\x67\x45\x8b\x66\x87\xa2\x60\xf3\x6d\x5d\x6b\xc3\x04\x15\x9d\x43\x26\x53\xe1\x0c\x42\x41\xe4\x4d\xa8\x22\x30\xe5\xd7\x4c\x2c\xde\x67\x67\x8e\xf8\x96\x66\x57\x4c\x74\xb7\x6f\x7e\xaf\xfd\x19\xe7\x73\x41\x4b\x9e\xd1\xc2\xd2\x03\x25\xaf\xb9\x25\x07\x2c\x5f\x58\x57\x0f\x9c\x09\x1f\x9b\x90\xfa\xe6\xd5\xa8\xd8\x6d\xeb\xe0\x6a\xcd\x3a\x87\xf8\xa7\x3a\x36\x0b\xc3\x63\xf1\x3c\x8d\x11\x1d\x8a\x5f\x67\xcc\xeb\xc5\x76\xbd\x6d\xed\x37\xbe\x5f\x92\x1d\xf7\xd8\x1c\xd1\x28\x90\x6a\x43\x38\x2a\xf6\x1f\x2b\x2c\xaf\x9a\xfb\x04\xbb\xc5\xbb\xe0\xda\x93\xf7\xe3\x37\x1d\xf7\x43\x8d\x3b\x09\x99\x29\xd0\x4e\x8d\xf3\x36\x63\xf9\x44\x73\xa9\xc9\xb7\xd0\x95\xe3\x84\x81\x19\xe5\xa9\x95\x86\x4f\xdf\x9e\x3c\xa0\x30\x58\xa8\x13\x2b\x0b\x4b\x7d\x75\xec\x96\x96\x55\xc1\xf4\xe8\xea\x0f\xe0\xad\x73\xf4\xeb\x95\x1a\xe7\xaf\x3e\x9d\x1e\x9d\x7c\x38\x1d\x95\x5d\xe8\xe6\x96\x35\x13\x5e\xd2\x69\x37\x3d\x7e\x48\x4a\x29\xb8\x91\xaa\x0b\x83\xed\xab\x98\x4c\xf4\x67\xbb\x6f\x5b\x26\xd2\x08\x85\x37\xa4\x34\x3d\xf8\x11\x21\x9d\xdd\xc4\x0b\xcc\xf6\x9e\xcc\x65\x4d\x6e\x28\xf6\xf7\x82\xab\xd4\x5d\x3c\xfe\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\xa6\xaf\xe9\x22\x08\x96\xab\xfa\x9b\xe0\x79\x2b\xdc\x5a\x6c\xec\x05\xfd\x64\xe0\xf1\xee\x70\x9c\xba\x7b\xf1\x96\xec\xb1\x5b\xf3\x9b\xbd\x01\xd9\xbb\x9d\x68\xfb\x8f\x30\x13\xbd\x37\x22\x67\x65\x55\xf0\x8c\x9b\x62\x6e\x6f\x14\x53\x2a\x38\xfa\xf1\x07\x0b\x79\x06\xdd\x21\xd9\xd0\xc1\xae\x8d\x54\x74\xca\xfc\x45\xfe\x95\x1a\x77\x15\x7b\x7a\x33\x40\xb8\x84\xdb\x46\x66\x00\x22\x78\x14\x80\xf4\xe3\x47\xfd\x1a\xa1\x74\x25\xa5\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\xea\x96\xed\x7d\x32\x57\x6c\x0e\x09\x72\x5b\x3e\x1b\x07\x46\xcb\x64\x6b\x24\x44\x26\xc0\xe7\x56\xdb\xf9\xf4\xed\xc9\xf7\xba\x8f\x5b\x2d\xb2\x88\xbc\x62\x26\x7b\x95\xb1\x6a\xf6\xca\xad\xfc\xaf\x7a\xfe\x51\x3c\xcb\x9d\x3d\xe9\x34\xa1\xe7\x99\xdb\xc6\x28\x0f\x07\x8a\xca\x99\x2c\x0a\x96\x79\xc7\xe1\x31\xab\x66\xe1\x81\x67\x7d\xf2\x7d\x72\x62\x7a\x66\xc2\xec\x9e\x33\xc2\x8e\x4a\xca\xce\xf1\x54\xa9\x50\xcf\xc2\xd0\xe6\x33\xf0\x49\x3f\x36\x13\x11\x2f\x35\x4e\x2b\x44\x3c\x4f\x72\xd5\x55\x9c\x79\x16\xc6\xe8\x4f\xfe\x4b\xcd\x0c\x48\xb1\x5c\x10\x2c\xb0\xf9\xc1\x4a\xd5\xbb\x60\x75\xde\x09\x54\xea\x63\xf4\xc6\x1c\xec\x1e\xe5\x74\x52\x61\x42\x00\x04\x54\xfc\x28\x1c\x9a\xd6\x66\xc6\x84\xe1\x19\x86\xbc\xb8\xa4\xf1\x58\x16\x22\x67\x13\x34\x3e\xe6\x3d\x62\x36\xe5\x35\x53\x8a\xe7\x4c\x93\xde\xc2\x50\xec\x74\xe2\xc5\xb3\x46\xad\x5e\xe1\x92\x29\xa2\x13\xfb\x06\xec\xa7\x8c\xaa\x48\x1f\xa4\xbf\x1b\xe1\xf9\x3b\x11\x98\xff\x18\x21\xf9\xbb\x18\x8c\x9f\x28\x9c\xb1\x7f\x00\x7e\xfa\x90\xf2\x9d\xf1\xa8\xb4\xc4\x4e\xf8\x24\x99\xd8\x49\xf3\x92\xf7\x28\xef\xba\x03\x24\x3d\x8d\xe0\x09\xfb\xb0\xf1\x24\x3a\xa3\x05\x3b\xfb\xb8\x2d\xdf\x87\x5b\xbe\xed\xff\xb8\x74\x1f\x56\x4c\x69\xae\xa1\xe4\x87\x77\xc5\x19\x43\xb3\x99\xf3\x46\xf8\x20\x08\x29\xc8\x77\xe1\xde\x10\x21\xf3\xae\xb1\x8d\xb1\x03\xc4\xc3\xb0\xda\x09\xe2\xc1\xff\xb2\xa2\xa6\xa6\xd4\xb0\x9b\x8e\xfa\xfb\xb0\x11\x1b\xbb\xfe\x1e\x0c\xe3\x2f\xbe\x8d\xa5\x8e\x85\xfe\xfe\x8b\x90\xeb\x7f\x67\xee\xc7\xf7\x58\x8c\xee\xf1\x55\xa4\x60\x03\x30\xe3\x56\x5c\xc7\x38\x02\x1d\xbe\x9d\x74\x13\x46\xdc\xad\x4b\x82\x7f\x6e\x2e\x8f\x45\x70\x90\x34\xcf\x15\xd3\xda\x8b\xcb\x9e\xc0\x1d\x5d\x9c\x91\xbf\xe0\xe3\x5b\xdb\xbd\x4a\x49\x83\x66\xd0\x13\x59\x52\xde\x39\xe1\xad\xb5\x07\x8b\x93\xfa\xcd\x88\x35\x59\xbf\x09\x17\xe1\x59\xe2\x1e\xb6\xda\x6c\xd3\x96\xbc\x56\x2c\x27\xce\x71\xb5\xb5\x5d\xda\x39\x0b\xd1\x1d\x9b\x0d\x39\xb0\xdf\xbd\xba\x51\xdc\xb0\xc3\x51\x63\x2d\x5a\x30\x25\x75\xb7\xed\x3e\xa2\x09\xea\x8b\x34\xdc\x44\xe1\x37\xbe\x64\x59\x63\xac\xf1\xc8\x0f\xe2\x78\x48\x5b\xeb\xb1\xaa\xd0\x1c\x72\x19\xa2\x6c\x52\xb0\x04\x81\xae\x1a\xaa\x92\xa1\x55\x68\x40\xde\xcb\x29\x17\x9e\xbd\x48\x97\x4d\x34\xa1\xdd\xcd\x33\x2f\xf6\x91\x3b\xe3\xc5\x3e\xf2\x62\x1f\x79\xb1\x8f\xdc\x3f\xb4\x2e\x4e\x05\x1d\x17\xdd\x53\xc7\xdb\xd9\xf5\x61\x3a\xf2\xae\xa0\x53\xc2\xe0\x8f\x57\x39\xd7\xf6\x5f\x72\x79\xf9\x1e\x42\xb0\x6b\xe1\x4d\xe7\x80\x9b\x4e\xfa\x0a\xf5\xa4\x91\x97\x6e\x8f\x8d\xa1\x98\xf3\xa1\x47\x05\xb5\x64\x8c\xac\x01\x85\x70\x91\xdb\x5d\x63\xba\x55\x31\xc2\x3d\x01\xfc\x8c\x86\xaa\x94\x98\x74\x3d\x66\x96\x5a\x65\x57\x17\x51\x14\xb4\x54\xf6\x33\x11\x7d\x94\x44\xf9\x48\x34\x67\x4a\x35\x64\x01\xa4\x3e\xa8\x70\x91\xca\x79\x1d\xcd\xe7\xa5\x71\x2f\x84\x5c\xba\x83\x84\xef\xa8\xd6\x32\xe3\x4d\xde\x02\xc4\xde\x34\x22\x7a\x0e\x22\xfa\xd6\x36\x19\xf5\xe0\x34\x1b\x82\xea\xf7\x12\xcd\xc4\x23\xb6\x7b\x82\xea\x58\x13\xe1\xc2\xef\xdb\xd6\x36\x01\xaf\x5a\x9f\x8e\x06\xa9\x88\x44\x03\xc9\xe2\x3e\x06\x82\xb0\x18\x77\xee\x4b\xe2\x3a\xdc\xeb\x6c\x71\xc2\x01\x51\xa0\x5c\x2f\xc1\x5a\xae\x03\x49\x82\x62\xe9\x5b\x39\xad\xee\x15\xc4\x93\x18\x78\x51\xdf\x68\x27\x4e\xe1\x67\x2e\x82\x1d\x68\x75\x25\xab\xba\xc0\xb4\xfd\xb0\x69\xc9\x42\xc8\x37\x89\x46\x45\xd8\x9e\xde\x66\xdb\x57\xf3\x88\x4a\x4d\x6e\xfb\x42\xc6\x55\x2f\x37\x2f\x6f\xea\xef\x28\x58\x27\xc9\x78\xee\xa7\x4b\x60\xf1\xdc\x7e\x75\xd3\x54\xd5\x4c\xbb\x5b\x97\x5b\x55\x50\x5b\x16\x9c\xd7\xbf\xfb\xcd\x6f\x7a\x08\x43\x5c\xb1\xcc\x48\xc8\x3c\x74\x95\xa5\x43\xc4\x2c\x55\x0c\x74\x7f\x2c\x3d\xea\xed\xcb\x98\x79\x66\x7a\xc5\x75\x6c\xaf\xfc\xe9\x56\xca\x9d\xa6\x28\xb8\xd1\xbf\x9c\x69\xaf\x00\xcd\x64\x51\xf3\xd0\x2a\xe1\x6c\xcb\xad\x12\xb6\xda\x20\x61\x9b\x6d\x11\xb6\xd7\x0c\x61\x8b\x2d\x10\xb6\xdd\xf8\x60\x2b\xed\x0e\xb6\x1e\xd0\xfd\xf4\x0d\x0d\x92\xd4\x25\x4c\x51\x93\xb0\x6f\xcb\x82\x9e\xf5\x0c\xd3\xd4\x32\xec\xdd\x94\xe0\x29\x5a\x11\x24\xb2\x71\xf6\x6f\x3b\x90\xb6\xe6\xd4\xb6\x5b\x0c\xec\x90\xe8\x8d\x63\x37\xdb\x09\x6c\xa5\x89\xc0\xb6\x5b\x07\x6c\xb1\x61\x40\xba\xc2\x75\xa9\x9a\x03\xf4\x2f\x58\x97\x96\x70\x6c\xa9\xfc\xff\x23\x16\xfd\x7f\x92\x52\xff\x8f\x5d\xe0\x7f\x37\x93\xdb\xfa\x16\x0c\xef\x5d\x26\x5c\x27\xaa\x13\x9e\x2a\x06\x64\x17\xcc\xe2\x0d\x24\x4b\xdd\x0b\xbe\x0b\x24\xde\x03\xa8\x1e\x02\x7e\xe2\x8a\x62\x4f\xcf\x3a\x71\x06\xd6\x93\xd8\x60\x49\x6f\x5b\x39\x42\x22\x3b\x09\xbc\x49\xcc\xe5\x08\xc0\xc7\xcb\x85\x88\xe8\xf0\xf1\xd3\x07\x42\x87\xa5\x1f\x08\x85\xf6\x5b\xb7\x63\xc1\xd0\x2f\x51\xc1\xeb\x8c\x5d\x8c\x0a\x7e\xaa\x0a\x26\x5f\x5e\x60\x66\xfe\x12\x98\x19\x8f\x1d\x0c\xcc\xd4\xad\x86\xf3\xde\x21\x0a\x6c\x17\x54\x4b\x39\xb6\x42\xaa\xaf\x1c\xd8\xd0\xe0\xa3\x8b\xb3\xce\xab\x67\x8a\x41\x57\x00\x5a\xe8\xd1\x32\x9d\xd3\x87\x1f\x39\x0d\xd7\xeb\x9a\xd4\x18\x56\x56\x9d\x4b\x7a\xbd\xc4\x65\x2e\x19\x2f\x71\x99\x2f\x71\x99\x2f\x71\x99\xf7\x8f\x5d\x8e\x2e\x9a\xd5\x25\x15\x43\xcb\x4f\x21\xa8\xb3\x95\x4e\xb2\x20\xa6\x8f\x88\xe3\x80\xbd\x88\x16\x96\xf2\x85\x02\xcf\xb5\xe0\x3f\xd7\xac\xf1\x74\x04\x95\x6d\x07\xe2\xc0\x00\x8e\xdd\x39\x2e\xd4\x64\x17\xf8\x6c\x26\xef\xd4\x07\x74\x7b\x19\x8e\xce\xb3\xc6\x7e\x47\x06\x8b\xb7\x1c\x93\x66\xc6\x50\xd9\xbe\x58\x50\xb6\x5b\x36\x5d\x47\xc8\x81\x8e\xf6\xf3\x0e\xc7\x9a\xa0\x45\x51\xfb\xee\xae\x43\xca\x98\x91\x92\x2b\x25\x95\x8b\x54\x8b\x5f\x1f\x13\x9f\xf8\x74\x66\x98\x42\x0b\x29\xa6\x67\x74\x27\x9f\x97\xcc\xb8\x5b\x00\xb7\xc8\x48\x42\x05\x16\x7a\xb5\xff\xed\x8b\x7c\xc0\xd6\x78\x09\x64\xcc\x66\xf4\x9a\xcb\xba\x47\x51\xb5\x4b\x94\xa7\xf6\xdc\x94\xa0\x2b\xcc\x65\x1d\x62\x51\x6a\x6d\x37\x23\x9c\x82\xbe\x8b\x07\x9d\x97\x3e\x6f\x26\x05\xb3\x79\x2e\xbd\x33\x7a\xc8\x6e\xb9\x36\x77\xf7\xdc\xa3\x80\x8b\x7d\xda\xca\x65\xbe\xd6\x95\xe5\xbe\x3f\x74\xae\x09\x9c\xe2\x0a\xb7\x80\x68\x9b\x40\xae\x2f\xe1\xab\x87\x0c\x20\xae\xb9\x10\xd6\x47\x27\x25\xcd\x66\x5c\x24\xa8\x87\xfb\x43\x0b\xb0\x96\x25\x64\x44\x8e\x8a\xa2\xc9\x63\xd2\x21\x75\xd0\x5b\x46\xda\x2f\x65\x0f\xa9\x13\x38\x16\x73\x15\xcb\x21\xce\x0a\x45\x2c\xc8\x4f\xd4\x7c\xe4\x16\x18\x5d\x97\x37\x54\xb1\x51\x26\x4b\x72\x7c\x79\x46\x72\xc5\x3b\xb6\xfb\xda\x72\xfe\x39\x1e\xf1\x45\x37\xd7\xf5\x97\x66\xef\x79\xb1\xf5\xec\x94\xad\x27\xa4\x30\x14\x3c\x9b\x9f\x9d\xa4\x4d\x8b\xc0\x39\xbd\xa0\xa9\x43\x4a\x84\xfd\x9c\x7c\x4b\x35\xcb\xc9\x07\x2a\xe8\x14\x1d\x56\x07\x97\x17\xdf\x7e\x38\xb4\x08\x0f\xce\xb8\xb3\x93\xa5\x79\x13\x97\xf1\xe4\xe7\xdb\x2a\xaf\x4e\x16\xb7\x2e\x99\x6c\x7f\x67\xd6\x8e\xdb\xb7\xb5\xca\xf3\x24\x88\xad\x17\x3d\x9c\xc0\x4b\xaa\xf1\x5f\x2c\x36\x1b\xc3\x44\x05\xdf\x19\x52\x2f\xb2\xd4\xeb\x32\xbf\x7a\xea\x0d\xb8\xeb\x8d\xb4\xfa\xe3\x15\x9b\x6f\x4c\xbd\x87\x70\x82\x3d\x17\xc7\xf7\x28\xe9\xfd\x2d\x89\xa2\x48\x99\x55\x10\xae\x17\x35\xb7\x46\x64\x5c\xeb\x5c\x2f\x8d\xa2\x86\x4d\xe7\x27\xac\x2a\xe4\xdc\x62\xf1\x45\x14\xb8\x83\x8f\x8e\x51\x94\x56\x63\x9a\x11\x55\x17\xd0\x78\x21\xbf\xd3\x8e\x51\x30\x96\x37\x64\x9e\x0b\x6d\x68\x51\xd8\x03\x84\xf9\x57\x42\xb4\xb6\x70\xb0\xae\x18\x30\x44\x38\x1f\x7c\xaa\xdd\x8e\xf8\xfc\xa1\xd3\x5e\x5f\x10\x80\xe5\x1f\xc6\xb7\x4d\x22\x21\xd7\x8e\x79\xec\x22\x30\x20\x45\xfb\x54\x17\x96\x41\x17\x79\xbb\x7d\x33\xaa\x1c\x0e\x15\xb0\x35\x04\xd0\x3f\xfb\x92\xce\x04\x28\x99\x6e\x85\x42\x44\x3f\x5f\x6b\x7d\xec\x10\x7d\x33\x43\x09\xd4\x4e\x4c\x68\x55\x15\x1c\xab\x0c\x48\xe5\x82\x70\x23\x7f\xf2\xdd\xc7\xd6\x21\xb5\x1b\x8a\xa1\x9b\x89\x9d\x43\x72\xcd\xd4\x78\x1d\xfb\xdb\xa6\x12\x25\xad\x38\x84\x33\xad\x4d\xc2\xba\x0a\x8d\x47\x17\x67\xb8\xd0\x32\x0f\xbf\xff\x12\x11\xc2\x1d\xb5\x0f\xe8\xc1\x74\x34\xe7\x06\x08\x9d\xa3\x8e\x2e\xce\xb0\x21\x9b\x6b\x1e\xd5\xb8\x06\xac\xc6\x4e\x31\xf9\xb2\xe9\x79\x4b\xa7\x76\x46\x43\xa4\x60\x9b\x74\x4f\xb5\x10\x30\x51\x97\x0c\x1b\x53\x05\x60\x08\x17\xb0\x4e\x80\xa2\xf1\x40\xa0\x55\x79\x44\xf6\xf6\x62\x9d\x10\xcb\xb3\xa8\x08\x6e\x20\x75\x7b\x5f\xb5\x9e\xb2\x74\xad\x79\xb1\x75\x39\xfc\xe6\x51\xcf\x1b\x46\x39\x77\xe0\x98\x09\x22\x77\x84\x14\x9f\xdc\x7e\x7f\xff\xe9\xfd\xa3\x23\xe8\x79\x7b\x39\xd7\x1e\x88\x41\x6b\xd3\x8a\x2a\xc3\x69\x41\x6a\x55\xf8\xf0\x42\xac\x44\xe2\x32\x02\x67\xf4\x3a\x6a\xbd\x34\x22\xe4\x2b\xc4\x4a\x87\x0c\x48\xca\xc0\x28\xea\x5a\x91\x4d\xea\xa2\x18\x90\x09\x17\xd4\x32\x32\x56\x91\x28\xc8\x6b\x6d\x88\x2f\xb9\xc8\x98\xdd\xa6\xa1\xc7\x4b\x02\x90\x7b\xb3\x51\xa0\x69\x10\xa3\x19\xbb\x5c\x10\x14\x4b\xdf\x32\xb0\x0b\x4f\xa4\x22\xc7\x45\xad\x0d\x53\x9f\xa4\x65\xc3\x4d\xba\x09\x99\x28\x59\x12\x1a\x7f\xfd\x2d\x17\xf9\x46\x99\x50\x9f\x80\xb5\x67\x54\x10\xc6\x21\x30\xca\x2e\x0d\xf1\xd0\x16\xd9\x9b\x4b\x75\xa0\xeb\x6c\x66\xb7\x68\xaf\x92\xb9\xde\xb3\xd4\x79\x0f\xdd\x8d\x7a\xef\xd0\xfe\xb5\xf8\xae\x98\xbd\x11\xfd\xee\x15\xad\xf8\xde\xe1\x80\xc0\x86\x43\x70\x9e\x5c\x3f\x1a\xef\x0b\xbd\x47\x7e\xc3\xc0\xd4\xd7\xe9\x16\x7d\x8a\x67\x80\x8b\x21\x9a\xd0\xb7\x9b\x19\x37\x98\xaf\x63\x6f\x0a\xfa\x00\x42\xaf\x99\x45\x46\x4a\xc8\x91\x77\xa2\xd9\xab\x55\x32\xea\xe3\x75\xd9\x35\x53\x73\x33\x73\x0d\x2c\x3c\x15\x7d\x39\x39\xb8\x19\xbd\x4e\xcd\x91\x32\x7f\x42\xcd\x75\x03\x9a\x70\xe7\x84\xf6\xbf\xda\x5f\x64\x49\x0d\x0f\xfe\xd7\x3e\x0f\x10\xc2\x3a\x9d\xc5\x0f\xf6\x97\xed\x73\xc0\x8f\x90\x99\x04\x72\xf8\xfe\xbd\x0b\x4f\xc1\x0d\xff\x8e\x0b\xf0\x7a\x83\x3c\xe4\x6b\x01\xb8\x43\x5b\x7a\x52\x00\xe1\xbf\xec\x29\xdd\x55\xba\xd6\x55\x94\x56\xc0\xe8\xf5\xcc\xfb\xa6\x5a\x39\x81\x53\x56\x3f\xc8\x7c\xf9\x25\x6e\x21\xc9\x59\xf4\x70\x88\x25\x6e\xcc\x9c\x6e\x2e\xa7\x39\xcd\xab\xa5\x5a\xe8\xea\x33\x5d\x71\x7e\xf7\x41\xd2\xd8\xe9\x80\xec\x47\xdf\x7c\x6e\x02\x23\xc8\xa4\xa0\xd3\x06\x17\x81\x88\xa3\x64\x7f\x7c\xf9\x83\x7f\x05\x4d\xee\x29\x3d\xfc\xa0\xea\xf4\x90\xb2\x34\x6c\x76\xe9\xde\x27\xee\x75\x65\x3c\xac\x31\x85\xc9\xef\xc7\xa6\x75\xe2\xbe\xcc\x4a\x53\xfd\x7d\xfb\xef\x4d\xeb\x34\xc2\x04\xdf\x39\xce\x9b\x42\x20\xdb\x04\x64\xb8\xcb\x1f\x5a\x68\xf2\x00\xbc\xf7\x20\xed\x15\x9b\xdf\x48\x95\x3f\x8c\xb0\x47\x81\x98\xf9\x9f\x78\x65\xde\x07\x83\xa1\x39\x5e\x2e\x75\xec\x74\x46\xd5\x95\xc0\x17\x74\xcc\x8a\x87\x41\xbf\x47\x31\xf8\x40\x2b\xfb\x3a\x4d\xca\x26\x5a\xa4\x5c\x94\x19\x6a\xa7\x98\xe7\xe3\x33\xd2\xa4\x9a\x52\xc1\x7f\xc1\x3c\xd7\xcc\x52\x0a\xa9\xf8\x2f\xcb\x51\xed\x00\x7d\xfa\x68\xe3\x2a\x58\x66\x0e\x1d\xd6\x2f\x25\xd9\x0f\x5c\x0b\x9a\xe7\x1c\x45\xb0\x8b\x07\x30\x78\xf5\x7e\x71\x71\xb5\xc9\x49\xc3\xf3\x98\x66\xd3\x38\xf6\x1e\xf1\x98\x57\x90\x85\x87\x6f\xee\xea\x30\xba\x35\xd8\x53\xad\x56\x24\x8a\xac\xfc\x7d\x49\x39\x72\xed\xe5\x6d\xbc\xee\xd9\x5d\x87\x4d\xd4\xc9\xd6\x96\x96\xda\xf7\x0b\xb3\x3d\xc1\xbd\xea\xb5\xe1\xac\xa4\xbc\xeb\x8e\xe1\xe8\x71\x64\x25\x35\xb5\xe2\x66\x29\xa7\x5e\xfd\x43\x2e\xbe\xab\xc7\xec\x07\xa6\xb4\x3d\x8f\x4d\x7f\x2e\x20\xe3\xec\xe8\xe2\x6c\xe9\xb6\xa4\xe1\xc8\xf7\x1a\x32\xc0\x6e\xe6\x20\xb7\xe2\x22\xa9\x05\x2d\xc7\x7c\x5a\xcb\x5a\x17\xf3\xd8\x83\x42\xc9\x15\x17\xf9\x88\x90\x33\x34\xab\x8a\x7d\x43\xa8\x90\x62\x5e\xba\x47\x45\x56\xd4\x39\x6b\xcd\x78\x1f\x2b\x93\x84\x5e\x4b\x9e\x13\x5a\x1b\x59\x52\xc3\x33\x92\x49\xa6\x32\x28\xa2\x1a\xcf\x5f\x6b\x46\x68\x6b\xc6\xe6\xb7\x59\xad\x8d\x2c\x49\x49\x95\x9e\xd1\xa2\xb8\x0f\x25\x12\x48\x07\x60\x4e\xbb\xf7\x5b\xbb\x2b\xf7\x7e\x79\xbd\x62\x1f\x1e\xbe\x0e\xb0\x70\xaf\xeb\x60\x81\xeb\x35\xc1\xf5\xfd\x48\xbd\xc6\x1c\xae\x02\xee\xd2\xbe\x1c\x2d\xfc\xfc\x3c\x63\xa4\xaa\xc7\x05\xd7\xa0\xc2\x03\xe1\x9a\x93\x31\x9b\x71\x97\x7a\xf3\x30\xc5\xba\xf7\x88\x1f\xda\xe7\x55\x24\xe3\xc1\x1d\x5a\x41\xe1\x57\xfe\xd6\x71\xc0\xb3\x92\x4e\xd7\x10\xed\xef\xb9\xbe\xef\x2d\xd9\xa7\x62\x1e\xf8\x29\x34\x53\xd5\x03\x22\x95\x4b\x24\xf6\xba\x9f\x72\x5f\x85\x16\xc1\x8a\x7c\x74\x3b\xea\xf2\xa2\xdd\x35\x80\x2a\x03\x4c\x4d\xa4\x2a\xed\xbe\x73\x45\x26\xb5\x00\x6b\xf8\x3d\x7a\x21\xc4\xf0\x01\xff\x71\xc6\x4c\x5a\x68\x19\x88\x01\x1c\x9b\xf0\x80\x11\xaa\xc9\x0d\x2b\x0a\x0c\x23\xc2\xce\xaf\x51\xd9\xe6\xa6\x96\x65\x13\x4a\x38\x5e\xae\x5b\xe6\x7c\xca\xb4\x21\x07\x97\x7f\x3d\x3a\x04\x81\x08\x8c\x75\x73\x62\xe8\x74\xb4\x10\x1f\x8e\xc1\xa4\x56\xdc\xca\x6b\x10\xcb\x32\x6a\x68\x21\xa7\x18\x81\x66\x49\x8a\xfd\x7d\x55\xd0\x39\xa4\x71\x55\x54\x41\xae\x60\x86\x06\x4b\xa2\x6a\x71\x5f\x9b\xf1\xc7\xe3\x94\x0f\xd3\xa4\x55\x3d\xb5\x57\xb8\x87\x1f\xa6\x39\x0f\xf4\x09\x7e\x5c\x16\xac\x58\x55\xd0\x7b\x0c\x56\x77\xe8\x45\x53\xfa\xd0\xea\x2d\x60\xd8\x90\x82\x85\x39\x46\xe4\x12\xf1\xa9\xa4\x26\xc3\xf8\x90\x7f\x94\xcc\xd0\x9c\x1a\x3a\xb2\xca\xfd\x3f\xda\x25\x92\x64\x91\xdb\x89\xee\x3f\xe8\x7b\x60\x46\x51\x5c\x3e\x4c\xe3\xde\x5b\xd5\x22\x3c\x0e\x0a\x97\xbf\xb7\x2b\x2d\x64\x3d\xc9\x1b\xbc\xfe\xe9\xad\xd5\xad\x57\xba\xf2\x5b\xb0\x2e\xfe\xa8\x6d\x7b\x2a\xda\x6f\xe2\xb0\xb5\x64\xc2\xe8\x11\x1c\x4d\xfc\x09\xf8\x13\x8e\xce\x4f\xee\x37\xc7\x3e\x6c\x48\x7a\xc0\x70\xb4\xbe\xcf\xe6\x68\x05\xec\xde\x65\xe3\xbe\x69\xfb\x12\x7d\xa1\x0c\x28\xc3\x84\xc5\x1b\xa8\x08\x5c\x09\x1e\x5e\xb1\x2c\x9e\x73\x53\xca\xa5\x51\x0a\xef\x37\xb6\xad\xe5\x11\x5e\xc7\x0f\xfc\x50\x65\x9d\x61\x78\x8d\x7b\x1f\x5a\xcf\x2d\xfc\x60\xf5\x9b\xfb\xaa\xdb\xe0\x99\x40\x59\x05\x6f\xf9\x0f\xc7\xb0\xae\x1b\x7d\x4d\x63\xa1\x7f\xd5\x0d\x00\x7d\xd0\x09\x18\xb0\xa0\x15\xc4\x7b\xc5\xe6\xfb\x4e\xd3\xb5\x37\x68\xc6\x2b\xac\xdf\xe4\x7c\x82\x0f\x1d\x3f\x8e\x1f\x68\xc1\xf3\xb0\x00\xde\xa5\x33\x31\x20\xe7\xd2\xd8\x7f\x4e\x6f\xb9\x36\x68\x63\x38\x91\x4c\x9f\x4b\x03\x9f\x24\xd9\x29\x04\x30\xe5\x3e\x39\x33\x08\x3a\x80\xe0\xba\x47\xc6\x12\xb7\x1f\xd8\x43\xa1\x91\xf7\xec\xd3\x67\xc2\x0a\x34\xf8\xca\x0f\x2c\x11\x8a\xc2\x69\xb7\x80\x2f\x96\x20\xa4\x18\xfa\x1c\xad\xbb\x2b\xb8\x7d\x94\xaa\xb5\x8d\x9d\x17\x73\x0b\x61\x7a\x03\x7c\xc3\xb5\xe7\x4b\x41\x0c\xa1\xde\x34\xfc\xa0\x5d\xba\x64\x6a\x0a\xbe\xdd\xec\x01\x5f\xe4\xba\x16\xf9\xb5\xec\xf0\x6b\x5b\xdf\x3b\xd9\xdc\x3b\xfc\x08\x78\xd2\xfb\x7b\xed\x73\x64\x03\x7c\x8c\xa6\x42\xaa\x5f\xa2\xe1\xee\xbf\x2c\x71\x87\x23\xfd\x6f\x28\xa8\xa8\x47\xe4\x88\x68\x2e\xa6\x05\x6b\x7d\xe7\xdc\xed\xd1\x34\x2b\x96\xaa\x20\x4b\xf1\xe7\x9a\x5f\xd3\xc2\xb2\x19\xc8\x0a\x09\xa5\x58\xe4\xe4\x0e\xb3\x1d\xb8\xc2\x89\x96\x20\x06\x31\x76\xef\x8a\xcd\xf7\x06\x2b\xd3\x64\x62\x8c\xde\x3b\x13\x7b\x4d\x8d\xa1\x16\x96\x06\x9e\x06\x92\xf1\x1e\x7c\xb7\xd7\x9d\x6f\xaf\xe4\x50\xeb\x5b\x19\xc9\xc3\x28\xb7\x59\xee\x9d\xbe\xe2\xcb\xc3\x92\xd6\x41\x12\x2f\x5f\x1e\xe8\x43\xb0\xab\x09\x46\xa0\x08\x96\x02\x97\x84\xfd\x34\xae\xe8\x6c\x35\x96\x2b\x5e\x55\x4d\xb9\xed\xba\x9a\x2a\x9a\x33\x32\x55\xb4\xba\xe7\xd2\x6e\x26\x9d\xa2\x88\xbb\x6c\xc9\x15\x6a\xd9\xee\xeb\x40\xf7\x9c\xf5\x0a\xab\xc3\xca\xdf\xdd\xb0\xf1\x4c\xca\x2b\xa8\x8c\x03\x78\xf7\x88\x26\xb5\x1f\x71\xad\x93\xe6\x33\x6f\xee\xd0\x24\x67\x86\xf2\x02\x42\x04\x3f\xbe\xff\xe0\x82\x08\xbd\xac\xe6\xa1\x5c\x4e\x33\x12\xe8\x86\x34\x77\x71\xb2\x9f\xd8\x35\x67\x37\xce\x72\x76\x1f\x89\x1a\x92\x29\x13\x10\xa0\xb6\x22\xcc\x74\x48\x34\xcf\xd9\x29\xa4\x5a\xdf\x3f\x51\x0f\x27\xd9\x3d\x30\x3f\x44\x2b\x56\xf3\xba\x07\xf9\xdc\x1a\x3c\x2e\x58\x50\x2e\xa4\x5a\x51\x59\x7e\xbd\x32\x6b\xeb\x95\x50\x0b\x59\xca\xbf\xf9\xcd\x37\x2b\xf8\xca\x2d\x2f\xeb\xf2\x2d\xf9\xdd\x6f\x7f\xfb\xcd\x6f\xef\x7f\x8c\x0b\x7c\xec\xcd\xfd\xef\xe7\x6e\xdb\xf1\xa7\x93\x1d\xd8\xef\x3c\xc4\x7b\xaf\x76\xc0\xaf\x31\xd5\x84\xf2\xa2\x56\x2e\x5d\x62\x4d\xed\xf1\x5d\xfc\x1b\x70\x9e\x36\x69\xb5\xd4\xcf\xe8\xe3\x8c\x5d\xfc\xf1\x84\x0b\xa6\xc9\x4c\xde\x90\x5a\x28\x96\xc9\xa9\xe0\xbf\xb0\x1c\x8b\xe5\x6a\x0c\x80\x83\x56\xf2\x1e\xc5\x09\x13\x79\x25\xb9\x30\xc0\x62\x67\x54\xe4\xc5\xaa\x58\xa5\x35\xde\x34\xbe\xc1\xbd\xb6\x0c\xb8\xd1\x46\x1b\xf6\xa1\xf9\xc5\xc2\x76\xd9\x77\xf6\xae\x66\xe4\x72\xb8\x6d\xbd\xde\x14\x09\xe3\xe5\x0a\x9b\xcb\x12\x18\x37\x33\x09\xa0\xa9\x03\x3e\xfb\xb9\x66\x6a\x0e\x79\xbb\x8d\xe2\x16\x45\x14\x7f\x6e\xca\x37\xfa\x77\x74\x42\x25\xbd\xd7\x27\x40\x96\x98\x64\x22\x51\xab\x09\x70\x5b\x80\x0a\x7e\xc3\x30\x4c\xc7\x7b\x7d\xc9\x11\x11\x75\x51\xac\x58\xe9\x9e\x49\x84\x5c\xe5\x39\xc6\xb1\x96\xfd\x61\x3d\xc3\xc0\xba\x26\x28\x1c\xdb\x33\x44\xc5\x2f\x9e\x48\x8b\xda\x34\x9c\x78\x4b\x06\x2a\x1c\x5d\xcc\x54\x38\x36\x48\x5f\x58\x3f\x75\x61\xbd\x92\xd0\x6b\x98\xaf\x70\x6c\x92\xdb\xb0\x66\x21\xe7\xc7\x34\x68\xe1\xd8\x28\x06\x6e\x3d\xe3\xd6\x12\xd0\xd7\x8c\x73\x7f\x44\x43\x17\x8e\xc7\x30\x77\xe1\xd8\x68\x1f\xd7\x31\x7d\xe1\xe8\xb2\x8b\x4f\x60\x06\x73\xef\xfc\x94\xc6\xb0\x07\x96\x4c\x6c\x12\xc3\xb1\xb6\x61\xcc\x01\xb7\x51\xc0\xea\x06\xc1\xaa\x1b\x06\xaa\xf6\x08\x52\xed\xfc\xd3\x35\x8c\x67\x38\x36\xc3\xe8\x27\x34\xa4\xf9\x05\x9f\xcc\x9c\x86\xe3\xa9\x8d\x6a\x38\xd6\xe6\xa7\x9b\x19\xd8\xe2\xc9\x1f\x40\xd7\x2e\x85\xae\x14\xe3\xe2\x5a\x62\xbf\xcf\x8d\x94\x88\x4f\x77\x7e\xb8\xa0\x4b\xdc\x00\x1b\x75\xca\x44\xd0\xbe\x62\x9d\x6a\x26\xe5\x15\xa9\xf5\xc3\x1e\xb5\x95\xef\xfd\x40\x7a\x6c\x12\x25\x78\x93\x1b\xf6\xa9\x2e\xd8\x8f\xdc\xcc\x3e\x36\x25\x57\xe0\x9a\x99\xba\x2a\x60\x2f\xa2\x2f\x2c\x5e\x7e\x6a\x94\x93\x33\x83\x24\x36\x93\x65\xc9\x44\x8e\xd1\x96\x25\xbd\x5a\x8d\xf0\xda\xaa\xb7\x98\x55\x50\x14\xa8\xc2\xc1\x52\xec\xb6\xa2\xa2\x51\x56\xae\x2d\xa3\x5e\x85\xc2\x6b\x22\xf0\xba\x32\xd9\xda\x79\xa6\x1b\xcb\xdb\x8b\x79\xa5\x51\x62\x68\x2b\x7f\x94\x8c\x59\x21\xa1\xa6\x14\x66\x4e\x60\x96\xd1\xda\xa9\x96\x67\x13\xff\x2b\x27\x39\xb9\x3e\x45\x4c\x4c\x9b\x42\xf3\xba\xe0\x19\x0b\x2c\x53\xae\x53\xcc\xe7\x93\x93\xa6\xd7\x13\xd0\xd7\xe1\x7d\x6b\xf2\xbd\x0d\x78\x5e\x0f\x7e\x47\x2b\xfe\xb0\x29\x10\x47\x87\x93\xf7\x53\xc7\x67\x7f\xed\x3f\x5b\xe7\xf4\xfd\xc3\x2f\xe7\xbf\x6a\xf4\x38\xff\xa6\xd4\x54\xea\xe3\x6f\x53\xd4\x46\x06\x0e\x67\xbf\xc0\x5a\x32\xaa\x2c\xb3\x07\x4b\xfe\x90\x1c\x7f\x3a\x3d\xfa\x7c\x3a\x20\xdf\x5f\x9c\xc0\xbf\x27\xa7\xef\x4f\xed\xbf\xc7\x1f\xcf\xcf\x4f\x8f\x3f\x5b\xe1\xf9\xab\x07\x41\x80\x46\xce\x45\x81\xa7\x6f\x25\x14\xd9\x26\xe6\x54\xcc\xc9\xa4\x36\x96\x22\x37\xc0\xb4\xa0\xa4\x68\x42\xa4\x79\xbe\x4e\xb2\xe3\x17\x87\x83\xad\x33\x0f\x07\xba\x68\xb5\x8d\xf6\xcc\xf5\xce\x76\x79\xfd\x0f\xbf\xd9\xd3\x20\xf9\xda\x79\x9a\x9b\xe2\x78\xb7\x14\xce\xff\xf1\xe0\xbc\xef\xa4\x22\xec\x96\x96\x55\xb1\x46\x86\xdc\x7e\x25\x73\xbd\xef\x72\x75\xed\x7f\x3f\xbc\xed\xf0\x93\x57\x85\x9c\xee\x87\x14\x5f\x46\x0a\x39\x25\xba\x1e\x87\xfc\x6d\x10\x04\xd7\x9a\xed\x2b\x3f\x4d\x2b\x19\x75\x10\x92\xbc\xa3\x59\xd7\x06\xae\x35\x67\x3c\xc1\x26\x70\xbd\xd2\x19\x2d\x58\x6b\x26\xfb\xc1\xa6\x00\x7d\xf5\x6a\xf9\x1b\x7a\x4d\x85\xab\x85\x19\xd7\xa1\x14\x37\xbc\xc8\x33\xaa\xf2\x3b\xe4\x02\x44\x3f\xbc\x4d\x80\x39\xd8\x18\x50\x80\xe0\xd8\x2c\x8d\x85\x20\x1f\xb6\x58\x5d\x33\x55\xd0\x0a\xf3\x00\xa1\xa3\x25\xc4\x2d\xaf\x01\xe2\x09\xab\x18\xd4\x11\xc0\x26\x5e\x8c\x30\x91\x15\x12\x2a\x5d\xa2\xd4\x39\x68\x1f\x0b\x46\x39\xfb\x86\x3b\xeb\xe6\x87\x7f\xe1\xec\x15\x12\xca\x52\x53\x1d\xcc\x52\xbb\xb7\x1a\xad\xcf\x3f\x7e\x70\x1e\x34\x06\x06\x2d\x9b\x91\x3d\x57\x44\x62\x6f\x40\xf6\x42\xe1\xd1\xdc\x69\xe4\x7b\x5f\x3d\x5c\xd2\x39\x4c\x10\x57\x0e\x00\x85\xdd\x45\x3a\x0c\x01\xce\xb8\x50\x0b\x60\xb7\x8f\xd1\x58\x1b\xf4\xa6\x28\xaf\x15\x29\x9d\xab\x05\xde\xa1\xbd\xd0\xc3\x33\xc5\x2f\x7a\x07\xea\xa6\x42\x47\x6f\x88\xf7\xbe\x6a\x4d\x6f\x7c\x75\x72\x22\xa4\x3b\x3c\xc5\x2c\x36\xae\x4a\x05\x88\xc7\x65\xeb\xee\x85\x18\x97\xb8\x2a\x31\x57\xa4\xa2\x8a\x09\x13\x80\x7f\x78\x5a\xd7\xc4\x19\x8c\x31\x5f\xed\xad\x77\x2b\x57\x5e\xa2\x28\xac\x61\x4d\x5b\xc5\x65\xf8\xc5\x71\x41\xb5\x5e\xe2\xf0\x04\x1e\x60\x27\x76\xb5\xe9\x2d\xef\x75\x31\x1f\xd0\xca\x74\x46\xaf\x57\xbc\xea\x1a\x40\x1b\xaa\xa6\xcc\xac\x0e\x48\xa0\x62\xfe\x71\x65\x13\x88\xe1\xda\xad\xe1\x86\x1d\x2c\x46\x5c\x98\xa1\x54\x43\xfc\xc9\x5b\x62\x54\x7d\x9f\xdd\xc1\xf0\x92\xc9\xda\x5c\xb2\x4c\x8a\xe5\x49\xc3\xee\xb9\x64\x11\x16\x1b\x64\x52\xbb\x20\x9f\x23\x2f\x7e\xc7\x9d\x69\xbc\x39\xaa\x91\xcd\x7d\x60\x4f\xbb\xb8\xe8\xc7\xf7\x1f\xfa\x1c\x36\x81\x0a\x52\xab\x4f\xf2\x07\xc7\x93\xc5\x34\x40\xea\x20\x5f\xf9\xb3\x0f\xb5\xd9\xfc\x47\xc7\x21\x60\x64\xf5\xd3\x6e\x33\x56\x17\x7a\xbc\xf7\xfd\xb5\xa1\xa6\xbe\x83\x0d\x0f\xb1\x22\x47\xdf\x2f\xb1\x90\x83\x53\xef\x2f\x61\xaa\xd8\x67\x15\xd7\x90\x43\x8d\x0e\x8b\x68\xc2\x73\x3e\xa3\x64\x44\xdc\x0f\xed\x95\x35\x8a\x72\x34\x87\xd1\xcc\xd4\xf4\xae\xcb\xdd\xfe\xd8\x65\xa3\x2c\xaf\x1c\xbb\xc2\x20\xb6\xca\x08\x96\x31\x65\xf4\x7b\xaa\xcd\xf7\x55\x4e\xef\xa9\x21\xb0\x90\x65\xa2\x0d\xdc\x29\xd4\x69\x6f\x04\xcb\x2d\x13\x72\x5b\x82\xf3\x91\x1b\x4b\xdd\x6b\x9c\x71\xc9\x84\x0f\x60\xa5\xbf\x63\xf6\xe7\x43\xbb\xd4\x72\xa8\x3f\x49\xbb\x27\x47\x4b\x69\x54\x3b\x99\xe7\x21\x68\x2d\x47\x53\x30\x1b\x11\xec\x76\x99\x54\xd9\x1f\xe2\x82\x51\xb1\x3c\xd9\xb2\x05\xeb\x31\x3e\xb7\x39\x4e\xb9\x05\xc8\xcd\x8c\x5b\x75\x0b\x6b\x2d\x68\xe2\x85\xd8\x9c\x15\xec\x9e\x92\x0b\x3d\xf3\x7f\xdc\x0a\x27\x6e\x81\xbe\xa1\xd3\x17\xed\xe9\x82\xc7\xdb\xe9\x96\x2e\x2b\xb7\xd1\xd2\x9c\xec\x13\x6c\x15\x8b\x2f\x0c\xc2\xdb\xb8\x90\xd9\x15\x16\x35\x87\xa2\x66\xfc\x17\xa6\x56\x08\x19\xe0\x45\xe4\x22\xe7\x59\x08\x57\xa8\x94\x9c\x2a\xa6\x5b\x5b\x8d\x35\x60\x35\xce\x6e\xd7\xb4\x7b\x1e\xd6\x95\xaa\xf1\xed\xd4\xc2\x95\xbd\x78\x9a\x14\x25\xaf\x97\x43\xfe\x66\xcb\x97\x7e\x57\x45\xc7\xfa\x92\xd0\x15\xc3\x19\x68\x68\xe9\x92\xac\x5f\x7d\x77\x7f\xea\x71\xd2\xfc\xa1\x55\x09\xd0\xf8\x04\xf7\x7d\x6f\x56\x3e\xb5\x22\x55\x7a\x5d\x57\xc0\x03\x29\xd1\x64\x7d\xd5\x29\x80\xbc\xce\x6c\x49\x73\x2a\x92\x87\xc9\xac\x51\x0d\x78\x93\xe0\x97\x75\xbb\x47\x6d\xe4\xf6\x16\x9b\xb4\x4d\x69\xdd\x96\x46\x99\x72\xb5\x53\x30\x3e\x6e\x22\xd5\xbd\x6a\x5b\x3a\xe0\x57\x27\xd0\x3f\x38\x91\x95\x69\xef\x0f\x44\x6f\x33\x6e\x4f\x41\xc3\x4f\x06\x84\x92\x19\xd7\x46\x2a\x17\x21\x62\x19\xa0\x51\x54\x68\xfc\xfe\x5e\x5e\xd1\x37\xb4\xfd\x38\x80\x40\x68\x55\x31\xaa\xbc\x9f\xde\xb1\x33\xaa\xc1\x88\x9a\x49\x95\x2f\x05\xcc\x9b\x64\x96\x8a\x63\x4b\x97\x4f\x50\x3b\xa4\xa0\xda\x7c\x0e\x30\x58\x99\x62\x4d\x6a\xdc\x96\x98\xdc\x2b\x36\x6f\xe3\x6b\x58\x4a\xd1\x7c\x29\x09\x15\xce\x50\x75\xdf\x12\x6b\xe1\xd7\xc3\x72\x49\xf3\x6e\x28\x00\x76\x7a\xaf\x9b\x20\xec\x45\xaf\xf8\x34\x90\x97\x4c\xeb\x95\x09\xe5\x0b\x95\x6c\xa0\xe3\x14\x09\x1d\xa7\xdc\xcf\x3d\xb3\x47\xc1\x01\x73\x2b\x7c\x65\xe6\xf9\xfd\xa8\x46\x40\x4c\x40\x33\x48\xb8\x56\xbd\x8e\xac\x9a\x51\xbd\xee\xcb\x84\x5b\x14\x72\x78\xd6\xbe\x0e\x6b\x42\xa3\x18\xd5\xab\x6a\x73\x6c\x12\x04\x3d\x56\x9c\x4d\xc8\x31\x2d\x59\x71\x4c\x75\xca\x9d\x07\xf2\xb0\xca\x54\xc3\x46\xd3\x11\xd9\xff\x14\x85\xc9\x9c\x4b\xf3\x81\x99\xfd\x6e\x7b\xb3\x1e\x21\x78\x54\x12\xd0\x5b\x1d\x79\xf8\xc2\xf7\xbc\xea\xbd\x21\x5c\x71\xb1\x77\xe2\x4a\xaf\xae\x4b\x73\xdf\x35\x6e\x5f\xe0\x5a\x81\x79\x32\xeb\x7a\x91\x1f\xa8\x75\x71\xdf\xe5\x5d\xe7\xda\x6e\xe9\xc2\x6e\x72\x55\x1f\x78\xfb\x30\xc5\xe5\x52\x53\xcf\x9d\x8d\xf8\xdc\x52\xa7\xc1\x57\x14\xc7\xc6\x63\x27\x2a\xae\xad\x92\x97\x52\x30\xda\x6e\xfd\x28\x77\xa8\xf7\x7e\xbf\x42\xf2\x1f\xae\xe6\xf3\x7d\x6b\x53\xe5\xe0\x7f\xb3\x18\xf0\x94\xe1\x72\x27\x7e\x55\x67\x80\x09\xfd\x6f\xe0\x2f\xf4\xee\x07\xc8\x5a\xf8\x71\x60\x24\xa9\x14\xbb\x86\x3c\x0a\x01\xf9\xa1\x8c\x08\xa6\xed\x45\x39\x5c\xb1\xfc\x9a\x2a\xdb\x7a\xea\xda\xc3\xaa\xf4\x83\x6a\x32\x79\xf8\x68\xfd\x43\xab\x0e\x18\xc7\xba\x5a\xe1\x1a\x5a\xf7\x06\xea\xe0\xc3\x3a\xd5\x06\x93\x3d\x28\x60\x6e\x38\xdf\x72\xc3\xf3\xe2\x58\x68\x55\x63\x7f\xf2\x09\xe8\x39\x46\x5a\x64\x96\x2a\x67\xd0\x85\x09\xc9\x7c\x68\x94\x17\x1b\x99\x3f\x2d\xd2\x40\x88\xb9\x6f\x63\x78\xaa\xd7\xaa\x6b\x9e\x6e\xcf\x1f\x2c\x0a\xb7\xf6\x7c\x3b\x50\xe1\xee\x41\x04\x7a\xdc\x92\x57\x38\x1e\xc2\xba\xed\xe3\xdb\x3a\xd5\x4e\x57\xe2\xd8\x23\x15\x1b\xd4\x4c\x5d\xb3\xbc\xe5\x61\x74\xdd\xd0\xda\x9f\x45\xfe\xe8\x66\x7e\xb7\xed\xe4\xbf\xfe\xfb\x7f\xfc\xbf\x00\x00\x00\xff\xff\xe0\x67\x7b\x8a\xc4\xcb\x0b\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x23\xb9\x95\x27\x0c\xff\xef\x4f\x81\x90\x7b\x5e\x49\x63\x91\xaa\xb2\xc7\x7e\x3d\xb5\xb3\xe3\xd0\x56\x55\x77\xeb\xe9\x2e\x95\x42\x92\xdb\x8f\xa3\xdd\x6b\x83\x99\x87\x24\x46\x99\x40\x0e\x80\xa4\x8a\xde\xde\xef\xfe\x04\x0e\x80\xbc\xf0\x22\x91\x09\x48\xcc\xaa\x4e\x38\xc2\x5d\x22\x93\xc0\x49\x5c\x0e\xce\xf5\x77\x68\xc1\x7e\x00\xa9\x98\xe0\x6f\x08\x2d\x18\x7c\xd2\xc0\xcd\x5f\x6a\x7c\xff\x47\x35\x66\xe2\x7c\xf1\xfa\x57\xf7\x8c\xa7\x6f\xc8\xdb\x52\x69\x91\xdf\x80\x12\xa5\x4c\xe0\x1d\x4c\x19\x67\x9a\x09\xfe\xab\x1c\x34\x4d\xa9\xa6\x6f\x7e\x45\x08\xe5\x5c\x68\x6a\x3e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x34\x03\x3e\xbe\x2f\x27\x30\x29\x59\x96\x82\xc4\xce\xfd\xd0\x8b\x57\xe3\xd7\x7f\x1c\xbf\xfa\x15\x21\x9c\xe6\xf0\x86\x24\x59\xa9\x34\x48\x05\x72\xc1\x12\x70\x8f\xa9\xb1\x28\x40\x52\x2d\xa4\x1a\x27\x42\x82\x30\xff\xc9\x7f\xa5\x0a\x48\xcc\x60\x33\x29\xca\xe2\x0d\xd9\xf8\x8c\xed\xd7\xd3\x44\x35\xcc\x84\x64\xfe\x6f\x42\x46\x44\x64\x39\xfe\xdb\xbd\xab\x1d\xfe\xd6\x0e\xef\x26\x08\xbf\xcf\x98\xd2\xdf\x6d\x7f\xe6\x7b\xa6\x34\x3e\x57\x64\xa5\xa4\xd9\xb6\x17\xc1\x47\xd4\x5c\x48\x7d\x55\x93\x65\xc8\x48\xd4\xa2\xf9\x6f\xf7\x20\xe3\xb3\x32\xa3\x72\x4b\x6f\xbf\x22\x44\x25\xa2\x80\x37\x04\x3b\x2b\x68\x02\xe9\xaf\x08\xf1\x63\xd9\xce\x47\x84\xa6\x29\xae\x17\xcd\xae\x25\xe3\x1a\xe4\x5b\x91\x95\x39\xaf\x06\x37\xcf\xa4\xa0\x12\xc9\x0a\x8d\x6b\x72\x37\x07\x9c\x35\x22\xa6\x44\xcf\x81\xbc\xbd\xfd\xa1\x7a\x94\x90\xff\x52\x82\x5f\x53\x3d\x7f\x43\xc6\x66\x01\xc6\x29\x53\x45\x46\x97\x86\x84\xc6\x53\x76\x35\xdf\xd9\xef\x1a\x9f\xeb\xa5\xa1\x57\x69\xc9\xf8\xec\xb1\xf1\xdd\x4b\xec\x46\xc2\xa2\xb1\x4e\xcd\xe1\x7f\x58\xfb\x7c\xd7\xe1\xfd\xeb\x53\x33\x32\xd1\x73\xaa\x89\x9e\x33\x45\x04\x07\x22\xa1\xc8\x68\x02\xea\x11\x82\x36\x3c\x62\x29\xba\x59\xff\x62\x0b\x49\xcd\x2e\x35\xd5\xa5\x1a\x17\x73\xaa\xd6\xa7\xf8\x7a\xe5\xd3\x0d\xdd\xd9\x07\x17\xaf\x69\x56\xcc\xe9\x6b\xf7\xa1\x4a\xe6\x90\xd3\x7a\x0f\x88\x02\xf8\xc5\xf5\xe5\x0f\xbf\xbb\x5d\xf9\x82\xb4\x67\x67\xe3\xee\x27\x4c\x99\xa9\x42\x46\x41\x3c\xa7\xc0\xb5\x5b\x16\x40\xfe\xb1\xf1\x37\xb7\x05\x24\xff\x18\xaf\x51\x2e\x26\xff\x05\x89\x6e\x7c\x2c\xe1\xbf\x4b\x26\x21\x6d\x52\x64\x26\xc8\x73\x9f\x95\x8f\xcd\xfc\x37\x3e\x2a\xa4\x61\x0b\xba\x71\xe4\x6d\x6b\xb0\xbf\xd6\xe7\x2b\x6f\xfb\xf3\x68\xe5\x5b\x42\xcc\x24\xb9\xb7\x4e\x0d\x2f\x04\x85\x3b\xd4\xed\x41\x48\xdd\xcc\xda\x9d\xcb\x94\xd9\x2e\x12\x14\x70\xcb\x1d\x71\x53\x71\xf7\x96\xe3\xb5\xce\xcd\x14\x81\x54\x86\x45\x94\x59\x6a\x98\xe8\x02\xa4\x26\x12\x12\x31\xe3\xec\x9f\x55\xef\x8a\x68\x81\xc3\x66\x54\x83\xd2\x04\xcf\x35\xa7\x19\x59\xd0\xac\x84\x33\x42\x79\xba\xd6\x77\x4e\x97\x44\x82\x19\x97\x94\xbc\xd1\x23\xfe\x44\xad\xd3\xf2\x41\x48\x20\x8c\x4f\xc5\x1b\x32\xd7\xba\x50\x6f\xce\xcf\x67\x4c\xfb\xeb\x21\x11\x79\x5e\x72\xa6\x97\xe7\xc8\xe9\xd9\xa4\x34\xac\xf7\x3c\x85\x05\x64\xe7\x8a\xcd\x46\x54\x26\x73\xa6\x21\xd1\xa5\x84\x73\x5a\xb0\x11\xbe\x0c\xc7\x2b\x62\x9c\xa7\xbf\x96\x6e\x9b\xa8\x95\x81\x37\x9e\x07\xe2\x39\xf4\x9e\x8b\x65\x38\xb6\xdd\x9c\xb6\x43\xfb\xb2\xf5\x9a\x98\x8f\xcc\x34\xde\xbc\xbf\xbd\x23\x9e\x22\x77\xd4\x71\x89\xea\x47\x37\xcc\x90\x5f\x2d\x33\xb3\x8c\x4f\x41\xda\x5f\x4e\xa5\xc8\xb1\x57\xe0\x69\x21\x18\xd7\xf8\x47\x92\x31\xe0\x9a\xa8\x72\x92\x33\xad\x70\x5b\x83\xd2\x66\x21\xd7\x3b\x7e\x8b\xd7\x29\x99\x00\x29\x8b\x94\x6a\x48\xd7\x1f\xb9\xe4\xe4\x2d\xcd\x21\x7b\x4b\x15\xbc\xf8\xda\x99\x35\x52\x23\xb3\x20\x3b\xaf\x5e\x53\x58\x58\xff\xc1\xda\xa9\x27\xc4\xdf\xee\xfb\x2c\xf7\x56\x46\x43\x52\x48\x32\x2a\xad\x80\x42\x34\x64\x19\xf9\xf8\xfd\x07\x32\x17\x0f\xe6\x20\x31\xae\x34\xcd\x32\x3c\x98\x4e\x88\x58\xeb\x1a\xef\x80\x84\x72\x92\x53\x4e\x67\x40\x68\x51\x28\x32\x15\x92\x50\x32\x63\x0b\xe0\x9e\x01\xac\xae\xc5\xd6\xf7\xdb\xc6\xd9\x88\xbd\x91\x36\xde\xaa\xfe\x5b\x47\xf0\xca\x37\xdb\x78\x9d\x69\x6b\xf2\xd9\x7e\x13\x6b\xda\x45\xdd\x05\x1e\x29\x4e\x4a\xae\xb4\x2c\x71\x97\xa4\xe4\x1e\x96\xee\x74\xe5\xb4\x20\x4a\x0b\xf3\xe1\x03\xd3\x73\x42\x9b\x27\x8b\x6a\x3c\x2e\x93\xf5\xd7\x32\x4d\x81\x26\x93\x25\x31\xd2\x28\xb2\x33\x2d\x44\x86\xbc\x0e\xfb\x33\x6c\x8d\x48\xd0\x92\xc1\x02\x08\x95\x13\xa6\x25\x95\xcb\x6a\x6f\xad\x9f\x83\x47\xe7\x1f\xe7\xa5\x21\x1c\x6d\x9f\x3d\xf2\xd8\xce\x26\xf6\x3a\x71\xb2\x59\x5a\xc9\xc7\xdd\x27\xfa\xfa\xd2\xed\xe0\x5a\xd8\x56\x6e\x07\x83\x22\x66\xa7\x3a\xb1\xa8\x92\xda\x91\x00\xb7\x35\x53\x22\x64\xb5\xb7\xc8\x64\xb9\x71\x8c\xc6\x56\x27\x13\x30\x6c\x50\x52\x6e\xa6\x7e\xe3\x11\xea\x30\xb1\x8f\x6d\x46\xd3\xc4\x03\xdf\xb4\xf3\x9b\x7d\x53\x29\xe9\x66\xea\x09\x61\x1a\xf2\x2d\x3d\x93\xd5\x69\x6e\xce\x67\xf5\xb1\x21\x70\xc1\x52\x30\x13\xab\x29\xb3\xbb\xcc\xf0\x04\x3a\x11\xa5\xb6\xf3\xe9\x1e\x49\xc9\x82\x51\x42\x67\x33\x09\x33\xdc\xff\x5b\x87\x7d\x62\x4e\x6c\xdb\x7e\xec\xeb\x36\xb2\x4a\xcd\xa3\x4f\x18\xf6\xfb\xe8\x03\x7c\x13\xf3\x68\x3e\xb0\x2e\x37\xb7\xdb\x53\x6b\x68\x1b\x4d\xcc\x9c\xf8\xa9\x15\xf2\xd1\x87\x77\x59\x5b\xdb\x9e\x58\x61\xdb\xda\xeb\xbc\x42\x88\xfb\x76\x62\xce\x4c\x7d\x01\x18\xce\x81\x0f\xd6\x2c\x7d\x02\xa4\x00\x39\x15\x32\x37\x87\x87\x13\x4a\x12\x2b\xca\x56\x7c\x0b\x19\x2e\x4f\x1e\x9b\x4e\xb2\xeb\xfa\xdb\xb6\xcb\x2e\xb0\x6d\x44\x0a\xaa\xe7\x4f\x3c\xb6\xdb\x52\xd9\xd6\x9c\xb4\x27\x1f\x7e\x82\xf1\xad\xf5\x5d\xdf\x5b\xd1\xfb\x36\xd3\x10\xbd\x53\xbc\xb2\x76\xe9\x75\x17\xce\xbd\xda\x6e\xe8\xc3\x07\x50\xca\xc8\x0b\x28\x84\x4a\xfa\x40\x80\x27\xc2\xf0\x94\xff\xe7\xf6\xe3\x95\x1d\x7d\x13\x77\x5d\x6f\x97\x9a\xb0\xbc\xc8\x20\x37\xb2\x28\xf9\xf1\x03\x95\x6a\x4e\x33\x90\x3f\xe1\xad\xf8\xe3\x9f\x79\xde\xfe\x24\xa1\xdb\x0f\x76\xb3\x19\x21\x53\x41\x6a\xd8\x5f\x0a\x19\x5d\x5a\xc2\x52\x48\x44\x6a\xae\x05\x21\x49\x61\x94\x85\xbc\x28\x35\x10\x6a\xbf\xc5\x77\x60\x7c\xb6\x0b\xe5\x7b\xad\x06\x31\x22\x55\x4e\xf5\x1b\x32\x59\xea\xa7\x4e\x1b\x21\x9f\x46\xe9\xae\x6c\xa7\x49\xcc\xd3\xcc\xc7\xb6\x9d\x58\x50\xb3\xe3\x27\xdf\xd2\xc8\xdb\x94\x71\x90\xd7\x42\xea\x5d\xf8\xa4\x51\xec\x66\xb0\x2e\x8e\x36\x9b\x9f\x32\xc6\xf5\xef\x7e\xfb\xc8\x93\x29\x14\x99\x58\x9a\xfd\xf3\xf4\xf1\xdc\xf1\x7d\x76\x66\x25\xbb\xf6\xb7\x2b\xfb\xd8\xb1\x3f\x6b\x1a\x8c\xd1\xd3\x26\xed\xb3\x53\x47\x3c\xd6\xbb\x55\x0a\xf4\xc1\xee\xdb\xeb\x4b\x6f\xeb\xb9\x81\x29\x48\xe0\x89\xe7\x73\xd5\x9f\x5a\x10\x4a\xbe\x2b\x27\x20\x39\x68\x50\x0d\x4d\x60\x59\x80\x37\xac\x81\xfd\x81\x04\x49\x4a\xcd\x32\xf6\xcf\x4d\xe6\x88\x4d\x6f\x15\xfd\xa6\x7d\x42\xa6\xf2\x8f\x3d\x21\x59\xf9\xc7\x9e\x92\xaf\x6c\xdb\xe7\xea\x7e\x7a\x17\xda\xd6\x5a\x27\x34\x82\x38\x8d\xa1\x5a\x99\xb4\xbd\x14\xd1\x39\xf9\xd3\xdb\x7c\x03\xa5\xd7\x68\x3c\x6f\x19\x9f\xb7\x11\x4c\x4e\xb6\xf9\x25\xc6\x46\xe1\x1f\xa3\x49\xfc\xc7\x9f\xc6\xb6\xcb\xd3\x31\x79\x9f\x17\x7a\xe9\xcd\x40\xec\x89\xce\x99\x22\x5c\xe8\x75\x41\x30\xfa\x34\x2d\x36\x1b\x21\x9f\x9c\xa9\x8b\xeb\x4b\x6f\xde\x7e\xc1\xa5\x55\x05\x24\x3d\x10\xf4\x6f\x5b\x64\xb4\xc4\xfc\x29\x83\x2c\x25\xcc\xc8\xf0\x86\x58\x32\xc9\x44\x72\xef\x2c\xf9\x37\xef\x88\x12\x96\xe7\x18\x45\xcf\x48\xfe\x89\xe0\xaa\xcc\x81\xb0\xa7\x98\xc8\x20\xd9\x0f\x92\x7d\xb3\x0d\x92\xfd\x20\xd9\xb7\x9a\x75\xd2\xf5\x81\x39\xae\x10\xb2\x95\x3d\xe2\x73\x03\x83\x7c\xac\x0d\x0c\x12\xdb\xc0\x20\x07\x06\xf9\x54\xc7\x4f\xbe\xe5\x4e\x92\xee\x93\x7d\x3d\xc5\x3b\x06\xcf\xc1\xe0\x39\x18\x3c\x07\xae\x0d\xd7\xa7\x6b\xc3\xf5\x39\x5c\x9f\xed\xf6\xd9\x5d\x9f\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xd0\x6c\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xb0\xa5\x0d\x92\x7d\xc7\x4e\x07\xc9\x7e\x90\xec\xb7\xb5\xc1\x73\x30\x78\x0e\x06\x06\x39\x30\xc8\x81\x41\x6e\x69\x7d\xf4\x1c\x24\x19\x50\xbe\x59\x9d\x5f\x49\x6e\xc4\xe7\x50\x00\x64\x53\xe6\x52\xfb\xdc\xaf\xc9\x04\xe6\x74\xc1\x44\x29\xc9\xc3\x1c\xb8\xcf\x4b\x25\x33\xd0\xca\xec\x02\xd0\xb0\x49\x03\x7c\x82\xbd\x3d\xce\xd2\x46\x04\x38\x9d\x64\x1b\x3b\x7e\x8a\x7b\xb9\x5f\x3e\xee\x29\x99\x08\x61\xde\x6e\x7d\xc6\x50\x7b\xf1\xda\x40\x84\xa4\x96\x6d\x3a\xd7\xe6\xc4\x96\xb7\x37\xef\x9e\x35\x9d\x65\x63\x27\x97\xd5\xd8\x04\x5d\x38\x98\xf6\x67\xae\x3c\xf3\xe9\xc7\x07\x0e\x29\x66\x81\x9f\x11\xa6\xcd\x03\x86\xb1\xb0\x84\xe9\x6c\x59\x91\xf7\x79\xe7\xc9\xbc\xbd\x79\xb7\xbb\x9b\xcb\xaf\xd2\xd6\xae\x23\x7a\xb4\x06\x7f\xd5\xe0\xaf\xaa\xda\x20\xb4\x75\xec\x74\x10\xda\x06\xa1\x6d\x5b\x8b\x2f\xb4\xf5\xdd\xbf\x33\x78\x65\xc8\xe0\x95\xf1\x8f\x0d\x5e\x99\x27\x1f\x1f\xbc\x32\x83\x57\x66\xf0\xca\x3c\xde\x06\xf9\xd5\xb5\x41\x7e\x1d\xe4\xd7\x76\xfb\xec\xe4\xd7\xc1\x2b\x33\x30\xc8\x81\x41\xd6\x6d\x60\x90\x03\x83\x6c\xb5\xcf\x31\x9f\x63\xb0\x70\x0f\x16\xee\xc1\xc2\x3d\x5c\x80\xc3\x05\x38\x5c\x80\x4f\x75\x3c\x58\xb8\x7d\x1b\x2c\xdc\x83\x85\xbb\xd5\x06\x0b\xf7\x60\xe1\x1e\x2c\xdc\x83\x85\x7b\x4b\x1b\xe4\xd7\x8e\x9d\x0e\xf2\xeb\x20\xbf\x6e\x6b\x83\x85\x7b\xb0\x70\x0f\x0c\x72\x60\x90\x03\x83\xdc\xd2\xfa\x68\xe1\x7e\xe2\xf0\xee\xb2\x4b\x9b\xf6\x6a\x27\x36\xfb\x48\xf7\x31\x79\x4b\x39\x61\x3c\xc9\xca\x14\xf0\x9b\x29\x50\x5d\x4a\x50\x67\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x94\x50\x05\xca\xf5\xb1\x71\xa8\xaa\xdf\x0d\xdf\x3e\xfe\x9a\x8f\xf3\x91\x47\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x9b\x0c\x96\xec\x30\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7c\xed\x6d\x5b\xf0\x91\x2d\xf7\xe4\xe5\xf2\xd4\x95\x32\x22\x13\xaa\xe0\x0f\xff\xb6\x56\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\x8d\x4f\x3c\x7d\xcd\xd4\x43\x6c\xdf\xe4\x3b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\xa5\xed\xe3\x56\x4b\xaa\x61\xb6\x6c\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x4b\x09\x33\xaf\x81\x6e\x1c\xe2\x61\x0e\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x95\xff\xe3\xc7\xd9\xf0\xf5\x53\xeb\xbb\xa9\x82\x92\x6f\xbb\x5e\x90\x7e\x3e\xdf\x59\x0f\xd9\xbb\x0a\x08\x66\x75\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xed\x7f\x65\xd9\xb6\xdd\x51\x3b\xc8\x6a\x4f\xcb\x68\xa3\x06\x8e\xcd\x36\xaf\xde\x2e\xa2\x99\x2b\xc6\x78\x0d\x32\x67\x4a\x6d\x4b\x8a\x6a\x93\xfe\xd4\x2d\xb6\xc3\xed\xb5\x22\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x42\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xe3\xf6\xde\xe1\xee\xdb\x41\x82\xde\x55\x7e\x1e\x59\x3a\x9f\x7c\xca\xbd\xc3\x85\x7d\x85\x8d\x45\xb2\x9a\x6d\x77\x79\x1b\x87\x7f\x5a\x88\xd8\x47\x32\xd9\x59\x2e\xe9\x22\xb3\x5e\x8b\x8c\x25\xcb\x9b\x32\x03\x32\x17\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x33\x32\x29\x35\x49\x05\x58\xb3\xa1\x43\x97\x6a\xfe\x7c\xa7\xf1\xad\xa7\xfc\x61\x6e\x8b\x11\x9a\x8e\x09\x2d\x8a\x0c\x33\x27\x85\x11\x3c\x1e\xe6\x2c\x99\xdb\x1a\xac\x05\x4d\x60\xd3\x63\xbb\xcb\xa5\x3b\xe9\x6a\x64\x2f\x7d\x8d\x78\xb3\xf7\xe4\xa9\x5d\x47\xf6\x54\xdc\x88\x2d\x0b\xf6\x8d\x14\x65\xb1\xe3\xe3\xdd\xf6\x00\xb1\x25\xc3\xec\x40\xe6\x3a\xd2\x2b\x22\x96\xff\xd2\x39\xc9\xed\x52\x2b\x67\x81\x75\x1e\x99\x31\xa6\x3f\xe6\x65\xa6\x59\x91\xe1\x4f\x2c\x02\x96\x22\x54\x42\x7d\xc1\x9d\x11\xca\x97\xde\xe7\xee\x4a\x18\x42\x4a\xe8\xcc\xf4\xa8\xb1\x3c\xaa\x98\xee\x4c\xb5\xad\x91\x58\xe6\x46\xfe\x6a\xd8\x80\x15\xaa\xfb\x7c\x59\x53\x41\x1e\x58\x96\x19\xe5\x87\x66\x99\x78\x80\x74\x4c\x8e\x8e\x56\x2f\xa0\x44\xc8\x06\xdd\xc8\xea\x8e\xfe\xb5\xf5\x94\xe1\x6b\xf5\x8b\xed\xa6\xc8\xed\xab\x85\x90\xfd\x34\x11\xb2\xbf\xce\x45\x50\x95\xba\xaf\x1c\x54\xa3\x8c\x29\x3d\x72\x54\x6a\x91\xb3\x64\xa7\x4e\xb8\xe0\xde\x11\xf1\xe7\x9b\xef\x9f\x7d\x83\x5e\xb5\x87\x73\x35\x39\x41\x9b\x3d\x5a\x50\xa9\x19\xcd\x48\x29\x33\x65\xf7\x28\x35\x0a\x8b\xf4\x55\x50\xe7\x14\xe3\x3c\x12\x50\xc8\x2e\x08\xf9\x57\xbb\x2b\xdd\x66\xb0\xac\x4c\xf0\x6c\x49\xa8\xdd\x0a\xd3\x32\xcb\xce\xc8\x94\x71\x6a\x2e\x32\x28\x7c\x0e\xef\x0e\xa6\x99\xba\xdd\x32\x9e\x80\x99\xa6\x51\xe5\x9b\x40\xca\xcd\xc8\x86\x65\x56\x3c\x2d\x3d\x73\x65\x3f\xad\xa5\x4a\x39\x52\x0c\x7f\x4b\xe8\x24\x03\xd4\x34\x9c\xcc\x79\x23\x32\x74\x29\x56\x7e\x0f\xac\x15\x4a\x9b\x5f\xff\x2f\xc6\x77\xd5\xd6\x6d\xbb\xc1\xab\x3d\xa1\x9c\x00\xd3\x73\x90\x38\xf4\xd2\xf0\x5f\xb3\xd9\xeb\x43\x75\xa2\xca\x64\x6e\xa6\xe8\xa8\x10\xa9\x3a\x32\xdc\xf9\x48\x41\x22\x41\xab\xa3\x53\xf3\xd7\xea\xbb\xe2\x7c\x35\x7f\x77\x4e\x0b\x76\x74\x7a\x46\x70\xc2\xb1\x40\xa9\xd0\xf3\x5f\xf8\x39\xf2\x13\xd6\xaa\xe7\xfd\x54\x6b\x9d\xa2\x9b\x66\x0f\xae\xb2\xa6\x28\x6c\x51\x4a\x73\x7f\x6a\xc0\xb4\x73\x73\x52\x70\xcf\x35\x7c\xd0\x2b\x17\x29\x21\x17\x9c\x80\xf5\x1a\x82\x26\x39\x50\xee\x9e\x86\x05\xc8\xa5\x9e\xa3\x23\x51\x55\x5c\x74\x58\xb9\x1d\xa2\x11\xea\xb6\x71\xd5\x1c\x2b\xf3\x2b\x54\x1f\x37\x5b\xfc\x79\x75\x85\x8e\xff\xf5\x78\xf5\x4a\xaa\xef\xe0\x5f\xf6\x7a\xa0\x10\xd6\x69\x2d\x7e\x30\xbf\x6c\xaf\x83\xfd\xc8\x5e\x26\x15\x3b\xfc\xfe\x7b\x5b\xec\xd9\x4d\xf8\x77\x8c\xa7\xaa\x02\x56\x4d\xed\x2d\xe1\x16\x6d\xe3\x4a\x21\x85\xbf\xd8\x55\x5a\x57\xba\x76\x55\x94\x9e\xa0\xb1\xa1\x95\xf7\x41\x91\xc6\x7a\xd1\x2d\x29\xd9\xb0\xdd\x33\xeb\x9d\x37\x62\x65\x46\x27\x90\x29\x67\x40\x84\x06\xf9\xe4\xe2\xfb\x0f\x55\xe9\x76\x09\xf4\x09\xa3\xf8\x33\xa8\xcf\x3b\x84\xf9\xac\x95\xc8\x5f\x6f\xbb\xab\x39\x38\x15\xfb\x39\xb1\xc8\x2d\x68\x7b\x56\x73\x5a\x98\xa3\x6a\xfb\xb0\xce\x95\x15\xc7\xc9\xf7\x38\xd3\x4f\x9f\xb8\xbd\xd4\xc3\xdd\x4b\x3e\x6f\x1a\x64\xa7\xf3\xb6\x5b\x28\xd1\x1e\x1d\x3e\x66\xca\xab\x5b\x6b\x9a\x57\x36\xb4\xd3\x0b\x9d\x26\x97\xd0\xa6\x43\x21\x05\x65\xc1\x75\x2c\xc0\x91\xf4\x9f\xd7\x5d\x44\x5e\x82\x7d\xf4\xf3\x11\x51\x90\x41\xb2\xa9\x26\xfb\xa6\x87\x35\xe4\x45\xf6\xd4\xc9\x23\x7b\xeb\xf2\x39\xe3\x37\x40\xd3\xe5\x2d\x24\x82\xa7\x3b\x72\xe9\x6e\xca\xd2\x07\xc6\x59\x5e\xe6\x84\x97\xf9\x04\x70\x2d\x94\x1d\x14\x39\x8e\x35\xa8\x50\xc2\xe1\x21\x5b\x3a\x2e\x93\x92\x42\xa4\x9e\xf1\x4c\x8c\x56\x4f\xd3\x5d\x2f\x9d\x07\xa6\xe7\x58\xb6\x82\x2f\xcd\x50\x4c\xd7\x37\xa2\x24\x89\xa4\xca\x08\x8d\x67\x38\x34\xd3\xe6\x16\x9d\x00\xba\xd8\x59\x0a\x66\xcb\xd0\x05\x65\x99\xd1\x72\x76\xbd\x16\xdf\xc1\x94\x96\x99\x46\xfb\xd0\x2b\x72\x62\x08\xf7\xca\xfd\xa6\x6e\x8d\xde\xa1\x84\xe0\xe6\xbf\x16\x76\x09\x5f\xee\x74\x0f\x3f\xdf\x2e\x40\xe8\xbe\xed\x0a\x88\xee\x5b\x41\x4b\xb5\xab\x99\xa9\xb5\x1b\x2e\x79\x6a\x0e\x61\x53\x9a\x6f\xdc\x23\x4c\xb9\x9e\x77\x9b\xd5\xc7\xa1\xbc\x36\x50\x2d\xc5\x4c\x82\x52\xef\x80\xa6\x19\xe3\xf0\x02\x9b\xfa\x6e\x0e\x24\xa7\x9f\x70\x63\x6b\x96\x83\x11\xb6\x9a\xdb\x9a\x36\x5f\x5f\x0b\x92\xd3\x7b\xa8\xe8\x24\x13\x98\x0a\xb9\x43\x48\x87\x6f\x4c\x35\x37\x93\xdd\xb4\x53\xca\x32\x48\xc7\x48\x49\x63\x2c\xb3\xd9\xa5\xc8\x32\x90\x76\x1f\x9a\xbf\x19\x2f\x81\x68\xb1\xe3\x60\x85\x14\x68\x9a\xb0\x03\x34\xa5\x19\x94\x16\xa8\xe9\xd2\xde\x38\x78\xd8\x08\x25\xd7\x2b\xf3\xff\xfe\x53\x82\x46\xf8\x1d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x94\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x93\x2b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x3b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xf3\xde\x6d\x9d\xf5\x3f\xbc\x7a\xb5\xa3\xe8\xfc\xfc\xa7\x56\x02\xda\x66\x9e\x75\xc3\x5f\x55\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xac\x64\x6a\x4e\x26\xa0\x1f\x00\x38\x81\x4f\x16\x5e\x6e\xc7\xf1\xfe\x09\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xba\x3f\x0b\xb0\x60\x8a\x09\xfe\x2d\x53\x5a\xc8\xe5\xf7\x2c\x67\x4f\xd4\xb4\xf0\xad\x3b\xf7\xa9\xaf\x53\x91\xa5\xe4\xc6\x6e\x81\x5b\xb0\x33\x23\x01\xdd\x1f\x5a\x58\xdb\x08\x31\x1c\x61\x42\x93\xfb\x5d\x6f\xb5\xbd\x57\x75\xdb\x7a\x75\xb8\x45\x5f\xbf\xea\xcb\xb2\x7a\x41\xed\x39\x97\x12\x55\x82\x6a\x24\xbc\x3b\xec\xc1\x7a\xff\xc9\x4e\x77\x6b\x69\x1f\xe6\x42\x01\x3e\x40\xa8\x7c\x5a\x26\x6c\xbe\x86\xf7\x89\x32\x55\x71\x5a\x8c\x57\xe1\xa0\x08\x9d\x4e\xdb\x4f\xa4\x7b\x48\xca\xb6\x5d\x6a\x92\x97\x4a\x93\x9c\xea\x64\x6e\xad\xd3\x22\xad\xa4\xd7\x63\xe5\xb4\xcc\x7d\x96\x76\x67\xf7\xd8\xfe\x8e\x2c\x62\xe9\x7c\xff\xa9\x30\x97\xc7\x53\x2e\xef\x76\x6b\xad\xf3\x6a\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\xbf\xb8\x7a\xb7\xfb\xa9\xe9\x62\x94\xd9\xdb\x2c\xd3\xdd\x47\x62\xda\xc5\x23\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x75\x46\x28\xb9\x87\xe5\x99\x95\x3c\x1a\xa0\xa8\xe6\xe1\xbd\x08\x91\x90\x39\xf1\x14\x4c\x8f\xd8\xa1\x1d\x63\xf7\xd9\xee\xb0\x31\xfd\xe0\xfb\xf8\x6f\x7d\x1b\x19\x42\xf7\xfc\x85\x9f\xa0\x3d\x7e\xb6\xff\xd9\xb1\xed\x1e\x96\xfb\xfd\x60\x65\x27\x99\x55\x70\x5a\xbc\xdd\x23\xe6\x83\x4a\x7b\xa8\xb6\xc5\x7e\x8e\xf5\x66\xeb\x60\x50\xb4\xcd\x4f\x62\xd0\xeb\xed\x79\x50\x9a\xe3\xb6\xec\xb4\x66\x5a\x8e\x95\xdd\xbf\x86\xc3\xcc\x59\x61\x73\xfa\x9c\xb7\x71\xff\x4d\x6c\xdb\x0f\x34\x63\x69\x35\xa4\xe5\x3e\x97\xfc\xcc\xc8\xd6\xe6\x3f\x78\xfd\x58\x89\xff\x9d\x00\x75\x25\x34\x7e\xf2\x62\x6b\x60\x5f\xeb\xa5\x57\xc0\x8e\xea\x9c\x56\xc8\x56\xd1\x5e\x61\x53\xd6\xdc\x4c\x7b\x5c\xe5\x3a\xd2\x53\x91\x4b\x4e\x84\x74\x53\xb7\xf7\xa0\xa6\x33\x37\xb0\x1d\x12\x2f\xd2\x89\x75\xd6\xa2\xfb\x6b\xe3\x98\x6e\x85\x84\x6c\x2d\x50\xc4\xe1\xdd\xd0\x28\x0b\xda\x6f\xd0\x5c\x51\x64\xa8\x9d\x39\xa5\x89\xfa\xd0\xaa\x1d\xbd\x22\xcd\x96\x83\x9c\xa1\x17\x3b\xd9\xd9\xeb\x5a\x11\xdd\xe1\xe2\xb3\x6d\xef\xeb\xaf\x39\x60\x87\x8d\x1c\xc5\x97\x14\xad\x1b\x94\x57\xac\x19\xba\xa3\xc4\xb3\xd7\xa9\x6a\x0c\xd7\xb2\x91\xff\x1f\x73\xa9\xe3\xa6\xfb\xbf\xa4\xa0\x4c\xaa\x31\xb9\x20\x8a\xf1\x59\x06\xad\xef\x9c\x09\xa0\xd1\xcd\x5e\x83\x17\x66\x50\x73\xf7\x2e\x68\xe6\x0c\x31\x94\x13\xb0\xe6\x78\x43\xc7\xaa\xf8\x76\xe6\x24\x6c\x73\x15\x55\xf1\x0f\x47\xf7\xb0\x3c\x3a\xdb\x1a\x66\xbe\xb9\x35\x4f\xea\xd1\x25\x3f\xb2\x22\xcc\xda\x59\xab\xe4\x1d\x0c\xb2\x38\xc2\xef\x8e\x62\xca\x86\x7b\xca\x2a\x5d\x9d\x09\xed\x41\xf7\x38\x26\xad\x5d\x9d\xd3\x62\xdf\x4d\xed\x03\x3b\x3b\xe8\x68\x77\xab\xc6\x25\x17\x01\xad\x05\x29\x15\x58\x35\x1a\x99\x1d\x01\xaf\x8b\xa1\xe6\x85\x56\x2f\x0e\x0f\xa8\x3b\xf5\x46\xa1\x31\x2a\x3e\xe3\xb3\x3f\x17\x29\xd5\x3b\xe5\x14\xd9\xd6\xfd\x6c\xdf\xd8\x01\x49\x89\x23\x9a\x9d\x3c\x65\x33\x52\x50\x49\x73\x35\x26\xd7\xae\xdc\x00\xee\x6b\x36\x6d\xba\x6f\xdc\x3c\xdf\x2d\x0b\x20\xff\x73\xff\x01\xed\x1b\x3e\xf3\x39\xe8\x26\x14\xe7\xf4\xd3\x6d\x29\x67\x7b\x4c\x3f\x09\x16\x5a\x9a\x96\xe8\xda\x26\x84\x1b\xb5\x09\x22\xa4\x92\x39\xa4\x65\x06\x29\xa1\x13\xb1\x80\x96\x9f\xac\xfa\xd9\x9e\x43\xa3\xa1\x62\xcf\xdf\xfc\x60\x38\x9c\x27\xca\x08\x59\x13\x25\xb2\x52\x57\xf6\xac\x13\xf8\xf4\x86\xfc\x1e\xe3\xb7\x28\x29\x40\x26\xc0\x35\x9d\xc1\xaa\xe1\xd1\x3e\xf7\xfa\xd5\xbf\x9c\xee\x4b\x00\x8a\x33\x66\x7c\x67\x06\x7e\x65\x76\xe7\x07\xfa\xe9\xcf\xbc\x76\xd2\x30\x45\x76\x34\x42\xd5\xed\x62\xe5\x45\x70\x94\x2c\x29\x33\x34\x31\x63\x5c\x5c\xe3\x75\x26\x4b\x22\x45\x89\x91\x71\xa4\x2c\xf6\x1d\xab\x69\x2e\xfb\xed\xef\xff\x65\xdf\x9f\xbf\xff\x44\xf3\x22\x83\x37\xbe\xee\x8b\xb5\xf5\x19\x7d\x42\x0b\xf2\xbb\x57\xff\x72\x66\xa3\x04\xe0\xa1\x61\x7b\xaa\xf7\x11\x35\x9b\xa8\x2c\x08\xcb\x6d\x9e\x0c\x64\x4b\xec\x68\x5f\x09\xce\x5c\x71\x6d\x16\xa2\x34\x95\x5a\x9d\x11\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x56\xcc\x9d\x68\x68\x84\x07\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x93\x8a\xd7\xbf\x7b\xf5\x2f\xeb\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x09\x00\x27\xf7\x2c\xcb\x20\xdd\x57\xc4\x7e\x6a\x22\xa7\xa5\xd4\x73\x90\x67\x04\xb8\xf2\x9e\x08\xf3\xee\x2b\xef\x8d\xb4\xc8\x92\xf3\xfd\x25\x50\x6a\xfd\xa1\xe8\xdc\x68\x38\x3b\xdc\xb4\x1b\xc1\x4c\x93\x5c\x28\xbd\x79\x3a\xf6\x1a\x8c\xf2\xe5\xc7\xe9\xbe\xe2\xf5\xa8\x83\x31\x77\xfd\xd7\x1d\x84\xf3\x96\xf4\xc1\xb8\x1e\x09\x39\xb2\xdd\xbc\x21\x5a\x96\xfb\x08\x7c\x79\x8b\x85\xf4\xf0\x06\x28\x1b\x0c\x6e\x6d\x13\x7c\x76\x6c\xbc\x3b\xbb\x4d\xc5\x03\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x11\x16\xde\xf6\x0c\xad\x70\x1e\x33\x0f\xe6\xe9\xff\xff\xfa\x91\xdf\x57\xa5\x5e\xb9\x09\xb6\xf3\x76\xc7\x5a\x2b\xd6\x6d\xd4\x1a\x0c\x80\x38\x5b\xa1\x75\x4f\x0a\x36\xbc\x59\xc5\x55\xa7\xc2\x86\x07\x9b\x4d\x60\x1e\xb0\x44\x6d\xb8\xe2\x6a\x06\xbc\xf7\x55\xb6\xe5\xaa\xb2\xef\x58\xc7\x7e\x68\x0c\xbb\x34\x6c\x58\x6d\xe3\xc3\x7b\x0e\x9d\x01\x55\x7a\xd3\x12\x0e\x5c\xfb\xc9\xf6\x78\x86\xef\x6a\x6b\xab\x8e\x46\x77\xc1\x19\xaf\xfc\x64\x98\xbc\x3e\x01\x72\x74\x03\x36\x8a\xc9\x66\x24\xb4\x94\x96\xa3\xca\x7f\x6d\x16\x3b\x48\x9f\xd9\x79\xda\xbc\x0b\xee\x59\xfd\xd1\x6e\x8c\x46\x76\x9e\xf3\x00\xba\x2b\xa8\x0a\x89\xb2\xf1\x5d\xbb\xbb\xa1\xc1\x65\x9f\xb8\x23\xec\x5f\x66\xac\x0a\x48\xc6\x12\x90\xab\xd8\xa4\x41\x6b\x57\x41\x73\xcb\x45\xf6\x40\x97\xea\xa8\x37\xaa\x79\x0e\x9a\x3e\x9e\x94\xbe\xda\xba\x0b\x04\xb7\x9a\xf2\x94\xca\xd4\xbd\xd1\xb1\xaa\x46\xdf\x87\x23\x7c\xc0\xf0\x24\x3e\x15\x6f\xc8\x5c\xeb\x42\xbd\x39\x3f\x9f\x31\x3d\xbe\xff\xa3\x1a\x33\x71\x9e\x88\x3c\x2f\x39\xd3\xcb\x73\x8c\x36\x62\x93\x52\x0b\xa9\xce\x53\x58\x40\x76\xae\xd8\x6c\x44\x65\x32\x67\x1a\x12\x5d\x4a\x38\xa7\x05\x1b\x25\x82\x2f\x80\xa3\xff\x62\x9c\xa7\xbf\xf6\x24\x3d\xaf\x0e\xdf\x62\x13\xe8\x50\x91\x0b\x18\x95\xfc\x9e\x8b\x07\x3e\x42\xf3\x9e\xda\x8b\x61\xec\x16\xb5\xea\x5b\xc0\x1a\xee\x13\xd4\x5a\x88\x3d\x6c\x82\xcf\xbe\xb2\x66\x8a\x46\x94\xa7\x23\x1b\xaa\xf5\xbc\x0b\xdc\xc5\xad\x3a\xaa\xc3\x41\x77\xa7\xae\x9b\x35\x88\x26\x9a\x2d\xa0\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x12\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\x2e\xf6\x08\x1d\xf4\xed\xd6\xb0\xe5\x3b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x95\x86\xdc\x5e\x05\x76\xb4\x6c\x49\xb4\x5c\xda\xf0\x48\x79\x4f\x98\xf6\x31\x87\x46\xbd\xbf\xc7\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5f\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xfe\x6d\x9f\x7d\x34\x45\x60\xcd\x3d\xbd\xed\xed\xf0\xdc\x69\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8e\x25\xb1\xb9\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x5e\x74\x9a\x14\xb2\x9e\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x9e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x50\xdf\xb8\xad\xde\xeb\x72\xc6\x45\xf5\xf1\xfb\x4f\x90\x94\xbb\x62\xb2\xad\xb7\x50\xb7\xbb\x6d\x46\xda\xf3\x66\x6a\x17\xbd\x6c\xa9\x37\x1c\xc2\x7f\xe1\x84\x4a\x81\xeb\xe5\xa4\x4b\x45\x35\x53\xd3\x7d\x1d\xc1\xbe\x99\x55\xad\xd6\x1d\x1a\xa1\x5c\xd5\x89\xa9\xc2\xe2\x50\x66\xb0\xf9\xd9\x4c\x23\xe7\x4c\xe6\x42\xa8\x7d\xcc\x44\xcd\x46\xed\xa6\xc3\x77\x58\x30\x61\x03\x94\x10\x73\x40\x92\xdc\xb0\x4d\x77\xc5\x37\x88\xb2\xae\xc1\xfa\x67\x6c\x5f\x5d\xdd\x37\x34\xf7\x55\x9b\xc3\x07\xe2\x98\xc1\xd1\xbd\x65\xfe\x98\xa1\xb0\xae\x34\x51\x65\x6e\x48\x79\x00\x36\x9b\x6b\x75\x46\xd8\x78\x6f\x7b\x91\x6f\xe6\x18\x01\x4d\xe6\x8d\x57\xc8\x01\x74\xab\x58\x76\xf3\xec\x35\x7d\xa0\x27\x8f\x42\x1a\x3d\xdd\x1c\xbe\xc3\x59\x25\x37\xac\x1e\x89\x8d\xdb\xe0\x8c\x80\x4e\xc6\xa7\xfb\xc7\x55\xd8\x56\x83\xd7\x99\x59\x9c\x2c\x09\xd3\x60\x2e\x63\x54\xfd\xa5\x28\x67\x76\xae\xc1\xa7\x88\xe1\x1c\x54\xd9\xf7\x18\xf6\x96\xa6\xfb\x9b\x24\x7c\x3b\xb2\x8b\x76\x64\x4e\x0c\xce\x6d\x99\x7b\xe8\x65\x5c\x01\x74\x80\x43\x85\x38\x21\x41\x15\xc2\x9a\xc9\x56\x5d\xe3\xff\x63\x4f\x07\x78\xb3\x99\xa1\x4e\xd4\x69\xbd\xb5\xe6\x6c\x36\xf7\x3b\x8b\x3a\xf9\xa0\xbd\x23\xbb\x6d\xb0\xee\x61\x21\xb6\x75\x0c\x0e\xb1\x2d\x0e\x17\x6c\x24\xbd\xd7\xc7\xb3\x71\x24\x34\xc8\xbc\x5a\x36\x3c\x35\x78\xad\x38\xb7\xb4\x2f\xe2\xee\x0e\x2b\x79\xd5\x99\x8a\x13\x73\xca\x09\x33\x1a\xa4\xe1\x53\x23\x51\x9c\x8e\xc9\x05\xe1\x65\xc5\x96\x1f\x23\x8c\x8b\x8a\x2e\xd7\x91\x21\x56\x89\xba\xaf\xae\xdc\x3a\xe4\x2a\xb5\xad\x5b\x34\x66\xb3\x8d\xdc\x0c\xc0\xd3\x65\x57\x1e\xeb\xc4\xae\x51\xc7\x0e\xc2\xc4\x02\xdf\x87\x7f\x8b\xee\x7d\xac\xc2\xa2\x5b\xbe\x52\x47\xf5\x82\xcc\xcf\x9a\x72\x7c\xc5\x03\xda\xec\xc6\xce\x45\xd7\x5d\x41\xe2\xec\x0c\x12\x69\x5e\x49\x50\x80\xf9\xe6\xb6\x32\xcb\x15\x84\x46\x6b\xb6\x5b\xf7\xe5\x64\x89\xdf\xee\x19\x7b\xbf\xbd\x85\x32\xd7\xba\x05\xb1\xd9\xba\xc5\x62\xb8\x75\x5b\xdd\xbd\x71\xa2\xd5\x23\x10\x86\xc3\xc5\x89\x61\xdf\x32\x40\x9c\xd3\x63\x5b\x38\x87\xad\xdb\xfe\x51\xf0\xdb\xfa\x89\xb6\x1c\xb1\x58\x84\x6d\x1d\xe2\xe8\x37\xb7\xb5\xe0\xb6\xe7\x09\xab\xdf\xdc\x02\xe2\x63\x37\xb5\xae\x21\xf8\x9b\x5b\x7c\x46\x61\xda\xcd\x0b\x44\xe9\x6f\x6e\x3b\xc5\xee\x9f\xb5\x03\xf7\xc9\x37\xda\x32\xa6\xef\x83\x6e\xd9\xba\x45\x5e\xf1\x6e\x01\xff\x9b\xdb\xf3\xac\xf7\xc5\xcb\xa5\x04\x6c\x6e\x07\x4e\x14\xd8\x93\xa8\xed\x04\x7d\xa3\x0d\x31\xdf\xeb\xb3\xc6\x8f\x23\x51\xd3\x20\xc1\xc2\xec\xf9\xa8\x72\xa7\x60\x9f\x39\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xf6\xb6\x73\xf6\x44\x48\x36\xc4\xe6\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xc5\x3b\x47\x3d\xe1\x6b\xeb\x8c\x3c\xa0\x8a\x60\xdd\xa1\x83\x8a\xf0\x64\x1b\x54\x84\x41\x45\x78\xba\x0d\x2a\xc2\x7a\x1b\x54\x84\x41\x45\x08\x6a\x83\x8a\xf0\x64\x1b\x54\x84\x27\xdb\xa0\x22\xd4\x6d\x50\x11\xfa\xaf\x22\x84\x66\xc8\x6e\x6e\xd6\xdf\x12\xcd\xed\xf3\x17\xeb\x6e\x5c\xf5\xf3\xa0\x72\xe3\xc3\xdc\xdb\x0e\x1f\x23\x45\xdf\x3a\x51\xe3\x0e\x9d\x44\x2e\xd9\x5b\x52\x3e\x03\xf2\x7a\xf4\xfa\xd5\xde\x49\x15\xcd\x16\x12\x9b\xde\x6c\xfb\x82\x46\xad\xb7\xe8\x3b\x63\x5b\xfc\x42\xff\x42\x7a\x1c\x67\xaf\xe2\x2a\x5a\xca\xe7\x96\xf8\x9a\xaa\x22\x41\x0e\x7a\xff\x84\x08\xdf\x9a\x8e\x69\x96\x43\x15\xf4\x66\xd9\xba\x4b\xe3\xa9\x93\x62\x05\x77\x01\x12\x66\x5b\x76\xdd\x76\x9d\xde\x36\x01\x6a\x93\xcd\x27\x60\xde\xb8\x6b\x28\x91\x26\x4a\xe4\x60\xe1\xda\xfc\xd5\x61\x5e\x17\xfc\x36\x20\x27\x30\x9e\x8d\x49\x5a\x82\x83\x41\xb0\x59\x27\xa7\x67\x8d\xe0\xcc\xae\xb1\x44\x46\xe0\x91\xf8\x1f\x33\xb1\x2e\xa6\x13\x16\xc0\x75\x49\xb3\x6c\x49\x60\xc1\x12\x5d\xad\x00\x26\x67\x31\xad\x02\xe6\x3a\x58\x15\x0d\x55\x3f\x47\x6b\xfc\xab\x9b\x78\x12\xae\x27\xae\xd1\xd1\x9d\xa7\xaf\x14\x04\xb0\x33\x34\xde\x6a\x49\xd2\x66\x34\x1b\x90\x86\xff\xc4\x83\xfb\xf1\xa6\x6b\xec\x0e\x89\x24\x8f\x04\xcb\x20\x31\x55\x03\x17\x30\x23\xa4\x0b\xe9\x59\x9f\xc1\x0d\x21\x33\x1b\xf0\x3f\xf6\xce\xcd\x6f\x37\x3d\x87\xbc\x0b\x86\xc8\xa6\x66\x68\xbb\x13\x85\xc8\xc4\x6c\xd9\xdc\x78\xae\x6e\x7f\x8d\x76\x4e\x89\x2a\x27\x4e\xb9\x35\x67\xff\x6a\x65\xa7\x0e\xc1\x1e\x5b\xdb\x10\xec\xb1\xd6\x06\x4b\xee\x60\xc9\xdd\xa3\x9f\xc1\x92\x3b\x58\x72\x07\x4b\xee\x60\xc9\xed\xda\x06\x4b\xee\x5e\x44\x0d\x96\x5c\x32\x58\x72\xb7\xb6\xc1\x92\xeb\xda\x10\xec\xb1\xb1\x0d\x2a\xc2\xbe\x6d\x50\x11\xc2\xfb\x19\x54\x84\x41\x45\x18\x54\x84\x41\x45\xe8\xda\x06\x15\x61\x2f\xa2\x06\x15\x81\x0c\x2a\xc2\xd6\x36\xa8\x08\xeb\x1d\x47\x0b\xf6\x78\x06\x72\x63\x12\x5a\x88\x34\x3a\x9c\x4b\x21\xd2\x47\xd0\x5c\xac\x2f\x3c\x11\xa3\x4c\x24\x14\x6b\x09\x32\xfb\x13\x17\x83\xa2\x68\x6e\x43\x01\xce\xc8\x3f\x05\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x03\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x07\x34\x98\x5d\xda\x80\x06\x33\xa0\xc1\x0c\x68\x30\x2f\x8b\x06\x33\xa7\xca\x95\xb8\x40\xa1\x68\x3b\x38\x4c\x83\x63\xdf\x81\xcc\x07\x6c\x98\xa7\xda\x9a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\xaf\xdb\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\x91\x3d\x3c\x82\x4c\x99\xab\x30\xb3\x72\x9a\xdd\x0c\x77\x65\x88\x3d\x01\x5c\x69\xcf\x44\x40\x4f\x87\x47\x5d\x69\xbf\x4a\xb4\x50\xa5\x66\xc4\x56\x4b\xfc\xf9\xec\x30\x58\xe2\xd8\x0b\x47\x44\xbb\x30\xa5\xef\x82\x2c\x86\xb1\xcc\x7b\x68\x7e\xbb\xdd\xab\xa6\xec\xf6\x16\xdb\xa4\xe1\x0b\x75\xfe\x77\x09\x72\x49\xc4\x02\x64\x6d\xac\xf2\x37\xad\x72\x31\xda\x88\x85\xef\xea\xd0\x86\xab\xa6\x97\x53\x8b\x32\xc5\xcb\x2c\x3b\xb3\xbd\xaf\xb2\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\xf4\xac\x62\xed\xf6\x16\xd7\x3c\x11\xd1\x38\xf1\x4c\xd6\xc3\xbe\x54\xc6\xdd\xde\x9e\xd3\xbf\x44\x62\xfb\x98\x48\x64\x3f\x13\x89\xe8\x6b\x22\x71\xfd\x4d\x24\xba\xcf\x89\xc4\xf4\x3b\x91\x17\xaf\xf4\xbb\xbd\x45\x37\x2b\xc6\x76\x45\x91\x67\x63\x30\xe4\xa5\x2b\x0a\x6f\x6f\x2f\x53\x6b\x78\x7b\x7b\x86\x5d\x10\xd3\x3d\x45\x9e\x75\x0f\x1c\xa4\xa6\xf1\xf6\xd6\x4b\xa7\xd5\xa3\x84\x3d\x7b\x1d\xe4\xed\x2d\xba\x0f\x88\x3c\x83\x1f\x88\xc4\xf6\x05\x91\xe7\x39\xb2\xcf\xec\x13\x7a\x81\x01\x3a\x55\x6f\xde\xde\x9e\x83\xe7\x1c\xb4\xe2\xf3\x63\x64\x1d\xb0\x16\xf4\xf6\x76\xf8\x2a\xd1\xdb\x5b\x64\xe9\x3c\xb4\xb2\xf4\x53\x84\x46\x61\x15\xcf\xe3\x7e\x25\xad\x73\xf1\x1d\x2c\xe3\x06\x7f\x46\x38\xb9\x1f\x5a\xd4\x79\xf5\x53\xbb\x1a\x76\xb5\xd4\x8e\xbe\x36\x2b\xb0\x3b\x1f\x81\xab\x88\x9d\x65\xc1\x34\x4c\x80\x68\x7a\x0f\x18\x71\x21\xb0\x1c\x09\x4b\xc1\xd6\xad\xb1\x5b\x1d\xc7\x37\x5b\xbc\x54\x90\x1a\x42\x32\x21\xee\xcb\xc2\x1f\x15\x4c\x2b\x8e\x71\x30\x19\x4f\x44\xee\xf3\xa7\x6d\x36\x9d\x39\xf1\x8e\x17\x8c\x6c\x9d\x31\xfb\x39\x92\x83\x97\xb4\x33\xaa\xfe\xa3\x65\xe4\xfb\x07\xa1\x8a\xfc\x03\xd5\x1f\x4e\x4e\xf0\x87\xa7\xff\x08\x0f\xcd\xac\x96\xc0\xfa\xe5\x44\x89\x1c\x76\xa5\x48\x79\x7b\x75\x1e\x9b\xdd\x60\x82\x7c\x6d\x94\xe6\xc4\x1d\x5b\x7f\xfa\x09\xe5\x9a\x9d\x56\xa6\xe8\x31\xc1\xfd\x85\xba\x5f\x2a\xf8\xb1\xb6\x54\x7b\xae\xef\x3b\x08\x8f\xc8\xac\x56\xae\x8e\xec\xb1\x1e\xee\xb1\x2b\xfb\x6e\xab\xf0\x55\x35\xe3\xac\x8c\x17\x3c\xee\x9d\x8f\x1d\x70\x2a\xef\x54\xc8\x09\x4b\x53\xc0\x42\x9b\xd5\xab\x4e\x84\x87\xc6\xa8\x8f\x9c\xe1\xfb\xad\xbd\x13\x4e\xcc\x45\xa6\xc4\xd9\xea\x38\x09\xe5\x1e\xfc\x00\xb4\xad\xd6\xd9\x1a\x96\x30\x65\x96\x45\x41\xb0\xfa\xd5\xbb\xf0\xf0\xe7\xba\x27\x22\xa7\x08\x30\xd5\xf3\xbb\x62\x95\xc0\xe1\xba\x88\x7e\x5d\x70\xa1\x87\x1b\x63\xb8\x31\x56\x6e\x8c\xb5\x83\xf7\x7c\x97\xc6\xda\x50\xc3\xbd\xd1\xf3\x7b\x83\xd3\x1c\x54\x41\x13\xf8\x8c\x3c\xcc\xd6\xfc\x6f\xf3\xd6\x3c\xf9\xaa\x51\x4e\x1b\x64\x1e\xd5\x2b\xe0\xa1\x6a\xf0\xc6\xc2\x7e\x53\x1f\x0a\x55\xf2\x46\xad\xd5\x06\x31\x96\x6f\xae\x46\xfd\x05\x53\xe2\xd5\x7c\xc1\x41\xa1\xf3\x15\xaa\xd8\xd3\xc6\xe0\x38\x56\xf8\x6b\x23\x04\x4d\xed\x66\xe1\xe9\x2a\x28\x4d\x3d\x22\xfa\x81\x73\xa0\x5c\x91\x23\x1f\x14\x7b\xac\xea\x27\x76\x2c\xaa\xfc\x58\xab\xca\x5b\x55\x14\x9d\xfc\x9f\xff\x7b\xda\x2a\x69\x55\x13\x34\x78\xf9\x77\x6e\x83\x97\x3f\xa8\x0d\x5e\xfe\xc1\xcb\x1f\xa3\xaf\xc1\xcb\x3f\x78\xf9\x37\xb6\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\xe0\xe5\x5f\x6f\x83\x97\x7f\xf0\xf2\x37\xda\xe0\xe5\xef\x4e\xd6\xe0\xe5\xdf\xb3\x0d\x5e\xfe\x98\x5e\xfe\xda\x70\xd1\x37\xeb\x5b\xd3\xa4\xe5\x32\x59\x51\xfb\xd4\x54\xb3\xa4\x46\x8f\xf2\x4f\xd9\x7f\xf5\xcb\x14\xd7\x34\x93\x3d\x8f\x21\xae\x69\xec\x5b\xb3\xa7\x46\xb2\xc3\x6d\xb5\xba\x55\x76\xb9\xb5\x91\x9f\xd5\x20\x37\x98\xdb\xbb\x51\x59\xa7\x96\xf5\xed\xa8\xdf\x79\x30\x03\x35\x17\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd5\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x65\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x7b\xe4\x4a\xcd\x17\x63\x0a\xf7\x07\xcd\x32\xf1\x10\x2e\x6d\x44\x39\xd7\x91\xcb\xd6\x04\x9e\xb6\x87\xbd\xab\xde\xac\xe4\xfe\x86\x69\xb6\x43\xc1\x9c\x1d\xdb\x50\x30\xe7\xe9\x36\x14\xcc\x79\xbc\x60\x4e\x23\xb2\xa9\x59\x39\xa7\xeb\x6c\x63\xbd\x9d\x03\x54\xce\x21\xe4\x2f\x73\x40\xbe\x21\xc1\x86\x23\x95\x99\x66\x45\x8d\x88\xa6\xec\xca\x67\xd6\x10\x37\x75\xc8\x3a\x6d\x2e\x66\x68\xa4\xc9\xbc\x23\x01\x2b\x3c\x10\xa9\x40\xdc\x35\x85\x37\x9b\x45\x94\x41\x3f\xb0\x2d\x2b\xe3\x2d\x74\x16\xd8\x87\x7d\xfe\xf8\x1f\x01\xb7\xce\x3b\x14\x7b\xda\xf1\x76\x8a\x9c\x18\x69\x29\x5b\xba\xa8\xb3\xd6\xf5\xd3\x12\xb3\x3a\x0f\x6b\xbd\x08\x0b\xf0\x2a\xda\x8c\x2d\x80\xd7\x32\xda\x89\x3a\x3d\xf5\xba\xe2\xaa\xec\xd9\x79\xcc\x10\x99\xb5\xfb\xbd\xba\xaf\xac\xb9\x22\x2b\x76\x1e\x77\x83\x8c\xf9\x1f\x0d\x59\xec\x3f\x9f\x96\x32\x3b\x0f\x6d\x59\x9b\x87\x5b\x6a\x6c\xab\x5a\xba\xec\xd8\x77\x4f\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\x75\x08\xd8\x8f\x03\x40\x7e\xfc\x92\x0a\x46\xf5\x32\xf8\xa7\x77\x76\xa6\xe7\x40\x8b\xef\x75\xb0\xcf\x00\x17\x1f\xd4\xcf\x2f\x0a\x2e\xfe\x40\xc1\x3c\xbf\x40\xd4\xf8\x1e\x04\xef\x1c\x32\x70\xe7\x17\x87\x1a\xdf\xa3\x40\x9d\x5e\x06\xe9\xf4\x2d\x40\x67\x80\x61\x0f\x6a\x9f\x27\x0c\x7b\xd4\x20\x9c\xd8\x7c\xa4\x87\xc1\x37\x3d\x0c\xbc\xe9\x6b\xd0\x4d\x44\x49\xf9\x79\x82\x6d\x22\xb1\x80\xe7\x09\xb2\x89\x97\x1a\x1d\xf3\x54\x1e\x1a\x3e\xa3\x17\xb9\xd0\x7d\x86\xcd\xe8\x55\x02\x74\xbf\x92\x9f\x0f\x91\xf8\xdc\x1b\x98\x8c\x03\x42\x64\xc4\x11\x03\x23\x08\x7f\xcf\xc1\xef\xe3\xc9\x62\x51\xe1\x30\xa2\xf2\xfc\xc3\xc3\x60\x7c\xb1\x6c\x3f\x22\xfc\xc5\xc0\xf9\xb7\xb6\xbe\x73\xfe\xe7\x86\xbb\x38\x2c\xd4\xc5\xc0\xff\x77\x6a\x51\x61\x2d\x9e\xd9\x73\xfa\x92\x70\x16\xfd\x80\xb2\x78\x31\x18\x8b\xfe\x40\x58\xbc\x18\x7c\xc5\xe0\xb1\x1e\x3c\xd6\xed\x36\x78\xac\x07\x8f\xf5\x3e\xfd\x0c\x1e\xeb\xc1\x63\x3d\x78\xac\x07\x8f\x75\x60\x1b\x3c\xd6\x1d\x89\x1a\x3c\xd6\x9b\xdb\xe0\xb1\x1e\x3c\xd6\x83\xc7\x7a\xad\x0d\x1e\xeb\x20\x02\x7b\xea\xb1\x8e\x03\x09\x11\xf3\x44\xf6\x09\x0a\xa2\x0f\x30\x10\x2f\x05\x01\xd1\x3b\xf8\x87\xc1\x04\xbd\x1b\x75\x71\xa0\x1e\x62\x1e\xe1\x7e\x43\x3c\xf4\x19\xde\xa1\xa7\xd0\x0e\xcf\x03\xeb\xf0\x9c\x90\x0e\xc1\x67\x36\xea\x69\x2d\x44\x7a\xc1\x35\xf3\x29\x64\xfb\x9f\xd3\xd6\xe9\x7c\x87\x7f\x4c\xc0\x9e\xb1\xd6\x81\x69\xe6\xc9\xcb\x32\x03\xe5\xd2\xc4\xe9\x42\xb0\x94\x14\xa5\xd6\x36\xf3\xd6\x9d\x4f\xbf\xf1\x69\x6e\x33\xe5\xcf\xc8\x3f\x05\x87\x33\x02\x3a\x19\x9b\xcd\x8d\x39\xe8\x42\xcf\x41\x9a\xc7\x4f\xd4\xe9\xe9\xfe\x6b\x12\x24\x9f\x85\x99\xf6\x0a\x09\x53\x90\x9f\x05\xb2\x02\x7a\x9e\x1d\x7c\x81\xb4\x0e\x6f\x4b\x3d\x86\x08\xb8\x2f\xec\xf1\xd3\xc2\x65\xbd\xe3\xb1\xb7\x69\xe7\x5d\x6f\x48\xc4\x37\x68\x6d\x20\x68\xb8\x39\xb6\x60\x1c\x9c\x91\x49\xa9\x09\xd3\x08\x0c\x90\xcc\x85\x50\x5d\xb9\x8b\x4b\x52\xc6\x17\x59\x30\x61\xcd\xe9\x82\x03\xa2\x0e\x08\x59\xf1\xc0\x06\x51\x56\x95\xa8\x7f\xc6\xba\x2a\x5b\xb9\x50\xba\xde\x21\xde\x38\x6b\x06\xaf\xee\x9c\x99\x04\x43\x91\x26\xaa\xcc\x0d\x29\x16\x50\x45\x59\x08\x80\x8e\xc3\x4e\x8d\x88\x45\x93\x79\xe3\x15\x72\x00\x6d\x5d\x73\x3e\xcb\xb9\x71\x88\x9b\x3a\xd3\x89\xcf\x79\xed\x38\xb6\xe9\x0c\x94\x3e\xdb\x8a\x38\xb2\x7d\x2f\x58\x9e\x70\xda\xd5\x28\x95\x88\xbc\x28\x35\x18\x39\xbe\xcc\xcd\x6e\x62\x1a\x23\x56\x90\x19\x49\x51\xce\xec\x84\x7b\x90\x07\x3b\x11\x35\x82\x08\x4f\x89\x2a\x27\x5a\xd2\x44\x77\xbf\xfd\x8f\xec\xf2\x1d\x55\x81\x45\x48\x0b\x9b\x56\x38\x21\x64\x4e\x55\x33\xe2\xa6\xbe\x5e\x9f\xc0\xc9\xf9\x1f\x01\x17\xac\x19\xf8\x44\x35\x04\x9d\x39\x9b\xcd\xfd\x9e\x33\x4a\x32\x9a\x16\x5a\x7b\xf5\x73\x07\x98\x30\x07\xd8\x1d\x25\x94\x5a\xea\x8d\x6f\x67\x3c\x25\x7f\xc1\x6f\x21\x5d\x4d\xbb\xc6\xed\x60\x6d\x07\x34\x4d\x8d\x3c\x02\x72\x64\x0f\x92\x20\x53\xe6\x34\xa5\x95\x93\xed\x66\xb8\x2b\x87\xec\x07\x48\xc0\xca\x8e\x0b\xe8\xc9\xce\x7c\xc7\x0e\x62\xb8\xda\x56\x5e\x25\x9a\xd2\x72\xe3\xa6\x79\x4c\x2e\xac\x60\xe4\xd9\x98\xd1\xe0\xcf\xd6\x60\xb0\xd6\x4f\xb5\x9d\x99\x1e\x04\x45\xc4\xf1\xd7\xc6\x40\x96\x20\x11\xdd\xab\xd1\x10\x26\xc8\xcb\x94\xff\x79\x01\xa4\x09\x72\x18\xb4\x09\x32\x94\x9e\xe9\x57\x2c\x0f\x19\x4a\xcf\xf4\x2c\xb6\x87\x0c\xa5\x67\x86\xd2\x33\xdd\x5b\x1f\x62\x7f\xc8\x50\x7a\xa6\x07\xb1\x40\x64\x28\x3d\xb3\x4b\x1b\x4a\xcf\x0c\xa5\x67\xd6\xdb\x50\x7a\x66\x28\x3d\xd3\x68\x43\xe9\x99\xee\x64\xf5\x2e\x9e\x88\xf4\x38\xa6\x88\x0c\xa5\x67\x22\x97\x9e\x89\x97\x25\x4d\x9e\xe1\xe4\x1e\x1a\x21\x83\xf4\x25\x5d\x9a\xf4\x1c\x29\x83\xf4\x2d\x67\x9a\xf4\x2e\x6f\x9a\x1c\x28\x77\x9a\xf4\x09\x39\x83\x1c\x16\x3d\x83\xf4\x31\x3f\xef\xf3\xa8\x5c\x14\x15\x51\x83\x3c\xc7\x5d\x71\x78\x64\x0d\xf2\xa5\x5f\x17\x11\x11\x36\xc8\x70\x63\xec\xd2\x3e\x87\x1b\xe3\xb9\x11\x37\xc8\xc1\x51\x37\xc8\x70\x6f\x74\x6d\x51\x91\x38\xc8\xcb\x78\x98\x5f\x12\x91\x83\xf4\x06\x95\x83\xbc\x24\x32\x07\xe9\x15\x3a\x07\x79\x49\x84\x0e\x32\x78\xf9\x07\x2f\xff\xce\x6d\xf0\xf2\x0f\x5e\xfe\x18\x7d\x0d\x5e\xfe\xc1\xcb\xbf\xb1\x0d\x5e\xfe\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\x7a\x1b\xbc\xfc\x83\x97\xbf\xd1\x06\x2f\x7f\x77\xb2\x06\x2f\xff\x9e\x6d\xf0\xf2\xc7\xf4\xf2\xc7\x41\x13\x21\xcf\x70\x6a\xfb\x84\x2a\x42\x7a\x82\x2c\x42\x5e\x10\x5d\x84\xf4\x11\x61\x84\x0c\xe6\xf6\xce\x54\xc6\x41\x1d\x21\xcf\x70\xd4\xfb\x8d\x3e\x42\x7a\x8e\x40\x42\xfa\x8b\x42\x42\x9e\x0d\x89\x84\x3c\x33\x1a\x09\x89\x75\xae\x6d\x8a\x6a\x5f\x70\x7e\x2c\x35\x6b\x99\xb5\xad\x0a\xff\x8f\x26\xce\x87\x69\xb6\xee\xd0\x48\xca\x67\x40\x5e\x8f\x5e\xbf\x7a\x15\x9e\xbb\xcb\xb8\x86\x19\x84\x58\x2f\xa7\x42\xe6\x54\x63\x4f\xbf\xfb\x6d\xa7\x7e\xa2\xb3\xed\x6d\x70\x0f\xfd\x83\x41\x71\x36\x91\x36\x0c\x45\x4b\xfa\xdf\x82\x49\x82\x5a\x81\x39\xad\x39\x68\xd2\xd9\x37\xd0\x00\xde\xd0\x2c\x87\x33\xcf\xfb\x6d\x4c\x84\x0f\x00\x70\x68\x2c\x29\x11\xdc\x89\x6c\x86\xdd\x75\xdd\x7b\xdd\x5f\x39\x01\xaa\x10\xf9\x60\x02\xe6\xb5\x3b\x8e\x4f\xb5\x85\xf9\x29\x04\xe3\xda\x1b\x7a\xcc\x3b\x83\xdf\x10\x0e\x43\x28\x2d\xc1\x5a\x50\xeb\x18\xa7\xb2\x48\xa9\x86\xd3\x10\x55\x51\x2d\x95\x86\x1c\xa1\x64\x8c\xa4\x47\x31\xf8\x87\x68\xb9\xc4\x00\x90\x05\x70\x5d\xd2\x2c\x5b\x12\x58\x30\x17\xbf\x63\x86\xc7\xe8\x25\xa6\x55\xd0\xcc\xff\x65\x0e\xc8\x41\x24\xd8\xc0\xa4\x32\xd3\xac\xc8\x6a\x14\x12\xbb\xfc\x99\x35\xc9\x4d\x1d\xe8\x4e\x9b\x9f\x19\x1a\x69\x32\xef\x48\xc0\x0a\x37\x44\x2a\x0c\x03\x92\x0a\xef\x38\x8b\x33\x83\x1e\x61\xa3\x2a\xa8\xca\x56\x67\x31\x7f\xd8\xe7\x8f\x04\x12\x70\xff\xbc\x43\x01\xa8\x1d\x79\xa7\xc8\x89\x91\x9b\xb2\xa5\x8b\x3f\x6b\x5d\x44\x2d\x81\xab\xf3\xb0\xd6\x9f\xb0\x00\xaf\xac\xcd\xd8\x02\x78\x2d\xad\x9d\xa8\xd3\x53\xaf\x35\xae\x4a\xa1\x9d\xc7\x0c\x91\x5e\xbb\xdf\xb0\xfb\x4a\x9d\x2b\x52\x63\xe7\x71\x37\x48\x9b\xff\xd1\x90\xca\xfe\xf3\x69\x79\xb3\xf3\xd0\x96\xb5\x79\x10\xa6\xc6\xb6\xaa\xe5\xcc\x8e\x7d\xf7\x04\x45\x26\x1c\x10\x24\x86\x47\x36\x1a\x10\xc8\x33\x17\x4c\x7a\x01\x00\x90\x03\x80\x7f\x0c\x85\x7b\x86\xc2\x3d\xed\x36\x14\xee\x19\x0a\xf7\xec\xd3\xcf\x50\xb8\x67\x28\xdc\x33\x14\xee\x19\x0a\xf7\x04\xb6\x1e\x85\xec\xf4\x32\x5c\xa7\x6f\xa1\x3a\x43\xe1\x9e\xa0\x36\x14\xee\x19\x0a\xf7\x0c\x85\x7b\x1a\x6d\x28\xdc\x13\x72\x34\xe3\x25\x49\xc7\x3c\x95\x87\x06\xd2\xe8\x45\x56\x74\x9f\x01\x34\x7a\x95\x0a\xdd\xaf\x34\xe8\x43\xa4\x40\xf7\x06\x30\xe3\x80\x60\x19\x43\x9d\xa7\x9d\x5a\x54\x60\x8c\xa8\x3c\xff\xf0\x80\x18\x5f\x2c\xdb\x8f\x08\x84\x31\x70\xfe\xad\xad\xef\x9c\xff\xb9\x81\x2f\x0e\x0b\x7a\x31\xf0\xff\x9d\x5a\x54\x80\x8b\x67\xf6\x9c\xbe\x24\xb0\x45\x3f\x40\x2d\x5e\x0c\xd0\xa2\x3f\x60\x16\x2f\x06\x64\x31\x78\xac\x07\x8f\x75\xbb\x0d\x1e\xeb\xc1\x63\xbd\x4f\x3f\x83\xc7\x7a\xf0\x58\x0f\x1e\xeb\xc1\x63\x1d\xd8\x06\x8f\x75\x47\xa2\x06\x8f\xf5\xe6\x36\x78\xac\x07\x8f\xf5\xe0\xb1\x5e\x6b\x83\xc7\x3a\x88\xc0\x9e\x7a\xac\xe3\x80\x43\xc4\x3c\x91\x7d\x02\x85\xe8\x03\x20\xc4\x4b\x81\x41\xf4\x0e\x08\x62\x30\x41\xef\x46\x5d\x1c\xd0\x87\x98\x47\xb8\xdf\x60\x0f\x7d\x06\x7a\xe8\x29\xc8\xc3\xf3\x00\x3c\x3c\x27\xb8\x43\xf0\x99\x8d\x76\x5a\x69\xa9\x45\x2e\x4a\xae\x6f\x41\x2e\x58\x02\x17\x49\x62\xfe\xba\x13\xf7\xb0\x67\x56\x7f\xeb\x88\x5e\x3c\xd2\x2d\x61\x3c\x65\x09\xda\x26\x1f\xe6\xa0\xe7\x2e\x6d\x0e\x9f\x23\xd4\x3e\x48\x34\x3e\x59\x9f\x50\xa4\xd3\xdc\xb1\x98\xd9\x8d\x5d\xef\xbb\x04\x76\x86\x26\x42\x64\x40\xf7\x71\x45\x3b\x99\x11\xe4\x9e\x8c\x3a\x8c\x67\x7d\xef\x44\x89\x7a\x74\x32\x81\x4c\xf0\x99\xcb\x21\x77\x5c\x67\xdf\x5d\xf8\xb6\xee\xce\xb9\x6a\x93\x52\x4a\xe0\x3a\x5b\xe2\x34\xa7\x29\xa4\x04\xcd\x53\xb9\x58\xec\xbf\xc9\xef\x90\x1d\x79\x1d\x9e\x6a\x92\x01\x35\xef\xc1\xa1\x7e\x11\xc3\xd0\x28\xb9\xee\x40\x7b\xe5\x5b\xb6\x20\x02\x9d\xd6\x7f\xff\x1b\xbb\xd3\x1d\xdd\x3e\x0d\x5e\x2f\x43\x29\x2d\x41\x23\x5f\x63\x3e\x90\x41\x2e\x45\x49\x1e\xa8\x55\xa5\x64\xc9\x91\xa5\xe2\x44\x75\x58\xe4\x00\xa5\xa3\xbb\x31\x7e\x84\xf7\xd2\x9e\x3f\x0b\x31\x8e\x53\x39\xeb\x24\x3a\xc5\x90\x25\x2e\xe4\xac\xb4\x9a\xa2\x3b\x8a\xc0\xb5\x5c\x22\x1e\x46\xb7\x7b\xe1\x6e\xde\x3a\x21\x39\x9d\xc1\xb1\x22\x6f\x3f\xbc\x33\xb7\x0e\x46\x20\xb1\xa9\x95\xd9\xdd\x2d\x54\x48\xb1\x60\x69\xd7\x6b\xe8\x07\x2a\x19\x9d\x64\x46\xeb\x9d\x82\x04\x6e\x24\xe9\xaf\x4e\x7e\xb8\xb8\xf9\xfb\xd5\xc5\x87\xf7\xa7\xa8\xff\xc2\xa7\x82\x72\xc3\x0e\x4a\x55\x23\xf3\x38\x0a\x8f\x15\x01\xbe\x60\x52\x70\x33\x0b\x68\x37\xa4\x64\xe1\x3a\xed\x44\x51\x1d\x38\x22\x41\x89\x6c\x01\xa9\xc5\xd2\xa8\x08\xac\xc3\x77\x8a\x52\x7b\x0b\xaa\x8f\xbd\x29\x79\x32\xa7\x7c\x06\xe9\x98\xbc\x13\xa5\x79\xb1\xaf\xbe\xc2\x97\x90\x90\x96\x09\x74\xd3\x71\xac\x09\xde\x9e\xdc\xaf\xce\xbc\xcc\x62\x6e\x7f\x8c\xbd\x21\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x5a\x72\x4d\x3f\xbd\xb1\x58\x1c\x47\x5f\x35\xbe\x3a\xea\x1e\xb8\x56\x48\x61\x5e\xc5\xca\x82\xf6\xed\x33\xa6\x41\xd2\x8c\x1c\x35\x47\x18\x93\xf7\x86\x2e\x48\x9b\x6b\x6b\xc1\x68\x60\x01\x12\x6d\xab\x6e\x65\xcf\x88\x84\x19\x95\x69\x06\xaa\x9b\x51\x48\x4c\xab\x2b\xdc\x9a\x5a\xdc\xae\x82\xca\x66\xcc\x85\x1e\x87\x32\x6e\xdf\x3e\x08\x04\x3b\x99\x8a\x37\x64\xae\x75\xa1\xde\x9c\x9f\xd7\x52\xd0\x98\x89\xf3\x54\x24\xea\x5c\x53\x75\xaf\xce\x19\x37\xcc\x6f\x94\x52\x4d\x47\x0d\xae\x7b\x6e\x65\xe3\x51\x22\xf2\x9c\xf2\x74\x44\xdd\x39\x1e\x55\x3b\xfb\xfc\xd7\x4e\x7a\x1c\xd1\xea\x29\xc6\x47\x74\xa4\xe6\xd0\x69\xe5\xc2\x14\xc5\x00\x05\x31\x50\xc8\x8c\xac\x10\xba\xb9\x3c\x14\xc3\x7e\x5f\xf1\x67\xbb\x14\x63\x72\x25\xb4\xc3\x2b\x72\x11\x95\x78\xdb\xe2\x2a\xc7\x64\xe1\xef\xaf\xee\x6e\xfe\x7a\xfd\xf1\xf2\xea\x6e\xe0\xe4\x03\x27\xc7\x36\x70\xf2\x81\x93\x77\x18\xb8\x2f\x9c\x1c\xf8\xe2\x50\x5c\xdc\x2b\xc5\x0d\x8e\x55\x6d\x55\x97\x28\x50\x85\x79\x57\xfb\xa0\xdb\x16\x8d\xb2\xd3\x0f\xb6\x63\x5a\x93\xfd\x9e\x2f\x7e\xa0\xed\x88\x13\xbe\x71\x0a\x89\x7b\xc0\x6a\xe8\x6f\xc3\x26\x30\xd8\xf3\x15\x1a\x17\xd6\x49\x21\xb5\x2d\x3c\x66\xcb\x0c\xdd\xdd\xe0\x1d\xcf\xdc\x7d\x45\xf3\xca\x56\xbb\x69\xc9\x43\xac\x98\x1f\xac\x43\x55\xb9\x43\x49\xf9\x92\x14\x92\x71\x8d\x5b\xe9\xe2\xf6\xed\xe5\x25\x49\xe6\x54\xd2\x44\x83\x54\x04\x3e\x25\x50\x68\x72\xfc\x3f\x8f\xbb\x8f\x19\xc1\xd7\x81\xd6\xeb\x3e\xac\xcc\x3e\x82\x5b\xc0\x30\xb5\xc8\x57\x48\x58\x30\x51\xaa\x6c\x59\x79\x08\x36\xf3\xd1\x55\x06\x4a\x28\x0f\xa1\xc0\xec\x0b\x6f\xde\xdd\x38\xe0\x8a\xd0\xb9\x49\x80\x0c\xb1\xb5\x1f\x56\xf4\x74\x44\xc4\x10\x40\x03\xc6\xdf\x20\xba\xee\x2e\x86\x06\x8c\xdb\x49\x80\xdd\x26\x8c\x06\xd0\xd1\x16\x63\x03\x3a\x7a\x67\xf3\xba\x50\xd8\x38\x0a\x98\x9a\x58\x9c\xec\x6b\x29\xf2\x48\xdc\xec\x16\x01\x0b\xab\x3c\xbb\x4d\x47\xf5\xd8\x05\xaf\xb7\x14\x01\xa7\xd2\x56\x99\x6e\xe6\xf3\xc0\x6c\xb7\x28\x51\x33\x71\x02\xaf\x13\xc1\xa7\x6c\xf6\x81\x16\xdf\xc1\xf2\x06\xa6\x61\xbe\xfa\xf6\x7c\xa3\xdb\xd2\x85\xff\xe2\x05\x6a\x44\x2e\x3b\x58\x98\xeb\x32\x5a\xd0\x51\xac\xd0\xfc\xf0\xb0\xfc\x78\x51\xf4\x51\x22\xe8\x5b\x0b\xe9\xb2\x85\xeb\x74\xd9\x58\x09\x16\x51\x02\x33\xc3\x24\x51\xdf\xe2\x47\x47\x37\x25\x53\x77\x3d\x44\x09\x32\xbf\xab\xd1\xce\x99\x22\x30\x9d\x42\xa2\xd9\x02\xb2\x0a\x21\x3d\x3d\x23\x93\x52\x7b\x6c\xf2\x09\x4d\xee\x1f\xa8\x4c\x15\x49\x44\x5e\x50\xcd\x26\x2c\x63\x7a\x49\x58\x8c\xfa\x5a\x2e\x54\xc0\x01\xae\xfb\x18\x6b\xae\x34\xc5\xab\x50\x38\x43\xa0\x59\x6d\x1b\x43\x41\x7d\x82\x9c\xe5\xa6\x1e\x68\x3c\x0a\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\x31\x6a\x60\xec\x6a\xcc\x49\x04\x37\xf2\xbf\x3a\x17\x0b\x23\x0b\xc2\xc3\xf9\x83\x90\xf7\x8c\xcf\x46\xe6\xc5\x47\x96\x59\xa9\x73\x8c\x6d\x39\xff\x35\xfe\xa7\x4f\xa7\x88\xf8\x8c\xee\x37\xe4\xe8\x28\xb0\x2f\x51\xd8\x30\xce\xc8\xa7\xf2\x16\x03\x84\x96\x2d\xd1\xa9\xba\x50\x8c\xe8\xc3\xb4\x42\x3e\xe5\xdd\xf3\x4e\x0b\x88\x34\xcd\xfb\x07\x56\xac\xb7\xe7\x2a\x33\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\x2b\xc7\x0a\x0b\x91\xbe\x21\xaa\x2c\x0a\x21\xb5\x22\x39\x68\x9a\x52\x4d\xc7\xe6\x40\x9c\xb5\xff\xc4\x10\xb0\x33\xf2\x8f\xea\x43\x8b\x47\xf0\xe3\xf1\x7f\x7c\xf7\xfe\xaf\xff\x79\xfc\xd3\x3f\x9a\xdf\xa1\xb8\x66\xb3\x8b\x1a\x0f\x04\xbe\x82\x2a\x20\x19\x73\x91\xc2\x15\x52\x87\x7f\xaa\x56\xc0\x8f\xfb\x42\x53\x5d\xaa\xf1\x5c\x28\x7d\x79\x5d\xfd\x59\x88\x74\xf5\xaf\xc0\x1c\xa7\x1e\xca\x3d\xb8\xb6\xd7\x54\x77\x47\x98\x27\x51\xa5\x1f\x5a\xb0\x1f\x40\xaa\xce\x35\x5b\x9a\xad\x75\x1e\x5c\xaf\x15\x14\x7e\x32\x87\x9c\xe2\x3f\xbf\xf6\x53\x60\xee\xe3\x07\xc9\xb4\xc6\x18\x30\x57\xa0\x42\x4c\xcf\x3c\x6b\xb5\x4a\xd5\xe2\x75\x70\x81\xb6\xa8\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x1a\x6e\x65\x2d\xe4\xf3\xe2\xfa\x92\x2c\xec\x0c\xf7\x68\x72\x9e\x8f\x5d\x67\x10\x5d\xdd\x0a\x66\xd8\x5f\x57\x54\xb9\x65\x6a\xa8\x6e\x4e\x61\x46\xca\x43\x17\xe8\xc6\x32\x1f\x9b\x8e\xfb\x9e\x2f\xcc\xb8\x8a\x4c\x81\xea\x52\x02\x99\x51\xed\x0b\xf8\x00\x37\x3a\x79\x60\x8a\x4a\x0f\x79\x66\x78\x0a\xf7\x88\x14\xa1\x2c\xd7\x74\xb2\x10\x59\x99\xe3\xe5\xd6\x13\xee\x1d\x5f\x77\x8d\xa2\xca\x79\x05\xd8\x45\x51\xb4\x0e\x03\xb9\x30\xcc\x7e\x81\x39\xc7\xf6\x19\x34\x3d\x62\x99\xa6\x76\x6d\x26\xa5\xa9\xd4\x51\xea\xf2\x91\x1a\xc0\xcb\x5b\xba\xeb\x00\x0f\x6b\xe5\xca\x5f\xdc\x77\x51\x37\x5b\x3c\x8d\x5c\x64\xc5\x1c\x33\x87\x66\x95\x1e\xbc\xf1\xb4\x9f\x55\x10\x0e\x8a\xfd\x13\x2d\x6c\x19\xcb\x99\xb6\x6a\xe5\xeb\xdf\xfe\xb1\x41\x68\x8f\xee\x86\x67\x53\x73\xa2\xec\xd8\x4d\xba\x92\xd9\xae\x8f\xa8\x49\x55\x72\xb4\x7f\x2e\x0e\xd2\x44\x2a\xc0\x99\x4c\x31\xad\xda\x8c\x50\x9f\xa0\x05\x95\x55\x94\x50\x39\xc9\x98\x9a\xc7\x29\x61\x7d\x39\xad\x56\xc7\xf4\xaf\x00\xc3\x8e\xb5\x2c\xa1\x4a\xe8\xaa\x65\x0f\x33\x17\x2b\x54\x46\x20\x61\x9b\x89\xb9\x5d\x37\xaf\x76\xe7\x5f\x63\xee\x56\x1d\x0d\x3f\xfe\xd5\xb3\xcd\xc3\x94\x66\xea\xe5\x26\x82\x72\x02\x52\x0a\x59\xb9\xa1\x24\xe8\x52\xf2\x3a\xc9\xfd\x5a\xa4\x24\x91\x60\xa1\x09\x7b\xa4\xac\x93\xa6\x51\x04\xe7\x2c\xb0\xbb\x22\xbe\x90\x1d\xed\x7a\x33\xb4\x35\xef\x37\x2b\x1a\xd8\x8b\xcb\x7a\xf3\xda\x60\x89\x31\x04\x41\xd3\x3e\x38\x26\x54\x15\x91\x33\xdb\xd2\x97\x3c\x74\xa7\x01\x07\x3c\x1e\x8f\x8f\x2d\x95\x42\xda\xab\xd4\x5a\x14\xcd\xe7\xbd\xba\x16\x6a\xa1\xea\x19\xcc\xf0\xbc\x61\x54\x76\x4b\x84\xb9\x42\x7e\xaa\xbc\x8b\x35\x96\xac\xfe\x19\x28\x53\xbe\x12\xd9\xd7\xbd\xb6\x81\x79\x2a\xfd\xe2\x55\x8c\xfe\x8d\x4d\xd5\xaf\xea\xa9\x59\xe1\xc7\xe2\xd3\x18\x95\x03\x94\x0e\x35\x14\x9f\xd8\x2e\xc7\x49\x51\x9e\xb9\xee\xc7\x39\xe4\x42\x2e\xab\x3f\xa1\x98\x43\x0e\x92\x66\x23\xa5\x85\xa4\x33\x38\xab\x06\xb7\x3f\xab\xfe\xb2\x3f\x6c\x91\xb7\xfe\x6b\x1b\xdd\x51\x67\x5e\x39\x7b\xdf\x17\xa8\xcb\xf9\x75\xeb\x89\x02\x55\x6d\xab\x67\xe0\x3f\xc7\x55\xc0\x9c\xf5\xb9\x55\xb3\x88\x2e\x75\xcb\x8d\xd4\x59\x2d\x70\x60\xdc\x87\x15\xf2\xd4\x71\x7f\xf8\x10\x21\x29\x5b\x30\x15\x03\x46\x6b\x83\x7b\x82\x39\xbb\x86\x28\x75\x51\x6a\x57\xf9\xba\xb2\xa0\x7c\x2a\x84\xc2\x68\x91\xaa\x78\x62\xcb\x34\xf8\x3a\xd4\xf3\x82\x32\x86\x06\xc9\xdf\x90\xff\x7d\xf2\xb7\xdf\xfc\x3c\x3a\xfd\xd3\xc9\xc9\x8f\xaf\x46\xff\xfe\xd3\x6f\x4e\xfe\x36\xc6\x7f\xfc\xeb\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xc7\xef\x3e\x7c\x73\x77\xfd\xfe\x27\x76\xfa\xf3\x8f\xbc\xcc\xef\xed\x5f\x3f\x9f\xfc\x08\xef\x7f\xda\xb1\x93\xd3\xd3\x3f\x7d\x15\x4c\x3a\xe5\xcb\x8f\x81\xdc\xdb\xb6\x51\xb4\xc2\xe5\xab\x3d\x46\x72\xb5\xb5\xae\x42\xc6\xf5\x48\xc8\x91\xed\xfa\x0d\x2a\x29\x81\x03\xf8\xed\x15\xfb\xfc\xdf\x78\xae\x59\xdf\x66\x95\x50\xd8\xa3\x03\xfe\x5c\x82\x86\x82\x44\x82\x7e\x89\x30\x19\x3b\x92\xd7\x0c\x57\x50\x3d\xbe\xb4\x1b\xf4\x97\x10\x39\x53\xd5\x4f\xc6\x75\xad\x35\x29\xa3\x5e\x8d\x6b\x25\x88\x12\x6b\x47\x74\xcf\xdd\x43\x20\xa0\x3a\x19\x22\x6d\x42\xda\x10\x69\xb3\x85\x94\x21\xd2\x26\xa8\x7d\x96\x91\x36\xb7\x96\x27\xfd\x22\xc3\x6c\xd6\x13\xcc\x4c\xa7\xf7\x9d\x0b\xce\x74\xce\xdc\xd9\x96\xe9\x96\xd3\x62\xef\xde\x80\x2f\xba\x06\x57\xc7\x4c\x75\xf3\x66\x0f\x2d\x48\x21\x8a\x32\xa3\x7a\x4b\x16\x45\xa4\xbc\xb7\x9e\x79\xce\xfe\x32\x07\xee\x44\x3f\x17\xc3\xcf\x38\xc9\xcb\x4c\xb3\xa2\x63\x42\x40\xa5\x5a\x56\xe0\x90\x84\x2a\x25\x12\x46\x7d\x22\xb8\x03\xb6\x52\xda\xbf\x32\x5a\xe6\x35\xbd\xc7\x1c\x9a\x04\x52\xe0\x49\x47\xcb\xe1\x0f\x16\x8c\xd2\xcf\xed\x64\x69\xee\xa1\xf7\x7c\xe1\xee\x24\x92\x96\x36\xc1\x15\x6a\x5f\x69\x94\x71\xbf\xac\x6c\x46\x73\x2e\x5d\xb6\x42\x23\xa9\x11\x25\xc8\xca\x88\x58\x81\x67\x57\x21\x90\x98\xfe\x61\xd9\x74\xb7\x0b\x2f\x58\x39\x08\x17\xc5\xab\x6c\x84\x20\x1d\x6b\x4d\x06\xaf\xc3\x44\xdb\xb2\x77\xe7\x11\x7a\x94\xc0\x11\x2e\x95\xc7\x95\xc8\x9f\x43\x1a\xef\x8b\x24\xde\x13\x29\xfc\x79\x24\xf0\x7e\x4a\xdf\xd1\x24\xef\x38\x52\x77\x1c\x89\x7b\x8f\xb8\xf6\x98\x52\x76\x1c\x09\xfb\x39\xec\x6b\x85\x84\x29\xfb\xd4\x87\xb4\xe5\x8f\xde\x7d\xa1\xe1\x13\x9a\x6a\x0a\x09\x05\xf0\x0a\x79\xd8\x7b\x60\x81\x26\xf3\x21\xe3\x9c\x54\x76\xd1\xb8\x17\xf6\xed\x26\x4b\xd9\x70\x5b\x93\xe1\xb6\xde\xa3\x0d\xb7\xf5\x70\x5b\xbf\xc8\x6d\xed\xb8\xd5\x97\x7f\x55\x47\x46\x5a\x42\x0c\xb9\x43\x19\xa0\xde\xb6\xa1\xec\x90\x33\x3f\x27\xda\x57\x75\x14\xeb\x18\xcf\x73\x1c\xb9\xdb\x89\x6b\x33\xd9\x2a\xe8\x42\x0b\xcb\xf6\xc8\x9c\xcd\xcc\xf6\xcc\x60\x01\x99\x53\xab\x49\x4e\x39\x9d\xd9\x12\x26\x5a\x54\x25\x7c\x85\xc4\x0a\xa5\x92\x75\x44\x4f\x5f\xc1\x04\x44\x0b\x96\xe1\x32\x99\xa0\x29\x7e\x29\x45\x96\x19\x79\x25\x63\xf7\x40\xde\x41\x91\x89\xa5\xab\x42\xc2\x53\x72\xab\xa9\x86\x69\x99\xdd\x82\xee\x14\xde\x1d\xc4\x71\x90\xe0\xeb\x32\xcb\xae\x45\xc6\x92\x4e\xde\xbf\x18\x5b\xf1\x12\x37\x60\x51\x66\x19\x29\x90\x90\x6e\xfb\xf0\x23\xc7\xab\xfc\x22\x7b\xa0\x4b\x75\x46\xae\x60\x01\xf2\x8c\x5c\x4e\xaf\x84\xbe\xb6\x46\xa4\x6e\xfd\x36\x31\x41\x6c\xe7\x84\x4d\xc9\x1b\x2c\xbf\xa8\x89\xa6\x33\x8c\x2d\xf6\x61\xc4\x67\x66\x43\x35\x07\x25\xc2\x30\xca\x07\xa6\x0e\x69\xdb\x0b\x3f\xa5\xbf\xc6\xd1\xcd\xd5\xd9\xf9\xd4\x06\xed\xd5\x8c\x4d\x21\x59\x26\xd9\xc1\x18\xe6\x45\x82\xe9\xb5\x75\xb1\x97\x06\x3b\x51\x4b\xa5\x21\xf7\x78\xf6\x68\xd2\x65\x9c\x48\x50\x85\xe0\x0a\xa5\xbc\x9a\x4b\x54\x2f\x42\x30\x49\xa6\x63\x52\x47\x44\x8b\x6f\x67\xc5\x20\x54\x25\x28\x84\xd2\xb7\x9a\x4a\xdd\x55\x3e\x89\xa5\x0b\x5c\x7b\x42\xcc\x49\x4e\x68\x96\x41\x4a\x58\x9e\x43\xca\xa8\x36\x72\x3b\x9d\x6a\xac\x62\xd0\x60\xf5\xca\xc6\xec\x37\xf2\x46\xe6\x94\xa7\x19\x48\x32\xa5\x2c\x53\xdd\x33\x07\xda\xd0\x5c\x46\x3e\x07\x99\x33\x8e\xde\x0b\x1b\x75\x8a\xd1\xdf\xe6\xaf\x24\x11\x32\x75\xf5\x02\x98\x56\xfe\xab\x20\x26\x6a\xda\x47\x94\xec\x1a\xdb\x7b\x35\x68\x97\x4c\x32\x91\xdc\x2b\x52\x72\xcd\x32\xfb\xf2\x42\xdc\xa3\xfe\x92\x21\x3b\xe9\x3c\x74\x77\x2e\x55\xfd\x73\x54\x1d\xb0\x91\xa1\x4a\x9d\xff\xba\xfe\x0a\x3f\xe8\x48\x5c\x04\x2d\x3a\x86\x0e\x0d\x9f\x20\x89\x56\x6a\xe7\xfd\x27\x48\x5a\x85\xae\x1c\x90\xaa\xd9\x51\x0e\x3c\x39\x92\xdf\xd1\xb6\x9e\xd5\xed\x0e\x00\xad\x6e\xb6\xd8\x21\x3d\x6f\xdd\x22\xb8\x92\xbd\x7e\x4d\x32\xc6\xa1\xbd\x30\x8a\xa5\xd0\x5e\x1c\xeb\xf6\x74\x4a\x2e\x49\x99\xc4\x1a\x43\x4b\x8f\xfa\x15\x4c\x9a\xa7\x05\xcb\xf0\x08\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\x56\x98\x7e\x61\xaf\xc5\xb1\x83\xce\xae\x5e\x4a\xb1\xbc\xc8\x96\xf8\x1e\xc7\xe9\x19\x61\x3a\x46\x8c\x90\xb9\x0d\x65\xc9\xfd\xac\x38\xa8\xef\x33\xa2\x04\xd1\x92\xfa\xd2\x7a\xf6\x53\xf3\x90\x96\xa5\xbb\xd0\x4f\x8e\x7f\x3e\x3e\x23\xa0\x93\x53\xf2\x20\xf8\xb1\xc6\xe9\x1b\x93\x3b\x41\xca\xe0\x9c\x27\x52\x13\xb2\x14\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x96\x78\xdd\x10\x51\xda\x0c\x3d\x23\x5a\x04\x40\x94\x37\xdb\xfb\x4f\x4c\x3b\xf0\x0d\xc3\xbf\x5f\xe1\x6e\xb2\x57\x16\xa1\x46\x19\x59\xc0\xf9\x1c\x68\xa6\xe7\x36\x9b\x81\x0b\x3e\xfa\x27\x48\x81\x30\xe6\xdc\x7d\xf3\xc5\x95\x89\x8f\x18\xc8\xf4\x4c\x15\xd5\xcc\xb5\xf7\x0d\x74\x16\x89\xc8\x2a\x3f\xfa\xf6\xee\xee\xfa\x1b\xd0\x4d\x2e\xcf\xf1\x43\xf2\xcd\xfb\x3b\x9f\xc3\x82\x86\x7e\x90\x53\x21\xf3\x1e\xb0\xf7\x38\xc1\xb5\x23\x52\x08\xd9\x87\x5b\x66\x2e\x54\xd0\x72\x92\x67\xb8\x62\xbe\x15\x4a\x5b\x5f\x8e\xd5\x4d\x38\x26\x36\x8a\x76\x42\x86\x4f\xdf\xbf\xbc\x1e\x93\xbf\x8a\xd2\x4c\xc8\x84\x4e\xb2\x65\x55\xc8\x48\x41\x68\xd1\x53\x42\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x5b\xa0\x29\x48\x85\x0c\x1a\x68\xa4\xf2\xac\x11\x8e\x7b\x83\xb6\xa8\x4b\xf9\xb6\x54\x5a\xe4\x64\xee\x5e\xbb\x0d\x71\xee\x0e\xe7\xd8\x1e\x57\x07\x27\x2b\xa1\xb0\x4c\xdc\xfd\xe6\x8b\x63\xd1\x6b\xdc\xcb\xce\xbb\xfb\x7c\x62\xc5\xd4\xe6\xb4\x39\x07\x87\x05\x2a\x75\xbc\xcd\x6c\xd5\x68\x71\xaf\x51\xca\xfb\xc6\xcb\x19\x20\x61\xe0\xe7\xab\x1d\xa1\xb3\x27\xb8\xa7\x78\x69\x08\x24\x5a\xa8\x3d\x79\xb6\xb2\xff\x46\xa0\x75\x9b\xcf\xda\xa0\xbb\x5b\xcf\x37\x75\xce\x54\x85\x16\x90\x50\x2e\x38\x4b\x68\xc6\xfe\x09\x29\x29\x0b\xc1\x5d\x6e\x1d\x4a\xb6\x09\x55\x30\x42\xcf\x3b\xd7\xae\x16\x71\x8d\x76\x6d\xb8\x83\x16\x02\xc5\x3d\x0c\x9e\x33\xec\xde\x52\x1d\xb3\xf6\x7d\xb4\xf2\xf2\x81\xd0\xed\xcd\xb6\xe6\x50\x6f\x2d\x56\x9c\x1d\x4f\x3e\x0b\x71\x92\x44\x02\x5e\x58\xc7\x36\xd3\x82\xd0\x24\x41\x3c\x6f\x7b\x5d\x21\xe3\x55\x20\x17\xe1\xfb\x2b\xda\xbc\x1a\x11\xb0\x6f\xb2\x97\x8d\x39\x90\x84\x97\xf9\x04\x64\x0d\x0c\x29\xf5\xfa\x9c\x46\xb1\xba\xb8\x61\xed\x70\xde\x4b\xeb\x65\x0c\xca\x67\x40\x5e\x9b\x91\xff\xf0\xfb\xdf\xff\xee\xf7\x11\xc6\x31\xaf\x57\x95\x08\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\x45\xb8\xf9\xd0\xee\x23\x25\xc9\xc6\x4e\x91\x8d\x9a\x20\xfb\xac\xe9\xb1\x08\xdc\x18\xcc\x65\x63\x1f\x89\x5b\xa4\xca\x6c\xc2\x52\x59\x88\x7a\xa7\x93\x34\xaa\xe1\x1a\x35\x2a\x7c\x77\x36\x9d\x79\x86\x61\xf5\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x9a\xde\x5a\xe5\x80\x48\x5a\x4a\x5b\x95\xb6\x72\x5e\xd5\xb6\x7c\xe7\xb4\x42\x1a\xbe\x20\xe5\x5f\x41\x22\x78\x1a\xa2\x02\xc4\x12\x69\x1d\x25\x51\xcf\xdc\xad\xed\xd3\x9b\x88\xeb\xab\xc4\x0d\x86\x9a\x64\xe8\x8a\x92\x6a\x55\xe3\xf0\x49\x8b\x06\x81\xbd\xfd\xe1\xdf\xba\x3b\xc8\x92\xe2\x56\x24\xf7\x11\x4d\x64\x81\x0c\xec\x9d\x39\x69\x89\xf5\x05\xde\xbd\xbd\xb6\xc4\x99\x95\xb9\xfa\x78\x57\x43\xbf\x18\x29\x9c\x92\xef\xbd\x6f\xea\x5b\xe7\x2d\xa4\x3c\x25\xf7\x50\x84\x69\x97\x86\x61\xfa\x30\xc2\x76\x14\xe1\xd8\x95\xec\x46\x94\x39\x9b\x5e\x6d\x19\x81\x8f\xfe\xb3\x12\x71\x58\x05\xa0\x86\x73\x1e\x1d\x81\x4e\x09\x99\x52\x96\x11\x8a\x56\x79\xcd\x72\x20\x0f\x73\xe0\xd6\xd8\x5f\x47\x4b\x7c\x41\x0c\xe7\x4b\xb5\x36\x1e\xfb\x90\xf0\x37\x7b\x5b\x0d\x43\x51\x31\xbe\x6c\x35\xc0\xf1\x6c\xd9\x42\x35\x1b\xd4\x80\x5d\xda\xa0\x06\x74\x54\x03\x0a\x09\xb7\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\xb6\x84\xdb\x4c\x60\x2a\x24\xac\xc6\xdb\x34\xe2\x60\x5c\xe4\x7c\x40\x64\xf0\xc5\xf5\x65\xe5\xfb\x12\xad\x58\x17\x8b\x5c\xac\xca\x64\xee\xdd\xa4\x1c\x94\x3a\xc7\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x9e\xd5\x68\x42\xe6\x75\x81\xdb\x0f\x41\x27\xd6\x6f\xee\xc3\x8a\x1c\x4e\xac\x9f\xae\x69\x90\x3b\xbf\x9e\xd8\x44\x52\x35\x07\xcc\x9d\x85\x4f\x4c\x2b\x3b\xa8\x45\x63\xf5\x33\x6e\xe4\x85\x99\xa4\x09\x90\x02\x24\x13\x46\xc4\x28\xb9\x4e\xc5\x03\x27\x13\x98\x31\xae\xfc\x8a\x85\x90\xe4\xb7\x04\x46\x12\x31\x55\xd5\xee\x1e\x93\x9b\x56\xe5\x38\x87\x2e\x96\x88\x9a\x67\xba\x29\x3a\x8b\x34\x25\x28\xbc\xe0\x36\x28\x69\x96\x2d\xeb\x8d\xd7\x04\x08\xdd\x32\x43\xdd\x37\x84\x9d\xd9\x93\x92\xe3\x8b\xa6\x90\xd1\xa5\xcd\x20\x9f\x32\x8e\xd6\x5f\xa9\x4e\xc7\xe1\xa1\x59\x9d\x09\x14\xb2\xd1\xe7\xd6\x9d\xc1\x14\x91\x40\x93\x20\x1c\xe3\x21\x06\xec\xa9\x36\xc4\x80\x0d\x31\x60\x43\x0c\xd8\x7a\x1b\x62\xc0\xda\x6d\x88\x01\xdb\x4e\x50\x9f\x9d\x76\x43\x0c\xd8\x60\x95\x59\x6f\x43\x0c\x58\xa7\x36\xc4\x80\x3d\xd9\x7a\xc7\xa2\x87\x18\xb0\x1d\xda\x10\x03\xb6\x63\x1b\x62\xc0\x86\x18\xb0\x21\x06\x6c\x88\x01\x0b\x68\x43\x0c\xd8\xfe\xaf\x37\x38\x7f\xba\xb7\x21\x06\x6c\x88\x01\xdb\xb3\x0d\x31\x60\x2b\x6d\x88\x01\x1b\x62\xc0\x1e\x6b\x43\x0c\xd8\x10\x03\xe6\xda\x60\x6d\x5c\x6b\x43\x0c\xd8\x86\x36\xc4\x80\xed\x37\xce\xa0\x06\x84\x75\xf6\x2c\x6a\x80\xd2\xa2\xb8\x65\xb3\x00\x5c\xc8\x58\xc7\xe0\xb6\xa2\xc4\x81\x46\x2a\x57\x6c\x57\xd9\x0f\xbd\x1d\x4b\x39\xc8\xbe\x66\x44\x58\xe3\x26\x99\x80\x51\x11\xcc\x6b\x15\x21\xb7\xc9\xe5\x14\x1d\xc8\x0d\x24\x37\x73\x2a\x3c\x4c\x20\x6b\x95\x75\x68\x8b\xcf\xfe\x76\x63\xdc\xe8\x2e\xdd\x29\x68\xcc\x47\x42\xb9\xad\x8c\xea\xca\x64\x9b\xeb\xfd\x5a\xa4\xca\x57\x92\xe0\x82\x8f\x2c\x58\xeb\xd8\x10\x3c\x16\x6a\x1c\x60\x0d\x0e\x44\x66\xb3\x31\x72\xd7\x52\x4c\x0e\x86\xce\x76\x8d\xf1\x47\x2c\x71\x01\x7a\x62\xda\x42\x5c\xb3\x04\x76\x44\x5a\x6b\x07\x86\x61\xb1\x66\x0f\xc1\xc5\x1c\xc3\xae\x82\x02\x0f\x89\xe6\xb6\x77\xe4\x94\x47\xa9\x54\xe7\x85\xb0\xff\x57\xc7\x4d\x35\x02\xa6\x3a\xfb\x51\x0e\x0c\x2f\x17\x12\x25\x75\xb0\x08\xa9\x9e\x44\x98\x45\x88\x8a\x8a\x29\x2b\xf5\x34\x1a\xaa\x9f\x91\x50\x7d\x8c\x82\x3a\x44\x04\xd4\xc1\xa3\x9f\xe2\xb8\xd5\x23\xb8\xd4\x23\x49\xa4\xcf\xe0\x9e\x72\x81\xf4\x77\x73\x09\x6a\x2e\xb2\xce\x0c\x27\x16\xb3\xf9\xc0\x38\xcb\xcb\x1c\xab\x50\x18\x9e\xc2\x16\x55\xb0\xbf\xf2\x2c\xc3\x5d\xf7\x36\xe2\x00\xcb\x55\xa4\x80\x65\xc0\x29\xcb\xcc\xd6\x42\xb0\xd0\x39\x5d\xa0\x50\x5a\x26\x09\x40\x1a\x22\x96\x36\xad\xd5\xbf\x1b\x57\x14\x5a\x8c\x7e\xa6\xc8\xeb\xb0\xab\x26\x4c\xef\x69\x98\xf3\x7e\xf7\xdb\x4e\x7d\xcc\x64\x11\xe7\x96\xfe\xe6\xe6\xfa\x6d\xeb\x96\xc6\x0f\xbe\xc5\x63\xfc\x76\x0e\xc9\xfd\x8d\x0b\xa5\x39\xdc\xcd\x1c\x6e\x66\x0a\x32\x31\xc5\x10\x0c\x42\xad\x28\x6d\x1f\xb2\x90\x7a\xc5\x05\x3a\xc3\x55\x04\xb9\x60\x09\x8c\x5f\xc0\x50\x11\x4b\xf9\x0f\x3f\x08\x04\xdd\x04\xf8\xe2\x7d\x11\xbb\x6e\x2d\x39\x95\x87\xa1\x61\xa3\x72\x94\x62\xd0\x68\x46\x93\x6a\x6d\x66\x9b\x0f\x5d\x10\x19\x27\x0a\xa0\x52\x68\x66\x4c\xcf\xcb\xc9\x38\x11\xf9\xb9\x61\x1d\xf6\xff\x26\x99\x98\x9c\xe7\x54\x69\x90\x46\xc7\x71\xd7\xfa\x28\x31\x14\x30\x3e\x1b\xe7\xe9\xe9\xf8\x57\x41\x34\x5c\x3a\x5b\xb9\x4b\xc3\xda\x62\x24\x98\x80\xe1\xfb\x42\xae\x58\x0b\xcc\xa4\x84\x6f\xd2\xe0\xfb\x3b\xb4\xa8\x48\x60\x58\xf2\x41\x42\x92\x07\xae\x4d\x22\x38\x04\x62\x32\x95\x7e\x84\x1d\x3f\x5b\xc8\x71\x94\xb3\x1a\x29\xd4\xb8\x47\x61\xc6\xbd\xd1\x85\xfa\x12\x5a\x1c\x2d\xac\x38\x56\x48\x71\x94\x70\xe2\x18\xa1\xc4\xf1\xc2\x88\xe3\x84\x10\xc7\x0f\x1f\x7e\xb6\xd0\xe1\xcf\x22\x6c\x38\xa2\x7f\x2c\x52\xb8\xf0\x4b\x84\x0a\xf7\xd7\x06\x43\x22\x84\x07\xbf\x5c\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x03\x84\x02\xbf\x84\xff\xff\xd9\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\xcf\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x22\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x41\x46\x97\xb7\x61\x81\xa0\xb1\x56\xe2\x6a\x2d\x58\xd4\x9a\xad\xdb\x71\x0d\x73\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\xfa\xe7\xb9\x26\xbd\x31\x8f\x5b\x5c\x95\x9e\xec\x9a\x6f\xc5\x03\x11\x53\x0d\x9c\x9c\x30\xee\x77\xce\x69\xc3\x4a\x53\xbb\x47\x82\xfd\x1d\xa6\xd7\xd7\xaf\xfc\x20\x5f\x9e\xdf\x03\x3d\x43\x4a\xf5\xda\xf3\xe5\x68\x7c\xda\xf5\xe5\x1e\x9c\x96\x59\xdb\xfd\x65\x5d\x62\x71\x7c\x5f\xaf\xc7\xe4\x83\x13\x27\x5e\x23\x3d\x15\x2b\xa2\x3c\x25\x0e\x9f\xeb\xcb\xdb\x27\xc1\xa1\xee\x6d\xe5\xa6\x8a\x4d\x6f\xc7\xb3\xd8\x1b\xd8\x48\x99\x82\x50\xf3\x14\x0a\xa0\x83\xd1\xb5\x37\x46\xd7\x03\x45\x60\x7f\x79\xda\xd6\xcb\x47\x5c\x0f\xda\xd6\x2f\x45\xdb\x6a\xc0\xe2\x7d\x23\x69\x02\xd7\x7d\x12\xde\x3c\x03\xa9\x13\x01\x6b\x19\xae\x62\x17\x1c\xc0\x26\x8e\xd5\xa0\x87\x88\xef\x37\x2d\xb3\x6c\x69\x6d\x88\x2d\x04\xcc\xee\x5b\xeb\x6e\x0e\x6b\xd0\x81\xe8\x4a\xdd\x40\x5d\xad\x9b\x14\x52\x38\x89\x44\x96\x9c\x1b\x11\xc3\x1d\x27\x43\xbc\xd1\x45\x14\xf0\xee\xe6\x74\xda\x02\x36\x74\x41\xe8\x18\xe8\x39\x07\x52\xe7\x2f\xb5\x09\x31\xa3\x4e\x85\x4c\xd8\x24\x5b\x92\x39\xcd\x8c\xb2\xe4\x82\xb4\xef\x59\x96\xb9\x6e\x02\x82\xc2\x41\x5b\xd7\xb3\x95\x68\x32\xc1\x67\x38\x19\xd4\x12\x02\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x4a\x4f\x67\x50\x54\x7c\x63\x74\xa6\x08\x67\xd9\x99\x9f\xf2\x36\x04\xe6\xfa\x9e\xaf\x4d\xca\x0a\x52\x87\x5e\xf9\xc0\x14\x9c\x61\x9f\x9d\x69\xb2\xb4\xf8\xaa\xfd\x76\xdf\xd8\xcf\x0a\x29\x16\x2c\xad\x63\xf4\xcd\xb6\xc0\xf8\xf8\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x51\x14\x8f\x1d\x43\xb3\x11\x9d\x76\x7c\x1b\x3f\xc8\x53\x96\x50\x0d\x0a\x73\x12\x5a\xd0\xb6\x0b\x46\x3b\x53\x62\xde\xa7\xb1\xa3\xc8\x09\x17\x44\x60\x66\x61\xc9\x99\x5e\xa2\x47\x6f\x5e\x6a\x92\x8a\x07\x7e\x1a\x72\x30\x6d\x98\x03\x25\x13\xd0\xb4\x4e\x0e\xf4\x22\x99\x22\xc0\xe9\x24\x33\x67\x0f\x23\xfe\xef\x36\x6e\x00\x32\x05\xaa\x4b\x09\x64\x46\x75\x00\x97\xd8\x20\xcd\xdb\xf5\x7c\x7c\xdb\x31\xe5\xfc\x75\x53\x52\x72\x05\x81\x82\x6c\x34\x15\xa0\x63\xc6\xab\x39\xd1\xa2\xd4\x3d\xb9\x47\xb6\x99\x8e\x6c\xe6\x4e\x43\x49\x64\x39\x28\x22\xca\x00\x4b\x5e\x4b\xfd\x73\xc3\xc5\xd4\xf0\x06\xbb\xd3\xc6\xd6\xd5\x6d\x1a\x63\x87\x5d\x35\xa4\xf2\x06\x3e\x81\x0f\xb7\xb2\x19\xd4\xef\xae\x6e\xff\xfe\xfd\xc5\xff\x7a\xff\x7d\xb7\x85\x7f\x4f\x93\x79\x13\x5b\x9c\x13\x8a\x17\x05\x32\xf9\x39\x5d\x00\xa1\xa4\xe4\xec\xbf\x4b\x17\xf2\x76\x52\x8d\xd7\x91\xad\x46\x49\xef\x09\x12\x7c\xcd\x2d\xd1\x89\x73\xc4\x58\xd3\xef\x99\x42\xa0\x6a\x24\xc2\x05\xfe\x0b\x05\x64\x2a\x45\xbe\xa2\x68\x91\xab\x2a\xb8\x6e\x69\x6e\x18\x6a\x55\xb3\x39\xc8\x6e\x12\xf9\xbb\x8f\xef\x6f\x31\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x31\xb9\xe0\x4b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x1a\xe3\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xcd\x32\xeb\x34\xb2\xd5\x5f\xd9\x24\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x8c\x25\x24\x07\x39\x03\x52\x50\x9d\xcc\x49\x4e\x97\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x5a\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\x6f\x37\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xfc\xf5\xab\x3f\xfe\xf6\xf7\x1d\xd5\xeb\x88\x07\xb7\x6b\xe8\x53\x40\xc8\x53\x3b\xfc\xcb\x6f\x30\x0c\xba\x6e\x21\xc3\xb8\x1d\x62\x77\x3e\x72\x43\xc5\xf8\x2c\x0b\x36\x80\x04\x9b\x01\x43\x8d\x80\xa3\xfa\x0d\xae\xbb\xda\x02\xc3\x2d\x81\x2d\x1a\xba\x9b\x52\xe2\x59\xc1\x6a\x09\xce\xdb\xbd\x1c\x43\x16\xbc\xa1\xd8\x5d\x5e\x7b\x2e\x15\x62\x3f\x42\x6d\xa2\x32\x4c\x59\xf4\x11\x3b\xac\x8d\x77\x38\x23\xaf\xc8\x7f\x90\x4f\xe4\x3f\xd0\x0a\xf6\x87\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x0b\xa5\x2f\xaf\x23\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x99\x30\x67\x8e\x80\x4f\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xb9\xec\xee\xd0\xe0\x82\xcb\x69\x3b\xfa\xff\x85\xf6\x37\x0e\xfc\xad\x50\xfa\xca\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x73\x16\xc0\x1c\xfa\x73\x62\xc3\xe2\x44\xe3\x6d\xdd\xc7\xb6\xd6\x8a\x4d\x1f\x2d\x32\x4e\x49\x69\x94\xa5\x29\x44\x3a\x46\xfd\x26\x80\x0a\x33\x1b\x69\x43\x18\x78\x44\x35\x1a\x5b\x7d\xad\xf2\x0e\xe3\x81\x33\x1c\x2b\xa1\xbc\xab\x0c\x6b\x9b\x84\x29\x48\x69\xf3\x84\x27\x4b\x9f\x6e\x14\xbc\xdb\x82\xb8\x5c\x21\x85\x16\x89\xe8\x0c\x9b\x12\x73\xab\x5c\x3b\x5a\x70\xee\xd1\x57\x5b\x79\xc7\xff\xfc\xee\xfa\x8c\xdc\xbd\xbd\x3e\x23\x42\x92\xdb\xb7\x61\xc1\x4f\x4d\x13\xcc\xd1\xdd\xdb\xeb\xa3\x83\xae\x40\x23\x87\xe9\xee\xed\x75\x87\x4e\xd6\xc3\x67\x73\x5a\x8c\xee\x61\xd9\x51\xba\x8b\x21\x61\x8e\xaa\x8d\x15\xe5\x85\xec\x34\xe7\xb4\xd8\xbb\x37\x09\x34\x65\xbd\x46\x72\xf1\x59\x87\x15\xa5\xf1\x20\x5d\x72\xb1\x80\xd4\x6a\xcd\x7e\x14\xe0\x69\x21\x98\xd1\x91\x06\x9c\x97\xc7\xda\x80\xf3\xb2\x7f\x1b\x70\x5e\x36\xb5\x01\xe7\x65\x8f\x36\xe0\xbc\xd8\x36\xe0\xbc\xb4\x09\xe9\x63\x8e\xd1\x80\xf3\xf2\x64\x1b\x70\x5e\xb6\xb6\x01\xe7\x65\xaf\x36\xe0\xbc\xac\xb7\x01\xe7\xe5\x91\x36\xe0\xbc\x54\x6d\xc0\x79\x19\x70\x5e\x3e\x5f\xae\x3d\xe0\xbc\xac\xb6\x01\xe7\x65\xc0\x79\x19\x70\x5e\x9a\x6d\xc0\x79\xd9\xd2\x06\x9c\x97\x01\xe7\x65\xc0\x79\x79\xbc\x0d\x38\x2f\x9d\xdb\x80\xf3\xb2\x5f\x1b\x32\x0f\xf7\x6c\x03\xce\xcb\x80\xf3\xb2\xda\x06\x9c\x97\x27\x5b\x3f\xcc\xe3\x03\xce\xcb\x80\xf3\xf2\x68\x1b\x70\x5e\x06\x9c\x97\x47\xdb\x80\xf3\xd2\xa1\xf5\xce\xe8\x3a\xe0\xbc\x0c\x38\x2f\x8f\x8d\x31\x68\x5b\xfb\xb5\x01\xe7\x65\xc0\x79\x59\x6b\x03\xce\xcb\x7a\x1b\x70\x5e\x06\x9c\x97\x01\xe7\x65\xc0\x79\xa9\xda\x80\xf3\xf2\xa5\xdb\x9d\x24\x28\xf6\x4f\xb8\x16\x19\x4b\x96\xc1\xd9\x3e\x37\xa0\x44\x29\x13\x73\x63\x63\xb7\xa4\xc0\x7e\x2b\x8b\x42\x90\x90\xdd\x33\x08\x85\x9b\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\xe7\x98\x82\x5e\xc0\x29\xf8\x17\xbc\xea\x1e\x41\x30\xf2\xe5\xb3\xed\xf4\x75\x33\x96\x06\x6b\xed\xcd\x17\xe9\x43\x3a\x67\x13\xf6\xa8\xda\x45\x5a\x54\xcc\x96\x6d\xdd\x5c\xb4\x28\x32\x16\x92\x18\x4b\xc8\x6d\x89\xd2\x05\x38\x17\xb8\x7a\x43\x92\xa2\x3c\x23\x39\xe4\x42\x06\x24\x46\x44\xd0\xe0\x5a\x5b\xa5\x0f\xeb\x74\x63\x09\xf2\x93\xaf\x05\xce\xff\xd2\xea\x0b\x35\x4a\x55\xb5\x56\xcc\xb3\xc3\xa0\x58\xb3\xcb\xe9\x6a\x30\x2a\xd3\x2d\x2b\xd0\x95\xd0\x37\xee\x70\x1f\x6c\xbd\x22\x47\x2c\xf8\x29\x3c\x18\x6a\xd5\x5b\x91\x17\xa5\x86\xd6\xc5\x66\xa7\xd8\x2a\x1d\x4c\x85\x32\xf4\xc3\x64\x83\x26\x82\x4f\xd9\xcc\x69\xdf\xe7\x39\xe5\x74\x06\xa3\x6a\xb6\x47\x35\xd4\xc3\x79\xe7\x8b\xfa\x60\xa9\xa0\x49\x46\x59\xf7\xc0\xc1\x58\x6c\xe2\x2d\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x7c\x56\x85\x8d\x33\xcb\x37\xc6\xfe\x2b\xfb\xe3\xb3\x00\xed\x91\x6a\xb4\x55\xa0\x62\xb4\x61\xa7\x86\x29\x8c\x56\x4d\x4c\xa1\x00\xa3\x11\x58\x03\x6a\x77\xb9\x7f\xc9\x69\xce\x12\x7f\xc2\x2e\xb2\x4c\x24\xd6\x26\xd3\xd6\x2a\x63\x90\x6c\x94\xdd\x3c\x2f\x35\x9d\x64\x30\x26\x97\x16\xa2\x42\xf0\x6c\x69\xce\x9f\x02\xed\x43\x14\xdc\xe6\x0f\xd3\x24\x43\xe2\x5f\x03\x63\x5f\x37\x0a\xe5\xb8\xa9\x2c\xa6\x06\x70\xc3\xca\x04\x07\x02\x5c\xcb\xa5\xd9\x7f\xd7\x22\xbd\x35\x5b\xb0\xf5\x74\x30\xd4\x46\x60\xc8\x6b\x8c\x70\xd7\xc0\x50\xd7\x38\x01\xaa\xe1\xc1\xa9\x71\x03\x53\x6b\x17\x82\x45\x0a\x6a\x66\xfc\xb4\xb6\x45\x21\xd2\xf1\x06\xd6\x44\xc4\x34\x90\x02\x33\xe2\xb5\x48\x8d\xd0\x24\xc1\xf2\xa7\xea\x8c\x5a\x03\xe2\xa5\x21\xee\x1e\x2d\x7e\x54\xd7\xd2\x14\x5d\x50\x96\x99\x03\x1c\x48\xc0\x3a\xea\x62\x98\x57\x26\x92\xaf\xc2\x05\xe7\xf7\x69\xb3\xb8\xb4\xae\x56\x66\x58\x32\x17\x0a\x38\xf2\x4b\x5a\x65\xf0\x54\xf9\x05\x8e\xc5\xa4\xf6\x2e\x0e\x8d\x22\xbe\x9c\x12\xc8\x0b\xbd\x3c\x23\xb0\x00\xb9\xd4\x73\x8c\x36\xa8\x70\x43\x91\xad\x31\x45\x72\x9a\x36\x76\xc7\x19\x11\xde\x00\x1d\x38\x3c\xde\x0f\x4e\x27\x2b\x33\x6d\x35\x34\xa6\xaa\x34\x8a\x43\xef\x9a\xd8\x70\x36\x24\x94\x69\xc6\x84\xa3\x21\x08\xa5\x9a\xb3\x6e\xc0\xb5\x24\xe2\x59\xf8\x1e\xa9\x68\xa4\x8e\x98\x2d\x91\xd3\x4f\x68\x9e\xa4\xb9\x28\xb9\xb6\x38\x35\x56\x63\xa8\xa4\x3c\x9b\x60\xf3\x82\xf1\x72\xcf\x2a\xdb\x93\x38\x57\x3b\x4d\x3d\x34\xc5\x75\x8c\x3c\x65\xaa\x35\x48\xfe\x86\xfc\xef\x93\xbf\xfd\xe6\xe7\xd1\xe9\x9f\x4e\x4e\x7e\x7c\x35\xfa\xf7\x9f\x7e\x73\xf2\xb7\x31\xfe\xe3\x5f\x4f\xff\x74\xfa\xb3\xff\xe3\x37\xa7\xa7\x27\x27\x3f\x7e\xf7\xe1\x9b\xbb\xeb\xf7\x3f\xb1\xd3\x9f\x7f\xe4\x65\x7e\x6f\xff\xfa\xf9\xe4\x47\x78\xff\xd3\x8e\x9d\x9c\x9e\xfe\xe9\xab\xee\xde\xc7\x50\x57\x7b\x3c\x47\x7b\x24\x37\xfb\xb3\x38\xd9\x1d\x8f\x3d\xf8\xe1\x77\x57\xe0\xda\xf1\x77\xde\x89\xc7\x8e\xbf\x0c\xb6\xc9\x5c\x4e\xeb\xf1\x99\x22\x22\x67\x5a\x43\xea\xee\xde\x06\xf6\xcd\x8a\x3d\xc8\x31\x2c\x84\xad\xa2\x78\x7b\x37\x30\x58\x6a\x33\x52\x67\xb2\xaa\xfb\x15\x2d\x60\x9c\xb0\xbc\xc8\x20\x07\xae\x91\xf1\x8c\xbc\x6e\x8b\xe6\xc4\x71\xfd\x06\x89\x35\x78\xc0\xa7\x04\x20\x75\x44\x0e\xbc\xb1\xd1\x06\xde\x38\xf0\xc6\xa7\x5a\xb0\x4d\x3c\x06\x63\xbc\x69\x12\xe1\x6c\x59\xca\x4b\xca\x68\x21\xaf\x20\x12\xc4\x14\x03\x25\x16\x2c\x2d\x69\xd6\x44\x92\xf5\xe0\xa2\xdd\x38\x00\x9a\x76\xda\xa1\x21\xe8\xa6\x85\x05\x64\x15\x11\xd6\x4c\x3f\x26\x7f\xb1\xe1\x3c\x4d\x45\xb3\x6d\x50\xef\xe6\x90\xdb\xf4\xba\x6d\x44\x08\xa7\xea\x1e\xab\x15\x92\xaa\x68\xa3\x3a\x09\xc3\xec\xb6\x6e\x53\x71\x51\x71\x8d\x6c\x79\x46\x14\x68\x9b\x63\x33\x87\x95\x65\xa2\x8a\x1c\x5d\x64\x0f\x74\xa9\x8e\x2a\x9f\x24\xe3\x4c\xaf\x14\x1f\xe8\x44\x03\x62\xc3\x9a\x0e\xa7\xc2\xc8\xbc\x58\x55\x61\x3a\x85\xa4\xa3\x36\x6b\x31\x38\xd6\x69\x73\xf1\xe8\x9a\xf1\xd2\xbc\xad\x9f\x55\x48\x89\xe0\x9d\x06\x82\x4f\x4c\x93\x92\x6b\x96\x19\x61\x9d\x48\x98\x95\x19\x6d\x1a\x02\xdd\x9b\xf9\x30\xb9\x74\x4c\x3e\xf2\x04\x9a\x0f\x77\xb3\x54\xaf\x0c\x60\x84\x87\x0c\x34\xa4\x67\xd8\x75\xfb\xd5\x95\x0d\x34\x6b\x9d\xfc\x6a\x29\x3b\x0d\xef\xe7\xb2\x0a\x24\x1a\xdb\x03\x55\x45\x39\x90\x94\x4d\xa7\x66\x64\x54\xb6\xb9\x90\x39\x5d\xa7\x8a\xf2\xb4\xd3\xe8\xe6\xe4\x62\x7a\x49\x13\xe5\x17\x2b\xbb\x1c\x29\x96\x42\x42\xe5\x51\xb3\x26\xc8\x45\xa6\xe7\xa2\x9c\xcd\xeb\x5d\x11\x36\xe5\x44\x69\x0c\xaf\x32\x93\xa9\xbc\xe5\x62\x65\xb3\x29\x23\xb3\xf0\x04\xac\x68\x25\xc0\x32\x8c\x07\xda\x71\xec\xb5\x10\x00\x1b\xd3\x6d\xd7\xdc\xe7\x5c\x61\x0c\x1f\xa4\x8d\x04\x39\x0e\x9f\x74\x84\x17\x1e\x93\x4b\x0b\x78\x71\xd6\xee\xb5\x35\x25\x76\x32\x1a\x31\x6c\x3e\x1a\xb3\x63\x00\xdf\xca\x00\xac\x4a\x31\x43\x5c\x62\xdb\x39\xe5\x4b\x9f\xd1\x81\x31\x66\x36\x13\xad\x4a\x32\xc9\xba\xd9\xd0\xab\xb3\xf4\xe2\x65\x76\x5a\x27\xf4\xa6\xcc\x0e\xe7\xbd\xbc\x69\x16\xf8\xc8\x5c\x01\x1e\x69\x28\xf2\x59\x3d\x73\x48\xee\xed\xc9\x4b\xc1\xb2\x37\x70\x38\xb7\xa1\xa7\x6b\x2e\xca\x2c\xb5\xa8\xba\x35\x77\x46\x4e\x6b\x43\x28\x2d\x19\x54\x02\x01\xa3\x21\x20\xf4\x08\xeb\xc6\xbe\x85\x4c\xcd\xf6\xb6\x2c\x19\x3b\xb6\x56\x6d\x9f\xee\xe2\x48\x42\x2e\x9f\x08\x6e\xef\xc9\x33\x77\x73\xe7\x94\xf1\xae\xa2\x5d\xfd\x0e\x6c\xc6\x85\x44\xa3\xf5\x94\x70\xd1\xa6\xa1\x7d\xe4\x57\xa8\xe8\x2c\x73\x54\x71\x48\x1b\xa5\x9d\x7a\x39\xed\xf8\x0f\x73\x30\xda\x5a\x9b\x96\xae\x6c\xbb\xb1\xa2\xd2\x70\xc4\xb1\x21\x46\x69\x49\x11\x26\xd9\xe5\x53\xc8\xae\x1b\xdf\x08\xdd\x17\x9a\xe4\x42\x69\xf2\xdb\x57\x8d\x39\x0e\xb2\xa3\x8d\x08\x9e\x44\x74\xf8\x55\x62\x0a\x22\x5d\x50\xcc\x85\xea\xda\xeb\x65\x0a\x5c\xb3\x84\x66\x0d\x42\xcd\x25\x31\x15\x72\xc2\xd2\x14\x30\xb4\x1d\x0b\x42\xa0\xca\xd9\x51\xd3\x45\xd1\xb5\x1e\xa0\x11\x03\x52\x6f\xac\x0f\x7f\xbe\xbd\x43\x1f\x66\x5b\xde\xab\x75\xfe\x6e\xa2\xd1\xc2\xbc\x82\x36\x4c\xa1\xb9\x9f\xad\x38\xdb\x1a\xe9\xcb\x08\xe9\x33\xef\x63\x76\x4a\xc3\xd0\x33\x17\x0f\xeb\x7c\x84\x19\x91\x8d\xa7\x9d\x13\x1e\x7b\x10\xc7\x67\x37\xfe\x81\x62\xef\xec\xe0\x7d\x88\xe6\xba\xad\x72\x23\xcd\xc6\xa6\x2e\x33\x92\xde\x03\x37\xac\x6c\x7d\xe1\xa7\x15\x86\x16\x93\x68\xee\x0a\x81\x86\xc2\xd3\x4c\x35\x53\xe6\x34\xdb\x8b\x11\xdd\x4d\x85\x70\x15\xdc\xaa\xb8\xe7\x23\xb7\x39\x8f\xcc\x65\xed\x99\x7d\x18\xa6\x75\x04\xc7\x67\x04\xeb\x88\x99\xd5\xb7\x22\x0d\xb1\x71\xad\x84\x3b\x54\x42\x8f\x4d\x99\xc1\xfb\x36\xb5\x32\x0f\x0a\x3c\x66\x5d\xdb\xab\xfa\x65\xc4\x39\x98\x33\x49\xb5\xe8\x6e\xef\x8a\x13\xeb\xe0\xc9\xe8\x97\x0b\xbb\xb5\x29\x24\x64\xf6\x3a\x9e\xb3\x82\x4c\x40\x3f\x00\xf0\xcd\x72\x5a\x0a\x27\xea\xd4\x1b\x6a\x02\x89\xa8\x43\x43\x6d\x88\xed\x98\x5c\xb7\x8e\x39\x5e\xee\xe1\xc8\x6e\x97\xfc\xcd\x2a\x8b\x42\xc5\xcb\xb3\x19\xcf\xc2\x36\xbc\x2b\x06\x48\x85\x85\x73\x55\x2f\x0b\xa8\x6d\xac\xbd\x73\xf0\xeb\x5d\x09\x1d\xf6\x86\xc1\xaf\x66\xe4\x3b\x67\x30\x78\x96\xb7\x8c\x14\x49\xe2\xe2\xb8\x7b\x74\x0a\xdb\x57\xad\x9b\x3b\xb7\xf5\x2b\xe6\xdc\x0a\xc1\x6b\xb0\xef\xd0\x9d\x53\xe9\x14\xbf\xff\x3d\x01\xeb\xa8\x8a\xa0\x57\xf8\x16\x07\xf2\x32\x0a\xe8\x65\x3c\x9c\x6b\x12\x0d\xeb\x9a\x3c\x12\x16\xd2\x0d\xdd\x35\x72\xa4\xb9\x82\xa4\x94\x4c\x2f\x8d\x2e\x00\x9f\x3a\x19\xac\x63\x9c\x95\xdb\x36\x19\x2d\xa7\x8a\x27\x91\x88\xc2\x56\xf0\x58\x29\x8f\x5d\x5b\x5c\x4a\x8e\xb6\xe2\x6e\x3b\xfa\x72\x6a\x56\xc4\x9a\x47\xd0\x51\x82\x41\xcb\xab\x84\x79\xa7\x8b\x95\xb1\xfe\xbb\x64\x0b\x9a\x19\x36\x5c\xff\xe2\x1a\x33\x34\x9b\x3f\x7a\xce\xc8\x76\x4d\xd5\x7d\xed\xde\x85\x51\x21\xd2\xda\x9b\x7b\xee\xa7\x0e\x3f\x82\x4f\xfa\x33\x8c\x6a\x47\x2e\x75\x2d\xd9\x82\x65\x30\x83\xf7\x2a\xa1\x56\x84\x39\x74\x64\xc4\xc5\x16\xba\x70\x67\x4a\x91\xa9\xca\xf6\x44\x7d\x7e\x3a\x1a\x61\x66\x94\x71\xac\xed\x1c\x20\xad\xba\x41\x95\x4d\x90\x67\x5a\x91\x82\x4a\xb3\x0b\x7d\x22\xbc\xf5\x67\x4c\x84\xc8\x5c\x31\xa0\x6c\x59\xd3\xc5\xba\x87\xb0\xa2\x01\x5d\xfc\x9d\xc3\xc3\xdf\x0d\x15\x8a\x4c\x33\x3a\xab\xfd\x29\xe6\x62\x5b\x95\x27\x83\x73\xf3\xb7\x4e\x34\x56\xba\x29\xcd\x3d\xf6\x40\x97\xaa\x46\x2d\x68\x9a\xdd\xbb\xdf\x28\xaf\x4f\x91\x9f\x50\x45\xaa\xb1\xbb\xf9\x7b\x4c\xfb\xed\x29\x1a\xf7\xdf\x5e\x5c\xff\xfd\xf6\xaf\xb7\x7f\xbf\x78\xf7\xe1\xf2\xaa\x73\x67\x57\x42\x83\x0d\x6d\x69\x38\x75\x93\x2a\x9d\xc6\xac\x42\x95\x91\x35\x16\x6a\x8c\x71\xab\x08\x99\xcb\x53\xf1\x10\x18\xdc\x6f\xf6\x14\xd0\x6e\xd6\x13\x5a\x14\x17\x32\x17\xf2\x5a\x8a\x29\xcb\x3a\x4b\xfc\xb1\x4e\xf0\x0a\x39\x3e\xcc\xf7\xc2\x7d\x5c\x5f\x37\x16\xc5\x71\x3d\x9b\xa4\x71\x65\x30\xc4\x0a\x34\xdd\x74\x0f\x2b\x5a\x75\xe7\x1f\xab\x55\x12\xbb\x1f\xa2\x83\xee\x99\x83\x63\x64\x19\x32\x3a\xfe\x3c\x86\x69\x20\x13\x09\xcd\xb0\x4a\x74\xd8\xc6\x27\x91\x15\x93\x55\xba\x1a\x98\x1e\xd4\x6f\x67\x92\x09\x9a\x5a\x1f\x96\x65\xfe\x29\xf8\xda\x65\x5e\xec\xc2\xac\x85\x20\x42\xee\x2c\x9e\x02\x8e\xe7\x41\x48\x0a\x09\x95\x54\xb3\x32\xbc\xb0\x25\xdb\x82\x86\xfc\xd0\xce\x01\x71\x6f\xd9\x82\xcb\x0a\x3d\x73\xd5\x30\xee\x80\xb1\x29\xda\x53\xd0\xce\x69\x14\xf5\x65\x61\x0d\x9c\xdf\xfb\x65\x08\x28\x2f\x1b\x49\x79\xc6\x4e\x7a\xb2\x3b\xed\xfc\x54\x3b\xd2\x26\x83\xdf\x33\x33\x83\xd3\x9a\x49\xfb\x6d\xe3\x65\x10\x9b\x11\x1e\xb8\x1f\x7f\xc0\x42\xe6\x9e\xff\x47\x30\x4e\x55\x4b\x4c\x46\x8d\xa3\x55\x48\x18\xad\x1f\xaf\x50\x7d\xff\xa6\xe4\x9a\xe5\xe0\x11\x46\x47\x2b\x32\x91\xb4\x5f\x1f\xab\xaa\x9e\x4f\x94\x8d\x4e\xc8\x9f\x39\x9e\x57\x0e\x29\x19\x11\x2e\xea\x25\x02\x3e\x15\x32\x41\xc3\xc3\x41\x37\x78\x42\x0b\x3a\x61\x19\x0b\x61\xe6\xb1\x36\x38\x96\xc7\x6c\xd0\x83\x31\x40\x69\x7a\x9e\x4a\x51\xd8\x9b\xd8\x43\x7f\x85\x67\x65\xb6\x21\x66\x9a\x95\x9c\x9c\x25\xaa\x45\xc8\x4c\x52\xae\xeb\xf8\xbd\xb5\x8d\xf3\x4b\x94\x41\x62\x08\x01\x34\x8d\x57\x68\xf6\x22\x35\x3c\xa3\xb9\x6c\xc1\xe7\xaa\x6f\x45\x6b\xde\xfa\x97\x6b\x60\xcc\x90\xeb\x8f\xb7\x97\xff\xef\xca\xb9\xe9\x2e\xda\xd9\xd6\xef\x92\x15\x86\x1f\x44\xdb\x36\x37\xae\xce\xf7\xb0\x71\xbe\xec\x8d\x53\x19\x88\x0e\x8e\xb7\x7d\x53\x36\x3d\xce\x8c\x37\x48\x23\x79\x90\xac\x73\x5d\x41\x53\xb6\x7b\x6d\x06\xe8\x4a\x20\xe6\x11\xae\x19\x86\x4b\x37\xac\xb5\x5a\xd8\x52\xd6\x4e\xec\x0a\x2b\xc5\xd0\xbc\x5d\xa7\x34\x53\x9f\xeb\x15\x19\x62\xda\x29\xa4\x48\x3e\x88\x92\xc7\x01\xf0\x0e\xd8\x71\x15\x21\x24\x05\x2e\xb4\xb3\xa6\xa0\x2e\x21\xa6\xf8\x2d\xb1\x39\x6b\x8d\xda\x1c\x2d\x39\x27\x40\xcc\xba\x6b\x88\x56\x55\xfc\x8a\x97\xc3\xad\xfe\x52\xaa\xb5\xc0\x48\x27\x57\xd5\x29\x6c\xd3\x80\x48\x06\x09\x34\xb5\x81\x34\x54\xcf\x2d\x68\x7c\x4e\xd5\x3d\xa4\xf6\x83\x40\xc0\xcc\x0a\x1c\x13\x43\xe1\xfc\x4c\xdf\x99\xc9\xf5\x98\x25\x68\x10\xb6\x41\xb6\x88\xa0\x19\xa2\x8a\x1d\xf4\x34\x04\x30\x76\xb3\x08\x1f\x79\xb6\xbc\x11\x42\x7f\x5d\xd5\xc4\x3f\xf4\xc9\xf8\x4b\x15\x0a\xdb\x34\x62\xa2\x5d\x9a\x22\xc9\x23\xdc\x38\xc8\x17\xa7\x15\xd5\xe1\x25\x2e\xcc\xca\xfd\x42\xb9\xa2\x2c\xf9\x85\xfa\x46\x8a\xb2\xb3\x0c\x17\x53\xdf\xfc\xe6\xf2\x1d\x5e\x7c\xa5\xc3\x54\xe6\x5a\x2e\x0b\xc1\xb8\xf6\x16\xaf\x88\x4e\x9b\x3f\x3b\xf4\xea\x26\x67\x0b\x06\xaa\x25\xe4\x03\x5d\x12\x9a\x29\x51\x99\xd4\xf8\x26\x77\xab\xf7\xe5\x9a\xaf\x27\x42\xcf\xd7\x9c\xb8\x5d\x53\x77\x4c\x5b\x1f\xef\xac\x01\xcd\x5c\x07\xc4\x30\xbe\x36\xac\x46\x54\x97\x42\x42\x02\x29\xf0\xe4\x73\x3d\x11\x87\x46\x0a\xc6\x53\x75\x25\xb8\x61\xaf\x87\x3e\x57\x97\x95\x7d\xd2\xad\x46\xf3\x14\xa1\x29\xdb\x39\x11\x29\xa2\x6a\x23\x73\x2d\x55\x48\xe4\xe9\xe5\x14\xbd\x9e\x76\xd3\x7d\x57\x4e\x20\x33\x8b\xcd\xb2\xcc\x47\xdb\xdb\xd0\x04\x96\xd3\x19\x10\xaa\xab\x43\xa8\x05\x01\xae\x4a\xe9\xf6\x4d\xc7\xac\x2a\xd3\xaa\x84\x30\xf7\x6a\x7f\xbe\x7c\x47\x5e\x91\x13\xf3\x6e\x36\x62\x70\x4a\x59\x86\x40\xdd\x3e\x56\xb7\xa9\x03\x4c\x7d\x4e\x59\xd0\x14\x20\x1f\x21\x42\xda\xab\xe5\x8c\x70\x41\x54\x99\xcc\x1b\x19\x07\x95\x45\xd8\x55\x6d\x0a\x02\x22\x19\xd8\x4e\xbc\xfb\xf0\xcf\x0a\x3a\x87\xc8\xc6\xbc\x0e\xff\xfc\x82\xd7\x61\x53\x45\x34\xc7\xbf\xbd\x60\xf6\xac\xe6\xa0\x69\x4a\x35\x75\xd7\xa4\x7f\x60\xd8\xb5\xc3\x65\x19\x70\x59\x2a\xf8\x9e\xf1\xf2\x93\xad\x8b\xd2\x0b\xb7\xc7\xed\x7b\xa4\x88\x24\x7e\xa1\x45\xc3\x6f\xe7\x3d\x14\x11\x52\x34\x2e\x5b\xc7\xe8\x6c\x8b\xd6\x8d\xb7\x04\xb5\xd8\x9b\x98\x45\x49\x79\x2a\xf2\x35\x22\xa7\x42\x12\xa0\xc9\xbc\x33\x35\x8d\xa8\x91\xe1\x60\xba\xf6\xcb\x76\x08\x61\xfa\x6a\x34\xdb\xfe\xf7\x98\x0c\xcb\x54\xb5\x73\x6d\x76\x6c\x46\x27\x90\x39\x58\x5c\x8b\x95\x1e\xf1\x84\x45\xb2\x81\x4b\x11\x31\x24\xe6\x46\xd8\x48\x2e\x5a\x4d\x84\xe9\xfe\xb3\x98\x87\xa8\xc1\x17\x77\x2e\xba\xa4\x9e\x07\xb4\x81\x7e\x0e\xf3\x50\x06\x08\x88\x64\x75\x1e\x8c\xb4\xd9\x9e\x07\x94\xbf\xfa\x3e\x0f\x0a\x92\x44\xe4\x45\x4f\x22\x25\xef\x6c\x14\xbe\xa1\x68\xd7\xa8\xc8\xf6\xc3\x34\x28\xdc\xd9\x55\xbb\xa2\xda\xde\x83\xbe\xe4\xd5\xff\xaf\x71\x9d\x23\xb7\x5b\xbd\xe3\xdd\xe8\xc1\x11\x99\xd5\x88\xae\xc3\x5f\xe2\x8d\x37\x84\x61\xb6\xda\x8b\x87\x61\x36\x10\xf3\x29\x9a\xe7\x5b\x21\x91\x5f\x42\x30\xa6\x51\x02\x70\x5e\x81\x23\x0a\x50\x41\xf5\xfc\xcc\x65\xac\x2e\xc0\xb3\xe7\x7b\x6b\xf1\x3a\x46\x8e\xe3\x09\xf2\xec\xa6\x8e\x59\xb5\x48\xfa\x51\x63\x37\x37\xc5\x6b\xda\x67\xae\x3e\xde\x35\x71\xf4\x29\x5f\x5a\x8c\xc8\x00\x54\x33\xdb\xfa\x27\x56\x3c\x67\x4c\xe7\xea\x2a\x3e\x77\x48\x67\x50\x7f\x9b\x23\x3a\x5f\xee\x94\xee\x16\xe5\xb9\x1a\xe3\x19\x95\x84\xd5\x80\xcf\xf5\x31\x22\xac\x5c\xf0\x11\x70\x57\x67\x8f\x0c\x20\x7f\xb1\x14\x79\x2d\x3b\xf1\xa0\x85\xaa\x69\x04\xa1\x59\x16\x25\x26\x61\x93\x15\xc4\x9f\x82\x0a\x4a\x7e\xdd\x1a\xd0\xae\x69\x1a\x32\xfa\x13\x16\x8c\xcf\xdb\x12\x91\x19\x8d\xe2\x33\xb7\x43\xcc\x72\x45\xdf\x4a\x48\x6d\x9c\xd4\x6d\x01\x49\x5f\x6e\x8b\x6f\x3e\xdc\x5e\xb4\x29\x43\x59\xd8\x15\xce\x00\xfc\x9e\xd0\x34\x67\x4a\xa1\xc3\x07\x26\x73\x21\xee\x83\x86\x3c\xf1\xa9\xb6\x33\xa6\xe7\xe5\x64\x9c\x88\xbc\x91\x75\x3b\x52\x6c\xa6\xce\x1d\x47\x19\x99\x89\x3b\x25\x8c\x67\x55\xa6\x32\x5a\x0b\x11\x0b\xac\x3b\x94\x5c\xf3\xe5\x49\x52\xbd\x3d\x6e\x3d\xcc\x4f\xa9\x42\xb3\xd7\xa7\x07\xab\x9b\xe0\xe6\x3d\xb8\xd4\xb1\xbe\xab\xc2\xaa\x0d\xae\xec\xac\x2d\xef\xde\xac\xd4\xe1\xbc\x38\x1b\xe7\xd1\x2a\xaf\x07\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\x6f\x6b\x92\x9a\x58\x7a\x6c\xda\x42\x84\x6a\xe7\xdc\xa3\x7b\xfb\xd8\xfc\xd2\x87\x65\x1e\xc7\x2a\x2e\x73\x91\x65\x66\x21\xa9\x03\x5e\x6b\x44\x77\xa2\x6a\xd2\x46\xb4\xb3\x98\xbb\x46\x59\x68\xbe\x05\x5e\x24\x61\x4c\xc1\xe2\x9e\x99\xcb\xc0\x61\x66\x98\x0d\x84\x63\x53\x92\xb3\x4f\x86\xc2\xe6\x88\x6d\x90\x58\x74\xfc\x6f\xfe\x3a\xa0\x80\x35\xc1\xe0\x83\x0a\x33\xfd\xcc\xac\x50\x73\x10\x9f\x1c\xad\xcd\xb5\x65\xbe\xb8\x02\x6d\x14\x35\x3b\x6f\x4d\xef\x83\x51\xac\x64\x19\xe1\x30\x84\x78\x86\x49\xd3\x3b\x1c\x95\x53\x04\x9e\x07\xf4\x14\x3b\x9a\x8c\x0c\xe2\x85\xb7\x97\xf2\x1c\x93\x0d\xe9\x3b\x2f\xe6\x41\x26\xbb\x7b\x91\x9f\xd1\x57\x45\xfa\xe2\xaf\x0a\xe4\xfa\x4d\xac\xdf\x83\xe1\xac\x34\xf1\x86\xd9\x7a\xf0\xd2\xb5\x48\xd7\x60\x88\x11\xcc\x98\xd1\xac\x7b\x21\xd7\xcb\x69\x13\xba\x93\x0b\x67\x1e\xb1\x15\xc4\x6d\x9c\xfe\x27\x48\x4a\x0d\xa9\x43\x23\x77\x26\x65\x8b\x64\xdc\xa6\xa6\x33\x05\x3e\x49\x7f\x02\x18\xa0\xa4\xce\xea\x52\x6c\x4e\xd7\xa9\xf0\x5d\xcf\xc8\x7f\x21\x97\x54\x1e\x50\x2b\x63\x0b\xe0\xa0\xd4\x75\xf5\xf3\xae\x53\x81\x71\xd4\x09\xe5\x5e\xb7\x32\x67\xda\x59\xb8\x1d\xea\xb8\xc3\xf1\x98\x00\x29\xa8\xa4\xb9\xb9\x83\x15\x71\xcb\x33\x81\x19\xb3\x69\x81\x8d\x4b\xb1\x82\x2d\xef\x06\xaa\x8b\x8a\x0d\xd3\x24\x67\xb3\xb9\x3d\x2d\x84\x92\x4c\xf0\x19\xf1\x71\x63\x99\xa0\x29\x41\xc6\x22\x24\x79\xa0\x32\x37\xb2\x00\x4d\xe6\x18\x84\x46\x39\x49\x4b\x73\x1e\x08\x82\x6c\x2f\x47\x4a\x53\x0d\x0e\x0c\xaf\xb3\x0d\xce\x4f\xd3\x01\x4a\xc4\x3e\x77\xf9\xfb\x03\xe3\xe9\x98\x93\x16\xc5\x0a\xf2\xfe\x13\x24\xd5\xb1\xb6\x88\xd3\x79\x8e\x80\x81\xc2\x1f\x67\x8f\x16\x17\x2c\x0c\xf6\x44\x55\x76\x6f\xd8\x17\xd9\xe4\xad\x9b\x70\xe6\xb5\x4f\xfb\xa7\xd1\x47\xdb\x8b\xa0\xbc\x13\xab\x51\x34\x09\xd1\xb1\x85\xbc\x37\x27\xd7\x62\x04\x09\x59\x55\xeb\x0f\x22\xcb\xd3\x81\x90\xd9\x42\x68\x72\x72\x7c\x7e\x7c\xba\xb6\x17\x8e\x55\x33\xcd\xc0\x66\x44\xd7\x2f\xa4\x58\x5e\x64\x4b\x7c\x87\x63\x5b\xf2\x3b\x10\xc0\xd0\x07\xac\x56\xe5\x2f\xd5\x1c\xb2\xec\x8c\x28\x23\xfe\x52\x5f\x43\xc4\x7e\x6a\x1e\xd2\xb2\x4c\xac\x99\xec\xe4\xf8\xe7\xe3\x33\x02\x3a\x39\x25\x0f\x82\x1f\x6b\xeb\xf0\x20\x77\xa8\x43\x06\xd1\x54\x11\xb1\x14\x25\xe1\x00\xee\xec\x54\xc5\xaa\x12\x6a\xd4\x9f\xd2\xca\xe8\x16\x74\x03\xb2\x2c\x4c\x9e\x7b\xff\x89\x69\x23\x8a\xe8\x12\xcd\x14\xaf\xac\xa6\x00\x88\x43\x4f\x15\xde\x74\xe7\x73\xa0\x99\x9e\x2f\x2b\xed\xe5\x9f\x20\x05\xd6\x27\xe5\xee\x9b\x70\x19\xaa\x07\x69\xa3\xfd\x4d\xe0\x34\x02\x46\x29\xe1\x6e\x2e\x41\xcd\x45\x76\xf0\x34\xce\x0f\xae\xdc\x5b\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\x59\x99\xc5\xd5\x57\x10\x78\xca\x24\xa4\x4e\x58\x72\x25\x2f\xe6\x74\x81\x92\x82\x91\xe7\x20\x0d\x51\x4d\x9a\x3a\xd1\xef\xc6\x15\x85\x55\xda\xdd\xeb\x9e\x84\x6d\x76\xc4\x8e\x9c\xc9\x22\xce\x2d\xfd\xcd\xcd\xf5\xdb\xd6\x2d\x8d\x1f\x7c\x8b\xc7\xf8\xed\x1c\x92\xfb\x9b\xb0\x6a\xae\x3d\x09\x2d\x28\x84\x3c\xa4\x60\x60\x86\x8f\x26\x15\x5c\x0b\xa9\x09\x2f\xf3\x09\x48\x6f\x50\x98\xe1\x2a\x82\x5c\xb0\x04\xc6\xe4\xca\x7e\xe7\x9d\xf3\xbe\xfa\x30\xe5\x33\x20\xaf\xcd\x81\xf8\xc3\xef\x7f\xff\xbb\xdf\x87\xf3\xe8\x70\x20\xd5\x38\x20\xaa\xee\xc5\xfb\x22\x76\xdd\x5a\x72\x36\x19\x9b\x1d\xa5\xa8\xd4\x65\x34\xa9\xd6\x66\xb6\xf9\xd0\x85\x59\x25\x15\x00\xd9\xe0\xae\x30\xac\xc3\xfe\xdf\x24\x13\x93\xf3\x9c\x2a\x0d\xd2\xe8\x38\xee\x5a\x1f\x21\xdc\x30\xe3\xb3\x71\x9e\x9e\x8e\xc3\xbc\xe0\x5e\xad\x5e\x2b\x29\xd7\x82\x99\xd9\x52\x1e\xce\x4c\xca\xc1\x4d\xf0\xc4\x53\xf9\x86\x1c\x75\xab\x26\x66\x96\xe0\x1b\x88\x93\x89\xf6\xed\xdd\xdd\xf5\x37\xa0\x9b\x0c\x9b\xe3\x87\xe4\x9b\xf7\x77\x55\xb9\x71\xb3\xbb\x6c\x52\xd3\xc0\xb5\x43\xb8\xf6\x5c\x84\xd5\x9b\x8f\xed\x77\xb1\xac\x04\x6b\xa3\x71\x0e\x89\x59\xe8\xb3\x56\x65\x5b\x1f\x87\x78\x79\x3d\x26\x7f\x15\x25\x8a\x5c\x74\x92\x2d\xc9\x03\xb5\x88\x06\xdd\x20\xa5\xeb\x76\x64\xc8\x38\x32\x5c\xcb\xec\xea\x6f\x81\xa6\xb6\x56\x25\x9a\x76\x0e\x7e\x56\x1b\x34\x45\x5b\xb6\xb7\xa5\xd2\x22\x27\x73\xf7\xaa\x76\x0e\xeb\x82\xfe\x56\x36\xb2\x47\x10\x7d\x3f\x8a\x48\x28\xac\xb6\xe4\x7e\xf3\x45\xe8\x42\x6b\x5c\xc8\xce\x73\xa3\x1a\x10\x25\x49\x73\xaa\x9c\xa0\x8f\x26\x4c\xe6\x78\x54\x67\x93\x58\xdd\xa2\x54\x15\x21\x91\x2a\x8b\x10\x64\x52\xe6\x50\x06\x77\x12\xee\x84\x8c\x53\xa3\xc4\x34\x1e\xe8\x5e\xb3\x2d\x6e\x85\x04\xe2\x5c\x6d\x6e\x73\xd9\x00\x1c\x43\x68\x28\x2a\x21\xf1\xc6\xe4\xaa\x80\x2a\xe5\x82\xb3\xc4\xba\x33\x48\x59\x08\x4e\x44\xa9\x8b\x52\xa3\x29\x28\xa1\x0a\x46\x0b\x2a\x99\x61\xa8\x66\xfc\xfa\x87\x25\x37\xa7\x5d\x0b\x81\x76\x92\xca\xe9\x6c\x29\x0e\x27\x33\x92\x34\x43\x7c\x01\x8c\xc8\x2b\xbc\xb6\x38\xe1\x3b\x9a\xf4\xda\x06\x43\x6c\x0d\xf1\x79\x3c\xb5\x8e\xea\x39\x46\xf6\xa1\x2f\xcb\x07\x86\x22\xe3\x34\x6a\x43\x0f\x12\x6f\xa2\x6a\xb1\x81\x2c\x01\xfd\xed\x42\xae\xe8\xc1\x86\xc2\xf5\x39\x8c\x14\x6b\xf2\xfc\x6a\xb5\x7b\x2d\x3f\x02\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\xfd\xfb\xd5\xc5\x87\xf7\x21\x5d\x07\xd7\x8e\x8f\x59\x3d\x3e\x5a\xfd\xf8\x67\xa8\x20\xef\x9b\x4a\xe6\xd0\x9f\x30\x93\x5b\xa4\xa6\x09\x4a\xe6\x74\x80\x46\x3d\xe4\x30\x94\x3a\xb2\x62\x34\x35\x8c\xe7\xa0\x1c\xc7\x45\x15\xbc\x83\x8c\x2e\x6f\x21\x11\x3c\x3d\x78\x74\xf6\x55\xc5\x6c\x94\x25\xa8\x2a\x03\x0d\x2b\x88\x59\xbe\x10\xac\x2b\x5e\xed\xe3\x03\x9a\x21\x0d\xf6\xfd\x3a\x7b\xad\x49\xff\x3c\xd7\xa4\x37\xe6\xf1\x02\x24\xc3\x88\xa0\x3e\xec\x9a\x6f\xc5\x83\xab\xe8\x7e\xc2\xb8\xdf\x39\xa7\x0d\x2b\x4d\xed\x1e\x09\x47\x53\xd3\x82\xbc\x7e\xe5\x07\xf9\xf2\xfc\x1e\x2e\xd2\xa7\xd7\x9e\x2f\x47\xe3\xd3\xae\xaf\x3a\x6c\xa9\xed\xfe\x0a\x89\x1f\x22\x2b\x6c\xfc\xf5\xb8\xca\x53\x7b\x8d\xf4\x54\xac\x88\xf2\xd4\x87\x9c\x7d\x79\xfb\x44\x27\xc5\xad\x48\xee\x23\x99\x5d\xef\xde\x5e\xdb\xde\x56\xe2\x59\xec\x0d\x6c\xa4\x4c\x41\xa8\x79\x0a\x05\xd0\xc1\xe8\xda\x1b\xa3\xeb\xb1\x4d\xeb\xa2\xd9\x9b\xbd\x0d\xa8\xc7\x83\xb6\x55\x37\x2f\xf8\xc8\x76\x05\x94\x41\xdb\xda\xd2\x06\x6d\x6b\x8f\x66\x93\x48\x30\x18\xf4\x1b\x49\x13\xb8\xee\x93\xf0\xe6\x19\x08\x49\x4b\xe9\xca\xca\x55\x32\x5c\xc5\x2e\x38\x40\x6a\xf9\x87\x7b\x15\x20\x33\xf3\x26\x36\x3c\x1a\x6d\x88\x75\x60\x71\x29\x03\xc4\xbc\xbb\xb9\xeb\xda\x89\xb8\xde\xc9\xbc\x89\xba\x5a\x37\x29\x2a\x30\x74\x5f\x35\xc4\x1d\x27\x43\x3c\x96\x5a\x07\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x99\xe9\x72\x95\xa1\x6d\x8c\x70\x55\x7a\xaf\x26\xc4\x8c\x3a\x15\x32\x61\x93\x6c\x49\xe6\x34\x33\xca\xd2\x03\xd3\x73\x42\xc9\x3d\xcb\x32\xd7\x4d\xf7\x89\xba\x05\x97\xab\x69\x25\x9a\x4c\xf0\x19\x4e\x06\x75\x39\x19\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x46\x48\xcb\xf0\x8e\xef\x4a\x9e\xe2\xcc\xc1\x8f\xd8\xc2\x6d\x8f\xee\xf9\x76\x72\x2d\xf9\xa8\xe7\x20\x1f\x98\x02\x5b\x48\xae\x33\x4d\x96\x96\x76\x19\x39\xfb\x59\x05\xa1\xe2\x32\x07\xcd\xb6\xc0\x54\xd6\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x59\xa0\x06\xc7\xd0\x6c\x44\xa7\x1d\xdf\xc6\x0f\x56\xd9\x06\x4a\x8b\x82\xb0\x3c\x87\xd4\xe8\xc7\xd9\x92\x2c\x18\xed\x4c\x09\x82\x42\xd4\x3b\x8a\x9c\x70\x41\x44\x61\xae\xae\x92\x33\xbd\x44\x8f\xde\xbc\xd4\x24\x15\x0f\x3c\x20\xdf\xea\xce\x85\x39\x50\x32\x01\x4d\x9d\x0d\xdc\x1c\x82\x0a\x13\x1d\xe1\xce\xcd\xd9\xc3\x24\x81\xbb\x8d\x1b\xa0\x82\x49\x9f\x51\x1d\xc0\x25\x36\x48\xf3\x76\x3d\x1f\xdf\x76\x4c\x39\x7f\x5d\x20\x0e\x73\x3f\x90\x0d\xcd\x89\x16\xa5\xee\xc9\x3d\xb2\xcd\x74\x64\x21\x2e\x1a\x4a\x22\xcb\x41\x11\x51\x46\xaa\x37\xf1\xda\x0d\x17\x53\xc3\x1b\xec\x4e\x1b\x9b\xd2\x29\xeb\x54\x75\x38\xc6\x16\xdb\x02\xde\xef\xf2\x70\x1b\xf8\x95\x93\x72\x3a\x05\x89\x37\x1d\x12\xbc\x16\x76\x5f\xd5\xf1\xf2\x77\x58\x37\xe3\xad\x0b\xf8\x02\x7d\x86\xb5\x03\x1c\x98\xc4\x96\x21\x1d\xc8\x26\x96\xe9\x95\xa0\x10\x0b\x9e\x93\xf7\x1f\xbf\xee\xb6\x45\x63\x54\x16\x08\x4b\x59\xc5\xf7\xfc\xc8\xbb\xc5\x24\xc6\xdd\x0f\x9b\x50\x5f\xdc\xb6\x48\x32\xa1\x5c\x7a\x34\xae\x4b\x32\xa7\x9c\x83\x37\x46\x31\x8d\x96\xec\x09\x00\x27\xa2\x00\x1b\x94\xd7\x89\x18\x4a\x14\xe3\xb3\x0c\x08\xd5\x9a\x26\xf3\xb1\xa1\x8e\xfb\xbd\x50\xe7\x21\xbb\x4f\x94\x96\x40\x73\xbb\x27\x24\xe4\x94\xd9\xe1\x09\x4d\xa4\x50\x8a\xe4\x65\xa6\x59\x51\x75\xd6\xcd\x8a\x08\x88\x08\xa1\x6c\x5a\xaa\x5f\x2b\x4c\x2b\xa9\x13\x9e\xcf\x6a\x0a\xdd\xeb\x8b\x66\xb1\x22\x34\x9d\x9d\x99\x6f\x21\x2f\xf4\xb2\x4a\x4c\xec\xa6\x03\x4d\x99\x54\x9a\x24\x19\x03\xae\xdd\x9b\x59\xc8\x41\xa4\xe1\xcc\x8b\xd3\xdc\xcd\x88\x72\x53\xc2\x53\x54\xbe\x0b\xad\x6c\xfe\x5d\x45\x84\xef\x2a\x65\xca\xd9\x3a\x54\xb7\xec\x3f\xea\x2b\xd3\xd8\x8d\xe3\x67\x04\xb7\x8e\x17\x70\x2c\x45\xee\xa3\x06\x09\x8d\x3a\xdb\x75\xee\x64\x18\x5f\xc1\xf2\x31\xfe\x5c\x9f\xb5\x30\x07\x6a\xdd\x02\x53\x61\xd6\xb8\x0e\x6e\x28\x0e\x0b\x73\x0e\x20\x01\x23\x8a\xd2\x88\x4c\xe6\xc5\x79\x4c\x43\x96\xfb\x00\x4a\xd1\x19\x5c\x77\x0c\x47\x88\xc1\x70\x6a\x43\x1b\xc6\x31\xd4\xdb\x66\x0e\x16\xe8\x4a\x8b\xc6\x27\xcd\x24\xaf\xa6\xf2\x98\xdb\x17\xe9\x44\x81\x57\x9a\x1e\x24\xd3\x1a\x70\x97\x62\x25\x27\x0c\x40\x5b\x05\xef\x6c\x27\x97\x75\x1a\xcf\x4d\x7a\x73\x3c\x23\x7e\xf0\xd4\xa6\x69\x4d\x80\x4c\x24\x83\x29\x99\x32\xcc\x1b\xc3\x8c\xaa\x33\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x92\x19\x66\x71\x39\x25\xf8\xdf\x5e\xfd\xfb\x1f\xc8\x64\x69\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xcc\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfe\xed\xfd\x24\xe8\xe8\x21\x7f\x3c\x4f\x61\x71\xde\xd8\x42\xa3\x4c\xcc\xba\xf5\xfa\x36\x46\x36\x71\x90\x9d\x6d\xc3\x89\x16\x19\x4b\x96\x87\x3a\xd3\xbe\x78\x09\x99\x8b\x07\x6b\xcc\x59\x3f\xaa\x0d\xa8\x97\x42\x14\x65\x86\x13\x47\xbe\xae\xf0\xf9\x4a\x05\xab\xd0\x47\xa1\x46\xc2\x06\xb7\x43\x27\xaa\x1b\x76\xe5\xce\x71\x29\x8c\x9e\x4c\xe1\x80\x27\x9c\xcf\xad\xaa\x43\xd2\xd9\x1a\xf7\x35\xcd\xb2\x09\x4d\xee\xef\xc4\xf7\x62\xa6\x3e\xf2\xf7\x52\x0a\xd9\x7e\xe7\x8c\x9a\x3b\x7d\x5e\xf2\x7b\xac\xa2\x5b\x83\xd1\x8a\x99\x8b\x29\xf4\xf8\x01\x8d\xb7\xeb\x44\x8c\x7f\x4b\x0b\x0f\xea\x45\x12\x6f\x83\xab\x47\x86\x4f\xac\x36\xb4\x71\x02\x86\xe6\xae\x09\xf8\xd0\x7a\x0f\xd5\x3c\xda\xbf\x7d\xf5\x6f\x7f\xb4\xcc\x85\x08\x49\xfe\xf8\x0a\x53\x8e\xd5\x99\xbd\x00\xf0\x06\x36\xa2\x56\x4e\xb3\xac\xab\x97\xa0\xc9\x02\xbe\xee\x5c\x9c\xba\x07\x47\x5e\x1f\xec\x74\xef\xac\x32\xde\xdd\xfd\x15\xf5\x45\xa6\x15\x64\xd3\x33\x8b\xf6\x52\x99\xb5\x8e\x51\xba\x3a\x76\x57\x5e\x77\xa4\xa0\xc3\x2b\x6d\x0b\x91\x95\x39\xbc\x83\x05\x4b\xba\x39\x30\x5b\xab\xd2\xea\xcd\x9b\xe9\x33\xa6\x10\x04\x68\x92\x89\xe4\x9e\xa4\xee\xcb\x46\xa8\xfc\x6a\x55\xed\xee\xb3\xd0\x35\x69\x20\x20\x59\x60\xeb\xfb\xb7\xd2\x04\x72\x5a\x14\x15\x42\x89\xa4\x0f\xad\xc9\x40\xd6\x84\xe8\xa8\x81\x6e\xc4\x60\x67\x7a\xa8\x2b\x7d\xe4\xde\xc8\x5c\x53\x9d\xbb\xe8\x9c\x5b\x10\xee\x89\xaf\xa9\xef\xee\xc7\x6c\x6d\x88\xba\x43\x7f\x1a\x0a\xfc\xb7\xc5\x5b\x58\x43\xc6\xaa\x20\x87\xaa\x8d\x61\x25\x48\xb3\x7d\xf0\x96\xe9\x6e\xbe\x8c\xe0\x0c\x0d\xcb\x91\x68\xcd\x0b\xaf\x9c\xd0\x39\xd5\x4e\x3f\xf2\x5e\x76\x4a\x0a\x90\x8a\x29\x23\x3a\xfd\x80\x07\xea\x6d\x46\x59\xde\x70\xdf\x1d\x6a\x12\xd6\x23\xea\x73\x5a\x8c\xee\x61\xd9\x71\xc3\x05\x1e\x97\x6d\x01\xfe\x39\x2d\x3a\xde\x03\x58\xba\x36\xfc\x1a\xe8\x78\x39\x5f\x8b\xd4\xd1\x81\xd7\x83\x2d\x49\xfc\x2c\x6a\x6c\x44\x19\xe8\xd0\x57\xce\x0f\xf5\xc2\xb5\x6f\x1c\xf3\x49\x75\xe5\xd8\xa7\xbe\xa4\x8b\x06\xdf\xef\x73\xbd\x67\x2a\xe2\x23\xb1\xd3\xa0\x48\x27\xbc\x9d\xdc\xce\x68\x5f\x47\x2d\x83\x96\x3d\x99\x0d\xd5\xd7\x19\x9a\xc6\xb6\x28\x40\x00\x01\xe6\x28\xba\x41\xc9\xf1\x9b\xe3\x83\xde\x71\x76\x65\xa4\x28\xe8\x0c\x35\xd3\x3e\x2c\xd0\x2a\x4d\x4d\x0c\xda\xb9\x78\xb0\xdf\xdb\xe8\x92\xc2\x3d\x05\x69\x0d\x64\x3e\x17\x41\xab\x63\x23\x07\xfd\x8e\x70\xda\xb5\xc5\x2a\x7c\xa0\x4b\x42\xa5\x28\x79\x50\x1a\x34\x3a\x46\x2a\xc7\xd9\x87\x95\x97\xbd\x12\x1c\xbc\x93\x3e\x64\x94\xbb\x1a\xc3\x9c\x29\x1b\xaf\xc0\x38\x79\x3d\x7e\xfd\x2a\x98\xf6\x1b\x48\x4a\xa9\xd8\x02\x6e\x5c\x8d\xf3\x86\x53\xe5\x72\x7a\x2d\x94\x62\x93\x0c\x13\xb7\xb4\x20\xef\x6d\x01\xf8\xf5\x17\xad\x02\x47\xf0\x8d\x85\x6c\xa2\x95\x06\x50\x78\x62\x4f\x70\x33\xe0\xd3\x0c\x10\x10\xf5\xd1\x2f\x49\x12\xd7\x75\x45\x92\xbc\xaa\x24\x49\x7b\xef\x1d\xf4\x5d\x7d\xe1\xfb\x3e\x70\x92\x0f\xce\x37\x50\x57\xb6\x67\xbe\x72\x32\x7e\xf4\x20\x99\x76\x87\xfb\x81\x29\x20\x27\x68\x95\x58\xd9\x8c\x41\x00\xcd\x4d\x1b\x56\x60\x05\xfc\x18\x00\xcb\x72\xf5\xe8\xf6\x61\x95\xd6\xf9\x49\x1d\x81\xff\xe0\x0c\x58\xf5\x0a\x3a\xee\x5f\xdf\xcb\x73\xca\xd3\x2c\x88\x67\x54\xb3\x92\x2d\x83\xb0\x70\x2e\xa7\xa4\xc9\x12\x9d\xff\xb2\x51\x4d\x62\x4e\x15\xe1\x82\xe4\x40\x31\x40\xd3\xdc\x2e\x9e\x0b\xb6\xb0\x9a\xe3\xd1\x60\x37\xbb\xbd\xc6\x9a\x17\x82\x63\xd7\xef\x98\x72\xec\xd9\xf0\x11\xa7\x81\xd8\xb0\x8e\x9c\xa6\x21\xa9\xdd\x8d\x39\xad\x17\x6f\x5c\x07\x4d\xae\x52\x52\x5f\x1c\x2b\xb4\x3c\x07\x1d\x67\xae\x04\xb9\x19\xbe\xc4\x38\xc1\x0d\x66\xb9\x3a\x48\x26\xc8\x9b\x6d\xdb\xea\xeb\x56\xd7\xe2\xda\xbb\x6e\xa6\xb8\x22\x38\x80\x86\xa7\x5f\xf5\xac\xc1\x0b\x7d\x8c\xa8\x75\xa9\xbb\x1a\x28\x2e\xe3\x31\x0c\xc9\xdb\x3b\x25\x2a\x73\xcf\x0c\x38\x48\xea\xfc\x0a\x3e\x44\xd4\x81\xaf\x50\x25\x78\xe8\x81\x78\x62\xc3\x19\x7e\xff\xb4\x98\x62\x7f\x16\x40\x08\xca\x39\x27\x42\xae\x9c\x76\xe7\x31\xd9\x24\xb1\xc4\x7c\xeb\x15\x68\x2e\xbb\xf9\x1b\x98\x9f\x66\x51\xfe\xbb\x64\x0b\x9a\x81\xc5\xb0\xf7\xac\xe1\xa0\xc2\x84\x2a\x27\x7d\x55\x1b\x9d\x7e\x88\x6a\xc7\xe6\xa0\x87\xad\x1a\x64\x24\x79\xe2\xe8\x88\x9c\xd8\x31\x8e\x2d\xc8\xee\x61\x85\x5c\xb7\x56\xef\x3f\x15\x01\x95\x5b\xe3\xad\xd7\xfb\x4f\x05\xc5\x38\x8d\xa2\x17\x0b\xf7\xbf\x60\x4e\x17\x80\x98\xc6\x2c\xa3\x32\xc3\xa0\xf4\x5b\x3b\x65\x64\x52\x6a\x02\x7c\xc1\xa4\xe0\xb9\x39\x7e\x08\x3e\x63\x38\x93\x04\x04\x83\x4f\x40\x91\xaf\x4e\x7e\xb8\xb8\xc1\xa4\xa5\x53\x87\x96\xef\xde\xaf\x54\x88\x0f\xb0\xf2\x0e\x8d\xee\xfa\xb8\xdf\x88\x7f\x77\xb3\x5d\x50\x3e\xf1\x73\x61\xde\x2d\x2f\x75\x49\x33\x84\x7e\x4e\xb2\xd2\xdc\x85\x07\xdb\xd9\xf1\x6d\xe0\x21\x96\xbc\x98\x26\x70\x07\xfc\xfd\x8e\x75\x3a\xae\x31\x0e\xea\xdb\xc6\x7e\x5d\x83\x21\xef\x5c\xe3\x61\x03\x08\xe5\x9a\xa0\x73\xac\x2a\x60\xca\x66\x1e\x8e\xbb\x8b\xbb\x85\x67\x60\xe9\x04\x9b\xfc\xed\x6b\x92\xae\x59\x18\xb1\x46\xcb\xc1\x6d\xf8\x1d\x0e\x43\xbc\x63\xd0\xc1\x10\x1d\x67\xd7\xa7\x5c\xbd\xc5\xa5\xd9\x8f\xe2\xb0\x8d\x7e\x5b\x69\xb2\x66\x23\xbc\xbb\xba\x6d\x16\xf4\xb0\xce\x3f\xb1\xf7\x4a\x5e\xd7\x5d\xd4\x55\x6f\xb0\x22\x5e\xe5\x40\x05\x39\xb3\xe2\x34\x22\xcf\x56\xf2\xf5\xbb\xab\xdb\x3d\xc7\xf2\xbb\xd9\x0a\xc3\x13\xaa\x6c\x8c\xf4\xbb\xab\x5b\x1b\xb7\xb6\x1f\xed\x9d\x1d\x29\xdd\x7d\x10\x08\xe0\x86\xd8\x5a\x1d\x38\x76\x38\x97\xbb\xa8\xe2\x41\xcc\xe2\xa3\xcf\xd7\x52\x43\x2e\xaf\x09\x4d\x53\x89\xe1\xcc\x5d\xce\x72\x0b\xd1\x8e\x16\x45\x15\x95\x8a\x45\x62\xa8\x82\xe6\xab\x37\xf6\x00\x0a\x3e\x1d\xd7\xcf\xb6\x77\x65\x91\x31\x1b\x7e\xda\x1c\xa2\x2e\xa1\x93\x8b\x45\x17\xfe\x14\xe2\x61\xec\xec\x5f\x0c\x92\x0f\xa2\x62\xce\x89\xae\xe5\x69\x63\xef\x52\x09\x4a\x64\x8b\xba\x78\x7e\xf0\xee\x74\xec\x08\x43\x12\xab\xdd\xe9\x2b\xd0\x3e\xd3\xce\x04\xae\x25\x83\xf5\x5d\x49\x6e\xcc\xdb\x95\xc8\xce\x2a\x12\xd8\x02\x30\x65\xc9\x55\x08\xee\x30\x32\x0e\xe3\xf3\x6e\x89\x9e\xdb\xac\x1b\xaa\xf1\x64\x52\xe9\x45\x01\x7c\xf3\x80\x57\x3c\xc8\x11\x59\x41\xa6\x4f\xdf\x5d\xdd\xda\x9b\xd4\x4e\x97\xc3\xf3\x56\x1b\xf7\x4e\xe7\x4b\x8e\x1c\xbe\x4c\x52\x88\xdb\x26\x5a\x4e\x69\x55\xd2\x94\x6d\x9c\xe0\x63\x15\x08\x91\x7a\xe3\x42\x13\xc2\x12\x81\x03\x2c\x07\x41\x48\xa5\xed\xd8\x10\x9f\xf6\xfa\xc8\x64\xe1\x68\x07\x79\xd7\xa8\x77\x85\x02\x2a\x93\x79\x97\x8d\x1d\xfb\xb2\xb0\x94\x90\x54\xd8\x0c\xb1\xa9\x90\xe8\x81\x1f\xa1\xa8\x93\x09\x71\x5f\x16\xcf\x23\xdd\xb8\x81\x0b\xaa\xe7\xcf\x76\x89\xb4\xc6\x18\xe4\x9b\xee\x7b\x36\xe5\xaa\x4b\x9e\x4b\xa0\xf2\x05\xda\xaa\x5c\x38\x72\x8d\xd4\xb6\xff\x65\xd4\x32\x83\xbd\xcd\x4a\xa5\x41\x7e\xcd\xa4\xd2\x47\xfb\xf6\xf4\x03\xcd\x98\x03\x4e\xb6\x21\x2c\xc7\xcd\xee\xfe\xc2\xf4\xdc\x15\xea\x3d\x3e\x6b\x7f\x65\xfe\x76\x64\x1c\x13\x21\xc9\xf1\x95\xe0\xb0\x77\xf0\xd0\x8a\x06\x5a\x09\x3e\xd5\x95\xbe\x55\x66\x73\x93\xa8\x20\xb3\xa0\x2a\xf8\x45\xe7\x73\x76\xe7\x6a\x27\x1b\x7a\xbc\xa4\xa0\x40\x13\x8a\x45\x27\xb1\xef\x79\x5d\xb0\xd8\x16\x47\xb3\x85\x9e\x85\xd3\x79\x97\x8d\xa5\xdd\x73\xf0\x46\x75\x35\x2d\xb6\x2f\x40\x17\xd5\x76\xef\x73\x86\x88\x21\xe0\xca\xc9\x7c\xcf\xf8\xfd\x9e\x87\x3c\xec\x84\xbc\x5f\x1b\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\x89\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xbb\x2a\x1b\x0c\xe0\xea\xcc\x86\xb9\x78\x0b\xb7\x5a\x72\x4d\xb1\xd6\xf6\x3b\x91\xdc\x83\x24\x99\xa1\x79\xdf\xcd\x57\xe7\xb1\xb6\xaa\x2a\xef\x9d\xd6\xd2\x35\x22\x03\x8a\x39\xe4\x20\x69\x56\x19\x40\x5f\x74\xd1\xbf\x77\xb7\x77\x45\x46\x33\x89\xd3\x96\x47\x74\x85\x72\x45\x3a\x26\xef\x37\x3d\x95\xd3\xa5\x2f\xfc\xce\x38\xfa\x0e\x3f\x31\xa5\xf7\xbf\x61\x0a\x91\x36\x31\x52\x4b\x05\x72\x54\x61\xe6\x12\xea\x8a\x2f\xfa\x7c\xda\x14\x26\xe5\x6c\xc6\xf8\x6c\x6c\xc5\x03\x14\x43\xea\x02\xb1\xb5\x2d\xec\x61\x0e\xfb\x46\xc8\x24\x12\x28\xc6\x0f\xa3\xb2\x62\x43\x26\x58\xb3\xf7\x5c\xa4\xb6\xf3\xc9\xd2\x5a\x60\xfd\x9e\xac\x80\x94\xc8\x25\x27\x42\xba\xba\x18\x34\x4d\xc9\xde\x61\x3a\x1b\x56\x04\xfb\xaa\xe7\xd7\x12\x57\xd6\xfe\xf9\x63\x55\xff\xaa\xb1\x40\xaa\x9c\x18\xd9\xb7\x94\xfb\xd6\xba\xee\x2a\xa3\x74\x92\x4f\x42\x65\xd1\x0b\x5e\x6f\xcf\xb7\x4d\x24\x02\x4a\x34\xe4\x85\x90\x54\x2e\x57\xd3\x4d\xcc\x4d\x62\xb6\xaf\x59\xa0\x95\xb9\xbd\x16\xa9\x11\x12\xf6\x26\x63\xc3\xb6\x5d\x30\xa3\x76\x6e\xda\xb9\x1b\xcf\x13\x5e\x6d\x5c\x10\xbf\x66\xa4\x03\x15\x2a\x99\x43\x5a\x22\xfa\xd4\xac\xa4\x92\x72\x0d\x86\x7f\xba\x10\xd6\x65\x2b\x90\xa3\x42\x6a\xa8\x60\xdb\x96\x98\x37\x8a\xc5\x9d\xcd\x27\x58\x57\xba\x4b\xb8\x89\x13\x8e\x4d\x47\x0d\x38\x88\xbb\x39\x10\x23\x49\x66\xa0\x71\xf2\x61\xc1\x12\xed\x07\x99\xe2\x22\x6c\xd8\xfa\x09\x2d\x2d\xd4\xc3\xfe\x01\x40\xd7\xc2\xd5\x51\x4d\xc0\xdc\x49\x5a\xd5\x53\xeb\xb2\x1e\x59\xa7\xb8\x92\x3b\x7f\xb2\x37\x11\x5c\x1f\xcc\x27\x8e\x24\x1a\x45\x3a\x33\x4d\x7c\xbb\x47\x18\x73\xb5\xc6\x1b\x56\x62\xcf\xa1\x02\x0c\x30\xdd\x53\x1e\x3a\xa5\x2a\x84\xd8\x7a\xa8\x9c\x1d\x2c\x09\xe8\x42\xce\xca\x1c\x93\xe6\x9d\x6e\x0b\x5c\xcb\x65\x21\x58\x57\xbf\xbd\x39\x6a\xe8\x66\x3c\x56\xe4\xed\x87\x77\x4d\xc0\xb7\x66\x99\x3e\x0f\x07\xd8\x6d\x90\x1f\xe2\x06\x28\x90\xcb\x29\xa1\x95\xd0\xd7\x89\xa2\xfa\xa2\x76\x36\x1f\xe7\xfa\xad\x08\xf4\x16\x58\xc6\x0b\x23\xc1\xa2\x9c\xde\xa8\xeb\x93\xcc\x29\x9f\x19\x56\xf5\x4e\x94\xe6\xc5\xbe\xfa\x0a\x5f\x42\x42\x5a\x26\x1d\x83\x4b\x11\x30\xda\xa1\x22\x7d\xe5\xc3\xbc\x5c\x01\x31\xa3\x8b\x82\x4a\x68\xe1\xa7\xa6\x39\x7b\x56\xca\x7d\x43\xd8\x18\xc6\xe4\xe8\xab\xc6\x57\x47\x48\x71\x27\x6a\x0a\x29\xcc\xab\x38\x10\x26\x7c\xfb\x8c\x69\xe4\x1f\x47\xcd\x11\xc6\xe4\xbd\xa1\x0b\xa3\xa6\xab\xb5\x6d\xe0\xea\x4c\xea\x95\x3d\x23\x12\x66\x54\xa6\x19\x74\x04\x10\x11\xd3\x4a\xc9\xb0\x40\x95\x6e\x57\x21\x63\x44\x5c\x01\x2e\xf4\x38\x8e\xeb\x7b\x57\x44\x3b\x4d\xd5\xbd\x3a\xb7\xea\xcc\x28\xa5\x9a\x8e\x68\x61\xed\x41\x4c\xf0\x73\x6b\xea\x1e\xb9\x22\xe5\x23\xea\x4e\xef\xa8\xda\xd9\xe7\xbf\x76\xf0\xab\x23\x5a\x3d\xc5\xf8\x88\x8e\xb0\x6c\x77\x67\xfb\xcd\x01\xd2\xee\xa2\x07\xce\x04\x95\x63\x0a\x28\xbb\x1f\x83\x4d\xbf\xaf\xb8\xb2\x5d\x8a\x31\xb9\x12\xda\x57\xd7\x4f\xeb\x44\xc3\x80\xe2\xec\x4d\xc6\xfd\xfe\xea\xee\xe6\xaf\xd7\x1f\x2f\xaf\xee\x06\xfe\x3d\xf0\x6f\x6c\x03\xff\x1e\xf8\x77\x87\x81\xfb\xc2\xbf\x81\x2f\x0e\xc5\xbb\x2b\x7b\xd7\x26\x03\xe3\x4a\xb5\xd7\xc0\x44\xf1\x2f\x28\xd1\xfe\x3d\x5f\xfc\x40\x8d\xea\x58\x48\x50\xa8\xa0\x18\x8d\x75\x53\x90\xb2\x7b\x00\x2d\x81\x75\x4c\xe7\x67\x9b\x69\x7f\xc0\x3c\xf9\x88\x79\xa2\x41\xb1\xf3\x57\x8d\x02\x20\x9b\x96\x3c\x24\xee\xfb\x03\x5d\xda\xfa\x48\xf6\x50\x52\xbe\x24\x85\x64\x5c\xe3\x56\xba\xb8\x7d\x7b\x79\x49\x92\x39\x95\x34\x41\x07\x15\x7c\x4a\xa0\xd0\xe4\xf8\x7f\x1e\x36\x4d\x3e\xb0\x9a\x6a\xbc\x95\xd9\x47\x70\x0b\x18\xa6\x16\xf9\x0a\x09\x0b\x26\x4a\x95\x2d\xab\xb2\xfd\x9b\xf9\xe8\x3a\x9a\x42\x60\x92\xd8\xd2\xbb\x99\x36\x0f\xb8\x22\x74\x6e\x12\x20\x03\x86\x3f\xb0\xe8\xe9\x88\x88\x21\x80\x06\x8c\xbf\x41\x74\xdd\x5d\x0c\x0d\x18\xb7\x93\x00\xbb\x4d\x18\x0d\xa0\xa3\x2d\xc6\x06\x74\xd4\xce\xa2\x39\x3c\x27\xfb\x5a\x8a\x3c\x12\x37\xbb\xb5\x06\x6d\x1f\x5b\xb1\xe9\xa8\x56\x51\x57\x4d\xf1\xc8\xa9\xb4\x75\xed\x14\xa3\x4e\xe7\x85\xee\x98\xf7\x41\x62\xd5\x8d\x8f\x53\x62\xdd\x46\xcd\x7f\xa0\xc5\x77\xb0\xbc\x81\xc0\x2a\x51\xed\xf9\xc6\xf8\x0b\x45\x28\xb9\x87\xa5\x0d\xae\x7c\xeb\x07\x0b\x2b\x94\xd5\xc3\xb2\xfb\xf7\xd0\x0d\x8c\xde\xb7\x78\xf5\xf2\xef\x21\x00\x2a\xc1\xb7\xb5\x62\xea\x66\x09\x51\xff\x30\x6b\xda\xab\xf2\xf1\x61\x92\xa8\x6f\x31\xcb\xd3\xd9\xd6\x94\x4c\xdd\xf5\x10\x61\xe2\x56\xe1\x72\x60\x3a\x85\x44\xfb\x14\x7c\xbb\x9b\xcf\x30\x4b\x33\x2d\x6d\x8d\x4f\x9a\xdc\x3f\x50\x99\x2a\x92\x88\xbc\xa0\x9a\x4d\x58\xc6\xf4\x32\x2c\x3f\xdf\x37\xbc\xe1\x2b\x80\x71\xcb\x14\xc9\x25\x57\x9a\xe2\x55\x28\x9c\x21\xd0\xac\x76\x8d\xf2\x8b\x60\xc0\x96\x9b\x62\x26\x10\x95\xe1\x85\xf9\x0d\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\xbc\x23\xf6\x76\xbb\xed\x59\x5e\x46\x2c\x8c\x2c\x08\x0f\xe7\x2e\x4f\x70\x64\x5e\x7c\x64\x99\x95\x3a\xc7\x2c\x94\xf3\x5f\xe3\x7f\xfa\x74\x8a\x88\xcf\x32\x7c\x43\x8e\x8e\x02\xfb\x12\x3e\x68\x29\xee\xa9\xbc\x75\xc1\x74\x4d\xd1\xa9\xba\x50\x88\x45\x04\x46\x3e\xe5\x71\x10\x9c\x16\x10\x69\x9a\xc3\xe0\x6c\x6c\x6b\x59\xaa\x72\x5a\x84\x19\xaa\xea\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\xab\xaa\x4a\x67\xfa\xc6\xe3\x7b\x28\x92\x83\xa6\x29\xd5\x74\x6c\x0e\xc4\x59\xfb\x4f\x55\xd0\x04\xce\xc8\x3f\xaa\x0f\x33\x3a\x81\x4c\xfd\x78\xfc\x1f\xdf\xbd\xff\xeb\x7f\x1e\xff\xf4\x8f\xe6\x77\x28\xae\xa1\xe1\xb4\xf9\x40\xe0\x2b\x60\xac\x14\x17\x29\x5c\x21\x75\xf8\xa7\xd3\xf4\x2e\x92\x44\x94\x5c\xbb\x2f\x10\xdc\x7d\x3c\x17\x4a\x5f\x5e\x57\x7f\x16\x22\x5d\xfd\x2b\xa0\x84\x1f\xe9\xa7\xdc\x83\x6b\x1b\x00\xf6\x68\x5b\x3c\xe9\x87\x16\xec\x07\x90\x2a\x08\x1f\xd0\xb7\x76\xc6\x86\xed\xd5\x6f\x63\x95\xcc\x21\xa7\xf8\xcf\xaf\xfd\x14\x98\xfb\xb8\x2a\xbf\xc1\x11\x45\xdf\xdc\x81\xed\x9a\xbe\x47\x8b\xd7\x41\x1a\xa7\x6d\x11\x39\x7f\xb5\x82\x91\x27\x0c\x67\xc4\xcd\x96\xe5\x00\x95\xfc\xe8\xad\x14\x75\x18\xe4\xc5\xf5\x25\x59\xd8\x19\xee\xd1\xe4\x3c\x1f\xbb\xce\x20\xba\xba\x15\xcc\xb0\xbf\xae\xa8\x72\xcb\xd4\x50\xdd\x9c\xc2\x8c\x94\x87\x2e\xd0\x8d\xc7\xea\x37\x9d\xbe\xe7\x0b\x33\xae\x6a\x95\x9a\xf4\xf2\x24\x0f\x84\xf5\x21\xfd\xe4\x99\xa1\xba\x22\x96\x45\x0f\x65\xb9\xa6\x13\x0b\x91\x72\xd5\xd5\x8b\xe0\x5b\x9f\x75\xd7\x28\xaa\x9c\x57\x80\x1b\xd0\x3c\xd5\x61\x20\x17\x86\xd9\x2f\x30\x57\xe6\xde\xc7\xae\x16\x12\x16\xc0\x75\x15\x74\xed\xea\x7e\x51\xa9\x59\x1c\x9d\xc4\x51\xa4\x2a\x4b\x77\x1d\xd6\x61\xad\x5c\xf9\x8b\xfb\x2e\xea\xf6\xae\x44\x63\xeb\x45\x56\xcc\xa9\x79\xeb\x59\xa5\x07\x6f\x3c\xed\x36\x7a\xc2\xcc\x9d\x62\xff\x84\x95\xda\x2d\xaf\x7f\xfb\xc7\x06\xa1\x3d\xba\x1b\x9e\x4d\xcd\x89\xb2\x63\x37\xe9\x4a\x58\x8d\x67\xbb\x9a\xe4\x2a\xe1\xd5\xcf\x85\xb3\x29\x7c\x37\x01\xce\x64\xfa\x89\x29\x7d\x66\xcb\x06\xfa\x13\xb4\xa0\xb2\x8a\x12\x2a\x27\x19\x53\xf3\x50\x76\x6f\xdb\xe5\xb4\x5a\x9d\x95\x32\x8a\x15\x4e\x72\x2d\x7b\x98\xb9\x58\xa1\x32\x02\x09\xdb\x4c\xcc\x6d\x94\xc2\xda\x9d\x7f\x8d\x09\x12\x75\x7c\x74\x10\xa6\xde\xe3\xf3\x60\xa1\x63\x5f\x6a\x22\xd6\x30\x14\x25\xe8\x52\x1a\x9e\x95\x5a\x3e\x71\x2d\x52\x97\xd3\x12\x4f\xf8\x8b\xa1\xac\x93\xa6\x51\xa4\x6b\x51\xc5\x66\x2b\xe2\x0b\xd9\xd1\xae\xb7\x1d\xa0\xe7\x2a\xe9\xdd\x33\x89\x28\xc6\x35\xc7\x84\x24\x64\xb6\x1e\x3b\x22\xcd\xba\xd4\x00\x0f\x3d\x6f\x06\x3c\x1e\x8f\x8f\x2d\x95\xc2\x55\x3b\xb5\x16\x45\xf3\x79\xaf\xae\x85\x5a\xa8\x7a\x06\x33\x3c\x6f\x18\x95\xdd\x12\x59\x48\x56\x37\x55\xde\xc5\x1a\x4b\x56\xff\x0c\x94\x29\x9f\xa9\xf2\x75\xaf\x6d\x60\xcd\x7c\x9a\x56\xf0\xc1\x1b\x82\xa0\xb9\xfe\x7b\x27\xfc\xa8\xaa\x58\x3f\x28\x1d\x6a\x28\x3e\xb1\x5d\x8e\x93\xa2\x3c\x73\xdd\x8f\x73\xc8\x85\x5c\x56\x7f\x56\x59\x40\x23\xa5\x85\xa4\x33\x84\x1d\xb7\x83\xdb\x9f\x55\x7f\xd9\x1f\xb6\xc8\x5b\xff\xb5\x8d\xee\x48\x4a\x29\x81\xeb\x6c\x59\xe3\xf9\x7e\x71\xba\x9c\x5f\xb7\x9e\x28\x50\xd5\xb6\x7a\x06\xfe\x73\x5c\xe7\x2d\xa2\xcf\xad\x9a\x45\x74\xa9\xbb\xf2\x40\x67\xb5\xc0\x81\x71\x1f\x56\xc8\x53\xc7\xfd\xe1\x43\x84\xa4\x6c\xc1\x94\x08\x80\x7e\xad\x3a\x5a\x77\x4f\x78\xfc\x3c\x57\x88\xd2\xa6\xa3\x57\x16\x94\x4f\x05\x16\xa5\xae\x0e\xfb\x8a\x69\xf0\x75\xa8\xe7\x05\x65\x0c\x0d\x92\xbf\x21\xff\xfb\xe4\x6f\xbf\xf9\x79\x74\xfa\xa7\x93\x93\x1f\x5f\x8d\xfe\xfd\xa7\xdf\x9c\xfc\x6d\x8c\xff\xf8\xd7\xd3\x3f\x9d\xfe\xec\xff\xf8\xcd\xe9\xe9\xc9\xc9\x8f\xdf\x7d\xf8\xe6\xee\xfa\xfd\x4f\xec\xf4\xe7\x1f\x79\x99\xdf\xdb\xbf\x7e\x3e\xf9\x11\xde\xff\xb4\x63\x27\xa7\xa7\x7f\xfa\x2a\x98\x74\xca\x97\x1f\x03\xb9\xb7\x6d\x23\xb7\x59\x18\xd7\x30\x83\xfd\xd3\x53\xb7\xf7\x18\xc9\xd5\xd6\xba\x0a\x19\xd7\x23\x21\x47\xb6\xeb\x37\xa8\xa4\x04\x0e\xe0\xb7\x57\xec\xf3\xef\xf1\x97\xde\xd4\xb7\x59\x25\x14\xf6\xe8\x80\x3f\x97\xa0\xa1\x20\x91\xa0\x5f\x22\x4c\xc6\x8e\xd4\x28\xab\xe7\xa0\xb3\xd0\x23\xf6\xa5\xdd\xa0\xbf\x84\xc8\x19\xef\x34\xb2\xeb\x5a\x6b\x52\x46\xbd\x1a\xd7\x4a\x10\x25\xd6\x8e\xe8\x9e\xbb\x87\x80\x10\x33\xdf\x86\x48\x9b\xce\x6d\x88\xb4\xd9\x42\xca\x10\x69\x13\xd4\x3e\xcb\x48\x9b\x5b\xcb\x93\x7e\x91\x61\x36\xf1\x91\xf5\x3b\x66\xee\xc4\x04\xd5\x07\xbe\xe8\x1a\x5c\x1d\x33\xd5\xcd\x9b\x3d\x10\x8a\xab\x28\x33\xaa\xb7\x64\x51\x44\xca\x7b\xeb\x99\xe7\xec\x2f\x16\xc2\xe6\xde\xa2\xda\x28\x8d\xaf\x99\x97\x99\x66\x45\xc7\x84\x80\x4a\xb5\xb4\xa9\x05\x86\xf9\x53\xa5\x44\x62\x11\x7f\x2a\x90\xbc\x8c\x2a\xed\x5f\x19\x2d\xf3\x9a\xde\x63\x0e\x4d\x02\x29\xf0\x7d\xb1\x98\x7c\xfb\xc1\xa2\x05\xfa\xb9\x9d\x2c\xcd\x3d\xf4\x9e\x2f\xdc\x9d\x44\x52\x0f\x58\x59\xfb\x4a\xa3\x8c\xfb\x65\x65\x33\x9a\x73\xe9\xb2\x15\x1a\x49\x8d\x28\x41\xd6\xa0\x3c\xe8\xcd\x11\xd3\x3a\x04\x12\xd3\x3f\x2c\x9b\xee\x76\xe1\x05\x2b\x07\xe1\xa2\x78\x95\x8d\x10\xa4\x63\xad\xc9\xe0\x75\x98\x68\x5b\xf6\xee\x3c\x42\x8f\x12\x38\xc2\xa5\xf2\xb8\x12\xf9\x73\x48\xe3\x7d\x91\xc4\x7b\x22\x85\x3f\x8f\x04\xde\x4f\xe9\x3b\x9a\xe4\x1d\x47\xea\x8e\x23\x71\xef\x11\xd7\x1e\x53\xca\x8e\x23\x61\x3f\x87\x7d\xad\x90\x30\x65\x9f\xfa\x90\xb6\xec\x11\x57\x89\x86\x4f\x68\xaa\x29\x24\x14\xc0\x2b\x40\x6f\xef\x81\x05\x9a\xcc\x87\x8c\x73\x52\xd9\x45\xe3\x5e\xd8\xb7\x9b\x2c\x65\xc3\x6d\x4d\x86\xdb\x7a\x8f\x36\xdc\xd6\xc3\x6d\xfd\x22\xb7\xb5\xe3\x56\x5f\xfe\x55\x1d\x19\x69\x09\x31\xe4\x0e\x5e\xd2\xd1\x92\x11\x50\x9b\x66\xcf\xa3\x58\xc7\x78\x9e\xe3\xc8\x5d\x4e\x5c\xd0\x39\xc3\x51\xaf\xcb\x2c\xeb\x52\xe7\xc2\xb6\x18\x0b\x70\x89\xd3\x5e\x94\x59\xe6\x6a\x23\x74\x9b\xfd\x8f\x1c\x2f\xb0\x8b\xec\x81\x2e\xd5\x19\xb9\x82\x05\xc8\x33\x72\x39\xbd\x12\xfa\xda\x9a\x4e\xba\xf5\xdb\x44\xc2\xb0\x9d\x13\x36\x25\x6f\x32\xaa\x41\x69\xa2\xe9\x0c\x23\x6a\xeb\xea\x9d\x42\xb6\x06\xad\xeb\x93\x1f\xd0\xa2\x15\xbe\x37\x7f\xed\x01\xe4\x47\x87\xd9\xab\x19\x9b\x42\xb2\x4c\xb2\x70\x36\xf1\xbd\xef\xc9\x47\x9c\x7b\xf1\x00\xe3\x94\x36\x20\x54\x7f\x86\x65\xc0\x0a\xa1\xf4\xad\xa6\x52\x1f\xba\x16\xd8\xb5\x27\xc4\x4c\x76\x42\xb3\x0c\x52\xc2\xf2\x1c\x52\x46\xb5\x11\x04\xe9\x54\x83\x24\xb4\x59\x6f\x56\xd9\x20\xf0\x46\x22\xc2\x9c\xf2\x34\x03\x49\xa6\x94\x65\xaa\x7b\x28\xfa\x4a\x5d\x5b\x85\x89\x99\x8c\x5b\x00\x7c\x0c\x63\xf4\x08\xf3\x34\x49\x84\x4c\x31\x86\x56\x78\x24\x76\x7c\x89\x10\xfe\x64\xda\x47\x14\x15\x72\xca\xe9\x0c\x72\x57\xb5\xbe\x4d\xd6\x24\x13\xc9\xbd\x22\x25\xd7\x2c\xb3\x2f\x2f\xc4\x3d\x0a\xc4\x19\x9e\xd4\xce\x43\x77\x67\x00\xd5\x3f\x47\xd5\x21\x1c\x19\xaa\xd4\xf9\xaf\xeb\xaf\xf0\x83\x8e\xc4\x45\x50\xcb\x62\x28\x65\xf0\x09\x92\x10\x01\xb1\x6d\xbd\xff\x04\x49\x75\x2b\x28\xdc\xe1\x88\xcc\x69\x21\xfe\x11\x83\x37\x92\x23\xcb\xb6\x48\x01\x3d\xb1\x82\x68\x02\xb0\x8f\x9b\x2d\x76\x8c\xc8\x5b\xb7\x08\x4c\xb9\x99\xb7\x7f\x66\x8c\x43\x7b\x61\x94\x2d\x89\x09\xcd\x4a\x09\xe6\xcf\xb5\x9a\xdf\x1e\x46\x2a\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\xfe\xff\xd8\x7b\xf7\xe6\x36\x72\x6b\x5f\xf4\xff\xf3\x29\x50\x4e\xea\x48\xda\x21\x25\x7b\x92\x49\x65\x4f\xed\x7b\x53\xda\xb2\xc6\x56\xc5\x96\x79\x25\xcd\xe4\xa4\x26\xb3\x27\x60\x37\x48\xe2\xa8\x1b\xe8\x00\x68\x49\x4c\xcd\x87\xbf\x85\x85\x47\xa3\x49\xca\x36\x01\x48\xa4\x9d\xee\x54\x4d\x2c\x8a\x6a\xbc\x17\xd6\xe3\xb7\x7e\x4b\x02\x9e\x5f\x2e\xa5\x22\xb5\xa9\x52\x51\x74\x83\x92\xb4\x6e\xa0\x06\x3d\x29\x0e\xca\x11\xa2\x2a\x07\xe8\x44\xdf\x91\xa6\x6c\x0e\xcc\x8a\x65\x8c\x1e\x21\xc9\x91\x12\xb8\xa4\xd6\x4f\x06\x9f\xea\x2f\x29\xd1\xda\x2a\x38\x87\x07\xbf\x1e\x8c\x10\x51\xc5\x11\xba\xe7\xec\x40\xc1\xf4\x1d\xa3\x1b\x8e\xda\xe4\x24\x1a\xd4\x75\x64\xc9\x5b\xc4\x08\xb1\x67\xcb\x17\xca\xd2\xd7\x0d\xe2\xad\x49\xf9\x5a\x60\x95\xc2\x74\x1d\x3e\xe7\x0f\x54\x59\x36\x07\x2d\xbf\x5f\xc2\x6e\x32\x57\x16\xc2\x12\x55\xf4\x8e\x9c\x2c\x08\xae\xd4\xc2\xc0\xe3\x19\x67\xe3\x7f\x11\xc1\x81\x17\x9b\xd9\xdf\xa4\x76\x23\x2d\x46\x19\x3e\x09\xf1\xca\xf5\x0e\x65\x41\xc6\x64\xb6\x2e\xdd\xa3\xaf\xbd\x37\x24\x5a\x25\x42\xab\xf2\xe8\xed\xcd\xcd\xe4\x0d\x51\xa1\x94\x67\xf0\x21\x7a\x73\x7e\xe3\x92\x22\x82\x5a\x51\x7b\x20\xde\xf3\xa0\x35\xc7\xa8\xe1\x62\x1f\x6e\x99\x05\x97\x49\xcb\x89\x9e\xe0\x8a\x79\xcb\xa5\x32\xc1\x01\xc5\xb5\xd8\x66\x90\x29\xc7\xfb\x08\x7f\x97\x0f\x7e\x31\x39\x46\x7f\xe3\xad\x9e\x90\x29\x9e\x56\x4b\x74\x8f\x99\xf5\x76\xa7\xc1\x72\xf5\xf3\x42\x77\xe5\x85\xbe\x41\xf4\xce\x7f\x4b\x70\x49\x84\x04\x01\x4d\x70\x72\x76\x6d\xb6\xe3\x1e\xf4\x2d\xeb\x52\x9e\xb5\x52\xf1\x1a\x2d\xec\xb0\xfb\x9c\xd9\xf6\x70\x1e\x9b\xe3\x6a\xf9\x49\x05\x69\x8c\x10\xb7\x7f\xf3\xd5\x89\xe8\x35\xe9\x65\xe6\xdd\x7e\x3e\x35\x6a\x6a\x38\x6d\xd6\x63\x6e\x98\x2f\xad\x6c\xd3\x5b\x35\x1b\x90\x32\x03\x00\x1d\x65\x04\xa1\xa3\x34\x36\xed\xd5\x17\x41\xf4\x20\xf9\x4d\xf9\x70\xed\x28\x1b\x76\x1b\x3d\x09\x7e\x1b\x59\x58\x9e\xdd\x7c\x26\x72\x94\x56\x2a\x7c\xf5\xe5\x41\x85\xe6\x02\x33\xce\x68\x81\x2b\xfa\x2f\x52\xa2\xb6\xe1\xcc\x26\x6b\x81\x66\x5b\x60\x49\xc6\x10\xca\x65\x46\x9c\xcb\x80\x3e\x59\x4b\x07\xc5\x39\xa8\x7b\x80\xc6\xd2\xe2\xde\xf4\x3a\x4f\x57\xb3\xc2\x8c\x93\xb9\xc0\xc3\x67\x2d\x42\xdb\x5b\xac\x3c\x3b\x1e\x7d\x11\xea\x24\xca\x94\xc9\xbf\x4e\x96\xa5\x38\xc2\x45\x01\x04\xd1\xe6\xba\x02\xc1\x2b\x89\xb8\x4b\xdf\x5f\xd9\xe6\x55\xab\x80\xfb\xa6\x7b\x99\x20\xb6\x40\xac\xad\xa7\x44\x74\x4c\x83\x42\xad\xcf\x69\x16\xaf\x8b\x6d\xd6\x34\xe7\xc2\x7e\x4e\xc7\xc0\x6c\x4e\xd0\x2b\xdd\xf2\x1f\xbf\xfd\xf6\xf7\xdf\x66\x68\x47\x0f\xcf\xb5\x82\x19\xba\x38\xbd\x3c\xfd\xe5\xfa\xc7\x33\xe0\x2f\x4f\x7d\x7d\xa6\xac\xcb\xdc\x39\x97\x59\x33\x2e\x9f\x34\xdf\x12\x98\x00\x93\xa5\x6c\xee\x23\x71\x0d\xbd\xd2\x9b\xb0\x95\x86\xf3\xdc\xda\x24\xd6\xbb\x6d\x5c\xcc\x32\x43\x9e\x54\x18\x27\xd3\x02\x6b\x2f\x24\x95\xac\x08\x69\xb2\x59\xfc\xd7\xfa\x6d\xbd\xfa\x32\xa8\x6c\x85\x29\x33\x0e\x1e\xa6\xbe\x2f\xdf\x96\x1a\x87\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x7a\x01\x78\xdb\x1f\xff\x10\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x31\x9d\xd3\x2b\x73\xf9\xe1\xa6\xe3\x12\xd1\x5a\x38\xee\xc2\xba\x6f\x6d\xb4\x10\xb3\x12\xdd\x92\x26\xcd\xba\xd4\x02\xd3\xe1\xd2\xfa\xb0\x34\xf0\xbd\x0b\x1b\x44\x36\xf9\xba\x46\x10\x38\x38\x99\xd1\x88\xd3\x4a\xca\x04\x71\x6f\x08\x04\x5a\x23\x64\x86\x69\x85\x30\x78\xe5\x15\xad\x89\xa9\x7f\x0d\xce\xfe\x0e\x88\xf0\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x30\xc6\xdf\x6d\xed\x35\x4c\xa5\x59\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\x26\x6b\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\xa1\xd8\x09\x50\xd3\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x50\xe1\xca\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x3d\x8d\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\x0b\x03\x73\xd3\x35\x4b\x0a\xe7\x77\x13\x5b\x08\x2c\x17\x04\x92\x31\xc9\x03\x55\xd2\x34\x6a\xe8\x3d\xdd\x8c\x6b\x7d\x61\x2e\x70\x41\x50\x43\x04\xe5\x5a\xc5\x68\x99\x2a\xf9\x3d\x43\x53\x32\xa7\x4c\xba\x15\x4b\xe9\x92\xdb\x12\x80\x24\xa2\xd2\x97\x80\x3e\x46\x57\xbd\x52\x64\x96\xae\xaa\xe0\x9d\xcc\xb4\x53\x34\xca\x34\x25\xa0\xbc\xc0\x36\x68\x71\x55\x2d\xbb\x8d\x17\x32\x4e\x3e\x32\x43\xf1\x1b\xc2\xcc\xec\x61\xcb\x60\xa0\x25\xa9\xf0\xd2\xa4\x24\xcf\x28\x03\xef\xaf\x90\x47\xc7\xe9\xd0\xac\xe8\x0e\x72\x11\xbc\xf3\xd1\x9d\x41\x25\x12\x04\x17\x49\xc4\xb8\x03\x06\xec\x53\xcf\x80\x01\x1b\x30\x60\x03\x06\x6c\xfd\x19\x30\x60\xfd\x67\xc0\x80\x3d\xde\xa1\x7d\x0e\xda\x0d\x18\xb0\xc1\x2b\xb3\xfe\x0c\x18\xb0\xa8\x67\xc0\x80\x7d\xf2\xd9\x3b\x11\x3d\x60\xc0\x3e\xe3\x19\x30\x60\x9f\xf9\x0c\x18\xb0\x01\x03\x36\x60\xc0\x06\x0c\x58\xc2\x33\x60\xc0\xb6\x1f\xde\x10\xfc\x89\x7f\x06\x0c\xd8\x80\x01\xdb\xf2\x19\x30\x60\x2b\xcf\x80\x01\x1b\x30\x60\x1f\x7b\x06\x0c\xd8\x80\x01\xb3\xcf\xe0\x6d\x5c\x7b\x06\x0c\xd8\x86\x67\xc0\x80\x6d\xd7\xce\x60\x06\xa4\xbd\xec\x49\xcc\x00\xa9\x78\x73\x4d\xe7\x09\x44\x83\xb9\x8e\xc1\xb5\xef\x89\x65\x21\x94\xb6\x7a\xab\x34\x1f\x3a\x3f\x16\x30\x94\xe9\x03\x11\xa2\x74\xba\x9b\x64\x4a\xb4\x89\xa0\x87\xd5\xa4\xdc\x26\x17\x33\x08\x20\x07\x24\x69\xfa\x54\x58\xb1\xa6\xdb\x09\xea\x04\xf4\xd5\x67\x77\xbb\x51\xa6\x6d\x97\xf8\x1e\x04\xf3\x51\x60\x66\x4a\x6d\xda\xba\xcb\xfa\x7a\x9f\xf0\x52\xba\xd2\x04\x8c\xb3\xb1\x61\xff\x3c\xd6\x1d\x3e\xe6\xf2\x38\xc1\x1b\x9c\x48\x7a\x66\x30\x72\x13\xc1\xa7\xe9\xc4\x67\xf0\x16\x09\x15\x39\xbf\x52\xda\xb3\x14\xf4\xce\xce\x90\x3b\x7b\x82\x7c\xca\x80\xd6\xc9\x79\x87\xef\x29\x4a\x67\x3f\x11\x3a\xfb\x88\xce\xd9\x05\x32\x67\xe7\xa8\x9c\x3c\xe1\xde\x0c\xa1\xde\x4c\x9a\xd2\x13\x84\x4d\x2c\xc0\xfb\x66\x21\x88\x5c\xf0\x2a\x5a\xe0\xe4\x12\x36\xef\x29\xa3\x75\x5b\x03\xdd\xbe\x96\x29\xf4\xce\x83\xd0\xa5\x13\x19\x16\x9b\x6e\x22\xe1\xc0\xcb\x5f\x12\xa8\x77\x8c\x69\xa5\xb7\x16\x90\x58\x2e\xf0\x1d\x28\x4b\x6d\x51\x10\x52\xa6\xa8\x4b\xa1\x17\xf5\xf7\xc7\xbe\x87\x86\x8c\x9c\x4a\xf4\x2a\xed\xaa\x49\xd3\xc7\x03\x37\xd3\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\x78\xec\xee\x66\x4e\x77\x7f\x24\xb9\x3e\x72\x28\x06\xa9\xd6\x7d\x5f\x07\xd5\x06\x78\x3f\x34\x37\x87\x55\x24\xe2\x8e\x16\xe4\xf8\x19\x0c\xe8\x5c\x46\x69\xfa\x41\x40\xe0\xbe\x86\x81\xef\x8b\xda\x75\x6d\xba\xe3\x3d\xdf\x81\xef\xc4\xf6\x14\xc0\x8c\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\x7c\x8a\xc2\x9c\xaa\x45\x3b\x3d\x2e\x78\x7d\xa2\x45\x87\xf9\xcf\xb4\xe2\xd3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xb8\x36\x3d\xe8\x11\xe3\x75\x4a\xb4\xdc\xe7\x62\xc5\x8a\xd5\x93\x92\xbe\x49\x93\xef\xef\xd4\xea\x09\x89\x70\xd9\x9d\x40\x65\x07\xa9\x8d\x32\x38\xaa\x73\x0a\x95\xfd\x80\xc3\x3e\x19\x14\x36\xcb\x59\xcd\x04\x81\xdd\x23\xf8\xeb\xde\xd8\x42\xfb\x02\x79\xdd\xc3\x9a\xfb\x19\x60\xae\x39\x20\xae\xf9\xe0\xad\xfb\x5a\x9a\xfe\xc9\x20\xad\x5f\x04\x9c\x35\x63\xdc\x26\x13\x8c\xf5\x39\x20\xac\xfb\xeb\x83\x41\x19\x60\xab\xcf\x07\x59\xcd\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x88\xea\x73\xc4\xa5\x9f\x2c\x26\x9d\x21\x1e\x9d\x33\x16\x9d\x2d\x0e\xfd\x64\x50\xd4\x74\x18\x6a\x56\x9f\xc2\xb3\xc0\x4f\x73\x42\x4f\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x00\x8a\xb9\x56\xe2\x72\x0d\xc4\x68\xdc\xd6\xfd\x78\xfb\x02\x4b\xe4\xaa\x20\x59\xea\x11\x17\x84\xb6\x2a\x30\xc4\x8f\xcd\xf8\xa2\x8b\x91\xa1\xed\xb9\x28\xee\xb9\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\x7f\x3a\x26\x8a\x80\x82\x22\x49\x4d\xdf\x0f\xf7\xb8\xe1\xfb\xd8\x93\x5d\xf3\x96\xdf\x23\x3e\x53\x84\xa1\x43\xca\xdc\xce\x39\x0a\xbc\x34\x5d\x78\x24\x39\xde\xa1\xdf\xfa\xea\xa5\x6b\xe4\xeb\x8b\x7b\x40\x64\x48\xca\xbd\x8e\x7c\xd9\x3e\x7e\x3a\xf4\x65\xbf\x38\x6b\xab\x7e\xf8\xcb\x84\xc4\xf2\xc4\xbe\x5e\x1d\xa3\xf7\x56\x9d\x78\x05\xfd\xf1\xa2\x08\xb3\x12\x59\xde\xa8\xaf\x6f\x9f\x24\x43\xb0\xfb\xc6\x8d\xc7\x4c\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\x7f\x0b\x14\xd0\xc1\xe9\xba\x37\x4e\xd7\x1d\x21\x83\xbf\x3e\x6b\xeb\xf9\x91\xc0\x83\xb5\xf5\xef\x62\x6d\x05\x74\x6d\x6f\x04\x2e\xc8\x64\x9f\x94\x37\x27\x40\xba\x04\xb5\x4e\x87\xf3\xe2\x82\x11\x62\x12\x9a\x3a\x32\x3e\xe0\x9d\x9b\xb5\x55\xb5\x34\x3e\xc4\x1e\x33\x63\xfc\xd6\xba\x59\x90\x35\x4a\x3b\x08\xa5\x6e\xe8\x5d\x67\x9b\x34\x82\x5b\x8d\x44\xb4\x8c\x69\x15\xc3\x1e\x27\xdd\x79\x6d\x8b\x48\xc2\xe2\xdd\xe9\xb8\x47\xb8\x67\xc1\xd1\x00\xf4\x5c\x10\xd4\xe5\xd5\xf4\x3b\xa2\x5b\x9d\x71\x51\xd0\x69\xb5\x44\x0b\x5c\x69\x63\xc9\x82\x87\x6f\x69\x55\xd9\xd7\x24\x80\x95\x89\x32\xa1\x67\xa3\xd1\x54\x9c\xcd\x61\x32\xb0\xe9\x08\x79\x68\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc9\x5b\xe1\xfa\x99\x84\xd6\x0e\x5a\xa7\x12\x31\x5a\x8d\xdc\x94\xf7\xa9\x19\xd7\xf7\x7c\xe7\x52\x96\xa4\xb4\xac\x8a\xf7\x54\x92\x11\xbc\x33\xba\x4f\xa6\x2f\xfc\x8e\x08\x41\x4b\x62\xf6\x8d\xf9\xac\x11\xfc\x8e\x96\x1d\x76\x5c\x6f\x0b\xc0\x6d\x47\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\x39\x06\xf5\xd8\x0a\x34\x83\xe8\x34\xed\x1b\xfc\x20\x2b\x69\x81\x15\x91\x80\x95\xef\x51\xae\xde\x51\x1c\xdd\x13\x3d\x9e\x60\x47\xa1\x43\xc6\x11\x87\x8c\xb7\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\xec\x28\xe5\x60\x1a\x98\x03\x46\x53\xa2\x70\x97\xb4\xe6\x54\x32\x89\x08\xc3\xd3\x4a\x9f\x3d\xc0\x90\xdf\x6c\xdc\x00\x68\x46\xb0\x6a\x05\x41\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x37\x43\x2d\x93\x24\x51\x91\xcd\x66\x02\x44\x66\x62\xea\x13\xcd\x5b\xb5\x27\xf7\xc8\x63\xae\x23\x93\x51\x12\x18\x89\xb4\x26\x12\xf1\x36\xc1\x93\xd7\x33\xff\x6c\x73\x39\x2d\xbc\xc1\xef\xb4\xf1\x89\x0d\x9b\xe6\xd8\x61\x97\x81\x56\xbe\x21\x0f\xa5\x03\x5e\x99\x1c\xdf\xd7\x97\xd7\xbf\xbc\x3b\xfd\xef\xf3\x77\x71\x5b\x00\x64\x1d\x0b\x75\xe7\x96\xd1\x7f\xb6\x04\xe1\x9a\xb3\x39\xc2\x55\x98\x02\x33\x02\x47\x67\xf0\x01\x48\xc5\xbc\xc9\x32\x91\x7a\xad\xbe\x04\xa2\x04\xc3\x1a\x1c\xf3\x39\x32\x82\x62\x51\x20\x09\xe8\x8f\x3e\x12\xc6\x8d\x01\xf0\xa7\x3d\xf2\x06\x46\x94\x3e\xe3\xc6\x20\xa4\x0c\x61\x24\x29\x9b\x57\xc9\xb6\x60\xb2\x47\x24\xd5\x1f\x32\xee\x46\x30\x89\x75\x8b\xa4\x3b\x45\x7a\x7d\x88\xb7\x2a\xf3\x39\x04\xba\xcb\xcc\xb9\x00\xc8\x43\xc3\x25\x71\x2e\x00\xa3\xe3\x5e\x4c\x10\x2e\x4b\x91\xa4\x47\x5b\x61\xe3\x6d\x74\x43\x10\x60\x9a\x35\xa1\xdf\x11\x7a\x89\xfe\x0b\x3d\xa0\xff\x02\x87\xc0\x1f\xe3\x9b\xca\x63\x6e\xe7\x40\x34\x2f\xb8\x54\x17\x93\x4c\x0b\xfd\xd7\x05\x56\xf0\x46\xbd\x1e\x8a\xa3\x29\xb5\x96\x19\x79\x50\x44\x68\x8d\xd8\xae\x61\xea\xcc\x25\x39\x17\x74\x07\xbf\x94\xdd\x9d\x1a\x67\xbd\x98\xf5\x81\xd0\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x96\x8b\xb0\x1f\x35\x56\xc5\xa2\x2f\xee\x53\x5a\x7d\xaf\xf7\x5e\x70\xfd\x97\x1c\x2e\x4a\x93\xce\xb6\xa0\x09\xc2\x61\x7f\x4e\x6c\x1a\x64\x2e\xdf\xd6\xfd\xd8\xd6\x5a\x71\x6f\x82\x1a\x66\xf5\xb6\xa0\x72\x44\xc3\xcb\x63\x74\x8e\x8b\x45\x42\x2f\xf4\x6c\x94\x81\x32\xd0\xf0\xd2\x74\x63\x81\xef\xf4\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4d\xc1\x8f\x09\x32\x23\x42\x98\x94\xc9\xe9\xd2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x89\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\x87\xd7\x93\x11\xba\x39\x9b\x8c\x10\x17\xe8\xfa\x2c\x0d\x07\x12\x5a\xa3\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x3a\xc7\xcd\xd9\x24\xe2\x25\xeb\x48\xc2\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x40\xb6\xf0\xf9\xcf\x40\xb6\x30\x90\x2d\x0c\x64\x0b\x03\xd9\xc2\x40\xb6\xb0\xbf\x40\xff\x81\x6c\xe1\x93\xcf\x40\xb6\xf0\xe8\x33\x90\x2d\x6c\xf5\x0c\x64\x0b\xeb\xcf\x40\xb6\xf0\x91\x67\x20\x5b\xf0\xcf\x40\xb6\x30\x90\x2d\x7c\xb9\x52\x7b\x20\x5b\x58\x7d\x06\xb2\x85\x81\x6c\x61\x20\x5b\x08\x9f\x81\x6c\xe1\x91\x67\x20\x5b\x18\xc8\x16\x06\xb2\x85\x8f\x3f\x03\xd9\x42\xf4\x33\x90\x2d\x6c\xf7\x0c\xe9\x3f\x5b\x3e\x03\xd9\xc2\x40\xb6\xb0\xfa\x0c\x64\x0b\x9f\x7c\xf6\xc3\x3d\x3e\x90\x2d\x0c\x64\x0b\x1f\x7d\x06\xb2\x85\x81\x6c\xe1\xa3\xcf\x40\xb6\x10\xf1\xec\x9d\xd3\x75\x20\x5b\x18\xc8\x16\x3e\xd6\xc6\x60\x6d\x6d\xf7\x0c\x64\x0b\x03\xd9\xc2\xda\x33\x90\x2d\xac\x3f\x03\xd9\xc2\x40\xb6\x30\x90\x2d\x0c\x64\x0b\xfe\x19\xc8\x16\xbe\x76\xbf\x93\x20\x92\xfe\x8b\x4c\x78\x45\x8b\x65\x72\x9e\xc9\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x67\xc9\xfb\x57\xc1\xc4\x85\x49\xfc\xc2\xce\xc1\x53\x4c\xc1\x5e\x24\xf2\xbb\x01\x5e\xc6\x23\x08\xe0\x25\x0a\x0b\x65\xa6\x2f\xce\x59\x9a\x6c\xb5\x87\x03\xd9\x87\x44\xc2\x90\x7b\xc4\xef\x22\xc5\xbd\xb0\xa5\x8f\x6e\x2e\xdc\x34\x15\x4d\x49\xc9\x44\xe8\xba\x05\xed\x82\xd8\x10\xb8\xfc\x0e\x15\x4d\x3b\x42\x35\xa9\xb9\x48\x48\x8c\xc8\x60\xc1\xf5\xb6\xca\x3e\xac\xd3\x95\xe9\x90\x9b\x7c\xc5\x61\xfe\x97\xc6\x5e\xe8\x08\x62\xfc\x5a\x51\x27\x0e\x93\xb0\x66\xeb\x65\xab\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x30\x9d\x5b\x26\x72\xc1\xbb\x0b\xed\xb3\x73\x27\xd1\xf9\x86\x4f\x21\xfe\x29\x1b\xfd\x12\x3f\xa6\xa8\x0e\xe1\x4a\x10\x5c\x2e\xa1\x1b\x05\xe0\xf5\x3a\xff\xdf\x17\x98\xb6\x59\x54\x98\xc6\x83\xfc\x72\x1d\xe9\x33\xe8\x05\xd2\xfb\xb5\x03\xbf\x43\x1e\x99\x5f\xac\x91\x87\x78\x53\x73\xc6\x8f\xdd\xaf\xcc\x1f\x8f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x66\xdc\x19\x93\xae\x24\x0d\xd1\xda\xbb\x71\x76\xc6\xeb\xe8\x4b\x86\x6b\x5a\xb8\x53\x71\x6a\x36\x21\xe5\x6c\xc5\x02\xcc\xd1\x65\x6d\x98\xd6\x75\xab\xf0\xb4\x22\xc7\xe8\x42\x6d\x2c\x95\x9f\x96\xb3\x8c\xb2\x60\x55\x13\x71\xaa\x1b\x15\x68\xd8\x54\x86\x79\x81\x30\x2d\x7e\x38\x23\x88\x30\x25\x96\x7a\xff\x4d\x78\x79\xad\xb7\x60\xef\xdb\xc9\x84\x0c\x89\xf0\xd4\x1c\xd0\xd4\x44\x58\x6a\x1e\x30\x69\x3a\x90\x34\x2f\x88\xb4\x73\xf7\x1b\x3e\x99\x30\x3b\xa7\xb7\x2d\xf4\x15\xb0\x41\x34\x21\x3e\x4b\xec\x81\x6e\x71\xc2\x4b\xad\xe0\x08\x62\xe4\x93\x3f\xa3\xc6\xd9\x77\xa1\x3b\x77\x0b\xde\x39\xac\x3a\xcd\x07\xdf\x61\x5a\xe9\x03\x9c\xd8\x01\x9f\xdd\x9c\x29\x4a\x93\x29\xae\x60\x81\xf4\xfb\xb4\x59\x6c\x0a\x56\x2f\x8b\xab\x58\x70\x49\x18\xc8\x4b\xec\xb3\x6d\x7c\x2e\x80\x15\x31\xa5\xb9\x8b\x53\x11\xbf\x17\x33\x44\xea\x46\x2d\x47\x88\xdc\x11\xb1\x54\x0b\x40\x06\x08\x6e\xd0\x22\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x8c\x10\x77\xce\xe2\xc4\xe6\xe1\x7e\xb0\xf6\x53\x5b\x29\x63\x4d\x81\xfe\x9d\x94\x0e\x6a\x9e\x0c\xbb\x26\x37\xe9\x09\x4a\x15\x9a\x39\x49\x4b\xf4\x53\xd1\x9a\xc6\x51\x41\xa2\x8c\x67\xe1\x1d\xf4\x22\x48\xf3\xd0\x5b\xa2\xc6\x0f\xe0\x4a\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x95\xdc\x69\xf7\xcf\xe6\x63\x2c\x38\x9b\xd1\xb9\x8d\x82\x9d\xd4\x98\xe1\x39\x19\xfb\xee\x8c\x3b\xf5\xe6\x64\x77\xe8\x0c\x5c\x3a\x1a\x89\x49\x8e\x9c\x62\xac\x14\x11\xec\x3b\xf4\x3f\x87\x7f\xff\xdd\xaf\xe3\xa3\x3f\x1f\x1e\xfe\xf4\x72\xfc\x9f\x3f\xff\xee\xf0\xef\xc7\xf0\x8f\xff\x38\xfa\xf3\xd1\xaf\xee\x87\xdf\x1d\x1d\x1d\x1e\xfe\xf4\x97\xf7\x6f\x6e\x26\xe7\x3f\xd3\xa3\x5f\x7f\x62\x6d\x7d\x6b\x7e\xfa\xf5\xf0\x27\x72\xfe\xf3\x67\xbe\xe4\xe8\xe8\xcf\xbf\x8d\x8f\x14\xa6\x86\xc5\xf3\x05\xc5\x33\x85\xc4\x9f\x24\x20\x6e\x65\xec\xce\x0f\xbf\xbd\x02\xd7\x8e\xbf\x8d\x24\x7c\xec\xf8\x8b\x64\xff\xc9\xc5\xac\x6b\x9f\x4a\xc4\x6b\xaa\x94\xf5\x16\xe0\x90\xa7\x66\xc5\x77\x63\x05\x16\x9d\x19\x05\x8a\xca\x90\x2f\xa5\x73\xf9\x44\x77\xcb\xdf\xaf\xe0\xad\x62\x88\xd6\x4d\x45\x6a\xc2\x14\x08\x9e\xb1\xb3\x6d\xc1\xf5\x77\xdc\x8d\xa0\xc0\x8c\x71\x85\xc8\x43\x41\x48\x69\x3b\x39\xc8\xc6\xe0\x19\x64\xe3\x20\x1b\x3f\xf5\x24\xfb\xaf\x33\x39\x32\x43\x9f\xf5\x5a\x34\x4a\xcb\x05\x73\xc4\x9c\xfa\x0c\x5f\xf7\x1c\x07\x7c\x86\x48\x2c\x97\x65\xd7\x88\xa5\xc7\xc4\xb1\xde\x4a\x04\xf9\xe1\x56\x2a\x49\x87\x95\x31\xb6\x28\x67\xfb\xc1\x85\xde\x5b\xee\xab\xb6\xda\xa5\xf3\x3a\x60\x16\xd7\xba\x3d\x78\x34\x75\x8f\x1c\xa8\x7b\x41\x8a\x5b\xe3\x42\x2e\x89\x01\x59\x10\x73\x07\xc5\x69\x00\x01\x4d\xfe\x82\xb7\x55\xa9\xdb\xb0\xd3\x41\xcc\x02\x3d\x50\x75\xfc\xd1\x35\x8c\x6a\xf7\x2b\xa5\x87\xb7\x67\x56\xef\xa1\x40\x97\x59\xf0\xfb\x50\x95\x80\x39\xd5\x0a\xc3\x02\xb3\x32\x1a\x7f\xbf\x07\x61\x65\x0c\x98\xf4\x1d\x85\x82\x4d\xe3\xfb\x10\x5c\xbc\xf6\x50\x7d\x2d\x87\xb1\x05\xea\xe3\x5b\xc2\xf4\x01\x5a\x5f\xf8\x99\xa7\x74\xa0\x02\x34\xba\x14\xa6\x02\x00\x55\x62\x45\xa5\xd6\x36\x0d\xd4\x0d\x3c\x2a\x0d\x97\x92\x4e\x2b\xd2\xc1\x70\x5e\xd8\xcd\xf9\x42\x0b\x0f\x77\x5b\xa4\x51\x2c\x66\xf0\xed\x65\x50\x00\xf4\xac\x9e\xf1\x32\x45\x8d\x5b\xf1\xe8\x7b\x21\x6c\x10\x9c\x50\xc2\xa3\x34\x32\x18\x04\xb0\x5e\xd7\xfe\xaa\x7e\x1d\xae\x7c\x7d\x26\xb1\xe2\xf1\x2a\x5d\x1e\x77\xbe\xeb\xc6\x7e\x79\x69\x7b\x9b\x42\x90\x0a\x8c\x1c\xb9\xa0\x0d\x9a\x12\x75\x4f\xc8\x4a\x52\x42\xb7\x6f\x0e\xe5\x91\x43\x29\x27\x76\xa2\x43\x2a\x18\xc4\xc7\x31\x9a\xf4\x8e\x39\xc4\xbc\xd3\x89\x46\x2e\xd8\x77\xab\x22\x0a\x98\x50\x9d\x98\x71\x22\x6c\xc3\x58\x21\x06\x98\x16\xb1\xf4\x83\x25\xa0\xfd\xac\x8d\x39\x79\x78\x97\x5c\xa5\x8d\x30\x79\x68\x5a\x8f\xb2\xde\xfc\x27\x19\x65\xa6\x60\x89\x85\x15\xed\xd1\x29\xec\x5f\xb5\x76\xee\xec\xd6\xf7\xc2\xb9\x17\x65\x0e\xc4\x77\xea\xce\x39\x55\xa8\xe6\x52\xa1\x6f\xbe\xfd\x16\x11\xe3\x8b\x31\x20\x93\x64\x17\x34\xca\xc6\xc0\x94\x85\x83\x29\x1f\xed\x22\xca\x46\xbd\x88\x3e\x12\xf9\x88\x23\x1b\xcb\x0c\x7c\x92\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\xa8\x08\x63\x8e\xb3\xd2\xe5\x21\x5e\xf7\x3b\x64\xd1\x30\xee\xe4\x98\xdf\x21\xde\x18\x6a\xe9\x47\x8b\xa7\x75\x56\x61\xcb\xc0\x19\x10\xb7\xcb\x2f\x66\x7a\x95\x4c\x62\x0a\x18\x8e\x80\xd5\x59\xed\xa2\x4b\x19\x31\xdd\xf9\x67\x4b\xef\x70\xa5\x45\x73\xf7\x17\x13\x48\x22\x08\xff\xe8\x0b\x84\x50\x81\xbc\x98\x08\x7a\x47\x2b\x32\x27\xe7\xb2\xc0\x46\x99\xd8\xb5\x1b\xfe\xf4\x91\x7e\xc1\x7e\x10\xbc\x92\xe8\x7e\x41\xd4\x82\x08\x84\x5d\xe2\x12\x40\x7c\xe6\x98\x32\x54\x73\x91\x02\x03\xb1\x8d\x4a\x93\x39\x45\x95\x44\x0d\x16\x7a\xed\x5d\x86\x94\x01\x1a\x4d\x39\xaf\x2c\x4b\x7c\xb5\xec\xfa\x45\xe3\xf1\x12\x10\x73\xe7\xbf\x30\x72\xff\x8b\xee\x85\x44\xb3\x0a\xcf\x7d\x62\x14\x5c\x31\xab\x9a\x5d\x72\xd2\xd6\xa3\x13\x0d\x14\xe8\xad\xbe\x51\xee\xf1\x52\x76\xe9\x6c\x5d\xdb\x34\x41\xb6\xbf\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xe6\x08\xf8\x47\xce\x4e\x27\xbf\x5c\xff\xed\xfa\x97\xd3\xd7\xef\x2f\x2e\xa3\x5f\x76\xc9\x15\x31\x71\x94\xc0\xb5\x64\x1d\x4e\x76\x15\x3c\x54\xf7\x98\xcb\x63\x00\x49\x00\x97\x1a\x2b\xf9\x7d\x22\x92\x4c\xef\x29\x82\xe3\xfc\x18\xb8\x69\x4e\x45\xcd\xc5\x44\xf0\x19\xad\xa2\x75\xef\x5c\x27\x78\xa5\x3b\x0e\x53\x72\x6a\x3f\xee\xc4\xbd\xa1\xf7\x59\x87\x2e\x06\x82\x9a\x02\x89\x8c\x7e\x4d\x7c\x0c\xab\x97\x02\x68\x12\x12\x57\xba\x18\x7f\x88\x76\xba\x67\x76\x4e\x9e\xa0\xbb\x11\xf9\xe7\x39\x8c\xf4\x8a\x17\xb8\x82\xc2\x75\x69\x1b\x1f\x65\x36\x11\x56\xfb\x15\x24\x7b\x62\xb7\x9d\x51\xc5\x71\x69\xbc\xdb\x46\xf8\x97\xc4\x15\xb5\x70\xca\x0e\x40\xe4\x92\x3a\x72\x63\x12\xed\xa0\x3d\x97\x9d\xda\x08\xe2\x22\xa4\xab\xcd\x73\x53\xcb\x23\xa9\xc9\xf7\x7d\xc0\xa1\x1d\x65\x8f\x47\x21\xf5\xcc\xf9\x66\xec\x01\xa3\x33\xf0\x6c\x80\xc7\x51\x9b\xcc\xcb\xc6\xb8\x1a\xdf\xb9\x65\x48\xa8\x78\x95\xc9\x8c\x85\x97\xec\xc9\xee\x34\xf3\xe3\x77\xa4\xc9\x12\xba\xa5\x7a\x06\x67\x9d\x90\x76\xdb\xc6\xe9\x20\x26\x55\x28\x71\x3f\xfe\x08\xb5\x15\x9d\xfc\xcf\xe0\x26\xf2\x4b\x8c\xc6\xc1\xd1\x6a\x04\x19\xaf\x1f\xaf\x54\xcb\xfb\xaa\x65\x8a\xd6\xc4\x51\x4f\x8d\x57\x74\x22\x61\x7e\x7d\x20\x3d\xd1\x7b\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x2e\x80\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\xa8\x9b\x14\xf4\x07\x70\x2b\x65\x79\x52\x0a\xde\x98\x9b\xd8\x71\x42\xa4\xa7\x00\xf4\x73\x8f\x43\x8a\x7f\xeb\x13\xea\x75\x64\x2e\x30\x53\x1d\xe9\xc0\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x81\xec\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x6c\xe6\x67\x6e\x70\x41\xf2\x31\x9a\x7c\xb8\xbe\xf8\x3f\x2b\xe7\x26\x5e\xb5\x33\xcf\x7e\x73\x19\x6b\x79\x90\x6d\xdb\x5c\x91\x9a\xdf\x0d\x1b\xe7\xab\xdf\x38\xde\x41\xb4\x73\x22\xc6\xab\x36\x8c\xfd\x52\x16\x74\x0d\xd5\x49\xba\xce\xc4\x73\x16\xf5\xdf\x1a\xe4\xa4\x62\x41\x90\xfe\x0a\x53\x14\x57\xd5\x32\xf4\x91\x2a\x6e\x6a\x1c\x66\x29\xd4\x1d\xde\xae\x33\x5c\xc9\x2f\xf5\x8a\x4c\x71\xed\x34\x82\x17\xef\x79\xcb\xf2\x30\x3b\x26\xec\x38\xdf\x11\x54\x12\xc6\x95\xf5\xa6\x80\x2d\xc1\x67\xf0\x5b\x64\x00\xd2\x01\x69\x73\x4f\xcf\x49\x50\xb3\x6e\x02\xd5\xca\x23\x49\x9c\x1e\x6e\xec\x97\x56\x12\xb9\x59\xaf\xea\xf0\xd2\xb3\x04\x4c\x81\x20\xb8\x34\x90\x16\xac\x16\x86\x4d\xb4\xc6\xf2\x96\x94\xe6\x83\x44\x26\x25\xcf\x9a\x04\x19\x73\x6e\xa6\x6f\xf4\xe4\xba\x04\x59\x70\x08\x1b\xf8\x1d\x50\x2b\xa5\x98\x62\x3b\x3d\x0d\x09\x82\x5d\x2f\xc2\x07\x56\x2d\xaf\x38\x57\xdf\xfb\x62\xa9\xbb\x3e\x19\x7f\xb5\xe1\x88\xbe\x13\x13\xfc\xd2\x18\xba\x3c\x86\x8d\x03\x72\x31\x28\xf1\x9a\x2a\x16\xf5\x82\xfc\xbb\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xc9\xf6\x98\x12\xcb\x86\x53\xa6\x9c\xc7\x2b\x63\xd0\xe6\x07\x4b\x6b\x18\x4a\xb6\x64\x06\x33\x84\xde\xe3\x25\xc2\x95\xe4\xde\xa5\xc6\x36\x05\x39\x5d\x04\x55\xff\x7a\xca\xd5\x62\x2d\x74\x8a\x59\x7c\x28\x67\xbd\xbd\x51\xc0\xd9\xd7\x41\x53\x28\x5b\x6b\x56\x41\x0a\x71\x23\x48\x41\x4a\xc2\x8a\x2f\xf5\x44\xec\x9a\x42\x0e\x4e\xd5\x25\x67\x5a\xbc\xee\xfa\x5c\x5d\x78\xff\xa4\x5d\x8d\xf0\x14\x81\x2b\xdb\x06\x11\x31\xd0\x2d\x82\x70\x6d\x65\x0a\x06\xf4\x62\x06\x51\x4f\xb3\xe9\xfe\xd2\x4e\x49\xa5\x17\x9b\x56\x95\xde\x81\xb4\xc4\xca\x00\x02\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x68\x3c\x7c\xb2\xe4\x44\xfa\xc2\xdc\x58\xa2\x1f\x2e\x5e\xa3\x97\xe8\x50\x8f\xcd\x60\xf7\x66\x98\x56\xc0\xe0\xe8\x50\xb3\xa1\x0d\x30\x83\xdc\x30\x9e\x82\x30\xba\xb0\x72\x04\x71\x61\xae\x96\x11\x62\x1c\xc9\xb6\x58\xb8\x39\xa0\x9c\x79\x8f\xb0\xa5\xf3\x4f\xca\x7a\x1d\xc4\x4e\xbe\xfb\xf0\x07\x49\xa2\xc1\xaa\x39\xaf\xc3\x1f\x9e\xf1\x3a\x0c\x4d\x44\x7d\xfc\xfb\x0b\x66\xce\x6a\x4d\x14\x2e\xb1\xc2\xf6\x9a\x74\x5f\x18\x76\xed\x70\x59\x26\x5c\x96\x92\xbc\xa3\xac\x7d\x30\x48\xb7\xbd\x08\x7b\x5c\x9f\x43\x8f\xe0\x78\xc1\x42\xf3\x20\x6e\xe7\x22\x14\x19\x92\x25\x2e\x7a\xc7\x68\xf4\x88\xd5\x0d\xb7\x84\x63\x1b\xd3\x86\x10\x66\x25\xaf\xd7\x3a\x09\x74\x68\xb1\x09\x82\xa8\x97\xfd\x31\x1c\x4c\xf7\xfc\x7b\x07\x84\x2a\x72\x47\xaa\x6c\xbe\xfd\x77\xfa\x6d\x7a\x72\xdc\xce\x85\xd7\xa3\x0a\x4f\x49\x65\x39\xd8\x0c\x89\x66\xc6\x13\x96\xc9\x07\x2e\x78\x46\x48\xcc\x15\x37\x48\x2e\xec\x27\x42\xbf\xfe\x8b\x98\x87\xac\xe0\x8b\x1b\x8b\x2e\xe9\xe6\x01\x7c\xa0\x5f\xc2\x3c\xb4\x09\x0a\x22\x5a\x9d\x07\xad\x6d\xf6\xe7\x01\xf4\xaf\x7d\x9f\x07\x49\x8a\x82\xd7\xcd\x9e\x20\x25\x6f\x0c\x0a\x5e\xf7\xe8\x73\x51\x91\xfd\x2f\xe3\x24\xb8\xb3\x2d\x83\x80\x95\xb9\x07\x5d\x2d\x84\xff\x1d\x5c\xe7\x20\xed\x56\xef\x78\xdb\x7a\x32\x22\xd3\xb7\x68\x5f\xf8\xef\x78\xe3\x0d\x30\xcc\xde\xf3\xec\x30\xcc\x80\x9e\x15\x83\x7b\xbe\x07\x89\xfc\x1a\xc0\x98\xda\x08\x80\x79\x25\xac\xa4\x6c\x0e\x01\xab\x91\xcd\x1d\xbd\x23\x4e\x3c\xdf\x1a\x8f\xd7\x01\x48\x1c\xd7\x21\x27\x6e\x3a\xcc\xaa\xa1\x6d\xcd\x8a\xdd\xdc\x84\xd7\x34\xdf\xb9\xfc\x70\x13\x92\xb6\x62\xb6\x34\x84\x44\xf0\x27\x3b\xbf\x4e\xbf\x18\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2e\x43\x27\x08\xae\x52\xd9\x5e\xcc\xb3\xc9\x0b\xe2\x4e\x81\xe7\x2d\x5d\xf7\x06\xf4\x8b\x5d\xa5\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x42\xcf\xa0\xa2\xb8\xba\x6e\x48\xb1\x2f\xb7\xc5\x9b\xf7\xd7\xa7\xfd\x9e\x81\x2e\x6c\x59\x9a\x09\xfc\x1e\xe1\xb2\xa6\x52\x42\xc0\x87\x4c\x17\x9c\xdf\x26\x35\x79\xe8\x98\xfb\xe6\x54\x2d\xda\xe9\x71\xc1\xeb\x80\xc4\x6f\x2c\xe9\x5c\x9e\x58\x89\x32\xd6\x13\x77\x84\x28\xab\x7c\xa6\x30\x78\x0b\x99\x92\x36\x82\x90\x3c\x78\x54\xf8\xd1\xc3\xd6\x83\xfc\x14\x0f\xcd\x5e\x9f\x1e\xa0\xd2\x86\xcd\xbb\x73\xad\x63\x7d\x57\xa5\x95\xa1\x59\xd9\x59\x8f\x8c\x3d\xa4\x85\xb6\x51\x9c\x8d\xf3\x68\x8c\xd7\x9d\x4f\x92\x55\xfa\x0b\x22\x93\x10\xb0\x39\xcf\xdc\xdb\xae\x4b\x1d\x69\x1a\x30\x77\xe2\x47\x33\xdd\x21\xbc\x7d\x00\xa5\x7c\xed\x9f\x1e\xe4\x62\x32\x3f\xad\x2a\xbd\x90\x58\x5f\x13\x07\x32\x44\x77\x82\x69\xb2\xc0\x77\x46\x14\x48\xbd\xe2\x64\x36\x23\x05\x18\x0b\xe1\x28\xe0\x22\x49\x13\x0a\x86\x81\x2c\x2c\x8f\xa2\xb8\x69\x1b\xa3\x9a\x3e\xe8\x1e\x86\x2d\x86\x18\x54\x56\x42\xe0\x7f\xf3\xaf\x13\x2a\x1b\x22\x00\x1f\x78\x82\xce\x91\x5e\xa1\xb0\x11\x97\x1c\xad\xf4\xb5\xa5\x7f\x71\x49\x94\x36\xd4\xcc\xbc\x85\xd1\x07\x6d\x58\x89\x36\xc3\x61\x48\x89\x0c\xa3\x30\x3a\x9c\x55\x52\x24\x9e\x07\x88\x14\xdb\x3e\x69\x1d\xc4\x29\x6f\xcf\x15\x39\x46\x1b\xd2\x77\x9e\x2d\x82\x8c\x3e\x3f\x8a\xfc\x84\xb1\x2a\xb4\x2f\xf1\xaa\x44\xa9\x6f\xcb\xfa\x43\xa1\xd1\x64\xc6\x13\x78\xcb\x16\x65\x9b\x22\xda\xdb\x31\xf1\x07\x79\x88\xd7\x44\x7b\x53\x75\xfe\x40\x0a\xbf\x45\x24\xdc\x63\x75\x0d\x1c\x63\x1c\x1a\x69\x95\x2f\x64\x9e\x7c\x6b\xed\x89\x4e\x6f\x47\xb8\x2f\x42\xf4\xcc\x4e\x38\x75\x6a\xb2\xf9\x51\x2b\xce\xfd\x45\x90\xce\xdb\x1e\x50\x89\xeb\x1f\xf5\xcd\x45\xd9\xdc\x92\x99\x70\xe1\x19\x7e\x93\xba\xe5\xfa\x01\x15\xec\x38\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x10\x0f\x6d\x52\x37\xbb\x01\x49\x5a\x37\xd5\x12\xc6\x70\x60\x8a\xd6\x25\x72\x9e\x39\x64\x9d\x2f\x0a\x23\x17\xa4\xaa\x46\x48\xea\x7b\x1a\x3b\x3e\x6e\xf3\xa9\xfe\x92\x12\x6d\x61\xec\xf9\xc3\x83\x5f\x0f\x46\x88\xa8\xe2\x08\xdd\x73\x76\xa0\x8c\x67\x16\xdd\x80\xb2\x9b\xd4\x27\xdf\x89\x25\x6f\xa1\xae\xba\x59\x36\x4f\xe1\x5e\x60\xad\xa7\xb5\x46\x99\x30\xec\x00\xa4\x4a\xa8\x13\xae\x9f\xf3\x07\xaa\xb4\xcc\x54\x2d\xd8\x53\x2f\x8d\x4a\x43\xa0\x28\x1c\xd6\xa6\xf7\x1d\x39\x59\x10\x5c\xa9\xc5\xd2\xab\x59\xa6\x64\xb5\x44\x2d\xb3\xbf\x49\x17\xf6\x7b\x90\xdf\xb6\xbf\x99\x66\xb6\x72\xfe\xcd\x42\x10\xb9\xe0\xd5\xce\xf3\xcd\x5c\x39\xe5\x82\x33\xa9\x65\x8a\xb6\x05\x6c\x1f\xa5\x4f\xf5\xb1\x25\x9d\x0d\x45\x34\x87\x53\x26\x88\x41\xad\xea\xad\x05\x05\xa0\x17\xf8\x4e\xcb\x1b\xd9\x16\x05\x21\x65\x8a\x0e\x15\x2a\x6f\xbf\xcf\x59\xf0\x79\xf7\xb5\x95\xf5\x33\x17\x4d\x9e\x5b\xfa\xcd\xd5\xe4\xac\x77\x4b\xc3\x07\x6f\xe1\x18\x9f\x2d\x48\x71\x7b\x95\x56\xe3\x68\x4f\x62\xa0\x0d\x17\xbb\x54\x0c\x74\xf3\xd9\xb4\x82\x09\x17\x0a\x31\x5f\x42\x5d\x9f\xad\x39\xac\x22\x11\x77\xb4\x20\xc7\xae\xbc\xba\x8b\x22\xba\x9a\x5c\x98\xcd\x09\x7a\xa5\x0f\xc4\x1f\xbf\xfd\xf6\xf7\xdf\xa6\xcb\xe8\x74\xee\xc5\x3c\xbc\x8b\x76\xe0\xfb\xa2\x76\x5d\x9b\xee\x6c\xf2\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\xee\x13\x49\x08\xda\xe0\x57\xd5\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\xe2\xa4\xe4\x85\xbd\xd6\xc7\xc0\x50\x4a\xd9\xfc\xb8\x2e\x8f\x12\x8a\x6e\x22\x9b\x35\xb1\xa0\xd2\xb9\x71\x56\x02\x22\x2e\x4a\xe6\xcb\x41\x50\xe9\x43\x79\xd3\x25\x4c\xca\xce\x7d\x85\xc8\xf5\xf2\x3b\xf4\xe2\x45\xd4\x5b\xf4\x12\xbc\x21\x79\x52\x66\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\x08\x9f\xde\x5d\x26\xfb\x62\x90\xda\x29\x52\x7b\xc1\xd3\xaa\x30\xe6\x76\x10\x1b\x51\xa2\xb8\x56\x9f\x18\x29\xf4\x42\x8f\x7a\xf5\x9e\x1c\x60\xea\x62\x62\xca\x61\x68\x95\x0b\x4f\xab\x25\xba\xc7\x26\xf5\x3a\x8e\x85\xb6\x7b\x5e\xe8\x6e\xbc\xd0\x52\x4b\xef\xea\xb7\x04\x97\x44\x48\xb0\x86\x08\xde\x7d\xf0\x23\xe8\x53\xb6\x65\x3b\x6b\xa5\xe2\x35\x5a\xd8\xa1\x9a\x39\xec\xca\x5c\x1a\xdd\xc8\x1c\x41\x70\x06\x49\x24\x48\x63\xac\x25\xfb\x37\x5f\x85\x2d\xb4\x26\x85\xcc\x3c\x07\x05\x44\x30\x2a\xc2\xa9\xb2\x8a\x3e\x54\x9f\xa6\x56\x46\x81\x05\x90\x66\xa5\x67\x29\x44\x80\x32\x15\x23\x40\xe9\xb5\x85\xdd\x4b\xd2\xa3\x25\x79\xca\x1a\xa0\x2c\x95\x8a\x51\x76\x52\x75\x64\x63\x02\x76\x73\x19\xa4\x80\xee\x68\x2a\x7d\x1a\x72\x24\x0b\x0e\x79\x51\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\x21\xde\xaa\xa6\x55\xe0\x0a\x2a\xb0\x24\xe3\x3b\x2c\xa8\x16\xa8\xa6\x9e\xbb\x87\x6c\x30\x7d\xda\x15\xe7\xe0\x27\xf1\xd1\x31\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\xe3\xcc\xcf\xbc\xc2\x6b\x8b\x93\xbe\xa3\xd1\x5e\xfb\x60\x90\xa9\xac\xb7\xc8\x67\xd6\x61\xb5\x00\x08\x52\x01\x91\x44\x8b\x60\x03\xc1\xa9\xcd\x86\x3d\xc8\x10\xc8\x6a\xc5\x26\x8a\x04\x08\x0c\x72\xb1\x62\x07\xeb\x1e\xae\xcf\x61\xa6\xa0\xf8\xd3\x9b\xd5\x61\x55\xf6\x29\xd1\xba\xfd\xc5\xe9\xe5\xe9\x2f\xd7\x3f\x9e\xfd\x72\x79\xfa\xfe\x3c\xe5\xd5\xc9\x15\x15\x73\xd6\x54\xcc\x56\x55\xf1\x89\x6a\xce\xea\x47\x16\x0b\xb2\x3f\xf1\xf0\x6b\xe8\x4d\xc8\x9e\x64\x6d\x00\xca\xe6\x4e\xf3\x4f\xa3\xd3\x42\x2b\x4e\x53\x2d\x78\x76\x2a\x71\x28\xa3\x8a\xe2\xea\x35\xa9\xf0\xf2\x9a\x14\x9c\x95\x3b\x87\x91\x5e\x7a\x61\x23\x4d\x87\xac\xdb\xba\x0f\x3e\x58\x60\x89\x5c\x75\xc2\x29\x99\x71\x41\x20\x6a\xc2\xb4\x44\x6a\xba\xf8\xb1\x19\x9f\x7a\xc6\xb2\xe0\xf7\x5c\xdc\x56\x1c\x97\xf2\xa4\xe1\xe6\x3f\xe3\x8a\xce\x48\xb1\x2c\x2a\xf2\x1b\xdf\xff\x71\x92\x9a\xbe\x1f\xee\xf1\x86\x08\x0a\xd0\x85\x7d\xd8\x35\x6f\xf9\x3d\xe2\x33\x45\x18\x3a\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\x69\x9f\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x07\x44\x86\xa4\xdc\xeb\xc8\x97\xed\xe3\xa7\x43\x5f\xf6\x8b\xb3\xb6\xea\x87\xbf\x4c\x48\x2c\x4f\xec\xeb\xd5\xb1\x4f\xa8\x79\x05\xfd\xf1\xa2\x08\xb3\xd2\x61\x63\xbe\xbe\x7d\xa2\x8a\xe6\x9a\x17\xb7\x99\xdc\xae\x37\x67\x13\xf3\xb6\x15\x3c\x8b\xb9\x81\xb5\x96\xc9\x11\xd6\xdf\x02\x05\x74\x70\xba\xee\x8d\xd3\xf5\xa0\x2b\x35\xb5\xad\x03\xf5\x60\xb0\xb6\xba\xc7\x29\x3e\xa2\x5f\xaa\x61\xb0\xb6\x1e\x79\x06\x6b\x6b\x8b\xc7\xa0\xdd\x21\x73\xf4\x8d\xc0\x05\x99\xec\x93\xf2\xe6\x04\x08\x2a\x5b\x61\xeb\x5f\x79\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x73\x3d\x92\x59\x5b\x55\x4b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\x9b\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\x87\xea\xcc\x84\xc5\xbb\xd3\x71\xb8\x82\x48\xd2\xb9\x9e\x2e\x5b\x4c\x16\x19\xb6\x1f\x57\x23\xac\xeb\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\xa5\x7b\xaa\x16\x08\xa3\x5b\x5a\x55\xf6\x35\xf1\x13\x75\xed\x4a\xc0\x1b\x8d\xa6\xe2\x6c\x0e\x93\x81\x2d\x78\xfc\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x33\xe0\xc7\x5d\xe0\xdb\xeb\x53\x8c\x5a\x9e\x04\x53\x61\xea\xa3\x7b\xbe\x9f\x05\x88\x3e\xa8\x05\x11\xf7\x54\x12\x53\xf1\x2a\xba\x4f\xa6\x2f\xfd\x7a\x57\xe6\x33\xcf\xf5\x60\x53\x9c\xf4\xb6\x80\x9c\xbb\xe8\xb6\x7e\x84\xf7\x3a\xd1\xca\x38\x1b\x33\x32\x37\x19\xe5\x56\xa0\x19\x44\xa7\x69\xdf\xe0\x07\x7d\x7e\xb2\x54\xbc\x41\xb4\xae\x49\xa9\xed\xe3\x6a\x89\xee\x28\x8e\xee\x09\x64\xaf\x77\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\x2c\x21\x31\xe4\xc6\xc2\x1c\x30\x9a\x12\x85\xad\x0f\x5c\x1f\x02\x4f\xde\x0c\xbc\xcc\xfa\xec\x01\x86\xfc\x66\xe3\x06\xf0\x7c\xce\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x97\x48\x18\xbb\x1f\x14\x6c\xfa\x44\xf3\x56\xed\xc9\x3d\xf2\x98\xeb\xc8\xe4\xe2\x07\x46\x22\xad\x89\x44\xbc\xcd\x44\x8c\xff\xca\x36\x97\xd3\xc2\x1b\xfc\x4e\x1b\x1f\xa9\x4a\x1a\x55\x1e\x35\xc7\x16\x7b\x84\x65\xdc\x26\x0c\x06\x44\x7b\xd3\x76\x36\x23\x02\x6e\x3a\xe8\xf0\x1a\xec\xde\x17\x1c\x72\x77\x58\x9c\xf3\xd6\x02\xbe\x88\x1a\x01\xc9\xb9\xcd\x7a\x7f\xa4\x49\xcb\x06\x08\xf5\x44\x05\x91\x40\x5a\xcd\xd0\xf9\x87\xef\xe3\xb6\x68\x0e\x0a\xf4\xb4\xdc\x3a\x18\xe7\x07\x16\x87\x49\xcc\xbb\x1f\x36\xd1\x53\xd8\x6d\x51\x54\x5c\xda\x3c\x4e\x58\x97\x62\x81\x19\x23\xce\x19\x45\x15\x78\xb2\xa7\x84\x30\xc4\x1b\x62\x40\x79\x51\x9d\xc1\x48\x52\x36\xaf\x08\xc2\x4a\xe1\x62\x71\xac\x7b\xc7\xdc\x5e\xe8\x12\x26\xed\x27\x52\x09\x82\x6b\xb3\x27\x04\xa9\x31\x35\xcd\x23\x5c\x08\x2e\x25\xaa\xdb\x4a\xd1\xc6\xbf\x2c\xce\x8b\x48\x20\x75\x5d\x9a\xfc\x39\xb7\x56\x90\x56\xd2\x65\x66\x8e\xba\x1e\xda\xe1\xf3\xb0\xaa\x0a\xb8\xce\x46\xfa\xb7\xa4\x6e\xd4\x12\xe9\xa9\xad\xa2\x73\x63\x66\x54\x48\x85\x8a\x8a\x12\xa6\xec\xc8\x0c\x37\x1a\xf4\x61\xe4\xd4\x69\x66\x67\x44\xda\x29\x61\x25\x18\xdf\x8d\x92\x08\x32\x10\x7d\x27\xdc\xab\x4a\x2a\xad\xaf\x43\x8e\xe2\xd6\xce\x95\xd0\x30\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x05\x81\xf5\xb1\x36\x21\x91\x34\xb9\x02\x75\x2e\xdc\xb9\x1e\xf5\x92\xa3\x3b\xdb\x02\x52\x61\xd6\xa4\x0e\x6c\x28\x46\xee\xf4\x39\x20\x05\xd1\xaa\x28\xce\x28\x64\x9e\x5d\xc6\x28\x2c\xe6\x44\x9d\xb9\xf1\xc7\x66\xef\xe6\x90\x36\x61\xe5\xf4\xd0\x41\xd4\x2d\x0e\xac\xc3\x84\x97\xc0\x26\xd1\x31\x7e\x6c\x2a\xe7\x6e\xc6\x15\x69\x7b\xdd\x3c\x52\x23\xde\x59\x54\x26\xc3\xcb\x77\x54\x36\xb8\x20\x12\x1d\x5e\x4c\xce\x46\x68\x72\xf1\xda\xa6\x71\xf1\xd9\x2a\xbb\x5e\xec\xb4\xd8\x4b\xd0\x9c\xdd\xc7\x0a\xd8\xfb\xea\x34\x41\x97\x02\x9a\x2d\xdb\xdf\x89\x37\xca\xa2\x67\x66\xfd\x26\x00\x0b\x8d\xd6\x4d\x05\x75\x22\x91\x6c\xc1\x32\xb2\x81\x0b\xbd\xb5\x8d\x3d\x62\x0f\x2d\xe9\x08\x8e\x2c\x19\x7d\x64\x10\xc7\xb4\xe2\x87\x6b\xd7\x1c\x62\xd9\x6e\xa2\xac\x1e\x00\x0a\xb3\xb2\xbf\xf2\x1c\x31\x90\x6b\x66\xa1\xe2\xf1\xb7\x7b\xa4\x3b\x2c\x30\xa2\xde\x13\x29\xf1\x9c\x4c\x22\x71\x40\x39\xce\x5e\xe7\xe1\x06\x00\x51\x27\xaf\x17\xc4\x50\x61\x29\x1e\x7c\x12\x66\x57\x86\x5e\x9b\xda\x0c\x24\xaa\x07\xee\x6c\xdd\x0b\xaa\x14\x81\xeb\x01\x6a\x3d\xc1\xd6\x5d\xa5\xf7\xec\x67\x75\x46\xb5\x67\x27\x3d\x6c\x4f\xeb\xfd\xac\x34\xf9\x91\x53\x82\xa6\x82\x92\x19\x9a\x51\x48\xd8\x84\x54\xc6\x91\xa9\x53\x80\x01\x30\x8f\xa5\x24\x02\x86\x6d\xfd\x71\x6e\xf8\x71\xfd\xf9\xab\x1d\xbf\x12\x2d\x2b\x70\x50\xc4\x13\xd8\xc7\xe8\x0c\xcd\x21\x7d\xd2\x7a\x9f\xfe\xf0\xf2\x3f\xff\x88\xa6\x4b\x6d\x28\xc1\x99\x54\x5c\xe1\xca\x75\x00\x55\x84\xcd\xf5\x2a\x82\xae\x13\x77\x61\xf7\x18\xac\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x77\x1e\x28\x26\x27\x25\xb9\x3b\x09\xb6\xd0\xb8\xe2\xf3\xb8\xb7\x9e\x79\xc2\xa7\xb6\x29\x63\x01\x11\xb9\x4f\x34\xaf\x68\xb1\xdc\xd9\x7d\x6a\x5d\x61\x68\xc1\xef\x8d\x17\x75\xfd\xa8\x06\x64\x30\x0d\x6f\xda\x0a\x26\x0e\x7d\xef\x19\xfc\x5a\x49\x56\xc9\x91\x52\xbd\xf3\x81\xb4\x03\xf4\x82\x6d\x76\xe5\xaa\xb7\xb9\xc3\xae\x9b\xdc\x52\x53\xd8\x60\xb7\xaf\x54\x12\xed\x06\xff\x1e\x57\xd5\x14\x17\xb7\x37\xfc\x1d\x9f\xcb\x0f\xec\x5c\x08\x2e\xfa\x63\xae\xb0\x56\xa6\x17\x2d\xbb\x85\x3a\xbb\x1d\x5d\x2d\x9f\x5b\x30\x2f\x30\x4b\xf6\x27\x36\xaa\x33\x6e\x94\x86\x40\xd4\xd9\x02\xce\xf9\xdd\xb5\x4c\x1e\x68\xe7\xe1\x66\x88\xe8\x3e\xc7\x6b\x38\xe1\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\xb9\xfe\x72\x64\x2e\x00\x50\x7d\xb5\x8d\x53\xe3\xaa\x8a\xd5\x69\x42\x11\xf0\x7d\x74\xf9\xea\x3d\x38\xf2\x6a\x67\xa7\xfb\xb3\x7d\x35\x37\x37\x7f\x03\x4d\x8c\x2a\x49\xaa\xd9\xc8\xf0\xc1\x78\x7f\xf2\x01\x98\x35\x07\xf6\xca\x8b\xe7\x12\xda\xbd\xb7\xe4\x8e\x57\x6d\x4d\x5e\x93\x3b\x5a\xc4\x21\x07\x7a\xab\xd2\x7b\x9b\x8b\x8f\x55\x54\x82\x2e\x39\xad\x78\x71\x8b\x4a\xfb\xcb\x20\x47\x65\xb5\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x3a\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x7d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x8c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\x7f\x1b\xa2\x93\x35\x53\xdd\x57\x54\xf3\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\x1f\x37\xc8\x80\x42\x48\x4b\x4e\xea\xcd\x0b\xf3\xe8\x8f\x1a\x2b\x6b\x1f\x39\xef\x05\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xbb\x9a\x84\xf5\x54\x96\x1a\x37\xe3\x5b\xb2\x8c\xdc\x70\x89\xc7\xe5\xb1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x09\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x65\xc6\xa2\xeb\x76\x0a\x67\x0a\xbe\xfe\xb4\xf4\x60\x59\x95\xa7\x5d\xdf\x55\x3f\x76\x2b\xde\xbf\xaa\xf4\x27\xfe\xae\x32\xdf\xfa\x9a\x6e\x28\x18\xdf\x97\x7a\x41\xf9\xce\x67\x92\xc3\x49\xd8\x44\xb8\xd6\xec\xce\xe8\xdf\x63\x3d\x4f\x98\x39\xd2\x81\xcd\x6c\x3d\x54\xc7\xa6\xde\x40\x42\x07\xf4\x51\xb4\x8d\xa2\x83\xef\x0e\x76\x7a\x39\x9a\x95\x11\xbc\xc1\x73\x30\x69\xf7\x61\x81\x56\xfb\x14\xd2\xdb\x2e\xf8\x7d\x28\x32\x1b\xfb\x2d\x2d\x31\x1d\x47\xfa\x82\x27\xad\x8e\xc1\xfa\xba\x1d\x61\xcd\x72\x53\x25\xe2\x1e\x2f\x11\x16\xbc\x65\x49\xc4\x05\x10\xca\xf4\xa1\xee\xf7\x2b\x83\xbd\xe4\x8c\x38\x58\x4d\x4a\x2b\x37\x3d\xd7\x37\x20\x8c\x28\x43\xaf\x8e\x5f\xbd\x4c\xee\xfb\x15\x29\x5a\x21\xe9\x1d\xb9\xb2\xe5\xd3\x83\x30\xe8\xc5\x6c\xc2\xa5\xa4\xd3\x0a\x52\x2d\x15\x47\xe7\xa6\xb6\xfc\xfa\x40\x3d\xd4\x0b\x46\xcc\x45\x48\x84\x9a\xd0\xc3\x43\x73\x82\x43\x88\xb6\x6e\x20\x01\xa7\xb5\x5f\x2a\x28\xac\xeb\x8a\x0a\x7a\xe9\x55\x50\x73\xef\xed\x74\xac\xae\xa6\xfe\x3e\x48\x92\xf7\x36\xa8\xd0\x15\xcd\xa7\xae\x28\x33\x7c\x74\x2f\xa8\xb2\x87\xfb\x9e\x4a\x82\x0e\xc1\x9d\xb1\xb2\x19\x93\xb8\x9f\x43\xe7\x57\x62\x71\xfd\x1c\xdc\xcd\x62\xf5\xe8\xee\xc3\x2a\xad\xcb\x93\x2e\x67\xe6\xde\x7a\xbe\xba\x15\xb4\xd2\xbf\xbb\x97\x17\x98\x95\x55\x92\xcc\xf0\xb3\x52\x2d\x93\xd8\xab\x2e\x66\x28\x14\x89\x16\x71\x10\x04\x21\x17\x58\x22\xc6\x51\x4d\x30\x40\xaa\xf5\xed\xe2\xa4\x60\x8f\x06\x3a\x5f\x1f\xcc\x66\x37\xd7\x58\x78\x21\x58\x71\xfd\x9a\x4a\x2b\x9e\xb5\x1c\xb1\xa6\x8b\x01\x62\xd5\xb8\x4c\x21\x63\x08\xe6\xb4\x5b\xbc\xe3\x0e\xe6\xbc\xda\x93\xee\xe2\x58\xe9\xcb\x53\xf4\x63\x64\xab\x9b\xeb\xe6\x4d\x64\x79\x83\x3f\xaf\x83\xb5\x25\xe1\x4f\xcc\xb3\x3a\x5c\x7f\x2d\xae\x8d\x75\x73\x8f\x7d\x87\x13\xfa\xf0\xe9\xa1\x8e\x02\x59\xe8\x50\xdd\x06\x04\x63\xcb\xab\xd8\x1c\xe5\x34\x92\x70\x17\xcd\xf0\x7e\xa2\x39\x61\x44\x60\x1b\x90\x70\xa0\x6e\x1b\xd2\xc7\x92\xb3\xd4\x03\xf1\x89\x0d\xa7\xe5\xfd\xa7\xd5\x14\xf3\x67\x09\x1d\x01\x3d\xe7\x90\x8b\x95\xd3\x6e\x43\x2d\x9b\x34\x96\x9c\xa3\x5e\x21\xd3\x33\x9b\x3f\x60\xe9\xd5\x8b\xf2\xcf\x96\xde\xe1\x8a\x18\x7a\x7c\x27\x1a\x76\xaa\x4c\xc8\x76\xba\xaf\x66\xa3\xb5\x0f\xc1\xec\xd8\x8c\x96\x78\xd4\x82\xcc\xa4\x4f\xbc\x78\x81\x0e\x4d\x1b\x07\x86\x16\x7b\xb7\x4a\xae\x5d\xab\xf3\x87\x26\xa1\x28\x6c\xbe\xf5\x3a\x7f\x68\x30\x00\x3c\x9a\xbd\x58\xb8\xff\x26\x0b\x7c\x47\x80\x85\x9c\x56\x58\x54\x90\x46\x72\x6d\xa6\x0c\x4d\x5b\x85\x08\xbb\xa3\x82\x33\x00\x55\x01\x5d\x94\x96\x4c\x82\xcc\x88\x20\xac\x20\x12\xfd\xf6\xf0\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8f\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\xee\x6c\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x15\x0e\x48\x03\x50\xf6\x69\x63\xd7\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x7c\xa1\x2c\x5d\xc3\x0a\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xdd\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\xbf\xe0\x52\x9d\x56\x14\xcb\x6d\xfd\xd8\x69\x5b\xfd\x6d\xd7\x2c\x64\xfb\x31\x5b\xd5\x11\x57\x1e\x62\xa0\x7b\x66\x60\x4e\x17\x13\x8b\x45\x77\xbb\x92\xb2\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd9\x13\x83\x38\x9a\xa1\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x16\xbc\xb2\x79\xd7\x0e\xcd\x30\x25\xea\x9e\x10\x86\x2e\x26\x30\xe7\x7a\x2a\x0d\x2f\xe3\xe6\x99\xb7\xca\x31\x53\x62\x69\x0f\xf4\xd6\xbd\x09\xd6\x0c\x56\x61\xdb\xa3\x9b\x10\x7f\x8a\x8f\x3c\x8d\x11\xdd\xf6\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\xde\xfa\x05\x75\x6c\x3a\x78\xca\xef\x08\xac\x77\x59\x8a\xc8\x2c\xed\x9d\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xec\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x96\xc7\x2d\xdf\xad\x78\x31\x39\x7b\xce\x1b\xf1\x07\xeb\x5d\xd2\x4d\x1f\x48\x44\x9b\xa2\xcb\xeb\xd8\x76\xe9\xbb\x5c\x86\x80\xce\x2c\xc2\xd1\x1e\xeb\x5c\x5f\x74\x05\x1b\x9f\x5b\xa9\x40\xcc\xb4\xab\xaf\x34\x4b\x2b\x6e\x81\x23\xe0\xf9\x69\x78\x79\xbc\x3a\xd5\xf6\x2f\xe2\xa7\x1b\xe2\x7f\xc6\xe0\x0c\x4b\x55\x2e\x79\xeb\xac\x65\xa3\x5c\x2c\x81\xe9\x47\x42\x29\xac\x05\x01\x66\xcc\xb2\xad\x0c\x98\x18\xdf\xe3\xed\x81\xdc\xd0\xf0\x3f\x82\xd9\xfe\x47\xe7\xdd\xee\x8a\x0a\xc2\x17\x26\x5c\xa8\x7f\x18\xc7\x97\xd4\x17\x36\x24\x0e\x41\xe6\x0f\x35\xd5\xb7\x82\xe8\xd9\x3f\xbc\x6a\x0e\x7f\xb5\x6d\xc2\xa3\x56\x1f\x02\x57\xde\x67\xb6\xaf\x2d\x5c\x2b\x6f\x8c\xcb\x73\x63\x5f\xb6\x9d\xa1\xdd\xed\xff\xc9\xc5\xeb\x1d\x8a\x8f\x86\x96\x5f\xb6\xf8\xf8\x41\x6e\x5d\x7d\x20\xeb\x04\x42\x91\xd2\xbc\x33\x18\x03\x2d\xb7\x75\x49\xed\x5f\x03\x71\x18\x57\xa8\x11\x44\x12\xa6\x46\xfd\x70\x44\x3f\x2d\x13\xb4\x87\xfe\x28\x46\xfa\xe7\x59\x5b\x6d\x6b\x21\x71\x11\x30\x0f\x79\x9a\x26\xec\x49\x56\x20\x14\x83\xef\x30\xad\xc0\x3d\x17\xd0\xe8\xae\x75\xc0\x66\x8f\x6d\xd9\x83\x8a\xe3\x12\x42\x83\xe8\x56\x5f\xed\x15\xaa\xb9\x16\x9c\x26\x0d\xe4\xec\x74\xf2\xcb\xf5\xdf\xae\x7f\x79\xff\xe1\xf5\x0f\xef\xb6\x66\x1b\x33\x29\xf4\xa4\xdb\xe2\x23\x84\x11\x23\xf7\xd0\x73\x06\xc6\x69\x61\xe3\x01\x9e\x85\x52\xdf\x21\xd7\x36\x99\xd2\xc4\xc6\x0d\x34\x65\xd6\x56\xfa\x4b\x5b\xf6\xa0\xa6\x8a\xce\x31\xbc\xac\x73\x89\x4c\x05\xc1\xb7\xbc\x55\xe8\xae\xad\x18\x11\x78\x4a\x2b\xaa\x2d\x08\x44\xee\x08\x33\x78\x48\xfd\x07\xba\x93\x61\x31\x5f\xba\x6d\xe3\x61\xad\x67\x5b\x45\x52\x4f\xaa\x6e\x19\x17\xd6\xdd\x68\xd9\x34\xe1\x97\x8d\xa0\x77\xb4\x22\x73\xe2\x69\xea\x62\xd8\x92\xfb\x30\x1c\x5c\x35\x0b\x3c\xae\xc8\x1d\x31\x74\x57\x54\x9a\x1d\xb5\xe0\x8c\x0b\x13\x97\x33\xc4\xed\xd6\x16\x05\x02\x20\x73\x58\x5d\x69\x63\x93\xec\x7b\xed\xb2\x6e\x6d\xb2\xed\xb3\x09\xab\xed\x91\x2c\x69\xb2\xea\xda\x23\x01\xdc\x0a\x84\xd9\xe2\x93\xad\x41\xd5\x9b\xfd\x83\x9d\x7d\x0e\x6f\x77\x32\xc6\x1e\x16\x8c\x0c\x68\x77\xec\x2a\x4d\x01\x21\x4e\xcc\x9c\x6f\x6d\x9e\xb8\x2e\x7d\xb0\x14\x5c\xcf\xad\x63\x86\x6d\xf7\x4b\x48\xb9\x9a\xa2\x9e\x1d\x2c\x14\x1a\xe1\x64\x62\x89\x1a\x22\x80\x3d\x21\x64\x0b\x4b\x38\x48\xbc\x0f\x11\xd9\xd4\x26\x2b\x7d\xbe\x39\xc2\x50\x6c\x1e\x51\x25\xd1\xeb\xcb\x6b\x24\x48\xc1\x45\xb9\xb5\x0b\xe0\xaf\xe6\x5a\xd8\x10\x48\xc6\x40\x56\x66\xd2\xf8\x2c\xb3\xe1\xd6\xa6\xdf\xc5\x7a\xf5\x6b\x98\xd8\x8e\x71\x4d\xba\x2a\x42\xff\x70\xa3\xfc\x07\x0c\xf3\x1f\xb2\x9d\x96\xbc\xc6\x94\x6d\xad\x31\x8e\x21\x33\x70\xf2\xd1\xbd\xdf\x51\xd2\x6d\xff\xf6\x7f\x48\xa2\xdc\x26\x3a\x95\xdf\xff\x7f\xaf\x2f\xff\xd1\xf1\xbb\xd1\x4a\x5f\xf1\xe1\x75\x14\xd1\x40\xcf\x1e\xe8\x07\xea\xdd\x3b\xe3\xb7\x99\x67\xf9\xd4\xe3\xa7\x25\x6c\x1e\x3f\xd9\x7a\x5b\x3b\x71\x40\x19\xba\xfa\xfe\x0c\xbd\x7a\xf5\xcd\xef\x61\x49\x1c\xb6\x17\x2b\x54\x6b\xcd\xe0\x8f\x7f\x40\xc5\x02\x0b\x5c\xa8\x08\x00\xff\x95\x4b\xde\x83\xd2\x1e\xab\x47\x32\x24\x7f\xb3\xb9\x69\xe6\xce\x88\xf2\xed\x6e\x2d\x9e\x20\x9c\x31\x69\xab\xea\x9a\x14\x82\x6c\x9b\x82\x91\x26\x9e\x2e\x56\xda\x7e\xcc\xb9\x1e\x84\x50\xa1\x14\x97\xfd\x32\xeb\xea\xed\x04\xa4\x12\x5d\xb1\x84\xa6\xad\x2a\x83\xd1\x5a\xba\xdb\x06\x46\x2b\x83\xe4\x3f\x2a\x1d\x41\x49\x8c\xb2\xdb\xbb\x82\x24\xf1\x5d\x73\x27\xb0\xc1\x52\x76\x90\x98\x3b\x5a\xb6\xb8\x82\x6e\x41\x1c\xc9\xf2\x6f\x60\x63\x52\x5a\xd9\x5b\xdb\x11\x6c\xdb\x9d\x2d\xd9\xd9\x3a\x55\xea\xc4\xcc\xc9\x6f\xac\xd5\x4f\xd9\x7c\x0c\x9f\xe8\x6e\xda\xf1\x8c\x39\x1b\xe3\xf1\xb6\xe9\x4f\x5f\x54\xb0\xe1\x1d\x2f\x70\xf5\x01\xbc\xf3\x57\x6e\xb7\x39\x29\x20\x11\x61\xbc\x9d\x2f\x60\x7a\x45\x8d\x1d\xf9\x77\x45\x14\xb8\x4d\x6c\xea\x6e\x4c\x54\xc1\xef\xec\xd2\x86\x06\xc2\xba\xec\xfd\x9d\xfd\x8c\x01\x87\x94\x18\x40\x2c\x4e\x3a\x47\x30\xfa\x32\xd0\x2b\xed\xcc\x46\x22\x27\xfa\x3a\x3f\x01\xf5\xc3\xc1\xf9\x4c\x30\x66\x04\x88\x8f\xb2\x35\x32\x1b\x17\xb7\xf7\x58\x94\x12\x15\xbc\x6e\xb0\xa2\x60\x01\x2d\x63\xb1\x7e\x2e\x83\xcc\xde\x06\x5a\x2d\x39\x46\x17\x4c\x2a\x0c\x32\xd0\x11\x15\xe9\x15\xee\xc8\x05\x40\x79\x31\x3c\x8f\x0b\x22\x08\xc2\x22\x0e\x73\x89\x2b\xb8\xf1\x0a\x22\xf4\xde\xaf\x96\xe8\x5e\x70\x16\x49\xf2\xb1\xa5\x50\xd2\xea\xd2\x1d\x25\xf7\x27\xd6\x27\x3a\xd6\x83\x1b\x9b\x2d\x2c\x4f\xe0\x24\x9c\xfc\x06\xfe\xef\xcb\x89\x2e\xac\x38\xf9\x6b\xdc\xc4\x07\x6f\xbe\x82\x08\x3e\x65\xb4\x63\x2f\x7b\x56\x65\xe3\x9d\x55\x26\x6c\x85\x21\xfa\x2f\x23\xc7\x03\x9f\xc2\x94\x54\x9c\xcd\x83\xda\x4a\x11\x36\xce\x05\xa3\xaa\xe7\xa7\x00\x98\x17\x29\x5a\x03\x00\x40\x5c\x94\xc0\x5a\x47\x4d\x6a\x4d\xaf\x75\x28\x82\x1f\xf0\xe5\x61\xb6\x6d\x98\x92\xf6\x5a\x07\xc6\x15\xd9\xf9\xdd\x0c\xf1\x84\xab\x43\xa2\x38\x5a\x60\x5b\xb2\xdf\x92\xfa\x51\xe9\x90\xf8\x08\x17\xda\xc4\xda\xfe\xa8\x68\x55\x47\x79\xe2\x3f\x43\xa8\x63\x28\x8f\xc0\x34\xd1\x4a\x0e\x66\xab\xfd\x04\x47\xa1\xa8\x7b\xf4\x68\x56\x75\xdf\xb2\xf9\x96\xd1\x7f\xb6\x04\xe1\x9a\x6b\xbd\xaf\x4a\x49\xbb\x5d\x5d\xc9\x1a\x2f\xc1\x16\x85\x49\x7b\xe7\x98\x6c\x11\x86\x5a\x20\x72\x04\x90\x7d\x1a\x94\x7b\x1a\xa1\x77\xfd\xfa\x4f\x23\x3d\xce\x6b\x53\x7b\xc5\x7e\xb4\xbd\x05\x0d\x14\x69\xbc\x15\x05\xb1\x56\x45\x6d\x69\x7e\x36\x4c\xab\xde\x7b\xda\x24\x65\x06\x79\xa2\x97\x14\x52\x6e\x5b\x01\x3b\xcd\x04\x74\xb6\x5f\xe2\xe9\x12\xcd\xb4\x3a\x6b\x11\x8b\x0b\x3a\x5f\x10\xa9\x5c\xfc\xea\x04\x88\x69\x4c\xf2\x33\x2e\x16\xbe\xbb\x20\x7f\x03\x4a\xcb\x0e\xf2\x58\xe3\x87\xed\x69\x8a\xc0\xb7\x66\xb9\xcd\x8d\x89\x2d\xdb\xda\xdd\xfd\xab\x9b\x49\x1e\xa3\x77\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf5\x69\x03\x92\x53\x00\x83\xa2\x19\x96\x0b\xca\x59\xea\x2e\x2b\x0c\x44\xac\x68\x85\x56\x5e\xaa\x25\x58\xaf\x65\xa9\xf5\x43\x81\x04\xa9\xf9\xdd\xf6\xa8\xb1\x64\xd8\x59\x1a\xf3\xb3\x9e\xe4\x71\x60\x6f\x7c\x21\x46\xc4\xa9\xe7\xaf\xd5\xfb\xa5\x58\xb9\x2d\xcc\x06\xd4\xda\xbf\xab\xb2\x2d\x5a\xd6\x25\xab\x47\xdc\x1c\x3b\x02\x08\x45\xa4\x94\xa7\x98\x07\x58\xcc\x77\xc6\xf2\x70\x2a\xe6\xad\x11\x97\xf6\x7e\x07\xa4\x4a\xc3\x69\xbc\x95\xb0\x06\x0c\x3d\x90\xe8\xec\xfd\xeb\x90\x54\x5f\xd9\x1a\x01\x26\x14\x66\x4a\x2e\xc4\x35\xf7\x63\x5e\x48\x39\xa8\x18\x1e\xa7\x1e\xd5\xa3\xc2\x4b\x16\x2d\xe6\xab\x3b\xe7\x8c\xf7\x1d\x74\x4e\x1a\xca\x9a\x56\x59\xe5\x3b\xa8\x9d\x5c\x2c\x30\x9b\x6b\x6d\xe7\x35\x6f\xf5\xc0\x7e\xfb\x5b\x18\x84\x20\x65\x5b\x44\xa6\x03\x1a\x67\xbf\x39\xb9\xbf\x75\x89\x39\xb6\x48\x3b\x5c\x4a\xb2\xc0\x8d\x9b\x9a\x70\xf6\xe4\x92\x29\xfc\xf0\x1d\xa2\xc7\xe4\x18\xbd\xf8\x6d\xf0\xab\x17\xd0\xe3\xa8\xde\x34\x82\xeb\xa1\x58\xa2\x6b\x18\x7d\x45\x15\x10\x82\xbc\x08\x5b\x38\x46\xe7\xba\x5f\x90\xe7\xea\xd7\x36\xe0\x2e\x9e\x76\x2b\x3b\x42\x82\xcc\xb1\x28\x2b\x12\xc9\x15\xc9\x67\x3e\x25\xd3\xb8\xa6\xed\xae\x22\x0f\x54\x2a\x69\xa3\xb6\xc7\x79\xc0\xca\x9f\x7b\x77\x28\x2c\x6f\xf5\x4d\xa1\x85\xdf\xb8\xc4\x0a\x8f\x03\xa9\x7b\x62\xbc\xb4\xe3\x82\xd7\x35\x66\xe5\x18\xdb\x73\xdc\x5d\x2a\x27\xbf\xb1\x25\x6e\xc6\xd8\x7f\x8b\xb2\x31\x1e\xcb\x05\x89\x5a\xb9\x01\x29\x08\x8f\x9d\xcb\x5d\x09\xec\x73\x2f\x9f\xcd\x52\x1c\xa3\x4b\xae\x3a\x73\xca\xdf\xb6\xb0\xca\x39\x45\xf8\xf9\xe5\xcd\xd5\xdf\x26\x1f\x2e\x2e\x6f\x06\x49\x3e\x48\x72\x78\x06\x49\x3e\x48\xf2\x88\x86\xf7\x45\x92\x13\x76\xb7\x2b\x29\xee\x1c\x6f\x9b\xb2\x23\x6d\x40\x4f\xad\xa5\x59\xed\x3c\xc1\x6a\xd7\x24\x69\xe7\xec\xee\x47\xac\x4d\x7e\x0b\x9f\xb3\x19\x2c\x1b\x12\x4c\xed\x17\x8c\x3b\xe2\xec\x8b\x67\x49\xdb\x21\xc7\x59\x46\x8e\x9f\xa4\xbc\xe7\x30\x8e\xb5\x69\xc9\x53\x72\x76\xdf\xe3\xa5\xf1\x02\x9b\x43\x89\xd9\x12\x35\x82\x32\x05\x5b\xe9\xf4\xfa\xec\xe2\x22\x40\x3a\x20\xf2\x50\x90\x46\xa1\x83\xff\x67\xb7\x14\x67\xe0\xe8\xdb\x87\x95\xd9\x46\x71\x4b\x68\xa6\x53\xf9\x1a\x41\xee\x28\x6f\x65\xb5\xf4\x58\x95\xcd\x72\x74\x9d\x09\x2f\x91\xe0\xc3\xe0\x18\x69\xb1\x79\x0b\xca\x15\xa5\x73\x93\x02\x99\xd0\xfc\x8e\x55\x4f\xdb\x89\x1c\x0a\x68\x42\xfb\x1b\x54\xd7\xcf\x57\x43\x13\xda\x8d\x52\x60\x1f\x53\x46\x13\xfa\xd1\x57\x63\x13\x5e\xd4\x67\x40\xd8\xbd\x24\xfb\x5e\xf0\x3a\x93\x34\xbb\x36\xc1\x15\x07\xdc\xdc\x74\x54\x0f\x1c\xfa\x2f\x54\x8f\xac\x49\xdb\x55\xaa\xd5\x86\x35\x00\x0d\x12\x67\x27\xa9\x92\x7d\x9e\x62\xf2\xc8\xe6\xef\xbf\xc7\xcd\x5f\xc8\xf2\x8a\x24\xd6\xe4\xee\xcf\x37\xa9\x48\xa1\x95\x31\x74\x4b\x96\x86\xb0\xef\xcc\x35\x96\x56\x96\x3c\xcb\xf4\xa1\x0c\x2a\x98\x7b\xc6\x7a\x88\x49\xef\xc8\xb3\x98\xfa\xb9\x25\x09\x34\x77\xee\x59\x21\x61\x24\xb0\x84\x60\x7f\xe8\x35\x4d\x5b\x3d\x94\x47\x3c\xb8\x27\x4d\x13\x75\x4f\x3e\xbd\xc7\x3d\xf9\x10\x56\xfd\x67\xb7\x78\xab\xfe\xb3\x53\xf4\xd5\x6a\x57\xf2\x61\xb1\xfa\xcf\x3e\x21\xb3\xfa\x4f\xc6\x53\x94\x82\xda\x5a\x7d\x1c\x28\x39\xf3\xa9\xbc\xb6\xb9\xb6\xa1\xea\xe4\x2f\x14\x64\xca\xc0\x80\x9c\x72\x50\x76\x6b\x05\x64\x9a\xe6\x34\x2a\x52\xf3\xe4\xc3\xb7\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x36\x8f\x65\xe6\xd0\x55\xdf\x39\x6e\x46\x89\x6a\xa2\x70\x89\x15\x3e\xd6\x07\x62\xd4\xff\xd1\x66\x16\xfe\xc3\x7f\x58\xe1\x29\xa9\xe4\x4f\x07\xff\xf5\x97\xf3\xbf\xfd\xbf\x07\x3f\xff\x23\xfc\x1d\xa8\x6b\x06\x1e\x1e\x7c\x21\x71\x08\x50\x4d\x92\xf1\x92\x5c\x42\xef\xe0\x47\x6b\xe9\x9d\x1a\x84\x90\xfd\x05\x54\xf4\x3a\x36\xe4\x02\xfe\xc7\x86\x97\xab\x3f\x45\x16\x34\x70\xcf\x1e\xea\x3d\xb0\xb6\x09\x44\xfd\xe6\xc9\xa7\xfd\xe0\x86\xfe\x48\x84\x4c\xe2\x76\x77\x4f\xbf\x12\x83\x79\xab\xdb\xc6\xb2\x58\x90\x1a\xc3\x3f\xbf\x77\x53\xa0\xef\x63\x5f\x73\x91\x41\xe9\x34\x7d\x07\x8e\x7a\x64\x97\x2f\xee\x5e\x25\x59\x9c\xe6\xc9\x28\xf9\xfd\x0a\x66\x9e\x30\x98\x11\x3b\x5b\x46\x02\x78\xfd\xd1\xe7\xa3\x78\x2a\x81\xd3\xc9\x05\xba\x33\x33\xbc\x47\x93\xf3\x74\xe2\xba\x22\xd9\xcd\xad\x64\x81\xfd\xbd\xef\x95\x5d\xa6\xc0\x74\xb3\x06\x73\x14\x9d\xd3\xea\xd3\xcb\xf1\x3a\x67\x77\xba\x5d\x99\x2d\xb7\x6b\xf5\xd9\x43\x99\x99\x6a\x2b\xea\x77\x34\xa9\x22\x57\xbf\xc4\xd0\x5b\x5e\xc6\x46\x11\xdc\xb3\xcf\xb6\x6b\x16\x53\xce\x19\xc0\x01\xad\xaa\x3f\x0c\xe8\x54\x0b\x7b\x93\x33\x69\xbe\x03\xae\x47\x72\x47\x98\xf2\x70\x72\x5b\x65\x1d\x0b\x45\xf3\xd8\x24\xb6\x47\x5d\x56\x66\x07\xf0\x30\x5e\xae\xfa\xd9\x63\x17\xdd\xf3\xda\xa0\xa6\x4f\xab\x66\x81\xf5\xa8\xe7\xde\x0e\xde\x78\xda\x0d\x7a\x42\xcf\x9d\xa4\xff\x22\x2b\x05\x3b\x5f\x7d\xf3\xa7\x84\x74\xd2\xf5\x27\xe3\xc5\xf9\x44\x66\x4e\x96\x1d\xbb\xc9\x56\x02\xc6\xb1\xc7\xcd\x24\x5f\xc2\xdc\x7d\x2f\x5d\x4c\xc1\xd8\x5c\x62\x3a\xb8\xa8\x47\x41\xa1\x77\x76\x87\xee\xb0\xf0\x28\xa1\x76\x5a\x51\xb9\x48\x15\xf7\xe6\xb9\x98\x75\x99\xb1\x5d\xea\x3a\x30\xad\xb8\x1a\x37\x9d\xee\xa1\xe7\x62\xa5\x97\x19\xba\xf0\x98\x8b\xb9\xcf\x30\xdf\x85\xf3\x4d\x62\x7a\x98\x83\xf1\x64\xf3\x60\xa8\x4d\x9e\x6b\x22\xd6\xf8\xef\x05\x51\xad\xd0\x32\xcb\x66\x57\x4c\x78\x69\xa8\x58\x32\x2a\x7f\x39\x8c\x75\x14\x3a\x45\x60\xce\x12\x5f\xd7\xe4\x57\xb2\xb3\x5d\x6f\x9f\x41\x1b\xee\xb5\x77\x27\x24\xb2\x38\xd7\xac\x10\x12\xa4\xc2\x8a\xde\x99\x6d\xe9\xf2\x87\x1c\xb5\x80\x6e\xf0\xe0\xf8\xf8\xc0\xf4\x92\x0b\x73\x95\x1a\x8f\xa2\xfe\x7c\xaf\xae\x85\x4e\xa9\x7a\x02\x37\x7c\x48\x07\x63\x97\xc8\x94\xd3\xb0\x53\xe5\x42\xac\xb9\x74\xf5\x2f\xc0\x98\x72\x59\x53\xdf\xef\xb5\x0f\xcc\xe7\x76\xad\x96\x93\xfd\xce\x10\xbc\xb8\xdf\x5b\xe5\xc7\xf0\x23\xdb\x3c\xb1\x54\x47\xf1\xa1\x79\xe5\x71\xd1\xb4\x23\xfb\xfa\xe3\x9a\xd4\x5c\x2c\xfd\x8f\xbe\xf8\xe6\x58\x2a\x2e\xf0\x1c\x4a\x46\x99\xc6\xcd\x9f\xf9\x9f\xcc\x1f\xf6\xba\xb7\xfe\xd7\x06\xdd\xd1\x65\x66\xf9\x5a\x2c\x5f\x9d\x2d\xe7\xd6\x6d\x4f\x0c\x28\xbf\xad\x9e\x40\xfe\x1c\x78\xc0\x9c\x89\xb9\xf9\x59\x84\x90\xba\xad\x09\x3b\xea\x14\x0e\xc0\x7d\x18\x25\x4f\x1e\xec\x8f\x1c\x42\xa8\xa4\x77\x54\xf2\x84\xb2\x1d\xfe\x45\xeb\xe1\x09\x47\xd1\xc4\x5b\xd5\xb4\x90\xdb\x59\x63\xe5\x3d\x28\x0f\x0d\x97\x80\x16\xb1\x87\x7d\xc5\x35\xf8\x2a\x35\xf2\x02\x3a\x86\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\xc9\x5d\xc7\x6c\xf9\x21\x51\x7a\x9b\x67\x6c\x37\x0b\x65\x8a\xcc\xc9\xb6\xcc\x79\x1f\x7b\x63\xa6\x50\x5b\xef\x2a\xa4\x4c\x8d\xb9\x18\x5b\x2e\x2d\x30\x52\x12\x1b\x70\xdb\x2b\xf7\xf9\xbf\x72\x52\x33\xc8\x54\x76\x4a\xe1\x1e\x1d\xf0\xa7\x52\x34\x0c\xc3\xcf\x73\xc0\x64\x4c\x4b\x41\x2d\xf5\x03\xd9\x91\xdb\x7c\x6d\x37\xe8\xbf\x03\x72\xc6\x05\x8d\xcc\xba\x76\x96\x94\x36\xaf\x8e\x3b\x23\xc8\x71\xaf\xd9\xef\xdd\x92\x04\x88\x99\x7b\x06\xa4\x4d\xf4\x33\x20\x6d\x1e\xe9\xca\x80\xb4\x49\x7a\xbe\x48\xa4\x8d\xe1\x1d\xfc\xf7\x84\xd9\xe4\xaf\x8a\x16\x99\xb9\x93\xb3\x20\x1a\x61\x77\xb1\xe0\xea\x9c\xa9\x6e\xce\xed\xa1\x38\x6a\x78\xd3\x56\x58\x3d\x92\x45\x91\x29\xef\x6d\xcf\x22\x67\x40\xb4\x6b\x54\x3f\x8b\xe1\xa7\x0c\xd5\x6d\xa5\x68\x13\x99\x10\xe0\x4d\x4b\x4f\xa6\x8b\xb0\x94\xbc\xa0\xd8\x25\x82\xc3\x6f\x2a\x2c\x95\x1b\x32\x78\xe6\x15\xbe\x25\x01\x21\x6f\x6c\xb6\x36\x90\xf7\xba\xb9\x9d\x2e\xf5\x3d\x74\xce\xee\xec\x9d\x84\xca\xd6\x24\xb8\x92\x2e\x56\x9a\xa5\xdd\xaf\x2b\x9b\x51\x9f\x4b\x9b\xad\x10\x24\x35\x82\x06\xe9\x9d\x88\x18\xa2\x39\x7c\xd6\x41\x20\x21\xfd\xc3\xd2\xc3\x46\x75\x23\xd9\x38\x48\x57\xc5\x7d\x36\x42\x92\x8d\xb5\xa6\x83\x77\x30\xd1\xbe\xee\x1d\xdd\xc2\x1e\x25\x70\xa4\x6b\xe5\x79\x35\xf2\xa7\xd0\xc6\xf7\x45\x13\xdf\x13\x2d\xfc\x69\x34\xf0\xfd\xd4\xbe\xb3\x69\xde\x79\xb4\xee\x3c\x1a\xf7\x16\xb8\xf6\x9c\x5a\x76\x1e\x0d\xfb\x29\xfc\x6b\x8d\x20\x33\xfa\xb0\x0f\x69\xcb\xae\xc2\x0f\x52\xe4\x01\x5c\x35\x8d\x20\x0d\x61\xa5\x23\x42\x73\x11\x58\x60\x6c\x1c\x32\xce\xbd\x5f\x34\xef\x85\x7d\xbd\xc9\x53\x36\xdc\xd6\x68\xb8\xad\xb7\x78\x86\xdb\x7a\xb8\xad\x9f\xe5\xb6\xb6\xd2\xea\xeb\xbf\xaa\x73\x57\xd7\xad\xf1\x7c\x67\x15\x10\xce\xfa\x54\x76\x20\x99\x9f\x85\xba\x7f\xad\x9e\x48\xa4\x1f\x2b\x14\xb2\x1e\x74\xa1\xb8\x11\x7b\x86\x6b\x5a\x20\x53\x7d\xcd\x98\xd5\xa8\xc6\x0c\xcf\x81\x06\x5b\x7f\xcf\x1e\x31\xc4\x85\xaf\x6a\x15\xd5\x93\x15\x4e\x40\xf0\x60\x39\x5e\x63\xf8\xa5\xe0\x55\xa5\xf5\x95\x8a\xde\x12\xf4\x9a\x34\x15\x5f\xd6\x96\xa6\xa9\x44\xd7\x0a\x2b\x32\x6b\xab\x6b\xa2\x12\x0a\x55\x47\x4a\x1c\x5f\xd1\xc7\xb0\xaf\xef\x6a\x2b\x42\x71\x1f\x28\x76\x83\x1a\x43\x03\x1f\xf5\x9a\x0f\x0c\xae\xf2\xd3\xea\x1e\x2f\xe5\x08\x5d\x92\x3b\x22\x46\xe8\x62\x76\xc9\xd5\xc4\x38\x91\xe2\xde\x1b\x72\x82\x98\x97\x23\x3a\x43\xdf\x55\x58\x11\xa9\x90\xc2\x73\xc0\x16\x77\x05\x7e\xb8\xe8\x35\x8a\xb8\x16\x94\xf7\x74\xfb\x42\x3d\xe6\x79\x56\x4e\xbe\x8f\x54\xfd\x81\xd6\x7d\xcd\x9f\x67\xaf\xab\x51\x39\x1e\xfd\x9d\x71\x42\x1b\xfa\x7e\x43\xe7\x6d\xd8\xe8\xbd\x38\x31\x25\x03\x5d\x55\x64\x70\xe9\x52\x86\x04\x91\x0d\x67\x92\xf4\xca\x37\x74\x03\x81\x9a\x97\x71\xa7\x3e\xab\xc7\x37\xda\x30\x48\x35\x09\x1a\x2e\x15\x54\x39\x88\xd5\x4f\x72\xd9\x02\x13\xd7\x11\x28\x7c\x81\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x33\x45\x04\xc2\xa1\xa8\xf7\xe5\x53\x7d\xde\x88\xa9\x87\xe1\x4a\x69\xc4\x1b\x6b\x7d\x9a\x59\x09\x79\xb4\x94\x41\xf4\xc2\xa0\x4e\x6d\xe1\x8f\xae\xf0\xc6\x4a\x29\x8d\x24\x21\xaa\x9f\x0f\xa0\xd9\x05\xdb\x7b\x15\xb4\x8b\xa6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\xd5\xc9\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x3f\xc7\xfe\x80\x8d\x75\xaf\xe4\xc9\x6f\xba\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x03\x29\x52\xf4\xf9\x7e\xb0\xe5\x81\x14\x61\xa5\x4f\x47\xe3\xac\x77\x94\x25\x4f\xce\x14\x77\x34\x4f\x26\xfc\x55\x2e\xcc\x53\x02\x69\x75\xf8\xe4\x86\xf4\x9c\xd9\x45\xa0\xd2\xce\xbc\xf9\xb1\xa2\x8c\xf4\x17\xc6\xd7\x7f\xf3\x8b\x63\xc2\x9e\xd6\xc8\x45\x25\x15\xa4\x50\x5c\x2c\x1d\xeb\x57\x72\xd7\x5c\x5f\x74\xdf\xa0\x70\xf2\xe1\xc1\xc9\xc1\xd1\xda\x1e\x39\x90\x90\x7e\x61\xae\xc5\x63\x4b\x9d\xed\x07\x25\x69\xdd\x54\x4b\x18\xc7\x41\x39\x42\x54\xe5\xc0\x08\xe9\xdb\xd0\x94\x09\x87\x59\xb1\x54\xdf\x23\x24\x39\x52\x02\x97\xd4\x1a\x08\xf0\xa9\xfe\x92\x12\xad\xbd\xd0\x0f\x0f\x7e\x3d\x18\x21\xa2\x8a\x23\x74\xcf\xd9\x81\x82\xe9\x3b\x46\x37\x50\x5c\x31\x1d\xd6\xeb\x3a\xb2\xe4\x2d\x54\x18\x37\x4b\x68\xea\xe9\x56\x4b\xb8\x6e\x10\x6f\x6d\xfd\x55\xac\x52\x28\xca\xc3\xe7\xfc\x81\x2a\x4b\xbe\xa1\xe5\xf7\x4b\xd8\x4d\xb6\xe2\x37\xd6\xc6\xc8\x1d\x39\x59\x10\x5c\xa9\x85\xc9\x66\x60\x9c\x8d\xff\x45\x04\x07\x1a\x73\x66\x7f\x93\xda\x8d\xb4\x90\x72\xf8\x24\x84\x97\xd7\x3b\x94\x05\xc8\x94\xd9\x19\xe0\x1e\x7d\xed\xbd\x21\xd1\x2a\x11\x5a\x95\x47\x6f\x6f\x6e\x26\x6f\x88\xea\xd7\x73\xd6\x1f\xa2\x37\xe7\x37\x2e\x87\x05\x1c\xfd\x44\xcc\xb8\xa8\xf7\x40\xbc\xe7\x01\xd7\x8e\x51\xc3\xc5\x3e\xdc\x32\x0b\x2e\x93\x96\x13\x3d\xc1\x15\xf3\x96\x4b\x65\x62\x39\xc6\x36\x61\x90\xd8\xc8\xfb\x09\x19\x2e\x7d\xff\x62\x72\x8c\xfe\xc6\x5b\xa8\x44\x86\xa7\xd5\xd2\x17\x32\x92\x24\x0d\x45\xad\x9f\x17\xba\x2b\x2f\xf4\x0d\xa2\x77\xfe\x5b\x82\x4b\x22\x24\x08\x68\x82\x93\x93\xa1\xb3\x1d\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x61\x87\xdd\xa7\x38\xb7\x87\xf3\xd8\x1c\x57\x4b\x27\x2b\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x49\x2f\x33\xef\xf6\xf3\xa9\x51\x53\xc3\x69\xb3\x01\x0e\x43\x54\x6a\x65\x9b\x29\x9a\x97\xe9\xba\xc8\x90\x2f\x80\x32\xe6\x0c\xa0\x34\xf2\xf3\xd5\x17\x41\xb0\x27\xf9\x4d\xf9\xd2\x10\x50\x36\xa8\x3d\x7a\x12\xb8\x3d\xb2\x28\x4a\xbb\xf9\x8c\x0f\x3a\xde\x7b\xbe\xe9\xe5\xb4\xab\x0b\x5e\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\xd9\xdc\x3a\xd0\x6c\x0b\x2c\xc9\x18\x22\xef\xcc\x88\x73\x19\xb0\x5d\x6b\xe9\xa0\x38\x07\x75\xcf\x17\x89\x36\xbd\xce\xd3\xd5\xac\xa8\xf0\x64\xea\xf6\xf0\x59\x0b\xa8\xf7\x16\x2b\xcf\x8e\x47\x5f\x84\x3a\x89\x32\x11\x2f\xac\x73\x9b\x99\x3a\xa1\xc0\xe7\x6d\xae\x2b\x10\xbc\x92\x88\xbb\xf4\xfd\x95\x6d\x5e\xb5\x0a\xb8\x6f\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4a\x44\x47\x0c\x29\xd4\xfa\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xe6\x04\xbd\xd2\x2d\xff\xf1\xdb\x6f\x7f\xff\x6d\x86\x76\xf4\xf0\x5c\x2b\x98\xa1\x8b\xd3\xcb\xd3\x5f\xae\x7f\x3c\x03\xba\xf9\xd4\xd7\x67\x4a\x92\xcd\x9d\x22\x9b\x35\x41\xf6\x49\xd3\x63\x81\xb8\x31\x59\xca\xe6\x3e\x12\xd7\xd0\x2b\xbd\x09\x5b\x69\x28\xea\xad\x4d\x12\x94\xd8\xd6\x66\x54\xfa\xee\x0c\x83\x79\x5a\x60\xed\x85\xa4\x92\x15\x21\x4d\x36\x8b\xff\x5a\xbf\xad\x57\x0e\x08\x95\xad\x30\x55\x69\x7d\xf0\xaa\xf3\xe5\xdb\xa0\x15\xf4\xe1\x2b\x32\xfe\x25\x29\x38\x2b\x53\x4c\x80\x5c\x2a\xad\xed\x49\xd6\x33\x77\x6d\xde\xe9\x5c\xc4\xdd\x55\x62\x1b\x03\x4b\x32\x75\x45\x91\x5f\xd5\x3c\x72\xd2\xb0\x41\xc0\xdb\xfe\xf8\x87\xf8\x00\x59\xd1\x5c\xf3\xe2\x36\xa3\x8b\x2c\x51\x80\xbd\xd6\x27\xad\x30\xb1\xc0\x9b\xb3\x89\xe9\x9c\x5e\x99\xcb\x0f\x37\x1d\xf5\x8b\xd6\xc2\x71\x57\x0d\xfe\xad\x8d\x16\x62\x56\xa2\x5b\xd2\xa4\x59\x97\x5a\x60\x3a\x18\x61\x1f\x45\x08\xbe\x77\x61\xeb\x76\x98\xf4\x6a\x23\x08\x1c\xfa\xcf\x68\xc4\x69\x15\x80\x82\xe0\x3c\x04\x02\xad\x11\x32\xc3\xb4\x42\x18\xbc\xf2\x8a\xd6\x04\xdd\x2f\x08\x33\xce\xfe\x0e\x2d\xf1\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x20\xe1\xdf\x6d\xed\x35\x4c\x65\xc5\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\xd5\x6c\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\x91\xf3\x09\xc8\xe0\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x30\x17\xcb\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x9b\x90\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\xcb\x13\xeb\xa6\x6b\x96\x14\xce\xef\x26\xb6\x10\x58\x2e\x08\xe4\xce\x92\x07\xaa\xa4\x69\xd4\xb0\xb1\xba\x19\xd7\xfa\xc2\x5c\xe0\x82\xa0\x86\x08\xca\xb5\x8a\xd1\x32\x55\xf2\x7b\x86\xa6\x64\x4e\x99\x74\x2b\x96\xd2\x25\xb7\x25\x00\x49\x44\xa5\xaf\xdd\x7d\x8c\xae\x7a\x95\xe3\x2c\xbb\x58\xc1\x3b\x99\x69\xa7\x68\x94\x69\x4a\x40\x79\x81\x6d\xd0\xe2\xaa\x5a\x76\x1b\x2f\x24\x08\x7d\x64\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\xa5\xc9\x20\x9f\x51\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\xa3\x3b\x83\x4a\x24\x08\x2e\x92\x78\x8c\x07\x0c\xd8\xa7\x9e\x01\x03\x36\x60\xc0\x06\x0c\xd8\xfa\x33\x60\xc0\xfa\xcf\x80\x01\x7b\xbc\x43\xfb\x1c\xb4\x1b\x30\x60\x83\x57\x66\xfd\x19\x30\x60\x51\xcf\x80\x01\xfb\xe4\xb3\x77\x22\x7a\xc0\x80\x7d\xc6\x33\x60\xc0\x3e\xf3\x19\x30\x60\x03\x06\x6c\xc0\x80\x0d\x18\xb0\x84\x67\xc0\x80\x6d\x3f\xbc\x21\xf8\x13\xff\x0c\x18\xb0\x01\x03\xb6\xe5\x33\x60\xc0\x56\x9e\x01\x03\x36\x60\xc0\x3e\xf6\x0c\x18\xb0\x01\x03\x66\x9f\xc1\xdb\xb8\xf6\x0c\x18\xb0\x0d\xcf\x80\x01\xdb\xae\x9d\xc1\x0c\x48\x7b\xd9\x93\x98\x01\x52\xf1\xe6\x9a\xce\x13\x78\x21\x73\x1d\x83\x6b\xdf\x13\x4b\x1a\x29\x6d\xb1\x5d\x69\x3e\x74\x7e\x2c\x69\x29\xfb\x42\x44\x58\x70\x93\x4c\x89\x36\x11\xf4\xb0\x9a\x94\xdb\xe4\x62\x06\x01\xe4\x80\xc9\x4d\x9f\x0a\x47\x13\x48\x7b\x65\x1d\xfa\xea\xb3\xbb\xdd\x28\xd3\xb6\x4b\x7c\x0f\x82\xf9\x28\x30\x33\x95\x51\x6d\x99\x6c\x7d\xbd\x4f\x78\x29\x5d\x25\x09\xc6\xd9\xd8\x90\xb5\x1e\xeb\x0e\x1f\x73\x79\x9c\xe0\x0d\x4e\x64\x66\x33\x18\xb9\x89\xe0\xd3\x9d\xb1\xb3\x4d\x00\x7f\x44\x0b\x0b\xd0\xe3\xb3\x1e\xe3\x9a\xe9\x60\x24\xd3\x5a\x1f\x18\x06\xc5\x9a\x1d\x05\x17\xb5\x02\xdb\x83\x02\x77\xc9\xe6\xb6\x35\x72\xca\xb1\x54\xca\x93\x86\x9b\xff\x74\xb8\xa9\x00\x30\x15\x1d\x47\xd9\x31\xbd\x5c\x0a\x4a\x6a\x67\x08\xa9\x3d\x41\x98\x65\x40\x45\xe5\xd4\x95\xf6\x14\x0d\xb5\x9f\x48\xa8\x7d\x44\x41\xed\x02\x01\xb5\x73\xf4\x53\x9e\xb0\x7a\x86\x90\x7a\x26\x8d\xf4\x09\xc2\x53\x16\x48\x7f\xb3\x10\x44\x2e\x78\x15\x2d\x70\x72\x09\x9b\xf7\x94\xd1\xba\xad\xa1\x0a\x85\x96\x29\xf4\xce\x83\xfd\xa5\x13\x19\xf6\xba\x37\x88\x03\x28\x57\x51\x12\x28\x03\x8e\x69\xa5\xb7\x16\x90\x85\x2e\xf0\x1d\x28\xa5\x6d\x51\x10\x52\xa6\xa8\xa5\xa1\xb7\xfa\xf7\xc7\xbe\x87\x86\xa3\x9f\x4a\xf4\x2a\xed\xaa\x49\xb3\x7b\x02\x77\xde\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\xd2\xec\xee\x66\x4e\x77\x33\x25\xb9\x98\x72\x28\x06\xa9\x5e\x94\x7e\x0c\x99\x0b\xb5\x12\x02\x9d\xc3\x2a\x12\x71\x47\x0b\x72\xfc\x0c\x8e\x8a\x5c\xc6\x7f\xfa\x41\x40\x10\x26\x80\x81\xef\x8b\xda\x75\x6d\xba\xe3\x23\x0c\x81\x8f\xca\xf6\x14\x40\xa3\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\xbc\x41\x33\xa7\x6a\xd1\x4e\x8f\x0b\x5e\x9f\x68\xd1\x61\xfe\x33\xad\xf8\xf4\xa4\xc6\x52\x11\xa1\x6d\x1c\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xe5\x36\x0d\xeb\x11\x27\xc1\x94\x68\xb9\xcf\xc5\x8a\xb7\x40\x4f\x4a\xfa\x26\x4d\xbe\xbf\x53\x8b\x8a\x24\xc2\x92\x77\x02\x49\x1e\xa4\x36\xca\x10\x10\xc8\x29\x54\xf6\x03\x76\xfc\x64\x90\xe3\x2c\x67\x35\x13\xd4\x78\x8f\x60\xc6\x7b\x63\x0b\xed\x0b\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xc9\xa0\xc3\x5f\x04\x6c\x38\x63\x7c\x2c\x13\x5c\xf8\x39\xa0\xc2\xfb\xeb\x83\x41\x19\xe0\xc1\xcf\x07\x0d\xce\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x28\xf0\x73\xc4\xff\x9f\x2c\xf6\x9f\x21\xee\x9f\x33\xe6\x9f\x2d\xde\xff\x64\x90\xdf\x74\xb8\x6f\x56\x9f\xc2\xb3\xc0\x7c\x73\x42\x7c\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x80\xa0\xb9\x56\xe2\x72\x0d\x2c\x6a\xdc\xd6\x7d\x5c\xc3\x02\x4b\xe4\x42\xdd\x96\xe2\xc5\xc5\xd2\xad\x0a\x8c\x30\x44\x9c\xf5\xf8\xa2\xa3\xd6\x68\xff\x22\xd7\x68\x6f\xdc\xe3\x86\x57\x65\x4f\x76\xcd\x5b\x7e\x8f\xf8\x4c\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\xf7\x3a\xf2\x65\xfb\xf8\xe9\xd0\x97\xfd\xe2\xac\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\x75\x8c\xde\x5b\x75\xe2\x15\xf4\xc7\x8b\x22\xcc\x4a\x64\xf9\xb9\xbe\xbe\x7d\x92\x0c\x75\xef\x1b\x37\x1e\x9b\xde\xc7\xb3\x98\x1b\x58\x6b\x99\x1c\x61\xfd\x2d\x50\x40\x07\xa7\xeb\xde\x38\x5d\x77\x84\xc0\xfe\xfa\xac\xad\xe7\x47\x5c\x0f\xd6\xd6\xbf\x8b\xb5\x15\xd0\xe2\xbd\x11\xb8\x20\x93\x7d\x52\xde\x9c\x00\xe9\x12\x01\x3b\x1d\xce\x8b\x0b\x46\x88\x49\x1c\xeb\x48\x0f\x81\xdf\x6f\xd6\x56\xd5\xd2\xf8\x10\x7b\x0c\x98\xf1\x5b\xeb\x66\x41\xd6\xa8\x03\x21\x94\xba\xa1\x77\x9d\x6d\xd2\x08\x6e\x35\x12\xd1\x32\xa6\x55\x0c\x7b\x9c\x74\xe7\xb5\x2d\x22\x09\x8b\x77\xa7\xe3\x1e\xb1\xa1\x05\xa1\x03\xd0\x73\x41\x50\x97\xbf\xd4\xef\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\x25\x0b\xd2\xbe\xa5\x55\x65\x5f\x93\x00\x0a\x27\xca\x84\x9e\x8d\x46\x53\x71\x36\x87\xc9\xc0\xa6\x23\xe4\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x85\xeb\x67\x12\x2a\x3e\x68\x9d\x4a\xc4\x68\x35\x72\x53\xde\xa7\xc0\x5c\xdf\xf3\x9d\x4b\x59\x92\xd2\xb2\x57\xde\x53\x49\x46\xf0\xce\xe8\x3e\x99\xbe\xb8\xaa\xfd\x66\xdf\x98\xcf\x1a\xc1\xef\x68\xd9\x61\xf4\xf5\xb6\x00\x7c\x7c\x74\x5b\x3f\xc2\x7b\x9d\x68\x65\x9c\x8d\x19\x99\x63\x50\x8f\xad\x40\x33\x88\x4e\xd3\xbe\xc1\x0f\xb2\x92\x16\x58\x11\x09\x39\x09\x3d\x6a\xdb\x3b\x8a\xa3\x7b\xa2\xc7\x13\xec\x28\x74\xc8\x38\xe2\x90\x59\xd8\x32\xaa\x96\x10\xd1\x5b\xb4\x0a\x95\xfc\x9e\x1d\xa5\x1c\x4c\x03\x73\xc0\x68\x4a\x14\xee\x92\x03\x9d\x4a\x26\x11\x61\x78\x5a\xe9\xb3\x07\x88\xff\x9b\x8d\x1b\x00\xcd\x08\x56\xad\x20\x68\x8e\x55\x82\x94\xd8\xa0\xcd\x9b\xf5\xfc\xf8\xb6\xa3\xd2\xc6\xeb\x66\xa8\x65\x92\x24\x2a\xb2\xd9\x4c\x80\xc8\x8c\x57\x7d\xa2\x79\xab\xf6\xe4\x1e\x79\xcc\x75\x64\x32\x77\x02\x23\x91\xd6\x44\x22\xde\x26\x78\xf2\x7a\xe6\x9f\x6d\x2e\xa7\x85\x37\xf8\x9d\x36\x3e\xb1\x61\xd3\x1c\x3b\xec\x32\xd0\xca\x03\x7e\x02\x07\xb7\x32\x19\xd4\xaf\x2f\xaf\x7f\x79\x77\xfa\xdf\xe7\xef\xe2\x16\xfe\x1c\x17\x8b\x90\x5b\x9c\x21\x0c\x17\x05\x08\xf9\x05\xbe\x23\x08\xa3\x96\xd1\x7f\xb6\x16\xf2\x76\xe8\xdb\x8b\x14\xab\x59\xd2\x7b\x92\x14\x5f\x7d\x4b\x44\x49\x8e\x1c\x6b\xfa\x8e\x4a\x20\xaa\x86\x4e\x58\xe0\x3f\x97\x04\xcd\x04\xaf\x57\x0c\x2d\x74\xe9\xc1\x75\x4b\x7d\xc3\x60\x63\x9a\x2d\x88\x88\xd3\xc8\x5f\x7f\x38\xbf\x86\x1c\xfc\x46\x18\x62\x77\x48\x2e\x80\x77\x42\xeb\x26\x75\xd0\xf4\xa7\x3c\x46\xa7\x6c\x69\x7e\x69\x84\x59\xa4\x8a\x52\x51\xa9\x08\x28\xa7\xd6\x90\x74\xf0\xc0\x17\x2f\x8f\xe1\x7f\x2f\x10\x2e\x4b\xa1\x2d\x4d\x9f\xa3\x51\xac\x66\x99\x45\xb5\x6c\xec\x57\x3a\xad\x82\xc9\x65\x44\x41\x1a\x47\xd4\x0b\xdf\xf3\xd2\xae\x04\x28\x81\x80\xdf\x31\xda\xad\x54\x02\x2b\x32\xa7\x05\xaa\x89\x98\x13\xd4\x60\x55\x2c\x50\x8d\x97\xa8\xe0\x42\xb4\x8d\xa1\x18\x29\xb1\xc2\x71\x2d\x7f\xcf\x05\xaa\x9d\x74\xd6\xd2\x4c\xab\xe4\xd7\x9b\x81\xa0\x9d\xc8\x0e\xff\x49\xa5\x6c\x89\x3c\x79\xf5\xf2\x4f\xdf\x7c\x1b\x69\x5e\x67\x3c\xb8\xb1\xd0\xa7\x04\xc8\x53\x1f\xfe\xe5\x36\x18\x80\xae\x7b\xcc\x30\x76\x87\x98\x9d\x0f\xd2\x50\x52\x36\xaf\x92\x1d\x20\xc9\x6e\xc0\x54\x27\xe0\xb8\x1b\xc1\x24\xd6\x17\x98\xee\x09\xec\xf5\x21\xde\x95\x92\xcf\x0b\xd6\x69\x70\xce\xef\x65\x05\x32\x67\x81\x61\x77\x31\x71\x52\x2a\xc5\x7f\x04\xd6\x84\x77\x4c\x19\xf6\x11\xd3\xac\xc1\x3b\x8c\xd0\x4b\xf4\x5f\xe8\x01\xfd\x17\x78\xc1\xfe\x18\xdf\x54\x1e\x1f\x53\x0e\x18\xff\x82\x4b\x75\x31\xc9\xb4\xd0\x7f\xd5\xf7\x95\x7e\xa3\x5e\x0f\xc5\xd1\x94\x5a\x77\x04\x79\x50\x44\x68\x33\xd0\xae\x61\xea\xcc\x25\x79\xd4\x74\x07\xbf\x94\xdd\x9d\x0a\x2e\xb8\x98\xf5\xd1\xff\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x0a\x9d\xb0\x1f\x35\x5c\xc4\x3d\x71\x9f\xd2\xea\x7b\xbd\xf7\xba\x1a\x1b\xa8\xe4\x90\x00\x61\x72\x38\x17\x34\x41\x38\xec\xcf\x89\x4d\xc3\x89\xe6\xdb\xba\x1f\xdb\x5a\x2b\x3e\x7d\xf0\xc8\x58\x23\x25\x28\x4b\xd3\xf0\xf2\x18\xec\x9b\x84\x5e\xe8\xd9\x28\x03\x65\xe0\x23\xa6\xd1\xb1\xb1\xd7\x7c\x74\x18\x0e\x9c\x96\x58\x05\x66\xb1\x3a\xac\x79\x04\x99\x11\x21\x4c\x9e\xf0\x74\xe9\xd2\x8d\x92\x77\x5b\x92\x94\x6b\x04\x57\xbc\xe0\xd1\xb4\x29\x39\xb7\xca\xc4\xf6\x05\xe6\x1e\x62\xb5\x3e\x3a\xfe\xc3\xeb\xc9\x08\xdd\x9c\x4d\x46\x88\x0b\x74\x7d\x96\x06\x7e\x0a\x5d\x30\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x0e\xd3\xcd\xd9\x24\xe2\x25\xeb\xf0\xd9\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x5e\x33\xb9\xb8\xac\x43\xdf\xd3\x7c\x94\x2e\x35\xbf\x23\xa5\xb1\x9a\x5d\x2b\x84\x95\x0d\xa7\xda\x46\x1a\x78\x5e\x3e\xf6\x0c\x3c\x2f\xdb\x3f\x03\xcf\xcb\xa6\x67\xe0\x79\xd9\xe2\x19\x78\x5e\xcc\x33\xf0\xbc\xf4\x3b\xb2\x8f\x39\x46\x03\xcf\xcb\x27\x9f\x81\xe7\xe5\xd1\x67\xe0\x79\xd9\xea\x19\x78\x5e\xd6\x9f\x81\xe7\xe5\x23\xcf\xc0\xf3\xe2\x9f\x81\xe7\x65\xe0\x79\xf9\x72\xa5\xf6\xc0\xf3\xb2\xfa\x0c\x3c\x2f\x03\xcf\xcb\xc0\xf3\x12\x3e\x03\xcf\xcb\x23\xcf\xc0\xf3\x32\xf0\xbc\x0c\x3c\x2f\x1f\x7f\x06\x9e\x97\xe8\x67\xe0\x79\xd9\xee\x19\x32\x0f\xb7\x7c\x06\x9e\x97\x81\xe7\x65\xf5\x19\x78\x5e\x3e\xf9\xec\x87\x7b\x7c\xe0\x79\x19\x78\x5e\x3e\xfa\x0c\x3c\x2f\x03\xcf\xcb\x47\x9f\x81\xe7\x25\xe2\xd9\x3b\xa7\xeb\xc0\xf3\x32\xf0\xbc\x7c\xac\x8d\xc1\xda\xda\xee\x19\x78\x5e\x06\x9e\x97\xb5\x67\xe0\x79\x59\x7f\x06\x9e\x97\x81\xe7\x65\xe0\x79\x19\x78\x5e\xfc\x33\xf0\xbc\x7c\xed\x7e\x27\x41\x24\xfd\x17\x99\xf0\x8a\x16\xcb\xe4\x6c\x9f\x2b\x22\x79\x2b\x0a\x7d\x63\xc3\x6b\x51\x03\xef\xf5\x1e\x85\x24\x25\x7b\xcf\x28\x14\xae\x82\x89\x0b\xa9\x14\x84\x9d\x83\xa7\x98\x82\xbd\xa0\x53\x70\x03\xbc\x8c\x47\x10\x8c\x5d\xf9\x6c\x33\x7d\x71\xce\xd2\x64\xab\x3d\x1c\xc8\x3e\xa4\x73\x86\xb4\x47\x7e\x17\x29\xee\x85\x2d\x7d\x74\x73\xe1\xa6\xa9\x68\x4a\x62\x2c\x42\xd7\x2d\x68\x17\xc4\x86\xc0\xe5\x77\xa8\x68\xda\x11\xaa\x49\xcd\x45\x42\x62\x44\x06\x0b\xae\xb7\x55\xf6\x61\x9d\xae\x4c\x87\xdc\xe4\x2b\x0e\xf3\xbf\x34\xf6\x42\xc7\x52\xe5\xd7\x8a\x3a\x71\x98\x84\x35\xbb\x98\xad\x82\x51\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x70\x67\xac\x55\x67\xbc\x6e\x5a\x45\x7a\x17\x9b\x99\x62\x63\x74\x50\x99\x2a\xd0\x77\x93\x0d\x5a\x70\x36\xa3\x73\x6b\x7d\x9f\xd4\x98\xe1\x39\x19\xfb\xd9\x1e\x77\x54\x0f\x27\xd1\x17\xf5\xce\x52\x41\x8b\x0a\xd3\x78\xe0\x60\x2e\x31\x71\x06\xbd\x00\x1a\xb0\x0e\x50\x0f\xb9\x69\x7e\x9a\x47\x1e\x36\x4e\x8d\xdc\x38\x76\xbf\x32\x7f\x3c\x4a\xb0\x1e\xb1\x02\x5f\x05\x18\x46\x1b\x76\x6a\x9a\xc1\x68\xcc\xc4\x92\x34\x44\x5b\x04\xc6\x81\x1a\xaf\xf7\x2f\x19\xae\x69\xe1\x4e\xd8\x69\x55\xf1\xc2\xf8\x64\xfa\x56\x65\x8e\x2e\x6b\x63\xb7\xae\x5b\x85\xa7\x15\x39\x46\x17\x86\xa2\x82\xb3\x6a\xa9\xcf\x9f\x24\xca\x41\x14\xec\xe6\x4f\xb3\x24\x53\xf0\xaf\x89\xd8\xd7\x8d\x4a\x39\x6c\x2a\xc3\xa9\x41\x98\x16\x65\x9c\x11\x44\x98\x12\x4b\xbd\xff\x26\xbc\xbc\xd6\x5b\xb0\xf7\xed\x64\xaa\x8d\x44\xc8\x6b\x0e\xb8\x6b\x22\xd4\x35\x0f\x40\x35\x1d\x9c\x9a\x17\x98\xda\x85\x10\x0c\x53\x50\x98\xf1\xd3\xdb\x16\x0d\x2f\x8f\x37\x88\x26\xc4\x67\x89\x3d\xd0\x2d\x4e\x78\xa9\x95\x26\x41\x8c\x7c\xf2\x67\xd4\x38\x10\x2f\x74\xe7\x6e\xc1\xe3\x87\x55\xa7\x4d\xe1\x3b\x4c\x2b\x7d\x80\x13\x3b\xb0\xce\xba\x98\x16\x95\xc9\x14\xab\xb0\xe0\xfc\x7d\xda\x2c\x36\xad\xab\x97\x19\x56\x2c\xb8\x24\x0c\xe4\x25\xf6\x19\x3c\x3e\xbf\xc0\x8a\x98\xd2\xdc\xc5\xa9\x28\xe2\x8b\x19\x22\x75\xa3\x96\x23\x44\xee\x88\x58\xaa\x05\xa0\x0d\x3c\x6f\x28\x88\x35\x2a\x51\x8d\xcb\x60\x77\x8c\x10\x77\x0e\xe8\xc4\xe6\xe1\x7e\xb0\x36\x59\x5b\x29\x63\xa1\x51\xe9\xd3\x28\x76\xbd\x6b\x72\xd3\xd9\xa0\x54\xa1\x99\x93\x8e\x06\x01\x95\x6a\x4d\xe3\x88\x6b\x51\xc6\xb3\xf0\x0e\x7a\x11\xa4\x8e\xe8\x2d\x51\xe3\x07\x70\x4f\xe2\x9a\xb7\x4c\x19\x9e\x1a\x63\x31\x78\x2d\xcf\x24\xd8\x3c\x23\x5e\xee\x49\x75\x7b\x94\xe7\x6a\xc7\xa5\xa3\xa6\x98\xe4\xc8\x53\xc6\x4a\x11\xc1\xbe\x43\xff\x73\xf8\xf7\xdf\xfd\x3a\x3e\xfa\xf3\xe1\xe1\x4f\x2f\xc7\xff\xf9\xf3\xef\x0e\xff\x7e\x0c\xff\xf8\x8f\xa3\x3f\x1f\xfd\xea\x7e\xf8\xdd\xd1\xd1\xe1\xe1\x4f\x7f\x79\xff\xe6\x66\x72\xfe\x33\x3d\xfa\xf5\x27\xd6\xd6\xb7\xe6\xa7\x5f\x0f\x7f\x22\xe7\x3f\x7f\xe6\x4b\x8e\x8e\xfe\xfc\xdb\xf8\xe8\x63\x6a\xa8\x3d\x5f\xa0\x3d\x53\x98\xfd\x49\x82\xec\x56\xc6\xee\xfc\xf0\xdb\x2b\x70\xed\xf8\xdb\xe8\xc4\xc7\x8e\xbf\x48\xf6\xc9\x5c\xcc\xba\xf6\xa9\x44\xbc\xa6\x4a\x91\xd2\xde\xbd\x01\xf7\xcd\x8a\x3f\xc8\x0a\x2c\xa0\xad\xc2\x70\x7b\x07\x1c\x2c\x9d\x1b\x29\xba\x5b\xfe\x7e\x05\x0f\x18\x43\xb4\x6e\x2a\x52\x13\xa6\x40\xf0\x8c\x9d\x6d\x0b\xee\xc4\xe3\x6e\x04\x85\x71\x78\x90\x87\x82\x90\xd2\x76\x72\x90\x8d\xc1\x33\xc8\xc6\x41\x36\x7e\xea\x49\xf6\x89\xe7\x10\x8c\x57\x61\x27\xac\x2f\x4b\x3a\x4d\x19\x3c\xe4\x9e\x22\x81\xcf\x00\x28\x71\x47\xcb\x16\x57\x21\x93\xac\x23\x17\x8d\x93\x00\xe0\xda\xe9\x43\x43\x20\x4c\x4b\xee\x48\xe5\x3b\x61\xdc\xf4\xc7\xe8\xaf\x06\xce\x13\x1a\x9a\x7d\x87\x7a\x5c\x40\x6e\xd3\x70\xfb\x8c\x10\xd6\xd4\x3d\x90\x2b\x5d\xf2\x68\xa3\x2e\x09\x43\xef\xb6\xb8\xa9\x38\xf5\x52\xa3\x5a\x8e\x90\x24\xca\xe4\xd8\x2c\xc8\xca\x32\x61\x89\x5e\x9c\x56\xf7\x78\x29\x5f\xf8\x98\x24\x65\x54\xad\x14\x1f\x88\xea\x03\x70\xc3\xea\x17\xce\xb8\xd6\x79\xa1\xaa\xc2\x6c\x46\x8a\x48\x6b\xd6\x70\x70\xac\xf7\xcd\xe2\xd1\x15\x65\xad\x1e\xad\x9b\x55\x52\x22\xce\xa2\x1a\x22\x0f\x54\xa1\x96\x29\x5a\x69\x65\x1d\x09\x32\x6f\x2b\x1c\x3a\x02\xed\xc8\x1c\x4c\xae\x3c\x46\x1f\x58\x41\xc2\x2f\xc7\x79\xaa\x57\x1a\xd0\xca\x43\x45\x14\x29\x47\xf0\xea\xfe\xd0\xa5\x01\x9a\xf5\x4e\xbe\x5f\xca\xa8\xe6\xdd\x5c\x7a\x20\xd1\xb1\x39\x50\x1e\xe5\x80\x4a\x3a\x9b\xe9\x96\xc1\xd8\x66\x5c\xd4\x78\xbd\x57\x98\x95\x51\xad\xeb\x93\x0b\xe9\x25\x21\xcb\x2f\x54\x76\x79\x21\x69\x49\x0a\x2c\x5e\x84\x35\x41\x4e\x2b\xb5\xe0\xed\x7c\xd1\xed\x8a\xb4\x29\x47\x52\x01\xbc\x4a\x4f\xa6\x74\x9e\x8b\x95\xcd\x26\xb5\xce\xc2\x0a\x62\x54\x2b\x4e\x8c\xc0\xb8\xc7\x91\x6d\xaf\x41\x00\x0c\xa6\xdb\xac\xb9\xcb\xb9\x02\x0c\x1f\x29\x83\x04\x39\x46\x1e\x54\x86\x01\x1f\xa3\x0b\x43\x78\x31\xea\xbf\xb5\x37\x25\x66\x32\x02\x0c\x9b\x43\x63\x46\x02\xf8\x56\x1a\xa0\x3e\xc5\x0c\x78\x89\xcd\xcb\x31\x5b\xba\x8c\x0e\xc0\x98\x99\x4c\x34\x9f\x64\x52\xc5\xf9\xd0\xfd\x59\x7a\xf6\x32\x3b\xbd\x13\x7a\xd5\x56\xbb\x8b\x5e\x5e\x85\x05\x3e\x2a\x5b\x80\x47\xe8\x1e\xb9\xac\x9e\x05\x29\x6e\xcd\xc9\x2b\x89\x11\x6f\xc4\xf2\xdc\xa6\x9e\xae\x05\x6f\xab\xd2\xb0\xea\x76\xd2\x19\x24\xad\x81\x50\x9a\x6e\x60\x41\x10\xd1\x16\x02\x50\x8f\xd0\x38\xf1\xcd\x45\xa9\xb7\xb7\x11\xc9\xf0\x62\xe3\xd5\x76\xe9\x2e\xb6\x4b\x20\xe5\x0b\xce\xcc\x3d\x39\xb2\x37\x77\x8d\x29\x8b\x55\xed\xba\x31\xd0\x39\xe3\x02\x9c\xd6\x33\xc4\x78\xbf\x0f\xfd\x23\xbf\xd2\x8b\x68\x9d\xc3\xe3\x90\x36\x6a\x3b\xdd\x72\x9a\xf6\xef\x17\x44\x5b\x6b\xfd\xbe\xc4\x8a\xed\x60\x45\x85\x96\x88\xc7\xba\x33\x52\x09\x0c\x34\xc9\x36\x9f\x42\xc4\x6e\x7c\xad\x74\x9f\x2a\x54\x73\xa9\xd0\x37\x2f\x83\x39\x4e\xf2\xa3\x8d\x11\x9c\x44\x08\xf8\x79\x35\x05\x98\x2e\x30\xe4\x42\xc5\xbe\xf5\xa2\x24\x4c\xd1\x02\x57\x41\x47\xf5\x25\x31\xe3\x62\x4a\xcb\x92\x00\xb4\x1d\x0a\x42\x80\xc9\x19\x69\xe9\x82\xea\xda\x35\x10\x60\x40\xba\x8d\xf5\xfe\x87\xeb\x1b\x88\x61\xf6\xf5\xbd\xce\xe6\x8f\x53\x8d\xee\xf4\x10\x94\x16\x0a\xe1\x7e\x36\xea\x6c\xaf\xa5\xaf\x03\xd2\xa7\xc7\xa3\x77\x4a\xe0\xe8\x59\xf0\xfb\x75\x39\x42\xb5\xca\xc6\xca\xe8\x84\xc7\x3d\xc0\xf1\x99\x8d\xbf\x23\xec\x9d\x69\x7c\x1f\xd0\x5c\xd7\x3e\x37\x52\x6f\x6c\x6c\x33\x23\xf1\x2d\x61\x5a\x94\xad\x2f\xfc\xcc\x73\x68\x51\x01\xee\xae\x14\x6a\x28\x38\xcd\x58\x51\xa9\x4f\xb3\xb9\x18\x21\xdc\xd4\x70\x5b\xc1\xcd\xe3\x9e\x5f\xd8\xcd\xf9\x42\x5f\xd6\x4e\xd8\xa7\x71\x5a\x67\x08\x7c\x66\xf0\x8e\xe8\x59\x3d\xe3\x65\x8a\x8f\x6b\x05\xee\xe0\x95\x1e\x93\x32\x03\xf7\x6d\x69\x74\x1e\x50\x78\xf4\xba\xf6\x57\xf5\xeb\xc0\x39\xe8\x33\x89\x15\x8f\xf7\x77\xe5\xc1\x3a\xb8\x6e\xec\x57\x08\xbb\xb7\x29\x04\xa9\xcc\x75\xbc\xa0\x0d\x9a\x12\x75\x4f\x08\xdb\xac\xa7\x95\xe4\x50\x1e\x39\x47\x4d\x62\x27\x3a\x68\xa8\x81\xd8\x1e\xa3\x49\xef\x98\xc3\xe5\x9e\xce\xec\x76\xc1\xbe\x5b\x15\x51\x60\x78\x39\x31\xe3\x44\xd8\x86\xb1\x02\x40\x2a\x0d\xce\xe5\x07\x4b\xc0\xda\x58\x1b\x73\xf2\xf0\x2e\xb9\x4a\x1b\x61\xf2\xd0\xb4\x7e\x67\x1d\x06\x4f\x32\xca\x4c\x48\x12\x8b\xe3\xde\xa3\x53\xd8\xbf\x6a\xed\xdc\xd9\xad\xef\x85\x73\x0f\x82\x17\x88\xef\xd4\x9d\xe3\x6d\x8a\x6f\xbf\x45\xc4\x04\xaa\x32\xd8\x15\xee\xc9\x43\x79\x99\x85\xf4\x32\x1f\xcf\x35\xca\xc6\x75\x8d\x3e\x02\x0b\x89\x63\x77\xcd\x8c\x34\x97\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\x28\x87\x75\x8e\xb3\x72\xdd\xef\x46\x2f\xa8\xe2\xba\x88\x78\x63\x2a\x78\xac\x94\xc7\xee\x3c\x2e\x2d\x03\x5f\x71\xdc\x8e\xbe\x98\xe9\x15\x31\xee\x11\x08\x94\x00\x68\x79\xb5\x63\x2e\xe8\x62\x74\xac\x7f\xb6\xf4\x0e\x57\x5a\x0c\x77\x7f\x31\x81\x0c\xcd\xf0\x8f\x9e\x12\xd9\xae\xb0\xbc\xed\xc2\xbb\x64\xdc\xf0\xb2\x8b\xe6\x9e\xb8\xa9\x83\x8f\xc8\x83\xfa\x02\x51\xed\x20\xa5\x26\x82\xde\xd1\x8a\xcc\xc9\xb9\x2c\xb0\x51\x61\x76\x8d\x8c\x38\x7d\xa4\x5f\xb0\x33\x05\xaf\xa4\xf7\x3d\x61\x97\x9f\x0e\x4e\x98\x39\xa6\x0c\x6a\x3b\x27\x68\xab\xb6\x51\x69\x12\xe4\xa9\x92\xa8\xc1\x42\xef\x42\x97\x08\x6f\xe2\x19\x53\xce\x2b\x5b\x0c\xa8\x5a\x76\xfd\xa2\xf1\x10\x56\x70\xa0\xf3\x5f\x18\xb9\xff\x45\xf7\x42\xa2\x59\x85\xe7\x5d\x3c\x45\x5f\x6c\xab\xfa\x64\x72\x6e\xfe\xa3\x13\x0d\x95\x6e\x5a\x7d\x8f\xdd\xe3\xa5\xec\x58\x0b\x42\xb7\x7b\xfc\x8d\xf2\xea\x08\xe4\x09\x96\xc8\xb7\x1d\x17\xef\xd1\xcf\x37\x47\xe0\xdc\x3f\x3b\x9d\xfc\x72\xfd\xb7\xeb\x5f\x4e\x5f\xbf\xbf\xb8\x8c\x7e\xd9\x25\x57\xc4\x40\x5b\x82\xa0\x6e\xe1\xd3\x69\xf4\x2a\xf8\x8c\xac\x63\x2e\x8f\x01\xb7\x0a\x94\xb9\xac\xe4\xf7\x89\xe0\x7e\xbd\xa7\x08\x8e\xf3\x9e\xe0\xa6\x39\x15\x35\x17\x13\xc1\x67\xb4\x8a\xd6\xf8\x73\x9d\xe0\x95\xee\x38\x98\xef\xa9\xfd\xb8\xbb\x6e\x0c\x8b\xe3\x7a\x36\x49\x70\x65\x50\xe0\x0a\xd4\xaf\x89\x87\x15\xad\x86\xf3\x0f\xe4\x6a\x17\xe3\x0f\xd1\x4e\xf7\xcc\xce\x39\xb2\x74\x37\x22\xff\x3c\x87\x6b\xa0\xe2\x05\xae\xa0\x4a\x74\xda\xc6\x47\x99\x0d\x93\xd5\x7e\x05\x9c\x1e\xd8\x6d\x67\x54\x71\x5c\x9a\x18\x96\x11\xfe\x25\x71\xb5\xcb\x9c\xda\x05\x59\x0b\x49\x1d\xb9\x31\x7c\x0a\xd0\x9e\x23\x21\x69\x04\xf1\x5a\xcd\x4a\xf3\xdc\x94\x6c\x4b\x6a\xf2\x7d\x3f\x07\xc4\x8e\xb2\x47\x97\x95\x7a\xe6\x7c\x33\xf6\x80\xd1\x19\xf8\x53\xc0\xcf\xa9\x0d\xf5\x65\x63\x1c\x9c\xef\xdc\x32\x24\x94\x97\xcd\x64\x3c\xc3\x4b\xf6\x64\x77\x9a\xf9\xf1\x3b\xd2\x24\x83\xdf\x52\x3d\x83\xb3\x4e\x48\xbb\x6d\xe3\x74\x10\x93\x11\x9e\xb8\x1f\x7f\x84\x42\xe6\x4e\xfe\x67\x70\x4e\xf9\x25\x46\xe3\xe0\x68\x35\x82\x8c\xd7\x8f\x57\xaa\xbd\x7f\xd5\x32\x45\x6b\xe2\x18\x46\xc7\x2b\x3a\x91\x30\xbf\x3e\x90\xbe\x9e\x4f\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x8e\x87\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\x28\x8f\x19\xf4\x07\x30\x40\x65\x79\x52\x0a\xde\x98\x9b\xd8\x51\x7f\xa5\x67\x65\xf6\x29\x66\xc2\x4a\x4e\xd6\x13\xd5\xeb\xc8\x5c\x60\xa6\x3a\xfc\xde\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x68\xf6\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x45\x6b\xce\xdc\xe0\x02\x8e\x19\x34\xf9\x70\x7d\xf1\x7f\x56\xce\x4d\xbc\x6a\x67\x9e\xfd\x2e\x59\xa1\xe5\x41\xb6\x6d\x73\x65\xeb\x7c\x0f\x1b\xe7\xeb\xde\x38\xde\x41\xb4\x73\xbe\xed\xab\x36\x8c\x38\x53\x16\x74\x0d\xd5\x49\xba\xce\xc4\x53\x53\xf6\xdf\x1a\x02\x74\x05\x41\xfa\x2b\x4c\x51\x80\x4b\x07\xde\x5a\xc5\x4d\x29\x6b\xab\x76\xa5\x95\x62\x08\x6f\xd7\x19\xae\xe4\x97\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\xf7\xbc\x65\x79\x08\xbc\x13\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x33\xf8\x2d\x32\x39\x6b\x41\x6d\x8e\x9e\x9e\x93\xa0\x66\xdd\x04\xaa\x95\xc7\xaf\x38\x3d\xdc\xd8\x2f\xad\x5c\x03\x46\x5a\xbd\xaa\x4b\x61\x9b\x25\x20\x19\x04\xc1\xa5\x01\xd2\x60\xb5\x30\xa4\xf1\x35\x96\xb7\xa4\x34\x1f\x24\x12\x66\x7a\x72\x4c\x80\xc2\xb9\x99\xbe\xd1\x93\xeb\x38\x4b\xc0\x21\x6c\x40\xb6\xc0\xa0\x99\x62\x8a\xed\xf4\x34\x24\x08\x76\xbd\x08\x1f\x58\xb5\xbc\xe2\x5c\x7d\xef\x6b\xe2\xef\xfa\x64\xfc\xd5\x43\x61\x43\x27\x26\xf8\xa5\x31\x74\x79\x0c\x1b\x07\xe4\x62\x50\xc9\x3f\x55\x2c\xea\x05\xf9\x77\x95\x8a\xa2\x65\xa7\xf2\x8d\xe0\x6d\xb4\x0e\x97\xd3\xde\x7c\x73\xf1\x1a\x2e\xbe\xd6\x72\x2a\x33\x25\x96\x0d\xa7\x4c\x39\x8f\x57\xc6\xa0\xcd\x0f\x96\xbd\x3a\x94\x6c\xc9\x44\xb5\x08\xbd\xc7\x4b\x84\x2b\xc9\xbd\x4b\x8d\x6d\x0a\xb7\xba\x58\xae\xfe\xf5\x94\xab\xc5\x5a\x10\x37\x36\x75\x47\x3f\xeb\xed\x8d\x02\x6a\xe6\x0e\x10\x43\xd9\x5a\xb3\x0a\x58\x5d\x1a\x41\x0a\x52\x12\x56\x7c\xa9\x27\x62\xd7\x4c\xc1\x70\xaa\x2e\x39\xd3\xe2\x75\xd7\xe7\xea\xc2\xfb\x27\xed\x6a\x84\xa7\x08\x5c\xd9\x36\x88\x88\x81\x55\x1b\x84\x6b\x2b\x53\x90\xa7\x17\x33\x88\x7a\x9a\x4d\xf7\x97\x76\x4a\x2a\xbd\xd8\xb4\xaa\x1c\xda\xde\x40\x13\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x22\xb3\xaa\xf4\xe3\x13\xc2\xec\xd0\x7e\xb8\x78\x8d\x5e\xa2\x43\x3d\x36\x83\x18\x9c\x61\x5a\x01\x51\xb7\xc3\xea\x86\x36\xc0\xcc\xe5\x94\x25\x4d\x01\xc8\x11\xc4\x85\xb9\x5a\x46\x88\x71\x24\xdb\x62\x11\x64\x1c\x78\x8f\xb0\xad\xda\x94\x44\x44\x32\x88\x9d\x7c\xf7\xe1\x0f\x92\x44\x43\x64\x73\x5e\x87\x3f\x3c\xe3\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\xbe\x30\xec\xda\xe1\xb2\x4c\xb8\x2c\x25\x79\x47\x59\xfb\x60\xea\xa2\xec\x45\xd8\xe3\xfa\x1c\x7a\x84\x0a\xb7\xd0\x3c\x88\xdb\xb9\x08\x45\x86\x14\x8d\x8b\xde\x31\x1a\x3d\x62\x75\xc3\x2d\x81\x0d\xf7\x26\x64\x51\x62\x56\xf2\x7a\xad\x93\x33\x2e\x10\xc1\xc5\x22\xba\x37\x01\x6a\x64\x38\x98\xf6\xf9\xf7\x0e\x08\x41\xfa\x6a\x36\xdf\xfe\x3b\x48\x86\xa5\xd2\xef\x5c\x93\x1d\x5b\xe1\x29\xa9\x2c\x2d\xae\xe1\x4a\xcf\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x7f\x11\xf3\x90\x15\x7c\x71\x63\xd1\x25\xdd\x3c\x80\x0f\xf4\x4b\x98\x87\x36\x41\x41\x44\xab\xf3\xa0\xb5\xcd\xfe\x3c\x80\xfe\xb5\xef\xf3\x20\x49\x51\xf0\xba\xd9\x13\xa4\xe4\x8d\x41\xe1\xeb\x1e\x7d\x2e\x2a\xb2\xff\x65\x9c\x04\x77\xb6\xd5\xae\xb0\x32\xf7\xa0\x2b\x79\xf5\xbf\x83\xeb\x1c\xa4\xdd\xea\x1d\x6f\x5b\x4f\x46\x64\xfa\x16\xed\x0b\xff\x1d\x6f\xbc\x01\x86\xd9\x7b\x9e\x1d\x86\x19\x30\xe6\x63\x70\xcf\xf7\x20\x91\x5f\x03\x18\x53\x1b\x01\x30\xaf\x84\x01\x0b\x50\x83\xd5\x62\x64\x33\x56\xef\x88\x13\xcf\xb7\xc6\xe3\x75\x00\x12\xc7\x75\xc8\x89\x9b\x0e\xb3\x6a\x98\xf4\xb3\x62\x37\x37\xe1\x35\xcd\x77\x2e\x3f\xdc\x84\x3c\xfa\x98\x2d\x0d\x47\x64\x02\xab\x99\x79\xf6\x4f\xad\x78\x4a\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xe1\x48\x0b\x65\xe8\x04\xc1\x55\x95\x05\x93\xb0\xc9\x0b\xe2\x4e\x81\xa7\x92\x5f\xf7\x06\xf4\x6b\x9a\xa6\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x82\x94\x06\x27\x75\xdd\x90\x62\x5f\x6e\x8b\x37\xef\xaf\x4f\xfb\x3d\x03\x5d\xd8\x16\xce\x20\xf0\x7b\x84\xcb\x9a\x4a\x09\x01\x1f\x32\x5d\x70\x7e\x9b\xd4\xe4\xa1\x4b\xb5\x9d\x53\xb5\x68\xa7\xc7\x05\xaf\x83\xac\xdb\xb1\xa4\x73\x79\x62\x25\xca\x58\x4f\xdc\x11\xa2\xac\xf2\x99\xca\xe0\x2d\x04\x2e\xb0\x78\x2a\xb9\x70\xf0\xa8\xf0\xa3\x87\xad\x07\xf9\x29\x1e\x9a\xbd\x3e\x3d\x50\xdd\x04\x36\xef\xce\xb5\x8e\xf5\x5d\x95\x56\x6d\x70\x65\x67\x3d\x32\xf6\xb0\x52\x87\x8d\xe2\x6c\x9c\x47\x63\xbc\xee\x7c\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\xde\x76\x5d\x0a\xb9\xf4\xe8\xac\xc7\x08\xd5\xcf\xb9\x87\xf0\xf6\x81\xfe\x4b\x07\xcb\x3c\xc8\x55\x5c\xe6\xb4\xaa\xf4\x42\x62\x4b\xbc\x16\xa0\x3b\xc1\x34\xe9\x33\xda\x19\xce\x5d\x6d\x2c\x84\xa3\x80\x8b\x24\x4d\x28\x18\xde\x33\x7d\x19\x58\xce\x0c\xbd\x81\xa0\x6d\x8c\x6a\xfa\xa0\x7b\x18\xb6\xd8\x27\x89\x85\xc0\xff\xe6\x5f\x27\x14\xb0\x46\x00\x3e\xf0\x9c\xe9\x23\xbd\x42\x61\x23\x2e\x39\x5a\xe9\x6b\x4b\xff\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2b\x72\x8c\x36\xa4\xef\x3c\x5b\x04\x19\x7d\x7e\x14\xf9\x09\x63\x55\x68\x5f\xe2\x55\x89\x52\x3f\xe4\xfa\xdd\x19\xcf\x4a\xc8\x37\x4c\xd7\xc1\x4b\x13\x5e\xae\xd1\x10\x03\x99\x31\xc5\x55\x7c\x21\xd7\x8b\x59\x48\xdd\xc9\xb8\x75\x8f\x98\x0a\xe2\x06\xa7\xff\x40\x8a\x56\x91\xd2\xb2\x91\x5b\x97\xb2\x61\x32\xee\xf7\x26\xba\x07\x2e\x49\x7f\x4a\x00\xa0\x24\x47\x5d\x29\x36\x6b\xeb\x78\x7e\xd7\x11\xfa\xbf\x20\x25\xa5\x23\xd4\xaa\xe8\x1d\x61\x44\xca\x89\xff\xf3\xd8\xa9\x00\x1c\x75\x81\x99\xb3\xad\xf4\x99\xb6\x1e\x6e\xcb\x3a\x6e\x79\x3c\xa6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x99\x92\x39\x35\x69\x81\xc1\xa5\xe8\x69\xcb\xe3\x48\x75\xc1\xb0\xa1\x0a\xd5\x74\xbe\x30\xa7\x05\x61\x54\x71\x36\x47\x0e\x37\x56\x71\x5c\x22\x10\x2c\x5c\xa0\x7b\x2c\x6a\xad\x0b\xe0\x62\x01\x20\x34\xcc\x50\xd9\xea\xf3\x80\x80\x64\x7b\x39\x96\x0a\x2b\x62\xc9\xf0\xa2\x7d\x70\x6e\x9a\x76\x50\x22\xf6\xa9\xcb\xdf\xef\x98\x4f\x47\x9f\xb4\x2c\x5e\x90\xf3\x07\x52\xf8\x63\x6d\x18\xa7\xeb\x1a\x08\x03\xb9\x3b\xce\x8e\x2d\x2e\x59\x19\xdc\x13\x53\xd9\x8e\x70\x5f\x74\x93\x33\x3b\xe1\xd4\x59\x9f\xe6\x47\x6d\x8f\xf6\x17\x41\xba\x20\x56\x50\x34\x09\xd8\xb1\xb9\xb8\xd5\x27\xd7\x70\x04\x71\xe1\xab\xf5\x27\x75\xcb\xf5\x03\x28\xb3\x39\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x30\xcd\xc0\x64\x44\x77\x03\x92\xb4\x6e\xaa\x25\x8c\xe1\xc0\x94\xfc\x4e\x24\x30\x74\x80\x55\x5f\xfe\x52\x2e\x48\x55\x8d\x90\xd4\xea\x2f\x76\x35\x44\xcc\xa7\xfa\x4b\x4a\xb4\x85\x71\x93\x1d\x1e\xfc\x7a\x30\x42\x44\x15\x47\xe8\x9e\xb3\x03\x65\x02\x1e\xe8\x06\x6c\xc8\xa4\x3e\xf9\x4e\x2c\x79\x8b\x18\x21\xf6\xec\xf8\x62\x55\x05\xd6\xe6\x4f\x6b\x74\x74\x43\xba\x41\xaa\x2a\x4d\x9f\x3b\x7f\xa0\x4a\xab\x22\xaa\x05\x37\xc5\x4b\x63\x29\x10\xe0\xa1\xc7\x12\x6e\xba\x93\x05\xc1\x95\x5a\x2c\xbd\xf5\xf2\x2f\x22\x38\xd4\x27\x65\xf6\x37\xe9\x3a\xd4\x1e\xa4\x8d\xee\x6f\x02\xa7\x56\x30\x5a\x41\x6e\x16\x82\xc8\x05\xaf\x76\x9e\xc6\xf9\xde\x96\x7b\x2b\x38\x93\x5a\xa6\x68\x13\xdb\xf6\x51\xfa\x0c\x3a\xa3\xb3\xd8\xfa\x0a\x1c\x4e\x99\x20\xa5\x55\x96\x6c\xc9\x8b\x05\xbe\x03\x4d\x41\xeb\x73\xa4\x4c\x31\x4d\x42\x9b\xe8\xf7\xc7\xbe\x87\x3e\xed\xee\xd5\x9e\xc0\x36\x23\xb9\x23\xe7\xa2\xc9\x73\x4b\xbf\xb9\x9a\x9c\xf5\x6e\x69\xf8\xe0\x2d\x1c\xe3\xb3\x05\x29\x6e\xaf\xd2\xaa\xb9\xee\x09\xb4\xa0\xe1\x62\x97\x8a\x81\x6e\x3e\x9b\x56\x30\xe1\x42\x21\xd6\xd6\x53\x22\x9c\x43\x61\x0e\xab\x48\xc4\x1d\x2d\xc8\x31\xba\x34\xbf\x73\xc1\x79\x57\x7d\x18\xb3\x39\x41\xaf\xf4\x81\xf8\xe3\xb7\xdf\xfe\xfe\xdb\x74\x19\x9d\x4e\xa4\x9a\x87\x44\xd5\x0e\x7c\x5f\xd4\xae\x6b\xd3\x9d\x4d\xce\x66\xdb\x53\x30\xea\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\x5e\x49\x49\x08\xda\x10\xae\xd0\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\x42\xdb\x38\xf6\x5a\x1f\x03\xdd\x30\x65\xf3\xe3\xba\x3c\x3a\x4e\x8b\x82\x3b\xb3\x7a\xad\xa4\x5c\x8f\x66\xe6\x91\xf2\x70\x7a\x52\x76\xee\x82\x47\xae\x97\xdf\xa1\x17\x71\xd5\xc4\xf4\x12\xbc\x21\x79\x32\xd1\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\xdc\xb8\xde\x5d\x26\xa9\x69\x90\xda\x29\x52\x7b\xc1\xd3\xea\xcd\xe7\x8e\xbb\x18\x51\x02\xb5\xd1\x18\x23\x85\x5e\xe8\x51\xaf\xb2\xad\xc3\x21\x5e\x4c\x8e\xd1\xdf\x78\x0b\x2a\x17\x9e\x56\x4b\x74\x8f\x0d\xa3\x41\x1c\xa5\x74\xf7\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x6f\x09\x2e\x4d\xad\x4a\x70\xed\xec\xfc\xac\x06\x7d\xca\xb6\x6c\x67\xad\x54\xbc\x46\x0b\x3b\x54\x33\x87\x5d\x41\x7f\xa3\x1b\x99\x23\x08\xb1\x1f\x89\x04\x69\x8c\xb5\x64\xff\xe6\xab\xb0\x85\xd6\xa4\x90\x99\xe7\xa0\x1a\x10\x46\x45\x38\x55\x56\xd1\x07\x17\x26\xb5\x32\x2a\xda\x25\xd6\x3d\x59\xaa\x8a\xa0\x4c\x95\x45\x10\x08\x29\x7d\x28\x93\x5f\x92\x1e\x84\xcc\x53\xa3\x44\x3f\x2c\x31\xbc\x66\x9e\xbc\x15\x12\x90\x0d\xb5\xd9\xcd\x65\x00\x38\xba\xa3\xa9\xac\x84\xc8\x39\x93\x7d\x01\x55\xcc\x38\xa3\x85\x09\x67\xa0\xb6\xe1\x0c\xf1\x56\x35\xad\x02\x57\x50\x81\x25\x19\xdf\x61\x41\xb5\x40\xd5\xed\x77\x7f\xd8\x32\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\x2b\x80\x91\x79\x85\xd7\x16\x27\x7d\x47\xa3\xbd\xf6\xc1\x20\x53\x43\x7c\x91\xcf\xac\xc3\x6a\x01\xc8\x3e\x88\x65\x39\x60\x28\x08\x4e\x6d\x36\xec\x41\xe2\x4d\x56\x2b\x36\x51\x24\x40\xbc\x9d\x8b\x15\x3b\x58\xf7\x70\x7d\x0e\x33\x61\x4d\x9e\xde\xac\xb6\xc3\x72\x2d\x60\x86\x2e\x4e\x2f\x4f\x7f\xb9\xfe\xf1\xec\x97\xcb\xd3\xf7\xe7\x29\xaf\x4e\xae\x1d\x9f\xb3\x7a\x7c\xb6\xfa\xf1\x4f\x50\x41\xde\x3d\xb2\x58\x90\xfd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xf5\x90\xd3\x58\xea\xd0\x8a\xd3\x54\x0b\x9e\x9d\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xbc\x26\x05\x67\xe5\xce\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x06\x9a\xac\x30\x66\xb9\x42\xb0\xb6\x78\xb5\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbf\xc8\x35\xda\x1b\xf7\x78\x43\x04\x05\x44\xd0\x3e\xec\x9a\xb7\xfc\xde\x56\x74\x3f\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\xd9\xd4\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x87\x45\xfa\xec\x75\xe4\xcb\xf6\xf1\xd3\xa1\xaf\x0e\xb6\xd4\x0f\x7f\xa5\xe0\x87\xd0\x8a\x18\x7f\x75\xec\xf3\xd4\x5e\x41\x7f\xbc\x28\xc2\xac\x74\x90\xb3\xaf\x6f\x9f\xa8\xa2\xb9\xe6\xc5\x6d\x26\xb7\xeb\xcd\xd9\xc4\xbc\x6d\x05\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xb7\x40\x01\x1d\x9c\xae\x7b\xe3\x74\x3d\x30\x69\x5d\xb8\xfa\x6e\x6b\x07\xea\xc1\x60\x6d\x75\x8f\x53\x7c\x44\xbf\x02\xca\x60\x6d\x3d\xf2\x0c\xd6\xd6\x16\x8f\x49\x22\x01\x30\xe8\x1b\x81\x0b\x32\xd9\x27\xe5\xcd\x09\x10\x54\xb6\xc2\x96\x95\xf3\x3a\x9c\x17\x17\x8c\x90\xd2\xc8\x0f\x3b\x14\x82\xe6\x7a\x24\x06\x1e\x0d\x3e\xc4\x0e\x58\xdc\x8a\x04\x35\xef\x66\x61\x5f\x6d\x55\x5c\x17\x64\xde\xd4\xbb\xce\x36\x69\x3c\x19\xba\xab\x1a\x62\x8f\x93\xee\x3c\x94\x5a\x27\x2c\xde\x9d\x8e\xc3\x15\x44\x92\xce\xf5\x74\xd9\xca\xd0\x06\x23\xec\x4b\xef\x75\x1d\xd1\xad\xce\xb8\x28\xe8\xb4\x5a\xa2\x05\xae\xb4\xb1\x74\x4f\xd5\x02\x61\x74\x4b\xab\xca\xbe\x26\x7e\xa2\xae\x89\xcd\xd5\x34\x1a\x4d\xc5\xd9\x1c\x26\x03\xdb\x9c\x8c\x87\x86\x14\xba\xcd\xa2\x22\x98\xb5\x8d\xe9\xa7\xd6\x8f\x96\xbc\xcd\x90\x96\xe1\x02\xdf\x5e\x9f\x62\xd4\xd2\x8f\x98\xc2\x6d\x1f\xdd\xf3\xfd\xe4\x5a\xf4\x41\x2d\x88\xb8\xa7\x92\x98\x42\x72\xd1\x7d\x32\x7d\xe9\x97\x91\x33\x9f\x79\x0a\x15\x9b\x39\xa8\xb7\x05\xa4\xb2\x46\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\xb9\x21\x6a\xb0\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xb3\x0d\xa4\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x4b\x74\x47\x71\x74\x4f\x80\x14\xa2\xdb\x51\xe8\x90\x71\xc4\x1b\x7d\x75\xb5\x8c\xaa\x25\x44\xf4\x16\xad\x42\x25\xbf\x67\x09\xf9\x56\x37\x16\xe6\x80\xd1\x94\x28\x6c\x7d\xe0\xfa\x10\x78\x4e\x74\xa0\x3b\xd7\x67\x0f\x92\x04\x6e\x36\x6e\x00\x4f\x93\x3e\xc7\x2a\x41\x4a\x6c\xd0\xe6\xcd\x7a\x7e\x7c\xdb\x51\x69\xe3\x75\x89\x3c\xcc\xfb\xc1\x6c\xa8\x4f\x34\x6f\xd5\x9e\xdc\x23\x8f\xb9\x8e\x0c\xc5\x45\x60\x24\xd2\x9a\x48\xc4\xdb\x4c\xf5\x26\x5e\xd9\xe6\x72\x5a\x78\x83\xdf\x69\xe3\x23\x55\x49\xa3\xaa\x0e\xe7\xd8\x62\x8f\x90\xf7\xdb\x3c\xdc\x80\xbf\x72\xda\xce\x66\x44\xc0\x4d\x07\x1d\x5e\x83\xdd\xfb\x3a\x5e\xee\x0e\x8b\x73\xde\x5a\xc0\x17\x51\x23\xa8\x1d\x60\xc9\x24\x1e\x69\xd2\x92\x6c\x42\x99\x5e\x41\x24\x70\xc1\x33\x74\xfe\xe1\xfb\xb8\x2d\x9a\xa3\xb2\x40\x5a\xca\x2a\x8c\xf3\x03\x8b\xc3\x24\xe6\xdd\x0f\x9b\x58\x5f\xec\xb6\x28\x2a\x2e\x6d\x7a\x34\xac\x4b\xb1\xc0\x8c\x11\xe7\x8c\xa2\x0a\x3c\xd9\x53\x42\x18\xe2\x0d\x31\xa0\xbc\xa8\xce\x60\x24\x29\x9b\x57\x04\x61\xa5\x70\xb1\x38\xd6\xbd\x63\x6e\x2f\x74\x79\xc8\xf6\x13\xa9\x04\xc1\xb5\xd9\x13\x82\xd4\x98\x9a\xe6\x11\x2e\x04\x97\x12\xd5\x6d\xa5\x68\xe3\x5f\x16\xe7\x45\x24\xc0\x08\x21\x4d\x5a\xaa\x5b\x2b\x48\x2b\xe9\x12\x9e\x47\x5d\x0f\xed\xf0\x79\x58\xac\x08\x5c\x67\x23\xfd\x5b\x52\x37\x6a\xe9\x13\x13\xe3\x6c\xa0\x19\x15\x52\xa1\xa2\xa2\x84\x29\x3b\x32\x43\x39\x08\x7d\x18\x39\x75\x9a\xd9\x19\x91\x76\x4a\x58\x09\xc6\x77\xa3\xa4\xc9\xbf\xf3\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x19\x97\xfd\x87\x5d\x65\x1a\xb3\x71\xdc\x8c\xc0\xd6\x71\x0a\x8e\xe9\x91\xfd\x28\xe8\x42\x50\x67\xbb\xcb\x9d\x4c\x93\x2b\x50\x3e\xc6\x9d\xeb\x51\x8f\x73\xa0\xb3\x2d\x20\x15\x66\x4d\xea\xc0\x86\x62\xe4\x4e\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xd9\x65\x4c\xa0\xcb\xbd\x27\x52\xe2\x39\x99\x44\xc2\x11\x72\x08\x9c\xce\xd1\x06\x38\x86\x6e\xdb\x2c\x88\x21\xba\x52\x3c\xf8\x24\x4c\xf2\x0a\x8d\xc7\xda\x0c\x24\xaa\x07\xce\x68\xba\x17\x54\x29\x02\xbb\x14\x2a\x39\x01\x00\x6d\x95\xbc\xb3\x9f\x5c\x16\xd5\x9e\x9d\xf4\xb0\x3d\xad\x7e\xb0\xd2\xa4\x69\x4d\x09\x9a\x0a\x4a\x66\x68\x46\x21\x6f\x0c\x32\xaa\x46\xa6\x0a\x01\x06\xdc\x2e\x96\x92\x08\x18\xb6\x75\x0b\xb8\xe1\xc7\xf5\xe7\xaf\x76\xfc\x4a\xb4\xac\xc0\x41\x89\x4e\xe0\x16\xa3\x33\x34\x87\x2c\x2e\x6b\x04\xff\xe1\xe5\x7f\xfe\x11\x4d\x97\x5a\x5f\x03\x43\x4c\x71\x85\x2b\xd7\x01\x54\x11\x36\xd7\xab\x08\x22\x37\x4e\x6e\xf4\xf8\xa9\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x47\x0f\xe4\xe3\x49\x49\xee\x4e\x82\x2d\x34\xae\xf8\x3c\xee\xad\x67\x39\xb2\x89\x93\xfc\x6c\x1b\x4e\x34\xaf\x68\xb1\xdc\xd5\x99\x76\xc5\x4b\xd0\x82\xdf\x1b\x67\xce\xfa\x51\x0d\xa8\x5e\x1a\xde\xb4\x15\x4c\x1c\xfa\xde\xf3\xf3\xb5\x92\xac\x52\x1f\xa5\x3a\x09\x03\x69\x07\x41\x54\xdb\xec\xca\x9d\x63\x53\x18\x5d\x37\xb9\x25\x9e\xb0\x31\x37\x5f\x87\x24\xda\x1b\xf7\x3d\xae\xaa\x29\x2e\x6e\x6f\xf8\x3b\x3e\x97\x1f\xd8\xb9\x10\x5c\xf4\xc7\x5c\x61\x7d\xa7\x2f\x5a\x76\x0b\x55\x74\x3b\x32\x5a\x3e\xb7\x98\x42\xc7\x1f\x10\x8c\x2e\xaa\x33\x6e\x94\x86\x1e\xd4\xa9\x24\xce\x07\xd7\xb5\x4c\x1e\x68\xe7\x68\x63\x88\xe8\x3e\xc7\x26\xe0\x93\xde\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\x29\xc7\x72\x64\x2e\x00\xb8\x81\xb5\xaa\x55\xe3\xaa\x8a\x8d\x12\x84\x22\xe0\xfb\xe8\xe2\xd4\x7b\x70\xe4\xd5\xce\x4e\xf7\x67\x9b\x8c\x37\x37\x7f\x03\x7b\x91\x2a\x49\xaa\xd9\xc8\xb0\xbd\x78\xb7\xd6\x01\x68\x57\x07\xf6\xca\x8b\x67\x0a\xda\xbd\xd1\x76\xc7\xab\xb6\x26\xaf\xc9\x1d\x2d\xe2\x02\x98\xbd\x55\xe9\xbd\xcd\xb9\xe9\x2b\x2a\x81\x04\x68\x5a\xf1\xe2\x16\x95\xf6\x97\x01\x54\x7e\xb5\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x3a\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xdf\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\xc7\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\xbf\x0d\xdf\xc2\x1a\x33\x96\xa7\x1c\xf2\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\xef\xbe\xcc\x10\x0c\x4d\xcb\x91\xe8\xcd\x0b\xf3\x41\xe8\x1a\x2b\x6b\x1f\xb9\x28\x3b\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xbb\x9a\x84\x75\x44\x7d\x8d\x9b\xf1\x2d\x59\x46\x6e\xb8\xc4\xe3\xf2\x18\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc2\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x27\x31\x63\x33\xea\x40\xbb\xbe\x72\x7e\xec\x16\xae\x7f\xe3\xe8\x4f\xfc\x95\x63\xbe\xf5\x35\x5d\x34\x30\xbe\x2f\xf5\x9e\xf1\x9d\xcf\x24\x4e\x93\x90\x4e\x70\x3b\xd9\x9d\xd1\xbf\x8e\x7a\x0e\x2d\x73\x32\x03\xd3\xd7\x3a\x9a\x8e\x4d\x51\x80\x84\x0e\xe8\xa3\x68\x1b\x45\x07\xdf\x1d\xec\xf4\x8e\x33\x2b\x23\x78\x83\xe7\x60\x99\xee\xc3\x02\xad\xf6\x29\xe4\xa0\x5d\xf0\x7b\xf3\x7b\x83\x2e\x69\xec\xb7\x48\xd9\x11\x99\x2f\x78\xd2\xea\x18\xe4\xa0\xdb\x11\xd6\xba\x36\x5c\x85\xf7\x78\x89\xb0\xe0\x2d\x4b\x4a\x83\x86\xc0\x88\x0f\x9c\xbd\x5f\x19\xec\x25\x67\xc4\x05\xe9\x53\x5a\xb9\xe9\x38\xcc\xa9\x34\x78\x05\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x7a\x47\xae\x6c\x8d\xf3\x20\xa8\x72\x31\x9b\x70\x29\xe9\xb4\x82\xc4\x2d\xc5\xd1\xb9\x29\x00\xbf\x3e\x50\x0f\x1c\x81\x11\x73\x11\xb2\x95\x26\xf4\xf0\xd0\x9c\xe0\x10\xf0\xa9\x1b\x48\x40\x7d\xec\x97\x26\x09\xeb\xba\xa2\x49\x5e\x7a\x4d\xd2\xdc\x7b\x3b\x1d\xab\x2b\x7c\xbf\x0f\x92\xe4\xbd\x8d\x0d\x74\x95\xed\xa9\xab\x9c\x0c\x1f\xdd\x0b\xaa\xec\xe1\xbe\xa7\x92\xa0\x43\xf0\x4a\xac\x6c\xc6\x24\x82\xe6\xd0\x87\x95\x58\x01\x3f\x07\xc1\xb2\x58\x3d\xba\xfb\xb0\x4a\xeb\xf2\xa4\x43\xe0\xdf\x5b\x07\x56\xb7\x82\x56\xfa\x77\xf7\xf2\x02\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x65\x12\x17\xce\xc5\x0c\x85\x22\xd1\xc6\x2f\x83\x6a\x12\x0b\x2c\x11\xe3\xa8\x26\x18\x00\x9a\xfa\x76\x71\x52\xb0\xc7\xd5\x9c\xaf\x0f\x66\xb3\x9b\x6b\x2c\xbc\x10\xac\xb8\x7e\x4d\xa5\x15\xcf\x5a\x8e\x58\x0b\xc4\xc0\x3a\x6a\x5c\xa6\xa4\x76\x07\x73\xda\x2d\xde\x71\x07\x9a\x5c\xed\x49\x77\x71\xac\xf4\xe5\x29\xfa\x31\xb2\x25\xc8\x75\xf3\x2d\xe0\x04\x37\xb8\xe5\x3a\x90\x4c\x52\x34\xdb\x3c\xab\xc3\xf5\xd7\xe2\xda\x58\x37\xf7\xd8\x77\x38\xa1\x0f\x9f\x1e\xea\x28\x90\x85\x0e\x23\x6a\x42\xea\xb6\x06\x8a\xcd\x78\x4c\x63\xf2\x76\x41\x09\xef\xee\x99\x13\x46\x04\xb6\x71\x05\x07\x11\xb5\xe4\x2b\x58\x72\x96\x7a\x20\x3e\xb1\xe1\xb4\xbc\xff\xb4\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x72\xda\x6d\xc4\x64\x93\xc6\x92\x73\xd4\x2b\xd4\x5c\x66\xf3\x07\x9c\x9f\x7a\x51\xfe\xd9\xd2\x3b\x5c\x11\xc3\x61\xef\x44\xc3\x4e\x95\x09\xd9\x4e\xf7\xd5\x6c\xb4\xf6\x21\x98\x1d\x9b\x41\x0f\x8f\x5a\x90\x99\xf4\x89\x17\x2f\xd0\xa1\x69\xe3\xc0\x90\xec\xee\x56\xc9\xb5\x6b\x75\xfe\xd0\x24\x54\x6e\xcd\xb7\x5e\xe7\x0f\x0d\x06\x9c\x46\xb3\x17\x0b\xf7\xdf\x64\x81\xef\x08\x70\x1a\xd3\x0a\x8b\x0a\x40\xe9\xd7\x66\xca\xd0\xb4\x55\x88\xb0\x3b\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xdb\xc3\x1f\x4f\xaf\x20\x69\xe9\xc8\xb2\xe5\xdb\xf1\xb5\x12\xf8\x01\x56\xc6\x10\xbc\x6e\x1f\xf7\x1b\x72\x63\xd7\xdb\x05\xf4\x13\x37\x17\x7a\x6c\x75\xab\x5a\x5c\x01\xf5\x73\x51\xb5\xfa\x2e\xdc\xd9\xce\xce\xef\x03\x4f\xf1\xe4\xe5\x74\x81\x5b\xe2\xef\xd7\x34\xea\xb8\xe6\x38\xa8\x67\xc1\x7e\x5d\xa3\x21\x8f\xae\xf1\xb0\x81\x84\x72\x4d\xd1\x39\x90\x9e\x98\x32\xcc\xc3\xb1\x77\x71\x1c\x3c\x03\x4a\x27\x98\xe4\x6f\x57\x93\x74\xcd\xc3\x08\x35\x5a\x76\xee\xc3\x8f\x38\x0c\xf9\x8e\x41\x84\x23\x3a\xcf\xae\x67\xbc\x24\xdb\x57\x15\x4a\xdb\xe7\x97\xb6\xcd\x20\xf1\x89\x32\x7b\xeb\x98\xd2\xb9\x50\x90\xc4\xe4\xf8\xc9\x62\x41\xca\x36\x42\xe5\xba\x98\x19\x30\xd0\xa8\xf7\x3a\x8c\x0a\xcc\x4a\xaa\xf7\x8a\x49\x05\x30\xaf\xd7\x87\xcc\xea\xff\xae\x41\x11\xd6\x2c\xf5\x1f\x5e\x46\x30\xaf\x01\xc4\x7a\x4d\xdd\x1e\x85\x55\x7b\x2d\x61\x02\xa8\xa4\x25\x41\x53\x52\xf0\x9a\x00\x76\xb8\xe1\xcc\xe8\xe3\x8e\x52\xc1\x27\x90\x98\xc8\xb1\x19\xda\xb6\x5d\x0a\x1c\xa1\xf6\x42\x77\xc7\x48\x7a\xae\x7d\x01\x68\x31\xbd\xd6\x54\x74\xcd\xeb\x79\x34\xb0\x0d\xbf\x32\x88\x33\x84\xbb\xa2\x9d\x7a\x04\xdb\xf6\xe7\x73\x92\x69\xba\xa5\x1a\x93\x3b\x0a\xf4\x03\x27\x58\x4a\x3a\x67\xe3\x86\x97\x63\xdd\xec\xc9\x6f\xf4\x7f\xb7\x3e\x4a\x91\x02\x40\xb7\x75\x4d\x2a\x90\xcc\xcf\x7d\x7e\x5c\xbb\x66\x4f\x4b\xf7\x93\x39\x44\xce\x3a\x83\xfc\x82\x95\x85\x9b\x51\x65\xd6\x2b\x66\x99\xae\x37\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4a\x2a\xf9\xa9\xed\x02\x18\x87\x98\x1e\x6c\x99\x80\xe5\xae\x1d\xbc\x71\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x49\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x65\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xe1\x7a\x0d\x24\x23\x03\x20\xc8\xd6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xed\x2f\x21\x3b\x82\x55\x4f\x0b\x14\xc8\x35\x77\xc0\x8c\x57\x15\xbf\x07\xfe\x1b\xd3\x87\xc0\xfd\xb9\x3d\x8f\xcb\x58\xae\x54\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x51\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x26\x67\xf1\x7f\xfc\x83\x24\x62\x5b\xaf\xa2\xfd\x73\x41\x24\x6f\x45\xb1\x75\x3e\xa7\xfd\xf3\xd5\xd5\xc3\x4d\x73\x2a\x6a\x2e\x26\xa6\x86\x78\x9e\x97\x4a\xf2\x4e\x6f\x3f\xb7\x25\x32\xbd\x13\x8a\xd4\x67\xed\xe7\x4c\xbe\x11\xbc\xdd\xd6\x8a\xfb\xf8\xcb\xce\x16\x98\xb9\xfc\x82\x4c\x23\x5f\xca\x42\x55\xb1\xd3\xb8\xc0\x82\xd8\xda\xa4\x5a\xb9\x94\x0d\x2e\x32\xcd\x9e\x2f\x1b\x9a\xf1\x75\x19\xd7\x43\xb6\x4d\x53\x91\x9a\x30\x85\x2b\x78\x6d\xae\x8d\xb8\xf6\xde\x94\xc5\xee\xae\x9c\x9f\xfe\xe3\xe7\xa7\x39\x9d\x1f\x6f\x22\xc7\x59\xfd\x54\x0b\xe9\x27\xf7\xe3\x2d\x14\xb8\xc1\x53\x5a\x51\xad\xfa\x3c\xc5\xfb\x5d\x78\xfd\x8a\x73\xf5\xbd\x87\x05\x3e\x45\x4b\x8d\xa0\x77\xb4\x22\xf3\xad\x43\xab\x9f\xb7\x9d\xf4\x45\x3a\x71\x4d\x9c\xcb\x02\x57\x31\xa9\x31\x9f\x39\x12\x5e\x40\x5c\xe7\x49\x16\x24\x4d\xf4\x7c\xc6\xcb\xb7\x17\x44\xd1\x0a\x7c\x2c\x4e\x31\xc2\xa9\x13\x8f\x2a\x8c\x43\xd3\xa4\x3b\x2c\x1f\xab\x2e\x6f\xcb\x9c\xb2\x39\xea\xd5\x31\x6c\x85\x20\x4c\x55\xcb\x20\xee\x0a\xbc\x1c\x46\xf1\x06\xa5\x18\xf4\x72\xab\x5c\xc6\xb8\xf3\x4e\xbd\xbd\x65\x29\x3f\x6a\xbc\xd4\xda\x68\xe0\xce\x99\xb5\xc0\x35\x03\x06\x80\xa9\x38\x0b\x70\xab\x28\xe2\xb2\x0d\x85\x86\x78\x43\x58\xb7\x85\x4f\xac\x7b\x75\xac\xb7\x76\xaf\xf4\x90\xb1\x4e\x8f\xeb\xf2\x37\x4d\x85\xd5\x8c\x8b\x7a\xec\xbc\x28\xe3\x9e\xe5\x1a\xd1\xad\x33\x48\x83\xf7\x90\x10\x43\xfb\x64\xaa\xb3\xb3\xb2\x22\x81\x55\xea\x17\x80\x95\x26\xf6\x89\x5a\x26\x48\xc1\xe7\x0c\x0a\x01\xd8\xdf\x82\xbd\xe5\x9d\x46\x58\x6a\x8b\x10\xb1\xb6\xaa\xb6\xee\x5b\xa4\x2d\xcb\xef\x88\x58\x10\xbc\xe5\x29\x4c\xdb\xe0\x1f\x6c\x9b\x48\x90\x46\x10\x09\x13\x6a\x22\xf0\x46\xc7\xf7\x9d\x42\x58\x4a\x5e\x00\xa9\xb1\xc9\x31\x74\x74\x63\x18\x2c\xcd\x19\x17\x08\xa3\x39\xbd\x23\x0c\x5d\x99\xdd\x70\x56\xe1\xed\x69\xb6\x02\xb7\x9d\xf3\xd0\xe3\x56\x71\x9f\x7f\x8a\xb0\x42\xb8\xac\x29\x90\x3c\x18\xe2\x02\xeb\xd5\x0c\x5b\x0d\xbe\xa2\x77\xa9\xe0\x90\x8d\x88\x2e\xb6\xcd\x4f\xfd\xac\xf7\x42\x52\xa6\xc3\x11\xf8\xe9\x02\x0b\xd1\xe1\x27\x7c\xed\x74\x54\x40\xe8\xdd\x55\x97\x89\x98\x9e\xcf\xe9\x90\xe5\xd7\xd0\xd7\xc0\xa6\x46\xad\x6f\x6b\x81\xef\x0c\xda\xa2\x5b\xe2\x4a\xab\x19\xdb\xaa\x91\x92\x98\x1a\xf0\xbd\x7e\x99\xbc\x43\x17\x10\x01\x3e\x5a\xf0\xac\x75\xd1\x91\x09\x2f\xaf\x1b\x52\x8c\xba\x2d\xe8\x16\xdc\x11\x75\x38\x0e\xb1\x2d\xfb\x13\x48\x41\xe3\x51\x11\xc6\xc9\x5c\xea\xdd\x1a\x76\x32\x84\xbd\x50\xd5\x63\x25\x01\xbb\xbe\x93\x17\x06\x2b\xf1\x2f\x22\xb6\xce\x4c\xda\xe0\xcd\x9b\x53\x75\x7c\xfb\x27\x70\xe5\x11\xb6\xc0\xac\x00\x4d\x5e\x9e\xdc\x92\x46\x9e\x48\x3a\x37\x9e\xbb\x3f\xfe\xe9\x4f\xe0\xc6\x73\x8b\x73\x72\x75\x7e\xfa\xfa\xfd\xf9\x71\xbd\x9d\x5a\xb6\x53\x9f\x5e\x83\x95\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\x5b\x76\x34\x92\xd3\x33\x95\xc7\x33\x89\xbb\x33\x23\x5f\x67\x23\x08\xa9\xe1\x06\x89\x21\x25\x48\xbb\x80\x26\x2b\x6d\x3b\x4d\xcb\xfe\xa4\xef\x15\xd7\x3d\x36\xd7\x57\x8d\x34\xd7\x4f\xc5\xef\x81\x18\x86\x72\xad\x38\x6f\x1f\xb0\x02\x35\xee\x92\xdc\x11\x31\x72\x7d\x78\xa7\x5f\x39\x89\x7c\x63\x88\x98\xd8\xf4\xbe\x48\xe6\xbd\xc8\x0d\xe2\xe6\xe5\x39\x57\xf2\x06\x88\xee\xec\x68\x41\x70\x1f\xa3\x1f\xb1\xa0\xbc\x95\x56\x43\x46\xda\x08\xe7\x0c\x94\x0c\x43\xa4\xe0\x2f\x7b\x88\xdb\x98\xac\x8b\x6d\x85\x8c\x6b\xd2\x33\x17\x97\x96\x85\xca\x4f\xfd\xa9\xbf\x24\xcf\x36\xdf\xda\x74\x5b\x13\xb1\x11\xe4\xce\x0d\x43\x38\x2a\x22\xa2\x4c\xc9\x0e\x3f\x2a\x63\x11\x6c\xbc\xa2\x9d\x42\xb3\xad\xb3\x20\x98\x32\x68\xd4\x8d\x11\x2e\xb4\x98\xd0\x2d\x14\x77\xa2\x73\x47\x28\x06\xeb\x66\x9c\xf6\xc1\xa7\x71\xc7\x2c\x5e\x38\xc6\xb2\xf5\x35\xab\xb3\xf1\x9c\xfb\xff\x62\xd6\x43\x5a\xfa\xc8\x7f\xc7\x0c\xeb\xa7\x11\xbd\x30\x07\x02\xae\xfa\x71\x21\xa8\xa2\x05\xae\x5e\x44\x00\x6c\xdd\x8b\x8a\xaa\xd5\x06\x57\xf8\x2e\x41\x90\xba\xe7\xa6\x4f\xb8\x42\xb7\x64\x79\xcf\x45\xe9\xb4\xbf\x10\x6f\xbb\x6d\x28\x5b\x6f\x0c\xa9\xdc\x70\x00\xaf\xaf\x45\xb2\x89\xf4\x88\x9a\x08\x34\x25\x0e\x9c\xb6\xf2\xe5\xe5\x31\x3a\x65\x4b\xa3\x78\x45\xd8\xff\x3e\xf0\x12\xd4\x92\x05\xed\xd6\x58\x22\xbd\xd3\x60\xb5\x1e\xd7\x37\xac\xa2\x8a\xca\x6d\x46\x16\x69\x93\xc7\x0b\x1e\xa7\xb7\x3a\x68\x11\x17\x96\xf5\x16\x04\x92\x30\x1c\xc1\xdb\x42\x88\xed\xcb\x9e\xe5\xb6\xd0\x5a\x3f\x65\x44\xca\x37\x7a\xc3\xee\xee\xcc\x60\x50\xc0\x6d\x5f\x80\x27\xb7\x63\x97\x22\x5a\x32\x99\x8c\x3f\xad\x12\xf0\xb2\xfb\xe6\xb6\x4b\x7a\xea\xa0\x32\x60\xed\x18\x06\x6b\xdd\x34\x55\x32\x8c\xbf\x9a\x38\xa9\xfe\xc6\xe9\xe5\xb6\x51\x3a\x4b\x91\x65\x54\x68\xd9\x8d\xb1\xab\x2e\xda\x1f\x25\xd8\x62\x96\xd6\x88\xfc\xb3\xc5\x15\x00\x2f\x6f\x44\x4b\xb6\x2d\x4c\x1c\x65\x70\x10\x75\xcf\xc5\xed\xc9\xb7\x7f\x7a\x09\x36\x87\xef\xdd\x78\xbe\xf5\x15\x15\x9b\x2e\x1e\x95\x28\xbe\x52\x3b\xbd\xbc\x0a\x37\xb2\x5b\x4b\xe7\xd0\xb0\x90\x5a\x53\xd0\x43\xef\x00\xbf\x40\x51\x50\x85\xa8\xb4\xf0\xf8\x84\xf0\x71\xd7\xdd\x9b\x65\xb3\xbd\x92\x14\x9f\xcb\xdd\x6b\x37\x19\x33\x7a\x16\xbe\xcd\xac\x8a\x34\x4b\xe2\xdb\x09\x90\x0f\x07\x32\xf8\x18\x18\x76\x40\x9a\x03\x22\x07\x6e\x98\x65\x93\xc0\x26\x94\x05\x10\x19\x09\x37\x71\x0e\x36\x20\xfd\x78\x56\x99\x7b\xd5\x6b\xd9\xde\xa4\x4e\x2d\x58\xf9\xa5\x2f\xa0\x61\x29\xa3\xb6\x55\x4f\x0c\x89\x28\xd4\xb8\xf4\x05\xd3\xac\xf3\x07\x70\x5d\x95\x36\xe3\x4a\x43\x86\x8a\x85\x32\x0a\x73\x2c\xbe\xa0\xa3\x91\x29\x09\xc2\x77\x98\x56\x00\xa6\x07\x57\x12\x97\x3d\x6c\x8d\x19\x6c\xc1\x99\x6c\x6b\xe8\xd1\xb6\xa1\xb4\xe9\xd2\x6a\x13\x31\xfe\x4d\x6a\x38\x22\xab\x66\xf1\x71\x36\xf9\xed\x55\xb3\xd7\x4b\x86\x6b\x5a\xb8\x55\x3c\x35\xcb\x06\x3c\x94\x3d\xf6\xf9\x78\xaf\xac\xee\x7e\x5d\xb7\x4a\x4f\x6d\x8c\x72\xb2\x8b\x9b\x21\x22\xec\x03\x97\x49\x70\x14\xc2\x94\x0c\xf2\x80\x0b\x55\x2d\x21\xa2\xd2\xfb\xd2\x08\x11\x0a\x69\xab\x06\xcd\x5e\x6d\x4f\x98\xc2\x85\xdd\x59\x46\x9f\xed\xbd\xfd\x86\xd4\x0d\x90\x21\x5a\x05\x5e\x1a\xd6\x60\xd5\x0a\xe6\x78\x50\x57\xfe\x62\xeb\xe6\x03\x4c\x63\x44\x1a\xda\x85\x42\xb8\x2c\x25\xc2\xbe\x16\x13\x55\x46\xf1\x6e\x19\xfd\x67\x4b\xaa\x25\xa2\x25\x61\xaa\xc3\xbd\xf5\xa7\xd8\xd2\x45\x59\xf9\xb0\xbd\x58\x3f\xeb\xce\xb7\x51\xf7\x09\x29\x5d\x01\x23\xeb\x4f\x7e\x64\x4d\x8d\xfb\x17\xcc\x04\xad\xab\x47\x98\x09\x3b\xd2\x09\x22\xc8\x5d\x52\x54\x81\x58\x42\x83\x1c\x59\x23\x10\x86\xdd\xbc\x91\x0c\x07\xb5\x89\x57\x15\xab\x5b\x29\x02\x3f\x69\x9e\x8e\x72\x41\x5f\x80\xe8\xf5\xe5\xf5\x2f\xef\x4e\xff\xfb\xfc\xdd\xb3\x13\x49\xf6\x54\x85\xed\xbd\x1a\xe6\xc9\xb1\x04\x57\xab\x1d\x59\x0d\x8b\xaf\xc8\x1f\x67\x81\x5b\x7d\x4e\xc6\x32\x11\x31\x87\x1a\x33\xd5\xd7\x5d\x42\x40\xd4\xbb\xce\x03\xe1\xcd\x67\x1b\x86\xa4\xaf\xe2\x8d\x72\xd7\x57\x14\x8b\x6a\xd7\xc4\xb5\x76\xbb\x77\xc2\x91\xec\xc5\x1e\xea\x4d\xed\xc7\xf7\x92\xfb\x6a\x54\xa3\xeb\xfb\x30\xeb\x9e\x02\x92\x6d\x7f\x3b\x07\x89\x65\xc0\x2a\x64\x82\xaf\x18\x31\x72\xbf\xaa\x2e\x98\x9b\x5c\xff\x45\xec\x9e\x9a\xf2\x96\x95\xe6\x76\xb3\x43\x30\xbe\xef\x30\x23\xa8\x24\x15\x51\xce\x73\x95\xa6\x20\x20\xa7\x66\x03\x51\x2c\xf8\xbc\xe0\xdd\x46\x71\x87\x7a\x69\xee\x0c\x79\x89\xac\x3f\x19\x21\x5c\x71\x36\xb7\xec\xc4\x51\xcd\x76\x6c\x01\x3e\x8a\x30\x5a\x9b\x6c\x28\xb9\x8b\xed\x35\x61\xfa\x62\x75\x9a\xf4\xcd\x1a\x2e\x97\x6e\x53\x90\x82\x8b\xd2\xf8\x74\xf4\xc4\x1b\xf7\xcd\x71\xef\xc4\x5d\xc3\x67\x44\x46\x6f\xac\x8d\x7a\x37\xcc\x2f\xe3\x50\xd4\x63\x1e\xf8\xc8\xc0\xf0\x31\x9a\x4e\x54\x73\x2b\xa1\xf2\x9e\x28\x0f\xb8\x23\x04\xaf\x50\x53\x61\x46\x6c\x35\x11\xef\x80\xcd\x32\xcd\x83\x5c\xff\xd4\xf3\x15\x24\x65\x7a\x13\x7f\x17\x8e\x0f\x4f\xd9\x6c\x0a\x23\x60\xc3\xc3\xc2\x67\xe8\x6c\xf2\x03\x6c\x93\xf7\xa4\xe6\x62\xd9\x75\xd2\xab\xe8\xfa\x14\xe0\xad\x85\xf5\xe6\x9c\x1e\x6d\x2e\x59\x88\xa0\x73\x10\x2f\xcd\xb1\xb3\x28\x1d\xdd\x93\x77\xb4\xa6\x0a\x72\xcd\xb6\x8d\x0b\x15\x4d\xfb\x62\x84\x5e\xd4\x30\x14\x88\x2c\xa1\x17\x8b\x76\x4e\x1a\x3c\x27\x72\xfc\xa2\x2f\x9e\x25\x32\x34\x3d\x2b\xde\x1f\x2c\x88\x09\x7e\x38\x24\x63\x8a\xe3\xc0\x04\x5b\xf5\x4f\x8c\x8c\xe7\x02\x43\xf8\xc6\x89\x13\x6e\x4a\xb7\xd8\x2e\xe1\xc0\x6d\x11\x25\xbd\xb5\x6d\x20\x60\x9a\x47\xc6\xc7\xa4\x27\xd6\xbf\x5e\x2e\xb0\x00\xfb\xba\xd6\x57\x52\x7f\x75\x70\x94\x1a\xb0\xad\x57\x47\xdb\xb7\xef\xc8\x1d\xa9\xba\x2d\x69\xfd\x33\x5b\x36\xbc\x7d\x2d\xc1\x68\x43\x35\xde\x6e\x2c\x22\x5c\x9c\x28\x8b\xba\x69\xf7\xb1\x16\x53\x9d\x72\x29\xf5\x51\xf7\x67\x7b\xd4\x4b\x82\x0e\xd3\x9b\xcc\x1f\xc7\x94\x56\x02\xef\x83\x3e\x3c\x1d\xef\x7b\xc8\xc3\x1f\x75\xc3\x05\x27\xa9\x24\x0d\x61\xa5\x2b\xca\x1c\xf1\xae\x27\xf2\x12\xa2\x8f\x78\x0a\xb5\xb4\x2b\x30\x03\x39\xe3\x30\x7e\xfa\x6c\x77\xa7\x6f\xfb\x2b\x34\x85\x99\x38\x9a\x97\xb8\xb7\x29\x1f\x75\x11\x6a\x2d\x84\x30\x25\x96\x16\xf7\x79\xad\x37\x56\x5f\xba\xc6\xab\x0c\xd1\x84\xc4\x69\x74\xc4\xd1\x54\xc2\xa9\x44\xc2\x29\x34\x9a\xd9\x6a\x7c\x7e\x84\xc9\xbd\xb7\xd8\x60\x09\xac\x8b\x91\xd8\xda\x38\xc8\xa2\x90\x27\xbc\x44\xf7\x00\x26\xe8\xd3\x2c\x98\x32\xc2\x17\xba\x5b\xb7\x5d\x79\x34\x77\x8f\xba\x18\x48\x74\xd3\xd6\x8f\x96\xcc\xa4\x9d\x81\x69\xca\xa2\x97\x77\xbd\x11\xac\x7a\xd6\xf3\x56\x14\x0b\x2e\x09\xb3\x18\x78\xe1\xbe\xc0\xfa\x71\xe7\xd2\xdc\x83\x49\x75\xa7\x2d\xdd\x07\xb9\x23\x62\xa9\x20\x00\xea\xe9\x8f\xad\xdf\x53\xae\x44\xbf\x02\x8c\x73\x74\xc3\x20\xb3\x6d\x52\x00\xe0\x5b\x66\xce\xe7\x0a\x23\xdd\xc9\x8e\xc8\xcb\xcf\x14\x29\xda\xf2\xd1\x32\x41\x81\xa5\x9d\xa8\x48\xd6\xc2\xe8\x38\xf5\x81\x99\x12\x3f\x40\x41\xe1\xce\x34\x2a\x78\xdd\xb4\x2a\x88\xcd\xba\xd8\x6d\xcc\xea\x27\x51\x5c\xd4\x98\xe1\x39\x19\xfb\x8e\x8c\x83\x3c\xa4\x48\x15\x22\xf2\x42\xcd\x01\x91\x47\x5f\x12\x4c\x1e\xc5\x43\xe5\x51\x06\xb8\x3c\x4a\x85\xcc\xa3\xbc\xb0\x79\xd4\xdd\x4a\x3b\x39\xba\xde\x53\xb0\x72\x78\x6d\x35\xf0\x8f\x1d\x5e\xa7\x09\xc6\x9c\x5e\xa0\x1a\xb6\x2d\x53\x89\x78\x4d\x95\x83\xe5\x05\x7a\x02\x70\x8d\x86\xe4\xa6\x56\xd0\x00\x28\x12\xc3\xfd\x49\x1e\xfe\x7f\xf6\xfe\x86\xbb\x8d\xdb\xda\x17\x87\xbf\x0a\x96\x72\xd7\xb2\x94\x92\xb4\x9d\xa4\x2f\xc7\xb7\x4f\xbb\x14\x49\x6e\x75\x13\xdb\x3a\x96\x92\xac\x3e\x4d\xef\x09\x38\x03\x92\x38\x9a\x01\x26\x00\x46\x32\x7b\x7b\xbe\xfb\x7f\x61\x6f\x00\x83\x21\x29\xd9\xc2\x40\x22\xe5\x6a\xba\x56\x63\x91\xc3\xc1\x1e\x60\x63\x63\xbf\xfe\x76\x53\xf1\x82\x9b\x08\xf9\xb9\x4c\x31\xb7\x22\xf0\x5a\x69\x4d\x70\x5e\xfb\xea\x78\xe8\x1a\xe9\xed\x3b\x97\x92\x1e\x68\x2f\x10\x59\x8d\x7d\x28\x18\xf3\x9e\x96\x27\x69\xf6\x24\xcd\x3e\xf1\xfa\xdc\xa4\x99\xeb\xe2\xfc\xf0\x15\x40\xef\x71\x60\xd2\x74\x15\x3f\x6b\x1d\x66\x03\x8a\x6b\x42\x34\xdf\xd5\xfa\x1c\x42\x0f\xfa\x11\x79\x27\x5e\x63\x6f\xd0\x11\x96\xff\x4c\xc8\xa9\x20\x5a\xd6\xae\x8f\xe9\x07\xa3\x47\xa8\xf1\x52\xa2\xdb\xa9\x66\x4e\xdf\x95\x9a\xf9\x42\x61\x57\x6d\xdd\x30\x85\xa2\x2f\xb1\x54\xc8\x4a\x2b\x24\xea\x9e\x21\xc2\xae\xa5\xba\xac\x24\x2d\xf5\xf3\x46\xe2\xff\x8d\x03\xc4\xde\xf3\x2f\xdc\xba\x8f\x9b\xbb\x43\x88\xa4\xa6\x9b\x47\x35\x98\x0f\x5d\xa4\xf1\x7e\x65\xec\x5e\x06\x6a\xaf\x82\xb5\x1f\x33\x06\x24\x37\x4c\xa2\x26\x73\x25\xdb\xc6\x47\x03\x3b\xb4\x60\x6b\x8a\xdf\x35\x6b\x48\xda\xc9\x88\x62\xb7\x58\x6e\xd0\x27\x24\x98\xf3\xe0\x79\x60\x9d\xdd\x09\x16\xa5\xd6\xa3\x8d\x98\xed\xaa\x15\x09\xa5\x0e\x58\xf7\x2a\x55\x07\x2c\xc9\xc8\x5e\xc5\xe6\xb4\x58\xee\xf5\xa9\xda\x80\x9f\xea\x3c\xe0\xf6\xf8\xb5\xc7\x3a\x52\xe7\x1b\xd2\xde\xd5\x83\x0f\x5d\x6e\xe1\xe8\xc6\xe4\x5f\xcc\x23\xd3\xee\xf5\x7d\xa9\x85\x63\x25\x57\xf2\x7f\x67\xe7\x44\x72\x75\xee\x6f\xff\xf0\xdb\xb1\x07\x3d\x80\xd7\x7c\x88\x7d\xd3\x83\xe8\xdc\x5e\x95\x46\x8f\xdb\xa6\x8c\x94\x5c\x37\xc0\x99\xe0\xea\xee\x4a\x1d\x02\xb9\xf9\x4a\x6e\x36\x0f\xe9\x99\x21\x71\xc0\x61\xab\xc1\xc5\xfc\xc1\xab\x66\xce\xfb\x43\xbb\x7d\x27\x1b\xfa\x6b\xdb\xf5\xa1\x75\x87\x15\x2a\xdb\xd1\x02\xba\x49\x84\xc6\xac\x11\x36\x6c\xe2\xe1\x6a\x59\x63\x9d\x1a\xd0\xab\x3b\x09\x12\x96\x4e\x1b\xba\xf4\x12\xb5\xff\x12\x25\x54\xbf\x30\xdf\x79\xeb\x8e\x54\x74\x88\xb6\x41\x04\x5a\x2d\xb4\x6e\xe0\x90\xf5\xdf\x26\xa7\xb6\xae\xce\xf7\x6a\x20\x83\x1a\xac\x27\x81\x3c\x08\x07\x4b\x81\xdd\x57\x20\x4d\xa4\x96\x57\x80\x09\x6a\x75\x8a\x99\x61\xea\x9a\xaa\xf2\x8e\x67\xfe\x56\xab\x6a\xfa\xaf\x0f\xdc\xd6\x61\x81\xc0\xc1\x79\x86\x18\xa8\xf3\x96\xaa\x12\xca\xa8\x3a\x9e\x78\x4a\xa4\xdd\x74\x6d\x3d\x91\xd6\x15\x4b\x47\x02\xe0\xee\xa1\x64\x7f\x9d\x50\xab\x07\xf5\x9f\x84\xb1\x12\x28\x6b\x5b\x49\xc7\x82\xc2\xe8\xa7\x74\x99\x3b\xb9\x88\x57\xf0\xc1\x1e\xf4\xac\xe9\x0f\x4d\x16\xb2\x2a\x41\x59\x1d\x57\xec\x8a\x55\x81\x34\x2b\x70\x15\x9f\xb6\xc6\xe1\x2c\x15\xb2\xae\x5d\xc9\xbb\x6b\x3e\x8f\xe5\xf1\x77\x36\x76\x10\x16\x90\x56\xaf\x7a\x10\x0b\x70\xba\x4c\x2c\x79\x0c\x38\x23\x7e\x4b\x30\x21\xbd\x52\xe0\x8e\x41\x39\x23\xcc\xb2\x69\x02\xfb\x6d\x21\x63\x62\x05\x74\x71\x1b\xce\xc5\x15\x12\x7c\xbc\xeb\xd0\x7d\x4c\x24\xa2\x35\xda\xb5\x68\x35\x5b\x6b\x2d\xd5\xc1\x69\x25\xe6\xdf\xbf\x95\x50\x9b\x0e\x8d\xc2\x43\xc0\xb3\x08\xcd\x10\xec\xb1\x0b\x85\xbb\x10\x6b\x95\x7a\x22\x5c\x0a\x71\x32\xac\xda\x20\xe7\xd9\x90\xc8\x3a\x3a\x81\xee\xfc\xc3\x61\x51\xf5\x4a\x16\xb4\x02\x04\xe2\x54\x16\x23\xd9\x82\xaa\xab\xb4\x44\xd8\x09\xd4\xbe\x26\x7c\x56\x49\x5a\x7a\x64\x75\xe6\x9b\x28\x50\xb3\x62\x7f\xa7\xc6\x22\x11\xbb\x04\x47\xf2\x25\x1f\x8d\x62\x11\x84\x55\x6f\x60\x09\x7d\x4b\x52\x07\x7b\xd3\x4f\x23\x70\x6f\x16\x43\x0b\x3a\x52\x06\x0d\xe0\x71\xc7\x66\x20\x8e\x43\x17\x4c\x2b\x2b\xb9\x26\x7b\xdf\xfb\x49\xdf\x1b\xd2\x1b\x3b\xd9\x71\x69\x12\x6b\x89\x73\xf1\x1c\xce\x43\xe0\x33\xf4\x5f\x5c\x72\x3b\x53\xb3\x4e\xc8\x79\x96\x08\x50\x74\x4d\x53\xf1\x74\x2e\xfb\x91\x56\xbc\x0c\x92\x93\xaa\x01\xcd\x61\xc3\xf2\x91\x71\xb4\x49\x1a\xc5\xc6\xeb\x1b\x25\x3d\xe5\xc0\x79\x7c\xbc\xc3\x72\xfc\xd1\xae\x3a\x03\x19\x97\x90\x1f\x04\xec\x39\xc1\x4a\xab\x6d\xc9\x6e\x29\x98\x98\x49\x85\xce\x98\x07\x67\x58\x87\xab\xbd\x8d\x63\xf8\x30\xe0\xb7\xc4\xa0\xcf\xe8\x82\x74\x79\x86\xc0\x93\xe8\xc1\xec\xbb\xcd\xbb\x74\xd6\xbb\x8f\x0b\x2d\x04\x5c\x43\x34\x3b\x73\x2e\xde\x0f\x0c\xf0\x9d\xeb\xe8\x62\x7c\x05\x02\xa2\x08\x5e\xdb\x41\x17\xbc\x41\x21\x46\x8d\xfb\x79\x8a\x70\x80\xd2\x12\xfb\xc0\xd0\xb3\xb2\x91\xe5\xab\x94\x7c\xc4\x97\x58\x99\x22\xaf\x01\xab\xf2\x2f\xa7\xc7\x61\x2f\xdb\xa7\xbe\x3e\x4f\x41\xfb\xb6\xd7\x57\xf8\x5c\xcd\xcc\x9c\x97\x64\xea\x9a\x8a\x32\x43\xf6\x05\xbb\x26\x76\x0f\x68\x57\xf9\x13\x30\x3f\xdc\x6c\xfa\xf1\xc3\xeb\x39\x22\x0e\x12\xa8\xf8\xda\xd5\xdd\x30\xe5\x21\xa6\xa6\xdc\xb5\x48\x7f\xf7\xfe\x99\x07\xea\xbc\x1e\xab\xeb\xf1\x78\x3c\x4e\x99\x3f\xef\x13\x1e\xf5\x56\x3e\x78\x59\x6a\x59\xf2\xd9\x72\x65\xfd\xed\x79\xd3\x91\x04\xba\x37\x15\x4b\xf7\xfe\x8f\x48\x17\x4c\x8d\xec\x45\xe8\x55\xbf\xfb\x26\x4d\xd4\xc4\x10\xfe\xdb\x10\x3b\x1b\xc8\x08\x40\x11\x53\xb6\xa0\x57\xdc\x9a\x00\x33\xdc\xff\x76\x67\xdd\xb4\xfa\x5e\xa3\x49\x96\x05\x0e\x34\x02\x01\xa5\xd8\x87\x46\x6a\xd8\x51\x90\x96\x78\x26\xa1\xf0\xac\x8f\x18\x8b\x7e\xb6\xa6\x81\x56\x8b\x09\x03\xf6\x84\x9e\x8b\xf1\x60\xfd\x83\x9f\x15\x32\xa5\x96\x88\xf0\xca\xfb\x2b\x0c\x9f\xd4\x1f\xf1\xd4\xed\x2a\x70\x99\x08\x49\xd8\x6c\xc6\x0a\x68\x64\xc4\x9a\x05\xab\x99\xa2\x55\x9f\x34\xdd\x16\x0b\x42\xf5\x2b\x6b\x81\x2b\xbb\x41\x51\x59\xad\xe9\x9d\xbb\x0c\x10\x07\xd4\x01\x36\x75\xc9\x93\x52\x3c\x51\xb5\x89\x80\xae\xf7\xde\x89\xf7\x52\x9a\x37\x5c\x83\xa6\xeb\x2a\x50\x30\xde\xb9\x37\xd9\xe0\xe3\xf7\xdf\x85\xac\xd6\xc7\x23\x28\x92\x94\x8a\x0e\xe3\x7d\x1b\x1b\xdc\x1e\x1b\xf6\x34\x0c\x11\x48\x97\xc2\xdc\x48\x2e\xcc\x5a\x33\x22\xab\xd7\x15\x09\x48\x5b\xf6\xfa\x41\x33\x1d\xe2\x74\x5e\x4f\x4c\x03\xc3\xc4\xeb\x0d\x5d\x86\xf2\x53\x87\xac\xbc\xe2\xa4\xc2\x38\xaa\xfb\x6e\x2a\xcd\x62\xcd\x8b\x95\xd6\xc9\xfa\x4c\x96\x2b\x0f\x1a\x75\xa0\x89\x7d\x90\xaf\xd5\x01\x0d\xa4\x67\x5b\x93\x92\x95\x4c\xdc\xb9\xff\x09\x09\xe0\x1c\xd4\x0c\xcb\xc5\xfe\x37\x3a\x4b\x61\x87\xbd\x95\x20\x87\xb6\xb1\xc7\x4e\x23\x08\x48\x98\xef\x78\x47\x81\x97\xc1\x6e\x3d\x0a\x80\x29\x52\x8c\x95\x94\x10\xe1\x4e\x5a\xd6\xd3\x99\xeb\xf9\xbf\xa6\xa6\x5d\x59\xc9\xec\x1b\xab\x43\x23\x52\x42\xbb\xc0\xb9\x91\x84\x09\xdd\x2a\xc7\x13\x77\x06\x42\xb5\x57\x29\x19\x86\xfc\xdc\xeb\xfc\x70\x7a\x4c\x5e\x90\x7d\x68\x15\x0c\x62\x7f\x46\x79\x15\x30\x9e\x56\x5b\xa3\x42\x83\x7b\xfb\x88\xc4\xd7\x0e\x29\x0b\x33\x5a\x69\x36\xb2\x67\x27\x1c\x8d\xee\xbd\xad\x0e\xe2\x55\xee\x86\x29\xc0\xa7\x4c\x4b\x5a\xfe\x1c\xc4\x4e\xea\xf6\x9d\x4a\x59\xb1\x3b\x27\x71\x84\x1e\x29\xdb\x3a\xe1\x7e\x78\x90\x13\x2e\x8e\x4b\xd8\xfd\xdb\x5f\x12\xdc\x72\x35\x33\xb4\xa4\x86\xba\x93\xcf\xdf\xf0\x6f\xcb\x88\x4f\xe7\xdf\xa7\x5d\x43\xce\x3f\xd7\x57\x6b\xdb\xb6\xe4\x06\x32\x82\x2d\xb9\x70\x2e\xa5\xb8\x85\xfd\xf9\x09\xdc\x8f\x7d\x56\x21\xdb\x00\xbd\xae\xde\xc3\x85\x56\x90\x8e\x8a\x6b\x13\xf1\xc2\xc0\xe8\x5a\x50\xdd\x37\xb7\x84\x2c\xfd\x89\x5d\xca\xb8\xfc\x3d\x10\x66\xf9\x50\x06\x32\xc2\xe9\xb7\x72\x5b\x1e\x2b\x0a\xfa\x57\x61\x08\xd4\x99\x50\xef\xed\xce\xd2\xfc\x8a\xed\x25\x15\xe8\x46\xbf\x27\x35\xa3\x42\x13\xc5\x60\xa6\xc1\x8a\x9f\xc1\x0c\xa3\xfb\x4a\x22\x2a\xee\x99\x2c\xc3\xbb\xae\x46\xf9\xbc\x1a\x91\xf2\xae\x08\xaf\x85\xa9\xb4\xba\x92\xd7\xb0\xbf\x2b\xaa\xe6\xde\x59\xa0\x47\x64\xda\x1a\xf4\x3b\x6a\x52\xf3\x0f\xd0\x00\x20\x74\x27\x83\xd9\x68\x45\xf4\xc1\x99\x2c\x75\x28\xee\x0f\x40\x3f\xce\x68\x96\x31\xf6\x0f\x38\xc5\x53\x26\xaf\xb7\x1c\x50\x5f\x01\x8e\x51\xc2\x2a\x3e\x87\x1e\xd6\xf1\x6c\x81\xf7\xed\x97\xb1\xf4\x89\xc5\xbf\x10\x57\x91\x01\xbf\x4f\x9e\xb3\x80\x28\xe0\x56\x47\xfb\x40\x18\x75\xe0\x9a\xf1\x6b\xbb\xf0\x6c\xf8\xb8\xb7\xb9\x12\xb7\x8c\x4b\xf0\x6a\xa4\xc6\xbe\xdd\x56\xb3\xdb\x38\x38\x02\x2c\x7c\x6c\xc9\x52\xa8\x38\xf1\xf3\xed\xe7\x9a\x42\x22\xe7\xd8\x28\xc6\xc8\x6b\x3e\x55\xcc\x8a\x1b\xc1\x2a\x18\x92\x9f\x1f\x9d\x9f\x76\x5c\x65\x3f\xb2\x73\x17\x7d\x98\x40\xc2\x35\xa4\x84\xdb\x67\x94\x8a\x5f\x31\x45\xec\x19\xd2\x42\xf5\xb7\x9f\x64\x2f\x11\xa6\xcb\xd0\x1c\xc0\xf5\x73\x84\xef\x81\x99\x30\x4f\xdf\xf9\x88\x79\x4a\x19\xc1\xd1\xf9\xe9\x31\x52\xc0\x85\x36\xd4\x6a\x79\xe4\x1d\xc0\x50\xc6\x93\x43\xc1\xbb\x42\x14\x1b\xc3\xd2\x57\xac\x24\xca\x4b\x82\xea\xce\xdd\x2e\xc8\xda\x66\x40\x1d\x20\xc2\x74\x05\x3f\x1c\x1c\xa5\x6e\x3a\xe0\xf6\x1e\xc2\x40\xd4\x83\x21\x69\x3b\xae\x3a\x91\x60\x65\x3f\x65\xb4\xd1\x0a\xf1\x03\x5c\x4e\x77\xa7\xa1\xe4\xfa\x36\x22\x40\x0e\xbe\x67\xb4\xfc\x49\x71\xc3\xde\x89\x82\x45\x32\x25\xd1\xb3\x17\x0b\x7d\x5f\x5f\x21\x63\x16\x19\x8a\xf5\x40\xe1\xf8\x44\x18\x99\x48\x26\x81\x33\xb3\x7f\x9e\x43\x2c\xc1\xc1\xa4\x3a\x6c\x84\x15\x55\x51\xaa\x4d\x0a\xa4\x3b\x9a\x62\xbc\x88\x94\x70\x5a\x4f\x64\xf6\x24\xa3\x93\x59\x2e\x9f\xa0\xf7\xd5\x06\x0d\x26\xee\x1d\xa5\x5d\xbb\x6d\x4c\x0c\x9d\x33\x43\xb4\x69\x8b\x4b\xfb\x16\x01\x92\xf4\xc8\x63\x64\x41\x9a\xeb\x23\x52\x5c\x93\x7c\x9b\xfd\x8e\xae\xdb\xb2\xfe\x3c\xe3\x15\xde\x06\x91\x51\x0c\x7f\x3d\x5e\x9a\xee\x7f\xe8\x27\xaa\xaf\x69\x47\x1e\x31\x0f\x21\xb4\x09\x25\x8a\x8a\x52\xd6\x6b\xf4\xd9\x9d\xc9\x68\xb1\x48\xa0\xa3\x33\x89\xee\x6a\x1f\xa6\x84\x64\x6e\xb0\x28\x07\xd8\x87\x29\x41\xe2\x15\x8b\xf2\x71\xdb\x87\x89\x79\x67\x03\x93\xc0\xd8\x15\xab\x32\x64\xe1\x00\x94\x95\x9d\x84\x20\xea\xe1\x03\x14\xf8\xab\x49\x0a\xbd\x2d\xb2\x95\xdc\x23\x25\xb3\xe4\xbb\xbd\x97\x98\x16\x49\xc3\x6b\xdb\x07\xef\xec\x5b\x67\xca\xb8\xba\x70\x09\x64\xdd\x5b\x43\x2a\xd5\xae\xbe\x75\x9b\xe4\x7d\x24\xab\x6f\xfd\x83\xc6\x8e\x61\xdd\x5b\x83\xa3\x6f\x17\xdf\xba\xdf\xeb\x7c\x5b\x67\xaf\xa3\xe2\x29\x4d\xb8\x77\x3d\xa5\x09\xdf\x77\x9a\x70\x04\xe6\x47\xc1\x8f\xd5\x4b\xdc\x7d\xac\xc9\xc2\x00\x40\x6f\x67\x91\x21\x34\x6f\x43\xcd\x62\x04\x8e\x3b\xc3\xaf\x3c\xe4\x2f\xb9\xc4\xb0\xdf\xb3\x5e\xeb\x5d\xbf\x11\xbb\x3c\x6a\x84\xfa\xcb\x94\x5b\xbc\x29\x9f\x18\xef\x79\xfb\xee\x22\x06\xfa\xa3\xbe\xeb\x5b\x72\xcf\x9e\x5d\x39\x01\xef\x27\xe7\x78\x75\x9d\xee\x2f\xe5\x38\xf1\x49\x9b\x33\x8e\x1f\x62\xbf\x7d\x5a\x16\xf2\x6a\x0e\x72\xa6\xc1\x57\x13\x92\xd7\x9f\x3e\x68\x85\x86\x1c\xf4\x51\x42\x30\xe4\x11\x6d\xc5\xd0\x3e\x0c\x05\xc7\x90\x93\xdc\x8b\xd6\x40\x43\x48\xae\xa0\xfb\x23\x44\x57\x21\x12\xcb\x05\x96\x62\xc5\x50\x41\x29\x66\xa8\x07\xac\x59\x53\xb9\xb0\xd3\x66\x4d\xd5\x12\x52\x9c\x20\x03\xc1\x65\xee\xed\xc7\x95\xd0\x07\x60\x07\xa7\x08\x92\x05\x23\xe7\x6b\xb3\xef\x3b\x16\x3b\x77\x5f\xec\x6d\x4c\x83\x69\x5d\x5f\x60\x3f\x84\x83\x81\x35\x4c\xd5\xae\x77\x17\x33\xae\x57\xab\x66\xce\x17\x1e\xe6\x27\x2d\x01\x5b\xa2\x3b\x99\xd1\xd2\xe7\xef\x62\xce\x79\xcd\xea\x29\xa6\x3d\xea\xf5\x4e\xeb\x21\xa9\xa3\xa6\xf3\x24\x19\xbf\xea\x4f\x11\x32\xc2\x25\x0a\x1c\xa6\x98\xfd\x14\x27\x56\xb6\xf3\xc5\x3a\x69\x29\x59\x2c\xb7\xbe\x0c\x44\xaa\xb4\xe9\x81\x5e\x20\x0e\x2f\xc4\xcd\x52\x91\x78\x6f\x5f\xe2\x47\xa4\x10\x3f\x30\x0a\xef\x50\xe8\xa5\x21\x61\xf5\x8c\x4d\x00\xc9\x2d\x2c\xb0\x0d\x61\x7e\x1c\x85\xe5\xd7\xeb\x4d\xb4\xcf\x9a\x41\x99\xbe\x96\x3b\xe3\x22\x4d\x05\xad\x0a\xe8\x6d\x9d\xc4\xbf\x1b\x42\xe0\x4c\xcd\x99\x0b\x7e\x9f\x1b\xc5\x0b\xb3\x39\x7f\xd8\xdd\x37\x20\x96\xb3\x7f\x58\x35\x0b\x7a\x40\x7e\xd0\x3e\x82\x8c\xdb\x27\x44\x5c\x3f\x49\xf0\x43\x9c\x07\x7d\xcd\xee\x00\x48\x8c\xda\x6c\x56\x73\xc0\xe2\x08\x10\x77\x5d\x6e\x3a\x78\x3f\x79\x00\x92\x7f\x44\xb2\x23\x4d\xfb\x59\xea\xc2\x54\x5b\x51\x79\xce\x71\x68\x28\x85\x27\x34\xe8\x3f\xa1\xa3\x50\xe9\x89\xeb\xe2\x79\xa1\xe9\x03\x04\x9f\x20\x31\xa0\x15\xa1\xad\x42\xca\xc1\xe1\x46\xd8\xbf\x29\x25\xe3\x80\xd4\x7c\xbe\x30\x21\xf7\xb2\xa2\xad\x28\x16\x8f\x88\x2b\xb6\x89\xeb\x8e\x2b\x1c\xb2\x94\x28\xb9\xb4\xd2\xbe\x22\x0d\x55\xb4\xb6\x6a\x97\xdb\xdf\x9a\x25\x45\x2e\x1e\x25\x8a\xbb\xfd\x29\x88\xe5\x84\xdf\xee\x0c\x02\xfc\xdb\xd0\x5c\xcc\x91\xb4\x84\xec\x95\xa4\x65\x24\x39\x50\xcd\x61\x46\xb3\xbc\xda\x8f\x10\x64\xdb\x95\x77\xcb\xaa\x22\x39\x49\xb2\xe5\x70\xf2\x4f\x48\x85\xd7\x39\x8a\x80\x68\x72\xff\x21\x65\xef\xbf\x71\x40\x98\xb4\x9f\x2f\xb9\x12\x89\x8d\x91\xf9\x12\x09\xf8\x48\xea\xf0\x76\x33\xd2\xd3\x4f\xa4\x2a\x2d\x2f\x73\x8b\x11\xda\x79\xad\xe9\x91\x62\xd0\xec\x94\x56\xe7\x0d\x2b\xb6\xe9\xc0\xfc\xcb\x9b\xf3\xc3\x3e\x35\x70\xce\xbb\xb6\x14\x0c\xbe\x27\xb4\xf4\xa5\x9f\xd7\x6c\xba\x90\xf2\x32\x71\xb0\xfd\x08\x91\x71\xd1\x4e\x27\x85\xac\x23\x94\xd3\xb1\xe6\x73\xfd\xdc\x09\x86\xb1\x9d\xa6\x03\xc2\x45\x05\xc7\xb5\xd7\x87\x98\x30\xde\x64\x19\xf0\xc2\xa4\x08\x6f\x0c\x0c\xe5\xa0\x37\x9d\xde\xb5\x3e\x25\x6f\x07\xa1\x5c\x0d\x3e\x52\xd6\x39\x26\xb5\xdb\xe7\x0a\xd7\xdc\xf0\xa6\x2b\x5d\x3b\x03\x1b\xac\xce\x1a\x06\x00\xb7\x32\x25\x2e\x66\x64\x4d\xd4\x6d\xee\x9e\xbf\x76\x64\xc4\xbe\x3b\x3e\x8b\xe5\x79\xe4\x57\x0e\xc5\x61\xcf\xec\x2f\x89\xfb\xe9\xb3\xe1\xad\x58\x0e\xab\x0a\xf5\x84\x33\x59\x3e\xd3\x71\x30\xb6\x03\x6d\x0b\xb9\x6f\x98\x18\xcf\xaf\x58\x8f\xfe\x54\x45\xd0\x5e\xfb\x3c\xa4\x10\x47\xfd\xff\x1d\x54\x5c\xcd\x3f\x58\xda\xe2\xb1\x22\xfa\xb0\xef\xa5\x18\x6f\xfe\x3a\xa9\xee\x9a\x40\xa1\x5e\xf0\x32\x8e\xec\x7a\xc4\x8f\xb7\xfc\xad\x5a\x86\xbd\xd6\xed\x17\x6f\x99\xb9\x96\xea\x12\xe7\x2a\xce\xb3\x32\x12\xee\x1c\xc2\xe2\x69\x65\x56\x24\x2e\xb5\xca\xb4\xdb\x93\xb9\x1c\xca\xae\x1c\x1d\xf6\xfc\xf7\x5a\xd3\xfd\x97\x61\x91\x95\x52\x2c\xfb\xe0\x07\x28\xc7\x22\x9b\x4b\xb2\xd6\x55\xa4\xc9\xfd\x14\x65\x91\x6d\x57\x08\x92\x01\x18\xba\x4c\x5d\xf1\x82\x1d\x16\x05\xa4\xc2\xdf\x69\xe8\x61\xec\x7a\xcc\xec\x2b\x53\xc3\xca\xf3\x1e\x0d\x98\xe4\x53\x86\x6f\x09\xad\x38\x85\x06\x9c\xa4\x7f\xa3\xe5\xef\xbb\x03\xbf\xfb\xc7\x42\x46\xd1\xca\xeb\xbb\x1d\x03\x31\x97\x87\x41\x30\x5e\x1b\xfe\x61\x81\x25\xd7\x5f\x7e\x5d\x97\x58\x59\x1d\x5f\xce\xb2\x82\x9b\x7e\xc7\xa1\x3f\x0d\x3f\xdf\x50\x7d\xd9\xb5\xeb\x60\xe3\x46\x96\x5d\x77\x8e\xe8\x73\x37\x8d\x63\x8a\x34\xde\xad\x6d\x47\xf2\xd2\x19\x7b\x16\xd9\x99\x3a\xd4\xaf\xff\xf3\xf8\xed\x03\xc3\x81\xfb\x23\xd1\xce\xfe\x33\x0d\x1a\x16\xac\x9a\xb7\x3d\xa3\x04\x14\xaa\xa3\x1b\x2d\xa9\x23\xa2\xa8\x8b\x56\x52\x3c\x10\x2a\x46\xd1\x7d\x4a\xf6\x23\x70\xf7\x3b\x1f\xe7\xa7\x82\x74\x09\xd5\xa8\x12\x8c\x90\x47\xb0\xd0\xcd\xd7\xe0\x00\xf2\xd3\x7f\x1e\xbf\xf5\xa1\xbe\x40\x3d\x1a\x92\x8e\xf3\x9c\xcb\x6f\xdf\x27\x33\xf4\xef\xd0\x46\xb5\x85\x21\xad\xd1\xf6\xf3\x14\x52\xfd\xc1\xf8\x09\xc4\x2a\x36\xe7\xda\xa8\xa5\x93\xe7\x72\x16\x91\xec\x9c\xcb\xe1\x96\x4b\xb6\x24\x7f\xfd\xee\xe4\x6f\xff\xf5\xfd\xbb\xa3\xc3\xef\xff\xeb\xcd\xe1\xd1\x5f\x4f\xdf\x9e\xfc\xfc\xf3\xf9\xdf\xce\x2f\x4e\xde\xfc\xfc\xf3\x51\xab\x14\x13\xe6\x08\x1b\xef\x9e\x33\xf3\xf3\xcf\x6e\x8f\xe9\x9f\x7f\xbe\x28\x1a\xde\xfc\xfc\xf3\x99\x77\x73\xc2\x39\x6a\xa7\x2a\x01\x16\x1c\xa0\xc7\xba\xea\x48\xd0\xef\x70\xf9\xe1\x2d\x7b\x75\x97\x03\x3a\x68\x40\xd5\x7f\x8a\xb8\xbc\xbb\xae\x05\x45\x6e\x4e\x2f\x7c\xeb\x9d\xfd\x0f\x2a\x32\xa1\xca\x8e\x12\xcd\xc5\x1c\xd0\xfe\x50\x45\x0d\x81\x07\x32\x65\xe6\x9a\x31\xac\xdb\x5c\x55\xad\xd2\xf1\xe0\x7e\xb2\xaa\xaf\x71\x2d\x8e\xad\x02\xd3\x6b\xcd\xe2\xd2\x94\x5c\x21\xe0\x15\x67\xd7\xa0\xa6\x6b\x3e\x17\xb4\x8a\x42\x83\xd0\xa9\x10\x33\xc0\xba\xdf\xdf\x91\x12\x1e\x15\x71\x62\x73\x67\x17\x26\xeb\x67\x99\xac\x65\x98\xf4\x3a\x63\x50\x6d\x69\x63\x25\x39\x3b\x3d\x26\x2f\xef\x3a\x19\x60\x1b\xb8\xac\x92\xf3\x4d\x0c\x11\x1c\x51\x56\xc5\x4b\xeb\x0e\xbf\x06\x79\xfc\xd0\x8c\xde\x4e\x4b\x59\x53\x2e\xb6\xdb\x64\x62\xd6\x56\xd5\x92\xfc\xda\xd2\x0a\xb5\xd7\x33\x59\xae\x9f\x34\x7b\x7f\xf4\x1f\xfd\x69\xf2\xc7\x40\xf8\x9f\x26\x7f\xb4\xd2\x27\xec\x8c\x3f\x4d\xf4\x55\x31\xf9\x63\x51\xb5\xda\x30\x45\xdc\x4d\x77\x86\x3e\xfd\x48\x67\x8a\x20\xe7\xa8\x1b\x01\x28\xa5\x60\xe7\x3e\x88\x46\x87\x4e\x05\xc8\xef\xfc\x8b\xa2\x05\x3b\x63\x8a\x83\x69\x20\x45\xf9\xa0\x1d\x2a\x3c\x07\x93\xd2\x35\x3a\x83\xee\xda\x48\x47\x98\x33\xc1\x58\x89\x96\x9a\x23\x9b\x91\xb9\xa5\x1a\xd6\x7d\x02\x46\xd5\xd4\x6a\x03\x85\x62\x14\x51\xdf\x48\xc9\x2a\x06\x8d\xec\x92\x3a\x8f\x62\x88\xc4\xa7\xec\x0a\x29\xc6\x82\xcd\x31\x85\xd6\xa5\x92\x20\x9e\x22\x1e\xb3\xff\x64\x4a\x46\xe9\x9a\xda\xc8\x86\xf0\xba\x66\x25\xa7\x86\x55\x4b\x72\xc5\xe9\x1d\xc7\x07\xb5\x02\xfa\x60\xa0\x70\xdc\x17\x92\x48\x88\x01\xb7\x82\xbb\x70\xcd\xa2\x35\xa4\x94\xd7\xe2\xee\x2a\x85\xeb\xca\x1a\x0a\x71\x05\xaf\x46\xbd\x66\x39\x30\xb9\xa4\x01\x9e\xe8\x45\x09\xd2\xac\x0e\xb4\xf5\x7b\x0f\x75\x0a\xfc\xa6\x45\x87\xce\x17\x1e\xdc\xd8\x1d\x09\xaa\x15\x00\xcb\xd9\xf5\xf6\x82\x8c\x0f\xcd\xc4\x5d\xfd\xec\x34\x66\x7d\x3f\xbd\xfe\x70\xc0\x1a\x3c\x3c\xc4\xd8\x4a\xb2\xca\x4c\xaa\x82\x4f\xab\x25\x59\xd0\xca\x30\x87\x98\x49\xe3\x55\xba\xeb\xa4\x9c\x33\x13\x2f\x44\x25\xc5\x3c\xd6\x75\xd9\x87\x86\x15\x06\x7a\x37\x31\x2a\xda\x06\xa9\xb3\x6a\xdc\x52\xb6\xc9\xfe\x8f\xd8\xef\xf1\xf5\x0b\x3f\xe9\x29\x32\x27\x25\xa7\x2a\x35\x9b\xca\xc8\x8a\x21\xa7\x0c\x11\x4e\x1b\xbb\x13\x3d\xd3\xf1\xd3\x1f\x4b\xb3\x95\x04\xaf\xdb\x85\xdb\x38\xc0\x72\x17\xe1\x95\xc1\x8f\x61\x0c\x85\x1e\x49\x56\xc4\xe2\x37\xd0\x9c\x61\x49\xac\x56\x64\x30\x82\xe6\x9a\x8a\xdd\x3d\x28\x66\x37\x96\xe2\x4d\xc5\xc8\x1f\x2f\xd9\x72\x04\xdc\x3e\x42\x75\xfe\x4f\xa4\x0d\x19\x54\xf0\x7c\xc8\x91\x6c\x2c\x01\x52\x91\x3f\xfa\x7f\xfd\xe9\x01\x7b\xc3\x0c\x09\xc3\xe1\x4b\x6d\xab\x5d\xcb\x09\x22\xd3\xf0\x08\x4c\x8e\xb9\x05\x74\xa0\x35\x46\xe2\x2c\x4f\xc8\x09\x74\x4d\x43\x03\x12\x01\xe6\xad\x25\x10\xdf\x9c\xe8\x59\xfd\xc9\x87\x53\xdd\x2e\xf3\x8e\xfb\x28\x4f\xef\xad\x74\x7d\x82\xd8\x88\x9c\x41\x57\xbd\xee\x13\x10\xc5\x6f\xe5\xc9\x07\x56\xb4\x69\xd5\xef\x83\x42\x40\x97\x2c\x21\x9b\x32\xcf\xea\x7d\xc7\x96\xfe\x54\xc4\x65\xb0\xf6\x79\x80\x03\xec\x44\x54\x54\x3f\x78\xfb\x32\x5e\xb2\xbb\xf7\x8b\xc4\xeb\xd4\xfb\x35\x80\x22\xd7\x9e\x2b\xec\x4a\xaf\x15\x9d\x7c\xe0\xda\xe8\xff\x8d\xf2\xa4\x90\xf5\xd4\x1f\xaa\x48\x8e\xe7\x35\x44\x62\x72\xab\xef\xf0\x54\x52\x49\x1b\xb4\xb6\xfe\x05\xb6\xb5\xc0\xef\xfc\x04\x2a\xd6\x28\xa6\x21\xe6\x4c\xed\x54\x3c\xd3\xae\x40\x4b\x0a\xc0\x45\x76\x11\x09\xec\x42\x9c\x34\x94\xaf\xe5\xc1\x01\x71\xd7\xe1\x72\xc1\x12\x9c\x58\x4b\x69\xd2\x53\x05\xf0\xa3\x34\xb1\x83\x0f\xb6\x9c\xf2\x6b\xcb\xaf\x68\xc5\xd0\xfd\x7a\xcd\xab\xb2\xa0\x0a\xd3\x1a\x51\xe8\x13\x2d\x5d\x0d\x2c\xb6\x41\x4b\x0a\x60\x05\x6d\x80\x75\xcc\xae\x5d\x3a\x13\x55\x86\x17\x6d\x45\x15\xb1\x12\x70\x2e\x55\x12\x5e\xcd\x20\x36\xeb\x76\x6a\x92\x35\x85\x57\x0e\x7e\xbb\x58\x25\x24\x66\x3c\xb3\x08\xaa\xb8\x9c\xa1\x66\xb9\x22\x66\xf6\xb1\xea\xcc\xed\xf6\x24\x0a\xe4\xcc\x1f\x3c\x41\xa2\xc7\x68\x28\x51\x4a\x0e\xd7\x84\xcf\x85\x54\xac\x3c\x88\x14\x90\x20\x0b\x27\xe4\xdb\xd0\xbc\x31\xa5\xef\xb7\xd5\xb8\x7c\x24\x19\x60\x65\xdc\xbb\x39\x41\xe5\xb8\xa9\x13\xbd\x33\xa9\xd8\x15\x53\x64\xdf\xe1\xba\xb1\x2b\x5e\x98\x83\x09\xf9\xff\x5b\x43\x2f\x35\xf8\x16\x2c\x48\x27\x0c\x43\x7b\x01\x07\xfe\x4f\x35\x79\x41\xf6\x61\xa8\xd8\x7a\x3c\xf0\x09\x24\x7a\xa9\x0d\xab\xd3\xf9\x79\x5b\x35\x10\xc9\x89\x8b\x39\x36\xc1\x8f\xde\xc6\xed\x16\x17\xad\xad\x15\x6e\x0f\x1d\x73\xe5\xa0\x23\x33\x1c\x92\x5c\x3b\xb9\xd8\x0b\xaf\x86\x8c\x0d\x7f\xa6\x86\xbd\xf0\xdf\x90\x23\x40\x14\x9b\x83\xf4\x42\xd9\xb3\xe5\xe6\x77\x89\x79\x98\x46\x36\xb2\x92\xf3\xe5\x79\xa3\x18\x2d\x8f\xa4\xd0\x46\x81\x8c\x7e\x48\xb7\xd2\xc5\x4d\x44\xb8\xe7\x4e\x5d\xed\x0a\x75\x15\x61\x72\x86\xb8\x4c\xb2\x9d\x2f\xb0\x15\x28\xfc\x90\xd0\x42\x49\xad\xc3\x3b\xdd\xd5\x64\x03\xdf\x9e\x9e\xf8\xbe\xa0\xde\xbf\x1c\xfa\x8c\xc2\x98\xe0\x6d\xbf\xa6\x4b\x27\x95\xe8\x94\x97\x3d\x04\x45\x4f\xfa\x5d\xd9\xe1\xd0\x9e\x8e\x37\xce\x83\xd5\x09\x0e\xdf\x1e\xdf\x35\x95\x61\x7b\x26\xef\x4d\x4b\x1a\xac\x0d\x07\x12\x1a\xd6\x2e\x18\x94\x30\xcb\x08\x31\x68\xa7\x74\xce\xaf\x98\x08\x33\xf3\x48\xda\x8e\xd6\xf4\xc3\xf9\x25\xbb\x4e\xf8\xa5\x7f\xd1\xef\xd8\xdd\x8b\x24\xc6\xe0\x0d\xfb\x41\x68\x6a\xb8\x9e\x71\x3a\xad\x1e\xb2\xf7\x29\x80\xa6\x9c\xb3\x8a\x15\x5b\x54\xdb\xbf\x8f\x89\x08\xd0\x7b\x46\x92\x19\x17\x2b\x3c\x96\x76\x74\x74\x28\x73\xbe\xd3\x1b\xd7\x01\x02\xcf\x0d\x0b\xd5\x72\xb2\x15\xae\x8f\x6e\x48\x0a\xc4\x2c\x88\xb6\x9e\x32\xe5\x45\x58\x9a\x7a\xe4\x40\x25\x49\x21\x95\x62\xba\x91\x58\xad\xea\x59\xc7\x09\xb2\xf4\xf3\x28\xb9\x84\x65\x68\x3d\x08\x4c\xe9\xc9\x07\xab\xf7\xea\xb4\x92\x00\xbc\x7a\x9c\xb4\xfa\x50\x4c\x05\xf2\xd5\x5d\x2b\x4b\xe7\x36\x3d\xf4\x86\xc7\xa0\x41\xfc\x49\xaa\x18\xee\xae\x21\x35\x50\x78\x25\x57\x42\xe1\x95\x27\x1b\x90\x20\x42\xc0\x8d\x73\x87\x73\x1c\xbe\x89\xe1\xdb\x9c\x03\x5d\x8f\xd0\x9c\x76\xb0\xad\xa2\x53\xc6\xec\xcd\x03\xc8\x02\xe3\xdc\x99\x23\x97\x6c\x09\x8f\xc7\x11\xd3\xbb\xd7\x0d\xdc\x16\x9e\xb0\x21\xf5\x5d\x78\x8d\xed\x2b\x0d\xfa\xbd\x9f\xe6\xe4\x87\x0c\xdd\xe3\x78\x25\xba\xee\xba\xab\xc7\xc7\x97\x9d\x37\x0e\x79\xb2\xe7\x8d\xeb\xe4\x72\xe7\x8b\x1b\x34\xf6\xe0\xea\x30\xbc\x86\xb8\xb8\xba\x2b\xdf\x86\x8e\x69\xfa\x14\xb7\x17\x85\xa4\x11\x39\x1b\xbc\xbd\xf0\xda\xe4\x06\x3b\x15\x23\xf2\x56\x1a\xfb\x9f\xc8\x23\x76\x2c\x99\x7e\x2b\x0d\x7c\xb2\x13\x2b\x89\x13\xb0\x4b\xeb\xe8\xbc\x16\x56\x0c\x0b\x3c\x6e\x5c\x76\x9b\x55\x14\xdc\x7a\x6d\x32\x83\x4f\x05\x91\xca\x4d\xf9\x40\x12\x82\x25\xad\x1d\x01\x71\x80\xde\xf5\xf9\xbe\xd1\x10\xb7\x54\xc4\xcb\x7c\x6f\xc4\x38\x42\x00\xf3\x18\xbf\x01\x28\xf6\xa6\x82\x82\xef\xb2\x85\x09\xa3\x76\xe6\xa8\x61\xf3\x3b\x97\x38\xae\x5e\x35\x53\x73\x46\x1a\x08\xeb\x64\xe0\xdc\x21\x8a\x04\x5e\x03\xd5\x89\x98\x98\xc1\xdb\x28\x73\x79\xe9\x3d\x3e\x14\x74\x4a\xb0\x35\xf2\xe8\xa8\x03\xf6\x7b\x44\x0a\x6a\x5d\x35\x05\x07\xc9\xff\x0b\xd1\xdb\xff\x21\x0d\xe5\x4a\x4f\xc8\xa1\xcf\x30\x8c\xbf\x73\x49\x1a\xd1\x63\x06\x90\xd2\xac\x07\x16\xa8\x20\xcc\x61\x5a\xc8\xd9\x9a\x32\x3e\x72\x78\xfb\xf6\xc0\x0e\xce\xe5\xbd\x4b\xb6\xdc\x4b\x45\x57\xc2\x2b\x96\x28\x7b\xa7\x62\xaf\x4b\x29\xec\x49\x81\xa0\x93\x02\xc0\xf9\x1e\x7c\xb7\x77\x7f\x7a\xff\x20\x0d\xb2\x03\x4c\x3a\xcb\xa0\x82\x0d\xdc\xb2\xbd\x3d\x55\xd3\x66\xd8\x96\xea\x98\xef\x3b\xb6\xdc\x5a\x08\xe6\x4d\x8f\x0a\x6f\xc2\x18\x67\xaa\x77\x9a\xa5\xc6\xfa\xfb\x0a\x62\xf4\x0b\xe7\x16\x94\x57\x4c\xa1\x4b\x30\x69\x6c\x74\x82\xd9\xb3\x26\xa4\xda\x77\x70\x3b\xc0\x8f\x30\xb0\xe5\x43\xef\xd1\xa8\xa4\xbc\x6c\x1b\xcf\xcf\x90\x86\x9b\xba\x63\xb8\x28\x64\xed\xfc\x22\xf8\x9e\xe0\x09\x77\x1b\x73\xec\x32\x9e\x50\xc6\x84\xad\x80\x39\x55\x3d\xaf\x4f\x62\x7c\x30\x9e\xcc\xe0\xe0\x65\xf6\xd8\x0f\xfe\xc0\x6e\x7a\x6f\x9d\xaa\x24\x02\x7c\xae\x7d\x3c\x0b\xae\x0d\x34\xad\x43\x60\x7d\x26\xd5\x94\x97\x25\xf8\x22\x91\xb8\x50\xf0\xb5\xc2\x38\x56\xd2\xf4\xfc\x50\x69\x42\x63\xe5\xa9\x1b\xea\xe0\x57\x9d\x5d\xe2\x99\x49\x49\x4b\xc6\x0b\x06\x71\xed\x91\xec\x83\xc2\x2b\xae\x4e\x8d\x67\x04\x3b\xfb\x49\x23\x4d\x99\x0f\x1f\xda\x23\x49\xb4\x55\x65\xb5\x3d\x50\xc4\xd0\x2d\x83\x91\x3e\x10\xc9\x2e\x29\x61\x6e\x85\xb4\xe9\x33\x5b\x52\xa3\x08\xd7\xdd\x02\xf6\xf6\x94\x19\xea\xfb\x5c\x88\x15\x34\xa8\xfe\xe4\x9f\x8a\x33\x59\xf6\x3d\xda\xb7\xc0\x42\x91\x7d\xff\x8f\xe9\x32\xb9\xe8\x85\x0c\xd6\xf1\x06\x68\x76\x39\x0f\x87\xe1\x0a\x97\x73\xa6\x6f\xef\x58\x80\xe1\xa3\x50\x14\x26\xdf\xce\x15\x43\x14\x60\x90\x4a\x20\xa5\x5c\xdb\xab\x56\xb0\x2b\x66\xb9\xb7\xe4\x76\x0e\xa7\x6d\x22\x66\x9a\xcb\xcf\xfa\x65\xcd\xab\xff\xff\x3b\x96\x6f\xa5\xf1\x61\xaa\x5f\x46\x2e\x60\x8e\x7a\xdc\x07\x5e\xb7\x35\xf6\xad\x36\xc6\xda\x30\x7c\x36\x63\x2a\xb1\x39\x1f\x09\xb5\x27\x7d\xdf\x75\x3f\x5a\xe3\xa4\x84\xa1\x6a\x0e\x05\xd3\xce\x0f\xed\x55\xae\x79\x25\xa7\xb4\x22\x35\x17\x96\xb4\xb4\x99\xb8\x58\x7b\x4e\x78\x63\xf7\xe7\x2d\xc4\x81\x0e\xea\x3a\x4b\xa1\x73\x3c\x2d\x43\x42\xb9\xe4\xf1\xd9\xca\x6c\xac\x3c\x1c\xe4\x4b\xc5\xb4\xc6\xf4\xe0\x37\x5c\x1c\xbb\xd0\x62\xd2\xb0\xaf\xad\x74\xfc\x40\xeb\xa6\x62\x23\x0c\x3f\x7e\x3d\xfe\xa7\x14\x8c\xb8\xb2\x87\x51\x60\x51\x57\xc7\x63\x24\x79\x89\x0a\x6f\x13\x60\xc9\x7c\x7d\x4d\x12\x05\x3d\xb9\x1b\x82\xad\x9a\x7c\xf5\xfc\xab\xe7\x2f\xd3\x44\xcc\xa9\x2b\x3d\x2a\xa8\x76\xdd\x6d\xd7\x57\xf7\xce\x45\x3c\x78\xfd\x8b\xd8\xd9\x79\xe9\xfe\xfb\x95\xfb\xef\xd7\xe4\x5f\x89\x4f\x23\x67\xe4\xac\xf7\x5f\xfb\x9f\xc4\xa7\x8d\x2d\xf3\x44\xcb\xf5\x72\xd4\x3f\x5b\x0b\x2a\xf0\xe0\xb3\xe7\xbc\xdb\xdf\xa0\xed\xe1\x2b\xc0\x39\x53\xc8\x9a\xc1\xd4\x7f\xf5\xbf\xd3\x74\x4d\x7c\x2e\x64\xe8\x1b\x22\x85\x7b\xfa\xcb\x7d\x98\xae\x03\x72\x0d\x79\x0f\x35\xbd\xc4\x80\xd5\x61\x61\x5a\x5a\x59\x82\xf7\xbf\x1e\xbf\x3c\x20\x52\xf4\x6e\x4f\x22\xe1\x8a\x4b\xab\xaf\xf9\x99\xd8\x7f\x99\x88\xf1\xb0\x3a\x9d\x5f\x6d\x98\xce\xde\x4c\xc2\xdb\x52\xb1\x84\x57\xc8\x2b\x93\xbd\x38\x3e\x14\xcb\x6b\xba\x0c\x42\xd9\xab\xeb\x73\x7e\xc5\xc8\x82\xcf\x17\x80\x86\x30\xa0\x5f\x2a\xc1\xbc\x6f\x90\xb1\xdc\xb7\xb4\x44\x42\x96\x84\x27\x6a\x7f\xa7\xe6\x99\x86\x8c\x16\x8c\x51\x38\xa0\x9b\x50\xa7\x16\x8a\x4f\x5e\x82\x58\x79\xb1\x02\xf4\xb1\xe5\x34\xa7\xaf\xbf\xba\xbb\x4e\x11\x64\xf2\xd6\xd4\x8a\x40\x41\xaf\xe1\xc1\xfa\x69\xb6\x7a\xb8\x0c\xe0\xda\x8f\x9c\x5a\x70\x50\x84\xc3\x33\x1c\xe3\x97\xce\x1a\xee\x4e\xb4\x6e\xf6\xd2\xfc\xb2\x67\xb2\x0c\x09\x22\xc4\xe9\xd3\x90\x58\xa7\xc9\x5e\xff\x18\xd8\x83\x44\xbb\xe0\xbd\x71\x18\xce\xce\xde\xe3\x52\xd8\xf7\xf0\x9b\x7f\x50\x1b\x70\x42\x0e\x45\xd9\x55\x13\x25\xce\x12\xfb\xb5\xa5\x15\x38\xaf\xe7\x90\x27\xa8\xf2\xcc\x57\x54\x77\xb4\xd6\xd7\xb6\x93\xe6\x89\xaf\x8d\xfb\x5e\xb7\x15\x64\x5a\x7e\xfc\xfd\xb3\x72\x82\xee\x52\xad\xc0\xea\x0c\xb9\x56\xb5\xc4\xde\xf5\xc2\xab\xff\x2e\xf3\x42\x3a\xbf\xc4\xa0\xcd\x70\x3a\xdb\x50\x4e\xd7\xe5\x6e\x91\x29\x5b\xd0\x2b\xbb\x1d\x01\xc6\x29\xde\xa9\x6e\x89\x41\xc5\x1a\x92\xed\x1d\x15\x58\x38\x11\xa8\xfb\x2c\xf3\x62\xc0\x36\xef\xde\x4d\x1a\x7c\xbf\x9f\x56\x4f\xab\x10\xff\xe8\x59\x12\x89\x26\x75\x8a\x82\xfa\xd5\x68\x65\x5e\xdd\xe7\xbf\x7d\x28\xbd\xf5\xab\x34\xbd\xf5\xde\x95\x4b\xfc\x6f\xb2\x8d\xd4\x6d\xdc\x8d\xfb\xf5\xb7\xfb\xdd\xac\x1f\x40\x86\xff\x9a\xc0\x05\x64\xac\x2e\xc9\x39\x71\x87\x39\xf5\x5e\x73\xd3\x52\x04\xe0\x12\xec\xda\x95\x54\x47\xcb\xba\xb2\x44\x91\x93\xcb\xab\x6c\x69\x72\x65\xca\x0a\xda\x6a\xbb\xa9\xeb\xc6\x9a\xdf\x44\x5b\xf6\xf3\x0e\xc3\xaf\xf7\xbf\x26\x63\xf2\xe2\xc0\xee\x6e\x81\xa2\x05\x58\x30\x56\xb8\xa1\xb1\x0d\x1a\x7a\x66\x61\x4d\x7d\xbb\xce\x89\x52\x8e\x3b\xf4\xce\x15\xb5\xf7\xf1\xa9\x4d\x42\x96\xec\x70\x36\xe3\x82\x9b\x65\x2a\x9c\x7d\x1e\xf5\xe9\xed\x1a\x25\x91\x1a\xb5\x90\xd7\xe4\xda\x61\x09\x00\x2f\x3b\x48\xbc\x98\xfc\xe7\xf6\x8f\x41\x8e\x6b\x38\x2c\x83\x2e\xe2\x2c\x8e\xa0\x0f\x38\x69\x63\xf9\x6e\xe2\xea\xe6\x5d\xa3\x9e\x94\xb1\xc6\xe4\xaf\x52\x48\xf5\x0a\x8d\x43\xec\x65\x1f\x74\x90\x1b\x5f\xcb\x9d\x2f\x45\xd5\x96\x51\x07\x8c\x4e\x7b\x4a\x3c\x3e\xc7\xe4\x14\xfc\xb7\xaf\x3e\x36\x72\xf0\xf2\x02\x88\x42\x19\x0e\xbc\xdb\x08\x4a\x4f\xe8\xdf\x58\x24\x0f\x47\x39\xc7\x40\x60\x3f\x30\x69\xbf\x85\x49\x25\x0d\xf0\xcf\x83\xd7\x1e\xd9\x19\xb9\x80\xf4\xee\xed\x6f\xa5\x98\x8e\x5b\x37\x12\xf6\x3e\xc3\xa4\xf4\xd5\x0d\x90\x34\xfa\x43\x6c\x1a\xe4\x3d\x7b\xf0\xc8\xd6\x38\xea\x47\x84\x56\x12\x82\x48\xf6\x38\xb2\x1f\xb1\xd2\xdd\x38\x93\x3e\xd6\xb4\x1a\xfb\x48\x22\x63\x01\x68\x9f\x5d\xf9\xca\xa8\xb7\x0b\x72\x6c\x41\xbf\x20\x9f\xb0\xe9\x1e\x78\x83\x21\x95\xdb\xda\x61\x51\x32\xfd\xf6\xea\xfa\x02\x09\xde\x61\x7d\xc9\x40\xb3\x80\x85\xc3\x58\xda\x04\xf6\x60\xdc\x5c\x9d\xba\x70\xb3\x53\x96\xb8\x4e\x4e\xfc\xb4\xea\x34\x07\xc8\xde\x82\x56\xb1\xdd\x61\xed\x1d\x5e\x32\x85\xea\xce\x94\xf5\x50\x98\x52\xeb\x2d\xf0\xfa\xa9\x7b\x3a\x22\x36\x01\x94\x00\x0e\xfe\x27\x04\xbf\xdd\x9b\xb6\xc5\x25\x33\x3e\x31\x43\x01\x4a\x4a\xd3\x1a\x32\xa5\x15\x15\x85\xdd\x8b\xa0\xc9\xa6\x39\xea\x67\xde\xf5\x6f\x24\x12\x80\xa3\x25\xbf\x0d\x76\x8c\x08\xf8\x3f\xf8\x0a\x51\xfd\x2a\x17\xda\x58\xaa\xb1\xb0\x75\xd8\xe4\x1d\x56\x5a\x8e\xac\xd4\xf5\x83\xae\x05\x2f\x70\x78\xf7\x6f\xcc\x9f\x71\x1a\x01\x63\xc6\xc1\xc6\x45\xc9\x2b\x32\xa5\x17\xda\x26\x5d\xcf\xe1\xf4\xf6\x4f\x8b\xb4\x97\x64\x93\x39\x64\xff\xad\x6c\x8f\xbd\x3e\x5e\xa3\x87\x80\xda\x1b\xe1\x2a\xda\x5d\xe2\x90\x3c\xf1\xe5\x41\x41\xa7\x66\xe8\x8c\x8b\x12\xf0\x81\x57\x89\x09\x4f\xed\x53\x65\x0d\x01\x4f\x11\x98\xb9\xf9\x29\xda\xec\x8e\x7d\x68\xf1\xb9\xe6\xe3\xde\x96\x10\x5d\x77\x5f\xf4\x55\x14\x28\xb2\xa1\x95\x47\xf9\xb1\x2a\x05\x9f\x59\xab\xab\x94\x0c\xb3\x22\xd0\x3d\x9e\xe8\x7c\x63\x5e\x2f\xe9\x5c\x44\xa9\xa7\x76\xcf\xdd\x42\xf6\x7d\x76\x00\x31\xac\xaa\xf0\x74\xe8\x3c\x62\xd6\x12\x36\xb2\x73\x89\xa5\xfa\xf6\xc7\xa4\x1f\x9a\xd8\x38\x58\x3c\x90\x07\x6d\x82\xc8\xe9\x32\xb4\x96\x4d\xcd\xc1\x9d\xb6\x86\xcc\xf9\x95\x55\xa1\xd6\xe2\x1f\x9b\x62\x19\x18\x7f\x5a\xb0\xaa\x21\x8a\x95\x6d\xc1\x06\x64\x02\xea\x44\x33\x9b\x90\xc3\xd8\x21\x08\x98\x19\xe1\xb8\xdc\xeb\xf1\xe2\x9e\xeb\x83\x3b\x5c\x51\xe4\x33\x90\xb0\x60\xe2\xf1\x19\x61\x57\x4c\x2d\x49\x23\xb5\x06\xd9\x0f\xfa\x02\x82\x1c\x42\x36\xe5\xcc\x17\xd6\x80\x53\x05\xe6\xcc\xf9\x17\x92\x06\xdf\x73\x4e\x89\x3d\x70\x2a\xcb\xc1\x3a\xc0\xee\x46\xad\xbf\x7e\xfe\x32\x35\x6a\x9d\xdb\xfb\x77\x06\xff\x0b\x21\xe5\x41\xa1\xe5\xd3\xd9\x26\x39\x19\xe6\xb6\x27\x79\x3e\x25\xea\x9c\x1a\x9a\x84\x99\x81\xe0\xf0\xd7\x07\x51\xc0\xfa\xeb\xe7\x5f\x3d\x7f\xb9\x6f\xe7\xfe\xab\x03\xbb\x0a\x51\x58\xf9\xab\x28\xac\x1c\x7e\xe9\xde\x22\x01\xc2\x8a\x74\x49\x3b\xfb\x2f\x0f\x26\x50\xd3\x00\xf8\xa4\xd7\x52\x95\xae\xc4\xdf\x23\x46\xda\x37\x0f\xed\x3f\x79\xed\x95\xcf\x11\x08\xad\x20\x1d\xd3\xdc\x43\x10\xd0\x80\x30\x3a\x37\xe4\xcb\x5a\x2a\xf6\x65\x34\xc4\x63\x55\x0c\xd6\x93\xbb\x6a\xda\x8c\x2f\x13\xf2\x76\x87\x14\x3b\x0f\x2d\x75\xbe\x29\x45\xad\xa6\xcd\x1d\x9e\x73\x25\xab\xb6\xbe\x6b\x16\xf6\x30\x85\xe8\x7b\x57\xb7\xea\x86\x76\xa5\x95\x98\xe6\x50\xbb\x9a\xe3\xe9\x32\x86\xf2\x9d\xb2\x4a\x8a\x39\xc6\x2a\x43\xc3\xc2\x3b\x8e\xfa\x69\xc8\xea\x85\x14\x05\x6b\x8c\x7e\xae\x8d\x54\x74\xce\x9e\x3b\x22\xef\x34\xd8\xf6\x20\x0b\x7e\x04\x6a\xfb\x95\x6f\xd8\x14\x08\xdf\x23\x00\x2d\xfb\xfa\x6f\x90\x97\xb4\x00\xd8\x49\x98\x75\xab\x2d\x45\x0d\x86\x45\xea\x74\x6f\x09\xb5\x20\xa1\x83\xe0\x90\x6a\x50\x7a\xad\x4f\x2a\xaa\x0d\x2f\xbe\xad\x64\x71\x79\x6e\x64\x9a\xa3\x2f\x87\x85\xb1\x89\x96\x1e\x27\x08\x72\xf8\xd3\x39\x39\xe6\xfa\x92\x28\xa6\x65\xab\x0a\xd7\xaa\x6c\x05\x90\xf1\xae\xd8\xb1\x78\xd9\xcd\x54\x31\xe3\x20\xf7\x49\x4d\x8b\x05\x9a\xfe\x2e\xeb\x81\x7d\x68\xa4\xee\x9a\xaf\x27\xb0\x14\x5e\x71\xa7\x8a\xc3\x9f\xce\xd7\x5f\x99\xeb\xa8\x49\x06\xfa\x10\xb1\x94\x06\x3c\xb1\x5d\xa6\xfc\xd8\x28\x96\xa6\x95\x6d\x9c\x69\xcb\xf0\xe0\x94\x52\xac\xe4\x0a\x81\x54\xdd\xbb\xb2\xa9\x9e\x14\x9a\x4f\xe8\xb5\x9e\x14\xb2\x26\x47\xe7\xa7\xa4\x54\xfc\x2a\xb5\x4f\xd2\x30\x51\xf6\x05\xbd\xd6\x0c\xc9\x9f\x5a\xf2\xed\xd7\x29\xf3\xb0\xe5\x5e\xa1\xf8\x36\xa7\xc7\x09\x3f\x1f\x5a\xff\x3d\xd3\x17\xf6\xdd\x13\xed\xb9\x5c\x55\x73\x48\x85\xf7\xc8\xce\x78\xc5\x10\xb0\x0b\x39\xd1\xc5\x7d\x9d\xd8\x87\x6d\xbe\x94\x2d\xb9\xa6\xe8\xd8\x86\x73\x36\xbd\x7c\xf3\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x91\xfa\x2a\x09\x56\x71\xf7\x7d\x84\x3d\xba\x10\xc8\x06\xb7\x1d\xc5\x7c\x00\xc4\x18\x5e\x27\x68\x9d\xe9\x57\x64\x8f\x7d\x30\xdf\xec\x8d\xc8\xde\x87\x99\xb6\xff\x11\x66\xa6\xf7\x26\xe4\xb4\x6e\x2a\x5e\x70\x63\xcd\x51\x31\x63\xaa\x73\x15\xe3\x0f\x32\x75\x59\xda\x95\x3d\x49\x72\x54\xb2\x82\x53\x18\xd8\x73\xcb\x1c\x1e\x08\xf1\x4c\x1e\x7d\x20\xee\x93\xbd\x4f\x67\x44\x62\xe9\x41\x1f\xa6\x9c\xeb\xf0\x70\xcb\xd0\x6e\x74\x91\xd0\x6f\xa9\xbb\x3a\x16\x7e\x2d\x95\x7f\xe4\xf3\x92\x5d\x3d\xd7\x25\x7d\x39\x82\xd7\x42\xfe\x5c\xae\xcc\x01\xd5\x64\xef\xe5\x9d\x1b\x05\x74\xd7\x39\xaf\x79\x45\x55\xb5\x1c\xc5\x73\xd9\x3d\xdf\x1e\x95\x9e\x10\x70\x26\xbf\xd8\x23\xfb\x88\x06\x0e\xea\x7a\xc5\x7c\x3b\xbe\xd0\xd5\x17\x2a\xa0\x92\x9b\xdd\x0d\x4d\x0c\x21\x83\x93\x43\x08\x1c\x4c\xb4\x7c\x27\xaa\x64\x70\x8f\x5c\xdc\xef\xe9\xf0\xf8\x81\xaa\x75\x51\xec\x99\x44\xcd\x8d\x75\xb7\xf8\x96\x3c\x5c\x38\x13\xe0\x8d\xe5\xd1\x01\x78\x16\xbb\x26\xce\xd2\xdb\x0f\x92\xa0\x29\x6c\x7b\x41\x3d\x1d\x90\x52\x2f\xf8\xaf\x2d\x23\xa7\xc7\xfe\xa0\x6e\x98\xd2\x5c\x1b\x26\x0c\x29\x7b\x1a\x3a\x47\xb5\x7d\xff\xb0\xa6\xff\x94\x82\x9c\x7c\x7b\xee\x1e\x94\xbc\xcd\x76\x6f\x75\x13\x0f\x2b\xfa\xcf\x56\x31\x6b\xcf\x6c\xcd\xe4\xf2\x04\xac\xda\x59\xf6\x73\x72\x4c\x0d\x45\x73\x0b\x4f\x0c\xd9\xf5\xf4\x02\xb3\x68\x0a\x78\x6e\xbe\x79\x5c\x3e\xa3\x28\x10\x75\x27\x4b\x28\x7a\x19\xbb\x28\x69\xf3\xb1\xd1\xfc\xb1\xfc\x8c\xf6\x8f\x1d\x21\x83\x05\xb4\x65\xcb\xc3\xbe\xcf\xdb\x54\x8f\x3e\xfe\xfc\x87\xf7\xa7\x5b\xb0\x5b\x0a\xb0\xc9\xe7\x6f\x64\x99\xc7\x78\x79\x16\x3d\xd0\xab\x68\xd0\x10\xf8\x08\x3f\x27\xb5\x1d\x89\xbc\x95\x82\x8d\xc8\x7b\x46\x4b\x62\x0f\x2b\xf7\xcf\x9f\x14\x37\x6c\xf2\x6c\x5b\x4a\xae\x5f\xc4\x2c\x13\xe1\x1f\xe6\x27\xe1\x6d\xd4\x26\x12\x7a\xb9\x82\x48\x77\x3a\xeb\xb4\x92\x53\xe2\x44\xea\x36\xdf\xfe\x87\xf7\xa7\xd9\x5e\xfe\x87\xf7\xa7\xfe\xdd\xed\x3f\xe5\x6c\x37\x5f\x7b\xd7\x0c\xf7\xd7\x2b\x16\xf3\x70\xcb\xe5\x8d\xab\x89\xa0\x6b\xd6\xf8\xfd\x9b\xe2\x93\x2d\x1b\xe1\x19\x20\x9c\x9c\xa1\xf7\x8a\x58\xba\xd2\xdc\xa0\x5c\x24\xc3\x23\xf6\x85\xab\x7d\x52\xd7\x93\x29\xca\x7a\x83\xde\x7e\xe5\x2b\x52\xb7\x95\x81\x2e\x37\xb0\xb5\xec\x5e\x83\x02\x32\xbf\xc9\x88\xeb\xfa\x6a\xb5\x03\xcc\x34\x29\x5f\x79\xf4\xa4\xf0\x8b\xcd\x3f\x78\x43\x05\x9d\xdb\xdb\xe1\xc4\x26\x35\xfe\x19\xed\xe9\x7d\x0c\xf0\x8b\xf0\x15\xbd\xa2\xbc\xa2\x53\x5e\x71\x03\xd6\xc8\xc1\xc4\xcf\x25\x42\xcd\x00\xc9\x5b\x13\xf6\x3b\x67\xd2\xc5\x9d\x30\xa0\x7b\x22\xd9\xb7\xdf\x3d\xbf\xb6\x87\xe2\xc1\x04\x4e\x48\xb8\x71\xc1\x54\x6c\xf5\x25\x8f\x6c\x37\xfc\xfb\x7b\xb2\x16\x87\x5b\x68\xd1\xc6\x83\xd9\x48\xb3\x04\xac\x34\xdd\xaa\x25\x60\x09\xd8\x68\x09\xc0\x17\xae\x97\xed\x16\x8c\x01\x18\x3e\xc1\x18\x80\xdf\x65\x36\x06\xec\xb1\xf4\x39\x19\x03\x9a\x15\x8a\x99\x01\xe6\x00\x88\xc6\xc4\xdf\x0f\x35\x08\x76\x4e\x2e\x96\x4f\x72\x31\xbe\x3a\xe6\xca\xb2\x42\xdd\xe3\xbc\xb2\x1e\x1a\xda\xe3\x57\x2b\x28\xd7\x28\xbc\xce\x9d\x76\xe0\x1b\xdd\xc3\xef\xad\xc8\x4a\xc1\xf7\xc7\x6b\xf0\x81\x1e\x36\x4d\x9e\x79\xf1\x4f\xf3\xd3\x82\x6a\x0f\x7c\x4c\x92\xb7\xf6\xc0\xd7\x2c\x58\xb3\x98\x6d\x0d\xda\xc1\x8e\xfe\xfa\xbc\x9f\x48\x72\xc4\x9a\x05\x79\x7d\xbe\xe1\x00\x43\xfc\x0e\x3b\x5d\x1a\xd3\x4b\x9e\x69\x52\xf1\x19\x33\x3c\x35\x32\x12\x9f\x61\x47\x48\x4b\xef\x00\x0b\xc0\x4c\xfe\xc0\xc2\xe9\x0a\x81\x47\x21\x7d\x7b\xd3\x60\xf7\x3c\xc2\xc3\xa5\x96\x82\x1b\x79\xe7\x5e\xe4\x24\x47\x1f\x03\x37\xf4\xb6\x8f\x06\x4f\x87\x5d\xd4\xf7\x7e\x3a\xc9\x9b\xe8\x53\x4a\x0a\x59\x55\xac\xf0\x58\x1a\xc0\xa6\x03\x66\x0e\xaf\x0d\x2e\x72\x97\x0a\xac\x27\x97\x7f\x00\x27\xb9\x73\x87\x3f\x47\xd6\x7b\xfe\xfe\xe4\xf0\xf8\xcd\xc9\xa4\x2e\xbf\x58\xc8\xeb\xb1\x91\xe3\x56\xb3\x31\x4f\x85\x4a\xdd\x7a\x97\x85\x0c\xd6\xf4\x3d\xa0\x16\x37\xd4\x2c\xf2\x98\xd7\xf6\x49\x96\x7d\xba\x8e\xf6\x3f\x68\xc4\x0b\x00\x44\x36\x97\x87\xa8\xa4\x34\x23\xa2\x28\x24\xdf\x86\x4e\xc9\xb3\xb6\xaa\x90\xcf\xac\xec\x19\xc5\xf1\xe1\xe7\x4f\x46\xae\x57\xa7\x7a\x93\xfb\x59\x59\xbc\xbb\x22\x1e\x86\xeb\x96\xa9\x36\x33\xc9\xc8\x30\x1d\x25\x7d\x96\x39\xef\x7d\x8e\xb9\x0f\x66\x61\x19\xe8\x92\x2d\x09\xa0\xda\x5b\xb3\xf5\x07\xcd\x54\x7f\x0b\x32\x53\xc0\xac\x3f\x6f\x35\x53\x13\x7c\xfc\x23\x5f\xe9\x21\xba\x32\xbc\xff\x7b\x36\xdb\x8d\x75\x7e\xcf\x66\x9b\x96\xd9\x7d\x0c\xdd\x99\x43\x55\x95\x55\xc5\x5b\xb3\xc0\xca\x5f\xec\x9f\x8f\x76\xca\xc6\x75\xc7\x3e\x08\x8f\x7c\xa1\x07\xe1\xab\xe7\x68\x6c\x23\x06\x58\x55\x24\x73\x13\x90\x38\x8e\xe6\x38\x63\x60\xb7\x94\x8b\x5e\x0b\x58\x84\x20\xe3\x57\xac\x5a\x06\x5d\x1d\xeb\x66\xca\x16\x11\x91\x69\x71\x79\x4d\x55\x09\xfd\xa6\x1b\x6a\xb8\xf3\x70\xf3\x74\xc5\xd2\x5e\xbe\x47\xb9\xc3\x5c\x76\x8d\x44\x5c\x01\xb6\xc6\x37\xe6\xce\x98\xc1\x82\x50\xe1\xc0\xa5\x1d\x82\x9a\x3d\x23\x69\x72\xd2\x85\x27\xa2\xb6\xb6\x5b\xc1\x94\xb5\xf6\xab\x25\xb9\x56\x32\x15\x81\xcd\x5f\x77\x4c\x2c\x91\x57\x4c\x5d\x71\x76\xfd\xfc\x5a\xaa\x4b\x2e\xe6\x63\xfb\xb2\x63\xdc\x02\xfa\xb9\xe5\x44\xfd\xfc\x0b\xf8\xcf\x00\xaa\x32\x75\xf6\x08\x1e\xea\xbd\xbd\x1c\xea\xf0\xe0\x86\x03\xf6\xb2\xe7\xdb\xb6\xa5\xba\xa5\xc1\xee\x25\x19\xeb\xd1\xca\x9f\xd8\x8a\x96\x52\xe3\x3d\x76\x1d\x7b\xf2\x9a\x96\x75\x22\x8a\x31\xd9\x19\x71\x9d\xea\xdc\xe1\xa2\x4c\x5b\xba\x2c\xce\x1d\x18\xbd\xef\xdc\x71\x9f\xb9\x24\xd0\x50\x0e\x42\x7d\x54\x02\x80\x67\x7d\x91\x47\xbf\xc6\x23\x83\x87\x07\x07\xbf\x5b\x88\xc2\x51\x9c\x39\x3e\x81\x4f\x85\x08\x85\x6c\x98\x15\xc9\xc5\xe5\x44\xaa\xf9\x7d\x14\x6d\xac\xf2\x6b\xbd\xd4\xbf\x56\x63\xa4\x60\xdc\x94\x1d\xc3\x3e\x3e\xcf\xd5\x53\x75\xc6\xad\xd5\x19\x8f\x3b\xd1\x63\x87\x6b\x2e\xee\x73\x4b\x91\xcf\xd2\x4b\xf3\x59\x85\xdc\xb6\xc8\x13\xc3\x7d\x31\xbb\x66\xa2\x77\x1a\x5d\x23\x01\x9b\xcd\x35\xcc\x04\x0b\x1c\x4f\x16\x1f\x2b\x04\x14\x06\xaa\x68\xcd\x0c\x53\x1d\x60\x7c\x21\x85\x18\xd2\x6f\xd6\x48\xf2\xae\x61\xe2\x1c\x0e\xe1\x27\xb3\xfa\xc9\xac\xbe\xfd\x7a\x32\xab\x9f\xcc\xea\x1c\x66\xf5\xce\x15\x0c\x79\x79\x8a\x20\x88\xae\x10\xb0\x43\x74\x70\x36\xcb\xe3\x3b\x33\x53\xad\x67\x29\x66\x7c\xfe\x86\x36\x83\x0d\xe8\xf0\xa4\x15\x63\x38\x7c\xec\x32\x1b\x00\x9a\xaa\x91\x0d\xb4\xe8\x73\x30\xa2\x30\xfd\x0f\x6f\x99\x0d\x3d\x8c\xdc\x86\xcb\x56\x04\x32\x80\xbf\x23\x52\xfa\xfa\x46\x6d\x3f\x99\x72\xd3\x69\x12\x9a\x19\xec\x07\x86\x3d\x57\x89\x14\xa4\x70\x08\xef\x60\xff\x44\x7d\xea\x32\xd8\x54\x82\xc8\xc2\x78\xa8\xd1\xd0\x3e\xec\xc5\x8b\x17\x2f\xb0\x77\xcc\xef\x7f\xff\x7b\x22\x15\xa1\xa4\x64\x05\xaf\xd7\x6f\x84\xbb\x7e\xfb\x32\xb1\xbd\x82\xbd\xfe\x76\xf8\xe6\x7b\xc0\x65\x69\x8c\xc6\x0e\x8d\x48\x91\x7d\x70\x6f\x50\x3d\x22\xff\xe7\xfc\xdd\xdb\xae\xf5\x5f\xff\x5b\xf0\x9a\x84\xe9\x4c\xa7\x27\x0e\xdf\xbe\xf8\xdd\x37\xdf\x0c\x78\x12\x38\x5c\xa4\xe2\x0e\xce\xd8\x43\xcc\x50\x7b\x1e\x2b\x86\x3d\x79\x40\x81\xf0\x16\x2c\x02\x80\x99\xe4\xf6\x20\xc4\x2b\x28\x35\x9f\x2f\x8c\x83\x89\xb5\x5b\xbc\xe2\x85\x41\x45\x00\xc1\xb5\xa4\x43\x6b\x86\x4d\x8f\x34\x04\xeb\x7d\x40\x02\x4b\xc9\x46\xa4\xe2\x97\x8c\xcc\xf4\x5f\x94\x6c\x9b\xae\x91\x2f\xf6\x2c\xf1\xd8\x47\x48\x44\xc7\xfb\xc9\x7d\x30\x77\xa5\x92\x7a\x50\x06\x4a\x2e\x21\x03\x44\xac\xb8\x1c\x1c\xf2\x69\xd7\x18\xb6\xa1\x3c\x80\x1d\x41\xd9\x26\xea\xb2\x7d\x1d\xb9\x48\x04\x94\xb3\xd7\x51\x38\x51\x7c\x03\x87\x46\xc9\xff\x46\x26\x07\x88\xdf\xe8\x44\x07\x68\x5c\xcb\x73\x1e\x18\xb7\xcb\x4c\x4c\x1e\xff\x92\x21\xf4\xad\xb5\xd7\x98\x08\xad\x16\xe1\xed\x01\xc5\x36\x9a\x1b\xfb\x45\xc5\xb5\x25\x0d\x3a\x02\x39\x8a\x93\xc7\xde\xf0\xa6\x61\x34\xd8\xf7\x1a\x77\x44\x2b\xd6\x46\xc5\x4e\x1a\x03\x46\x86\x23\x1d\x5e\x90\xfa\x2e\xb8\xdd\xd8\x08\x90\xee\x9a\xcc\xb8\x7b\x3d\x17\x84\x05\x4b\x6f\xdb\x1f\x2d\xa9\x66\xa6\x75\x4b\xcf\x94\x92\xca\xbe\x2b\xd3\xda\xf5\x57\xab\xa9\xba\x64\x65\x38\xff\x26\xe4\xcc\x4e\x8a\xef\x6f\x33\xc0\xc5\x53\x51\x6b\x85\xa1\x13\x9f\x2e\xe1\x35\x9d\xc1\x0e\xc4\x3d\x9b\x4c\x9e\xa1\xe0\x95\x8a\x68\x43\x95\x93\x86\xf6\xf3\x61\x92\x67\x8b\x79\x6b\x3d\xb9\xf1\x86\x36\xd0\x02\x1b\xf4\x4c\x60\x00\xf0\x61\xc0\x3b\xbb\xc3\x87\xba\x35\x4a\x3f\x5b\x32\x78\x18\x86\x3a\xdc\xf1\x1a\x27\x23\xac\xfb\xdf\xdb\x89\x19\xb2\xcf\x07\xbb\x49\x40\x52\x0d\xf9\xf9\x0a\x03\x5c\xf6\x31\xeb\x8d\xf4\xd2\x68\x98\x41\x9e\xc9\xf8\xad\x07\x28\xe1\x78\xe5\x74\x0b\x21\x3d\xfd\xe4\x9c\x4f\xd2\xc4\x0d\x7a\x7f\xaa\x01\x7b\x08\xaf\x1d\x52\xc0\xf1\xda\x35\x35\x1c\xaf\xd3\x19\x88\xf2\x95\x23\xdb\x1d\x35\xb1\x51\xe5\x75\x0d\xbb\x76\x43\x07\xdd\x9e\x06\x8d\xd7\x56\xf4\x68\xbc\x72\x68\xd3\x78\x0d\xd7\xa9\xf1\x1a\x92\x06\x8d\x57\x5e\xc1\xe1\x93\xa9\x71\x31\x9c\xda\x81\x9a\xc5\x2c\x30\x00\x44\x3d\xc1\xa7\xe2\x85\xf1\x60\x79\xe1\x94\x1a\x14\x19\x74\xaa\x65\xd5\x1a\x1c\x38\xd7\xa3\x63\x7d\x09\x5e\x88\x55\xd0\x93\x62\x90\x92\xb4\x3a\x48\xa4\x7b\x81\x76\x8c\xea\xca\xf0\x11\x76\x33\x87\x7f\x48\x28\x24\x17\xdb\xe6\x0d\x81\x6c\x3f\xfc\xb1\xf5\xd0\x47\xee\xb0\xc7\xae\x85\x3c\x72\x82\x4b\x24\x86\x3a\x82\x7f\x34\xc7\xde\xf1\x0f\x0b\xd8\x82\xd7\x0b\xe6\x8a\x5c\x22\xe3\xd7\x2a\x59\xf6\x08\x05\x8b\xdc\xf7\x5b\xc5\xa6\x3e\xdb\x8a\x96\xe7\x0d\xf7\x14\x9a\x0f\x0f\x22\x68\x4e\xf6\x8f\x02\x66\xb6\xaf\x97\x3d\x15\x86\xa9\x19\x2d\xd8\x41\x1c\x5c\x60\xcd\x82\xd5\x4c\xd9\x89\x77\xf7\x79\x08\xe6\x05\x15\x65\xe5\xa0\xcf\x71\x17\x11\xf6\xc1\x30\x65\x17\xa9\x4b\x3e\x4b\x52\x1e\xb7\x0d\x98\x05\x94\x6f\x23\xd6\x01\x03\x6f\xfb\xac\x41\x2a\xbc\x7a\x24\xa2\x93\xa7\x5b\x56\xdf\x37\xcd\xb2\x80\x8e\x03\x4c\xe9\x12\xf4\x48\x0a\xd0\x8a\x41\xdc\x2f\x65\xab\x30\xe1\x36\xe4\x51\x16\x52\x29\xab\x9f\x03\x41\x54\x13\xc5\xe6\x5c\x1b\xe8\x0e\xe3\xbb\x5a\x62\x87\x89\xad\xe1\xf1\xec\x54\x26\x5f\x48\xd9\xbb\x05\xe9\x28\x79\x0c\x67\xd1\x35\x4a\x5e\xf1\xd2\x1b\x74\xf1\xf9\xcc\x35\x69\xa8\x8e\xf0\xd3\xa9\xd6\xb2\xe0\x10\x00\xeb\xb8\x28\x79\x7c\xf4\x84\x82\xb9\x58\x32\x63\xad\x7b\xc1\x7a\xc8\xb7\x71\x92\xa1\x24\xb4\x69\xaa\xe4\x4a\x9b\xc1\x6c\x21\x64\xc9\xce\xda\x69\xc5\xf5\xe2\x7c\x57\x12\xa7\x36\xd1\x84\xc5\xc9\x6b\x15\x4d\x37\x25\x50\x0d\x48\xda\x12\x9a\x83\xc5\x65\xf5\x25\x6b\x60\x72\x29\xc0\xd5\x45\xb5\xf6\xa3\xc6\xa2\x46\x82\xde\x59\x31\xc3\xfc\x57\xe9\x7a\x74\xf7\xde\xae\xf7\x84\xb5\xc9\xed\xa7\x3f\x88\xa6\xf7\x79\x41\xab\x6a\x80\xe7\xa3\xaf\x62\x7b\xed\x05\x5d\x00\xbe\x8f\x05\x6e\x18\x6e\xf7\x92\x9f\x65\x28\x29\xc3\xd3\x6b\x82\x1d\x40\xd3\x55\xdc\x8d\x0b\xa7\xa3\x36\xff\x52\xf8\xd5\x1d\x59\x85\xdc\xff\x20\x70\x00\xc2\x77\xe1\x3e\x7e\x4a\x67\x7b\x4a\x67\xfb\xc8\xb5\x75\x9b\x8e\x3c\xa5\xb3\xdd\xf5\xda\xc5\x74\xb6\x9d\x4b\x39\xf7\x8e\x6b\x3c\x1e\x69\x39\x06\x34\x41\x4c\xba\x6a\xb1\xdc\x27\x68\xa9\x43\xb5\xe0\x8f\xe0\x0e\x6c\x2d\xe5\x1b\xdf\xeb\xd0\x18\xc5\xa7\xad\x49\x17\xc5\x79\x73\x0d\x3b\x7a\xc0\x3c\x65\xda\xe9\x0c\x63\xb7\x64\x45\x74\x78\x38\x27\x7f\x38\xd1\x22\x4d\x63\xa0\xa9\x34\x09\xb6\x0b\x98\x2d\xf8\xe1\x33\x4d\x4a\x59\xb4\x35\x13\xa6\xe3\x90\xae\xd6\x05\xe3\x2c\x5b\x3c\x55\x69\x59\x72\x54\x4a\xce\x32\x9c\xaf\x83\xc4\x51\x29\xaf\x85\x3d\x8f\x0e\xcf\x92\x10\x7e\xfb\xe8\xbe\xdd\xb3\x62\x37\x86\xff\x98\xd8\xcf\xe9\x14\x7a\xd2\xbb\x96\xab\x4f\x29\x93\x1b\x1f\x91\x67\x9b\x6e\x8a\xcc\x1a\x49\x5a\xcd\x6e\x4d\x89\xec\x22\xab\x59\x47\x7e\xca\xce\xdc\x8d\xb0\xf0\x53\x76\x66\xea\xc8\x4f\xd9\x99\x69\xc3\xf7\xe4\xd9\x29\xa6\x58\x5a\x75\xae\x72\xbd\x3d\x7b\xe7\x83\xcb\x4c\x18\xb0\x50\xbb\x95\x55\x76\xdc\x9d\x89\xe8\xdc\x58\x05\xfe\x5d\xf1\xc3\xa0\x2c\xec\xe2\xe0\x51\xd1\x9c\x3f\x34\xc1\xd8\xfc\x1c\x32\xd0\x76\x20\x83\x0c\xe6\x72\x80\x4f\x10\xaf\x3e\x5a\x5c\x07\x3d\x88\xdd\xb8\x31\x45\x37\xca\x11\x6e\x64\xf9\x0a\x1b\x50\x53\x21\x24\xaa\xa8\x7a\x84\x0d\xbc\xf5\xc8\x81\x5f\x80\x91\xda\xd0\x02\xbd\x64\x2d\x2f\x41\xa6\x76\x08\x95\xa9\xd8\x71\x78\x65\xe1\x02\x92\x89\x13\x08\x70\x03\x4c\xd1\xd9\x10\x96\x20\xd9\xd8\xc2\x5e\xb4\xe1\x3f\x32\xa5\x07\xf4\xb6\xeb\xae\x7e\xe3\x5d\x7c\xaa\xe7\x06\x5d\x2c\x58\x4d\xe1\x9f\xaf\xfd\x14\x58\x01\x69\xad\x4e\xc3\xb0\x7d\x1d\x53\xb5\x26\x72\x36\xea\x55\x60\xef\x5d\x0d\xe9\xe8\xe6\xaf\x4c\xce\x0c\xe2\x37\xd3\xd9\xe0\x74\x23\xb2\x3a\x61\x67\xbd\xe4\x20\xbb\x91\x40\x8f\xb4\x7b\xcb\x87\x9f\xba\x44\x6d\x38\x44\x70\x86\x77\x68\x72\xf2\x7b\x6a\xf0\xda\xb5\xac\xd0\xd4\x6c\xd0\x51\xc8\x18\xe8\xab\xec\x03\xc9\x79\xca\x06\xed\x5f\x4f\xd9\xa0\x4f\xd9\xa0\x59\xb3\x41\x23\x65\xc7\x9f\x5b\x1b\x12\x3b\xe3\x3c\x06\x9f\xdd\x39\x65\xde\xee\x77\x1e\x07\x9f\x9c\xe9\x33\x33\xa5\xea\x17\xa0\x3c\x9b\x4c\x9e\x61\x09\x4a\xe7\xa2\x68\xcd\x6c\xfc\x07\xc2\x44\x21\x4b\xfb\x9c\x0b\x78\xbe\xd2\x06\x54\xf8\x2e\xce\x13\xd3\x52\xfb\xb1\xe2\x22\x16\x78\x76\x0e\x8d\x6a\xf0\x51\xe1\x7b\x39\xbe\xce\xaf\x98\x0e\x16\xee\x9d\x3a\x1b\x3a\x4e\xba\x29\x2e\x7c\x46\x93\xd3\x6b\xfd\xf7\x9a\x54\xbc\xe6\xd0\xde\xa4\x04\x09\xc7\xb4\x19\x16\xe8\x22\x64\x1f\x1f\x39\x29\x9a\x76\xe4\x1e\x3f\xa9\x59\x2d\xd5\x72\x14\x86\xb0\x5f\xf6\xc6\x74\x77\x1c\x80\x12\x5d\xb4\x4a\x31\x61\xaa\xe5\x30\xc0\xf7\xee\xda\x41\x6d\xda\xaf\xc0\x8e\x28\xd3\x81\x41\x86\x34\x62\xe8\xae\xbe\x0c\xea\xf2\xe9\x20\xd4\x1c\x66\x11\xce\x4e\x07\xec\x37\xea\xb2\x18\xed\xa7\x4c\x5c\x91\x2b\xaa\xf4\xb0\x3d\x4f\xf2\xea\xcf\x25\xbf\xe2\x5a\x26\xe7\xa0\x45\x0f\x8a\xa7\xe7\x3c\x44\xd0\xec\x4e\x95\xad\x69\x5a\xe3\x8e\x13\xbf\x7d\xd9\x87\x46\x5a\x25\x2d\x6c\xdb\x15\x43\xe3\x65\x6a\x80\xb2\xbb\x1a\x6a\x0c\x53\xe2\x15\xf9\xbf\xfb\x3f\xff\xe6\x5f\xe3\x83\x3f\xef\xef\xff\xfd\xc5\xf8\x3f\xfe\xf1\x9b\xfd\x9f\x27\xf0\x8f\x2f\x0f\xfe\x7c\xf0\x2f\xff\xc7\x6f\x0e\x0e\xf6\xf7\xff\xfe\xdd\x9b\xbf\x5c\x9c\x9d\xfc\x83\x1f\xfc\xeb\xef\xa2\xad\x2f\xf1\xaf\x7f\xed\xff\x9d\x9d\xfc\xe3\x13\x1f\x72\x70\xf0\xe7\xff\x35\x98\x74\x2a\x96\xef\x06\xca\x61\xbc\xc6\x19\xf5\x81\xfe\x13\xb3\xb0\xdf\x8a\x95\xc2\x85\x19\x4b\x35\xc6\x47\xbf\x82\x9e\xd2\x03\x07\xf0\xec\x95\x7b\xff\x77\x3a\x48\x38\x97\x82\x81\xb8\x43\x1b\xfc\x3e\x6c\xc0\xcc\x25\x17\x90\x12\x72\xcc\xb7\x86\x36\xea\xc7\xef\x43\xac\x18\x56\x37\x52\x51\xb5\x24\xa5\x0b\x39\x2c\xef\xa1\x8d\xcc\xc0\x46\xd7\x40\x7a\xc9\x53\x76\xf5\x96\x43\x96\x35\x2b\x79\x5b\x6f\x3b\x5a\x89\x54\xc4\x0b\x7f\x6d\x97\x18\x32\x96\xe4\x2c\x64\xc0\xbb\xdb\x5c\xcc\x78\x4a\x8b\x4b\x74\x22\x04\xce\x18\x12\x59\x62\x31\xe4\xf0\xde\x9e\x4b\x75\xad\x19\x15\x21\x72\x0a\x69\xd9\xb2\x64\xcf\x74\xb8\x17\x49\xca\x12\xac\xc4\x94\x2c\x57\xd3\xb5\xef\x06\x38\xb0\xa6\xd0\x1b\xd0\x5f\xb7\xd6\xc6\x7d\x00\x77\x93\x2c\x8d\x09\xf8\x3f\xd9\xf7\x56\xd7\xdf\x36\x9b\x06\x42\x7c\x8e\xbe\x91\xe0\xd6\x71\x8d\xae\x66\xa4\x92\x45\x54\xb0\xd1\x53\x45\x81\x51\x4f\xbc\x88\x1b\x9a\xad\x64\xd9\xd5\x52\x83\x36\x10\x84\xd4\x2a\x8d\xf9\xd6\xbc\xa0\xd3\x8a\xa1\xeb\x08\xf8\x66\x30\x8f\xda\xc1\x6a\xfa\x81\xd7\x6d\x4d\x5a\x6d\xdf\x4c\x8a\xfe\xb3\xbb\x17\xbb\xc6\xad\x89\x7b\xa5\xe6\x02\x7e\xd4\x73\xb3\xa5\x07\xaf\x16\x8c\x9c\x87\x15\xe8\x9c\xbe\x98\xbe\xe8\x7c\x3a\xba\x05\xd3\xdf\x51\xe7\x0c\x50\x39\x83\x34\xdb\x60\x87\x68\x02\x78\x0e\xc9\x8d\x33\xc9\xba\xc0\x10\xbc\xea\x4b\x0c\x90\x5f\x8b\x68\x81\x5a\xe1\xea\xa1\x1e\xeb\x3e\x7e\x74\x5a\xfc\x40\xdd\x3d\x97\xc6\x9e\x45\x4f\xcf\xae\x9d\x87\xfa\xb2\xad\xa9\x7b\xa1\xc0\xad\xa7\xef\x39\x7f\xf4\x86\x62\x37\xea\xeb\x8c\x82\x80\x1d\x02\xb3\x7e\x11\x7c\xdf\x4e\x79\x2c\x96\x85\x6b\x20\xc4\xbb\x1c\xc5\x90\xa7\x86\x7b\x17\x80\x78\xc6\xf6\xff\xbc\x8f\xdc\xa7\x2f\x4d\xd9\x0c\xd3\xfb\xf1\x37\xe0\x5f\xd4\x69\x90\x40\x18\x25\xa8\x98\x01\xe4\x21\x26\xc2\x43\xa1\x46\xa1\x96\x57\x56\x84\x24\x3d\xf9\x07\xed\x12\xec\x78\xe2\xb6\xa0\x07\x3d\x44\x49\x8d\x0e\x3f\xc1\x58\x89\x28\x49\x55\x37\x03\xaa\x15\x89\xef\x3f\x3d\x20\x33\x46\x4d\xab\x30\x77\x5d\x48\x05\x11\x11\x14\x62\xe8\xca\x57\xcc\xb2\x00\x34\x76\x52\xb2\x26\x5a\xd0\x46\x2f\xa4\x01\xb7\x31\x6d\x68\xc1\x4d\x32\xbc\x8d\x51\xb4\xb8\xb4\x4f\x86\x2c\x26\x78\xb3\xb4\xd7\x28\x0e\x5c\x8d\x7e\xcc\xab\x7d\x5c\x29\xb3\x50\xb2\x9d\x2f\x00\x78\x08\xef\x2a\x2a\xaa\x11\xe5\x2a\x2d\x01\x71\xe3\x98\xce\xd1\xa9\x49\xb9\x14\xb4\xe6\x85\x5f\x3f\xa8\x22\xd3\x5c\xba\x04\x13\xa0\x25\x75\xda\x28\x39\x63\x4a\x73\x6d\x98\x30\x98\xeb\x72\x54\x51\x5e\x93\x7d\xcd\x18\x39\xf1\x5b\x1d\xbf\x39\x47\x33\x1d\x83\x5b\xe9\x65\x07\x71\xf2\x8c\x6b\x32\xea\x70\xa4\xed\x27\x3e\xa8\x17\x25\x94\xa6\xb7\x80\x70\xbb\x72\xe3\x2b\x1e\x0c\xd8\x8c\x9b\xe7\x4c\x2a\xa8\x10\x72\xfe\xb9\x2b\x26\x4a\xd9\x25\x56\x27\x8d\x75\x78\x76\xaa\x63\x87\x28\xca\xb4\x06\x47\x87\x2f\x5c\x13\xd4\xd0\xb9\x30\x48\xc4\xa4\xf1\xac\xc2\x25\x08\x17\x25\xbf\xe2\x65\x4b\x2b\x54\xb5\x92\xa7\xe9\xe8\xfc\x14\x89\xe4\xf3\x85\x19\x5f\x33\x08\x27\xa2\xae\xdd\x9d\x22\xfe\xd5\xf8\x5a\xc9\x2c\xd7\xa0\x94\x19\x62\x64\x9a\x40\x62\x2e\x8c\x6d\x27\xed\x9a\x2e\xa1\x9b\xb7\x2b\x7b\xec\x65\x9a\xbb\x15\x73\xc3\xce\x64\x9a\xce\x50\x7b\x2d\xcf\x31\x77\xe2\xc4\x1d\x82\x18\x2e\xa8\x00\xd3\x15\xa2\xd0\x96\xff\x41\xa6\xae\xcf\x5a\xaa\xc4\x69\x02\x07\x77\x8f\x42\xc5\x57\x53\xbb\xe3\x12\x3d\x32\x5b\xf6\x8a\x5c\x75\xbb\xf1\x82\xd5\x4d\x45\xcd\xd6\x13\xba\x7f\x8a\x82\xf2\x51\xae\xa0\x3d\x3a\xa8\x28\xc7\xb4\xb2\x22\xe3\xec\xc7\x23\x07\x5d\x86\x82\x3d\x4b\x65\xcc\x85\x57\x3f\x84\xb3\x70\xd0\x94\xdd\x28\xd3\xa1\xbb\xde\x94\x95\xa0\x0f\x38\x8a\x87\x94\x52\xca\x6b\xc1\x94\xdf\x57\x67\x3f\x1e\x8d\x08\x9f\xb0\x89\xff\x2b\x0c\xe1\xd5\x25\x23\xe7\x08\x4e\xe1\x21\x72\xd2\x33\x0c\x65\x39\xc1\x57\x8f\xe3\xd7\xf1\x98\xbf\xfc\xd1\x4e\x8a\xfd\xf6\x4f\xe3\x3f\xba\x03\x06\xfe\xfa\xc5\x6a\x6d\x03\xaa\xe9\x7e\x59\x79\x5a\x8c\x07\x00\xea\x8e\xfd\xeb\x97\x33\x59\x9e\x37\xac\x98\xe0\xf4\xeb\x5f\x06\x25\xbd\x12\xc2\x84\x51\xcb\x09\x39\x93\x50\x21\xc3\x4b\x14\x68\xf0\xae\x8a\xfd\xb7\x4f\xc8\x00\x36\x08\x51\xdf\x82\x1a\x26\x40\xfb\x15\xe9\xbd\xcf\x89\xc7\xd5\x84\x61\x41\xcc\x53\x98\xe7\x7d\x08\xd5\x21\xbc\xf8\x88\x18\x89\x8d\xba\x53\x4f\x5b\x7b\x1d\x0a\xc2\x3e\x70\x0d\x7d\x44\x70\x25\x81\x49\xa8\x83\x36\xf0\x26\x87\x25\xc6\xf2\x5d\xe8\x8b\xd3\xc8\xf4\x8c\x5b\x98\xc1\x2f\x85\x34\x5f\x86\xcd\xeb\x2b\xd6\xc0\xb6\x90\x84\x5e\x49\x5e\x92\x56\x83\xce\x29\x48\x2b\x20\x65\x61\x00\x84\xac\xe3\x9e\xe9\x92\xd4\x5c\x1b\x7a\xc9\x26\xe4\xdc\x9a\x23\x71\x1a\x31\xf2\x94\x20\xd3\x4a\x16\x97\xac\x24\xad\x30\xbc\x1a\xe4\x99\x09\x74\xc3\xd4\x46\xa6\x0a\x80\xc6\xb6\x85\xd5\x72\x1b\xc5\xc6\xde\x60\xc2\xbb\x06\x78\x8c\xf1\x40\x0f\xb3\xda\xad\xd5\x28\x6c\xd5\x05\x45\xd7\x6d\x53\xc2\x90\xae\xf6\x75\xa0\x30\x5a\xab\xd3\xb7\xf3\x29\xe1\x6f\xf7\x07\x30\x99\x9e\x90\xb7\x60\xb9\x54\xe9\x9b\x12\x8b\x26\xd0\xdb\xed\x32\x64\x04\x2b\x98\xd6\x54\x2d\xb1\xb0\x98\x1b\x5f\xd3\xde\x6a\x36\x6b\x2b\x30\x18\xd3\x27\x95\x8a\xd6\x12\x4c\x14\x2b\xa4\xd0\x46\xb5\x05\x70\x0d\x25\x53\x25\x2f\x99\xe8\x80\x3e\x06\x1c\x26\x71\xc5\x74\x57\xd4\x69\xd5\x6b\x21\x49\xb1\xa0\x62\xce\x02\x94\x30\xa9\x69\x09\x9c\xfc\x5d\x70\x7e\xa4\x4f\xa6\x0c\x7c\x41\x67\xc6\xaa\x85\x06\x18\x64\x6a\xad\x04\x9f\x8d\x94\xfe\x62\xef\x43\xc1\x77\x1d\x25\x34\x09\x5e\x6d\xb1\xd4\x70\x78\x46\xc9\x18\xac\xd5\x54\x87\x61\x86\x0c\x92\x9a\x19\x5a\x52\x43\x77\x05\x43\xe0\x0d\x5d\x86\xcc\x34\xcc\xd9\x07\xd6\x8d\x72\xf9\x9d\x99\xe0\xfd\x43\xb2\xe1\x31\xa0\xf5\xd9\x8f\x47\x83\xc6\x07\x87\x10\x70\x2b\x74\xc3\x32\x56\xca\xb8\xd4\x45\xd8\x55\x08\x1d\xe1\x11\x01\x2c\x69\x9e\x12\x3c\xc6\x59\x49\xca\x76\x70\x34\xbb\x53\x11\x86\xe4\x4e\x65\xc9\x9c\xb2\xfc\xb9\x2b\xcc\x71\xd1\x25\xa3\x17\xfd\xea\xf4\x8d\x86\x3e\xe6\x2c\x32\x61\xb8\x62\x11\xe0\xfa\x20\x12\x1c\xbf\xb5\x02\x25\x69\x9f\xf3\x90\x35\xe7\xcc\xe8\xae\xec\x12\x15\xca\x81\xa3\x1a\x67\x24\xe1\x1b\x81\xe5\xe7\xb9\xd1\xc5\x5a\x36\x4e\xc0\xa0\x31\x91\xcf\xb5\x74\x8a\xa3\x55\xb9\xb7\xce\x8c\xf9\xb2\xe6\x68\x61\xcf\xf9\x37\xb2\x1c\x9e\x7e\x97\x37\x0f\xb4\x47\x5a\x07\x6e\x83\x18\x50\x1a\xc2\x9d\x78\x03\xa4\x52\xeb\x1e\xb8\x3d\x6a\x32\x0b\x7a\x35\x18\x00\x3a\x39\x16\xd6\xf9\x2b\xc6\x3e\x2c\x86\xe4\x8e\x81\xdc\xf1\xcb\x81\x84\x0d\x2f\x40\xf4\xd7\xc0\x42\xc4\x3e\x41\x59\x72\xc4\xee\x01\xe2\xd5\x5f\xf6\x88\x3f\xcf\x92\x1f\x96\x9b\xdb\x3b\xca\x9c\xda\xea\xca\x05\x42\x61\x8b\x83\xc5\x64\xdc\x1e\xc2\xc3\xd7\xeb\xcb\x9e\x99\xea\x9c\x2b\x21\xbe\x81\x90\x52\xfb\x3e\xe0\x31\x71\x6c\xed\xbb\x6f\xf5\x6f\x3f\xc8\x4c\x0c\x58\xe5\x9b\x7d\xe0\x83\x47\x3a\x75\xd5\x91\xde\x73\xc5\x14\x54\xea\x44\xd0\x96\x56\xd4\x28\x59\x55\x4c\xc1\x12\xb8\xa0\xc6\x4a\x01\x98\x5d\x2d\x82\x69\x80\xe9\xfd\x38\xfc\xe5\xc3\x7c\xc1\xd5\x26\xd8\x75\xb0\xae\xa9\xc6\x4e\xd7\x3e\x03\x1e\xc2\x97\xbe\xaa\x6f\x13\x3d\xc3\x45\xde\x4f\x3e\x18\x78\x28\x96\x38\xf9\xc7\x11\x73\x62\xc8\x8c\xcc\x2d\xa9\x5c\x13\x26\xe8\xb4\xb2\xe6\x48\xc4\xc0\x81\xce\x15\xed\xd4\xc8\xe8\xae\xf7\x6c\x36\x7c\xea\x20\x86\x19\x3f\xf2\xd3\xc6\x46\xf5\xb6\xf7\xc3\x49\x57\x0b\xeb\x7c\x33\x19\x1a\x02\xfb\xcb\x71\x5d\x6f\x88\x7e\x7d\xd4\x0a\x35\x71\xb7\x99\x8d\x6f\x30\x94\xa6\x6c\xd5\x04\xf9\xea\x09\xa0\x5f\x08\x4f\x8c\x0f\xf4\x1f\x33\xc8\x4f\x88\x57\xbe\xb2\x04\xa8\xf2\x85\x92\xb0\x1c\xf9\xdd\xb9\xcf\x1d\x82\x61\x3b\xa0\xcf\xbb\x80\xe7\xf0\x87\xb7\x29\x42\xbe\xf3\x94\x59\xe9\xdc\x35\x9f\x1a\xbe\x2f\x08\xee\x8d\x78\xfc\x0d\xa5\x83\x9d\x98\xfb\x8e\x8b\x32\x14\x71\x7a\x50\x58\xab\xa0\x1d\x9e\x9d\x22\xd5\x79\x68\x7a\x0d\x67\xc2\xd2\x19\xbc\x66\xc1\x55\x39\x6e\xa8\x32\x4b\x0c\x6d\x8d\x7a\x14\x07\x3c\xc7\x0c\x43\x67\xcd\xb4\xb7\x9b\x29\x3b\xcb\xc1\x12\xf8\xb4\x44\x97\x37\x7b\x23\x87\xec\xda\x8c\x0c\x45\x89\xf4\x57\x6f\x46\xde\x76\xed\xd0\x42\x10\xe7\x91\xcc\xc8\x7d\x55\x8c\x93\xfe\x69\xb6\xbb\xba\xb6\x3d\x6a\x75\xbf\x76\x09\x55\x5f\xf0\x57\xb8\x30\xa4\x8c\x61\xc3\x82\x95\x09\x5e\x7e\xfb\xa4\x11\xe1\x33\xab\xb4\x49\x31\x86\xcc\xc7\xc1\xe4\x75\x69\x4f\xce\xd2\x9d\xb8\xf2\x66\xf4\xc0\x83\x60\x8a\xa8\x8c\x86\xee\xe4\x20\xd9\x17\x32\xdd\x41\xef\x2f\x90\xad\x38\xd6\x01\x56\xb4\xdf\x90\x49\x32\x1d\xde\xc2\x8a\x74\x9a\x67\xec\xba\x8f\xce\x02\xaf\x12\x73\x51\xda\x4d\x05\x2a\x12\x38\xf5\x75\x5b\x14\x8c\x85\x90\xa1\x13\x4b\xc3\x4d\xda\xde\xd9\xe3\xa6\xbc\xa6\xa6\x58\x30\x4d\xb4\x84\x5e\xc7\xda\xd0\xaa\x62\x65\x48\x75\x42\x46\x91\x60\x55\xb8\x34\xa8\xc1\x74\x44\xc6\xca\xf0\x29\x8e\x02\x23\x2e\xea\xda\x54\xd4\x05\x95\x66\xad\x28\xb0\x7e\x91\x9b\x65\xc8\x32\x59\x35\x4c\xc1\x0f\xad\x21\xd6\x36\xdc\xf4\x99\x61\xc6\x48\xe4\x53\x0e\xcc\x0c\x87\xff\x12\x8f\xfb\x05\xbd\x62\x5d\xb6\x87\xeb\x12\x69\x4f\xe9\x00\x75\x9b\x81\xd7\x23\xa8\xdc\x11\x5a\x08\xb1\xc2\x2e\x9e\xc5\xc9\xe0\x5c\xe4\x36\x65\xe2\x79\xd8\x8f\x26\x7d\xcd\xc4\x39\x08\xa6\x8d\x66\x26\x80\x78\x0f\xd7\x78\x89\xcb\x9f\xa7\xad\x91\x35\x35\xbc\x80\x10\x1d\x9f\x45\x49\x62\x35\x26\x5e\x58\x49\xe3\x13\xe1\x51\x45\x02\xc5\xcd\xad\x5b\x26\x31\xb0\xd9\x58\xba\x87\x89\x8f\xe6\xda\xad\x72\x7f\x5a\xfd\xb4\x44\xaa\x67\xa6\xf7\xbc\xf0\x88\xc8\xc4\x2c\x14\x63\x84\xd7\x8d\x54\x86\x0a\x43\x4a\x3e\x0b\x18\xdd\x3e\xc3\xf0\x36\x9e\xc8\xe1\x0f\xfa\x09\xf2\x6a\xa3\x51\x30\x60\x5a\x55\xf2\x5a\x13\x73\x2d\x43\xc8\xa1\xcb\xef\x72\x98\xc7\xa3\x3e\x31\x19\x74\x1c\x37\xaa\x3d\xea\x2c\x5f\x45\xe7\xd0\xc8\xca\x9e\x6b\x56\x55\xf6\xbf\xb7\x9d\x46\x83\x71\x4c\x36\xce\x09\x9f\x0b\x84\xa1\xe5\xda\x07\xbf\x1c\x86\xca\x7e\xa9\x64\xd3\xb8\xe4\x87\xfa\x20\xff\x9c\x40\xf2\xba\xba\x62\x1a\x8a\x4c\x3c\xae\x8b\x65\x85\x39\x13\x4c\x51\x03\xe9\x75\xae\x9f\x2b\xa8\x24\xab\x44\x0e\x0d\xfa\xe0\x95\xd1\x2f\xf2\x11\xa6\xc3\xd4\xcb\xcd\x4c\xe6\xef\x71\xdf\x66\x78\x2f\x2e\x90\xdf\xbc\xdc\xc9\xc0\x40\xfb\xdf\x32\x43\x0f\xc8\x0f\x1a\xd9\x22\x9c\xbc\x01\x87\xe7\x93\xbc\x6c\x0e\x6f\x1d\x1d\x6d\x19\x88\x3a\xac\x9a\x45\x44\x55\xec\x97\x0a\x10\x72\xfd\xb9\xee\xd1\x7b\xa4\xa4\xd6\x6f\xfd\x4f\x1e\x90\xf4\x27\x9f\xd5\x47\xae\x27\x9f\xd5\x93\xcf\xea\xc9\x67\x05\xd7\x93\xcf\x6a\xf5\xfa\x5c\x7c\x56\xa4\x3b\xae\x76\x55\x36\xbd\x8d\x4d\x97\xfe\x01\x7b\xcf\xf3\x4c\xc8\x5b\x69\x5c\x8a\x31\x58\xb0\xf4\xc6\xa0\x13\x85\x13\xfa\x9a\x2e\x27\x82\x19\xd7\xc9\xc4\xc7\x77\xdf\x7b\x9a\xfe\xa2\xac\x35\xe2\x5c\x1f\x91\xdc\xf0\x82\xcc\xb7\xb7\x89\x46\x31\x12\x55\xb3\x2e\xe3\x19\x3e\x7f\xa6\x5d\x5e\xab\xfd\x1e\x20\x0b\xe3\x07\x14\x6c\x42\xce\x5d\xad\xcb\xca\xe0\xeb\x4d\x16\x4a\x66\x28\x1f\xd2\xbb\x29\xbe\xbc\x36\x74\x71\x83\x76\xb6\x35\x6d\x87\xe4\xdc\x36\x01\x74\x69\xd7\x5c\xb1\x1d\x88\x5b\x54\x9d\x1b\xd7\xf4\x77\x37\xdc\x57\x86\xcf\xe9\x8c\xbc\x67\x85\xbc\x62\x0a\x57\xf7\xe4\x43\x43\x85\xe6\x52\xbc\xa6\xbc\xb2\x6b\xeb\xd7\xb8\x8b\x76\x93\x56\x33\xd5\x4f\x81\x8c\x52\x34\xc2\x06\x77\x8c\x64\xb9\x77\xb8\x81\x12\xba\x9b\xd8\xf1\x5c\x05\x5d\xa3\xd8\x15\x97\xad\xf6\xc8\x07\xad\x41\x4d\x43\x1b\xe7\x21\x5a\xf0\xf9\xc2\xdf\xec\x2b\x56\x21\xeb\x5a\x95\x61\x13\x0f\xa6\x4c\x1b\x6a\x5a\xdd\x87\x9f\x2e\x20\xf1\x70\x87\xb2\xaf\x02\x1f\xed\x8e\x11\x92\x53\x5d\x47\x04\x8a\x5d\x3d\x10\xbf\x47\x7c\x0c\x7c\xf4\xd4\xed\x65\x0f\xf5\xd1\xc1\x9a\x14\xb2\x6e\x5a\xc3\xa2\x3d\xef\x76\x57\x1e\x51\x7f\x47\x66\xea\xf5\x7f\x7a\x5e\x53\x41\xe7\x6c\x1c\x48\x1b\x77\x28\x1f\xcf\xb3\x49\xfa\x2c\x6c\x45\xb2\x37\xff\x89\xaf\x47\x87\xce\xd1\xbf\xb2\xe1\xec\x91\x7b\xc1\xda\x23\xf9\xf1\xf6\xc8\xfd\x63\xee\x91\x00\x81\xba\xab\x02\xe8\xbd\xa3\x6f\x55\x04\x39\x25\xe3\x36\x11\x94\xd3\x54\x76\xca\x86\xa3\x85\x6b\x22\x6b\x6e\x0c\xf3\xe5\x88\x41\xa4\x8c\x08\x37\x3d\x74\x4c\x27\x40\x21\xc0\x89\xd5\x83\xec\x43\x53\xf1\x82\x9b\xa8\x7d\x5d\x22\x80\xc4\xea\x05\x0e\x84\x6b\xae\x51\x95\x17\x84\xd7\x4d\xc5\x82\x06\x3e\x76\xe8\x42\x3e\x08\x17\xde\xa6\x80\xda\x14\xc2\x3e\x40\x28\x16\x09\x7e\x92\xdb\x77\xbc\x9e\xe4\xf6\x0d\xd7\x93\xdc\xce\x2e\xb7\x11\xbb\x74\x38\x14\x70\x4f\x5e\xfb\x87\xba\xee\x4b\x74\xca\x2a\xf2\x6b\xcb\xd4\x92\x58\x03\xab\xc3\x05\x91\x56\xd8\x69\x5e\x22\x7e\x85\xcf\xe9\xd8\xa1\x08\x41\x4e\xe5\x1c\x72\x46\x4e\x3e\x58\xfb\x16\xba\x52\x64\x3f\x25\x57\x07\xe8\xf7\xbe\xc2\x55\x08\x2b\x13\x5b\xa5\x58\x48\x15\x7f\x02\x26\xe6\xe1\xdb\xe3\x9c\x0e\x8c\x1c\x65\x2a\x24\x5f\xa9\x0a\xb9\x27\x25\x83\x90\xc3\x5b\xe6\x1a\xd7\x24\x7c\x03\xe7\x78\x28\x6b\x0a\xd1\x5c\x72\xc9\x96\x23\x57\xea\x49\x2c\x07\x52\x7f\x73\x26\x12\xb1\x7a\x1e\xd5\x9f\x4b\x86\x79\x1c\xc3\x7a\x95\xf6\xaf\xcc\x07\x62\xce\x50\x1d\x5e\x63\xfb\xda\xd9\x9e\xe5\x97\x28\xcf\x19\x9d\xf9\xcc\x27\xf6\x55\x73\x3d\x6a\x65\xcf\x58\xde\x71\xde\x6d\xe4\x79\xfb\x41\x40\xa3\x0c\x6c\x0e\x48\xa1\x20\xf0\xf3\xb0\x17\xc9\x1d\x4c\xc0\xcb\x2f\xe3\x3d\x4d\x56\x36\x01\x43\x22\x5a\xfb\x78\x86\x97\x6c\xf9\x4c\xbb\x36\x24\x52\xe8\x05\x6f\x40\x7d\x87\x64\x26\x39\xcb\xba\xc5\xf1\xfa\x11\xca\x61\x3d\x31\x78\x6e\x9c\x8a\x11\x79\x2b\x8d\xfd\xcf\x09\x80\x53\x80\x78\x39\x96\x4c\xbf\x95\x06\x3e\xd9\x69\x2e\xc0\x49\x7a\x0c\x3c\xe0\x72\x8e\x38\x64\xfc\xc0\xf1\x8a\xf8\xd5\x80\x55\xe8\xd6\xda\x57\x1d\x05\x7e\xe1\x9a\x9c\x0a\x22\x95\x5b\xa2\x8c\xe4\x80\x6b\x1e\x49\x42\x62\x7c\xbc\xbb\x4b\x0a\xdc\x44\x8d\xe3\x11\xa9\x7a\x2c\xf2\x20\x84\x39\xa2\x20\xea\x83\xdf\x40\x74\x0b\x72\x61\x3d\x74\x01\x80\x5e\x29\x6a\xd8\x3c\x43\x12\x6f\x77\xd5\x4c\xcd\xa1\x4f\x50\xb1\xc8\xbd\x1b\x72\x29\x5a\x78\x65\x54\xb7\xf0\xba\x87\x2d\x7b\xaf\xd5\xc2\x0f\x32\x00\xe8\xee\xdf\x03\xc4\xc7\xae\x7a\xcf\x22\x12\x51\x8b\xad\x69\x63\xe5\xcd\xff\xb3\xca\x2a\x6c\xaf\xff\x21\x0d\xe5\x4a\x4f\xc8\x21\xd1\x5c\xcc\x2b\xd6\xfb\xce\x05\x8b\xa3\xc7\x64\x22\x0b\x72\x59\xac\x7e\x78\x45\x2b\x86\x38\x4d\x54\x10\x86\xee\x2a\xc0\xe7\x5e\x31\x8c\x46\xe4\x7a\x21\x35\x6a\xbe\xa1\xc4\x60\xef\x92\x2d\xf7\x46\x59\x42\x61\x24\x3e\x9f\xed\xa3\x4f\xc5\x5e\xd7\x08\xae\x27\x89\x82\xee\x0f\x19\x8f\x7b\xf0\xdd\xde\xc3\xd8\x63\x8f\xc0\x5d\xf5\x28\x8a\x9c\x5c\xb8\xf1\xa8\xa2\x98\x22\xb0\x6b\xc1\xf5\x55\xfa\x56\x33\x7e\x00\xe9\x3e\xba\xa7\x4b\xef\x70\x28\x67\x3b\x17\xc5\x05\xdc\xe2\x4c\xe0\x19\x19\x98\x0b\xc9\x3a\x34\x46\xf1\x69\x6b\x98\xde\x59\x4e\xb8\x91\xd0\x08\xd6\x2d\xf4\x4f\xb5\x2b\xff\xe3\xa6\x1f\x44\x08\x78\x5c\xe7\x62\x8e\xd3\xd9\x6a\xee\x64\x04\xa9\x1b\xe3\x22\x48\xe5\x10\xf6\xd6\xaa\xf0\xec\xdf\x34\x90\xea\x30\xd4\x87\xa7\x53\x75\xc9\x9a\x8a\xe9\x46\x62\xd5\xd9\xc6\x89\x71\x8a\xe4\x82\x6a\xc8\xba\x9f\xb9\xa4\xa8\xa6\x55\x8d\x04\x2c\x74\x2a\xd6\x36\x63\x16\xdc\x08\x07\x12\xe2\x41\x98\x10\x70\x2e\xec\x5c\xbb\xdf\x43\xff\xcb\xc3\x95\xce\x2f\x52\x41\x33\x09\x57\x18\x20\x4a\x5e\x38\xbf\x10\x35\x44\xa4\x01\x18\xc7\xd7\x66\x06\xf2\x95\x4b\xe8\x16\x08\xf0\xf7\xc8\x4a\xde\x44\x40\xda\x99\x30\x90\x63\x23\xc8\xa9\x98\x31\xaa\xf9\xb4\x62\xae\xb8\x41\x1b\x6a\x32\xcc\x5f\x94\x90\xef\xe6\xd1\x9a\xd3\xa0\x45\x70\xa3\x57\x93\x6b\xf6\xb9\x28\xaa\x16\x78\x40\xf0\xea\x00\x5c\xd8\x54\x14\xac\x42\xdd\x46\x96\x01\x8d\x2b\x1b\x5e\x44\x94\x48\x34\x63\x4a\xe1\x7c\x4d\x97\x9b\x77\x33\x29\x25\xc3\x54\x64\x00\x52\x19\xe1\xeb\x6d\xae\x90\x71\xcb\x30\xfc\x80\xc1\xd9\xa2\xe4\x8c\xe1\xee\xc0\x95\x21\xd4\x1e\x25\xb3\x0a\x71\xe0\xdc\x59\x02\x33\xe4\x2a\x1d\xce\xa3\x8c\xa1\x11\x82\x82\x3a\xec\xce\xb8\xf1\xe7\x60\xf2\x1c\x40\xe6\xb6\xce\x2f\x5c\xa6\x71\x27\x99\xc6\x70\x7c\xb1\xc1\x81\xc7\xcc\xe7\xd7\x9b\xc1\xfd\xbd\xef\xeb\xc0\x82\x36\xd1\xbe\x25\x46\xaf\x55\x57\x57\x23\x7d\x4f\x3a\xcb\x8f\xb0\xe9\xe5\x8c\xbc\xe6\x15\xd3\x4b\x6d\xb0\xf8\x91\xd7\x28\xb8\xb0\x3c\x54\x1a\x82\x52\x01\x93\xe9\x50\x70\xd9\xd3\x2c\x4f\x20\x2b\xdb\x0a\x67\x57\x49\xba\xc7\x7a\x9d\xd2\x57\x65\xaf\xc1\xd6\xae\x4a\x20\x28\xd9\x0d\xf5\x50\x59\x56\x6b\xd0\x6c\xcd\x92\x60\x1d\x7b\xb3\x31\x2b\xfa\xbe\xd8\xd7\x7c\xaa\x18\x39\x5a\x50\x21\x58\x15\xf5\x8b\x74\xa9\x1b\xd4\x18\x5a\x2c\x50\x9a\x53\x62\x25\x49\xc5\xcc\x33\x4d\x16\x52\x1b\x52\xd3\x62\xc1\x45\x68\x34\x25\x42\xdf\xd4\x0e\x05\xf8\x11\x02\xdd\xcf\xf4\x85\x25\x20\x71\x9d\x73\x09\x17\xa4\xc2\x73\xec\xac\xdb\xd8\x20\x55\x8c\x24\x90\x06\x94\xa1\xc9\xde\xda\xb3\x43\x0f\x68\x2f\xa5\x60\xad\xd1\x53\x00\xe7\x26\xdc\x9b\x3e\xf2\xc9\x87\x09\xd9\x63\x1f\xcc\x37\x7b\x23\xb2\xf7\x61\xa6\xed\x7f\x84\x99\xe9\xbd\x09\x39\xad\x43\xa2\x10\x17\x91\x1a\xc1\xdc\x0f\x08\x9f\x91\x56\x0c\x2e\xea\x1c\x2c\xb1\xaa\x56\x64\xe1\x8f\x67\x55\x2b\xec\x12\xbf\x73\xad\x98\x5f\x91\xd7\x47\xc4\x50\x35\x67\xc6\x8e\x41\x44\x5b\x4f\x99\x4a\x6d\xd9\x9a\x23\x71\x64\x78\x9b\x7d\xc5\x68\xf9\x4e\x54\xc9\xb1\xbd\x5c\x1b\xca\xd3\xd1\x9f\xef\xe3\x28\x71\x6d\x46\x2b\xcd\xc8\xbe\xbd\xf1\xf9\xb5\xe2\x86\x1d\x4c\xc8\x7b\xff\x2b\x28\x7f\x07\x5d\x74\x26\x87\xe8\x7b\x58\x35\xe2\x1e\xaa\x99\x41\xcc\x62\xe1\x6c\x90\x37\x76\x53\x27\x6b\x81\xb8\xe0\x53\x29\x2b\x96\x08\xe9\x8e\xbc\xf7\xd3\x4f\x6f\x93\x5d\x63\x7d\xfe\xee\x9e\x77\x13\x9b\x5f\x4b\x55\x95\xd7\xbc\x74\x85\x47\x64\xdf\xde\x7c\x30\x8c\xe5\x87\x84\x16\x06\x06\x12\x72\xb7\xb5\xcb\xe3\xc3\xbf\xbe\xe6\x65\x9e\x15\x1d\xb0\x01\x81\x88\x3e\x0f\x78\xc7\x88\xe5\x01\x02\x4c\xc0\x4b\x26\x8c\x15\xee\x4a\x93\x7d\xf8\x45\x3a\x8e\xe6\x09\xc7\xbe\x27\x30\xae\x54\xa4\x90\xf5\x94\x8b\xae\x2d\x51\xc7\x9b\x56\x81\xb1\xf2\xd6\x47\xdc\x34\x33\xd8\x4b\x00\x50\x0d\xa5\x59\x10\xcd\xeb\xb6\x32\x54\x30\xd9\xea\x2a\x19\x4e\xe3\x89\x3d\xd7\xae\x59\xc5\x3e\xa0\xec\xdb\x56\xd3\xc5\x8e\x82\xbe\x66\x0c\x48\x15\x5d\x67\xb8\x55\xd5\x38\x69\xac\x0e\x1e\xa9\x7c\x1e\x54\xeb\xd0\xe7\x84\x7d\x60\x85\x43\x51\x6d\xaa\x76\xce\x13\xbd\x33\xc7\xf6\x2d\x0a\x6a\x58\xf9\x8a\xbc\xee\x5e\x0e\x30\xba\xfc\x37\x13\x72\xe4\x73\x1a\xdd\xf0\xe4\xe8\xfc\xf4\xd8\x35\x07\x13\xda\x30\xba\x0d\xdd\x7d\x58\x02\xd5\xd8\xb9\x62\xb7\x60\x34\xe0\xc0\x59\x44\x6c\xd7\xa1\x6d\x35\xfe\xe1\xbe\x71\x9d\xb7\x43\x07\xe5\x61\xcd\xac\x06\x8b\x84\x27\x7b\x69\x6b\xf6\x52\xdc\x70\x39\x22\xab\x64\x0d\x13\xf6\xcc\x13\xf1\xfe\xc7\x79\xde\x1a\x9b\x48\x58\xe3\x4c\x7a\xa5\x7b\x58\x5f\xa9\x8c\x7c\xe4\x0b\x59\x95\x9a\xb0\x0f\x46\x51\x7b\xec\xd7\xf6\x80\x0f\xbf\x99\x11\x2a\x96\x93\x61\x2a\xe6\xa0\xb0\x74\xde\x50\xf4\xe0\x95\xd9\x6d\x0b\xad\x7c\xb2\xd0\xe2\x4b\xb3\x42\x31\x33\x00\x46\x2d\x5b\xe3\x7f\x4f\x48\x7f\xb9\x7a\x1f\xaf\x39\x58\xf1\x5b\x0f\xd2\xe0\xd2\x4a\x86\xf8\x8d\x35\x13\x9a\x1b\x7e\xd5\xeb\x0e\x0a\x30\xa8\x54\xeb\xe0\x87\x04\x65\xca\x09\x40\xdd\x43\x28\x4d\x1e\x18\xe3\x93\x7c\x46\x84\x5c\x79\xab\x18\xba\x22\xc4\x09\x7b\xb7\x24\x0f\x1a\xf2\x70\x6a\x6c\xac\x4d\x05\x00\x1e\xe2\xc3\x47\x80\xb5\x86\xff\xc6\x54\x1c\x3b\x07\x91\x37\x16\x66\x21\x7d\xa6\xdd\xec\x6d\x4f\x6c\xe6\x48\x39\x1f\x8a\x50\x93\x33\x76\xf4\x36\x52\xed\x3c\x38\xc9\xb0\xf0\x42\xbf\x93\x1c\x9b\xcd\x58\x61\xf7\x06\x74\xaf\xf3\xad\xd8\xac\x59\x5b\xb6\x08\x00\xe2\x01\x49\xfb\x80\xa2\x43\xa1\xf7\x22\x98\x89\x2e\x7b\xf5\x54\x68\x43\x01\x23\x12\xde\xd8\xea\x69\x56\x79\x72\xfd\x07\xdd\x76\xc2\xe8\xb5\x47\x9a\x1c\x48\x44\x6d\xd5\xb0\x82\x29\xbb\x63\xaa\x25\xb9\x56\x72\x68\xd1\xd6\x1d\x63\xab\xf2\x8a\xa9\x2b\xce\xae\x9f\x3b\xc4\x9a\xb1\x7d\xd9\xb1\x03\x01\x7c\x0e\xee\xae\xe7\x5f\xc0\x7f\x06\x50\x95\x29\xfa\xe6\x4e\xd9\x57\x64\x6f\x2f\x87\x5f\x60\x70\xea\xda\x0c\x9a\x70\x26\x19\x54\x79\x7c\x02\x30\xfc\x4a\xa8\xcc\x7d\xe8\x1c\x02\x9f\x12\x1a\x73\x67\x4d\xa4\x90\xdb\xcd\xee\x1f\xe4\xda\xb7\x10\x6d\xf9\xa4\x03\x59\x6a\x85\x48\xae\x2f\xec\xdb\xfe\x38\x4c\xcf\xf0\x0f\x09\x9e\x5c\x8c\x8d\x62\x2c\xbc\xaa\x71\xe6\x93\x90\xbe\xf1\x79\x30\x6c\x1e\x61\x10\xaf\xa4\x86\x6a\x66\x86\x04\x93\x73\x89\xfa\x88\x14\x3b\xbf\xb1\xd4\x77\x5f\x41\xbe\x15\x03\xa4\x6a\xdf\xdb\x91\x8c\xff\xe4\x4c\x7f\xd1\xbb\xd3\x1a\xfd\x6e\x5d\xd3\x4f\x72\x44\x24\x82\x6e\x2d\xe8\x03\xc2\xb1\x3b\x26\xd9\x96\x8d\xe8\xde\xf2\x87\x1f\x4e\x8f\xf3\xb8\x52\xba\xe7\x79\xcf\x00\xfc\xbb\x3f\xfd\x6e\x93\x72\x4d\x5a\xc1\x7f\x6d\x63\x27\x34\x74\xed\x0f\x1b\xc9\xdd\xbf\x8d\xd9\x99\x17\xac\x4b\x4e\x38\xe6\xfa\x72\x5b\x92\x71\x8d\x90\xbe\x8c\xfc\xcb\xd1\x09\x71\x9f\xde\x96\x49\x90\x34\xf4\xc3\x64\x1f\xf4\x65\xe8\x5f\x8e\x4e\x56\x5e\x77\xc5\x8d\x7a\x58\x55\xde\xd7\x23\x85\x0e\xa0\x9e\x4e\xba\x66\x9a\x62\x90\xcd\x56\xa3\x57\xac\xe4\x0a\x53\xd5\xfc\x5b\x96\x93\x42\xf3\xd0\xf4\x6c\x7e\xc9\x26\x5c\x46\x69\xa9\x69\x53\x30\x28\x8b\x4c\x7f\x31\x2f\x58\x97\x10\x5d\x72\x7d\xf9\xf8\x3c\xc9\x4d\xf9\x36\x0d\xe4\xf6\x73\x4b\x3f\x59\x75\x77\x3a\xd9\xe9\x94\x20\xd8\xdd\x4b\xd9\x92\x6b\xd7\x7b\x7c\xa0\x9b\xf5\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x85\xee\x2a\x09\xd6\xc2\xbe\x77\xa7\x2b\x34\xd9\xd7\xaf\xb6\x9c\xaa\xb2\x13\x5b\x91\xe4\x38\xdb\x1b\xaa\x0c\x78\x3d\xb7\xcd\xda\x81\x10\xaf\x12\x44\x1f\x88\xfb\xe4\xed\xd3\x99\xc7\x50\x1a\xb9\xde\xb0\xe8\xb9\xe7\x3a\x3c\xbc\xcb\x98\x06\xed\x2f\x07\xff\xbe\x96\xc1\x62\x79\x5e\xb2\xab\xe7\xba\xa4\x2f\x47\xf0\x5a\x1e\x03\xb2\x3f\x07\x54\x93\xbd\x97\x7b\xe9\x23\x9f\xf3\x9a\x57\x54\x55\xd8\x13\x25\x34\x9b\x09\xcf\xb7\x27\xa4\x27\x04\xca\xce\x5e\xec\x91\x7d\xa9\x80\xa2\x82\x0a\x52\x31\xdf\x3f\xc5\x49\xd2\x25\x3a\x07\x0e\x3e\x93\x2d\xb4\xed\x7c\x2c\x3c\xd8\xb6\xbe\x09\x4b\x6f\x0f\x39\x9d\x3b\x8e\x73\x9e\x1d\x77\xea\x23\x17\x56\x07\x9b\x90\x1f\x9c\x66\xe7\x74\x73\xe4\xda\x12\x14\x32\xbc\xe3\xf3\xe0\x8e\xcf\x29\x8c\xb3\x12\x90\xb9\xd7\xc0\x0a\x59\xcf\xe4\xfb\x4c\x38\x22\x35\x58\x34\xe7\xe6\x3d\x6b\xe4\xd6\xec\x44\x1c\x7e\x25\xa5\x86\x1b\xfb\x81\xd4\xdc\x48\xb5\x24\xd4\x10\x8a\x27\x43\xd1\x56\x54\x11\xc5\x30\x39\x26\x83\xd9\xe6\x46\x5f\x31\xd6\x2e\x64\x97\x81\x13\x63\x18\x3a\x37\x74\xa0\x6f\xe4\x4e\xe3\xc4\x18\xdd\x89\x3d\xaf\x8e\xb9\xb2\x52\x5a\x62\x55\x18\x37\x47\x61\x30\x84\x53\xaa\xa4\x70\xd0\x46\x76\x44\x97\x85\x33\xe7\xc6\xb5\xd8\x45\x02\xec\xd7\xfe\x69\x49\xa4\x00\x05\x20\x53\x65\xf9\x4c\x77\x6f\xfc\x08\x73\x7b\x3a\xc6\xd9\x86\x3f\x11\xcc\x6e\xa9\xb6\x2e\x5d\x03\x21\xa1\x49\x04\xe6\xd1\x76\x9f\x0f\x53\x1c\x21\xcf\x45\xc8\x10\x9c\x25\x58\xc3\xa8\x0c\xee\x91\x67\x93\xc9\xb3\x09\xa8\xb2\xcf\x26\xcf\xbc\x21\x56\x85\x72\x58\xa7\xed\x75\xc4\xf8\x22\xca\x21\x80\x05\x7d\xa9\x31\x21\xe4\x9d\x47\xfd\x84\x76\x96\x2b\x15\xb9\xa1\xd8\xb6\xaa\xc2\x3b\x40\xd3\x95\xbe\xec\x19\x10\x09\x85\x78\x6e\x3b\x8d\x5f\xd2\x15\xf6\xce\xf9\x95\xeb\x06\xb7\xb5\x34\x9b\xee\x15\xb3\x70\x6a\x3c\x63\xce\x81\xfa\xfe\xfb\xed\xbd\x1b\x8a\xee\x4c\x6f\xe6\xce\x01\xf7\x5e\x85\xac\x6b\x6e\xc8\x82\xea\x45\xf0\xe2\x75\x9d\x71\x86\x1d\x4d\x43\x9d\xbf\x55\xab\x0d\x53\xb3\x24\xd9\x95\xe5\x30\xf7\x04\xac\x38\x7b\xc3\xc7\x0e\x93\x58\x74\xae\x18\x38\xe4\xf4\x82\x2a\x66\xef\x6c\xe0\xf4\xa9\xf8\x8c\x19\x9e\xba\x39\x7a\xe7\x7b\x18\xf9\xf6\xe0\x56\x47\xf8\x6e\x85\xb7\x86\x9e\x85\x4c\x94\x8d\xe4\xa9\xad\x1a\xc6\xa4\xa1\x26\xa5\x21\xea\xd0\x53\x34\x90\x9d\x65\x07\x87\xa7\xf9\x2d\xec\x3f\x40\x63\x12\x38\xd0\xf5\x5f\x89\x18\xc6\xc8\x46\x56\x72\x3e\x30\x87\x7f\x90\x23\xcc\x2c\xb6\xad\x45\x58\x1a\xfc\xac\x75\x53\x13\x7c\x35\x66\x00\xda\xd7\x06\xe3\x89\x39\x67\x94\x6f\xd9\xe3\x0c\xa5\xe7\x61\x77\x3e\x7f\x7f\x72\x78\xfc\xe6\x64\x52\x97\x5f\x20\x06\xc4\x98\x8e\x1b\xb9\xb5\x30\xe4\xa3\xb0\xa4\xd7\x96\x0d\xbd\xcf\x20\x89\x59\x89\x3a\x89\x7d\xc0\x18\x30\x9b\x1a\xa6\x6a\x8e\xb8\x52\xbb\x6a\x62\x6f\x85\x4b\x52\xad\x6b\x7b\xc6\x9d\x25\x6e\xe4\x1c\xec\xe1\xc7\xef\x1f\xc8\x8d\x62\x63\x00\x92\xb0\xb6\xe4\x8c\x57\x00\x44\xd3\xe9\xa9\xd1\xf9\x9c\x34\xa8\x8f\xb8\xfa\x90\x2e\x3e\xb9\x5a\xae\x46\x5e\x3b\x2b\x33\x44\xd6\xb1\xed\x6b\x55\xa5\xd5\x3d\x01\x96\x8f\x55\xca\x5c\x14\x88\xce\xe1\x85\xa5\x72\x1d\x04\x1b\xc5\xaf\x78\xc5\xe6\x96\x84\x05\x17\x73\xdd\x75\x20\x72\xc9\x68\x49\xc3\x02\xc6\x10\xeb\x74\x9a\x90\xd4\xf3\x06\x52\xcb\x02\x38\x3f\x6e\xcd\xb7\xef\x2e\x88\x60\x48\x42\xe2\x26\x1b\xe8\x78\xb2\x44\x26\x9e\xec\xdb\x8e\xb6\x6e\x47\x1f\xd9\x99\xa3\xd8\x27\xa4\x6c\xda\xaa\x83\x02\x4e\x18\xdb\xc1\xc3\x9e\x12\xbd\xac\x2b\x2e\x2e\xa1\x65\x87\x3b\x4e\x5c\xfb\x3b\x46\xec\x17\x7e\x03\x2b\x46\xab\xfc\x6a\xc0\x03\xb1\x32\xc9\xa1\x02\x98\x1d\x88\xc1\x83\xc9\x62\xa5\xde\x5f\xbd\xb0\x47\x4f\x79\x96\xf3\x3b\x39\xcf\xf3\x51\x2f\x2d\xaf\xe9\x7c\x6b\x85\xa6\x30\x78\xef\xc0\x16\xe4\xdd\xd1\xa9\xaf\x1b\xd8\x8f\x1d\xd2\x78\xaf\x54\x84\x2a\xc3\x67\xb4\x30\x07\xa4\x69\xab\xca\x99\xb8\x5e\xc9\x73\x52\xe2\x86\xdc\xd3\x24\x22\x2f\x3a\x17\x1a\x14\x70\x68\x59\x5d\xd9\x51\x8d\xb5\xe1\xd1\x13\xd8\x36\x2e\xa1\x15\xa0\xd9\x04\xb9\x5e\xf0\x62\x41\xce\xda\xaa\x3a\x93\x15\x2f\x96\xa1\x81\x3b\x3a\xdb\x4b\x7b\x2c\x24\x9e\x0b\x87\xd5\x35\x5d\xea\x57\xf1\x5b\x12\x0a\x9f\x11\x6a\x0c\xab\x1b\x64\x66\x3b\x35\xab\x2d\x3a\x3b\x7f\x3b\x28\x8b\xdc\x12\x0a\x22\x8f\xf2\x2a\x48\xc6\xd6\x7d\x90\x78\x5e\x8f\xc9\x5b\x76\xc5\x54\x9f\x3e\x61\x3f\x82\x47\xeb\x3e\x4d\xb0\x74\xa0\x8d\xb7\x1a\xbc\x22\xd8\x33\x7e\x6d\xa9\x3f\x42\x3b\x9f\xad\x3c\x96\x6b\xf1\xcc\x10\xc7\x55\xa9\x2f\x72\x3a\x7b\x2b\xcd\x19\x3e\xa3\xff\x3e\xf8\x26\x37\x8c\x4a\x2b\x6b\x63\x2c\xfd\xe8\x96\x1d\x4a\xae\x2f\x07\xbd\x42\xf0\xe2\xc4\xcb\x33\x94\x99\xe7\xcc\x58\x76\x1e\x07\x8e\x76\x34\x58\xae\x86\xef\x4a\xfb\xb2\x6e\x7f\x29\xe6\xa0\x08\x47\x8e\xb9\x6b\x46\x85\xc7\x1b\x64\xd7\x44\xb1\x5a\x1a\xd4\x73\x2d\xbd\xce\xc9\x5d\xc8\x9a\x11\x7a\x45\x79\x45\xa7\x15\x64\xee\xda\x87\xbb\x67\x25\xfb\x0e\x0f\x61\x06\x20\x1f\x4a\xfa\xfd\x68\xb9\x25\xf0\x3c\xf2\x8f\x83\x01\x8f\x37\x29\x92\x55\xc9\xe2\x32\xd6\x55\x67\x4a\xd6\x78\x0b\x56\x9d\x97\x50\x09\x45\xcb\x92\x68\x3e\x17\x00\x0c\x28\x0c\xa9\xa8\x61\xa2\x58\x4e\x88\x6b\x2c\xda\xc1\x21\x2a\x66\x14\x0f\x55\xeb\x42\xaa\x9a\x56\x7e\x92\xa7\xb4\xb8\x94\xb3\x19\x3c\xb5\xbb\xdf\x25\x6a\x39\x61\x85\x73\x42\xb5\x14\x38\x38\xd3\x9a\xce\x07\x08\x2b\xe8\x18\x6e\x15\x28\x57\x58\x81\xab\xe4\xa0\x42\xbd\xa0\xf4\x38\xa0\x3e\x75\x5f\x79\xa8\xb6\x0e\x8a\x2d\xf0\xab\x6a\x85\xe1\x56\xfc\xf5\x7a\x89\x11\x88\x18\xae\x25\x9e\xda\xa1\x5c\x63\x36\x00\x8f\x70\x10\x6b\x50\x8a\x75\x05\x5d\x07\x90\xbe\xb5\x7c\xb5\x55\x51\x0f\x55\x3b\xe9\xb3\x10\x9d\x23\xc0\xcd\xfe\xc5\xb9\xa5\xda\xc1\x5c\x77\xda\xe5\x3e\xe0\xbe\x75\x4c\xf1\xf7\x2f\xff\x31\xb9\x8a\xa3\xf0\xf0\x73\xab\x72\x1c\x58\x7a\x6b\xa6\xe6\x88\x82\xc6\x48\x4d\x05\x9f\x31\x6d\x39\x64\x69\xd9\xc9\x45\x57\x34\xad\x19\xb9\xb6\x8c\x84\x39\xb0\x2b\xaf\x97\x28\x5f\x2f\x56\xe2\x39\xd1\x8a\x76\xae\x8d\x7d\x25\x0f\x60\x2d\x00\xc0\xff\x03\x2b\x5a\x03\xfb\x0f\xb2\x06\xc9\xbe\x90\xf6\xb3\xc4\xec\xa1\xf3\x76\x8a\xea\x33\x0c\xbb\xf2\x6a\x58\x64\x07\x0d\xf5\xc3\xea\x7e\x74\x66\x75\x3b\x6d\x70\x5e\xd9\xcc\xea\x51\x2f\x27\x5f\x7f\x9d\x3e\x39\x58\xeb\x05\x63\x6a\x56\xb4\x8a\x9b\xa5\x15\xbc\xec\x83\x99\xcc\x34\x74\xd0\x3f\x02\xb8\x55\x77\x30\x2f\x28\x38\xc0\xb1\x30\x0c\x37\x64\xb7\x29\x2c\xa3\x3e\xc2\x4a\x8f\x26\xe8\x1d\xdb\xd6\xd7\xdd\x24\xcf\x9c\x70\xb6\x3b\xa6\xdb\x96\x7a\x42\xce\xa4\x46\x64\xd8\x80\xad\x3e\xa0\x14\x71\xc7\x35\x23\x7b\x7d\x26\xba\x11\x01\x4b\x7a\xb7\xb5\xa3\xd4\xf7\x8a\x2d\x42\xe4\x28\x3b\xfa\x2b\x68\xbb\x65\x88\xa1\xf3\x95\x46\xfc\x52\xf5\xa6\xa2\xeb\xbf\xb9\xc5\x78\xb7\x9b\xa5\x6d\xef\xfe\xf7\xde\x05\x46\x4e\x57\x99\xb6\x5f\x07\xef\x10\xcc\xd3\x17\xed\x5b\xb6\xa0\x57\x6c\xe3\xd1\xdb\xc8\x72\xb2\xe1\x04\x82\x6d\x94\x3e\xa0\x35\xed\x42\x61\x79\x80\xc5\xd6\x9a\xd5\xd0\x60\xfe\x06\x15\x60\x93\x96\x33\x5d\x92\x4a\x4a\x80\x54\x6d\x1b\x22\x64\xc9\xec\x06\x80\x94\x4e\x5a\xe9\x11\x39\x3f\x74\x37\x36\xd1\x90\xd8\x94\x02\x34\xdb\x86\x15\x1b\x6e\x78\x30\x2f\x55\xd4\x8f\x15\xd5\x9a\xf4\x3a\x87\x5e\xa5\xb6\x74\xf0\x09\x50\x1b\x05\x1e\x39\xd7\x0c\xbf\x62\x57\x0c\xd2\x58\x66\x7c\x4e\xb0\x3d\x6c\xed\x9a\x87\xf8\xec\x71\xa9\xa0\x5d\xa5\xe2\x65\xba\x63\x68\x55\x5b\xb3\x4b\x7a\x2d\xd5\x65\x25\x69\xe9\xab\x54\x2b\xab\xf0\x54\xfc\x92\x91\x63\xd6\x54\x72\xe9\x3a\x7e\x88\x92\x9c\x1b\x6a\xd8\xac\xad\xce\x07\x2c\xc5\x30\xaf\x8e\x2e\x34\xdf\x9a\x57\xc7\x0e\xbe\xe2\xd5\x39\x3d\x3f\x3a\x3f\x7d\xf4\x75\x70\xc3\xfc\x7c\xcf\xbf\x80\x99\x79\x7c\xb1\x08\xfe\x6b\x5a\x6a\xd8\x98\x54\x6d\xea\x2f\x31\x89\xef\x4c\x2a\x43\xab\x2d\xe8\xd0\xc5\x82\x36\x87\xad\x59\x1c\x73\x5d\x58\x61\x92\x47\x95\x5e\x7b\x6a\x04\x8f\xce\x20\x6e\xe7\xec\x26\xc2\xfd\x7e\x71\xf7\x1d\xfd\xf5\xf0\x8c\xd0\xd6\x72\xb3\x71\x8d\x0a\xb6\x12\xe5\x25\xd1\xdc\x9c\x63\x5b\xa6\xac\x33\xe3\x9e\xf9\x91\x79\xf1\x77\xed\xd2\xac\xec\x5a\x95\xe2\xa6\x32\xc1\xa7\x4a\xc5\x47\x55\xa9\x98\x7a\x5c\x90\x1c\x66\x04\x17\xdc\x70\x6a\xa4\xda\x85\xe2\xa8\x1e\x31\x21\x3f\xb5\xd5\x46\xd6\x4e\x24\x9c\xfa\x3b\x00\x4e\x62\x50\x84\x78\x6d\xb0\x2e\xe9\x15\x72\x88\x60\x59\x4e\x85\x61\x6a\x46\x0b\xb6\x02\x84\x3b\x02\x77\x38\xd2\xc4\xfd\x3d\xc9\xd4\xfc\xd1\xe5\xb2\x37\x70\x0e\xfe\xe9\xd5\x1f\xa3\x52\xc8\x3f\x05\xc3\xc3\xb9\xe6\x63\x1b\x43\xb0\x62\x48\x33\x9b\xe1\xdc\xf3\x6b\x9e\x73\x81\xff\x2a\x56\xd2\xfa\x71\x6a\xff\xb3\xa5\x15\x2e\xc9\x90\xe5\x1e\xfe\x9a\x3d\x56\xd8\xfa\x2e\xe9\x33\xa6\x9b\xb7\xc0\x85\x08\xb4\x02\x92\x19\x5d\x4a\xc2\x4d\xa6\x51\x54\x68\xcb\x62\x79\xdc\x26\xcf\x9c\x21\xf6\x8c\xec\x9b\xa2\x49\xae\x52\xcd\x80\xe3\x14\x30\x9c\xdc\x3f\x92\x1e\x93\xab\xb5\x41\xd5\x8a\xd8\x28\xc2\xa9\xbf\x40\xa6\xfe\x3e\xb4\x36\x18\x36\x5b\x5b\x2f\xa5\x05\x39\xb5\x75\x60\x75\x47\x46\xd8\x01\xf1\x54\xa3\x49\x41\xbe\xe7\xda\x20\x5c\x2c\xde\x0c\xf0\x70\x08\x8f\x6e\xcd\xd5\x33\x22\x15\xe1\xcd\x7f\xd1\xb2\x54\xaf\x50\xf3\xf4\xd1\x51\x95\x8e\x56\xc8\xb5\x4b\xcf\x03\xa0\x42\xef\xaf\xd8\x37\xcb\x86\x17\xb4\xaa\x96\xe4\xe2\xe8\x0c\x46\xd0\xe4\x0f\xbf\x7b\x01\xf6\xeb\xd7\x5f\xfd\xee\xc5\xc0\x2d\xf4\x84\xae\xbe\x72\x3d\x8a\x6c\xe6\x47\x50\x17\xbc\x6b\xd8\xad\x3d\xa4\x55\xe8\x45\x69\xed\xc3\x73\x04\x1a\xb5\xca\x91\x3b\xee\x50\x10\xd8\xdd\x15\x54\xbd\x9c\x56\xe4\x13\xa4\x67\x74\x3d\x41\x7a\x3e\x41\x7a\x3e\x41\x7a\xde\x7c\xc5\x7e\xce\x6d\x9f\x47\x31\x2d\xd0\x2e\x71\x5d\x6f\x42\x95\xe9\xec\x73\x57\x99\x12\x59\x2d\x55\xf0\xe6\x58\xc0\x18\x2e\x66\x48\xff\x8b\xae\xad\xc3\xf1\xdb\xf3\xff\xfa\xfe\xf0\xdb\x93\xef\x61\x56\x1d\x2a\x8d\xdd\xde\x5c\x3c\x68\x18\xe5\x5e\x45\xcc\xb0\xf5\xde\x5e\x01\xb2\x58\x29\x3d\x16\xe4\xed\xeb\xf3\x3b\x56\x1d\x6f\x21\x06\xf6\x85\x98\xa5\xaf\xd2\x63\x2b\xc6\xb1\x3f\xd5\x4c\x6d\xa7\xff\xce\xce\x54\xf2\xf8\x30\x2f\xfb\xd0\xf7\xfa\x5b\x7e\xc5\xd9\xd9\x9a\x83\x3d\x8d\x19\xc9\xbf\x4d\x45\xad\x5d\x22\x5c\xb6\x47\x5f\x4b\xfb\x90\x6c\x31\xcc\x22\x56\xb9\xda\x66\x0d\x6a\x65\xa2\xa2\x8e\x5b\xf6\x20\x41\xf5\x42\x59\x35\xcf\x2a\x78\x4c\x6b\xaf\x6c\xfc\xfb\xee\xe3\x66\x53\x7b\xfe\x6d\x29\x04\x1b\x89\x71\x0d\xfb\x31\xdf\xa6\x57\x18\xdd\x4b\xc0\x4b\xcb\xba\x59\xed\x0d\x0e\x23\xf6\x72\xdf\x40\x29\x6b\x68\x91\xaa\x8a\xa6\x71\x45\x37\x13\x63\xcf\x20\xdd\x47\xf8\x09\x34\x2e\x7f\x84\x8a\x08\xd0\xbd\x25\x18\xe6\x30\xf6\xb6\x85\x53\x20\x64\xb5\x23\x20\xbd\x0b\x4b\x12\xaa\x43\xf5\x0d\x56\xee\x64\x68\x1d\xb8\x93\x3c\x4b\x3e\x4b\x7d\xe5\xa7\x07\x76\x97\x6f\xd3\x55\xde\x2c\xa4\x91\x62\x37\xda\x1d\x6c\xa2\xa5\x7f\xb4\x9c\xc1\x1d\x47\x21\x49\x36\x3a\x9a\x10\x9f\x36\x24\x7c\xae\x54\xee\xba\x34\xce\x1c\x45\xbb\x31\x34\xd6\xd9\x26\x8a\x6f\x47\xc9\xda\xf8\x92\x9f\x17\x60\x56\x53\x9e\x1e\x6f\xe1\x14\x79\x0c\x69\x72\x9f\x69\x6f\xd4\x07\x4a\x7b\x1b\x0e\x07\x56\x66\x6a\x76\x63\x1f\xe4\xd7\xf8\xf4\xd8\x39\x22\x7c\x27\x1b\xed\xe4\x02\xb9\x59\x50\x6d\xc5\xa6\x90\xca\x5c\x4b\xb5\xe5\x0e\xe0\x7d\x2a\x56\x20\x95\xdc\x77\x6b\x5d\xbf\x1e\x48\x9a\xf7\x49\xbb\x53\xf3\x99\xd5\xf7\xb2\x2b\x95\x44\xd0\x0d\x9d\x67\x3e\x94\x13\x3f\xc2\xa4\x90\x75\xd4\x74\x86\x5c\x2f\x18\x6a\xa1\x47\xe7\xa7\x6f\xf8\x1c\x09\xf4\xef\x42\x66\x8c\x9a\x56\xb1\xf1\x9c\x9a\x34\x82\xb8\x26\x69\xd9\x7e\x5b\x3e\x85\x90\x87\xfe\x9d\x4f\xa2\x73\x38\x89\xa2\x1d\x76\xdb\x89\xf4\x39\x1c\x48\x8f\xe7\x20\xda\x39\x9b\xe7\xa9\xf3\x73\xef\xf2\xc2\x23\xcb\xfa\xf8\x87\xb9\x40\xa7\xe5\xcd\x4e\x55\xa0\xe1\xd8\x71\xf7\x6d\x45\x35\x50\xf2\xbf\xe1\xbc\x19\xac\x15\x84\x27\x61\x7e\x1f\x1c\x93\xb4\xaa\xec\xca\x4a\xc1\x42\x85\x9e\xee\xea\x4d\xb1\xe0\xb2\xa6\x8d\xab\x3d\x2d\xe5\xb5\xb8\xa6\xaa\x24\x87\x67\xa7\x0f\x7f\xea\x0c\xc6\xae\xc7\x7d\xf4\x46\x96\x5b\x97\xff\x11\x29\xa0\x55\x00\xa2\x88\xfd\x63\xca\x8d\x46\x98\x47\x00\x5d\x34\x71\x90\xc5\xaa\x57\x21\xe9\x1f\x40\x3d\xa6\x41\x38\x64\x30\x5a\x04\x91\x85\xa1\x95\xcb\x54\x9a\x32\x73\xcd\x98\x20\x2f\x5e\xbc\xc0\xfc\x8a\x17\xbf\xff\xfd\xef\xa1\x98\x9b\x94\xac\xe0\xf5\xfa\x8d\x70\xd7\x6f\x5f\xbe\x4c\x27\xe5\x6f\x87\x6f\xbe\x27\xb4\x00\x1f\x19\x99\x4a\xb3\x70\x14\x01\xeb\xc5\x83\xea\x11\xf9\x3f\xe7\xef\xde\x7a\x3d\x44\xaf\x7c\x0b\x9c\x1d\xa6\x73\x80\x0f\xc8\x01\xc5\x70\x80\xfd\xe9\x32\x20\xa8\x59\x04\xc8\x13\x0a\x99\x68\x11\xb4\x8e\x93\x97\x03\x0a\xaa\xa0\x2b\x3b\x9f\x2f\x60\x59\xb8\x80\x5d\x58\xf1\xc2\x75\x1e\xc0\xbc\x18\xac\x94\xf6\xf8\x9e\x88\x63\xe2\x55\x88\xe4\x91\xed\x94\x8d\xb0\xb6\xd9\xa1\xa6\x8c\x82\x8f\x44\x31\xdd\x56\x06\x3a\x53\x4d\x99\x23\xa2\xe3\x58\xcd\x92\x39\x70\x37\x52\xd8\x9d\xe8\xdb\xb6\x5c\xf0\x12\xd8\x99\xaf\x15\xb7\x4a\xd9\x2c\x00\x52\xa3\x00\x87\x80\x2b\x39\xa1\xc5\x82\x30\x61\xa0\x87\x03\xb2\x9e\xbd\x3d\x79\xe8\x05\x15\xa5\x95\x29\xd0\x48\x1f\xc8\x78\xb4\xf9\xe7\xf9\x32\x59\xcf\xc2\x8c\xf7\xe0\xb4\xba\x93\x94\x56\x52\xcc\xe3\x8d\xd9\x29\xd6\x11\x9c\xd0\x00\x19\x04\x85\x8d\x00\x2e\x6c\x17\x06\x83\xaf\xda\x01\x1e\x69\xc4\xda\x9a\xb2\x21\xfb\x2f\x4b\xfe\x72\x9e\x0c\x66\x42\x0a\xc4\xb8\xbe\x50\xad\x36\xdf\xb6\x96\x21\x87\x3c\x2d\x6f\x4e\x33\x21\x47\x6b\xd4\x61\x42\xb0\xcb\xb1\x82\x98\x6a\x51\x30\x8d\x9b\xf7\x17\x44\x20\x31\xdd\xdd\xbf\xe0\xb2\x0d\xa4\x42\xce\x36\x11\xe2\x51\xdf\xb8\xb0\x27\x39\x6d\x8d\x1c\xb7\x4d\x49\x03\x02\x76\x22\x72\x60\x77\x1d\x56\xcd\x82\x8e\xc8\x9c\x46\x46\xe3\x3a\x1d\xd1\x86\x71\xde\x0d\xf8\xc5\xe0\xd1\x6f\x79\x63\x7b\x24\xb9\x84\x54\xd8\x09\x55\x38\x8f\x05\xad\x19\x60\xf5\x20\xb9\x03\x49\x28\x64\x3d\xe5\xc2\x81\xe0\xcd\x00\x25\x90\x29\x8c\x42\x02\x02\x1e\xa9\xe8\x94\x55\x8e\x00\xa9\x06\xbf\xf2\x77\x1e\x59\x89\x29\x7b\xbe\x69\x42\xe7\x73\xc5\xb4\xe6\x57\xcc\xc1\x0d\xf2\x7f\x06\x6a\xa0\xb5\xd5\xc9\x1b\x0f\xc5\xa8\x89\x35\x0e\x0d\x4b\x6f\xee\x83\x57\x68\x9b\x65\xd9\xbb\xf3\x21\x4c\x08\x39\xd1\xd2\x30\xc5\x0b\x18\xd5\x2d\xb5\x26\xba\x2d\x16\x84\x6a\xac\x3e\x1c\x03\xe6\xe2\xf0\x59\xef\x10\x56\x10\xc4\x71\xc1\x68\xe9\x51\xe7\xac\x51\xd5\x34\xac\x9c\x10\x72\x64\xc5\xcf\x8c\x17\xd4\x20\xa6\x18\x29\x59\xd9\x36\x15\x47\x1f\xe1\x40\x32\x2e\x16\x8c\x48\x55\x32\x00\x97\x94\x33\x48\xbe\x0f\x83\x45\xba\x21\x80\xcd\x73\x3b\xfe\x94\x1b\x45\xd5\x12\x35\x28\xb7\x96\x03\x89\xb0\xa7\x4f\x01\x38\x76\x30\x16\xd0\x03\xa0\x37\x24\xbd\x9b\x8c\xbf\xb2\x1c\x02\x64\xb0\x6f\xb0\xbb\x06\xe4\x5f\xfa\x2b\xcf\x99\x64\x2f\xd8\xda\xe7\x6e\x67\x0f\x7d\x58\xee\x63\xc9\x5e\x48\x1b\x98\xf3\xeb\xa2\x32\x60\x81\x9a\x62\xe1\x34\xc5\xbe\xa8\x22\x04\xfd\x47\x74\x58\x75\x0c\x5e\x0e\x55\x91\x7b\x11\x19\xea\xe9\x99\x99\x58\x73\xd3\xb4\xb4\xaa\x96\x63\xf6\xc1\x1e\xf6\x56\x98\x81\xf6\x04\xcd\xc2\xa0\x10\xbf\x15\x9a\x99\x51\x06\x42\x40\x08\x35\x0a\xd1\x6c\x35\xd9\xc3\xf7\x17\x12\x5a\x23\xec\xe1\x60\xd6\xc4\x9e\xb6\x06\x8b\x74\x46\x9b\x7f\x92\x63\x4e\xae\x98\x5a\xba\x71\x07\x3f\x2e\xdb\x56\x25\x59\xf7\x08\x01\x09\x65\x8a\xc5\xc9\x87\x46\x21\x54\x4b\x96\x67\xae\x6c\x97\xd5\x21\x10\xd1\xdf\x5b\x4a\x7d\xc6\xf6\xc2\x08\x4e\x10\x2c\x62\x89\x3f\x81\x53\xe2\xf0\xed\xf1\xf0\xe3\x01\xaf\xe1\x86\x4f\xff\x1a\x68\x06\xf5\xaf\xfc\x32\x07\xaf\xc3\x5b\xe6\xdc\x75\x5b\xf0\xdf\x60\xc3\x4f\xc4\x58\xd3\xc1\x93\x43\xc9\x25\x73\xc7\x24\x15\x2e\x04\xe1\x6e\xce\x46\xa4\x62\x00\xe5\x88\x88\x95\x6c\x09\x83\xe1\xf8\x79\x56\x3e\xf3\xa6\xc4\x2b\xd7\x49\xda\x5d\x63\xfb\xf2\x19\x9f\xe6\x17\x2b\xd3\x23\xf3\xca\x22\xbc\x2e\x59\x72\x20\x67\xd3\xd5\xdb\x45\x96\x93\xbc\xa7\x06\xf6\x80\xfd\x20\x60\x20\x05\xb6\xa7\xd0\x19\x54\x13\x23\x73\x31\x1b\xc9\x57\x1d\xd9\xbf\xfc\x82\xde\xdb\x94\x65\x14\x3c\x24\xa2\xb7\x9f\xab\x70\xc9\x96\xcf\x34\xee\x79\x7b\x42\x2c\x78\x03\xa6\x39\x1c\xf6\x72\x96\x79\xe3\xe3\xf5\x23\x60\x9c\x7b\x72\xf0\x64\x39\x15\x23\xf2\x56\x1a\xfb\x9f\x93\x0f\x5c\x3b\x1b\xe6\x58\x32\xfd\x56\x1a\xf8\x64\xe7\xf9\x01\xa7\xea\xb1\x70\x83\xf3\xfe\x73\x28\x8c\x83\x63\x18\x0c\x75\x98\x12\xbf\xea\x1e\xd8\x39\x70\x0e\xd7\xe4\x14\xba\xfb\xe2\x52\x65\x25\x08\xaa\x32\x3d\xc8\xb5\x25\xc7\xfb\xeb\x00\xa2\xdd\x55\x8f\xaf\xd3\xe3\xb8\x45\xaa\x1e\xb3\x3c\x10\x69\x8e\x2c\x88\x42\xe0\x37\xd0\xff\xa4\xa9\x68\xc1\x4a\xdf\x5e\x81\xda\x59\xa5\x86\xcd\x13\xeb\x9f\x6f\xba\x6a\xa6\xe6\x10\x60\x29\x06\xb4\x5c\x5a\xbf\x72\x2b\x66\x78\x65\x55\xcf\xf0\xba\x97\x4d\x7c\x2f\x68\x2a\x0f\x3e\x04\xe8\xfd\xdf\xdb\x63\xf6\x3e\xac\x8a\x6c\x92\x28\x22\x13\xb5\xdf\x9a\x36\x56\x0a\xfd\x3f\xab\xe4\xc2\x86\xfb\x1f\xd2\x50\xae\xf4\x84\x1c\xfa\x86\x14\xf1\x77\xce\x8f\x14\x3d\x26\x1b\x61\x0d\xd4\x63\xfe\xda\xf2\x2b\x5a\x39\xf0\x64\x2a\x08\xc3\xe6\x1e\x96\xc6\x55\xd3\x6a\x44\xae\x17\x52\xa3\xc6\x1c\xa0\x37\xf6\x2e\xd9\x72\x6f\x94\xc1\x9f\xea\xaf\x58\xf2\xed\x9d\x8a\xbd\x2e\xe6\xd8\x93\x4f\xc1\x6e\x80\xda\xc3\x3d\xf8\x6e\xef\xa1\x6c\xba\x8c\x7a\x3d\x2d\x4b\x8e\x28\xd7\x67\xd9\xd5\xdd\xac\xe2\x23\x3f\xea\x45\x77\x0d\xc5\xaa\xc1\xeb\xfe\xdc\x68\x7e\x67\x6e\x08\x3b\x4c\x97\xbe\xc1\x8c\x73\x59\xad\x7b\xb4\x32\x10\x02\x3e\xb1\xc8\x7f\x66\xb7\x44\xcf\x09\x99\xcb\x8d\x94\x85\x59\x3c\x6e\xfb\x2e\x2e\xa9\xd5\xaf\x54\xcb\x46\xa4\x94\xe2\x99\x71\x21\x84\xb8\x3d\xd4\x6a\x9b\x89\x72\xc3\xaa\xef\xeb\x83\x0c\xa4\x50\xc5\xa0\x1b\x86\x6f\x8d\xe5\xfc\x9d\xd8\x40\x0a\x62\x55\xc6\xe7\x0b\xdb\x3f\x37\x11\x32\x14\xc0\xc8\x11\xe2\x60\x8c\x84\x84\x53\x00\x5a\xe5\xc6\xc4\x74\x8c\x17\x91\xd4\x8f\x7f\x65\xa0\xe2\x36\xf6\x86\xb3\xb3\x03\x5b\x42\xd7\xed\x3f\x99\x92\x19\xc6\xdd\xe0\x20\xcf\xb5\x9b\x86\xe4\x35\x76\xd7\x10\x10\x87\xee\xea\x6d\xa5\xf7\x60\x0c\x5f\xb9\xe4\x25\xe8\x7d\x16\x61\x42\x2b\x89\x8c\x00\x19\xa5\xf0\xc5\x14\xe6\x65\xa7\x84\x4c\xc7\x2e\xbb\x28\x66\xee\x18\x80\x89\xa2\xc7\x39\xf4\x94\x8f\x44\x55\x2e\x16\xac\x8b\x0c\xcb\x19\x50\xe9\x03\xe5\xf7\xb3\xa1\x02\x4a\x71\x2b\x10\xb0\x17\x73\xf8\xf2\x05\x64\xb3\xb1\x16\xe6\xb8\xbe\xa1\x4d\xc6\x4c\x93\xf0\x4c\xa8\x09\x56\x35\x0a\x4d\x3a\x95\xad\xf1\x50\xcd\xee\xfb\x92\x1a\x0a\xfd\xa9\x30\x6f\x62\x37\x42\xb8\xf9\xfc\xb0\x99\x4c\xe4\xfc\xdb\x15\x33\xa0\xfb\x15\x07\x23\xc2\x68\xb1\xb0\xd6\xce\x18\x53\x5b\xad\x9d\xe6\x0d\xb2\x63\xbb\x50\x68\x04\xc9\x55\x85\x21\xc7\x16\x0a\x1c\xe1\x37\x4e\x94\xad\xed\x93\x30\x7c\xe9\x95\x76\x05\x1d\xce\x3c\x13\x5d\x51\x7c\x06\x4a\x7c\x78\xc4\x37\xf5\x74\x0e\x6e\x98\x11\xf0\x56\x45\xf3\xe5\x73\x14\x59\x69\x7f\x16\x36\x7d\x06\x2a\x36\xbc\x7d\x87\xc7\x6e\xcf\x30\x97\x91\xde\x8a\xb5\xf1\xad\x52\x93\x89\x06\xec\x96\x66\x5f\x9a\x7a\x67\x7f\x84\x0a\x0f\x1d\x51\xa1\x32\xb8\x6b\x4a\xe6\xb8\x25\x2c\x67\x0e\xa7\x5d\xb4\xf4\x9a\x85\x86\xa6\x4c\x29\xa9\xec\xfb\x33\xad\x09\x87\x75\xaa\xa9\xba\x64\x65\xd0\xc6\x27\xe4\xcc\x4e\x94\xf7\xec\x65\xa0\x44\x79\x2d\xc2\xb7\x4b\xb5\xaf\xee\x0c\x73\x20\xf3\xd9\x64\xf2\xcc\x75\x72\x57\xa8\x60\xe3\x39\x64\x3f\xcf\x25\xf1\xf3\xb8\xf1\xb2\x39\xef\x7a\xb2\xe9\x0d\x6d\x34\x3a\x47\xad\x1a\x0d\xe1\x20\x49\x28\xce\x88\xcb\x12\xa2\x83\xc1\x26\xba\x2b\xb3\x73\x22\x6f\xc0\x31\x5f\xb0\x31\x43\x2a\x10\x5e\xb9\x03\x8c\x19\x83\x8b\x37\x05\x16\x1d\x0f\x39\x79\x98\x37\x5a\x9d\xd1\xcf\x5c\x0f\x28\xaa\x59\xbd\xee\x2b\x44\x04\xe5\x0a\x5c\x93\x77\xde\x5b\xf1\x69\x25\x37\x06\x91\x87\x73\x58\x43\xfe\xda\xa1\x9a\x9b\xd5\x6b\xd7\x6a\x70\x56\xaf\xd3\x19\x76\x1a\xee\x2b\x21\xee\x78\x8c\xcb\xaa\x82\x01\x32\xa8\xc7\xe4\xea\xb5\xbd\xe2\x9c\xd5\x6b\x2b\xc5\x3a\xab\x57\x8e\xe2\x9d\xd5\x6b\x78\x31\xcf\xea\x95\xc7\x9f\x82\xd7\x7d\x09\x27\x50\x11\xb8\xef\x06\x1c\x3b\x6b\x9c\xb9\x01\x0a\x3f\xb8\xc2\x9a\xe8\x60\xc8\x28\x93\x9c\x3a\x87\x62\x89\x4e\xb5\xac\x5a\x83\x24\xe4\x1f\x24\xd6\x19\xe1\x25\x7d\x14\x2a\x8f\xa2\xb8\x3a\x5c\xa4\x89\x82\x25\x81\xea\x59\xce\xb1\xee\x2f\xf2\x92\x3b\x96\xba\xab\xa1\x97\xfc\x2d\x03\xf0\xda\x8d\xc6\x01\x78\xed\x44\xfb\x00\x4f\x4a\xfe\x26\x02\x78\xed\x12\xce\x77\xff\xca\xba\x49\x87\xb7\x15\xf0\xd7\x3d\x45\xcf\x42\x33\x65\xd4\x95\x96\xa1\xab\x66\xcf\x41\x01\xf0\xfd\x46\xa3\xff\xc4\xe7\x00\x61\x1f\xce\xe1\x7e\xad\x7c\x41\x91\xfb\x0a\x46\x7b\x44\x83\xc3\xb3\xd3\x8c\xfe\xdf\xe8\xa9\x37\x78\x80\xe3\x3b\x9e\x7c\xc0\x9f\x72\xf5\x26\xf8\x14\xdd\xb7\x71\xe6\xff\x71\x37\xa3\x0e\xe7\x29\x8b\xba\xbd\xfb\x3e\xa7\xb5\x17\x7f\x6d\x35\xc5\xb8\xe7\x5c\xc4\x81\x46\x3a\x08\x89\x4e\xa7\x74\xba\x18\x62\xa1\xfa\x4a\xbf\xe1\x65\xaa\x64\xf7\xfd\x53\x3b\xea\x55\x82\xd9\x1f\xd0\x1d\x6b\xf5\xea\x71\xcb\xb3\xf7\x7e\x12\x5d\xc8\x12\x83\x09\x51\x5c\xa3\x91\xe5\x2b\x4c\xb2\xa2\x42\x48\x83\x39\xd4\x23\x0c\xcf\xeb\x91\x4b\x54\x88\x00\x75\x45\x49\x5a\x5e\x62\x35\x66\x40\xc6\x7c\xf6\xef\x55\x56\x01\x13\x78\x96\x87\x9d\xc8\x3d\x55\x42\xd0\x86\xff\xc8\xd4\x90\xde\xdd\x9b\xae\x1e\x73\xb9\xe7\x7b\x4e\xd2\xc5\x82\xd5\x14\xfe\xf9\xda\x4f\x90\x15\xda\xae\x36\x19\x82\x25\x4c\xd5\x56\xf1\x1d\xf5\x50\xae\xf6\xae\x5e\x66\xa8\x93\xeb\xae\x7b\x49\xab\x0d\x6b\x7e\x6f\xd3\x79\xd6\x33\xff\xed\x16\x05\x0f\x25\x24\x1a\x78\x74\xeb\x10\x8e\xb2\x9a\xc4\x15\xce\xff\x8e\x4f\xdd\x7d\x26\x16\xe2\xf5\x18\xbc\xd1\xa9\x5e\xe8\x51\xd0\xd2\xfb\xde\xe3\x6c\x84\x3d\x79\xa1\x3f\x7e\x3d\x79\xa1\xdd\xf5\xe4\x85\xfe\xe4\xeb\xde\xbc\xd0\x91\x4a\xe7\x4f\xd8\x0d\x6e\xe4\xb8\x53\x9c\xf7\x25\x77\x5d\xe4\x27\x18\x93\xf2\x0e\x60\xef\xfd\x95\xaa\x1f\xde\x7f\x36\x99\x3c\xc3\x00\xff\x24\x04\xb1\x5a\x33\x1b\xff\x81\x30\x51\xc8\xd2\x3e\xe7\x02\x9e\xaf\xb4\x01\x73\xa7\xf3\xe8\xc5\xb4\xd4\x7e\xac\x38\x45\x00\x9e\x9d\x57\x6f\xcc\x78\x6c\x79\x74\xc4\xd7\xf7\xa9\x9c\x67\x3c\x5e\x3a\xe5\xde\x53\xee\x97\xc2\x2d\x28\x53\x4e\xcb\xef\x70\x1f\x2b\x5e\x73\x57\xa5\x68\xe5\x29\xd3\x26\x57\xf1\x09\x21\xfb\xf8\xf0\x49\xd1\xb4\x23\x37\xd0\xa4\x66\xb5\x54\xcb\x51\x18\xcc\x7e\xd9\x1b\xdd\xdd\x71\x00\xc6\x45\xd1\x2a\xc5\x84\xa9\x96\xc3\x00\xf8\x37\x5d\x8f\xc4\xca\xf0\x2b\xb5\xc3\x46\x46\x60\xae\x3c\x79\xba\xdd\xd5\x97\x78\x47\x7e\x18\x0c\x67\x84\xd9\x86\xf3\xde\xb5\x52\x19\x75\x1e\x50\xfb\x29\x13\x57\xe4\x8a\x2a\x9d\x4b\xc2\x90\xfb\xb2\x2b\x4a\x7e\xc5\xf5\x3d\x96\x60\x9f\x3b\xa5\x05\x63\x8d\xb2\x35\x4d\x6b\xdc\x71\xe7\x45\x04\xfb\xd0\x48\xab\x8a\x06\xd1\xb0\x62\x9e\xbd\x1c\xea\xf2\x8e\xaf\x86\x1a\xc3\x94\x78\x45\xfe\xef\xfe\xcf\xbf\xf9\xd7\xf8\xe0\xcf\xfb\xfb\x7f\x7f\x31\xfe\x8f\x7f\xfc\x66\xff\xe7\x09\xfc\xe3\xcb\x83\x3f\x1f\xfc\xcb\xff\xf1\x9b\x83\x83\xfd\xfd\xbf\x7f\xf7\xe6\x2f\x17\x67\x27\xff\xe0\x07\xff\xfa\xbb\x68\xeb\x4b\xfc\xeb\x5f\xfb\x7f\x67\x27\xff\xf8\xc4\x87\x1c\x1c\xfc\xf9\x7f\x65\x7c\x09\x2a\x96\xef\xb2\x9d\x09\x78\x8d\xef\x45\xaf\xe9\x3f\xfb\x7e\x2b\x4d\xb9\x30\x63\xa9\xc6\x38\xc8\x2b\x28\xc3\xc9\x36\x94\x67\xcd\xfb\x93\x31\x9d\x56\x15\x4e\xd0\x60\x7e\xef\xb8\x10\xb9\x5f\x0b\xfb\xde\xc2\xd3\x8d\x2c\x23\x10\xb7\x5d\x42\x7e\x74\xb0\x86\x3a\x60\x2b\x2a\x70\x8c\x8a\xb9\xd5\x9f\x01\x30\x9c\x56\xae\x66\x86\xec\x37\x8a\x5f\x51\xd3\x01\xcd\x44\x58\x71\x03\xc9\x28\x16\x94\x8b\x83\x0e\x62\xa4\x91\x25\x98\x57\xad\x66\xa1\x27\xb7\x55\xf9\x2e\xbe\x3f\x27\x45\xc5\xa1\xac\x57\x85\x36\x8d\x03\x07\xf7\x78\x84\x73\x26\x98\x42\x90\x3d\xb2\xfa\xaa\xad\x66\x90\x8c\x0c\x1b\x45\x94\x89\x2d\x06\xbb\xeb\xac\xc7\x11\xef\x51\x2d\xf4\x8d\x37\xb0\x46\x0e\x2b\x69\x00\xc2\xcc\x35\x05\x73\xb5\x35\xb4\x69\x94\xbc\x62\x39\xf2\xe2\x9d\x3e\x0a\xaf\xc8\xb5\x86\xa2\xe4\x78\x59\x71\x61\x46\x61\x8a\xa0\x8e\xaa\x87\x36\x34\x74\xe1\x57\xc7\x22\x37\xe1\x32\x5e\xb8\x0f\x4b\xc9\x74\x64\x62\xb5\xc2\xf0\x2a\x1f\x11\x9a\x2c\xe8\x15\x23\x53\xc6\x04\x4e\x08\x6a\x5e\x50\x3f\xd1\xdf\xc5\x51\x26\xff\x20\x0c\x7d\x7f\x39\x49\xcc\x05\x44\xad\x01\x61\x35\x17\x63\x3b\x5f\xcd\xdc\xce\xae\x5a\x42\x3c\x4c\x12\xd8\xe8\xc8\x57\xf1\x22\xb8\x0d\x68\x78\x6d\x69\x29\xb1\xa6\x69\x20\x1d\x0e\x54\xd5\xb1\xaf\xef\x4e\xc8\x36\x6f\x82\xc9\xb9\xa1\xa6\xd5\x93\x6f\x2d\xbd\xef\xd9\x4c\x31\xbd\x38\x1c\x6a\xbc\xd8\xd7\xd1\x86\xd6\x4d\xb6\x39\xb5\xd2\x09\xab\x0a\x43\x4d\x35\x3a\x31\xc3\xa4\xf9\xd7\xee\x04\xa9\x43\x92\x1d\x1e\x4d\x01\x9f\xf9\x08\x45\x60\x43\xad\xcc\xc2\xbd\xb2\x61\xf4\x4b\xb6\x04\xdf\x49\xd6\xad\x7a\x64\x77\x2a\x3c\x16\xe1\x9a\x07\xcf\xea\x45\x6f\x9e\xfc\x81\x83\x20\x6b\xdd\xe4\xda\xcd\x01\xa8\xac\xa0\xd3\x3b\x99\x80\x2e\x99\xb3\x93\x37\x03\x49\x70\x88\xe3\xae\x8b\x66\x24\xfe\xf7\xed\xa8\xdf\x1d\x9d\x7f\xf1\x07\x37\xf0\x41\xec\x09\xac\x5d\x84\x39\x0f\x01\xdc\x21\xbc\xae\xee\x4a\x14\x8d\x4e\x20\xf5\xb7\xd3\xbe\x59\x36\xbc\xa0\x55\xb5\x1c\x5a\x92\x83\x0f\x74\xc5\x46\x8a\x99\x56\x81\x73\x8c\xab\x4d\xa4\x08\x52\x31\x3a\x1b\x83\xc6\x20\x0d\x42\xb6\x1e\x0c\xe6\x83\x33\x48\x90\x8b\x44\xc4\x3a\x53\xe0\x1a\x8c\x2c\x5f\x14\x8c\x2c\x65\xeb\x70\xc8\x0a\xcc\x03\x28\x64\x39\x58\x19\xa1\x02\x7a\xd4\xd8\xf3\x1e\x55\x3f\x3b\xbb\x58\x46\xbe\x94\x2d\x28\x25\xd1\xb6\xda\xb8\x31\x86\xae\xc5\xda\x7b\x81\x67\xb1\xa6\x97\x8c\x98\x6b\xd9\xdf\xf6\x40\x6c\x00\x80\xd2\x8c\x14\x92\x8b\x82\x0f\x9e\x07\x4c\xd4\xeb\x2d\xbe\x72\x61\xf3\x91\x2b\xcc\x6a\xa4\xd6\x7c\x5a\xb1\x48\x73\x5b\x51\x9c\x2c\x97\x64\xd4\x11\xec\xfc\xc3\xda\x74\x45\x5a\x4a\x31\xdd\x48\x01\xf1\x25\x38\xa7\xc1\x21\x3f\x21\xe4\x6f\x2b\x73\x38\x78\x3a\xaa\x8a\x08\x86\x81\xac\x62\xc1\x8a\x4b\xd7\x8f\x8d\x6b\x52\x48\x81\xe0\x27\x23\xe7\xe6\x1b\x03\x91\xa0\x9c\xd8\x69\x59\x66\x48\x6e\x2c\xa4\x70\xdd\xfc\xb2\x88\xdb\x58\xc9\x04\xef\x96\x92\x95\x26\xc5\x42\x4a\xed\x34\xbc\xbe\xeb\x24\x5e\x05\x3e\xf4\x3c\x46\x5d\xf3\x7f\xc3\x3b\xb5\x95\x89\xe5\x19\xaf\x1b\x4c\x99\x86\x35\x7b\xa6\x49\x29\x8b\x36\xfc\x6d\xe7\xbe\x62\x54\x09\xb2\x90\xd7\xc4\x0c\x45\x4d\xb0\x5b\x79\xe5\xe5\x5c\xcd\xa1\x1e\x8c\xa4\xb7\x83\xc0\xd3\x97\x6c\x79\x91\xda\x23\x30\x7e\x4e\x87\x58\xb0\x23\xa9\x78\x9b\x44\xf0\x2e\xe6\x82\xff\x14\x70\x28\xd6\x8f\x54\x10\xa0\x56\xa6\x42\xa8\xcb\x95\x10\xac\xd8\x18\x83\x77\x3e\x81\x3c\x66\x6b\xf1\x75\x72\x51\x13\xbd\x90\x6d\x05\x46\xee\x46\x6d\x75\x42\xc8\x4f\x0b\x26\xdc\xb1\xec\x8e\xbe\x1c\xa9\xda\x37\x1d\x9e\xeb\xc7\x9f\x95\xbb\xba\x13\xbc\xe1\xb8\xc9\x53\x89\xe9\x0f\xaa\xbe\x25\xa4\x58\x24\x73\x47\x64\xca\x0a\x6a\x67\x68\xf5\xe4\x93\x78\x20\xe5\x29\x52\xc7\xf6\x57\x35\x2f\xc7\xfe\xa8\xdd\x19\x3c\x09\x7b\x6d\xe2\x8e\x1d\xdf\x67\x6b\x0a\xe4\x83\xed\xb3\x4f\x34\x6a\xfa\xe0\xd1\x75\x5b\x19\xde\x54\xd8\xf4\x02\x30\x9d\xb2\x64\x77\xf4\x2c\x25\x87\x15\x05\x94\x9c\xbd\x3f\xfd\xf1\xf0\xe2\x84\x7c\x77\xf2\x37\xfc\x78\x14\xe7\xcd\x52\x6f\xf9\x38\xb5\x2e\x03\x25\x97\x6c\x99\x6d\x76\x3b\xf3\x0b\x67\x0a\xf6\xec\xd1\xc9\xfb\x8b\xd3\xd7\xa7\x47\xf6\xad\xf0\xe3\xd1\x6a\x2a\x30\x1a\x52\x19\x88\x58\x97\xe2\x01\x81\xc8\x9b\x67\x20\x57\x10\x03\x7c\x89\x30\xfc\x35\x2b\xb9\x55\x34\x86\x9b\x4b\xf6\xfa\x41\xf7\xbd\xb5\xdd\xc6\x24\xd0\xae\x18\x44\xe9\x99\x2c\x9f\xe9\x35\x3b\x09\xed\x09\xcf\x8d\x39\xe4\x28\x58\x4b\x5e\x1e\x52\x63\xad\x48\xc5\xd9\x15\xba\x15\x83\x2c\xdd\xe4\x40\xc6\xe9\x0b\x46\x56\x9e\xec\xe5\xff\x76\xa9\x41\x35\xfa\x6d\xfb\xae\x92\x8d\xa6\x63\x4f\xcb\xcf\x31\x23\x01\x14\xb1\x5a\xae\x9e\x5d\x6b\x27\xce\x35\xd5\xde\xc6\x77\x5e\x50\xd8\x2c\x43\x69\xc8\x28\xff\xdd\xd9\xbf\xdb\x22\x1f\xb8\xeb\x49\x99\x7a\x52\xa6\x76\x5c\x99\x72\xd6\xd8\x2e\x6e\x26\x7b\xb8\x42\xb1\xa6\x9c\x59\x32\x01\x2f\xaa\x17\x4d\xf0\xb1\xb2\xd0\x92\xbe\x91\x65\x96\xfd\x84\x78\xf3\x01\x20\x97\x91\xbd\xf7\xe7\x87\x5f\xbf\xf8\xfd\x57\x7b\x23\xf8\xe7\x37\x2f\xfe\xe3\x77\xf6\x9f\x27\x47\xc7\xe7\x87\x67\x5f\xfd\x36\xfa\xe3\xeb\x3f\x7c\xb3\x97\x03\x96\xc8\x3d\xee\xb7\x5f\xbd\x74\x90\xbd\x7b\x27\xc7\x5f\xfd\xf6\xb7\x2f\xff\x23\x5b\x8b\x9b\x2c\xec\x53\xd3\x0f\x27\x1f\x1a\x8e\xad\xf7\xcf\x59\x21\x45\xb9\x93\x88\x64\x9b\xe8\xf4\x7e\xf6\x9a\x7e\xe0\x75\x5b\x93\x8a\xcf\x18\x84\x9c\x20\x39\xdc\x18\x17\x76\xcb\x23\x06\x22\x39\x94\x85\x45\x43\x08\x48\x36\x98\x6c\xc4\x5d\xcf\x17\x72\xc5\xd4\x94\x1a\x5e\x77\xd8\x5e\x1b\x43\x5c\x7a\xb8\x03\xcd\x5e\x5d\xbc\x3a\xf8\x21\xbb\x46\xaa\x59\xde\xf4\x74\x46\x24\x2e\xc7\x88\x5c\xb6\x53\x36\xa6\x0d\xc7\xa0\x3b\x4a\x01\xcd\x8c\x0b\x8a\xff\xe1\x77\xdf\xbc\x78\xb1\xff\xd5\x37\x64\x21\x5b\xa5\x0f\x26\x2b\xb7\x67\xa0\xc5\x45\x25\x40\xa5\x73\xe2\x41\x2f\xa4\x32\x50\xf7\x4b\x05\xf9\xfa\x77\x2f\x5e\x90\xfd\x97\x40\xc0\x81\x8b\x0d\x79\xf6\x82\xf2\x74\x3a\xcd\xa2\xe3\xe2\x4a\x73\x4d\x7e\xff\x87\xdf\x7d\xf5\x8d\x1d\xf3\x3f\x5e\x92\x92\x2e\x33\xa9\xf3\x17\x37\x79\x42\xdd\x96\xb1\x16\x06\x83\x83\x12\x34\xc5\x15\xff\xbc\xab\xad\xcf\x71\x8c\x87\x2d\xf9\xa5\x9b\xe6\x2f\x71\x9e\xdf\x6c\xd8\xce\x08\x34\x20\xe4\xfa\x8a\x64\x20\x44\x3b\x91\xd1\x5b\x5b\xf4\xb9\x6b\xa3\x28\x47\x28\x3f\x26\x66\x52\x15\x18\x1d\xeb\xf3\x5e\x0e\xf3\xf9\x97\x5e\xa1\xff\x2f\xfd\x50\x99\x60\x76\x43\xe0\x72\xac\xb5\x4f\x84\x42\x5e\x9c\xc9\x1c\x8b\x22\xc5\xdc\x4f\xaf\xdf\x6c\xb9\x0e\xa5\x5c\xe9\x78\x39\x0b\x0c\xee\x0d\x1a\xd7\xc9\xf0\x67\x3a\x48\xd1\x92\x1c\x9d\xbf\xef\xe0\x5d\x69\x59\x2a\xa6\xb5\x37\xc5\x02\xb2\xed\xce\xa8\x00\x9a\x15\x8a\x99\x8c\xb9\x64\xf8\xc0\x1b\xca\xfa\xdd\x97\x4f\x15\xfd\x9f\x72\x7d\xfe\xa8\xae\xe7\xc8\x0e\x4f\x90\xae\xe4\xf1\x43\xba\xe2\x5a\x3e\xe1\xb9\x3e\xe1\xb9\x3e\xe1\xb9\x0e\x7e\xd2\x8e\x22\x6f\x3c\xe1\xb9\xfa\xeb\x31\x54\xd0\x3f\xe1\xb9\x7e\xc2\xf5\x54\x49\x7f\xeb\xf5\x54\x49\xdf\xbb\xfe\xcd\x2b\xe9\x9f\xf0\x5c\x13\x07\x79\xc2\x73\xbd\xed\x7a\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x4d\xa0\x69\x13\x9e\x2b\x32\xff\x26\x54\x57\xe7\x6f\xea\x20\x5d\xff\x0d\x11\x5d\xb5\x65\xbf\x82\x1d\x16\x85\x6c\x85\xb9\x90\x97\x6c\x20\xde\xdd\x8a\xf7\x77\xed\xe9\x56\x0c\xdd\xe4\x0d\x5e\xbf\x79\x27\x5d\xc3\xf9\x52\xe7\x07\x1b\xf6\xf9\x4c\x7a\xda\x96\x9c\x89\x1c\x08\x01\xf9\x0f\x47\x4f\x9b\xd7\x10\xad\xc6\x2d\x4a\x56\x76\x5f\xb8\x93\xd3\x58\xa6\x99\x90\x43\xa2\x58\xc1\x1b\xee\x1a\x35\x53\xfc\x3c\x47\xd6\x81\x95\x0f\x1c\xb2\xaf\x66\x4b\x2b\x35\x58\x35\x0b\x47\x95\xfb\x9c\x33\x15\xf9\x48\x9d\x96\xb7\x42\x68\x0e\xe7\x97\x7d\x25\xb4\x79\xc0\xc2\xb9\xe6\x9a\xf9\x2c\x31\x17\xd0\x8e\x66\xe4\x22\xa6\x21\x06\x27\xc9\x43\x4c\xf4\xea\x6e\x25\x32\x06\x4a\x33\x9e\x5b\xec\x31\xa4\xb6\xac\x11\xd9\x19\x46\x90\xe8\xc1\x4a\x52\xb6\xca\x77\x96\xb5\xba\x11\x2f\xad\x8e\xe6\x61\x44\x51\x8c\xe6\xd8\x76\x28\x89\xc3\xae\xd2\x1d\x47\x21\x5c\x00\x2d\x16\x4c\x47\xf4\xa2\x37\xe2\xd2\x65\xb2\x64\x29\x60\xb7\x57\x53\xb5\x73\x2e\xd0\xa5\x01\xa3\x7a\x0d\xb6\x2b\x36\x77\x2f\xbd\x4a\xf2\x45\x44\x8e\xfd\x79\x8e\xc4\x01\x30\xa6\x36\x56\xbc\xe3\xcc\xf0\x59\xfc\x87\x26\xb2\x2a\x7d\x70\xfd\x0f\x2f\x48\xc3\x54\x81\x62\x29\x4b\x00\x4f\x63\x4d\xbd\x91\xa4\xb2\x16\xb3\x55\x65\x6e\x1e\x3e\xc4\xf6\x8f\x23\x01\x80\xf9\x0f\x99\x32\x34\x03\xd6\xa6\x21\x15\xa3\xda\x90\x97\x2f\x48\xcd\x45\x6b\xf2\xf5\x0c\xbe\x87\x84\x82\xdf\x7d\x33\xf0\x69\xf7\xd0\x81\x38\x8b\x24\x89\xbd\x2a\xf0\xef\xe0\x5a\x71\x11\xc5\x1a\x36\x4b\x23\xb9\x30\xab\x8e\x96\x28\xd1\x3d\xd7\x69\x05\x91\xcc\x9d\x38\x0f\x32\xbb\x18\x7e\x6d\xe5\x74\x99\x06\xc1\x93\x63\xd1\xdd\xf0\x31\x88\x3d\x25\xff\xe9\x3e\xc4\x25\x96\xa8\x86\x2c\xac\xd1\x0b\x7e\x59\xbd\xa0\x0a\x31\x69\xa0\x88\xc3\x67\x13\xa5\xad\xce\xb1\x1d\x18\x00\x22\x5e\x85\x71\xb9\x26\x65\xf8\x38\xb8\x66\xb9\x18\x1b\xc5\x58\x20\x19\x6c\x7d\x88\x20\xfb\x2c\xa4\x41\x68\x85\x03\x55\xfc\x61\x8a\xfd\x98\x28\x36\xe7\xda\xa8\xb4\xb0\xdf\x38\xfd\xc0\x1c\x6a\x05\xcc\x95\x6c\x93\x1b\x3a\xe7\x12\x5b\x40\x84\x77\xf1\xfa\x44\x8f\xa2\x60\x5a\x0f\x29\x9a\x71\x47\x9d\xe3\x31\x18\x23\xf1\x59\x83\xc5\x8e\x62\xb4\x7c\x27\xaa\xe4\x98\x69\xae\x89\xf6\x74\xa0\x3f\x0d\xb4\x2a\xc8\x72\x84\x0d\xea\xb7\xaf\x5b\x00\x74\xd5\x81\x0c\x61\x25\x5a\x3a\xf6\xe7\x63\x80\x42\x8d\x22\x85\xe9\x52\x3d\xd6\x45\x66\xb4\xd2\xc9\x71\xc6\xe1\xbe\x16\xbf\x7d\xb7\xbf\x40\x48\x47\x5f\xa0\xbb\xea\x4e\xa9\xba\x6a\x4e\xbf\x58\xef\xfd\x0f\x9c\x1a\x9c\xee\x2b\xec\x0c\x57\x1a\x65\x72\x50\x0d\x27\xc7\x2b\x2b\x98\x31\x21\x6c\x3f\xd0\x10\x03\xcc\xf8\x62\x38\xc7\x29\x85\xac\x6b\xaa\x0f\x92\x89\xc1\xfc\x22\x0a\x40\x72\xda\xd5\xb7\x0b\xa3\x68\xd5\xcd\x50\x04\x60\xba\xad\x6d\x6d\x98\xa0\x22\x39\x65\x32\x17\xcf\x20\x15\x44\x5e\x87\x72\xd4\x39\xbf\x62\x62\x75\x3f\x3b\x77\xc4\xb7\xb4\xb8\x64\x03\xb0\x9b\x7e\xd0\x7e\x8d\xcb\xa5\xa0\x0e\xcb\xc6\x1e\x43\x57\xdc\x8a\x03\x56\xae\x8c\xab\x47\x5d\x86\xbb\x66\xc6\x83\x0d\xa1\x61\xb7\xad\x85\x6b\x35\x4b\x86\x8d\xcd\xb5\x6c\x96\x86\xfb\x3a\xf3\x34\x66\x74\x28\x7e\x55\x30\x6f\x17\xdb\xf1\xb6\x35\xdf\xf8\x7e\x59\x66\xdc\x73\x73\x24\xa3\x5c\x65\xb0\x4b\x47\x45\xe8\xc9\xca\x9e\x55\x4b\x0f\xda\xbe\xba\x17\xa6\x4b\x88\x06\x0e\x3b\x6f\x12\xe7\x43\x4d\x93\x94\xcc\x1c\x6c\xa7\xa6\x65\xff\x60\x79\x4f\x4b\xa9\xc9\xb7\x50\xbd\x7f\xcc\xc0\x8d\xf2\xd0\x46\xc3\xfb\x6f\x8f\x3f\x62\x30\x58\xaa\x3f\x2f\x63\x81\xd7\x74\x9e\x66\x5a\x8f\x49\x2d\x05\x37\x52\xa5\x9c\x79\x43\x6d\x85\x99\x1e\x52\x5e\x9a\x4b\x6e\x22\x15\xde\xb7\xd1\x41\x7a\x86\xfa\xd2\x28\x2d\x0a\x58\x77\x29\x5b\x72\x4d\xc1\x33\x88\xdc\x9d\xae\xb1\x5e\xf0\xe6\x15\x39\x11\xba\x55\x11\x42\xd9\x2a\x09\xf6\xa0\xf3\xcc\xe9\x8f\x3b\xd8\x48\x76\xf6\x11\x0b\xd7\x81\x90\x26\xd3\x71\xf2\x81\xd6\x4d\xc5\xf4\x2b\xb2\xc7\x3e\x98\x6f\xf6\x46\x64\xef\xc3\x4c\xdb\xff\x08\x33\xd3\x7b\x13\x72\x5a\x37\x15\x2f\xb8\xa9\x96\x84\x8b\x19\x53\x2a\xc4\xde\xf1\x07\x2b\xa9\xff\xe9\x94\xdc\x31\xe6\xad\x8d\x54\x74\xce\x9e\x3b\xdd\xe0\x0b\x35\x4d\xd5\x44\x06\x9f\x49\xb0\x09\xb7\xcd\xcc\x40\x44\x70\xf2\x83\x34\xc6\x8f\x86\x1c\x4f\x1b\x57\x85\x39\x96\x99\x5c\xfe\x01\xd6\xc5\xad\xc0\x73\x35\x2d\x9f\xbf\x3f\x39\x3c\x7e\x73\x32\xa9\xcb\x2f\x16\xf2\x7a\x6c\xe4\xb8\xd5\x6c\x9c\x5c\x52\x3a\x78\x65\x2e\xd9\x12\x70\xd0\xb7\xbc\x36\x8e\x8c\x9e\x17\xd5\x48\x48\x16\x80\xcf\xad\x01\xf2\xfe\xdb\xe3\x1f\xf4\x90\x48\x57\xe4\xa4\x78\xce\x4c\xf1\xbc\x60\xcd\xe2\xb9\x1b\xf9\xdf\x75\xfd\xa3\x14\x93\xb5\x39\x49\x7a\xa0\x3f\x33\xb7\xcd\x51\x9e\x0e\xd4\x5e\x0b\x59\x55\x58\x5b\x6d\x4f\xad\x23\xd6\x2c\xc2\x0d\x8f\x7a\xe5\x87\x94\xa9\x0c\x2c\x4e\xd9\xbd\xf8\x00\x01\xb4\x7e\x99\x9c\xe2\x94\x8b\xf5\x2c\x0d\xfd\x73\x06\x3e\x19\x76\xcc\x44\xc2\x4b\x4d\xf3\x2a\x11\x8f\x53\x5c\xa5\xaa\x33\x8f\xc2\x3f\xfc\xde\x7f\xa9\x99\x01\x2d\x96\x0b\x82\x7d\x94\xdf\x58\xad\x7a\x17\x1c\xc1\x3b\xc1\x4a\x43\xfc\xd0\x58\x16\x3d\xa0\x6b\x5a\x2e\x4e\x08\x84\x80\xd5\x1d\x65\x28\xd3\xd6\x2c\x98\x30\x1e\xfa\xc9\xd5\x71\xc7\xba\x10\x39\x9d\xa1\x3f\xb0\x1c\x90\x46\x29\xaf\x98\x52\xbc\x64\x9a\x0c\x56\x86\xe2\x38\x10\xaf\x1e\x35\x6b\x0d\xca\x60\xcc\x91\x30\x38\x34\x87\x3e\x67\xa2\x43\xfe\xbc\xf9\xdd\xc8\x98\xdf\x89\x5c\xf9\xfb\xc8\x92\xdf\xc5\xfc\xf8\x4c\x19\x86\xc3\x73\xe2\xf3\x67\x79\xef\x4c\x90\xa3\xa7\x76\xc2\x27\xd9\xd4\x4e\x5a\xd6\x7c\x00\x08\xdf\x0e\x88\xf4\x3c\x8a\x27\xcc\xc3\x9d\x1f\xa2\x0b\x5a\xb1\xd3\x77\xdb\x0a\x47\xb8\xe1\xfb\x21\x89\x73\xf7\x61\xc3\x94\x47\x77\xf5\xd1\x31\x63\x68\xb1\x70\x01\x02\x9f\x97\x20\x05\x40\xef\xe0\xbe\x21\x42\x96\xa9\xe9\x86\x71\x4c\xc2\xd3\x70\x7b\x5c\xc2\x93\xff\x79\xc5\x26\xe6\xd4\xb0\xeb\x44\xfb\x7d\xdc\xa9\x8d\xa9\xbf\x07\xc7\xf8\x53\x6c\x63\x63\x60\x61\x78\xfc\x22\x94\xdf\xaf\x3d\xfb\xfe\x23\x16\x93\x1b\x62\x15\x39\x8e\x01\x78\xe2\x56\xa2\xb9\x78\x05\x39\xfc\x61\x96\xa6\x8c\xb8\x5d\x97\x85\xff\xdc\xb3\x3c\x17\xc1\x42\x3a\xf4\x31\xaf\x2e\x7b\x01\x77\x78\x76\x4a\xfe\x82\xb7\x6f\x6d\xf6\x1a\x25\x0d\xba\x41\x8f\x65\x4d\x79\x72\x0d\x5a\x6f\x0e\x56\x1f\xea\x27\x23\xb6\x64\xfd\x24\x9c\x85\x7b\x89\xbb\xd9\x63\xd0\x16\x52\xcc\xf8\xbc\x55\xac\x24\x2e\x70\xb5\xb5\x59\xda\x39\x0f\xd1\x9a\xcf\x86\xec\xdb\xef\x9e\x43\x0f\xbb\x83\x49\xe7\x2d\x5a\x71\x25\xa5\xfb\x76\xef\xd1\x05\xf5\x59\x3a\x6e\xa2\x8c\x18\x8f\x22\xd6\x39\x6b\x3c\xf3\x83\x3a\x1e\x2a\xc9\x06\x8c\x2a\x34\x87\xf2\x82\xa8\xc0\xd3\x75\x10\xe3\xba\x03\x0a\x43\xaf\xd0\x88\x7c\x2f\xe7\x5c\xf8\xe3\x45\xba\x02\x9f\x19\x4d\x77\xcf\x3c\xf9\x47\xd6\xae\x27\xff\xc8\x93\x7f\xe4\xc9\x3f\x72\xf3\xa5\x75\x75\x22\xe8\xb4\x4a\xaf\xe6\xee\x17\xbc\x87\xc7\x91\xd7\x15\x9d\x13\x06\x7f\x3c\x2f\xb9\xb6\xff\x25\xe7\xe7\xdf\x43\x56\x74\x2b\xbc\xeb\x1c\x78\xd3\x69\x5f\x23\x3f\x43\x78\x96\x6e\xef\x18\x43\x35\xe7\xcd\x00\x50\xb3\x6c\x07\x59\x47\x4a\xe8\x42\xab\x7b\x20\x0e\xee\x0e\x38\xcf\x68\x00\x8a\xc4\x3a\xe8\x29\xb3\xd2\xaa\xb8\x3c\x8b\x12\x93\xa5\xb2\x9f\x89\xe8\xa3\x2c\xc6\x47\xa6\x67\xe6\x34\x43\x56\x48\x1a\xc2\x0a\x67\xb9\x82\xd7\xd1\xf3\xbc\x36\xee\x95\x90\x73\xb7\x90\xf0\x1d\xd5\x5a\x16\xbc\x2b\x25\x70\x9d\x56\xbc\x8a\x5e\x82\x8a\xbe\xb5\x49\x46\x3b\x38\xcf\x84\xa0\xf9\xbd\xc1\x32\xf1\x8c\xed\xee\xa0\x3a\xb6\x44\xb8\xf0\xf3\xb6\xb5\x49\xc0\xad\x36\x04\x45\x3b\x97\x90\xe8\x28\x59\x9d\xc7\x20\x10\x56\x53\xc1\x3d\x4a\xad\xe3\xbd\x64\x8f\x13\x5e\x90\x05\xca\xf5\x06\xae\xe5\x3a\x88\x24\xe8\xc4\xbe\x95\xd5\x4a\x07\xf5\xce\xe2\xe0\x45\x7b\xa3\x5f\xcb\x84\x9f\xb9\xa4\x72\x90\xd5\x8d\x6c\xda\x0a\x2b\xe9\xc3\xa4\xa5\xcd\xd6\xc0\x6c\x54\xa4\xed\xe1\x7d\xb6\x43\x2d\x8f\x08\xfd\x71\xdb\x1b\x32\x06\xa2\xbc\x3b\xe2\xa8\xdf\xa3\xd8\x68\x69\xba\xf4\x8f\xcb\xe0\xf1\xdc\x3e\xe0\x68\x2e\x80\xd1\x74\xef\x72\x0f\x98\xb4\xe7\xc1\x79\xf1\xbb\x6f\xbe\x19\xa0\x0c\x71\xc5\x0a\x23\xa1\x18\xd0\x81\x3d\x87\x8c\x59\xaa\x18\xd8\xfe\x88\x06\xea\xfd\xcb\x58\x0c\x66\x06\xe5\x75\x6c\x0f\x91\x74\x2b\x08\xa4\x39\x30\x30\x86\x23\x8c\x0e\x4a\xd0\xcc\x96\x35\x0f\xdd\x0b\x4e\xb7\xdc\xbd\x60\xab\x3d\x0b\xb6\xd9\xa9\x60\x7b\xfd\x09\xb6\xd8\x95\x60\xdb\xbd\x08\xb6\xd2\x81\x60\xeb\x09\xdd\x0f\xdf\x63\x20\x0b\x54\x60\x0e\x98\xc0\xa1\x5d\x04\x06\x42\x0c\xe6\x81\x17\x1c\xdc\x27\xe0\x21\xba\x03\x64\xf2\x71\x0e\xef\x04\x90\x17\x06\x6a\xdb\xa8\xff\x3b\xa4\x7a\xe3\xb5\x9b\x08\xff\x5b\xc1\xf5\xdf\x36\x9a\xff\x16\x31\xfc\xf3\x61\xc9\xe5\xc2\xeb\x1f\x8e\x21\x97\x57\x70\x6c\x09\x91\xff\x1e\x71\xf8\x1f\x04\x7d\xff\xbe\x31\xf7\x77\xb3\xb8\x6d\x28\x86\xf7\x60\xe4\x6e\x9d\x09\xba\x3b\x57\x0e\xc8\x2e\xb8\xc5\x3b\x4a\x36\x86\x17\x7c\x63\x46\xdf\x68\xfb\x19\x96\xf8\xe8\x86\x16\xb0\xaf\xdb\xcc\x15\x58\x0f\xe2\x83\x25\x83\x7d\xe5\x48\x89\x4c\x52\x78\xb3\xb8\xcb\x91\x80\x77\xe7\x2b\x19\xd1\xe1\xe3\x87\x4f\x84\x0e\x43\x7f\x24\x15\xda\x4f\xdd\x8e\x25\x43\x3f\x65\x05\x7f\xca\xb5\x8b\x59\xc1\x0f\x85\x60\xf2\xf9\x25\x66\x96\x4f\x89\x99\xf1\xb5\x83\x89\x99\x9e\x69\x75\x7c\x1a\xe3\xb1\x0b\xa6\xa5\x9c\x5a\x25\xd5\x83\xf9\x75\x32\xf8\xf0\xec\x34\x79\xf4\x42\x31\x00\xea\xa7\x95\x9e\x6c\xb2\x39\x7d\xfa\x91\xb3\x70\x43\xd7\x6a\x63\x58\xdd\x24\x0a\x6f\xf2\x94\x97\xb9\xe9\x7a\xca\xcb\x7c\xca\xcb\x7c\xca\xcb\xbc\xf9\xda\xe5\xec\xa2\x45\x5b\x53\x31\xb6\xe7\x29\x24\x75\xf6\xca\x49\x56\xd4\xf4\x09\x71\x27\xe0\x20\xa1\x85\xe8\xba\x80\xb9\xdc\x0a\xfe\x6b\xcb\xba\x48\x47\x30\xd9\x76\x20\x0f\x0c\xe8\xd8\x9d\xe5\x42\x4b\x76\xe5\x9c\x2d\xe4\x1a\x3e\xa0\x9b\xcb\xb0\x74\xfe\x68\x1c\xb6\x64\x30\x78\x2f\x30\x69\x16\x0c\x8d\xed\xb3\x15\x63\xbb\xe7\xd3\x75\x82\x1c\xe4\xe8\xb0\xe8\x70\x6c\x09\x5a\x16\xb5\xef\xee\x9a\x96\x4c\x19\xa9\xb9\x52\x52\xb9\x4c\xb5\xf8\xf5\xb1\xf0\x89\xcf\x17\x86\x29\xf4\x90\x62\x79\x46\xba\xf8\x3c\x67\xc6\xed\x02\xd8\x45\x46\x12\x2a\x10\x7b\xd5\xfe\xdb\x83\x7c\xc0\xd4\x78\x0d\x64\xca\x16\xf4\x8a\xcb\x76\x00\xa8\xda\x39\xea\x53\x7b\xee\x91\x60\x2b\x2c\x65\x1b\x72\x51\x5a\x6d\x27\x23\xac\x82\x5e\xe7\x83\xe4\xa1\xdf\x76\x0f\x05\xb7\x79\x29\x7d\x30\x7a\xcc\x3e\x70\x6d\xd6\xe7\xdc\xb3\x80\xcb\x7d\xda\xca\x66\xbe\xd2\x8d\x3d\x7d\x7f\x4c\x86\xe9\xcd\xb1\x85\x7b\x44\xf4\x5d\x20\x57\xe7\xf0\xd5\xc7\x1c\x20\xae\xdf\x0f\x42\x96\x93\x9a\x16\x0b\x2e\x32\x40\xd4\xfe\xd8\x23\xac\xe7\x09\x99\x90\xc3\xaa\xea\xea\x98\x74\x28\x1d\xf4\x9e\x91\xfe\x4b\xd9\x45\x4a\x22\xc7\x72\xae\x62\x25\xe4\x59\xa1\x8a\x05\xf5\x89\x9a\x4f\xdc\x00\x93\xab\xfa\x9a\x2a\x36\x29\x64\x4d\x8e\xce\x4f\x49\xa9\x78\x62\x07\xae\x2d\xd7\x9f\xe3\x12\x9f\xa5\x85\xae\x3f\x37\x7f\xcf\x93\xaf\x67\xa7\x7c\x3d\xa1\x84\xa1\xe2\xc5\xf2\xf4\x38\x6f\x59\x04\x3e\xd3\x2b\x9a\x3a\x94\x44\xd8\xcf\xc9\xb7\x54\xb3\x92\xbc\xa1\x82\xce\x31\x60\xb5\x7f\x7e\xf6\xed\x9b\x03\xcb\xf0\x10\x8c\x3b\x3d\xde\x58\x37\x71\x1e\x3f\xfc\xed\xb6\x10\xcf\xc9\xea\xd4\x65\xd3\xed\xd7\x9e\x9a\x38\x7d\x5b\x03\x83\x27\x41\x6d\x3d\x1b\x10\x04\xde\x00\x90\x7f\xb6\xda\xff\x0b\x0b\x15\x7c\xb3\x46\xbd\x7a\xa4\x5e\xd5\xe5\xe5\x43\x4f\xc0\x7a\x34\xd2\xda\x8f\x97\x6c\x79\x67\xe9\x3d\x86\x15\x1c\x38\x38\xbe\x47\x4d\x6f\xee\x12\x14\x65\xca\xdc\x46\xe1\xa7\x65\xcd\x7d\x42\x66\x5c\x6f\x5d\xcf\x8d\xa2\x86\xcd\x97\xc7\xac\xa9\xe4\xd2\x72\xf1\x59\x94\xb8\x83\xb7\x4e\x51\x95\x56\x53\x5a\x10\xd5\x56\xd0\x0b\xa1\x5c\xeb\x90\x28\x18\x2b\x3b\x31\xcf\x85\x36\xb4\xaa\xec\x02\xc2\xf3\x6f\xa5\xe8\x93\x95\x83\x4f\x55\x03\xc6\x48\xe7\x47\xef\xea\x77\x08\x7e\xfb\xb1\xd5\xfe\x74\x45\x00\x86\xff\x38\xbf\xdd\x25\x13\xf2\x93\x73\x1e\x53\x14\x06\x94\x68\xef\xdb\xca\x1e\xd0\x55\xd9\xef\xa8\x8c\x26\x87\x63\x05\xec\xd6\x00\xf2\xcf\xbe\xa4\x73\x01\x4a\xa6\x7b\xa9\x10\xd1\xcf\x3f\x69\x7c\x6c\xda\x7c\xbd\x40\x0d\xd4\x3e\x98\xd0\xa6\xa9\x38\xa2\x0c\x48\xe5\x92\x70\xa3\x78\xf2\xfa\x6d\x9f\x22\x6a\xef\xa8\x86\xde\x4d\xed\x1c\x93\x2b\xa6\xa6\x9f\xe2\x7f\xbb\xab\x46\x49\x1b\x0e\xe9\x4c\x9f\x2c\xc2\x52\x95\xc6\xc3\xb3\x53\x1c\x68\x53\x84\xdf\x7f\x89\x0c\xe1\x96\xda\x27\xf4\x60\x39\x9a\x0b\x03\x84\x66\x4e\x87\x67\xa7\xd8\x23\xcd\xf5\x73\xea\x42\x03\xd6\x62\xa7\x58\x7c\xd9\xb5\xa1\xa5\x73\xfb\x44\x43\xa4\x60\x77\x69\x68\x6a\x29\x60\xa2\xad\x19\xf6\x8a\x0a\xc4\x10\x2e\x60\x9c\x40\x45\x17\x81\x40\xaf\xf2\x84\xec\xed\xc5\x36\x21\xc2\xb3\xa8\x88\x6e\x10\x75\x7b\x5f\xf6\xee\xb2\x72\xad\x7b\xb1\x4f\x3d\xe1\xef\x9e\xf5\x7c\xc7\x2c\xe7\x84\x13\x33\x43\xe6\x8e\x90\xe2\xbd\x9b\xef\x1f\xde\x7f\x7f\xef\x0c\xfa\xb6\x3f\x9c\xeb\xd8\xc3\xa0\xdb\x68\x43\x95\xe1\xb4\x22\xad\xaa\x7c\x7a\x21\x22\x91\xb8\x8a\xc0\x05\xbd\x8a\xba\x21\x4d\x08\xf9\x12\xb9\xd2\x31\x03\x8a\x32\x70\x8a\xba\xee\x60\xb3\xb6\xaa\x46\x64\xc6\x05\xb5\x07\x19\x6b\x48\x94\xe4\xf5\xc9\x14\x9f\x73\x51\x30\x3b\x4d\x63\xcf\x97\x04\x28\xf7\x6e\xa3\x20\xd3\x20\x47\x33\x0e\xb9\x20\x29\x56\xbe\x15\xe0\x17\x9e\x49\x45\x8e\xaa\x56\x1b\xa6\xde\x4b\x7b\x0c\x77\xe5\x26\x64\xa6\x64\x4d\x68\xfc\xf5\xb7\x5c\x94\x77\xaa\x84\x7a\x0f\x47\x7b\x41\x05\x61\x1c\x12\xa3\xec\xd0\x90\x0f\x6d\x99\xbd\xdb\x54\xfb\xba\x2d\x16\x76\x8a\xf6\x1a\x59\xea\x3d\x2b\x9d\xf7\x30\xdc\xa8\xf7\x0e\xec\x5f\xab\xef\x8a\xd5\x1b\xd1\xef\x9e\xd3\x86\xef\x1d\x8c\x08\x4c\x38\x24\xe7\xc9\x4f\xcf\xc6\xfb\x4c\xf7\x91\x9f\x30\x70\xf5\x25\xed\xa2\xf7\xf1\x13\x60\x63\x88\x2e\xf5\xed\x7a\xc1\x0d\xd6\xeb\xd8\x9d\x82\x31\x80\xd0\x6b\x66\xf5\x20\x25\xe4\xd0\x07\xd1\xec\xd6\xaa\x19\xf5\xf9\xba\xec\x8a\xa9\xa5\x59\xb8\x06\x16\x5e\x8a\x3e\xad\x1c\xec\x8c\x41\xab\xe6\x44\x99\x5f\xa1\x6e\xbb\x81\x4c\x58\x5b\xa1\x67\x5f\x3e\x5b\x3d\x92\xba\x33\xf8\xdf\x7b\x3d\x40\x09\x4b\x5a\x8b\x1f\xed\x2f\xfb\xeb\x80\x1f\xe1\x61\x12\xc4\xe1\xf7\xdf\xbb\xf4\x14\x9c\xf0\xef\xb8\x80\xa8\x37\xe8\x43\x1e\x0b\xc0\x2d\xda\xc6\x95\x02\x0a\xff\x6d\x57\x69\xdd\xe8\xfa\x54\x43\xe9\x16\x1a\xbd\x9d\x79\xd3\xa3\x6e\x7d\x80\x33\x56\xdf\xc8\x72\xf3\x26\xee\x31\xc9\x69\x74\x73\xc8\x25\xee\xdc\x9c\xee\x59\xce\x72\x5a\x36\x1b\xad\xd0\xdb\xd7\xf4\x96\xf5\xbb\x89\x92\xce\x4f\x07\x62\x3f\xfa\xe6\xa2\x4b\x8c\x20\xb3\x8a\xce\x3b\x5e\x04\x21\x8e\x9a\xfd\xd1\xf9\x8f\xfe\x15\x34\xb9\x01\x7a\xf8\xa3\xa6\xd3\xc7\x8c\xa5\x71\x37\x4b\x37\xde\x71\x63\x28\xe3\xe3\x16\x53\x78\xf8\xcd\xdc\xf4\x29\x79\x5f\xe6\x56\x57\xfd\x4d\xf3\xef\x5d\xeb\x34\xe2\x04\xdf\x39\xce\xbb\x42\xa0\xda\x04\x74\xb8\xf3\x1f\x7b\x6c\xf2\x11\x7a\x6f\x60\xda\x4b\xb6\xbc\x96\xaa\xfc\x38\xc3\x1e\x06\x61\xe6\x7f\xe2\x8d\x79\x9f\x0c\x86\xee\x78\xb9\x31\xb0\x93\xcc\xaa\xb7\x12\x5f\xd1\x29\xab\x3e\x4e\xfa\x0d\x86\xc1\x1b\xda\xd8\xd7\xe9\x4a\x36\xd1\x23\xe5\xb2\xcc\xd0\x3a\xc5\x3a\x1f\x5f\x91\x26\xd5\x9c\x0a\xfe\x4f\xac\x73\x2d\xac\xa4\x90\x8a\xff\x73\x33\xab\xed\x63\x4c\x1f\x7d\x5c\x15\x2b\xcc\x81\xe3\xfa\x8d\x22\xfb\x23\xdb\x82\x96\x25\x47\x15\xec\xec\x23\x1c\x7c\xfb\x7c\x71\x71\x79\x97\x95\x86\xfb\xb1\xcc\xa6\x0b\xec\xdd\xe3\x32\xdf\x22\x16\x3e\xbe\x73\x6f\x4f\xa3\xfb\x84\xe3\xa9\x55\xb7\x14\x8a\xdc\xfa\xfb\x9a\x72\x3c\xb5\x37\xb7\xf1\xba\x61\x76\x1d\x37\x51\xa7\x5b\x5b\x59\x6a\xdf\x2f\x3c\xed\x01\xf6\xd5\xa0\x09\x67\x35\xe5\xa9\x33\x86\xd7\x80\x25\xab\xa9\x69\x15\x37\x1b\x4f\xea\xdb\x7f\xc8\xc5\x77\xed\x94\xfd\xc8\x94\xb6\xeb\x71\xd7\x9f\x0b\xa8\x38\x3b\x3c\x3b\xdd\x38\x2d\x79\x4e\xe4\x1b\x1d\x19\xe0\x37\x73\x94\x5b\x75\x91\xb4\x82\xd6\x53\x3e\x6f\x65\xab\xab\x65\x1c\x41\xa1\xe4\x92\x8b\x72\x42\xc8\x29\xba\x55\xc5\x33\x43\xa8\x90\x62\x59\xbb\x5b\x45\x51\xb5\x25\xeb\x3d\xf1\xa6\xa3\x4c\x12\x7a\x25\x79\x49\x68\x6b\x64\x4d\x0d\x2f\x48\x21\x99\x2a\x00\x44\x35\x7e\x7e\xab\x19\xa1\xbd\x27\x76\xbf\x2d\x5a\x6d\x64\x4d\x6a\xaa\xf4\x82\x56\xd5\x4d\x2c\x91\x41\x3b\x00\x77\xda\x8d\xdf\xda\x59\xb9\xf1\xcb\xab\x5b\xe6\xe1\xe3\xdb\x01\x06\x1e\xb4\x1d\x2c\x71\x83\x1e\x70\x75\x33\x53\x7f\xc2\x33\x1c\x02\xee\xc6\xbe\x1c\x3d\xfe\xbc\x58\x30\xd2\xb4\xd3\x8a\x6b\x30\xe1\x41\x70\x2d\xc9\x94\x2d\xb8\x2b\xbd\xf9\xb8\xc4\xba\x71\x89\x3f\x36\xcf\xb7\x89\x8c\x8f\xce\xd0\x2d\x12\xfe\xd6\xdf\xba\x13\xf0\xb4\xa6\xf3\x4f\x50\xed\x6f\xd8\xbe\xdf\x5b\xb1\x4f\xc5\x32\x9c\xa7\xd0\x4c\x55\x8f\x88\x54\xae\x90\xd8\xdb\x7e\xca\x7d\x15\x5a\x04\x2b\xf2\xce\xcd\xa8\xab\x8b\x76\xdb\x00\x50\x06\x98\x9a\x49\x55\xdb\x79\xe7\x8a\xcc\x5a\x01\xde\xf0\x1b\xec\x42\xc8\xe1\x83\xf3\xc7\x39\x33\x69\xa5\x65\x10\x06\xb0\x6c\xc2\x13\x46\xa8\x26\xd7\xac\xaa\x30\x8d\x08\x3b\xbf\x46\xb0\xcd\x1d\x96\x65\x97\x4a\x38\xdd\x6c\x5b\x96\x7c\xce\xb4\x21\xfb\xe7\x7f\x3d\x3c\x00\x85\x08\x9c\x75\x4b\x62\xe8\x7c\xb2\x92\x1f\x8e\xc9\xa4\x56\xdd\x2a\x5b\x50\xcb\x0a\x6a\x68\x25\xe7\x98\x81\x66\x45\x8a\xfd\x7d\x53\xd1\x25\x94\x71\x35\x54\x41\xad\x60\x81\x0e\x4b\xa2\x5a\x71\x53\xe7\xef\xfb\x3b\x29\x3f\x2e\x93\x6e\xeb\xa9\x7d\x4b\x78\xf8\xe3\x32\xe7\x23\x7d\x82\xef\xf7\x08\x56\xac\xf9\xff\xd8\xbb\xb6\xde\xc6\x6d\x25\xfc\xde\x5f\x41\xf8\x25\x6d\x10\x67\x71\xd0\xee\x79\xe8\x5b\xe0\xa4\x40\x70\x72\x59\x38\x69\xfb\x5a\xc6\x62\x6c\x21\x32\xa9\x92\x52\x2e\x2d\xfa\xdf\x0f\x38\x43\x52\xa2\x2d\x91\x94\xad\x38\x8b\x45\xf5\x92\x5d\x4b\xbc\xdf\x66\xbe\x99\xf9\x58\xd0\x1e\xc0\x6a\x6b\xbf\x68\xa8\x0f\xb5\xde\x02\xc0\x86\xe0\xcc\xe5\x71\x4a\xee\x70\x3e\xad\x69\xb5\x40\xff\x90\x3f\xd6\xac\xa2\x19\xad\xe8\xa9\x56\xee\xff\xf0\x29\x92\x44\x91\xe9\x8c\xfa\x07\xba\xa7\xce\x28\x8a\x8b\xf8\x1e\x77\xa5\x55\x0b\xf7\x39\x28\x5c\x76\xdd\x06\x11\xb2\x3d\xb7\x37\x68\xfe\xc5\xab\xd6\xad\x83\xa6\x7c\xaf\xae\x9b\x89\x7c\xec\xa9\xf0\x5b\x62\x66\xeb\x9a\xf1\x4a\x9d\xc2\xd0\xb4\x7f\x01\x7b\xc2\xd9\xcd\x79\x3f\x1c\x1b\x07\x92\x22\xc0\x51\xba\xcd\xe6\x2c\x50\x77\x6b\xb2\x31\x6f\x7c\x5b\xa2\x25\xca\x00\x1a\x26\x24\x6f\xa0\xdc\x9d\x4a\xf0\x71\xa0\x58\x1c\xe7\x86\xca\xa5\x51\x0a\xfb\xc1\xb6\x24\x8b\x70\x8a\x1d\x38\xc6\xac\x33\x75\xcd\xe8\xfd\x28\xcd\x2c\x1c\x65\xbf\xe9\x63\xb7\xc1\x31\x01\x5a\x05\x8b\xfc\xbb\x61\x48\x35\xa3\x27\x82\x85\xb6\xa9\x03\x2a\x1a\x35\x02\xba\x59\xe0\x39\xf1\x3e\xb1\xb7\x23\xa3\xe9\xea\x15\xb4\xca\x4b\xe4\x6f\x32\x36\xc1\xd8\xf0\xe3\xf3\x1b\x2d\xf2\xcc\x15\x80\x6b\xe9\x92\x9f\x90\x1b\x51\xe9\x3f\x17\xaf\xb9\xaa\x10\x63\x38\x17\x4c\xdd\x88\x0a\x7e\x19\xa5\xa7\xb0\x82\x63\xf6\x93\x81\x41\xd0\x00\x04\xcb\xbd\x05\x96\x98\xfe\xc0\x3b\x14\x1a\x79\x4f\x7f\x7d\xc9\xb5\x40\x83\x4d\x8e\x14\xe1\x48\xe1\x94\x29\xc0\x92\x25\x70\xc1\xa7\x36\x46\x6b\xbb\x04\xd3\x8f\x42\x7a\xdd\xb8\x73\x61\xa6\x20\x0c\x6f\x80\x37\xb9\xb2\xe7\x92\x13\x43\xa8\x85\x86\xa3\xb8\xf4\x9a\xc9\x25\xd8\x76\x17\x11\x5b\x64\x2a\x22\x9f\x84\xc3\x27\xa3\xef\x3b\x61\xee\x3b\x24\x82\x33\xe9\xaa\x17\x9f\x23\x03\xe6\x63\x2b\x2b\xdc\xf5\xd7\x08\xdc\xfd\xad\x37\x77\x18\xd2\x7f\x80\x50\x51\x9d\x92\x33\xa2\x72\xbe\x2c\x98\xf7\xce\x98\xdb\x5b\xd9\x04\x8a\x2a\x21\x4a\xf1\xcf\x3a\x7f\xa6\x85\x3e\x66\x20\x2a\xc4\x51\xb1\x88\xc7\xad\xc3\xf6\xc4\x10\x27\xea\x0d\xd1\x89\xb1\x93\x27\xf6\x36\x39\x09\x86\xc9\xb4\x67\xf4\xe4\x92\x4f\x1a\x8e\x21\x6f\x96\xba\x33\x0d\x24\xe3\x09\xbc\x9b\xec\x7e\x6e\x07\x4f\xa8\x74\x94\x91\xc4\xa7\xdc\xb0\xd8\x3b\xf5\x94\x77\xbb\x25\xa5\x4c\x12\x2b\x5f\x7e\xaf\x7e\x00\x5c\x8d\x33\x02\x24\x58\x12\x4c\x12\xfa\xd7\x36\xa3\xb3\xd6\x58\x9e\xf2\xb2\x6c\xe8\xb6\xeb\x72\x29\x69\xc6\xc8\x52\xd2\xb2\x67\xd1\x0e\x93\x4e\x51\xc4\xed\x2a\x32\xa0\x96\x7d\xfd\x3a\x50\xcf\x58\x07\x50\x87\x60\xba\x17\xf6\xb0\x12\xe2\x09\x98\x71\x60\xde\xbd\x23\xa4\xf6\x3b\x96\x75\xde\xfc\x66\xe1\x0e\x45\x32\x56\xd1\xbc\x00\x17\xc1\xdb\xab\x6b\xe3\x44\x68\x65\x35\x5b\xcb\xee\x3d\x63\x04\xdd\x90\x66\xc6\x4f\x76\xce\x9e\x73\xf6\x62\x90\xb3\xbe\x2d\x6a\x4a\x96\x8c\x83\x83\x5a\xc0\xcd\x74\x4a\x54\x9e\xb1\x0b\x08\xb5\xee\xcf\x68\x0f\x23\x59\x4f\x9d\x63\x7b\x45\xf8\xac\x8b\x9e\x73\x09\x67\x9c\x43\x50\xbe\x08\x19\x60\x96\x4f\xa3\x59\x4b\xa3\x50\x73\x51\xca\x3f\xfd\xf4\x63\xe0\x5c\x79\xcd\xd7\xf5\xfa\x67\xf2\xdf\xcf\x9f\x7f\xfc\xdc\xff\x59\xce\xf1\xb3\xff\xf4\xb7\xcf\xac\xb6\xd9\xfc\xfc\x2b\xe8\xef\xcc\xf9\x7b\x87\x0d\xf0\x09\x59\x3d\xd2\xbc\xa8\xa5\x09\x97\x48\xd4\x1e\x7f\x69\xa7\x01\xe3\x69\x13\x56\x4b\x6d\x8e\xd6\xcf\xd8\xf8\x1f\x3f\xe6\x9c\x29\xb2\x12\x2f\xa4\xe6\x92\x2d\xc4\x92\xe7\x7f\xb1\x0c\xc9\x72\x15\x3a\xc0\xc1\x55\xf2\x76\x8a\x13\xc6\xb3\x52\xe4\xbc\x82\x23\x76\x45\x79\x56\x84\x7c\x95\x12\x5a\xda\x5e\xc1\x7b\x75\x19\x9c\x46\x83\x3a\xec\xba\x49\xb1\xd1\x5d\xba\xcd\xd6\xd4\x8c\xa7\x1c\x76\xdb\x5e\x2d\xc5\x8d\xf1\x2e\x80\xb9\x74\xd4\x71\x18\x24\x80\x50\x07\xfc\xf6\x67\xcd\xe4\x1b\xc4\xed\x36\x8a\x5b\xcb\xa3\xf8\xbe\xa1\x6f\xb4\x6d\x34\x42\x25\xed\xb5\x09\x90\x0e\x48\xa6\x25\x6a\x35\x0e\x6e\x1b\xb5\x82\x34\x0c\xdd\x74\xac\xd5\x97\x9c\x11\x5e\x17\x45\xa0\xa4\x9e\x4c\xb8\x08\x59\x8e\xf1\x49\xc2\x1f\xd2\x80\x81\x54\x08\x0a\x9f\x8f\x03\xa2\xda\x0d\x1f\x49\x8b\x1a\xea\x4e\xfc\x41\x00\x15\x3e\xbb\xc0\x54\xf8\x0c\x08\x5f\x48\x0f\x5d\x48\xa3\x84\x4e\x80\xaf\xf0\x19\x12\xdb\x90\x48\xe4\xfc\x9e\x80\x16\x3e\x83\x7c\xe0\xd2\xc0\xad\x8e\xaa\x27\xfa\xb9\xbf\x23\xd0\x85\xcf\x7b\xc0\x5d\xf8\x0c\xea\xc7\x14\xe8\x0b\x9f\x5d\x7a\xf1\x00\x30\x98\x69\xf3\x21\xc1\xb0\x48\x91\x23\x43\x62\xf8\x24\x03\x63\xa6\x72\x83\x1c\x56\x07\x38\xab\x0e\x74\x54\xdd\xc3\x49\x75\xe7\xa4\x09\xe0\x19\x3e\xc3\x66\xf4\x01\x81\x34\x5b\xe0\xc1\xe0\x34\x7c\x0e\x0d\xaa\xe1\x93\x7c\x9e\x0e\x03\xd8\xda\x99\x47\xa6\xeb\x2e\x44\x57\x92\xe5\xfc\x59\xe0\x7d\x9f\x83\x94\x88\xf9\x56\xc2\x0d\x5d\xe2\x05\x8e\x51\xa3\x4c\x38\xed\xab\xad\x53\xad\x84\x78\x22\xb5\x8a\x5b\xd4\x82\xed\x8e\x84\xc7\x8e\xa2\x04\x0f\x59\x61\xf3\xba\x60\xbf\xe7\xd5\xea\xb6\xa1\x5c\x81\x65\x56\xd5\x65\x01\x7d\xd1\x7a\xa1\xe7\xe5\xbc\x51\x4e\x2e\x2b\xdc\x62\x17\x62\xbd\x66\x3c\x43\x6f\xcb\x35\x7d\x0a\x4f\x78\xa5\xd5\x5b\x8c\x2a\x28\x0a\x54\xe1\xa0\x28\xf6\x5a\x52\xde\x28\x2b\xcf\xfa\xa0\x0e\x4d\xe1\xc4\x09\x9c\x2a\x93\x25\xc7\x99\x0e\x96\xb7\x37\xe3\x4a\x5b\x81\xa1\x5e\xfc\x28\x79\x60\x85\x00\x4e\x29\x8c\x9c\xc0\x28\xa3\xe4\x50\xcb\xcb\x47\x9b\xca\x48\x4e\xe6\x9e\x22\xc6\x97\x0d\xd1\xbc\x2a\xf2\x05\x73\x47\xa6\x48\x21\xf3\x99\x1b\x69\x3a\x4d\x40\x4f\x39\xfb\x12\xcf\xbd\x01\x67\xde\x1e\xe7\x1d\x2d\xf3\x38\x14\x88\xcf\x0e\x23\x6f\xb3\x6e\x8f\xfd\xb3\xfd\x2d\x65\xf4\xed\xc7\xff\x8e\x7f\xe8\xd9\x63\xfc\x1b\xaa\xa9\xb1\x87\xdf\xdf\x51\x1b\x19\xd8\x8d\xfd\xc6\xd1\xb2\xa0\x52\x1f\xf6\x80\xe4\x4f\xc9\x6c\x7e\x71\x76\x7f\x71\x42\x7e\xfd\x72\x0e\x7f\xcf\x2f\xae\x2e\xf4\xdf\xd9\xed\xcd\xcd\xc5\xec\x5e\x0b\xcf\xc7\xd1\x2a\xc0\x45\xce\x45\x81\xa3\xaf\x25\x14\xe1\x6f\xe6\x94\xbf\x91\xc7\xba\xd2\x3b\x72\x53\x19\xaf\x96\x14\x21\x44\x9a\x65\x29\xc1\x8e\xdf\xdc\x1c\xf4\xc6\xdc\x0d\xe8\x26\x6a\xdb\xea\x33\x73\x77\xb6\x89\xeb\x8f\xb7\xec\x30\x93\x3c\x39\x4e\x73\xe8\x1c\xdf\x2d\x84\xf3\xbb\x68\xbe\xbf\x08\x49\xd8\x2b\x5d\x97\x45\x42\x84\xdc\x51\x29\x32\x75\x64\x62\x75\xf5\xbf\xe3\xdd\x0e\x49\x3e\x15\x62\x79\xe4\x42\x7c\x19\x29\xc4\x92\xa8\xfa\xc1\xc5\x6f\x83\x20\x98\x94\xdb\xb1\xcd\xc6\x0b\x46\x3d\x71\x41\xde\xad\x5c\x93\x2b\xe7\xe5\xd9\xce\x60\x48\xbd\x3e\xa9\x05\x2d\x98\x97\x93\xfe\x61\x68\x85\x8e\x3f\x75\xb7\xd0\x6a\x2a\xb9\xdc\xc8\x31\x65\xa7\x78\xc9\x8b\x6c\x41\x65\xb6\xb5\x5d\x80\xe8\x87\xab\x09\x66\x0e\x5e\x0c\xc8\x41\x70\x6c\x8a\x46\x22\xc8\x38\x62\xf5\xcc\x64\x41\x4b\x8c\x03\x84\x1b\x2d\xc1\x6f\x39\xa1\x8a\xe7\xac\x64\xc0\x23\x80\x97\x78\x31\xc2\xf8\xa2\x10\xc0\x74\x89\x52\xe7\x89\x3f\x2c\xe8\xe5\x6c\x2f\xdc\x49\x8d\x0f\xff\xc6\x8f\x57\x08\x28\x1b\x7b\xd7\xc1\x28\xb5\x5e\x36\x5a\x1b\x7f\x1c\xcd\x07\xc1\x40\xa7\x65\x33\x32\x31\x24\x12\x93\x13\x32\x71\xc4\xa3\x99\xd1\xc8\x27\xc7\x71\x4a\x67\x97\x41\x9b\x39\x00\x14\x76\xe3\xe9\x30\x85\x7a\xb6\x89\x5a\x60\x76\x5b\x1f\x8d\xe4\xaa\x37\xa4\xbc\x5a\xa4\x34\xa6\x16\x68\x83\x5f\x50\x3c\xa7\x76\x43\xb7\x6a\xdd\x30\x74\xec\x5d\xe3\xc9\xb1\x97\x7d\x65\xd9\xc9\x09\x17\x66\xf0\x24\xd3\xb3\x31\x14\x0a\xd0\x7e\xee\xbc\xb5\xe7\x7c\x5c\xda\xac\xc4\xb9\x24\x25\x95\x8c\x57\xae\xf2\xf1\x6c\xcd\x25\xce\x00\xc6\x1c\x4f\xd2\x56\x65\x70\x11\xb5\xdc\x1a\x12\xb1\x8a\x3b\x97\x62\x56\x50\xa5\x3a\x0c\x9e\x70\x06\xe8\x8c\x0d\x37\xbd\x3e\x7b\x8d\xcf\x07\x5c\x65\xba\xa2\xcf\x81\xa6\x26\x54\xba\xa2\x72\xc9\xaa\xb0\x43\x02\xe5\x6f\xb7\xc1\x4b\x20\xa6\xc9\x57\xc3\x4d\x77\x40\x8c\x72\x5e\x4d\x85\x9c\x62\x92\x9f\x49\x25\xeb\x3e\xdc\xa1\xca\xd7\x4c\xd4\xd5\x1d\x5b\x08\xde\x1d\x34\x6c\xbe\x1b\xcd\xc3\x62\x40\x24\xb5\x71\xf2\x39\xb3\xe2\x77\xfb\x66\x1a\x0b\x47\x35\xb2\xb9\x75\xec\xf1\xc9\x45\x6f\xaf\xae\xf7\x19\x6c\x02\x0c\x52\xe1\x91\xfc\xcd\x9c\xc9\x7c\xe9\x6a\x6a\x6a\x1e\x4c\x76\x5d\x57\xc3\x13\xcd\x9c\xc3\x48\xf8\x6b\xd3\x19\x61\xa2\xc7\xde\xf6\xab\x8a\x56\xf5\xd6\x6c\x88\x1d\x45\x66\x7f\xbf\x43\x22\x07\xa3\xde\xdf\x41\x56\x6d\x9b\x55\x9b\x43\x0e\x35\x3a\x24\xd1\x84\xef\x6c\x44\xc9\x29\x31\x09\xf5\x92\xad\x24\xcd\x11\x0e\xa3\x8b\xaa\xa6\xdb\x26\x77\x9d\xd8\x44\xa3\x74\x33\xc7\x06\x00\xb1\x10\x08\xb6\x60\xb2\x52\x57\x54\x55\xbf\x96\x19\xed\xe1\x10\xd8\x88\x32\x51\x15\xac\x29\xd4\x69\x5f\x38\xcb\xf4\x21\x64\xba\x04\xf3\x23\x2f\x7a\x77\xaf\x31\xc7\x8e\x0c\x23\xb3\xd2\xae\x31\x9d\x7c\xaa\x8b\xea\xae\xf5\x5c\xe8\x3e\x39\xeb\xdc\xa3\xfc\x60\x9e\x58\x6d\xf5\x89\x26\x21\x37\xc2\xd9\x6b\x97\x54\xb9\x7f\x8d\x0b\x46\x79\x77\xb0\xa5\x57\xd7\x19\x7e\x37\x7c\x4e\x99\x02\xc8\xcb\x2a\xd7\xea\x16\x72\x2d\x28\x62\x85\xd8\x8c\x15\xac\x87\x72\x61\xcf\xf8\x1f\x53\xc2\xb9\x29\x60\x5f\xd7\xe9\x2f\x7e\x76\xce\xe2\x6d\x74\x4b\x13\x95\xdb\x68\x69\x46\xf6\x71\x58\xc5\x66\x83\x41\x78\x7b\x28\xc4\xe2\x09\x49\xcd\x81\xd4\x2c\xff\x8b\xc9\x80\x90\x01\x56\xc4\x9c\x67\xf9\xc2\xb9\x2b\x94\x52\x2c\x25\x53\x5e\x57\x23\x07\xac\xc2\xdc\x75\x99\xba\xcf\x5d\xb9\x42\x36\xb6\x9d\x9a\x1b\xda\x8b\xc3\x84\x28\x59\xbd\x1c\xe2\x37\x3d\x5b\xfa\xb6\x8a\x8e\xfc\x92\x70\x2b\x86\x01\x68\xe8\xda\x04\x59\x7f\xfa\x5f\x7f\xe8\xf1\xa8\xf1\x43\xa1\x00\x68\xfc\x22\xb7\xf7\xde\x04\xbf\x0a\x84\x4a\xa7\x9a\x02\x22\x21\xd1\x24\x5d\x75\x72\x55\x4e\xc9\x6d\xd4\x98\x8a\xd1\xdd\x64\x12\xd8\x80\x87\x38\xbf\xa4\xde\x1e\x35\xc8\xec\xcd\x87\x5c\x9b\xe2\xad\x96\x46\x99\x32\xdc\x29\xe8\x1f\xf7\x28\x64\xaf\xda\x36\x5e\xe5\xc3\x01\xf4\xd1\x8c\xb4\x4c\xdb\xef\x88\xee\x1f\xdc\x76\x07\x75\x49\x4e\x08\x25\xab\x5c\x55\x42\x1a\x0f\x11\x7d\x00\x56\x92\x72\x85\xef\x7b\xcf\x8a\x7d\x5d\xdb\x67\xae\x0a\x84\x96\x25\xa3\xd2\xda\xe9\xcd\x71\x46\x15\x80\xa8\x0b\x21\xb3\xce\x8a\x59\x48\xa6\x53\x1c\xeb\x2c\x7e\x04\xee\x90\x82\xaa\xea\xde\xd5\x41\xcb\x14\x89\xbb\xb1\x2f\x31\x99\x26\x36\xad\xb1\x1c\x96\x82\x37\x2f\x05\xa1\xdc\x00\x55\x7d\x45\x24\xcd\xaf\xb8\x5c\xd2\xb4\x0d\x05\xc0\x9d\xda\xf5\xe2\x84\xbd\x56\x13\x0f\x53\xf3\x35\x53\x2a\x18\x50\xbe\xc1\x64\x03\x37\x4e\x11\x77\xe3\x94\x49\x6e\x0f\x7b\x14\x1c\x30\xb6\xc2\x32\x33\xbf\xf5\x4f\x35\x02\x62\x02\xc2\x20\x6e\x59\xed\x35\x64\xe5\x8a\xaa\xd4\xc6\xb8\x55\xe4\x62\x78\x92\x97\x43\x62\x6d\x24\xa3\x2a\xc4\xcd\x31\xc4\x09\xfa\x41\xe6\xec\x91\xcc\xe8\x9a\x15\x33\xaa\xc6\xec\x79\xd8\x1e\x42\x50\x0d\x3b\x5d\x9e\x92\xa3\x79\xcb\x4d\xe6\x46\x54\xd7\xac\x3a\xda\xad\x6f\xd2\x36\x82\x77\xdd\x02\xf6\x56\x47\xe2\x0b\x7e\xcf\xa5\xbe\x77\x0d\x03\x0b\xfb\xab\x58\xd2\x61\x5e\x9a\xbe\x65\xec\x2f\xe0\x5a\x02\x3c\xb9\xd8\x75\x21\x47\xb8\x2e\xfa\x16\x6f\xca\xb2\xfd\xa0\x05\x3b\x64\xa9\x46\x5a\xef\xb2\xb8\xeb\x84\x7a\xb6\x3a\xe2\xde\x53\xa7\xc1\x56\xd4\xf6\x8d\xc7\x9b\xa8\x72\xa5\x95\xbc\x31\x05\xa3\x8f\xe5\x8f\x32\x83\xda\xfb\x3e\x20\xf9\x4f\xc3\xe7\xfc\xbe\xdc\x54\x19\xd8\xdf\xf4\x0c\x38\xa4\xbb\xdc\xb9\x2d\xd5\x00\x30\xee\xfe\x1b\xf8\x1f\x5a\xf7\x5d\xcd\xbc\xf9\xf1\x7d\x25\x48\x29\xd9\x33\xc4\x51\x70\x88\x0f\x65\x84\x33\xa5\x17\xca\x0f\x81\xe2\x13\x55\xb6\x34\x75\x2d\xae\x4a\x47\xd5\x64\x12\x1f\x5a\xfb\x51\x68\x80\xf1\x49\xd5\x0a\x13\xb4\xee\x01\xea\x60\x5c\xa7\x1a\x90\x59\x54\xc0\x1c\x98\x5f\x37\xf0\xbc\xf9\x6c\x5c\x55\xa3\x93\xcc\x61\x3f\x47\x4f\x8b\x85\xde\x95\x17\x70\x0b\x13\x6e\xf3\xee\xa2\xbc\x36\xc8\x3c\xdf\xdc\x03\xc1\xe7\xde\x9f\xe1\x63\x35\xab\xae\xf3\xf1\xfa\x3c\x4a\x0a\x97\x9c\xdf\x57\xc0\x70\x17\x9d\x40\xef\x4b\x79\x85\x4f\x6c\xd6\x7d\xfc\x7c\x4b\x61\x3b\x0d\xce\xb1\x77\x22\x1b\x54\x4c\x3e\xb3\xcc\xb3\x30\x9a\xdb\xd0\xfc\xdf\x5a\xf6\xe8\x26\x7f\xd3\xed\xe4\xef\x7f\xbe\xfb\x7f\x00\x00\x00\xff\xff\x90\x1c\x07\x44\xe8\x50\x0c\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -225,7 +225,7 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xe4\xb6\x95\x28\xfe\x7f\x3e\x05\x4a\x49\x95\xa4\xa4\xbb\x67\x9c\xcd\xdd\xcd\x9d\x9b\x4a\x4a\x96\x34\x59\x5d\x7b\xc6\xba\xa3\xb1\x53\xfb\xf3\x7a\xd7\x10\x89\xee\x46\x44\x02\x34\x01\xb6\xa6\xb3\xde\xef\xfe\x2b\x9c\x03\x80\x64\xbf\x08\x50\xdd\x2d\x8d\x97\xf8\xc3\x1e\xb1\x49\x3c\x0f\xce\xfb\x41\x0b\xfe\x1d\x2b\x15\x97\xe2\x0d\xa1\x05\x67\x9f\x34\x13\xe6\x2f\x35\x79\xf8\xa3\x9a\x70\xf9\x6a\xf1\xc5\xaf\x1e\xb8\x48\xdf\x90\xcb\x4a\x69\x99\x7f\x60\x4a\x56\x65\xc2\xae\xd8\x94\x0b\xae\xb9\x14\xbf\xca\x99\xa6\x29\xd5\xf4\xcd\xaf\x08\xa1\x42\x48\x4d\xcd\x63\x65\xfe\x24\x24\x91\x42\x97\x32\xcb\x58\x39\x9e\x31\x31\x79\xa8\xee\xd9\x7d\xc5\xb3\x94\x95\xd0\xb9\x1b\x7a\xf1\x7a\xf2\xc5\x1f\x27\xaf\x7f\x45\x88\xa0\x39\x7b\x43\x54\x75\xaf\x92\x92\x17\xd0\xd3\x44\x16\xac\xa4\x5a\x96\x6a\x92\xc8\x92\x49\xf3\xbf\xfc\x57\xaa\x60\x89\x19\x63\x56\xca\xaa\x78\x43\x36\xbe\x83\xdd\xb9\xa9\x50\xcd\x66\xb2\xe4\xee\x6f\x42\xc6\x44\x66\x39\xfc\x1b\x97\x78\xd7\x18\x15\x1e\x67\x5c\xe9\xaf\xd6\x7e\xfa\x9a\x2b\x0d\x3f\x17\x59\x55\xd2\x6c\x65\xb6\xf0\x8b\x9a\xcb\x52\xbf\xaf\xc7\x36\x63\xa9\xea\xbe\xf9\x6f\xfb\x22\x17\xb3\x2a\xa3\x65\xbb\x93\x5f\x11\xa2\x12\x59\xb0\x37\x04\xfa\x28\x68\xc2\xd2\x5f\x11\x62\xb7\xcb\xf6\x39\x26\x34\x4d\xe1\x08\x68\x76\x5b\x72\xa1\x59\x79\x29\xb3\x2a\x17\x7e\x4c\xf3\x4e\xca\x7c\xaf\x6f\xc8\xc7\x39\x23\x05\x4d\x1e\xe8\x8c\xb9\xf1\xee\x59\x4a\xb4\xf4\x1f\x10\xf2\x77\x25\xc5\x2d\xd5\xf3\x37\x64\x62\xb6\x78\x62\x76\xb0\xf1\x33\x9e\xcf\x2d\x76\xd2\x78\xae\x97\x66\xba\x4a\x97\x5c\xcc\x76\x0d\x9f\x50\x4d\x33\x39\x23\x08\x46\x64\x2a\x4b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xd4\xcd\x6f\xc7\x8c\xf0\xd3\xb5\x39\xdd\xad\x3e\x0e\x9e\xd2\x9c\x0a\xc1\x32\x22\xa7\xa4\x2a\x52\xaa\x99\x22\x5a\xd6\xfb\xb3\x7b\x7b\xec\xc7\x6b\xb3\xb9\x5c\x7b\xbe\x61\x3a\xf8\xea\xe2\x0b\x9a\x15\x73\xfa\x85\x7d\xa8\x92\x39\xcb\x69\x7d\x86\xb2\x60\xe2\xe2\xf6\xe6\xbb\x7f\xba\x5b\xf9\x81\xb4\x97\xd2\x04\x51\xf2\xc0\x58\xa1\xea\x4b\x41\xaa\xc2\xac\xc9\x2c\x8e\xdc\x2f\x89\x2e\x69\xf2\xc0\xc5\x0c\x96\x3e\xc3\xf5\x5e\xe2\xc1\xa8\xc9\xda\x94\xe5\xfd\xdf\x59\xa2\x1b\x8f\x4b\xf6\x53\xc5\x4b\x96\x36\xa7\x62\x76\xd6\x61\x82\x95\xc7\x66\x9f\x1a\x8f\x8a\xd2\x4c\x4b\x37\xee\x21\xb6\x06\x2a\x6a\x3d\x5f\x59\xe6\xcf\xe3\x95\x5f\x09\x31\xbb\x83\x5f\x92\xd4\xe0\x25\xb3\xa0\x39\x73\xd7\x85\xa5\x76\x4b\xcd\x01\xeb\x39\x57\xa4\x64\x45\xc9\x14\x13\x88\xa9\xcc\x63\x2a\xec\x2a\x27\x6b\x9d\xdf\xb1\xd2\x74\x64\xae\x74\x95\xa5\x06\xa1\x2d\x58\xa9\x49\xc9\x12\x39\x13\xfc\x1f\xbe\x77\xd8\x44\x33\x6c\x66\x20\x48\x13\xb8\x90\x82\x66\x64\x41\xb3\x8a\x8d\x08\x15\xe9\x5a\xdf\x39\x5d\x92\x92\x99\x71\x49\x25\x1a\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xc9\x08\x17\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x66\x5c\x3b\x54\x9d\xc8\x3c\xaf\x04\xd7\xcb\x57\x80\x75\xf9\x7d\x65\x8e\xfe\x55\xca\x16\x2c\x7b\xa5\xf8\x6c\x4c\xcb\x64\xce\x35\x4b\x74\x55\xb2\x57\xb4\xe0\x63\x58\x8c\x40\x24\x9b\xa7\xbf\x2e\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc8\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\x5b\x9f\x89\x79\x64\xb6\xf1\xc3\xf5\xdd\x47\xe2\x66\x84\xe7\x86\x47\x54\xbf\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x4a\xfc\x72\x5a\xca\x1c\x7a\x65\x22\x2d\x24\x17\x1a\xfe\x48\x32\xce\x84\x36\x37\x3d\xe7\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x09\xa4\x8d\xdc\x33\x8b\x23\xd2\xf5\x57\x6e\x04\xb9\xa4\x39\xcb\x2e\xa9\x62\x47\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xf8\xf4\x9a\x84\x7b\xfd\x83\xb5\x5b\x4f\x88\x23\xb9\x5b\x8f\xbb\x89\x82\xee\x0a\x96\xf8\xeb\x48\x05\xb9\x28\x8a\x8c\x27\x78\xe3\xf4\x9c\x6a\x92\x50\x61\xb6\x93\x0b\xa5\x69\x96\xb1\xd5\xdb\xb1\x75\x16\xdb\xf0\x0f\x01\x64\xb3\x42\xae\xdc\xe3\x35\x9a\xd1\xfe\xc1\x93\xd9\x95\x37\xb6\xe1\x2a\xd3\x2c\xe6\x5f\xff\x61\xc7\x96\x13\x64\x89\xa6\x7c\xb6\xe9\xb3\xad\x7b\x79\x09\x9f\x00\x33\x45\xb9\x50\xb6\x8b\xaa\xc4\xdd\xac\x69\xa7\xa1\xa6\xb4\xc5\x49\xac\xc3\xe1\xce\x9d\xed\x5a\xb3\x69\x74\x0a\xac\xdf\x72\xf3\xaf\xdd\x08\xc0\xb5\x9b\x69\x3d\xf3\x11\x91\x0b\x56\x96\x3c\xb5\xa8\xbb\x90\xe9\xa9\x02\xc4\x9a\x56\x19\x10\x2a\x29\x94\x2e\x29\xdf\x78\xe9\x5d\x13\x3c\x33\x8b\x1f\x53\x8d\x37\x88\x29\xf2\xc8\xb3\x8c\xfc\x56\x48\xfd\x5b\x3f\x02\x0c\x20\x4b\x3e\xe3\x1e\x3b\x2b\xc2\x85\x1b\x17\xc8\xba\xe5\x4b\xa4\x62\x2b\x1d\x6e\x1f\xfc\x5b\xc5\x08\xcb\x0b\xbd\x74\x68\xea\xec\xbf\xfe\xfb\xdc\xd0\x04\x56\x52\xd5\x18\xb0\xd5\xdf\x56\x4c\x8f\xad\xe3\xa4\x48\xc0\x69\xc1\xbe\xc8\x94\x5d\x74\x9c\x1a\x59\x3d\xb9\x2b\x86\xec\x8f\x82\xcf\xfd\xa9\x37\x0f\xa5\xac\x32\xa6\x3c\x0b\x67\xf6\x6e\x47\xe7\x01\x6b\x09\x5d\x0f\xbe\xc7\xa6\xac\x2c\x59\x7a\x55\x99\x5b\x76\xe7\x67\x75\x33\x13\xd2\x3f\xbe\xfe\xc4\x92\x4a\x6f\x60\x29\x76\x2e\x7d\x07\xd0\xba\x66\xf8\x46\xbb\x13\xac\x44\x28\xc3\x19\x01\xeb\x68\x7f\x30\x5b\x02\x6c\x81\xd9\x41\x85\x58\x4f\x51\xcd\xd5\x74\xd9\x39\x80\xd9\x51\xbf\xe7\xec\x93\xa1\x78\xc0\xfb\x37\x6e\xbb\x61\xe4\x80\xb8\x71\x96\xa5\x23\x72\x5f\x69\xc2\x35\x50\xbe\x64\x2e\xa5\x5a\xc7\x76\xab\x8d\xe2\xd1\xc2\xbc\x16\x5c\x02\xe3\x42\xa4\x30\xc0\x4a\x72\x43\xae\x80\x61\x62\xcd\xe1\x27\xb0\xf2\xfa\x33\xbe\x4a\x6d\xd6\x5b\x2e\x95\xae\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x47\xae\xe7\xf0\xc7\xac\x64\xc8\x34\xa9\x2a\x37\x83\x3e\x32\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x26\xf3\xc6\xb4\x72\xc6\xb4\x22\x34\xcb\xdc\x12\x9a\x50\x8b\xd4\x23\x37\x0c\x04\x39\x73\x1c\x46\xe7\x28\x96\x3b\x18\x79\xea\xb3\x0a\x78\x1b\x8f\x6b\x44\x98\x4e\x26\xe7\xa3\xce\xee\x13\x99\x17\x06\x21\x50\xd8\x83\xfb\x25\xe1\xda\xf0\xee\xc8\x0d\x95\xb2\x9a\xe1\x4e\xb1\xcc\x4e\xdc\xf1\xb2\x70\xf8\x86\xb9\x04\x69\x70\x03\xb9\x59\x6d\x27\xb8\xb9\x27\x8e\x5d\x35\xc3\x71\xdc\x24\xd8\xbf\x9c\xea\x64\x6e\xd1\x70\x22\xcb\x92\xa9\x42\x0a\xd3\x33\xfe\x72\x5d\xaf\xed\xff\x98\x77\x3a\xc7\x33\x9d\x9e\xa9\xf3\xfa\xb0\xe7\x7c\x36\x77\x67\x4d\x4b\x44\xc7\x6d\x18\xe9\x3a\x72\x44\x25\xb4\x2c\x69\xd7\x3d\xe2\x9a\xe5\x1d\x88\x84\xf4\xb8\xfd\x84\x5c\x08\x8b\xec\x6b\xc0\x6e\x80\x98\x66\x65\xee\x37\x12\xa0\x10\xd0\x9e\xc2\x4d\xe0\xb9\xe1\x84\xb8\xb6\x60\x4e\x5e\x07\x8c\x77\x66\x6e\x02\xe1\xfa\x54\xc1\xad\x1d\xcb\xe2\x7c\x42\x2e\x88\xa8\x3c\xe2\xd9\x35\x05\x21\xfd\x0c\x6c\x47\x66\x5a\x4a\xd6\x7d\x75\xe3\xa3\x30\xf4\x8d\x6d\x3b\x83\xb6\xde\xc6\x76\xfe\x4c\x04\x5c\x42\xf3\x3a\xee\x5a\xe7\xab\xa1\x84\xc4\xbd\xed\xe6\x10\xf2\xf6\x0a\xc4\x5c\xe0\xcd\x51\x2c\x63\x89\x36\xd4\x90\x95\xf9\x88\x50\xa5\x64\xc2\x8d\xa8\x50\xc3\x7e\xfb\x42\xe1\x4a\xba\xf7\x9e\xc4\xee\x3f\x89\x5e\x3f\x01\x69\xb4\x7d\xbf\x43\xbf\x5b\xdb\x8d\x8c\x2b\x6d\x10\x54\x7b\x57\x5a\x78\xf7\x7e\x09\xbf\x9e\x2a\x92\xd1\x7b\x96\xed\xe0\xab\x56\x5b\xf8\xe5\xaf\x5b\x20\x1a\xd8\xb2\xa0\x20\x84\x50\xb7\x55\x68\x68\xac\xdb\xca\xbd\x1e\x4e\x40\x0c\x72\x4c\x3d\xb2\x82\x23\x42\xc9\x03\x5b\x8e\x10\xa5\x0b\xaf\xc2\x89\x9a\x02\x74\x5c\x32\x24\xe8\x06\xee\x1e\xd8\x12\x3a\xdc\xcd\x6e\x6e\xec\x2a\x16\xee\xb0\xc5\x60\x80\xba\x8d\xcd\x44\x23\xbf\xe8\xb1\x41\xf1\x57\x03\xdb\x03\xdb\xc9\x3e\x6f\x6a\x6b\xca\x46\x00\x77\x38\x0f\x38\x24\xa0\xc0\x0e\x1e\xa8\x11\x91\xd9\x66\xfd\xc3\xee\xb6\x53\xe0\xdc\xd5\xdc\xee\x3d\x69\x5d\x91\x17\xc4\xb4\x0f\x5e\x87\x83\xf0\x7e\xaa\x10\x5e\x0d\xde\x99\x73\x50\x56\x9a\x8b\x02\x68\x24\x1e\x68\xb1\x7d\x47\x33\x9e\x36\x74\xa0\x86\xd9\xb8\x11\x23\xf2\x5e\x6a\xf3\xbf\xeb\x4f\x5c\x19\x1e\xf3\x4a\x32\xf5\x5e\x6a\xf8\x73\x42\xfe\xaa\xf1\xea\x7d\x1d\x88\x97\xeb\xd6\xfb\x0c\x70\x7d\xc7\x3e\x81\x0b\x81\x48\xd4\xec\x70\x53\x13\xa7\x26\x46\x32\x07\x16\xdd\xee\x9c\xc1\x5a\x37\xc2\x08\x05\xb8\x73\xd1\x43\x81\x32\x16\xe5\x6c\x1c\x32\xaf\x14\xa8\xd2\x84\x14\x63\x60\xa3\x36\x8e\x89\x07\x64\xc6\x6d\x1e\xd1\x1e\x87\xdf\x3e\xf4\x5f\xb5\x19\xf6\x6b\x3d\x6a\x7c\x1c\x3d\x6e\x63\xb0\x39\x5d\x00\x6b\xcf\xc5\x2c\xf3\x4c\xfc\x88\x3c\xce\x79\x32\x47\xe9\x11\x34\x61\x9a\x95\x45\xc9\x0c\xc7\x40\x41\x67\x66\x9e\xcc\x58\x19\x0f\xfa\x1f\x8d\x68\x80\xe3\xa3\xbe\x3b\xa3\x09\x4b\x49\x0a\x22\x0b\xaa\x5e\xa9\x66\x33\x9e\x90\x9c\x95\x33\x46\x0a\x43\xfa\xfb\x01\x7c\x1c\x25\xc6\x16\x4d\x8f\x9b\x03\xf6\xb8\x61\x84\x7c\x1a\x3f\x54\xf7\xac\x14\x4c\x33\x35\x36\xfc\xc9\xd8\xce\x5e\xcb\x9c\x27\xc1\x9d\xed\xa5\x1b\xe0\xb3\xde\x1a\xb9\xed\x48\x2c\x16\xc8\x88\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x15\xdc\x06\x16\xeb\xc9\xc3\x0f\x2c\xd6\xc0\x62\x1d\x9d\xc5\x6a\x75\x91\xd3\x22\xb6\x07\xd4\xcb\xf5\x50\x04\xfe\x0d\x15\xba\xab\x9a\x3f\x60\xf8\x9c\x5f\x43\x5b\x05\x68\xf8\x98\x3b\x4b\x9c\x3e\x82\xda\xd0\x5a\x22\x4b\x2a\x66\x8c\x7c\x31\xfe\xe2\xf5\xeb\x18\x05\xa1\x05\xe7\xa0\x2f\xa6\xb2\xcc\xa9\x86\x6f\xfe\xe9\xf7\x1d\x5f\x3c\xe1\x54\xb6\xd9\x4b\x8e\x63\xa8\xb3\x98\xc7\xdb\x66\x5a\x2c\xf2\x16\x5b\x1a\x90\x31\x21\x35\xc9\x99\x26\xb4\x9b\x27\x6b\xaa\xdd\x79\xce\x46\xce\x1c\x8a\x68\xc7\xba\x8d\x38\xa3\x60\x4a\xa4\xb0\xa6\x17\x73\xf8\xdd\x87\xdb\x6b\x05\x09\xa3\x8a\x19\x12\x7f\xcf\xcc\x2a\xba\x4d\x81\x9a\x28\x99\x9b\x59\x73\xa1\x1d\x12\x33\x4b\x60\xee\x60\xc8\x19\x9b\xcc\x26\x24\xad\xa0\x5b\x2a\xac\x1f\xcc\x39\xae\x56\x2d\x95\x66\x79\xb7\x2d\xd0\x10\xc3\x12\xfe\x67\xb6\x45\x97\x4b\xb0\x90\x2f\x98\xd0\x15\xcd\xb2\x25\x61\x0b\x9e\x68\xbf\x7f\xe0\xb6\xc3\xb5\x0a\xda\xa9\x08\x36\x3a\x9c\x75\x1e\xaf\xdd\xd0\x2e\x22\x15\xc3\xf9\xae\xf5\x1d\x82\x73\x5a\x37\xe0\x83\x5d\xc9\x64\xab\x4c\xa8\x4d\xbf\x68\xb6\x85\x7f\x02\x70\x7f\xf3\xa1\xdb\xca\x46\xa2\xe9\x4f\x04\xcd\xe9\xc7\x5a\x59\x83\x97\x2c\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xd6\xad\x91\xd3\xc0\x01\xf5\x9c\xa1\x91\xf2\xe2\xfd\x55\xd8\x8e\x11\xeb\x1c\xf0\x51\x16\x32\x93\xb3\x65\xf3\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb0\x36\xe8\x2d\x9e\x3c\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x77\x1b\x58\xac\x9d\x6d\x60\xb1\x7c\x1b\x58\xac\x81\xc5\x1a\x58\xac\x81\xc5\x1a\x58\xac\x63\x75\xf3\x54\xd3\xd0\x93\xa6\xd0\x6f\xf0\x42\xa6\x4f\x08\xde\x2a\x64\xba\x23\x76\x0b\x75\xfa\x89\x1c\x67\x32\xa1\xda\x86\xd9\x9a\x4f\xac\x15\x4a\xd1\x1c\xcd\x14\x23\xf2\x0f\x29\x18\x46\xb3\x98\xeb\x01\xc6\x02\xa9\xe7\xac\x34\xaf\x9f\xa9\xf3\x9d\x21\x04\x43\xec\xd7\x10\xfb\x35\xc4\x7e\x6d\x6d\x2f\x26\xf6\x6b\x4e\x15\xc2\x2d\x92\xc6\xed\xa1\x60\x0d\x9c\xf4\x91\x95\xf9\x2f\x34\x12\xcc\x80\xbb\x05\x47\x48\x12\x51\x83\x14\xee\x4c\x6a\x0d\xfe\x2c\xbd\x6d\xef\x87\x15\xab\x61\x51\x34\x4d\x59\x4a\x0a\x56\x8e\x11\x44\x25\x99\x72\x91\x6e\x58\xab\xdb\x9f\x6e\xf4\x70\xc0\x50\xac\xf6\x3a\x82\xbe\x39\x4c\x3c\x56\x7b\x22\x3d\x8c\x8a\x4d\xcb\x68\x8b\x08\xbe\x88\xe8\xac\x58\x09\x7d\x4c\xb4\x35\x28\x7e\x15\x28\xa3\xc7\x8b\xd9\x20\x1c\x3b\xf3\x63\x4f\xf5\x53\x94\x28\x74\x61\xe5\xf1\x9f\x2a\x56\x2e\x21\x3e\xbf\x16\x3b\x7d\x2e\x12\xeb\x11\xc3\x15\x49\xa8\x42\xb2\x1a\xc3\x2a\xdf\x4c\x31\x6a\x52\x54\x59\x36\xc2\x7e\x56\x2f\xab\x43\x73\x00\x07\x42\x9a\xdf\xa3\x35\x62\x91\x2a\x9a\x7e\x3a\x90\xfe\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\xa3\xed\xe3\xd8\xfa\x0a\x30\xbd\xc4\x97\x27\xcb\xeb\x3b\xf6\xe4\x09\x7a\x45\x78\x39\x7a\x32\xfb\xd1\x2d\x92\xfe\xfa\x45\xd2\x5b\xc7\x48\x7a\xe9\x19\x49\x5f\x5d\x23\x79\x82\xbe\x91\xf4\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xc3\xa8\x1f\xc9\xd3\x84\xf3\xfe\x6a\x48\xb2\x87\x8b\xd5\x1c\xbf\x91\xd9\xe9\x70\x7a\x49\x12\xaa\x9b\x84\x6b\xd5\x52\x4f\x1e\xfb\x5c\xfa\xa9\x26\xc9\x9e\x4e\xc5\x65\xc6\x01\x5d\xd8\xb1\x94\x95\xe4\xf9\x15\x96\x3b\xa7\x60\x87\x0f\xd6\xf0\xf5\x1a\xfd\x09\x5a\x41\xf2\x24\xcd\x20\xe9\xaf\x1d\x24\x4f\x05\xf6\xbd\x69\x09\xf7\xda\x15\xf0\x49\x5f\x83\x1f\xda\x13\xb8\xad\xe8\x1b\xd8\x18\x16\xb9\x8b\x9c\x16\xe6\xf6\xfd\x97\x61\x22\x00\x30\xff\x9b\x14\x94\x97\xca\x48\x37\x56\xaf\xdd\xfc\xcd\xaa\xef\x1a\xdd\x44\x4f\xa0\x30\x03\x1b\x1a\xbf\xa0\x99\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\x79\x84\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\xf2\xc0\x96\x27\xa3\x20\xf5\x40\xbb\x35\x6f\xf6\xc9\x8d\x38\x41\xd6\x69\xed\x5e\x7a\x3e\x4b\x8a\x6c\x49\x4e\xe0\xb7\x93\x7d\xf3\xa8\x3d\xf8\xa3\x66\x6a\xd6\xbe\xec\x47\xaf\xeb\xf4\x54\x05\x37\x69\x41\xdf\x57\x6c\xd9\xd7\x11\x21\x0a\xe6\xdf\xb5\x46\x74\x0c\x35\x80\x99\x91\xdd\x3d\xdf\x84\x99\x59\x81\x65\xb2\x3a\x2a\x54\x57\xf1\x2c\x8b\x18\xed\x9e\x11\x4d\x1f\x18\x58\x78\x24\xa4\x96\xe3\x29\xc3\x64\x7a\x08\x3a\x30\x92\x01\x99\x4a\x41\x7a\x5c\x92\x49\xf9\x50\x15\x0e\xf4\x5c\x36\xc9\x88\x21\xb9\x48\x64\xee\x7c\xea\xd1\xaf\x75\x64\x13\xcc\x3d\xb0\xe5\x18\x73\x60\xe2\x73\x18\x18\x48\x80\x55\x4d\xfc\xd8\x12\xcc\x7f\x24\x54\x91\x1f\x81\xa9\x14\xe4\x0c\x3e\x3c\xff\x31\xc6\xa5\xc0\x6f\x20\x6a\x5f\x65\x05\x98\x85\x19\x62\x69\x27\xa8\x56\xf7\x76\xd7\x8e\x45\x0c\xed\x32\xc5\x35\x37\xe3\x14\xed\x0d\x67\x54\x68\x7e\xee\x95\x34\x13\x02\x70\x00\x5c\x72\x2a\xc5\xa9\xc6\xf9\x39\xbc\xe6\x3a\x88\xf1\x3a\xf0\xfb\x5e\x5b\xfc\xd0\x5a\x80\x47\x9e\xb2\x29\xad\x32\x6d\xb3\x91\x1a\xd4\x07\x94\x3e\x62\x84\x8f\xce\x5e\x62\x19\xfe\xa9\x2c\xef\x79\x9a\x32\x01\x21\x0e\x6e\xfa\xf7\xd2\x05\x04\xd5\xe0\x6e\x30\x5b\xeb\x8c\x63\x86\xbd\xc8\x94\x1c\xad\xf6\x98\xf8\x6c\xa5\xe6\x16\x3d\xce\x99\x68\x0f\x40\xb8\x32\x9b\xaa\x58\x04\x53\x7b\x14\xd7\x9f\xa7\xe3\xbc\xde\xae\x57\x5c\x3d\x03\xde\x5b\x1d\x74\x40\x7d\x41\xa8\x4f\x48\x3d\x60\xbf\xcf\x16\xfb\xad\x01\xfd\x3e\x10\xe0\x5a\xa7\x03\x0e\x8c\xc6\x81\xc2\xa5\x41\x7e\x66\x2b\x00\x2a\xc6\xd0\x8b\xd5\x4d\x49\xd5\x3a\x33\x08\xf4\xea\xa7\x2f\x73\x61\x70\x80\x67\xa1\x87\xd4\x19\x43\x2b\x61\x93\xc1\x83\x39\xb4\x1e\x16\xf1\xc5\xaa\xcd\x3d\x62\x4c\x27\xb8\x48\xc1\x14\xa8\xd8\x99\xf7\xaf\x68\x0c\x03\xbd\xc6\x2c\x05\x42\xe1\x6a\xf5\xa1\x48\x57\x83\xe3\xea\xbe\x41\xaf\x9f\x33\x2a\x14\x39\x71\x2e\x1e\xa7\xaa\x7e\xe3\x24\xea\xbe\xb9\xd4\x97\x7e\x6c\xc8\x74\xdc\x4c\x77\x59\x0f\x3d\xd8\x51\x06\x3b\x4a\xb3\x0d\x76\x94\xf5\x49\x0c\x76\x94\x6d\x6d\xb0\xa3\xf4\x1a\x7f\xb0\xa3\xb4\xdb\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xc1\x8e\x12\xfa\xd1\x3e\xec\x28\xb5\x18\x74\x0c\x39\xba\x29\xb2\x5a\x3f\x71\xac\xb2\x45\x35\x4f\xea\xa8\x50\xf7\x16\xfe\xeb\xb9\x84\xea\xa6\x18\xfc\x54\x91\xba\x29\xa0\xaf\x69\x30\xa2\x25\xea\xad\xf2\xb3\x97\xb0\xd7\xc6\xd8\x93\x68\xfd\x0b\x57\x2e\x35\x1c\x58\x8f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x9e\xd5\x71\x2e\x29\x39\x73\xba\xd6\x73\x73\xe0\x42\xea\xf6\x8f\x42\xf3\x71\xfd\x86\x77\x10\x06\x95\xb0\xcb\xe6\x16\xb3\xe9\x4e\x66\xa9\x75\x8f\x62\xa5\xec\x65\x0d\x6d\x06\xff\xb3\xb2\x35\x5b\xae\x6c\x25\x35\x08\x4d\x2b\x2b\x21\x0c\x7b\x24\x85\x8d\xe2\x88\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xfa\x98\x1a\x01\x00\x54\x63\x99\x44\x9b\x73\x49\x0a\xab\x24\x37\x4f\xb0\x9f\x88\x49\xf8\x0b\x0b\xfb\xc9\xfd\x8a\x62\xee\xea\x35\xdc\xd1\xe6\x64\xb9\x82\x73\xa4\x59\x26\x1f\x63\xe8\x53\xe4\x8d\xe8\x9d\x1c\x30\x18\x7a\x1f\xa3\xb3\x08\xae\x78\xcb\x87\xf2\xea\x43\xaa\xc1\x9d\x6d\x48\x35\xf8\x32\x52\x0d\x36\xec\xa0\xcd\x9c\x83\xdd\x7b\x05\x39\x09\x0f\x9a\x73\x90\x90\xbf\xcd\x19\xdc\xa2\x92\xa1\xf1\xb2\xca\x34\x2f\xea\x28\x63\x85\x27\x94\xa1\x48\x3d\xb5\xd1\x80\xed\xdb\x6b\x66\x43\x93\x79\xe7\x50\x2b\xb7\x1c\xc6\x83\xa8\x65\x05\xd8\x14\x23\xe6\x40\xff\x8e\x89\xfe\x9c\xac\x8d\x61\x87\xfc\xb9\xa3\xa9\x82\xf0\xdf\x95\x2b\x18\xda\xb0\x81\x2b\x72\x66\xa8\x63\xb6\xb4\x56\xe3\x16\x22\x6c\x91\xd5\x80\x01\x50\x0f\xb6\x60\x8e\x41\x9d\xf1\x05\x13\x35\xf5\x3d\x53\xe7\xe7\x8e\x27\x5e\xe5\x1f\x02\x7a\x7f\x0a\x87\x11\x82\xb5\x63\x39\x83\x15\x7a\x1f\x30\xc2\x06\x8e\xe0\x4f\x0d\x2a\xfb\xe7\x6e\x9e\x20\x60\x10\xbc\xd2\x2e\x3c\xb3\x71\xd0\x35\x2f\xd0\xd9\xcb\x01\xa3\xe0\x62\x42\xad\xe2\xb4\xe2\x3d\x42\xac\xfa\x66\xca\x3c\x6c\x68\xd5\x41\xc3\xaa\x3e\x9f\x84\x96\xcf\x6c\xfe\xfb\x0c\xb2\x31\xbd\x10\x73\xdf\x90\x8e\x69\x5b\x7b\xae\x74\x4c\x07\x37\xe7\x7d\x76\x59\x99\x8e\x6a\xbe\x3b\x8e\xe9\xee\x33\xcb\xca\xf4\x2c\xa6\xba\x17\x9e\x9f\xe9\x70\x26\xba\x21\xf9\xd1\xf3\xe4\x97\x8c\x35\xc3\xf5\xbf\x55\xcf\x6a\x7e\x7b\x56\xd3\xdb\xf3\x9b\xdd\x7a\xf1\x2a\x4f\x35\xb7\x45\x5f\x93\xa7\x9a\xd9\xfa\xb8\xec\xf7\x83\xe7\xe3\x85\x28\x1d\xd9\x47\xff\x65\x84\x26\x3d\x93\x63\xfe\x73\x39\xe5\x1f\xd6\x21\xff\x19\x42\x91\x8e\x12\x86\x14\x4b\xf6\xa3\x88\xfd\xd3\x70\x57\x1f\x8a\xdc\x33\xe4\xa8\x27\xfe\x3a\x66\xa8\xd1\x2f\x00\x85\xf5\x0a\x31\x1a\xb0\xd8\x33\x61\xb1\xfd\x85\x14\x1d\x2b\x9c\xe8\x17\x86\xcb\x7a\x86\x0e\xed\x4d\xbb\x7d\x98\x90\xa1\x63\x87\x0b\x1d\x20\x54\xe8\x39\xc2\x84\x0e\x10\x22\x34\xd8\x04\x02\xdb\x60\x13\x08\x6d\x83\x4d\x60\x5b\x1b\x6c\x02\xab\x6d\xb0\x09\x0c\x36\x81\xc1\x26\x30\xd8\x04\xd6\x07\x1c\x6c\x02\x83\x4d\x20\xac\x0d\x36\x81\xe3\xd8\x04\x62\xc3\x6e\xfa\xc1\xf2\xf3\x84\xdb\x1c\x37\xd4\x66\xff\x61\x36\xcf\x18\x62\xf3\x0b\x53\xb8\x44\x87\xd3\xf4\x03\xf3\x97\x12\x46\xf3\x32\x42\x68\x9e\x3d\x7c\xe6\xa9\xa1\x33\xfb\x09\x9b\x89\x80\xf6\x9e\x70\x5e\xc8\xf4\x42\x68\xfe\xd4\xc2\x47\x4d\x00\xdc\x56\xfd\x88\x2e\x24\x4f\x49\x51\x69\x5b\x70\x65\xa8\x80\xd4\x09\x03\xc7\xa9\x80\xd4\x3a\xbc\xa1\x0c\xd2\xae\xf6\x62\xca\x20\x6d\x3b\xb3\xa1\x16\x52\xbb\x0d\xb5\x90\x86\x5a\x48\x43\x2d\x24\x6c\x43\x2d\xa4\xa1\x16\xd2\x90\xc3\x6f\xc8\xe1\x37\xe4\xf0\x0b\xff\x6a\xc8\xe1\xb7\xbd\x0d\x39\xfc\x62\xda\x90\xc3\x2f\x78\xf4\x21\x87\xdf\x90\xc3\x2f\x6e\xe0\x21\x87\x1f\x19\x72\xf8\x0d\x39\xfc\x3e\xe3\x1c\x7e\x43\x2d\xa4\xcf\xa2\x20\xc8\x50\x0d\x24\x62\xec\x97\x55\x0d\x64\xa8\x85\xb4\x73\x90\xa1\x16\xd2\x80\xfa\x86\x5a\x48\xbf\x58\xec\x37\xd4\x42\x0a\x18\x64\xa8\x85\x34\xd4\x42\xda\xd9\x86\x5a\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x12\xfb\xd5\x60\x47\xd9\xde\x06\x3b\x4a\x4c\x1b\xec\x28\xc1\xa3\x0f\x76\x94\xc1\x8e\x12\x37\xf0\x60\x47\x21\x83\x1d\x65\xb0\xa3\x7c\xc6\x76\x94\xa1\x16\xd2\x50\x0b\x69\xa8\x85\xe4\x47\x1e\x6a\x21\x0d\xb5\x90\xa0\x0d\xb5\x90\x02\x46\x18\x6a\x21\x7d\xae\xb5\x90\x5a\xf1\x40\x9f\x6f\x41\xa4\xf8\x65\x0c\x55\x91\x86\xaa\x48\x5b\xda\x50\x15\x69\xa8\x8a\xb4\xa9\x0d\x55\x91\x86\xaa\x48\x3b\xda\x90\x01\x31\xb0\x0d\x19\x10\x43\xdb\x90\x01\x71\x5b\x1b\x32\x20\xae\xb6\x21\x03\xe2\x90\x01\x71\xc8\x80\x38\x64\x40\x5c\x1f\x70\xc8\x80\x38\x64\x40\x0c\x6b\xcf\x6f\x80\xfb\x9f\x91\x01\x71\xa8\x8a\xf4\x22\x4b\x8a\x0c\xf5\x44\x3a\xda\xcb\xa9\x27\x32\x54\x45\x6a\x75\x3e\x54\x45\x1a\x50\xd8\x50\x15\xe9\xb3\xc3\x62\x43\x55\xa4\x0d\x9d\x0f\x55\x91\x86\xaa\x48\x43\x55\xa4\xc1\x26\xd0\xd9\x06\x9b\xc0\x60\x13\x68\xb6\xc1\x26\xb0\xda\x06\x9b\xc0\x60\x13\x18\x6c\x02\x83\x4d\x60\x7d\xc0\xc1\x26\x30\xd8\x04\xc2\xda\x60\x13\x18\xaa\x22\x0d\x55\x91\x86\xaa\x48\xd0\x86\xaa\x48\x43\x55\xa4\xa1\x2a\xd2\xc6\x8f\x41\xd1\x8a\x92\xcd\x36\xc8\x0e\x85\xe5\x8b\xba\x2b\xcb\xc1\x57\x42\xe9\xb2\x4a\x74\x55\xb2\x14\x0e\x0c\x0f\xd3\x30\x06\x4a\xcb\xd2\x59\x05\xa0\xc4\xcc\x15\x2b\x32\xb9\x34\xd4\x76\x44\x6e\x65\x3a\x22\x17\xb7\x37\x77\xac\x5c\xf0\x84\x39\xe8\xfb\xc6\xd2\xf4\xed\xfb\xf6\x71\x59\xf0\x84\x66\x19\x68\x2c\xea\xd9\xe4\x74\xe9\x74\xc9\xf7\x4b\xc2\x3e\x69\x56\x0a\x9a\x11\x2d\x65\x86\xe6\x17\x33\x19\x40\x88\x25\xd3\x25\x67\x0b\x46\x68\x79\xcf\x75\x49\xcb\x25\xc9\x99\xa6\x29\xd5\x74\xfb\xa8\xdf\x2a\xd6\x8c\xd1\xd0\x92\x14\x25\x1b\xe3\x0d\x68\xcd\x03\x60\xf3\x9b\xaf\xdf\xb9\xfb\x4d\xd3\xd4\x05\x24\x38\x08\xbf\xab\xee\xfd\x6e\x9f\x6e\xe7\xb6\x52\xbf\x5b\x6a\x04\xe0\x69\x55\x34\x05\x57\xb8\x67\x5b\x25\xd2\x00\xb6\x24\x8e\x09\xe9\x84\x4f\x26\x16\x4f\x05\xad\x6b\xb1\x68\x6b\xf6\x98\x58\xf0\x52\x0a\xe0\x23\x17\xb4\xe4\xf4\x3e\x63\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x3b\xe0\xe5\xd2\xdb\x19\x30\xd8\x65\xeb\x95\xec\xa6\x67\x1d\x14\xac\xb5\xd2\x6b\xb1\xf8\x8e\xb6\xd5\x0c\x62\xe3\x92\x88\x7d\xc1\x2c\x89\x92\xcb\xee\x05\x05\x31\x9d\x21\xea\xb0\x31\x60\xf8\xad\x2f\x84\x29\xad\x4c\x17\xbb\xe9\x65\x6b\x5b\xde\xd3\xbc\xae\x8c\xb5\x61\x37\x26\xe4\x9d\x15\x8d\x29\xb9\xfc\xcf\x9b\xab\xeb\xf7\x1f\x6f\xde\xde\x5c\x7f\xd8\x8d\x47\x03\xf1\x27\xa0\xa6\x88\xc9\x76\x12\xf5\xef\xdc\x19\x42\xf5\x21\x26\x0c\xe3\xf5\x9b\xb3\xef\x2e\x3e\xfc\xe7\xfb\x8b\x77\xd7\xe7\x20\x52\xb0\x4f\x05\x15\x29\xeb\x62\x11\x2b\xe5\x22\x70\x8a\x92\x2d\xb8\xac\x54\xb6\xf4\x14\x76\xf3\x55\x58\xbd\x03\x06\x3d\x74\x8c\x62\xe8\xa3\xc5\x1e\x9b\x3b\x05\x35\x08\xad\x81\xb3\xb6\xd2\x95\x4c\xc9\x6c\xc1\xd2\x2e\xed\x07\xc4\x42\xba\xed\xa8\xed\xa0\x45\xa5\x9d\x92\xc7\x99\x36\x2b\x91\xcc\xa9\x98\xb1\x74\x42\xae\x64\x65\x46\xfb\xcd\x6f\x60\xcb\x4a\x96\x56\x49\xe7\x8e\xa1\x86\x0e\x05\xda\xdf\x8c\x1c\x03\x60\xc8\xae\xc2\xaa\x66\x2a\xa1\x85\xdb\xd4\xe6\xa9\xa8\xa5\xd0\xf4\xd3\x9b\x90\xfa\x68\x27\xbf\x69\x7c\x78\xe2\xea\xd5\x49\x33\x3d\x64\x96\x70\x45\x19\x94\x1a\xcb\xc8\x49\xf3\xed\xae\xbe\xaf\xcd\xfc\x58\xda\x84\x1d\x8c\x3c\x64\x0b\x56\x82\x72\xc8\x42\xce\x88\x94\x6c\x46\xcb\x34\x63\x0a\x62\xde\x1e\xe7\x0c\x8a\x07\xa2\xa4\x8b\x07\xd5\x31\x16\xf3\x8a\x2c\x21\x3b\x15\x8c\x57\x68\x65\x06\x5c\x7b\xd2\xb1\x8c\x98\x9b\xf7\xb6\x94\x1d\x25\xa8\x5a\xb7\xef\x0e\x82\x6a\xbc\x2d\x7e\x13\xb8\x9e\x5a\x23\xc6\xa4\x89\xe5\x95\xe1\x4e\xa7\xb5\x8d\xdc\x3c\x0f\xb0\x93\x07\xcb\xf2\xe1\xca\xfc\x44\x8a\x29\x9f\xbd\xa3\xc5\x57\x6c\xf9\x81\x4d\x23\xe3\xfb\x90\x31\xb7\xea\x69\x60\x77\x0d\x75\xc0\x0e\xbb\xd9\xca\x03\x86\x73\x85\x98\x4c\xe2\x2c\x1e\xc1\x76\x8e\xb5\xc2\x72\x28\x22\x58\x36\x7e\xef\xcc\x36\x09\x22\x70\x1b\x27\x17\x2c\x10\x36\x29\xa2\x45\x05\xc1\x26\x80\x8f\x35\x47\xca\x15\x61\xd3\x29\x4b\x34\x5f\xb0\xcc\x47\x1a\xdb\xca\x96\x36\xf2\xf7\x9e\x26\x0f\x8f\xb4\x4c\x15\xd4\x4a\xa4\x9a\xdf\xf3\x8c\xeb\x65\x48\x1d\x4a\x6c\x56\xa8\xb1\xc1\xc9\x4e\x6f\x2e\x94\xa6\x80\xbe\x5c\x45\x45\xb3\xc3\xc8\xf6\x53\x67\xb8\xc6\xdb\xe8\xc2\x7a\x83\x87\x83\xda\x7e\x09\x2b\x0d\x81\xcb\x96\xe4\xb1\x94\xe1\xa2\xd9\x3b\x09\xf1\xbc\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x6a\xd1\x69\xc2\xe5\xab\x54\x26\xea\x55\x22\x45\xc2\x0a\xad\x5e\xc9\x85\xa1\x8b\xec\xf1\xd5\xa3\x2c\x1f\xb8\x98\x8d\xcd\x02\xc6\x78\x81\xd4\x2b\x90\x85\x5f\xfd\x1a\xfe\x77\x08\x28\x23\xce\xb7\xe7\x0d\x39\x39\x09\x78\x5f\x16\xc8\xbd\xf7\x80\xcc\x3b\x10\xf0\x97\x2d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x48\x61\xb9\x90\x88\x65\xdf\x4b\x99\x31\xda\xed\x6d\xf5\x14\xcd\x24\x80\x7d\x3c\x56\x0d\xba\x97\x35\xea\xc5\xcb\x65\xaf\x67\x21\xd3\x37\x44\x55\x45\x21\x4b\xad\x6a\xa1\xd1\x00\xc5\xa8\xfd\x27\xa8\x4d\x46\xe4\x47\xff\x10\xbd\xba\xbe\x3f\xfd\xd3\x57\xd7\xff\xf6\xe7\xd3\x1f\x7e\x6c\xfe\xd6\x10\x1f\x1b\x2f\x04\x4c\x53\x15\x2c\x99\x08\x99\xb2\xf7\x30\x03\xf8\xd3\x72\x77\x17\x49\x22\x2b\xa1\xed\x0f\x9a\xea\x4a\x4d\xe6\x52\xe9\x9b\x5b\xff\x67\x21\xd3\xd5\xbf\x02\x6c\x9c\x07\xa4\x2b\xb0\xd7\xb7\x54\x07\x44\xee\x47\x51\x17\x5a\xf0\xef\x58\xa9\x02\x72\x55\x60\x6b\xc1\x8b\xfd\xb2\x59\x0a\x37\xa7\xf0\xcf\xb7\x6e\xba\x06\xf7\x3e\x96\x5c\x6b\x70\x39\xb4\xc9\x02\xe4\x74\xe4\xae\x34\x32\x52\x8b\x2f\xa2\xf4\xaa\xc1\x98\xc3\xef\x5a\x8f\xc5\xc1\xec\xed\xca\xbc\x62\xc3\x3a\x5c\xae\xa9\x03\x2f\x6e\x6f\xc8\x02\x77\xe3\x00\x0b\x79\x0a\x2a\x70\x01\xd8\x6f\x8f\x82\x12\xdc\x68\x6e\xe3\xbc\xfc\xf5\x06\x2d\x4c\x3e\x1c\x9c\x64\x3c\xe7\xd6\xc0\x6f\x0b\x20\x87\xd0\x8e\x33\xfc\x6c\x92\x14\xd5\xc8\x76\x31\xc9\x59\x2e\xcb\xa5\xff\x93\x15\x73\x96\x1b\x89\x63\xac\xb4\x2c\xe9\x8c\x8d\xfc\x00\xf8\x99\xff\x0b\x3f\x6c\x4d\x61\xfd\x6b\x14\x54\x93\xaa\x34\xbc\x47\xb6\x74\x28\x2e\x44\x7b\x79\x40\x74\x10\x5c\x5c\x3a\x0e\x1b\xf8\xe3\x7a\xdf\x8f\xb1\x3b\xf5\x2a\x1a\x64\x0d\xfd\xaa\x40\x52\x59\xc8\xac\xca\x99\x1a\x79\x02\x8d\xa2\xa8\x58\x18\x99\x45\x9d\x1e\x02\x01\xa4\x7c\xc1\x55\x2f\xff\xd0\x3b\x6f\x67\x03\xa3\x54\xa5\x8d\x90\x8e\x49\x86\x1a\xd5\xcb\xa5\x02\x21\xd5\xe7\x38\x68\x61\xb5\x2f\x42\x98\x15\x42\x0a\xaa\x35\x2b\xc5\x1b\xf2\x1f\x67\xff\xfe\xbb\x9f\xc7\xe7\x7f\x39\x3b\xfb\xfe\xf5\xf8\x7f\xff\xf0\xbb\xb3\x7f\x9f\xc0\x3f\x7e\x7b\xfe\x97\xf3\x9f\xdd\x1f\xbf\x3b\x3f\x3f\x3b\xfb\xfe\xab\x77\x7f\xfd\x78\x7b\xfd\x03\x3f\xff\xf9\x7b\x51\xe5\x0f\xf8\xd7\xcf\x67\xdf\xb3\xeb\x1f\x02\x3b\x39\x3f\xff\xcb\x6f\x82\xa6\x47\xc5\xf2\x9b\x00\xac\x81\x6d\xdc\x23\x73\x53\xfd\x55\x5f\x93\x16\x17\x7a\x2c\xcb\x31\x7e\xfe\x86\xe8\xb2\x0a\xe1\xa2\xdd\xb1\xf5\x81\x73\x57\xfa\xf9\x4d\x8d\xf1\x3c\x75\x38\x00\x20\x3f\x85\x00\x28\x96\x94\x4c\xef\x4b\xca\xc6\xde\x1c\x01\x5c\x31\x8e\x0e\x82\x77\x2d\x78\xfb\x84\x33\xb0\x5f\x35\xeb\x30\x2d\x65\x3e\x21\x0d\x4d\xee\x02\x1c\xe1\xec\x7b\x0f\x2c\x30\x62\x61\x10\xd4\x07\x41\x7d\x10\xd4\xdb\x82\xfa\x1d\xde\xa1\x17\x2e\xa5\x33\xb1\xd8\xa5\xec\x8d\x30\x09\xbe\x85\xec\x71\x4d\xb3\xa0\x63\xae\xb5\x24\x85\x2c\xaa\x8c\xea\x2d\xa6\x8c\x08\x1b\xa1\x8f\xa0\x73\x06\x17\x03\x52\x60\x8f\xb3\x84\x2f\xdf\x6c\x94\x22\x17\x59\x46\xb8\x40\xf4\x66\x3a\xd8\x3a\x82\xb3\x79\x94\x0c\x39\x6b\x42\xd1\x20\xb8\x30\x53\x7e\xb4\x39\xef\x1a\xa6\x1c\xae\x8c\x60\x5e\x6a\x2e\x66\x13\xcc\x89\x87\x04\xca\x2a\xf2\xb9\xf0\x99\xf1\xb6\x0e\xe9\x19\x36\xef\x11\xb7\x96\x0c\x13\xfd\x2d\x94\x76\xcb\x84\x59\x6a\xfa\x00\x46\xa8\x84\xa5\x4c\x24\x3b\x4c\x24\xdf\xa1\x97\x9d\xdb\xb3\x7b\x23\x66\x80\x19\x17\x31\x0a\x49\xab\x22\xe3\x89\x39\x1f\x33\xf3\xb8\xbe\x6f\xf2\xbc\xd2\x60\x10\x3c\x96\xb5\xd6\x40\x9a\x35\x39\x34\x8c\xb6\x40\xdf\xbc\xb8\xe7\x3d\xc2\xbd\xbe\x0c\x6c\x2a\x78\x29\xb7\x1f\x7e\x10\x4b\x10\x46\xb8\xbd\x49\xa1\x93\xd3\x59\xa3\xd8\xb5\x8e\xaf\x4d\xa9\x8f\x6d\x15\x09\xa3\xd3\xf1\x34\xba\x2f\x7d\x3e\x26\x6d\x3e\x22\x5d\xee\x4f\x93\x9f\x8f\x1e\x47\xd1\xe2\x70\x3a\x1c\x4e\x83\x23\x14\xe5\xb1\x74\x37\x9c\xe6\xf6\x95\x84\x8a\x92\x4d\xf9\xa7\x08\xac\xf0\x8d\xd3\x51\x68\xf6\x49\x5b\x9f\xa6\x82\x09\xef\x01\x2b\xec\x8d\x02\xe7\xa5\xa3\x7b\x6b\xa0\xb8\x10\x8f\xe7\xee\x36\x89\x23\x03\x92\x1b\x90\x5c\xab\x0d\x48\xae\x53\xc8\x78\x49\x18\x4e\xc8\xb4\x33\x12\x3e\xf4\x36\xbd\x6f\xf4\xb5\x12\x20\x8b\x4e\x44\x6e\xe1\xba\xac\x6a\xff\x93\x42\x02\x44\x4f\xb9\xae\xbd\x9c\xb7\x03\xda\xdd\x86\x1e\xc1\x7d\xd9\x7e\x79\xaa\x5c\xa2\x87\x95\xfe\x57\x72\x8e\xa3\x3f\xe9\xee\xb1\x22\x41\x19\x59\xc8\x0a\x13\x62\xbc\xa2\x4a\xf1\x99\x18\x17\x32\x1d\x9b\x51\x5e\xed\x64\xb7\x8f\xe9\x52\xea\x35\xce\x4f\x3d\xee\x0f\xde\x1e\xd3\xe0\xeb\x0d\x5a\xab\x34\x6b\x18\x6b\xbc\x1a\xdf\xe5\x19\x08\x90\x1b\x3b\xa5\x94\x27\x1e\x4e\x4e\x05\x9d\xb1\xb1\x9d\xec\xd8\x4f\x76\xec\xe7\xf6\x84\xf3\x0a\x21\x66\x49\x46\xf9\xee\xa0\x8d\x18\x12\x76\x09\xbd\xd9\xe4\xed\x3e\xaa\x66\x25\x85\xb2\x13\x27\xb9\x40\x83\xb6\xfb\x09\x3f\xde\x6d\x16\x87\xcb\xe2\xb3\xe0\x6c\x38\xc8\x9d\x5f\x03\x8d\xb4\x71\xa9\x59\x31\x77\xc6\x7f\x67\x3b\xe3\x25\x53\x84\x09\x7a\x9f\x59\xa7\xc2\x9d\x9d\x5d\x2d\x05\xcd\x79\xe2\x80\xef\x22\x83\xc0\x09\x2e\x05\x99\x32\xaa\xab\x92\x91\x19\xd5\x2c\x64\x46\x9e\x6a\x73\x0f\x6d\xe4\x46\x93\x84\x0a\xb4\x37\x5a\xaf\x77\x83\x47\xfc\x4a\x77\x1a\xf2\xc3\x02\x77\x02\xc2\x75\x5a\x67\xff\xa1\x79\x4e\x4d\xa7\x46\x29\x18\x61\x42\x97\x90\xc5\xec\x56\xa6\x86\xe2\x4c\x5a\x6f\x77\xb8\x1d\x04\xb3\x67\xa1\xda\xf4\x0e\xc7\x67\xf2\x72\x38\xbd\x06\xdd\x68\x32\xe4\xad\x2d\x2d\x64\x3a\xd9\x70\x53\xc2\xd3\xd3\xdf\xca\xd4\xc6\xf7\xe8\x16\xbc\x99\x4b\x04\xa0\x96\xd3\x07\x17\x75\xe3\x4d\x41\x74\x41\x79\x16\xe0\x79\x4a\x20\x9d\x94\xe2\xa9\x91\x11\x02\x50\xaa\x9f\x58\x38\x97\x64\x0d\xdb\x87\x38\x84\x0f\xd8\xb5\x4b\xa2\x00\xfb\x9f\xcc\xa5\x62\x02\xee\x1b\x75\x63\xfb\x22\x30\x0e\xec\x53\x44\x9d\x21\x9c\xe8\xcd\x14\xb9\xdf\x11\x61\x0b\x56\x2e\x35\x94\x62\x70\x09\xbb\xb0\x1b\x33\x7e\x4e\xd3\xc6\xae\x8f\x88\x34\xec\xda\x23\x57\x21\x07\x00\x78\x02\xe7\xa7\xaa\x4c\x7b\x16\xdc\xce\x7e\x6f\xa7\xb1\x1e\x9c\x64\x98\xbb\x87\xce\x4c\x6c\x9d\x17\x72\x5b\xd4\x53\x4e\x8b\xad\x5f\xa1\xaf\xc4\xbe\x68\xd7\xd7\xe8\xcb\x81\x9f\xdc\x5b\x93\x79\x4e\x3f\xf1\xbc\xca\x09\xcd\x65\x85\xd1\xce\xeb\x7c\x45\x50\x20\xd8\x3e\xb8\x84\x0d\xdc\x81\xda\xc6\x1e\x90\x70\xb4\x1a\x1f\xae\xfc\x42\x8d\xfd\x41\x46\xfe\x38\xe3\x7e\x84\x51\xbf\xb7\x31\xdf\xb9\xed\xec\x0b\x90\x2d\x4a\x5b\x03\x65\x2e\x3a\x41\xd9\xd1\xd7\xdd\xb0\x7c\x33\xad\xc7\xe0\x8a\xc8\x9c\x6b\x6d\xbd\x63\x1a\x14\x60\x44\xb8\x6e\xb9\x92\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x91\xf1\x84\x83\x47\x92\xf3\x42\xdb\xcd\xff\x79\x9c\x68\xd3\x10\xf0\xbc\xc0\x44\x04\x70\x51\xc6\x8e\xb5\xb4\x31\x03\x7e\x96\x36\xc8\x85\x7d\x4a\x18\x4b\xed\x44\x86\xfb\x3a\xdc\xd7\xe8\xfb\xaa\xf6\xa4\xa1\x68\x6a\x27\xea\x98\x68\xaf\xa5\x30\x57\x09\xe2\x95\x51\x5f\xe0\xa0\x6b\xd7\xc5\xbc\x76\x19\x33\x3f\x30\x30\xca\xdd\x31\xad\x6c\xf4\x35\xf4\xb4\x4b\xdd\xb6\x96\x81\xcf\x67\xd9\x74\xa9\x0c\x28\xe8\x13\x1b\x6f\xd4\xb1\xab\x3b\x84\x67\xbd\xca\xde\x82\x0a\x84\xe5\x45\x46\x75\xad\x20\x79\x42\x90\x6b\x08\x13\x1f\x93\xa4\xee\x79\xd3\xd2\x1d\x46\x6c\xeb\x64\x83\x9f\x31\xbd\x5c\xdf\x84\x72\x07\x10\x18\xbb\x5d\xaf\x02\x13\xc3\x85\x0b\x96\x41\xbe\x59\x87\x4e\xf7\x16\x21\x86\x85\xa7\x74\x8b\x97\xc3\x0e\x9c\xb6\xed\x50\x89\xda\x22\x76\x2f\x34\x19\x5b\xfc\xde\x1d\x29\xe1\xda\xd1\x53\xac\x1d\x33\xa9\x5a\x54\x1a\xb5\x98\xc4\x38\xc1\x49\x71\xfa\xfb\xd2\xc6\x24\xc3\xe9\xf9\x61\x60\xca\xb3\x18\xd8\x3d\x72\x5a\xb3\x23\x27\x32\x7b\x8e\xd4\x65\x07\x93\x1f\x02\x40\x33\xde\xe0\xa7\x65\x66\x73\xb6\x87\x19\x80\x3e\xd6\xef\xc3\x76\xd4\xae\xdb\x8d\x9e\x8e\xe3\x4c\xb6\x13\xb2\x3f\x3a\x3e\xd7\x60\xa7\x7a\xd2\x00\xe3\x5a\xd3\x64\x6e\x13\x90\xe1\x2f\x06\x12\xc4\x92\x18\x20\xd0\x48\xc9\x6d\x0e\xa4\x5d\xe7\x3c\x67\x44\x97\x50\x34\xf7\x4f\xfe\x42\x8c\xd0\xe4\xff\xe7\x46\x9e\x09\x5f\xf6\xd5\x03\xe3\x9f\xdc\xbf\xfe\xfc\xc4\xec\x23\x61\x4c\x0e\x4e\x69\x9f\xbc\xea\x35\xf4\x48\xb8\x48\xc1\xef\x10\x59\x21\xdc\x3c\x1c\xcc\x6c\x2d\xac\x7b\x62\x33\x37\x61\x1a\x34\x6b\x99\x05\x07\xc5\xfa\xe5\x4e\xd6\x01\xfc\x32\x6b\xd5\x84\x77\x7c\xf0\x77\x98\x91\xf7\xd2\xd6\xcf\x66\x23\x72\x0b\xda\xe1\xfa\x09\xdc\xf9\xf7\x12\x2b\x69\x77\xa4\xa2\x08\x44\xff\x9d\x3c\x63\xdc\x7e\x7e\x55\x33\x94\xb8\x31\x2d\x86\xb2\xbe\x58\x4d\x96\x72\xe7\xc6\x3e\xb0\x65\xe7\xae\x5a\x26\xc1\x32\xb3\x56\x35\xee\x61\xd4\x11\x79\xe4\x1b\xfe\x8f\xb3\xf0\xe5\xf7\x5c\xe0\x54\x70\x60\x77\xce\x30\xb6\x3b\x0f\x23\x81\x64\x59\xc0\x24\x02\x77\x3b\x8c\xe3\x8d\xdb\xf2\x6f\x22\x38\x5d\x4f\x2f\xba\xb6\x74\x13\x7f\xdb\x60\x6a\xaf\x7f\xaa\x68\x36\x69\xe5\xfd\xc0\x47\x5d\xd7\xcd\x3a\x23\xaf\xd2\xcd\x47\x9e\xa5\x09\x2d\x6d\x44\x1c\xa0\x1f\xa2\xa4\xb5\xce\x02\xf6\x4b\x3a\xdd\xce\x1d\x02\xac\x81\x47\xa1\x07\x6e\x41\x4b\xcd\x93\x2a\xa3\x25\x31\x77\x7c\x26\xcb\xa0\xc4\x1e\x9d\x87\x59\x43\xf3\x1d\x4b\xa4\x48\xf7\x2a\x44\x7f\x5c\xed\x7c\xd5\xc7\xb8\x60\x25\xb7\x25\x9c\x79\xce\x56\xaf\xd7\x59\xcb\x2f\xa5\x4b\x0e\x9b\x3a\x64\xe7\x71\xcb\xa8\xa9\x19\x6d\xdb\x94\xb1\xbc\xc8\x79\x83\xe0\xf8\xdb\x3e\x21\x5f\x2e\x9d\x8a\xb6\x8b\x21\xe7\xda\xa5\x5a\x51\x4c\xbb\x64\x3c\xee\x2a\xda\x93\xac\xd1\xc8\x54\x96\x90\xe4\xe6\x2c\x95\x98\x9e\x65\xc1\x13\x7d\x3e\x21\xff\x1f\x2b\x65\x40\x16\x23\xc1\x66\x58\x73\xdc\x5e\x6c\xaf\x8f\x2a\x19\xb5\xbe\xf5\xaf\xc9\x19\x96\xa1\xe7\x79\xce\x52\x4e\x35\xcb\x96\xe7\xa8\x9e\x62\xb6\x90\x7d\x08\xd4\x84\xa8\x15\x31\x60\x12\xde\xfd\xe7\x3f\xec\x78\xf3\x00\xd9\xa7\x6c\x86\x9b\x7a\x63\xd1\x81\x6e\x05\x7a\x7c\xda\xc4\x4e\x79\x7f\xab\x7c\xd6\x0c\x22\xa8\x13\x57\x3a\xdc\xec\x61\xeb\xef\x06\x40\x29\x29\xd9\x0c\xee\x27\xde\xb9\x27\xde\x4e\x8c\xa8\x7d\x27\x2b\xb1\xdd\x06\xd2\xda\xb7\xaf\xad\x0a\xee\xbb\xc6\x87\xb1\x69\xe3\xf6\xcb\x10\x36\x66\xd2\xb0\xba\x50\x02\xa6\x16\xe0\xc0\x0c\x62\xc3\xb7\xea\xd0\x93\x00\x63\xf9\x1e\x53\xc1\xc1\x5c\x3a\x92\x2f\xec\x25\x61\x9c\x1f\x68\x9f\x57\x01\x12\x19\xd8\x9d\x5b\xc9\x89\xe6\x4a\x6e\x01\x00\xe3\x16\xd7\x10\x0c\x93\x61\xa9\x0d\x56\xec\x42\x3b\xd2\x6b\x37\xc9\xe9\x9b\xd3\xbd\x50\x1d\xdc\x8d\x52\x16\x74\x06\x97\x75\x9f\x9b\xb2\xda\x37\x49\x99\x66\x65\xce\x05\x53\x64\x2e\x1f\xf1\x77\x64\x06\x0a\xfb\x16\x4b\x6b\xcf\x83\xb9\xec\xdc\x11\x2c\xaf\x55\x67\x9f\x43\xec\x01\x7e\xa4\x8f\x74\x49\x68\x29\x2b\xd1\x99\x44\x00\xb8\x68\x4f\x39\xde\xad\x4c\xfa\xbd\x14\xcc\x3b\xa3\x74\x51\xd9\x16\x69\xbb\x67\x9a\x9a\x0b\xff\xc5\xe4\x8b\xd7\x41\x73\xf8\xc0\x92\xaa\x54\x7c\xc1\x3e\x30\x9a\x7e\x63\x24\x6e\xae\x00\x6b\x68\x49\x6e\xa6\xb7\x52\x29\x7e\x9f\x31\x22\x4b\x60\x90\x04\xbd\xcf\x0c\xd3\xbf\x3a\x61\xcf\xa1\xc2\xcc\x65\x49\x2a\xe1\x45\x84\x8e\x59\x58\x32\xdf\xb4\x8a\x9a\x4e\xce\xf7\x02\x69\x91\x89\x1a\x61\x2f\x57\xec\x33\xce\xf9\xdc\xe1\xaa\xbd\xcc\xab\xb4\x9b\xbd\x4f\xc8\x7f\x87\xd7\x1a\xfa\x1e\x83\xee\x84\x4f\xc1\x6a\x37\xc2\x47\x8f\x25\xd7\xac\x41\xb7\xce\xa6\x34\x53\xab\x87\xd5\xb1\xed\xed\x3c\x79\xd0\x41\xc8\x7e\x74\xbb\x47\x97\xab\x60\xb8\xcf\x9d\x59\x87\xf1\x3a\xd9\xba\x73\x01\xaf\x77\xcd\x62\x88\x1a\x5f\xce\xa9\x48\xb3\x4e\x38\xf6\x2b\xc8\x96\x1d\x0e\x8e\xd6\x5b\xa0\xbe\x6e\xb0\x8f\xa3\x26\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf5\x37\xac\x71\x58\xb1\xe3\x20\x30\x20\xca\x6a\x22\x0d\x7b\xdd\xaf\xb8\xb2\xd7\x1b\x34\x25\x40\xb9\x2d\x7f\x9b\xd3\xce\xec\xd6\x8d\xf5\xd7\x9b\x39\xb1\xec\xd5\x86\xd1\x6a\xe4\xb2\x32\x5e\xdf\xb1\x46\x06\xde\x91\x25\xf7\xb9\x5c\x1c\xf3\x5b\x23\xec\xd2\x70\x1f\x39\xab\x27\xd6\x31\xd4\xea\xb4\x3d\x0a\x5c\x9b\xf3\xe6\x59\xf9\x49\x75\x8c\xd3\x3d\xe5\xb6\x3c\x83\x0a\x35\xcc\x9d\x69\x2b\x0a\x6a\x8a\x41\xb6\x01\x09\x51\x09\x2b\x4b\x59\x7a\x19\x62\xc6\x04\x48\x2b\xa0\x85\x73\x8a\x24\xeb\x3b\x47\x95\x14\x21\x80\xd6\x71\xc8\x06\xcf\x74\x93\x0f\xfc\xac\x63\x30\xa0\x31\x67\xb2\x5c\xb9\x0d\x4e\x00\xdb\x40\x49\x62\x67\x0f\x84\xb9\xee\x17\x81\xaa\x21\x68\x99\x0d\xac\x85\x7f\x39\xf5\x57\x67\x3f\x31\x60\xd5\xfd\xa1\x59\x45\xcb\x13\x02\xdb\x53\x73\x8a\x1e\xe4\x4e\xd5\x76\xae\x31\x82\x3e\x9c\x9c\x90\x33\xec\xe7\x54\x91\x52\x4a\xbd\x1f\xa2\x6e\xf7\xe7\xfa\x53\xb1\x57\x25\xd4\xb5\xcd\x3c\x4b\x8a\xa3\x6d\xd6\x97\x6c\x4e\x17\x4c\x11\xc5\x73\x9e\xd1\x32\x83\xb4\x9e\x77\xb8\x3c\x88\x4c\xdb\x98\x3b\x3b\x20\xef\x72\x43\xe3\xdd\x9c\x67\xa3\xbb\x43\x9e\x23\x71\x6b\x30\x47\x04\xf4\xc6\xad\x09\xea\xe6\x56\xba\xa2\x59\xb6\x24\xec\x53\x92\x55\x06\x5f\xee\x45\x58\xee\x23\x27\xaf\x8a\xc8\x85\x75\xd4\x3f\xa2\x80\xdc\x56\x79\x1a\x7e\x35\x75\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\x49\x98\x52\x2e\xf3\xc0\xb2\x99\x3d\xc1\xaf\xe1\x73\x49\xa3\x4e\x1f\xd5\x75\x46\x95\xe6\xc9\x97\x99\x4c\x1e\xee\xb4\x2c\xf7\xaa\x2b\xda\xd4\xff\x4a\x72\xfa\x8b\xbf\xdd\x19\xe4\xfd\xd0\x48\xf7\x64\x1d\x31\x9b\x86\x29\xda\x31\xd0\x43\x75\xcf\x32\xa6\x4f\x15\xc8\x8f\x24\xa7\xc9\x1c\x4b\x24\x80\x70\x28\x7c\x42\x31\xab\xbe\xde\x79\x44\xd8\xae\xcc\x2c\xa1\xe8\xc8\x1b\x33\xc7\xf5\x65\xa0\xbf\x99\x7d\x07\x73\x72\xa0\x06\x0b\x8c\x81\x75\x2d\xe7\xb1\x2e\x59\x17\x3b\xb5\x71\x9f\x20\x52\xd5\x26\x26\xe7\x25\x7a\xba\xd9\xf9\xb3\x7b\x35\x49\x14\x9f\xd0\x47\x35\x49\x64\x4e\x2e\xef\x6e\x48\x5a\xf2\x45\x77\x88\x43\xa4\x0b\xa9\x4d\xd5\xf7\xca\xde\xf0\x5f\xd3\x47\xc5\x70\xa2\xf7\x66\xa2\x50\xde\x22\x00\x77\xec\xd5\x29\x0a\xe7\x72\x73\xb5\xf3\xc5\x70\x87\xa7\xa9\xfa\x68\xe6\xd8\xf1\x56\x1f\x17\x18\xec\xd9\xa9\x4a\xa7\x3c\x63\xa8\x02\xc6\x93\xb5\xe1\xd4\x16\xd5\x00\xd0\x2f\x65\x45\x1e\x29\x5a\x33\x80\x80\x05\xc5\x58\xf3\xe2\x0d\xb9\x16\xaa\x2a\x59\x6d\x24\x5b\x1d\x6c\x13\x4b\x0e\x37\xc5\x82\xac\x98\x05\xa9\xa7\xb1\x5d\x7f\xa2\x79\x91\x31\xf5\x86\x9c\xb0\x4f\xfa\x0f\x27\x23\x72\xf2\x69\xaa\xcc\xff\x84\x9e\xaa\x93\x09\xb9\xc9\xbd\x0b\x35\x17\x53\x56\x96\x3e\x2c\x1b\x3f\x30\x2c\x79\x4b\x8a\xea\x1e\xf3\xd8\x70\x4b\xe2\x9c\x5f\xc0\x3c\xd4\xad\x49\x23\xbd\xe0\xc8\x77\xee\x40\xa9\xf1\x40\xec\x07\x88\x6e\xa6\xce\x63\x1e\xe5\x2a\x57\xf2\x9d\x2b\xdf\x8d\x01\x1b\x3b\x8e\xa1\x3c\x71\x80\xf2\xd6\x27\xa9\x24\xaf\x52\xb6\x78\xa5\x52\xfa\xc5\x08\xa6\xaa\x6c\x24\x78\x7b\x5d\x54\x91\x93\xb0\xcc\xb5\x77\x8e\x73\x1b\x35\x77\xa2\xee\xc9\x20\x62\x37\x24\xf8\xbd\xbc\x3e\x01\xd1\xc5\x8c\x9d\x50\x41\x32\x46\x17\x56\x9c\x43\x94\xb1\x44\x03\x43\x27\x87\x15\x63\xac\x21\x6d\x83\xcd\x3f\xfd\xbe\x53\xbc\x0e\xd1\xc1\x90\x5e\xd0\xe4\xfa\x76\x56\x9b\xb2\xb2\x19\x98\xa6\xb2\x4c\xbc\xcc\x69\xb5\x34\x4c\x03\x6e\xe0\xa2\x65\xd7\x78\xd9\x17\x36\x2c\xc1\x98\xa3\x22\x07\xf1\x7d\xb4\x7d\x83\x06\x59\xf0\x9f\x2a\x46\x6e\xae\x7c\x3a\x6f\x56\x2a\xae\xb4\x11\x28\xd2\x16\xdf\xc3\x91\x19\x3a\xbb\xc8\xe9\x3f\xa4\x20\xd7\x5f\xde\xd9\x8e\x02\x40\xf1\x45\x23\x48\xfa\x8f\xaa\x64\x86\xc7\xdb\x2b\x6b\xe9\x3a\x5d\xe5\x27\xcd\x73\x72\x45\x35\x45\xb6\xd2\x06\x16\x89\x9a\xe4\x19\xa6\xf0\x9e\x8b\xd4\xfe\xd4\x93\x25\xf4\xc3\x47\xf1\x81\x8d\x69\x9b\xcd\xeb\x5a\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x28\xfe\xef\x00\xdc\x98\x99\xcd\xfb\xae\xb8\x66\xf7\xe2\xb7\x1f\x6e\xf6\xc4\xb5\x25\xc0\xe1\xcf\xde\xc9\x34\x96\x75\x3b\x6d\x7c\xea\x08\xea\xbf\x1a\xb8\xb8\xc4\xe7\x24\x37\x7d\x82\xe2\x6a\x04\xca\x5b\xf2\x0d\xe8\x36\xe1\x9f\x7f\x2b\xb9\x66\x93\xee\x3c\xb4\x11\xac\x83\xdb\xc0\xc8\x65\xb8\xcf\xdc\x12\x9a\x29\x7a\x52\x03\xfd\x80\x5c\x2c\x7f\x70\x9f\xc9\x7b\x62\xaf\xfc\xbe\xe7\xfe\xed\x87\x9b\x1e\x53\xff\xf6\xc3\x8d\x9b\xb9\xf9\xa7\x9c\x1e\x6f\xd2\xc7\x60\xf8\xdf\xae\xf0\xdf\x31\xbc\x58\x9d\xdc\x6a\x95\x8b\xdf\x27\x0b\x3f\x39\x1a\xf3\xde\x2f\xf3\x90\x19\xab\x4b\xe8\xe7\x22\x20\x85\x71\xfb\xf2\x9b\x6f\x08\xfb\x54\x20\x46\x6d\xb8\x4c\xde\xcd\x29\x64\x9d\x76\x09\x2e\x11\xfc\x0c\x3c\x2a\x43\xb2\x1d\x20\x12\x8a\x25\x2e\x0c\x35\x40\x2d\x7d\xfa\xc6\x39\x82\xfb\x2f\x36\x7f\xf0\x0e\x02\x30\xd3\x37\x48\x03\x08\xc6\x63\xa6\x0d\xb8\x3f\x43\x73\x85\xf0\x3f\xd9\xb8\x7b\x4c\x82\xa5\x98\x3e\x9f\xb4\x74\xeb\x0a\xa6\xbc\x57\x64\x74\x14\xc6\x73\xcd\x82\x49\xce\xcc\x6f\xaf\xc0\x3e\x7a\x3e\xa9\x2d\x66\x90\x1d\xa2\xe6\x4d\x03\xc6\x30\x97\xe2\xc3\x93\xb9\xd7\xb8\x44\xb5\x1e\x64\x61\x2d\x5d\x7c\x90\xc1\x0c\x7b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\x3b\x3d\x24\x2b\x04\x03\xf5\x60\x85\xe0\xbb\xde\xac\x90\x41\x90\x2f\x87\x15\xc2\xd4\x81\x41\xcc\x10\x5c\xdd\xce\x37\xc3\xd9\xa1\xa3\xdc\xdb\xf4\x97\x74\x6f\xeb\xc3\x8a\xdc\xb3\xfa\x43\xc7\xc0\xf8\x04\x39\x2e\x25\x7d\x2b\x20\x15\x2f\xe2\x9d\xa5\x06\xb6\x42\x12\xb2\x6b\xe6\xfa\x7d\x15\x90\x5d\x3f\x02\x81\x7b\xc0\x8a\x5d\x95\xfb\xce\x2d\x0a\x89\x14\x3c\x26\x01\x20\x1d\x3c\xc9\x84\x15\xf3\xe9\x5e\xbd\x9c\x4d\x8f\x6f\xef\xda\x66\x9c\x4b\x56\xcc\xc9\xdb\xbb\x0d\x28\x0f\x0e\x07\x96\xa5\xd0\xb8\x73\xaa\x48\xc6\xa7\x0c\x7c\x12\x22\xb0\xde\x25\x8e\xda\x42\x79\xde\x19\xcd\xa1\x38\x5c\xac\x57\xc1\x0a\x49\x32\x29\x66\x86\x39\x08\xab\x75\x73\x00\x24\x95\x4b\xc1\xb5\x2c\x77\x7b\x43\x84\x23\x1e\xd7\xdd\x21\x10\x8f\xeb\xdb\x6c\x5d\x5d\x16\xe4\x5d\xe3\x29\x25\x89\xcc\x32\x96\x68\x5b\x2b\x0b\x8e\x3d\x68\x85\xd8\x36\x28\x4d\x98\xd5\x59\x4e\x1e\xfe\x08\x6a\x13\xab\x20\x79\x85\x47\xf9\xea\xc3\xf5\xc5\xd5\xbb\xeb\x49\x9e\xfe\x7a\x2e\x1f\xc7\x5a\x8e\x2b\xc5\xc6\xbc\xbb\xe4\xc6\x67\x1c\x9d\x49\x30\x59\x47\x40\xa5\xaf\x36\xab\x5d\xd8\x22\x65\x2e\xdf\xef\x1b\xf2\xad\x42\xef\x0d\xef\xb9\xc3\x52\xb0\x66\x8f\x48\x49\x6d\x1a\x50\x8a\x57\x75\x5a\x65\x19\x9e\xa6\xb9\x47\xa3\xa6\x3e\xfa\xd5\xe7\xc7\xf0\xb6\x36\xe1\xc5\x73\xbf\xc7\xbf\x16\x31\x14\xbb\x9b\x7f\x26\xbd\x0e\xab\xee\xbd\x7d\x5c\x77\xad\xe7\x68\xa5\xd0\x73\x73\x78\x0f\x6c\x49\x20\xa8\xdb\x30\xb6\xdf\x2a\x56\xb6\xc1\x94\xe9\x04\x76\xe7\x55\xa5\x58\x39\xc1\xee\x5f\xe0\xde\x87\x71\x15\x61\x49\xb1\xc9\x13\x76\xfe\x03\x9b\x6e\xda\x78\xfb\xb8\x2e\xed\x6d\x39\x7f\x5a\xe9\x39\x13\x9a\xdb\xec\x96\x96\xf3\xda\x78\x12\x01\x55\x98\xb1\x1d\x7b\xeb\x03\xab\x35\xc5\xd5\x56\x1a\xea\x11\xd5\x6d\xa8\x47\xf4\x32\xea\x11\x3d\xa5\xc8\x9a\xc1\x9e\x87\xc0\x3a\xa6\x5f\x48\x14\xd7\xe4\x4e\x7c\xea\xab\x92\xa6\x52\xe1\x3b\x58\x67\xb7\x81\x4f\x68\x9a\xf3\x6e\xad\xd0\x0b\xc4\xe4\x09\x17\x69\xd7\x66\x46\x8a\x5e\xd0\x63\x5b\xf4\xb2\xcf\xac\x21\xde\x3b\x71\x51\xa7\x65\xc2\x04\xe3\xd6\x61\xab\xed\xaf\x15\x25\x7f\xe1\x30\x71\x2a\x27\x3b\xb7\xde\xfa\x26\xfc\x1e\x34\x4e\xb2\x60\x06\x91\x24\x0f\x13\x59\xce\x9e\xe6\x80\xb5\x0a\x15\xf9\x52\xfd\x94\x8d\x71\xac\x71\x91\xd6\x60\x71\x6c\x59\xf1\x17\xe2\x69\xf5\xf2\x8c\x2f\x2f\xc2\x7f\x6a\x3f\x60\x47\x5e\xa0\xbc\xf5\xe2\x15\x95\x47\x39\x8f\x18\xa9\xea\x18\xac\x7d\x4d\x69\x0b\xc9\x6d\x74\xb4\x2f\x7b\x8a\x78\xcb\x69\x4d\xcd\xa6\x16\xb4\xa4\x39\xd3\xac\xc4\x28\x4c\x1b\xf5\x29\x42\x38\x66\x08\x11\xfd\xa6\x60\xe2\x0e\x10\xf4\xc0\x8e\x6f\x6e\x03\x3b\xbe\xa3\x0d\xec\xf8\xc6\x76\x14\xb7\x39\x77\xdf\x79\x6a\x44\x7c\xeb\x1c\x5a\xc7\x64\x58\x2e\xec\x65\x60\xd9\x6e\xae\xdb\xd5\x6e\x8b\x60\xbc\xfd\x37\x2b\xac\x75\x5d\x4b\x11\xad\x18\x10\xed\xe4\xeb\x91\xc2\xed\xc1\x6d\xda\x0f\xa7\x18\x8e\xea\x2c\xf8\xf5\x70\xc7\x0a\x82\x8c\x46\xf7\x6d\x4a\x92\x9b\x27\xf7\x5c\xd7\x34\x42\x31\x4d\x0a\x56\xe6\xdc\xe6\xc7\x95\x82\x24\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\xa2\xf8\x41\x41\x64\xa2\xa9\xcd\xea\x44\xee\x99\x7e\x64\x4c\x90\xd7\xaf\x5f\xbf\x06\xd1\xe6\xf5\xbf\xfc\xcb\xbf\x10\xc8\x35\x9e\xb2\x84\xe7\xeb\x2f\xc2\x5b\xff\xeb\x8b\x2f\x42\x06\xfd\xb7\x8b\x77\x5f\x43\x9c\x51\xa1\x15\xb9\x97\x7a\x6e\xc7\x36\x5d\xb4\xba\x57\x23\xf2\x7f\xef\xbe\x79\x5f\x17\x8a\x69\xff\x0a\xf2\x8f\xdf\xa2\x90\x91\x9b\xca\xe9\xd7\xff\xfc\x87\x3f\x04\x7d\x03\x42\x92\x2c\x21\x98\xbb\x0e\xda\x2b\x5c\xb8\x99\x90\x7a\x3d\x55\xb3\x65\x9d\x82\x8b\xc8\xe5\x7c\x36\x87\x83\x30\xf7\x5f\x8a\x69\xc6\x13\x8d\x44\x02\x13\x3f\x20\x48\xd8\x72\x21\xd4\x66\x5d\xb3\xb2\x40\x90\xa9\x29\x65\x23\x92\xf1\x07\x46\xa6\xea\xaf\xa5\xac\x8a\x3a\x37\xa2\xad\x5e\x91\x50\x61\xc6\xc7\xe1\x6a\xb8\x53\x2c\x38\x23\xeb\x21\x3c\xc5\x03\x6d\x45\xf1\x57\x0e\x3a\x5e\x11\x34\x46\x58\x93\xf1\x81\x2d\xc7\x08\xdd\x05\xe5\x3e\xec\x0d\x5c\x6e\x91\x9b\x68\xf3\x23\x49\x50\x79\xe8\xba\xc4\xa5\x8b\x89\x2e\x4a\xf9\x77\x04\x1a\x2e\x5c\xda\x31\xab\x54\x50\x56\x3e\xb3\xb9\x30\x45\x6d\xb7\x0e\x18\xc9\xe5\x74\x36\xbc\xa6\xcd\x26\x5d\xa7\x34\x23\x37\xd3\x66\xe0\x31\x24\x35\xe6\xca\x4c\x02\x2a\x35\xdb\xb9\x05\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x12\x6b\xfd\x63\x38\x79\xd0\x18\x40\x1a\x60\xd2\xd4\xa5\xae\xab\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x38\xe7\xad\x8d\xb0\x65\xba\xb2\x47\x84\x11\xec\x95\xc8\x98\x52\x36\x42\x3b\xa7\xe5\x03\x4b\x3d\x7e\x9e\x40\xd8\xb3\x0a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x9c\x2e\x5b\xd9\x6f\xcc\x34\x4e\x27\x93\x53\x44\x2d\xb2\xc4\x80\x7b\xc4\x02\xe6\xf9\x33\xe5\xc8\x6d\xdd\x2d\x28\xce\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1d\xd1\x4c\xed\x5e\x86\xe0\xbe\x28\xc9\x24\x5c\xb5\x83\x2d\x24\xbf\xb8\x7b\xb3\xd8\x9d\xa3\xc9\xb5\x38\xe1\x28\x30\xdb\x38\xb6\x6d\x39\xc7\xed\x1e\xdb\xfb\x16\xca\xde\x47\x33\xd8\x79\x10\x6b\xb3\x61\xaa\xc1\xa2\x1c\x8e\xd1\x36\x82\x05\xf1\x37\x36\x75\xc2\xae\x7a\x80\xab\xed\x59\xd8\x1a\x6c\xcf\xc7\xdc\x60\xbb\x99\xae\x66\x97\x68\xa0\xb7\x26\xa3\xe9\xe8\x50\x48\x0e\xa8\xba\x1d\x83\x5b\xc1\x76\x60\x9e\x05\x5b\x1c\xe7\x82\x2d\x86\x7f\xc1\x16\xe6\x5e\x82\xad\xef\xe5\x72\xee\x28\xb8\x3d\x96\xcc\x20\x25\x99\xfa\xcd\xc7\x0c\xae\x45\x03\xb1\x44\xdc\x29\x4b\xae\xf0\x5a\xd1\x7b\x25\xb3\x4a\xe3\x10\xf1\x9d\x34\x69\x1e\x4c\xd2\xa5\x04\x0f\x23\x74\xab\xdd\x35\x28\x25\x70\x22\x48\x9e\x62\xfa\x3a\x9e\xaf\xd1\x50\xc4\x7a\x28\x62\xbd\xa5\xbd\xac\x22\xd6\xee\x33\x1f\xc3\xbc\xb9\x64\xbf\x2c\x89\x41\xba\xc0\xdf\xbf\xa4\xe2\xd6\xd8\x12\xc5\x63\x14\x53\x8a\x93\xb3\x4b\x9f\xf1\xc4\x79\x35\xdf\x08\xcd\xca\x29\x4d\xd8\x79\x53\x61\xc5\x8a\x39\xcb\x59\x69\x36\xc8\xbe\xe7\x52\x7b\xd8\x84\x6e\xe4\x7e\xe9\xe0\x8f\xb0\x4f\x9a\x95\x66\x33\x6b\x53\xea\xf1\xeb\xed\xe0\xb8\xfb\xd2\x89\x41\x67\x07\x51\x87\x41\xcf\xad\xf2\xa0\x16\xaf\xd5\x9b\x87\x7b\x8d\x1b\xad\x9a\xaa\xc1\x90\x1b\x7e\x29\x05\xf0\x0f\x80\x62\x96\xb2\x2a\xd1\xe9\xc1\xdb\xd3\x13\x59\x96\x86\x67\x81\xa1\xa9\x22\x25\x9b\x19\x21\xb6\xc4\x02\xca\xf0\x46\x56\x99\x07\x7b\x8d\x0e\x3b\xb8\xfd\xd8\x1b\x8a\x77\xc4\xc7\x05\xf4\x66\x39\xcc\xa2\x94\x0b\x9e\x3a\x06\xb3\x89\xa5\xb9\x22\x05\x55\x8d\x7c\x34\x54\x29\x99\x70\x50\x52\xd6\x27\x18\x30\x12\x4a\xf8\xc0\xa8\xfa\x2c\xab\xad\xfc\x0d\x4d\x23\xb6\x84\x7c\xf9\x01\x9e\x70\x11\x47\x22\x64\xca\x6e\xab\xfb\x8c\xab\xf9\xdd\x21\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\x6d\x06\xc5\x20\x73\xa5\x50\x1c\xf8\x42\x43\xdd\x0c\x13\xcb\x8d\x78\x25\xe1\xb4\x5c\xff\xcd\x2b\x26\x81\xc6\x67\xcc\xe6\xea\xbb\xbc\xdb\x1d\xde\x8c\xed\x7d\xbd\x16\x9b\x81\x0a\x2b\x32\xa4\xec\x5b\x51\xb4\x9e\x27\x34\xdb\x5e\x89\xae\xd9\xda\x2c\x8a\xa3\x4b\x28\x0e\xb8\xbc\x55\x08\x80\xdc\xc0\xa6\xdb\x23\xde\x28\xae\x69\xb3\x70\x07\x1b\x75\x57\x36\x58\x91\x5c\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x68\x64\x4d\x83\xe4\xbf\x70\x03\x06\xe3\xec\x96\x36\x18\x67\x77\xb4\xc1\x38\xbb\xb1\x1d\xc5\xb9\xa6\xce\xdc\x4b\x1b\x49\x56\x5b\xb5\x66\x3d\x9f\x10\xce\x71\x74\x44\x45\xec\xd5\xe5\x05\x67\x75\xa1\x75\xc9\xef\x2b\x7d\xa0\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x49\x03\x61\x59\x65\x90\xc7\x8c\x0d\x7a\x13\xcc\x12\x4e\x3c\xe7\x06\x4c\x1b\x3e\x3c\x55\x24\x95\x49\xe5\x0b\x12\xc3\xe9\xd4\xde\x6c\xa1\xf5\x0a\xa3\xf0\x70\x7c\x39\xaf\xe6\x20\x9d\x57\x2b\x95\x8f\xc2\x60\xbb\x8b\xdb\x8e\xdc\x13\xed\xbc\x13\xf5\x57\x4d\x31\xc5\x3d\x26\xe6\x39\xbd\x97\x95\xf6\xd9\x7d\xff\x87\x99\xd9\x37\xe9\x9d\xb5\x24\x95\x62\x3b\xcd\xe8\xb5\x36\xb9\xe7\x18\x83\xed\x7e\xb0\xdd\x0f\xb6\xfb\x6d\xad\x75\x8f\x6f\xd0\x2c\xdf\x2c\xfa\xdc\xc2\x5f\x2e\x55\x72\xc8\xd6\x1d\xde\x1a\x7a\x55\x63\x5c\x14\x69\x56\x13\x55\xac\xc8\x59\x78\xdb\x6b\x6d\x7c\xc3\x1d\xd4\xa1\x64\x60\x89\x9f\xdf\x72\x7a\x20\x7b\x28\xac\x2e\x48\x86\xc6\xd6\x8e\xb8\xad\x83\xa4\xb1\x94\x3b\xba\x49\x34\x3c\x32\x0a\x99\xbe\xc1\xaa\x9e\x54\x08\x89\xec\x80\x1a\xd9\x92\xe7\x23\x1b\xea\x02\x8c\x70\x41\x13\x94\x4b\x2b\x9e\x02\x26\xa8\x23\xd6\xbb\xe3\x6f\xb1\x45\x9e\x00\x89\x3e\x05\x02\x27\x01\x0b\xec\x28\x21\xd4\x6c\xb1\x47\x62\x1a\x2d\xf8\x77\xac\x54\x41\xf9\x3d\xeb\xd6\x4e\x36\x8d\xdf\xbb\x93\x50\xc9\x9c\xe5\x14\xfe\xf9\xd6\x2d\xc0\x5c\x6b\xc3\xef\x6a\x86\x89\x3d\x59\x99\x1b\xc1\x6b\xd4\xf2\x67\x3f\x59\x84\xe5\xc5\x74\x2d\x5a\x58\x21\x0e\x0c\xbb\x53\xe0\xef\x58\xee\x6d\xcb\xb0\x66\x40\x10\xe8\x7b\x86\x85\x32\x57\xdc\x61\x00\x71\xe1\xfe\x1c\x78\x69\x4f\x91\xae\xb0\x1d\xc3\x0f\xa0\xaf\xfd\x7f\xe4\xed\x0b\x6d\x96\x27\x78\xe0\xc1\xfe\x3f\xd8\xff\xdb\xed\x85\xdb\xff\x1b\x24\xcf\x61\xd0\x0d\x06\xfe\xa6\x85\xc4\x59\xf9\xef\x99\x93\x2d\xac\xfc\xe2\x4c\xf7\xce\x6e\x2f\xcb\xb6\xe3\xd9\xe9\x64\x72\x8a\xae\x67\xb5\xc0\x53\xe9\xe9\xf8\x8f\x84\x89\x44\xa6\xa6\x9f\x8f\xd0\x7f\xa9\x34\xb0\x4b\xb5\xe6\xaf\x39\x97\xdc\x8d\xd5\x74\x5e\x83\xbe\xe3\xe8\x6a\x04\xda\x73\x19\x66\xdf\x3e\x85\xb9\x88\x40\x5f\x35\xf3\xe1\x73\xdb\xda\xad\xf0\xb5\x12\x2c\x17\xe2\x7e\x57\x24\xe3\x39\xb7\x75\x61\xcd\x7d\x67\x4a\x87\x2a\x2e\x09\x39\xc3\x8f\x27\x49\x51\x8d\x6c\x47\x93\x9c\xe5\xb2\x5c\x8e\x7c\x67\xe6\xc7\x56\xef\xf6\x0d\xac\xda\x91\x54\x65\xc9\x84\xce\x96\xa1\x89\x79\xea\x76\x24\x2e\xc7\xed\xd4\x01\x99\x1c\x7f\x38\x61\xe9\xa3\xea\xd6\xbe\x91\xb5\x75\x18\xd4\xeb\x7e\xb5\x58\x96\x17\x03\x9e\x47\xb5\xed\xdc\x3c\x65\x62\x41\x16\xb4\x54\xa1\x37\x80\xf4\xe5\x6b\x52\xbe\xe0\xaa\xab\x72\xf2\x8e\xc5\xdd\x79\xdd\x27\x94\x1c\xac\x74\x51\x69\x8b\xee\x1c\x88\xbb\x4a\x13\x1e\xb4\x57\xd8\xb7\x2f\xba\x55\xc0\x75\x2b\xa8\xd6\xac\x14\x6f\xc8\x7f\x9c\xfd\xfb\xef\x7e\x1e\x9f\xff\xe5\xec\xec\xfb\xd7\xe3\xff\xfd\xc3\xef\xce\xfe\x7d\x02\xff\xf8\xed\xf9\x5f\xce\x7f\x76\x7f\xfc\xee\xfc\xfc\xec\xec\xfb\xaf\xde\xfd\xf5\xe3\xed\xf5\x0f\xfc\xfc\xe7\xef\x45\x95\x3f\xe0\x5f\x3f\x9f\x7d\xcf\xae\x7f\x08\xec\xe4\xfc\xfc\x2f\xbf\x89\x98\x24\x15\xcb\x6f\x82\x71\x0a\xb6\x71\x2f\xba\xd2\xfe\x36\xf2\xe8\x57\x78\x3f\x2e\xf4\x58\x96\x63\xec\xe4\x0d\x64\x41\x0f\xee\xca\x1d\x6d\xff\x3b\x52\x53\xad\xba\xea\x89\x63\x8f\x0f\x7c\x09\x9e\xc6\x01\xf7\x76\xec\x02\x53\xd1\x15\xdf\x6b\xf6\x01\xd7\x67\x3b\x48\x4a\xb3\xbc\x90\x25\x2d\x97\x24\xb5\xca\xad\xe5\x93\x92\xbe\x3d\x31\xb1\x3a\x4c\x32\xe5\xbb\x61\xfc\x00\xaa\xe2\x9c\xa5\xbc\xca\x0f\x92\x96\x0d\x7a\x6e\x6e\xfa\x23\x94\x1d\xb1\x45\x4d\x9c\xaf\x8f\x7d\xcd\x95\xe4\xa2\xc9\x03\x0a\x2a\xfe\x54\xc2\xf4\x87\xad\x5a\x14\x27\x27\x2b\x35\xbe\x41\x37\x0d\x4e\x30\x32\x65\xa7\xca\xbf\x8b\x83\x47\x2a\x89\xd1\x9c\x69\x7d\x23\xcf\x6c\x57\xe7\x86\x11\x7c\x07\xbc\xc2\x11\xd2\xf0\x07\x41\x0b\x89\x4c\xde\xc4\xff\xc1\xbe\x36\x5c\xd1\x41\x22\xbc\x5d\xe7\xbe\x22\xb8\x04\x61\xce\x26\x5e\x9c\x92\x4c\x26\x0d\x07\xb0\x16\x33\x00\xe0\x70\xed\x2e\x71\xb8\xad\xd0\x00\x85\x19\x17\x79\x3d\x50\x86\x66\x0a\xbd\x5b\x78\x02\x05\xda\x40\x34\x84\x33\x8b\x80\x04\xd3\x6d\x4e\x3f\xf1\xbc\xca\x49\xa5\xcc\x6c\xa5\x68\xf7\x52\x4f\xf6\xd1\xd5\x99\x83\x54\x76\x5c\xc0\x47\x2d\xd1\x38\x44\x45\x39\x67\xe4\xce\xef\x5f\xad\x0e\x41\x53\xba\x95\xe4\x54\x05\x82\x84\x9d\x87\x65\x93\xe5\x14\x1c\x2b\x3c\xc7\xa6\x7c\xa9\xb2\x1e\x97\x4a\xf0\xac\x7d\xab\x5c\x11\x21\xbf\xbd\x95\xb0\xfe\x8a\x2f\xe9\x06\xbc\x60\xde\x28\x98\x23\x8a\xe7\x83\x22\xb9\x9f\x27\xf0\x3c\xde\x7b\x73\xaf\x24\xdb\xbb\x84\xb6\x68\x76\xb3\x7e\x51\xdb\x3d\x94\x3a\x4f\x42\x8f\x42\xc2\xd2\xec\x7c\xf4\x3a\x1d\x4b\xea\x93\x65\x62\x53\xf8\xf1\x56\x1d\x38\x1c\x14\xe1\x1b\xc2\xd8\xc6\xe6\x3f\x4e\xf7\xe3\xcc\x8f\xf7\x6c\x8a\xee\x4d\xf8\x0d\xc8\xee\xaa\x2b\x74\x0e\x35\x5a\x19\xd3\x10\x8b\xc7\x7c\x75\x40\xf4\xbb\xca\xe5\x22\xa0\x80\xf0\xb7\xca\x1a\x9c\x79\x27\x40\xd1\xf3\x56\x9c\xbc\x42\x11\x5b\x30\x96\x62\x2c\x60\x56\xcf\xbf\xac\x44\xe7\xec\xef\xcf\xc9\x94\x51\x5d\x95\xe8\xfd\x23\x8c\x94\x93\x39\x01\x0e\xd5\x4e\x25\x33\x87\x02\x29\x10\x4b\x99\x13\x25\x68\xa1\xe6\x52\x83\xea\x84\x16\x34\xe1\x3a\x20\xbc\x4c\x97\x34\x79\x80\x1a\xcb\x25\xb3\xb3\xed\x9a\x5a\x72\x6e\xa3\x18\x9a\x10\xd1\x8e\x7d\xd4\xf3\x52\x56\xb3\x39\x84\xe2\xe1\x5b\x49\x46\x15\xc6\x5c\x76\x19\xd9\x37\xf6\x6e\x15\x03\x8a\xa4\x4b\x41\x73\x9e\xf8\x4a\x53\xa5\x5c\x70\xc5\xa5\x35\x52\xc1\xa8\xdd\x8b\xa6\xe4\xd6\x97\x01\x42\xcb\xd8\x65\x46\x79\x4e\xce\x14\x63\xe4\xda\x5d\x12\xfc\xe5\x0e\x05\x04\x54\x77\x86\x38\x58\x35\x8d\x6a\x36\xf5\xb1\xcd\x9c\x62\x9e\x38\xd5\x6d\xc3\x8d\x21\x24\x21\x96\x85\xe7\x8d\xd3\xee\x2e\xf0\x6b\xc0\x78\xf3\x8a\x65\x09\xfe\x82\xae\x1a\x1e\x13\xa9\xac\xdd\x63\x3a\x7a\xbd\xb8\xbd\x51\x4d\xb5\x02\xde\x65\x5b\x60\x09\x7e\xb0\xe9\x96\x7d\x5e\x59\x8f\x09\x3a\x7a\x36\x04\x56\x40\x21\xe6\x05\x4f\x2b\x9a\x21\x69\x0d\x58\xe4\xe5\xdd\x0d\x0e\xcc\x67\x73\x3d\x7e\x64\xa0\x08\x46\x1e\xa8\xc6\x7d\x6e\xba\x7c\xcd\x69\x9b\x2b\x20\xc2\x01\x35\x98\xad\x62\x1a\x97\xfc\x48\x97\x90\x7f\xde\x3a\xff\xb6\xbc\x7d\x5c\x4d\x18\x1c\x60\x2a\xbb\xa8\x4c\xee\xe8\xb7\x05\xa1\xce\x65\x5f\x00\x4a\x49\xa8\x00\x66\x1c\x34\xfa\x06\x9e\x00\x6b\xac\xaf\xb9\xfb\xfe\x35\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xa7\xcc\x76\x00\x69\x6a\x51\x43\xec\x47\x96\x17\x19\xd5\x07\x71\xc0\xf9\x5b\xc3\xe4\xd0\xb0\x87\x1b\x24\x46\x45\x3a\xa6\x99\xb9\x2a\xb7\xdf\x5d\xda\x80\x57\x44\x3c\x91\x9e\x76\x1f\x1d\x11\x12\xbe\x96\xb2\x61\xc3\x37\xe2\x1c\xc8\x9e\x7a\xcf\x52\xa0\x20\x76\x6e\x61\x4e\xc2\xf2\x51\xb0\xd2\xc1\xde\xed\x77\x97\x23\xc2\x27\x6c\xe2\xfe\xf2\x9d\x39\xf2\xa8\xe5\x0c\x43\x67\x5c\x88\x5a\x88\x6d\x5d\xa6\x13\x5c\x4e\x53\xbf\xdf\xec\xfd\xc7\x3f\x99\x85\x9a\x5f\xff\x3c\xfe\x53\xa3\x76\xe1\x9f\x7f\x34\xf4\x38\xc8\x57\xf5\xc7\x95\xef\x9a\x31\x17\x40\xf4\xcc\x5f\x3f\xde\xda\xb2\xc5\xb6\xa8\xf1\x8f\x81\x4e\x15\x84\x30\xa1\xcb\xe5\x84\xdc\x4a\xf0\xc3\xe3\x29\x5e\x59\x98\x7f\xc9\xfe\xee\xcc\x42\x70\x5c\x5e\x83\x9e\x50\xcd\x04\x70\x25\x3b\x2b\x00\xd7\xcd\x66\x00\x80\x01\x00\x39\x51\xd8\xa5\x33\x50\xbd\x62\x3a\x9c\x11\xd1\x12\x93\xd3\x77\xe3\x72\xd3\x2e\x04\x61\x9f\xb8\x82\xec\x67\xb8\xe3\x70\x6c\xd4\x86\x84\x38\x46\xce\x0c\x6b\x20\xc1\xe7\xcc\x2b\x64\x88\xef\x06\xac\xff\xb7\x42\xea\xdf\xfa\xcb\xe0\x3c\x4a\x81\x63\x93\x84\x2e\x24\x77\x35\xb6\x0d\xe2\x11\x60\x64\x09\x4a\x34\x61\xcf\xf3\x7e\x49\x72\xae\x34\x7d\x60\x13\x72\x67\xd8\xb9\xa6\x93\x09\x9e\xb2\x20\x50\x0b\x8f\xa5\xa4\x12\x9a\x67\x81\x12\x9d\x9f\x0b\x6c\x4c\x83\xd5\x83\xd4\x12\x55\x62\x78\x92\xa2\x64\x63\xc7\x5a\xe2\x5b\x41\x7a\x17\x5b\xd5\xd3\xed\x49\xbd\xa7\x23\x0f\xfa\x73\x8a\x6a\x91\x22\x85\xce\xad\xa7\x76\xf0\x85\x5d\x8b\xa6\x30\xbb\x21\x45\x52\xb3\x8e\x70\xec\x6a\x42\xde\x03\x3f\x98\x85\x00\x39\x3a\x8d\xa1\x1e\xc8\x5a\xd9\x04\x4b\x98\x52\xb4\x5c\xa2\x13\x3b\xf7\xd5\xb5\x2b\xc5\xa6\x55\x06\xec\x72\xc8\x96\x50\x81\x95\xcc\x4b\x96\x48\xa1\x74\x59\x25\x70\x8e\x94\xdc\x97\xf2\x81\x89\x3a\x0c\x29\x08\x31\x36\x3d\xee\x6b\xd7\x66\xc3\xf6\x08\x49\x92\x39\x15\x33\xe6\x53\x80\x90\x9c\xa6\x00\x45\x5f\x79\x01\x2b\x64\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\xf7\x86\x23\x73\xf6\xc8\x90\xc9\x7e\xf0\x41\x00\x79\xc3\x78\x29\x78\xb6\x67\x47\xde\x18\x5b\xd5\x18\xf8\xef\x6e\xc1\x3d\xca\x36\x95\x33\x4d\x53\xaa\xe9\x21\xe3\x34\xde\x51\x5f\xc6\xdd\xfa\x42\xc1\xa1\x37\x7c\xa4\x2c\x9b\xe5\xa4\x42\x59\xf0\x66\x62\x97\xdb\xef\x2e\x03\x47\x02\x31\x10\xce\x19\xf2\x46\x6a\x73\x8f\xac\x79\x1e\x20\x0f\x43\x63\x5c\x2c\x86\x99\x84\x1b\x13\xc9\x01\x4b\x49\x5a\x45\x68\xfb\x6b\xa2\x12\x66\xcf\x8c\xb4\x66\x9a\xf3\x3e\xe4\xc1\x7c\xac\xdd\x84\x92\x76\x64\xc1\x46\x61\x02\x2d\xf0\x4c\x68\x5e\xb2\x46\x7a\x9f\xc0\xc1\xec\xa9\x56\x02\x6f\x7a\xfb\x7c\x11\x00\x66\x4c\xab\xda\x25\x19\xc9\x7f\x70\xff\xda\x32\x8e\x38\x4b\xe0\x65\xdd\x99\x5b\xfd\xdd\xc6\x45\x05\xf6\x8e\x70\xa3\xa4\x25\xf3\x86\xbd\x39\xc8\x91\xf7\xb1\x2d\xd3\xc4\x60\xfb\x77\x32\x8d\x31\x47\xf7\xf5\x3e\x68\x0d\x57\x87\xa7\x61\x54\xa4\x02\xe5\x33\xbe\x00\x0e\x31\xaa\x95\xdc\x08\x69\xd4\x9c\x2e\x22\x52\xa9\xf4\xd6\x78\xd6\x72\xce\xd8\x57\xe1\x85\x89\x8d\x61\x62\xe3\x2f\x82\xa7\x10\xe3\xc8\xeb\x5a\xb0\x43\x6f\x7b\x90\x48\xab\xeb\x93\x12\x41\xb8\x66\xd0\xff\x5d\xa4\xc5\xb5\x3f\xf4\xd4\xa3\x59\x66\xc0\x3a\x51\x79\x07\x3c\x1b\xec\xcf\xb8\x41\xdb\x31\x3b\xf8\xdb\x16\xdb\x6c\x05\x2d\xaf\x33\xc3\x70\xca\x33\xa7\x44\x9b\x58\x30\x71\x79\x2a\xdb\xaf\x9f\xf7\x1e\x16\x38\xff\xcd\x5a\x9c\x88\x3e\x6f\xac\x3f\xb1\x93\x41\x8d\xac\x57\x82\x0d\xcd\x85\xf1\x9b\x8b\x57\xca\x2c\x63\x25\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\x87\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\xa3\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x31\x57\xfd\x6f\x4e\x8d\x7b\x21\x96\xb8\x75\x57\x0d\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\xfb\xcc\xb0\x68\x0d\x90\xf2\x33\x5a\xe1\x25\xb4\x6c\xbc\xf5\x81\x4d\x63\xb6\x03\xf4\xcc\xcd\x8f\xc3\x46\x41\x66\xa4\xf5\xe1\xa4\xf6\xfd\xb6\xd2\x5b\x54\x92\x71\xd7\x2c\x74\xb4\x3a\x6b\xfb\x5b\xae\x8c\xdb\xcc\x7b\xb7\x71\xae\xe1\xa3\xf7\xf0\xc7\xea\xe3\x91\x05\xd9\xd3\x78\xa7\x2e\xab\xfd\x41\xa0\xbc\x8e\xad\x8f\x0b\x17\x78\xaa\x83\x2b\x68\x9c\x3f\x4e\x7f\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x67\x06\xff\xd4\x49\x21\x63\x20\x8a\x20\x54\x35\x47\xda\xe0\xc4\x5b\x5f\xef\xaf\xa0\xa8\xa9\x35\xed\xbb\x94\x14\x86\x4c\x5f\xdc\xde\xe0\xfc\x62\x47\x7f\x0b\xf8\x6d\x69\x99\x75\x3d\xe7\x65\x3a\x2e\x68\xa9\x97\xa8\xec\x1c\xb5\xe6\xe6\xa3\xea\xa3\x06\xe9\xe9\xd7\x14\x56\x06\xb9\xd9\x5a\xc7\x0d\x5b\xe5\x8c\xf7\xd6\x87\x63\xeb\x99\x1d\x63\x3d\xe1\x51\xf9\x1b\xd7\xd3\x2c\x62\xe9\x14\x83\xcf\xb8\x9e\xa7\x47\x1c\x90\x36\xae\x3c\x2e\x0f\x64\x90\xb3\x6a\x7b\x3d\x22\xa3\x02\xd2\x8f\x55\x20\xcb\x66\x70\xac\xe7\xa6\x41\xf7\x64\x7a\x1a\x11\x3e\x35\x44\x5a\x8a\x31\x58\xf7\x23\x26\x52\x1b\x33\x2d\xef\x3e\xb1\x0e\xf6\xa8\x2d\x82\x0b\xd9\x98\x4f\x63\x90\xfa\xa6\x93\x33\x21\x43\x94\x49\xae\x01\x9e\xc0\x5e\xcf\x31\xf6\x61\x8b\xe5\xea\x3e\x26\xe1\x24\xa9\xb9\x87\xa6\x9a\xa9\x81\xc1\x1c\x03\xc3\x45\x6a\x80\x14\x48\x22\x28\xa0\x54\x95\x24\x8c\x79\x15\xb0\xbd\xa4\x31\xac\x7b\x0b\x37\xda\x0d\xcb\xa9\x4e\xe6\x4c\x11\x25\x21\xab\xba\xd2\x34\xcb\x58\xea\xcd\x9a\x78\xa0\x12\xf8\x3a\x6b\xf2\x8c\x18\xb1\xc1\x18\xc6\x6c\x50\x43\x05\x67\x75\xe0\x45\x46\xad\xf2\x71\x5a\x89\x04\x7d\x86\xb9\x5e\x7a\xab\xd6\x2a\xb3\x0e\x7a\x1b\x05\x7a\xd6\x18\x86\x72\x8a\x76\xab\x86\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xd6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x0a\xce\x1a\x89\x3a\x46\xc8\x8d\x35\x59\x26\x71\xda\x74\x0a\xe2\xa2\x3f\x83\xd8\x5c\xdb\x59\x63\xcb\xd6\x18\xc7\x73\xcf\x30\x2a\xe6\xcb\x81\xab\x18\xae\x85\x58\x2f\x28\x5a\x69\x99\x53\xcd\x13\x50\xcf\xf2\x69\xc3\xc8\x9b\xfb\xa2\x7c\xde\xc9\x09\x89\x2a\x10\x75\xbb\xeb\xd1\xd7\x6a\x33\xb3\xf9\xa4\x6d\x6b\xec\x94\x3d\x8d\xf6\xa6\xb8\xa5\x36\x58\x8d\xe8\xb9\x7f\x74\x79\x53\x88\x9e\x97\x8c\x11\x9e\x1b\x31\x89\x0a\x4d\x52\x3e\xf5\xf9\x72\x9c\xcd\x7e\xd7\xd9\xc5\x49\xa2\x7f\x03\x7f\x90\x46\x7f\xa8\xea\xce\x32\xf9\xa8\x88\x7e\x94\x5e\xed\x56\xdb\x72\x6d\xbe\x94\x51\x7b\xd8\x28\x0a\x6a\xfb\x37\x68\xdb\x9c\x74\x03\xd3\x8e\xcc\xad\x7d\x64\x59\x66\xfe\xbf\x0b\xdf\x46\x44\x7a\x6d\x5c\x27\x9f\x09\x4c\xc4\xc1\x95\x53\xb3\xda\x78\xb2\xb3\xb4\x94\x45\x61\xcd\x40\xf9\xf9\x53\xd6\x09\xae\x4d\xe5\x82\x29\x70\xd3\x73\xd1\x6c\xe6\xc8\x66\x4c\xb0\x92\x6a\x30\x84\xdb\x0c\xda\x40\x1c\x57\xa7\x13\xae\xb6\xc4\xd6\x4b\x4e\xeb\x00\x03\x74\x5b\xd8\x7c\xec\xee\x1d\xfb\x6b\xd4\x5c\xb9\x40\x08\x70\x37\x36\xea\x48\xcf\xbe\x64\x9a\x9e\x93\x6f\x15\x1e\x94\xa7\x17\x3e\x4a\x30\x48\x3a\xb7\x59\x8e\x50\x40\x8f\x1a\xfe\x22\x2b\xe6\x8d\xf1\x9b\x52\xae\x0f\xb5\x6e\xef\x54\x6b\x66\x97\xa5\x54\xea\xbd\xfb\xe4\x20\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\xdd\x6d\x90\x80\x8f\xbd\x1e\xc0\x77\xc7\xbc\x93\xef\x9b\x0c\x61\x1b\x51\xef\x6d\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\x6e\x55\x7a\x52\xc0\xe9\x8f\x74\x39\x11\x4c\xdb\x3c\x74\x4e\xb7\xff\xc1\x8d\xfe\xd7\xd2\x70\x7e\x56\x40\x6b\xdc\x22\x77\x81\x5d\x12\xc1\xc6\x28\x5a\x22\x29\xae\xbd\x6f\xe0\xf9\xa9\xb2\x1e\x1d\xe6\x77\x08\xb6\x27\xad\x92\x2c\x13\x72\x67\xbd\x05\x57\x06\x5f\x4f\x15\x96\x32\x4d\x79\x58\x1e\xca\x66\x73\x94\xf2\xe3\x16\x1a\x7d\x04\x4a\x48\xfa\x81\xac\x0f\xdd\x3c\x86\xaa\xa5\x0e\x81\x6e\x78\xc4\x37\xa3\x4a\xea\x17\x9e\x6e\xa9\xbc\x99\x92\x0f\x2c\x91\x0b\x56\xe2\x7e\x5f\x7f\x2a\xa8\x30\x62\xfa\x5b\xca\x33\xb3\xdb\x6e\xd7\x6b\xeb\x05\x14\x41\x6e\xbb\x25\x34\x8c\x60\xfe\x1a\xd9\xa3\x35\x90\x13\xc3\x0c\xfa\x9c\x77\xa6\x67\xeb\xa7\x5b\x94\x6c\xc1\x65\xa5\x5c\x3c\x4d\xa5\x91\x8e\x29\x6d\x65\xd3\x39\x9f\xcd\xdd\xcb\xce\xcf\x1c\x3c\x80\xca\xd4\x5f\x95\x88\x39\x28\x4d\x75\xa5\xda\x89\x72\x12\x70\x27\x78\x16\x1b\xb0\x3f\xef\xc3\x32\x7c\xfd\x98\x2b\x8c\x3f\x3a\x26\x1a\xff\x1a\x23\x9e\xb0\x93\x7b\x7b\x0b\x5c\x98\x56\x1d\x66\x96\xc8\xbc\xa8\x34\x6b\xdc\x16\x0b\xad\xb1\x68\x2b\xf2\x20\x5b\x79\x2f\x5f\xe5\x54\xd0\x19\x1b\xfb\x49\x8c\xeb\x08\xad\x57\x3d\xb0\x56\xe4\x91\x92\x27\x24\x5e\x6c\xb6\x17\x1c\x59\xb5\xb2\xd8\xf8\xc8\x73\xf2\xc4\xe8\x73\xf2\x94\x08\x74\xb2\xcf\x28\x74\xe2\x53\x59\x1c\xf3\x3a\x7e\xb0\x63\xae\x5e\x48\x4b\xac\x76\x5d\xc8\x7e\x22\x81\x25\x5a\x76\x54\xae\x88\xcc\xb9\xd6\xcc\x39\x32\xfb\x0b\x36\x22\x5c\xb7\x32\x2d\x58\xc4\x01\x4a\x73\xf4\x46\x66\x9f\x7c\x59\xed\x9a\x31\x8b\x9c\x0c\x08\x3f\x8f\x5c\x21\xe3\x25\x08\xcf\x0b\x2c\xcc\x02\x08\x60\x6c\xe3\x24\x9d\x6a\xd8\xcf\x3b\x01\x5f\x42\xc2\x3e\x81\x22\x1f\xa7\x36\x60\xa6\x01\x33\xad\xb4\x5f\x02\x66\xc2\x2c\x16\x31\x49\x56\x5a\x18\xc9\x7d\x6e\x73\x5c\xd2\x7b\x96\x91\x9f\x2a\x56\x2e\x89\x61\x5b\xeb\x48\x2f\xa8\x06\xae\x78\x8a\x31\x4d\xce\x6a\x76\x60\x2d\x59\x3f\xa6\x09\x2c\x6d\xd7\x9f\x0c\x77\x0f\x39\xdb\x9e\x80\xaf\x57\xbb\x6a\x67\x02\xc5\xdd\xf2\x3b\xd8\xe4\xc9\xd1\xe9\xb4\xf9\x04\xd8\xee\x8b\xf7\x57\xfd\x04\xaa\x38\x67\x43\xd2\xc7\xe1\x70\x6d\xf1\xd1\xc4\x8a\x90\x8b\x1d\x7b\x82\x7b\xe7\x7f\x01\x2a\xe1\xdd\x45\xbd\xce\x9e\x3c\xb0\xe5\xc8\xba\x83\x13\x73\xfa\xd4\xbd\x1c\x3d\x19\x8c\x0b\xa9\xab\x16\x9a\x4e\x43\xb3\x6f\xb7\x5b\x6f\x24\xdc\x4f\xd1\x8b\x2d\xbc\x5c\x64\xfb\x2b\xb7\x69\xb1\xb8\xbe\x37\x95\x88\x2a\x2b\xd9\x6c\xdb\x4a\x4c\x22\x0c\x41\x3d\x38\x97\x1b\xc1\x83\x0d\x64\x9d\x00\x84\x14\x7b\x88\xa4\xbf\x42\x0d\x9b\xdb\xd8\x27\x2f\xb5\xc7\xc5\x6a\x8e\xdf\x8e\xe5\x7f\x60\xcb\x53\x65\x93\xde\x49\xa1\xe6\xbc\xc0\x12\xa8\x8a\x01\x8e\xea\x07\xf0\xd8\xbe\x03\xd7\x76\x37\x2c\x62\xb0\x1b\x31\x22\xef\xa5\x36\xff\xbb\x86\xd0\x24\xb8\x56\x57\x92\xa9\xf7\x52\xc3\x93\xa3\x9f\x0b\x2e\xf1\xb9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x6e\x04\x91\xa5\xdd\xca\x5e\x03\x6b\x57\x44\x59\xd9\x61\x9d\xf5\xa1\x36\xea\x6f\x1a\xd7\x9e\x9a\x2c\x5b\x87\xb6\xe7\x29\xd8\xe1\x41\x17\x89\xbf\x80\x76\x15\xbc\x4b\x5c\x48\x0d\x96\xed\xa5\x9a\xcd\xa2\x5c\x5d\xea\x96\xb3\x72\x06\x59\x1e\x93\x88\x82\x8f\x8d\xc9\xf7\x24\xac\xd8\x7a\x91\xd7\xe6\xc0\x3d\x81\x7d\x4f\x3e\xfe\x7b\xee\x0a\xf8\xa4\xaf\x21\x94\xeb\x98\xd2\x71\x63\x58\xe4\x2e\x72\x5a\x98\xdb\xf7\x5f\x86\x89\x00\xc0\xfc\x6f\xa8\x99\xae\x26\xe4\x82\x28\x2e\x66\x19\x6b\xfd\x66\xd5\xfc\x8d\x6e\xa2\x27\x00\xd6\x37\x43\xe3\x17\x34\x63\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x9d\x3c\xb0\xe5\xc9\x28\x52\x91\x4a\x9a\x34\xc1\x74\x72\x23\x4e\xea\x94\xb4\xad\x7b\xe9\xf9\x2c\xf0\x37\x38\x81\xdf\x4e\xf6\xcd\xa3\x3e\x93\x90\xfa\x6c\x6e\xa2\x56\xa9\x7c\x99\x51\x34\xac\x1c\xc3\x7c\xb1\x3a\xe6\xa6\xa2\x84\x77\x8d\x77\x6a\x93\x96\x8d\x5e\x7e\x46\x4d\x3b\x64\x84\x89\x0e\xb3\x8a\x3a\xd8\xd5\x32\x40\x47\x3d\x9b\xad\x83\x37\x82\xad\x7d\x4e\x71\x73\x16\xdf\x6d\xfa\xa0\x11\x6b\xce\x55\xfc\x71\xdd\x4c\x57\x7d\x14\x1a\xe9\x4e\x9a\x51\x3c\xb2\xb4\x51\xeb\x6b\x3e\xc4\x50\x21\xb1\xae\xa4\x14\x5a\x3b\xb5\x6e\xb5\xfb\x43\xc9\x54\x21\xd1\xbf\x76\xe3\x62\x2d\x8b\x30\xa7\x0a\x7c\xb2\xa6\xd6\xdc\x5a\x54\x65\x21\x95\x2d\x6f\xb7\x0a\xf2\x91\x91\x4b\x36\x9c\xcc\x05\x99\x62\x18\xb8\xbf\x09\xe6\xfe\xf8\xbc\xd4\x17\x2b\x39\x09\xd1\x20\xd6\xc8\xd2\x26\xe4\xe6\x65\x44\xcc\xc8\x39\x7c\xa2\x1c\xe3\x33\x63\xe1\x64\x30\x36\xff\x14\x5d\x4d\x1a\xe6\x3f\xc3\xed\xeb\xa6\xf7\x95\x96\xed\x99\x42\xca\x00\x4c\x1e\x17\x91\x6c\x9c\x20\xbc\x54\xa2\x76\x63\x71\xd4\x63\xb3\x4b\x20\xe4\xa6\xbb\x97\x95\xb0\xa0\xe5\xb2\xda\xed\x6b\x53\xcc\x2a\x5d\x96\x05\x3f\x01\x0b\x9a\x8d\x00\x37\x3e\x35\x6b\xb5\x99\x11\xe2\xd6\xda\xf2\x0f\x02\xeb\x7c\x69\x8b\xf0\x2d\x37\xdf\x5f\x92\x4a\x86\xe7\x01\xe3\x8d\xf0\x14\x36\x6f\x8f\x5d\x46\x0c\x3a\x47\x0f\x57\x4a\x6e\x19\xde\x12\xa5\xa9\x66\x23\xac\xf1\x3a\xcd\x1a\x75\x80\x18\xc9\x65\xca\xa7\xd6\xcf\xee\xae\x61\x43\x1d\x61\xba\x0c\x9b\xeb\xa2\x99\x06\x3c\x62\x22\xf1\x9b\xf9\xa4\xbc\x83\xe3\x1a\xbf\x8c\x81\x2c\xb0\x28\xb5\x78\x90\x53\xe2\x66\xec\xba\xdd\xcf\x81\x9c\xc9\xe9\xb4\x51\xf2\x2a\xa0\x0a\x9e\x6b\xbd\x29\x55\x58\x65\x31\xd7\x9e\x4a\x9a\xa0\xcc\x82\x4b\xbd\xd7\x4a\x22\x5b\xc7\x7d\x3c\x99\x5f\xf8\x0e\x90\xa6\x9c\x92\xb7\x75\x2d\x5c\xae\xc0\x70\xc3\x5d\x62\x3e\x73\x9d\xb8\x48\xb2\xca\x3a\x10\x20\xf6\x33\x58\xe8\x08\x7b\xfe\x04\x76\xa0\xee\xc0\xf1\x5d\x2e\x7a\x64\x2d\x91\xcb\x2a\x86\x80\x90\x05\x0f\xae\x91\xbb\x1a\xb8\xd6\x69\x47\x72\x88\xd6\x5a\xa6\x49\x5b\x8f\xf4\x96\xdf\x97\x8c\x5c\xce\xa9\x10\x2c\x6b\xe4\xc9\xb6\xc6\x3c\xaa\x35\x4d\xe6\x88\x2b\x29\x31\x37\x3d\x63\x86\x52\xcd\xa5\xd2\x24\xa7\xc9\x9c\x0b\x9f\x44\x55\xf8\xac\xec\x75\x56\x9b\xa3\xa7\x10\x3b\x78\xf5\x6a\x0b\x01\xcd\x92\xcf\xad\xa2\xd6\x01\x3d\xf9\x64\xc8\x6b\xbd\xd4\xf5\x22\xed\x3d\x84\x7d\x46\x69\x0f\xe8\x04\xbc\x1b\x32\xc6\xf6\xd2\xda\xe4\x26\xf7\x06\x5a\x2e\x1a\xa4\x90\xd9\x0f\x0c\xa1\x6d\x30\x07\x7b\xad\x64\x9d\x55\x01\xb5\x9d\xda\x59\xdc\xb3\x4a\x98\x4d\xaf\xab\xf5\xbc\xbd\x24\x9a\x96\x33\xa6\x4d\x6f\x44\x54\xf9\x3d\x2b\xbb\xd3\xb9\x1f\xae\xc0\xdc\x51\xea\xc1\xb6\x76\xa0\xa3\x8c\x2b\xf9\xe0\xbe\x82\xb0\x17\xe0\x4f\xa6\x32\x8c\x33\x40\x5f\x45\x57\x84\x16\x4b\x10\x1a\x5c\xfd\x9d\x25\x25\x95\x08\xe1\x17\x62\xea\xc4\xe2\x59\xfe\xed\x6f\xef\x63\x8b\xf4\x9d\xd6\x5f\x6e\x03\x90\x47\x59\x66\xe9\x23\x4f\xad\x5b\x2a\x39\x33\x2f\x9f\x87\x02\xcb\x9e\x6b\xf6\xf5\x4f\x29\x1c\xab\xa3\x7b\x7c\xe4\xe9\x41\xea\xed\x42\xc7\xed\x9d\x76\x22\xa4\xd9\x69\x02\x5b\xcd\x53\x26\xb4\x41\x1d\xa5\x22\x67\xf0\x45\x48\xce\x8b\x6b\x8e\x99\x09\x61\x04\xa8\x0a\x94\xdf\x73\x51\x27\xd7\xac\xcf\xda\x90\x1b\x73\xf3\x9d\xd6\x59\x31\x8d\xf9\xcd\x20\xb3\x81\xd4\x73\xa2\x78\x5e\x65\x9a\x0a\x26\x2b\x15\x5e\x8a\xff\xb3\x3c\xee\x69\xc6\x3e\xe1\xdd\xdc\x67\x02\xe9\xba\xd7\x36\xb7\x00\x71\x55\x75\x56\xde\x55\x76\xa1\xa3\xd7\x3a\x5c\x35\x7d\xe5\x19\x0b\x9f\x5d\x90\x7d\x62\x89\xcd\x2b\x52\x64\xd5\x8c\x77\xe6\xd2\xba\x32\x33\x4b\x8c\x0c\xff\x86\xbc\xad\x27\x0c\x51\xcc\xee\x17\x2c\xd5\x0c\xfe\x0b\x76\x20\x72\x79\x77\x73\x65\xd3\xc0\x0a\xa5\x19\xdd\x17\x8f\x12\x6a\xf2\x1d\x5b\xb5\xcc\x9e\x18\x1e\xec\x2c\xf2\xb2\xd7\x79\x70\x57\xb5\x88\xf6\x17\x5b\xf3\xc1\xd7\x0f\x08\x4d\x7c\x1a\x01\xf4\x03\xa7\x86\x6d\x07\xa7\xd6\x2c\x21\xd0\x98\x40\xca\x0a\x26\x52\x28\x4a\xd8\x80\x7b\xdc\xa5\xbd\x1e\x91\x2d\xa0\x17\x4b\x97\x5d\xdd\xbd\x16\x51\x6e\xc8\xeb\x73\x99\xa5\x8a\xb0\x4f\xba\xa4\x06\xcd\xe7\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x40\xf5\xd3\x97\x54\x28\x9d\x3c\x0b\x17\x98\xfe\x92\xb8\x40\xc5\x92\x92\xe9\xa0\x00\xeb\x1e\xe5\x53\x5c\xe7\xed\x0d\x6c\x3d\x5e\x13\xe5\xf1\x57\x17\x26\x54\xd7\x48\x0e\x1a\x4f\x28\x0e\xc5\x08\x57\x2a\x2f\x17\x54\x29\x2f\x1d\x03\x91\xb3\xd7\x56\xb5\x32\x6e\x04\x0c\x81\x7a\x60\x3e\x25\x42\xae\xcc\xb4\x19\x10\xe5\x5d\x01\x5a\xaf\x04\x74\xef\x2d\x87\x39\x16\x64\xa0\x02\x52\x0b\x60\x37\x23\x88\xb7\xc6\x7f\xa3\xf1\xd0\xac\xab\x21\xf7\xc3\xca\x42\xf6\xc9\xae\x7d\xbf\x97\x3d\xce\xa5\x29\x3c\x0a\xb0\x9f\x1e\xee\x7d\x83\xb8\xba\xc0\xb2\x50\x15\x50\x3b\x57\x2e\x83\x0a\xa6\x7c\xc1\x20\x13\xaf\x4b\x4c\x6b\x18\xdf\xb4\x42\xa5\xa6\x4b\x8f\xd1\x4e\x7a\x11\x1e\xe4\xde\xb0\x3d\xd4\xde\x1c\x37\x42\x69\x0a\xf9\x11\x60\x15\x86\xaa\x1a\x02\x68\x73\x1e\x5b\x40\x44\x9b\x89\xcb\xb2\x10\x3c\x5c\x6e\x88\x66\xc2\x4a\x03\x6b\xd9\x92\x3c\x96\x32\xdc\xb9\x34\x52\x13\x2d\x17\xac\x5c\x70\xf6\xf8\xca\x46\x05\x8e\xcd\x02\xc6\x36\xb0\xfe\x15\x88\x87\xaf\x7e\x0d\xff\x0b\x1a\x3f\x5a\x0f\x69\xb1\xf5\x1b\x72\xd2\x5d\x9a\xb0\xaf\x99\x7a\x0a\x89\xb4\xf7\x5a\xfd\xcd\x76\xb9\xa2\x34\xb4\x0f\xad\x18\x10\xa2\x24\xb4\xf8\xad\xc1\xba\x98\x0b\xe1\x3a\xb2\x56\x1e\xa2\xcc\x19\xd5\xe1\xa2\x95\x10\x01\xde\xc6\x6d\x39\x00\x3b\x6c\x09\x01\xde\xbc\xc5\xc5\x58\x97\x8c\xf9\x45\x69\xcb\x26\x0a\xe9\x4a\x58\x04\x16\x26\x3d\x80\xe2\x32\xa5\x9a\x2a\xa6\xc3\xd4\xd4\xf1\xa8\xa8\xd1\xbd\x59\x71\x13\x2b\xd9\x9f\xc0\xe2\xca\x20\xaf\x8f\xcb\x06\x4d\xc6\x7f\xb6\xc2\x81\x68\xbd\x69\xc4\x02\xbb\xd3\x21\x58\x7e\xee\xca\x78\x39\x5f\x72\x1c\xa5\x3e\xa0\x7d\xf2\xac\x76\x8e\xdf\x7e\x7b\x73\x15\x2b\x14\xd5\x5f\x3a\xd9\x01\xfe\xdd\xde\x26\x0b\xc8\x60\x13\xe5\x3f\x55\x4d\x75\x07\xd4\x33\xf1\x20\x68\xdf\xdf\xd7\xda\x66\x09\xab\x8d\x0b\x57\x5c\x3d\xec\xf3\x96\xaf\x75\xde\xbe\xef\x7f\xbd\xbc\x26\xf6\xe9\x2e\xfb\x40\xc7\x20\xfb\xb6\x1e\xb4\x6f\xfe\x5f\x2f\xaf\x57\x96\xb0\xa2\x08\xb8\xc8\x32\x27\x9f\x19\x41\xc3\xa5\x8d\xb0\x38\x21\x7a\x83\x00\x77\x18\xde\xa7\x64\x58\x6b\xb1\x31\xf3\x74\x92\x28\xee\x53\xcb\xce\x1e\xd8\x84\xcb\x86\x43\xc6\x81\x6b\x61\xce\x12\x56\x9b\xd1\x53\xae\x1e\x8e\xad\xdf\x28\xd2\xf7\x5d\x09\x48\x5e\x96\x41\x67\x55\xb8\x77\x65\x92\x1a\xf5\xd2\x96\xb2\x22\x8f\xb6\x32\x44\xb0\xfa\xe0\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x3e\xed\xab\x83\x19\x7e\x7d\x8f\xca\x04\x28\x34\xa2\xde\x1c\xcd\xf8\x73\x64\x70\x25\x71\xd4\xa0\xa0\xa5\x06\xc9\xff\x10\x00\xe4\x3b\x77\xe4\xa2\xf1\x40\xec\x07\x82\x6e\xa6\x2e\x12\xb3\xed\x7a\xc3\x95\xef\xa6\xf6\x61\x01\x5a\x1d\x07\x25\x6f\x7d\x59\x2f\xf2\x2a\x65\x8b\x57\x2a\xa5\x5f\x8c\x60\xaa\x2e\xf7\x40\x7b\x5d\x54\x91\x93\x2f\x4e\x42\xc6\xb8\xe3\x39\xcf\x68\x99\x61\x66\x3f\x9f\xf0\xd0\xf7\x64\xf0\xaf\x1b\x12\xdc\x58\x5f\x9f\x90\x33\x59\xc2\xd8\x09\x15\x24\x63\x2e\x0b\xa0\xc5\x15\x4b\x14\x35\x82\xfc\x33\x9e\x09\x24\x0f\x61\x5d\x44\x64\x7a\x10\xf0\x4d\x1d\x37\x68\x39\x99\x56\x81\xa7\xab\x9a\xd8\x73\x61\xa8\xeb\x84\x7c\x6b\xa9\xb3\xe5\x78\x10\x36\x52\x20\xb5\xf8\xc6\xcb\x3d\x99\x97\xa3\xc2\x5b\x51\xc6\xed\x49\xd5\x46\xd6\x6d\xc2\x2f\xf8\x34\xba\x55\x82\x33\xae\x3f\xb0\x42\xee\x95\xc7\xc5\x2e\x57\x0c\x5a\x5c\x9b\x07\x52\x71\xa8\x60\x4e\x35\xa1\x88\xa3\x92\x2a\xa3\x46\xea\x45\x83\x55\x14\x23\x6a\xc7\x59\x61\x3f\x3f\x36\x6b\xc9\x35\x22\xea\xad\x22\xc5\xcf\x64\x64\xb1\x7a\xa7\xc6\xd4\x57\x49\x86\x02\x2a\x54\x90\x1b\xc1\xf5\xa5\xef\x16\x03\x2d\x33\x29\xac\x5f\x9c\xe9\xdb\xda\xc0\x66\x5c\xdb\xf4\xf0\x38\x94\xf9\xd9\xf5\xd6\x31\x68\x5d\xac\x05\xaa\xbb\xfb\x55\x1c\xdd\x86\x56\x1f\xda\xbe\xe4\x6f\x57\x30\xfd\x20\xd2\xb7\xaf\x91\xef\x12\xa0\xa1\x7f\x42\xfd\x3c\x94\x74\xbf\x73\x75\xa8\x5c\x25\x25\x59\x62\x9d\x5c\x84\xa3\xd3\xc9\xe4\x74\x02\x6c\xc3\xe9\xe4\xd4\xb1\x96\x99\x77\x0a\xb7\x54\xb8\x1e\x36\xae\xdc\x60\xfb\xb6\x4c\x08\xf9\xc6\xe5\x69\x80\xe4\xd3\x2b\x1e\xe8\xde\xb9\xbc\xae\xa1\x8d\x69\xfb\xda\x77\x2e\x48\x53\x0c\x3a\xec\xea\xbe\x39\x71\xeb\xb2\x3e\xe3\x0b\x9b\x97\x76\xaf\xa6\xaf\x7a\x82\x91\xf0\xd0\x5c\x99\x55\x22\x7c\xf8\x7a\xbf\x33\x43\x24\x12\x3d\x2f\x8b\x7b\xec\xac\x12\x99\xe7\x58\x16\x6d\xee\x65\xe1\xda\x21\x3c\x14\xf1\x85\xab\x2f\xb0\x44\xdc\xb4\xe3\x1e\x46\xa2\x74\xd7\xe9\x8a\xba\xc2\x3f\xb6\x79\x52\x44\x2d\x54\x01\x5a\x54\x73\x5a\x32\x85\xa5\xdc\x6d\xe1\xea\xee\x7a\xa7\x2b\x58\xde\x8f\xb1\x5b\xd5\x58\x4f\xb1\xb7\xb2\x71\x23\x99\xb6\x15\x25\x95\x4b\x6e\x67\x49\xf2\x2b\x3f\xde\xab\x0f\xd7\x17\x57\xef\xae\x27\xf9\x6e\xed\xda\x01\x50\x33\x13\x69\x21\x79\x77\x86\xb2\x31\x29\xa8\xde\x9d\x3f\x3c\x1c\x7d\xfb\x41\x0f\x81\xbe\x7d\xe7\xee\xf2\xb8\x07\x8d\x3a\x9c\x36\x7f\x5f\x03\x30\xb4\x2c\x64\x26\x67\x41\x89\xaa\x9f\x76\xc2\xbf\xc6\x58\x96\x31\x1d\x87\x54\xfe\x8c\x12\x9f\xf5\xfc\x30\x92\xb3\x9e\xbb\xbd\xac\x37\xcc\xcb\x88\x3a\x28\xb2\xf7\x85\xee\xd9\xb3\x49\x11\x6b\x1b\x89\x7a\x1d\xc0\x81\xae\x48\x69\x5d\x6f\xb3\x60\x65\xce\x31\x36\xf5\x98\xe2\xc5\x81\x4f\xa8\x5b\xb2\x30\x54\xe0\xb6\x13\xac\xe3\x8e\xc6\xf5\xd9\x26\x43\x45\xc9\xc6\xbe\x20\xd8\x94\x67\x10\x7c\x57\x73\x30\x0d\xaa\xd4\xd1\xbd\xd3\x94\x3b\xa5\x3b\xf6\x91\x2d\x57\x35\xe6\x35\x37\xee\x6d\x14\x98\x08\xbd\xbb\x80\xac\xaf\xfe\x6b\x35\x93\x74\x86\x05\xbd\x4a\x9b\x87\xb8\x28\xf9\x82\x67\x6c\x06\xa5\xd0\xb9\x98\xa9\x3a\xa7\xa4\x35\x1a\x77\x0c\x00\xf1\x8f\xac\xa6\xc3\xde\x2c\xf8\x0e\x4c\xc0\x3e\x4d\x16\x02\xf5\xfb\x6f\x3e\x12\xc1\x70\xb0\x4e\xf0\x7c\xa2\x10\x6b\xa6\xd3\x49\x88\x0e\xa1\x25\xdf\x1f\xf1\x3b\x28\x9a\x76\xe6\xaf\x4d\x80\x1b\xa8\xc2\x44\x1d\x22\xa2\x7c\x4a\xd4\x32\xcf\xb8\x78\x18\xf9\x02\x73\x53\x69\x53\xeb\x32\x62\x7e\x70\xe0\x5c\x32\x9a\x3d\x85\x18\xec\x1d\x08\x48\x1c\x21\xd0\x07\xb2\x5b\x00\x23\x69\xee\xea\xbf\x3a\xb4\x83\xba\xa2\x48\x2c\x1e\xe0\x87\xf0\xe2\xb6\x95\xe7\x74\xb6\x57\x47\x67\xe8\xb0\x85\xb6\x05\xf9\xe6\xf2\xc6\xd7\x89\x6c\x2a\x6a\xf0\x5d\x59\x12\x5a\x6a\x3e\xa5\x89\x3e\x27\x45\x05\xd5\x7c\xa0\x36\x89\x25\xb3\xf6\x76\x6c\xf1\x82\xe8\x98\xce\xc7\x5a\x6c\x06\x97\x34\x25\xb3\x85\xe9\x5f\x43\x51\x70\x90\xf3\xab\xc2\x3a\x51\x60\x00\xb0\x2d\x0e\x75\x5b\x65\xd9\xad\xcc\x78\xb2\xf4\x85\x2d\x50\xdd\x94\x1a\x54\xd4\x89\x8b\x2e\xb2\x47\xba\x54\x6f\x9a\x33\x27\x14\x9e\x11\xaa\x35\xcb\x0b\x04\x19\xb3\xdc\xd5\x04\xd7\xb5\xc6\x09\x0b\x2e\xbb\xc2\xfa\x53\xca\x33\x7f\xf7\x2b\xfb\xa0\x13\x97\x8f\xc9\x7b\xb6\x60\x65\x7b\x26\xc2\x3c\x82\x4e\x54\x7b\x74\xd8\x78\xe0\x66\x2a\x05\xf2\x1c\xd6\xd2\x58\x3b\xa8\x8e\x59\xf2\xe9\x4a\xb7\x58\x87\xc6\xc2\x44\xf7\x94\x6f\xa6\xef\xa5\xbe\xc5\xb7\xdb\x33\xc7\x39\x6f\xe9\x9f\x66\x86\x1b\x5b\xba\x71\xcc\x61\xa6\x5c\x3d\x3c\x69\xb2\x5e\xfe\x6c\x6e\x79\x38\xd0\x41\xe5\xe5\x12\x13\x58\x02\xe4\xd9\xd1\x0c\xf4\xc1\x6f\xa9\x59\x96\x85\xf8\x92\xd9\x10\xfa\x91\x05\xc2\x66\xc8\x3c\x7b\x84\x8a\xfc\xba\xae\x10\x6d\x55\x4d\x89\xcc\x19\xa1\x0b\xca\x33\x7a\x9f\x81\x67\x89\xe9\xdc\xf6\x15\xa0\x71\xb8\x80\x55\x81\x45\x55\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x36\xd4\xbc\x36\x38\x81\x4c\x26\x0f\x4d\x7e\x03\x2a\x9a\xc1\x2b\x18\x87\x90\x82\x0f\x26\x4d\x53\xa2\xf8\x4c\x40\x49\x6c\xa1\x49\x46\x35\x13\xc9\x72\x42\x6c\x0a\x6f\xd5\xa8\x18\xae\x4b\xee\xe3\x18\x04\xd4\xeb\xaf\xab\xa4\x26\x0f\x72\x3a\x5d\xa9\x30\x6e\x4d\xbd\x16\x51\xe0\xea\xa9\x92\x02\x07\x67\x4a\xd1\x59\x10\xa2\x58\x2d\x19\x84\x3b\x6f\x93\x4e\x38\x74\xe4\x32\x4a\x38\x57\xad\xd2\x85\x02\xd7\xa1\xbe\x1e\xda\xca\x4a\x68\x9e\xb3\x95\x6c\xab\x04\xf4\xd5\x6b\x2e\x1b\x66\x28\x9b\x8e\x16\x02\x71\x6c\x60\xaf\x2b\xc5\xc3\x53\x3b\xbf\x35\xdb\xf6\x2a\x42\x05\xff\xc6\x90\xf5\x36\xf0\x32\xc0\xa2\x5b\x22\x14\xf5\xb6\x69\x7e\x6a\x2e\xe5\x0c\xe2\x8a\xeb\x83\xfe\xfe\xb7\x3f\x4c\x16\x4d\x9b\x0a\x7c\x6e\xc8\xe7\xb9\x99\x59\xce\xca\x99\xab\x35\x93\x53\xc1\xa7\x4c\x99\x53\x5f\x1a\x10\xb1\x7a\x4b\x28\x46\xf5\x68\x80\x03\xbd\x47\x56\x16\xd2\x89\xdb\x3e\xae\xe8\x44\x1b\xa7\x54\x8b\x65\x67\xa5\x3c\x87\xfd\x85\x74\x5e\x9f\x58\x52\x69\xb8\x27\xe0\x35\x40\xce\x84\x34\xcf\x3a\x6d\xa0\x77\xd5\x3d\x32\x5c\x30\xc0\xca\x74\x5d\xe5\x35\xdd\x38\x9b\xce\xdd\x52\xd5\x7d\x81\x7b\xc5\xa6\x86\x27\xf8\x62\xf2\x4f\xff\x14\xb2\x60\xf4\x5e\x85\xde\x15\x4b\xaa\x92\xeb\xa5\x41\x6f\xec\x93\x9e\x4c\x15\xd4\x31\xb9\x84\x14\x1d\x96\x78\xcd\x29\x28\xc8\xd0\xd5\x15\xaf\x48\x0d\xbc\x06\xa0\x8e\xee\x97\x57\x78\xca\x7a\x08\x5e\xce\x2e\x7b\x6a\x11\x98\x81\xc0\x1a\xcc\xd5\x84\xdc\x4a\xa5\xb8\x39\x7f\x9f\xd7\x29\xc8\x59\xf9\xc5\xd0\x73\xd3\x3e\x3b\x8a\x4e\x40\x6a\x79\xd9\x34\xbd\x7b\x05\x4d\x5e\x1f\xe1\xc1\x8c\xf3\x06\x92\xa3\x6a\xa2\xe9\x6c\xa5\x74\x8a\x2c\x5b\x8b\xae\x73\x70\xef\xd9\xae\x62\xd7\x78\x88\xdb\xf4\xc1\x09\xdf\xe4\x66\x15\x60\xda\xf1\x1d\x36\x2b\x53\xc8\x36\x7e\xc9\xe6\x74\xc1\x36\x12\x81\x42\xa6\x93\x0d\x78\x13\x80\x35\xa4\x6b\xc3\xb4\xfb\x30\x0a\x9f\x21\x48\x29\x96\x43\x62\x92\x2d\x64\x67\x13\x0d\xbd\x5f\x92\x4c\x4a\x48\x34\x51\x15\x44\xc8\x94\x19\x30\x03\x37\x0d\x9a\xa9\x11\xb9\xbb\xb0\x2f\x16\x8d\x21\x31\x69\x1c\x70\x48\x05\x4b\x36\xbc\x70\x00\xb9\xbb\x91\x0f\x1d\x89\x66\x88\x17\x5d\x2b\x0a\x42\xda\xf0\x9d\xba\x24\x8f\x2d\x54\x92\xb1\x05\x03\x43\xe3\x94\xcf\x08\x26\x62\xcf\x6d\x6a\x3e\xe7\x35\x25\x4b\x48\x6f\x5d\xf2\x34\x44\x58\x5e\xa5\xef\xe6\x40\x1e\x65\xf9\x90\x49\x9a\x36\xf2\x12\x29\x92\xf1\x07\x46\xae\x58\x91\xc9\xa5\xcd\xa7\x27\x52\x72\xa7\xa9\x66\xd3\x2a\xbb\x0b\xda\xc8\x50\xf9\x57\x25\x8a\xef\x55\xfe\x35\x1d\xae\xc8\xbf\x37\x77\x97\x77\x37\x2f\xd2\xdf\x37\x42\x9f\x0c\x0b\x7b\x3e\x1b\x18\xff\xa9\xcb\xaa\x3d\x26\x59\xd5\xfd\x0e\xfa\x09\xdc\xca\x52\xd3\x6c\x4f\x0c\x4d\x32\xa7\xc5\x45\xa5\xe7\x57\x5c\x41\x8d\xa2\x58\xbe\x66\xed\xfb\x46\x6e\x21\x06\xca\x62\xcb\x56\x12\xee\x00\xc9\xbe\x77\xf9\xaf\x17\xb7\x84\x56\xe6\xf0\x35\x4f\x80\x08\xee\x4d\xad\xdf\x5c\xd9\x1d\xe6\xdc\xec\xb9\x2e\xfb\x75\xc7\xaa\xdc\x5b\x87\x5e\xd3\x73\x45\x49\x0f\x2e\xd0\x47\x74\x81\x06\x64\xb5\x4f\x2e\x8b\x0b\xae\x39\xd5\xb2\x3c\x94\xef\x68\x6b\x00\xef\x52\x52\x29\x2d\x73\x7b\x41\x6e\xdc\x1b\x10\x6b\x14\x68\x28\x58\xeb\xb6\xf6\x48\x01\xf3\x25\x6c\xd4\x8d\xd0\xac\x9c\xd2\x84\xad\xe4\xf9\x18\x81\xd6\x09\x47\xe7\xee\x9d\x80\x71\xff\x64\x9d\xb1\xa0\x24\x74\xf6\xe7\x37\x7f\x6a\x78\x53\xff\xd9\xf3\x65\x56\xd7\xd5\x64\xc1\x04\x4b\x42\x34\x56\x71\x27\xf7\x53\x2c\xde\xe2\x3f\x89\x15\xaf\x32\xdc\x82\xff\x57\xd1\x0c\xb7\x2e\xec\x00\x62\x26\xd9\x3a\x86\x83\xc0\x57\xfb\xa0\xed\xfa\xfc\xa9\x62\xfc\x1a\xe0\x13\x94\x13\x85\x5d\xb4\x2e\xa9\x50\xe6\x20\x63\x25\xa4\x53\xcb\x23\x9e\x92\x33\x9d\x14\x01\x4e\xe6\x51\x01\xa0\x3e\xf8\xd3\xfe\xa3\xe3\x83\xf8\x2c\x59\x59\x25\x9a\x5c\x1c\x6e\xc6\x47\x04\x87\xaf\x7d\x96\xac\xd0\x55\x1d\xc4\x8f\x1d\x6e\xd7\x41\xdc\x73\x6c\xd7\x1e\x4a\x9a\x8b\x47\xd6\x89\x7c\xcd\x95\xc6\x7c\x1a\xf8\x32\xc4\x53\x63\xc6\x21\xc3\xf1\xde\x1a\xd1\x80\x17\xff\x49\xd3\xb4\x7c\x83\x54\xde\x29\xbe\xcb\x90\x70\x79\x23\x97\x68\x5f\x2d\xd1\x89\x1b\x67\x7a\x59\xd8\xd2\xfc\x1f\x2f\x6f\xa1\x2f\x45\xfe\xf8\xcf\xaf\x81\x05\xfe\xa7\xdf\xff\xf3\xeb\x60\x30\xfb\x2c\x53\x13\x91\xff\x81\x2e\xf5\xc7\x48\x79\xd1\x4a\x5b\x01\xa9\x9e\x0d\x0f\x7a\x87\x19\x1e\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xfb\x71\xaa\x43\xde\x85\x21\xef\x42\xdd\x86\xbc\x0b\x9b\x27\xd6\x90\xd4\x0f\xe2\xf5\xd1\xe8\x1f\x32\xeb\xae\x53\x39\x24\x70\xb7\x9f\x23\x81\xeb\x3c\xd0\x6e\x74\x11\xb7\xa5\xcd\x58\xb7\xb0\xe4\x66\x75\x2e\xb0\xab\xf7\x77\xff\xf9\xf5\xc5\x97\xd7\x5f\xc3\x3a\x6d\xf0\x9c\x01\x6b\x2e\x9e\xa0\xc9\x3a\xc2\x25\x0a\xdd\xeb\xfd\x7a\xe9\x8b\x15\xff\x7c\x41\xde\xbf\xbd\x8b\x74\xcd\xdf\xef\x76\xae\xca\xdf\x62\x1a\xb2\x6f\xc7\xf5\xfe\x33\x2f\x29\x56\xee\x2f\x51\xe0\x41\x9d\x04\x1b\xc5\x5f\x5b\x5a\x1c\x73\xd2\xb8\x8a\x23\xa8\x51\xba\x8e\x91\x7c\x26\x8e\xdc\x66\xd3\x70\x23\x5f\xa4\x0b\xf7\x61\x8e\x24\x94\x67\x2e\xe3\xb3\x5d\x06\xe6\x88\x2b\x1b\x29\x31\x0d\x42\x42\x12\x51\x1a\xe2\x69\xc8\x26\x53\xca\x11\x8c\xcf\x15\xaa\x8b\x4d\xf5\x2b\xf6\x89\xea\x37\x0e\x60\x6b\x57\xb8\xe2\x1b\x0d\x0f\xf9\x96\x4d\xb6\xcb\x9c\xb4\xa5\x36\x49\xc3\x48\x0a\x04\xb0\xa0\x49\x37\x29\xdf\x5b\x71\xa3\xd5\x7a\x25\x90\xe1\xff\xe8\xc4\x04\x46\xdd\x63\xce\x15\xdf\xdf\x21\x2e\x9a\xef\x7c\x35\xfd\x2c\x8d\x39\x62\x42\x95\x77\x9f\xab\xea\x82\x20\xa1\x79\x6a\x9f\x19\x06\xc8\x0b\xa4\x44\x7f\x3b\x98\x02\x65\xdf\xca\x93\x62\x2e\xb5\x14\x87\xcb\x86\xb5\xa9\xff\x36\xe2\xba\x85\x37\x2e\xeb\xda\x44\x35\x0c\x60\x42\x0c\x6f\x27\x5f\x71\x0d\xb7\x36\xf1\x38\xaf\xf0\x66\xdc\xe9\xed\xa6\xb9\xed\x0e\x41\xdd\xb8\x9c\xc3\xa7\xbe\x8b\xc9\x17\x75\x73\xb5\x27\xcc\x35\x24\x95\xc6\xf6\x42\xcb\x7f\x98\x93\x8e\x3c\x1c\xf3\x89\xdb\xf5\x9b\x2b\x2b\x68\xb8\x94\x7b\xca\xde\x07\xb2\xfd\x2a\xee\x8d\x77\x92\xa5\x7e\x94\xe5\x01\x92\xed\xb7\x7b\x5e\x89\x21\xb4\xbf\xad\xa5\xda\xdc\x3b\x5e\x69\x4f\x22\x2a\x77\xde\xea\x0a\xcc\x8e\x76\x0c\xbd\x25\x71\xde\xa7\x74\xe2\xfa\x9a\x24\x32\x6f\x15\x31\x9c\x33\xe4\x03\x2e\xef\x6e\xde\xf1\x19\x4e\xc5\xcd\xda\xd5\xf7\x1a\xcf\xa8\xee\x1a\x9a\x2b\xd2\x65\xb3\x3d\x00\x8e\xc3\xf3\xfb\x1c\xf0\xdc\x1d\xe0\xb9\x06\x14\xee\xc2\x77\x2f\x15\xdd\x3d\x2f\x9a\x3b\x0a\xbf\xf6\x8b\x4a\xff\xee\xae\x47\xe4\x8e\xb9\xcf\xac\x12\xd6\x9c\x75\x4d\x1a\xa8\x47\x6a\xf6\xbd\xbd\x91\x82\x52\xfe\x1d\xf0\x56\x04\x15\xf0\xdf\xa0\x95\x16\x50\x28\xcd\x32\xb3\xab\x52\xd4\x95\x54\x54\xed\x9c\x8b\x9e\xac\x39\x2d\xac\xa3\x6e\x2a\x1f\xc5\x23\x2d\x53\x72\x71\x7b\xb3\x1f\xec\x15\x91\x1c\x09\x61\x2d\xac\x6e\x61\x8f\xf4\x48\x75\xf7\x40\x19\x34\xd6\xbd\x64\xe4\x9e\x6b\xd5\xaa\x9f\xdb\x50\x79\x19\xb2\xe7\x9d\x72\x20\x3a\xa6\x2e\xe2\x18\xc5\x86\x09\x22\x13\x4d\x33\x6b\x4b\xbb\x67\xfa\x91\x31\x41\x5e\xbf\x7e\x8d\x76\x8c\xd7\xff\xf2\x2f\xff\x02\x9e\xe4\x24\x65\x09\xcf\xd7\x5f\x84\xb7\xfe\xd7\x17\x5f\x84\x0c\xfa\x6f\x17\xef\xbe\x26\x34\x01\x99\x12\x6b\x15\xe1\xd8\x70\xc0\xcd\xee\xd5\x88\xfc\xdf\xbb\x6f\xde\xd7\xb5\x2d\xdb\xbf\x02\xfc\xf8\x2d\x0a\x92\xc5\x6c\x64\x14\x87\xd8\xb5\xda\x56\x41\xf5\xdc\xc7\x03\x51\xb0\x74\x36\xa2\xc6\xec\xdd\x0f\x72\xf4\x83\xf2\x05\x7c\x36\x87\x4d\xe5\x02\xe0\x37\xe3\x89\x4d\x4c\x85\xd6\x23\x57\xe5\x03\x93\x07\x60\x90\x8f\x23\x2f\x01\x63\x98\x05\x8f\xd0\xdd\xda\x06\x0f\xd5\x85\xcf\x4b\xa6\x8c\xa8\x69\xeb\xfe\xe2\x70\x35\x0c\x05\x95\xc7\x3d\x9c\xf3\x8b\xbd\xdc\x07\xd1\x5b\x5a\xbc\x61\x59\xe4\x8c\x2b\xdd\x28\xed\x69\xd1\x0e\xa8\x88\xc9\x35\x4d\xe6\x84\x09\x0d\x49\xb7\xf0\x80\xcd\xeb\x01\x83\xcc\xa9\x48\xcd\x0d\x83\x1a\x10\x30\xe0\x33\x79\xae\xf4\xf1\x05\xb8\xf5\x7b\xd0\x8a\x90\xac\x31\x32\x35\x12\x70\x13\x4c\x6b\xc6\xa4\x11\x79\x16\x58\x26\xf7\xfa\x13\x85\xdc\x1c\x66\xab\x50\x5d\xac\x6c\x14\x9c\x6a\x56\x2c\x0b\xe9\x2c\xb2\xbe\x7e\x9c\xff\x05\x21\x09\xa6\x5c\xf9\x58\x56\x4a\x7f\x59\x99\x03\x0e\xad\x8f\xda\xb7\x22\xed\xe5\xda\x88\xe8\xfa\x60\xed\x7d\xa0\x05\x4e\x12\xa6\x10\x94\x7f\xc4\xe0\x1a\x5d\xbf\xfd\x23\x6e\x64\xf0\x78\x72\xba\x69\x48\x17\x2e\xcb\x85\xc1\xfd\xb4\xd2\x72\x0c\x25\xd1\x5d\x9a\x96\xce\x80\xe9\xba\x5d\x64\xc5\x9c\x8e\xa0\xaa\xb0\x67\x62\xd7\x47\x6c\x00\x60\xb3\x0e\x71\xc4\x38\x3b\x56\x61\x10\x9e\x35\xf4\x03\x64\xd5\xd5\xa3\x05\xcd\x19\x84\x75\xe1\xc4\x82\x07\x5b\xa9\xbc\xa7\xf8\x4c\xb0\x12\xb5\xb4\x10\xf8\x4b\x32\x7a\xcf\x32\x3b\x94\x2c\x23\x96\xf1\x95\x0b\xa1\x63\xa5\xc1\x9e\x8a\xd0\xd9\xac\x64\x4a\xf1\x05\xb3\x91\xd3\xfc\x1f\x75\xc5\xbf\x39\x23\xb7\xd7\xef\x5c\xfc\xb8\x22\x86\xb1\xd5\x2c\x24\x5b\x20\x36\x9f\xab\xd2\x80\x56\x2d\x7b\x4c\x08\xb9\x56\x52\x43\x1d\x3b\xd3\xbf\x3d\x12\xe5\x2b\x69\x83\x97\xe9\x18\x02\xc5\x63\xf6\xac\x0e\xfd\xc1\x18\xf3\x39\xa3\xa9\x0b\xb6\x35\x2c\x65\x51\x18\x49\x9a\x5c\x9a\x2b\x3a\xe5\x46\xb0\x56\x36\x1c\x3b\xad\x8c\xa8\x42\x03\x12\xc1\xd5\xed\xe3\x9c\x11\x59\xa6\x0c\xeb\xc0\x4f\xc1\x99\xc7\x77\xdb\xa0\xef\x90\x77\x88\x9b\x91\xee\xb9\x2e\x69\xb9\x44\x8a\x69\x4f\x22\x78\x38\x83\x33\xb1\x96\x3e\xf4\x0a\x23\x43\x2c\x15\x09\x49\x9c\xe7\x5a\x24\x42\x23\x11\x12\x76\xdd\x82\x6c\xeb\xae\xc5\xe2\x4c\xd3\x00\xfc\xef\x2c\xf4\x87\x7f\xf6\x94\x42\xde\x84\xe0\x78\x20\x32\xac\x23\x03\x1f\xfa\xaf\x93\xb9\xa5\xeb\xed\x2b\x4a\x08\x4a\x82\x34\xa6\x3c\x3f\x71\x61\xd8\xdc\x21\x01\xef\x95\xcf\xf4\xc4\x30\xd0\xba\xa2\x59\xb6\x1c\xb3\x4f\x86\x94\x98\x4b\x0c\x34\x14\x72\x71\x82\x3b\x7f\x25\x14\xd3\xa3\xa8\x21\xe1\xf2\x15\x25\x26\x99\x50\xe4\x04\xd7\x24\x24\x64\x9d\x3a\xc1\x6e\x8d\x20\x70\x5f\x69\x74\x81\x1b\x6d\xfe\x24\x6e\x9d\x0b\x56\x2e\xed\x08\x11\x1f\xf6\x00\x67\xd2\x13\xe6\x08\xdc\x41\x9d\xcc\xaf\x3f\x15\x25\x86\x1e\x45\x7e\xbd\x02\x7e\xab\x9d\x61\x6a\x26\xc7\x3d\xb6\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\xd6\x7c\x02\x58\xec\xe2\xfd\x55\x0c\xfa\xc2\x16\xc3\x22\xb6\x5b\x30\xc3\xd8\x6e\x4f\xb9\x81\xd8\x2e\x76\xec\x8d\x4d\x6f\xe5\x7e\xc1\x0c\xcc\xae\x90\x9a\x93\xea\x28\x79\x60\x16\x09\x1b\xc9\x13\x94\x5d\xf6\xe5\x1e\xd3\x29\x19\xc4\x73\x63\x80\x3a\x5b\x42\xb7\x38\x52\xec\x59\xf4\x06\x67\x37\x91\x58\x3c\x5d\xb7\xb1\x99\x7a\xaf\xef\xdc\xf6\x45\x7f\xdc\xf7\x0e\x62\x7b\x60\x01\xaa\xbd\x4d\xad\x05\x7f\xe6\xbc\x9c\xd4\x06\x30\x65\x1e\xf8\x18\x39\x0f\x46\x14\x12\x38\x2b\xa2\x65\xfc\x91\x92\x3e\x1e\xb3\xed\xe6\xb6\x78\x0f\x0b\xee\x75\xe1\x9a\x73\x68\xdb\x46\x1e\xd8\xf2\x54\xe1\x0d\x30\x18\x6c\xce\x0b\x2c\x40\x66\xc8\x83\x91\x80\x7b\x5e\x03\x6c\xdf\x41\x0a\x1b\x37\x30\xe2\xb8\x1b\x31\x22\xef\xa5\x36\xff\xbb\xfe\xc4\x95\xe5\xf6\xae\x24\x53\xef\xa5\x86\x27\xcf\x72\x42\xb8\xd0\xe7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x3b\xc4\x9f\x25\x57\xe4\x06\xd2\x97\xe3\x96\xf6\x1c\x1a\xfc\x77\x5d\x6e\x14\x33\xb0\x93\xb1\x21\x7f\x8e\xf5\xa4\x5f\x1f\xd9\x9e\x9f\x2c\x5b\xc7\xb7\xf7\x49\xd8\x09\x80\x6e\x0c\x7f\x81\xb4\x6e\x45\x46\x13\x96\xba\x1c\x55\xd4\xec\x14\xd5\x6c\xd6\xe9\x63\xbe\xad\xe5\xac\x9c\x81\x2a\x2f\x09\xca\x95\xb8\x61\x01\xbd\x09\x31\xb6\x9e\xe4\xb8\x39\x78\x6f\xf0\x7f\x62\x84\xd2\x01\x3b\x03\x1e\xeb\x6b\x83\xda\x9f\xc6\xab\xf5\xb8\x97\x8d\xa1\x91\x2b\xc9\x69\x61\xee\xe4\x7f\x19\xe6\x03\x40\xf5\xbf\x49\x41\x79\xa9\x26\xe4\xc2\xe5\xce\x6a\xfe\x66\xa5\xc7\x46\x37\x3d\xa6\x50\x80\x47\xf0\x4f\x15\x5f\xd0\xcc\x66\xe2\xa0\x82\x30\xcc\x2d\x66\x66\xb3\xca\x84\x8e\xc8\xe3\x5c\x2a\xe4\x64\x7c\xf8\xcd\xc9\x03\x5b\x9e\x8c\xa2\x34\x18\xae\x35\x6f\xfc\xc9\x8d\x38\xa9\xb5\xc5\xad\xdb\xea\x79\x34\xf0\xaa\x3d\x81\xdf\x4e\xf6\xcf\xe7\xf6\xe2\xac\xfa\x56\xae\xde\x34\x81\xe8\x2b\xf6\x94\x78\x98\xba\x85\x47\x7a\x61\xdb\x87\x98\xec\x60\x7a\x83\xe2\xec\x7e\xe9\xb2\xc8\x59\x41\x75\x5d\x8e\x8d\x1a\x12\x64\xde\x86\x7c\x6c\x40\xac\xa5\x22\x88\x17\x29\x23\x0f\xca\xa5\xc4\x39\xd6\x26\x1b\x7a\x5a\x56\x6c\x44\x52\x29\x4e\xb5\x55\x77\x35\x33\x2d\xae\xe6\xb3\x4a\x37\x9c\xc3\x99\x3a\x8f\x1a\x94\x96\x0c\x12\x6c\xb9\xcc\x91\x56\xc3\x80\x59\x17\x41\xd3\xa9\x9d\x87\x88\xf9\x73\xd3\x90\xe1\x01\x79\x76\x48\x1b\x96\x27\x24\xe0\x2e\xc8\xe5\xdd\x1c\xb6\x3e\xf4\xc6\xe0\x6d\xed\x69\xd4\x78\xbb\x80\x08\xb0\x78\x1d\x26\x88\x6a\x91\x7f\xb0\x52\x46\x8d\xb0\x41\x75\x14\x0f\x9d\x61\x16\xfd\xba\x85\x05\x9e\xd4\xad\x05\x9a\x1f\x80\xbd\x5f\x58\x43\x25\x24\xeb\x6c\xe4\x25\x29\x25\x1e\x0d\xf8\x3c\xc0\x0f\xf7\xb0\xaa\x83\x5f\xb9\xfa\xa8\x5e\xa8\x02\xb0\xa1\xb5\x8f\xa3\x56\x1d\x5a\xbd\x8f\x73\x56\x6b\xe4\xe5\xd4\x56\x82\x47\xa3\xc3\x53\x41\xd1\xe7\xda\xa8\x04\x26\xae\x40\xab\x78\x1f\xf5\x78\x8f\x63\x45\x7f\x8b\x77\xb4\xe8\x65\x05\xf3\x5f\xb7\x4a\xfe\xd3\x7b\x59\x69\x97\x2e\xc4\xfe\x0e\x85\x95\xb5\x74\xf6\xc7\xc3\xa9\xce\xfb\xe8\x38\xa2\x19\xf9\xa7\x80\x34\x7a\xc2\xb4\xfd\xb0\x46\x84\xd1\x64\x6e\x38\xc0\x31\xba\x59\x18\x2e\xd5\xb1\xa3\x57\x66\xeb\x90\x31\x94\xab\x24\x26\x0e\xf8\xfc\x69\x38\x90\x6b\xf8\xe7\x38\xb3\x91\x73\xb9\x54\xd6\x75\xcd\x32\xa7\xa2\x0e\x5d\x88\x1a\xd3\xa9\xe7\x5c\x3e\x64\xab\xfa\x81\x55\x82\x8c\xba\x52\x3e\xcb\xc8\x1e\x2c\x35\x9f\xf9\x8b\x11\x35\xde\x86\x15\xd5\xd9\x74\x0c\x36\xb5\x7e\x45\x95\x58\x1b\xc9\x10\xbc\xe8\xd1\x30\xb5\xa6\x59\x08\x75\xaa\xad\x46\xf6\x1e\x48\x10\x0d\xfe\xe6\x75\x5e\x4b\x7b\xaa\xfe\x30\xe2\xc4\xef\xc6\x11\x29\xe6\xf3\x3b\xb3\xb2\x94\xa5\x59\x13\x53\x8a\x70\xd8\xe5\x9c\x96\x0f\x2c\xf5\x5c\xd2\x84\xdc\x9a\xc5\x3b\x19\x3d\x6a\xcc\xd2\x51\x23\x97\x27\xba\x59\x89\xcd\x4c\xe8\x74\x32\x39\xb5\x65\x13\xd6\xeb\xb2\x45\x63\xaf\x58\x81\xbc\x87\x18\xde\xba\xbf\xef\x68\xa1\x50\x1d\x61\xd8\x1b\x50\x47\x4a\x28\x88\xa8\xe7\xce\xa6\x48\x23\x42\x6c\x56\x97\xd3\x43\x00\xea\xab\x56\xee\xa3\x52\x8e\x32\x1c\x62\xeb\xaf\x46\xee\xa5\x42\xde\xa6\x3e\xb6\x27\x65\x6f\x7c\x5f\xcd\x7f\x2f\x0d\x4c\x1e\xe4\x12\xb8\xda\x9e\xae\x76\x04\xd7\x2e\xae\xc8\x37\x4e\xf6\x09\x73\x18\xd4\x73\x5b\xee\xbb\x8f\x9e\xec\x59\x3c\x06\x57\xdb\xf3\x79\x10\xae\xb6\x9b\x29\x26\x11\xdf\x58\xf5\xb1\xe9\xd2\xe9\xd9\xba\xc0\x94\xbb\xab\xed\x18\xae\x85\xab\xed\xc0\xae\x86\xab\x2d\xce\xf5\x70\xb5\xc5\xb8\x22\xae\xb6\x58\xe9\x0c\xdb\xd3\x2f\x70\xb3\x04\x5c\xd9\x12\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x45\x03\xc9\xf5\xba\xb7\x96\x50\xe3\xd5\xa5\xf7\x4a\x66\x95\x0e\xaf\x33\xb7\xad\xbb\x26\xdd\x87\x89\x3b\xcd\x66\x2c\xb1\x5f\xed\xb8\xc1\x37\x00\xd7\x86\xe4\xb8\x5f\xaf\xfb\xd0\xfc\xf5\xd7\x82\x1f\x53\xf5\xf7\x94\x84\x4f\xd8\x8e\x9d\xf6\x09\xdb\x91\x93\x3f\xb9\x41\x9f\x92\x02\x0a\xdb\xf3\x26\x82\xc2\xd6\x13\xbc\x63\x92\x42\xb9\xf6\x64\x2d\xab\xcf\x5c\x8e\x14\x73\xe9\x33\x0b\xb7\x84\x20\x48\xd4\xa4\x15\x4a\x63\xce\x8e\x68\x4b\xb6\x1c\x58\x55\xf7\x74\x75\xbf\x8b\x51\xb9\xb8\xbd\xe9\xa5\x45\x69\x7c\xbf\x45\x8f\xd2\x7c\xe3\x17\xac\x49\xb9\x41\xd5\x48\xd3\x27\xeb\xaa\x5e\xb9\x8d\xb3\x8c\x64\x6d\x9e\x47\xa6\x5c\x9b\xf6\x5b\x43\xd7\x9b\xb9\x4a\x1b\xe7\xac\xa5\x0d\xe9\xa9\x39\x00\x4b\x65\x5d\x6d\x1e\xf4\xe5\x8d\x71\x02\x27\xcf\x23\x7f\x1e\x51\x96\x84\xfd\x08\xca\x23\xb9\xda\x5a\x27\x75\x5a\x97\xcf\x40\x65\x33\x2a\xbe\x1a\xda\xb6\x42\xa6\x6f\xd0\x48\x4a\x85\x90\x58\x1e\x4a\x8d\xd0\x50\xa1\x46\xd6\x0c\xd3\x48\xd1\x21\x52\x52\xf1\x14\x3d\xa0\x7d\x76\x81\xd3\xcf\xc9\x31\x0d\x96\x7f\x1b\x7b\x94\xe4\xc9\x1e\x66\xb4\xe0\xdf\xb1\x32\x2c\x8b\xfd\xa6\xd6\x3a\x58\xdb\x93\x3b\x45\x95\xcc\x59\x4e\xe1\x9f\x6f\xdd\xf2\x0c\xaa\xb1\xfe\xf5\xa0\x96\x63\x65\x6e\x58\x8f\x51\x2b\xca\xf4\x64\xf1\x45\x94\x7f\x6c\xdd\x9e\xe8\xe2\xe1\x4f\x61\x0f\x9b\x71\xdb\x12\x31\x0c\x70\x83\xa6\x00\x8c\x2b\x2e\xd3\x8c\x57\x5b\x1a\x2a\xb3\xc0\xdd\x7b\x86\x85\xef\xc7\xfc\x8e\xed\xb9\xf4\x34\x7d\xf5\x33\x23\xcf\xfb\xb4\xb5\x2d\x3d\xa6\x30\xe8\x67\x06\xfd\xcc\xff\x68\xfd\x4c\x83\xb0\x3b\x5c\xbf\x41\xed\xd2\xcc\x88\xea\x74\x2f\x75\xdd\x83\x09\x6a\x3f\x9d\x1a\xc5\xe9\x50\xea\xba\x82\x68\xfe\x38\x9d\x4c\x4e\xd1\x00\x32\xf1\xea\xd2\x4a\x4f\xc7\x7f\x24\x4c\x24\x32\x35\xfd\x60\x55\xc0\x52\x69\x60\x2d\x6b\x89\xbd\x39\x97\xdc\x8d\xd5\x34\xa1\x40\xdf\x7d\xb9\x87\x5e\x28\xd8\x45\xe5\xbf\xdd\x0f\x83\xd5\x0b\x81\xd6\xac\x98\x2f\xc6\x64\xb7\xcc\xd7\xa7\xb2\x3c\x59\x9d\x43\x20\xe3\x39\xb7\xde\xc9\x06\xbb\x30\xa5\xe3\xdd\xf7\x08\x39\xc3\x6e\x26\x49\x51\x8d\x6c\x97\x93\x9c\xe5\xb2\x5c\x8e\x7c\xb7\xe6\xc7\xd6\x38\xf6\x8d\x73\x60\xfa\x92\xaa\x2c\x99\xd0\xd9\x32\x34\xb9\xd4\xa6\xf6\x8c\xdc\x9f\xdb\xd1\x23\x33\x7f\xfe\x60\x63\xfd\x4b\xea\xd6\xbe\xff\x75\xf1\x41\x50\xc8\xf9\x5d\x01\x1a\x63\xd3\xd8\x8d\x6a\xfd\x84\x79\xca\xc4\x82\x2c\x68\xa9\xe2\xef\x1b\x79\x3a\xbf\x97\xf2\x05\x57\x7b\x09\x39\xb8\xb3\xc4\x0f\xf5\xcc\xb2\xd2\x45\xa5\x2d\x3a\x76\xd7\xc8\x95\x21\xf3\xd7\x67\x85\xe9\xfd\x22\x5c\x45\xd4\x6c\x05\xd5\x9a\x95\xe2\x0d\xf9\x8f\xb3\x7f\xff\xdd\xcf\xe3\xf3\xbf\x9c\x9d\x7d\xff\x7a\xfc\xbf\x7f\xf8\xdd\xd9\xbf\x4f\xe0\x1f\xbf\x3d\xff\xcb\xf9\xcf\xee\x8f\xdf\x9d\x9f\x9f\x9d\x7d\xff\xd5\xbb\xbf\x7e\xbc\xbd\xfe\x81\x9f\xff\xfc\xbd\xa8\xf2\x07\xfc\xeb\xe7\xb3\xef\xd9\xf5\x0f\x81\x9d\x9c\x9f\xff\xe5\x37\xbd\xa6\x4b\xc5\xf2\x9b\x1e\xf8\x0d\xdb\xf8\x89\xf4\xb1\xdd\xcb\xbe\x3c\xc1\xb9\xd0\x63\x59\x8e\xb1\xbb\x37\xe0\xb2\xd8\xa3\x53\x07\x16\xfb\xb8\x87\x35\x1d\xae\x0b\xeb\x39\xe1\xe3\x19\x2e\xda\xbe\xe4\x8b\x3d\x18\x0b\x30\xeb\x4d\x2f\x9d\x21\x7e\xba\x45\x5d\x68\x7f\xfc\x05\x6b\x0a\x3f\x1b\x9f\x2b\x5b\xa0\x64\x70\xb8\x7a\x76\x87\x2b\x3c\x89\xc1\xdb\xaa\x5e\xdc\xe0\x6d\x05\x6d\xf0\xb6\x6a\xb6\xc1\xdb\xaa\x35\xee\xe0\x6d\x35\x68\xf3\x06\x6d\xde\xf3\x6b\xf3\x06\x6f\xab\xc1\xdb\x6a\x73\x1b\xbc\xad\xba\xdb\xe0\x6d\xf5\x3f\xcd\xdb\x0a\x41\x6c\x93\xcf\x95\x95\x48\x6b\x87\xab\xcf\xce\xdf\x4a\x99\x43\x4e\xd8\x45\x92\xc8\x4a\xe8\x8f\xf2\x81\x05\xfb\x0b\xac\xe8\x50\xd6\xfa\x81\x1a\x83\x5b\x74\x2a\xeb\x2f\x1f\x4d\xc1\xf2\x02\xf3\xc1\xd1\x2a\xe5\x4c\xc4\x69\x08\x9f\x82\x7a\xdd\x78\xcd\xaa\xd8\x22\x65\x69\xfd\x83\xc5\xcb\xda\x1c\xcd\x84\x5c\x90\x92\x25\xbc\xe0\x36\xe9\x02\xc5\xe7\x51\x43\xc2\xbd\xb0\xa9\xb5\x97\xe6\xb6\xb0\x6c\xea\xd1\xa3\x4f\xb9\x5d\x36\xf4\x0f\x96\x52\xaf\x4c\x29\x4e\x8c\x35\xd3\x44\x3e\x10\xb8\xbe\x47\xae\x18\x51\x73\x59\x65\x29\x29\xd9\xdf\x1d\xcb\x69\x57\xf9\xb1\x39\x5a\x53\x81\x1f\x3b\x6c\x63\x39\x76\x1f\x69\xc1\xc3\xab\x7d\xf9\xd9\xf7\xc1\x95\xec\x53\xc1\xb1\xb2\xc1\x1d\x4b\xa4\x48\x8f\xa6\x16\x5c\x1b\xb8\x66\x16\xc1\xae\x87\xd9\x6a\x7c\x6e\xce\x05\xcd\x78\x6a\xa8\xaf\x73\x29\x42\x94\x10\x07\xc6\x88\x3f\x3c\x94\xaa\xfa\x34\x09\x2d\x8a\x52\xd2\x64\xce\x54\x63\x66\x28\xf1\xd8\x4a\x17\xa1\x29\xdd\x9b\xad\xc8\xaa\x19\x17\x28\x20\x41\xff\x8e\xdf\x90\xda\xb9\x1c\xda\x85\xac\x4e\xee\x63\x63\x60\xf3\x79\xd4\xb0\xc8\x60\xea\x72\x09\x3e\x8c\xb2\x39\x1c\xae\x96\x4f\x9b\x7f\x28\x22\xb3\xd4\x55\x5a\xfd\xe3\x6b\x23\x53\x27\x78\x75\x23\x15\xbd\x0a\x72\x73\x9a\x11\x33\xc3\xed\x1b\x32\xb7\x7d\xa0\xdf\xff\x81\xcc\x65\x55\xaa\x49\xb3\x4a\xe0\x17\xf0\x2c\xee\x54\x45\x5a\x7b\xee\x68\x92\x31\xaa\x34\xf9\xe2\x35\xc9\xb9\xa8\x74\x9f\x6c\x03\xf1\x52\x5a\x43\x3e\xfb\xe7\x3f\x04\x7f\xf7\xa4\x2c\x05\x91\xb7\xad\x29\x8d\xc1\xbf\xbd\x48\x66\xf5\xc6\x58\x1c\xb5\x90\x5c\xe8\x55\x01\xcd\x52\xd8\x7e\xd8\x14\x34\xd3\x07\xc3\x62\xbd\xc5\x98\x9f\x2a\x79\xbf\xd4\x7b\x2d\xaa\x63\xbb\x6c\x67\x8c\xfb\x7f\xf6\x61\x5c\xed\xd9\x98\x32\x3a\x6e\x84\xdd\x15\xb9\xdc\xe4\x5e\x52\x11\xae\x92\xcd\xb8\xd2\x65\x97\x1a\x77\x1c\x82\x78\xc3\xb9\xa8\x59\x29\xab\x80\x84\x0b\xf1\x97\x0d\x3a\x76\x0a\x0d\x67\x58\xb2\xb9\xc5\x43\x72\xa6\xb8\xd2\x75\x78\x3a\xd0\x5b\xe7\x57\x2f\xad\x42\xcc\xa6\xda\xb2\x0e\x40\x5d\x62\xfb\xe7\xad\x2f\x1b\x23\x35\x39\x00\x3d\xcc\x96\x61\xdf\x6d\x74\x61\x73\x48\xc9\x92\xe4\x55\xa6\x79\x91\xd5\xdb\xf7\xc1\x7d\x60\x19\x86\x10\x29\xba\x66\x8e\x69\xc3\xee\x43\xb1\x66\x17\x16\x65\x07\xc3\xeb\x99\x1f\x8d\x09\x0d\xf5\x3a\xc0\x81\x9e\x15\xb4\xa4\xfe\x94\x12\x99\xe7\x34\x28\x85\x12\x5a\x02\x29\xf8\x90\x21\xc9\x31\xec\x44\x49\xb3\x7a\xd5\x0d\x37\xa0\x7d\x02\xb9\x66\x82\x8a\x00\xa3\x7e\x8f\x62\xf8\xd0\x33\x91\x8f\x3e\x2e\x64\xc6\x17\x4c\xac\x42\xb7\x15\x42\xbe\xa4\xc9\x03\x13\x21\xd2\xfc\xb7\xca\xed\x6f\xba\x14\x34\xb7\xb5\xed\x8b\x52\x2e\xb8\xb9\x06\x2c\x5d\x19\x41\x8d\xac\x5a\x08\x93\x62\xbb\x12\x00\xc8\x68\xee\x73\x2b\x2b\x75\x98\xaa\xc7\xa6\xdf\xa7\x63\x49\x85\xf6\x9f\x92\x2f\x12\xe6\x38\x67\xd3\xf3\x3e\x77\x60\x11\x50\x77\x8f\x6c\xae\x0f\x65\xf3\x32\xe3\x7d\x03\x4a\xef\x5d\x18\x30\x63\x69\x66\x70\xde\xd2\x57\x13\x5a\x81\x22\x5b\x4a\x61\x6f\x15\xc2\xca\xfb\x98\xc2\x51\x9d\xc7\x58\xde\xa7\x6d\xb4\xf5\x81\xa6\x52\x91\x2f\x21\x2b\xdb\x15\x03\x71\xe6\x70\x0c\xcf\x87\x2f\xaf\x3a\x98\x1d\x33\xbf\xde\x8c\xce\x46\xbd\x27\xfb\x44\xf3\x22\x63\x6a\xf2\xf0\x47\xd0\x7c\xda\xbb\xf8\xaa\xbc\x4f\x5f\x7d\xb8\xbe\xb8\x7a\x77\x3d\xc9\x77\xdf\xf6\x03\xf0\x4f\x3c\xa7\xb3\x2e\x8e\x7c\x4c\x72\x29\xb8\x96\xe5\x6e\x34\xfb\x22\xca\x00\xee\x2c\x77\x6a\x65\x12\xc7\x44\x18\x58\x5a\xca\x8a\x3c\x52\xcc\xf2\x19\x5c\x0a\xf5\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x99\xaf\x57\x07\x33\xb8\x75\x8f\x95\x02\x11\x76\xde\x1c\xad\x3c\xea\x93\x0b\xc0\x97\xf7\xdd\xa4\x2b\x02\x91\x02\xa0\x1e\x02\x64\xa0\x63\xaf\x37\x02\x24\x84\x8f\x42\x93\xd0\xf5\xbd\xea\xbf\x9e\xcb\xc7\xb1\x96\xe3\x4a\xb1\x31\xef\x56\x24\x47\xec\xd5\x03\x5b\x82\xf3\xe8\x01\x76\xcb\x76\xdd\x52\x03\x68\x09\x56\x08\x78\x6e\x78\xb2\x0f\x5f\x5e\x7d\xab\xc2\xd4\x8e\x0d\x79\xe5\x15\xd3\xc9\xab\x84\x15\xf3\x57\x76\x8c\xcf\x73\xef\x1b\x76\xa3\xb5\x15\x75\x7c\xea\xb0\xec\x21\xce\xcd\xf5\x8d\x4c\x45\x22\xb3\xcc\x96\x76\x92\x53\x72\xc9\x8a\xb9\x7f\xe1\xc5\xed\xfa\x9e\x4b\xb1\x1d\x47\x35\x44\xa0\x40\xb2\x0c\xb0\x03\xc6\x1f\xa5\xe9\xb7\x8d\xaf\xe0\x49\x28\xba\x6a\x5c\xb9\xf2\xbe\x2f\x21\x78\x39\x97\xac\x9b\xcc\x3c\x9b\xd2\xe2\xe9\xb5\x68\x7b\x69\x27\x8e\x7c\x60\x61\x6a\x10\xf4\x68\x0f\x0a\x46\xeb\x51\x4c\xd2\x75\x0e\xcc\x7a\xc3\xc5\x83\x56\x7a\xce\x84\xe6\x09\x9a\x80\xac\x5b\x7d\x93\x46\x91\x9b\x29\x0a\xca\x69\x90\xdd\x5c\x2e\x58\x59\xf2\x94\x29\x12\x41\xa4\x9a\x4a\x39\x9e\xbd\xb8\x03\x0c\x34\x64\xc7\xd9\x98\xc3\x9d\x7a\xfa\x59\x24\x9e\xe2\xc8\x73\x6c\x17\x9e\x23\x3b\xef\x3c\xcd\x6d\xe7\x79\x1d\x76\xa2\xcd\xcf\x31\x4e\x3a\x4f\x71\x5c\x39\xa8\x26\xab\x45\xcc\xe1\x49\x0f\x62\x4e\xd3\x9c\x07\xa5\x7b\x78\xd1\xe4\x1c\x56\xb1\xe3\x75\x95\xd0\x8c\xdd\x7c\xb3\x4f\x4d\x94\xed\xb2\xad\x8d\xba\xb3\x0f\x0b\x56\x2a\xae\x20\x10\xc7\x29\x1a\xb5\xa6\xc9\xdc\x6a\x8c\x9c\x09\x42\x0a\xa8\x4d\x89\xb0\x45\x84\x4c\xbb\x6d\xc6\x4d\x75\x94\x1b\x6d\xb7\x4a\xca\x4d\xf4\x25\xd9\xdf\x66\x54\xb3\xc7\x4e\xfe\x7c\x5c\x93\xe8\xee\x37\x41\x29\xf2\x99\x6b\x9a\x62\xb4\x49\x3e\x62\x60\xad\x97\x7d\xea\x8f\x26\x5b\x34\x47\x71\x48\x06\xbe\xdd\x9b\x4a\x19\x9b\xbf\xfb\x9f\xa6\x5d\x44\xc2\x42\x5b\xe4\x79\xda\xaf\xdc\x59\xc1\x26\xd2\x34\x2d\x99\x52\x8e\x85\x70\x17\xf0\xe2\xf6\x86\xfc\x15\x5f\xdf\xeb\x2a\x8b\x52\x6a\x14\xb8\xaf\x64\x4e\x79\x80\xbb\x63\x6b\x05\xab\x9f\xbb\xa5\x34\x79\x5d\xb7\x84\x5b\xff\x2e\xb1\x2f\x4f\x65\xd9\x48\xe6\x5f\x95\x2c\x25\x56\x59\xb7\xd7\x35\x1e\x45\xce\x5a\x93\x87\xc8\x99\xf9\xed\x15\x94\xd2\x38\x9f\xd4\x32\xd7\x8a\x40\x16\xa2\x19\xd8\x8b\xc8\xf6\x02\x85\xa2\x86\xd9\xc8\x05\x78\xd6\x82\x90\x03\x1b\x60\x3b\xbc\xd3\x62\x50\xff\x42\x71\xf0\xfe\x69\xf8\xdb\xda\xaa\x75\x5c\xd5\x31\x9c\x28\x5b\x8d\xc8\xd7\x72\xc6\x5d\xe5\x50\x03\x9c\x78\x36\x34\x44\x20\x1a\xe4\x94\x41\x4e\x59\x6d\x83\x9c\xb2\xb1\x29\x95\x5d\x0b\x7a\x9f\x85\xb8\x9a\xb7\x7d\xe9\xfd\x87\xe4\x6d\x46\x67\x84\xc1\x1f\xaf\x52\xae\xcc\xff\xc9\xdd\xdd\xd7\xe0\xbc\x51\x09\xa7\x4c\x01\x08\xb0\xb4\xd2\xe7\x1e\x41\x9c\xbc\x5f\x24\x89\xa4\xea\x5d\x50\x0c\x69\x0f\x34\x59\x77\x4f\xb8\x48\x5d\x29\xfa\x46\xbc\x85\x7d\x03\xb0\x25\xf5\xd1\xe4\xe8\xd0\x7d\xcf\xcc\x2d\x4d\x1e\x6e\x1b\xbe\x16\xb2\x34\xcf\x44\xe3\x51\x24\x93\x15\xfd\x75\x3f\x76\x6b\x65\x98\xb0\x63\xb8\x8d\x57\x6a\x37\xbe\x74\x7c\x8b\x23\x3a\x77\x76\x6b\xe1\x37\xaa\x94\x4c\x78\xed\x2b\x04\xf6\xa5\x9a\x99\x49\x81\x99\xd9\xeb\x66\x20\xff\x1c\xbb\x1c\x64\xd0\x37\x70\x60\x0e\x50\xec\x1b\x54\x35\x39\x2e\x2e\xdc\xaa\xf7\xba\x04\x04\xc7\xb0\x8c\x4b\xf1\x97\xa3\xee\x7d\x75\xbd\xfe\x22\xac\x7a\xa1\xb8\x64\x0d\xf6\x84\x03\xa4\x39\xbb\xe6\x39\x45\x35\xc6\x1a\x14\x70\xe5\x2f\x1d\x24\x9f\xd9\xdb\xfe\x85\x64\x6f\x89\x54\x25\x20\x5f\xd5\x76\xc7\xc3\x67\xd6\x73\x05\xb0\x46\x21\x8b\x2a\x43\x67\x7a\xbf\xb8\x1e\x0e\x25\x31\xd6\x78\x9c\xc5\x7e\xb4\x03\xe1\x1c\x56\x23\xc0\xfb\x10\xe0\xd9\x8c\x1f\x8f\x0f\xf3\x77\x10\x0b\x52\xb7\x91\xb0\x6d\x77\x51\x32\xfb\x31\xa3\xfc\xf7\x15\xd5\x1f\xa2\xdd\x68\xc5\xfd\xb7\xa4\xae\xd7\xff\xfc\x87\x3f\x04\x11\x34\x5e\x42\x09\x48\x0e\x15\xf2\x20\x2f\x88\xf7\x18\xa0\x25\x03\xe9\x00\x43\xf0\x9d\x7e\x03\xbd\x11\x75\xa0\x55\xe5\x18\x01\xff\x07\x0e\xf0\x8f\x0b\x15\x89\x09\xe0\x0f\x34\x87\xf7\xf0\x96\x81\x44\x4c\x37\x47\x4b\xc4\x74\xa4\xf4\x4b\xc7\x49\xba\x74\x8c\x54\x4b\x47\x49\xb0\x74\xbc\xb4\x4a\x07\x4e\xa6\x74\x10\x17\x93\x43\xa6\x4b\x8a\x8c\x3d\x8e\x8b\x3b\x0e\x4f\x88\x14\x1c\x9d\x1c\x1b\x99\x1c\x91\xf2\x68\xbf\x89\x8e\xa2\x25\xfa\x98\xa4\x46\x7d\xa3\xee\x8e\x97\xc0\xe8\x19\xd3\x16\x3d\x77\xb2\xa2\x03\xa7\x28\x3a\x5e\x62\xa2\xa3\xa4\x23\xea\x13\xde\x1a\x9f\x7a\x28\x26\xac\xb5\xef\xe5\x3a\x78\x72\xa1\xbd\xa4\x14\xda\x73\x22\xa1\xfd\xa5\x0f\x3a\x9e\x23\x65\x78\x52\x95\x27\xa7\x52\x89\xaf\x5d\x15\x6f\xef\x39\x94\xb2\xa6\xee\x7d\xa3\x72\xca\xe5\x9b\x75\x25\x71\x4e\x55\xa3\xe6\x8d\x96\x06\xab\x1d\x21\x2a\x20\x40\x0f\x41\x22\x34\x38\xd8\xbb\xec\x60\x2e\x22\x95\x38\xd8\xe9\x37\x77\x2b\x1e\x21\xfe\xf1\x21\x1d\x41\xfc\x20\x1d\xae\x20\x6e\xe1\x47\x70\x06\x19\xbc\x2d\xf6\xe7\x6d\xb1\xff\x38\x9d\x97\x66\xa0\x4f\x07\x03\x7d\xb4\x81\x5e\xb5\xd2\xfd\x3b\x85\x31\xa0\x64\x60\x6a\xe5\x7d\xb3\x96\x5c\x8d\x23\x2e\x6e\x6f\x02\xc6\x49\x4a\x06\xb9\x81\x68\xa6\x26\x9b\xb8\x5d\x67\xba\xb3\x5c\xb4\xe3\x72\xa9\xd6\x2c\x2f\x82\x6a\x5f\x0c\xf6\xf9\xc1\x3e\xbf\xda\x06\xfb\xfc\xc6\x76\x6c\x7b\xdd\xbc\xca\xa9\x18\x1b\x0c\x0c\x66\xfc\x96\xc3\xd8\x0a\x43\x33\x21\x16\x93\x06\x5e\x4b\x4c\xf0\x00\x29\x37\x2a\xc1\x7f\xaa\x58\xad\xcf\xf2\x8c\xe5\x81\x6c\x9d\xd0\xf7\x61\x37\x10\xf9\xe2\x15\xcc\x9c\xc8\xb5\x28\x62\xbb\x66\xbf\x99\x0e\xc5\x86\x6e\x22\x0c\xd3\x52\xd1\xea\x39\x43\x26\xfd\x76\x85\x49\x6f\xe9\x1f\x2c\xfa\x01\x9c\x10\xaa\xe5\x6e\x72\xa6\x06\x10\xcc\x7a\x6c\x76\xaf\x7b\x46\x72\x5e\x96\xb2\xb4\x76\xd7\xe6\x92\xd0\x81\x90\xcf\xe6\x9a\x95\x28\xf9\xa3\x0b\x57\x08\x2a\xb8\x63\xda\x42\x15\x40\xa5\x96\x84\x0a\x4c\x4c\x60\xfe\xed\xc2\x69\x60\xb9\x8e\x0e\xdd\xb3\x39\x5d\x70\x59\x05\x05\x90\xde\x21\xa5\x3c\xb1\x1f\x03\xff\xb4\x94\x95\xb7\x30\x55\xca\x2c\xd0\xef\xa1\x5a\x3f\xaf\x80\x41\xde\xd7\x9f\x83\x82\x26\x95\x4e\x7d\x3e\x66\x9f\xb8\xd2\xeb\x3b\xe6\x8e\xca\x95\x21\xdb\xd7\x35\x58\xa8\xc2\x60\xf1\xef\x02\xb2\x4a\xc4\x01\x7f\xab\xe3\xb6\xe0\xb3\xb8\x83\x9f\xba\xc4\x1e\x9b\x68\x0e\xf3\xc2\x90\x9c\x26\x73\x2e\xa2\x72\x32\x7c\xd7\x9a\x42\x4b\xfe\x99\x90\x8b\x2c\xab\x7d\x07\x95\x77\x69\x75\xf2\x50\x7b\xfa\x66\x33\x3b\x06\x36\xf0\x51\xb2\x14\x6c\x94\x48\x52\xc1\x43\x56\xf1\x89\xed\x6a\xb2\xc8\x1f\x69\xc9\x26\x89\xcc\xc9\xe5\xdd\x0d\x49\x4b\xde\x99\x4a\xf1\x00\xfe\xf5\xb8\xe9\x9d\xa5\x5c\x5f\x96\x8c\x36\xc8\x67\x75\x8b\x71\x47\x72\x8e\x52\x19\x4f\x96\x37\x57\x7d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa9\x62\x29\x79\x47\x05\x9d\xa1\xfa\xf0\xec\xee\xf6\xcb\x77\xe7\x06\x80\x40\xdd\x79\x73\xb5\xd1\x0f\xeb\xae\xd9\xf9\xfb\x7d\xa6\x95\x59\x5b\x78\x0f\xde\x68\xed\xfb\x9e\x8b\xdf\x6b\xbe\x1c\xe2\xd9\x89\xb0\x12\xc0\x1b\x32\x00\xdd\xae\x26\x5c\x44\x27\x29\x97\xe9\x55\xad\xa2\xe6\x45\x9e\x3e\x3c\x6d\xfa\xdc\x48\x13\x59\x76\x9b\x51\x71\x51\x14\xa5\x5c\x6c\xd6\xba\x86\x20\x07\xf7\xbd\x5b\x00\x3a\x98\xbb\x87\x05\x9e\x08\xf8\x54\x0a\x14\x62\x70\xd8\xcd\xfb\x7f\xa3\xbd\x62\x56\x0a\x60\xc1\x4e\x2e\x2a\x2d\x73\xaa\x79\x72\x42\x64\x49\x4e\xde\x51\x51\xd1\x6c\x63\x6c\xca\xce\x15\x6f\x13\x30\x77\x7e\xb4\xbd\xb6\x5a\xc0\x67\x3b\x19\xd8\xdd\xdf\x6b\x5a\x1a\x54\x77\x79\xf7\x5d\xd4\xb7\x4a\x53\x5d\xad\x51\x86\x1d\xd4\x6a\x3b\x7d\x1a\x93\x8c\x2a\xfd\x6d\x91\x1a\xfc\xb0\xf2\xeb\x2e\x22\x94\x50\x4d\x33\x39\xfb\x57\x46\xb3\xcd\x97\x21\x04\xa4\x2e\x9b\x9d\x38\x8b\x88\xf5\x28\xad\xee\xfd\xf7\xa7\x8a\x18\x51\xd2\x40\x09\xd7\x8a\x94\x2c\x63\x0b\x2a\xb4\xfb\xfc\x0e\xeb\x25\x9e\xda\x6d\xd9\x0a\x70\xbc\xb6\xb1\xa6\x4c\xb3\x32\xe7\xa2\x3d\xce\x1d\x7c\x7f\x29\x45\xca\x91\x2b\x01\x2b\x12\x7e\xd1\x1e\x6b\x3b\x54\x6e\x73\x3d\xd8\xe1\x6c\xd0\xae\x14\xd9\x98\x4f\x7b\x7b\xf0\xb5\x7b\x2b\xba\xcc\xf1\x21\x78\x6e\xb6\xe6\xb6\xb6\x7b\xe4\x41\x18\x89\x02\x12\xa7\x6f\xde\x9b\x4e\x36\xa7\x8b\xbd\x19\x3b\x70\xc0\x29\x6c\x8f\x0a\x1c\xdb\x79\x6f\x73\x4a\xd8\x05\x8d\xd8\xba\x19\xa3\xd5\xa9\x6c\xc7\xd4\xad\x8d\xbf\x5c\xf9\x0c\x13\xab\x78\xdf\x26\xf4\xf2\x68\xbd\xb4\x9d\xb2\x04\xf1\x8d\x61\x2c\x5e\x68\x05\xfe\xd6\x5a\x1a\xf5\xe2\xe3\x74\x61\x81\xa4\x30\xb0\x10\x7e\x1c\xcb\x79\x63\x03\x9b\x4a\x2b\xc1\x52\x52\x70\x86\x29\xdb\xa9\xb0\x9b\x09\xf4\x8c\xd1\xd4\x3e\x34\x74\xb3\x64\xf6\xb7\x91\xf5\x38\x0c\x62\x50\xd0\x6f\xd7\xd9\x60\x29\x66\x12\x07\x6f\x84\x57\x7f\x95\x56\x07\x68\x33\x10\x1a\xac\x02\xdc\xc5\x88\xa8\x2a\x99\x13\x6a\x04\x19\x65\xae\x83\xc1\x17\x6c\x92\x53\xc1\xa7\x4c\xe9\x89\xaf\x97\xab\xbe\xff\xfd\x0f\x5d\x6c\xc7\x5b\x59\x12\x1b\xa5\x3d\x72\x09\xb1\xed\x1a\x6b\x98\xe3\x0a\x37\xc2\xf7\x5c\x6b\x64\x0a\x99\xda\x05\x3f\xc2\x52\x34\x7d\x30\xa4\x14\x97\x52\x31\xf0\x1a\xe8\xe2\x51\x4e\x0c\xdb\xdb\x98\xf6\x7f\x19\xda\xf9\xdf\x27\xe4\xec\x11\x98\x90\x13\xf3\xe7\x09\x4e\xc7\x47\x9a\x35\x15\x4e\xf5\xb4\x30\x69\x5a\xc9\x67\x33\x56\x76\xda\x58\xcd\xa7\x6c\xc1\x84\x3e\xb7\xc9\xc0\x85\x6c\x74\xe5\xfc\xfc\x6a\xfd\xc9\xea\x34\xbf\xff\xfd\x0f\x27\xe4\xac\xbd\x27\x1d\x43\x72\x91\xb2\x4f\xe4\xf7\x68\x2d\xe5\xca\xec\xde\xf9\x04\x15\x2e\x6a\x29\x34\xfd\x64\x46\x4c\xe6\x52\x31\x81\x0a\x30\x2d\xc9\x9c\x2e\x18\x51\x32\x67\xe4\x91\x65\xd9\xd8\xda\x8f\xc9\x23\x5d\x76\xe7\x40\x77\x47\x08\x99\x55\x49\x41\x4b\xdd\x02\xe3\xbd\x5c\xc2\x07\x2e\xf6\x9a\xc0\xf1\x2b\x2e\x56\x5d\x3a\x3b\x05\xbc\x0d\x4a\xe1\x19\xd7\x2e\xeb\x80\x8d\x2f\xd2\xcb\x57\xe6\xb0\x4a\x7e\x5f\x69\x59\xaa\x57\x29\x5b\xb0\xec\x95\xe2\xb3\x31\x2d\x93\x39\xd7\x2c\xd1\x55\xc9\x5e\xd1\x82\x8f\x13\x29\x0c\x60\x40\xaa\xdf\x3c\xfd\xb5\xd9\x09\x35\x36\x0b\xdd\xad\x25\x0e\xdc\xb1\x6e\xdb\x43\xdc\x8e\xf5\xb1\x35\x3c\x8f\x1a\x3d\x62\x83\x02\x54\xb1\xf1\xbb\x84\xfa\xce\x67\xdf\x2a\x50\xf9\xbd\xda\xc7\x4e\xb9\xc2\xc9\xf1\xb4\xb9\x73\xbf\x6c\xad\xf0\x64\x75\x0c\x83\x93\xd0\xdb\x17\x50\x58\x8b\x4a\xe4\x34\x45\x32\x42\x45\x67\x9c\xfb\x81\xef\xac\x39\x0f\xa8\xb7\x9f\x2c\xc7\xd0\x85\xcc\xc6\x54\xa4\xe6\xdf\x98\x78\x23\xd9\xed\x91\x1a\x78\x00\x15\xdf\x2b\xf2\xfb\xf6\xe6\xea\xf9\xc1\xf3\xd5\xaf\x2b\xbe\x0f\x4c\xd7\xc7\x9e\x65\xf9\xf2\x40\x66\x19\x45\x12\xf4\xd0\x2d\x2b\xe6\x18\x98\xb6\x20\xc2\x95\xeb\xf5\xff\x58\xcf\x01\x5f\x3f\xa7\x8b\x75\xde\x6d\xcd\x6f\xc8\x08\x81\xf3\xfd\xba\xfe\xa2\xa9\x0b\x07\xcf\x7f\xaa\xb4\xad\x50\xe2\x32\xbf\xb6\x96\xe1\x84\xd3\x39\x15\xb3\x1d\xac\x4d\xd0\xc1\x38\xbf\x49\x33\x91\xb1\x19\x73\x5d\xac\xf6\xc2\x67\xa7\x4c\xdd\x90\x53\x41\x54\xc9\xb8\xf2\x55\x3a\x8c\xd8\xaa\x34\xa1\x0b\xca\x33\xb0\x13\xca\x7b\xc5\xca\x85\x55\xb6\x63\x0d\x2d\xba\x2a\x63\xe3\xb5\xd5\xc8\xf0\x1e\x49\xc2\x75\x6b\x58\x3f\x95\x5d\x0b\x00\xa9\x77\x65\xf6\x5b\x67\xbd\x17\xf9\x16\x55\x0b\x5b\x7f\xde\x6a\xa0\xe8\x16\xf2\x0c\xfc\xfd\x2b\xa3\xa5\xbe\x67\x54\x7f\xe4\xbb\x38\x94\x35\x90\x6e\x7d\xe7\xf4\x72\x35\x40\x3f\x32\x32\x93\xda\xb0\x9d\x15\xc0\x3e\xca\x07\x98\xa2\xde\x03\xda\xa1\x21\xba\x5e\xe5\xc7\x92\x42\x86\x09\x29\x22\x97\xd9\xfe\x70\x7d\x9d\x56\x16\xb1\x90\xa4\xf1\x6d\x32\x2d\x65\x0e\xca\x45\x3c\x3b\x34\x55\xee\x4e\x86\xb1\xd7\x25\xe7\x4c\xa9\x9d\x29\x8e\xdb\x61\x25\xf8\x36\x5e\xe5\x15\x23\x7f\xee\x7e\xc3\x70\x76\x23\x54\xa4\x4c\x53\x9e\xb9\xab\x8c\x5b\xe1\x77\xa9\x0b\xbb\xee\x5c\x60\xc9\xa8\xda\xc5\xd0\xb4\x66\xfd\x01\x5e\xc6\x49\x4b\xc1\xc6\x8f\xb2\x4c\xc9\x25\xcd\x59\x76\x49\x15\xb3\x7d\x35\xf3\xd5\xe0\x19\x9d\xaa\xbd\x4e\x79\xb3\x3a\x74\xcb\x94\x51\xc9\x57\x1b\x14\xe0\xaf\x5a\xa0\xc5\x09\x8e\x9c\x56\xfa\x63\x59\xb1\x11\x79\x6b\xa8\xd7\x88\x7c\x2b\x1e\x84\x7c\x7c\xda\x5c\xf5\x4e\x63\x5d\x6b\xa6\x4d\x0f\x49\x97\xee\xbc\xa5\xd8\xf3\xd3\xed\x39\x23\x8b\xf0\xb7\x68\x9f\xdb\xc4\xc6\xbf\xea\x66\x64\xfe\xb9\xa6\x6a\x34\xa2\x75\x29\x67\x25\x53\x0a\xb5\x38\xd1\xea\xfb\x86\xc1\xe2\xaf\x4c\x58\xfb\x70\xe7\xf4\x6e\x36\x7d\xe5\x66\xea\xe8\xda\xac\xfe\xc5\x9e\xb7\x1d\xac\xc8\x36\xb2\x1a\xbb\x23\x23\x1a\x13\xdd\xa2\x64\xdc\x36\xc3\xcd\xca\xc5\x06\xd5\x6b\xbc\x8b\x4c\xc9\x2e\xcd\xb8\x5b\xdd\xe5\xdd\x77\xdb\x37\x7b\x2b\xed\xeb\xa2\x4f\xdd\xea\xc7\xa7\x2a\x1e\x3b\xef\x4c\xa7\xb2\x31\x94\xd3\x3f\x8e\x82\xf1\x39\x55\x8b\xcf\xab\x54\x3c\xba\x3a\xf1\xa8\x8a\xc4\xe3\xa9\x10\x7b\x2a\x0f\x3b\x2f\xd2\x2e\x85\x61\xe8\x1d\x8a\x53\x12\x3e\xbb\x7a\xb0\x73\x4f\x76\xa9\x04\x43\xf7\x24\x4e\x0d\x78\x6c\x05\x60\xd0\x16\xec\x54\xfa\xc5\xec\x43\xa4\xa2\xef\xc8\x2a\xbe\xce\xbd\x08\x54\xeb\x85\xee\xc8\xe1\x54\x79\x2f\x56\x89\xd7\xb9\xc5\x3b\x14\x77\xa1\xdb\x1a\xa5\xac\x3b\xb2\x9a\xae\x63\xfd\x71\xaa\x39\xcb\x63\xb2\x34\x84\x45\xbf\x69\xbc\xdc\x64\xd2\x2d\x83\x08\x0e\x70\xf6\x0d\xe7\x70\xd7\x64\x25\xfb\x72\xea\x86\x79\xee\xeb\xff\x61\xa7\x1c\xce\x0d\x5b\x16\x9e\xa5\x5e\xa6\xec\x5a\x02\x21\x57\xd7\xb7\x1f\xae\x2f\x2f\x3e\x5e\x5f\xad\x72\xe1\xf1\xec\xf2\x6e\x45\xd1\xb8\xc1\x2e\x6f\x79\xc1\x10\xab\x2d\x3f\x19\xd8\xda\xf2\x53\x55\xf1\x4d\x5f\x3d\x9d\x79\x7f\x12\xcf\xf0\x24\xe2\xda\x8d\x27\xf6\x84\x28\x00\xb6\xd0\x6b\xd5\x70\x95\x73\x99\xa5\xca\xc5\x37\xdc\x5c\xf9\x44\x04\x5c\x24\x59\x95\x1a\x96\xeb\xdb\x6f\x6f\xae\xd4\x84\x90\x2f\x59\x42\x2b\x65\x58\xb7\xed\xe2\xba\x14\xa7\x9a\x7c\xf3\xfe\xeb\x7f\x83\xd0\x2e\xf8\x72\xe4\xd3\xa5\x42\x49\x3f\x4e\xb1\x2a\x21\x2c\x14\x7a\x45\xb6\x0e\x66\x94\xd0\xc2\x60\xe0\xed\x2a\x7f\x8e\xd9\x6b\xa8\x48\xc9\x9c\x65\x85\xa1\x0e\x0f\x8c\xd4\x75\xca\xcc\x80\xf0\x2b\xc6\x6f\x58\x3f\xf6\x19\xd3\x98\x94\x60\x97\xab\xfa\xce\x03\xe8\xd0\xb0\x3f\x41\xb7\xde\x52\x17\x58\xed\xcb\x23\x55\x56\x43\xb9\x71\xb6\x1d\xa0\xd2\xad\x8f\xdb\xae\xd2\xda\xa2\xcc\x42\xca\x02\x7f\xad\xcd\xd9\x4c\xb6\xd6\x5b\xa1\x73\x18\xd7\xc1\xda\xf3\xed\x9e\x80\x9b\x0b\x4f\xaf\xe9\xae\xd8\xea\x26\xb7\x06\xf6\xb1\x40\x8d\x29\x87\xcd\x45\xb1\x72\xc1\xd2\x37\x60\xcf\x71\x8f\xd0\xdb\xb6\xfd\xac\xba\x77\xcc\x4c\x03\xeb\x58\x0d\x1c\xf9\xaf\xff\xfe\xd5\xff\x1f\x00\x00\xff\xff\x20\x58\x67\x59\xb4\x7f\x03\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfd\x77\xe3\xb6\x95\x30\x8e\xff\xde\xbf\x02\xc7\xed\x39\xb6\x5b\x49\x33\xd3\x76\xdb\xee\x3c\xfd\xb6\xc7\xf1\x78\xba\x7e\x92\x99\xf8\x19\x4f\xd2\xb3\xdf\x6c\x76\x03\x93\x90\x84\x9a\x04\x18\x02\x94\x47\xdd\xec\xff\xfe\x39\xb8\x17\x00\x41\x49\x36\x01\x59\x92\x3d\x59\xe2\x87\x64\x4c\x91\x78\xbd\xb8\xef\x2f\xb4\xe2\xdf\xb2\x5a\x71\x29\x5e\x13\x5a\x71\xf6\x49\x33\x61\xfe\x52\x93\xdb\x3f\xa9\x09\x97\x2f\x16\xaf\x7e\x71\xcb\x45\xfe\x9a\x9c\x37\x4a\xcb\xf2\x03\x53\xb2\xa9\x33\xf6\x86\x4d\xb9\xe0\x9a\x4b\xf1\x8b\x92\x69\x9a\x53\x4d\x5f\xff\x82\x10\x2a\x84\xd4\xd4\x3c\x56\xe6\x4f\x42\x32\x29\x74\x2d\x8b\x82\xd5\xe3\x19\x13\x93\xdb\xe6\x86\xdd\x34\xbc\xc8\x59\x0d\x9d\xbb\xa1\x17\x2f\x27\xaf\xfe\x34\x79\xf9\x0b\x42\x04\x2d\xd9\x6b\xa2\x9a\x1b\x95\xd5\xbc\x82\x9e\x26\xb2\x62\x35\xd5\xb2\x56\x93\x4c\xd6\x4c\x9a\xff\x95\xbf\x50\x15\xcb\xcc\x18\xb3\x5a\x36\xd5\x6b\xb2\xf1\x1d\xec\xce\x4d\x85\x6a\x36\x93\x35\x77\x7f\x13\x32\x26\xb2\x28\xe1\xdf\xb8\xc4\xeb\x60\x54\x78\x5c\x70\xa5\xbf\x5c\xfb\xe9\x2b\xae\x34\xfc\x5c\x15\x4d\x4d\x8b\x95\xd9\xc2\x2f\x6a\x2e\x6b\xfd\xbe\x1d\xdb\x8c\xa5\x9a\x9b\xf0\xdf\xf6\x45\x2e\x66\x4d\x41\xeb\x6e\x27\xbf\x20\x44\x65\xb2\x62\xaf\x09\xf4\x51\xd1\x8c\xe5\xbf\x20\xc4\x6e\x97\xed\x73\x4c\x68\x9e\xc3\x11\xd0\xe2\xaa\xe6\x42\xb3\xfa\x5c\x16\x4d\x29\xfc\x98\xe6\x9d\x9c\xf9\x5e\x5f\x93\x8f\x73\x46\x2a\x9a\xdd\xd2\x19\x73\xe3\xdd\xb0\x9c\x68\xe9\x3f\x20\xe4\x1f\x4a\x8a\x2b\xaa\xe7\xaf\xc9\xc4\x6c\xf1\xc4\xec\x60\xf0\x33\x9e\xcf\x15\x76\x12\x3c\xd7\x4b\x33\x5d\xa5\x6b\x2e\x66\x0f\x0d\x9f\x51\x4d\x0b\x39\x23\x08\x46\x64\x2a\x6b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xdc\xcd\xef\x81\x19\xe1\xa7\x6b\x73\xba\x5e\x7d\x1c\x3d\xa5\x39\x15\x82\x15\x44\x4e\x49\x53\xe5\x54\x33\x45\xb4\x6c\xf7\xe7\xe1\xed\xb1\x1f\xaf\xcd\xe6\x7c\xed\xf9\x86\xe9\xe0\xab\x8b\x57\xb4\xa8\xe6\xf4\x95\x7d\xa8\xb2\x39\x2b\x69\x7b\x86\xb2\x62\xe2\xec\xea\xf2\xdb\xdf\x5d\xaf\xfc\x40\xba\x4b\x09\x41\x94\xdc\x32\x56\xa9\xf6\x52\x90\xa6\x32\x6b\x32\x8b\x23\x37\x4b\xa2\x6b\x9a\xdd\x72\x31\x83\xa5\xcf\x70\xbd\xe7\x78\x30\x6a\xb2\x36\x65\x79\xf3\x0f\x96\xe9\xe0\x71\xcd\x7e\x6c\x78\xcd\xf2\x70\x2a\x66\x67\x1d\x26\x58\x79\x6c\xf6\x29\x78\x54\xd5\x66\x5a\x3a\xb8\x87\xd8\x02\x54\xd4\x79\xbe\xb2\xcc\x9f\xc6\x2b\xbf\x12\x62\x76\x07\xbf\x24\xb9\xc1\x4b\x66\x41\x73\xe6\xae\x0b\xcb\xed\x96\x9a\x03\xd6\x73\xae\x48\xcd\xaa\x9a\x29\x26\x10\x53\x99\xc7\x54\xd8\x55\x4e\xd6\x3a\xbf\x66\xb5\xe9\xc8\x5c\xe9\xa6\xc8\x0d\x42\x5b\xb0\x5a\x93\x9a\x65\x72\x26\xf8\x3f\x7d\xef\xb0\x89\x66\xd8\xc2\x40\x90\x26\x70\x21\x05\x2d\xc8\x82\x16\x0d\x1b\x11\x2a\xf2\xb5\xbe\x4b\xba\x24\x35\x33\xe3\x92\x46\x04\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xcd\x08\x17\x53\xf9\x9a\xcc\xb5\xae\xd4\xeb\x17\x2f\x66\x5c\x3b\x54\x9d\xc9\xb2\x6c\x04\xd7\xcb\x17\x80\x75\xf9\x4d\x63\x8e\xfe\x45\xce\x16\xac\x78\xa1\xf8\x6c\x4c\xeb\x6c\xce\x35\xcb\x74\x53\xb3\x17\xb4\xe2\x63\x58\x8c\x40\x24\x5b\xe6\xbf\xac\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc4\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\xdb\x9e\x89\x79\x64\xb6\xf1\xc3\xc5\xf5\x47\xe2\x66\x84\xe7\x86\x47\xd4\xbe\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x6a\xfc\x72\x5a\xcb\x12\x7a\x65\x22\xaf\x24\x17\x1a\xfe\xc8\x0a\xce\x84\x36\x37\xbd\xe4\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x0e\xa4\x8d\xdc\x30\x8b\x23\xf2\xf5\x57\x2e\x05\x39\xa7\x25\x2b\xce\xa9\x62\x07\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xfa\xf4\x42\xc2\xbd\xfe\xc1\xda\xad\x27\xc4\x91\xdc\x7b\x8f\x3b\x44\x41\xd7\x15\xcb\xfc\x75\xa4\x82\x9c\x55\x55\xc1\x33\xbc\x71\x7a\x4e\x35\xc9\xa8\x30\xdb\xc9\x85\xd2\xb4\x28\xd8\xea\xed\xb8\x77\x16\xf7\xe1\x1f\x02\xc8\x66\x85\x5c\xb9\xc7\x6b\x34\xa3\xfb\x83\x27\xb3\x2b\x6f\xdc\x87\xab\x4c\xb3\x98\x7f\xfd\x87\x07\xb6\x9c\x20\x4b\x34\xe5\xb3\x4d\x9f\xdd\xbb\x97\xe7\xf0\x09\x30\x53\x94\x0b\x65\xbb\x68\x6a\xdc\xcd\x96\x76\x1a\x6a\x4a\x3b\x9c\xc4\x3a\x1c\x3e\xb8\xb3\x7d\x6b\x36\x8d\x4e\x81\xf5\x5b\x6e\xfe\xb5\x1f\x01\xb8\x76\x39\x6d\x67\x3e\x22\x72\xc1\xea\x9a\xe7\x16\x75\x57\x32\x3f\x56\x80\x58\xf3\xa6\x00\x42\x25\x85\xd2\x35\xe5\x1b\x2f\xbd\x6b\x82\x17\x66\xf1\x63\xaa\xf1\x06\x31\x45\xee\x78\x51\x90\x5f\x0b\xa9\x7f\xed\x47\x80\x01\x64\xcd\x67\xdc\x63\x67\x45\xb8\x70\xe3\x02\x59\xb7\x7c\x89\x54\x6c\xa5\xc3\xfb\x07\xff\x46\x31\xc2\xca\x4a\x2f\x1d\x9a\x3a\xf9\xef\xff\x39\x35\x34\x81\xd5\x54\x05\x03\x76\xfa\xbb\x17\xd3\x63\xeb\x39\x29\x12\x71\x5a\xb0\x2f\x32\x67\x67\x3d\xa7\x46\x56\x4f\xee\x0d\x43\xf6\x47\xc1\xe7\xfe\xd4\xc3\x43\xa9\x9b\x82\x29\xcf\xc2\x99\xbd\x7b\xa0\xf3\x88\xb5\xc4\xae\x07\xdf\x63\x53\x56\xd7\x2c\x7f\xd3\x98\x5b\x76\xed\x67\x75\x39\x13\xd2\x3f\xbe\xf8\xc4\xb2\x46\x6f\x60\x29\x1e\x5c\xfa\x03\x40\xeb\x9a\xe1\x1b\xed\x4e\xb0\x1a\xa1\x0c\x67\x04\xac\xa3\xfd\xc1\x6c\x09\xb0\x05\x66\x07\x15\x62\x3d\x45\x35\x57\xd3\x65\xef\x00\x66\x47\xfd\x9e\xb3\x4f\x86\xe2\x01\xef\x1f\xdc\x76\xc3\xc8\x01\x71\xe3\xac\xc8\x47\xe4\xa6\xd1\x84\x6b\xa0\x7c\xd9\x5c\x4a\xb5\x8e\xed\x56\x1b\xc5\xa3\x85\x79\x2d\xb8\x04\xc6\x85\x48\x61\x80\x95\x94\x86\x5c\x01\xc3\xc4\xc2\xe1\x27\xb0\xf2\xf6\x33\xbe\x4a\x6d\xd6\x5b\x29\x95\x6e\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x3b\xae\xe7\xf0\xc7\xac\x66\xc8\x34\xa9\xa6\x34\x83\xde\x31\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x66\xf3\x60\x5a\x25\x63\x5a\x11\x5a\x14\x6e\x09\x21\xd4\x22\xf5\x28\x0d\x03\x41\x4e\x1c\x87\xd1\x3b\x8a\xe5\x0e\x46\x9e\xfa\xac\x02\xde\xc6\xe3\x1a\x11\xa6\xb3\xc9\xe9\xa8\xb7\xfb\x4c\x96\x95\x41\x08\x14\xf6\xe0\x66\x49\xb8\x36\xbc\x3b\x72\x43\xb5\x6c\x66\xb8\x53\xac\xb0\x13\x77\xbc\x2c\x1c\xbe\x61\x2e\x41\x1a\xdc\x40\x6e\x56\xdb\x11\x6e\xee\x91\x63\x57\xcd\x70\x1c\x37\x09\xf6\xaf\xa4\x3a\x9b\x5b\x34\x9c\xc9\xba\x66\xaa\x92\xc2\xf4\x8c\xbf\x5c\xb4\x6b\xfb\x3f\xe6\x9d\xde\xf1\x4c\xa7\x27\xea\xb4\x3d\xec\x39\x9f\xcd\xdd\x59\xd3\x1a\xd1\x71\x17\x46\xfa\x8e\x1c\x51\x09\xad\x6b\xda\x77\x8f\xb8\x66\x65\x0f\x22\x21\x5b\xdc\x7e\x42\xce\x84\x45\xf6\x2d\x60\x07\x20\xa6\x59\x5d\xfa\x8d\x04\x28\x04\xb4\xa7\x70\x13\x78\x69\x38\x21\xae\x2d\x98\x93\x97\x11\xe3\x9d\x98\x9b\x40\xb8\x3e\x56\x70\x6b\xc7\xb2\x3a\x9d\x90\x33\x22\x1a\x8f\x78\x1e\x9a\x82\x90\x7e\x06\xb6\x23\x33\x2d\x25\xdb\xbe\xfa\xf1\x51\x1c\xfa\xc6\x76\x3f\x83\xb6\xde\xc6\x76\xfe\x4c\x44\x5c\x42\xf3\x3a\xee\x5a\xef\xab\xb1\x84\xc4\xbd\xed\xe6\x10\xf3\xf6\x0a\xc4\x9c\xe1\xcd\x51\xac\x60\x99\x36\xd4\x90\xd5\xe5\x88\x50\xa5\x64\xc6\x8d\xa8\xd0\xc2\x7e\xf7\x42\xe1\x4a\xfa\xf7\x9e\xa4\xee\x3f\x49\x5e\x3f\x01\x69\xb4\x7b\xbf\x63\xbf\x5b\xdb\x8d\x82\x2b\x6d\x10\x54\x77\x57\x3a\x78\xf7\x66\x09\xbf\x1e\x2b\x52\xd0\x1b\x56\x3c\xc0\x57\xad\xb6\xf8\xcb\xdf\xb6\x48\x34\x70\xcf\x82\xa2\x10\x42\xdb\x56\xa1\x21\x58\xb7\x95\x7b\x3d\x9c\x80\x18\xe4\x98\x7a\x64\x05\x47\x84\x92\x5b\xb6\x1c\x21\x4a\x17\x5e\x85\x93\x34\x05\xe8\xb8\x66\x48\xd0\x0d\xdc\xdd\xb2\x25\x74\xf8\x30\xbb\xb9\xb1\xab\x54\xb8\xc3\x96\x82\x01\xda\x36\x36\x13\x4d\xfc\x62\x8b\x0d\x4a\xbf\x1a\xd8\x6e\xd9\x83\xec\xf3\xa6\xb6\xa6\x6c\x04\x70\x87\xf3\x80\x43\x02\x0a\xec\xe0\x81\x1a\x11\x99\x6d\xd6\x3f\x3c\xdc\x1e\x14\x38\x1f\x6a\x6e\xf7\x1e\xb5\xae\xc4\x0b\x62\xda\x07\xaf\xc3\x41\x78\x3f\x56\x08\xaf\x06\xef\xcc\x39\x28\x2b\xcd\x45\x01\x34\x92\x0e\xb4\xd8\xbe\xa5\x05\xcf\x03\x1d\xa8\x61\x36\x2e\xc5\x88\xbc\x97\xda\xfc\xef\xe2\x13\x57\x86\xc7\x7c\x23\x99\x7a\x2f\x35\xfc\x39\x21\x7f\xd3\x78\xf5\xbe\x8a\xc4\xcb\x6d\xdb\xfa\x0c\x70\x7d\x87\x3e\x81\x33\x81\x48\xd4\xec\x70\xa8\x89\x53\x13\x23\x99\x03\x8b\x6e\x77\xce\x60\xad\x4b\x61\x84\x02\xdc\xb9\xe4\xa1\x40\x19\x8b\x72\x36\x0e\x59\x36\x0a\x54\x69\x42\x8a\x31\xb0\x51\x1b\xc7\xc4\x03\x32\xe3\x86\x47\xb4\xc3\xe1\xef\x1f\xfa\x6f\xda\x0c\xfb\x95\x1e\x05\x1f\x27\x8f\x1b\x0c\x36\xa7\x0b\x60\xed\xb9\x98\x15\x9e\x89\x1f\x91\xbb\x39\xcf\xe6\x28\x3d\x82\x26\x4c\xb3\xba\xaa\x99\xe1\x18\x28\xe8\xcc\xcc\x93\x19\xab\xd3\x41\xff\xa3\x11\x0d\x70\x7c\xd4\x77\x17\x34\x63\x39\xc9\x41\x64\x41\xd5\x2b\xd5\x6c\xc6\x33\x52\xb2\x7a\xc6\x48\x65\x48\xff\x76\x00\x9f\x46\x89\xb1\x25\xd3\xe3\x70\xc0\x2d\x6e\x18\x21\x9f\xc6\xb7\xcd\x0d\xab\x05\xd3\x4c\x8d\x0d\x7f\x32\xb6\xb3\xd7\xb2\xe4\x59\x74\x67\x3b\xe9\x06\xf8\xac\xb7\x46\x6e\x3b\x10\x8b\x05\x32\xe2\xc0\x62\x0d\x2c\xd6\xc0\x62\x0d\x2c\xd6\xc0\x62\x45\xb7\x81\xc5\x7a\xf4\xf0\x03\x8b\x35\xb0\x58\x07\x67\xb1\x3a\x5d\x94\xb4\x4a\xed\x01\xf5\x72\x5b\x28\x02\xff\x8e\x0a\xdd\x55\xcd\x1f\x30\x7c\xce\xaf\xa1\xab\x02\x34\x7c\xcc\xb5\x25\x4e\x1f\x41\x6d\x68\x2d\x91\x35\x15\x33\x46\x5e\x8d\x5f\xbd\x7c\x99\xa2\x20\xb4\xe0\x1c\xf5\xc5\x54\xd6\x25\xd5\xf0\xcd\xef\x7e\xdb\xf3\xc5\x23\x4e\xe5\x3e\x7b\xc9\x61\x0c\x75\x16\xf3\x78\xdb\x4c\x87\x45\xbe\xc7\x96\x06\x64\x4c\x48\x4d\x4a\xa6\x09\xed\xe7\xc9\x42\xb5\x3b\x2f\xd9\xc8\x99\x43\x11\xed\x58\xb7\x11\x67\x14\xcc\x89\x14\xd6\xf4\x62\x0e\xbf\xff\x70\xb7\x5a\x41\xc6\xa8\x62\x86\xc4\xdf\x30\xb3\x8a\x7e\x53\xa0\x26\x4a\x96\x66\xd6\x5c\x68\x87\xc4\xcc\x12\x98\x3b\x18\x72\xc2\x26\xb3\x09\xc9\x1b\xe8\x96\x0a\xeb\x07\x73\x8a\xab\x55\x4b\xa5\x59\xd9\x6f\x0b\x34\xc4\xb0\x86\xff\x99\x6d\xd1\xf5\x12\x2c\xe4\x0b\x26\x74\x43\x8b\x62\x49\xd8\x82\x67\xda\xef\x1f\xb8\xed\x70\xad\xa2\x76\x2a\x81\x8d\x8e\x67\x9d\xc7\x6b\x37\xb4\x8f\x48\xa5\x70\xbe\x6b\x7d\xc7\xe0\x9c\xce\x0d\xf8\x60\x57\x32\xb9\x57\x26\xd4\xa6\x5f\x34\xdb\xc2\x3f\x01\xb8\xbf\xfe\xd0\x6f\x65\x23\xc9\xf4\x27\x81\xe6\x6c\xc7\x5a\x59\x83\x97\xac\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xce\xad\x91\xd3\xc8\x01\xf5\x9c\xa1\x91\xf2\xec\xfd\x9b\xb8\x1d\x23\xd6\x39\xe0\xa3\xac\x64\x21\x67\xcb\xf0\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb8\x36\xe8\x2d\x1e\x3d\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x7f\x1b\x58\xac\x07\xdb\xc0\x62\xf9\x36\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x87\xea\xe6\xb1\xa6\xa1\x47\x4d\x61\xbb\xc1\x2b\x99\x3f\x22\x78\xab\x92\xf9\x03\xb1\x5b\xa8\xd3\xcf\xe4\xb8\x90\x19\xd5\x36\xcc\xd6\x7c\x62\xad\x50\x8a\x96\x68\xa6\x18\x91\x7f\x4a\xc1\x30\x9a\xc5\x5c\x0f\x30\x16\x48\x3d\x67\xb5\x79\xfd\x44\x9d\x3e\x18\x42\x30\xc4\x7e\x0d\xb1\x5f\x43\xec\xd7\xbd\xed\xd9\xc4\x7e\xcd\xa9\x42\xb8\x45\xd2\x78\x7f\x28\x58\x80\x93\x3e\xb2\xba\xfc\x99\x46\x82\x19\x70\xb7\xe0\x08\x49\x22\x5a\x90\xc2\x9d\xc9\xad\xc1\x9f\xe5\x57\xdd\xfd\xb0\x62\x35\x2c\x8a\xe6\x39\xcb\x49\xc5\xea\x31\x82\xa8\x24\x53\x2e\xf2\x0d\x6b\x75\xfb\xd3\x8f\x1e\xf6\x18\x8a\xd5\x5d\x47\xd4\x37\xfb\x89\xc7\xea\x4e\x64\x0b\xa3\x62\x68\x19\xed\x10\xc1\x67\x11\x9d\x95\x2a\xa1\x8f\x89\xb6\x06\xc5\x2f\x23\x65\xf4\x74\x31\x1b\x84\x63\x67\x7e\xdc\x52\xfd\x94\x24\x0a\x9d\x59\x79\xfc\xc7\x86\xd5\x4b\x88\xcf\x6f\xc5\x4e\x9f\x8b\xc4\x7a\xc4\x70\x45\x32\xaa\x90\xac\xa6\xb0\xca\x97\x53\x8c\x9a\x14\x4d\x51\x8c\xb0\x9f\xd5\xcb\xea\xd0\x1c\xc0\x81\x90\xe6\xf7\x64\x8d\x58\xa2\x8a\x66\x3b\x1d\xc8\xf6\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\x93\xed\xe3\xd8\xb6\x15\x60\xb6\x12\x5f\x1e\x2d\xaf\x3f\xb0\x27\x8f\xd0\x2b\xc2\xcb\xc9\x93\xd9\x8d\x6e\x91\x6c\xaf\x5f\x24\x5b\xeb\x18\xc9\x56\x7a\x46\xb2\xad\xae\x91\x3c\x42\xdf\x48\xb6\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xfd\xa8\x1f\xc9\xe3\x84\xf3\xed\xd5\x90\x64\x07\x17\x2b\x1c\x3f\xc8\xec\xb4\x3f\xbd\x24\x89\xd5\x4d\xc2\xb5\xea\xa8\x27\x0f\x7d\x2e\xdb\xa9\x26\xc9\x8e\x4e\xc5\x65\xc6\x01\x5d\xd8\xa1\x94\x95\xe4\xe9\x15\x96\x0f\x4e\xc1\x0e\x1f\xad\xe1\xdb\x6a\xf4\x47\x68\x05\xc9\xa3\x34\x83\x64\x7b\xed\x20\x79\x2c\xb0\xef\x4c\x4b\xb8\xd3\xae\x80\x4f\xfa\x0a\xfc\xd0\x1e\xc1\x6d\x25\xdf\xc0\x60\x58\xe4\x2e\x4a\x5a\x99\xdb\xf7\xdf\x86\x89\x00\xc0\xfc\x1f\x52\x51\x5e\x2b\x23\xdd\x58\xbd\x76\xf8\x9b\x55\xdf\x05\xdd\x24\x4f\xa0\x32\x03\x1b\x1a\xbf\xa0\x85\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\xb9\x83\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\x74\xcb\x96\x47\xa3\x28\xf5\x40\xb7\x85\x37\xfb\xe8\x52\x1c\x21\xeb\xb4\x76\x2f\x3d\x9f\x25\x45\xb1\x24\x47\xf0\xdb\xd1\xae\x79\xd4\x2d\xf8\xa3\x30\x35\xeb\xb6\xec\xc7\x56\xd7\xe9\xb1\x0a\x6e\xd2\x81\xbe\x2f\xd9\x72\x5b\x47\x84\x24\x98\x7f\xd7\x19\xd1\x31\xd4\x00\x66\x46\x76\xf7\x7c\x13\x66\x66\x05\x96\xc9\xea\xa8\x50\x5d\xc5\x8b\x22\x61\xb4\x1b\x46\x34\xbd\x65\x60\xe1\x91\x90\x5a\x8e\xe7\x0c\x93\xe9\x21\xe8\xc0\x48\x06\x64\x1a\x05\xe9\x71\x49\x21\xe5\x6d\x53\x39\xd0\x73\xd9\x24\x13\x86\xe4\x22\x93\xa5\xf3\xa9\x47\xbf\xd6\x91\x4d\x30\x77\xcb\x96\x63\xcc\x81\x89\xcf\x61\x60\x20\x01\x56\x35\xf1\x43\x47\x30\xff\x81\x50\x45\x7e\x00\xa6\x52\x90\x13\xf8\xf0\xf4\x87\x14\x97\x02\xbf\x81\xa8\x7d\x95\x0d\x60\x16\x66\x88\xa5\x9d\xa0\x5a\xdd\xdb\x87\x76\x2c\x61\x68\x97\x29\x2e\xdc\x8c\x63\xb4\x37\x9c\x50\xa1\xf9\xa9\x57\xd2\x4c\x08\xc0\x01\x70\xc9\xb9\x14\xc7\x1a\xe7\xe7\xf0\x9a\xeb\x20\xc5\xeb\xc0\xef\x7b\x6b\xf1\x43\x6b\x01\x1e\x79\xce\xa6\xb4\x29\xb4\xcd\x46\x6a\x50\x1f\x50\xfa\x84\x11\x3e\x3a\x7b\x89\x65\xf8\xa7\xb2\xbe\xe1\x79\xce\x04\x84\x38\xb8\xe9\xdf\x48\x17\x10\xd4\x82\xbb\xc1\x6c\x9d\x33\x4e\x19\xf6\xac\x50\x72\xb4\xda\x63\xe6\xb3\x95\x9a\x5b\x74\x37\x67\xa2\x3b\x00\xe1\xca\x6c\xaa\x62\x09\x4c\xed\x41\x5c\x7f\x1e\x8f\xf3\xb6\x76\xbd\xe2\xea\x09\xf0\xde\xea\xa0\x03\xea\x8b\x42\x7d\x42\xea\x01\xfb\x7d\xb6\xd8\x6f\x0d\xe8\x77\x81\x00\xd7\x3a\x1d\x70\x60\x32\x0e\x14\x2e\x0d\xf2\x13\x5b\x01\x50\x31\x86\x5e\xac\x6e\x4a\xaa\xd5\x99\x41\xa0\xd7\x76\xfa\x32\x17\x06\x07\x78\x16\x7a\xc8\x9d\x31\xb4\x11\x36\x19\x3c\x98\x43\xdb\x61\x11\x5f\xac\xda\xdc\x13\xc6\x74\x82\x8b\x14\x4c\x81\x8a\x9d\x79\xff\x8a\x60\x18\xe8\x35\x65\x29\x10\x0a\xd7\xaa\x0f\x45\xbe\x1a\x1c\xd7\xf6\x0d\x7a\xfd\x92\x51\xa1\xc8\x91\x73\xf1\x38\x56\xed\x1b\x47\x49\xf7\xcd\xa5\xbe\xf4\x63\x43\xa6\xe3\x30\xdd\x65\x3b\xf4\x60\x47\x19\xec\x28\x61\x1b\xec\x28\xeb\x93\x18\xec\x28\xf7\xb5\xc1\x8e\xb2\xd5\xf8\x83\x1d\xa5\xdb\x06\x3b\xca\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xd8\x8f\x76\x61\x47\x69\xc5\xa0\x43\xc8\xd1\xa1\xc8\x6a\xfd\xc4\xb1\xca\x16\xd5\x3c\x6b\xa3\x42\xdd\x5b\xf8\xaf\xa7\x12\xaa\x43\x31\xf8\xb1\x22\x75\x28\xa0\xaf\x69\x30\x92\x25\xea\x7b\xe5\x67\x2f\x61\xaf\x8d\xb1\x23\xd1\xfa\x67\xae\x5c\x0a\x1c\x58\x0f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x86\xb5\x71\x2e\x39\x39\x71\xba\xd6\x53\x73\xe0\x42\xea\xee\x8f\x42\xf3\x71\xfb\x86\x77\x10\x06\x95\xb0\xcb\xe6\x96\xb2\xe9\x4e\x66\x69\x75\x8f\x62\xa5\xec\x65\x0b\x6d\x06\xff\xb3\xba\x33\x5b\xae\x6c\x25\x35\x08\x4d\xab\x1b\x21\x0c\x7b\x24\x85\x8d\xe2\x48\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xf6\x98\x82\x00\x00\xaa\xb1\x4c\xa2\xcd\xb9\x24\x85\x55\x92\x9b\x27\xd8\x4f\xc2\x24\xfc\x85\x85\xfd\xe4\x7e\x45\x29\x77\xf5\x02\xee\x68\x38\x59\xae\xe0\x1c\x69\x51\xc8\xbb\x14\xfa\x94\x78\x23\xb6\x4e\x0e\x18\x0d\xbd\x77\xc9\x59\x04\x57\xbc\xe5\x63\x79\xf5\x21\xd5\xe0\x83\x6d\x48\x35\xf8\x3c\x52\x0d\x06\x76\xd0\x30\xe7\x60\xff\x5e\x41\x4e\xc2\xbd\xe6\x1c\x24\xe4\xef\x73\x06\xb7\xa8\x66\x68\xbc\x6c\x0a\xcd\xab\x36\xca\x58\xe1\x09\x15\x28\x52\x4f\x6d\x34\x60\xf7\xf6\x9a\xd9\xd0\x6c\xde\x3b\xd4\xca\x2d\x87\xf1\x20\x6a\x59\x01\x36\xc5\x88\x39\xd0\xbf\x63\xa2\x3f\x27\x6b\x63\xd8\x21\x7f\xea\x68\xaa\x28\xfc\xf7\xc6\x15\x0c\x0d\x6c\xe0\x8a\x9c\x18\xea\x58\x2c\xad\xd5\xb8\x83\x08\x3b\x64\x35\x62\x00\xd4\x83\x2d\x98\x63\x50\x67\x7c\xc1\x44\x4b\x7d\x4f\xd4\xe9\xa9\xe3\x89\x57\xf9\x87\x88\xde\x1f\xc3\x61\xc4\x60\xed\x54\xce\x60\x85\xde\x47\x8c\xb0\x81\x23\xf8\x73\x40\x65\xff\xd2\xcf\x13\x44\x0c\x82\x57\xda\x85\x67\x06\x07\xdd\xf2\x02\xbd\xbd\xec\x31\x0a\x2e\x25\xd4\x2a\x4d\x2b\xbe\x45\x88\xd5\xb6\x99\x32\xf7\x1b\x5a\xb5\xd7\xb0\xaa\xcf\x27\xa1\xe5\x13\x9b\xff\x3e\x83\x6c\x4c\xcf\xc4\xdc\x37\xa4\x63\xba\xaf\x3d\x55\x3a\xa6\xbd\x9b\xf3\x3e\xbb\xac\x4c\x07\x35\xdf\x1d\xc6\x74\xf7\x99\x65\x65\x7a\x12\x53\xdd\x33\xcf\xcf\xb4\x3f\x13\xdd\x90\xfc\xe8\x69\xf2\x4b\xa6\x9a\xe1\xb6\xbf\x55\x4f\x6a\x7e\x7b\x52\xd3\xdb\xd3\x9b\xdd\xb6\xe2\x55\x1e\x6b\x6e\x4b\xbe\x26\x8f\x35\xb3\x6d\xe3\xb2\xbf\x1d\x3c\x1f\x2e\x44\xe9\xc0\x3e\xfa\xcf\x23\x34\xe9\x89\x1c\xf3\x9f\xca\x29\x7f\xbf\x0e\xf9\x4f\x10\x8a\x74\x90\x30\xa4\x54\xb2\x9f\x44\xec\x1f\x87\xbb\xb6\xa1\xc8\x5b\x86\x1c\x6d\x89\xbf\x0e\x19\x6a\xf4\x33\x40\x61\x5b\x85\x18\x0d\x58\xec\x89\xb0\xd8\xee\x42\x8a\x0e\x15\x4e\xf4\x33\xc3\x65\x5b\x86\x0e\xed\x4c\xbb\xbd\x9f\x90\xa1\x43\x87\x0b\xed\x21\x54\xe8\x29\xc2\x84\xf6\x10\x22\x34\xd8\x04\x22\xdb\x60\x13\x88\x6d\x83\x4d\xe0\xbe\x36\xd8\x04\x56\xdb\x60\x13\x18\x6c\x02\x83\x4d\x60\xb0\x09\xac\x0f\x38\xd8\x04\x06\x9b\x40\x5c\x1b\x6c\x02\x87\xb1\x09\xa4\x86\xdd\x6c\x07\xcb\x4f\x13\x6e\x73\xd8\x50\x9b\xdd\x87\xd9\x3c\x61\x88\xcd\xcf\x4c\xe1\x92\x1c\x4e\xb3\x1d\x98\x3f\x97\x30\x9a\xe7\x11\x42\xf3\xe4\xe1\x33\x8f\x0d\x9d\xd9\x4d\xd8\x4c\x02\xb4\x6f\x09\xe7\x95\xcc\xcf\x84\xe6\x8f\x2d\x7c\x14\x02\xe0\x7d\xd5\x8f\xe8\x42\xf2\x9c\x54\x8d\xb6\x05\x57\x86\x0a\x48\xbd\x30\x70\x98\x0a\x48\x9d\xc3\x1b\xca\x20\x3d\xd4\x9e\x4d\x19\xa4\xfb\xce\xec\x80\xb5\x90\x54\x73\xa3\x6b\x9a\xe9\xa4\x82\x48\xce\xe0\x38\x94\x44\x5a\x6b\x43\x49\xa4\xa1\x24\xd2\x50\x12\x69\x28\x89\x34\xa4\xf2\x1b\x52\xf9\x85\xed\xd9\xd8\xf1\xc8\x90\xca\x2f\xf1\xd3\x21\x95\x5f\x5f\x1b\x52\xf9\x0d\xa9\xfc\xee\x1b\x7d\x48\xe5\x37\xa4\xf2\x4b\x1b\x78\x48\xe5\x47\x86\x54\x7e\x43\x2a\xbf\xcf\x38\x95\xdf\x50\x12\xe9\xb3\xa8\x0b\x32\x14\x05\x49\x18\xfb\x79\x15\x05\x19\x4a\x22\x3d\x38\xc8\x50\x12\x69\x40\x7d\x43\x49\xa4\x9f\x2d\xf6\x1b\x4a\x22\x45\x0c\x32\x94\x44\x1a\x4a\x22\x3d\xd8\x86\x92\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x92\xfa\xd5\x60\x47\xb9\xbf\x0d\x76\x94\x94\x36\xd8\x51\xa2\x47\x1f\xec\x28\x83\x1d\x25\x6d\xe0\xc1\x8e\x42\x06\x3b\xca\x60\x47\xf9\x8c\xed\x28\x43\x49\xa4\xa1\x24\xd2\x50\x12\xc9\x8f\x3c\x94\x44\x1a\x4a\x22\x41\x1b\x4a\x22\x45\x8c\x30\x94\x44\xfa\x5c\x4b\x22\x75\xc2\x82\x3e\xdf\xba\x48\xe9\xcb\x18\x8a\x23\x0d\xc5\x91\xee\x69\x43\x71\xa4\xa1\x38\xd2\xa6\x36\x14\x47\x1a\x8a\x23\x3d\xd0\x86\x44\x88\x91\x6d\x48\x84\x18\xdb\x86\x44\x88\xf7\xb5\x21\x11\xe2\x6a\x1b\x12\x21\x0e\x89\x10\x87\x44\x88\x43\x22\xc4\xf5\x01\x87\x44\x88\x43\x22\xc4\xb8\xf6\xf4\x06\xb8\xff\x1d\x89\x10\x87\xe2\x48\xcf\xb2\xb2\xc8\x50\x56\xa4\xa7\x3d\x9f\xb2\x22\x43\x71\xa4\x4e\xe7\x43\x71\xa4\x01\x85\x0d\xc5\x91\x3e\x3b\x2c\x36\x14\x47\xda\xd0\xf9\x50\x1c\x69\x28\x8e\x34\x14\x47\x1a\x6c\x02\xbd\x6d\xb0\x09\x0c\x36\x81\xb0\x0d\x36\x81\xd5\x36\xd8\x04\x06\x9b\xc0\x60\x13\x18\x6c\x02\xeb\x03\x0e\x36\x81\xc1\x26\x10\xd7\x06\x9b\xc0\x50\x1c\x69\x28\x8e\x34\x14\x47\x82\x36\x14\x47\x1a\x8a\x23\x0d\xc5\x91\x36\x7e\x0c\x8a\x56\x94\x6c\xee\x83\xec\x58\x58\x3e\x6b\xbb\xb2\x1c\x7c\x23\x94\xae\x9b\x4c\x37\x35\xcb\xe1\xc0\xf0\x30\x0d\x63\xa0\xb4\xac\x9d\x55\x00\x2a\xcd\xbc\x61\x55\x21\x97\x86\xda\x8e\xc8\x95\xcc\x47\xe4\xec\xea\xf2\x9a\xd5\x0b\x9e\x31\x07\x7d\x5f\x5b\x9a\x7e\xff\xbe\x7d\x5c\x56\x3c\xa3\x45\x01\x1a\x8b\x76\x36\x25\x5d\x3a\x5d\xf2\xcd\x92\xb0\x4f\x9a\xd5\x82\x16\x44\x4b\x59\xa0\xf9\xc5\x4c\x06\x10\x62\xcd\x74\xcd\xd9\x82\x11\x5a\xdf\x70\x5d\xd3\x7a\x49\x4a\xa6\x69\x4e\x35\xbd\x7f\xd4\x6f\x14\x0b\x63\x34\xb4\x24\x55\xcd\xc6\x78\x03\x3a\xf3\x00\xd8\xfc\xfa\xab\x77\xee\x7e\xd3\x3c\x77\x01\x09\x0e\xc2\xaf\x9b\x1b\xbf\xdb\xc7\xf7\x73\x5b\xb9\xdf\x2d\x35\x02\xf0\xb4\x2a\x9a\x8a\x2b\xdc\xb3\x7b\x25\xd2\x08\xb6\x24\x8d\x09\xe9\x85\x4f\x26\x16\x8f\x05\xad\x0b\xb1\xe8\x6a\xf6\x98\x58\xf0\x5a\x0a\xe0\x23\x17\xb4\xe6\xf4\xa6\x60\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x0f\xc0\xcb\xb9\xb7\x33\x60\xb0\xcb\xbd\x57\xb2\x9f\x9e\xf5\x50\xb0\xce\x4a\x2f\xc4\xe2\x5b\xda\x55\x33\x88\x8d\x4b\x22\xf6\x05\xb3\x24\x4a\xce\xfb\x17\x14\xc5\x74\xc6\xa8\xc3\xc6\x80\xe1\xef\x7d\x21\x4e\x69\x65\xba\x78\x98\x5e\xa6\xd1\xc9\xf7\xb4\x6c\x2b\x68\x6d\xd8\xae\x3e\x84\xfa\x0e\x39\x7e\x65\x81\xc8\x10\x84\xaa\xe6\x42\xc3\x56\x9f\x5d\x9f\x5f\x5e\x92\x6c\x4e\x6b\x9a\x69\x56\x2b\xc2\x3e\x65\xac\xd2\xe4\xf8\xff\x77\xfc\x70\xbf\x91\x08\x1a\x70\xdf\x2e\x77\xe3\x5b\x07\x24\x50\xde\x88\x09\xc3\xd9\xfd\xea\xe4\xdb\xb3\x0f\xff\xf5\xfe\xec\xdd\xc5\x29\xc8\x2c\xec\x53\x45\x45\xce\xfa\x78\xd0\x46\xb9\x10\x9f\xaa\x66\x0b\x2e\x1b\x55\x2c\x3d\x09\xdf\x7c\xd7\x56\x2f\x99\xc1\x3f\x3d\xa3\x98\xfd\xb6\xe8\x69\x73\xa7\xa0\x67\xa1\x2d\xf4\xb7\x66\xc0\x9a\x29\x59\x2c\x58\xde\xa7\x5e\x81\x60\x4b\xb7\x1d\xad\xa1\xb5\x6a\xb4\xd3\x22\x39\xdb\x69\x23\xb2\x39\x15\x33\x96\x4f\xc8\x1b\xd9\x98\xd1\x7e\xf5\x2b\xd8\xb2\x9a\xe5\x4d\xd6\xbb\x63\xa8\x02\x44\x89\xf9\x57\x23\xc7\x61\x18\xba\xae\xb0\x7a\x9a\xca\x68\xe5\x36\x35\x3c\x15\xb5\x14\x9a\x7e\x7a\x1d\x53\x87\xed\xe8\x57\xc1\x87\x47\xae\x2e\x9e\x34\xd3\x43\x6e\x0c\x57\x54\x40\x49\xb3\x82\x1c\x85\x6f\xf7\xf5\x7d\x61\xe6\xc7\xf2\x10\x76\x30\xb4\x91\x2d\x58\x0d\xda\x27\x0b\x39\x23\x52\xb3\x19\xad\xf3\x82\x29\x08\xaa\xbb\x9b\x33\x28\x52\x88\xa2\x34\x1e\x54\xcf\x58\xcc\x6b\xca\x84\xec\xd5\x60\xbe\x41\x33\x36\x20\xf3\xa3\x9e\x65\xa4\xdc\xbc\xb7\xb5\xec\xa9\x71\xd5\xb9\x7d\xd7\x10\xb5\xe3\x8d\xfd\x9b\xc0\xf5\xd8\x5a\x49\x26\x21\x19\x51\x86\xfd\x9d\xb6\x46\x78\xf3\x3c\xc2\x10\x1f\xad\x2c\x88\xb7\x16\x64\x52\x4c\xf9\xec\x1d\xad\xbe\x64\xcb\x0f\x6c\x9a\x18\x40\x88\x9c\xbf\xd5\x7f\x03\xb2\x34\xe4\x07\x3b\xec\xe7\x5b\xf7\x18\x2f\x16\x63\x93\x49\x33\xa9\x44\x1b\x52\xd6\x2a\xd7\xa1\x0c\x62\xe5\x84\x9d\x73\xf3\x24\x8a\x82\x6e\x9c\x5c\xb4\xc4\x19\x52\x54\x8b\x0a\xa2\x6d\x0c\x1f\x5b\x96\x97\x2b\xc2\xa6\x53\x96\x69\xbe\x60\x85\x0f\x65\xb6\x15\x34\x6d\x68\xf1\x0d\xcd\x6e\xef\x68\x9d\x2b\xa8\xc9\x48\x35\xbf\xe1\x05\xd7\xcb\x98\x7a\x97\xd8\xac\xd4\x64\xa3\x9f\x9d\x62\x5e\x28\x4d\x01\x7d\xb9\xca\x8d\x66\x87\x51\xae\xa0\xce\x32\x8e\xb7\xd1\xc5\x0d\x47\x0f\x07\xc5\x03\x33\x56\x1b\x02\x57\x2c\xc9\x5d\x2d\xe3\x65\xbf\x77\x12\x02\x86\xa7\xf2\x35\x99\x6b\x5d\xa9\xd7\x2f\x5e\xb4\xb2\xd9\x84\xcb\x17\xb9\xcc\xd4\x8b\x4c\x0a\xc3\x63\xa8\x17\x72\x61\xe8\x22\xbb\x7b\x71\x27\xeb\x5b\x2e\x66\x63\xb3\x80\x31\x5e\x20\xf5\x02\x84\xed\x17\xbf\x84\xff\xed\x03\xca\x88\x73\x1e\x7a\x4d\x8e\x8e\x22\xde\x97\x15\x8a\x07\x5b\x40\xe6\x35\x68\x10\x96\x1d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x0a\x62\xb9\x90\x84\x65\xdf\x48\x59\x30\xda\xef\xce\xf5\x18\xd5\x27\x80\x7d\x3a\x56\x8d\xba\x97\x2d\xea\xc5\xcb\x65\xaf\x67\x25\xf3\xd7\x44\x35\x55\x25\x6b\xad\x5a\xa9\xd4\x00\xc5\xa8\xfb\x27\xe8\x65\x46\xe4\x07\xff\x10\xdd\xc6\xbe\x3b\xfe\xf3\x97\x17\xff\xfe\x97\xe3\xef\x7f\x08\x7f\x0b\xe4\xd3\xe0\x85\x88\x69\xaa\x8a\x65\x13\x21\x73\xf6\x1e\x66\x00\x7f\x5a\xee\xee\x2c\xcb\x64\x23\xb4\xfd\x41\x53\xdd\xa8\xc9\x5c\x2a\x7d\x79\xe5\xff\xac\x64\xbe\xfa\x57\x84\x11\x75\x8f\x74\x05\xf6\xfa\x8a\xea\x88\xd4\x00\x49\xd4\x85\x56\xfc\x5b\x56\xab\x88\x64\x18\xd8\x3a\xf0\x62\xbf\x0c\x4b\xee\x96\x14\xfe\xf9\xd6\x4d\xd7\xe0\xde\xbb\x9a\x6b\x0d\x3e\x8d\x36\x1b\x81\x9c\x8e\xdc\x95\x46\x46\x6a\xf1\x2a\x49\x71\x1b\x8d\x39\xfc\xae\x6d\xb1\x38\x98\xbd\x5d\x99\xd7\x9c\x58\x8f\xce\x35\x7d\xe3\xd9\xd5\x25\x59\xe0\x6e\xec\x61\x21\x8f\x43\x05\x05\xdb\x8a\xc5\x8a\x42\x06\x6f\x7d\xef\x76\x6b\x02\x96\xcc\x32\xa6\x30\x83\x98\x4d\xb1\xf5\x5a\xd1\xe7\xe3\x42\x2c\x4c\xdf\x8a\x4c\x19\xd5\x4d\xcd\xc8\x8c\x6a\x97\x59\x84\x09\xc3\xdf\x46\xe8\x27\x9f\x98\xcf\x83\x7a\xba\x31\x57\xd6\xbc\xb8\x90\x45\x53\x02\xb2\x7a\x16\xfc\x63\x82\x51\x00\x19\x4d\xc3\x11\xd8\x6b\xe1\x0f\x9d\x9c\x99\x4b\xbf\x00\x57\x12\x7c\x07\x4b\xa7\x2f\xc0\xda\x1a\x26\x59\x51\x9a\xd6\x3a\x41\x77\xed\xfd\xc6\x9d\x16\xc0\x0e\x4f\x09\xe6\x33\xc0\xa2\xe8\x3b\xd7\xa5\xb4\x0d\x33\x09\x91\xb3\xa2\x9a\x83\xa1\x6f\xe6\xf9\xd4\x8d\x90\x3b\xf2\x9e\x65\x8a\xff\x13\x24\xaf\x82\x97\x5c\x23\xbb\xf8\xea\xb7\x7f\x0a\x26\xb3\x17\x44\xf8\x08\x96\x28\x1a\x12\x36\xf1\x4e\x06\x0c\x1e\x60\x9b\xbc\xe7\x8a\x7b\x2f\xde\xa5\x2d\x97\xcc\x8a\xaf\xe0\xd7\x62\x7a\x69\xa1\x6f\x41\x6b\x27\xdd\x56\xcd\x4d\xc1\xd5\x3c\xde\x34\x7e\x39\xf5\xbb\x65\xfa\x50\x0c\x1c\x03\x74\xdd\x30\x6f\x03\x6d\xf1\xbe\x59\xd3\xca\x4c\x12\x8c\x58\x1b\x75\xaa\x9d\x14\x4e\xad\xba\xf8\x0a\x0c\x9d\x5e\x9f\xa5\x26\xbf\x78\xd4\x7a\xa6\xb4\x50\xbb\x5d\x90\x11\x67\xea\x5a\xd6\x5e\x85\x55\x33\xdd\xd4\xa2\xf5\x05\xba\x92\x39\xc9\x6a\x86\x91\x1f\x7b\x60\x98\x49\x28\x28\xc0\xfa\x22\x3e\xa9\xb6\x63\x0e\x92\xd0\xa3\x19\x23\xc4\x8f\x88\xea\x11\xf1\xa1\x66\xae\x1b\x2b\x12\x4b\x30\x4d\x7b\x67\x2f\x94\xcf\x65\x64\x8e\xd4\xe5\xb7\xb2\xd0\x02\x9d\x1e\x4f\x26\xc7\x38\x13\x59\x23\xba\x45\x29\xd4\x3c\xdf\x0b\xca\x69\x09\xda\x96\xea\x0b\x11\x08\xff\x76\xcb\x4a\xc3\xb7\xbb\x65\x39\xf5\x65\x0a\x8f\x71\x40\xc6\xcb\xa5\xd6\x79\x7b\x10\x59\xcc\x8d\xe6\x36\xcc\x23\x8a\xd7\xe8\x3b\xe4\x13\xfd\x20\xe1\x51\xd6\x9c\xf8\x63\xc3\x94\x8e\x11\xda\x4f\xf0\xb3\x49\x56\x35\x23\xdb\xc5\xa4\x64\xa5\xac\x97\xfe\x4f\x56\xcd\x59\xc9\x6a\x5a\x8c\x95\x96\x35\x9d\xb1\x91\x1f\x00\x3f\xf3\x7f\xe1\x87\x9d\x29\xac\x7f\x8d\x16\x82\xac\xa9\x6b\x26\x74\xb1\x74\xb2\xe5\x13\xf3\x7d\x6e\x1f\x77\xcc\xa4\xf9\xe3\xda\xf2\xbe\x1c\x7b\xe3\x1b\xea\xe4\xfc\xaa\x40\x45\x8c\xb7\x47\x8d\x5a\x42\x00\x36\x00\x24\x94\xea\x78\x1f\xb7\x3f\xe7\x0b\xae\xb6\x8a\xfc\xb9\xf6\x1e\x54\xe0\x6e\xd4\xe8\xaa\xd1\x36\x7d\xa4\x97\x2a\x3e\x55\x52\x81\x75\xc0\x67\xaf\xea\x88\x93\xaf\x62\xb4\x44\x80\xfb\x35\xab\xc5\x6b\xf2\x9f\x27\xff\xf1\x9b\x9f\xc6\xa7\x7f\x3d\x39\xf9\xee\xe5\xf8\x5f\xbf\xff\xcd\xc9\x7f\x4c\xe0\x1f\xbf\x3e\xfd\xeb\xe9\x4f\xee\x8f\xdf\x9c\x9e\x9e\x9c\x7c\xf7\xe5\xbb\xbf\x7d\xbc\xba\xf8\x9e\x9f\xfe\xf4\x9d\x68\xca\x5b\xfc\xeb\xa7\x93\xef\xd8\xc5\xf7\x91\x9d\x9c\x9e\xfe\xf5\x57\x51\xd3\xa3\x62\xf9\x75\x04\xd6\xc0\x36\xde\x22\x27\x67\xfb\xd5\xb6\xce\x4a\x5c\xe8\xb1\xac\xc7\xf8\xf9\x6b\x60\x92\x22\x3a\x71\xc7\xb6\x0d\x9c\x7f\x70\xb7\xb5\xc5\x78\x9e\x78\xee\x01\x90\x1f\x43\x00\x14\xcb\x6a\xa6\x77\x65\xde\xc0\xde\x1c\x37\xb8\xe2\xf6\xf6\xdc\x25\xe1\x43\x5a\x3c\x7c\x2a\x41\xd8\xaf\x96\xb3\x32\xec\xd6\xa4\x65\x98\x28\x41\xb9\xd4\xbe\x77\xcb\x22\x63\x51\x07\x0b\xc9\x60\x21\x19\x2c\x24\x5d\x29\xff\x1a\xef\xd0\x33\x37\x8f\x30\xb1\x78\xc8\xca\x9e\xe0\xec\xf5\x16\xf2\x02\x87\x0e\x5f\x8e\xb9\xd6\x92\x54\xb2\x6a\x0a\xaa\xef\xf1\x21\x49\xf0\xfe\xea\xd7\x71\x79\x54\x76\xfe\x5f\x97\x6f\x2e\xde\x7f\xbc\x7c\x7b\x79\xf1\x61\x42\xce\x8a\x22\x54\xbb\xdd\x0f\x71\xad\xa4\x8e\x9c\x35\xa1\xe8\xea\x05\xfa\xb9\x3b\xa7\x50\x69\x7d\x68\xb8\x6a\x15\x75\x98\xed\x18\x09\x94\xf5\xa0\xe0\xc2\xe7\x3c\xbe\x77\x48\xcf\xb0\xf9\x58\x87\xb5\x34\xe7\xe8\x49\xab\xb4\x5b\x26\xcc\x52\xd3\x5b\xf0\xfe\xc9\x58\xce\x44\xf6\x80\xac\xf7\x2d\xc6\x4f\xb8\x3d\xbb\x31\x62\x06\x38\xe8\x21\x46\x21\x79\x53\x15\x3c\x33\xe7\xe3\x35\x92\xd1\x7d\x5f\x96\x65\xa3\x1f\xf2\xe4\xda\xb9\x1f\x9e\x81\x34\xeb\xeb\x11\xb8\xe3\x01\x7d\xf3\xe2\x9e\x8f\xf5\xf3\x86\x4a\x70\x66\xc1\x4b\x79\xff\xe1\x47\xb1\x04\x71\x84\xdb\xfb\x72\xf4\x72\x3a\x6b\x14\xbb\x35\xae\x76\x29\xf5\x83\xbd\xec\xc1\x1d\x25\x8e\x4e\xa7\xd3\xe8\x6d\xe9\xf3\x21\x69\xf3\x01\xe9\xf2\xf6\x34\xf9\xe9\xe8\x71\x12\x2d\x8e\xa7\xc3\xf1\x34\x38\xc1\x43\x21\x95\xee\xc6\xd3\xdc\x6d\x25\xa1\xaa\x66\x53\xfe\x69\x97\x8e\xa5\x5f\x3b\x25\x86\x66\x9f\xb4\x75\x67\xaf\x98\xf0\xc1\x4f\x4e\x6f\x08\x7e\xeb\x9f\x9d\x1f\x2e\xca\x23\xe9\x88\xf4\x7a\x93\xbc\x33\x60\xd1\x01\x8b\x76\xda\x80\x45\x7b\xa5\x98\xe7\x84\x42\x85\xcc\x7b\x93\x28\xc5\xde\xa6\xf7\x41\x5f\x2b\xb9\x55\xd0\x08\xe5\x16\x0e\xa6\x4e\xe7\x59\x5c\x49\x80\xe8\x29\xd7\x6d\x80\xdc\xfd\x80\x76\xbd\xa1\x47\x88\x7c\xb3\x5f\x1e\x2b\x97\x23\x6c\xa5\xff\x95\x72\x35\x18\x8a\xf4\xf0\x58\x89\xa0\x8c\x3c\x6a\x83\xb9\xd4\x5e\x50\xa5\xf8\x4c\x8c\x2b\x99\x8f\xcd\x28\x2f\x1e\xe4\xe7\x0f\x19\x8d\xe4\x55\xda\x8f\x3d\xee\x0f\xde\xe0\x13\x08\x0e\x06\xad\x35\x9a\x05\xd6\x20\x6f\x27\x70\x29\xaa\x22\x04\xd3\x5e\x31\xe8\x91\x87\x53\x52\x41\x67\x6c\x6c\x27\x3b\xf6\x93\x1d\xfb\xb9\x3d\xe2\xbc\x62\x88\x59\x56\x50\xfe\x70\xbc\x6f\x0a\x09\x3b\x87\xde\x6c\xdd\x1f\x1f\x90\xbd\x52\x7d\xc3\xc9\xab\x5c\xa0\xab\xa2\xfb\x09\x3f\x7e\xd8\x06\x0f\x97\xc5\x27\x50\xdc\x70\x90\x0f\x7e\x1d\xd0\xc8\x1c\xf8\x28\x85\x17\xf0\x61\x42\xf4\x66\x29\x68\xc9\x33\x07\x65\x67\x05\x04\xd7\x72\x29\x3a\x6e\x2f\xf1\x43\x73\x45\xb8\x07\x2b\x72\xa9\x49\x46\x05\x5a\x2e\xad\x1b\x84\x41\x18\xa1\xf7\xc3\x03\xdb\x11\x15\xdc\x1d\x11\xd2\xdd\x39\xe4\x0f\xe1\x81\x84\x71\x29\x52\x30\xc2\x84\xae\x21\xd3\xed\x95\xcc\x0d\x69\x99\x74\xde\xee\x71\xe9\x89\xe6\xc3\x62\xf5\xf2\x3d\xc1\x71\xe4\xf9\xb0\x74\x01\x81\x08\x39\xf7\xce\x96\x56\x32\x9f\x6c\xb8\x12\xf1\x25\x8c\xae\x64\x6e\x63\xc0\x75\x07\xde\xcc\x6d\x01\x50\x2b\xe9\xad\x8b\xcc\xf6\x46\x25\xba\xa0\xbc\x88\x08\x1e\x22\x90\x72\x54\xf1\x9c\x11\x1a\x83\x3b\xfd\xc4\xe2\xd9\x21\x6b\x22\xdf\xc7\x21\x7c\xc0\xae\x5d\xa2\x2d\xd8\xff\x6c\x2e\x15\x13\x70\xdf\xa8\x1b\xdb\x17\x0a\x74\x60\x9f\x23\x8e\x8c\x61\x39\x2f\xa7\xc8\xe6\x8e\x08\x5b\xb0\x7a\xa9\xa1\x5c\x97\x4b\xea\x8a\xdd\x98\xf1\x4b\x9a\x07\xbb\x3e\x22\xd2\xf0\x65\x77\x3c\xca\x89\x07\xf0\x04\xce\x4f\x35\x85\xf6\xbc\xb6\x9d\xfd\xce\x4e\x63\x3d\x80\xdd\x70\x71\xb7\xbd\xd9\x7a\x7b\x2f\xe4\x7d\x91\xf1\x25\xad\xee\xfd\x0a\xbd\x2e\x76\x45\xa4\xbe\x42\xaf\x10\xfc\xe4\xc6\x1a\xdf\x4b\xfa\x89\x97\x4d\x49\x28\xfa\xdd\xc8\xe9\x06\x06\x22\x2a\x59\xc0\x2e\xd8\x81\x0d\x6c\x80\xba\x8f\x0f\x20\xf1\x68\x35\x3d\xa5\xcd\x33\x75\x1b\x88\x72\x17\x48\x73\x13\x48\x70\x0f\xd8\xda\x2d\xc0\x39\x00\xed\x0a\x90\x2d\x4a\x5b\x03\x65\x2e\x7a\x41\xd9\xd1\xd7\x87\x61\xf9\x72\xda\x8e\xc1\x15\x91\x25\xd7\xda\xfa\xd9\x04\x14\x60\x44\xb8\xee\x38\xa5\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x55\xf0\x8c\x83\x6f\x93\xf3\xbf\x7c\x98\xd1\xf3\x38\xd1\xa6\xaa\xe2\x65\x85\xc9\xaa\xe0\xa2\x8c\x1d\x0f\x69\xc3\x3e\xfd\x2c\x6d\x9c\x32\xfb\x94\x31\x96\xdb\x89\x0c\xf7\x75\xb8\xaf\xc9\xf7\x55\xed\x48\x15\x11\xaa\x21\xda\xbc\x39\x5e\x1d\x61\xae\x12\xe4\xb4\x41\xc5\x80\x83\xae\x87\x2e\xe6\x85\xcb\xaa\xfe\x81\x81\x79\xef\x9a\x69\x65\x33\xf4\x40\x4f\x0f\xe9\xd5\xd6\xb2\x34\xfb\x4c\xec\x2e\xdd\x15\x05\xc5\x61\xf0\x46\x9b\xdf\xe4\x01\x29\x59\xaf\xb2\xb7\xa0\xeb\x60\x65\x55\x50\xdd\x6a\x42\x1e\x91\x08\x25\x86\x89\x4f\x49\x64\xfc\xb4\xa9\x8b\xf7\x23\xb6\xf5\xb2\xc1\x4f\x98\x82\x78\xdb\xa4\xc3\x7b\x10\x18\xfb\x9d\xb8\x22\x93\x07\xc7\x0b\x96\x51\x5e\x5e\xfb\x4e\x09\x9c\x20\x86\xc5\xa7\xfd\x4d\x97\xc3\xf6\x9c\xda\x77\x5f\xc9\x7c\x13\x76\x2f\x36\x61\x6f\xfa\xde\x1d\x28\x29\xef\xc1\xd3\xf0\x1e\x32\xf1\x6e\x52\xaa\xdd\x94\xe4\x89\xd1\x89\x13\xb7\xf7\xca\x4d\x49\x98\xb8\xe5\x87\x91\x69\x71\x53\x60\xf7\xc0\xa9\x6f\x0f\x9c\xec\xf6\x29\xd2\xdb\xee\x4d\x7e\x88\x00\xcd\x74\xcb\x9e\x96\x85\xad\xeb\x13\x67\xe9\xf9\xd8\xbe\x0f\xdb\xd1\x3a\x81\x07\x3d\x1d\xc6\x2d\xed\x41\xc8\xfe\xe8\xf8\x5c\x83\x9d\xda\x49\x03\x8c\x6b\x4d\xb3\xb9\x4d\x52\x8b\xbf\x18\x48\x10\x4b\x62\x80\x40\x23\x25\xb7\x79\x32\x1f\x3a\xe7\x39\x23\xba\xe6\x55\xc1\xc8\x9f\xfd\x85\x18\xa1\x6d\xff\x2f\x41\xaa\x30\x97\x54\xb4\x05\xc6\x3f\xbb\x7f\xfd\xe5\x91\x19\xea\xe2\x98\x1c\x9c\xd2\x2e\x79\xd5\x0b\xe8\x91\x70\x91\x83\x07\x23\xb2\x42\xb8\x79\x38\x98\xd9\x5a\x58\xf7\xc4\x66\xf7\xc4\x54\xb9\xd6\x04\x0b\xae\x8e\xed\xcb\xbd\xac\x03\x78\x78\xb6\xaa\x09\xef\xe1\xe0\xef\x30\x23\xef\xe5\xb5\x35\xdb\x8e\xc8\x15\x68\x87\xdb\x27\x70\xe7\xdf\xcb\x8b\x4f\x2c\x6b\x74\x8f\xd3\x4d\x24\xfa\xef\xe5\x19\xd3\xf6\xf3\xcb\x96\xa1\xc4\x8d\xe9\x30\x94\xed\xc5\x0a\x59\xca\x07\x37\xf6\x96\x2d\x7b\x77\xd5\x32\x09\x96\x99\xb5\xaa\x71\x0f\xa3\x8e\xc8\x23\xdf\xf0\x7f\x9c\x29\xaf\xbc\xe1\x02\xa7\x82\x03\xbb\x73\x86\xb1\xdd\x79\x18\x09\xa4\x28\x22\x26\x11\xb9\xdb\x71\x1c\x6f\xaa\xf3\x56\x3c\xa7\xeb\xe9\x45\xdf\x96\x6e\xe2\x6f\x03\xa6\xf6\xe2\xc7\x86\x16\x93\x4e\xea\x36\x7c\xd4\x77\xdd\xac\x5b\xf3\x2a\xdd\xbc\xe3\x45\x9e\xd1\xda\xc6\xd6\x01\xfa\x21\x4a\x5a\x33\x2c\x60\xbf\xac\xd7\x81\xdd\x21\xc0\x16\x78\x14\xfa\xf2\x56\xb4\xd6\x3c\x6b\x0a\x5a\x13\x73\xc7\x67\xb2\x8e\xca\xcd\xd6\x7b\x98\x2d\x34\x5f\xb3\x4c\x8a\x7c\xa7\x42\xf4\xc7\xd5\xce\x57\xbd\x95\x2b\x56\x73\x89\xb9\x82\x78\xc9\x56\xaf\xd7\x49\xc7\x01\xa5\x4f\x0e\x9b\x3a\x64\xe7\x71\xcb\x28\xd4\x8c\x76\x6d\xca\x58\x82\xee\x34\x20\x38\xfe\xb6\x4f\xc8\x17\x4b\xa7\xa2\xed\x63\xc8\xb9\x76\xf9\x04\x14\xd3\x2e\x9f\xa2\xbb\x8a\xf6\x24\x5b\x34\x32\x95\x35\xe4\x29\x3c\xc9\x25\xc6\xd1\x2f\x78\xa6\x4f\x27\xe4\xff\xcf\x6a\x19\x91\x88\x52\xb0\x19\xc6\x72\xdb\x8b\xed\xf5\x51\x35\xa3\xd6\x4b\xff\x25\x39\x81\x4e\x09\x2f\x4b\x96\x73\xaa\x59\xb1\x3c\x45\xf5\x14\x23\x6a\xa9\x34\xeb\xb1\xcd\xc5\xab\x15\x31\xf4\x12\xde\xfd\xc3\xef\x1f\x78\x73\x0f\x09\x44\x6d\x92\xc2\x76\x63\xd1\x53\x6e\x05\x7a\x7c\x6a\xed\x5e\x79\xff\x5e\xf9\x2c\x0c\x47\x68\x93\x9b\x3b\xdc\xec\x61\xeb\x1f\x06\x40\x29\xa9\xd9\x0c\xee\x27\xde\xb9\x47\xde\x4e\x8c\xcd\x7d\x27\x1b\x71\xbf\x0d\xa4\xb3\x6f\x5f\x59\x15\xdc\xb7\xc1\x87\xa9\xa9\x85\x77\xcb\x10\x06\x33\x09\xac\x2e\x14\xa3\xf5\x81\x03\x33\x88\x0d\xdf\x6a\x83\x58\x22\x8c\xe5\x3b\x4c\x17\x0c\x73\xe9\xc9\x9f\xb5\x93\xa4\xc2\x7e\xa0\x5d\x5e\x85\xab\x95\x0c\x12\x41\x5a\x5b\x57\x96\x35\xc8\x92\xd0\x42\x30\x4c\x86\xe5\x36\xec\xb1\x0f\xed\x04\x19\x23\x8e\x5f\xef\xc6\x9b\x19\x77\xa3\x96\x15\x9d\xc1\x65\xdd\xe5\xa6\xac\xf6\x4d\x72\xa6\x59\x5d\x72\xc1\x14\x99\xcb\x3b\xfc\x1d\x99\x81\xca\xbe\xc5\xf2\xd6\xf3\x60\x2e\x7b\x77\x04\x4b\xb0\xb6\x09\x84\x11\x7b\x80\xc3\xe8\x1d\x5d\x12\x5a\xcb\x46\xf4\xa6\x23\x00\x2e\xda\x53\x8e\x77\x2b\x93\x7e\x2f\x05\xf3\xce\x28\x7d\x54\xb6\x43\xda\x6e\x98\xa6\xe6\xc2\xbf\x9a\xbc\x7a\x19\x35\x87\x0f\x2c\x6b\x6a\xc5\x17\xec\x03\xa3\xf9\xd7\x46\xe2\x6e\xd3\xc1\x5c\x4e\xaf\xa4\x52\xfc\x06\xb3\xf0\x18\x06\x09\x73\x6c\xad\x4f\xd8\x73\xa8\x30\x73\x59\x93\x46\x78\x11\xa1\x67\x16\x96\xcc\x87\x56\x51\xd3\xc9\xe9\x4e\x20\x2d\x31\x99\x37\xec\xe5\x8a\x7d\xc6\x79\x99\x3b\x5c\xb5\x93\x79\xd5\x76\xb3\x77\x09\xf9\xef\xf0\x5a\x43\xdf\x63\xd0\x9d\xf0\x29\x58\xed\x46\xf8\xe8\xae\xe6\x9a\x05\x74\xeb\x04\xb3\xfd\x74\x0f\xab\x67\xdb\xbb\xa9\x8e\xa1\x83\x98\xfd\xe8\xf7\x83\xae\x57\xc1\x70\x97\x3b\xb3\x0e\xe3\x6d\x41\x1e\xe7\xeb\xdd\xee\x9a\xc5\x10\x2d\xbe\x9c\x53\x91\x17\xbd\x70\xec\x57\x50\x2c\x7b\xb3\x30\x81\xb7\x40\x7b\xdd\x60\x1f\x47\x21\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf7\x37\x2c\x38\xac\xd4\x71\x10\x18\x10\x65\x85\x48\xc3\x5e\xf7\x37\x5c\xd9\xeb\x0d\x9a\x12\xa0\xdc\x96\xbf\x2d\x69\x6f\x05\x94\x60\xfd\xed\x66\x4e\x2c\x7b\xb5\x61\xb4\x16\xb9\xac\x8c\xb7\xed\x58\x23\x03\xef\xc8\x92\xfb\xac\x30\x8e\xf9\x6d\x11\x76\x6d\xb8\x8f\x92\xb5\x13\xeb\x19\x6a\x75\xda\x1e\x05\xae\xcd\x79\xf3\xac\xfc\xa4\x7a\xc6\xe9\x9f\x72\x57\x9e\x41\x85\x5a\x27\x2d\x98\xa6\x18\xae\x1b\x91\xd3\x7e\x25\x29\xd7\x8c\x09\x90\x56\x40\x0b\xe7\x14\x49\xd6\x77\x8e\x2a\x29\x62\x00\xad\xe7\x90\x0d\x9e\xe9\x27\x1f\xf8\x59\xcf\x60\x40\x63\x4e\x64\xbd\x72\x1b\x9c\x00\xb6\x81\x92\xa4\xce\x1e\x08\x73\xdb\x2f\x02\x55\x20\x68\x99\x0d\x6c\x85\x7f\x39\xf5\x57\x67\x37\xc1\x5e\xcd\xcd\xbe\x59\xc5\x0d\xc9\xc6\x42\x90\x3b\x56\xf7\x73\x8d\x09\xf4\xe1\xe8\x88\x9c\x60\x3f\xc7\x8a\xd4\x52\xea\xdd\x10\x75\xbb\x3f\x17\x9f\xaa\x9d\x2a\xa1\x2e\x6c\xf1\x80\x98\xcc\x6c\x3b\xda\xac\x2f\xd8\x9c\x2e\x98\x22\x8a\x97\xbc\xa0\x75\x01\x99\xd9\xaf\x71\x79\x10\x82\xb6\x31\x17\x60\x44\xe9\x8c\x40\xe3\x1d\xce\x33\xe8\x6e\x9f\xe7\x48\xdc\x1a\xcc\x11\x01\xbd\x71\x6b\x32\x73\x2c\x1b\xdd\xd0\xa2\x58\x12\xf6\x29\x2b\x1a\x83\x2f\x77\x22\x2c\x6f\x23\x27\xaf\x8a\xc8\x95\x75\xd4\x3f\xa0\x80\xdc\x55\x79\x1a\x7e\x35\x77\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\xcb\x98\x52\x2e\x87\xc1\x32\xcc\xc3\xe0\xd7\xf0\xb9\x94\xda\xa1\x77\xea\xa2\xa0\x4a\xf3\xec\x8b\x42\x66\xb7\xd7\x5a\xd6\x3b\xd5\x15\x6d\xea\x7f\xa5\x80\xd1\xd9\xdf\xaf\x0d\xf2\xbe\x0d\x12\x47\x59\x47\xcc\xd0\x30\x45\x7b\x06\xba\x6d\x6e\x58\xc1\xf4\xb1\x02\xf9\x91\x94\x34\x9b\x63\x19\xad\x1c\x33\x90\xba\xd4\x64\x56\x7d\xfd\xe0\x11\x61\x7b\x63\x66\x09\x85\xe9\x5e\x9b\x39\xae\x2f\x03\xfd\xcd\xec\x3b\x98\xdd\x03\x35\x58\x60\x0c\x74\x81\x74\x5c\x8c\x75\xcd\xfa\xd8\xa9\x8d\xfb\x04\x21\xa9\xb6\xb6\x0c\xaf\xd1\xd3\xcd\xce\x9f\xdd\xa8\x49\xa6\xf8\x84\xde\xa9\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\x2f\xfa\x43\x1c\x12\x5d\x48\x6d\xd2\xbf\x17\xf6\x86\xff\x92\xde\x29\x86\x13\xbd\x31\x13\x85\x12\x68\x11\xb8\x63\xa7\x4e\x51\x38\x97\xcb\x37\x0f\xbe\x18\xef\xf0\x34\x55\x1f\xcd\x1c\x7b\xde\xda\xc6\x05\x06\x7b\x76\xaa\xd2\x29\x2f\x18\xaa\x80\xf1\x64\xbb\x29\x34\x01\xe8\x97\xb2\x21\x77\x14\xad\x19\x40\xc0\xa2\x82\xa9\x79\xf5\x9a\x5c\x08\xd5\xd4\xac\x35\x92\xad\x0e\xb6\x89\x25\x87\x9b\x62\x41\x56\xcc\xa2\xd4\xd3\xd8\x2e\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\xde\x85\x9a\x8b\x29\xab\x6b\x1f\x7f\x8d\x1f\x18\x96\xbc\x23\x45\xf5\x8f\x79\x68\xb8\x25\x69\xce\x2f\x60\x1e\xea\xd7\xa4\x91\xad\xe0\xc8\x77\xee\x40\x29\x78\x20\x76\x03\x44\x97\x53\xe7\x31\x8f\x72\x95\x65\xe1\x61\x40\xdb\x8d\x01\x1b\x3b\x8e\xa1\x3c\x69\x80\xf2\xd6\xa7\xbb\x24\x2f\x72\xb6\x78\xa1\x72\xfa\x6a\x04\x53\x55\x36\xe4\xbb\xbb\x2e\xaa\xc8\x51\x5c\xf1\x81\x6b\xc7\xb9\x8d\xc2\x9d\x68\x7b\x32\x88\xd8\x0d\x09\x7e\x2f\x2f\x8f\x40\x74\x31\x63\x67\x54\x90\x82\xd1\x85\x15\xe7\x10\x65\x2c\xd1\xc0\xd0\xcb\x61\xa5\x18\x6b\x48\xd7\x60\xf3\xbb\xdf\xf6\x8a\xd7\x31\x3a\x18\xb2\x15\x34\xb9\xbe\x9d\xd5\xa6\x6e\x6c\x2e\xa7\xa9\xac\x33\x2f\x73\x5a\x2d\x0d\xd3\x80\x1b\xb8\xe8\xd8\x35\x9e\xf7\x85\x8d\x4b\x55\xe6\xa8\xc8\x5e\x7c\x1f\x6d\xdf\xa0\x41\x16\xfc\xc7\x86\x91\xcb\x37\xbe\x22\x0b\xab\x15\x57\xda\x08\x14\x79\x87\xef\xe1\xc8\x0c\x9d\x9c\x95\xf4\x9f\x52\x90\x8b\x2f\xae\x6d\x47\x11\xa0\xf8\xac\x11\x24\xfd\x67\x53\x33\xc3\xe3\xed\x94\xb5\x74\x9d\xae\xf2\x93\xe6\x39\x79\x43\x35\x45\xb6\xd2\x06\x16\x89\x96\xe4\x19\xa6\xf0\x86\x8b\xdc\xfe\xb4\x25\x4b\xe8\x87\x4f\xe2\x03\x83\x69\x9b\xcd\xeb\x5b\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x24\xfe\x6f\x0f\xdc\x98\x99\x4d\x44\x79\x0c\x7c\xf1\x9b\x0f\x97\x3b\xe2\xda\x32\xe0\xf0\x67\xef\x64\x9e\xca\xba\x1d\x07\x9f\x3a\x82\xfa\x6f\x06\x2e\xce\xf1\x39\x29\x4d\x9f\xa0\xb8\x1a\x81\xf2\x96\x7c\x0d\xba\x4d\xf8\xe7\xdf\x6b\xae\xd9\xa4\x3f\xa3\x6d\x02\xeb\xe0\x36\x30\x71\x19\xee\x33\xb7\x84\x30\x17\x4f\x6e\xa0\x1f\x90\x8b\xe5\x0f\x6e\x0a\x79\x43\xec\x95\xdf\xf5\xdc\xbf\xf9\x70\xb9\xc5\xd4\xbf\xf9\x70\xe9\x66\x6e\xfe\x29\xa7\x87\x9b\xf4\x21\x18\xfe\xb7\x2b\xfc\x77\x0a\x2f\xd6\xa6\xc2\x5d\xe5\xe2\x77\xc9\xc2\x4f\x0e\xc6\xbc\x6f\x97\x62\xc8\x8c\xd5\x27\xf4\x73\x11\x91\x0c\xb9\x7b\xf9\xcd\x37\x84\x7d\xaa\x10\xa3\x06\x2e\x93\xd7\x73\x0a\xf9\xab\x5d\xaa\x4c\x04\x3f\x03\x8f\xca\x90\x6c\x07\x88\x84\x62\x95\x32\x43\x0d\x50\x4b\x9f\xbf\x76\x8e\xe0\xfe\x8b\xcd\x1f\xbc\x83\x00\xcc\xfc\x35\xd2\x00\x82\xf1\x98\x79\x00\xf7\x27\x68\xae\x10\xfe\x27\x1b\x77\x8f\xd9\xae\x14\xd3\xa7\x93\x8e\x6e\x5d\xc1\x94\x77\x8a\x8c\x0e\xc2\x78\xae\x59\x30\xc9\x89\xf9\xed\x05\xd8\x47\x4f\x27\xad\xc5\x0c\xb2\x43\xb4\xbc\x69\xc4\x18\xe6\x52\x7c\x78\x34\xf7\x9a\x96\xf2\x36\xba\xb8\x09\x9c\xbb\xc1\x0c\x3b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\xc4\xdf\x27\x2b\x04\x03\x6d\xc1\x0a\xc1\x77\x5b\xb3\x42\x50\x5f\xe4\xd9\xb0\x42\x98\x23\x30\x8a\x19\x82\xab\xdb\xfb\x66\x3c\x3b\x74\x90\x7b\x9b\xff\x9c\xee\x6d\x7b\x58\x89\x7b\xd6\x7e\xe8\x18\x18\x9f\x20\xc7\x25\xb7\xef\x04\xa4\xe2\x45\xbc\xb6\xd4\xc0\x16\xb9\x44\x76\xcd\x5c\xbf\x2f\x23\xf2\xf4\x27\x20\x70\x0f\x58\xa9\xab\x72\xdf\xb9\x45\x21\x91\x82\xc7\x24\xaa\xfc\x5d\xe4\x24\x33\x56\xcd\xa7\x3b\xf5\x72\x36\x3d\xbe\xbd\xee\x9a\x71\xce\x59\x35\x27\x6f\xaf\x37\xa0\x3c\x38\x1c\x58\x96\x42\xe3\xce\xb1\x22\x05\x9f\x32\xf0\x49\x48\xc0\x7a\xe7\x38\x6a\x07\xe5\x79\x67\x34\x87\xe2\x70\xb1\x5e\x05\x2b\x24\x29\xa4\x98\x19\xe6\x20\xae\x6a\xce\x1e\x90\x54\x29\x05\xd7\xb2\x7e\xd8\x1b\x22\x1e\xf1\xb8\xee\xf6\x81\x78\x5c\xdf\x66\xeb\xda\x02\x23\xef\x82\xa7\x94\x64\xb2\x28\x58\xa6\x6d\xb9\x53\x38\xf6\xa8\x15\x62\xdb\xa0\x34\x61\x56\x67\x39\xb9\xfd\x13\xa8\x4d\xac\x82\xe4\x05\x1e\xe5\x8b\x0f\x17\x67\x6f\xde\x5d\x4c\xca\xfc\x97\x73\x79\x37\xd6\x72\xdc\x28\x36\xe6\xfd\xc5\x3b\x3e\xe3\xe8\x4c\x12\x5d\x8f\xad\xcb\x6a\x57\xb6\xce\xac\x4b\x0c\xfc\x9a\x7c\xa3\xd0\x7b\xc3\x7b\xee\xb0\x1c\xac\xd9\x23\x52\x53\x9b\xef\x93\xe2\x55\x9d\x36\x45\x81\xa7\x69\xee\xd1\x28\xd4\x47\xbf\xf8\xfc\x18\xde\xce\x26\x3c\x7b\xee\xf7\xf0\xd7\x22\x85\x62\xf7\xf3\xcf\x64\xab\xc3\x6a\x7b\xef\x1e\xd7\x75\xe7\xb9\x76\x75\x03\xb5\x84\x50\x31\x08\xea\x36\x8c\xed\x37\x8a\xd5\x5d\x30\x65\x3a\x83\xdd\x79\xd1\x28\x56\x4f\xb0\xfb\x67\xb8\xf7\x71\x5c\x45\x5c\xf6\x6b\xf2\x88\x9d\xff\xc0\xa6\x9b\x36\xde\x3e\xf6\x1e\x37\x8e\xf3\xa7\x8d\x9e\x33\xa1\xb9\xcd\x6e\x69\x39\xaf\x8d\x27\x81\x81\xf9\xcf\x70\xeb\x23\xeb\x3e\xa5\x55\x69\x1a\x2a\x1b\xb5\x6d\xa8\x6c\xf4\x3c\x2a\x1b\x3d\xa6\x5c\x9b\xc1\x9e\xfb\xc0\x3a\xa6\x5f\x48\x14\x17\x72\x27\x3e\xf5\x55\x4d\x73\xa9\xf0\x1d\xb3\x87\x1d\x7c\x42\xf3\x92\xc7\x94\xbd\x7d\x76\x98\x3c\xe3\x22\xef\xdb\xcc\x44\xd1\x0b\x7a\xec\x8a\x5e\xf6\x99\x35\xc4\x7b\x27\x2e\xea\xb4\x4c\x98\x49\xdc\x3a\x6c\x75\xfd\xb5\x92\xe4\x2f\x1c\x26\x4d\xe5\x64\xe7\xb6\xb5\xbe\x09\xbf\x07\x8d\x93\xac\x98\x41\x24\xd9\xed\x44\xd6\xb3\xc7\x39\x60\xad\x42\x45\xb9\x54\x3f\x16\x63\x1c\x6b\x5c\xe5\x2d\x58\x1c\x5a\x56\xfc\x99\x78\x5a\x3d\x3f\xe3\xcb\xb3\xf0\x9f\xda\x0d\xd8\x91\x67\x28\x6f\x3d\x7b\x45\xe5\x41\xce\x23\x45\xaa\x3a\x04\x6b\xdf\x52\xda\x4a\x72\x1b\x1d\xed\x0b\xa8\x22\xde\x0a\x6b\x88\x57\xb4\xa6\x25\x83\x5a\x3e\x8d\x75\xdd\xcd\xa4\x10\x31\x1c\x33\x84\x88\x7e\x5d\x31\x71\x0d\x08\x7a\x60\xc7\x37\xb7\x81\x1d\x7f\xa0\x0d\xec\xf8\xc6\x76\x10\xb7\x39\x77\xdf\x79\x6e\x44\x7c\xeb\x1c\xda\xc6\x64\x58\x2e\xec\x79\x60\xd9\x7e\xae\xdb\x55\x81\x4b\x60\xbc\xfd\x37\x2b\xac\x75\x5b\x95\x11\xad\x18\x10\xed\xe4\x2b\x9b\xc2\xed\xc1\x6d\xda\x0d\xa7\x18\x8f\xea\x2c\xf8\x6d\xe1\x8e\x15\x05\x19\x41\xf7\x5d\x4a\x52\x9a\x27\x37\x5c\xb7\x34\x42\x31\x4d\x2a\x56\x97\xdc\xe6\xc7\x95\x82\x64\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\x92\xf8\x41\x41\x64\xa6\xa9\xcd\xea\x44\x6e\x98\xbe\x63\x4c\x90\x97\x2f\x5f\xbe\x04\xd1\xe6\xe5\x1f\xff\xf8\x47\x02\xb9\xc6\x73\x96\xf1\x72\xfd\x45\x78\xeb\x5f\x5e\xbd\x8a\x19\xf4\xdf\xcf\xde\x7d\x05\x71\x46\x95\x56\xe4\x46\xea\xb9\x1d\xdb\x74\xd1\xe9\x5e\x8d\xc8\xff\xbd\xfe\xfa\xbd\xc3\xd7\x6a\xe5\x57\x90\x7f\xfc\x16\xc5\x8c\x1c\x2a\xa7\x5f\xfe\xe1\xf7\xbf\x8f\xfa\x06\x84\x24\x59\x43\x30\x77\x1b\xb4\x57\xb9\x70\x33\x21\xf5\x7a\xaa\x66\xcb\x3a\x45\x57\x8b\x2b\xf9\x6c\x0e\x07\x61\xee\xbf\x14\xd3\x82\x67\x1a\x89\x04\x26\x7e\x40\x90\xb0\xe5\x42\xa8\xcd\xba\x66\x65\x81\x28\x53\x53\xce\x46\xa4\xe0\xb7\x8c\x4c\xd5\xdf\x6a\xd9\x54\x6d\x6e\x44\x5b\xbd\x22\xa3\xc2\x8c\x8f\xc3\xb5\x70\xa7\x58\x74\x46\xd6\x7d\x78\x8a\x47\xda\x8a\xd2\xaf\x1c\x74\xbc\x22\x68\x8c\xb0\x78\xe3\x2d\x5b\x8e\x11\xba\x2b\xca\x7d\xd8\x1b\xb8\xdc\x22\x37\xd1\xe5\x47\xb2\xa8\x42\xd3\x6d\xb1\x4c\x17\x13\x5d\xd5\xf2\x1f\x08\x34\x5c\xb8\xb4\x63\x56\xa9\xa0\xac\x7c\x66\x73\x61\x8a\xd6\x6e\x1d\x31\x92\xcb\xe9\x6c\x78\x4d\x9b\x4d\xba\x4d\x69\x46\x2e\xa7\x61\xe0\x31\x24\x35\xe6\xca\x4c\x02\x6a\x3e\xdb\xb9\x45\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x11\x6b\xfd\x63\x38\x79\xd4\x18\x40\x1a\x60\xd2\xd4\xa5\xae\x6b\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x3a\xe7\xad\x8d\xb0\x65\xba\xb1\x47\x84\x11\xec\x8d\x28\x98\x52\x36\x42\xbb\xa4\xf5\x2d\xcb\x3d\x7e\x9e\x40\xd8\xb3\x8a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x92\x2e\x3b\xd9\x6f\xcc\x34\x8e\x27\x93\x63\x44\x2d\xb2\xc6\x80\x7b\xc4\x02\xe6\xf9\x13\xe5\xc8\xed\xdc\x2d\x28\xf3\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1b\xd1\x4c\xed\x5e\xc6\xe0\xbe\x24\xc9\x24\x5e\xb5\x83\x2d\x26\xbf\xb8\x7b\xb3\x7a\x38\x47\x93\x6b\x69\xc2\x51\x64\xb6\x71\x6c\xf7\xe5\x1c\xb7\x7b\x6c\xef\x5b\x2c\x7b\x9f\xcc\x60\x97\x51\xac\xcd\x86\xa9\x46\x8b\x72\x38\x46\xd7\x08\x16\xc5\xdf\xd8\xd4\x09\xfd\x15\x74\xdb\xf6\x24\x6c\x0d\xb6\xa7\x63\x6e\xb0\x5d\x4e\x57\xb3\x4b\x04\xe8\x2d\x64\x34\x1d\x1d\x8a\xc9\x01\xd5\xb6\x43\x70\x2b\xd8\xf6\xcc\xb3\x60\x4b\xe3\x5c\xb0\xa5\xf0\x2f\xd8\xe2\xdc\x4b\xb0\x6d\x7b\xb9\x9c\x3b\x0a\x6e\x8f\x25\x33\x48\x49\xa6\x7e\xf3\x31\x83\x6b\x15\x20\x96\x84\x3b\x65\xc9\x15\x5e\x2b\x7a\xa3\x64\xd1\x68\x1c\x22\xbd\x93\x90\xe6\xc1\x24\x5d\x4a\xf0\x38\x42\xb7\xda\x5d\x40\x29\x81\x13\x41\xf2\x94\xd2\xd7\xe1\x7c\x8d\x86\x6a\xd5\x43\xb5\xea\x7b\xda\xf3\xaa\x56\xed\x3e\xf3\x31\xcc\x9b\x8b\xff\xcb\x9a\x18\xa4\x0b\xfc\xfd\x73\xaa\x62\x8d\x2d\x53\x3c\x45\x31\xa5\x38\x39\x39\xf7\x19\x4f\x9c\x57\xf3\xa5\xd0\xac\x9e\xd2\x8c\x9d\x86\x0a\x2b\x56\xcd\x59\xc9\x6a\xb3\x41\xf6\x3d\x97\xda\xc3\x26\x74\x23\x37\x4b\x07\x7f\x84\x7d\xd2\xac\x36\x9b\xd9\x9a\x52\x0f\x5f\x6f\x07\xc7\xdd\x95\x4e\x0c\x3a\xdb\x8b\x3a\x0c\x7a\xee\x94\x07\xb5\x78\xad\xdd\x3c\xdc\x6b\xdc\x68\x15\xaa\x06\x63\x6e\xf8\xb9\x14\xc0\x3f\x00\x8a\x59\xca\xa6\x46\xa7\x07\x6f\x4f\xcf\x64\x5d\x1b\x9e\x05\x86\xa6\x8a\xd4\x6c\x66\x84\xd8\x1a\x2b\x25\xc3\x1b\x45\x63\x1e\xec\x34\x3a\x6c\xef\xf6\x63\x6f\x28\x7e\x20\x3e\x2e\xa2\x37\xcb\x61\x56\xb5\x5c\xf0\xdc\x31\x98\x21\x96\xe6\x8a\x54\x54\x05\xf9\x68\xa8\x52\x32\xe3\xa0\xa4\x6c\x4f\x30\x62\x24\x94\xf0\x81\x51\xf5\x59\x56\x3b\xf9\x1b\x42\x23\xb6\x84\x7c\xf9\x11\x9e\x70\x09\x47\x22\x64\xce\xae\x9a\x9b\x82\xab\xf9\xf5\x3e\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\xfb\x0c\x8a\x51\xe6\x4a\xa1\x38\xf0\x85\x86\xba\x19\x26\x96\x1b\xf1\x4a\xc2\x69\xb9\xfe\xc3\x2b\x26\x81\xc6\x17\xcc\xe6\xea\x3b\xbf\x7e\x38\xbc\x19\xdb\xfb\x76\x2d\x36\x03\x15\x56\x64\xc8\xd9\x37\xa2\xea\x3c\xcf\x68\x71\x7f\x25\xba\xb0\x75\x59\x14\x47\x97\x50\x1c\x70\x79\xab\x10\x00\xb9\x81\x4d\xb7\x47\x3c\x28\xae\x69\xb3\x70\x47\x1b\x75\x57\x36\x58\x91\x52\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x08\xb2\xa6\x41\xf2\x5f\xb8\x01\x83\x71\xf6\x9e\x36\x18\x67\x1f\x68\x83\x71\x76\x63\x3b\x88\x73\x4d\x9b\xb9\x97\x06\x49\x56\x3b\xb5\x66\x3d\x9f\x10\xcf\x71\xf4\x44\x45\xec\xd4\xe5\x05\x67\x75\xa6\x75\xcd\x6f\x1a\xbd\xa7\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x59\x80\xb0\xac\x32\xc8\x63\xc6\x80\xde\x44\xb3\x84\x13\xcf\xb9\x01\xd3\x86\x0f\x8f\x15\xc9\x65\xd6\xf8\x82\xc4\x70\x3a\xad\x37\x5b\x6c\xbd\xc2\x24\x3c\x9c\x5e\xce\x2b\x1c\xa4\xf7\x6a\xe5\xf2\x4e\x18\x6c\x77\x76\xd5\x93\x7b\xa2\x9b\x77\xa2\xfd\x2a\x14\x53\xdc\x63\x62\x9e\xd3\x1b\xd9\x68\x9f\xdd\xf7\x7f\x99\x99\x7d\x93\xde\x59\x4b\xd2\x28\xf6\xa0\x19\xbd\xd5\x26\x6f\x39\xc6\x60\xbb\x1f\x6c\xf7\x83\xed\xfe\xbe\xd6\xb9\xc7\x97\x68\x96\x0f\x8b\x3e\x77\xf0\x97\x4b\x95\x1c\xb3\x75\xfb\xb7\x86\xbe\x69\x31\x2e\x8a\x34\xab\x89\x2a\x56\xe4\x2c\xbc\xed\xad\x36\x3e\x70\x07\x75\x28\x19\x58\xe2\xa7\xb7\x9c\xee\xc9\x1e\x0a\xab\x8b\x92\xa1\xb1\x75\x23\x6e\xdb\x20\x69\x2c\xe5\x8e\x6e\x12\x81\x47\x46\x25\xf3\xd7\x58\xd5\x93\x0a\x21\x91\x1d\x50\x23\x5b\xf2\x7c\x64\x43\x5d\x80\x11\xae\x68\x86\x72\x69\xc3\x73\xc0\x04\x6d\xc4\x7a\x7f\xfc\x2d\xb6\xc4\x13\x20\xc9\xa7\x40\xe0\x24\x60\x81\x3d\x25\x84\xc2\x96\x7a\x24\xa6\xd1\x8a\x7f\xcb\x6a\x15\x95\xdf\xb3\x6d\xdd\x64\xd3\xf8\xbd\x3b\x09\x95\xcd\x59\x49\xe1\x9f\x6f\xdd\x02\xcc\xb5\x36\xfc\xae\x66\x98\xd8\x93\xd5\xa5\x11\xbc\x46\x1d\x7f\xf6\xa3\x45\x5c\x5e\x4c\xd7\x92\x85\x15\xe2\xc0\xb0\x3f\x05\xfe\x03\xcb\xbd\xea\x18\xd6\x0c\x08\x02\x7d\x2f\xb0\x50\xe6\x8a\x3b\x0c\x20\x2e\xdc\x9f\x3d\x2f\xed\x31\xd2\x15\xb6\x43\xf8\x01\x6c\x6b\xff\x1f\x79\xfb\x42\x97\xe5\x89\x1e\x78\xb0\xff\x0f\xf6\xff\x6e\x7b\xe6\xf6\xff\x80\xe4\x39\x0c\xba\xc1\xc0\x1f\x5a\x48\x9c\x95\xff\x86\x39\xd9\xc2\xca\x2f\xce\x74\xef\xec\xf6\xb2\xee\x3a\x9e\x1d\x4f\x26\xc7\xe8\x7a\xd6\x0a\x3c\x8d\x9e\x8e\xff\x44\x98\xc8\x64\x6e\xfa\xf9\x08\xfd\xd7\x4a\x03\xbb\xd4\x6a\xfe\xc2\xb9\x94\x6e\xac\xd0\x79\x0d\xfa\x4e\xa3\xab\x09\x68\xcf\x65\x98\x7d\xfb\x18\xe6\x22\x01\x7d\xb5\xcc\x87\xcf\x6d\x6b\xb7\xc2\xd7\x4a\xb0\x5c\x88\xfb\x5d\x91\x82\x97\xdc\xd6\x85\x35\xf7\x9d\x29\x1d\xab\xb8\x24\xe4\x04\x3f\x9e\x64\x55\x33\xb2\x1d\x4d\x4a\x56\xca\x7a\x39\xf2\x9d\x99\x1f\x3b\xbd\xdb\x37\xb0\x6a\x47\xd6\xd4\x35\x13\xba\x58\xc6\x26\xe6\x69\xdb\x81\xb8\x1c\xb7\x53\x7b\x64\x72\xfc\xe1\xc4\xa5\x8f\x6a\x5b\xf7\x46\xb6\xd6\x61\x50\xaf\xfb\xd5\x62\x59\x5e\x0c\x78\x1e\xb5\xb6\x73\xf3\x94\x89\x05\x59\xd0\x5a\xc5\xde\x00\xb2\x2d\x5f\x93\xf3\x05\x57\x7d\x95\x93\x1f\x58\xdc\xb5\xd7\x7d\x42\xc9\xc1\x46\x57\x8d\xb6\xe8\xce\x81\xb8\xab\x34\xe1\x41\x7b\x85\x7d\x7b\xd5\xaf\x02\x6e\x5b\x45\xb5\x66\xb5\x78\x4d\xfe\xf3\xe4\x3f\x7e\xf3\xd3\xf8\xf4\xaf\x27\x27\xdf\xbd\x1c\xff\xeb\xf7\xbf\x39\xf9\x8f\x09\xfc\xe3\xd7\xa7\x7f\x3d\xfd\xc9\xfd\xf1\x9b\xd3\xd3\x93\x93\xef\xbe\x7c\xf7\xb7\x8f\x57\x17\xdf\xf3\xd3\x9f\xbe\x13\x4d\x79\x8b\x7f\xfd\x74\xf2\x1d\xbb\xf8\x3e\xb2\x93\xd3\xd3\xbf\xfe\x2a\x61\x92\x54\x2c\xbf\x8e\xc6\x29\xd8\xc6\x5b\xd1\x95\xee\xb7\x89\x47\xbf\xc2\xfb\x71\xa1\xc7\xb2\x1e\x63\x27\xaf\x21\x0b\x7a\x74\x57\xee\x68\xb7\xbf\x23\x2d\xd5\x6a\xab\x9e\x38\xf6\x78\xcf\x97\xe0\x71\x1c\xf0\xd6\x8e\x5d\x60\x2a\x7a\xc3\x77\x9a\x7d\xc0\xf5\xd9\x0d\x92\xd2\xac\xac\x64\x4d\xeb\x25\xc9\xad\x72\x6b\xf9\xa8\xa4\x6f\x8f\x4c\xac\x0e\x93\xcc\xf9\xc3\x30\xbe\x07\x55\x71\xc9\x72\xde\x94\x7b\x49\xcb\x06\x3d\x87\x9b\x7e\x07\x65\x47\x6c\x51\x13\xe7\xeb\x63\x5f\x73\x25\xb9\x68\x76\x8b\x82\x8a\x3f\x95\x38\xfd\x61\xa7\x16\xc5\xd1\xd1\x4a\x8d\x6f\xd0\x4d\x83\x13\x8c\xcc\xd9\xb1\xf2\xef\xe2\xe0\x89\x4a\x62\x34\x67\x5a\xdf\xc8\x13\xdb\xd5\xa9\x61\x04\xdf\x01\xaf\x70\x80\x34\xfc\x51\xd0\x42\x12\x93\x37\xf1\x7f\xb2\xaf\x0c\x57\xb4\x97\x08\x6f\xd7\xb9\xaf\x08\x2e\x41\x98\xb3\x89\x17\xa7\xa4\x90\x59\xe0\x00\xd6\x61\x06\x00\x1c\x2e\xdc\x25\x8e\xb7\x15\x1a\xa0\x30\xe3\x22\xaf\x07\xca\xd0\x42\xa1\x77\x0b\xcf\xa0\x40\x1b\x88\x86\x70\x66\x09\x90\x60\xba\x2d\xe9\x27\x5e\x36\x25\x69\x94\x99\xad\x14\xdd\x5e\xda\xc9\xde\xb9\x3a\x73\x90\xca\x8e\x0b\xf8\xa8\x23\x1a\xc7\xa8\x28\xe7\x8c\x5c\xfb\xfd\x6b\xd5\x21\x68\x4a\xb7\x92\x9c\x6a\x40\x90\xb0\xf3\xb0\x6c\xb2\x9c\x82\x63\x85\xe7\xd8\x94\x2f\x55\xb6\xc5\xa5\x12\xbc\xe8\xde\x2a\x57\x44\xc8\x6f\x6f\x23\xac\xbf\xe2\x73\xba\x01\xcf\x98\x37\x8a\xe6\x88\xd2\xf9\xa0\x44\xee\xe7\x11\x3c\x8f\xf7\xde\xdc\x29\xc9\xf6\x2e\xa1\x1d\x9a\x1d\xd6\x2f\xea\xba\x87\x52\xe7\x49\xe8\x51\x48\x5c\x9a\x9d\x8f\x5e\xa7\x63\x49\x7d\xb6\xcc\x6c\x0a\x3f\xde\xa9\x03\x87\x83\x22\x7c\x43\x18\xdb\xd8\xfc\xc7\xe9\x7e\x9c\xf9\xf1\x86\x4d\xd1\xbd\x09\xbf\x01\xd9\x5d\xf5\x85\xce\xa1\x46\xab\x60\x1a\x62\xf1\x98\xaf\x0e\x88\x7e\x57\xa5\x5c\x44\x14\x10\xfe\x46\x59\x83\x33\xef\x05\x28\x7a\xda\x89\x93\x57\x28\x62\x0b\xc6\x72\x8c\x05\x2c\xda\xf9\xd7\x8d\xe8\x9d\xfd\xcd\x29\x99\x32\xaa\x9b\x1a\xbd\x7f\x84\x91\x72\x0a\x27\xc0\xa1\xda\xa9\x66\xe6\x50\x20\x05\x62\x2d\x4b\xa2\x04\xad\xd4\x5c\x6a\x50\x9d\xd0\x8a\x66\x5c\x47\x84\x97\xe9\x9a\x66\xb7\x50\x63\xb9\x66\x76\xb6\x7d\x53\xcb\x4e\x6d\x14\x43\x08\x11\xdd\xd8\x47\x3d\xaf\x65\x33\x9b\x43\x28\x1e\xbe\x95\x15\x54\x61\xcc\x65\x9f\x91\x7d\x63\xef\x56\x31\xa0\x48\xbe\x14\xb4\xe4\x99\xaf\x34\x55\xcb\x05\x57\x5c\x5a\x23\x15\x8c\xda\xbf\x68\x4a\xae\x7c\x19\x20\xb4\x8c\x9d\x17\x94\x97\xe4\x44\x31\x46\x2e\xdc\x25\xc1\x5f\xae\x51\x40\x40\x75\x67\x8c\x83\x55\x68\x54\xb3\xa9\x8f\x6d\xe6\x14\xf3\xc4\xa9\x6e\x03\x37\x86\x98\x84\x58\x16\x9e\x37\x4e\xbb\xbf\xc0\xaf\x01\xe3\xcd\x2b\x96\x35\xf8\x0b\xba\x6a\x78\x4c\xe4\xb2\x75\x8f\xe9\xe9\xf5\xec\xea\x52\x85\x6a\x05\xbc\xcb\xb6\xc0\x12\xfc\x60\xd3\x2d\xfb\xbc\xb2\x1e\x13\xf4\xf4\x6c\x08\xac\x80\x42\xcc\x0b\x9e\x37\xb4\x40\xd2\x1a\xb1\xc8\xf3\xeb\x4b\x1c\x98\xcf\xe6\x7a\x7c\xc7\x40\x11\x8c\x3c\x50\x8b\xfb\xdc\x74\xf9\x9a\xd3\x36\x57\x40\x84\x23\x6a\x30\x5b\xc5\x34\x2e\xf9\x8e\x2e\x21\xff\xbc\x75\xfe\xed\x78\xfb\xb8\x9a\x30\x38\xc0\x54\xf6\x51\x99\xd2\xd1\x6f\x0b\x42\xbd\xcb\x3e\x03\x94\x92\x51\x01\xcc\x38\x68\xf4\x0d\x3c\x01\xd6\x58\x5f\x73\xff\xfd\x0b\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xaf\xcc\xb6\x07\x69\x6a\xd1\x42\xec\x47\x56\x56\x05\xd5\x7b\x71\xc0\xf9\x7b\x60\x72\x08\xec\xe1\x06\x89\x51\x91\x8f\x69\x61\xae\xca\xd5\xb7\xe7\x36\xe0\x15\x11\x4f\xa2\xa7\xdd\x47\x47\x84\x84\xaf\xa5\x6c\xd8\xf0\x8d\x38\x07\xb2\xa7\xde\xb0\x1c\x28\x88\x9d\x5b\x9c\x93\xb0\xbc\x13\xac\x76\xb0\x77\xf5\xed\xf9\x88\xf0\x09\x9b\xb8\xbf\x7c\x67\x8e\x3c\x6a\x39\xc3\xd0\x19\x17\xa2\x16\x63\x5b\x97\xf9\x04\x97\x13\xea\xf7\xc3\xde\x7f\xf8\xb3\x59\xa8\xf9\xf5\x2f\xe3\x3f\x07\xb5\x0b\xff\xf2\x83\xa1\xc7\x51\xbe\xaa\x3f\xac\x7c\x17\xc6\x5c\x00\xd1\x33\x7f\xfd\x70\x65\xcb\x16\xdb\xa2\xc6\x3f\x44\x3a\x55\x10\xc2\x84\xae\x97\x13\x72\x25\xc1\x0f\x8f\xe7\x78\x65\x61\xfe\x35\xfb\x87\x33\x0b\xc1\x71\x79\x0d\x7a\x46\x35\x13\xc0\x95\x3c\x58\x01\xb8\x6d\x36\x03\x00\x0c\x00\xc8\x89\xc2\x2e\x9d\x80\xea\x15\xd3\xe1\x8c\x88\x96\x98\x9c\xbe\x1f\x97\x9b\x76\x26\x08\xfb\xc4\x15\x64\x3f\xc3\x1d\x87\x63\xa3\x36\x24\xc4\x31\x72\x66\x58\x03\x09\x3e\x67\x5e\x25\x63\x7c\x37\x60\xfd\xbf\x16\x52\xff\xda\x5f\x06\xe7\x51\x0a\x1c\x9b\x24\x74\x21\xb9\xab\xb1\x6d\x10\x8f\x00\x23\x4b\x54\xa2\x09\x7b\x9e\x37\x4b\x52\x72\xa5\xe9\x2d\x9b\x90\x6b\xc3\xce\x85\x4e\x26\x78\xca\x82\x40\x2d\x3c\x96\x93\x46\x68\x5e\x44\x4a\x74\x7e\x2e\xb0\x31\x01\xab\x07\xa9\x25\x9a\xcc\xf0\x24\x55\xcd\xc6\x8e\xb5\xc4\xb7\xa2\xf4\x2e\xb6\xaa\xa7\xdb\x93\x76\x4f\x47\x1e\xf4\xe7\x14\xd5\x22\x55\x0e\x9d\x5b\x4f\xed\xe8\x0b\xbb\x16\x4d\x61\x76\x43\x8a\xac\x65\x1d\xe1\xd8\xd5\x84\xbc\x07\x7e\xb0\x88\x01\x72\x74\x1a\x43\x3d\x90\xb5\xb2\x09\x96\x31\xa5\x68\xbd\x44\x27\x76\xee\xab\x6b\x37\x8a\x4d\x9b\x02\xd8\xe5\x98\x2d\xa1\x02\x2b\x99\xd7\x2c\x93\x42\xe9\xba\xc9\xe0\x1c\x29\xb9\xa9\xe5\x2d\x13\x6d\x18\x52\x14\x62\x0c\x3d\xee\x5b\xd7\x66\xc3\xf6\x08\x49\xb2\x39\x15\x33\xe6\x53\x80\x90\x92\xe6\x00\x45\x5f\x7a\x01\x2b\x66\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\x37\x86\x23\x73\xf6\xc8\x98\xc9\x7e\xf0\x41\x00\x65\x60\xbc\x14\xbc\xd8\xb1\x23\x6f\x8a\xad\x6a\x0c\xfc\x77\xbf\xe0\x9e\x64\x9b\x2a\x99\xa6\x39\xd5\x74\x9f\x71\x1a\xef\xa8\x2f\xe3\x6e\x7d\xa1\xe0\xd0\x03\x1f\x29\xcb\x66\x39\xa9\x50\x56\x3c\x4c\xec\x72\xf5\xed\x79\xe4\x48\x20\x06\xc2\x39\x43\xde\x48\x6d\xee\x91\x35\xcf\x03\xe4\x61\x68\x8c\x8b\xc5\x30\x93\x70\x63\x22\x39\x60\x39\xc9\x9b\x04\x6d\x7f\x4b\x54\xe2\xec\x99\x89\xd6\x4c\x73\xde\xfb\x3c\x98\x8f\xad\x9b\x50\xd6\x8d\x2c\xd8\x28\x4c\xa0\x05\x9e\x09\xcd\x6b\x16\xa4\xf7\x89\x1c\xcc\x9e\x6a\x23\xf0\xa6\x77\xcf\x17\x01\x60\xc6\xb4\x6a\x5d\x92\x91\xfc\x47\xf7\xaf\x2d\xe3\x88\xb3\x04\x5e\xd6\x9d\xb9\xd5\xdf\x6d\x5c\x54\x64\xef\x08\x37\x4a\x5a\x32\x6f\xd8\x9b\xbd\x1c\xf9\x36\xb6\x65\x9a\x19\x6c\xff\x4e\xe6\x29\xe6\xe8\x6d\xbd\x0f\x3a\xc3\xb5\xe1\x69\x18\x15\xa9\x40\xf9\x8c\x2f\x80\x43\x8c\xea\x24\x37\x42\x1a\x35\xa7\x8b\x84\x54\x2a\x5b\x6b\x3c\x5b\x39\x67\xec\xab\xf0\xc2\xc4\xc6\x30\xb1\xf1\xab\xe8\x29\xa4\x38\xf2\xba\x16\xed\xd0\xdb\x1d\x24\xd1\xea\xfa\xa8\x44\x10\xae\x19\xf4\x7f\x9d\x68\x71\xdd\x1e\x7a\xda\xd1\x2c\x33\x60\x9d\xa8\xbc\x03\x9e\x0d\xf6\x67\xdc\xa0\xed\x94\x1d\xfc\x75\x87\x6d\xb6\x82\x96\xd7\x99\x61\x38\xe5\x89\x53\xa2\x4d\x2c\x98\xb8\x3c\x95\xdd\xd7\x4f\xb7\x1e\x16\x38\xff\xcd\x5a\x9c\x84\x3e\x2f\xad\x3f\xb1\x93\x41\x8d\xac\x57\x83\x0d\xcd\x85\xf1\x9b\x8b\x57\xcb\xa2\x60\x35\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\xc7\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\x9d\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x29\x57\xfd\xef\x4e\x8d\x7b\x26\x96\xb8\x75\x6f\x02\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\x9b\xc2\xb0\x68\x01\x48\xf9\x19\xad\xf0\x12\x5a\x06\x6f\x7d\x60\xd3\x94\xed\x00\x3d\x73\xf8\x71\xdc\x28\xc8\x8c\x74\x3e\x9c\xb4\xbe\xdf\x56\x7a\x4b\x4a\x32\xee\x9a\x85\x8e\x4e\x67\x5d\x7f\xcb\x95\x71\xc3\xbc\x77\x1b\xe7\x1a\x3f\xfa\x16\xfe\x58\xdb\x78\x64\x41\xf6\x34\xde\xab\xcb\xea\x7e\x10\x29\xaf\x63\xdb\xc6\x85\x0b\x3c\xd5\xc1\x15\x34\xcd\x1f\x67\x7b\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x61\x06\xff\xb4\x49\x21\x53\x20\x8a\x20\x54\x85\x23\x6d\x70\xe2\x6d\xaf\xf7\x97\x50\xd4\xd4\x9a\xf6\x5d\x4a\x0a\x43\xa6\xcf\xae\x2e\x71\x7e\xa9\xa3\xbf\x05\xfc\xb6\xb4\xcc\xba\x9e\xf3\x3a\x1f\x57\xb4\xd6\x4b\x54\x76\x8e\x3a\x73\xf3\x51\xf5\x49\x83\x6c\xe9\xd7\x14\x57\x06\x39\x6c\x9d\xe3\x86\xad\x72\xc6\x7b\xeb\xc3\x71\xef\x99\x1d\x62\x3d\xf1\x51\xf9\x1b\xd7\x13\x16\xb1\x74\x8a\xc1\x27\x5c\xcf\xe3\x23\x0e\x48\x17\x57\x1e\x96\x07\x32\xc8\x59\x75\xbd\x1e\x91\x51\x01\xe9\xc7\x2a\x90\x65\x18\x1c\xeb\xb9\x69\xd0\x3d\x99\x9e\x46\x84\x4f\x0d\x91\x96\x62\x0c\xd6\xfd\x84\x89\xb4\xc6\x4c\xcb\xbb\x4f\xac\x83\x3d\x6a\x8b\xe0\x42\x06\xf3\x09\x06\x69\x6f\x3a\x39\x11\x32\x46\x99\xe4\x1a\xe0\x09\xec\xf5\x14\x63\x1f\xee\xb1\x5c\xdd\xa4\x24\x9c\x24\x2d\xf7\x10\xaa\x99\x02\x0c\xe6\x18\x18\x2e\x72\x03\xa4\x40\x12\x41\x01\xa5\x9a\x2c\x63\xcc\xab\x80\xed\x25\x4d\x61\xdd\x3b\xb8\xd1\x6e\x58\x49\x75\x36\x67\x8a\x28\x09\x59\xd5\x95\xa6\x45\xc1\x72\x6f\xd6\xc4\x03\x95\xc0\xd7\x59\x93\x67\xc2\x88\x01\x63\x98\xb2\x41\x81\x0a\xce\xea\xc0\xab\x82\x5a\xe5\xe3\xb4\x11\x19\xfa\x0c\x73\xbd\xf4\x56\xad\x55\x66\x1d\xf4\x36\x0a\xf4\xac\x29\x0c\xe5\x14\xed\x56\x81\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xb6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x09\xce\x82\x44\x1d\x23\xe4\xc6\x42\x96\x49\x1c\x87\x4e\x41\x5c\x6c\xcf\x20\x86\x6b\x3b\x09\xb6\x6c\x8d\x71\x3c\xf5\x0c\xa3\x62\xbe\x1c\xb8\x4a\xe1\x5a\x88\xf5\x82\xa2\x8d\x96\x25\xd5\x3c\x03\xf5\x2c\x9f\x06\x46\xde\xd2\x17\xe5\xf3\x4e\x4e\x48\x54\x81\xa8\xdb\x5d\x4f\xbe\x56\x9b\x99\xcd\x47\x6d\x5b\xb0\x53\xf6\x34\xba\x9b\xe2\x96\x1a\xb0\x1a\xc9\x73\xff\xe8\xf2\xa6\x10\x3d\xaf\x19\x23\xbc\x34\x62\x12\x15\x9a\xe4\x7c\xea\xf3\xe5\x38\x9b\xfd\x43\x67\x97\x26\x89\xfe\x1d\xfc\x41\x82\xfe\x50\xd5\x5d\x14\xf2\x4e\x11\x7d\x27\xbd\xda\xad\xb5\xe5\xda\x7c\x29\xa3\xee\xb0\x49\x14\xd4\xf6\x6f\xd0\xb6\x39\xe9\x00\xd3\x8e\xcc\xad\xbd\x63\x45\x61\xfe\xff\x10\xbe\x4d\x88\xf4\xda\xb8\x4e\x3e\x13\x98\x88\x83\x2b\xa7\x66\xb5\xf1\x64\x27\x79\x2d\xab\xca\x9a\x81\xca\xd3\xc7\xac\x13\x5c\x9b\xea\x05\x53\xe0\xa6\xe7\xa2\xd9\xcc\x91\xcd\x98\x60\x35\xd5\x60\x08\xb7\x19\xb4\x81\x38\xae\x4e\x27\x5e\x6d\x89\x6d\x2b\x39\xad\x07\x0c\xd0\x6d\x61\xf3\xb1\xbb\x77\xec\xaf\x49\x73\xe5\x02\x21\xc0\xdd\xd8\xa4\x23\x3d\xf9\x82\x69\x7a\x4a\xbe\x51\x78\x50\x9e\x5e\xf8\x28\xc1\x28\xe9\xdc\x66\x39\x42\x01\x3d\x69\xf8\xb3\xa2\x9a\x07\xe3\x87\x52\xae\x0f\xb5\xee\xee\x54\x67\x66\xe7\xb5\x54\xea\xbd\xfb\x64\x2f\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\x87\xdb\x20\x01\x1f\x7a\x3d\x80\xef\x0e\x79\x27\xdf\x87\x0c\x61\x17\x51\xef\x6c\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\xde\xab\xf4\xa4\x80\xd3\xef\xe8\x72\x22\x98\xb6\x79\xe8\x9c\x6e\xff\x83\x1b\xfd\x6f\xb5\xe1\xfc\xac\x80\x16\xdc\x22\x77\x81\x5d\x12\xc1\x60\x14\x2d\x91\x14\xb7\xde\x37\xf0\xfc\x58\x59\x8f\x0e\xf3\x3b\x04\xdb\x93\x4e\x49\x96\x09\xb9\xb6\xde\x82\x2b\x83\xaf\xa7\x0a\xcb\x99\xa6\x3c\x2e\x0f\x65\xd8\x1c\xa5\xfc\x78\x0f\x8d\x3e\x00\x25\x24\xdb\x81\xac\x0f\xdd\x3c\x84\xaa\xa5\x0d\x81\x0e\x3c\xe2\xc3\xa8\x92\xf6\x85\xc7\x5b\x2a\x2f\xa7\xe4\x03\xcb\xe4\x82\xd5\xb8\xdf\x17\x9f\x2a\x2a\x8c\x98\xfe\x96\xf2\xc2\xec\xb6\xdb\xf5\xd6\x7a\x01\x45\x90\xbb\x6e\x09\x81\x11\xcc\x5f\x23\x7b\xb4\x06\x72\x52\x98\x41\x9f\xf3\xce\xf4\x6c\xfd\x74\xab\x9a\x2d\xb8\x6c\x94\x8b\xa7\x69\x34\xd2\x31\xa5\xad\x6c\x3a\xe7\xb3\xb9\x7b\xd9\xf9\x99\x83\x07\x50\x9d\xfb\xab\x92\x30\x07\xa5\xa9\x6e\x54\x37\x51\x4e\x06\xee\x04\x4f\x62\x03\xf6\xe7\xbd\x5f\x86\x6f\x3b\xe6\x0a\xe3\x8f\x0e\x89\xc6\xbf\xc2\x88\x27\xec\xe4\xc6\xde\x02\x17\xa6\xd5\x86\x99\x65\xb2\xac\x1a\xcd\x82\xdb\x62\xa1\x35\x15\x6d\x25\x1e\x64\x27\xef\xe5\x8b\x92\x0a\x3a\x63\x63\x3f\x89\x71\x1b\xa1\xf5\x62\x0b\xac\x95\x78\xa4\xe4\x11\x89\x17\xc3\xf6\x8c\x23\xab\x56\x16\x9b\x1e\x79\x4e\x1e\x19\x7d\x4e\x1e\x13\x81\x4e\x76\x19\x85\x4e\x7c\x2a\x8b\x43\x5e\xc7\x0f\x76\xcc\xd5\x0b\x69\x89\xd5\x43\x17\x72\x3b\x91\xc0\x12\x2d\x3b\x2a\x57\x44\x96\x5c\x6b\xe6\x1c\x99\xfd\x05\x1b\x11\xae\x3b\x99\x16\x2c\xe2\x00\xa5\x39\x7a\x23\xb3\x4f\xbe\xac\x76\xcb\x98\x25\x4e\x06\x84\x9f\x3b\xae\x90\xf1\x12\x84\x97\x15\x16\x66\x01\x04\x30\xb6\x71\x92\x4e\x35\xec\xe7\x9d\x81\x2f\x21\x61\x9f\x40\x91\x8f\x53\x1b\x30\xd3\x80\x99\x56\xda\xcf\x01\x33\x61\x16\x8b\x94\x24\x2b\x1d\x8c\xe4\x3e\xb7\x39\x2e\xe9\x0d\x2b\xc8\x8f\x0d\xab\x97\xc4\xb0\xad\x6d\xa4\x17\x54\x03\x57\x3c\xc7\x98\x26\x67\x35\xdb\xb3\x96\x6c\x3b\xa6\x09\x2c\x6d\x17\x9f\x0c\x77\x0f\x39\xdb\x1e\x81\xaf\x57\xbb\xea\x66\x02\xc5\xdd\xf2\x3b\x18\xf2\xe4\xe8\x74\x1a\x3e\x01\xb6\xfb\xec\xfd\x9b\xed\x04\xaa\x34\x67\x43\xb2\x8d\xc3\xe1\xda\xe2\x93\x89\x15\x21\x67\x0f\xec\x09\xee\x9d\xff\x05\xa8\x84\x77\x17\xf5\x3a\x7b\x72\xcb\x96\x23\xeb\x0e\x4e\xcc\xe9\x53\xf7\x72\xf2\x64\x30\x2e\xa4\xad\x5a\x68\x3a\x8d\xcd\xbe\xdd\x6d\x5b\x23\xe1\xed\x14\xbd\xd8\xe2\xcb\x45\x76\xbf\x72\x9b\x96\x8a\xeb\xb7\xa6\x12\x49\x65\x25\xc3\x76\x5f\x89\x49\x84\x21\xa8\x07\xe7\x72\x23\x78\xb0\x81\xac\x13\x80\x90\x52\x0f\x91\x6c\xaf\x50\xc3\xe6\x36\xf6\xd1\x4b\xdd\xe2\x62\x85\xe3\x77\x63\xf9\x6f\xd9\xf2\x58\xd9\xa4\x77\x52\xa8\x39\xaf\xb0\x04\xaa\x62\x80\xa3\xb6\x03\x78\x6c\xdf\x82\x6b\xbb\x1b\x16\x31\xd8\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x40\x68\x12\x5c\xab\x37\x92\xa9\xf7\x52\xc3\x93\x83\x9f\x0b\x2e\xf1\xa9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x2e\x05\x91\xb5\xdd\xca\xad\x06\xd6\xae\x88\xb2\xb2\xc3\x3a\xeb\x43\x6b\xd4\xdf\x34\xae\x3d\x35\x59\x77\x0e\x6d\xc7\x53\xb0\xc3\x83\x2e\x12\x7f\x01\xed\x2a\x78\x97\xb8\x90\x1a\x2c\xdb\x4b\x35\x9b\x25\xb9\xba\xb4\xad\x64\xf5\x0c\xb2\x3c\x66\x09\x05\x1f\x83\xc9\x6f\x49\x58\xb1\x6d\x45\x5e\xc3\x81\xb7\x04\xf6\x1d\xf9\xf8\xef\xb8\x2b\xe0\x93\xbe\x82\x50\xae\x43\x4a\xc7\xc1\xb0\xc8\x5d\x94\xb4\x32\xb7\xef\xbf\x0d\x13\x01\x80\xf9\x3f\x50\x33\x5d\x4d\xc8\x19\x51\x5c\xcc\x0a\xd6\xf9\xcd\xaa\xf9\x83\x6e\x92\x27\x00\xd6\x37\x43\xe3\x17\xb4\x60\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x1d\xdd\xb2\xe5\xd1\x28\x51\x91\x4a\x42\x9a\x60\x3a\xb9\x14\x47\x6d\x4a\xda\xce\xbd\xf4\x7c\x16\xf8\x1b\x1c\xc1\x6f\x47\xbb\xe6\x51\x9f\x48\x48\x7d\x32\x37\x51\xab\x54\x3e\x2f\x28\x1a\x56\x0e\x61\xbe\x58\x1d\x73\x53\x51\xc2\xeb\xe0\x9d\xd6\xa4\x65\xa3\x97\x9f\x50\xd3\x0e\x19\x61\x92\xc3\xac\x92\x0e\x76\xb5\x0c\xd0\x41\xcf\xe6\xde\xc1\x83\x60\x6b\x9f\x53\xdc\x9c\xc5\xb7\x9b\x3e\x08\x62\xcd\xb9\x4a\x3f\xae\xcb\xe9\xaa\x8f\x42\x90\xee\x24\x8c\xe2\x91\xb5\x8d\x5a\x5f\xf3\x21\x86\x0a\x89\x6d\x25\xa5\xd8\xda\xa9\x6d\x6b\xdd\x1f\x6a\xa6\x2a\x89\xfe\xb5\x1b\x17\x6b\x59\x84\x39\x55\xe0\x93\x35\xb5\xe6\xd6\xaa\xa9\x2b\xa9\x6c\x79\xbb\x55\x90\x4f\x8c\x5c\xb2\xe1\x64\x2e\xc8\x14\xc3\xc0\xfd\x4d\x30\xf7\xc7\xe7\xa5\x3e\x5b\xc9\x49\x28\x6b\x48\xd6\x66\x1d\xc4\x44\xce\x33\x2b\x4f\x52\x4d\x44\x5f\xc2\x98\xb0\x6d\x3e\x68\xe7\xfb\x89\x22\x8d\x4f\x92\x85\x47\xee\x58\x37\x9c\x25\x13\x1a\xac\x82\x82\x5c\x8a\x29\xa3\x8a\xdf\x14\xcc\xba\xb3\x29\x4d\x75\xd2\x9e\x04\x4e\x5c\x76\x6f\x8c\x30\x01\x94\x8b\x6b\xb5\x6a\x0e\x3c\xe1\x22\x2b\x1a\x38\x41\xc1\x8b\x53\x50\x04\x51\x91\xb1\x02\x29\xa7\xcc\x7d\xac\xf0\x16\x11\x4b\x81\x39\x73\xca\xea\xda\x96\xc3\x5b\x6e\xbe\x49\x24\x97\x0c\x9d\x70\x20\xb8\x6e\x84\x0b\xd9\xec\xbb\x68\xb7\x36\x05\xb1\xe2\x0e\x50\x72\xc5\x10\x5e\x71\x5f\xb1\xda\xea\xb4\x08\x2a\xf2\xd8\x55\x5b\x8f\xb7\xeb\xc0\x9a\x39\xc2\xc4\x15\x36\xeb\x44\x98\x90\x3b\x61\x22\x36\xe1\xc3\xfe\x31\x34\x6e\xf2\xb8\xbd\xe9\x63\x40\xd0\x2c\x41\x41\xbd\x35\x86\x8e\xab\xa8\xe5\xda\x63\x51\x32\x94\x17\x70\x29\xe7\x3a\xc9\x53\xdb\x78\x87\x47\xd3\xc9\x6f\xe1\xba\xc8\x29\x79\xdb\xd6\x80\xe5\x0a\x0c\x16\xdc\x25\xa4\x33\xc0\x8b\xf7\x09\x0d\xe7\x78\xb9\x0d\xbe\x4e\x55\xa4\x6e\xb1\xe7\x8f\x20\x83\x6d\x07\x8e\xdf\x70\x51\x13\x6b\x09\x4c\x56\xef\x23\xb8\xea\x7b\xdf\xd1\xc4\x5d\x8d\x5c\xeb\xb4\x27\x29\x42\x67\x2d\xd3\xac\xab\x3f\x79\xcb\x6f\x6a\x46\xce\xe7\x54\x08\x56\x04\xf9\xa1\xad\x11\x8b\x6a\x4d\xb3\x39\x62\x26\x4a\xcc\xbd\x2a\x98\x3e\x56\x64\x2e\x95\x26\x25\xcd\xe6\x5c\xf8\xe4\xa1\xc2\x67\x23\x6f\xb3\xb9\x1c\x3c\x75\xd6\xde\xab\x36\x5b\x08\x08\x4b\x1d\x77\x8a\x39\x47\xf4\xe4\x93\x00\xaf\xf5\xd2\xd6\x49\xb4\xf7\x10\xf6\x19\xa5\x1c\xc0\xca\xf0\x6e\xcc\x18\xf7\x97\x94\x26\x97\xa5\x37\x4c\x72\x11\x10\x1e\x66\x3f\x20\x7c\x4a\x1a\x91\xe0\xe2\x9d\x70\x27\x8b\x26\xa2\xa6\x51\x37\x7b\x79\xd1\x08\xb3\xe9\x6d\x95\x9a\xb7\xe7\x44\xd3\x7a\xc6\xb4\xe9\x8d\x88\xa6\xbc\x61\x75\x7f\x1a\xf3\xfd\x15\x56\x3b\x48\x1d\xd4\xce\x0e\xf4\x94\x2f\x25\x1f\xdc\x57\x10\xee\x01\xdc\xc0\x54\xc6\xd1\x61\xf4\xd1\x73\xc5\x57\xb1\xf4\x9e\xc1\xd5\xdf\x5a\x52\xd2\x88\x18\xea\x9c\x52\x1f\x15\xcf\xf2\xef\x7f\x7f\x9f\x5a\x9c\xee\xb8\xfd\xf2\x3e\x00\xb9\x93\x75\x91\xdf\xf1\xdc\xba\x63\x92\x13\xf3\xf2\x69\x2c\xb0\xec\xb8\x56\xdd\xf6\xa9\x74\x53\x75\x53\x77\x77\x3c\xdf\x4b\x9d\x59\xe8\xb8\xbb\xd3\x4e\x74\x32\x3b\x4d\x60\xab\x79\xce\x84\x36\xa8\xa3\x56\xe4\x04\xbe\x88\xc9\xf5\x70\xc1\x31\x23\x1f\x8c\x00\xd5\x70\xca\x1b\x2e\xda\xa4\x92\xed\x59\x1b\x72\x63\x6e\xbe\xd3\xb6\x2a\xa6\x31\xaf\x17\x44\xf4\x4b\x3d\x27\x8a\x97\x4d\xa1\xa9\x60\xb2\x51\xf1\x25\xe8\x3f\xcb\xe3\x9e\x16\xec\x13\xde\xcd\x5d\x26\x4e\x6e\x7b\xed\x72\x0b\x10\x4f\xd4\x66\xa3\x5d\x65\x17\x7a\x7a\x6d\xc3\x34\xf3\x17\x9e\xb1\xf0\x59\xf5\xd8\x27\x96\xd9\x7c\x1a\x55\xd1\xcc\x78\xaf\x44\xf5\xc6\xcc\xcc\xc8\xa4\xf9\x6b\xf2\xb6\x9d\x30\x44\xef\xba\x5f\xb0\x44\x31\xd8\xed\xed\x40\xe4\xfc\xfa\xf2\x8d\x4d\x7f\x2a\x94\x66\x74\x57\x3c\x4a\xac\xa9\x73\x6c\xd5\x11\x3b\x62\x78\xb0\xb3\xc4\xcb\xde\xe6\x7f\x5d\xd5\x9e\xd9\x5f\x6c\xad\x03\x9f\x37\x3f\x36\xe1\x67\x02\xd0\x0f\x9c\x1a\xb6\x07\x38\xb5\x30\x75\x7e\x30\x81\x9c\x55\x4c\xe4\x50\x8c\x2f\x80\x7b\xdc\xa5\x9d\x1e\x91\x2d\x1c\x97\x4a\x97\x5d\xbd\xb9\x0e\x51\x0e\xf4\x2e\x73\x59\xe4\x8a\xb0\x4f\xba\xa6\x06\xcd\x97\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x44\xd5\xcf\xe7\x54\x20\x9c\x3c\x09\x17\x98\xff\x9c\xb8\x40\xc5\xb2\x9a\xe9\xa8\xc0\xe2\x2d\xca\x86\xb8\xce\xbb\x1b\xd8\x79\xbc\x26\xca\xe3\xaf\x2e\x3c\xa6\xad\x0d\x1c\x35\x9e\x50\x1c\x8a\xf0\xad\x54\x1c\xae\xa8\x52\x5e\x3a\x06\x22\x67\xaf\xad\xea\x64\x9a\x88\x18\x02\x35\xb5\x7c\x4a\x84\x5c\x99\x69\x18\x08\xe4\xf5\xa8\x9d\x57\x22\xba\xf7\x16\xb3\x12\x0b\x11\x50\x01\x21\xf5\xd8\xcd\x08\xe2\x8c\xf1\xdf\x68\x34\x33\xeb\x0a\xe4\x7e\x58\x59\xcc\x3e\xd9\xb5\xef\xf6\xb2\xa7\xb9\xf2\xc4\x47\xbf\x6d\xa7\x87\x7b\x1f\x10\x57\x17\x50\x15\xab\x02\xea\xe6\x88\x65\x50\xb9\x93\x2f\x18\x64\xa0\x75\x09\x59\x0d\xe3\x9b\x37\x18\xb4\xe4\xd2\x42\x74\x93\x3d\xc4\x07\x77\x07\x21\x37\xad\x17\xc3\xa5\x50\x9a\x42\x5e\x00\x58\x85\xa1\xaa\x86\x00\xda\x5c\xbf\x16\x10\x51\x5b\xee\xb2\x0b\x44\x0f\x57\x1a\xa2\x99\xb1\xda\xc0\x5a\xb1\x24\x77\xb5\x8c\x77\xaa\x4c\xd4\xfb\xca\x05\xab\x17\x9c\xdd\xbd\xb0\xd1\x70\x63\xb3\x80\xb1\x0d\x28\x7f\x01\xe2\xe1\x8b\x5f\xc2\xff\xa2\xc6\x4f\xd6\x43\x5a\x6c\xfd\x9a\x1c\xf5\x97\xe4\xdb\xd6\x3c\x3b\x85\x04\xd2\x3b\xad\x7a\x66\xbb\x5c\x51\x1a\xda\x87\x56\x0c\x88\x51\x12\x5a\xfc\x16\xb0\x2e\xe6\x42\xb8\x8e\x6c\xfa\x3e\xa2\xcc\x19\xb5\x61\x92\x8d\x10\x11\x5e\xb6\x5d\x39\x00\x3b\xec\x08\x01\xde\x29\x80\x8b\xb1\xae\x19\xf3\x8b\xd2\x96\x4d\x14\xd2\x95\x6e\x88\x2c\xc8\xb9\x07\xc5\x65\x4e\x35\x55\x4c\xc7\xa9\xa9\xd3\x51\x51\xd0\xbd\x59\x71\x88\x95\xec\x4f\x60\x69\x64\x90\xcf\xc6\x65\x41\x26\xe3\xbf\x58\xe1\x40\x74\xde\x34\x62\x81\xdd\xe9\x18\x2c\x3f\x77\xe5\xab\x9c\x0f\x35\x8e\xd2\x1e\xd0\x2e\x79\x56\x3b\xc7\x6f\xbe\xb9\x7c\x93\x2a\x14\xb5\x5f\x3a\xd9\x01\xfe\xdd\xdd\x26\x0b\xc8\x50\xa7\x8a\xff\xd8\x84\xea\x0e\xa8\xe3\xe1\x41\xd0\xbe\xbf\xab\xb5\xcd\x32\xd6\x1a\x17\xde\x70\x75\xbb\xcb\x5b\xbe\xd6\x79\xf7\xbe\xff\xed\xfc\x82\xd8\xa7\x0f\xd9\x07\x7a\x06\xd9\xb5\xf5\xa0\x7b\xf3\xff\x76\x7e\xb1\xb2\x84\x15\x45\xc0\x59\x51\x38\xf9\xcc\x08\x1a\x2e\x5d\x82\xc5\x09\xc9\x1b\x04\xb8\xc3\xf0\x3e\x35\xc3\x1a\x83\xc1\xcc\xf3\x49\xa6\xb8\x4f\xa9\x3a\xbb\x65\x13\x2e\x03\x47\x84\x3d\xd7\x80\x9c\x65\xac\x75\x3f\xc9\xb9\xba\x3d\xb4\x7e\xa3\xca\xdf\xf7\x25\xde\x78\x5e\x06\x9d\x55\xe1\xde\x95\x07\x0a\xea\x84\x2d\x65\x43\xee\x6c\x45\x84\x68\xf5\xc1\x47\x5e\xbd\x26\x17\x42\x35\x35\x6b\x7d\xb9\x57\x07\x33\xfc\xfa\x0e\x95\x09\x50\x60\x43\xbd\x3e\x98\xf1\xe7\xc0\xe0\x4a\xd2\xa8\x41\x45\x6b\x0d\x92\xff\x3e\x00\xc8\x77\xee\xc8\x45\xf0\x40\xec\x06\x82\x2e\xa7\x2e\x02\x71\x64\x73\x8a\xfb\x42\x8a\xae\x9b\xd6\x63\x04\x68\x75\x1a\x94\xbc\xf5\xe5\xac\xc8\x8b\x9c\x2d\x5e\xa8\x9c\xbe\x1a\xc1\x54\x5d\xcc\x7d\x77\x5d\x54\x91\xa3\x57\x47\x31\x63\x5c\xf3\x92\x17\xb4\x2e\x30\xa3\x9d\x4f\xf4\xe7\x7b\x32\xf8\xd7\x0d\x09\xee\x9b\x2f\x8f\xc8\x89\xac\x61\xec\x8c\x0a\x52\x30\x97\xfd\xce\xe2\x8a\x25\x8a\x1a\xa7\xcf\x18\x24\xf7\x61\x5d\x44\x64\xba\x17\xf0\xcd\x1d\x37\x68\x39\x99\x4e\x61\xa3\x37\x2d\xb1\xe7\xc2\x50\xd7\x09\xf9\xc6\x52\x67\xcb\xf1\x20\x6c\xe4\x40\x6a\xf1\x8d\xe7\x7b\x32\xcf\x47\x85\xb7\xa2\x8c\xdb\x91\xaa\x8d\xac\xdb\x84\x9f\xf1\x69\xf4\xab\x04\x67\x5c\x7f\x60\x95\xdc\x29\x8f\x8b\x5d\xae\x18\xb4\xb8\x36\x0f\xa4\xe2\x50\xb9\x9b\x6a\x42\x11\x47\x65\x4d\x41\x8d\xd4\x8b\x06\xab\x24\x46\xd4\x8e\xb3\xc2\x7e\x7e\x0c\x6b\xa8\x05\x91\xe4\x56\x91\xe2\x67\x32\xb2\x58\xbd\x57\x63\xea\xab\x03\x43\xe1\x10\xf0\x8d\xe4\xfa\xdc\x77\x8b\x01\x86\x85\x14\x36\x04\xd0\xf4\x6d\x6d\x60\x33\xae\x6d\x5a\x74\x1c\xca\xfc\xec\x7a\xeb\x19\xb4\x2d\x52\x02\x55\xcd\xfd\x2a\x0e\x6e\x43\x6b\x0f\x6d\x57\xf2\xb7\x2b\x14\xbe\x17\xe9\xdb\xd7\x86\x77\x89\xbf\xd0\x3f\xa1\x7d\x1e\x4b\xba\xdf\xb9\xfa\x4b\xae\x82\x10\xfa\xc0\xd6\x1a\xe1\xe8\x78\x32\x39\x9e\x00\xdb\x70\x3c\x39\x76\xac\x65\xe1\x9d\xa1\x2d\x15\x6e\x87\x4d\x2b\xb3\xd7\xbd\x2d\x13\x42\xbe\x76\xf9\x09\x20\xe9\xf2\x8a\xe7\xb5\x77\xaa\x6e\x6b\x47\x63\xba\xba\xee\x9d\x8b\xd2\x14\x83\x0e\xbb\xb9\x09\x27\x6e\x5d\xb5\x67\x7c\x61\xf3\xb1\xee\xd4\xf4\xd5\x4e\x30\x11\x1e\xc2\x95\x59\x25\xc2\x87\xaf\x76\x3b\x33\x44\x22\xc9\xf3\xb2\xb8\xc7\xce\x2a\x93\x65\x89\xe5\xc0\xe6\x5e\x16\x6e\xf3\xf9\xc5\x22\xbe\x78\xf5\x05\x96\x46\x9b\xf6\xdc\xc3\x44\x94\xee\x3a\x5d\x51\x57\xf8\xc7\x36\x3f\x88\x68\x85\x2a\x40\x8b\x6a\x4e\x6b\xa6\xb0\x84\xb9\x2d\xd8\xdc\x5f\xe7\x73\x05\xcb\xfb\x31\x1e\x56\x35\xb6\x53\xdc\xbf\xb2\x31\x1e\x7b\x32\x91\x57\x92\xf7\x27\xcf\x1a\x93\x8a\xea\x87\x53\x5b\xc7\x63\x58\x3f\x68\x22\xe4\xfa\xef\x1c\xe8\xba\x07\x41\xf5\x47\x9b\x35\x2e\x38\x16\x2d\x2b\x59\xc8\x59\xb4\xf7\x4f\xa4\x38\xa9\xe7\xfb\x91\x24\xf5\xdc\xad\xae\x5d\x82\x97\x99\x74\x54\x84\xe7\x06\x66\xce\xd6\xdb\x54\x2e\xf5\x9f\x65\xdc\x5e\x78\xa8\x7c\xf1\xe1\xe2\xec\xcd\xbb\x8b\x49\x99\xff\x12\xe3\x40\xc6\x74\x1c\x53\x35\xf3\x73\xe0\xaa\xd7\x36\x12\xf5\x1c\x80\x13\x5c\xb1\xca\xb6\xee\x62\xc5\xea\x92\x63\x8c\xe2\x21\xd9\xed\x3d\x9f\x50\x3f\xa7\x6d\xb0\xe2\x55\x2f\x58\xa7\x1d\x8d\xeb\xb3\x8b\x96\xab\x9a\x8d\x7d\x61\xa8\x29\x2f\x20\x08\xab\xa5\xe8\x01\x96\xee\xe9\xde\x69\x8e\x9d\x12\x1a\xfb\x28\x96\xab\x1a\xe4\x96\x3b\xf5\x3a\x7b\x4c\x88\xdd\x5f\x48\xd4\x57\x81\xb5\x9a\x3a\x3a\xc3\xc2\x4e\xb5\xcd\x47\x5b\xd5\x7c\xc1\x0b\x36\x83\x92\xd8\x5c\xcc\x54\x9b\x5b\xd0\x1a\x51\x7b\x06\x80\x38\x38\xd6\xd2\x25\x6f\x26\x7b\x07\x26\x51\x9f\x2e\x09\x81\xfa\xfd\xd7\x1f\xa1\x58\x3d\xd8\x5f\xf7\xac\x3e\x36\xd3\xe9\xc5\xfa\xfb\xd0\x1a\xef\x8e\xd2\xec\x15\x4d\x3b\x73\xd0\x26\xc0\x8d\x54\xe9\xa1\x4e\x0d\x51\x3e\x25\x6a\x59\x16\x5c\xdc\x8e\x7c\xa1\xb1\xa9\xb4\x29\x56\x19\x31\x3f\x38\x70\xae\x19\x2d\x1e\x43\x0c\x76\x0e\x04\x24\x8d\x10\xe8\x3d\xe9\xf1\x81\xb1\x32\x77\xf5\xdf\x1c\xda\x41\xdd\x49\x22\x16\x8f\xb0\xcb\x3f\xbb\x6d\xe5\x25\x9d\xed\xd4\xf1\x17\x3a\xec\xa0\x6d\x41\xbe\x3e\xbf\xf4\xf5\x02\x43\xc5\x05\xbe\x2b\x6b\x42\x6b\xcd\xa7\x34\xd3\xa7\xa4\x6a\xa0\xaa\x0b\xd4\xa8\xb0\x64\xd6\xde\x8e\x7b\xbc\x02\x7a\xa6\xf3\xb1\x15\x23\xc1\x45\x4b\xc9\x62\x61\xfa\xd7\x50\x1c\x1a\xe4\xde\xa6\xb2\x4e\x05\x10\xb2\xea\xaa\xcc\x5f\x35\x45\x71\x25\x0b\x9e\x2d\x7d\x81\x03\x54\xbf\xe4\x06\x15\xf5\xe2\xa2\xb3\xe2\x8e\x2e\xd5\xeb\x70\xe6\x84\xc2\x33\x42\xb5\x66\x65\x85\x20\x63\x96\xbb\x9a\xe8\xb8\xd5\xc0\x60\xe1\x5d\x57\x60\x7d\x4a\x79\xe1\xef\x7e\x63\x1f\xf4\xe2\xf2\x31\x79\xcf\x16\xac\xee\xce\x44\x98\x47\xd0\x89\xea\x8e\x0e\x1b\x0f\xdc\x4c\xa3\x40\xbe\xc1\x9a\x0a\x6b\x07\xd5\x33\x4b\x3e\x5d\xe9\x16\xeb\x91\x58\x98\xe8\x9f\xf2\xe5\xf4\xbd\xd4\x57\xf8\x76\x77\xe6\x38\xe7\x7b\xfa\xa7\x85\xe1\xc6\x96\x6e\x1c\x73\x98\x39\x57\xb7\x8f\x9a\xac\x97\xc7\xc2\x2d\x8f\x07\x3a\xa8\xc0\x5b\x63\x22\x43\x80\x3c\x3b\x9a\x81\x3e\xf8\x2d\x37\xcb\xb2\x10\x5f\x33\x1b\x4a\x3d\xb2\x40\x58\x32\xea\x6a\x39\x0b\x76\x07\x95\xd9\x75\x5b\x29\xd8\xaa\x5e\x32\x59\x32\x42\x17\x94\x17\xf4\xa6\x00\x4f\x0b\xd3\xb9\xed\x2b\x42\x02\x3f\x83\x55\x81\x85\x51\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x3a\x13\x5e\x1b\x9c\x40\x21\xb3\xdb\x90\xdf\x80\xca\x56\xca\x95\xa8\x87\x9b\x4c\x97\x84\xe6\x39\x51\x7c\x26\x20\xdc\x59\x68\x52\x50\xcd\x44\xb6\x9c\x10\x9b\xca\x59\x05\x95\xa3\x75\xcd\xbd\x5f\xbf\x80\xba\xed\x6d\xb5\xcc\xec\x56\x4e\xa7\x2b\x95\xa6\xad\xe9\xd3\x22\x0a\x5c\x3d\x55\x52\xe0\xe0\x4c\x29\x3a\x8b\x42\x14\xab\xa5\x63\x70\xe7\x6d\xf2\x01\x87\x8e\x5c\x66\x01\xe7\xba\x54\xbb\xd0\xd8\x36\xf4\xd5\x43\x5b\xdd\x08\xcd\x4b\xb6\x92\x75\x93\x80\xfe\x76\xcd\x85\xc1\x0c\x65\xd3\x92\x42\x60\x8a\x0d\x74\x75\x25\x59\x78\x6e\xe7\xb7\x66\xeb\x5d\x45\xa8\xe0\xef\x17\xb3\xde\x00\x2f\x03\x2c\xba\x25\x42\x71\x67\x9b\xee\xa5\xe5\x52\x4e\x20\xce\xb6\x3d\xe8\xef\x7e\xfd\xfd\x64\x11\xda\x18\xe0\x73\x43\x3e\x4f\xcd\xcc\x4a\x56\xcf\x5c\xcd\x91\x92\x0a\x3e\x65\xca\x9c\xfa\xd2\x80\x88\xd5\xe3\x41\x51\xa2\x3b\x03\x1c\xe8\x4d\xb1\xb2\x90\x5e\xdc\xf6\x71\x45\x47\x18\x9c\x52\x2b\x96\x9d\xd4\xf2\xd4\xd6\xc4\x17\x63\xf6\x89\x65\x8d\x86\x7b\x02\x56\x74\x72\x22\xa4\x79\xd6\x6b\x13\xbc\x6e\x6e\x90\xe1\x82\x01\x56\xa6\xeb\x2a\x70\xe9\xe0\x6c\x7a\x77\x4b\x35\x37\x15\xee\x15\x9b\x1a\x9e\xe0\xd5\xe4\x77\xbf\x8b\x59\x30\x7a\x73\x42\xef\x8a\x65\x4d\xcd\xf5\xd2\xa0\x37\xf6\x49\x4f\xa6\x0a\xea\x59\x9c\x43\xaa\x06\x4b\xbc\xe6\x14\x14\x46\xe8\xfa\x89\x57\xa4\x05\x5e\x03\x50\x07\xf7\x53\xab\x3c\x65\xdd\x07\x2f\x67\x97\x3d\xb5\x08\xcc\x40\x60\x0b\xe6\x6a\x42\xae\xa4\xc2\xec\x0f\x3e\xbf\x4f\x94\xf3\xee\xb3\xa1\xe7\xa6\x7d\x76\x14\x9d\x80\xd4\xf2\xbc\x69\x7a\xff\x0a\x42\x5e\x1f\xe1\xc1\x8c\xf3\x1a\x92\x64\x6a\xa2\xe9\x6c\xa5\x84\x86\xac\x3b\x8b\x6e\x73\x31\xef\xd8\xce\x60\xd7\xb8\x8f\xdb\xf4\xc1\x09\xdf\xe4\x72\x15\x60\xba\xf1\x0e\x36\x3b\x4f\xcc\x36\x7e\xc1\xe6\x74\xc1\x36\x12\x81\x4a\xe6\x93\x0d\x78\x13\x80\x35\xa6\x6b\xc3\xb4\xfb\xb0\x02\x9f\x1e\x46\x29\x56\x42\x69\x88\x7b\xc8\xce\x26\x1a\x7a\xb3\x24\x85\x94\x90\x78\xa1\xa9\x88\x90\x39\x33\x60\x06\x6e\x0b\xb4\x50\x23\x72\x7d\x66\x5f\xac\x82\x21\x31\x79\x18\x70\x48\x15\xcb\x36\xbc\xb0\x07\xb9\x3b\xc8\x8b\x8d\x44\x33\xc6\xab\xac\x13\x15\x20\x6d\x38\x4b\x5b\x9a\xc5\x16\xac\x28\xd8\x82\x81\xe1\x6d\xca\x67\x04\x13\x72\x97\x36\x45\x9b\xf3\x22\x92\x35\xa4\x39\xae\x79\x1e\x23\x2c\xaf\xd2\x77\x73\x20\x77\xb2\xbe\x2d\x24\xcd\x83\x02\xec\x8a\x14\xfc\x96\x91\x37\xac\x2a\xe4\xd2\xe6\x55\x13\x39\xb9\xd6\x54\xb3\x69\x53\x5c\x47\x6d\x64\xac\xfc\xab\x32\xc5\x77\x2a\xff\x9a\x0e\x57\xe4\xdf\xcb\xeb\xf3\xeb\xcb\x67\xe9\xff\xfa\x38\x6d\xc4\x8b\x5f\xc2\x6a\x0f\xad\xe7\xe3\x3f\xf6\x19\x7c\xc7\xa4\x68\xfa\xdf\x41\x13\xfa\x95\xac\x35\x2d\x76\xc4\xdb\x64\x73\x5a\x9d\x35\x7a\xfe\x86\x2b\x28\x5b\x93\xca\xe2\xac\x7d\x1f\xa4\xdd\x61\xa0\x37\xb6\x1c\x26\xe1\x0e\xa6\xec\x7b\xe7\xff\x76\x76\x45\x68\x63\xe0\x40\xdb\x84\x52\x3b\xd3\xf0\x87\x2b\xbb\xc6\x34\x8c\x5b\xae\xcb\x7e\xdd\xb3\x2a\xf7\xd6\xbe\xd7\xf4\x54\x01\xc4\x83\x77\xf0\x01\xbd\x83\xfb\x51\x14\x49\x63\xb8\xb8\xe0\x9a\x53\x2d\xeb\x7d\xb9\x55\x76\x06\xf0\xde\x16\x8d\xd2\xb2\xb4\x17\xe4\xd2\xbd\x01\x61\x38\x91\x36\x83\xb5\x6e\x5b\x67\x0d\xb0\x64\xc2\x46\x5d\x0a\xcd\xea\x29\xcd\xd8\x4a\x0a\x8c\x11\x28\xa0\x70\x74\xee\xde\x89\x18\xf7\xcf\xd6\x4f\x09\xaa\x04\x17\x7f\x79\xfd\xe7\xc0\xd1\xf8\x2f\x9e\x45\xb3\x6a\xaf\x90\x1b\x13\x2c\x8b\x4b\x8a\x97\x72\x72\x3f\xa6\xe2\x2d\xfe\xa3\x58\x71\xb8\xc2\x2d\xf8\x7f\x0d\x2d\x70\xeb\xe2\x0e\x20\x65\x92\x9d\x63\xd8\x0b\x7c\x75\x0f\xda\xae\xcf\x9f\x2a\x86\x76\x01\x3e\x41\x91\x51\xd8\x45\xeb\x9a\x0a\x65\x0e\x32\x55\x58\x3a\xb6\xec\xe2\x31\x39\xd1\x59\x15\xe1\x7f\x9d\x14\x1b\xe9\xe3\x22\xed\x3f\x7a\x3e\x48\x4f\x20\x55\x34\x22\x64\xe8\x70\x33\x3e\x22\x38\x7c\xe5\x13\x48\xc5\xae\x6a\x2f\x2e\xde\x70\xbb\xf6\x92\xb0\xc7\x76\xed\xa1\x24\x5c\x3c\xb2\x4e\xe4\x2b\xae\x34\xa6\x9a\xc0\x97\x21\xd4\x18\x93\xf1\x18\xe6\xf7\xca\x48\x09\xbc\xfa\x2f\x9a\xe7\xf5\x6b\xa4\xf2\x4e\x07\x5e\xc7\x44\x92\x1b\x11\x45\xfb\x02\x7a\x4e\xf2\x38\xd1\xcb\xca\x56\x6b\xff\x78\x7e\x05\x7d\x29\xf2\xa7\x3f\xbc\x04\x6e\xf8\x77\xbf\xfd\xc3\xcb\x68\x30\xfb\x2c\xb3\xf6\x90\xff\x85\xde\xe6\x87\xc8\x06\xd1\xc9\xe8\x00\xd9\x7f\x0d\x0f\x7a\x8d\xc9\x0f\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xb7\xe3\x54\x87\x94\x04\x43\x4a\x82\xb6\x0d\x29\x09\x36\x4f\x2c\x90\xd4\xf7\xe2\x00\x12\xf4\x0f\x49\x67\xd7\xa9\x1c\x12\xb8\xab\xcf\x91\xc0\xf5\x1e\x68\x3f\xba\x48\xdb\xd2\x30\x0c\x2c\x2e\xef\x57\x9b\x26\xeb\xcd\xfb\xeb\xff\xfa\xea\xec\x8b\x8b\xaf\x60\x9d\x36\xae\xcc\x80\x35\x17\x7b\x52\x6a\xed\xe8\x12\xc5\xee\xf5\x6e\x1d\xd8\xc5\x8a\xeb\xba\x20\xef\xdf\x5e\x27\x7a\xad\xef\x55\x47\xf8\x4b\x31\x8d\xd9\xb7\xc3\x3a\x02\x9a\x97\x14\xab\x77\x97\x43\x6f\xaf\xfe\x82\x41\x3d\xd0\x8e\x16\xc7\x9c\x34\xae\xe2\x00\x6a\x94\xbe\x63\x24\x9f\x89\x4f\xb7\xd9\x34\xdc\xc8\x67\xe9\xcd\xbd\x9f\x23\x89\xe5\x99\xeb\xf4\x44\x90\x91\xe9\xd3\xea\x20\x5b\xa4\x41\x48\x48\x22\x6a\x43\x3c\x0d\xd9\x64\x4a\x39\x82\xf1\xb9\x42\x75\xb5\xa9\x90\xc2\x2e\x51\xfd\xc6\x01\x6c\x11\x05\x57\x05\x22\x70\x96\xef\x98\x67\xfb\x2c\x4b\x9b\xab\x40\x84\xf6\x52\x20\x80\x15\xcd\xfa\x49\xf9\xce\xea\xdd\xb4\x8f\xf0\x09\x24\xbf\x3f\x38\x31\x81\x51\x77\x98\x8e\xc4\xf7\xb7\x8f\x8b\xe6\x3b\x5f\xcd\xcc\x4a\x53\x8e\x98\x50\xe5\x3d\xe9\xd0\x0b\x2f\x29\x85\xeb\x13\xc3\x00\x79\x86\x94\xe8\xef\x7b\x53\xa0\xec\x5a\x79\x52\xcd\xa5\x96\x62\x7f\x89\xa2\x36\xf5\xdf\x45\x5c\x57\xf0\xc6\xb9\x77\x07\x08\x10\x1f\xe6\x8a\xf0\x26\xf3\x15\x2f\x71\x6b\x1e\x4f\x73\x10\x0f\x43\x32\xaf\x36\xcd\xed\xe1\xe8\xcc\x8d\xcb\x79\x4e\x81\x9a\x55\x7e\xf9\x66\x47\x98\x6b\xc8\xb7\x8c\xed\x99\x56\xc6\x30\x27\x9d\x78\x38\xe6\x13\xb7\xeb\x97\x6f\xac\xa0\xe1\xb2\xd1\x29\x7b\x1f\xc8\xfd\x57\x71\x67\xbc\x93\xac\xf5\x9d\xac\xf7\x90\x87\xbe\xdb\xf3\x4a\x38\xa1\xfd\x6d\x2d\x0b\xe5\xce\xf1\x4a\x77\x12\x49\x69\xe5\x56\x57\x60\x76\xb4\x67\xe8\x7b\x72\xca\x7d\xca\x27\xae\xaf\x49\x26\xcb\x4e\x5d\xbb\x39\x43\x3e\xe0\xfc\xfa\xf2\x1d\x9f\xe1\x54\xdc\xac\xc9\x94\x51\xdd\xd4\x6c\x3c\xa3\xba\x6f\x68\xae\x48\x9f\xcd\x76\x0f\x38\x0e\xcf\xef\x73\xc0\x73\xd7\x80\xe7\x02\x28\x7c\x08\xdf\x3d\x57\x74\xf7\xb4\x68\xee\x20\xfc\xda\xcf\x2a\x33\xba\xbb\x1e\x89\x3b\xe6\x3e\xb3\x4a\x58\x73\xd6\x2d\x69\xa0\x1e\xa9\xd9\xf7\x76\x46\x0a\x6a\xf9\x0f\xc0\x5b\x09\x54\xc0\x7f\x83\x56\x5a\x40\xa1\xb4\x28\xcc\xae\x4a\xd1\x16\x19\x51\xad\x9f\x2e\x3a\xb5\x96\xb4\xb2\x3e\xbb\xb9\xbc\x13\x77\xb4\xce\xc9\xd9\xd5\xe5\x6e\xb0\x57\x42\xde\x20\x84\xb5\xb8\x92\x7e\x5b\x64\x0e\x6a\xbb\x07\xca\xa0\xb1\x00\x23\x23\x37\x5c\xab\x4e\x49\xd5\x40\xe5\x65\xc8\x9e\x77\xca\x81\x40\x99\x1b\x7f\x29\x92\xd8\x30\x41\x64\xa6\xa9\xab\x01\x7a\xc3\xf4\x1d\x63\x82\xbc\x7c\xf9\x12\xed\x18\x2f\xff\xf8\xc7\x3f\x82\x53\x39\xc9\x59\xc6\xcb\xf5\x17\xe1\xad\x7f\x79\xf5\x2a\x66\xd0\x7f\x3f\x7b\xf7\x15\xa1\x19\xc8\x94\x58\xc6\x07\xc7\x86\x03\x0e\xbb\x57\x23\xf2\x7f\xaf\xbf\x7e\xef\x28\x8c\x5a\xf9\x15\xe0\xc7\x6f\x51\x94\x2c\x66\x83\xa4\x38\x84\xb1\xb5\xb6\x0a\xaa\xe7\x3e\x34\x88\x82\xa5\x33\x08\x20\xb3\x77\x3f\xca\xd1\x0f\x32\xfb\xf3\xd9\x1c\x36\x95\x0b\x80\xdf\x82\x67\x36\x67\x13\x5a\x8f\x5c\x01\x0c\xcc\x23\x80\xf1\x3e\x8e\xbc\x44\x8c\x61\x16\x3c\x42\xcf\x6b\x1b\x47\xd4\xd6\xc2\xae\x99\x32\xa2\xa6\x2d\x77\x8a\xc3\xb5\x30\xa4\x58\x74\xd1\x90\x7d\x38\xbf\xd8\xcb\xbd\x17\xbd\xa5\xc5\x1b\x96\x45\x2e\xb8\xd2\x41\xd5\x4b\x8b\x76\x40\x45\x4c\x2e\x68\x36\x27\x4c\x68\xc8\x47\x85\x07\x6c\x5e\x8f\x18\x64\x4e\x45\x6e\x6e\x18\x94\x47\x80\x01\x9f\xc8\x73\x65\x1b\x5f\x80\x2b\xbf\x07\x9d\x60\xc9\x16\x23\x53\x23\x01\x87\x60\xda\x32\x26\x41\x10\x5a\x64\xbd\xd6\x8b\x4f\x14\xd2\x74\x98\xad\x42\x75\xb1\xb2\x01\x71\x2a\x2c\xe6\x15\xd3\x59\x62\xc9\xf5\x34\xff\x0b\x42\x32\xcc\xbe\xf2\xb1\x6e\x94\xfe\xa2\x31\x07\x1c\x5b\x3a\x74\xdb\x62\xad\xe7\x6b\x23\xa2\xeb\x83\xb5\xf7\x81\x16\x38\xcb\x98\x42\x50\xfe\x01\xe3\x6c\x74\xfb\xf6\x0f\xb8\x91\xd1\xe3\xc9\xe9\xa6\x21\x5d\xe4\x2c\x17\x06\xf7\xd3\x46\xcb\x31\x54\xc9\x76\x19\x5b\x7a\x63\xa7\xdb\x76\x56\x54\x73\x3a\x22\x33\x1a\x30\xb1\xeb\x23\x06\x00\x68\xe5\x14\xf8\x22\x61\x9c\x07\x56\x61\x10\x9e\x35\xf4\x03\x64\xb5\x65\x8c\x05\x2d\x19\x44\x78\xe1\xc4\xa2\x07\x5b\x29\x4a\xa7\xf8\x4c\xb0\x1a\xb5\xb4\x10\x03\x4c\x0a\x7a\xc3\x0a\x3b\x94\xac\x13\x96\xf1\xa5\x8b\xa6\x63\xb5\xc1\x9e\x8a\xd0\xd9\xac\x66\x4a\xf1\x05\xb3\x41\xd4\xfc\x9f\x6d\x31\xbc\x39\x23\x57\x17\xef\x5c\x28\xb9\x22\x86\xb1\xd5\x2c\x26\x91\x1e\x36\x9f\xc6\xd1\x80\x56\x2b\x7b\x4c\x08\xb9\x50\x52\x43\x89\x37\xd3\xbf\x3d\x12\xe5\x4b\x3a\x83\x97\xe9\x18\x62\xc6\x53\xf6\xac\x8d\x02\xc2\x70\xf3\x39\xa3\xb9\x8b\xbb\x35\x2c\x65\x55\x19\x49\x9a\x9c\x9b\x2b\x3a\xb5\x65\xc6\x31\x32\x3b\x6f\x8c\xa8\x42\x7b\x55\x6f\x61\xfb\x38\x67\x44\xd6\x39\xc3\x22\xe6\x53\x70\xe6\xf1\xdd\x06\xf4\x1d\x52\x10\x71\x33\xd2\x0d\xd7\x35\xad\x97\x48\x31\xed\x49\x44\x0f\x67\x70\x26\x96\x57\x87\x5e\x61\x64\x08\xab\x22\x31\x39\xe5\x5c\x4b\x44\x68\x24\x41\xc2\x6e\x5b\x94\x6d\xdd\xb5\x54\x9c\x69\x1a\x80\xff\xb5\x85\xfe\xf8\xcf\x1e\x53\xe3\x9a\x10\x1c\x0f\x44\x86\x75\x64\xe0\xb3\x00\xe8\x6c\x6e\xe9\x7a\xf7\x8a\x12\x82\x92\x20\x8d\xf5\x48\xc3\x66\x23\xb2\xb9\x43\x02\xde\x2b\x9f\xe9\x89\x61\xa0\x75\x43\x8b\x62\x39\x66\x9f\x0c\x29\x31\x97\x18\x68\x28\xa4\xa9\x04\x77\xfe\x46\x28\xa6\x53\xea\xd6\x13\xbc\x7c\x55\x8d\xf9\x26\x14\x39\xc2\x35\x09\x09\x09\xa8\x8e\xb0\x5b\x23\x08\xdc\x34\x1a\x5d\xe0\x46\x9b\x3f\x49\x5b\xe7\x82\xd5\x4b\x3b\x42\xc2\x87\x5b\x80\x33\xd9\x12\xe6\x08\xdc\x41\x9d\xcd\x2f\x3e\x55\x35\x86\x1e\x25\x7e\xbd\x02\x7e\xab\x9d\x61\x96\x26\xc7\x3d\x76\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\x16\x3e\x01\x2c\x76\xf6\xfe\x4d\x0a\xfa\xc2\x96\xc2\x22\x76\x5b\x34\xc3\xd8\x6d\x8f\xb9\x81\xd8\xce\x1e\xd8\x1b\x9b\xe9\xca\xfd\x82\xc9\x89\x5d\x8d\x31\x27\xd5\x51\x72\xcb\x2c\x12\x36\x92\x27\x28\xbb\xec\xcb\x5b\x4c\xa7\x66\x10\xda\x8d\xb1\xea\x6c\x09\xdd\xe2\x48\xa9\x67\xb1\x35\x38\xbb\x89\xa4\xe2\xe9\xb6\x8d\xcd\xd4\xb7\xfa\xce\x6d\x5f\xf2\xc7\xdb\xde\x41\x6c\xb7\x2c\x42\xb5\xb7\xa9\x75\xe0\xcf\x9c\x97\x93\xda\x00\xa6\xcc\x03\x1f\x23\xe7\xc1\x88\x42\x6e\x63\x45\xb4\x4c\x3f\x52\xb2\x8d\xc7\x6c\xb7\xb9\x2d\xde\xc1\x82\xb7\xba\x70\xe1\x1c\xba\xb6\x91\x5b\xb6\x3c\x56\x78\x03\x0c\x06\x9b\xf3\x0a\x6b\x73\x19\xf2\x60\x24\xe0\x2d\xaf\x01\xb6\x6f\x21\x9b\x8d\x1b\x18\x71\xdc\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x7c\xe2\xca\x72\x7b\x6f\x24\x53\xef\xa5\x86\x27\x4f\x72\x42\xb8\xd0\xa7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x46\xc4\x9f\x25\x57\xe4\x12\x32\x7b\xe3\x96\x6e\x39\x34\xf8\xef\xba\x34\x29\x66\x60\x27\x63\x43\x2a\x1d\xeb\x49\xbf\x3e\xb2\x3d\x3f\x59\x77\x8e\x6f\xe7\x93\xb0\x13\x00\xdd\x18\xfe\x02\x19\xde\xaa\x82\x66\x2c\x77\xe9\xaa\xa8\xd9\x29\xaa\xd9\xac\xd7\xc7\xfc\xbe\x56\xb2\x7a\x06\xaa\xbc\x2c\x2a\x6d\xe2\x86\x05\x6c\x4d\x88\xb1\x6d\x49\x8e\xc3\xc1\xb7\x06\xff\x47\x46\x28\xed\xb1\x33\xe0\xb1\xbe\x32\xa8\xfd\x71\xbc\xda\x16\xf7\x32\x18\x1a\xb9\x92\x92\x56\xe6\x4e\xfe\xb7\x61\x3e\x00\x54\xff\x87\x54\x94\xd7\x6a\x42\xce\x5c\x1a\xad\xf0\x37\x2b\x3d\x06\xdd\x6c\x31\x85\x0a\x3c\x82\x7f\x6c\xf8\x82\x16\x36\x29\x07\x15\x84\x61\x9a\x31\x33\x9b\x55\x26\x74\x44\xee\xe6\x52\x21\x27\xe3\xc3\x6f\x8e\x6e\xd9\xf2\x68\x94\xa4\xc1\x70\x2d\xbc\xf1\x47\x97\xe2\xa8\xd5\x16\x77\x6e\xab\xe7\xd1\xc0\xab\xf6\x08\x7e\x3b\xda\x3d\x9f\xbb\x15\x67\xb5\x6d\x51\xe7\x4d\x13\x48\xbe\x62\x8f\x89\x87\x69\x5b\x7c\xa4\x17\xb6\x5d\x88\xc9\x0e\xa6\x37\x28\xce\x6e\x96\x2e\xa1\x9c\x15\x54\xd7\xe5\xd8\xa4\x21\x41\xe6\x0d\xe4\x63\x03\x62\x1d\x15\x41\xba\x48\x99\x78\x50\x2e\x3b\xce\xa1\x36\xd9\xd0\xd3\xba\x61\x23\x92\x4b\x71\xac\xad\xba\x2b\x4c\xba\xb8\x9a\xda\x2a\xdf\x70\x0e\x27\xea\x34\x69\x50\x5a\x33\xc8\xb5\xe5\x92\x48\x5a\x0d\x03\x26\x60\x04\x4d\xa7\x76\x1e\x22\xe6\xcf\x4d\x43\xc6\x07\xe4\xd9\x21\x6d\x58\x9e\x90\x80\xbb\x20\xad\x77\x38\x6c\x7b\xe8\xc1\xe0\x5d\xed\x69\xd2\x78\x0f\x01\x11\x60\xf1\x36\x4c\x10\xd5\x22\xff\x64\xb5\x4c\x1a\x61\x83\xea\x28\x1d\x3a\xe3\x2c\xfa\x6d\x8b\x0b\x3c\x69\x5b\x07\x34\x3f\x00\x7b\xbf\xb0\x86\x4a\xc8\xdb\x19\xe4\x25\xa9\x25\x1e\x0d\xf8\x3c\xc0\x0f\x37\xb0\xaa\xbd\x5f\xb9\xf6\xa8\x9e\xa9\x02\x30\xd0\xda\xa7\x51\xab\x1e\xad\xde\xc7\x39\x6b\x35\xf2\x72\x6a\x8b\xa4\xa3\xd1\xe1\xb1\xa0\xe8\x73\x6d\x34\x02\x13\x57\xa0\x55\x7c\x1b\xf5\xf8\x16\xc7\x8a\xfe\x16\xef\x68\xb5\x95\x15\xcc\x7f\xdd\xa9\x86\x4f\x6f\x64\xa3\x5d\xba\x10\xfb\x3b\xd4\x1c\xd6\xd2\xd9\x1f\xf7\xa7\x3a\xdf\x46\xc7\x91\xcc\xc8\x3f\x06\xa4\xd1\x13\xa6\xeb\x87\x35\x22\x8c\x66\x73\xc3\x01\x8e\xd1\xcd\xc2\x70\xa9\x8e\x1d\x7d\x63\xb6\x0e\x19\x43\xb9\x4a\x62\xd2\x80\xcf\x9f\x86\x03\xb9\xc0\x3f\xc7\x99\x8d\x9c\xcb\xa5\xb2\xae\x6b\x96\x39\x15\x6d\xe8\x42\xd2\x98\x4e\x3d\xe7\x52\x23\x5b\xd5\x0f\xac\x12\x64\xd4\x95\xca\x52\x46\xf6\x60\xb9\xf9\xcc\x5f\x8c\xa4\xf1\x36\xac\xa8\xcd\xa6\x63\xb0\xa9\xf5\x2b\x6a\xc4\xda\x48\x86\xe0\x25\x8f\x86\x59\x36\xcd\x42\xa8\x53\x6d\x05\xd9\x7b\x20\x57\x34\xf8\x9b\xb7\x29\x2e\xed\xa9\xfa\xc3\x48\x13\xbf\x83\x23\x52\xcc\xa7\x7a\x66\x75\x2d\x6b\xb3\x26\xa6\x14\xe1\xb0\xcb\x25\xad\x6f\x59\xee\xb9\xa4\x09\xb9\x32\x8b\x77\x32\x7a\xd2\x98\xb5\xa3\x46\x2e\x65\x74\x58\xa4\xcc\x4c\xe8\x78\x32\x39\xb6\x15\x14\xd6\x4b\x96\x25\x63\xaf\x54\x81\x7c\x0b\x31\xbc\x73\x7f\xdf\xd1\x4a\xa1\x3a\xc2\xb0\x37\xa0\x8e\x94\x50\x2b\x50\xcf\x9d\x4d\x91\x26\x84\xd8\xac\x2e\x67\x0b\x01\x68\x5b\xb5\xf2\x36\x2a\xe5\x24\xc3\x21\xb6\xed\xd5\xc8\x5b\xa9\x90\xef\x53\x1f\xdb\x93\xb2\x37\x7e\x5b\xcd\xff\x56\x1a\x98\x32\xca\x25\x70\xb5\x3d\x5e\xed\x08\xae\x5d\x5c\x91\xaf\x9d\xec\x13\xe7\x30\xa8\xe7\xb6\x12\xf6\x36\x7a\xb2\x27\xf1\x18\x5c\x6d\x4f\xe7\x41\xb8\xda\x2e\xa7\x98\x4f\x7c\x63\x41\xc4\xd0\xa5\xd3\xb3\x75\x91\xd9\x77\x57\xdb\x21\x5c\x0b\x57\xdb\x9e\x5d\x0d\x57\x5b\x9a\xeb\xe1\x6a\x4b\x71\x45\x5c\x6d\xa9\xd2\x19\xb6\xc7\x5f\xe0\xb0\x1a\x5c\xdd\x11\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x55\x80\xe4\xb6\xba\xb7\x96\x50\xe3\xd5\xa5\x37\x4a\x16\x8d\x8e\x2f\x39\x77\x5f\x77\x21\xdd\x87\x89\x3b\xcd\x66\x2a\xb1\x5f\xed\x38\xe0\x1b\x80\x6b\x43\x72\xbc\x5d\xaf\xbb\xd0\xfc\x6d\xaf\x05\x3f\xa4\xea\xef\x31\x09\x9f\xb0\x1d\x3a\xed\x13\xb6\x03\x27\x7f\x72\x83\x3e\x26\x05\x14\xb6\xa7\x4d\x04\x85\x6d\x4b\xf0\x4e\x49\x0a\xe5\xda\xa3\xb5\xac\x3e\x89\x39\x52\xcc\xa5\xcf\x2c\xdc\x11\x82\x20\x51\x93\x56\x28\x8d\x39\x3b\xa2\xad\xde\xb2\x67\x55\xdd\xe3\xd5\xfd\x2e\x46\xe5\xec\xea\x72\x2b\x2d\x4a\xf0\xfd\x3d\x7a\x94\xf0\x8d\x9f\xb1\x26\xe5\x12\x55\x23\xa1\x4f\xd6\x9b\x76\xe5\x36\xce\x32\x91\xb5\x79\x1a\x99\x72\x6d\xda\x6f\x0d\x5d\x0f\x73\x95\x06\xe7\xac\xa5\x0d\xe9\x69\x39\x00\x4b\x65\x5d\x99\x1e\xf4\xe5\x4d\x71\x02\x27\x4f\x23\x7f\x1e\x50\x96\x84\xfd\x88\xca\x23\xb9\xda\x3a\x27\x75\xdc\x56\xd2\x40\x65\x33\x2a\xbe\x02\x6d\x5b\x25\xf3\xd7\x68\x24\xa5\x42\x48\xac\x14\xa5\x46\x68\xa8\x50\x23\x6b\x86\x09\x52\x74\x88\x9c\x34\x3c\x47\x0f\x68\x9f\x5d\xe0\xf8\x73\x72\x4c\x83\xe5\x5f\xa5\x1e\x25\x79\xb4\x87\x19\xad\xf8\xb7\xac\x8e\xcb\x62\xbf\xa9\x75\x0e\xd6\xf6\xe4\x4e\x51\x65\x73\x56\x52\xf8\xe7\x5b\xb7\x3c\x83\x6a\xac\x7f\x3d\xa8\xe5\x58\x5d\x1a\xd6\x63\xd4\x89\x32\x3d\x5a\xbc\x4a\xf2\x8f\x6d\xdb\x23\x5d\x3c\xfc\x29\xec\x60\x33\xae\x3a\x22\x86\x01\x6e\xd0\x14\x80\x71\xc5\x65\x9a\xf1\x6a\x4b\x43\x65\x16\xb8\x7b\x4f\xb0\xf0\xdd\x98\xdf\xb1\x3d\x95\x9e\x66\x5b\xfd\xcc\xc8\xf3\x3e\x5d\x6d\xcb\x16\x53\x18\xf4\x33\x83\x7e\xe6\x7f\xb5\x7e\x26\x20\xec\x0e\xd7\x6f\x50\xbb\x84\x19\x51\x9d\xee\xa5\xad\x7b\x30\x41\xed\xa7\x53\xa3\x38\x1d\x4a\x5b\x62\x10\xcd\x1f\xc7\x93\xc9\x31\x1a\x40\x26\x5e\x5d\xda\xe8\xe9\xf8\x4f\x84\x89\x4c\xe6\xa6\x1f\x2c\x10\x58\x2b\x0d\xac\x65\x2b\xb1\x87\x73\x29\xdd\x58\xa1\x09\x05\xfa\xde\x96\x7b\xd8\x0a\x05\xbb\xa8\xfc\xb7\xbb\x61\xb0\xb6\x42\xa0\x2d\x2b\xe6\xeb\x32\xd9\x2d\xf3\xa5\xaa\x2c\x4f\xd6\xe6\x10\x28\x78\xc9\xad\x77\xb2\xc1\x2e\x4c\xe9\x74\xf7\x3d\x42\x4e\xb0\x9b\x49\x56\x35\x23\xdb\xe5\xa4\x64\xa5\xac\x97\x23\xdf\xad\xf9\xb1\x33\x8e\x7d\xe3\x14\x98\xbe\xac\xa9\x6b\x26\x74\xb1\x8c\x4d\x2e\xb5\xa9\x3d\x21\xf7\xe7\x76\xf4\xc0\xcc\x9f\x3f\xd8\x54\xff\x92\xb6\x75\xef\x7f\x5b\x87\x10\x14\x72\x7e\x57\x80\xc6\xd8\x34\x76\xa3\x56\x3f\x61\x9e\x32\xb1\x20\x0b\x5a\xab\xf4\xfb\x46\x1e\xcf\xef\xe5\x7c\xc1\xd5\x4e\x42\x0e\xae\x2d\xf1\x43\x3d\xb3\x6c\x74\xd5\x68\x8b\x8e\xdd\x35\x72\x15\xc9\xfc\xf5\x59\x61\x7a\x5f\xc5\xab\x88\xc2\x56\x51\xad\x59\x2d\x5e\x93\xff\x3c\xf9\x8f\xdf\xfc\x34\x3e\xfd\xeb\xc9\xc9\x77\x2f\xc7\xff\xfa\xfd\x6f\x4e\xfe\x63\x02\xff\xf8\xf5\xe9\x5f\x4f\x7f\x72\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xbb\x2f\xdf\xfd\xed\xe3\xd5\xc5\xf7\xfc\xf4\xa7\xef\x44\x53\xde\xe2\x5f\x3f\x9d\x7c\xc7\x2e\xbe\x8f\xec\xe4\xf4\xf4\xaf\xbf\xda\x6a\xba\x54\x2c\xbf\xde\x02\xbf\x61\x1b\x3f\x92\x3e\x76\x7b\xd9\x95\x27\x38\x17\x7a\x2c\xeb\x31\x76\xf7\x1a\x5c\x16\xb7\xe8\xd4\x81\xc5\x2e\xee\x61\x4b\x87\xdb\x1a\x7b\x4e\xf8\x78\x82\x8b\xb6\x2b\xf9\x62\x07\xc6\x82\x4a\xe6\x41\x60\xf4\xbe\xf3\x10\xd8\x80\x7c\xe5\xe3\xff\x6b\x50\x66\x88\x59\x50\x40\xd3\x7a\x12\x92\x93\xaa\xe6\x0b\xaa\xdb\xf0\xba\x20\xd2\x3a\x7a\xc0\x6c\x4e\xb9\x38\x6d\x83\xbb\x2a\x99\x03\x7b\xda\x28\xe6\xb3\xf4\x1b\x12\xff\xf1\xab\x6b\x92\x15\x1c\xdc\xe3\x6b\x9f\x62\x38\x7a\x18\x17\x5f\x3f\x63\x82\xd5\x18\x60\x4e\x56\xa7\x0f\xf5\x92\xb8\x46\xc0\x13\x79\x6f\xda\xdd\x60\xd7\x3a\x67\xf4\x01\x09\xbe\x4b\xdd\x86\x3e\xb7\xe8\x75\x08\xe1\xc6\x36\x8d\xa8\xf5\x43\xa4\x55\x55\xcb\x05\x4b\xf3\x9a\xb2\x3c\x05\x96\x30\x51\x0a\x1c\xf6\xc3\xed\xc7\x6d\x1d\xf9\x65\x83\x17\x68\x27\x16\x32\xfe\x80\x56\x7b\x25\xf7\xe5\x0e\xf8\x68\x1f\xe6\x92\xa9\x80\x45\x6d\x84\xe6\x0f\x57\x68\xbc\x67\x38\x45\xe6\x74\x61\x64\x4f\x26\x70\x91\x48\x95\xc1\x0b\xae\x7b\x2b\x02\x8f\xae\xc8\x7c\x56\xae\x59\x5c\xc3\x05\x58\x16\x20\xab\x46\x3a\x50\x59\x29\x71\x66\xf6\xa6\x5e\x82\x3e\x56\x12\xb8\x38\x78\xd2\xe1\x16\x5a\x30\xc7\xc2\xf2\x22\x47\xef\xcd\xe8\x11\x6d\x22\x0d\x0b\x3a\x2e\xbb\x2f\xdb\x0c\x80\x93\x6b\x4d\x75\xa3\x26\x5f\x98\x99\x7d\x60\xd3\x9a\xa9\xf9\x59\x3c\xa3\x68\xa6\xa8\x34\x2d\xab\x2d\x76\xc4\xdc\x60\xf4\x3c\xf6\xf1\x06\xa8\xba\xf0\x4b\xf6\xe5\xef\x3d\x5a\xb1\x19\x41\x52\x34\x8a\xa0\xa5\x1a\x21\x42\xa8\xa8\xb9\xd7\x08\x91\x1b\xc6\xb9\x65\x4b\x90\xf0\xb6\x04\xfd\x73\x03\xf9\xd0\x01\x26\xac\x49\xd8\x93\x8f\x9d\x55\x3a\xe4\x89\x01\xd1\xed\xd6\x18\x10\x84\x9c\x1b\xc0\x81\x4d\x48\x20\x0c\x5e\x5d\xbc\x8b\x1e\xcc\xe6\x30\xb2\x19\xa0\x03\x04\x77\x62\xfa\xff\xf2\xfc\xfa\x97\x7f\xb2\x43\x9c\x86\x5a\x81\xd2\xda\x11\x52\x87\xe2\x36\x53\xc7\x2a\x94\x23\xa2\xb0\x97\xb6\x0b\xb4\x6d\x65\x94\x78\xa7\x46\xfc\xd4\xba\x60\xd6\x4c\x37\x35\x08\xd5\xbc\xde\x34\xa8\x20\x05\xa3\xd3\x31\xd0\x2e\xa9\x31\x21\xc7\x69\xc2\x79\x5d\x81\x89\x3c\xb8\x5c\xeb\x87\x87\x3b\x38\x32\xe7\x97\x31\xb2\x94\x8d\x8d\x45\xc6\xda\x51\xc4\x88\xf3\xf1\x40\x46\x05\x64\x2e\x34\x94\x07\xd9\x02\xb3\x37\x18\x4c\xb1\x94\x0d\x10\xc2\x00\x78\x37\x02\x65\xfc\x4e\xae\xcd\x15\xf4\x09\x25\xbd\x65\x44\xdf\xc9\xee\x35\x82\x69\xf9\xf0\x54\x65\xc4\x6a\x2e\xb2\xb8\x62\xd1\xd8\xd0\x28\xdf\x39\xa4\xda\x1a\x47\x46\xd6\x05\xb5\x72\x15\xfd\x5b\x0e\x60\x85\x2c\x9b\xd3\xdc\x8a\x5a\x99\xdd\x83\x9d\x6d\xdd\x51\xeb\x9a\xa9\x4a\x0a\xd0\xb1\x02\x1d\x01\x15\xd8\x84\x90\x7f\x5f\xd9\x97\x84\x25\x16\x05\x11\x0c\xd5\xb6\xd9\x9c\x65\xb7\x36\x07\x2c\x57\x46\x5a\xc5\x10\xb5\x91\x55\x04\x8c\x61\x3a\x40\x10\xcd\x52\x97\x49\xce\x09\x99\x14\x36\x7b\x6f\x22\xf2\x09\x19\x10\x57\xa8\x5b\x91\x6c\x2e\xa5\xb2\x3c\x41\x57\xec\x0b\xf7\x90\xc7\xd3\x0b\xe4\x43\xfe\x0f\xcc\xb3\x29\x74\x78\xe7\x79\x59\xa1\x03\x10\xec\xed\xb1\x22\xb9\xcc\x1a\xff\xb7\xd9\xb9\x82\xd1\x5a\x90\xb9\xbc\x23\x3a\x3e\x6e\xc7\x5c\x8d\x95\x09\x5b\xcf\x66\x95\x10\xdf\x7e\xa0\xd4\x3b\xb7\x6c\xf9\xb1\x3f\xfb\x6f\xf8\x45\x1b\x49\xb3\x47\x63\xfc\x26\x74\x72\x28\xbf\xa4\xbf\xfb\xd8\xa4\x75\x34\x0e\xc8\xc0\xe0\x07\x50\xcb\x5a\x57\xb2\x15\x2e\x2f\xe1\x1e\x10\xf0\xca\x31\x1c\x73\x7b\xc7\x15\x51\x73\xd9\x14\xc0\xf8\x6f\xe4\x43\x26\x84\xfc\x7d\xce\x84\x25\x05\x16\x09\xa7\x39\x13\xdd\x87\xb0\xd7\x11\xb1\xc1\x21\xaa\x45\x22\x1e\x1d\xa6\x7a\x6b\x3b\x94\xd9\xe5\x3a\x6b\x16\xe0\x8f\x11\xb9\x61\x19\x35\xab\x5e\xc5\xc1\x12\x11\x66\x6a\x00\x07\x26\x19\x2d\x79\x3e\x76\xe8\x7d\xef\x61\x66\x9b\xce\xeb\x09\xe0\x76\x8d\x35\xd8\x03\xdc\x46\x32\x90\xdd\xa4\x3a\x65\x53\x68\x5e\x15\x98\x28\x0e\xe2\x50\x13\x2d\x65\x1d\xfe\xd3\x46\xb2\xc2\x98\x57\x1f\x2e\xbf\x3d\xfb\x78\x41\xbe\xbc\xf8\x77\x7c\x3c\x0a\x3d\x51\xa8\xe3\x32\x2d\x19\x4f\x1a\xf3\x96\x2d\xb7\xd8\x9b\x96\x7d\xc5\x75\x02\xb4\x9f\x5f\x7c\xf8\x78\xf9\xf6\xf2\xdc\xcc\x14\x1f\x8f\x56\x1d\x66\x90\x3d\x4d\x1a\x6e\x1d\x4f\xf9\xb8\x4b\xc7\xde\xc2\xdd\xc3\x1c\x46\x4b\x4c\xc0\x55\xb2\x9c\x1b\xd2\x94\xc2\x84\x9a\xf6\x8d\xea\xea\x5d\x5a\x40\x27\x90\xd0\x1e\x50\xc8\x15\x14\x83\x5b\xe5\x3e\x91\xa3\x73\xf0\x91\x86\x3f\x80\x07\x75\x78\x80\x6a\xc3\x6f\xd7\x9c\x2d\x50\xc5\xe0\x71\xc8\x26\xa5\x0f\x6e\x89\x67\x5d\x53\x7d\x7c\xfe\x61\x0d\x9f\x25\x6a\x60\xba\x02\xdd\x46\x26\xbb\xc3\x7d\xa5\xad\xd2\x27\x0f\x28\x96\xab\x18\x77\x0d\x7b\xde\x51\xe5\x64\x19\xab\xfb\x00\x40\x8d\x1f\x6d\x2b\x0c\x67\xe9\xcd\xe1\x91\x1a\x9c\xec\x40\x7e\x07\xf2\xfb\x40\xb3\xdc\xec\xa1\x80\xd3\xa0\x79\x70\xf3\x96\x53\x33\x34\x44\xbe\x76\xb4\x6f\x4e\xaf\xeb\x0b\x70\x40\xa5\xd1\xa4\x31\x30\xaf\x95\x4f\x7f\xc2\xc8\xd1\x87\xeb\xb3\xdf\xbd\xfc\xe3\x6f\x8f\x46\xf0\xcf\xdf\xbf\xfc\xd7\x3f\x98\x7f\x5e\x9c\xbf\xb9\x3e\xbb\xfa\xed\xbf\x04\x7f\xfc\xee\x4f\xbf\x3f\x4a\x0b\xd1\xb4\x1f\xfe\xcb\x6f\x5f\xd9\xd4\x2b\x47\x17\x6f\x7e\xfb\x2f\xff\xf2\xea\x5f\xb7\x48\xb3\x98\x78\x74\x25\xfd\x74\xf1\xa9\xe2\x58\x26\xe4\x9a\x19\x21\xf5\x60\x71\xcd\x9b\xc6\x76\xda\xaa\x92\x7e\xe2\x65\x53\xfa\xc2\xa6\xe8\x00\xa5\xb5\x55\xfb\xa6\x5e\x8a\xe0\xfe\x25\x02\x82\x57\x62\xca\x0a\xcd\xa3\xdc\xe6\x28\x24\x0b\x56\xdf\x50\x0d\x85\xd7\x2c\x21\xd8\xa8\x78\x55\x29\x62\xb3\x69\xad\x55\xc2\xeb\x0e\xda\xf4\xe4\x89\xb3\xbf\x9c\x12\x89\xdb\x36\x82\xda\x37\x63\x5a\x71\x5b\xc1\x11\x6e\x8a\x62\xda\x1a\x39\xfe\xf4\x87\xdf\xbf\x7c\x79\xf2\xdb\xdf\x93\xb9\x6c\x6a\x75\x3a\x59\x79\x3d\x69\x54\xab\x99\x03\x12\x6e\xaf\x90\x9a\xcb\x5a\xbb\xba\xc8\xbf\xfb\xc3\xcb\x97\xe4\xe4\x15\x0c\x75\x6a\xb5\x9b\xee\xc0\x21\xcc\x83\xde\x24\xf2\x29\x78\x22\x5c\x91\x3f\xfe\xe9\x0f\xbf\xfd\xbd\xe9\xfd\x5f\x5f\x91\x9c\x2e\x93\xd9\xac\x8f\xf7\xe9\x29\x2c\x60\x1a\x1e\x8f\x01\x72\x06\x1e\x60\x45\x9f\x65\xe3\x4e\xd2\x88\x84\x07\xf1\x5f\xdb\x4d\xfa\x35\xee\xd2\xbb\x0d\xd7\x03\x03\x6b\x84\x5c\xdf\xcf\xa4\x21\x95\xbd\x6c\x9d\x33\x40\x1d\x95\xd2\x35\xe5\x18\x76\xcf\x04\x14\x42\x01\x9d\x6d\x17\x1a\xd2\x84\x87\x1f\x3a\xe1\x2e\x3f\x74\x15\xb8\x82\x61\x39\x51\xb3\x99\x6b\xc9\x99\xc1\xad\x3f\xaa\xb2\xf1\xca\x96\x62\xa9\x36\xd8\x1c\x07\xd2\xe9\xa8\x34\xdd\x4c\xbf\x9d\x03\xdb\x0e\x92\xa4\x58\x2c\x75\xac\x3c\xf6\xc8\xc9\xf9\xf5\x87\x36\x55\x88\xad\xcc\xea\x98\x56\x9f\xf9\x64\xaf\x04\x06\x6b\xb4\x6c\x65\xa5\xc6\x4f\xef\x09\x6e\xb1\x3f\xfe\x8c\xe3\x5a\x3e\x9b\x0c\x21\xd7\x78\x14\x43\x7a\x90\x27\x4f\x0f\x82\x27\x31\xe4\x06\x69\x17\x37\xe4\x06\x81\x36\xe4\x06\x09\xdb\x90\x1b\xa4\x33\xee\x90\x1b\x64\x88\x3d\x19\x62\x4f\x9e\x3e\xf6\x64\xc8\x0d\x32\xe4\x06\xd9\xdc\x86\xdc\x20\xfd\x6d\xc8\x0d\xf2\xbf\x2d\x37\x08\x82\xd8\xa6\x0c\x21\x56\x22\x6d\xd3\x83\x7c\x76\xd9\x41\x94\x39\xe4\x8c\x9d\x65\x99\x6c\x84\xfe\x28\x6f\x59\x74\x74\xfb\x8a\x0e\x65\xad\x1f\x73\x29\xef\xd3\xa9\xac\xbf\x7c\x30\x05\xcb\x33\xac\x5e\x46\x9b\x9c\x33\x91\x16\xcf\xf2\x18\xd4\xeb\xc6\x73\xf4\xdc\xf0\x31\x22\x67\x79\xfb\x83\xc5\xcb\xda\x1c\xcd\x84\x9c\x91\x9a\x65\xbc\xe2\xb6\x44\x00\xc5\xe7\x69\xf6\x17\x73\x2f\x6c\x21\xe8\xa5\xb9\x2d\xac\x98\x7a\xf4\xe8\x0b\x44\xd7\x81\xfe\xc1\x52\xea\x95\x29\xa5\x89\xb1\x66\x9a\xc8\x07\x02\xd7\x77\xc7\x15\x73\xb6\x5f\x6b\x32\x08\x56\xf9\x31\x1c\x2d\x0c\x37\x4b\x1d\x36\x58\x8e\xdd\xc7\xad\x94\xd9\x5b\xe1\x4a\xf6\x54\x06\xb6\xb5\x81\x5b\x66\x11\x4c\x53\x58\x5b\xc5\x57\x92\x5c\xd0\x82\xe7\x86\xfa\xba\x04\x18\x88\x12\xd2\xc0\x18\xf1\x87\x87\x52\xd5\x9e\x26\x06\xb7\xd0\x6c\xce\x54\x30\x33\x94\x78\x6e\xad\x95\x2d\x31\x60\xc3\xb4\xaa\x68\x66\x5c\xa0\x80\x04\xfd\x3b\x7e\xa3\x0d\xb9\xb0\x0b\x59\x9d\xdc\xc7\x60\x60\xf3\x79\x9a\x09\x05\x18\xcc\x8d\x11\x1e\xb8\x5a\x3e\x0d\xff\x50\x44\x16\xb9\x33\x49\xfc\xe9\xa5\x91\xa9\x33\xbc\xba\x89\x8a\x5e\x85\xd1\x22\x5a\x92\xc2\x70\xfb\x86\xcc\xdd\x3f\x90\xb7\x7d\xbc\x09\xae\x0e\xda\x7c\x92\xfd\x18\x7c\x9e\x09\x4d\x0a\x46\x95\x26\xaf\x5e\x92\x92\x8b\x46\x6f\x93\x1b\xff\x51\xa6\x95\x3f\xfc\x3e\xfa\xbb\x47\xe5\xd4\x4f\xbc\x6d\xa1\x34\x06\xff\xf6\x22\x99\xd5\x1b\x97\x00\x7c\x95\xe4\x42\xaf\x0a\x68\x81\xc3\x53\x3a\x36\x05\xcd\xf4\xde\xb0\xd8\xd6\x62\xcc\x8f\x8d\xbc\x59\xf6\x05\x29\xa6\x6d\xb8\xed\xb2\x5b\xdf\xec\xff\xd9\x87\xb8\xbd\x12\x49\xd4\xdc\xb0\xe6\xa0\xc7\x50\x73\x5a\x33\x5b\x39\xf9\x58\x79\x7b\x62\xdf\x7e\xbd\x31\x43\x40\xd0\xd0\x6b\x3f\x02\x57\x24\xf7\x8f\xbd\x2a\x83\x8b\xb1\xae\x19\xf3\x93\x03\x29\x03\x74\xf4\xce\x0e\x19\x19\xd5\x1f\xcd\x38\xc5\xb2\x4b\x63\x52\xb3\x19\x57\xba\xee\x53\xe3\x8e\x63\x10\x6f\x3c\x17\x35\xab\x65\x13\x51\x1e\x20\xfd\xb2\x41\xc7\x4e\xa1\xe1\x0c\x4b\xb6\x12\x76\x8c\xcb\x9f\x45\x83\xf6\x74\xa0\xb7\xde\xaf\x12\x2e\x4b\xcd\x68\xfe\xb5\x28\x22\xb4\xd2\xe9\x4b\x77\x7d\xa3\xac\x0a\xd4\x0e\xac\xf3\x00\x82\x0e\x40\x5d\x19\x76\x10\x83\xe1\x3e\xb0\x1c\x39\x3a\xf3\xf9\x18\xd2\x5f\x04\xda\xdc\x18\x9c\x11\x52\x8e\x29\x2d\x54\x74\x45\xfb\x38\xa9\xc9\x01\xe8\x7e\xb6\x0c\xfb\xee\xa2\x0b\xeb\x25\x2d\xeb\xd6\x2b\xda\x6d\xdf\x07\xf7\x81\x65\x18\x62\xa4\xe8\x96\x39\xa6\x81\xdd\x87\x2a\xc0\x40\xaf\xcd\xb5\x47\xc3\xeb\x89\x1f\x2d\x0c\x95\x73\x8e\xad\xf6\x94\x32\x59\x96\x34\xaa\xe0\x0f\x5a\x02\x29\x04\x67\x2b\x1b\x35\x21\x74\x4d\x8b\x76\xd5\x41\xd2\x8a\x5d\x02\xb9\x66\x82\x8a\x08\xa3\x7e\xfa\x79\x61\xcf\x44\xde\x79\xa7\xec\x19\x5f\x30\xb1\x0a\xdd\x56\x08\xf9\x82\x66\xb7\x2c\x2a\x7e\xf3\x1b\xe5\xf6\x37\x5f\x0a\x6a\x63\xea\x0c\x3a\x5b\x70\x73\x0d\x58\xbe\x32\x82\x1a\xb5\xfe\x44\x50\x43\x19\x43\x16\x91\xd1\xdc\xe5\x56\x36\x8a\x45\x24\xef\x48\xdf\x48\xd3\xef\xe3\xb1\xa4\x42\xfb\x4f\xcd\x17\x19\x73\x9c\xb3\xe9\x79\x97\x3b\x80\xb3\x4b\xdc\x03\x07\x07\xc1\x7d\xb3\xbe\xe9\xd6\x85\x01\x13\x16\x14\x06\xe7\x2d\x5d\x62\xa6\x55\x28\xb2\x85\xff\x63\xb1\x59\xef\x6a\xea\x9b\x1e\x72\x9c\x76\x8c\xf5\x4d\xde\x45\x5b\x1f\x68\x2e\x15\xf9\x02\x22\x2f\xde\x30\x10\x67\xf6\xc7\xf0\x7c\xf8\xe2\x4d\x0f\xb3\x63\xe6\xf7\x9c\x18\x1d\x5e\xd2\x59\x1f\xeb\x3c\x26\xa5\x14\x5c\xcb\xfa\x61\x7c\x18\xcf\xe7\x4c\x55\x9c\xdb\x73\xfa\x0d\xc6\x9e\x9d\x34\xd1\x26\x56\xf0\x7e\xcf\x81\x99\x10\x0e\x7d\x29\x1b\x72\x47\xb1\x78\x24\xc0\x45\x0c\x6d\xff\xc8\xab\xd7\xe4\x42\xa8\xa6\x0e\x22\x6e\x57\x07\x33\x48\xd0\x1d\xab\x43\x85\x00\x6c\x58\x35\x12\x0a\xbc\x61\xd2\x87\x88\x11\x2f\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\x55\xc1\x33\xae\x8b\x25\xe1\x62\xca\xea\xda\x6b\xf5\xf1\x83\x15\x27\xa7\x98\x31\x13\x75\xec\x4a\xcb\x9a\xce\xd8\x0b\x4b\x0b\x7e\x59\xdf\xf4\xd3\x98\x04\x8c\x07\x80\xba\x0f\x90\x81\x8e\xbd\x82\x07\xb0\x05\x3e\x8a\xad\x6d\xb6\x61\x9f\x98\x3d\xae\xc9\xed\x9f\x60\xa7\xec\x9e\xbc\xa8\x6f\xf2\x17\x1f\x2e\xce\xde\xbc\xbb\x98\x94\xf9\x2f\xe7\xf2\x6e\xac\xe5\xb8\x51\x6c\x1c\xe1\xea\x9c\xb0\x57\xb7\x6c\x09\x39\x89\xf6\xb0\x5b\xb6\xeb\x8e\xbc\xae\x25\x98\x0b\xe0\xb9\x61\x9e\x3e\x7c\xf1\xe6\x1b\x15\xa7\x1f\x0c\x04\x8b\x17\x4c\x67\x2f\x32\x56\xcd\x5f\xd8\x31\x3e\xcf\xbd\x0f\x0c\x3c\x6b\x2b\xea\xf9\xd4\x61\xd9\x7d\x9c\x9b\xeb\x1b\xa9\x7f\x26\x8b\x02\xfd\xe2\x0d\x4e\x3c\x67\xd5\xdc\xbf\xf0\xec\x76\x3d\xce\x11\x2d\xda\xfd\xec\x30\x3a\x1c\x02\x39\xa7\x64\x84\xc1\x2e\xfd\x28\x4d\xbf\x5d\x7c\x05\x4f\x62\xd1\x55\x70\xe5\xea\x9b\x6d\x09\xc1\xf3\xb9\x64\xfd\x64\xe6\xc9\xb4\x0b\x1f\xdc\x8f\x8a\x69\xa0\xf7\x5c\x10\xcc\x51\xff\xce\x70\x1a\xfb\x52\x23\x1c\xf8\xc0\xe2\xf4\x15\xe8\x7a\x1e\x95\xe3\x34\xfd\x14\x7c\xe7\xc0\x55\x07\xbe\x18\xb4\xd1\x73\x26\xb4\x0b\x4f\xb4\xfe\xef\x21\x8d\x22\x97\x53\x94\x68\xf3\x28\x03\xb7\x5c\xb0\xba\xe6\x39\x53\x24\x81\x48\x85\xda\x33\x5e\x3c\xbb\x03\x8c\xb4\x38\xa7\x19\x83\xe3\xbd\x6f\xb6\x33\x1d\x3c\xc6\xe3\xe6\xd0\xbe\x36\x07\xf6\xb2\x79\x9c\x7f\xcd\xd3\x7a\xd6\x24\xdb\x89\x53\xbc\x69\x1e\xe3\x61\xb2\x57\x95\x53\x87\x98\xc3\x93\x2d\x88\x39\xcd\x4b\x1e\x15\xb2\xfc\xac\xc9\x39\xac\xe2\x81\xd7\x55\x46\x0b\x76\xf9\xf5\x2e\x55\x46\xb6\xcb\xae\xda\xe8\xda\x3e\xac\x58\xed\x72\x35\x38\x8d\xa0\xd6\x34\x9b\x5b\xd5\x8e\xb3\x15\x48\x01\xa1\x64\x08\x5b\x44\xc8\xbc\xdf\xb8\x1b\xea\x8d\xdc\x68\x0f\xeb\x8e\xdc\x44\x9f\x93\xfe\x68\x46\x35\xbb\xeb\xe5\xcf\xc7\x2d\x89\xee\x7f\x13\x94\x22\x9f\xb9\xa6\x29\x45\x9b\xe4\x5d\xfb\xd7\x7a\xd9\xa5\xfe\x68\x72\x8f\xe6\x28\x0d\xc9\xc0\xb7\x3b\xd3\xfd\x62\xf3\x77\xff\xd3\xb4\x8f\x48\x58\x68\x4b\x3c\x4f\xfb\x95\x3b\x2b\xd8\x44\x1b\xd7\xe9\x58\x08\x77\x01\xcf\xae\x2e\xc9\xdf\xf0\xf5\x9d\xae\xb2\xaa\xa5\x46\x81\xfb\x8d\x2c\x29\x8f\xf0\x4b\xec\xac\x60\xf5\x73\xb7\x94\x90\xd7\x75\x4b\xb8\xf2\xef\x12\xfb\xb2\xcb\xe6\x80\x35\xe2\x9b\x9a\xe5\xc4\x2a\xeb\x76\xba\xc6\x83\xc8\x59\x6b\xf2\x10\x39\x31\xbf\xbd\x80\x3c\xa9\xa7\x93\x56\xe6\x5a\x11\xc8\x62\x34\x03\x3b\x11\xd9\x9e\xa1\x50\x14\xd8\x77\x5c\x24\x66\x2b\x08\x39\xb0\x01\xb6\xc3\x7b\x17\x46\xf5\x2f\x14\x07\x37\x9d\xc0\x31\xd6\xe6\xb9\xe4\xaa\x0d\xb6\x44\xd9\x6a\x44\xbe\x92\x33\x2e\x1c\xf2\x92\xd6\xf1\x6c\x4a\x63\x04\xa2\x41\x4e\x19\xe4\x94\xd5\x36\xc8\x29\x1b\x9b\x52\xc5\x85\xa0\x37\x45\x8c\x4f\x78\xd7\xe9\xdd\x7f\x48\xde\x16\x74\x46\x18\xfc\xf1\x22\xe7\xca\xfc\x9f\x5c\x5f\x7f\x05\x5e\x16\x8d\x70\xca\x14\x80\x00\x4b\x2b\x7d\x49\x0b\xc4\xc9\xbb\x45\x92\x48\xaa\xde\x45\x05\x7b\x6e\x81\x26\xdb\xee\x7d\xbe\x6b\xd5\x09\x8c\xb0\x6f\x00\xb6\xa4\x3e\xec\x1b\x3d\xaf\x6f\x98\xb9\xa5\xd9\xed\x55\xe0\x14\x21\x6b\xf3\x4c\x04\x8f\x12\x99\xac\xe4\xaf\xb7\x63\xb7\x56\x86\x89\x3b\x86\xab\x74\xa5\x76\xf0\xa5\xe3\x5b\x1c\xd1\xb9\xb6\x5b\x0b\xbf\x51\xa5\x64\xc6\x5b\xa7\x1e\x9b\x2d\xcd\x31\x33\x39\x30\x33\x3b\xdd\x0c\xe4\x9f\x53\x97\x83\x0c\xfa\x06\x0e\xcc\x01\x8a\x7d\x83\xaa\x90\xe3\xe2\xc2\xad\x7a\xa7\x4b\x40\x70\x8c\xcb\x81\x92\x7e\x39\xda\xde\x57\xd7\xeb\x2f\xc2\xaa\xbb\x88\xcb\xaa\x60\x4f\x38\x42\x9a\xb3\x6b\x9e\x53\x54\x63\xac\x41\x01\x57\xfe\xd2\x41\x9d\x81\x9d\xed\x5f\x4c\x9a\x95\x44\x55\x02\xf2\x55\x5d\xbf\x39\x7c\x66\x5d\x4c\x00\x6b\x54\xb2\x6a\x0a\xf4\x7a\xf7\x8b\xeb\x5b\xd5\x23\xad\xf1\x38\x8b\xdd\x68\x07\xe2\x39\xac\x20\x12\x7b\x1f\xe0\x19\x06\x7a\xa7\xc7\xe3\x3b\x88\xc5\xc4\x7f\x37\x4b\xd7\x5d\x92\xcc\x7e\xc8\x70\xfc\x5d\x85\xdf\xc7\x68\x37\x3a\x01\xfa\x1d\xa9\xeb\xe5\x1f\x7e\xff\xfb\x28\x82\xc6\x6b\x96\x69\x09\x2e\x9b\x36\x81\x87\xf7\x18\xa0\x35\x03\xe9\x00\x63\xe5\x9d\x7e\x03\xdd\x06\x75\xa4\x55\xe5\x10\x91\xf9\x7b\x8e\xc4\x4f\x8b\xe9\x48\x89\xb4\x8f\x34\x87\x6f\xe1\x2d\x03\x19\x93\x2e\x0f\x96\x31\xe9\x40\x79\x92\x0e\x93\x1d\xe9\x10\x39\x91\x0e\x92\x09\xe9\x70\xf9\x8f\xf6\x9c\xf5\x68\x2f\x2e\x26\xfb\xcc\x6b\x94\x18\x24\x9c\x16\x20\x1c\x9f\xb9\x28\x3a\x8c\x38\x35\x84\x38\x21\x37\xd1\x6e\x33\x12\x25\x4b\xf4\x29\xd9\x87\xb6\x0d\x8f\x3b\x5c\xa6\xa1\x27\xcc\x2f\xf4\xd4\x59\x85\xf6\x9c\x4b\xe8\x70\x19\x84\x0e\x92\x37\x68\x9b\x38\xd4\xf4\x1c\x41\x29\xf1\xa7\xdb\x5e\xae\xbd\x67\x01\xda\x49\xee\x9f\x1d\x67\xfc\xd9\x5d\x9e\x9f\xc3\x39\x52\xc6\x67\x3f\x79\x74\xce\x13\x95\x9c\xf4\x24\xdd\xde\xb3\x2f\x65\x4d\xdb\xfb\x46\xe5\x94\x4b\x0c\xeb\x12\xbb\x1f\xa3\xab\x9c\xaa\x28\x96\x89\x6d\xb6\xf6\x2d\xdc\xb1\x1e\x82\x24\x68\x70\xb0\x77\xd9\xc3\x5c\x24\x2a\x71\xb0\xd3\xaf\xaf\x57\x3c\x42\xfc\xe3\x7d\x3a\x82\xf8\x41\x7a\x5c\x41\xdc\xc2\x0f\xe0\x0c\x32\x78\x5b\xec\xce\xdb\x62\xf7\x71\x3a\xcf\xcd\x40\x9f\x0f\x06\xfa\x64\x03\xbd\xea\x54\x91\x77\x0a\x63\x40\xc9\xc0\xd4\xca\x9b\xb0\xe2\x52\x8b\x23\xce\xae\x2e\x23\xc6\x69\xab\xc2\xa8\xc9\x26\x6e\xd7\x99\xee\x2c\x17\xed\x33\x9f\x6b\xcd\xca\xaa\x17\x8d\x90\xc1\x3e\x3f\xd8\xe7\x37\xb4\xc1\x3e\xbf\xb1\x1d\xda\x5e\x37\x6f\x4a\x2a\xa0\x62\x2a\x98\xf1\x3b\x0e\x63\x2b\x0c\xcd\x84\x58\x4c\x1a\x79\x2d\x31\x13\x03\xe4\xc6\x68\x04\xff\xb1\x61\xad\x3e\xcb\x33\x96\x7b\xb2\x75\x42\xdf\xfb\xdd\x40\xe4\x8b\x57\x30\x73\x26\xd7\xa2\x88\xed\x9a\xfd\x66\x3a\x14\x1b\xbb\x89\x30\x4c\x47\x45\x0b\xd5\x52\x6c\x59\x9c\x0e\x93\xde\xd1\x3f\x58\xf4\x03\x38\x21\x56\xcb\x1d\x72\xa6\x06\x10\xcc\x7a\x6c\x1a\xae\x1b\x46\x4a\x5e\xd7\xb2\xb6\x76\xd7\x70\x49\xe8\x40\xc8\x67\x73\xcd\x6a\x94\xfc\xeb\xe8\xfa\x58\xd7\x4c\x5b\xa8\x02\xa8\xd4\x12\x2a\xfa\x09\xfb\x6f\x17\x4e\x03\xcb\x75\x74\xe8\x86\xcd\xe9\x82\xcb\x26\x2a\x80\xf4\x1a\x29\xe5\x91\xfd\x18\xf8\xa7\xa5\x6c\xbc\x85\x09\xcb\x9e\xf9\x3d\x54\xeb\xe7\x15\x31\xc8\xfb\xf6\x73\x50\xd0\xe4\xd2\xa9\xcf\xc7\xec\x13\x57\x7a\x7d\xc7\xdc\x51\x59\x1b\xe3\xce\xae\xc1\x42\x55\x06\x8b\x7f\x1b\x91\xfe\x21\x0d\xf8\x3b\x1d\x77\x05\x9f\xc5\x35\xfc\xd4\x27\xf6\xd8\x8c\x70\x98\xc0\x85\x94\x34\x9b\x73\x91\x94\x3c\xe1\xdb\xce\x14\x3a\xf2\xcf\x84\x9c\x15\x45\xeb\x3b\xa8\xbc\x4b\xab\x93\x87\xba\xd3\xd7\xfd\x25\x82\x0d\x7c\xd4\x2c\x07\x1b\x65\x5b\x91\x30\x53\x7c\x62\xbb\x9a\x2c\xca\x3b\x5a\xb3\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\xf7\xe6\x3c\xdc\x83\x7f\x3d\x6e\x7a\x6f\xcd\xbe\xe7\x25\xa3\x0d\xf2\x59\xdb\x52\xdc\x91\x9c\xa3\x54\xc1\xb3\xe5\xe5\x9b\x6d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa8\x62\x39\x79\x47\x05\x9d\xa1\xfa\xf0\xe4\xfa\xea\x8b\x77\xa7\x06\x80\x40\xdd\x79\xf9\x66\xa3\x1f\xd6\x75\xd8\xf9\xfb\x5d\xe6\x7f\x59\x5b\xf8\x16\xbc\xd1\xda\xf7\x5b\x2e\x7e\xa7\x89\x6d\x88\x67\x27\xe2\x0a\x90\x6e\x48\xd5\x73\xb5\x9a\x19\x11\x9d\xa4\x5c\x4a\x56\xb5\x8a\x9a\x17\x65\x7e\xfb\xb8\xe9\x73\x23\x4d\x14\xc5\x55\x41\xc5\x59\x55\xd5\x72\xb1\x59\xeb\x1a\x83\x1c\xdc\xf7\x6e\x01\xe8\x60\xee\x1e\x56\x78\x22\xe0\x53\x29\x50\x88\xc1\x61\x37\xef\xff\xa5\xf6\x8a\x59\x29\x80\x05\x3b\x3a\x6b\xb4\x2c\xa9\xe6\xd9\x11\x91\x35\x39\x7a\x47\x45\x43\x8b\x8d\xb1\x29\x0f\xae\xf8\x3e\x01\xf3\xc1\x8f\xd0\x11\x6d\xcb\xcf\x1e\x64\x60\x1f\xfe\x5e\xd3\xda\xa0\xba\xf3\xeb\x6f\x93\xbe\x55\x9a\xea\x66\x8d\x32\x3c\x40\xad\xee\xa7\x4f\x63\x52\x50\xa5\xbf\xa9\x72\x83\x1f\x56\x7e\x7d\x88\x08\x65\x54\xd3\x42\xce\xfe\x8d\xd1\x62\xf3\x65\x88\x01\xa9\xf3\xb0\x93\xb6\x4a\x37\x20\xa8\xe6\xc6\x7f\x7f\xac\x88\x11\x25\x0d\x94\x70\xad\x48\xcd\x0a\xb6\xa0\x42\xbb\xcf\xaf\xe1\x14\xd4\xb1\xdd\x96\x7b\x01\x8e\xb7\x36\xd6\x9c\x69\x56\x97\x5c\x74\xc7\xb9\x86\xef\xcf\xa5\xc0\x2a\xc8\x0a\xad\x48\xf8\x45\x77\xac\xfb\xa1\xf2\x3e\xd7\x83\x07\x9c\x0d\x3a\x3b\x15\xce\xa7\xbb\x3d\xf8\xda\x8d\x15\x5d\xe6\xf8\x10\x3c\x37\x3b\x73\x5b\xdb\x3d\x72\x2b\x8c\x44\x01\x19\xce\x37\xef\x4d\x2f\x9b\xd3\xc7\xde\x8c\x1d\x38\xe0\x14\xee\x8f\x0a\x1c\xdb\x79\xdf\xe7\x94\xf0\x10\x34\x62\xeb\x67\x8c\x56\xa7\x72\x3f\xa6\xee\x6c\xfc\xf9\xca\x67\x98\x58\xc5\xfb\x36\xa1\x97\x47\xe7\xa5\xfb\x29\x4b\x14\xdf\x18\xc7\xe2\xd1\x8a\x7f\xcb\x6a\x65\xa6\x18\x2f\x1d\x9c\x5d\x5d\x92\x05\x7e\x95\xa6\x0b\x8b\x24\x85\xa0\x23\xeb\xa7\x82\x69\x2c\xe7\xa5\x0d\x6c\xaa\xad\x04\x4b\x49\xc5\x19\xe6\x56\xa7\xc2\x6e\x26\xd0\x33\x46\x73\xfb\xd0\xd0\xcd\x9a\xd9\xdf\x46\xd6\xe3\x30\x8a\x41\x41\xbf\x5d\x67\x83\xa5\x98\xf2\x1b\xbc\x11\x5e\xfc\x4d\x5a\x1d\xa0\x4d\x15\x68\xb0\x0a\x70\x17\x23\xa2\x9a\x6c\x4e\xa8\x11\x64\x94\xb9\x0e\x06\x5f\xb0\x49\x49\x05\x9f\x32\xa5\x27\xb6\x37\x56\xab\xef\x7e\xfb\x7d\x1f\xdb\xf1\x56\xd6\xc4\x46\x69\x8f\x5c\xe6\x6a\xbb\xc6\x16\xe6\xb8\xc2\x8d\xf0\x3d\xb7\x1a\x99\x4a\xe6\x76\xc1\x77\xb0\x14\x4d\x6f\x0d\x29\xc5\xa5\x34\x0c\xbc\x06\xfa\x78\x94\x23\xc3\xf6\x06\xd3\xfe\x6f\x43\x3b\xff\xe7\x88\x9c\xdc\x01\x13\x72\x64\xfe\x3c\xc2\xe9\xf8\x48\xb3\x50\xe1\xd4\x4e\x0b\x93\xa6\xd5\x7c\x36\x63\x75\xaf\x8d\xd5\x7c\xca\x16\x4c\xe8\x53\x9b\xb5\x5b\xc8\xa0\x2b\xe7\xe7\xd7\xea\x4f\x56\xa7\xf9\xdd\x6f\xbf\x3f\x22\x27\xdd\x3d\xe9\x19\x92\x8b\x9c\x7d\x22\xbf\x45\x6b\x29\x14\x17\xcf\x4f\x27\xa8\x70\x51\x4b\xa1\xe9\x27\x33\x62\x36\x97\x8a\x09\x54\x80\x69\x49\xe6\x74\xc1\x88\x92\x25\x23\x77\xac\x28\xc6\xd6\x7e\x4c\xee\xe8\xb2\x3f\x59\xb9\x3b\x42\x48\x81\x4a\x2a\x5a\xeb\x0e\x18\xef\xe4\x12\xde\x72\xb1\xd3\x4c\x8b\x5f\x72\xb1\xea\xd2\xd9\x2b\xe0\x6d\x50\x0a\xcf\xb8\x76\x59\x07\x6c\x7c\x91\x5e\xbe\x30\x87\x55\xf3\x9b\x46\xcb\x5a\xbd\xc8\xd9\x82\x15\x2f\x14\x9f\x8d\x69\x9d\xcd\xb9\x66\x99\x6e\x6a\xf6\xe2\xff\x63\xee\x7c\x7e\xdb\x06\xa1\x38\x7e\xdf\x5f\x81\xd4\x43\x2f\xf1\x7a\xdf\x4e\x5b\xd2\x6d\x91\xaa\x6d\x6a\x93\x49\x3b\x52\x9b\xa5\xa8\x8e\x1d\x81\xdd\x68\x9a\xf6\xbf\x4f\xf0\xc0\x86\xc4\xfc\x4a\x5c\x67\xb7\x36\xb6\x93\xc7\x03\xc3\xf7\x7d\x78\x00\xde\xd1\x2c\xaf\x2b\xd1\x30\xe4\x9e\xbc\xdb\xe2\x4a\x78\x82\x67\xa2\xa0\x7e\x4a\x1c\xe9\xb1\xf0\xdc\x43\x9a\xc7\x4e\x99\x6b\xb8\x0c\x46\x4f\x70\x50\x04\x8a\x4d\xf7\x12\xf0\xce\x8b\xbb\x4a\x22\xbf\x9b\x31\x3c\xc5\x08\x68\xff\xf4\xb1\x39\xe8\xaf\x07\xe8\xf8\xf2\xc3\xdf\x10\x7d\x12\x64\xfb\xca\x2e\xcc\x1a\x25\xb6\xb8\x80\x61\x04\x57\xc1\x75\xee\xaf\xfc\xce\x8a\xfa\x68\x99\xb0\xec\x77\x26\xbf\xa2\x2e\x33\x5c\x15\xe2\x6f\xd8\x78\x23\xf7\x67\xa4\x46\x56\x40\x4b\x47\xed\xfc\xd6\xcb\xc5\xe5\x9b\xe7\xcd\x55\x4b\xc7\xe8\xe9\x4e\x99\xcf\x52\xba\x3c\x52\x2c\x43\x48\x02\x19\xba\xac\x25\x5a\xc0\xd8\x81\x08\xe5\xfa\x5b\xdf\xab\xcc\x81\xee\xa0\x9b\x90\x74\xf6\xcf\xe6\x1b\x31\x42\xa4\xbd\x77\xfd\x13\x26\x0b\x97\x99\xff\x98\x37\xea\x28\x11\xbd\xf3\xab\x55\x0c\x1d\x9c\x3e\xe1\x6a\xe3\x91\x36\x51\x15\xa3\xf3\x26\x85\x21\xd9\xe0\x61\xee\x79\x17\x7c\x06\x63\x6a\x23\x4e\x95\xa1\x4a\x49\x79\x77\x9c\x86\x08\x5b\x79\x83\xf0\x0b\xa6\xa5\x9c\x27\xac\x1f\x39\x61\x2f\x0a\xb6\xc3\x61\x57\xf8\x30\xc6\x86\xd7\xb6\x01\xc1\x3b\x51\x84\xab\xcb\x70\x5c\x2b\xbe\x02\xc8\xa8\xf7\xc0\x7a\xa7\xd5\xa3\xc4\xb7\x80\x16\x9c\x97\x9d\x13\x14\xe1\x20\x4f\xb4\xbf\x2f\x04\xb3\xe6\x91\xe0\x66\x45\x7d\x0a\xe5\xa8\x49\x5b\xcf\x69\x2e\xd7\x37\xe8\x3d\x41\x9b\xba\x11\xb2\xb3\x95\x6d\x1f\xe2\x03\xd8\x4b\xbe\x6b\x68\xaf\xdd\xa2\xfb\x52\xae\x18\x96\x3b\x4c\xd4\x55\x62\x31\xed\x07\x8f\xcb\xa9\x62\x11\xd5\x92\x1a\xb8\x1b\xfd\x62\xf5\x56\xc2\x45\xa8\x3b\x98\xaa\xf4\x6f\x86\x31\x6a\x91\xb7\x84\x73\xef\x16\xc7\xf6\xb2\x12\xb8\x1b\x5e\xe5\x83\x49\xfe\xad\xbe\x06\xcb\xd9\x45\x50\x51\x90\x06\xd3\x52\xbf\xca\xe0\x8a\xce\x4b\xa1\xde\xd5\x5b\x40\x46\x30\xf7\x09\x1a\xcb\xea\x7b\x79\x33\x18\x5d\x57\x24\xdb\xd7\xac\x40\x73\xbc\x25\xe5\x1c\x73\xa2\xbe\xcb\xdc\xaf\x06\xea\xe8\x9a\x8f\x6a\xf2\x30\x0e\x75\x98\x0c\x90\xaf\x9f\x50\x90\xff\xf5\x01\x2d\x18\x38\xd3\x54\x7a\xc5\x5a\x32\x43\x9f\xc4\xe8\x35\x43\xeb\xea\xb9\xaa\xf7\xe7\xd9\xda\x78\x27\xeb\x2c\x4b\xcd\x0c\x49\xbd\xdd\xb9\x05\xf6\x3a\x73\x4f\xb4\x48\x75\xf8\x0e\xfa\x6c\x0f\x36\xdd\xad\xda\x22\xf1\xe7\x11\x6a\x14\xa1\x35\xab\x37\x8c\x70\x0e\x14\x27\x19\xdf\x1b\x13\x16\x9f\x49\xa5\xe6\x87\x83\xe6\x2d\x87\x9e\xd2\x96\xea\x71\x6d\xd3\x5f\x51\xf5\xad\x7e\x6c\x57\x0e\x4a\x0d\xff\xca\x08\xc3\x50\x07\x64\x74\x59\x38\x0c\x17\x8d\x51\xcf\xb8\x17\x44\x89\x8f\x8c\xeb\xd2\xcd\x1f\x7e\xb8\x9d\xed\x1c\xfb\x42\xe3\x53\x18\x3f\x9e\x0b\x1e\x83\xef\x4c\x10\x36\xc6\x2a\xfd\x69\x00\xe3\x25\xd1\xe2\x65\xa1\xe2\xe4\x38\x71\x52\x90\x38\x1d\x42\x3c\x11\x1e\x06\x5f\x24\x1f\x30\x8c\x7d\x87\xd2\x20\xe1\xc5\xf1\x60\xd0\x27\x3e\x24\x18\xeb\x93\x34\x0c\x38\x35\x00\x8c\x72\x81\x17\xfa\xa5\xf8\x21\x11\xf4\x4d\x8c\xf8\x82\xbe\x88\xc4\x7a\xb1\x1e\x79\x3d\x94\xf7\xdf\x42\xbc\xa0\x8b\x3d\xe0\x2e\xd6\xad\x49\xb0\x6e\x62\x4c\x17\x28\x7f\x1a\x9a\x53\x1a\x93\x14\x31\x12\x7d\x69\xdc\x6c\x8a\x74\x25\x10\x65\x02\x9c\xba\x43\x27\xdc\x99\x52\xf2\x54\xa5\x2e\xc4\xf3\xa9\xf9\x1f\xca\xe4\x78\x35\xac\x24\x3c\x29\xba\x98\x32\x54\x04\x84\x16\xb7\xdf\xef\x6f\xe7\x1f\x56\xb7\x8b\x43\x15\x9e\x2e\x97\xfd\xa0\x28\x33\xe4\xb2\xe3\x06\x31\x58\x39\x2e\x89\xb6\xe5\xb8\xd4\xb6\x74\xe8\xa9\xf3\xc5\xfb\x59\x9a\xe1\xac\xc1\x35\xdc\x4f\x8c\xd4\x51\xc8\xb6\x05\x59\xab\x42\x55\x3e\xd5\x65\xc1\xf5\xfa\x86\xe5\xa2\xdb\x88\x80\x56\x79\xd9\x16\x42\x72\xad\xd7\xcb\x05\x7f\x8b\xd0\x47\x92\xe3\x96\x0b\xe9\xe6\x0e\xd7\xeb\xea\xba\x41\xdf\xbe\xde\xfd\x94\x4b\xbb\xe4\x93\xb3\x6e\xbb\x54\x79\xf6\x1e\xc5\x70\x7c\xa0\x2c\xa8\xfc\x56\x90\x75\xd2\xa2\x1c\xef\x44\x0f\xec\x46\xfe\x14\x76\xaf\xc1\x55\x81\x9e\x48\xb9\x13\xa3\xc3\x33\x41\xfd\x39\x65\xe2\x07\xe5\x55\x58\xbf\xa1\xf2\xd8\x37\xa4\x81\x4d\x09\x7c\xa9\xea\xde\x0a\x08\x10\xf6\x33\xd8\xba\x85\x0b\x14\x7d\xd9\x63\xae\x08\xe5\xa0\xb5\x81\xa6\x12\xe6\x71\x6e\xa4\xe5\x80\x59\x30\xb2\xc8\xff\x8e\x6c\x16\xc6\xf6\xdc\x0a\x92\xc3\x68\x13\x4d\xcf\xdd\x99\x80\xc3\x27\x44\x1f\xb1\x2b\x72\xe8\x64\xeb\x87\xbb\xb5\x40\x86\xc9\x71\xb6\x70\xc2\x5e\x48\xf1\x4e\xce\xe7\xe8\x8f\x20\xdb\xd6\xfe\xac\x7d\xd4\x62\xc6\xe8\x75\x14\x81\x43\x7f\xfe\xbe\xf9\x17\x00\x00\xff\xff\xc4\xc9\x92\x01\x49\xa6\x03\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go index 4fdf56e26b..c7aea05f44 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go @@ -163,7 +163,7 @@ func grpcConnection(address string) (*grpc.ClientConn, error) { })) } - return grpc.Dial(address, dialOptions...) + return grpc.NewClient(address, dialOptions...) } func (s *SourceStore) Add(key registry.CatalogKey, address string) (*SourceConn, error) { @@ -203,6 +203,11 @@ func (s *SourceStore) stateTimeout(state connectivity.State) time.Duration { func (s *SourceStore) watch(ctx context.Context, key registry.CatalogKey, source SourceConn) { state := source.ConnectionState + + // Make initial connection + source.Conn.Connect() + + // Periodically observe connection state change for { select { case <-ctx.Done(): diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go index a6b94264f7..67cb40108c 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go @@ -25,8 +25,8 @@ import ( //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go k8s.io/client-go/listers/rbac/v1.RoleBindingNamespaceLister //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go k8s.io/client-go/listers/rbac/v1.ClusterRoleBindingLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionNamespaceLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionNamespaceLister // OperatorLister is a union of versioned informer listers // diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go index bb0b092d85..6b7fcab02e 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go @@ -214,7 +214,7 @@ func MonitorClusterStatus(name string, syncCh <-chan error, stopCh <-chan struct log.Errorf("Failed to get related objects: %v", err) } if !reflect.DeepEqual(previousStatus.RelatedObjects, existing.Status.RelatedObjects) { - diffString := diff.ObjectDiff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) + diffString := diff.Diff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) log.Debugf("Update required for related objects: %v", diffString) } diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go b/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go index 3569367ef2..ee2afeb419 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go @@ -22,6 +22,7 @@ const ( ConsoleLinkKind = "ConsoleLink" ConsolePlugin = "ConsolePlugin" NetworkPolicyKind = "NetworkPolicy" + PodMonitorKind = "PodMonitor" ) // Namespaced indicates whether the resource is namespace scoped (true) or cluster-scoped (false). @@ -51,6 +52,7 @@ var supportedResources = map[string]Namespaced{ ConsoleLinkKind: false, ConsolePlugin: false, NetworkPolicyKind: true, + PodMonitorKind: true, } // IsSupported checks if the object kind is OLM-supported and if it is namespaced diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go index 7b762370e2..8f8dc65d38 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -220,7 +220,7 @@ func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector, error) return extractSummary(o, f), nil case dto.MetricType_UNTYPED: return extractUntyped(o, f), nil - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: return extractHistogram(o, f), nil } return nil, fmt.Errorf("expfmt.extractSamples: unknown metric family type %v", f.GetType()) @@ -403,9 +403,13 @@ func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { infSeen = true } + v := q.GetCumulativeCountFloat() + if v <= 0 { + v = float64(q.GetCumulativeCount()) + } samples = append(samples, &model.Sample{ Metric: model.Metric(lset), - Value: model.SampleValue(q.GetCumulativeCount()), + Value: model.SampleValue(v), Timestamp: timestamp, }) } @@ -428,9 +432,13 @@ func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { } lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + v := m.Histogram.GetSampleCountFloat() + if v <= 0 { + v = float64(m.Histogram.GetSampleCount()) + } count := &model.Sample{ Metric: model.Metric(lset), - Value: model.SampleValue(m.Histogram.GetSampleCount()), + Value: model.SampleValue(v), Timestamp: timestamp, } samples = append(samples, count) diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go index 8dbf6d04ed..8c8bbaa624 100644 --- a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -208,6 +208,8 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E n, err = w.WriteString(" unknown\n") case dto.MetricType_HISTOGRAM: n, err = w.WriteString(" histogram\n") + case dto.MetricType_GAUGE_HISTOGRAM: + n, err = w.WriteString(" gaugehistogram\n") default: return written, fmt.Errorf("unknown metric type %s", metricType.String()) } @@ -325,7 +327,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E createdTsBytesWritten, err = writeOpenMetricsCreated(w, compliantName, "", metric, "", 0, metric.Summary.GetCreatedTimestamp()) n += createdTsBytesWritten } - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: if metric.Histogram == nil { return written, fmt.Errorf( "expected histogram in metric %s %s", compliantName, metric, @@ -333,6 +335,12 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E } infSeen := false for _, b := range metric.Histogram.Bucket { + if b.GetCumulativeCountFloat() > 0 { + return written, fmt.Errorf( + "OpenMetrics v1.0 does not support float histogram %s %s", + compliantName, metric, + ) + } n, err = writeOpenMetricsSample( w, compliantName, "_bucket", metric, model.BucketLabel, b.GetUpperBound(), @@ -354,6 +362,9 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E 0, metric.Histogram.GetSampleCount(), true, nil, ) + // We do not check for a float sample count here + // because we will check for it below (and error + // out if needed). written += n if err != nil { return @@ -368,6 +379,12 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E if err != nil { return } + if metric.Histogram.GetSampleCountFloat() > 0 { + return written, fmt.Errorf( + "OpenMetrics v1.0 does not support float histogram %s %s", + compliantName, metric, + ) + } n, err = writeOpenMetricsSample( w, compliantName, "_count", metric, "", 0, 0, metric.Histogram.GetSampleCount(), true, diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go index c4e9c1bbc3..7e1d23cabc 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_create.go +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -151,7 +151,10 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e n, err = w.WriteString(" summary\n") case dto.MetricType_UNTYPED: n, err = w.WriteString(" untyped\n") - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: + // The classic Prometheus text format has no notion of a gauge + // histogram. We render a gauge histogram in the same way as a + // regular histogram. n, err = w.WriteString(" histogram\n") default: return written, fmt.Errorf("unknown metric type %s", metricType.String()) @@ -223,7 +226,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e w, name, "_count", metric, "", 0, float64(metric.Summary.GetSampleCount()), ) - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: if metric.Histogram == nil { return written, fmt.Errorf( "expected histogram in metric %s %s", name, metric, @@ -231,10 +234,14 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e } infSeen := false for _, b := range metric.Histogram.Bucket { + v := b.GetCumulativeCountFloat() + if v == 0 { + v = float64(b.GetCumulativeCount()) + } n, err = writeSample( w, name, "_bucket", metric, model.BucketLabel, b.GetUpperBound(), - float64(b.GetCumulativeCount()), + v, ) written += n if err != nil { @@ -245,10 +252,14 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e } } if !infSeen { + v := metric.Histogram.GetSampleCountFloat() + if v == 0 { + v = float64(metric.Histogram.GetSampleCount()) + } n, err = writeSample( w, name, "_bucket", metric, model.BucketLabel, math.Inf(+1), - float64(metric.Histogram.GetSampleCount()), + v, ) written += n if err != nil { @@ -263,10 +274,11 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e if err != nil { return } - n, err = writeSample( - w, name, "_count", metric, "", 0, - float64(metric.Histogram.GetSampleCount()), - ) + v := metric.Histogram.GetSampleCountFloat() + if v == 0 { + v = float64(metric.Histogram.GetSampleCount()) + } + n, err = writeSample(w, name, "_count", metric, "", 0, v) default: return written, fmt.Errorf( "unexpected type in metric %s %s", name, metric, diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go index 8f2edde324..00c8841a10 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -48,8 +48,10 @@ func (e ParseError) Error() string { return fmt.Sprintf("text format parsing error in line %d: %s", e.Line, e.Msg) } -// TextParser is used to parse the simple and flat text-based exchange format. Its -// zero value is ready to use. +// TextParser is used to parse the simple and flat text-based exchange format. +// +// TextParser instances must be created with NewTextParser, the zero value of +// TextParser is invalid. type TextParser struct { metricFamiliesByName map[string]*dto.MetricFamily buf *bufio.Reader // Where the parsed input is read through. @@ -129,9 +131,44 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF if p.err != nil && errors.Is(p.err, io.EOF) { p.parseError("unexpected end of input stream") } + for _, histogramMetric := range p.histograms { + normalizeHistogram(histogramMetric.GetHistogram()) + } return p.metricFamiliesByName, p.err } +// normalizeHistogram makes sure that all the buckets and the count in each +// histogram is either completely float or completely integer. +func normalizeHistogram(histogram *dto.Histogram) { + if histogram == nil { + return + } + anyFloats := false + if histogram.GetSampleCountFloat() != 0 { + anyFloats = true + } else { + for _, b := range histogram.GetBucket() { + if b.GetCumulativeCountFloat() != 0 { + anyFloats = true + break + } + } + } + if !anyFloats { + return + } + if histogram.GetSampleCountFloat() == 0 { + histogram.SampleCountFloat = proto.Float64(float64(histogram.GetSampleCount())) + histogram.SampleCount = nil + } + for _, b := range histogram.GetBucket() { + if b.GetCumulativeCountFloat() == 0 { + b.CumulativeCountFloat = proto.Float64(float64(b.GetCumulativeCount())) + b.CumulativeCount = nil + } + } +} + func (p *TextParser) reset(in io.Reader) { p.metricFamiliesByName = map[string]*dto.MetricFamily{} p.currentLabelPairs = nil @@ -281,7 +318,9 @@ func (p *TextParser) readingLabels() stateFn { // Summaries/histograms are special. We have to reset the // currentLabels map, currentQuantile and currentBucket before starting to // read labels. - if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentMF.GetType() == dto.MetricType_SUMMARY || + p.currentMF.GetType() == dto.MetricType_HISTOGRAM || + p.currentMF.GetType() == dto.MetricType_GAUGE_HISTOGRAM { p.currentLabels = map[string]string{} p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() p.currentQuantile = math.NaN() @@ -374,7 +413,9 @@ func (p *TextParser) startLabelName() stateFn { // Special summary/histogram treatment. Don't add 'quantile' and 'le' // labels to 'real' labels. if (p.currentMF.GetType() != dto.MetricType_SUMMARY || p.currentLabelPair.GetName() != model.QuantileLabel) && - (p.currentMF.GetType() != dto.MetricType_HISTOGRAM || p.currentLabelPair.GetName() != model.BucketLabel) { + ((p.currentMF.GetType() != dto.MetricType_HISTOGRAM && + p.currentMF.GetType() != dto.MetricType_GAUGE_HISTOGRAM) || + p.currentLabelPair.GetName() != model.BucketLabel) { p.currentLabelPairs = append(p.currentLabelPairs, p.currentLabelPair) } // Check for duplicate label names. @@ -425,7 +466,7 @@ func (p *TextParser) startLabelValue() stateFn { } } // Similar special treatment of histograms. - if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM || p.currentMF.GetType() == dto.MetricType_GAUGE_HISTOGRAM { if p.currentLabelPair.GetName() == model.BucketLabel { if p.currentBucket, p.err = parseFloat(p.currentLabelPair.GetValue()); p.err != nil { // Create a more helpful error message. @@ -476,7 +517,7 @@ func (p *TextParser) readingValue() stateFn { p.summaries[signature] = p.currentMetric p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) } - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: signature := model.LabelsToSignature(p.currentLabels) if histogram := p.histograms[signature]; histogram != nil { p.currentMetric = histogram @@ -522,24 +563,38 @@ func (p *TextParser) readingValue() stateFn { }, ) } - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: // *sigh* if p.currentMetric.Histogram == nil { p.currentMetric.Histogram = &dto.Histogram{} } switch { case p.currentIsHistogramCount: - p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + if uintValue := uint64(value); value == float64(uintValue) { + p.currentMetric.Histogram.SampleCount = proto.Uint64(uintValue) + } else { + if value < 0 { + p.parseError(fmt.Sprintf("negative count for histogram %q", p.currentMF.GetName())) + return nil + } + p.currentMetric.Histogram.SampleCountFloat = proto.Float64(value) + } case p.currentIsHistogramSum: p.currentMetric.Histogram.SampleSum = proto.Float64(value) case !math.IsNaN(p.currentBucket): - p.currentMetric.Histogram.Bucket = append( - p.currentMetric.Histogram.Bucket, - &dto.Bucket{ - UpperBound: proto.Float64(p.currentBucket), - CumulativeCount: proto.Uint64(uint64(value)), - }, - ) + b := &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + } + if uintValue := uint64(value); value == float64(uintValue) { + b.CumulativeCount = proto.Uint64(uintValue) + } else { + if value < 0 { + p.parseError(fmt.Sprintf("negative bucket population for histogram %q", p.currentMF.GetName())) + return nil + } + b.CumulativeCountFloat = proto.Float64(value) + } + p.currentMetric.Histogram.Bucket = append(p.currentMetric.Histogram.Bucket, b) } default: p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) @@ -602,10 +657,18 @@ func (p *TextParser) readingType() stateFn { if p.readTokenUntilNewline(false); p.err != nil { return nil // Unexpected end of input. } - metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + typ := strings.ToUpper(p.currentToken.String()) // Tolerate any combination of upper and lower case. + metricType, ok := dto.MetricType_value[typ] // Tolerate "gauge_histogram" (not originally part of the text format). if !ok { - p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) - return nil + // We also want to tolerate "gaugehistogram" to mark a gauge + // histogram, because that string is used in OpenMetrics. Note, + // however, that gauge histograms do not officially exist in the + // classic text format. + if typ != "GAUGEHISTOGRAM" { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + metricType = int32(dto.MetricType_GAUGE_HISTOGRAM) } p.currentMF.Type = dto.MetricType(metricType).Enum() return p.startOfLine @@ -855,7 +918,8 @@ func (p *TextParser) setOrCreateCurrentMF() { } histogramName := histogramMetricName(name) if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { - if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM || + p.currentMF.GetType() == dto.MetricType_GAUGE_HISTOGRAM { if isCount(name) { p.currentIsHistogramCount = true } diff --git a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go index 16affcd62c..37374c5a71 100644 --- a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go @@ -232,29 +232,30 @@ func init() { func init() { proto.RegisterFile("auth.proto", fileDescriptor_8bbd6f3875b0e874) } var fileDescriptor_8bbd6f3875b0e874 = []byte{ - // 338 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4e, 0xea, 0x40, - 0x14, 0xc6, 0x3b, 0xb4, 0x70, 0xdb, 0xc3, 0x85, 0x90, 0x13, 0x72, 0x6f, 0x83, 0x49, 0x6d, 0xba, - 0x6a, 0x5c, 0x54, 0x85, 0x8d, 0x5b, 0x8c, 0x2c, 0x5c, 0x49, 0x26, 0x18, 0x97, 0xa4, 0xa4, 0x13, - 0x24, 0xc0, 0x4c, 0x33, 0x83, 0x31, 0x6c, 0x7c, 0x0e, 0x17, 0x3e, 0x10, 0x4b, 0x1e, 0x41, 0xf0, - 0x45, 0x4c, 0x67, 0xf8, 0x13, 0xa2, 0xbb, 0xef, 0x7c, 0xe7, 0xfb, 0x66, 0x7e, 0x99, 0x01, 0x48, - 0x5f, 0x16, 0xcf, 0x49, 0x2e, 0xc5, 0x42, 0x60, 0xa5, 0xd0, 0xf9, 0xa8, 0xd5, 0x1c, 0x8b, 0xb1, - 0xd0, 0xd6, 0x65, 0xa1, 0xcc, 0x36, 0xba, 0x86, 0xfa, 0xa3, 0x62, 0xb2, 0x9b, 0x65, 0x0f, 0xf9, - 0x62, 0x22, 0xb8, 0xc2, 0x73, 0xa8, 0x72, 0x31, 0xcc, 0x53, 0xa5, 0x5e, 0x85, 0xcc, 0x7c, 0x12, - 0x92, 0xd8, 0xa5, 0xc0, 0x45, 0x7f, 0xe7, 0x44, 0x6f, 0xe0, 0x14, 0x15, 0x44, 0x70, 0x78, 0x3a, - 0x67, 0x3a, 0xf1, 0x97, 0x6a, 0x8d, 0x2d, 0x70, 0x0f, 0xcd, 0x92, 0xf6, 0x0f, 0x33, 0x36, 0xa1, - 0x2c, 0xc5, 0x8c, 0x29, 0xdf, 0x0e, 0xed, 0xd8, 0xa3, 0x66, 0xc0, 0x2b, 0xf8, 0x23, 0xcc, 0xcd, - 0xbe, 0x13, 0x92, 0xb8, 0xda, 0xfe, 0x97, 0x18, 0xe0, 0xe4, 0x94, 0x8b, 0xee, 0x63, 0xd1, 0x07, - 0x01, 0xe8, 0x33, 0x39, 0x9f, 0x28, 0x35, 0x11, 0x1c, 0x3b, 0xe0, 0xe6, 0x4c, 0xce, 0x07, 0xcb, - 0xdc, 0xa0, 0xd4, 0xdb, 0xff, 0xf7, 0x27, 0x1c, 0x53, 0x49, 0xb1, 0xa6, 0x87, 0x20, 0x36, 0xc0, - 0x9e, 0xb2, 0xe5, 0x0e, 0xb1, 0x90, 0x78, 0x06, 0x9e, 0x4c, 0xf9, 0x98, 0x0d, 0x19, 0xcf, 0x7c, - 0xdb, 0xa0, 0x6b, 0xa3, 0xc7, 0xb3, 0xe8, 0x02, 0x1c, 0x5d, 0x73, 0xc1, 0xa1, 0xbd, 0xee, 0x5d, - 0xc3, 0x42, 0x0f, 0xca, 0x4f, 0xf4, 0x7e, 0xd0, 0x6b, 0x10, 0xac, 0x81, 0x57, 0x98, 0x66, 0x2c, - 0x45, 0x03, 0x70, 0xa8, 0x98, 0xb1, 0x5f, 0x9f, 0xe7, 0x06, 0x6a, 0x53, 0xb6, 0x3c, 0x62, 0xf9, - 0xa5, 0xd0, 0x8e, 0xab, 0x6d, 0xfc, 0x09, 0x4c, 0x4f, 0x83, 0xb7, 0xfe, 0x6a, 0x13, 0x58, 0xeb, - 0x4d, 0x60, 0xad, 0xb6, 0x01, 0x59, 0x6f, 0x03, 0xf2, 0xb9, 0x0d, 0xc8, 0xfb, 0x57, 0x60, 0x8d, - 0x2a, 0xfa, 0x23, 0x3b, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x61, 0x66, 0xc6, 0x9d, 0xf4, 0x01, - 0x00, 0x00, + // 359 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4e, 0xc2, 0x40, + 0x10, 0xc6, 0xbb, 0xb4, 0x60, 0x3b, 0x08, 0x21, 0x1b, 0xa2, 0x0d, 0xc6, 0xda, 0xf4, 0xd4, 0x78, + 0x68, 0x15, 0x0e, 0x7a, 0xc5, 0xc8, 0xc1, 0x93, 0x64, 0x83, 0x31, 0xf1, 0x42, 0x8a, 0xdd, 0xd4, + 0x06, 0xd8, 0x6d, 0xda, 0xaa, 0xe1, 0xe2, 0x73, 0x78, 0xf0, 0x81, 0x38, 0xf2, 0x08, 0x82, 0x2f, + 0x62, 0xba, 0xcb, 0x9f, 0x10, 0x3d, 0xed, 0x37, 0xdf, 0x7c, 0x33, 0xfb, 0xcb, 0x2e, 0x40, 0xf0, + 0x9a, 0xbf, 0x78, 0x49, 0xca, 0x73, 0x8e, 0x2b, 0x85, 0x4e, 0x46, 0xad, 0x66, 0xc4, 0x23, 0x2e, + 0x2c, 0xbf, 0x50, 0xb2, 0xeb, 0x5c, 0x42, 0xfd, 0x21, 0xa3, 0x69, 0x37, 0x0c, 0xef, 0x93, 0x3c, + 0xe6, 0x2c, 0xc3, 0x67, 0x50, 0x65, 0x7c, 0x98, 0x04, 0x59, 0xf6, 0xce, 0xd3, 0xd0, 0x44, 0x36, + 0x72, 0x75, 0x02, 0x8c, 0xf7, 0xd7, 0x8e, 0xf3, 0x01, 0x5a, 0x31, 0x82, 0x31, 0x68, 0x2c, 0x98, + 0x52, 0x91, 0x38, 0x24, 0x42, 0xe3, 0x16, 0xe8, 0xdb, 0xc9, 0x92, 0xf0, 0xb7, 0x35, 0x6e, 0x42, + 0x39, 0xe5, 0x13, 0x9a, 0x99, 0xaa, 0xad, 0xba, 0x06, 0x91, 0x05, 0xbe, 0x80, 0x03, 0x2e, 0x6f, + 0x36, 0x35, 0x1b, 0xb9, 0xd5, 0xf6, 0x91, 0x27, 0x81, 0xbd, 0x7d, 0x2e, 0xb2, 0x89, 0x39, 0x5f, + 0x08, 0xa0, 0x4f, 0xd3, 0x69, 0x9c, 0x65, 0x31, 0x67, 0xb8, 0x03, 0x7a, 0x42, 0xd3, 0xe9, 0x60, + 0x96, 0x48, 0x94, 0x7a, 0xfb, 0x78, 0xb3, 0x61, 0x97, 0xf2, 0x8a, 0x36, 0xd9, 0x06, 0x71, 0x03, + 0xd4, 0x31, 0x9d, 0xad, 0x11, 0x0b, 0x89, 0x4f, 0xc0, 0x48, 0x03, 0x16, 0xd1, 0x21, 0x65, 0xa1, + 0xa9, 0x4a, 0x74, 0x61, 0xf4, 0x58, 0xe8, 0x9c, 0x83, 0x26, 0xc6, 0x74, 0xd0, 0x48, 0xaf, 0x7b, + 0xdb, 0x50, 0xb0, 0x01, 0xe5, 0x47, 0x72, 0x37, 0xe8, 0x35, 0x10, 0xae, 0x81, 0x51, 0x98, 0xb2, + 0x2c, 0x39, 0x03, 0xd0, 0x08, 0x9f, 0xd0, 0x7f, 0x9f, 0xe7, 0x1a, 0x6a, 0x63, 0x3a, 0xdb, 0x61, + 0x99, 0x25, 0x5b, 0x75, 0xab, 0x6d, 0xfc, 0x17, 0x98, 0xec, 0x07, 0x6f, 0xae, 0xe6, 0x4b, 0x4b, + 0x59, 0x2c, 0x2d, 0x65, 0xbe, 0xb2, 0xd0, 0x62, 0x65, 0xa1, 0xef, 0x95, 0x85, 0x3e, 0x7f, 0x2c, + 0xe5, 0xe9, 0x34, 0xe2, 0x1e, 0xcd, 0x9f, 0x43, 0x2f, 0xe6, 0x7e, 0x71, 0xfa, 0x41, 0x12, 0xfb, + 0x6f, 0x1d, 0x5f, 0xae, 0x1c, 0x55, 0xc4, 0x3f, 0x77, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0x61, + 0x5a, 0xfe, 0x48, 0x13, 0x02, 0x00, 0x00, } func (m *UserAddOptions) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto index 8f82b7cf1e..5a7856bb73 100644 --- a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto +++ b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto @@ -3,6 +3,8 @@ package authpb; import "gogoproto/gogo.proto"; +option go_package = "go.etcd.io/etcd/api/v3/authpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go index 38434d09c5..eaefa2d208 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go @@ -129,31 +129,33 @@ func init() { func init() { proto.RegisterFile("etcdserver.proto", fileDescriptor_09ffbeb3bebbce7e) } var fileDescriptor_09ffbeb3bebbce7e = []byte{ - // 380 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0xd2, 0xdd, 0x6e, 0xda, 0x30, - 0x14, 0x07, 0x70, 0x0c, 0xe1, 0xcb, 0x63, 0x1b, 0xb3, 0xd0, 0x74, 0x84, 0xa6, 0x2c, 0x42, 0xbb, - 0xc8, 0xd5, 0xf6, 0x0e, 0x2c, 0x5c, 0x44, 0x2a, 0x15, 0x0d, 0x15, 0xbd, 0x76, 0xc9, 0x29, 0x58, - 0x02, 0x4c, 0x1d, 0x07, 0xf1, 0x06, 0x7d, 0x85, 0x3e, 0x12, 0x97, 0x7d, 0x82, 0xaa, 0xa5, 0x2f, - 0x52, 0x39, 0x24, 0xc4, 0xed, 0x5d, 0xf4, 0xfb, 0x9f, 0x1c, 0x1f, 0x7f, 0xd0, 0x2e, 0xea, 0x79, - 0x9c, 0xa0, 0xda, 0xa1, 0xfa, 0xbb, 0x55, 0x52, 0x4b, 0xd6, 0x29, 0x65, 0x7b, 0xdb, 0xef, 0x2d, - 0xe4, 0x42, 0x66, 0xc1, 0x3f, 0xf3, 0x75, 0xaa, 0x19, 0x3c, 0x38, 0xb4, 0x19, 0xe1, 0x7d, 0x8a, - 0x89, 0x66, 0x3d, 0x5a, 0x0d, 0x03, 0x20, 0x1e, 0xf1, 0x9d, 0xa1, 0x73, 0x78, 0xfe, 0x5d, 0x89, - 0xaa, 0x61, 0xc0, 0x7e, 0xd1, 0xc6, 0x18, 0xf5, 0x52, 0xc6, 0x50, 0xf5, 0x88, 0xdf, 0xce, 0x93, - 0xdc, 0x18, 0x50, 0x67, 0xc2, 0xf5, 0x12, 0x6a, 0x56, 0x96, 0x09, 0xfb, 0x49, 0x6b, 0x33, 0xbe, - 0x02, 0xc7, 0x0a, 0x0c, 0x18, 0x0f, 0x84, 0x82, 0xba, 0x47, 0xfc, 0x56, 0xe1, 0x81, 0x50, 0x6c, - 0x40, 0xdb, 0x13, 0x85, 0xbb, 0x19, 0x5f, 0xa5, 0x08, 0x0d, 0xeb, 0xaf, 0x92, 0x8b, 0x9a, 0x70, - 0x13, 0xe3, 0x1e, 0x9a, 0xd6, 0xa0, 0x25, 0x17, 0x35, 0xa3, 0xbd, 0x48, 0x34, 0xb4, 0xce, 0xab, - 0x90, 0xa8, 0x64, 0xf6, 0x87, 0xd2, 0xd1, 0x7e, 0x2b, 0x14, 0xd7, 0x42, 0x6e, 0xa0, 0xed, 0x11, - 0xbf, 0x96, 0x37, 0xb2, 0xdc, 0xec, 0xed, 0x86, 0x0b, 0x0d, 0xd4, 0x1a, 0x35, 0x13, 0xd6, 0xa7, - 0xf5, 0xa9, 0xd8, 0xcc, 0x11, 0xbe, 0x58, 0x33, 0x9c, 0xc8, 0xac, 0x1f, 0xe1, 0x3c, 0x55, 0x89, - 0xd8, 0x21, 0x74, 0xac, 0x5f, 0x4b, 0x36, 0x67, 0x3a, 0x95, 0x4a, 0x63, 0x0c, 0x5f, 0xad, 0x82, - 0xdc, 0x4c, 0x7a, 0x95, 0x4a, 0x95, 0xae, 0xe1, 0x9b, 0x9d, 0x9e, 0xcc, 0x4c, 0x75, 0x2d, 0xd6, - 0x08, 0xdf, 0xad, 0xa9, 0x33, 0xc9, 0xba, 0x6a, 0x85, 0x7c, 0x0d, 0xdd, 0x0f, 0x5d, 0x33, 0x63, - 0xae, 0xb9, 0xe8, 0x3b, 0x85, 0xc9, 0x12, 0x7e, 0x58, 0xa7, 0x52, 0xe0, 0xe0, 0x82, 0xb6, 0xc6, - 0xa8, 0x79, 0xcc, 0x35, 0x37, 0x9d, 0x2e, 0x65, 0x8c, 0x9f, 0x5e, 0x43, 0x6e, 0x66, 0x87, 0xff, - 0x57, 0x69, 0xa2, 0x51, 0x85, 0x41, 0xf6, 0x28, 0xce, 0xb7, 0x70, 0xe6, 0x61, 0xef, 0xf0, 0xea, - 0x56, 0x0e, 0x47, 0x97, 0x3c, 0x1d, 0x5d, 0xf2, 0x72, 0x74, 0xc9, 0xe3, 0x9b, 0x5b, 0x79, 0x0f, - 0x00, 0x00, 0xff, 0xff, 0xee, 0x40, 0xba, 0xd6, 0xa4, 0x02, 0x00, 0x00, + // 402 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0xd2, 0x41, 0xef, 0xd2, 0x30, + 0x14, 0x00, 0x70, 0x0a, 0xfb, 0xff, 0x81, 0x8a, 0x8a, 0x0d, 0x31, 0x2f, 0xc4, 0xcc, 0x05, 0x3d, + 0xec, 0xc4, 0x0e, 0x9e, 0xbc, 0xe2, 0x38, 0x2c, 0x11, 0x83, 0xc3, 0x60, 0xe2, 0xad, 0xb2, 0x27, + 0x34, 0x01, 0x3a, 0xbb, 0x6e, 0xe1, 0x1b, 0xf8, 0x15, 0xfc, 0x48, 0x1c, 0xfd, 0x04, 0x46, 0xf1, + 0x8b, 0x98, 0x8e, 0x8d, 0x55, 0x4f, 0x5b, 0x7e, 0xef, 0xf5, 0xf5, 0xb5, 0x7d, 0x74, 0x88, 0x7a, + 0x93, 0x64, 0xa8, 0x0a, 0x54, 0xd3, 0x54, 0x49, 0x2d, 0xd9, 0xa0, 0x91, 0xf4, 0xf3, 0x78, 0xb4, + 0x95, 0x5b, 0x59, 0x06, 0x02, 0xf3, 0x77, 0xcd, 0x99, 0x7c, 0x73, 0x68, 0x37, 0xc6, 0xaf, 0x39, + 0x66, 0x9a, 0x8d, 0x68, 0x3b, 0x0a, 0x81, 0x78, 0xc4, 0x77, 0x66, 0xce, 0xf9, 0xe7, 0xf3, 0x56, + 0xdc, 0x8e, 0x42, 0xf6, 0x8c, 0xde, 0x2f, 0x50, 0xef, 0x64, 0x02, 0x6d, 0x8f, 0xf8, 0xfd, 0x2a, + 0x52, 0x19, 0x03, 0xea, 0x2c, 0xb9, 0xde, 0x41, 0xc7, 0x8a, 0x95, 0xc2, 0x9e, 0xd2, 0xce, 0x9a, + 0xef, 0xc1, 0xb1, 0x02, 0x06, 0x8c, 0x87, 0x42, 0xc1, 0x9d, 0x47, 0xfc, 0x5e, 0xed, 0xa1, 0x50, + 0x6c, 0x42, 0xfb, 0x4b, 0x85, 0xc5, 0x9a, 0xef, 0x73, 0x84, 0x7b, 0x6b, 0x55, 0xc3, 0x75, 0x4e, + 0x74, 0x4c, 0xf0, 0x04, 0x5d, 0xab, 0xd1, 0x86, 0xeb, 0x9c, 0xf9, 0x49, 0x64, 0x1a, 0x7a, 0xb7, + 0x5d, 0x48, 0xdc, 0x30, 0x7b, 0x49, 0xe9, 0xfc, 0x94, 0x0a, 0xc5, 0xb5, 0x90, 0x47, 0xe8, 0x7b, + 0xc4, 0xef, 0x54, 0x85, 0x2c, 0x37, 0x67, 0xfb, 0xc8, 0x85, 0x06, 0x6a, 0xb5, 0x5a, 0x0a, 0x1b, + 0xd3, 0xbb, 0x95, 0x38, 0x6e, 0x10, 0x1e, 0x58, 0x3d, 0x5c, 0xc9, 0xec, 0x1f, 0xe3, 0x26, 0x57, + 0x99, 0x28, 0x10, 0x06, 0xd6, 0xd2, 0x86, 0xcd, 0x9d, 0xae, 0xa4, 0xd2, 0x98, 0xc0, 0x43, 0x2b, + 0xa1, 0x32, 0x13, 0x7d, 0x9f, 0x4b, 0x95, 0x1f, 0xe0, 0x91, 0x1d, 0xbd, 0x9a, 0xe9, 0xea, 0x83, + 0x38, 0x20, 0x3c, 0xb6, 0xba, 0x2e, 0xa5, 0xac, 0xaa, 0x15, 0xf2, 0x03, 0x0c, 0xff, 0xa9, 0x5a, + 0x1a, 0x73, 0xcd, 0x43, 0x7f, 0x51, 0x98, 0xed, 0xe0, 0x89, 0x75, 0x2b, 0x35, 0x4e, 0xde, 0xd2, + 0xde, 0x02, 0x35, 0x4f, 0xb8, 0xe6, 0xa6, 0xd2, 0x3b, 0x99, 0xe0, 0x7f, 0xd3, 0x50, 0x99, 0x39, + 0xe1, 0x9b, 0x7d, 0x9e, 0x69, 0x54, 0x51, 0x58, 0x0e, 0xc5, 0xed, 0x15, 0x6e, 0x3c, 0x7b, 0x7d, + 0xfe, 0xed, 0xb6, 0xce, 0x17, 0x97, 0xfc, 0xb8, 0xb8, 0xe4, 0xd7, 0xc5, 0x25, 0xdf, 0xff, 0xb8, + 0xad, 0x4f, 0x2f, 0xb6, 0x72, 0x6a, 0x86, 0x72, 0x2a, 0x64, 0x60, 0xbe, 0x01, 0x4f, 0x45, 0x50, + 0xbc, 0x0a, 0xec, 0x41, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x79, 0xf9, 0xf5, 0xc9, 0x02, + 0x00, 0x00, } func (m *Request) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto index 25e0aca5d9..ff639b9c96 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto @@ -3,6 +3,8 @@ package etcdserverpb; import "gogoproto/gogo.proto"; +option go_package = "go.etcd.io/etcd/api/v3/etcdserverpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go index b94a7bfd9d..e1cd9ebecd 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go @@ -12,6 +12,7 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/golang/protobuf/proto" membershippb "go.etcd.io/etcd/api/v3/membershippb" + _ "go.etcd.io/etcd/api/v3/versionpb" ) // Reference imports to suppress errors if they are not otherwise used. @@ -104,6 +105,7 @@ type InternalRaftRequest struct { ClusterVersionSet *membershippb.ClusterVersionSetRequest `protobuf:"bytes,1300,opt,name=cluster_version_set,json=clusterVersionSet,proto3" json:"cluster_version_set,omitempty"` ClusterMemberAttrSet *membershippb.ClusterMemberAttrSetRequest `protobuf:"bytes,1301,opt,name=cluster_member_attr_set,json=clusterMemberAttrSet,proto3" json:"cluster_member_attr_set,omitempty"` DowngradeInfoSet *membershippb.DowngradeInfoSetRequest `protobuf:"bytes,1302,opt,name=downgrade_info_set,json=downgradeInfoSet,proto3" json:"downgrade_info_set,omitempty"` + DowngradeVersionTest *DowngradeVersionTestRequest `protobuf:"bytes,9900,opt,name=downgrade_version_test,json=downgradeVersionTest,proto3" json:"downgrade_version_test,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -237,70 +239,76 @@ func init() { func init() { proto.RegisterFile("raft_internal.proto", fileDescriptor_b4c9a9be0cfca103) } var fileDescriptor_b4c9a9be0cfca103 = []byte{ - // 1003 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x96, 0xd9, 0x72, 0x1b, 0x45, - 0x14, 0x86, 0x23, 0xc5, 0x71, 0xac, 0x96, 0xed, 0x38, 0x6d, 0x87, 0x34, 0x72, 0x95, 0x70, 0x1c, - 0x12, 0xcc, 0x66, 0x53, 0xca, 0x03, 0x80, 0x90, 0x5c, 0x8e, 0xab, 0x42, 0x70, 0x4d, 0xcc, 0x52, - 0xc5, 0xc5, 0xd0, 0x9a, 0x39, 0x96, 0x06, 0xcf, 0x46, 0x77, 0x4b, 0x31, 0xef, 0x11, 0x28, 0x1e, - 0x83, 0xed, 0x21, 0x72, 0xc1, 0x62, 0xe0, 0x05, 0xc0, 0xdc, 0x70, 0x0f, 0xdc, 0x53, 0xbd, 0xcc, - 0x26, 0xb5, 0x7c, 0xa7, 0xf9, 0xcf, 0x7f, 0xbe, 0x73, 0xba, 0xe7, 0xf4, 0xa8, 0xd1, 0x3a, 0xa3, - 0x27, 0xc2, 0x0d, 0x62, 0x01, 0x2c, 0xa6, 0xe1, 0x6e, 0xca, 0x12, 0x91, 0xe0, 0x65, 0x10, 0x9e, - 0xcf, 0x81, 0x4d, 0x80, 0xa5, 0x83, 0xd6, 0xc6, 0x30, 0x19, 0x26, 0x2a, 0xb0, 0x27, 0x7f, 0x69, - 0x4f, 0x6b, 0xad, 0xf0, 0x18, 0xa5, 0xc1, 0x52, 0xcf, 0xfc, 0xbc, 0x2f, 0x83, 0x7b, 0x34, 0x0d, - 0xf6, 0x22, 0x88, 0x06, 0xc0, 0xf8, 0x28, 0x48, 0xd3, 0x41, 0xe9, 0x41, 0xfb, 0xb6, 0x3f, 0x45, - 0x2b, 0x0e, 0x7c, 0x3e, 0x06, 0x2e, 0x1e, 0x02, 0xf5, 0x81, 0xe1, 0x55, 0x54, 0x3f, 0xec, 0x93, - 0xda, 0x56, 0x6d, 0x67, 0xc1, 0xa9, 0x1f, 0xf6, 0x71, 0x0b, 0x2d, 0x8d, 0xb9, 0x6c, 0x2d, 0x02, - 0x52, 0xdf, 0xaa, 0xed, 0x34, 0x9c, 0xfc, 0x19, 0xdf, 0x45, 0x2b, 0x74, 0x2c, 0x46, 0x2e, 0x83, - 0x49, 0xc0, 0x83, 0x24, 0x26, 0x57, 0x55, 0xda, 0xb2, 0x14, 0x1d, 0xa3, 0x6d, 0x3f, 0xc3, 0x68, - 0xfd, 0xd0, 0xac, 0xce, 0xa1, 0x27, 0xc2, 0x94, 0xc3, 0x0f, 0xd0, 0xe2, 0x48, 0x95, 0x24, 0xfe, - 0x56, 0x6d, 0xa7, 0xd9, 0xd9, 0xdc, 0x2d, 0xaf, 0x79, 0xb7, 0xd2, 0x95, 0x63, 0xac, 0x33, 0xdd, - 0xdd, 0x43, 0xf5, 0x49, 0x47, 0xf5, 0xd5, 0xec, 0xdc, 0xb2, 0x02, 0x9c, 0xfa, 0xa4, 0x83, 0xdf, - 0x42, 0xd7, 0x18, 0x8d, 0x87, 0xa0, 0x1a, 0x6c, 0x76, 0x5a, 0x53, 0x4e, 0x19, 0xca, 0xec, 0xda, - 0x88, 0x5f, 0x43, 0x57, 0xd3, 0xb1, 0x20, 0x0b, 0xca, 0x4f, 0xaa, 0xfe, 0xa3, 0x71, 0xb6, 0x08, - 0x47, 0x9a, 0x70, 0x0f, 0x2d, 0xfb, 0x10, 0x82, 0x00, 0x57, 0x17, 0xb9, 0xa6, 0x92, 0xb6, 0xaa, - 0x49, 0x7d, 0xe5, 0xa8, 0x94, 0x6a, 0xfa, 0x85, 0x26, 0x0b, 0x8a, 0xb3, 0x98, 0x2c, 0xda, 0x0a, - 0x1e, 0x9f, 0xc5, 0x79, 0x41, 0x71, 0x16, 0xe3, 0xb7, 0x11, 0xf2, 0x92, 0x28, 0xa5, 0x9e, 0x90, - 0x9b, 0x7e, 0x5d, 0xa5, 0xbc, 0x54, 0x4d, 0xe9, 0xe5, 0xf1, 0x2c, 0xb3, 0x94, 0x82, 0xdf, 0x41, - 0xcd, 0x10, 0x28, 0x07, 0x77, 0xc8, 0x68, 0x2c, 0xc8, 0x92, 0x8d, 0xf0, 0x48, 0x1a, 0x0e, 0x64, - 0x3c, 0x27, 0x84, 0xb9, 0x24, 0xd7, 0xac, 0x09, 0x0c, 0x26, 0xc9, 0x29, 0x90, 0x86, 0x6d, 0xcd, - 0x0a, 0xe1, 0x28, 0x43, 0xbe, 0xe6, 0xb0, 0xd0, 0xe4, 0x6b, 0xa1, 0x21, 0x65, 0x11, 0x41, 0xb6, - 0xd7, 0xd2, 0x95, 0xa1, 0xfc, 0xb5, 0x28, 0x23, 0x7e, 0x1f, 0xad, 0xe9, 0xb2, 0xde, 0x08, 0xbc, - 0xd3, 0x34, 0x09, 0x62, 0x41, 0x9a, 0x2a, 0xf9, 0x65, 0x4b, 0xe9, 0x5e, 0x6e, 0xca, 0x30, 0x37, - 0xc2, 0xaa, 0x8e, 0xbb, 0xa8, 0xa9, 0x46, 0x18, 0x62, 0x3a, 0x08, 0x81, 0xfc, 0x6d, 0xdd, 0xcc, - 0xee, 0x58, 0x8c, 0xf6, 0x95, 0x21, 0xdf, 0x0a, 0x9a, 0x4b, 0xb8, 0x8f, 0xd4, 0xc0, 0xbb, 0x7e, - 0xc0, 0x15, 0xe3, 0x9f, 0xeb, 0xb6, 0xbd, 0x90, 0x8c, 0xbe, 0x76, 0xe4, 0x7b, 0x41, 0x0b, 0x2d, - 0x6f, 0x84, 0x0b, 0x2a, 0xc6, 0x9c, 0xfc, 0x37, 0xb7, 0x91, 0x27, 0xca, 0x50, 0x69, 0x44, 0x4b, - 0xf8, 0xb1, 0x6e, 0x04, 0x62, 0x11, 0x78, 0x54, 0x00, 0xf9, 0x57, 0x33, 0x5e, 0xad, 0x32, 0xb2, - 0xb3, 0xd8, 0x2d, 0x59, 0x33, 0x5a, 0x25, 0x1f, 0xef, 0x9b, 0xe3, 0x2d, 0xcf, 0xbb, 0x4b, 0x7d, - 0x9f, 0xfc, 0xb8, 0x34, 0x6f, 0x65, 0x1f, 0x70, 0x60, 0x5d, 0xdf, 0xaf, 0xac, 0xcc, 0x68, 0xf8, - 0x31, 0x5a, 0x2b, 0x30, 0x7a, 0xe4, 0xc9, 0x4f, 0x9a, 0x74, 0xd7, 0x4e, 0x32, 0x67, 0xc5, 0xc0, - 0x56, 0x69, 0x45, 0xae, 0xb6, 0x35, 0x04, 0x41, 0x7e, 0xbe, 0xb4, 0xad, 0x03, 0x10, 0x33, 0x6d, - 0x1d, 0x80, 0xc0, 0x43, 0xf4, 0x62, 0x81, 0xf1, 0x46, 0xf2, 0x10, 0xba, 0x29, 0xe5, 0xfc, 0x69, - 0xc2, 0x7c, 0xf2, 0x8b, 0x46, 0xbe, 0x6e, 0x47, 0xf6, 0x94, 0xfb, 0xc8, 0x98, 0x33, 0xfa, 0x0b, - 0xd4, 0x1a, 0xc6, 0x1f, 0xa3, 0x8d, 0x52, 0xbf, 0xf2, 0xf4, 0xb8, 0x2c, 0x09, 0x81, 0x9c, 0xeb, - 0x1a, 0xf7, 0xe7, 0xb4, 0xad, 0x4e, 0x5e, 0x52, 0x4c, 0xcb, 0x4d, 0x3a, 0x1d, 0xc1, 0x9f, 0xa0, - 0x5b, 0x05, 0x59, 0x1f, 0x44, 0x8d, 0xfe, 0x55, 0xa3, 0x5f, 0xb1, 0xa3, 0xcd, 0x89, 0x2c, 0xb1, - 0x31, 0x9d, 0x09, 0xe1, 0x87, 0x68, 0xb5, 0x80, 0x87, 0x01, 0x17, 0xe4, 0x37, 0x4d, 0xbd, 0x63, - 0xa7, 0x3e, 0x0a, 0xb8, 0xa8, 0xcc, 0x51, 0x26, 0xe6, 0x24, 0xd9, 0x9a, 0x26, 0xfd, 0x3e, 0x97, - 0x24, 0x4b, 0xcf, 0x90, 0x32, 0x31, 0x7f, 0xf5, 0x8a, 0x24, 0x27, 0xf2, 0x9b, 0xc6, 0xbc, 0x57, - 0x2f, 0x73, 0xa6, 0x27, 0xd2, 0x68, 0xf9, 0x44, 0x2a, 0x8c, 0x99, 0xc8, 0x6f, 0x1b, 0xf3, 0x26, - 0x52, 0x66, 0x59, 0x26, 0xb2, 0x90, 0xab, 0x6d, 0xc9, 0x89, 0xfc, 0xee, 0xd2, 0xb6, 0xa6, 0x27, - 0xd2, 0x68, 0xf8, 0x33, 0xd4, 0x2a, 0x61, 0xd4, 0xa0, 0xa4, 0xc0, 0xa2, 0x80, 0xab, 0xff, 0xd6, - 0xef, 0x35, 0xf3, 0x8d, 0x39, 0x4c, 0x69, 0x3f, 0xca, 0xdd, 0x19, 0xff, 0x36, 0xb5, 0xc7, 0x71, - 0x84, 0x36, 0x8b, 0x5a, 0x66, 0x74, 0x4a, 0xc5, 0x7e, 0xd0, 0xc5, 0xde, 0xb4, 0x17, 0xd3, 0x53, - 0x32, 0x5b, 0x8d, 0xd0, 0x39, 0x06, 0xfc, 0x11, 0x5a, 0xf7, 0xc2, 0x31, 0x17, 0xc0, 0xdc, 0x09, - 0x30, 0x29, 0xb9, 0x1c, 0x04, 0x79, 0x86, 0xcc, 0x11, 0x28, 0x5f, 0x52, 0x76, 0x7b, 0xda, 0xf9, - 0xa1, 0x36, 0x3e, 0x29, 0x76, 0xeb, 0xa6, 0x37, 0x1d, 0xc1, 0x14, 0xdd, 0xce, 0xc0, 0x9a, 0xe1, - 0x52, 0x21, 0x98, 0x82, 0x7f, 0x89, 0xcc, 0xe7, 0xcf, 0x06, 0x7f, 0x4f, 0x69, 0x5d, 0x21, 0x58, - 0x89, 0xbf, 0xe1, 0x59, 0x82, 0xf8, 0x18, 0x61, 0x3f, 0x79, 0x1a, 0x0f, 0x19, 0xf5, 0xc1, 0x0d, - 0xe2, 0x93, 0x44, 0xd1, 0xbf, 0xd2, 0xf4, 0x7b, 0x55, 0x7a, 0x3f, 0x33, 0x1e, 0xc6, 0x27, 0x49, - 0x89, 0xbc, 0xe6, 0x4f, 0x05, 0xb6, 0x6f, 0xa0, 0x95, 0xfd, 0x28, 0x15, 0x5f, 0x38, 0xc0, 0xd3, - 0x24, 0xe6, 0xb0, 0x9d, 0xa2, 0xcd, 0x4b, 0x3e, 0xcd, 0x18, 0xa3, 0x05, 0x75, 0x07, 0xab, 0xa9, - 0x3b, 0x98, 0xfa, 0x2d, 0xef, 0x66, 0xf9, 0x17, 0xcb, 0xdc, 0xcd, 0xb2, 0x67, 0x7c, 0x07, 0x2d, - 0xf3, 0x20, 0x4a, 0x43, 0x70, 0x45, 0x72, 0x0a, 0xfa, 0x6a, 0xd6, 0x70, 0x9a, 0x5a, 0x3b, 0x96, - 0xd2, 0xbb, 0x1b, 0xcf, 0xff, 0x6c, 0x5f, 0x79, 0x7e, 0xd1, 0xae, 0x9d, 0x5f, 0xb4, 0x6b, 0x7f, - 0x5c, 0xb4, 0x6b, 0x5f, 0xff, 0xd5, 0xbe, 0x32, 0x58, 0x54, 0x17, 0xc3, 0x07, 0xff, 0x07, 0x00, - 0x00, 0xff, 0xff, 0x94, 0x6f, 0x64, 0x0a, 0x98, 0x0a, 0x00, 0x00, + // 1101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x56, 0xcb, 0x72, 0x1b, 0x45, + 0x14, 0x8d, 0x6c, 0xc7, 0xb6, 0x5a, 0xb6, 0xe3, 0xb4, 0x9d, 0xa4, 0xb1, 0xab, 0x8c, 0xe3, 0x90, + 0x60, 0x20, 0xc8, 0xc1, 0x06, 0xaa, 0x60, 0x03, 0x8a, 0xe5, 0x72, 0x4c, 0x25, 0x29, 0xd7, 0xc4, + 0x50, 0x29, 0x28, 0x6a, 0x68, 0xcd, 0x5c, 0x4b, 0x13, 0x8f, 0x66, 0x86, 0xee, 0x96, 0xe2, 0x6c, + 0x59, 0xb2, 0x06, 0x8a, 0x8f, 0x60, 0xc1, 0x2b, 0xff, 0x90, 0x05, 0x8f, 0x00, 0x3f, 0x00, 0x66, + 0xc3, 0x1e, 0xd8, 0xa7, 0xfa, 0x31, 0x2f, 0xa9, 0xe5, 0xdd, 0xe8, 0xde, 0x73, 0xcf, 0x39, 0xdd, + 0x7d, 0xbb, 0x75, 0xd1, 0x02, 0xa3, 0x87, 0xc2, 0x0d, 0x22, 0x01, 0x2c, 0xa2, 0x61, 0x3d, 0x61, + 0xb1, 0x88, 0xf1, 0x0c, 0x08, 0xcf, 0xe7, 0xc0, 0xfa, 0xc0, 0x92, 0xd6, 0xd2, 0x62, 0x3b, 0x6e, + 0xc7, 0x2a, 0xb1, 0x21, 0xbf, 0x34, 0x66, 0x69, 0x3e, 0xc7, 0x98, 0x48, 0x95, 0x25, 0x9e, 0xf9, + 0x5c, 0x95, 0xc9, 0x0d, 0x9a, 0x04, 0x1b, 0x7d, 0x60, 0x3c, 0x88, 0xa3, 0xa4, 0x95, 0x7e, 0x19, + 0xc4, 0xb5, 0x0c, 0xd1, 0x85, 0x6e, 0x0b, 0x18, 0xef, 0x04, 0x49, 0xd2, 0x2a, 0xfc, 0xd0, 0xb8, + 0x35, 0x86, 0x66, 0x1d, 0xf8, 0xb4, 0x07, 0x5c, 0xdc, 0x02, 0xea, 0x03, 0xc3, 0x73, 0x68, 0x6c, + 0xaf, 0x49, 0x2a, 0xab, 0x95, 0xf5, 0x09, 0x67, 0x6c, 0xaf, 0x89, 0x97, 0xd0, 0x74, 0x8f, 0x4b, + 0xf3, 0x5d, 0x20, 0x63, 0xab, 0x95, 0xf5, 0xaa, 0x93, 0xfd, 0xc6, 0xd7, 0xd1, 0x2c, 0xed, 0x89, + 0x8e, 0xcb, 0xa0, 0x1f, 0x48, 0x6d, 0x32, 0x2e, 0xcb, 0x6e, 0x4e, 0x7d, 0xfe, 0x98, 0x8c, 0x6f, + 0xd5, 0x5f, 0x73, 0x66, 0x64, 0xd6, 0x31, 0xc9, 0xb7, 0xa7, 0x3e, 0x53, 0xe1, 0x1b, 0x6b, 0x8f, + 0x17, 0xd0, 0xc2, 0x9e, 0xd9, 0x11, 0x87, 0x1e, 0x0a, 0x63, 0x00, 0x6f, 0xa1, 0xc9, 0x8e, 0x32, + 0x41, 0xfc, 0xd5, 0xca, 0x7a, 0x6d, 0x73, 0xb9, 0x5e, 0xdc, 0xa7, 0x7a, 0xc9, 0xa7, 0x63, 0xa0, + 0x43, 0x7e, 0xaf, 0xa2, 0xb1, 0xfe, 0xa6, 0x72, 0x5a, 0xdb, 0xbc, 0x60, 0x25, 0x70, 0xc6, 0xfa, + 0x9b, 0xf8, 0x06, 0x3a, 0xcb, 0x68, 0xd4, 0x06, 0x65, 0xb9, 0xb6, 0xb9, 0x34, 0x80, 0x94, 0xa9, + 0x14, 0xae, 0x81, 0xf8, 0x65, 0x34, 0x9e, 0xf4, 0x04, 0x99, 0x50, 0x78, 0x52, 0xc6, 0xef, 0xf7, + 0xd2, 0x45, 0x38, 0x12, 0x84, 0xb7, 0xd1, 0x8c, 0x0f, 0x21, 0x08, 0x70, 0xb5, 0xc8, 0x59, 0x55, + 0xb4, 0x5a, 0x2e, 0x6a, 0x2a, 0x44, 0x49, 0xaa, 0xe6, 0xe7, 0x31, 0x29, 0x28, 0x8e, 0x23, 0x32, + 0x69, 0x13, 0x3c, 0x38, 0x8e, 0x32, 0x41, 0x71, 0x1c, 0xe1, 0x77, 0x10, 0xf2, 0xe2, 0x6e, 0x42, + 0x3d, 0x21, 0x8f, 0x61, 0x4a, 0x95, 0x3c, 0x5f, 0x2e, 0xd9, 0xce, 0xf2, 0x69, 0x65, 0xa1, 0x04, + 0xbf, 0x8b, 0x6a, 0x21, 0x50, 0x0e, 0x6e, 0x9b, 0xd1, 0x48, 0x90, 0x69, 0x1b, 0xc3, 0x6d, 0x09, + 0xd8, 0x95, 0xf9, 0x8c, 0x21, 0xcc, 0x42, 0x72, 0xcd, 0x9a, 0x81, 0x41, 0x3f, 0x3e, 0x02, 0x52, + 0xb5, 0xad, 0x59, 0x51, 0x38, 0x0a, 0x90, 0xad, 0x39, 0xcc, 0x63, 0xf2, 0x58, 0x68, 0x48, 0x59, + 0x97, 0x20, 0xdb, 0xb1, 0x34, 0x64, 0x2a, 0x3b, 0x16, 0x05, 0xc4, 0xf7, 0xd1, 0xbc, 0x96, 0xf5, + 0x3a, 0xe0, 0x1d, 0x25, 0x71, 0x10, 0x09, 0x52, 0x53, 0xc5, 0x2f, 0x58, 0xa4, 0xb7, 0x33, 0x90, + 0xa1, 0x49, 0x9b, 0xf5, 0x75, 0xe7, 0x5c, 0x58, 0x06, 0xe0, 0x06, 0xaa, 0xa9, 0xee, 0x86, 0x88, + 0xb6, 0x42, 0x20, 0xff, 0x58, 0x77, 0xb5, 0xd1, 0x13, 0x9d, 0x1d, 0x05, 0xc8, 0xf6, 0x84, 0x66, + 0x21, 0xdc, 0x44, 0xea, 0x0a, 0xb8, 0x7e, 0xc0, 0x15, 0xc7, 0xbf, 0x53, 0xb6, 0x4d, 0x91, 0x1c, + 0x4d, 0x8d, 0xc8, 0x36, 0x85, 0xe6, 0x31, 0xfc, 0x9e, 0x31, 0xc2, 0x05, 0x15, 0x3d, 0x4e, 0xfe, + 0x1f, 0x69, 0xe4, 0x9e, 0x02, 0x0c, 0xac, 0xec, 0x0d, 0xed, 0x48, 0xe7, 0xf0, 0x5d, 0xed, 0x08, + 0x22, 0x11, 0x78, 0x54, 0x00, 0xf9, 0x4f, 0x93, 0xbd, 0x54, 0x26, 0x4b, 0x6f, 0x67, 0xa3, 0x00, + 0x4d, 0xad, 0x95, 0xea, 0xf1, 0x8e, 0x79, 0x02, 0xe4, 0x9b, 0xe0, 0x52, 0xdf, 0x27, 0x3f, 0x4d, + 0x8f, 0x5a, 0xe2, 0xfb, 0x1c, 0x58, 0xc3, 0xf7, 0x4b, 0x4b, 0x34, 0x31, 0x7c, 0x17, 0xcd, 0xe7, + 0x34, 0xfa, 0x12, 0x90, 0x9f, 0x35, 0xd3, 0x15, 0x3b, 0x93, 0xb9, 0x3d, 0x86, 0x6c, 0x8e, 0x96, + 0xc2, 0x65, 0x5b, 0x6d, 0x10, 0xe4, 0x97, 0x53, 0x6d, 0xed, 0x82, 0x18, 0xb2, 0xb5, 0x0b, 0x02, + 0xb7, 0xd1, 0x73, 0x39, 0x8d, 0xd7, 0x91, 0xd7, 0xd2, 0x4d, 0x28, 0xe7, 0x0f, 0x63, 0xe6, 0x93, + 0x5f, 0x35, 0xe5, 0x2b, 0x76, 0xca, 0x6d, 0x85, 0xde, 0x37, 0xe0, 0x94, 0xfd, 0x22, 0xb5, 0xa6, + 0xf1, 0x7d, 0xb4, 0x58, 0xf0, 0x2b, 0xef, 0x93, 0xcb, 0xe2, 0x10, 0xc8, 0x53, 0xad, 0x71, 0x6d, + 0x84, 0x6d, 0x75, 0x17, 0xe3, 0xbc, 0x6d, 0xce, 0xd3, 0xc1, 0x0c, 0xfe, 0x08, 0x5d, 0xc8, 0x99, + 0xf5, 0xd5, 0xd4, 0xd4, 0xbf, 0x69, 0xea, 0x17, 0xed, 0xd4, 0xe6, 0x8e, 0x16, 0xb8, 0x31, 0x1d, + 0x4a, 0xe1, 0x5b, 0x68, 0x2e, 0x27, 0x0f, 0x03, 0x2e, 0xc8, 0xef, 0x9a, 0xf5, 0xb2, 0x9d, 0xf5, + 0x76, 0xc0, 0x45, 0xa9, 0x8f, 0xd2, 0x60, 0xc6, 0x24, 0xad, 0x69, 0xa6, 0x3f, 0x46, 0x32, 0x49, + 0xe9, 0x21, 0xa6, 0x34, 0x98, 0x1d, 0xbd, 0x62, 0x92, 0x1d, 0xf9, 0x6d, 0x75, 0xd4, 0xd1, 0xcb, + 0x9a, 0xc1, 0x8e, 0x34, 0xb1, 0xac, 0x23, 0x15, 0x8d, 0xe9, 0xc8, 0xef, 0xaa, 0xa3, 0x3a, 0x52, + 0x56, 0x59, 0x3a, 0x32, 0x0f, 0x97, 0x6d, 0xc9, 0x8e, 0xfc, 0xfe, 0x54, 0x5b, 0x83, 0x1d, 0x69, + 0x62, 0xf8, 0x01, 0x5a, 0x2a, 0xd0, 0xa8, 0x46, 0x49, 0x80, 0x75, 0x03, 0xae, 0xfe, 0x7f, 0x7f, + 0xd0, 0x9c, 0xd7, 0x47, 0x70, 0x4a, 0xf8, 0x7e, 0x86, 0x4e, 0xf9, 0x2f, 0x51, 0x7b, 0x1e, 0x77, + 0xd1, 0x72, 0xae, 0x65, 0x5a, 0xa7, 0x20, 0xf6, 0xa3, 0x16, 0x7b, 0xd5, 0x2e, 0xa6, 0xbb, 0x64, + 0x58, 0x8d, 0xd0, 0x11, 0x00, 0xfc, 0x09, 0x5a, 0xf0, 0xc2, 0x1e, 0x17, 0xc0, 0x5c, 0x33, 0xcb, + 0xb8, 0x1c, 0x04, 0xf9, 0x02, 0x99, 0x2b, 0x50, 0x1c, 0x64, 0xea, 0xdb, 0x1a, 0xf9, 0x81, 0x06, + 0xde, 0x03, 0x31, 0xf4, 0xea, 0x9d, 0xf7, 0x06, 0x21, 0xf8, 0x01, 0xba, 0x94, 0x2a, 0x68, 0x32, + 0x97, 0x0a, 0xc1, 0x94, 0xca, 0x97, 0xc8, 0xbc, 0x83, 0x36, 0x95, 0x3b, 0x2a, 0xd6, 0x10, 0x82, + 0xd9, 0x84, 0x16, 0x3d, 0x0b, 0x0a, 0x7f, 0x8c, 0xb0, 0x1f, 0x3f, 0x8c, 0xda, 0x8c, 0xfa, 0xe0, + 0x06, 0xd1, 0x61, 0xac, 0x64, 0xbe, 0xd2, 0x32, 0x57, 0xcb, 0x32, 0xcd, 0x14, 0xb8, 0x17, 0x1d, + 0xc6, 0x36, 0x89, 0x79, 0x7f, 0x00, 0x81, 0x03, 0x74, 0x31, 0xa7, 0x4f, 0xb7, 0x4b, 0x00, 0x17, + 0xe4, 0x9b, 0x3b, 0xb6, 0x17, 0x3d, 0x93, 0x30, 0xdb, 0x71, 0x00, 0x7c, 0x50, 0xe6, 0x4d, 0x67, + 0xd1, 0xb7, 0xa0, 0xf2, 0xb9, 0xed, 0x1c, 0x9a, 0xdd, 0xe9, 0x26, 0xe2, 0x91, 0x03, 0x3c, 0x89, + 0x23, 0x0e, 0x6b, 0x8f, 0xd0, 0xf2, 0x29, 0xff, 0x14, 0x18, 0xa3, 0x09, 0x35, 0x36, 0x56, 0xd4, + 0xd8, 0xa8, 0xbe, 0xe5, 0x38, 0x99, 0x3d, 0xa0, 0x66, 0x9c, 0x4c, 0x7f, 0xe3, 0xcb, 0x68, 0x86, + 0x07, 0xdd, 0x24, 0x04, 0x57, 0xc4, 0x47, 0xa0, 0xa7, 0xc9, 0xaa, 0x53, 0xd3, 0xb1, 0x03, 0x19, + 0xca, 0xbc, 0xdc, 0x7c, 0xeb, 0xc9, 0x5f, 0x2b, 0x67, 0x9e, 0x9c, 0xac, 0x54, 0x9e, 0x9e, 0xac, + 0x54, 0xfe, 0x3c, 0x59, 0xa9, 0x7c, 0xfd, 0xf7, 0xca, 0x99, 0x0f, 0xaf, 0xb4, 0x63, 0xb5, 0xec, + 0x7a, 0x10, 0x6f, 0xe4, 0x23, 0xf2, 0xd6, 0x46, 0x71, 0x2b, 0x5a, 0x93, 0x6a, 0xf2, 0xdd, 0x7a, + 0x16, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xa0, 0x15, 0x1f, 0x9b, 0x0b, 0x00, 0x00, } func (m *RequestHeader) Marshal() (dAtA []byte, err error) { @@ -371,6 +379,22 @@ func (m *InternalRaftRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.DowngradeVersionTest != nil { + { + size, err := m.DowngradeVersionTest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRaftInternal(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4 + i-- + dAtA[i] = 0xea + i-- + dAtA[i] = 0xe2 + } if m.DowngradeInfoSet != nil { { size, err := m.DowngradeInfoSet.MarshalToSizedBuffer(dAtA[:i]) @@ -1034,6 +1058,10 @@ func (m *InternalRaftRequest) Size() (n int) { l = m.DowngradeInfoSet.Size() n += 2 + l + sovRaftInternal(uint64(l)) } + if m.DowngradeVersionTest != nil { + l = m.DowngradeVersionTest.Size() + n += 3 + l + sovRaftInternal(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2367,6 +2395,42 @@ func (m *InternalRaftRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9900: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DowngradeVersionTest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRaftInternal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DowngradeVersionTest == nil { + m.DowngradeVersionTest = &DowngradeVersionTestRequest{} + } + if err := m.DowngradeVersionTest.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRaftInternal(dAtA[iNdEx:]) diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto index 68926e59f6..88b8ab5279 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto @@ -4,24 +4,31 @@ package etcdserverpb; import "gogoproto/gogo.proto"; import "etcdserver.proto"; import "rpc.proto"; +import "etcd/api/versionpb/version.proto"; import "etcd/api/membershippb/membership.proto"; +option go_package = "go.etcd.io/etcd/api/v3/etcdserverpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; option (gogoproto.goproto_getters_all) = false; message RequestHeader { + option (versionpb.etcd_version_msg) = "3.0"; + uint64 ID = 1; // username is a username that is associated with an auth token of gRPC connection string username = 2; // auth_revision is a revision number of auth.authStore. It is not related to mvcc - uint64 auth_revision = 3; + uint64 auth_revision = 3 [(versionpb.etcd_version_field) = "3.1"]; } // An InternalRaftRequest is the union of all requests which can be // sent via raft. message InternalRaftRequest { + option (versionpb.etcd_version_msg) = "3.0"; + RequestHeader header = 100; uint64 ID = 1; @@ -38,11 +45,11 @@ message InternalRaftRequest { AlarmRequest alarm = 10; - LeaseCheckpointRequest lease_checkpoint = 11; + LeaseCheckpointRequest lease_checkpoint = 11 [(versionpb.etcd_version_field) = "3.4"]; AuthEnableRequest auth_enable = 1000; AuthDisableRequest auth_disable = 1011; - AuthStatusRequest auth_status = 1013; + AuthStatusRequest auth_status = 1013 [(versionpb.etcd_version_field) = "3.5"]; InternalAuthenticateRequest authenticate = 1012; @@ -61,9 +68,11 @@ message InternalRaftRequest { AuthRoleGrantPermissionRequest auth_role_grant_permission = 1203; AuthRoleRevokePermissionRequest auth_role_revoke_permission = 1204; - membershippb.ClusterVersionSetRequest cluster_version_set = 1300; - membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301; - membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302; + membershippb.ClusterVersionSetRequest cluster_version_set = 1300 [(versionpb.etcd_version_field) = "3.5"]; + membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301 [(versionpb.etcd_version_field) = "3.5"]; + membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302 [(versionpb.etcd_version_field) = "3.5"]; + + DowngradeVersionTestRequest downgrade_version_test = 9900 [(versionpb.etcd_version_field) = "3.6"]; } message EmptyResponse { @@ -73,6 +82,7 @@ message EmptyResponse { // InternalAuthenticateRequest has a member that is filled by etcdserver and shouldn't be user-facing. // For avoiding misusage the field, we have an internal version of AuthenticateRequest. message InternalAuthenticateRequest { + option (versionpb.etcd_version_msg) = "3.0"; string name = 1; string password = 2; diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go index 31e121ee0a..a9431d5254 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go @@ -72,13 +72,13 @@ func (as *InternalRaftStringer) String() string { return as.Request.String() } -// txnRequestStringer implements a custom proto String to replace value bytes fields with value size -// fields in any nested txn and put operations. +// txnRequestStringer implements fmt.Stringer, a custom proto String to replace value bytes +// fields with value size fields in any nested txn and put operations. type txnRequestStringer struct { Request *TxnRequest } -func NewLoggableTxnRequest(request *TxnRequest) *txnRequestStringer { +func NewLoggableTxnRequest(request *TxnRequest) fmt.Stringer { return &txnRequestStringer{request} } @@ -155,8 +155,8 @@ func (m *loggableValueCompare) Reset() { *m = loggableValueCompare{} } func (m *loggableValueCompare) String() string { return proto.CompactTextString(m) } func (*loggableValueCompare) ProtoMessage() {} -// loggablePutRequest implements a custom proto String to replace value bytes field with a value -// size field. +// loggablePutRequest implements proto.Message, a custom proto String to replace value bytes +// field with a value size field. // To preserve proto encoding of the key bytes, a faked out proto type is used here. type loggablePutRequest struct { Key []byte `protobuf:"bytes,1,opt,name=key,proto3"` @@ -167,7 +167,7 @@ type loggablePutRequest struct { IgnoreLease bool `protobuf:"varint,6,opt,name=ignore_lease,proto3"` } -func NewLoggablePutRequest(request *PutRequest) *loggablePutRequest { +func NewLoggablePutRequest(request *PutRequest) proto.Message { return &loggablePutRequest{ request.Key, int64(len(request.Value)), diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go index 8120907d91..42bf641db6 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go @@ -12,8 +12,10 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/golang/protobuf/proto" + _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" authpb "go.etcd.io/etcd/api/v3/authpb" mvccpb "go.etcd.io/etcd/api/v3/mvccpb" + _ "go.etcd.io/etcd/api/v3/versionpb" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -274,9 +276,10 @@ type ResponseHeader struct { ClusterId uint64 `protobuf:"varint,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // member_id is the ID of the member which sent the response. MemberId uint64 `protobuf:"varint,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` - // revision is the key-value store revision when the request was applied. + // revision is the key-value store revision when the request was applied, and it's + // unset (so 0) in case of calls not interacting with key-value store. // For watch progress responses, the header.revision indicates progress. All future events - // recieved in this stream are guaranteed to have a higher revision number than the + // received in this stream are guaranteed to have a higher revision number than the // header.revision number. Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` // raft_term is the raft term when the request was applied. @@ -526,7 +529,9 @@ type RangeResponse struct { Kvs []*mvccpb.KeyValue `protobuf:"bytes,2,rep,name=kvs,proto3" json:"kvs,omitempty"` // more indicates if there are more keys to return in the requested range. More bool `protobuf:"varint,3,opt,name=more,proto3" json:"more,omitempty"` - // count is set to the number of keys within the range when requested. + // count is set to the actual number of keys within the range when requested. + // Unlike Kvs, it is unaffected by limits and filters (e.g., Min/Max, Create/Modify, Revisions) + // and reflects the full count within the specified range. Count int64 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1630,7 +1635,9 @@ type HashKVResponse struct { // hash is the hash value computed from the responding member's MVCC keys up to a given revision. Hash uint32 `protobuf:"varint,2,opt,name=hash,proto3" json:"hash,omitempty"` // compact_revision is the compacted revision of key-value store when hash begins. - CompactRevision int64 `protobuf:"varint,3,opt,name=compact_revision,json=compactRevision,proto3" json:"compact_revision,omitempty"` + CompactRevision int64 `protobuf:"varint,3,opt,name=compact_revision,json=compactRevision,proto3" json:"compact_revision,omitempty"` + // hash_revision is the revision up to which the hash is calculated. + HashRevision int64 `protobuf:"varint,4,opt,name=hash_revision,json=hashRevision,proto3" json:"hash_revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1690,6 +1697,13 @@ func (m *HashKVResponse) GetCompactRevision() int64 { return 0 } +func (m *HashKVResponse) GetHashRevision() int64 { + if m != nil { + return m.HashRevision + } + return 0 +} + type HashResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` // hash is the hash value computed from the responding member's KV's backend. @@ -1792,7 +1806,11 @@ type SnapshotResponse struct { // remaining_bytes is the number of blob bytes to be sent after this message RemainingBytes uint64 `protobuf:"varint,2,opt,name=remaining_bytes,json=remainingBytes,proto3" json:"remaining_bytes,omitempty"` // blob contains the next chunk of the snapshot in the snapshot stream. - Blob []byte `protobuf:"bytes,3,opt,name=blob,proto3" json:"blob,omitempty"` + Blob []byte `protobuf:"bytes,3,opt,name=blob,proto3" json:"blob,omitempty"` + // local version of server that created the snapshot. + // In cluster with binaries with different version, each cluster can return different result. + // Informs which etcd server version should be used when restoring the snapshot. + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1852,6 +1870,13 @@ func (m *SnapshotResponse) GetBlob() []byte { return nil } +func (m *SnapshotResponse) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + type WatchRequest struct { // request_union is a request to either create a new watcher or cancel an existing watcher. // @@ -2176,7 +2201,8 @@ type WatchResponse struct { // the created watcher from the same stream. // All events sent to the created watcher will attach with the same watch_id. Created bool `protobuf:"varint,3,opt,name=created,proto3" json:"created,omitempty"` - // canceled is set to true if the response is for a cancel watch request. + // canceled is set to true if the response is for a cancel watch request + // or if the start_revision has already been compacted. // No further events will be sent to the canceled watcher. Canceled bool `protobuf:"varint,4,opt,name=canceled,proto3" json:"canceled,omitempty"` // compact_revision is set to the minimum index if a watcher tries to watch @@ -4165,6 +4191,57 @@ func (m *DowngradeResponse) GetVersion() string { return "" } +// DowngradeVersionTestRequest is used for test only. The version in +// this request will be read as the WAL record version.If the downgrade +// target version is less than this version, then the downgrade(online) +// or migration(offline) isn't safe, so shouldn't be allowed. +type DowngradeVersionTestRequest struct { + Ver string `protobuf:"bytes,1,opt,name=ver,proto3" json:"ver,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DowngradeVersionTestRequest) Reset() { *m = DowngradeVersionTestRequest{} } +func (m *DowngradeVersionTestRequest) String() string { return proto.CompactTextString(m) } +func (*DowngradeVersionTestRequest) ProtoMessage() {} +func (*DowngradeVersionTestRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{59} +} +func (m *DowngradeVersionTestRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DowngradeVersionTestRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DowngradeVersionTestRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DowngradeVersionTestRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DowngradeVersionTestRequest.Merge(m, src) +} +func (m *DowngradeVersionTestRequest) XXX_Size() int { + return m.Size() +} +func (m *DowngradeVersionTestRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DowngradeVersionTestRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DowngradeVersionTestRequest proto.InternalMessageInfo + +func (m *DowngradeVersionTestRequest) GetVer() string { + if m != nil { + return m.Ver + } + return "" +} + type StatusRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -4175,7 +4252,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{59} + return fileDescriptor_77a6da22d6a3feb1, []int{60} } func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4223,17 +4300,23 @@ type StatusResponse struct { // dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member. DbSizeInUse int64 `protobuf:"varint,9,opt,name=dbSizeInUse,proto3" json:"dbSizeInUse,omitempty"` // isLearner indicates if the member is raft learner. - IsLearner bool `protobuf:"varint,10,opt,name=isLearner,proto3" json:"isLearner,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + IsLearner bool `protobuf:"varint,10,opt,name=isLearner,proto3" json:"isLearner,omitempty"` + // storageVersion is the version of the db file. It might be updated with delay in relationship to the target cluster version. + StorageVersion string `protobuf:"bytes,11,opt,name=storageVersion,proto3" json:"storageVersion,omitempty"` + // dbSizeQuota is the configured etcd storage quota in bytes (the value passed to etcd instance by flag --quota-backend-bytes) + DbSizeQuota int64 `protobuf:"varint,12,opt,name=dbSizeQuota,proto3" json:"dbSizeQuota,omitempty"` + // downgradeInfo indicates if there is downgrade process. + DowngradeInfo *DowngradeInfo `protobuf:"bytes,13,opt,name=downgradeInfo,proto3" json:"downgradeInfo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (*StatusResponse) ProtoMessage() {} func (*StatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{60} + return fileDescriptor_77a6da22d6a3feb1, []int{61} } func (m *StatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4332,6 +4415,84 @@ func (m *StatusResponse) GetIsLearner() bool { return false } +func (m *StatusResponse) GetStorageVersion() string { + if m != nil { + return m.StorageVersion + } + return "" +} + +func (m *StatusResponse) GetDbSizeQuota() int64 { + if m != nil { + return m.DbSizeQuota + } + return 0 +} + +func (m *StatusResponse) GetDowngradeInfo() *DowngradeInfo { + if m != nil { + return m.DowngradeInfo + } + return nil +} + +type DowngradeInfo struct { + // enabled indicates whether the cluster is enabled to downgrade. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // targetVersion is the target downgrade version. + TargetVersion string `protobuf:"bytes,2,opt,name=targetVersion,proto3" json:"targetVersion,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DowngradeInfo) Reset() { *m = DowngradeInfo{} } +func (m *DowngradeInfo) String() string { return proto.CompactTextString(m) } +func (*DowngradeInfo) ProtoMessage() {} +func (*DowngradeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{62} +} +func (m *DowngradeInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DowngradeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DowngradeInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DowngradeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_DowngradeInfo.Merge(m, src) +} +func (m *DowngradeInfo) XXX_Size() int { + return m.Size() +} +func (m *DowngradeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_DowngradeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_DowngradeInfo proto.InternalMessageInfo + +func (m *DowngradeInfo) GetEnabled() bool { + if m != nil { + return m.Enabled + } + return false +} + +func (m *DowngradeInfo) GetTargetVersion() string { + if m != nil { + return m.TargetVersion + } + return "" +} + type AuthEnableRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -4342,7 +4503,7 @@ func (m *AuthEnableRequest) Reset() { *m = AuthEnableRequest{} } func (m *AuthEnableRequest) String() string { return proto.CompactTextString(m) } func (*AuthEnableRequest) ProtoMessage() {} func (*AuthEnableRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{61} + return fileDescriptor_77a6da22d6a3feb1, []int{63} } func (m *AuthEnableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4381,7 +4542,7 @@ func (m *AuthDisableRequest) Reset() { *m = AuthDisableRequest{} } func (m *AuthDisableRequest) String() string { return proto.CompactTextString(m) } func (*AuthDisableRequest) ProtoMessage() {} func (*AuthDisableRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{62} + return fileDescriptor_77a6da22d6a3feb1, []int{64} } func (m *AuthDisableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4420,7 +4581,7 @@ func (m *AuthStatusRequest) Reset() { *m = AuthStatusRequest{} } func (m *AuthStatusRequest) String() string { return proto.CompactTextString(m) } func (*AuthStatusRequest) ProtoMessage() {} func (*AuthStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{63} + return fileDescriptor_77a6da22d6a3feb1, []int{65} } func (m *AuthStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4461,7 +4622,7 @@ func (m *AuthenticateRequest) Reset() { *m = AuthenticateRequest{} } func (m *AuthenticateRequest) String() string { return proto.CompactTextString(m) } func (*AuthenticateRequest) ProtoMessage() {} func (*AuthenticateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{64} + return fileDescriptor_77a6da22d6a3feb1, []int{66} } func (m *AuthenticateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4518,7 +4679,7 @@ func (m *AuthUserAddRequest) Reset() { *m = AuthUserAddRequest{} } func (m *AuthUserAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserAddRequest) ProtoMessage() {} func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{65} + return fileDescriptor_77a6da22d6a3feb1, []int{67} } func (m *AuthUserAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4586,7 +4747,7 @@ func (m *AuthUserGetRequest) Reset() { *m = AuthUserGetRequest{} } func (m *AuthUserGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGetRequest) ProtoMessage() {} func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{66} + return fileDescriptor_77a6da22d6a3feb1, []int{68} } func (m *AuthUserGetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4634,7 +4795,7 @@ func (m *AuthUserDeleteRequest) Reset() { *m = AuthUserDeleteRequest{} } func (m *AuthUserDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteRequest) ProtoMessage() {} func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{67} + return fileDescriptor_77a6da22d6a3feb1, []int{69} } func (m *AuthUserDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4686,7 +4847,7 @@ func (m *AuthUserChangePasswordRequest) Reset() { *m = AuthUserChangePas func (m *AuthUserChangePasswordRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordRequest) ProtoMessage() {} func (*AuthUserChangePasswordRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{68} + return fileDescriptor_77a6da22d6a3feb1, []int{70} } func (m *AuthUserChangePasswordRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4750,7 +4911,7 @@ func (m *AuthUserGrantRoleRequest) Reset() { *m = AuthUserGrantRoleReque func (m *AuthUserGrantRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleRequest) ProtoMessage() {} func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{69} + return fileDescriptor_77a6da22d6a3feb1, []int{71} } func (m *AuthUserGrantRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4805,7 +4966,7 @@ func (m *AuthUserRevokeRoleRequest) Reset() { *m = AuthUserRevokeRoleReq func (m *AuthUserRevokeRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleRequest) ProtoMessage() {} func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{70} + return fileDescriptor_77a6da22d6a3feb1, []int{72} } func (m *AuthUserRevokeRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4860,7 +5021,7 @@ func (m *AuthRoleAddRequest) Reset() { *m = AuthRoleAddRequest{} } func (m *AuthRoleAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddRequest) ProtoMessage() {} func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{71} + return fileDescriptor_77a6da22d6a3feb1, []int{73} } func (m *AuthRoleAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4907,7 +5068,7 @@ func (m *AuthRoleGetRequest) Reset() { *m = AuthRoleGetRequest{} } func (m *AuthRoleGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetRequest) ProtoMessage() {} func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{72} + return fileDescriptor_77a6da22d6a3feb1, []int{74} } func (m *AuthRoleGetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4953,7 +5114,7 @@ func (m *AuthUserListRequest) Reset() { *m = AuthUserListRequest{} } func (m *AuthUserListRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserListRequest) ProtoMessage() {} func (*AuthUserListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{73} + return fileDescriptor_77a6da22d6a3feb1, []int{75} } func (m *AuthUserListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4992,7 +5153,7 @@ func (m *AuthRoleListRequest) Reset() { *m = AuthRoleListRequest{} } func (m *AuthRoleListRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleListRequest) ProtoMessage() {} func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{74} + return fileDescriptor_77a6da22d6a3feb1, []int{76} } func (m *AuthRoleListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5032,7 +5193,7 @@ func (m *AuthRoleDeleteRequest) Reset() { *m = AuthRoleDeleteRequest{} } func (m *AuthRoleDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteRequest) ProtoMessage() {} func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{75} + return fileDescriptor_77a6da22d6a3feb1, []int{77} } func (m *AuthRoleDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5082,7 +5243,7 @@ func (m *AuthRoleGrantPermissionRequest) Reset() { *m = AuthRoleGrantPer func (m *AuthRoleGrantPermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionRequest) ProtoMessage() {} func (*AuthRoleGrantPermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{76} + return fileDescriptor_77a6da22d6a3feb1, []int{78} } func (m *AuthRoleGrantPermissionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5138,7 +5299,7 @@ func (m *AuthRoleRevokePermissionRequest) Reset() { *m = AuthRoleRevokeP func (m *AuthRoleRevokePermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionRequest) ProtoMessage() {} func (*AuthRoleRevokePermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{77} + return fileDescriptor_77a6da22d6a3feb1, []int{79} } func (m *AuthRoleRevokePermissionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5199,7 +5360,7 @@ func (m *AuthEnableResponse) Reset() { *m = AuthEnableResponse{} } func (m *AuthEnableResponse) String() string { return proto.CompactTextString(m) } func (*AuthEnableResponse) ProtoMessage() {} func (*AuthEnableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{78} + return fileDescriptor_77a6da22d6a3feb1, []int{80} } func (m *AuthEnableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5246,7 +5407,7 @@ func (m *AuthDisableResponse) Reset() { *m = AuthDisableResponse{} } func (m *AuthDisableResponse) String() string { return proto.CompactTextString(m) } func (*AuthDisableResponse) ProtoMessage() {} func (*AuthDisableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{79} + return fileDescriptor_77a6da22d6a3feb1, []int{81} } func (m *AuthDisableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5296,7 +5457,7 @@ func (m *AuthStatusResponse) Reset() { *m = AuthStatusResponse{} } func (m *AuthStatusResponse) String() string { return proto.CompactTextString(m) } func (*AuthStatusResponse) ProtoMessage() {} func (*AuthStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{80} + return fileDescriptor_77a6da22d6a3feb1, []int{82} } func (m *AuthStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5359,7 +5520,7 @@ func (m *AuthenticateResponse) Reset() { *m = AuthenticateResponse{} } func (m *AuthenticateResponse) String() string { return proto.CompactTextString(m) } func (*AuthenticateResponse) ProtoMessage() {} func (*AuthenticateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{81} + return fileDescriptor_77a6da22d6a3feb1, []int{83} } func (m *AuthenticateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5413,7 +5574,7 @@ func (m *AuthUserAddResponse) Reset() { *m = AuthUserAddResponse{} } func (m *AuthUserAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserAddResponse) ProtoMessage() {} func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{82} + return fileDescriptor_77a6da22d6a3feb1, []int{84} } func (m *AuthUserAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5461,7 +5622,7 @@ func (m *AuthUserGetResponse) Reset() { *m = AuthUserGetResponse{} } func (m *AuthUserGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGetResponse) ProtoMessage() {} func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{83} + return fileDescriptor_77a6da22d6a3feb1, []int{85} } func (m *AuthUserGetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5515,7 +5676,7 @@ func (m *AuthUserDeleteResponse) Reset() { *m = AuthUserDeleteResponse{} func (m *AuthUserDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteResponse) ProtoMessage() {} func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{84} + return fileDescriptor_77a6da22d6a3feb1, []int{86} } func (m *AuthUserDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5562,7 +5723,7 @@ func (m *AuthUserChangePasswordResponse) Reset() { *m = AuthUserChangePa func (m *AuthUserChangePasswordResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordResponse) ProtoMessage() {} func (*AuthUserChangePasswordResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{85} + return fileDescriptor_77a6da22d6a3feb1, []int{87} } func (m *AuthUserChangePasswordResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5609,7 +5770,7 @@ func (m *AuthUserGrantRoleResponse) Reset() { *m = AuthUserGrantRoleResp func (m *AuthUserGrantRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleResponse) ProtoMessage() {} func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{86} + return fileDescriptor_77a6da22d6a3feb1, []int{88} } func (m *AuthUserGrantRoleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5656,7 +5817,7 @@ func (m *AuthUserRevokeRoleResponse) Reset() { *m = AuthUserRevokeRoleRe func (m *AuthUserRevokeRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleResponse) ProtoMessage() {} func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{87} + return fileDescriptor_77a6da22d6a3feb1, []int{89} } func (m *AuthUserRevokeRoleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5703,7 +5864,7 @@ func (m *AuthRoleAddResponse) Reset() { *m = AuthRoleAddResponse{} } func (m *AuthRoleAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddResponse) ProtoMessage() {} func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{88} + return fileDescriptor_77a6da22d6a3feb1, []int{90} } func (m *AuthRoleAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5751,7 +5912,7 @@ func (m *AuthRoleGetResponse) Reset() { *m = AuthRoleGetResponse{} } func (m *AuthRoleGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetResponse) ProtoMessage() {} func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{89} + return fileDescriptor_77a6da22d6a3feb1, []int{91} } func (m *AuthRoleGetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5806,7 +5967,7 @@ func (m *AuthRoleListResponse) Reset() { *m = AuthRoleListResponse{} } func (m *AuthRoleListResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleListResponse) ProtoMessage() {} func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{90} + return fileDescriptor_77a6da22d6a3feb1, []int{92} } func (m *AuthRoleListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5861,7 +6022,7 @@ func (m *AuthUserListResponse) Reset() { *m = AuthUserListResponse{} } func (m *AuthUserListResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserListResponse) ProtoMessage() {} func (*AuthUserListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{91} + return fileDescriptor_77a6da22d6a3feb1, []int{93} } func (m *AuthUserListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5915,7 +6076,7 @@ func (m *AuthRoleDeleteResponse) Reset() { *m = AuthRoleDeleteResponse{} func (m *AuthRoleDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteResponse) ProtoMessage() {} func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{92} + return fileDescriptor_77a6da22d6a3feb1, []int{94} } func (m *AuthRoleDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5962,7 +6123,7 @@ func (m *AuthRoleGrantPermissionResponse) Reset() { *m = AuthRoleGrantPe func (m *AuthRoleGrantPermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionResponse) ProtoMessage() {} func (*AuthRoleGrantPermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{93} + return fileDescriptor_77a6da22d6a3feb1, []int{95} } func (m *AuthRoleGrantPermissionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6009,7 +6170,7 @@ func (m *AuthRoleRevokePermissionResponse) Reset() { *m = AuthRoleRevoke func (m *AuthRoleRevokePermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionResponse) ProtoMessage() {} func (*AuthRoleRevokePermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{94} + return fileDescriptor_77a6da22d6a3feb1, []int{96} } func (m *AuthRoleRevokePermissionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6113,8 +6274,10 @@ func init() { proto.RegisterType((*AlarmResponse)(nil), "etcdserverpb.AlarmResponse") proto.RegisterType((*DowngradeRequest)(nil), "etcdserverpb.DowngradeRequest") proto.RegisterType((*DowngradeResponse)(nil), "etcdserverpb.DowngradeResponse") + proto.RegisterType((*DowngradeVersionTestRequest)(nil), "etcdserverpb.DowngradeVersionTestRequest") proto.RegisterType((*StatusRequest)(nil), "etcdserverpb.StatusRequest") proto.RegisterType((*StatusResponse)(nil), "etcdserverpb.StatusResponse") + proto.RegisterType((*DowngradeInfo)(nil), "etcdserverpb.DowngradeInfo") proto.RegisterType((*AuthEnableRequest)(nil), "etcdserverpb.AuthEnableRequest") proto.RegisterType((*AuthDisableRequest)(nil), "etcdserverpb.AuthDisableRequest") proto.RegisterType((*AuthStatusRequest)(nil), "etcdserverpb.AuthStatusRequest") @@ -6154,264 +6317,293 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 4110 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xdd, 0x73, 0x1b, 0xc9, - 0x71, 0xe7, 0x02, 0x24, 0x01, 0x34, 0x3e, 0x08, 0x0e, 0x29, 0x0a, 0xc2, 0x49, 0x14, 0x6f, 0x74, - 0xd2, 0xf1, 0xa4, 0x3b, 0xe2, 0x4c, 0xdb, 0xb9, 0x2a, 0x25, 0x71, 0x0c, 0x91, 0x38, 0x89, 0x47, - 0x8a, 0xe4, 0x2d, 0x21, 0xdd, 0x47, 0xb9, 0xc2, 0x5a, 0x02, 0x23, 0x72, 0x43, 0x60, 0x17, 0xde, - 0x5d, 0x40, 0xe4, 0xe5, 0xc3, 0x2e, 0x97, 0xe3, 0x4a, 0x5e, 0xed, 0xaa, 0x54, 0xf2, 0x90, 0xbc, - 0xa4, 0x52, 0x2e, 0x3f, 0xf8, 0x39, 0xff, 0x42, 0x9e, 0xf2, 0x51, 0xf9, 0x07, 0x52, 0x17, 0xbf, - 0x24, 0x7f, 0x85, 0x6b, 0xbe, 0x76, 0x67, 0xf6, 0x83, 0x92, 0x8d, 0xbb, 0x7b, 0x11, 0x31, 0x3d, - 0x3d, 0xfd, 0xeb, 0xe9, 0x99, 0xe9, 0xee, 0xe9, 0x59, 0x41, 0xc9, 0x1b, 0xf5, 0x36, 0x46, 0x9e, - 0x1b, 0xb8, 0xa8, 0x42, 0x82, 0x5e, 0xdf, 0x27, 0xde, 0x84, 0x78, 0xa3, 0x93, 0xe6, 0xf2, 0xa9, - 0x7b, 0xea, 0xb2, 0x8e, 0x16, 0xfd, 0xc5, 0x79, 0x9a, 0x0d, 0xca, 0xd3, 0xb2, 0x46, 0x76, 0x6b, - 0x38, 0xe9, 0xf5, 0x46, 0x27, 0xad, 0xf3, 0x89, 0xe8, 0x69, 0x86, 0x3d, 0xd6, 0x38, 0x38, 0x1b, - 0x9d, 0xb0, 0x3f, 0xa2, 0xef, 0xe6, 0xa9, 0xeb, 0x9e, 0x0e, 0x08, 0xef, 0x75, 0x1c, 0x37, 0xb0, - 0x02, 0xdb, 0x75, 0x7c, 0xde, 0x8b, 0xff, 0xda, 0x80, 0x9a, 0x49, 0xfc, 0x91, 0xeb, 0xf8, 0xe4, - 0x09, 0xb1, 0xfa, 0xc4, 0x43, 0xb7, 0x00, 0x7a, 0x83, 0xb1, 0x1f, 0x10, 0xef, 0xd8, 0xee, 0x37, - 0x8c, 0x35, 0x63, 0x7d, 0xd6, 0x2c, 0x09, 0xca, 0x4e, 0x1f, 0xbd, 0x01, 0xa5, 0x21, 0x19, 0x9e, - 0xf0, 0xde, 0x1c, 0xeb, 0x2d, 0x72, 0xc2, 0x4e, 0x1f, 0x35, 0xa1, 0xe8, 0x91, 0x89, 0xed, 0xdb, - 0xae, 0xd3, 0xc8, 0xaf, 0x19, 0xeb, 0x79, 0x33, 0x6c, 0xd3, 0x81, 0x9e, 0xf5, 0x22, 0x38, 0x0e, - 0x88, 0x37, 0x6c, 0xcc, 0xf2, 0x81, 0x94, 0xd0, 0x25, 0xde, 0x10, 0xff, 0x74, 0x0e, 0x2a, 0xa6, - 0xe5, 0x9c, 0x12, 0x93, 0xfc, 0x70, 0x4c, 0xfc, 0x00, 0xd5, 0x21, 0x7f, 0x4e, 0x2e, 0x19, 0x7c, - 0xc5, 0xa4, 0x3f, 0xf9, 0x78, 0xe7, 0x94, 0x1c, 0x13, 0x87, 0x03, 0x57, 0xe8, 0x78, 0xe7, 0x94, - 0x74, 0x9c, 0x3e, 0x5a, 0x86, 0xb9, 0x81, 0x3d, 0xb4, 0x03, 0x81, 0xca, 0x1b, 0x9a, 0x3a, 0xb3, - 0x31, 0x75, 0xb6, 0x00, 0x7c, 0xd7, 0x0b, 0x8e, 0x5d, 0xaf, 0x4f, 0xbc, 0xc6, 0xdc, 0x9a, 0xb1, - 0x5e, 0xdb, 0x7c, 0x6b, 0x43, 0x5d, 0x86, 0x0d, 0x55, 0xa1, 0x8d, 0x23, 0xd7, 0x0b, 0x0e, 0x28, - 0xaf, 0x59, 0xf2, 0xe5, 0x4f, 0xf4, 0x21, 0x94, 0x99, 0x90, 0xc0, 0xf2, 0x4e, 0x49, 0xd0, 0x98, - 0x67, 0x52, 0xee, 0xbe, 0x42, 0x4a, 0x97, 0x31, 0x9b, 0x0c, 0x9e, 0xff, 0x46, 0x18, 0x2a, 0x3e, - 0xf1, 0x6c, 0x6b, 0x60, 0x7f, 0x61, 0x9d, 0x0c, 0x48, 0xa3, 0xb0, 0x66, 0xac, 0x17, 0x4d, 0x8d, - 0x46, 0xe7, 0x7f, 0x4e, 0x2e, 0xfd, 0x63, 0xd7, 0x19, 0x5c, 0x36, 0x8a, 0x8c, 0xa1, 0x48, 0x09, - 0x07, 0xce, 0xe0, 0x92, 0x2d, 0x9a, 0x3b, 0x76, 0x02, 0xde, 0x5b, 0x62, 0xbd, 0x25, 0x46, 0x61, - 0xdd, 0xeb, 0x50, 0x1f, 0xda, 0xce, 0xf1, 0xd0, 0xed, 0x1f, 0x87, 0x06, 0x01, 0x66, 0x90, 0xda, - 0xd0, 0x76, 0x9e, 0xba, 0x7d, 0x53, 0x9a, 0x85, 0x72, 0x5a, 0x17, 0x3a, 0x67, 0x59, 0x70, 0x5a, - 0x17, 0x2a, 0xe7, 0x06, 0x2c, 0x51, 0x99, 0x3d, 0x8f, 0x58, 0x01, 0x89, 0x98, 0x2b, 0x8c, 0x79, - 0x71, 0x68, 0x3b, 0x5b, 0xac, 0x47, 0xe3, 0xb7, 0x2e, 0x12, 0xfc, 0x55, 0xc1, 0x6f, 0x5d, 0xe8, - 0xfc, 0x78, 0x03, 0x4a, 0xa1, 0xcd, 0x51, 0x11, 0x66, 0xf7, 0x0f, 0xf6, 0x3b, 0xf5, 0x19, 0x04, - 0x30, 0xdf, 0x3e, 0xda, 0xea, 0xec, 0x6f, 0xd7, 0x0d, 0x54, 0x86, 0xc2, 0x76, 0x87, 0x37, 0x72, - 0xf8, 0x11, 0x40, 0x64, 0x5d, 0x54, 0x80, 0xfc, 0x6e, 0xe7, 0xb3, 0xfa, 0x0c, 0xe5, 0x79, 0xde, - 0x31, 0x8f, 0x76, 0x0e, 0xf6, 0xeb, 0x06, 0x1d, 0xbc, 0x65, 0x76, 0xda, 0xdd, 0x4e, 0x3d, 0x47, - 0x39, 0x9e, 0x1e, 0x6c, 0xd7, 0xf3, 0xa8, 0x04, 0x73, 0xcf, 0xdb, 0x7b, 0xcf, 0x3a, 0xf5, 0x59, - 0xfc, 0x0b, 0x03, 0xaa, 0x62, 0xbd, 0xf8, 0x99, 0x40, 0xdf, 0x81, 0xf9, 0x33, 0x76, 0x2e, 0xd8, - 0x56, 0x2c, 0x6f, 0xde, 0x8c, 0x2d, 0xae, 0x76, 0x76, 0x4c, 0xc1, 0x8b, 0x30, 0xe4, 0xcf, 0x27, - 0x7e, 0x23, 0xb7, 0x96, 0x5f, 0x2f, 0x6f, 0xd6, 0x37, 0xf8, 0x79, 0xdd, 0xd8, 0x25, 0x97, 0xcf, - 0xad, 0xc1, 0x98, 0x98, 0xb4, 0x13, 0x21, 0x98, 0x1d, 0xba, 0x1e, 0x61, 0x3b, 0xb6, 0x68, 0xb2, - 0xdf, 0x74, 0x1b, 0xb3, 0x45, 0x13, 0xbb, 0x95, 0x37, 0xf0, 0xaf, 0x0c, 0x80, 0xc3, 0x71, 0x90, - 0x7d, 0x34, 0x96, 0x61, 0x6e, 0x42, 0x05, 0x8b, 0x63, 0xc1, 0x1b, 0xec, 0x4c, 0x10, 0xcb, 0x27, - 0xe1, 0x99, 0xa0, 0x0d, 0x74, 0x1d, 0x0a, 0x23, 0x8f, 0x4c, 0x8e, 0xcf, 0x27, 0x0c, 0xa4, 0x68, - 0xce, 0xd3, 0xe6, 0xee, 0x04, 0xbd, 0x09, 0x15, 0xfb, 0xd4, 0x71, 0x3d, 0x72, 0xcc, 0x65, 0xcd, - 0xb1, 0xde, 0x32, 0xa7, 0x31, 0xbd, 0x15, 0x16, 0x2e, 0x78, 0x5e, 0x65, 0xd9, 0xa3, 0x24, 0xec, - 0x40, 0x99, 0xa9, 0x3a, 0x95, 0xf9, 0xde, 0x89, 0x74, 0xcc, 0xb1, 0x61, 0x49, 0x13, 0x0a, 0xad, - 0xf1, 0x0f, 0x00, 0x6d, 0x93, 0x01, 0x09, 0xc8, 0x34, 0xde, 0x43, 0xb1, 0x49, 0x5e, 0xb5, 0x09, - 0xfe, 0xb9, 0x01, 0x4b, 0x9a, 0xf8, 0xa9, 0xa6, 0xd5, 0x80, 0x42, 0x9f, 0x09, 0xe3, 0x1a, 0xe4, - 0x4d, 0xd9, 0x44, 0x0f, 0xa0, 0x28, 0x14, 0xf0, 0x1b, 0xf9, 0x8c, 0x4d, 0x53, 0xe0, 0x3a, 0xf9, - 0xf8, 0x57, 0x39, 0x28, 0x89, 0x89, 0x1e, 0x8c, 0x50, 0x1b, 0xaa, 0x1e, 0x6f, 0x1c, 0xb3, 0xf9, - 0x08, 0x8d, 0x9a, 0xd9, 0x4e, 0xe8, 0xc9, 0x8c, 0x59, 0x11, 0x43, 0x18, 0x19, 0xfd, 0x21, 0x94, - 0xa5, 0x88, 0xd1, 0x38, 0x10, 0x26, 0x6f, 0xe8, 0x02, 0xa2, 0xfd, 0xf7, 0x64, 0xc6, 0x04, 0xc1, - 0x7e, 0x38, 0x0e, 0x50, 0x17, 0x96, 0xe5, 0x60, 0x3e, 0x1b, 0xa1, 0x46, 0x9e, 0x49, 0x59, 0xd3, - 0xa5, 0x24, 0x97, 0xea, 0xc9, 0x8c, 0x89, 0xc4, 0x78, 0xa5, 0x53, 0x55, 0x29, 0xb8, 0xe0, 0xce, - 0x3b, 0xa1, 0x52, 0xf7, 0xc2, 0x49, 0xaa, 0xd4, 0xbd, 0x70, 0x1e, 0x95, 0xa0, 0x20, 0x5a, 0xf8, - 0x5f, 0x73, 0x00, 0x72, 0x35, 0x0e, 0x46, 0x68, 0x1b, 0x6a, 0x9e, 0x68, 0x69, 0xd6, 0x7a, 0x23, - 0xd5, 0x5a, 0x62, 0x11, 0x67, 0xcc, 0xaa, 0x1c, 0xc4, 0x95, 0xfb, 0x1e, 0x54, 0x42, 0x29, 0x91, - 0xc1, 0x6e, 0xa4, 0x18, 0x2c, 0x94, 0x50, 0x96, 0x03, 0xa8, 0xc9, 0x3e, 0x81, 0x6b, 0xe1, 0xf8, - 0x14, 0x9b, 0xbd, 0x79, 0x85, 0xcd, 0x42, 0x81, 0x4b, 0x52, 0x82, 0x6a, 0x35, 0x55, 0xb1, 0xc8, - 0x6c, 0x37, 0x52, 0xcc, 0x96, 0x54, 0x8c, 0x1a, 0x0e, 0x68, 0xbc, 0xe4, 0x4d, 0xfc, 0x7f, 0x79, - 0x28, 0x6c, 0xb9, 0xc3, 0x91, 0xe5, 0xd1, 0xd5, 0x98, 0xf7, 0x88, 0x3f, 0x1e, 0x04, 0xcc, 0x5c, - 0xb5, 0xcd, 0x3b, 0xba, 0x44, 0xc1, 0x26, 0xff, 0x9a, 0x8c, 0xd5, 0x14, 0x43, 0xe8, 0x60, 0x11, - 0x1e, 0x73, 0xaf, 0x31, 0x58, 0x04, 0x47, 0x31, 0x44, 0x1e, 0xe4, 0x7c, 0x74, 0x90, 0x9b, 0x50, - 0x98, 0x10, 0x2f, 0x0a, 0xe9, 0x4f, 0x66, 0x4c, 0x49, 0x40, 0xef, 0xc0, 0x42, 0x3c, 0xbc, 0xcc, - 0x09, 0x9e, 0x5a, 0x4f, 0x8f, 0x46, 0x77, 0xa0, 0xa2, 0xc5, 0xb8, 0x79, 0xc1, 0x57, 0x1e, 0x2a, - 0x21, 0x6e, 0x45, 0xfa, 0x55, 0x1a, 0x8f, 0x2b, 0x4f, 0x66, 0xa4, 0x67, 0x5d, 0x91, 0x9e, 0xb5, - 0x28, 0x46, 0x09, 0xdf, 0xaa, 0x39, 0x99, 0xef, 0xeb, 0x4e, 0x06, 0x7f, 0x1f, 0xaa, 0x9a, 0x81, - 0x68, 0xdc, 0xe9, 0x7c, 0xfc, 0xac, 0xbd, 0xc7, 0x83, 0xd4, 0x63, 0x16, 0x97, 0xcc, 0xba, 0x41, - 0x63, 0xdd, 0x5e, 0xe7, 0xe8, 0xa8, 0x9e, 0x43, 0x55, 0x28, 0xed, 0x1f, 0x74, 0x8f, 0x39, 0x57, - 0x1e, 0x3f, 0x0e, 0x25, 0x88, 0x20, 0xa7, 0xc4, 0xb6, 0x19, 0x25, 0xb6, 0x19, 0x32, 0xb6, 0xe5, - 0xa2, 0xd8, 0xc6, 0xc2, 0xdc, 0x5e, 0xa7, 0x7d, 0xd4, 0xa9, 0xcf, 0x3e, 0xaa, 0x41, 0x85, 0xdb, - 0xf7, 0x78, 0xec, 0xd0, 0x50, 0xfb, 0xcf, 0x06, 0x40, 0x74, 0x9a, 0x50, 0x0b, 0x0a, 0x3d, 0x8e, - 0xd3, 0x30, 0x98, 0x33, 0xba, 0x96, 0xba, 0x64, 0xa6, 0xe4, 0x42, 0xdf, 0x82, 0x82, 0x3f, 0xee, - 0xf5, 0x88, 0x2f, 0x43, 0xde, 0xf5, 0xb8, 0x3f, 0x14, 0xde, 0xca, 0x94, 0x7c, 0x74, 0xc8, 0x0b, - 0xcb, 0x1e, 0x8c, 0x59, 0x00, 0xbc, 0x7a, 0x88, 0xe0, 0xc3, 0xff, 0x60, 0x40, 0x59, 0xd9, 0xbc, - 0xbf, 0xa7, 0x13, 0xbe, 0x09, 0x25, 0xa6, 0x03, 0xe9, 0x0b, 0x37, 0x5c, 0x34, 0x23, 0x02, 0xfa, - 0x03, 0x28, 0xc9, 0x13, 0x20, 0x3d, 0x71, 0x23, 0x5d, 0xec, 0xc1, 0xc8, 0x8c, 0x58, 0xf1, 0x2e, - 0x2c, 0x32, 0xab, 0xf4, 0x68, 0x72, 0x2d, 0xed, 0xa8, 0xa6, 0x9f, 0x46, 0x2c, 0xfd, 0x6c, 0x42, - 0x71, 0x74, 0x76, 0xe9, 0xdb, 0x3d, 0x6b, 0x20, 0xb4, 0x08, 0xdb, 0xf8, 0x23, 0x40, 0xaa, 0xb0, - 0x69, 0xa6, 0x8b, 0xab, 0x50, 0x7e, 0x62, 0xf9, 0x67, 0x42, 0x25, 0xfc, 0x00, 0xaa, 0xb4, 0xb9, - 0xfb, 0xfc, 0x35, 0x74, 0x64, 0x97, 0x03, 0xc9, 0x3d, 0x95, 0xcd, 0x11, 0xcc, 0x9e, 0x59, 0xfe, - 0x19, 0x9b, 0x68, 0xd5, 0x64, 0xbf, 0xd1, 0x3b, 0x50, 0xef, 0xf1, 0x49, 0x1e, 0xc7, 0xae, 0x0c, - 0x0b, 0x82, 0x1e, 0x66, 0x82, 0x9f, 0x42, 0x85, 0xcf, 0xe1, 0xab, 0x56, 0x02, 0x2f, 0xc2, 0xc2, - 0x91, 0x63, 0x8d, 0xfc, 0x33, 0x57, 0x46, 0x37, 0x3a, 0xe9, 0x7a, 0x44, 0x9b, 0x0a, 0xf1, 0x6d, - 0x58, 0xf0, 0xc8, 0xd0, 0xb2, 0x1d, 0xdb, 0x39, 0x3d, 0x3e, 0xb9, 0x0c, 0x88, 0x2f, 0x2e, 0x4c, - 0xb5, 0x90, 0xfc, 0x88, 0x52, 0xa9, 0x6a, 0x27, 0x03, 0xf7, 0x44, 0xb8, 0x39, 0xf6, 0x1b, 0xff, - 0x2c, 0x07, 0x95, 0x4f, 0xac, 0xa0, 0x27, 0x97, 0x0e, 0xed, 0x40, 0x2d, 0x74, 0x6e, 0x8c, 0x22, - 0x74, 0x89, 0x85, 0x58, 0x36, 0x46, 0xa6, 0xd2, 0x32, 0x3a, 0x56, 0x7b, 0x2a, 0x81, 0x89, 0xb2, - 0x9c, 0x1e, 0x19, 0x84, 0xa2, 0x72, 0xd9, 0xa2, 0x18, 0xa3, 0x2a, 0x4a, 0x25, 0xa0, 0x03, 0xa8, - 0x8f, 0x3c, 0xf7, 0xd4, 0x23, 0xbe, 0x1f, 0x0a, 0xe3, 0x61, 0x0c, 0xa7, 0x08, 0x3b, 0x14, 0xac, - 0x91, 0xb8, 0x85, 0x91, 0x4e, 0x7a, 0xb4, 0x10, 0xe5, 0x33, 0xdc, 0x39, 0xfd, 0x57, 0x0e, 0x50, - 0x72, 0x52, 0xbf, 0x6b, 0x8a, 0x77, 0x17, 0x6a, 0x7e, 0x60, 0x79, 0x89, 0xcd, 0x56, 0x65, 0xd4, - 0xd0, 0xe3, 0xbf, 0x0d, 0xa1, 0x42, 0xc7, 0x8e, 0x1b, 0xd8, 0x2f, 0x2e, 0x45, 0x96, 0x5c, 0x93, - 0xe4, 0x7d, 0x46, 0x45, 0x1d, 0x28, 0xbc, 0xb0, 0x07, 0x01, 0xf1, 0xfc, 0xc6, 0xdc, 0x5a, 0x7e, - 0xbd, 0xb6, 0xf9, 0xe0, 0x55, 0xcb, 0xb0, 0xf1, 0x21, 0xe3, 0xef, 0x5e, 0x8e, 0x88, 0x29, 0xc7, - 0xaa, 0x99, 0xe7, 0xbc, 0x96, 0x8d, 0xdf, 0x80, 0xe2, 0x4b, 0x2a, 0x82, 0xde, 0xb2, 0x0b, 0x3c, - 0x59, 0x64, 0x6d, 0x7e, 0xc9, 0x7e, 0xe1, 0x59, 0xa7, 0x43, 0xe2, 0x04, 0xf2, 0x1e, 0x28, 0xdb, - 0xf8, 0x2e, 0x40, 0x04, 0x43, 0x5d, 0xfe, 0xfe, 0xc1, 0xe1, 0xb3, 0x6e, 0x7d, 0x06, 0x55, 0xa0, - 0xb8, 0x7f, 0xb0, 0xdd, 0xd9, 0xeb, 0xd0, 0xf8, 0x80, 0x5b, 0xd2, 0xa4, 0xda, 0x5a, 0xaa, 0x98, - 0x86, 0x86, 0x89, 0x57, 0x60, 0x39, 0x6d, 0x01, 0x69, 0x2e, 0x5a, 0x15, 0xbb, 0x74, 0xaa, 0xa3, - 0xa2, 0x42, 0xe7, 0xf4, 0xe9, 0x36, 0xa0, 0xc0, 0x77, 0x6f, 0x5f, 0x24, 0xe7, 0xb2, 0x49, 0x0d, - 0xc1, 0x37, 0x23, 0xe9, 0x8b, 0x55, 0x0a, 0xdb, 0xa9, 0xee, 0x65, 0x2e, 0xd5, 0xbd, 0xa0, 0x3b, - 0x50, 0x0d, 0x4f, 0x83, 0xe5, 0x8b, 0x5c, 0xa0, 0x64, 0x56, 0xe4, 0x46, 0xa7, 0x34, 0xcd, 0xe8, - 0x05, 0xdd, 0xe8, 0xe8, 0x2e, 0xcc, 0x93, 0x09, 0x71, 0x02, 0xbf, 0x51, 0x66, 0x11, 0xa3, 0x2a, - 0x73, 0xf7, 0x0e, 0xa5, 0x9a, 0xa2, 0x13, 0x7f, 0x17, 0x16, 0xd9, 0x1d, 0xe9, 0xb1, 0x67, 0x39, - 0xea, 0x65, 0xae, 0xdb, 0xdd, 0x13, 0xe6, 0xa6, 0x3f, 0x51, 0x0d, 0x72, 0x3b, 0xdb, 0xc2, 0x08, - 0xb9, 0x9d, 0x6d, 0xfc, 0x13, 0x03, 0x90, 0x3a, 0x6e, 0x2a, 0x3b, 0xc7, 0x84, 0x4b, 0xf8, 0x7c, - 0x04, 0xbf, 0x0c, 0x73, 0xc4, 0xf3, 0x5c, 0x8f, 0x59, 0xb4, 0x64, 0xf2, 0x06, 0x7e, 0x4b, 0xe8, - 0x60, 0x92, 0x89, 0x7b, 0x1e, 0x9e, 0x41, 0x2e, 0xcd, 0x08, 0x55, 0xdd, 0x85, 0x25, 0x8d, 0x6b, - 0xaa, 0xc8, 0xf5, 0x21, 0x2c, 0x30, 0x61, 0x5b, 0x67, 0xa4, 0x77, 0x3e, 0x72, 0x6d, 0x27, 0x81, - 0x47, 0x57, 0x2e, 0x72, 0xb0, 0x74, 0x1e, 0x7c, 0x62, 0x95, 0x90, 0xd8, 0xed, 0xee, 0xe1, 0xcf, - 0x60, 0x25, 0x26, 0x47, 0xaa, 0xff, 0x27, 0x50, 0xee, 0x85, 0x44, 0x5f, 0xe4, 0x3a, 0xb7, 0x74, - 0xe5, 0xe2, 0x43, 0xd5, 0x11, 0xf8, 0x00, 0xae, 0x27, 0x44, 0x4f, 0x35, 0xe7, 0xb7, 0xe1, 0x1a, - 0x13, 0xb8, 0x4b, 0xc8, 0xa8, 0x3d, 0xb0, 0x27, 0x99, 0x96, 0x1e, 0x89, 0x49, 0x29, 0x8c, 0x5f, - 0xef, 0xbe, 0xc0, 0x7f, 0x24, 0x10, 0xbb, 0xf6, 0x90, 0x74, 0xdd, 0xbd, 0x6c, 0xdd, 0x68, 0x34, - 0x3b, 0x27, 0x97, 0xbe, 0x48, 0x6b, 0xd8, 0x6f, 0xfc, 0x2f, 0x86, 0x30, 0x95, 0x3a, 0xfc, 0x6b, - 0xde, 0xc9, 0xab, 0x00, 0xa7, 0xf4, 0xc8, 0x90, 0x3e, 0xed, 0xe0, 0x15, 0x15, 0x85, 0x12, 0xea, - 0x49, 0xfd, 0x77, 0x45, 0xe8, 0xb9, 0x2c, 0xf6, 0x39, 0xfb, 0x27, 0xf4, 0x72, 0xb7, 0xa0, 0xcc, - 0x08, 0x47, 0x81, 0x15, 0x8c, 0xfd, 0xc4, 0x62, 0xfc, 0x95, 0xd8, 0xf6, 0x72, 0xd0, 0x54, 0xf3, - 0xfa, 0x16, 0xcc, 0xb3, 0xcb, 0x84, 0x4c, 0xa5, 0x6f, 0xa4, 0xec, 0x47, 0xae, 0x87, 0x29, 0x18, - 0xf1, 0xcf, 0x0c, 0x98, 0x7f, 0xca, 0x4a, 0xb0, 0x8a, 0x6a, 0xb3, 0x72, 0x2d, 0x1c, 0x6b, 0xc8, - 0x0b, 0x43, 0x25, 0x93, 0xfd, 0x66, 0xa9, 0x27, 0x21, 0xde, 0x33, 0x73, 0x8f, 0xa7, 0xb8, 0x25, - 0x33, 0x6c, 0x53, 0x9b, 0xf5, 0x06, 0x36, 0x71, 0x02, 0xd6, 0x3b, 0xcb, 0x7a, 0x15, 0x0a, 0xcd, - 0x9e, 0x6d, 0x7f, 0x8f, 0x58, 0x9e, 0x23, 0x8a, 0xa6, 0x45, 0x33, 0x22, 0xe0, 0x3d, 0xa8, 0x73, - 0x3d, 0xda, 0xfd, 0xbe, 0x92, 0x60, 0x86, 0x68, 0x46, 0x0c, 0x4d, 0x93, 0x96, 0x8b, 0x4b, 0xfb, - 0xa5, 0x01, 0x8b, 0x8a, 0xb8, 0xa9, 0xac, 0xfa, 0x2e, 0xcc, 0xf3, 0x22, 0xb5, 0xc8, 0x74, 0x96, - 0xf5, 0x51, 0x1c, 0xc6, 0x14, 0x3c, 0x68, 0x03, 0x0a, 0xfc, 0x97, 0xbc, 0x03, 0xa4, 0xb3, 0x4b, - 0x26, 0x7c, 0x17, 0x96, 0x04, 0x89, 0x0c, 0xdd, 0xb4, 0x83, 0xc1, 0x16, 0x03, 0xff, 0x05, 0x2c, - 0xeb, 0x6c, 0x53, 0x4d, 0x49, 0x51, 0x32, 0xf7, 0x3a, 0x4a, 0xb6, 0xa5, 0x92, 0xcf, 0x46, 0x7d, - 0x25, 0x8f, 0x8a, 0xef, 0x18, 0x75, 0xbd, 0x72, 0xfa, 0x7a, 0x45, 0x13, 0x90, 0x22, 0xbe, 0xd1, - 0x09, 0x7c, 0x20, 0xb7, 0xc3, 0x9e, 0xed, 0x87, 0x3e, 0x1c, 0x43, 0x65, 0x60, 0x3b, 0xc4, 0xf2, - 0x44, 0xe5, 0xdc, 0xe0, 0x95, 0x73, 0x95, 0x86, 0xbf, 0x00, 0xa4, 0x0e, 0xfc, 0x46, 0x95, 0xbe, - 0x27, 0x4d, 0x76, 0xe8, 0xb9, 0x43, 0x37, 0xd3, 0xec, 0xf8, 0x2f, 0xe1, 0x5a, 0x8c, 0xef, 0x1b, - 0x55, 0x73, 0x09, 0x16, 0xb7, 0x89, 0x4c, 0x68, 0xa4, 0xdb, 0xfb, 0x08, 0x90, 0x4a, 0x9c, 0x2a, - 0xb2, 0xb5, 0x60, 0xf1, 0xa9, 0x3b, 0xa1, 0x2e, 0x92, 0x52, 0x23, 0xdf, 0xc0, 0xeb, 0x10, 0xa1, - 0x29, 0xc2, 0x36, 0x05, 0x57, 0x07, 0x4c, 0x05, 0xfe, 0x1f, 0x06, 0x54, 0xda, 0x03, 0xcb, 0x1b, - 0x4a, 0xe0, 0xef, 0xc1, 0x3c, 0xbf, 0x5d, 0x8b, 0x82, 0xd6, 0x3d, 0x5d, 0x8c, 0xca, 0xcb, 0x1b, - 0x6d, 0x7e, 0x17, 0x17, 0xa3, 0xa8, 0xe2, 0xe2, 0xcd, 0x6b, 0x3b, 0xf6, 0x06, 0xb6, 0x8d, 0xde, - 0x83, 0x39, 0x8b, 0x0e, 0x61, 0xa1, 0xa8, 0x16, 0xaf, 0x6b, 0x30, 0x69, 0xec, 0x0e, 0xc0, 0xb9, - 0xf0, 0x77, 0xa0, 0xac, 0x20, 0xa0, 0x02, 0xe4, 0x1f, 0x77, 0x44, 0xc2, 0xde, 0xde, 0xea, 0xee, - 0x3c, 0xe7, 0x05, 0x9d, 0x1a, 0xc0, 0x76, 0x27, 0x6c, 0xe7, 0xf0, 0xa7, 0x62, 0x94, 0x70, 0xfb, - 0xaa, 0x3e, 0x46, 0x96, 0x3e, 0xb9, 0xd7, 0xd2, 0xe7, 0x02, 0xaa, 0x62, 0xfa, 0xd3, 0x86, 0x31, - 0x26, 0x2f, 0x23, 0x8c, 0x29, 0xca, 0x9b, 0x82, 0x11, 0xff, 0xda, 0x80, 0xfa, 0xb6, 0xfb, 0xd2, - 0x39, 0xf5, 0xac, 0x7e, 0x78, 0x4e, 0x3e, 0x8c, 0xad, 0xd4, 0x46, 0xac, 0x38, 0x1a, 0xe3, 0x8f, - 0x08, 0xb1, 0x15, 0x6b, 0x44, 0x65, 0x43, 0x1e, 0x0b, 0x65, 0x13, 0x7f, 0x00, 0x0b, 0xb1, 0x41, - 0xd4, 0xf6, 0xcf, 0xdb, 0x7b, 0x3b, 0xdb, 0xd4, 0xd6, 0xac, 0xb0, 0xd6, 0xd9, 0x6f, 0x3f, 0xda, - 0xeb, 0x88, 0x07, 0xa4, 0xf6, 0xfe, 0x56, 0x67, 0xaf, 0x9e, 0xc3, 0x3d, 0x58, 0x54, 0xe0, 0xa7, - 0x7d, 0x19, 0xc8, 0xd0, 0x6e, 0x01, 0xaa, 0x22, 0xda, 0x8b, 0x43, 0xf9, 0xef, 0x39, 0xa8, 0x49, - 0xca, 0xd7, 0x83, 0x89, 0x56, 0x60, 0xbe, 0x7f, 0x72, 0x64, 0x7f, 0x21, 0x5f, 0x8e, 0x44, 0x8b, - 0xd2, 0x07, 0x1c, 0x87, 0x3f, 0xdf, 0x8a, 0x16, 0x0d, 0xe3, 0x9e, 0xf5, 0x22, 0xd8, 0x71, 0xfa, - 0xe4, 0x82, 0x25, 0x05, 0xb3, 0x66, 0x44, 0x60, 0x15, 0x26, 0xf1, 0xcc, 0xcb, 0x6e, 0x56, 0xca, - 0xb3, 0x2f, 0xba, 0x0f, 0x75, 0xfa, 0xbb, 0x3d, 0x1a, 0x0d, 0x6c, 0xd2, 0xe7, 0x02, 0x0a, 0x8c, - 0x27, 0x41, 0xa7, 0xe8, 0xec, 0x2e, 0xe2, 0x37, 0x8a, 0x2c, 0x2c, 0x89, 0x16, 0x5a, 0x83, 0x32, - 0xd7, 0x6f, 0xc7, 0x79, 0xe6, 0x13, 0xf6, 0xf6, 0x99, 0x37, 0x55, 0x92, 0x9e, 0x66, 0x40, 0x3c, - 0xcd, 0x58, 0x82, 0xc5, 0xf6, 0x38, 0x38, 0xeb, 0x38, 0x34, 0x56, 0x48, 0x2b, 0x2f, 0x03, 0xa2, - 0xc4, 0x6d, 0xdb, 0x57, 0xa9, 0x82, 0x55, 0x5f, 0x90, 0x0e, 0x2c, 0x51, 0x22, 0x71, 0x02, 0xbb, - 0xa7, 0xc4, 0x55, 0x99, 0x79, 0x19, 0xb1, 0xcc, 0xcb, 0xf2, 0xfd, 0x97, 0xae, 0xd7, 0x17, 0x36, - 0x0f, 0xdb, 0xf8, 0x9f, 0x0c, 0x0e, 0xf9, 0xcc, 0xd7, 0xd2, 0xa7, 0xdf, 0x51, 0x0c, 0x7a, 0x1f, - 0x0a, 0xee, 0x88, 0xbd, 0xf0, 0x8b, 0x32, 0xcc, 0xca, 0x06, 0xff, 0x26, 0x60, 0x43, 0x08, 0x3e, - 0xe0, 0xbd, 0xa6, 0x64, 0x43, 0xf7, 0xa0, 0x76, 0x66, 0xf9, 0x67, 0xa4, 0x7f, 0x28, 0x65, 0xf2, - 0x9b, 0x5f, 0x8c, 0x8a, 0xd7, 0x23, 0xfd, 0x1e, 0x93, 0xe0, 0x0a, 0xfd, 0xf0, 0x03, 0xb8, 0x26, - 0x39, 0xc5, 0xeb, 0xc4, 0x15, 0xcc, 0x2f, 0xe1, 0x96, 0x64, 0xde, 0x3a, 0xb3, 0x9c, 0x53, 0x22, - 0x01, 0x7f, 0x5f, 0x0b, 0x24, 0xe7, 0x93, 0x4f, 0x9d, 0xcf, 0x23, 0x68, 0x84, 0xf3, 0x61, 0x37, - 0x6b, 0x77, 0xa0, 0x2a, 0x3a, 0xf6, 0xc5, 0x79, 0x2a, 0x99, 0xec, 0x37, 0xa5, 0x79, 0xee, 0x20, - 0x4c, 0xa5, 0xe9, 0x6f, 0xbc, 0x05, 0x37, 0xa4, 0x0c, 0x71, 0xe7, 0xd5, 0x85, 0x24, 0x14, 0x4f, - 0x13, 0x22, 0x0c, 0x4b, 0x87, 0x5e, 0xbd, 0xf0, 0x2a, 0xa7, 0xbe, 0x04, 0x4c, 0xa6, 0xa1, 0xc8, - 0xbc, 0xc6, 0x37, 0x25, 0x55, 0x4c, 0xc9, 0x96, 0x24, 0x99, 0x0a, 0x50, 0xc9, 0x62, 0xc1, 0x28, - 0x39, 0xb1, 0x60, 0x09, 0xd1, 0x3f, 0x80, 0xd5, 0x50, 0x09, 0x6a, 0xb7, 0x43, 0xe2, 0x0d, 0x6d, - 0xdf, 0x57, 0xea, 0xde, 0x69, 0x13, 0xbf, 0x07, 0xb3, 0x23, 0x22, 0x82, 0x50, 0x79, 0x13, 0xc9, - 0x4d, 0xa9, 0x0c, 0x66, 0xfd, 0xb8, 0x0f, 0xb7, 0xa5, 0x74, 0x6e, 0xd1, 0x54, 0xf1, 0x71, 0xa5, - 0x64, 0x35, 0x30, 0x97, 0x51, 0x0d, 0xcc, 0xc7, 0xde, 0x62, 0x3e, 0xe2, 0x86, 0x94, 0x67, 0x7e, - 0xaa, 0xe4, 0x62, 0x97, 0xdb, 0x34, 0x74, 0x15, 0x53, 0x09, 0xfb, 0x1b, 0xe1, 0x05, 0xbe, 0x2a, - 0x0f, 0x4f, 0xd8, 0x0c, 0xe5, 0x43, 0x87, 0x6c, 0xd2, 0xac, 0x99, 0x2e, 0x80, 0xa9, 0xd6, 0x42, - 0x67, 0x4d, 0x8d, 0x86, 0x4f, 0x60, 0x59, 0xf7, 0x6b, 0x53, 0xe9, 0xb2, 0x0c, 0x73, 0x81, 0x7b, - 0x4e, 0x64, 0xac, 0xe1, 0x0d, 0x69, 0xbb, 0xd0, 0xe7, 0x4d, 0x65, 0x3b, 0x2b, 0x12, 0xc6, 0x4e, - 0xc7, 0xb4, 0xfa, 0xd2, 0x8d, 0x25, 0xef, 0x40, 0xbc, 0x81, 0xf7, 0x61, 0x25, 0xee, 0xd9, 0xa6, - 0x52, 0xf9, 0x39, 0x3f, 0x4b, 0x69, 0xce, 0x6f, 0x2a, 0xb9, 0x1f, 0x47, 0x7e, 0x49, 0xf1, 0x6d, - 0x53, 0x89, 0x34, 0xa1, 0x99, 0xe6, 0xea, 0xbe, 0x8a, 0xa3, 0x13, 0x7a, 0xbe, 0xa9, 0x84, 0xf9, - 0x91, 0xb0, 0xe9, 0x97, 0x3f, 0x72, 0x57, 0xf9, 0x2b, 0xdd, 0x95, 0x38, 0x24, 0x91, 0x43, 0xfd, - 0x1a, 0x36, 0x9d, 0xc0, 0x88, 0x7c, 0xf9, 0xb4, 0x18, 0x34, 0x9c, 0x85, 0x18, 0xac, 0x21, 0x37, - 0xb6, 0x1a, 0x01, 0xa6, 0x5a, 0x8c, 0x4f, 0x22, 0x37, 0x9e, 0x08, 0x12, 0x53, 0x09, 0xfe, 0x14, - 0xd6, 0xb2, 0xe3, 0xc3, 0x34, 0x92, 0xef, 0xb7, 0xa0, 0x14, 0x5e, 0x86, 0x94, 0xef, 0xcd, 0xca, - 0x50, 0xd8, 0x3f, 0x38, 0x3a, 0x6c, 0x6f, 0x75, 0xf8, 0x07, 0x67, 0x5b, 0x07, 0xa6, 0xf9, 0xec, - 0xb0, 0x5b, 0xcf, 0x6d, 0xfe, 0x26, 0x0f, 0xb9, 0xdd, 0xe7, 0xe8, 0x33, 0x98, 0xe3, 0x5f, 0x5f, - 0x5c, 0xf1, 0xc9, 0x4d, 0xf3, 0xaa, 0x0f, 0x4c, 0xf0, 0xf5, 0x9f, 0xfc, 0xf7, 0x6f, 0x7e, 0x91, - 0x5b, 0xc4, 0x95, 0xd6, 0xe4, 0xdb, 0xad, 0xf3, 0x49, 0x8b, 0x85, 0xa9, 0x87, 0xc6, 0x7d, 0xf4, - 0x31, 0xe4, 0x0f, 0xc7, 0x01, 0xca, 0xfc, 0x14, 0xa7, 0x99, 0xfd, 0xcd, 0x09, 0xbe, 0xc6, 0x84, - 0x2e, 0x60, 0x10, 0x42, 0x47, 0xe3, 0x80, 0x8a, 0xfc, 0x21, 0x94, 0xd5, 0x2f, 0x46, 0x5e, 0xf9, - 0x7d, 0x4e, 0xf3, 0xd5, 0x5f, 0xa3, 0xe0, 0x5b, 0x0c, 0xea, 0x3a, 0x46, 0x02, 0x8a, 0x7f, 0xd3, - 0xa2, 0xce, 0xa2, 0x7b, 0xe1, 0xa0, 0xcc, 0xaf, 0x77, 0x9a, 0xd9, 0x1f, 0xa8, 0x24, 0x66, 0x11, - 0x5c, 0x38, 0x54, 0xe4, 0x9f, 0x89, 0x6f, 0x53, 0x7a, 0x01, 0xba, 0x9d, 0xf2, 0x6d, 0x82, 0xfa, - 0x0a, 0xdf, 0x5c, 0xcb, 0x66, 0x10, 0x20, 0x37, 0x19, 0xc8, 0x0a, 0x5e, 0x14, 0x20, 0xbd, 0x90, - 0xe5, 0xa1, 0x71, 0x7f, 0xb3, 0x07, 0x73, 0xec, 0x85, 0x0b, 0x7d, 0x2e, 0x7f, 0x34, 0x53, 0x9e, - 0xfa, 0x32, 0x16, 0x5a, 0x7b, 0x1b, 0xc3, 0xcb, 0x0c, 0xa8, 0x86, 0x4b, 0x14, 0x88, 0xbd, 0x6f, - 0x3d, 0x34, 0xee, 0xaf, 0x1b, 0xef, 0x1b, 0x9b, 0xbf, 0x9e, 0x83, 0x39, 0x56, 0xda, 0x45, 0xe7, - 0x00, 0xd1, 0x6b, 0x4f, 0x7c, 0x76, 0x89, 0xf7, 0xa3, 0xf8, 0xec, 0x92, 0x0f, 0x45, 0xb8, 0xc9, - 0x40, 0x97, 0xf1, 0x02, 0x05, 0x65, 0x15, 0xe3, 0x16, 0x2b, 0x82, 0x53, 0x3b, 0xfe, 0xad, 0x21, - 0x2a, 0xdb, 0xfc, 0x2c, 0xa1, 0x34, 0x69, 0xda, 0x93, 0x4f, 0x7c, 0x3b, 0xa4, 0x3c, 0xf7, 0xe0, - 0xef, 0x32, 0xc0, 0x16, 0xae, 0x47, 0x80, 0x1e, 0xe3, 0x78, 0x68, 0xdc, 0xff, 0xbc, 0x81, 0x97, - 0x84, 0x95, 0x63, 0x3d, 0xe8, 0x47, 0x50, 0xd3, 0x9f, 0x34, 0xd0, 0x9d, 0x14, 0xac, 0xf8, 0xcb, - 0x48, 0xf3, 0xad, 0xab, 0x99, 0x84, 0x4e, 0xab, 0x4c, 0x27, 0x01, 0xce, 0x91, 0xcf, 0x09, 0x19, - 0x59, 0x94, 0x49, 0xac, 0x01, 0xfa, 0x47, 0x43, 0xbc, 0x38, 0x45, 0x6f, 0x14, 0x28, 0x4d, 0x7a, - 0xe2, 0x05, 0xa4, 0x79, 0xf7, 0x15, 0x5c, 0x42, 0x89, 0x3f, 0x66, 0x4a, 0x7c, 0x80, 0x97, 0x23, - 0x25, 0x02, 0x7b, 0x48, 0x02, 0x57, 0x68, 0xf1, 0xf9, 0x4d, 0x7c, 0x5d, 0x33, 0x8e, 0xd6, 0x1b, - 0x2d, 0x16, 0x7f, 0x67, 0x48, 0x5d, 0x2c, 0xed, 0xdd, 0x22, 0x75, 0xb1, 0xf4, 0x47, 0x8a, 0xb4, - 0xc5, 0xe2, 0xaf, 0x0a, 0x69, 0x8b, 0x15, 0xf6, 0x6c, 0xfe, 0xff, 0x2c, 0x14, 0xb6, 0xf8, 0x37, - 0xe1, 0xc8, 0x85, 0x52, 0x58, 0xa6, 0x47, 0xab, 0x69, 0x75, 0xc6, 0xe8, 0x5a, 0xd3, 0xbc, 0x9d, - 0xd9, 0x2f, 0x14, 0x7a, 0x93, 0x29, 0xf4, 0x06, 0x5e, 0xa1, 0xc8, 0xe2, 0xb3, 0xf3, 0x16, 0x2f, - 0x66, 0xb5, 0xac, 0x7e, 0x9f, 0x1a, 0xe2, 0xcf, 0xa1, 0xa2, 0xd6, 0xd1, 0xd1, 0x9b, 0xa9, 0xb5, - 0x4d, 0xb5, 0x14, 0xdf, 0xc4, 0x57, 0xb1, 0x08, 0xe4, 0xb7, 0x18, 0xf2, 0x2a, 0xbe, 0x91, 0x82, - 0xec, 0x31, 0x56, 0x0d, 0x9c, 0xd7, 0xc0, 0xd3, 0xc1, 0xb5, 0x12, 0x7b, 0x3a, 0xb8, 0x5e, 0x42, - 0xbf, 0x12, 0x7c, 0xcc, 0x58, 0x29, 0xb8, 0x0f, 0x10, 0x55, 0xb2, 0x51, 0xaa, 0x2d, 0x95, 0x7b, - 0x5d, 0xdc, 0x39, 0x24, 0x8b, 0xe0, 0x18, 0x33, 0x58, 0xb1, 0xef, 0x62, 0xb0, 0x03, 0xdb, 0x0f, - 0xf8, 0xc1, 0xac, 0x6a, 0xa5, 0x69, 0x94, 0x3a, 0x1f, 0xbd, 0xbe, 0xdd, 0xbc, 0x73, 0x25, 0x8f, - 0x40, 0xbf, 0xcb, 0xd0, 0x6f, 0xe3, 0x66, 0x0a, 0xfa, 0x88, 0xf3, 0xd2, 0xcd, 0xf6, 0xe3, 0x02, - 0x94, 0x9f, 0x5a, 0xb6, 0x13, 0x10, 0xc7, 0x72, 0x7a, 0x04, 0x9d, 0xc0, 0x1c, 0x8b, 0xd4, 0x71, - 0x47, 0xac, 0x96, 0x6d, 0xe3, 0x8e, 0x58, 0xab, 0x69, 0xe2, 0x35, 0x06, 0xdc, 0xc4, 0xd7, 0x28, - 0xf0, 0x30, 0x12, 0xdd, 0x62, 0xa5, 0x48, 0x3a, 0xe9, 0x17, 0x30, 0x2f, 0x5e, 0xfb, 0x62, 0x82, - 0xb4, 0xe2, 0x4f, 0xf3, 0x66, 0x7a, 0x67, 0xda, 0x5e, 0x56, 0x61, 0x7c, 0xc6, 0x47, 0x71, 0x26, - 0x00, 0x51, 0x8d, 0x3d, 0xbe, 0xa2, 0x89, 0x92, 0x7c, 0x73, 0x2d, 0x9b, 0x21, 0xcd, 0xa6, 0x2a, - 0x66, 0x3f, 0xe4, 0xa5, 0xb8, 0x7f, 0x0a, 0xb3, 0x4f, 0x2c, 0xff, 0x0c, 0xc5, 0x62, 0xaf, 0xf2, - 0xad, 0x58, 0xb3, 0x99, 0xd6, 0x25, 0x50, 0x6e, 0x33, 0x94, 0x1b, 0xdc, 0x95, 0xa9, 0x28, 0x67, - 0x96, 0x7f, 0x26, 0xec, 0xc7, 0x3f, 0x1d, 0x8b, 0xdb, 0x4f, 0xfb, 0xfc, 0x2c, 0x6e, 0x3f, 0xfd, - 0x6b, 0xb3, 0x6c, 0xfb, 0x51, 0x94, 0xf3, 0x09, 0xc5, 0x19, 0x41, 0x51, 0x7e, 0xad, 0x85, 0x62, - 0x4f, 0xf7, 0xb1, 0x2f, 0xbb, 0x9a, 0xab, 0x59, 0xdd, 0x02, 0xed, 0x0e, 0x43, 0xbb, 0x85, 0x1b, - 0x89, 0xd5, 0x12, 0x9c, 0x0f, 0x8d, 0xfb, 0xef, 0x1b, 0xe8, 0x47, 0x00, 0xd1, 0xc3, 0x44, 0xe2, - 0x0c, 0xc6, 0xdf, 0x38, 0x12, 0x67, 0x30, 0xf1, 0xa6, 0x81, 0x37, 0x18, 0xee, 0x3a, 0xbe, 0x13, - 0xc7, 0x0d, 0x3c, 0xcb, 0xf1, 0x5f, 0x10, 0xef, 0x3d, 0x5e, 0x67, 0xf5, 0xcf, 0xec, 0x11, 0x9d, - 0xb2, 0x07, 0xa5, 0xb0, 0xee, 0x1c, 0xf7, 0xb7, 0xf1, 0x7a, 0x78, 0xdc, 0xdf, 0x26, 0x0a, 0xd6, - 0xba, 0xe3, 0xd1, 0xf6, 0x8b, 0x64, 0xa5, 0x47, 0xf0, 0x97, 0x75, 0x98, 0xa5, 0x79, 0x37, 0x4d, - 0x4f, 0xa2, 0xca, 0x49, 0x7c, 0xf6, 0x89, 0x3a, 0x6a, 0x7c, 0xf6, 0xc9, 0xa2, 0x8b, 0x9e, 0x9e, - 0xd0, 0x6b, 0x56, 0x8b, 0x17, 0x29, 0xe8, 0x4c, 0x5d, 0x28, 0x2b, 0xa5, 0x15, 0x94, 0x22, 0x4c, - 0x2f, 0xd0, 0xc6, 0x03, 0x5e, 0x4a, 0x5d, 0x06, 0xbf, 0xc1, 0xf0, 0xae, 0xf1, 0x80, 0xc7, 0xf0, - 0xfa, 0x9c, 0x83, 0x02, 0x8a, 0xd9, 0x89, 0x93, 0x9f, 0x32, 0x3b, 0xfd, 0xf4, 0xaf, 0x65, 0x33, - 0x64, 0xce, 0x2e, 0x3a, 0xfa, 0x2f, 0xa1, 0xa2, 0x16, 0x58, 0x50, 0x8a, 0xf2, 0xb1, 0xa2, 0x72, - 0x3c, 0x92, 0xa4, 0xd5, 0x67, 0x74, 0xdf, 0xc6, 0x20, 0x2d, 0x85, 0x8d, 0x02, 0x0f, 0xa0, 0x20, - 0x2a, 0x2e, 0x69, 0x26, 0xd5, 0x0b, 0xd0, 0x69, 0x26, 0x8d, 0x95, 0x6b, 0xf4, 0xfc, 0x99, 0x21, - 0xd2, 0x4b, 0xa5, 0x8c, 0xd6, 0x02, 0xed, 0x31, 0x09, 0xb2, 0xd0, 0xa2, 0x5a, 0x66, 0x16, 0x9a, - 0x72, 0xa1, 0xcf, 0x42, 0x3b, 0x25, 0x81, 0xf0, 0x07, 0xf2, 0xa2, 0x8c, 0x32, 0x84, 0xa9, 0x11, - 0x12, 0x5f, 0xc5, 0x92, 0x76, 0xbd, 0x89, 0x00, 0x65, 0x78, 0xbc, 0x00, 0x88, 0xea, 0x41, 0xf1, - 0x9c, 0x35, 0xb5, 0x0e, 0x1e, 0xcf, 0x59, 0xd3, 0x4b, 0x4a, 0xba, 0x8f, 0x8d, 0x70, 0xf9, 0xed, - 0x8a, 0x22, 0xff, 0xdc, 0x00, 0x94, 0x2c, 0x1d, 0xa1, 0x07, 0xe9, 0xd2, 0x53, 0xab, 0xeb, 0xcd, - 0x77, 0x5f, 0x8f, 0x39, 0xcd, 0x21, 0x47, 0x2a, 0xf5, 0x18, 0xf7, 0xe8, 0x25, 0x55, 0xea, 0xc7, - 0x06, 0x54, 0xb5, 0xba, 0x13, 0xba, 0x97, 0xb1, 0xa6, 0xb1, 0xa2, 0x7b, 0xf3, 0xed, 0x57, 0xf2, - 0xa5, 0x25, 0xf3, 0xca, 0x0e, 0x90, 0xb7, 0x9a, 0x9f, 0x1a, 0x50, 0xd3, 0xeb, 0x54, 0x28, 0x43, - 0x76, 0xa2, 0x68, 0xdf, 0x5c, 0x7f, 0x35, 0xe3, 0xd5, 0xcb, 0x13, 0x5d, 0x68, 0x06, 0x50, 0x10, - 0x95, 0xad, 0xb4, 0x8d, 0xaf, 0x97, 0xfb, 0xd3, 0x36, 0x7e, 0xac, 0x2c, 0x96, 0xb2, 0xf1, 0x3d, - 0x77, 0x40, 0x94, 0x63, 0x26, 0x4a, 0x5f, 0x59, 0x68, 0x57, 0x1f, 0xb3, 0x58, 0xdd, 0x2c, 0x0b, - 0x2d, 0x3a, 0x66, 0xb2, 0xe6, 0x85, 0x32, 0x84, 0xbd, 0xe2, 0x98, 0xc5, 0x4b, 0x66, 0x29, 0xc7, - 0x8c, 0x01, 0x2a, 0xc7, 0x2c, 0xaa, 0x4e, 0xa5, 0x1d, 0xb3, 0xc4, 0xeb, 0x45, 0xda, 0x31, 0x4b, - 0x16, 0xb8, 0x52, 0xd6, 0x91, 0xe1, 0x6a, 0xc7, 0x6c, 0x29, 0xa5, 0x90, 0x85, 0xde, 0xcd, 0x30, - 0x62, 0xea, 0xa3, 0x48, 0xf3, 0xbd, 0xd7, 0xe4, 0xce, 0xdc, 0xe3, 0xdc, 0xfc, 0x72, 0x8f, 0xff, - 0x9d, 0x01, 0xcb, 0x69, 0x45, 0x30, 0x94, 0x81, 0x93, 0xf1, 0x98, 0xd2, 0xdc, 0x78, 0x5d, 0xf6, - 0xab, 0xad, 0x15, 0xee, 0xfa, 0x47, 0xf5, 0x7f, 0xfb, 0x72, 0xd5, 0xf8, 0xcf, 0x2f, 0x57, 0x8d, - 0xff, 0xf9, 0x72, 0xd5, 0xf8, 0xfb, 0xff, 0x5d, 0x9d, 0x39, 0x99, 0x67, 0xff, 0xd5, 0xf8, 0xdb, - 0xbf, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x54, 0x11, 0xdf, 0xef, 0x3c, 0x00, 0x00, + // 4574 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0x5d, 0x6f, 0x1b, 0x57, + 0x76, 0x1a, 0x92, 0x12, 0xc9, 0xc3, 0x0f, 0xd1, 0xd7, 0xb2, 0x4d, 0xd3, 0xb6, 0xac, 0x8c, 0xed, + 0xc4, 0x71, 0x62, 0xd1, 0x96, 0xec, 0x64, 0xeb, 0x22, 0xe9, 0xd2, 0x12, 0x63, 0x6b, 0x2d, 0x4b, + 0xca, 0x88, 0x76, 0x36, 0x2e, 0xb0, 0xea, 0x88, 0xbc, 0xa6, 0x66, 0x45, 0xce, 0x70, 0x67, 0x86, + 0xb4, 0x94, 0x3e, 0x6c, 0xba, 0xed, 0x76, 0xb1, 0x2d, 0xb0, 0x40, 0x53, 0xa0, 0x58, 0x14, 0xed, + 0x4b, 0x5b, 0xa0, 0x7d, 0x68, 0x8b, 0xf6, 0xa1, 0x0f, 0x45, 0x0b, 0xf4, 0xa1, 0x7d, 0x68, 0x1f, + 0x0a, 0x14, 0xe8, 0x1f, 0x68, 0xd3, 0x7d, 0xea, 0xaf, 0x58, 0xdc, 0xaf, 0xb9, 0x77, 0xbe, 0x24, + 0x67, 0xa5, 0x60, 0x5f, 0x62, 0xce, 0x3d, 0x9f, 0xf7, 0x9c, 0x7b, 0xcf, 0xb9, 0xf7, 0x9c, 0x1b, + 0x41, 0xd1, 0x1d, 0x75, 0x17, 0x47, 0xae, 0xe3, 0x3b, 0xa8, 0x8c, 0xfd, 0x6e, 0xcf, 0xc3, 0xee, + 0x04, 0xbb, 0xa3, 0xdd, 0xc6, 0x5c, 0xdf, 0xe9, 0x3b, 0x14, 0xd0, 0x24, 0xbf, 0x18, 0x4e, 0xa3, + 0x4e, 0x70, 0x9a, 0xe6, 0xc8, 0x6a, 0x0e, 0x27, 0xdd, 0xee, 0x68, 0xb7, 0xb9, 0x3f, 0xe1, 0x90, + 0x46, 0x00, 0x31, 0xc7, 0xfe, 0xde, 0x68, 0x97, 0xfe, 0xc3, 0x61, 0x0b, 0x01, 0x6c, 0x82, 0x5d, + 0xcf, 0x72, 0xec, 0xd1, 0xae, 0xf8, 0xc5, 0x31, 0x2e, 0xf7, 0x1d, 0xa7, 0x3f, 0xc0, 0x8c, 0xde, + 0xb6, 0x1d, 0xdf, 0xf4, 0x2d, 0xc7, 0xf6, 0x38, 0x94, 0xfd, 0xd3, 0xbd, 0xdd, 0xc7, 0xf6, 0x6d, + 0x67, 0x84, 0x6d, 0x73, 0x64, 0x4d, 0x96, 0x9a, 0xce, 0x88, 0xe2, 0xc4, 0xf1, 0xf5, 0x9f, 0x68, + 0x50, 0x35, 0xb0, 0x37, 0x72, 0x6c, 0x0f, 0x3f, 0xc6, 0x66, 0x0f, 0xbb, 0xe8, 0x0a, 0x40, 0x77, + 0x30, 0xf6, 0x7c, 0xec, 0xee, 0x58, 0xbd, 0xba, 0xb6, 0xa0, 0xdd, 0xcc, 0x19, 0x45, 0x3e, 0xb2, + 0xd6, 0x43, 0x97, 0xa0, 0x38, 0xc4, 0xc3, 0x5d, 0x06, 0xcd, 0x50, 0x68, 0x81, 0x0d, 0xac, 0xf5, + 0x50, 0x03, 0x0a, 0x2e, 0x9e, 0x58, 0x44, 0xdd, 0x7a, 0x76, 0x41, 0xbb, 0x99, 0x35, 0x82, 0x6f, + 0x42, 0xe8, 0x9a, 0x2f, 0xfd, 0x1d, 0x1f, 0xbb, 0xc3, 0x7a, 0x8e, 0x11, 0x92, 0x81, 0x0e, 0x76, + 0x87, 0x0f, 0xf2, 0x3f, 0xf8, 0x87, 0x7a, 0x76, 0x79, 0xf1, 0x8e, 0xfe, 0xaf, 0xd3, 0x50, 0x36, + 0x4c, 0xbb, 0x8f, 0x0d, 0xfc, 0xbd, 0x31, 0xf6, 0x7c, 0x54, 0x83, 0xec, 0x3e, 0x3e, 0xa4, 0x7a, + 0x94, 0x0d, 0xf2, 0x93, 0x31, 0xb2, 0xfb, 0x78, 0x07, 0xdb, 0x4c, 0x83, 0x32, 0x61, 0x64, 0xf7, + 0x71, 0xdb, 0xee, 0xa1, 0x39, 0x98, 0x1e, 0x58, 0x43, 0xcb, 0xe7, 0xe2, 0xd9, 0x47, 0x48, 0xaf, + 0x5c, 0x44, 0xaf, 0x15, 0x00, 0xcf, 0x71, 0xfd, 0x1d, 0xc7, 0xed, 0x61, 0xb7, 0x3e, 0xbd, 0xa0, + 0xdd, 0xac, 0x2e, 0x5d, 0x5f, 0x54, 0x3d, 0xbc, 0xa8, 0x2a, 0xb4, 0xb8, 0xed, 0xb8, 0xfe, 0x26, + 0xc1, 0x35, 0x8a, 0x9e, 0xf8, 0x89, 0x3e, 0x82, 0x12, 0x65, 0xe2, 0x9b, 0x6e, 0x1f, 0xfb, 0xf5, + 0x19, 0xca, 0xe5, 0xc6, 0x31, 0x5c, 0x3a, 0x14, 0xd9, 0xa0, 0xe2, 0xd9, 0x6f, 0xa4, 0x43, 0xd9, + 0xc3, 0xae, 0x65, 0x0e, 0xac, 0xcf, 0xcc, 0xdd, 0x01, 0xae, 0xe7, 0x17, 0xb4, 0x9b, 0x05, 0x23, + 0x34, 0x46, 0xe6, 0xbf, 0x8f, 0x0f, 0xbd, 0x1d, 0xc7, 0x1e, 0x1c, 0xd6, 0x0b, 0x14, 0xa1, 0x40, + 0x06, 0x36, 0xed, 0xc1, 0x21, 0xf5, 0x9e, 0x33, 0xb6, 0x7d, 0x06, 0x2d, 0x52, 0x68, 0x91, 0x8e, + 0x50, 0xf0, 0x5d, 0xa8, 0x0d, 0x2d, 0x7b, 0x67, 0xe8, 0xf4, 0x76, 0x02, 0x83, 0x00, 0x31, 0xc8, + 0xc3, 0xfc, 0xef, 0x51, 0x0f, 0xdc, 0x35, 0xaa, 0x43, 0xcb, 0x7e, 0xea, 0xf4, 0x0c, 0x61, 0x1f, + 0x42, 0x62, 0x1e, 0x84, 0x49, 0x4a, 0x51, 0x12, 0xf3, 0x40, 0x25, 0x79, 0x1f, 0xce, 0x12, 0x29, + 0x5d, 0x17, 0x9b, 0x3e, 0x96, 0x54, 0xe5, 0x30, 0xd5, 0x99, 0xa1, 0x65, 0xaf, 0x50, 0x94, 0x10, + 0xa1, 0x79, 0x10, 0x23, 0xac, 0x44, 0x09, 0xcd, 0x83, 0x30, 0xa1, 0xfe, 0x3e, 0x14, 0x03, 0xbf, + 0xa0, 0x02, 0xe4, 0x36, 0x36, 0x37, 0xda, 0xb5, 0x29, 0x04, 0x30, 0xd3, 0xda, 0x5e, 0x69, 0x6f, + 0xac, 0xd6, 0x34, 0x54, 0x82, 0xfc, 0x6a, 0x9b, 0x7d, 0x64, 0x1a, 0xf9, 0x2f, 0xf8, 0x7a, 0x7b, + 0x02, 0x20, 0x5d, 0x81, 0xf2, 0x90, 0x7d, 0xd2, 0xfe, 0xb4, 0x36, 0x45, 0x90, 0x9f, 0xb7, 0x8d, + 0xed, 0xb5, 0xcd, 0x8d, 0x9a, 0x46, 0xb8, 0xac, 0x18, 0xed, 0x56, 0xa7, 0x5d, 0xcb, 0x10, 0x8c, + 0xa7, 0x9b, 0xab, 0xb5, 0x2c, 0x2a, 0xc2, 0xf4, 0xf3, 0xd6, 0xfa, 0xb3, 0x76, 0x2d, 0x17, 0x30, + 0x93, 0xab, 0xf8, 0x4f, 0x34, 0xa8, 0x70, 0x77, 0xb3, 0xbd, 0x85, 0xee, 0xc1, 0xcc, 0x1e, 0xdd, + 0x5f, 0x74, 0x25, 0x97, 0x96, 0x2e, 0x47, 0xd6, 0x46, 0x68, 0x0f, 0x1a, 0x1c, 0x17, 0xe9, 0x90, + 0xdd, 0x9f, 0x78, 0xf5, 0xcc, 0x42, 0xf6, 0x66, 0x69, 0xa9, 0xb6, 0xc8, 0x22, 0xc9, 0xe2, 0x13, + 0x7c, 0xf8, 0xdc, 0x1c, 0x8c, 0xb1, 0x41, 0x80, 0x08, 0x41, 0x6e, 0xe8, 0xb8, 0x98, 0x2e, 0xf8, + 0x82, 0x41, 0x7f, 0x93, 0x5d, 0x40, 0x7d, 0xce, 0x17, 0x3b, 0xfb, 0x90, 0xea, 0xfd, 0xa7, 0x06, + 0xb0, 0x35, 0xf6, 0xd3, 0xb7, 0xd8, 0x1c, 0x4c, 0x4f, 0x88, 0x04, 0xbe, 0xbd, 0xd8, 0x07, 0xdd, + 0x5b, 0xd8, 0xf4, 0x70, 0xb0, 0xb7, 0xc8, 0x07, 0x5a, 0x80, 0xfc, 0xc8, 0xc5, 0x93, 0x9d, 0xfd, + 0x09, 0x95, 0x56, 0x90, 0x7e, 0x9a, 0x21, 0xe3, 0x4f, 0x26, 0xe8, 0x16, 0x94, 0xad, 0xbe, 0xed, + 0xb8, 0x78, 0x87, 0x31, 0x9d, 0x56, 0xd1, 0x96, 0x8c, 0x12, 0x03, 0xd2, 0x29, 0x29, 0xb8, 0x4c, + 0xd4, 0x4c, 0x22, 0xee, 0x3a, 0x81, 0xc9, 0xf9, 0x7c, 0xae, 0x41, 0x89, 0xce, 0xe7, 0x44, 0xc6, + 0x5e, 0x92, 0x13, 0xc9, 0x50, 0xb2, 0x98, 0xc1, 0x63, 0x53, 0x93, 0x2a, 0xd8, 0x80, 0x56, 0xf1, + 0x00, 0xfb, 0xf8, 0x24, 0xc1, 0x4b, 0x31, 0x65, 0x36, 0xd1, 0x94, 0x52, 0xde, 0x5f, 0x68, 0x70, + 0x36, 0x24, 0xf0, 0x44, 0x53, 0xaf, 0x43, 0xbe, 0x47, 0x99, 0x31, 0x9d, 0xb2, 0x86, 0xf8, 0x44, + 0xf7, 0xa0, 0xc0, 0x55, 0xf2, 0xea, 0xd9, 0xe4, 0x65, 0x28, 0xb5, 0xcc, 0x33, 0x2d, 0x3d, 0xa9, + 0xe6, 0x3f, 0x65, 0xa0, 0xc8, 0x8d, 0xb1, 0x39, 0x42, 0x2d, 0xa8, 0xb8, 0xec, 0x63, 0x87, 0xce, + 0x99, 0xeb, 0xd8, 0x48, 0x8f, 0x93, 0x8f, 0xa7, 0x8c, 0x32, 0x27, 0xa1, 0xc3, 0xe8, 0x57, 0xa1, + 0x24, 0x58, 0x8c, 0xc6, 0x3e, 0x77, 0x54, 0x3d, 0xcc, 0x40, 0x2e, 0xed, 0xc7, 0x53, 0x06, 0x70, + 0xf4, 0xad, 0xb1, 0x8f, 0x3a, 0x30, 0x27, 0x88, 0xd9, 0xfc, 0xb8, 0x1a, 0x59, 0xca, 0x65, 0x21, + 0xcc, 0x25, 0xee, 0xce, 0xc7, 0x53, 0x06, 0xe2, 0xf4, 0x0a, 0x10, 0xad, 0x4a, 0x95, 0xfc, 0x03, + 0x96, 0x5f, 0x62, 0x2a, 0x75, 0x0e, 0x6c, 0xce, 0x44, 0x58, 0x6b, 0x59, 0xd1, 0xad, 0x73, 0x60, + 0x07, 0x26, 0x7b, 0x58, 0x84, 0x3c, 0x1f, 0xd6, 0xff, 0x23, 0x03, 0x20, 0x3c, 0xb6, 0x39, 0x42, + 0xab, 0x50, 0x75, 0xf9, 0x57, 0xc8, 0x7e, 0x97, 0x12, 0xed, 0xc7, 0x1d, 0x3d, 0x65, 0x54, 0x04, + 0x11, 0x53, 0xf7, 0x43, 0x28, 0x07, 0x5c, 0xa4, 0x09, 0x2f, 0x26, 0x98, 0x30, 0xe0, 0x50, 0x12, + 0x04, 0xc4, 0x88, 0x9f, 0xc0, 0xb9, 0x80, 0x3e, 0xc1, 0x8a, 0x6f, 0x1c, 0x61, 0xc5, 0x80, 0xe1, + 0x59, 0xc1, 0x41, 0xb5, 0xe3, 0x23, 0x45, 0x31, 0x69, 0xc8, 0x8b, 0x09, 0x86, 0x64, 0x48, 0xaa, + 0x25, 0x03, 0x0d, 0x43, 0xa6, 0x04, 0x92, 0xf6, 0xd9, 0xb8, 0xfe, 0x57, 0x39, 0xc8, 0xaf, 0x38, + 0xc3, 0x91, 0xe9, 0x92, 0x45, 0x34, 0xe3, 0x62, 0x6f, 0x3c, 0xf0, 0xa9, 0x01, 0xab, 0x4b, 0xd7, + 0xc2, 0x32, 0x38, 0x9a, 0xf8, 0xd7, 0xa0, 0xa8, 0x06, 0x27, 0x21, 0xc4, 0x3c, 0xcb, 0x67, 0x5e, + 0x83, 0x98, 0xe7, 0x78, 0x4e, 0x22, 0x02, 0x42, 0x56, 0x06, 0x84, 0x06, 0xe4, 0xf9, 0x01, 0x8f, + 0x05, 0xeb, 0xc7, 0x53, 0x86, 0x18, 0x40, 0x6f, 0xc3, 0x6c, 0x34, 0x15, 0x4e, 0x73, 0x9c, 0x6a, + 0x37, 0x9c, 0x39, 0xaf, 0x41, 0x39, 0x94, 0xa1, 0x67, 0x38, 0x5e, 0x69, 0xa8, 0xe4, 0xe5, 0xf3, + 0x22, 0xac, 0x93, 0x63, 0x45, 0xf9, 0xf1, 0x94, 0x08, 0xec, 0x57, 0x45, 0x60, 0x2f, 0xa8, 0x89, + 0x96, 0xd8, 0x95, 0xc7, 0xf8, 0xeb, 0x6a, 0xd4, 0xfa, 0x26, 0x21, 0x0e, 0x90, 0x64, 0xf8, 0xd2, + 0x0d, 0xa8, 0x84, 0x4c, 0x46, 0x72, 0x64, 0xfb, 0xe3, 0x67, 0xad, 0x75, 0x96, 0x50, 0x1f, 0xd1, + 0x1c, 0x6a, 0xd4, 0x34, 0x92, 0xa0, 0xd7, 0xdb, 0xdb, 0xdb, 0xb5, 0x0c, 0x3a, 0x0f, 0xc5, 0x8d, + 0xcd, 0xce, 0x0e, 0xc3, 0xca, 0x36, 0xf2, 0x7f, 0xcc, 0x22, 0x89, 0xcc, 0xcf, 0x9f, 0x06, 0x3c, + 0x79, 0x8a, 0x56, 0x32, 0xf3, 0x94, 0x92, 0x99, 0x35, 0x91, 0x99, 0x33, 0x32, 0x33, 0x67, 0x11, + 0x82, 0xe9, 0xf5, 0x76, 0x6b, 0x9b, 0x26, 0x69, 0xc6, 0x7a, 0x39, 0x9e, 0xad, 0x1f, 0x56, 0xa1, + 0xcc, 0xdc, 0xb3, 0x33, 0xb6, 0xc9, 0x61, 0xe2, 0xaf, 0x35, 0x00, 0xb9, 0x61, 0x51, 0x13, 0xf2, + 0x5d, 0xa6, 0x42, 0x5d, 0xa3, 0x11, 0xf0, 0x5c, 0xa2, 0xc7, 0x0d, 0x81, 0x85, 0xee, 0x42, 0xde, + 0x1b, 0x77, 0xbb, 0xd8, 0x13, 0x99, 0xfb, 0x42, 0x34, 0x08, 0xf3, 0x80, 0x68, 0x08, 0x3c, 0x42, + 0xf2, 0xd2, 0xb4, 0x06, 0x63, 0x9a, 0xc7, 0x8f, 0x26, 0xe1, 0x78, 0x32, 0xc6, 0xfe, 0x99, 0x06, + 0x25, 0x65, 0x5b, 0xfc, 0x82, 0x29, 0xe0, 0x32, 0x14, 0xa9, 0x32, 0xb8, 0xc7, 0x93, 0x40, 0xc1, + 0x90, 0x03, 0xe8, 0x3d, 0x28, 0x8a, 0x9d, 0x24, 0xf2, 0x40, 0x3d, 0x99, 0xed, 0xe6, 0xc8, 0x90, + 0xa8, 0x52, 0xc9, 0x0e, 0x9c, 0xa1, 0x76, 0xea, 0x92, 0xdb, 0x87, 0xb0, 0xac, 0x7a, 0x2c, 0xd7, + 0x22, 0xc7, 0xf2, 0x06, 0x14, 0x46, 0x7b, 0x87, 0x9e, 0xd5, 0x35, 0x07, 0x5c, 0x9d, 0xe0, 0x5b, + 0x72, 0xdd, 0x06, 0xa4, 0x72, 0x3d, 0x89, 0x01, 0x24, 0xd3, 0xf3, 0x50, 0x7a, 0x6c, 0x7a, 0x7b, + 0x5c, 0x49, 0x39, 0x7e, 0x0f, 0x2a, 0x64, 0xfc, 0xc9, 0xf3, 0xd7, 0x50, 0x5f, 0x50, 0x2d, 0xeb, + 0xff, 0xac, 0x41, 0x55, 0x90, 0x9d, 0xc8, 0x41, 0x08, 0x72, 0x7b, 0xa6, 0xb7, 0x47, 0x8d, 0x51, + 0x31, 0xe8, 0x6f, 0xf4, 0x36, 0xd4, 0xba, 0x6c, 0xfe, 0x3b, 0x91, 0x7b, 0xd7, 0x2c, 0x1f, 0x0f, + 0xf6, 0xfe, 0xbb, 0x50, 0x21, 0x24, 0x3b, 0xe1, 0x7b, 0x90, 0xd8, 0xc6, 0xef, 0x19, 0xe5, 0x3d, + 0x3a, 0xe7, 0xa8, 0xfa, 0x26, 0x94, 0x99, 0x31, 0x4e, 0x5b, 0x77, 0x69, 0xd7, 0x06, 0xcc, 0x6e, + 0xdb, 0xe6, 0xc8, 0xdb, 0x73, 0xfc, 0x88, 0xcd, 0x97, 0xf5, 0xbf, 0xd7, 0xa0, 0x26, 0x81, 0x27, + 0xd2, 0xe1, 0x2d, 0x98, 0x75, 0xf1, 0xd0, 0xb4, 0x6c, 0xcb, 0xee, 0xef, 0xec, 0x1e, 0xfa, 0xd8, + 0xe3, 0xd7, 0xd7, 0x6a, 0x30, 0xfc, 0x90, 0x8c, 0x12, 0x65, 0x77, 0x07, 0xce, 0x2e, 0x0f, 0xd2, + 0xf4, 0x37, 0x7a, 0x23, 0x1c, 0xa5, 0x8b, 0xd2, 0x6e, 0x62, 0x5c, 0xea, 0xfc, 0xd3, 0x0c, 0x94, + 0x3f, 0x31, 0xfd, 0xae, 0x58, 0x41, 0x68, 0x0d, 0xaa, 0x41, 0x18, 0xa7, 0x23, 0x5c, 0xef, 0xc8, + 0x81, 0x83, 0xd2, 0x88, 0x7b, 0x8d, 0x38, 0x70, 0x54, 0xba, 0xea, 0x00, 0x65, 0x65, 0xda, 0x5d, + 0x3c, 0x08, 0x58, 0x65, 0xd2, 0x59, 0x51, 0x44, 0x95, 0x95, 0x3a, 0x80, 0xbe, 0x0d, 0xb5, 0x91, + 0xeb, 0xf4, 0x5d, 0xec, 0x79, 0x01, 0x33, 0x96, 0xc2, 0xf5, 0x04, 0x66, 0x5b, 0x1c, 0x35, 0x72, + 0x8a, 0xb9, 0xf7, 0x78, 0xca, 0x98, 0x1d, 0x85, 0x61, 0x32, 0xb0, 0xce, 0xca, 0xf3, 0x1e, 0x8b, + 0xac, 0x3f, 0xca, 0x02, 0x8a, 0x4f, 0xf3, 0xab, 0x1e, 0x93, 0x6f, 0x40, 0xd5, 0xf3, 0x4d, 0x37, + 0xb6, 0xe6, 0x2b, 0x74, 0x34, 0x58, 0xf1, 0x6f, 0x41, 0xa0, 0xd9, 0x8e, 0xed, 0xf8, 0xd6, 0xcb, + 0x43, 0x76, 0x41, 0x31, 0xaa, 0x62, 0x78, 0x83, 0x8e, 0xa2, 0x0d, 0xc8, 0xbf, 0xb4, 0x06, 0x3e, + 0x76, 0xbd, 0xfa, 0xf4, 0x42, 0xf6, 0x66, 0x75, 0xe9, 0x9d, 0xe3, 0x1c, 0xb3, 0xf8, 0x11, 0xc5, + 0xef, 0x1c, 0x8e, 0xd4, 0xd3, 0x2f, 0x67, 0xa2, 0x1e, 0xe3, 0x67, 0x92, 0x6f, 0x44, 0x3a, 0x14, + 0x5e, 0x11, 0xa6, 0x3b, 0x56, 0x8f, 0xe6, 0xe2, 0x60, 0x1f, 0xde, 0x33, 0xf2, 0x14, 0xb0, 0xd6, + 0x43, 0xd7, 0xa0, 0xf0, 0xd2, 0x35, 0xfb, 0x43, 0x6c, 0xfb, 0xec, 0x96, 0x2f, 0x71, 0x02, 0x80, + 0xbe, 0x08, 0x20, 0x55, 0x21, 0x99, 0x6f, 0x63, 0x73, 0xeb, 0x59, 0xa7, 0x36, 0x85, 0xca, 0x50, + 0xd8, 0xd8, 0x5c, 0x6d, 0xaf, 0xb7, 0x49, 0x6e, 0x14, 0x39, 0xef, 0xae, 0xdc, 0x74, 0x2d, 0xe1, + 0x88, 0xd0, 0x9a, 0x50, 0xf5, 0xd2, 0xc2, 0x97, 0x6e, 0xa1, 0x97, 0x60, 0x71, 0x57, 0xbf, 0x0a, + 0x73, 0x49, 0x4b, 0x43, 0x20, 0xdc, 0xd3, 0xff, 0x2d, 0x03, 0x15, 0xbe, 0x11, 0x4e, 0xb4, 0x73, + 0x2f, 0x2a, 0x5a, 0xf1, 0xeb, 0x89, 0x30, 0x52, 0x1d, 0xf2, 0x6c, 0x83, 0xf4, 0xf8, 0xfd, 0x57, + 0x7c, 0x92, 0xe0, 0xcc, 0xd6, 0x3b, 0xee, 0x71, 0xb7, 0x07, 0xdf, 0x89, 0x61, 0x73, 0x3a, 0x35, + 0x6c, 0x06, 0x1b, 0xce, 0xf4, 0xf8, 0xc1, 0xaa, 0x28, 0x5d, 0x51, 0x16, 0x9b, 0x8a, 0x00, 0x43, + 0x3e, 0xcb, 0xa7, 0xf8, 0x0c, 0xdd, 0x80, 0x19, 0x3c, 0xc1, 0xb6, 0xef, 0xd5, 0x4b, 0x34, 0x91, + 0x56, 0xc4, 0x85, 0xaa, 0x4d, 0x46, 0x0d, 0x0e, 0x94, 0xae, 0xfa, 0x10, 0xce, 0xd0, 0xfb, 0xee, + 0x23, 0xd7, 0xb4, 0xd5, 0x3b, 0x7b, 0xa7, 0xb3, 0xce, 0xd3, 0x0e, 0xf9, 0x89, 0xaa, 0x90, 0x59, + 0x5b, 0xe5, 0xf6, 0xc9, 0xac, 0xad, 0x4a, 0xfa, 0xdf, 0xd7, 0x00, 0xa9, 0x0c, 0x4e, 0xe4, 0x8b, + 0x88, 0x14, 0xa1, 0x47, 0x56, 0xea, 0x31, 0x07, 0xd3, 0xd8, 0x75, 0x1d, 0x97, 0x05, 0x4a, 0x83, + 0x7d, 0x48, 0x6d, 0x6e, 0x73, 0x65, 0x0c, 0x3c, 0x71, 0xf6, 0x83, 0x08, 0xc0, 0xd8, 0x6a, 0x71, + 0xe5, 0x3b, 0x70, 0x36, 0x84, 0x7e, 0x3a, 0x29, 0x7e, 0x13, 0x66, 0x29, 0xd7, 0x95, 0x3d, 0xdc, + 0xdd, 0x1f, 0x39, 0x96, 0x1d, 0xd3, 0x00, 0x5d, 0x23, 0xb1, 0x4b, 0xa4, 0x0b, 0x32, 0x45, 0x36, + 0xe7, 0x72, 0x30, 0xd8, 0xe9, 0xac, 0xcb, 0xa5, 0xbe, 0x0b, 0xe7, 0x23, 0x0c, 0xc5, 0xcc, 0x7e, + 0x0d, 0x4a, 0xdd, 0x60, 0xd0, 0xe3, 0x27, 0xc8, 0x2b, 0x61, 0x75, 0xa3, 0xa4, 0x2a, 0x85, 0x94, + 0xf1, 0x6d, 0xb8, 0x10, 0x93, 0x71, 0x1a, 0xe6, 0xb8, 0xa7, 0xdf, 0x81, 0x73, 0x94, 0xf3, 0x13, + 0x8c, 0x47, 0xad, 0x81, 0x35, 0x39, 0xde, 0x2d, 0x87, 0x7c, 0xbe, 0x0a, 0xc5, 0xd7, 0xbb, 0xac, + 0xa4, 0xe8, 0x36, 0x17, 0xdd, 0xb1, 0x86, 0xb8, 0xe3, 0xac, 0xa7, 0x6b, 0x4b, 0x12, 0xf9, 0x3e, + 0x3e, 0xf4, 0xf8, 0xf1, 0x91, 0xfe, 0x96, 0xd1, 0xeb, 0x6f, 0x35, 0x6e, 0x4e, 0x95, 0xcf, 0xd7, + 0xbc, 0x35, 0xe6, 0x01, 0xfa, 0x64, 0x0f, 0xe2, 0x1e, 0x01, 0xb0, 0xda, 0x9c, 0x32, 0x12, 0x28, + 0x4c, 0xb2, 0x50, 0x39, 0xaa, 0xf0, 0x15, 0xbe, 0x71, 0xe8, 0x7f, 0xbc, 0xd8, 0x49, 0xe9, 0x4d, + 0x28, 0x51, 0xc8, 0xb6, 0x6f, 0xfa, 0x63, 0x2f, 0xcd, 0x73, 0xcb, 0xfa, 0x8f, 0x34, 0xbe, 0xa3, + 0x04, 0x9f, 0x13, 0xcd, 0xf9, 0x2e, 0xcc, 0xd0, 0x1b, 0xa2, 0xb8, 0xe9, 0x5c, 0x4c, 0x58, 0xd8, + 0x4c, 0x23, 0x83, 0x23, 0x2a, 0xe7, 0x24, 0x0d, 0x66, 0x9e, 0xd2, 0xce, 0x81, 0xa2, 0x6d, 0x4e, + 0x78, 0xce, 0x36, 0x87, 0xac, 0xfc, 0x58, 0x34, 0xe8, 0x6f, 0x7a, 0x21, 0xc0, 0xd8, 0x7d, 0x66, + 0xac, 0xb3, 0x1b, 0x48, 0xd1, 0x08, 0xbe, 0x89, 0x61, 0xbb, 0x03, 0x0b, 0xdb, 0x3e, 0x85, 0xe6, + 0x28, 0x54, 0x19, 0x41, 0x37, 0xa0, 0x68, 0x79, 0xeb, 0xd8, 0x74, 0x6d, 0x5e, 0xe2, 0x57, 0x02, + 0xb3, 0x84, 0xc8, 0x35, 0xf6, 0x1d, 0xa8, 0x31, 0xcd, 0x5a, 0xbd, 0x9e, 0x72, 0xda, 0x0f, 0xe4, + 0x6b, 0x11, 0xf9, 0x21, 0xfe, 0x99, 0xe3, 0xf9, 0xff, 0x9d, 0x06, 0x67, 0x14, 0x01, 0x27, 0x72, + 0xc1, 0xbb, 0x30, 0xc3, 0xfa, 0x2f, 0xfc, 0x28, 0x38, 0x17, 0xa6, 0x62, 0x62, 0x0c, 0x8e, 0x83, + 0x16, 0x21, 0xcf, 0x7e, 0x89, 0x6b, 0x5c, 0x32, 0xba, 0x40, 0x92, 0x2a, 0x2f, 0xc2, 0x59, 0x0e, + 0xc3, 0x43, 0x27, 0x69, 0xcf, 0xe5, 0xc2, 0x11, 0xe2, 0x87, 0x1a, 0xcc, 0x85, 0x09, 0x4e, 0x34, + 0x4b, 0x45, 0xef, 0xcc, 0x57, 0xd2, 0xfb, 0x5b, 0x42, 0xef, 0x67, 0xa3, 0x9e, 0x72, 0xe4, 0x8c, + 0xae, 0x38, 0xd5, 0xbb, 0x99, 0xb0, 0x77, 0x25, 0xaf, 0x9f, 0x04, 0x73, 0x12, 0xcc, 0x4e, 0x34, + 0xa7, 0xf7, 0x5f, 0x6b, 0x4e, 0xca, 0x11, 0x2c, 0x36, 0xb9, 0x35, 0xb1, 0x8c, 0xd6, 0x2d, 0x2f, + 0xc8, 0x38, 0xef, 0x40, 0x79, 0x60, 0xd9, 0xd8, 0x74, 0x79, 0x0f, 0x49, 0x53, 0xd7, 0xe3, 0x7d, + 0x23, 0x04, 0x94, 0xac, 0x7e, 0x5b, 0x03, 0xa4, 0xf2, 0xfa, 0xe5, 0x78, 0xab, 0x29, 0x0c, 0xbc, + 0xe5, 0x3a, 0x43, 0xc7, 0x3f, 0x6e, 0x99, 0xdd, 0xd3, 0x7f, 0x57, 0x83, 0x73, 0x11, 0x8a, 0x5f, + 0x86, 0xe6, 0xf7, 0xf4, 0xcb, 0x70, 0x66, 0x15, 0x8b, 0x33, 0x5e, 0xac, 0x76, 0xb0, 0x0d, 0x48, + 0x85, 0x9e, 0xce, 0x29, 0xe6, 0x1b, 0x70, 0xe6, 0xa9, 0x33, 0x21, 0x81, 0x9c, 0x80, 0x65, 0x98, + 0x62, 0xc5, 0xac, 0xc0, 0x5e, 0xc1, 0xb7, 0x0c, 0xbd, 0xdb, 0x80, 0x54, 0xca, 0xd3, 0x50, 0x67, + 0x59, 0xff, 0x5f, 0x0d, 0xca, 0xad, 0x81, 0xe9, 0x0e, 0x85, 0x2a, 0x1f, 0xc2, 0x0c, 0xab, 0xcc, + 0xf0, 0x32, 0xeb, 0x9b, 0x61, 0x7e, 0x2a, 0x2e, 0xfb, 0x68, 0xb1, 0x3a, 0x0e, 0xa7, 0x22, 0x53, + 0xe1, 0x9d, 0xe5, 0xd5, 0x48, 0xa7, 0x79, 0x15, 0xdd, 0x86, 0x69, 0x93, 0x90, 0xd0, 0xf4, 0x5a, + 0x8d, 0x96, 0xcb, 0x28, 0x37, 0x72, 0x25, 0x32, 0x18, 0x96, 0xfe, 0x01, 0x94, 0x14, 0x09, 0x28, + 0x0f, 0xd9, 0x47, 0x6d, 0x7e, 0x4d, 0x6a, 0xad, 0x74, 0xd6, 0x9e, 0xb3, 0x12, 0x62, 0x15, 0x60, + 0xb5, 0x1d, 0x7c, 0x67, 0x12, 0x1a, 0x7b, 0x26, 0xe7, 0xc3, 0xf3, 0x96, 0xaa, 0xa1, 0x96, 0xa6, + 0x61, 0xe6, 0x75, 0x34, 0x94, 0x22, 0x7e, 0x4b, 0x83, 0x0a, 0x37, 0xcd, 0x49, 0x53, 0x33, 0xe5, + 0x9c, 0x92, 0x9a, 0x95, 0x69, 0x18, 0x1c, 0x51, 0xea, 0xf0, 0x2f, 0x1a, 0xd4, 0x56, 0x9d, 0x57, + 0x76, 0xdf, 0x35, 0x7b, 0xc1, 0x1e, 0xfc, 0x28, 0xe2, 0xce, 0xc5, 0x48, 0xa5, 0x3f, 0x82, 0x2f, + 0x07, 0x22, 0x6e, 0xad, 0xcb, 0x5a, 0x0a, 0xcb, 0xef, 0xe2, 0x53, 0xff, 0x26, 0xcc, 0x46, 0x88, + 0x88, 0x83, 0x9e, 0xb7, 0xd6, 0xd7, 0x56, 0x89, 0x43, 0x68, 0xbd, 0xb7, 0xbd, 0xd1, 0x7a, 0xb8, + 0xde, 0xe6, 0x5d, 0xd9, 0xd6, 0xc6, 0x4a, 0x7b, 0x5d, 0x3a, 0xea, 0xbe, 0x98, 0xc1, 0x7d, 0x7d, + 0x00, 0x67, 0x14, 0x85, 0x4e, 0xda, 0x1c, 0x4b, 0xd6, 0x57, 0x4a, 0xfb, 0x06, 0x5c, 0x0a, 0xa4, + 0x3d, 0x67, 0xc0, 0x0e, 0xf6, 0xd4, 0xcb, 0xda, 0x84, 0x0b, 0x2d, 0x1a, 0xe4, 0xa7, 0xa0, 0x7c, + 0x4f, 0xaf, 0x43, 0x85, 0x9f, 0x8f, 0xa2, 0x21, 0xe3, 0xcf, 0x73, 0x50, 0x15, 0xa0, 0xaf, 0x47, + 0x7f, 0x74, 0x1e, 0x66, 0x7a, 0xbb, 0xdb, 0xd6, 0x67, 0xa2, 0xa3, 0xcb, 0xbf, 0xc8, 0xf8, 0x80, + 0xc9, 0x61, 0xef, 0x34, 0xf8, 0x17, 0xba, 0xcc, 0x9e, 0x70, 0xac, 0xd9, 0x3d, 0x7c, 0x40, 0x8f, + 0x51, 0x39, 0x43, 0x0e, 0xd0, 0x72, 0x28, 0x7f, 0xcf, 0x41, 0x6f, 0xc9, 0xca, 0xfb, 0x0e, 0xb4, + 0x0c, 0x35, 0xf2, 0xbb, 0x35, 0x1a, 0x0d, 0x2c, 0xdc, 0x63, 0x0c, 0xc8, 0x05, 0x39, 0x27, 0xcf, + 0x49, 0x31, 0x04, 0x74, 0x15, 0x66, 0xe8, 0xe5, 0xd1, 0xab, 0x17, 0x48, 0x46, 0x96, 0xa8, 0x7c, + 0x18, 0xbd, 0x0d, 0x25, 0xa6, 0xf1, 0x9a, 0xfd, 0xcc, 0xc3, 0xf4, 0xb5, 0x83, 0x52, 0x49, 0x51, + 0x61, 0xe1, 0x13, 0x1a, 0xa4, 0x9d, 0xd0, 0x50, 0x13, 0xaa, 0x9e, 0xef, 0xb8, 0x66, 0x5f, 0xb8, + 0x91, 0x3e, 0x75, 0x50, 0xca, 0x7d, 0x11, 0xb0, 0x54, 0xe1, 0xe3, 0xb1, 0xe3, 0x9b, 0xe1, 0x27, + 0x0e, 0xef, 0x19, 0x2a, 0x0c, 0x7d, 0x0b, 0x2a, 0x3d, 0xb1, 0x48, 0xd6, 0xec, 0x97, 0x0e, 0x7d, + 0xd6, 0x10, 0xeb, 0xde, 0xad, 0xaa, 0x28, 0x92, 0x53, 0x98, 0x54, 0xbd, 0xc9, 0x56, 0x42, 0x14, + 0xc4, 0xdb, 0xd8, 0x26, 0xa9, 0x9d, 0x55, 0x70, 0x0a, 0x86, 0xf8, 0x44, 0xd7, 0xa1, 0xc2, 0x32, + 0xc1, 0xf3, 0xd0, 0x6a, 0x08, 0x0f, 0x92, 0x3c, 0xd6, 0x1a, 0xfb, 0x7b, 0x6d, 0x4a, 0x14, 0x5b, + 0x94, 0x57, 0x00, 0x11, 0xe8, 0xaa, 0xe5, 0x25, 0x82, 0x39, 0x71, 0xe2, 0x8a, 0xbe, 0xaf, 0x6f, + 0xc0, 0x59, 0x02, 0xc5, 0xb6, 0x6f, 0x75, 0x95, 0xa3, 0x98, 0x38, 0xec, 0x6b, 0x91, 0xc3, 0xbe, + 0xe9, 0x79, 0xaf, 0x1c, 0xb7, 0xc7, 0xd5, 0x0c, 0xbe, 0xa5, 0xb4, 0x7f, 0xd4, 0x98, 0x36, 0xcf, + 0xbc, 0xd0, 0x41, 0xfd, 0x2b, 0xf2, 0x43, 0xbf, 0x02, 0x79, 0xfe, 0x40, 0x8a, 0xd7, 0x3f, 0xcf, + 0x2f, 0xb2, 0x87, 0x59, 0x8b, 0x9c, 0xf1, 0x26, 0x83, 0x2a, 0x35, 0x3a, 0x8e, 0x4f, 0x96, 0xcb, + 0x9e, 0xe9, 0xed, 0xe1, 0xde, 0x96, 0x60, 0x1e, 0xaa, 0x0e, 0xdf, 0x37, 0x22, 0x60, 0xa9, 0xfb, + 0x5d, 0xa9, 0xfa, 0x23, 0xec, 0x1f, 0xa1, 0xba, 0xda, 0x7f, 0x38, 0x27, 0x48, 0x78, 0xdb, 0xf4, + 0x75, 0xa8, 0x7e, 0xac, 0xc1, 0x15, 0x41, 0xb6, 0xb2, 0x67, 0xda, 0x7d, 0x2c, 0x94, 0xf9, 0x45, + 0xed, 0x15, 0x9f, 0x74, 0xf6, 0x35, 0x27, 0xfd, 0x04, 0xea, 0xc1, 0xa4, 0x69, 0x2d, 0xca, 0x19, + 0xa8, 0x93, 0x18, 0x7b, 0x41, 0x90, 0xa4, 0xbf, 0xc9, 0x98, 0xeb, 0x0c, 0x82, 0x6b, 0x20, 0xf9, + 0x2d, 0x99, 0xad, 0xc3, 0x45, 0xc1, 0x8c, 0x17, 0x87, 0xc2, 0xdc, 0x62, 0x73, 0x3a, 0x92, 0x1b, + 0xf7, 0x07, 0xe1, 0x71, 0xf4, 0x52, 0x4a, 0x24, 0x09, 0xbb, 0x90, 0x4a, 0xd1, 0x92, 0xa4, 0xcc, + 0xb3, 0x1d, 0x40, 0x74, 0x56, 0x4e, 0xec, 0x31, 0x38, 0x61, 0x99, 0x08, 0xe7, 0x4b, 0x80, 0xc0, + 0x63, 0x4b, 0x20, 0x5d, 0x2a, 0x86, 0xf9, 0x40, 0x51, 0x62, 0xf6, 0x2d, 0xec, 0x0e, 0x2d, 0xcf, + 0x53, 0x1a, 0x71, 0x49, 0xe6, 0x7a, 0x13, 0x72, 0x23, 0xcc, 0x8f, 0x2f, 0xa5, 0x25, 0x24, 0xf6, + 0x84, 0x42, 0x4c, 0xe1, 0x52, 0xcc, 0x10, 0xae, 0x0a, 0x31, 0xcc, 0x21, 0x89, 0x72, 0xa2, 0x6a, + 0x8a, 0xe2, 0x7f, 0x26, 0xa5, 0xf8, 0x9f, 0x0d, 0x17, 0xff, 0x43, 0x47, 0x6a, 0x35, 0x50, 0x9d, + 0xce, 0x91, 0xba, 0xc3, 0x1c, 0x10, 0xc4, 0xb7, 0xd3, 0xe1, 0xfa, 0x07, 0x3c, 0x50, 0x9d, 0x56, + 0x3a, 0x17, 0x01, 0x3e, 0x13, 0x0e, 0xf0, 0x3a, 0x94, 0x89, 0x93, 0x0c, 0xb5, 0x2b, 0x92, 0x33, + 0x42, 0x63, 0x32, 0x18, 0xef, 0xc3, 0x5c, 0x38, 0x18, 0x9f, 0x48, 0xa9, 0x39, 0x98, 0xf6, 0x9d, + 0x7d, 0x2c, 0x72, 0x0a, 0xfb, 0x88, 0x99, 0x35, 0x08, 0xd4, 0xa7, 0x63, 0xd6, 0xef, 0x4a, 0xae, + 0x74, 0x03, 0x9e, 0x74, 0x06, 0x64, 0x39, 0x8a, 0xdb, 0x3f, 0xfb, 0x90, 0xb2, 0x3e, 0x81, 0xf3, + 0xd1, 0xe0, 0x7b, 0x3a, 0x93, 0xd8, 0x61, 0x9b, 0x33, 0x29, 0x3c, 0x9f, 0x8e, 0x80, 0x17, 0x32, + 0x4e, 0x2a, 0x41, 0xf7, 0x74, 0x78, 0xff, 0x3a, 0x34, 0x92, 0x62, 0xf0, 0xa9, 0xee, 0xc5, 0x20, + 0x24, 0x9f, 0x0e, 0xd7, 0x1f, 0x6a, 0x92, 0xad, 0xba, 0x6a, 0x3e, 0xf8, 0x2a, 0x6c, 0x45, 0xae, + 0xbb, 0x13, 0x2c, 0x9f, 0x66, 0x10, 0x2d, 0xb3, 0xc9, 0xd1, 0x52, 0x92, 0x50, 0x44, 0xb1, 0xff, + 0x64, 0xa8, 0xff, 0x3a, 0x57, 0x2f, 0x17, 0x26, 0xf3, 0xce, 0x49, 0x85, 0x91, 0xf4, 0x1c, 0x08, + 0xa3, 0x1f, 0xb1, 0xad, 0xa2, 0x26, 0xa9, 0xd3, 0x71, 0xdd, 0x6f, 0xc8, 0x04, 0x13, 0xcb, 0x63, + 0xa7, 0x23, 0xc1, 0x84, 0x85, 0xf4, 0x14, 0x76, 0x2a, 0x22, 0x6e, 0xb5, 0xa0, 0x18, 0xdc, 0xfd, + 0x95, 0x97, 0xca, 0x25, 0xc8, 0x6f, 0x6c, 0x6e, 0x6f, 0xb5, 0x56, 0xc8, 0xd5, 0x76, 0x0e, 0xf2, + 0x2b, 0x9b, 0x86, 0xf1, 0x6c, 0xab, 0x43, 0xee, 0xb6, 0xd1, 0x87, 0x4b, 0x4b, 0x3f, 0xcb, 0x42, + 0xe6, 0xc9, 0x73, 0xf4, 0x29, 0x4c, 0xb3, 0x87, 0x73, 0x47, 0xbc, 0x9f, 0x6c, 0x1c, 0xf5, 0x36, + 0x50, 0xbf, 0xf0, 0x83, 0xff, 0xfe, 0xd9, 0x1f, 0x66, 0xce, 0xe8, 0xe5, 0xe6, 0x64, 0xb9, 0xb9, + 0x3f, 0x69, 0xd2, 0x24, 0xfb, 0x40, 0xbb, 0x85, 0x3e, 0x86, 0xec, 0xd6, 0xd8, 0x47, 0xa9, 0xef, + 0x2a, 0x1b, 0xe9, 0xcf, 0x05, 0xf5, 0x73, 0x94, 0xe9, 0xac, 0x0e, 0x9c, 0xe9, 0x68, 0xec, 0x13, + 0x96, 0xdf, 0x83, 0x92, 0xfa, 0xd8, 0xef, 0xd8, 0xc7, 0x96, 0x8d, 0xe3, 0x1f, 0x12, 0xea, 0x57, + 0xa8, 0xa8, 0x0b, 0x3a, 0xe2, 0xa2, 0xd8, 0x73, 0x44, 0x75, 0x16, 0x9d, 0x03, 0x1b, 0xa5, 0x3e, + 0xc5, 0x6c, 0xa4, 0xbf, 0x2d, 0x8c, 0xcd, 0xc2, 0x3f, 0xb0, 0x09, 0xcb, 0xef, 0xf2, 0x47, 0x84, + 0x5d, 0x1f, 0x5d, 0x4d, 0x78, 0x05, 0xa6, 0xbe, 0x6e, 0x6a, 0x2c, 0xa4, 0x23, 0x70, 0x21, 0x97, + 0xa9, 0x90, 0xf3, 0xfa, 0x19, 0x2e, 0xa4, 0x1b, 0xa0, 0x3c, 0xd0, 0x6e, 0x2d, 0x75, 0x61, 0x9a, + 0x76, 0xcf, 0xd1, 0x0b, 0xf1, 0xa3, 0x91, 0xf0, 0x2e, 0x21, 0xc5, 0xd1, 0xa1, 0xbe, 0xbb, 0x3e, + 0x47, 0x05, 0x55, 0xf5, 0x22, 0x11, 0x44, 0x7b, 0xe7, 0x0f, 0xb4, 0x5b, 0x37, 0xb5, 0x3b, 0xda, + 0xd2, 0xdf, 0x4c, 0xc3, 0x34, 0xed, 0xd2, 0xa0, 0x7d, 0x00, 0xd9, 0x25, 0x8e, 0xce, 0x2e, 0xd6, + 0x80, 0x8e, 0xce, 0x2e, 0xde, 0x60, 0xd6, 0x1b, 0x54, 0xe8, 0x9c, 0x3e, 0x4b, 0x84, 0xd2, 0xe6, + 0x4f, 0x93, 0xf6, 0xba, 0x88, 0x1d, 0x7f, 0xac, 0xf1, 0x76, 0x15, 0xdb, 0x66, 0x28, 0x89, 0x5b, + 0xa8, 0x43, 0x1c, 0x5d, 0x0e, 0x09, 0x4d, 0x61, 0xfd, 0x3e, 0x15, 0xd8, 0xd4, 0x6b, 0x52, 0xa0, + 0x4b, 0x31, 0x1e, 0x68, 0xb7, 0x5e, 0xd4, 0xf5, 0xb3, 0xdc, 0xca, 0x11, 0x08, 0xfa, 0x3e, 0x54, + 0xc3, 0xbd, 0x4c, 0x74, 0x2d, 0x41, 0x56, 0xb4, 0x37, 0xda, 0xb8, 0x7e, 0x34, 0x12, 0xd7, 0x69, + 0x9e, 0xea, 0xc4, 0x85, 0x33, 0xc9, 0xfb, 0x18, 0x8f, 0x4c, 0x82, 0xc4, 0x7d, 0x80, 0xfe, 0x54, + 0xe3, 0xed, 0x68, 0xd9, 0x8a, 0x44, 0x49, 0xdc, 0x63, 0x1d, 0xcf, 0xc6, 0x8d, 0x63, 0xb0, 0xb8, + 0x12, 0x1f, 0x50, 0x25, 0xde, 0xd7, 0xe7, 0xa4, 0x12, 0xbe, 0x35, 0xc4, 0xbe, 0xc3, 0xb5, 0x78, + 0x71, 0x59, 0xbf, 0x10, 0x32, 0x4e, 0x08, 0x2a, 0x9d, 0xc5, 0x5a, 0x86, 0x89, 0xce, 0x0a, 0x75, + 0x25, 0x13, 0x9d, 0x15, 0xee, 0x37, 0x26, 0x39, 0x8b, 0x37, 0x08, 0x13, 0x9c, 0x15, 0x40, 0x96, + 0xfe, 0x3f, 0x07, 0xf9, 0x15, 0xf6, 0x3f, 0x23, 0x21, 0x07, 0x8a, 0x41, 0x13, 0x0d, 0xcd, 0x27, + 0xd5, 0xe9, 0xe5, 0x55, 0xae, 0x71, 0x35, 0x15, 0xce, 0x15, 0x7a, 0x83, 0x2a, 0x74, 0x49, 0x3f, + 0x4f, 0x24, 0xf3, 0xff, 0xdf, 0xa9, 0xc9, 0xaa, 0xb9, 0x4d, 0xb3, 0xd7, 0x23, 0x86, 0xf8, 0x4d, + 0x28, 0xab, 0x2d, 0x2d, 0xf4, 0x46, 0x62, 0x6f, 0x40, 0xed, 0x8f, 0x35, 0xf4, 0xa3, 0x50, 0xb8, + 0xe4, 0xeb, 0x54, 0xf2, 0xbc, 0x7e, 0x31, 0x41, 0xb2, 0x4b, 0x51, 0x43, 0xc2, 0x59, 0xef, 0x29, + 0x59, 0x78, 0xa8, 0xc9, 0x95, 0x2c, 0x3c, 0xdc, 0xba, 0x3a, 0x52, 0xf8, 0x98, 0xa2, 0x12, 0xe1, + 0x1e, 0x80, 0x6c, 0x0e, 0xa1, 0x44, 0x5b, 0x2a, 0x17, 0xd6, 0x68, 0x70, 0x88, 0xf7, 0x95, 0x74, + 0x9d, 0x8a, 0xe5, 0xeb, 0x2e, 0x22, 0x76, 0x60, 0x79, 0x3e, 0xdb, 0x98, 0x95, 0x50, 0x6b, 0x07, + 0x25, 0xce, 0x27, 0xdc, 0x29, 0x6a, 0x5c, 0x3b, 0x12, 0x87, 0x4b, 0xbf, 0x41, 0xa5, 0x5f, 0xd5, + 0x1b, 0x09, 0xd2, 0x47, 0x0c, 0x97, 0x2c, 0xb6, 0xcf, 0xf3, 0x50, 0x7a, 0x6a, 0x5a, 0xb6, 0x8f, + 0x6d, 0xd3, 0xee, 0x62, 0xb4, 0x0b, 0xd3, 0x34, 0x77, 0x47, 0x03, 0xb1, 0xda, 0xc9, 0x88, 0x06, + 0xe2, 0x50, 0x29, 0x5f, 0x5f, 0xa0, 0x82, 0x1b, 0xfa, 0x39, 0x22, 0x78, 0x28, 0x59, 0x37, 0x59, + 0x13, 0x40, 0xbb, 0x85, 0x5e, 0xc2, 0x0c, 0x6f, 0xe1, 0x47, 0x18, 0x85, 0x8a, 0x6a, 0x8d, 0xcb, + 0xc9, 0xc0, 0xa4, 0xb5, 0xac, 0x8a, 0xf1, 0x28, 0x1e, 0x91, 0x33, 0x01, 0x90, 0x1d, 0xa9, 0xa8, + 0x47, 0x63, 0x9d, 0xac, 0xc6, 0x42, 0x3a, 0x42, 0x92, 0x4d, 0x55, 0x99, 0xbd, 0x00, 0x97, 0xc8, + 0xfd, 0x0e, 0xe4, 0x1e, 0x9b, 0xde, 0x1e, 0x8a, 0xe4, 0x5e, 0xe5, 0xc5, 0x6d, 0xa3, 0x91, 0x04, + 0xe2, 0x52, 0xae, 0x52, 0x29, 0x17, 0x59, 0x28, 0x53, 0xa5, 0xd0, 0x37, 0xa5, 0xcc, 0x7e, 0xec, + 0xb9, 0x6d, 0xd4, 0x7e, 0xa1, 0xb7, 0xbb, 0x51, 0xfb, 0x85, 0x5f, 0xe8, 0xa6, 0xdb, 0x8f, 0x48, + 0xd9, 0x9f, 0x10, 0x39, 0x23, 0x28, 0x88, 0x87, 0xa9, 0x28, 0xf2, 0x9c, 0x27, 0xf2, 0x9a, 0xb5, + 0x31, 0x9f, 0x06, 0xe6, 0xd2, 0xae, 0x51, 0x69, 0x57, 0xf4, 0x7a, 0xcc, 0x5b, 0x1c, 0xf3, 0x81, + 0x76, 0xeb, 0x8e, 0x86, 0xbe, 0x0f, 0x20, 0x9b, 0x76, 0xb1, 0x3d, 0x18, 0x6d, 0x04, 0xc6, 0xf6, + 0x60, 0xac, 0xdf, 0xa7, 0x2f, 0x52, 0xb9, 0x37, 0xf5, 0x6b, 0x51, 0xb9, 0xbe, 0x6b, 0xda, 0xde, + 0x4b, 0xec, 0xde, 0x66, 0x75, 0x7f, 0x6f, 0xcf, 0x1a, 0x91, 0x29, 0xbb, 0x50, 0x0c, 0x6a, 0xcd, + 0xd1, 0x78, 0x1b, 0xed, 0xfe, 0x44, 0xe3, 0x6d, 0xac, 0x19, 0x13, 0x0e, 0x3c, 0xa1, 0xf5, 0x22, + 0x50, 0xc9, 0x16, 0xfc, 0xcb, 0x1a, 0xe4, 0xc8, 0x91, 0x9c, 0x1c, 0x4f, 0x64, 0xb9, 0x27, 0x3a, + 0xfb, 0x58, 0xc5, 0x3a, 0x3a, 0xfb, 0x78, 0xa5, 0x28, 0x7c, 0x3c, 0x21, 0xd7, 0xb5, 0x26, 0xab, + 0xa3, 0x90, 0x99, 0x3a, 0x50, 0x52, 0xca, 0x40, 0x28, 0x81, 0x59, 0xb8, 0x02, 0x1e, 0x4d, 0x78, + 0x09, 0x35, 0x24, 0xfd, 0x12, 0x95, 0x77, 0x8e, 0x25, 0x3c, 0x2a, 0xaf, 0xc7, 0x30, 0x88, 0x40, + 0x3e, 0x3b, 0xbe, 0xf3, 0x13, 0x66, 0x17, 0xde, 0xfd, 0x0b, 0xe9, 0x08, 0xa9, 0xb3, 0x93, 0x5b, + 0xff, 0x15, 0x94, 0xd5, 0xd2, 0x0f, 0x4a, 0x50, 0x3e, 0x52, 0xa3, 0x8f, 0x66, 0x92, 0xa4, 0xca, + 0x51, 0x38, 0xb6, 0x51, 0x91, 0xa6, 0x82, 0x46, 0x04, 0x0f, 0x20, 0xcf, 0x4b, 0x40, 0x49, 0x26, + 0x0d, 0x97, 0xf1, 0x93, 0x4c, 0x1a, 0xa9, 0x1f, 0x85, 0xcf, 0xcf, 0x54, 0x22, 0xb9, 0x8a, 0x8a, + 0x6c, 0xcd, 0xa5, 0x3d, 0xc2, 0x7e, 0x9a, 0x34, 0x59, 0xb6, 0x4d, 0x93, 0xa6, 0x54, 0x08, 0xd2, + 0xa4, 0xf5, 0xb1, 0xcf, 0xe3, 0x81, 0xb8, 0x5e, 0xa3, 0x14, 0x66, 0x6a, 0x86, 0xd4, 0x8f, 0x42, + 0x49, 0xba, 0xde, 0x48, 0x81, 0x22, 0x3d, 0x1e, 0x00, 0xc8, 0x72, 0x54, 0xf4, 0xcc, 0x9a, 0xd8, + 0x29, 0x88, 0x9e, 0x59, 0x93, 0x2b, 0x5a, 0xe1, 0x18, 0x2b, 0xe5, 0xb2, 0xdb, 0x15, 0x91, 0xfc, + 0x85, 0x06, 0x28, 0x5e, 0xb0, 0x42, 0xef, 0x24, 0x73, 0x4f, 0xec, 0x3a, 0x34, 0xde, 0x7d, 0x3d, + 0xe4, 0xa4, 0x80, 0x2c, 0x55, 0xea, 0x52, 0xec, 0xd1, 0x2b, 0xa2, 0xd4, 0xe7, 0x1a, 0x54, 0x42, + 0x45, 0x2e, 0xf4, 0x66, 0x8a, 0x4f, 0x23, 0xad, 0x87, 0xc6, 0x5b, 0xc7, 0xe2, 0x25, 0x1d, 0xe6, + 0x95, 0x15, 0x20, 0x6e, 0x35, 0xbf, 0xa3, 0x41, 0x35, 0x5c, 0x0b, 0x43, 0x29, 0xbc, 0x63, 0x1d, + 0x8b, 0xc6, 0xcd, 0xe3, 0x11, 0x8f, 0x76, 0x8f, 0xbc, 0xd0, 0x0c, 0x20, 0xcf, 0x8b, 0x66, 0x49, + 0x0b, 0x3f, 0xdc, 0xe2, 0x48, 0x5a, 0xf8, 0x91, 0x8a, 0x5b, 0xc2, 0xc2, 0x77, 0x9d, 0x01, 0x56, + 0xb6, 0x19, 0xaf, 0xa5, 0xa5, 0x49, 0x3b, 0x7a, 0x9b, 0x45, 0x0a, 0x71, 0x69, 0xd2, 0xe4, 0x36, + 0x13, 0x25, 0x33, 0x94, 0xc2, 0xec, 0x98, 0x6d, 0x16, 0xad, 0xb8, 0x25, 0x6c, 0x33, 0x2a, 0x50, + 0xd9, 0x66, 0xb2, 0x94, 0x95, 0xb4, 0xcd, 0x62, 0xdd, 0x98, 0xa4, 0x6d, 0x16, 0xaf, 0x86, 0x25, + 0xf8, 0x91, 0xca, 0x0d, 0x6d, 0xb3, 0xb3, 0x09, 0xc5, 0x2e, 0xf4, 0x6e, 0x8a, 0x11, 0x13, 0x7b, + 0x3b, 0x8d, 0xdb, 0xaf, 0x89, 0x9d, 0xba, 0xc6, 0x99, 0xf9, 0xc5, 0x1a, 0xff, 0x23, 0x0d, 0xe6, + 0x92, 0xea, 0x63, 0x28, 0x45, 0x4e, 0x4a, 0x2b, 0xa8, 0xb1, 0xf8, 0xba, 0xe8, 0x47, 0x5b, 0x2b, + 0x58, 0xf5, 0x0f, 0xfb, 0x5f, 0xb4, 0x9a, 0x2f, 0xae, 0xc2, 0x15, 0x98, 0x69, 0x8d, 0xac, 0x27, + 0xf8, 0x10, 0x9d, 0x2d, 0x64, 0x1a, 0x15, 0xc2, 0xd7, 0x71, 0xad, 0xcf, 0xe8, 0x5f, 0xbd, 0x58, + 0xc8, 0xec, 0x96, 0x01, 0x02, 0x84, 0xa9, 0x7f, 0xff, 0x72, 0x5e, 0xfb, 0xaf, 0x2f, 0xe7, 0xb5, + 0xff, 0xf9, 0x72, 0x5e, 0xfb, 0xe9, 0xff, 0xcd, 0x4f, 0xbd, 0xb8, 0xd6, 0x77, 0xa8, 0x5a, 0x8b, + 0x96, 0xd3, 0x94, 0x7f, 0x89, 0x63, 0xb9, 0xa9, 0xaa, 0xba, 0x3b, 0x43, 0xff, 0x74, 0xc6, 0xf2, + 0xcf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0x9b, 0xab, 0xde, 0x11, 0x44, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -9461,6 +9653,11 @@ func (m *HashKVResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.HashRevision != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.HashRevision)) + i-- + dAtA[i] = 0x20 + } if m.CompactRevision != 0 { i = encodeVarintRpc(dAtA, i, uint64(m.CompactRevision)) i-- @@ -9581,6 +9778,13 @@ func (m *SnapshotResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = encodeVarintRpc(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0x22 + } if len(m.Blob) > 0 { i -= len(m.Blob) copy(dAtA[i:], m.Blob) @@ -11430,6 +11634,40 @@ func (m *DowngradeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *DowngradeVersionTestRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DowngradeVersionTestRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DowngradeVersionTestRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Ver) > 0 { + i -= len(m.Ver) + copy(dAtA[i:], m.Ver) + i = encodeVarintRpc(dAtA, i, uint64(len(m.Ver))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11481,6 +11719,30 @@ func (m *StatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.DowngradeInfo != nil { + { + size, err := m.DowngradeInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRpc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + if m.DbSizeQuota != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.DbSizeQuota)) + i-- + dAtA[i] = 0x60 + } + if len(m.StorageVersion) > 0 { + i -= len(m.StorageVersion) + copy(dAtA[i:], m.StorageVersion) + i = encodeVarintRpc(dAtA, i, uint64(len(m.StorageVersion))) + i-- + dAtA[i] = 0x5a + } if m.IsLearner { i-- if m.IsLearner { @@ -11552,6 +11814,50 @@ func (m *StatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *DowngradeInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DowngradeInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DowngradeInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.TargetVersion) > 0 { + i -= len(m.TargetVersion) + copy(dAtA[i:], m.TargetVersion) + i = encodeVarintRpc(dAtA, i, uint64(len(m.TargetVersion))) + i-- + dAtA[i] = 0x12 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *AuthEnableRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -13459,6 +13765,9 @@ func (m *HashKVResponse) Size() (n int) { if m.CompactRevision != 0 { n += 1 + sovRpc(uint64(m.CompactRevision)) } + if m.HashRevision != 0 { + n += 1 + sovRpc(uint64(m.HashRevision)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -13513,6 +13822,10 @@ func (m *SnapshotResponse) Size() (n int) { if l > 0 { n += 1 + l + sovRpc(uint64(l)) } + l = len(m.Version) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -14336,6 +14649,22 @@ func (m *DowngradeResponse) Size() (n int) { return n } +func (m *DowngradeVersionTestRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Ver) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *StatusRequest) Size() (n int) { if m == nil { return 0 @@ -14389,6 +14718,36 @@ func (m *StatusResponse) Size() (n int) { if m.IsLearner { n += 2 } + l = len(m.StorageVersion) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.DbSizeQuota != 0 { + n += 1 + sovRpc(uint64(m.DbSizeQuota)) + } + if m.DowngradeInfo != nil { + l = m.DowngradeInfo.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *DowngradeInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled { + n += 2 + } + l = len(m.TargetVersion) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -17568,6 +17927,25 @@ func (m *HashKVResponse) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HashRevision", wireType) + } + m.HashRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HashRevision |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -17865,6 +18243,38 @@ func (m *SnapshotResponse) Unmarshal(dAtA []byte) error { m.Blob = []byte{} } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -22145,6 +22555,89 @@ func (m *DowngradeResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *DowngradeVersionTestRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DowngradeVersionTestRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DowngradeVersionTestRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *StatusRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -22459,6 +22952,196 @@ func (m *StatusResponse) Unmarshal(dAtA []byte) error { } } m.IsLearner = bool(v != 0) + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StorageVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StorageVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DbSizeQuota", wireType) + } + m.DbSizeQuota = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DbSizeQuota |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DowngradeInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DowngradeInfo == nil { + m.DowngradeInfo = &DowngradeInfo{} + } + if err := m.DowngradeInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DowngradeInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DowngradeInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DowngradeInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto index 4ccc234744..983dc01725 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto @@ -4,13 +4,36 @@ package etcdserverpb; import "gogoproto/gogo.proto"; import "etcd/api/mvccpb/kv.proto"; import "etcd/api/authpb/auth.proto"; +import "etcd/api/versionpb/version.proto"; // for grpc-gateway import "google/api/annotations.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; + +option go_package = "go.etcd.io/etcd/api/v3/etcdserverpb"; option (gogoproto.marshaler_all) = true; option (gogoproto.unmarshaler_all) = true; +option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { + security_definitions: { + security: { + key: "ApiKey"; + value: { + type: TYPE_API_KEY; + in: IN_HEADER; + name: "Authorization"; + } + } + } + security: { + security_requirement: { + key: "ApiKey"; + value: {}; + } + } +}; + service KV { // Range gets the keys in the range from the key-value store. rpc Range(RangeRequest) returns (RangeResponse) { @@ -388,13 +411,16 @@ service Auth { } message ResponseHeader { + option (versionpb.etcd_version_msg) = "3.0"; + // cluster_id is the ID of the cluster which sent the response. uint64 cluster_id = 1; // member_id is the ID of the member which sent the response. uint64 member_id = 2; - // revision is the key-value store revision when the request was applied. + // revision is the key-value store revision when the request was applied, and it's + // unset (so 0) in case of calls not interacting with key-value store. // For watch progress responses, the header.revision indicates progress. All future events - // recieved in this stream are guaranteed to have a higher revision number than the + // received in this stream are guaranteed to have a higher revision number than the // header.revision number. int64 revision = 3; // raft_term is the raft term when the request was applied. @@ -402,17 +428,21 @@ message ResponseHeader { } message RangeRequest { + option (versionpb.etcd_version_msg) = "3.0"; + enum SortOrder { - NONE = 0; // default, no sorting - ASCEND = 1; // lowest target value first - DESCEND = 2; // highest target value first + option (versionpb.etcd_version_enum) = "3.0"; + NONE = 0; // default, no sorting + ASCEND = 1; // lowest target value first + DESCEND = 2; // highest target value first } enum SortTarget { - KEY = 0; - VERSION = 1; - CREATE = 2; - MOD = 3; - VALUE = 4; + option (versionpb.etcd_version_enum) = "3.0"; + KEY = 0; + VERSION = 1; + CREATE = 2; + MOD = 3; + VALUE = 4; } // key is the first key for the range. If range_end is not given, the request only looks up key. @@ -453,33 +483,39 @@ message RangeRequest { // min_mod_revision is the lower bound for returned key mod revisions; all keys with // lesser mod revisions will be filtered away. - int64 min_mod_revision = 10; + int64 min_mod_revision = 10 [(versionpb.etcd_version_field)="3.1"]; // max_mod_revision is the upper bound for returned key mod revisions; all keys with // greater mod revisions will be filtered away. - int64 max_mod_revision = 11; + int64 max_mod_revision = 11 [(versionpb.etcd_version_field)="3.1"]; // min_create_revision is the lower bound for returned key create revisions; all keys with // lesser create revisions will be filtered away. - int64 min_create_revision = 12; + int64 min_create_revision = 12 [(versionpb.etcd_version_field)="3.1"]; // max_create_revision is the upper bound for returned key create revisions; all keys with // greater create revisions will be filtered away. - int64 max_create_revision = 13; + int64 max_create_revision = 13 [(versionpb.etcd_version_field)="3.1"]; } message RangeResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // kvs is the list of key-value pairs matched by the range request. // kvs is empty when count is requested. repeated mvccpb.KeyValue kvs = 2; // more indicates if there are more keys to return in the requested range. bool more = 3; - // count is set to the number of keys within the range when requested. + // count is set to the actual number of keys within the range when requested. + // Unlike Kvs, it is unaffected by limits and filters (e.g., Min/Max, Create/Modify, Revisions) + // and reflects the full count within the specified range. int64 count = 4; } message PutRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // key is the key, in bytes, to put into the key-value store. bytes key = 1; // value is the value, in bytes, to associate with the key in the key-value store. @@ -490,24 +526,28 @@ message PutRequest { // If prev_kv is set, etcd gets the previous key-value pair before changing it. // The previous key-value pair will be returned in the put response. - bool prev_kv = 4; + bool prev_kv = 4 [(versionpb.etcd_version_field)="3.1"]; // If ignore_value is set, etcd updates the key using its current value. // Returns an error if the key does not exist. - bool ignore_value = 5; + bool ignore_value = 5 [(versionpb.etcd_version_field)="3.2"]; // If ignore_lease is set, etcd updates the key using its current lease. // Returns an error if the key does not exist. - bool ignore_lease = 6; + bool ignore_lease = 6 [(versionpb.etcd_version_field)="3.2"]; } message PutResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // if prev_kv is set in the request, the previous key-value pair will be returned. - mvccpb.KeyValue prev_kv = 2; + mvccpb.KeyValue prev_kv = 2 [(versionpb.etcd_version_field)="3.1"]; } message DeleteRangeRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // key is the first key to delete in the range. bytes key = 1; // range_end is the key following the last key to delete for the range [key, range_end). @@ -519,50 +559,61 @@ message DeleteRangeRequest { // If prev_kv is set, etcd gets the previous key-value pairs before deleting it. // The previous key-value pairs will be returned in the delete response. - bool prev_kv = 3; + bool prev_kv = 3 [(versionpb.etcd_version_field)="3.1"]; } message DeleteRangeResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // deleted is the number of keys deleted by the delete range request. int64 deleted = 2; // if prev_kv is set in the request, the previous key-value pairs will be returned. - repeated mvccpb.KeyValue prev_kvs = 3; + repeated mvccpb.KeyValue prev_kvs = 3 [(versionpb.etcd_version_field)="3.1"]; } message RequestOp { + option (versionpb.etcd_version_msg) = "3.0"; // request is a union of request types accepted by a transaction. oneof request { RangeRequest request_range = 1; PutRequest request_put = 2; DeleteRangeRequest request_delete_range = 3; - TxnRequest request_txn = 4; + TxnRequest request_txn = 4 [(versionpb.etcd_version_field)="3.3"]; } } message ResponseOp { + option (versionpb.etcd_version_msg) = "3.0"; + // response is a union of response types returned by a transaction. oneof response { RangeResponse response_range = 1; PutResponse response_put = 2; DeleteRangeResponse response_delete_range = 3; - TxnResponse response_txn = 4; + TxnResponse response_txn = 4 [(versionpb.etcd_version_field)="3.3"]; } } message Compare { + option (versionpb.etcd_version_msg) = "3.0"; + enum CompareResult { + option (versionpb.etcd_version_enum) = "3.0"; + EQUAL = 0; GREATER = 1; LESS = 2; - NOT_EQUAL = 3; + NOT_EQUAL = 3 [(versionpb.etcd_version_enum_value)="3.1"]; } enum CompareTarget { + option (versionpb.etcd_version_enum) = "3.0"; + VERSION = 0; CREATE = 1; MOD = 2; VALUE = 3; - LEASE = 4; + LEASE = 4 [(versionpb.etcd_version_enum_value)="3.3"]; } // result is logical comparison operation for this comparison. CompareResult result = 1; @@ -580,13 +631,13 @@ message Compare { // value is the value of the given key, in bytes. bytes value = 7; // lease is the lease id of the given key. - int64 lease = 8; + int64 lease = 8 [(versionpb.etcd_version_field)="3.3"]; // leave room for more target_union field tags, jump to 64 } // range_end compares the given target to all keys in the range [key, range_end). // See RangeRequest for more details on key ranges. - bytes range_end = 64; + bytes range_end = 64 [(versionpb.etcd_version_field)="3.3"]; // TODO: fill out with most of the rest of RangeRequest fields when needed. } @@ -606,6 +657,8 @@ message Compare { // true. // 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false. message TxnRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // compare is a list of predicates representing a conjunction of terms. // If the comparisons succeed, then the success requests will be processed in order, // and the response will contain their respective responses in order. @@ -619,6 +672,8 @@ message TxnRequest { } message TxnResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // succeeded is set to true if the compare evaluated to true or false otherwise. bool succeeded = 2; @@ -630,6 +685,8 @@ message TxnResponse { // CompactionRequest compacts the key-value store up to a given revision. All superseded keys // with a revision less than the compaction revision will be removed. message CompactionRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // revision is the key-value store revision for the compaction operation. int64 revision = 1; // physical is set so the RPC will wait until the compaction is physically @@ -639,35 +696,48 @@ message CompactionRequest { } message CompactionResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message HashRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message HashKVRequest { + option (versionpb.etcd_version_msg) = "3.3"; // revision is the key-value store revision for the hash operation. int64 revision = 1; } message HashKVResponse { + option (versionpb.etcd_version_msg) = "3.3"; + ResponseHeader header = 1; // hash is the hash value computed from the responding member's MVCC keys up to a given revision. uint32 hash = 2; // compact_revision is the compacted revision of key-value store when hash begins. int64 compact_revision = 3; + // hash_revision is the revision up to which the hash is calculated. + int64 hash_revision = 4 [(versionpb.etcd_version_field)="3.6"]; } message HashResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // hash is the hash value computed from the responding member's KV's backend. uint32 hash = 2; } message SnapshotRequest { + option (versionpb.etcd_version_msg) = "3.3"; } message SnapshotResponse { + option (versionpb.etcd_version_msg) = "3.3"; + // header has the current key-value store information. The first header in the snapshot // stream indicates the point in time of the snapshot. ResponseHeader header = 1; @@ -677,18 +747,26 @@ message SnapshotResponse { // blob contains the next chunk of the snapshot in the snapshot stream. bytes blob = 3; + + // local version of server that created the snapshot. + // In cluster with binaries with different version, each cluster can return different result. + // Informs which etcd server version should be used when restoring the snapshot. + string version = 4 [(versionpb.etcd_version_field)="3.6"]; } message WatchRequest { + option (versionpb.etcd_version_msg) = "3.0"; // request_union is a request to either create a new watcher or cancel an existing watcher. oneof request_union { WatchCreateRequest create_request = 1; WatchCancelRequest cancel_request = 2; - WatchProgressRequest progress_request = 3; + WatchProgressRequest progress_request = 3 [(versionpb.etcd_version_field)="3.4"]; } } message WatchCreateRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // key is the key to register for watching. bytes key = 1; @@ -709,6 +787,8 @@ message WatchCreateRequest { bool progress_notify = 4; enum FilterType { + option (versionpb.etcd_version_enum) = "3.1"; + // filter out put event. NOPUT = 0; // filter out delete event. @@ -716,34 +796,38 @@ message WatchCreateRequest { } // filters filter the events at server side before it sends back to the watcher. - repeated FilterType filters = 5; + repeated FilterType filters = 5 [(versionpb.etcd_version_field)="3.1"]; // If prev_kv is set, created watcher gets the previous KV before the event happens. // If the previous KV is already compacted, nothing will be returned. - bool prev_kv = 6; + bool prev_kv = 6 [(versionpb.etcd_version_field)="3.1"]; // If watch_id is provided and non-zero, it will be assigned to this watcher. // Since creating a watcher in etcd is not a synchronous operation, // this can be used ensure that ordering is correct when creating multiple // watchers on the same stream. Creating a watcher with an ID already in // use on the stream will cause an error to be returned. - int64 watch_id = 7; + int64 watch_id = 7 [(versionpb.etcd_version_field)="3.4"]; // fragment enables splitting large revisions into multiple watch responses. - bool fragment = 8; + bool fragment = 8 [(versionpb.etcd_version_field)="3.4"]; } message WatchCancelRequest { + option (versionpb.etcd_version_msg) = "3.1"; // watch_id is the watcher id to cancel so that no more events are transmitted. - int64 watch_id = 1; + int64 watch_id = 1 [(versionpb.etcd_version_field)="3.1"]; } // Requests the a watch stream progress status be sent in the watch response stream as soon as // possible. message WatchProgressRequest { + option (versionpb.etcd_version_msg) = "3.4"; } message WatchResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // watch_id is the ID of the watcher that corresponds to the response. int64 watch_id = 2; @@ -754,7 +838,8 @@ message WatchResponse { // All events sent to the created watcher will attach with the same watch_id. bool created = 3; - // canceled is set to true if the response is for a cancel watch request. + // canceled is set to true if the response is for a cancel watch request + // or if the start_revision has already been compacted. // No further events will be sent to the canceled watcher. bool canceled = 4; @@ -769,15 +854,17 @@ message WatchResponse { int64 compact_revision = 5; // cancel_reason indicates the reason for canceling the watcher. - string cancel_reason = 6; + string cancel_reason = 6 [(versionpb.etcd_version_field)="3.4"]; // framgment is true if large watch response was split over multiple responses. - bool fragment = 7; + bool fragment = 7 [(versionpb.etcd_version_field)="3.4"]; repeated mvccpb.Event events = 11; } message LeaseGrantRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // TTL is the advisory time-to-live in seconds. Expired lease will return -1. int64 TTL = 1; // ID is the requested ID for the lease. If ID is set to 0, the lessor chooses an ID. @@ -785,6 +872,8 @@ message LeaseGrantRequest { } message LeaseGrantResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // ID is the lease ID for the granted lease. int64 ID = 2; @@ -794,15 +883,21 @@ message LeaseGrantResponse { } message LeaseRevokeRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // ID is the lease ID to revoke. When the ID is revoked, all associated keys will be deleted. int64 ID = 1; } message LeaseRevokeResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message LeaseCheckpoint { + option (versionpb.etcd_version_msg) = "3.4"; + // ID is the lease ID to checkpoint. int64 ID = 1; @@ -811,19 +906,26 @@ message LeaseCheckpoint { } message LeaseCheckpointRequest { + option (versionpb.etcd_version_msg) = "3.4"; + repeated LeaseCheckpoint checkpoints = 1; } message LeaseCheckpointResponse { + option (versionpb.etcd_version_msg) = "3.4"; + ResponseHeader header = 1; } message LeaseKeepAliveRequest { + option (versionpb.etcd_version_msg) = "3.0"; // ID is the lease ID for the lease to keep alive. int64 ID = 1; } message LeaseKeepAliveResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // ID is the lease ID from the keep alive request. int64 ID = 2; @@ -832,6 +934,7 @@ message LeaseKeepAliveResponse { } message LeaseTimeToLiveRequest { + option (versionpb.etcd_version_msg) = "3.1"; // ID is the lease ID for the lease. int64 ID = 1; // keys is true to query all the keys attached to this lease. @@ -839,6 +942,8 @@ message LeaseTimeToLiveRequest { } message LeaseTimeToLiveResponse { + option (versionpb.etcd_version_msg) = "3.1"; + ResponseHeader header = 1; // ID is the lease ID from the keep alive request. int64 ID = 2; @@ -851,19 +956,26 @@ message LeaseTimeToLiveResponse { } message LeaseLeasesRequest { + option (versionpb.etcd_version_msg) = "3.3"; } message LeaseStatus { + option (versionpb.etcd_version_msg) = "3.3"; + int64 ID = 1; // TODO: int64 TTL = 2; } message LeaseLeasesResponse { + option (versionpb.etcd_version_msg) = "3.3"; + ResponseHeader header = 1; repeated LeaseStatus leases = 2; } message Member { + option (versionpb.etcd_version_msg) = "3.0"; + // ID is the member ID for this member. uint64 ID = 1; // name is the human-readable name of the member. If the member is not started, the name will be an empty string. @@ -873,17 +985,21 @@ message Member { // clientURLs is the list of URLs the member exposes to clients for communication. If the member is not started, clientURLs will be empty. repeated string clientURLs = 4; // isLearner indicates if the member is raft learner. - bool isLearner = 5; + bool isLearner = 5 [(versionpb.etcd_version_field)="3.4"]; } message MemberAddRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // peerURLs is the list of URLs the added member will use to communicate with the cluster. repeated string peerURLs = 1; // isLearner indicates if the added member is raft learner. - bool isLearner = 2; + bool isLearner = 2 [(versionpb.etcd_version_field)="3.4"]; } message MemberAddResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // member is the member information for the added member. Member member = 2; @@ -892,17 +1008,22 @@ message MemberAddResponse { } message MemberRemoveRequest { + option (versionpb.etcd_version_msg) = "3.0"; // ID is the member ID of the member to remove. uint64 ID = 1; } message MemberRemoveResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // members is a list of all members after removing the member. repeated Member members = 2; } message MemberUpdateRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // ID is the member ID of the member to update. uint64 ID = 1; // peerURLs is the new list of URLs the member will use to communicate with the cluster. @@ -910,59 +1031,80 @@ message MemberUpdateRequest { } message MemberUpdateResponse{ + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // members is a list of all members after updating the member. - repeated Member members = 2; + repeated Member members = 2 [(versionpb.etcd_version_field)="3.1"]; } message MemberListRequest { - bool linearizable = 1; + option (versionpb.etcd_version_msg) = "3.0"; + + bool linearizable = 1 [(versionpb.etcd_version_field)="3.5"]; } message MemberListResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // members is a list of all members associated with the cluster. repeated Member members = 2; } message MemberPromoteRequest { + option (versionpb.etcd_version_msg) = "3.4"; // ID is the member ID of the member to promote. uint64 ID = 1; } message MemberPromoteResponse { + option (versionpb.etcd_version_msg) = "3.4"; + ResponseHeader header = 1; // members is a list of all members after promoting the member. repeated Member members = 2; } message DefragmentRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message DefragmentResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message MoveLeaderRequest { + option (versionpb.etcd_version_msg) = "3.3"; // targetID is the node ID for the new leader. uint64 targetID = 1; } message MoveLeaderResponse { + option (versionpb.etcd_version_msg) = "3.3"; + ResponseHeader header = 1; } enum AlarmType { + option (versionpb.etcd_version_enum) = "3.0"; + NONE = 0; // default, used to query if any alarm is active NOSPACE = 1; // space quota is exhausted - CORRUPT = 2; // kv store corruption detected + CORRUPT = 2 [(versionpb.etcd_version_enum_value)="3.3"]; // kv store corruption detected } message AlarmRequest { + option (versionpb.etcd_version_msg) = "3.0"; + enum AlarmAction { - GET = 0; - ACTIVATE = 1; - DEACTIVATE = 2; + option (versionpb.etcd_version_enum) = "3.0"; + + GET = 0; + ACTIVATE = 1; + DEACTIVATE = 2; } // action is the kind of alarm request to issue. The action // may GET alarm statuses, ACTIVATE an alarm, or DEACTIVATE a @@ -976,6 +1118,7 @@ message AlarmRequest { } message AlarmMember { + option (versionpb.etcd_version_msg) = "3.0"; // memberID is the ID of the member associated with the raised alarm. uint64 memberID = 1; // alarm is the type of alarm which has been raised. @@ -983,13 +1126,19 @@ message AlarmMember { } message AlarmResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // alarms is a list of alarms associated with the alarm request. repeated AlarmMember alarms = 2; } message DowngradeRequest { + option (versionpb.etcd_version_msg) = "3.5"; + enum DowngradeAction { + option (versionpb.etcd_version_enum) = "3.5"; + VALIDATE = 0; ENABLE = 1; CANCEL = 2; @@ -1004,15 +1153,30 @@ message DowngradeRequest { } message DowngradeResponse { + option (versionpb.etcd_version_msg) = "3.5"; + ResponseHeader header = 1; // version is the current cluster version. string version = 2; } +// DowngradeVersionTestRequest is used for test only. The version in +// this request will be read as the WAL record version.If the downgrade +// target version is less than this version, then the downgrade(online) +// or migration(offline) isn't safe, so shouldn't be allowed. +message DowngradeVersionTestRequest { + option (versionpb.etcd_version_msg) = "3.6"; + + string ver = 1; +} + message StatusRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message StatusResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // version is the cluster protocol version used by the responding member. string version = 2; @@ -1025,55 +1189,82 @@ message StatusResponse { // raftTerm is the current raft term of the responding member. uint64 raftTerm = 6; // raftAppliedIndex is the current raft applied index of the responding member. - uint64 raftAppliedIndex = 7; + uint64 raftAppliedIndex = 7 [(versionpb.etcd_version_field)="3.4"]; // errors contains alarm/health information and status. - repeated string errors = 8; + repeated string errors = 8 [(versionpb.etcd_version_field)="3.4"]; // dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member. - int64 dbSizeInUse = 9; + int64 dbSizeInUse = 9 [(versionpb.etcd_version_field)="3.4"]; // isLearner indicates if the member is raft learner. - bool isLearner = 10; + bool isLearner = 10 [(versionpb.etcd_version_field)="3.4"]; + // storageVersion is the version of the db file. It might be updated with delay in relationship to the target cluster version. + string storageVersion = 11 [(versionpb.etcd_version_field)="3.6"]; + // dbSizeQuota is the configured etcd storage quota in bytes (the value passed to etcd instance by flag --quota-backend-bytes) + int64 dbSizeQuota = 12 [(versionpb.etcd_version_field)="3.6"]; + // downgradeInfo indicates if there is downgrade process. + DowngradeInfo downgradeInfo = 13 [(versionpb.etcd_version_field)="3.6"]; +} + +message DowngradeInfo { + // enabled indicates whether the cluster is enabled to downgrade. + bool enabled = 1; + // targetVersion is the target downgrade version. + string targetVersion = 2; } message AuthEnableRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthDisableRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthStatusRequest { + option (versionpb.etcd_version_msg) = "3.5"; } message AuthenticateRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; string password = 2; } message AuthUserAddRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; string password = 2; - authpb.UserAddOptions options = 3; - string hashedPassword = 4; + authpb.UserAddOptions options = 3 [(versionpb.etcd_version_field)="3.4"]; + string hashedPassword = 4 [(versionpb.etcd_version_field)="3.5"]; } message AuthUserGetRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; } message AuthUserDeleteRequest { + option (versionpb.etcd_version_msg) = "3.0"; // name is the name of the user to delete. string name = 1; } message AuthUserChangePasswordRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // name is the name of the user whose password is being changed. string name = 1; // password is the new password for the user. Note that this field will be removed in the API layer. string password = 2; // hashedPassword is the new password for the user. Note that this field will be initialized in the API layer. - string hashedPassword = 3; + string hashedPassword = 3 [(versionpb.etcd_version_field)="3.5"]; } message AuthUserGrantRoleRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // user is the name of the user which should be granted a given role. string user = 1; // role is the name of the role to grant to the user. @@ -1081,30 +1272,42 @@ message AuthUserGrantRoleRequest { } message AuthUserRevokeRoleRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; string role = 2; } message AuthRoleAddRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // name is the name of the role to add to the authentication system. string name = 1; } message AuthRoleGetRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string role = 1; } message AuthUserListRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthRoleListRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthRoleDeleteRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string role = 1; } message AuthRoleGrantPermissionRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // name is the name of the role which will be granted the permission. string name = 1; // perm is the permission to grant to the role. @@ -1112,20 +1315,28 @@ message AuthRoleGrantPermissionRequest { } message AuthRoleRevokePermissionRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string role = 1; bytes key = 2; bytes range_end = 3; } message AuthEnableResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthDisableResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthStatusResponse { + option (versionpb.etcd_version_msg) = "3.5"; + ResponseHeader header = 1; bool enabled = 2; // authRevision is the current revision of auth store @@ -1133,67 +1344,93 @@ message AuthStatusResponse { } message AuthenticateResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // token is an authorized token that can be used in succeeding RPCs string token = 2; } message AuthUserAddResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserGetResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; repeated string roles = 2; } message AuthUserDeleteResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserChangePasswordResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserGrantRoleResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserRevokeRoleResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleAddResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleGetResponse { - ResponseHeader header = 1; + ResponseHeader header = 1 [(versionpb.etcd_version_field)="3.0"]; - repeated authpb.Permission perm = 2; + repeated authpb.Permission perm = 2 [(versionpb.etcd_version_field)="3.0"]; } message AuthRoleListResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; repeated string roles = 2; } message AuthUserListResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; repeated string users = 2; } message AuthRoleDeleteResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleGrantPermissionResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleRevokePermissionResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } diff --git a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go index cf0d428180..85a2a741f3 100644 --- a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go @@ -11,6 +11,7 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/golang/protobuf/proto" + _ "go.etcd.io/etcd/api/v3/versionpb" ) // Reference imports to suppress errors if they are not otherwise used. @@ -286,30 +287,34 @@ func init() { func init() { proto.RegisterFile("membership.proto", fileDescriptor_949fe0d019050ef5) } var fileDescriptor_949fe0d019050ef5 = []byte{ - // 367 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xc1, 0x4e, 0xf2, 0x40, - 0x14, 0x85, 0x99, 0x42, 0xf8, 0xdb, 0xcb, 0x1f, 0xc4, 0x09, 0x89, 0x8d, 0x68, 0x25, 0x5d, 0xb1, - 0x30, 0x98, 0xe8, 0x13, 0xa0, 0xb0, 0x20, 0x81, 0xcd, 0x18, 0xdd, 0x92, 0x56, 0x2e, 0xd8, 0xa4, - 0x74, 0xea, 0xcc, 0x54, 0xd7, 0xbe, 0x85, 0x4f, 0xe0, 0xb3, 0xb0, 0xf4, 0x11, 0x14, 0x5f, 0xc4, - 0x74, 0x5a, 0x4a, 0x49, 0xdc, 0xb8, 0xbb, 0x3d, 0xbd, 0xf7, 0x9c, 0xf3, 0x35, 0x85, 0xd6, 0x0a, - 0x57, 0x3e, 0x0a, 0xf9, 0x18, 0xc4, 0xfd, 0x58, 0x70, 0xc5, 0xe9, 0xff, 0x9d, 0x12, 0xfb, 0xc7, - 0xed, 0x25, 0x5f, 0x72, 0xfd, 0xe2, 0x22, 0x9d, 0xb2, 0x1d, 0x77, 0x02, 0x4d, 0xe6, 0x2d, 0xd4, - 0x40, 0x29, 0x11, 0xf8, 0x89, 0x42, 0x49, 0x3b, 0x60, 0xc5, 0x88, 0x62, 0x96, 0x88, 0x50, 0xda, - 0xa4, 0x5b, 0xed, 0x59, 0xcc, 0x4c, 0x85, 0x3b, 0x11, 0x4a, 0x7a, 0x0a, 0x10, 0xc8, 0x59, 0x88, - 0x9e, 0x88, 0x50, 0xd8, 0x46, 0x97, 0xf4, 0x4c, 0x66, 0x05, 0x72, 0x92, 0x09, 0xee, 0x00, 0xa0, - 0xe4, 0x44, 0xa1, 0x16, 0x79, 0x2b, 0xb4, 0x49, 0x97, 0xf4, 0x2c, 0xa6, 0x67, 0x7a, 0x06, 0x8d, - 0x87, 0x30, 0xc0, 0x48, 0x65, 0xfe, 0x86, 0xf6, 0x87, 0x4c, 0x4a, 0x13, 0xdc, 0x77, 0x02, 0xf5, - 0xa9, 0xee, 0x4d, 0x9b, 0x60, 0x8c, 0x87, 0xfa, 0xba, 0xc6, 0x8c, 0xf1, 0x90, 0x8e, 0xe0, 0x40, - 0x78, 0x0b, 0x35, 0xf3, 0x8a, 0x08, 0xdd, 0xa0, 0x71, 0x79, 0xd2, 0x2f, 0x93, 0xf6, 0xf7, 0x81, - 0x58, 0x53, 0xec, 0x03, 0x8e, 0xe0, 0x30, 0x5b, 0x2f, 0x1b, 0x55, 0xb5, 0x91, 0xbd, 0x6f, 0x54, - 0x32, 0xc9, 0xbf, 0xee, 0x4e, 0x71, 0xcf, 0xc1, 0xbe, 0x09, 0x13, 0xa9, 0x50, 0xdc, 0xa3, 0x90, - 0x01, 0x8f, 0x6e, 0x51, 0x31, 0x7c, 0x4a, 0x50, 0x2a, 0xda, 0x82, 0xea, 0x33, 0x8a, 0x1c, 0x3c, - 0x1d, 0xdd, 0x57, 0x02, 0x9d, 0x7c, 0x7d, 0x5a, 0x38, 0x95, 0x2e, 0x3a, 0x60, 0xe5, 0xa5, 0x0a, - 0x64, 0x33, 0x13, 0x34, 0xf8, 0x2f, 0x8d, 0x8d, 0x3f, 0x37, 0x1e, 0xc1, 0xd1, 0x90, 0xbf, 0x44, - 0x4b, 0xe1, 0xcd, 0x71, 0x1c, 0x2d, 0x78, 0x29, 0xde, 0x86, 0x7f, 0x18, 0x79, 0x7e, 0x88, 0x73, - 0x1d, 0x6e, 0xb2, 0xed, 0xe3, 0x16, 0xc5, 0x28, 0x50, 0xae, 0xdb, 0xeb, 0x2f, 0xa7, 0xb2, 0xde, - 0x38, 0xe4, 0x63, 0xe3, 0x90, 0xcf, 0x8d, 0x43, 0xde, 0xbe, 0x9d, 0x8a, 0x5f, 0xd7, 0xff, 0xd3, - 0xd5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x93, 0x7d, 0x0b, 0x87, 0x02, 0x00, 0x00, + // 422 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xed, 0x3a, 0x55, 0x6b, 0x4f, 0x51, 0x28, 0x2b, 0x24, 0xac, 0x06, 0x8c, 0x55, 0x2e, 0x39, + 0xd9, 0x12, 0x51, 0x0f, 0x70, 0x03, 0xd2, 0x43, 0x10, 0xe5, 0xb0, 0xa8, 0x1c, 0xb8, 0x44, 0xeb, + 0x66, 0x62, 0x56, 0x72, 0xbc, 0x66, 0x77, 0x5d, 0xee, 0x1c, 0xf9, 0x02, 0xfe, 0x82, 0x13, 0xff, + 0xd0, 0x23, 0x9f, 0x00, 0xe1, 0x47, 0x90, 0x77, 0x9d, 0xd8, 0x11, 0x9c, 0x7a, 0x1b, 0x3f, 0xcf, + 0xbc, 0x79, 0xef, 0xed, 0xc0, 0xf1, 0x0a, 0x57, 0x19, 0x2a, 0xfd, 0x51, 0x54, 0x49, 0xa5, 0xa4, + 0x91, 0xf4, 0x4e, 0x87, 0x54, 0xd9, 0xc9, 0xfd, 0x5c, 0xe6, 0xd2, 0xfe, 0x48, 0x9b, 0xca, 0xf5, + 0x9c, 0xc4, 0x68, 0xae, 0x16, 0x29, 0xaf, 0x44, 0x7a, 0x8d, 0x4a, 0x0b, 0x59, 0x56, 0xd9, 0xa6, + 0x72, 0x1d, 0xa7, 0x97, 0x30, 0x64, 0x7c, 0x69, 0x5e, 0x18, 0xa3, 0x44, 0x56, 0x1b, 0xd4, 0x74, + 0x04, 0x41, 0x85, 0xa8, 0xe6, 0xb5, 0x2a, 0x74, 0x48, 0xe2, 0xc1, 0x38, 0x60, 0x7e, 0x03, 0x5c, + 0xaa, 0x42, 0xd3, 0x47, 0x00, 0x42, 0xcf, 0x0b, 0xe4, 0xaa, 0x44, 0x15, 0x7a, 0x31, 0x19, 0xfb, + 0x2c, 0x10, 0xfa, 0x8d, 0x03, 0x9e, 0x1f, 0x7e, 0xf9, 0x11, 0x0e, 0x26, 0xc9, 0xd9, 0xe9, 0x6b, + 0x80, 0x1e, 0x25, 0x85, 0xfd, 0x92, 0xaf, 0x30, 0x24, 0x31, 0x19, 0x07, 0xcc, 0xd6, 0xf4, 0x31, + 0x1c, 0x5d, 0x15, 0x02, 0x4b, 0xe3, 0x16, 0x79, 0x76, 0x11, 0x38, 0xa8, 0x59, 0xd5, 0x71, 0x7d, + 0x27, 0x70, 0x70, 0x61, 0xbd, 0xd2, 0x21, 0x78, 0xb3, 0xa9, 0xa5, 0xd9, 0x67, 0xde, 0x6c, 0x4a, + 0xcf, 0xe1, 0xae, 0xe2, 0x4b, 0x33, 0xe7, 0xdb, 0x5d, 0x56, 0xd3, 0xd1, 0xd3, 0x87, 0x49, 0x3f, + 0x9d, 0x64, 0xd7, 0x22, 0x1b, 0xaa, 0x5d, 0xcb, 0xe7, 0x70, 0xcf, 0xb5, 0xf7, 0x89, 0x06, 0x96, + 0x28, 0xdc, 0x25, 0xea, 0x91, 0xb4, 0x2f, 0xd2, 0x21, 0x9d, 0xe2, 0x33, 0x08, 0x5f, 0x15, 0xb5, + 0x36, 0xa8, 0xde, 0xbb, 0xb0, 0xdf, 0xa1, 0x61, 0xf8, 0xa9, 0x46, 0x6d, 0xe8, 0x31, 0x0c, 0xae, + 0x51, 0xb5, 0x51, 0x34, 0x65, 0x37, 0xf6, 0x95, 0xc0, 0xa8, 0x9d, 0xbb, 0xd8, 0x72, 0xf7, 0x46, + 0x47, 0x10, 0xb4, 0x32, 0xb7, 0x21, 0xf8, 0x0e, 0xb0, 0x51, 0xfc, 0xc7, 0x83, 0x77, 0x7b, 0x0f, + 0x6f, 0xe1, 0xc1, 0x54, 0x7e, 0x2e, 0x73, 0xc5, 0x17, 0x38, 0x2b, 0x97, 0xb2, 0xa7, 0x23, 0x84, + 0x43, 0x2c, 0x79, 0x56, 0xe0, 0xc2, 0xaa, 0xf0, 0xd9, 0xe6, 0x73, 0x63, 0xce, 0xfb, 0xd7, 0xdc, + 0xcb, 0x67, 0x37, 0xbf, 0xa3, 0xbd, 0x9b, 0x75, 0x44, 0x7e, 0xae, 0x23, 0xf2, 0x6b, 0x1d, 0x91, + 0x6f, 0x7f, 0xa2, 0xbd, 0x0f, 0x4f, 0x72, 0x99, 0x34, 0x37, 0x9a, 0x08, 0x99, 0x76, 0xb7, 0x3a, + 0x49, 0xfb, 0x82, 0xb3, 0x03, 0x7b, 0xaa, 0x93, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x56, + 0x21, 0x97, 0x04, 0x03, 0x00, 0x00, } func (m *RaftAttributes) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto index e63e9ecc99..cbccfefccf 100644 --- a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto +++ b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto @@ -2,6 +2,9 @@ syntax = "proto3"; package membershippb; import "gogoproto/gogo.proto"; +import "etcd/api/versionpb/version.proto"; + +option go_package = "go.etcd.io/etcd/api/v3/membershippb"; option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; @@ -10,6 +13,8 @@ option (gogoproto.goproto_getters_all) = false; // RaftAttributes represents the raft related attributes of an etcd member. message RaftAttributes { + option (versionpb.etcd_version_msg) = "3.5"; + // peerURLs is the list of peers in the raft cluster. repeated string peer_urls = 1; // isLearner indicates if the member is raft learner. @@ -18,26 +23,36 @@ message RaftAttributes { // Attributes represents all the non-raft related attributes of an etcd member. message Attributes { + option (versionpb.etcd_version_msg) = "3.5"; + string name = 1; repeated string client_urls = 2; } message Member { + option (versionpb.etcd_version_msg) = "3.5"; + uint64 ID = 1; RaftAttributes raft_attributes = 2; Attributes member_attributes = 3; } message ClusterVersionSetRequest { + option (versionpb.etcd_version_msg) = "3.5"; + string ver = 1; } message ClusterMemberAttrSetRequest { + option (versionpb.etcd_version_msg) = "3.5"; + uint64 member_ID = 1; Attributes member_attributes = 2; } message DowngradeInfoSetRequest { + option (versionpb.etcd_version_msg) = "3.5"; + bool enabled = 1; string ver = 2; } \ No newline at end of file diff --git a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go index fc258d6c20..2fed4242cc 100644 --- a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go @@ -164,26 +164,28 @@ func init() { func init() { proto.RegisterFile("kv.proto", fileDescriptor_2216fe83c9c12408) } var fileDescriptor_2216fe83c9c12408 = []byte{ - // 303 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x41, 0x4e, 0xc2, 0x40, - 0x14, 0x86, 0x3b, 0x14, 0x0a, 0x3e, 0x08, 0x36, 0x13, 0x12, 0x27, 0x2e, 0x26, 0x95, 0x8d, 0x18, - 0x13, 0x4c, 0xf0, 0x06, 0xc6, 0xae, 0x70, 0x61, 0x1a, 0x74, 0x4b, 0x4a, 0x79, 0x21, 0xa4, 0x94, - 0x69, 0x4a, 0x9d, 0xa4, 0x37, 0x71, 0xef, 0xde, 0x73, 0xb0, 0xe4, 0x08, 0x52, 0x2f, 0x62, 0xfa, - 0xc6, 0xe2, 0xc6, 0xcd, 0xe4, 0xfd, 0xff, 0xff, 0x65, 0xe6, 0x7f, 0x03, 0x9d, 0x58, 0x8f, 0xd3, - 0x4c, 0xe5, 0x8a, 0x3b, 0x89, 0x8e, 0xa2, 0x74, 0x71, 0x39, 0x58, 0xa9, 0x95, 0x22, 0xeb, 0xae, - 0x9a, 0x4c, 0x3a, 0xfc, 0x64, 0xd0, 0x99, 0x62, 0xf1, 0x1a, 0x6e, 0xde, 0x90, 0xbb, 0x60, 0xc7, - 0x58, 0x08, 0xe6, 0xb1, 0x51, 0x2f, 0xa8, 0x46, 0x7e, 0x0d, 0xe7, 0x51, 0x86, 0x61, 0x8e, 0xf3, - 0x0c, 0xf5, 0x7a, 0xb7, 0x56, 0x5b, 0xd1, 0xf0, 0xd8, 0xc8, 0x0e, 0xfa, 0xc6, 0x0e, 0x7e, 0x5d, - 0x7e, 0x05, 0xbd, 0x44, 0x2d, 0xff, 0x28, 0x9b, 0xa8, 0x6e, 0xa2, 0x96, 0x27, 0x44, 0x40, 0x5b, - 0x63, 0x46, 0x69, 0x93, 0xd2, 0x5a, 0xf2, 0x01, 0xb4, 0x74, 0x55, 0x40, 0xb4, 0xe8, 0x65, 0x23, - 0x2a, 0x77, 0x83, 0xe1, 0x0e, 0x85, 0x43, 0xb4, 0x11, 0xc3, 0x0f, 0x06, 0x2d, 0x5f, 0xe3, 0x36, - 0xe7, 0xb7, 0xd0, 0xcc, 0x8b, 0x14, 0xa9, 0x6e, 0x7f, 0x72, 0x31, 0x36, 0x7b, 0x8e, 0x29, 0x34, - 0xe7, 0xac, 0x48, 0x31, 0x20, 0x88, 0x7b, 0xd0, 0x88, 0x35, 0x75, 0xef, 0x4e, 0xdc, 0x1a, 0xad, - 0x17, 0x0f, 0x1a, 0xb1, 0xe6, 0x37, 0xd0, 0x4e, 0x33, 0xd4, 0xf3, 0x58, 0x53, 0xf9, 0xff, 0x30, - 0xa7, 0x02, 0xa6, 0x7a, 0xe8, 0xc1, 0xd9, 0xe9, 0x7e, 0xde, 0x06, 0xfb, 0xf9, 0x65, 0xe6, 0x5a, - 0x1c, 0xc0, 0x79, 0xf4, 0x9f, 0xfc, 0x99, 0xef, 0xb2, 0x07, 0xb1, 0x3f, 0x4a, 0xeb, 0x70, 0x94, - 0xd6, 0xbe, 0x94, 0xec, 0x50, 0x4a, 0xf6, 0x55, 0x4a, 0xf6, 0xfe, 0x2d, 0xad, 0x85, 0x43, 0xff, - 0x7e, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x45, 0x92, 0x5d, 0xa1, 0x01, 0x00, 0x00, + // 327 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xc1, 0x6a, 0xfa, 0x40, + 0x10, 0xc6, 0xb3, 0x46, 0xa3, 0xff, 0x51, 0xfc, 0x87, 0x45, 0x68, 0x28, 0x34, 0xa4, 0x5e, 0x6a, + 0x29, 0x24, 0xa0, 0x87, 0xde, 0x4b, 0x73, 0xb2, 0x87, 0x12, 0x6c, 0x0f, 0xbd, 0x48, 0x8c, 0x83, + 0x84, 0xa8, 0x1b, 0x62, 0xba, 0x90, 0x37, 0xe9, 0xbd, 0xf7, 0x3e, 0x87, 0x47, 0x1f, 0xa1, 0xda, + 0x17, 0x29, 0x3b, 0x5b, 0xed, 0xa5, 0x97, 0xdd, 0x99, 0xef, 0xfb, 0xb1, 0xf3, 0x0d, 0x0b, 0xad, + 0x4c, 0xfa, 0x79, 0x21, 0x4a, 0xc1, 0xad, 0x95, 0x4c, 0x92, 0x7c, 0x76, 0xde, 0x5b, 0x88, 0x85, + 0x20, 0x29, 0x50, 0x95, 0x76, 0xfb, 0x1f, 0x0c, 0x5a, 0x63, 0xac, 0x9e, 0xe3, 0xe5, 0x2b, 0x72, + 0x1b, 0xcc, 0x0c, 0x2b, 0x87, 0x79, 0x6c, 0xd0, 0x89, 0x54, 0xc9, 0xaf, 0xe0, 0x7f, 0x52, 0x60, + 0x5c, 0xe2, 0xb4, 0x40, 0x99, 0x6e, 0x52, 0xb1, 0x76, 0x6a, 0x1e, 0x1b, 0x98, 0x51, 0x57, 0xcb, + 0xd1, 0x8f, 0xca, 0x2f, 0xa1, 0xb3, 0x12, 0xf3, 0x5f, 0xca, 0x24, 0xaa, 0xbd, 0x12, 0xf3, 0x13, + 0xe2, 0x40, 0x53, 0x62, 0x41, 0x6e, 0x9d, 0xdc, 0x63, 0xcb, 0x7b, 0xd0, 0x90, 0x2a, 0x80, 0xd3, + 0xa0, 0xc9, 0xba, 0x51, 0xea, 0x12, 0xe3, 0x0d, 0x3a, 0x16, 0xd1, 0xba, 0xe9, 0xbf, 0x33, 0x68, + 0x84, 0x12, 0xd7, 0x25, 0xbf, 0x81, 0x7a, 0x59, 0xe5, 0x48, 0x71, 0xbb, 0xc3, 0x33, 0x5f, 0xef, + 0xe9, 0x93, 0xa9, 0xcf, 0x49, 0x95, 0x63, 0x44, 0x10, 0xf7, 0xa0, 0x96, 0x49, 0xca, 0xde, 0x1e, + 0xda, 0x47, 0xf4, 0xb8, 0x78, 0x54, 0xcb, 0x24, 0xbf, 0x86, 0x66, 0x5e, 0xa0, 0x9c, 0x66, 0x92, + 0xc2, 0xff, 0x85, 0x59, 0x0a, 0x18, 0xcb, 0xbe, 0x07, 0xff, 0x4e, 0xef, 0xf3, 0x26, 0x98, 0x8f, + 0x4f, 0x13, 0xdb, 0xe0, 0x00, 0xd6, 0x7d, 0xf8, 0x10, 0x4e, 0x42, 0x9b, 0xdd, 0xdd, 0x6e, 0xf7, + 0xae, 0xb1, 0xdb, 0xbb, 0xc6, 0xf6, 0xe0, 0xb2, 0xdd, 0xc1, 0x65, 0x9f, 0x07, 0x97, 0xbd, 0x7d, + 0xb9, 0xc6, 0xcb, 0xc5, 0x42, 0xf8, 0x58, 0x26, 0x73, 0x3f, 0x15, 0x81, 0xba, 0x83, 0x38, 0x4f, + 0x03, 0x39, 0x0a, 0xf4, 0xac, 0x99, 0x45, 0xdf, 0x32, 0xfa, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x78, + 0x06, 0x46, 0xf5, 0xc0, 0x01, 0x00, 0x00, } func (m *KeyValue) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto index 23c911b7da..a93479c69f 100644 --- a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto +++ b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto @@ -3,6 +3,8 @@ package mvccpb; import "gogoproto/gogo.proto"; +option go_package = "go.etcd.io/etcd/api/v3/mvccpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; diff --git a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go index 23201302e8..781c73b7bf 100644 --- a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go +++ b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go @@ -21,75 +21,81 @@ import ( // server-side error var ( - ErrGRPCEmptyKey = status.New(codes.InvalidArgument, "etcdserver: key is not provided").Err() - ErrGRPCKeyNotFound = status.New(codes.InvalidArgument, "etcdserver: key not found").Err() - ErrGRPCValueProvided = status.New(codes.InvalidArgument, "etcdserver: value is provided").Err() - ErrGRPCLeaseProvided = status.New(codes.InvalidArgument, "etcdserver: lease is provided").Err() - ErrGRPCTooManyOps = status.New(codes.InvalidArgument, "etcdserver: too many operations in txn request").Err() - ErrGRPCDuplicateKey = status.New(codes.InvalidArgument, "etcdserver: duplicate key given in txn request").Err() - ErrGRPCCompacted = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted").Err() - ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err() - ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err() + ErrGRPCEmptyKey = status.Error(codes.InvalidArgument, "etcdserver: key is not provided") + ErrGRPCKeyNotFound = status.Error(codes.InvalidArgument, "etcdserver: key not found") + ErrGRPCValueProvided = status.Error(codes.InvalidArgument, "etcdserver: value is provided") + ErrGRPCLeaseProvided = status.Error(codes.InvalidArgument, "etcdserver: lease is provided") + ErrGRPCTooManyOps = status.Error(codes.InvalidArgument, "etcdserver: too many operations in txn request") + ErrGRPCDuplicateKey = status.Error(codes.InvalidArgument, "etcdserver: duplicate key given in txn request") + ErrGRPCInvalidClientAPIVersion = status.Error(codes.InvalidArgument, "etcdserver: invalid client api version") + ErrGRPCInvalidSortOption = status.Error(codes.InvalidArgument, "etcdserver: invalid sort option") + ErrGRPCCompacted = status.Error(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted") + ErrGRPCFutureRev = status.Error(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision") + ErrGRPCNoSpace = status.Error(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded") - ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err() - ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err() - ErrGRPCLeaseTTLTooLarge = status.New(codes.OutOfRange, "etcdserver: too large lease TTL").Err() + ErrGRPCLeaseNotFound = status.Error(codes.NotFound, "etcdserver: requested lease not found") + ErrGRPCLeaseExist = status.Error(codes.FailedPrecondition, "etcdserver: lease already exists") + ErrGRPCLeaseTTLTooLarge = status.Error(codes.OutOfRange, "etcdserver: too large lease TTL") - ErrGRPCWatchCanceled = status.New(codes.Canceled, "etcdserver: watch canceled").Err() + ErrGRPCWatchCanceled = status.Error(codes.Canceled, "etcdserver: watch canceled") - ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err() - ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err() - ErrGRPCMemberNotEnoughStarted = status.New(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members").Err() - ErrGRPCMemberBadURLs = status.New(codes.InvalidArgument, "etcdserver: given member URLs are invalid").Err() - ErrGRPCMemberNotFound = status.New(codes.NotFound, "etcdserver: member not found").Err() - ErrGRPCMemberNotLearner = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member").Err() - ErrGRPCLearnerNotReady = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader").Err() - ErrGRPCTooManyLearners = status.New(codes.FailedPrecondition, "etcdserver: too many learner members in cluster").Err() - ErrGRPCClusterIdMismatch = status.New(codes.FailedPrecondition, "etcdserver: cluster ID mismatch").Err() + ErrGRPCMemberExist = status.Error(codes.FailedPrecondition, "etcdserver: member ID already exist") + ErrGRPCPeerURLExist = status.Error(codes.FailedPrecondition, "etcdserver: Peer URLs already exists") + ErrGRPCMemberNotEnoughStarted = status.Error(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members") + ErrGRPCMemberBadURLs = status.Error(codes.InvalidArgument, "etcdserver: given member URLs are invalid") + ErrGRPCMemberNotFound = status.Error(codes.NotFound, "etcdserver: member not found") + ErrGRPCMemberNotLearner = status.Error(codes.FailedPrecondition, "etcdserver: can only promote a learner member") + ErrGRPCLearnerNotReady = status.Error(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader") + ErrGRPCTooManyLearners = status.Error(codes.FailedPrecondition, "etcdserver: too many learner members in cluster") + ErrGRPCClusterIDMismatch = status.Error(codes.FailedPrecondition, "etcdserver: cluster ID mismatch") + //revive:disable:var-naming + // Deprecated: Please use ErrGRPCClusterIDMismatch. + ErrGRPCClusterIdMismatch = ErrGRPCClusterIDMismatch + //revive:enable:var-naming - ErrGRPCRequestTooLarge = status.New(codes.InvalidArgument, "etcdserver: request is too large").Err() - ErrGRPCRequestTooManyRequests = status.New(codes.ResourceExhausted, "etcdserver: too many requests").Err() + ErrGRPCRequestTooLarge = status.Error(codes.InvalidArgument, "etcdserver: request is too large") + ErrGRPCRequestTooManyRequests = status.Error(codes.ResourceExhausted, "etcdserver: too many requests") - ErrGRPCRootUserNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not exist").Err() - ErrGRPCRootRoleNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not have root role").Err() - ErrGRPCUserAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: user name already exists").Err() - ErrGRPCUserEmpty = status.New(codes.InvalidArgument, "etcdserver: user name is empty").Err() - ErrGRPCUserNotFound = status.New(codes.FailedPrecondition, "etcdserver: user name not found").Err() - ErrGRPCRoleAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: role name already exists").Err() - ErrGRPCRoleNotFound = status.New(codes.FailedPrecondition, "etcdserver: role name not found").Err() - ErrGRPCRoleEmpty = status.New(codes.InvalidArgument, "etcdserver: role name is empty").Err() - ErrGRPCAuthFailed = status.New(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password").Err() - ErrGRPCPermissionNotGiven = status.New(codes.InvalidArgument, "etcdserver: permission not given").Err() - ErrGRPCPermissionDenied = status.New(codes.PermissionDenied, "etcdserver: permission denied").Err() - ErrGRPCRoleNotGranted = status.New(codes.FailedPrecondition, "etcdserver: role is not granted to the user").Err() - ErrGRPCPermissionNotGranted = status.New(codes.FailedPrecondition, "etcdserver: permission is not granted to the role").Err() - ErrGRPCAuthNotEnabled = status.New(codes.FailedPrecondition, "etcdserver: authentication is not enabled").Err() - ErrGRPCInvalidAuthToken = status.New(codes.Unauthenticated, "etcdserver: invalid auth token").Err() - ErrGRPCInvalidAuthMgmt = status.New(codes.InvalidArgument, "etcdserver: invalid auth management").Err() - ErrGRPCAuthOldRevision = status.New(codes.InvalidArgument, "etcdserver: revision of auth store is old").Err() + ErrGRPCRootUserNotExist = status.Error(codes.FailedPrecondition, "etcdserver: root user does not exist") + ErrGRPCRootRoleNotExist = status.Error(codes.FailedPrecondition, "etcdserver: root user does not have root role") + ErrGRPCUserAlreadyExist = status.Error(codes.FailedPrecondition, "etcdserver: user name already exists") + ErrGRPCUserEmpty = status.Error(codes.InvalidArgument, "etcdserver: user name is empty") + ErrGRPCUserNotFound = status.Error(codes.FailedPrecondition, "etcdserver: user name not found") + ErrGRPCRoleAlreadyExist = status.Error(codes.FailedPrecondition, "etcdserver: role name already exists") + ErrGRPCRoleNotFound = status.Error(codes.FailedPrecondition, "etcdserver: role name not found") + ErrGRPCRoleEmpty = status.Error(codes.InvalidArgument, "etcdserver: role name is empty") + ErrGRPCAuthFailed = status.Error(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password") + ErrGRPCPermissionNotGiven = status.Error(codes.InvalidArgument, "etcdserver: permission not given") + ErrGRPCPermissionDenied = status.Error(codes.PermissionDenied, "etcdserver: permission denied") + ErrGRPCRoleNotGranted = status.Error(codes.FailedPrecondition, "etcdserver: role is not granted to the user") + ErrGRPCPermissionNotGranted = status.Error(codes.FailedPrecondition, "etcdserver: permission is not granted to the role") + ErrGRPCAuthNotEnabled = status.Error(codes.FailedPrecondition, "etcdserver: authentication is not enabled") + ErrGRPCInvalidAuthToken = status.Error(codes.Unauthenticated, "etcdserver: invalid auth token") + ErrGRPCInvalidAuthMgmt = status.Error(codes.InvalidArgument, "etcdserver: invalid auth management") + ErrGRPCAuthOldRevision = status.Error(codes.InvalidArgument, "etcdserver: revision of auth store is old") - ErrGRPCNoLeader = status.New(codes.Unavailable, "etcdserver: no leader").Err() - ErrGRPCNotLeader = status.New(codes.FailedPrecondition, "etcdserver: not leader").Err() - ErrGRPCLeaderChanged = status.New(codes.Unavailable, "etcdserver: leader changed").Err() - ErrGRPCNotCapable = status.New(codes.Unavailable, "etcdserver: not capable").Err() - ErrGRPCStopped = status.New(codes.Unavailable, "etcdserver: server stopped").Err() - ErrGRPCTimeout = status.New(codes.Unavailable, "etcdserver: request timed out").Err() - ErrGRPCTimeoutDueToLeaderFail = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure").Err() - ErrGRPCTimeoutDueToConnectionLost = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost").Err() - ErrGRPCTimeoutWaitAppliedIndex = status.New(codes.Unavailable, "etcdserver: request timed out, waiting for the applied index took too long").Err() - ErrGRPCUnhealthy = status.New(codes.Unavailable, "etcdserver: unhealthy cluster").Err() - ErrGRPCCorrupt = status.New(codes.DataLoss, "etcdserver: corrupt cluster").Err() - ErrGPRCNotSupportedForLearner = status.New(codes.Unavailable, "etcdserver: rpc not supported for learner").Err() - ErrGRPCBadLeaderTransferee = status.New(codes.FailedPrecondition, "etcdserver: bad leader transferee").Err() + ErrGRPCNoLeader = status.Error(codes.Unavailable, "etcdserver: no leader") + ErrGRPCNotLeader = status.Error(codes.FailedPrecondition, "etcdserver: not leader") + ErrGRPCLeaderChanged = status.Error(codes.Unavailable, "etcdserver: leader changed") + ErrGRPCNotCapable = status.Error(codes.FailedPrecondition, "etcdserver: not capable") + ErrGRPCStopped = status.Error(codes.Unavailable, "etcdserver: server stopped") + ErrGRPCTimeout = status.Error(codes.Unavailable, "etcdserver: request timed out") + ErrGRPCTimeoutDueToLeaderFail = status.Error(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure") + ErrGRPCTimeoutDueToConnectionLost = status.Error(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost") + ErrGRPCTimeoutWaitAppliedIndex = status.Error(codes.Unavailable, "etcdserver: request timed out, waiting for the applied index took too long") + ErrGRPCUnhealthy = status.Error(codes.Unavailable, "etcdserver: unhealthy cluster") + ErrGRPCCorrupt = status.Error(codes.DataLoss, "etcdserver: corrupt cluster") + ErrGRPCNotSupportedForLearner = status.Error(codes.FailedPrecondition, "etcdserver: rpc not supported for learner") + ErrGRPCBadLeaderTransferee = status.Error(codes.FailedPrecondition, "etcdserver: bad leader transferee") - ErrGRPCClusterVersionUnavailable = status.New(codes.Unavailable, "etcdserver: cluster version not found during downgrade").Err() - ErrGRPCWrongDowngradeVersionFormat = status.New(codes.InvalidArgument, "etcdserver: wrong downgrade target version format").Err() - ErrGRPCInvalidDowngradeTargetVersion = status.New(codes.InvalidArgument, "etcdserver: invalid downgrade target version").Err() - ErrGRPCDowngradeInProcess = status.New(codes.FailedPrecondition, "etcdserver: cluster has a downgrade job in progress").Err() - ErrGRPCNoInflightDowngrade = status.New(codes.FailedPrecondition, "etcdserver: no inflight downgrade job").Err() + ErrGRPCWrongDowngradeVersionFormat = status.Error(codes.InvalidArgument, "etcdserver: wrong downgrade target version format") + ErrGRPCInvalidDowngradeTargetVersion = status.Error(codes.InvalidArgument, "etcdserver: invalid downgrade target version") + ErrGRPCClusterVersionUnavailable = status.Error(codes.FailedPrecondition, "etcdserver: cluster version not found during downgrade") + ErrGRPCDowngradeInProcess = status.Error(codes.FailedPrecondition, "etcdserver: cluster has a downgrade job in progress") + ErrGRPCNoInflightDowngrade = status.Error(codes.FailedPrecondition, "etcdserver: no inflight downgrade job") - ErrGRPCCanceled = status.New(codes.Canceled, "etcdserver: request canceled").Err() - ErrGRPCDeadlineExceeded = status.New(codes.DeadlineExceeded, "etcdserver: context deadline exceeded").Err() + ErrGRPCCanceled = status.Error(codes.Canceled, "etcdserver: request canceled") + ErrGRPCDeadlineExceeded = status.Error(codes.DeadlineExceeded, "etcdserver: context deadline exceeded") errStringToError = map[string]error{ ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey, @@ -97,11 +103,12 @@ var ( ErrorDesc(ErrGRPCValueProvided): ErrGRPCValueProvided, ErrorDesc(ErrGRPCLeaseProvided): ErrGRPCLeaseProvided, - ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps, - ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey, - ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted, - ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev, - ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace, + ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps, + ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey, + ErrorDesc(ErrGRPCInvalidSortOption): ErrGRPCInvalidSortOption, + ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted, + ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev, + ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace, ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound, ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist, @@ -115,7 +122,7 @@ var ( ErrorDesc(ErrGRPCMemberNotLearner): ErrGRPCMemberNotLearner, ErrorDesc(ErrGRPCLearnerNotReady): ErrGRPCLearnerNotReady, ErrorDesc(ErrGRPCTooManyLearners): ErrGRPCTooManyLearners, - ErrorDesc(ErrGRPCClusterIdMismatch): ErrGRPCClusterIdMismatch, + ErrorDesc(ErrGRPCClusterIDMismatch): ErrGRPCClusterIDMismatch, ErrorDesc(ErrGRPCRequestTooLarge): ErrGRPCRequestTooLarge, ErrorDesc(ErrGRPCRequestTooManyRequests): ErrGRPCRequestTooManyRequests, @@ -147,7 +154,7 @@ var ( ErrorDesc(ErrGRPCTimeoutDueToConnectionLost): ErrGRPCTimeoutDueToConnectionLost, ErrorDesc(ErrGRPCUnhealthy): ErrGRPCUnhealthy, ErrorDesc(ErrGRPCCorrupt): ErrGRPCCorrupt, - ErrorDesc(ErrGPRCNotSupportedForLearner): ErrGPRCNotSupportedForLearner, + ErrorDesc(ErrGRPCNotSupportedForLearner): ErrGRPCNotSupportedForLearner, ErrorDesc(ErrGRPCBadLeaderTransferee): ErrGRPCBadLeaderTransferee, ErrorDesc(ErrGRPCClusterVersionUnavailable): ErrGRPCClusterVersionUnavailable, @@ -160,15 +167,16 @@ var ( // client-side error var ( - ErrEmptyKey = Error(ErrGRPCEmptyKey) - ErrKeyNotFound = Error(ErrGRPCKeyNotFound) - ErrValueProvided = Error(ErrGRPCValueProvided) - ErrLeaseProvided = Error(ErrGRPCLeaseProvided) - ErrTooManyOps = Error(ErrGRPCTooManyOps) - ErrDuplicateKey = Error(ErrGRPCDuplicateKey) - ErrCompacted = Error(ErrGRPCCompacted) - ErrFutureRev = Error(ErrGRPCFutureRev) - ErrNoSpace = Error(ErrGRPCNoSpace) + ErrEmptyKey = Error(ErrGRPCEmptyKey) + ErrKeyNotFound = Error(ErrGRPCKeyNotFound) + ErrValueProvided = Error(ErrGRPCValueProvided) + ErrLeaseProvided = Error(ErrGRPCLeaseProvided) + ErrTooManyOps = Error(ErrGRPCTooManyOps) + ErrDuplicateKey = Error(ErrGRPCDuplicateKey) + ErrInvalidSortOption = Error(ErrGRPCInvalidSortOption) + ErrCompacted = Error(ErrGRPCCompacted) + ErrFutureRev = Error(ErrGRPCFutureRev) + ErrNoSpace = Error(ErrGRPCNoSpace) ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound) ErrLeaseExist = Error(ErrGRPCLeaseExist) @@ -202,7 +210,11 @@ var ( ErrInvalidAuthToken = Error(ErrGRPCInvalidAuthToken) ErrAuthOldRevision = Error(ErrGRPCAuthOldRevision) ErrInvalidAuthMgmt = Error(ErrGRPCInvalidAuthMgmt) - ErrClusterIdMismatch = Error(ErrGRPCClusterIdMismatch) + ErrClusterIDMismatch = Error(ErrGRPCClusterIDMismatch) + //revive:disable:var-naming + // Deprecated: Please use ErrClusterIDMismatch. + ErrClusterIdMismatch = ErrClusterIDMismatch + //revive:enable:var-naming ErrNoLeader = Error(ErrGRPCNoLeader) ErrNotLeader = Error(ErrGRPCNotLeader) diff --git a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go index 8f8ac60ff2..e5770afb2e 100644 --- a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go +++ b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go @@ -18,3 +18,6 @@ var ( TokenFieldNameGRPC = "token" TokenFieldNameSwagger = "authorization" ) + +// TokenFieldNameGRPCKey is used as a key of context to store token. +type TokenFieldNameGRPCKey struct{} diff --git a/vendor/go.etcd.io/etcd/api/v3/version/version.go b/vendor/go.etcd.io/etcd/api/v3/version/version.go index 03449b523b..d77e31a972 100644 --- a/vendor/go.etcd.io/etcd/api/v3/version/version.go +++ b/vendor/go.etcd.io/etcd/api/v3/version/version.go @@ -26,13 +26,29 @@ import ( var ( // MinClusterVersion is the min cluster version this etcd binary is compatible with. MinClusterVersion = "3.0.0" - Version = "3.5.21" + Version = "3.6.4" APIVersion = "unknown" // Git SHA Value will be set during build GitSHA = "Not provided (use ./build instead of go build)" ) +// Get all constant versions defined in a centralized place. +var ( + V3_0 = semver.Version{Major: 3, Minor: 0} + V3_1 = semver.Version{Major: 3, Minor: 1} + V3_2 = semver.Version{Major: 3, Minor: 2} + V3_3 = semver.Version{Major: 3, Minor: 3} + V3_4 = semver.Version{Major: 3, Minor: 4} + V3_5 = semver.Version{Major: 3, Minor: 5} + V3_6 = semver.Version{Major: 3, Minor: 6} + V3_7 = semver.Version{Major: 3, Minor: 7} + V4_0 = semver.Version{Major: 4, Minor: 0} + + // AllVersions keeps all the versions in ascending order. + AllVersions = []semver.Version{V3_0, V3_1, V3_2, V3_3, V3_4, V3_5, V3_6, V3_7, V4_0} +) + func init() { ver, err := semver.NewVersion(Version) if err == nil { @@ -43,6 +59,7 @@ func init() { type Versions struct { Server string `json:"etcdserver"` Cluster string `json:"etcdcluster"` + Storage string `json:"storage"` // TODO: raft state machine version } @@ -54,3 +71,15 @@ func Cluster(v string) string { } return fmt.Sprintf("%s.%s", vs[0], vs[1]) } + +func Compare(ver1, ver2 semver.Version) int { + return ver1.Compare(ver2) +} + +func LessThan(ver1, ver2 semver.Version) bool { + return ver1.LessThan(ver2) +} + +func Equal(ver1, ver2 semver.Version) bool { + return ver1.Equal(ver2) +} diff --git a/vendor/go.etcd.io/etcd/api/v3/versionpb/version.pb.go b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.pb.go new file mode 100644 index 0000000000..71c74eb719 --- /dev/null +++ b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.pb.go @@ -0,0 +1,91 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: version.proto + +package versionpb + +import ( + fmt "fmt" + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" + proto "github.com/golang/protobuf/proto" +) + +// 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 + +var E_EtcdVersionMsg = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50000, + Name: "versionpb.etcd_version_msg", + Tag: "bytes,50000,opt,name=etcd_version_msg", + Filename: "version.proto", +} + +var E_EtcdVersionField = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50001, + Name: "versionpb.etcd_version_field", + Tag: "bytes,50001,opt,name=etcd_version_field", + Filename: "version.proto", +} + +var E_EtcdVersionEnum = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50002, + Name: "versionpb.etcd_version_enum", + Tag: "bytes,50002,opt,name=etcd_version_enum", + Filename: "version.proto", +} + +var E_EtcdVersionEnumValue = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50003, + Name: "versionpb.etcd_version_enum_value", + Tag: "bytes,50003,opt,name=etcd_version_enum_value", + Filename: "version.proto", +} + +func init() { + proto.RegisterExtension(E_EtcdVersionMsg) + proto.RegisterExtension(E_EtcdVersionField) + proto.RegisterExtension(E_EtcdVersionEnum) + proto.RegisterExtension(E_EtcdVersionEnumValue) +} + +func init() { proto.RegisterFile("version.proto", fileDescriptor_7d2c07d79758f814) } + +var fileDescriptor_7d2c07d79758f814 = []byte{ + // 284 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0xd1, 0xc1, 0x4a, 0xc3, 0x30, + 0x18, 0x07, 0x70, 0x83, 0x20, 0x2c, 0xa0, 0xce, 0x30, 0x50, 0x86, 0xd6, 0x7a, 0xf3, 0x94, 0x80, + 0xbb, 0xed, 0x28, 0xe8, 0xad, 0x2a, 0x1e, 0x76, 0x10, 0xa4, 0xb4, 0x6b, 0x16, 0x02, 0x6d, 0xbf, + 0xd0, 0xb4, 0x7d, 0x04, 0xd9, 0x23, 0xf8, 0x48, 0x1e, 0xa7, 0xbe, 0x80, 0xd4, 0x17, 0x91, 0xa4, + 0xa9, 0xac, 0xd6, 0x53, 0xfb, 0x7d, 0xdf, 0xff, 0xff, 0xeb, 0xa1, 0x78, 0xbf, 0xe6, 0x85, 0x96, + 0x90, 0x53, 0x55, 0x40, 0x09, 0x64, 0xe4, 0x46, 0x15, 0x4f, 0x27, 0x02, 0x04, 0xd8, 0x2d, 0x33, + 0x6f, 0x6d, 0x60, 0xea, 0x0b, 0x00, 0x91, 0x72, 0x66, 0xa7, 0xb8, 0x5a, 0xb1, 0x84, 0xeb, 0x65, + 0x21, 0x55, 0x09, 0x45, 0x9b, 0x98, 0xdf, 0xe1, 0x31, 0x2f, 0x97, 0x49, 0xe8, 0xa4, 0x30, 0xd3, + 0x82, 0x9c, 0xd3, 0xb6, 0x46, 0xbb, 0x1a, 0x0d, 0xb8, 0xd6, 0x91, 0xe0, 0xf7, 0xaa, 0x94, 0x90, + 0xeb, 0x93, 0xcd, 0xcb, 0xae, 0x8f, 0x2e, 0x47, 0x8f, 0x07, 0xa6, 0xba, 0x68, 0x9b, 0x81, 0x16, + 0x6b, 0x84, 0xe6, 0x0f, 0x98, 0xf4, 0xbc, 0x95, 0xe4, 0x69, 0x42, 0xce, 0x06, 0xe2, 0xad, 0xd9, + 0x77, 0xde, 0xbb, 0xf3, 0xc6, 0x5b, 0x9e, 0x0d, 0x18, 0x31, 0xc0, 0x47, 0x3d, 0x91, 0xe7, 0x55, + 0x46, 0x4e, 0x07, 0xe0, 0x4d, 0x5e, 0x65, 0x9d, 0xf7, 0xe1, 0xbc, 0xc3, 0x2d, 0xcf, 0xdc, 0x0d, + 0xf7, 0x8c, 0x8f, 0x07, 0x5c, 0x58, 0x47, 0x69, 0xc5, 0xc9, 0xc5, 0xbf, 0xe8, 0xc2, 0xdc, 0x3a, + 0xf9, 0xd3, 0xc9, 0x93, 0x3f, 0xb2, 0x0d, 0xad, 0x11, 0xba, 0xbe, 0x7a, 0x6b, 0x3c, 0xb4, 0x69, + 0x3c, 0xf4, 0xd5, 0x78, 0xe8, 0xf5, 0xdb, 0xdb, 0x79, 0xf2, 0x05, 0x50, 0x93, 0xa6, 0x12, 0x98, + 0x79, 0xb2, 0x48, 0x49, 0x56, 0xcf, 0xd8, 0xef, 0xbf, 0x8b, 0xf7, 0xec, 0xf7, 0x66, 0x3f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0xe8, 0x02, 0x15, 0xc0, 0xde, 0x01, 0x00, 0x00, +} diff --git a/vendor/go.etcd.io/etcd/api/v3/versionpb/version.proto b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.proto new file mode 100644 index 0000000000..c81b2f58a4 --- /dev/null +++ b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; +package versionpb; + +import "gogoproto/gogo.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "go.etcd.io/etcd/api/v3/versionpb"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.unmarshaler_all) = true; + +// Indicates etcd version that introduced the message, used to determine minimal etcd version required to interpret wal that includes this message. +extend google.protobuf.MessageOptions { + optional string etcd_version_msg = 50000; +} + +// Indicates etcd version that introduced the field, used to determine minimal etcd version required to interpret wal that sets this field. +extend google.protobuf.FieldOptions { + optional string etcd_version_field = 50001; +} + +// Indicates etcd version that introduced the enum, used to determine minimal etcd version required to interpret wal that uses this enum. +extend google.protobuf.EnumOptions { + optional string etcd_version_enum = 50002; +} + +// Indicates etcd version that introduced the enum value, used to determine minimal etcd version required to interpret wal that sets this enum value. +extend google.protobuf.EnumValueOptions { + optional string etcd_version_enum_value = 50003; +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go index ca82f765c9..42221f4b90 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !windows -// +build !windows package fileutil @@ -21,7 +20,7 @@ import "os" const ( // PrivateDirMode grants owner to make/remove files inside the directory. - PrivateDirMode = 0700 + PrivateDirMode = 0o700 ) // OpenDir opens a directory for syncing. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go index 849c63c876..0cb2280cd8 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build windows -// +build windows package fileutil @@ -24,7 +23,7 @@ import ( const ( // PrivateDirMode grants owner to make/remove files inside the directory. - PrivateDirMode = 0777 + PrivateDirMode = 0o777 ) // OpenDir opens a directory in windows with write access for syncing. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go index d31ece3e24..36394a375a 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go @@ -17,16 +17,18 @@ package fileutil import ( "fmt" "io" - "io/ioutil" + "io/fs" "os" "path/filepath" "go.uber.org/zap" + + "go.etcd.io/etcd/client/pkg/v3/verify" ) const ( // PrivateFileMode grants owner to read/write a file. - PrivateFileMode = 0600 + PrivateFileMode = 0o600 ) // IsDirWriteable checks if dir is writable by writing and removing a file @@ -36,7 +38,7 @@ func IsDirWriteable(dir string) error { if err != nil { return err } - if err := ioutil.WriteFile(f, []byte(""), PrivateFileMode); err != nil { + if err := os.WriteFile(f, []byte(""), PrivateFileMode); err != nil { return err } return os.Remove(f) @@ -45,8 +47,9 @@ func IsDirWriteable(dir string) error { // TouchDirAll is similar to os.MkdirAll. It creates directories with 0700 permission if any directory // does not exists. TouchDirAll also ensures the given directory is writable. func TouchDirAll(lg *zap.Logger, dir string) error { + verify.Assert(lg != nil, "nil log isn't allowed") // If path is already a directory, MkdirAll does nothing and returns nil, so, - // first check if dir exist with an expected permission mode. + // first check if dir exists with an expected permission mode. if Exist(dir) { err := CheckDirPermission(dir, PrivateDirMode) if err != nil { @@ -122,7 +125,7 @@ func CheckDirPermission(dir string, perm os.FileMode) error { if !Exist(dir) { return fmt.Errorf("directory %q empty, cannot check permission", dir) } - //check the existing permission on the directory + // check the existing permission on the directory dirInfo, err := os.Stat(dir) if err != nil { return err @@ -157,7 +160,6 @@ func RemoveMatchFile(lg *zap.Logger, dir string, matchFunc func(fileName string) lg.Error("remove file failed", zap.String("file", file), zap.Error(err)) - continue } } } @@ -166,3 +168,16 @@ func RemoveMatchFile(lg *zap.Logger, dir string, matchFunc func(fileName string) } return nil } + +// ListFiles lists files if matchFunc is true on an existing dir +// Returns error if the dir does not exist +func ListFiles(dir string, matchFunc func(fileName string) bool) ([]string, error) { + var files []string + err := filepath.Walk(dir, func(path string, info fs.FileInfo, err error) error { + if matchFunc(path) { + files = append(files, path) + } + return nil + }) + return files, err +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go index 338627f43c..dd2fa545d2 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go @@ -19,8 +19,6 @@ import ( "os" ) -var ( - ErrLocked = errors.New("fileutil: file already locked") -) +var ErrLocked = errors.New("fileutil: file already locked") type LockedFile struct{ *os.File } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go index dcdf226cdb..178c987a4a 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build !windows && !plan9 && !solaris -// +build !windows,!plan9,!solaris package fileutil import ( + "errors" "os" "syscall" ) @@ -29,7 +29,7 @@ func flockTryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, err } if err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil { f.Close() - if err == syscall.EWOULDBLOCK { + if errors.Is(err, syscall.EWOULDBLOCK) { err = ErrLocked } return nil, err diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go index d8952cc481..609ac39784 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build linux -// +build linux package fileutil import ( + "errors" "fmt" "io" "os" @@ -59,13 +59,13 @@ func TryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { func ofdTryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { f, err := os.OpenFile(path, flag, perm) if err != nil { - return nil, fmt.Errorf("ofdTryLockFile failed to open %q (%v)", path, err) + return nil, fmt.Errorf("ofdTryLockFile failed to open %q (%w)", path, err) } flock := wrlck if err = syscall.FcntlFlock(f.Fd(), unix.F_OFD_SETLK, &flock); err != nil { f.Close() - if err == syscall.EWOULDBLOCK { + if errors.Is(err, syscall.EWOULDBLOCK) { err = ErrLocked } return nil, err @@ -80,7 +80,7 @@ func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { func ofdLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { f, err := os.OpenFile(path, flag, perm) if err != nil { - return nil, fmt.Errorf("ofdLockFile failed to open %q (%v)", path, err) + return nil, fmt.Errorf("ofdLockFile failed to open %q (%w)", path, err) } flock := wrlck diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go index 683cc1db9c..2e892fecc6 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build solaris -// +build solaris package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go index d89027e1fa..05db536741 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !windows && !plan9 && !solaris && !linux -// +build !windows,!plan9,!solaris,!linux package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go index 5cbf2bc3d5..51010bdf81 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build windows -// +build windows package fileutil @@ -22,31 +21,18 @@ import ( "fmt" "os" "syscall" - "unsafe" -) - -var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") - procLockFileEx = modkernel32.NewProc("LockFileEx") - errLocked = errors.New("the process cannot access the file because another process has locked a portion of the file") + "golang.org/x/sys/windows" ) -const ( - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx - LOCKFILE_EXCLUSIVE_LOCK = 2 - LOCKFILE_FAIL_IMMEDIATELY = 1 - - // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx - errLockViolation syscall.Errno = 0x21 -) +var errLocked = errors.New("the process cannot access the file because another process has locked a portion of the file") func TryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { f, err := open(path, flag, perm) if err != nil { return nil, err } - if err := lockFile(syscall.Handle(f.Fd()), LOCKFILE_FAIL_IMMEDIATELY); err != nil { + if err := lockFile(windows.Handle(f.Fd()), windows.LOCKFILE_FAIL_IMMEDIATELY); err != nil { f.Close() return nil, err } @@ -58,7 +44,7 @@ func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { if err != nil { return nil, err } - if err := lockFile(syscall.Handle(f.Fd()), 0); err != nil { + if err := lockFile(windows.Handle(f.Fd()), 0); err != nil { f.Close() return nil, err } @@ -67,7 +53,7 @@ func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { func open(path string, flag int, perm os.FileMode) (*os.File, error) { if path == "" { - return nil, fmt.Errorf("cannot open empty filename") + return nil, errors.New("cannot open empty filename") } var access uint32 switch flag { @@ -95,32 +81,17 @@ func open(path string, flag int, perm os.FileMode) (*os.File, error) { return os.NewFile(uintptr(fd), path), nil } -func lockFile(fd syscall.Handle, flags uint32) error { - var flag uint32 = LOCKFILE_EXCLUSIVE_LOCK - flag |= flags - if fd == syscall.InvalidHandle { +func lockFile(fd windows.Handle, flags uint32) error { + if fd == windows.InvalidHandle { return nil } - err := lockFileEx(fd, flag, 1, 0, &syscall.Overlapped{}) + err := windows.LockFileEx(fd, flags|windows.LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &windows.Overlapped{}) if err == nil { return nil } else if err.Error() == errLocked.Error() { return ErrLocked - } else if err != errLockViolation { + } else if err != windows.ERROR_LOCK_VIOLATION { return err } return nil } - -func lockFileEx(h syscall.Handle, flags, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { - var reserved uint32 = 0 - r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return err -} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go index c747b7cf81..aadbff7131 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go @@ -19,9 +19,9 @@ import ( "os" ) -// Preallocate tries to allocate the space for given -// file. This operation is only supported on linux by a -// few filesystems (btrfs, ext4, etc.). +// Preallocate tries to allocate the space for given file. This +// operation is only supported on darwin and linux by a few +// filesystems (APFS, btrfs, ext4, etc.). // If the operation is unsupported, no error will be returned. // Otherwise, the error encountered will be returned. func Preallocate(f *os.File, sizeInBytes int64, extendFile bool) error { diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go index caab143dd3..72430ec273 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build darwin -// +build darwin package fileutil import ( + "errors" "os" "syscall" @@ -40,7 +40,7 @@ func preallocFixed(f *os.File, sizeInBytes int64) error { Length: sizeInBytes, } err := unix.FcntlFstore(f.Fd(), unix.F_PREALLOCATE, fstore) - if err == nil || err == unix.ENOTSUP { + if err == nil || errors.Is(err, unix.ENOTSUP) { return nil } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go index ebb8207c34..b0a8166ae1 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build linux -// +build linux package fileutil import ( + "errors" "os" "syscall" ) @@ -26,10 +26,10 @@ func preallocExtend(f *os.File, sizeInBytes int64) error { // use mode = 0 to change size err := syscall.Fallocate(int(f.Fd()), 0, 0, sizeInBytes) if err != nil { - errno, ok := err.(syscall.Errno) + var errno syscall.Errno // not supported; fallback // fallocate EINTRs frequently in some environments; fallback - if ok && (errno == syscall.ENOTSUP || errno == syscall.EINTR) { + if errors.As(err, &errno) && (errno == syscall.ENOTSUP || errno == syscall.EINTR) { return preallocExtendTrunc(f, sizeInBytes) } } @@ -40,9 +40,9 @@ func preallocFixed(f *os.File, sizeInBytes int64) error { // use mode = 1 to keep size; see FALLOC_FL_KEEP_SIZE err := syscall.Fallocate(int(f.Fd()), 1, 0, sizeInBytes) if err != nil { - errno, ok := err.(syscall.Errno) + var errno syscall.Errno // treat not supported as nil error - if ok && errno == syscall.ENOTSUP { + if errors.As(err, &errno) && errno == syscall.ENOTSUP { return nil } } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go index 2c46dd4907..e7fd937a43 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !linux && !darwin -// +build !linux,!darwin package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go index b314e068fe..026ea03230 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go @@ -17,7 +17,6 @@ package fileutil import ( "os" "path/filepath" - "sort" "strings" "time" @@ -58,21 +57,14 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval defer close(donec) } for { - fnames, err := ReadDir(dirname) + fnamesWithSuffix, err := readDirWithSuffix(dirname, suffix) if err != nil { errC <- err return } - newfnames := make([]string, 0) - for _, fname := range fnames { - if strings.HasSuffix(fname, suffix) { - newfnames = append(newfnames, fname) - } - } - sort.Strings(newfnames) - fnames = newfnames - for len(newfnames) > int(max) { - f := filepath.Join(dirname, newfnames[0]) + nPurged := 0 + for nPurged < len(fnamesWithSuffix)-int(max) { + f := filepath.Join(dirname, fnamesWithSuffix[nPurged]) var l *LockedFile if flock { l, err = TryLockFile(f, os.O_WRONLY, PrivateFileMode) @@ -94,11 +86,12 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval } } lg.Info("purged", zap.String("path", f)) - newfnames = newfnames[1:] + nPurged++ } + if purgec != nil { - for i := 0; i < len(fnames)-len(newfnames); i++ { - purgec <- fnames[i] + for i := 0; i < nPurged; i++ { + purgec <- fnamesWithSuffix[i] } } select { @@ -110,3 +103,18 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval }() return errC } + +func readDirWithSuffix(dirname string, suffix string) ([]string, error) { + fnames, err := ReadDir(dirname) + if err != nil { + return nil, err + } + // filter in place (ref. https://go.dev/wiki/SliceTricks#filtering-without-allocating) + fnamesWithSuffix := fnames[:0] + for _, fname := range fnames { + if strings.HasSuffix(fname, suffix) { + fnamesWithSuffix = append(fnamesWithSuffix, fname) + } + } + return fnamesWithSuffix, nil +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go index 0a0855309e..670d01fadc 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !linux && !darwin -// +build !linux,!darwin package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go index 1923b276ea..7affa78ea6 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build darwin -// +build darwin package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go index b9398c23f9..a3172382e5 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build linux -// +build linux package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_format.go b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_format.go new file mode 100644 index 0000000000..286d385ba3 --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_format.go @@ -0,0 +1,42 @@ +// Copyright 2019 The etcd 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 logutil + +import "fmt" + +const ( + JSONLogFormat = "json" + ConsoleLogFormat = "console" + //revive:disable:var-naming + // Deprecated: Please use JSONLogFormat. + JsonLogFormat = JSONLogFormat + //revive:enable:var-naming +) + +var DefaultLogFormat = JSONLogFormat + +// ConvertToZapFormat converts and validated log format string. +func ConvertToZapFormat(format string) (string, error) { + switch format { + case ConsoleLogFormat: + return ConsoleLogFormat, nil + case JSONLogFormat: + return JSONLogFormat, nil + case "": + return DefaultLogFormat, nil + default: + return "", fmt.Errorf("unknown log format: %s, supported values json, console", format) + } +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go index f0f3739aad..befa575847 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go @@ -15,7 +15,7 @@ package logutil import ( - "sort" + "slices" "time" "go.uber.org/zap" @@ -43,7 +43,7 @@ var DefaultZapLoggerConfig = zap.Config{ Thereafter: 100, }, - Encoding: "json", + Encoding: DefaultLogFormat, // copied from "zap.NewProductionEncoderConfig" with some updates EncoderConfig: zapcore.EncoderConfig{ @@ -72,37 +72,22 @@ var DefaultZapLoggerConfig = zap.Config{ // MergeOutputPaths merges logging output paths, resolving conflicts. func MergeOutputPaths(cfg zap.Config) zap.Config { - outputs := make(map[string]struct{}) - for _, v := range cfg.OutputPaths { - outputs[v] = struct{}{} - } - outputSlice := make([]string, 0) - if _, ok := outputs["/dev/null"]; ok { - // "/dev/null" to discard all - outputSlice = []string{"/dev/null"} - } else { - for k := range outputs { - outputSlice = append(outputSlice, k) - } - } - cfg.OutputPaths = outputSlice - sort.Strings(cfg.OutputPaths) + cfg.OutputPaths = mergePaths(cfg.OutputPaths) + cfg.ErrorOutputPaths = mergePaths(cfg.ErrorOutputPaths) + return cfg +} - errOutputs := make(map[string]struct{}) - for _, v := range cfg.ErrorOutputPaths { - errOutputs[v] = struct{}{} +func mergePaths(old []string) []string { + if len(old) == 0 { + // the original implementation ensures the result is non-nil + return []string{} } - errOutputSlice := make([]string, 0) - if _, ok := errOutputs["/dev/null"]; ok { - // "/dev/null" to discard all - errOutputSlice = []string{"/dev/null"} - } else { - for k := range errOutputs { - errOutputSlice = append(errOutputSlice, k) - } + // use "/dev/null" to discard all + if slices.Contains(old, "/dev/null") { + return []string{"/dev/null"} } - cfg.ErrorOutputPaths = errOutputSlice - sort.Strings(cfg.ErrorOutputPaths) - - return cfg + // clone a new one; don't modify the original, in case it matters. + dup := slices.Clone(old) + slices.Sort(dup) + return slices.Compact(dup) } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go index 9daa3e0aab..06dc40dacd 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !windows -// +build !windows package logutil @@ -25,10 +24,10 @@ import ( "os" "path/filepath" - "go.etcd.io/etcd/client/pkg/v3/systemd" - "github.com/coreos/go-systemd/v22/journal" "go.uber.org/zap/zapcore" + + "go.etcd.io/etcd/client/pkg/v3/systemd" ) // NewJournalWriter wraps "io.Writer" to redirect log output diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go b/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go index 3a5aef089a..0f79865e80 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go @@ -18,7 +18,7 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" - "io/ioutil" + "os" ) // NewCertPool creates x509 certPool with provided CA files. @@ -26,7 +26,7 @@ func NewCertPool(CAFiles []string) (*x509.CertPool, error) { certPool := x509.NewCertPool() for _, CAFile := range CAFiles { - pemByte, err := ioutil.ReadFile(CAFile) + pemByte, err := os.ReadFile(CAFile) if err != nil { return nil, err } @@ -51,12 +51,12 @@ func NewCertPool(CAFiles []string) (*x509.CertPool, error) { // NewCert generates TLS cert by using the given cert,key and parse function. func NewCert(certfile, keyfile string, parseFunc func([]byte, []byte) (tls.Certificate, error)) (*tls.Certificate, error) { - cert, err := ioutil.ReadFile(certfile) + cert, err := os.ReadFile(certfile) if err != nil { return nil, err } - key, err := ioutil.ReadFile(keyfile) + key, err := os.ReadFile(keyfile) if err != nil { return nil, err } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go index d00a93dc19..d43ac4f078 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go @@ -16,6 +16,7 @@ package transport import ( "crypto/tls" + "errors" "fmt" "net" "time" @@ -38,7 +39,7 @@ func NewKeepAliveListener(l net.Listener, scheme string, tlscfg *tls.Config) (ne if scheme == "https" { if tlscfg == nil { - return nil, fmt.Errorf("cannot listen on TLS for given listener: KeyFile and CertFile are not presented") + return nil, errors.New("cannot listen on TLS for given listener: KeyFile and CertFile are not presented") } return newTLSKeepaliveListener(kal, tlscfg), nil } @@ -95,16 +96,17 @@ type tlsKeepaliveListener struct { // Accept waits for and returns the next incoming TLS connection. // The returned connection c is a *tls.Conn. -func (l *tlsKeepaliveListener) Accept() (c net.Conn, err error) { - c, err = l.Listener.Accept() +func (l *tlsKeepaliveListener) Accept() (net.Conn, error) { + c, err := l.Listener.Accept() if err != nil { - return + return nil, err } + c = tls.Server(c, l.config) return c, nil } -// NewListener creates a Listener which accepts connections from an inner +// newTLSKeepaliveListener creates a Listener which accepts connections from an inner // Listener and wraps each connection with Server. // The configuration config must be non-nil and must have // at least one certificate. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go index 404722ba76..bf4c4e104a 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go @@ -23,9 +23,7 @@ import ( "time" ) -var ( - ErrNotTCP = errors.New("only tcp connections have keepalive") -) +var ErrNotTCP = errors.New("only tcp connections have keepalive") // LimitListener returns a Listener that accepts at most n simultaneous // connections from the provided Listener. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go index a7d37688d9..9c2d29ba99 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go @@ -32,10 +32,11 @@ import ( "strings" "time" + "go.uber.org/zap" + "go.etcd.io/etcd/client/pkg/v3/fileutil" "go.etcd.io/etcd/client/pkg/v3/tlsutil" - - "go.uber.org/zap" + "go.etcd.io/etcd/client/pkg/v3/verify" ) // NewListener creates a new listner. @@ -43,7 +44,7 @@ func NewListener(addr, scheme string, tlsinfo *TLSInfo) (l net.Listener, err err return newListener(addr, scheme, WithTLSInfo(tlsinfo)) } -// NewListenerWithOpts creates a new listener which accpets listener options. +// NewListenerWithOpts creates a new listener which accepts listener options. func NewListenerWithOpts(addr, scheme string, opts ...ListenerOption) (net.Listener, error) { return newListener(addr, scheme, opts...) } @@ -59,11 +60,7 @@ func newListener(addr, scheme string, opts ...ListenerOption) (net.Listener, err switch { case lnOpts.IsSocketOpts(): // new ListenConfig with socket options. - config, err := newListenConfig(lnOpts.socketOpts) - if err != nil { - return nil, err - } - lnOpts.ListenConfig = config + lnOpts.ListenConfig = newListenConfig(lnOpts.socketOpts) // check for timeout fallthrough case lnOpts.IsTimeout(), lnOpts.IsSocketOpts(): @@ -102,14 +99,17 @@ func newListener(addr, scheme string, opts ...ListenerOption) (net.Listener, err return wrapTLS(scheme, lnOpts.tlsInfo, lnOpts.Listener) } -func newKeepAliveListener(cfg *net.ListenConfig, addr string) (ln net.Listener, err error) { +func newKeepAliveListener(cfg *net.ListenConfig, addr string) (net.Listener, error) { + var ln net.Listener + var err error + if cfg != nil { ln, err = cfg.Listen(context.TODO(), "tcp", addr) } else { ln, err = net.Listen("tcp", addr) } if err != nil { - return + return nil, err } return NewKeepAliveListener(ln, "tcp", nil) @@ -125,7 +125,7 @@ func wrapTLS(scheme string, tlsinfo *TLSInfo, l net.Listener) (net.Listener, err return newTLSListener(l, tlsinfo, checkSAN) } -func newListenConfig(sopts *SocketOpts) (net.ListenConfig, error) { +func newListenConfig(sopts *SocketOpts) net.ListenConfig { lc := net.ListenConfig{} if sopts != nil { ctls := getControls(sopts) @@ -133,7 +133,7 @@ func newListenConfig(sopts *SocketOpts) (net.ListenConfig, error) { lc.Control = ctls.Control } } - return lc, nil + return lc } type TLSInfo struct { @@ -204,6 +204,9 @@ type TLSInfo struct { // EmptyCN indicates that the cert must have empty CN. // If true, ClientConfig() will return an error for a cert with non empty CN. EmptyCN bool + + // LocalAddr is the local IP address to use when communicating with a peer. + LocalAddr string } func (info TLSInfo) String() string { @@ -214,34 +217,35 @@ func (info TLSInfo) Empty() bool { return info.CertFile == "" && info.KeyFile == "" } -func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertValidity uint, additionalUsages ...x509.ExtKeyUsage) (info TLSInfo, err error) { - info.Logger = lg +func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertValidity uint, additionalUsages ...x509.ExtKeyUsage) (TLSInfo, error) { + verify.Assert(lg != nil, "nil log isn't allowed") + + var err error + info := TLSInfo{Logger: lg} if selfSignedCertValidity == 0 { - err = fmt.Errorf("selfSignedCertValidity is invalid,it should be greater than 0") + err = errors.New("selfSignedCertValidity is invalid,it should be greater than 0") info.Logger.Warn( "cannot generate cert", zap.Error(err), ) - return + return info, err } err = fileutil.TouchDirAll(lg, dirpath) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot create cert directory", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot create cert directory", + zap.Error(err), + ) + return info, err } certPath, err := filepath.Abs(filepath.Join(dirpath, "cert.pem")) if err != nil { - return + return info, err } keyPath, err := filepath.Abs(filepath.Join(dirpath, "key.pem")) if err != nil { - return + return info, err } _, errcert := os.Stat(certPath) _, errkey := os.Stat(keyPath) @@ -251,19 +255,17 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali info.ClientCertFile = certPath info.ClientKeyFile = keyPath info.selfCert = true - return + return info, err } serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot generate random number", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot generate random number", + zap.Error(err), + ) + return info, err } tmpl := x509.Certificate{ @@ -272,17 +274,16 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali NotBefore: time.Now(), NotAfter: time.Now().Add(time.Duration(selfSignedCertValidity) * 365 * (24 * time.Hour)), - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCRLSign, ExtKeyUsage: append([]x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, additionalUsages...), BasicConstraintsValid: true, + IsCA: true, } - if info.Logger != nil { - info.Logger.Warn( - "automatically generate certificates", - zap.Time("certificate-validity-bound-not-after", tmpl.NotAfter), - ) - } + info.Logger.Warn( + "automatically generate certificates", + zap.Time("certificate-validity-bound-not-after", tmpl.NotAfter), + ) for _, host := range hosts { h, _, _ := net.SplitHostPort(host) @@ -295,24 +296,20 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali priv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot generate ECDSA key", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot generate ECDSA key", + zap.Error(err), + ) + return info, err } derBytes, err := x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, &priv.PublicKey, priv) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot generate x509 certificate", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot generate x509 certificate", + zap.Error(err), + ) + return info, err } certOut, err := os.Create(certPath) @@ -322,34 +319,29 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali zap.String("path", certPath), zap.Error(err), ) - return + return info, err } pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) certOut.Close() - if info.Logger != nil { - info.Logger.Info("created cert file", zap.String("path", certPath)) - } + + info.Logger.Info("created cert file", zap.String("path", certPath)) b, err := x509.MarshalECPrivateKey(priv) if err != nil { - return + return info, err } - keyOut, err := os.OpenFile(keyPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + keyOut, err := os.OpenFile(keyPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot key file", - zap.String("path", keyPath), - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot key file", + zap.String("path", keyPath), + zap.Error(err), + ) + return info, err } pem.Encode(keyOut, &pem.Block{Type: "EC PRIVATE KEY", Bytes: b}) keyOut.Close() - if info.Logger != nil { - info.Logger.Info("created key file", zap.String("path", keyPath)) - } + info.Logger.Info("created key file", zap.String("path", keyPath)) return SelfCert(lg, dirpath, hosts, selfSignedCertValidity) } @@ -482,23 +474,19 @@ func (info TLSInfo) baseConfig() (*tls.Config, error) { cfg.GetCertificate = func(clientHello *tls.ClientHelloInfo) (cert *tls.Certificate, err error) { cert, err = tlsutil.NewCert(info.CertFile, info.KeyFile, info.parseFunc) if os.IsNotExist(err) { - if info.Logger != nil { - info.Logger.Warn( - "failed to find peer cert files", - zap.String("cert-file", info.CertFile), - zap.String("key-file", info.KeyFile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to find peer cert files", + zap.String("cert-file", info.CertFile), + zap.String("key-file", info.KeyFile), + zap.Error(err), + ) } else if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "failed to create peer certificate", - zap.String("cert-file", info.CertFile), - zap.String("key-file", info.KeyFile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to create peer certificate", + zap.String("cert-file", info.CertFile), + zap.String("key-file", info.KeyFile), + zap.Error(err), + ) } return cert, err } @@ -509,23 +497,19 @@ func (info TLSInfo) baseConfig() (*tls.Config, error) { } cert, err = tlsutil.NewCert(certfile, keyfile, info.parseFunc) if os.IsNotExist(err) { - if info.Logger != nil { - info.Logger.Warn( - "failed to find client cert files", - zap.String("cert-file", certfile), - zap.String("key-file", keyfile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to find client cert files", + zap.String("cert-file", certfile), + zap.String("key-file", keyfile), + zap.Error(err), + ) } else if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "failed to create client certificate", - zap.String("cert-file", certfile), - zap.String("key-file", keyfile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to create client certificate", + zap.String("cert-file", certfile), + zap.String("key-file", keyfile), + zap.Error(err), + ) } return cert, err } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go index ad4f6904da..7536f6aff4 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go @@ -1,3 +1,17 @@ +// Copyright 2021 The etcd 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 transport import ( diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go index 6f1600945c..2c94841625 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go @@ -19,8 +19,8 @@ import ( "crypto/tls" "crypto/x509" "fmt" - "io/ioutil" "net" + "os" "strings" "sync" ) @@ -168,16 +168,16 @@ func (l *tlsListener) acceptLoop() { func checkCRL(crlPath string, cert []*x509.Certificate) error { // TODO: cache - crlBytes, err := ioutil.ReadFile(crlPath) + crlBytes, err := os.ReadFile(crlPath) if err != nil { return err } - certList, err := x509.ParseCRL(crlBytes) + certList, err := x509.ParseRevocationList(crlBytes) if err != nil { return err } revokedSerials := make(map[string]struct{}) - for _, rc := range certList.TBSCertList.RevokedCertificates { + for _, rc := range certList.RevokedCertificateEntries { revokedSerials[string(rc.SerialNumber.Bytes())] = struct{}{} } for _, c := range cert { @@ -222,7 +222,8 @@ func checkCertSAN(ctx context.Context, cert *x509.Certificate, remoteAddr string func isHostInDNS(ctx context.Context, host string, dnsNames []string) (ok bool, err error) { // reverse lookup - wildcards, names := []string{}, []string{} + var names []string + var wildcards []string for _, dns := range dnsNames { if strings.HasPrefix(dns, "*.") { wildcards = append(wildcards, dns[1:]) diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go index fe028c6132..49b48dc876 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go @@ -1,3 +1,17 @@ +// Copyright 2021 The etcd 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 transport import ( diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go index 495c736365..149ad51024 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go @@ -13,19 +13,18 @@ // limitations under the License. //go:build solaris -// +build solaris package transport import ( - "fmt" + "errors" "syscall" "golang.org/x/sys/unix" ) func setReusePort(network, address string, c syscall.RawConn) error { - return fmt.Errorf("port reuse is not supported on Solaris") + return errors.New("port reuse is not supported on Solaris") } func setReuseAddress(network, address string, conn syscall.RawConn) error { diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go index e2cc6f4828..385eadb007 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go @@ -12,8 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !windows && !solaris -// +build !windows,!solaris +//go:build !windows && !solaris && !wasm && !js package transport diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_wasm.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_wasm.go new file mode 100644 index 0000000000..c6590b1d46 --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_wasm.go @@ -0,0 +1,30 @@ +// Copyright 2023 The etcd 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 wasm || js + +package transport + +import ( + "errors" + "syscall" +) + +func setReusePort(network, address string, c syscall.RawConn) error { + return errors.New("port reuse is not supported on WASM") +} + +func setReuseAddress(network, addr string, conn syscall.RawConn) error { + return errors.New("address reuse is not supported on WASM") +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go index 4e5af70b11..2670b4dc7b 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go @@ -1,19 +1,32 @@ +// Copyright 2021 The etcd 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 windows -// +build windows package transport import ( - "fmt" + "errors" "syscall" ) func setReusePort(network, address string, c syscall.RawConn) error { - return fmt.Errorf("port reuse is not supported on Windows") + return errors.New("port reuse is not supported on Windows") } // Windows supports SO_REUSEADDR, but it may cause undefined behavior, as // there is no protection against port hijacking. func setReuseAddress(network, addr string, conn syscall.RawConn) error { - return fmt.Errorf("address reuse is not supported on Windows") + return errors.New("address reuse is not supported on Windows") } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go index 8c3a35b140..d5375863fd 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go @@ -16,6 +16,7 @@ package transport import ( "context" + "errors" "fmt" "strings" "time" @@ -46,7 +47,7 @@ func ValidateSecureEndpoints(tlsInfo TLSInfo, eps []string) ([]string, error) { endpoints = append(endpoints, ep) } if len(errs) != 0 { - err = fmt.Errorf("%s", strings.Join(errs, ",")) + err = errors.New(strings.Join(errs, ",")) } return endpoints, err } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go index 648512772d..67170d7436 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go @@ -30,10 +30,19 @@ func NewTransport(info TLSInfo, dialtimeoutd time.Duration) (*http.Transport, er return nil, err } + var ipAddr net.Addr + if info.LocalAddr != "" { + ipAddr, err = net.ResolveTCPAddr("tcp", info.LocalAddr+":0") + if err != nil { + return nil, err + } + } + t := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ - Timeout: dialtimeoutd, + Timeout: dialtimeoutd, + LocalAddr: ipAddr, // value taken from http.DefaultTransport KeepAlive: 30 * time.Second, }).DialContext, @@ -57,7 +66,7 @@ func NewTransport(info TLSInfo, dialtimeoutd time.Duration) (*http.Transport, er TLSClientConfig: cfg, // Cost of reopening connection on sockets is low, and they are mostly used in testing. // Long living unix-transport connections were leading to 'leak' test flakes. - // Alternativly the returned Transport (t) should override CloseIdleConnections to + // Alternatively the returned Transport (t) should override CloseIdleConnections to // forward it to 'tu' as well. IdleConnTimeout: time.Microsecond, } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go b/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go index ae00388dde..7a09647b5d 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go @@ -14,7 +14,10 @@ package types -import "strconv" +import ( + "strconv" + "strings" +) // ID represents a generic identifier which is canonically // stored as a uint64 but is typically represented as a @@ -37,3 +40,17 @@ type IDSlice []ID func (p IDSlice) Len() int { return len(p) } func (p IDSlice) Less(i, j int) bool { return uint64(p[i]) < uint64(p[j]) } func (p IDSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +func (p IDSlice) String() string { + var b strings.Builder + if p.Len() > 0 { + b.WriteString(p[0].String()) + } + + for i := 1; i < p.Len(); i++ { + b.WriteString(",") + b.WriteString(p[i].String()) + } + + return b.String() +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go b/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go index e7a3cdc9ab..3e69c8d8b9 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go @@ -90,7 +90,7 @@ func (us *unsafeSet) Length() int { // Values returns the values of the Set in an unspecified order. func (us *unsafeSet) Values() (values []string) { - values = make([]string, 0) + values = make([]string, 0, len(us.d)) for val := range us.d { values = append(values, val) } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/verify/verify.go b/vendor/go.etcd.io/etcd/client/pkg/v3/verify/verify.go new file mode 100644 index 0000000000..a7b2097bed --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/verify/verify.go @@ -0,0 +1,80 @@ +// Copyright 2022 The etcd 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 verify + +import ( + "fmt" + "os" + "strings" +) + +const envVerify = "ETCD_VERIFY" + +type VerificationType string + +const ( + envVerifyValueAll VerificationType = "all" + envVerifyValueAssert VerificationType = "assert" +) + +func getEnvVerify() string { + return strings.ToLower(os.Getenv(envVerify)) +} + +func IsVerificationEnabled(verification VerificationType) bool { + env := getEnvVerify() + return env == string(envVerifyValueAll) || env == strings.ToLower(string(verification)) +} + +// EnableVerifications sets `envVerify` and returns a function that +// can be used to bring the original settings. +func EnableVerifications(verification VerificationType) func() { + previousEnv := getEnvVerify() + os.Setenv(envVerify, string(verification)) + return func() { + os.Setenv(envVerify, previousEnv) + } +} + +// EnableAllVerifications enables verification and returns a function +// that can be used to bring the original settings. +func EnableAllVerifications() func() { + return EnableVerifications(envVerifyValueAll) +} + +// DisableVerifications unsets `envVerify` and returns a function that +// can be used to bring the original settings. +func DisableVerifications() func() { + previousEnv := getEnvVerify() + os.Unsetenv(envVerify) + return func() { + os.Setenv(envVerify, previousEnv) + } +} + +// Verify performs verification if the assertions are enabled. +// In the default setup running in tests and skipped in the production code. +func Verify(f func()) { + if IsVerificationEnabled(envVerifyValueAssert) { + f() + } +} + +// Assert will panic with a given formatted message if the given condition is false. +func Assert(condition bool, msg string, v ...any) { + if !condition { + panic(fmt.Sprintf("assertion failed: "+msg, v...)) + } +} diff --git a/vendor/go.etcd.io/etcd/client/v3/OWNERS b/vendor/go.etcd.io/etcd/client/v3/OWNERS new file mode 100644 index 0000000000..2b7f28b793 --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/v3/OWNERS @@ -0,0 +1,4 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +labels: + - area/clientv3 diff --git a/vendor/go.etcd.io/etcd/client/v3/README.md b/vendor/go.etcd.io/etcd/client/v3/README.md index 16c0fe888c..af0087ebcc 100644 --- a/vendor/go.etcd.io/etcd/client/v3/README.md +++ b/vendor/go.etcd.io/etcd/client/v3/README.md @@ -1,7 +1,7 @@ -# etcd/clientv3 +# etcd/client/v3 [![Docs](https://img.shields.io/badge/docs-latest-green.svg)](https://etcd.io/docs) -[![Godoc](https://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/go.etcd.io/etcd/clientv3) +[![Godoc](https://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/go.etcd.io/etcd/client/v3) `etcd/clientv3` is the official Go etcd client for v3. @@ -16,14 +16,18 @@ go get go.etcd.io/etcd/client/v3 Create client using `clientv3.New`: ```go -cli, err := clientv3.New(clientv3.Config{ - Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, - DialTimeout: 5 * time.Second, -}) -if err != nil { - // handle error! +import clientv3 "go.etcd.io/etcd/client/v3" + +func main() { + cli, err := clientv3.New(clientv3.Config{ + Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, + DialTimeout: 5 * time.Second, + }) + if err != nil { + // handle error! + } + defer cli.Close() } -defer cli.Close() ``` etcd v3 uses [`gRPC`](https://www.grpc.io) for remote procedure calls. And `clientv3` uses diff --git a/vendor/go.etcd.io/etcd/client/v3/auth.go b/vendor/go.etcd.io/etcd/client/v3/auth.go index 110918a4c7..382172b21b 100644 --- a/vendor/go.etcd.io/etcd/client/v3/auth.go +++ b/vendor/go.etcd.io/etcd/client/v3/auth.go @@ -19,9 +19,10 @@ import ( "fmt" "strings" + "google.golang.org/grpc" + "go.etcd.io/etcd/api/v3/authpb" pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "google.golang.org/grpc" ) type ( diff --git a/vendor/go.etcd.io/etcd/client/v3/client.go b/vendor/go.etcd.io/etcd/client/v3/client.go index f7aa65a0a7..24f5988986 100644 --- a/vendor/go.etcd.io/etcd/client/v3/client.go +++ b/vendor/go.etcd.io/etcd/client/v3/client.go @@ -18,22 +18,26 @@ import ( "context" "errors" "fmt" - "strconv" "strings" "sync" "time" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" - "go.etcd.io/etcd/client/pkg/v3/logutil" - "go.etcd.io/etcd/client/v3/credentials" - "go.etcd.io/etcd/client/v3/internal/endpoint" - "go.etcd.io/etcd/client/v3/internal/resolver" + "github.com/coreos/go-semver/semver" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" grpccredentials "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/status" + + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" + "go.etcd.io/etcd/api/v3/version" + "go.etcd.io/etcd/client/pkg/v3/logutil" + "go.etcd.io/etcd/client/pkg/v3/verify" + "go.etcd.io/etcd/client/v3/credentials" + "go.etcd.io/etcd/client/v3/internal/endpoint" + "go.etcd.io/etcd/client/v3/internal/resolver" ) var ( @@ -55,7 +59,9 @@ type Client struct { cfg Config creds grpccredentials.TransportCredentials resolver *resolver.EtcdManualResolver - mu *sync.RWMutex + + epMu *sync.RWMutex + endpoints []string ctx context.Context cancel context.CancelFunc @@ -64,7 +70,7 @@ type Client struct { Username string // Password is a password for authentication. Password string - authTokenBundle credentials.Bundle + authTokenBundle credentials.PerRPCCredentialsBundle callOpts []grpc.CallOption @@ -86,7 +92,7 @@ func New(cfg Config) (*Client, error) { // service interface implementations and do not need connection management. func NewCtxClient(ctx context.Context, opts ...Option) *Client { cctx, cancel := context.WithCancel(ctx) - c := &Client{ctx: cctx, cancel: cancel, lgMu: new(sync.RWMutex), mu: new(sync.RWMutex)} + c := &Client{ctx: cctx, cancel: cancel, lgMu: new(sync.RWMutex), epMu: new(sync.RWMutex)} for _, opt := range opts { opt(c) } @@ -161,18 +167,18 @@ func (c *Client) Ctx() context.Context { return c.ctx } // Endpoints lists the registered endpoints for the client. func (c *Client) Endpoints() []string { // copy the slice; protect original endpoints from being changed - c.mu.RLock() - defer c.mu.RUnlock() - eps := make([]string, len(c.cfg.Endpoints)) - copy(eps, c.cfg.Endpoints) + c.epMu.RLock() + defer c.epMu.RUnlock() + eps := make([]string, len(c.endpoints)) + copy(eps, c.endpoints) return eps } // SetEndpoints updates client's endpoints. func (c *Client) SetEndpoints(eps ...string) { - c.mu.Lock() - defer c.mu.Unlock() - c.cfg.Endpoints = eps + c.epMu.Lock() + defer c.epMu.Unlock() + c.endpoints = eps c.resolver.SetEndpoints(eps) } @@ -189,7 +195,15 @@ func (c *Client) Sync(ctx context.Context) error { eps = append(eps, m.ClientURLs...) } } + // The linearizable `MemberList` returned successfully, so the + // endpoints shouldn't be empty. + verify.Verify(func() { + if len(eps) == 0 { + panic("empty endpoints returned from etcd cluster") + } + }) c.SetEndpoints(eps...) + c.lg.Debug("set etcd endpoints by autoSync", zap.Strings("endpoints", eps)) return nil } @@ -206,7 +220,7 @@ func (c *Client) autoSync() { ctx, cancel := context.WithTimeout(c.ctx, 5*time.Second) err := c.Sync(ctx) cancel() - if err != nil && err != c.ctx.Err() { + if err != nil && !errors.Is(err, c.ctx.Err()) { c.lg.Info("Auto sync endpoints failed.", zap.Error(err)) } } @@ -214,7 +228,9 @@ func (c *Client) autoSync() { } // dialSetupOpts gives the dial opts prior to any authentication. -func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) (opts []grpc.DialOption, err error) { +func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) []grpc.DialOption { + var opts []grpc.DialOption + if c.cfg.DialKeepAliveTime > 0 { params := keepalive.ClientParameters{ Time: c.cfg.DialKeepAliveTime, @@ -228,7 +244,7 @@ func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts if creds != nil { opts = append(opts, grpc.WithTransportCredentials(creds)) } else { - opts = append(opts, grpc.WithInsecure()) + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) } unaryMaxRetries := defaultUnaryMaxRetries @@ -257,7 +273,7 @@ func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts grpc.WithUnaryInterceptor(c.unaryClientInterceptor(withMax(unaryMaxRetries), rrBackoff)), ) - return opts, nil + return opts } // Dial connects to a single endpoint using the client's config. @@ -278,7 +294,7 @@ func (c *Client) getToken(ctx context.Context) error { resp, err := c.Auth.Authenticate(ctx, c.Username, c.Password) if err != nil { - if err == rpctypes.ErrAuthNotEnabled { + if errors.Is(err, rpctypes.ErrAuthNotEnabled) { c.authTokenBundle.UpdateAuthToken("") return nil } @@ -298,10 +314,8 @@ func (c *Client) dialWithBalancer(dopts ...grpc.DialOption) (*grpc.ClientConn, e // dial configures and dials any grpc balancer target. func (c *Client) dial(creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) (*grpc.ClientConn, error) { - opts, err := c.dialSetupOpts(creds, dopts...) - if err != nil { - return nil, fmt.Errorf("failed to configure dialer: %v", err) - } + opts := c.dialSetupOpts(creds, dopts...) + if c.authTokenBundle != nil { opts = append(opts, grpc.WithPerRPCCredentials(c.authTokenBundle.PerRPCCredentials())) } @@ -314,7 +328,7 @@ func (c *Client) dial(creds grpccredentials.TransportCredentials, dopts ...grpc. dctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout) defer cancel() // TODO: Is this right for cases where grpc.WithBlock() is not set on the dial options? } - target := fmt.Sprintf("%s://%p/%s", resolver.Schema, c, authority(c.Endpoints()[0])) + target := fmt.Sprintf("%s://%p/%s", resolver.Schema, c, authority(c.endpoints[0])) conn, err := grpc.DialContext(dctx, target, opts...) if err != nil { return nil, err @@ -339,15 +353,15 @@ func authority(endpoint string) string { func (c *Client) credentialsForEndpoint(ep string) grpccredentials.TransportCredentials { r := endpoint.RequiresCredentials(ep) switch r { - case endpoint.CREDS_DROP: + case endpoint.CredsDrop: return nil - case endpoint.CREDS_OPTIONAL: + case endpoint.CredsOptional: return c.creds - case endpoint.CREDS_REQUIRE: + case endpoint.CredsRequire: if c.creds != nil { return c.creds } - return credentials.NewBundle(credentials.Config{}).TransportCredentials() + return credentials.NewTransportCredential(nil) default: panic(fmt.Errorf("unsupported CredsRequirement: %v", r)) } @@ -359,7 +373,7 @@ func newClient(cfg *Config) (*Client, error) { } var creds grpccredentials.TransportCredentials if cfg.TLS != nil { - creds = credentials.NewBundle(credentials.Config{TLSConfig: cfg.TLS}).TransportCredentials() + creds = credentials.NewTransportCredential(cfg.TLS) } // use a temporary skeleton client to bootstrap first connection @@ -375,7 +389,7 @@ func newClient(cfg *Config) (*Client, error) { creds: creds, ctx: ctx, cancel: cancel, - mu: new(sync.RWMutex), + epMu: new(sync.RWMutex), callOpts: defaultCallOpts, lgMu: new(sync.RWMutex), } @@ -398,7 +412,7 @@ func newClient(cfg *Config) (*Client, error) { if cfg.Username != "" && cfg.Password != "" { client.Username = cfg.Username client.Password = cfg.Password - client.authTokenBundle = credentials.NewBundle(credentials.Config{}) + client.authTokenBundle = credentials.NewPerRPCCredentialBundle() } if cfg.MaxCallSendMsgSize > 0 || cfg.MaxCallRecvMsgSize > 0 { if cfg.MaxCallRecvMsgSize > 0 && cfg.MaxCallSendMsgSize > cfg.MaxCallRecvMsgSize { @@ -422,8 +436,10 @@ func newClient(cfg *Config) (*Client, error) { if len(cfg.Endpoints) < 1 { client.cancel() - return nil, fmt.Errorf("at least one Endpoint is required in client config") + return nil, errors.New("at least one Endpoint is required in client config") } + client.SetEndpoints(cfg.Endpoints...) + // Use a provided endpoint target so that for https:// without any tls config given, then // grpc will assume the certificate server name is the endpoint host. conn, err := client.dialWithBalancer() @@ -442,7 +458,7 @@ func newClient(cfg *Config) (*Client, error) { client.Auth = NewAuth(client) client.Maintenance = NewMaintenance(client) - //get token with established connection + // get token with established connection ctx, cancel = client.ctx, func() {} if client.cfg.DialTimeout > 0 { ctx, cancel = context.WithTimeout(ctx, client.cfg.DialTimeout) @@ -451,7 +467,7 @@ func newClient(cfg *Config) (*Client, error) { if err != nil { client.Close() cancel() - //TODO: Consider fmt.Errorf("communicating with [%s] failed: %v", strings.Join(cfg.Endpoints, ";"), err) + // TODO: Consider fmt.Errorf("communicating with [%s] failed: %v", strings.Join(cfg.Endpoints, ";"), err) return nil, err } cancel() @@ -483,6 +499,22 @@ func (c *Client) roundRobinQuorumBackoff(waitBetween time.Duration, jitterFracti } } +// minSupportedVersion returns the minimum version supported, which is the previous minor release. +func minSupportedVersion() *semver.Version { + ver := semver.Must(semver.NewVersion(version.Version)) + // consider only major and minor version + ver = &semver.Version{Major: ver.Major, Minor: ver.Minor} + for i := range version.AllVersions { + if version.AllVersions[i].Equal(*ver) { + if i == 0 { + return ver + } + return &version.AllVersions[i-1] + } + } + panic("current version is not in the version list") +} + func (c *Client) checkVersion() (err error) { var wg sync.WaitGroup @@ -504,20 +536,13 @@ func (c *Client) checkVersion() (err error) { errc <- rerr return } - vs := strings.Split(resp.Version, ".") - maj, min := 0, 0 - if len(vs) >= 2 { - var serr error - if maj, serr = strconv.Atoi(vs[0]); serr != nil { - errc <- serr - return - } - if min, serr = strconv.Atoi(vs[1]); serr != nil { - errc <- serr - return - } + vs, serr := semver.NewVersion(resp.Version) + if serr != nil { + errc <- serr + return } - if maj < 3 || (maj == 3 && min < 4) { + + if vs.LessThan(*minSupportedVersion()) { rerr = ErrOldCluster } errc <- rerr @@ -580,7 +605,8 @@ func ContextError(ctx context.Context, err error) error { return nil } err = rpctypes.Error(err) - if _, ok := err.(rpctypes.EtcdError); ok { + var serverErr rpctypes.EtcdError + if errors.As(err, &serverErr) { return err } if ev, ok := status.FromError(err); ok { @@ -602,7 +628,7 @@ func canceledByCaller(stopCtx context.Context, err error) bool { return false } - return err == context.Canceled || err == context.DeadlineExceeded + return errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) } // IsConnCanceled returns true, if error is from a closed gRPC connection. @@ -620,7 +646,7 @@ func IsConnCanceled(err error) bool { } // >= gRPC v1.10.x - if err == context.Canceled { + if errors.Is(err, context.Canceled) { return true } diff --git a/vendor/go.etcd.io/etcd/client/v3/cluster.go b/vendor/go.etcd.io/etcd/client/v3/cluster.go index 1815c1c964..1b7e83375c 100644 --- a/vendor/go.etcd.io/etcd/client/v3/cluster.go +++ b/vendor/go.etcd.io/etcd/client/v3/cluster.go @@ -17,10 +17,10 @@ package clientv3 import ( "context" + "google.golang.org/grpc" + pb "go.etcd.io/etcd/api/v3/etcdserverpb" "go.etcd.io/etcd/client/pkg/v3/types" - - "google.golang.org/grpc" ) type ( @@ -34,7 +34,7 @@ type ( type Cluster interface { // MemberList lists the current cluster membership. - MemberList(ctx context.Context) (*MemberListResponse, error) + MemberList(ctx context.Context, opts ...OpOption) (*MemberListResponse, error) // MemberAdd adds a new member into the cluster. MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) @@ -122,9 +122,9 @@ func (c *cluster) MemberUpdate(ctx context.Context, id uint64, peerAddrs []strin return nil, ContextError(ctx, err) } -func (c *cluster) MemberList(ctx context.Context) (*MemberListResponse, error) { - // it is safe to retry on list. - resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{Linearizable: true}, c.callOpts...) +func (c *cluster) MemberList(ctx context.Context, opts ...OpOption) (*MemberListResponse, error) { + opt := OpGet("", opts...) + resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{Linearizable: !opt.serializable}, c.callOpts...) if err == nil { return (*MemberListResponse)(resp), nil } diff --git a/vendor/go.etcd.io/etcd/client/v3/compare.go b/vendor/go.etcd.io/etcd/client/v3/compare.go index e2967cf38e..663fdb4d20 100644 --- a/vendor/go.etcd.io/etcd/client/v3/compare.go +++ b/vendor/go.etcd.io/etcd/client/v3/compare.go @@ -18,8 +18,10 @@ import ( pb "go.etcd.io/etcd/api/v3/etcdserverpb" ) -type CompareTarget int -type CompareResult int +type ( + CompareTarget int + CompareResult int +) const ( CompareVersion CompareTarget = iota @@ -30,7 +32,7 @@ const ( type Cmp pb.Compare -func Compare(cmp Cmp, result string, v interface{}) Cmp { +func Compare(cmp Cmp, result string, v any) Cmp { var r pb.Compare_CompareResult switch result { @@ -120,7 +122,7 @@ func (cmp Cmp) WithPrefix() Cmp { } // mustInt64 panics if val isn't an int or int64. It returns an int64 otherwise. -func mustInt64(val interface{}) int64 { +func mustInt64(val any) int64 { if v, ok := val.(int64); ok { return v } @@ -132,7 +134,7 @@ func mustInt64(val interface{}) int64 { // mustInt64orLeaseID panics if val isn't a LeaseID, int or int64. It returns an // int64 otherwise. -func mustInt64orLeaseID(val interface{}) int64 { +func mustInt64orLeaseID(val any) int64 { if v, ok := val.(LeaseID); ok { return int64(v) } diff --git a/vendor/go.etcd.io/etcd/client/v3/config.go b/vendor/go.etcd.io/etcd/client/v3/config.go index 6f5b41978d..8351828d2f 100644 --- a/vendor/go.etcd.io/etcd/client/v3/config.go +++ b/vendor/go.etcd.io/etcd/client/v3/config.go @@ -21,6 +21,8 @@ import ( "go.uber.org/zap" "google.golang.org/grpc" + + "go.etcd.io/etcd/client/pkg/v3/transport" ) type Config struct { @@ -52,7 +54,7 @@ type Config struct { // If 0, it defaults to "math.MaxInt32", because range response can // easily exceed request send limits. // Make sure that "MaxCallRecvMsgSize" >= server-side default send/recv limit. - // ("--max-request-bytes" flag to etcd or "embed.Config.MaxRequestBytes"). + // ("--max-recv-bytes" flag to etcd). MaxCallRecvMsgSize int // TLS holds the client secure credentials, if any. @@ -99,3 +101,128 @@ type Config struct { // TODO: support custom balancer picker } + +// ConfigSpec is the configuration from users, which comes from command-line flags, +// environment variables or config file. It is a fully declarative configuration, +// and can be serialized & deserialized to/from JSON. +type ConfigSpec struct { + Endpoints []string `json:"endpoints"` + RequestTimeout time.Duration `json:"request-timeout"` + DialTimeout time.Duration `json:"dial-timeout"` + KeepAliveTime time.Duration `json:"keepalive-time"` + KeepAliveTimeout time.Duration `json:"keepalive-timeout"` + MaxCallSendMsgSize int `json:"max-request-bytes"` + MaxCallRecvMsgSize int `json:"max-recv-bytes"` + Secure *SecureConfig `json:"secure"` + Auth *AuthConfig `json:"auth"` +} + +type SecureConfig struct { + Cert string `json:"cert"` + Key string `json:"key"` + Cacert string `json:"cacert"` + ServerName string `json:"server-name"` + + InsecureTransport bool `json:"insecure-transport"` + InsecureSkipVerify bool `json:"insecure-skip-tls-verify"` +} + +type AuthConfig struct { + Username string `json:"username"` + Password string `json:"password"` +} + +func (cs *ConfigSpec) Clone() *ConfigSpec { + if cs == nil { + return nil + } + + clone := *cs + + if len(cs.Endpoints) > 0 { + clone.Endpoints = make([]string, len(cs.Endpoints)) + copy(clone.Endpoints, cs.Endpoints) + } + + if cs.Secure != nil { + clone.Secure = &SecureConfig{} + *clone.Secure = *cs.Secure + } + if cs.Auth != nil { + clone.Auth = &AuthConfig{} + *clone.Auth = *cs.Auth + } + + return &clone +} + +func (cfg AuthConfig) Empty() bool { + return cfg.Username == "" && cfg.Password == "" +} + +// NewClientConfig creates a Config based on the provided ConfigSpec. +func NewClientConfig(confSpec *ConfigSpec, lg *zap.Logger) (*Config, error) { + tlsCfg, err := newTLSConfig(confSpec.Secure, lg) + if err != nil { + return nil, err + } + + cfg := &Config{ + Endpoints: confSpec.Endpoints, + DialTimeout: confSpec.DialTimeout, + DialKeepAliveTime: confSpec.KeepAliveTime, + DialKeepAliveTimeout: confSpec.KeepAliveTimeout, + MaxCallSendMsgSize: confSpec.MaxCallSendMsgSize, + MaxCallRecvMsgSize: confSpec.MaxCallRecvMsgSize, + TLS: tlsCfg, + } + + if confSpec.Auth != nil { + cfg.Username = confSpec.Auth.Username + cfg.Password = confSpec.Auth.Password + } + + return cfg, nil +} + +func newTLSConfig(scfg *SecureConfig, lg *zap.Logger) (*tls.Config, error) { + var ( + tlsCfg *tls.Config + err error + ) + + if scfg == nil { + return nil, nil + } + + if scfg.Cert != "" || scfg.Key != "" || scfg.Cacert != "" || scfg.ServerName != "" { + cfgtls := &transport.TLSInfo{ + CertFile: scfg.Cert, + KeyFile: scfg.Key, + TrustedCAFile: scfg.Cacert, + ServerName: scfg.ServerName, + Logger: lg, + } + if tlsCfg, err = cfgtls.ClientConfig(); err != nil { + return nil, err + } + } + + // If key/cert is not given but user wants secure connection, we + // should still setup an empty tls configuration for gRPC to setup + // secure connection. + if tlsCfg == nil && !scfg.InsecureTransport { + tlsCfg = &tls.Config{} + } + + // If the user wants to skip TLS verification then we should set + // the InsecureSkipVerify flag in tls configuration. + if scfg.InsecureSkipVerify { + if tlsCfg == nil { + tlsCfg = &tls.Config{} + } + tlsCfg.InsecureSkipVerify = scfg.InsecureSkipVerify + } + + return tlsCfg, nil +} diff --git a/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go b/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go index 42f688eb35..a2d8b45e86 100644 --- a/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go +++ b/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go @@ -19,92 +19,51 @@ package credentials import ( "context" "crypto/tls" - "net" "sync" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" grpccredentials "google.golang.org/grpc/credentials" + + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) -// Config defines gRPC credential configuration. -type Config struct { - TLSConfig *tls.Config +func NewTransportCredential(cfg *tls.Config) grpccredentials.TransportCredentials { + return grpccredentials.NewTLS(cfg) } -// Bundle defines gRPC credential interface. -type Bundle interface { - grpccredentials.Bundle +// PerRPCCredentialsBundle defines gRPC credential interface. +type PerRPCCredentialsBundle interface { UpdateAuthToken(token string) + PerRPCCredentials() grpccredentials.PerRPCCredentials } -// NewBundle constructs a new gRPC credential bundle. -func NewBundle(cfg Config) Bundle { - return &bundle{ - tc: newTransportCredential(cfg.TLSConfig), - rc: newPerRPCCredential(), +func NewPerRPCCredentialBundle() PerRPCCredentialsBundle { + return &perRPCCredentialBundle{ + rc: &perRPCCredential{}, } } -// bundle implements "grpccredentials.Bundle" interface. -type bundle struct { - tc *transportCredential +// perRPCCredentialBundle implements `PerRPCCredentialsBundle` interface. +type perRPCCredentialBundle struct { rc *perRPCCredential } -func (b *bundle) TransportCredentials() grpccredentials.TransportCredentials { - return b.tc -} - -func (b *bundle) PerRPCCredentials() grpccredentials.PerRPCCredentials { - return b.rc -} - -func (b *bundle) NewWithMode(mode string) (grpccredentials.Bundle, error) { - // no-op - return nil, nil -} - -// transportCredential implements "grpccredentials.TransportCredentials" interface. -type transportCredential struct { - gtc grpccredentials.TransportCredentials -} - -func newTransportCredential(cfg *tls.Config) *transportCredential { - return &transportCredential{ - gtc: grpccredentials.NewTLS(cfg), - } -} - -func (tc *transportCredential) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (net.Conn, grpccredentials.AuthInfo, error) { - return tc.gtc.ClientHandshake(ctx, authority, rawConn) -} - -func (tc *transportCredential) ServerHandshake(rawConn net.Conn) (net.Conn, grpccredentials.AuthInfo, error) { - return tc.gtc.ServerHandshake(rawConn) -} - -func (tc *transportCredential) Info() grpccredentials.ProtocolInfo { - return tc.gtc.Info() -} - -func (tc *transportCredential) Clone() grpccredentials.TransportCredentials { - return &transportCredential{ - gtc: tc.gtc.Clone(), +func (b *perRPCCredentialBundle) UpdateAuthToken(token string) { + if b.rc == nil { + return } + b.rc.UpdateAuthToken(token) } -func (tc *transportCredential) OverrideServerName(serverNameOverride string) error { - return tc.gtc.OverrideServerName(serverNameOverride) +func (b *perRPCCredentialBundle) PerRPCCredentials() grpccredentials.PerRPCCredentials { + return b.rc } -// perRPCCredential implements "grpccredentials.PerRPCCredentials" interface. +// perRPCCredential implements `grpccredentials.PerRPCCredentials` interface. type perRPCCredential struct { authToken string authTokenMu sync.RWMutex } -func newPerRPCCredential() *perRPCCredential { return &perRPCCredential{} } - func (rc *perRPCCredential) RequireTransportSecurity() bool { return false } func (rc *perRPCCredential) GetRequestMetadata(ctx context.Context, s ...string) (map[string]string, error) { @@ -117,13 +76,6 @@ func (rc *perRPCCredential) GetRequestMetadata(ctx context.Context, s ...string) return map[string]string{rpctypes.TokenFieldNameGRPC: authToken}, nil } -func (b *bundle) UpdateAuthToken(token string) { - if b.rc == nil { - return - } - b.rc.UpdateAuthToken(token) -} - func (rc *perRPCCredential) UpdateAuthToken(token string) { rc.authTokenMu.Lock() rc.authToken = token diff --git a/vendor/go.etcd.io/etcd/client/v3/ctx.go b/vendor/go.etcd.io/etcd/client/v3/ctx.go index 56b69cf2ed..38cee6c27e 100644 --- a/vendor/go.etcd.io/etcd/client/v3/ctx.go +++ b/vendor/go.etcd.io/etcd/client/v3/ctx.go @@ -17,9 +17,10 @@ package clientv3 import ( "context" + "google.golang.org/grpc/metadata" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" "go.etcd.io/etcd/api/v3/version" - "google.golang.org/grpc/metadata" ) // WithRequireLeader requires client requests to only succeed diff --git a/vendor/go.etcd.io/etcd/client/v3/doc.go b/vendor/go.etcd.io/etcd/client/v3/doc.go index fd61aff117..bd820d3d79 100644 --- a/vendor/go.etcd.io/etcd/client/v3/doc.go +++ b/vendor/go.etcd.io/etcd/client/v3/doc.go @@ -47,8 +47,8 @@ // To specify a client request timeout, wrap the context with context.WithTimeout: // // ctx, cancel := context.WithTimeout(context.Background(), timeout) +// defer cancel() // resp, err := kvc.Put(ctx, "sample_key", "sample_value") -// cancel() // if err != nil { // // handle error! // } @@ -61,8 +61,7 @@ // // 1. context error: canceled or deadline exceeded. // 2. gRPC error: e.g. when clock drifts in server-side before client's context deadline exceeded. -// -// See https://github.com/etcd-io/etcd/blob/main/api/v3rpc/rpctypes/error.go +// See https://github.com/etcd-io/etcd/blob/main/api/v3rpc/rpctypes/error.go // // Here is the example code to handle client errors: // diff --git a/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go b/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go index 35a3fe8c33..2c45b5e306 100644 --- a/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go +++ b/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go @@ -25,12 +25,12 @@ import ( type CredsRequirement int const ( - // CREDS_REQUIRE - Credentials/certificate required for thi type of connection. - CREDS_REQUIRE CredsRequirement = iota - // CREDS_DROP - Credentials/certificate not needed and should get ignored. - CREDS_DROP - // CREDS_OPTIONAL - Credentials/certificate might be used if supplied - CREDS_OPTIONAL + // CredsRequire - Credentials/certificate required for thi type of connection. + CredsRequire CredsRequirement = iota + // CredsDrop - Credentials/certificate not needed and should get ignored. + CredsDrop + // CredsOptional - Credentials/certificate might be used if supplied + CredsOptional ) func extractHostFromHostPort(ep string) string { @@ -54,20 +54,20 @@ func mustSplit2(s, sep string) (string, string) { func schemeToCredsRequirement(schema string) CredsRequirement { switch schema { case "https", "unixs": - return CREDS_REQUIRE + return CredsRequire case "http": - return CREDS_DROP + return CredsDrop case "unix": // Preserving previous behavior from: // https://github.com/etcd-io/etcd/blob/dae29bb719dd69dc119146fc297a0628fcc1ccf8/client/v3/client.go#L212 // that likely was a bug due to missing 'fallthrough'. // At the same time it seems legit to let the users decide whether they // want credential control or not (and 'unixs' schema is not a standard thing). - return CREDS_OPTIONAL + return CredsOptional case "": - return CREDS_OPTIONAL + return CredsOptional default: - return CREDS_OPTIONAL + return CredsOptional } } @@ -106,7 +106,7 @@ func translateEndpoint(ep string) (addr string, serverName string, requireCreds if strings.Contains(ep, "://") { url, err := url.Parse(ep) if err != nil { - return ep, ep, CREDS_OPTIONAL + return ep, ep, CredsOptional } if url.Scheme == "http" || url.Scheme == "https" { return url.Host, url.Host, schemeToCredsRequirement(url.Scheme) @@ -114,7 +114,7 @@ func translateEndpoint(ep string) (addr string, serverName string, requireCreds return ep, url.Host, schemeToCredsRequirement(url.Scheme) } // Handles plain addresses like 10.0.0.44:437. - return ep, ep, CREDS_OPTIONAL + return ep, ep, CredsOptional } // RequiresCredentials returns whether given endpoint requires diff --git a/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go b/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go index 3ee3cb8e2b..403b745cb7 100644 --- a/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go +++ b/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go @@ -15,10 +15,11 @@ package resolver import ( - "go.etcd.io/etcd/client/v3/internal/endpoint" "google.golang.org/grpc/resolver" "google.golang.org/grpc/resolver/manual" "google.golang.org/grpc/serviceconfig" + + "go.etcd.io/etcd/client/v3/internal/endpoint" ) const ( @@ -60,13 +61,15 @@ func (r *EtcdManualResolver) SetEndpoints(endpoints []string) { func (r EtcdManualResolver) updateState() { if r.CC != nil { - addresses := make([]resolver.Address, len(r.endpoints)) + eps := make([]resolver.Endpoint, len(r.endpoints)) for i, ep := range r.endpoints { addr, serverName := endpoint.Interpret(ep) - addresses[i] = resolver.Address{Addr: addr, ServerName: serverName} + eps[i] = resolver.Endpoint{Addresses: []resolver.Address{ + {Addr: addr, ServerName: serverName}, + }} } state := resolver.State{ - Addresses: addresses, + Endpoints: eps, ServiceConfig: r.serviceConfig, } r.UpdateState(state) diff --git a/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go b/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go index 19b82a6292..3ffecc86a5 100644 --- a/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go +++ b/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go @@ -36,8 +36,9 @@ type Interface interface { // If opts.Revision is non-zero, the key-value pairs are retrieved at the specified revision. // If the required revision has been compacted, the request will fail with ErrCompacted. // If opts.Limit is greater than zero, the number of returned key-value pairs is bounded by the limit. - // If opts.Continue is not empty, the listing will start from the key immediately after the one specified by Continue. - // The Continue value should be the last key returned in a previous paginated ListResponse. + // If opts.Continue is not empty, the listing will start from the key + // specified by it. When paginating, the Continue value should be set + // to the last observed key with "\x00" appended to it. List(ctx context.Context, prefix string, opts ListOptions) (ListResponse, error) // Count returns the number of keys with the specified prefix. @@ -74,8 +75,9 @@ type ListOptions struct { // 0 means no limitation. Limit int64 - // Continue is a key from which to resume the List operation, excluding the given key. - // It should be set to the last key from a previous ListResponse when paginating. + // Continue is a key from which to resume the List operation. + // It should be set to the last key from a previous ListResponse + // with "\x00" appended to it when paginating. Continue string } diff --git a/vendor/go.etcd.io/etcd/client/v3/kv.go b/vendor/go.etcd.io/etcd/client/v3/kv.go index be5b508dd6..8d0c595d1e 100644 --- a/vendor/go.etcd.io/etcd/client/v3/kv.go +++ b/vendor/go.etcd.io/etcd/client/v3/kv.go @@ -17,9 +17,10 @@ package clientv3 import ( "context" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "google.golang.org/grpc" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) type ( @@ -79,12 +80,15 @@ func (op OpResponse) Txn() *TxnResponse { return op.txn } func (resp *PutResponse) OpResponse() OpResponse { return OpResponse{put: resp} } + func (resp *GetResponse) OpResponse() OpResponse { return OpResponse{get: resp} } + func (resp *DeleteResponse) OpResponse() OpResponse { return OpResponse{del: resp} } + func (resp *TxnResponse) OpResponse() OpResponse { return OpResponse{txn: resp} } @@ -145,10 +149,14 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { var err error switch op.t { case tRange: - var resp *pb.RangeResponse - resp, err = kv.remote.Range(ctx, op.toRangeRequest(), kv.callOpts...) - if err == nil { - return OpResponse{get: (*GetResponse)(resp)}, nil + if op.IsSortOptionValid() { + var resp *pb.RangeResponse + resp, err = kv.remote.Range(ctx, op.toRangeRequest(), kv.callOpts...) + if err == nil { + return OpResponse{get: (*GetResponse)(resp)}, nil + } + } else { + err = rpctypes.ErrInvalidSortOption } case tPut: var resp *pb.PutResponse diff --git a/vendor/go.etcd.io/etcd/client/v3/lease.go b/vendor/go.etcd.io/etcd/client/v3/lease.go index 4877ee9496..11b5834828 100644 --- a/vendor/go.etcd.io/etcd/client/v3/lease.go +++ b/vendor/go.etcd.io/etcd/client/v3/lease.go @@ -16,15 +16,16 @@ package clientv3 import ( "context" + "errors" "sync" "time" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" - "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/metadata" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) type ( @@ -198,12 +199,12 @@ func NewLeaseFromLeaseClient(remote pb.LeaseClient, c *Client, keepAliveTimeout keepAlives: make(map[LeaseID]*keepAlive), remote: remote, firstKeepAliveTimeout: keepAliveTimeout, - lg: c.lg, } if l.firstKeepAliveTimeout == time.Second { l.firstKeepAliveTimeout = defaultTTL } if c != nil { + l.lg = c.lg l.callOpts = c.callOpts } reqLeaderCtx := WithRequireLeader(context.Background()) @@ -419,9 +420,9 @@ func (l *lessor) keepAliveOnce(ctx context.Context, id LeaseID) (karesp *LeaseKe } defer func() { - if err := stream.CloseSend(); err != nil { + if cerr := stream.CloseSend(); cerr != nil { if ferr == nil { - ferr = ContextError(ctx, err) + ferr = ContextError(ctx, cerr) } return } @@ -460,6 +461,9 @@ func (l *lessor) recvKeepAliveLoop() (gerr error) { for { stream, err := l.resetRecv() if err != nil { + l.lg.Warn("error occurred during lease keep alive loop", + zap.Error(err), + ) if canceledByCaller(l.stopCtx, err) { return err } @@ -471,7 +475,7 @@ func (l *lessor) recvKeepAliveLoop() (gerr error) { return err } - if ContextError(l.stopCtx, err) == rpctypes.ErrNoLeader { + if errors.Is(ContextError(l.stopCtx, err), rpctypes.ErrNoLeader) { l.closeRequireLeader() } break @@ -556,9 +560,12 @@ func (l *lessor) recvKeepAlive(resp *pb.LeaseKeepAliveResponse) { // deadlineLoop reaps any keep alive channels that have not received a response // within the lease TTL func (l *lessor) deadlineLoop() { + timer := time.NewTimer(time.Second) + defer timer.Stop() for { + timer.Reset(time.Second) select { - case <-time.After(time.Second): + case <-timer.C: case <-l.donec: return } @@ -592,7 +599,9 @@ func (l *lessor) sendKeepAliveLoop(stream pb.Lease_LeaseKeepAliveClient) { for _, id := range tosend { r := &pb.LeaseKeepAliveRequest{ID: int64(id)} if err := stream.Send(r); err != nil { - // TODO do something with this error? + l.lg.Warn("error occurred during lease keep alive request sending", + zap.Error(err), + ) return } } diff --git a/vendor/go.etcd.io/etcd/client/v3/logger.go b/vendor/go.etcd.io/etcd/client/v3/logger.go index eaa35f2d3a..300363cd25 100644 --- a/vendor/go.etcd.io/etcd/client/v3/logger.go +++ b/vendor/go.etcd.io/etcd/client/v3/logger.go @@ -18,10 +18,11 @@ import ( "log" "os" - "go.etcd.io/etcd/client/pkg/v3/logutil" "go.uber.org/zap/zapcore" "go.uber.org/zap/zapgrpc" "google.golang.org/grpc/grpclog" + + "go.etcd.io/etcd/client/pkg/v3/logutil" ) func init() { @@ -52,7 +53,7 @@ func etcdClientDebugLevel() zapcore.Level { } var l zapcore.Level if err := l.Set(envLevel); err != nil { - log.Printf("Invalid value for environment variable 'ETCD_CLIENT_DEBUG'. Using default level: 'info'") + log.Print("Invalid value for environment variable 'ETCD_CLIENT_DEBUG'. Using default level: 'info'") return zapcore.InfoLevel } return l diff --git a/vendor/go.etcd.io/etcd/client/v3/maintenance.go b/vendor/go.etcd.io/etcd/client/v3/maintenance.go index 71b28e6dc3..00aaacd15f 100644 --- a/vendor/go.etcd.io/etcd/client/v3/maintenance.go +++ b/vendor/go.etcd.io/etcd/client/v3/maintenance.go @@ -16,12 +16,14 @@ package clientv3 import ( "context" + "errors" "fmt" "io" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" "go.uber.org/zap" "google.golang.org/grpc" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" ) type ( @@ -31,6 +33,15 @@ type ( StatusResponse pb.StatusResponse HashKVResponse pb.HashKVResponse MoveLeaderResponse pb.MoveLeaderResponse + DowngradeResponse pb.DowngradeResponse + + DowngradeAction pb.DowngradeRequest_DowngradeAction +) + +const ( + DowngradeValidate = DowngradeAction(pb.DowngradeRequest_VALIDATE) + DowngradeEnable = DowngradeAction(pb.DowngradeRequest_ENABLE) + DowngradeCancel = DowngradeAction(pb.DowngradeRequest_CANCEL) ) type Maintenance interface { @@ -57,14 +68,40 @@ type Maintenance interface { // is non-zero, the hash is computed on all keys at or below the given revision. HashKV(ctx context.Context, endpoint string, rev int64) (*HashKVResponse, error) + // SnapshotWithVersion returns a reader for a point-in-time snapshot and version of etcd that created it. + // If the context "ctx" is canceled or timed out, reading from returned + // "io.ReadCloser" would error out (e.g. context.Canceled, context.DeadlineExceeded). + SnapshotWithVersion(ctx context.Context) (*SnapshotResponse, error) + // Snapshot provides a reader for a point-in-time snapshot of etcd. // If the context "ctx" is canceled or timed out, reading from returned // "io.ReadCloser" would error out (e.g. context.Canceled, context.DeadlineExceeded). + // Deprecated: use SnapshotWithVersion instead. Snapshot(ctx context.Context) (io.ReadCloser, error) // MoveLeader requests current leader to transfer its leadership to the transferee. // Request must be made to the leader. MoveLeader(ctx context.Context, transfereeID uint64) (*MoveLeaderResponse, error) + + // Downgrade requests downgrades, verifies feasibility or cancels downgrade + // on the cluster version. + // Supported since etcd 3.5. + Downgrade(ctx context.Context, action DowngradeAction, version string) (*DowngradeResponse, error) +} + +// SnapshotResponse is aggregated response from the snapshot stream. +// Consumer is responsible for closing steam by calling .Snapshot.Close() +type SnapshotResponse struct { + // Header is the first header in the snapshot stream, has the current key-value store information + // and indicates the point in time of the snapshot. + Header *pb.ResponseHeader + // Snapshot exposes ReaderCloser interface for data stored in the Blob field in the snapshot stream. + Snapshot io.ReadCloser + // Version is the local version of server that created the snapshot. + // In cluster with binaries with different version, each cluster can return different result. + // Informs which etcd server version should be used when restoring the snapshot. + // Supported on etcd >= v3.6. + Version string } type maintenance struct { @@ -80,22 +117,10 @@ func NewMaintenance(c *Client) Maintenance { dial: func(endpoint string) (pb.MaintenanceClient, func(), error) { conn, err := c.Dial(endpoint) if err != nil { - return nil, nil, fmt.Errorf("failed to dial endpoint %s with maintenance client: %v", endpoint, err) + return nil, nil, fmt.Errorf("failed to dial endpoint %s with maintenance client: %w", endpoint, err) } - //get token with established connection - dctx := c.ctx - cancel := func() {} - if c.cfg.DialTimeout > 0 { - dctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout) - } - err = c.getToken(dctx) - cancel() - if err != nil { - conn.Close() - return nil, nil, fmt.Errorf("failed to getToken from endpoint %s with maintenance client: %v", endpoint, err) - } - cancel = func() { conn.Close() } + cancel := func() { conn.Close() } return RetryMaintenanceClient(c, conn), cancel, nil }, remote: RetryMaintenanceClient(c, c.conn), @@ -108,7 +133,6 @@ func NewMaintenance(c *Client) Maintenance { func NewMaintenanceFromMaintenanceClient(remote pb.MaintenanceClient, c *Client) Maintenance { api := &maintenance{ - lg: c.lg, dial: func(string) (pb.MaintenanceClient, func(), error) { return remote, func() {}, nil }, @@ -116,6 +140,7 @@ func NewMaintenanceFromMaintenanceClient(remote pb.MaintenanceClient, c *Client) } if c != nil { api.callOpts = c.callOpts + api.lg = c.lg } return api } @@ -192,7 +217,6 @@ func (m *maintenance) Status(ctx context.Context, endpoint string) (*StatusRespo func (m *maintenance) HashKV(ctx context.Context, endpoint string, rev int64) (*HashKVResponse, error) { remote, cancel, err := m.dial(endpoint) if err != nil { - return nil, ContextError(ctx, err) } defer cancel() @@ -203,7 +227,7 @@ func (m *maintenance) HashKV(ctx context.Context, endpoint string, rev int64) (* return (*HashKVResponse)(resp), nil } -func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { +func (m *maintenance) SnapshotWithVersion(ctx context.Context) (*SnapshotResponse, error) { ss, err := m.remote.Snapshot(ctx, &pb.SnapshotRequest{}, append(m.callOpts, withMax(defaultStreamMaxRetries))...) if err != nil { return nil, ContextError(ctx, err) @@ -211,27 +235,60 @@ func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { m.lg.Info("opened snapshot stream; downloading") pr, pw := io.Pipe() + + resp, err := ss.Recv() + if err != nil { + m.logAndCloseWithError(err, pw) + return nil, err + } go func() { + // Saving response is blocking + err := m.save(resp, pw) + if err != nil { + m.logAndCloseWithError(err, pw) + return + } for { - resp, err := ss.Recv() + sresp, err := ss.Recv() if err != nil { - switch err { - case io.EOF: - m.lg.Info("completed snapshot read; closing") - default: - m.lg.Warn("failed to receive from snapshot stream; closing", zap.Error(err)) - } - pw.CloseWithError(err) + m.logAndCloseWithError(err, pw) return } - // can "resp == nil && err == nil" - // before we receive snapshot SHA digest? - // No, server sends EOF with an empty response - // after it sends SHA digest at the end + err = m.save(sresp, pw) + if err != nil { + m.logAndCloseWithError(err, pw) + return + } + } + }() - if _, werr := pw.Write(resp.Blob); werr != nil { - pw.CloseWithError(werr) + return &SnapshotResponse{ + Header: resp.GetHeader(), + Snapshot: &snapshotReadCloser{ctx: ctx, ReadCloser: pr}, + Version: resp.GetVersion(), + }, nil +} + +func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { + ss, err := m.remote.Snapshot(ctx, &pb.SnapshotRequest{}, append(m.callOpts, withMax(defaultStreamMaxRetries))...) + if err != nil { + return nil, ContextError(ctx, err) + } + + m.lg.Info("opened snapshot stream; downloading") + pr, pw := io.Pipe() + + go func() { + for { + resp, err := ss.Recv() + if err != nil { + m.logAndCloseWithError(err, pw) + return + } + err = m.save(resp, pw) + if err != nil { + m.logAndCloseWithError(err, pw) return } } @@ -239,6 +296,28 @@ func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { return &snapshotReadCloser{ctx: ctx, ReadCloser: pr}, nil } +func (m *maintenance) logAndCloseWithError(err error, pw *io.PipeWriter) { + switch { + case errors.Is(err, io.EOF): + m.lg.Info("completed snapshot read; closing") + default: + m.lg.Warn("failed to receive from snapshot stream; closing", zap.Error(err)) + } + pw.CloseWithError(err) +} + +func (m *maintenance) save(resp *pb.SnapshotResponse, pw *io.PipeWriter) error { + // can "resp == nil && err == nil" + // before we receive snapshot SHA digest? + // No, server sends EOF with an empty response + // after it sends SHA digest at the end + + if _, werr := pw.Write(resp.Blob); werr != nil { + return werr + } + return nil +} + type snapshotReadCloser struct { ctx context.Context io.ReadCloser @@ -253,3 +332,19 @@ func (m *maintenance) MoveLeader(ctx context.Context, transfereeID uint64) (*Mov resp, err := m.remote.MoveLeader(ctx, &pb.MoveLeaderRequest{TargetID: transfereeID}, m.callOpts...) return (*MoveLeaderResponse)(resp), ContextError(ctx, err) } + +func (m *maintenance) Downgrade(ctx context.Context, action DowngradeAction, version string) (*DowngradeResponse, error) { + var actionType pb.DowngradeRequest_DowngradeAction + switch action { + case DowngradeValidate: + actionType = pb.DowngradeRequest_VALIDATE + case DowngradeEnable: + actionType = pb.DowngradeRequest_ENABLE + case DowngradeCancel: + actionType = pb.DowngradeRequest_CANCEL + default: + return nil, errors.New("etcdclient: unknown downgrade action") + } + resp, err := m.remote.Downgrade(ctx, &pb.DowngradeRequest{Action: actionType, Version: version}, m.callOpts...) + return (*DowngradeResponse)(resp), ContextError(ctx, err) +} diff --git a/vendor/go.etcd.io/etcd/client/v3/op.go b/vendor/go.etcd.io/etcd/client/v3/op.go index 5251906322..20cb34f5c3 100644 --- a/vendor/go.etcd.io/etcd/client/v3/op.go +++ b/vendor/go.etcd.io/etcd/client/v3/op.go @@ -106,6 +106,9 @@ func (op Op) RangeBytes() []byte { return op.end } // Rev returns the requested revision, if any. func (op Op) Rev() int64 { return op.rev } +// Limit returns limit of the result, if any. +func (op Op) Limit() int64 { return op.limit } + // IsPut returns true iff the operation is a Put. func (op Op) IsPut() bool { return op.t == tPut } @@ -124,6 +127,10 @@ func (op Op) IsKeysOnly() bool { return op.keysOnly } // IsCountOnly returns whether countOnly is set. func (op Op) IsCountOnly() bool { return op.countOnly } +func (op Op) IsOptsWithFromKey() bool { return op.isOptsWithFromKey } + +func (op Op) IsOptsWithPrefix() bool { return op.isOptsWithPrefix } + // MinModRev returns the operation's minimum modify revision. func (op Op) MinModRev() int64 { return op.minModRev } @@ -418,9 +425,15 @@ func WithFromKey() OpOption { } } -// WithSerializable makes 'Get' request serializable. By default, -// it's linearizable. Serializable requests are better for lower latency -// requirement. +// WithSerializable makes `Get` and `MemberList` requests serializable. +// By default, they are linearizable. Serializable requests are better +// for lower latency requirement, but users should be aware that they +// could get stale data with serializable requests. +// +// In some situations users may want to use serializable requests. For +// example, when adding a new member to a one-node cluster, it's reasonable +// and safe to use serializable request before the new added member gets +// started. func WithSerializable() OpOption { return func(op *Op) { op.serializable = true } } @@ -581,3 +594,19 @@ func IsOptsWithFromKey(opts []OpOption) bool { return ret.isOptsWithFromKey } + +func (op Op) IsSortOptionValid() bool { + if op.sort != nil { + sortOrder := int32(op.sort.Order) + sortTarget := int32(op.sort.Target) + + if _, ok := pb.RangeRequest_SortOrder_name[sortOrder]; !ok { + return false + } + + if _, ok := pb.RangeRequest_SortTarget_name[sortTarget]; !ok { + return false + } + } + return true +} diff --git a/vendor/go.etcd.io/etcd/client/v3/options.go b/vendor/go.etcd.io/etcd/client/v3/options.go index cdae1b16a2..cc10a03d76 100644 --- a/vendor/go.etcd.io/etcd/client/v3/options.go +++ b/vendor/go.etcd.io/etcd/client/v3/options.go @@ -23,7 +23,7 @@ import ( var ( // client-side handling retrying of request failures where data was not written to the wire or - // where server indicates it did not process the data. gRPC default is default is "WaitForReady(false)" + // where server indicates it did not process the data. gRPC default is "WaitForReady(false)" // but for etcd we default to "WaitForReady(true)" to minimize client request error responses due to // transient failures. defaultWaitForReady = grpc.WaitForReady(true) diff --git a/vendor/go.etcd.io/etcd/client/v3/retry.go b/vendor/go.etcd.io/etcd/client/v3/retry.go index 69ecc63147..9152c53a7d 100644 --- a/vendor/go.etcd.io/etcd/client/v3/retry.go +++ b/vendor/go.etcd.io/etcd/client/v3/retry.go @@ -16,13 +16,14 @@ package clientv3 import ( "context" - - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" + "errors" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) type retryPolicy uint8 @@ -52,7 +53,8 @@ func (rp retryPolicy) String() string { // handle itself even with retries. func isSafeRetryImmutableRPC(err error) bool { eErr := rpctypes.Error(err) - if serverErr, ok := eErr.(rpctypes.EtcdError); ok && serverErr.Code() != codes.Unavailable { + var serverErr rpctypes.EtcdError + if errors.As(eErr, &serverErr) && serverErr.Code() != codes.Unavailable { // interrupted by non-transient server-side or gRPC-side error // client cannot handle itself (e.g. rpctypes.ErrCompacted) return false @@ -101,8 +103,9 @@ func RetryKVClient(c *Client) pb.KVClient { kc: pb.NewKVClient(c.conn), } } + func (rkv *retryKVClient) Range(ctx context.Context, in *pb.RangeRequest, opts ...grpc.CallOption) (resp *pb.RangeResponse, err error) { - return rkv.kc.Range(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rkv.kc.Range(ctx, in, append(opts, withRepeatablePolicy())...) } func (rkv *retryKVClient) Put(ctx context.Context, in *pb.PutRequest, opts ...grpc.CallOption) (resp *pb.PutResponse, err error) { @@ -133,23 +136,23 @@ func RetryLeaseClient(c *Client) pb.LeaseClient { } func (rlc *retryLeaseClient) LeaseTimeToLive(ctx context.Context, in *pb.LeaseTimeToLiveRequest, opts ...grpc.CallOption) (resp *pb.LeaseTimeToLiveResponse, err error) { - return rlc.lc.LeaseTimeToLive(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseTimeToLive(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseLeases(ctx context.Context, in *pb.LeaseLeasesRequest, opts ...grpc.CallOption) (resp *pb.LeaseLeasesResponse, err error) { - return rlc.lc.LeaseLeases(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseLeases(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseGrant(ctx context.Context, in *pb.LeaseGrantRequest, opts ...grpc.CallOption) (resp *pb.LeaseGrantResponse, err error) { - return rlc.lc.LeaseGrant(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseGrant(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseRevoke(ctx context.Context, in *pb.LeaseRevokeRequest, opts ...grpc.CallOption) (resp *pb.LeaseRevokeResponse, err error) { - return rlc.lc.LeaseRevoke(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseRevoke(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseKeepAlive(ctx context.Context, opts ...grpc.CallOption) (stream pb.Lease_LeaseKeepAliveClient, err error) { - return rlc.lc.LeaseKeepAlive(ctx, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseKeepAlive(ctx, append(opts, withRepeatablePolicy())...) } type retryClusterClient struct { @@ -164,7 +167,7 @@ func RetryClusterClient(c *Client) pb.ClusterClient { } func (rcc *retryClusterClient) MemberList(ctx context.Context, in *pb.MemberListRequest, opts ...grpc.CallOption) (resp *pb.MemberListResponse, err error) { - return rcc.cc.MemberList(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rcc.cc.MemberList(ctx, in, append(opts, withRepeatablePolicy())...) } func (rcc *retryClusterClient) MemberAdd(ctx context.Context, in *pb.MemberAddRequest, opts ...grpc.CallOption) (resp *pb.MemberAddResponse, err error) { @@ -195,27 +198,27 @@ func RetryMaintenanceClient(c *Client, conn *grpc.ClientConn) pb.MaintenanceClie } func (rmc *retryMaintenanceClient) Alarm(ctx context.Context, in *pb.AlarmRequest, opts ...grpc.CallOption) (resp *pb.AlarmResponse, err error) { - return rmc.mc.Alarm(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Alarm(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Status(ctx context.Context, in *pb.StatusRequest, opts ...grpc.CallOption) (resp *pb.StatusResponse, err error) { - return rmc.mc.Status(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Status(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Hash(ctx context.Context, in *pb.HashRequest, opts ...grpc.CallOption) (resp *pb.HashResponse, err error) { - return rmc.mc.Hash(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Hash(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) HashKV(ctx context.Context, in *pb.HashKVRequest, opts ...grpc.CallOption) (resp *pb.HashKVResponse, err error) { - return rmc.mc.HashKV(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.HashKV(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Snapshot(ctx context.Context, in *pb.SnapshotRequest, opts ...grpc.CallOption) (stream pb.Maintenance_SnapshotClient, err error) { - return rmc.mc.Snapshot(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Snapshot(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) MoveLeader(ctx context.Context, in *pb.MoveLeaderRequest, opts ...grpc.CallOption) (resp *pb.MoveLeaderResponse, err error) { - return rmc.mc.MoveLeader(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.MoveLeader(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Defragment(ctx context.Context, in *pb.DefragmentRequest, opts ...grpc.CallOption) (resp *pb.DefragmentResponse, err error) { @@ -238,19 +241,19 @@ func RetryAuthClient(c *Client) pb.AuthClient { } func (rac *retryAuthClient) UserList(ctx context.Context, in *pb.AuthUserListRequest, opts ...grpc.CallOption) (resp *pb.AuthUserListResponse, err error) { - return rac.ac.UserList(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.UserList(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) UserGet(ctx context.Context, in *pb.AuthUserGetRequest, opts ...grpc.CallOption) (resp *pb.AuthUserGetResponse, err error) { - return rac.ac.UserGet(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.UserGet(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) RoleGet(ctx context.Context, in *pb.AuthRoleGetRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleGetResponse, err error) { - return rac.ac.RoleGet(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.RoleGet(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) RoleList(ctx context.Context, in *pb.AuthRoleListRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleListResponse, err error) { - return rac.ac.RoleList(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.RoleList(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) AuthEnable(ctx context.Context, in *pb.AuthEnableRequest, opts ...grpc.CallOption) (resp *pb.AuthEnableResponse, err error) { diff --git a/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go b/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go index 8c50dcfa93..2b9301a580 100644 --- a/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go +++ b/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go @@ -24,12 +24,13 @@ import ( "sync" "time" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) // unaryClientInterceptor returns a new retrying unary client interceptor. @@ -38,7 +39,7 @@ import ( // changed through options (e.g. WithMax) on creation of the interceptor or on call (through grpc.CallOptions). func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClientInterceptor { intOpts := reuseOrNewWithCallOptions(defaultOptions, optFuncs) - return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + return func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { ctx = withVersion(ctx) grpcOpts, retryOpts := filterCallOptions(opts) callOpts := reuseOrNewWithCallOptions(intOpts, retryOpts) @@ -54,6 +55,7 @@ func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClien c.GetLogger().Debug( "retrying of unary invoker", zap.String("target", cc.Target()), + zap.String("method", method), zap.Uint("attempt", attempt), ) lastErr = invoker(ctx, method, req, reply, cc, grpcOpts...) @@ -63,6 +65,7 @@ func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClien c.GetLogger().Warn( "retrying of unary invoker failed", zap.String("target", cc.Target()), + zap.String("method", method), zap.Uint("attempt", attempt), zap.Error(lastErr), ) @@ -75,14 +78,14 @@ func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClien continue } if c.shouldRefreshToken(lastErr, callOpts) { - gterr := c.refreshToken(ctx) - if gterr != nil { + gtErr := c.refreshToken(ctx) + if gtErr != nil { c.GetLogger().Warn( "retrying of unary invoker failed to fetch new auth token", zap.String("target", cc.Target()), - zap.Error(gterr), + zap.Error(gtErr), ) - return gterr // lastErr must be invalid auth token + return gtErr // lastErr must be invalid auth token } continue } @@ -106,15 +109,12 @@ func (c *Client) streamClientInterceptor(optFuncs ...retryOption) grpc.StreamCli intOpts := reuseOrNewWithCallOptions(defaultOptions, optFuncs) return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { ctx = withVersion(ctx) - // getToken automatically - // TODO(cfc4n): keep this code block, remove codes about getToken in client.go after pr #12165 merged. - if c.authTokenBundle != nil { - // equal to c.Username != "" && c.Password != "" - err := c.getToken(ctx) - if err != nil && rpctypes.Error(err) != rpctypes.ErrAuthNotEnabled { - c.GetLogger().Error("clientv3/retry_interceptor: getToken failed", zap.Error(err)) - return nil, err - } + // getToken automatically. Otherwise, auth token may be invalid after watch reconnection because the token has expired + // (see https://github.com/etcd-io/etcd/issues/11954 for more). + err := c.getToken(ctx) + if err != nil { + c.GetLogger().Error("clientv3/retry_interceptor: getToken failed", zap.Error(err)) + return nil, err } grpcOpts, retryOpts := filterCallOptions(opts) callOpts := reuseOrNewWithCallOptions(intOpts, retryOpts) @@ -146,14 +146,14 @@ func (c *Client) streamClientInterceptor(optFuncs ...retryOption) grpc.StreamCli // shouldRefreshToken checks whether there's a need to refresh the token based on the error and callOptions, // and returns a boolean value. func (c *Client) shouldRefreshToken(err error, callOpts *options) bool { - if rpctypes.Error(err) == rpctypes.ErrUserEmpty { + if errors.Is(rpctypes.Error(err), rpctypes.ErrUserEmpty) { // refresh the token when username, password is present but the server returns ErrUserEmpty // which is possible when the client token is cleared somehow return c.authTokenBundle != nil // equal to c.Username != "" && c.Password != "" } return callOpts.retryAuth && - (rpctypes.Error(err) == rpctypes.ErrInvalidAuthToken || rpctypes.Error(err) == rpctypes.ErrAuthOldRevision) + (errors.Is(rpctypes.Error(err), rpctypes.ErrInvalidAuthToken) || errors.Is(rpctypes.Error(err), rpctypes.ErrAuthOldRevision)) } func (c *Client) refreshToken(ctx context.Context) error { @@ -169,8 +169,7 @@ func (c *Client) refreshToken(ctx context.Context) error { // clients just need to retry the operations (e.g. Put, Delete etc). return nil } - // clear auth token before refreshing it. - c.authTokenBundle.UpdateAuthToken("") + return c.getToken(ctx) } @@ -180,9 +179,9 @@ func (c *Client) refreshToken(ctx context.Context) error { type serverStreamingRetryingStream struct { grpc.ClientStream client *Client - bufferedSends []interface{} // single message that the client can sen - receivedGood bool // indicates whether any prior receives were successful - wasClosedSend bool // indicates that CloseSend was closed + bufferedSends []any // single message that the client can sen + receivedGood bool // indicates whether any prior receives were successful + wasClosedSend bool // indicates that CloseSend was closed ctx context.Context callOpts *options streamerCall func(ctx context.Context) (grpc.ClientStream, error) @@ -201,7 +200,7 @@ func (s *serverStreamingRetryingStream) getStream() grpc.ClientStream { return s.ClientStream } -func (s *serverStreamingRetryingStream) SendMsg(m interface{}) error { +func (s *serverStreamingRetryingStream) SendMsg(m any) error { s.mu.Lock() s.bufferedSends = append(s.bufferedSends, m) s.mu.Unlock() @@ -223,7 +222,7 @@ func (s *serverStreamingRetryingStream) Trailer() metadata.MD { return s.getStream().Trailer() } -func (s *serverStreamingRetryingStream) RecvMsg(m interface{}) error { +func (s *serverStreamingRetryingStream) RecvMsg(m any) error { attemptRetry, lastErr := s.receiveMsgAndIndicateRetry(m) if !attemptRetry { return lastErr // success or hard failure @@ -250,12 +249,12 @@ func (s *serverStreamingRetryingStream) RecvMsg(m interface{}) error { return lastErr } -func (s *serverStreamingRetryingStream) receiveMsgAndIndicateRetry(m interface{}) (bool, error) { +func (s *serverStreamingRetryingStream) receiveMsgAndIndicateRetry(m any) (bool, error) { s.mu.RLock() wasGood := s.receivedGood s.mu.RUnlock() err := s.getStream().RecvMsg(m) - if err == nil || err == io.EOF { + if err == nil || errors.Is(err, io.EOF) { s.mu.Lock() s.receivedGood = true s.mu.Unlock() @@ -272,13 +271,12 @@ func (s *serverStreamingRetryingStream) receiveMsgAndIndicateRetry(m interface{} return true, err } if s.client.shouldRefreshToken(err, s.callOpts) { - gterr := s.client.refreshToken(s.ctx) - if gterr != nil { - s.client.lg.Warn("retry failed to fetch new auth token", zap.Error(gterr)) + gtErr := s.client.refreshToken(s.ctx) + if gtErr != nil { + s.client.lg.Warn("retry failed to fetch new auth token", zap.Error(gtErr)) return false, err // return the original error for simplicity } return true, err - } return isSafeRetry(s.client, err, s.callOpts), err } @@ -312,7 +310,7 @@ func waitRetryBackoff(ctx context.Context, attempt uint, callOpts *options) erro select { case <-ctx.Done(): timer.Stop() - return contextErrToGrpcErr(ctx.Err()) + return contextErrToGRPCErr(ctx.Err()) case <-timer.C: } } @@ -331,7 +329,7 @@ func isSafeRetry(c *Client, err error, callOpts *options) bool { // customer provides mix of learners (not yet voters) and voters with an // expectation to pick voter in the next attempt. // TODO: Ideally client should be 'aware' which endpoint represents: leader/voter/learner with high probability. - if errors.Is(err, rpctypes.ErrGPRCNotSupportedForLearner) && len(c.Endpoints()) > 1 { + if errors.Is(err, rpctypes.ErrGRPCNotSupportedForLearner) && len(c.Endpoints()) > 1 { return true } @@ -350,25 +348,23 @@ func isContextError(err error) bool { return status.Code(err) == codes.DeadlineExceeded || status.Code(err) == codes.Canceled } -func contextErrToGrpcErr(err error) error { - switch err { - case context.DeadlineExceeded: +func contextErrToGRPCErr(err error) error { + switch { + case errors.Is(err, context.DeadlineExceeded): return status.Errorf(codes.DeadlineExceeded, err.Error()) - case context.Canceled: + case errors.Is(err, context.Canceled): return status.Errorf(codes.Canceled, err.Error()) default: return status.Errorf(codes.Unknown, err.Error()) } } -var ( - defaultOptions = &options{ - retryPolicy: nonRepeatable, - max: 0, // disable - backoffFunc: backoffLinearWithJitter(50*time.Millisecond /*jitter*/, 0.10), - retryAuth: true, - } -) +var defaultOptions = &options{ + retryPolicy: nonRepeatable, + max: 0, // disable + backoffFunc: backoffLinearWithJitter(50*time.Millisecond /*jitter*/, 0.10), + retryAuth: true, +} // backoffFunc denotes a family of functions that control the backoff duration between call retries. // @@ -378,10 +374,10 @@ var ( // with the next iteration. type backoffFunc func(attempt uint) time.Duration -// withRetryPolicy sets the retry policy of this call. -func withRetryPolicy(rp retryPolicy) retryOption { +// withRepeatablePolicy sets the repeatable policy of this call. +func withRepeatablePolicy() retryOption { return retryOption{applyFunc: func(o *options) { - o.retryPolicy = rp + o.retryPolicy = repeatable }} } @@ -392,7 +388,7 @@ func withMax(maxRetries uint) retryOption { }} } -// WithBackoff sets the `BackoffFunc `used to control time between retries. +// WithBackoff sets the `BackoffFunc` used to control time between retries. func withBackoff(bf backoffFunc) retryOption { return retryOption{applyFunc: func(o *options) { o.backoffFunc = bf diff --git a/vendor/go.etcd.io/etcd/client/v3/sort.go b/vendor/go.etcd.io/etcd/client/v3/sort.go index 2bb9d9a13b..9918ea927f 100644 --- a/vendor/go.etcd.io/etcd/client/v3/sort.go +++ b/vendor/go.etcd.io/etcd/client/v3/sort.go @@ -14,8 +14,10 @@ package clientv3 -type SortTarget int -type SortOrder int +type ( + SortTarget int + SortOrder int +) const ( SortNone SortOrder = iota diff --git a/vendor/go.etcd.io/etcd/client/v3/txn.go b/vendor/go.etcd.io/etcd/client/v3/txn.go index e31bfe0b94..0a57332ac7 100644 --- a/vendor/go.etcd.io/etcd/client/v3/txn.go +++ b/vendor/go.etcd.io/etcd/client/v3/txn.go @@ -18,9 +18,9 @@ import ( "context" "sync" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "google.golang.org/grpc" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" ) // Txn is the interface that wraps mini-transactions. diff --git a/vendor/go.etcd.io/etcd/client/v3/watch.go b/vendor/go.etcd.io/etcd/client/v3/watch.go index 725e8a869e..a46f98b8e2 100644 --- a/vendor/go.etcd.io/etcd/client/v3/watch.go +++ b/vendor/go.etcd.io/etcd/client/v3/watch.go @@ -21,15 +21,15 @@ import ( "sync" "time" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "go.etcd.io/etcd/api/v3/mvccpb" - v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" - "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/mvccpb" + v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) const ( @@ -149,12 +149,12 @@ type watcher struct { mu sync.Mutex // streams holds all the active grpc streams keyed by ctx value. - streams map[string]*watchGrpcStream + streams map[string]*watchGRPCStream lg *zap.Logger } -// watchGrpcStream tracks all watch resources attached to a single grpc stream. -type watchGrpcStream struct { +// watchGRPCStream tracks all watch resources attached to a single grpc stream. +type watchGRPCStream struct { owner *watcher remote pb.WatchClient callOpts []grpc.CallOption @@ -221,8 +221,7 @@ type watchRequest struct { } // progressRequest is issued by the subscriber to request watch progress -type progressRequest struct { -} +type progressRequest struct{} // watcherStream represents a registered watcher type watcherStream struct { @@ -251,7 +250,7 @@ func NewWatcher(c *Client) Watcher { func NewWatchFromWatchClient(wc pb.WatchClient, c *Client) Watcher { w := &watcher{ remote: wc, - streams: make(map[string]*watchGrpcStream), + streams: make(map[string]*watchGRPCStream), } if c != nil { w.callOpts = c.callOpts @@ -261,8 +260,10 @@ func NewWatchFromWatchClient(wc pb.WatchClient, c *Client) Watcher { } // never closes -var valCtxCh = make(chan struct{}) -var zeroTime = time.Unix(0, 0) +var ( + valCtxCh = make(chan struct{}) + zeroTime = time.Unix(0, 0) +) // ctx with only the values; never Done type valCtx struct{ context.Context } @@ -271,9 +272,9 @@ func (vc *valCtx) Deadline() (time.Time, bool) { return zeroTime, false } func (vc *valCtx) Done() <-chan struct{} { return valCtxCh } func (vc *valCtx) Err() error { return nil } -func (w *watcher) newWatcherGrpcStream(inctx context.Context) *watchGrpcStream { +func (w *watcher) newWatcherGRPCStream(inctx context.Context) *watchGRPCStream { ctx, cancel := context.WithCancel(&valCtx{inctx}) - wgs := &watchGrpcStream{ + wgs := &watchGRPCStream{ owner: w, remote: w.remote, callOpts: w.callOpts, @@ -334,7 +335,7 @@ func (w *watcher) Watch(ctx context.Context, key string, opts ...OpOption) Watch } wgs := w.streams[ctxKey] if wgs == nil { - wgs = w.newWatcherGrpcStream(ctx) + wgs = w.newWatcherGRPCStream(ctx) w.streams[ctxKey] = wgs } donec := wgs.donec @@ -395,7 +396,7 @@ func (w *watcher) Close() (err error) { } } // Consider context.Canceled as a successful close - if err == context.Canceled { + if errors.Is(err, context.Canceled) { err = nil } return err @@ -408,11 +409,11 @@ func (w *watcher) RequestProgress(ctx context.Context) (err error) { w.mu.Lock() if w.streams == nil { w.mu.Unlock() - return fmt.Errorf("no stream found for context") + return errors.New("no stream found for context") } wgs := w.streams[ctxKey] if wgs == nil { - wgs = w.newWatcherGrpcStream(ctx) + wgs = w.newWatcherGRPCStream(ctx) w.streams[ctxKey] = wgs } donec := wgs.donec @@ -435,7 +436,7 @@ func (w *watcher) RequestProgress(ctx context.Context) (err error) { } } -func (w *watchGrpcStream) close() (err error) { +func (w *watchGRPCStream) close() (err error) { w.cancel() <-w.donec select { @@ -445,7 +446,7 @@ func (w *watchGrpcStream) close() (err error) { return ContextError(w.ctx, err) } -func (w *watcher) closeStream(wgs *watchGrpcStream) { +func (w *watcher) closeStream(wgs *watchGRPCStream) { w.mu.Lock() close(wgs.donec) wgs.cancel() @@ -455,7 +456,7 @@ func (w *watcher) closeStream(wgs *watchGrpcStream) { w.mu.Unlock() } -func (w *watchGrpcStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream) { +func (w *watchGRPCStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream) { // check watch ID for backward compatibility (<= v3.3) if resp.WatchId == InvalidWatchID || (resp.Canceled && resp.CancelReason != "") { w.closeErr = v3rpc.Error(errors.New(resp.CancelReason)) @@ -467,7 +468,7 @@ func (w *watchGrpcStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream w.substreams[ws.id] = ws } -func (w *watchGrpcStream) sendCloseSubstream(ws *watcherStream, resp *WatchResponse) { +func (w *watchGRPCStream) sendCloseSubstream(ws *watcherStream, resp *WatchResponse) { select { case ws.outc <- *resp: case <-ws.initReq.ctx.Done(): @@ -476,7 +477,7 @@ func (w *watchGrpcStream) sendCloseSubstream(ws *watcherStream, resp *WatchRespo close(ws.outc) } -func (w *watchGrpcStream) closeSubstream(ws *watcherStream) { +func (w *watchGRPCStream) closeSubstream(ws *watcherStream) { // send channel response in case stream was never established select { case ws.initReq.retc <- ws.outc: @@ -501,7 +502,7 @@ func (w *watchGrpcStream) closeSubstream(ws *watcherStream) { } // run is the root of the goroutines for managing a watcher client -func (w *watchGrpcStream) run() { +func (w *watchGRPCStream) run() { var wc pb.Watch_WatchClient var closeErr error @@ -653,7 +654,7 @@ func (w *watchGrpcStream) run() { // watch client failed on Recv; spawn another if possible case err := <-w.errc: - if isHaltErr(w.ctx, err) || ContextError(w.ctx, err) == v3rpc.ErrNoLeader { + if isHaltErr(w.ctx, err) || errors.Is(ContextError(w.ctx, err), v3rpc.ErrNoLeader) { closeErr = err return } @@ -699,7 +700,7 @@ func (w *watchGrpcStream) run() { // nextResume chooses the next resuming to register with the grpc stream. Abandoned // streams are marked as nil in the queue since the head must wait for its inflight registration. -func (w *watchGrpcStream) nextResume() *watcherStream { +func (w *watchGRPCStream) nextResume() *watcherStream { for len(w.resuming) != 0 { if w.resuming[0] != nil { return w.resuming[0] @@ -710,7 +711,7 @@ func (w *watchGrpcStream) nextResume() *watcherStream { } // dispatchEvent sends a WatchResponse to the appropriate watcher stream -func (w *watchGrpcStream) dispatchEvent(pbresp *pb.WatchResponse) bool { +func (w *watchGRPCStream) dispatchEvent(pbresp *pb.WatchResponse) bool { events := make([]*Event, len(pbresp.Events)) for i, ev := range pbresp.Events { events[i] = (*Event)(ev) @@ -732,11 +733,10 @@ func (w *watchGrpcStream) dispatchEvent(pbresp *pb.WatchResponse) bool { } return w.unicastResponse(wr, pbresp.WatchId) - } // broadcastResponse send a watch response to all watch substreams. -func (w *watchGrpcStream) broadcastResponse(wr *WatchResponse) bool { +func (w *watchGRPCStream) broadcastResponse(wr *WatchResponse) bool { for _, ws := range w.substreams { select { case ws.recvc <- wr: @@ -747,8 +747,8 @@ func (w *watchGrpcStream) broadcastResponse(wr *WatchResponse) bool { } // unicastResponse sends a watch response to a specific watch substream. -func (w *watchGrpcStream) unicastResponse(wr *WatchResponse, watchId int64) bool { - ws, ok := w.substreams[watchId] +func (w *watchGRPCStream) unicastResponse(wr *WatchResponse, watchID int64) bool { + ws, ok := w.substreams[watchID] if !ok { return false } @@ -761,7 +761,7 @@ func (w *watchGrpcStream) unicastResponse(wr *WatchResponse, watchId int64) bool } // serveWatchClient forwards messages from the grpc stream to run() -func (w *watchGrpcStream) serveWatchClient(wc pb.Watch_WatchClient) { +func (w *watchGRPCStream) serveWatchClient(wc pb.Watch_WatchClient) { for { resp, err := wc.Recv() if err != nil { @@ -780,7 +780,7 @@ func (w *watchGrpcStream) serveWatchClient(wc pb.Watch_WatchClient) { } // serveSubstream forwards watch responses from run() to the subscriber -func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{}) { +func (w *watchGRPCStream) serveSubstream(ws *watcherStream, resumec chan struct{}) { if ws.closing { panic("created substream goroutine but substream is closing") } @@ -854,6 +854,7 @@ func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{ if len(wr.Events) > 0 { nextRev = wr.Events[len(wr.Events)-1].Kv.ModRevision + 1 } + ws.initReq.rev = nextRev // created event is already sent above, @@ -876,7 +877,7 @@ func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{ // lazily send cancel message if events on missing id } -func (w *watchGrpcStream) newWatchClient() (pb.Watch_WatchClient, error) { +func (w *watchGRPCStream) newWatchClient() (pb.Watch_WatchClient, error) { // mark all substreams as resuming close(w.resumec) w.resumec = make(chan struct{}) @@ -922,7 +923,7 @@ func (w *watchGrpcStream) newWatchClient() (pb.Watch_WatchClient, error) { return wc, nil } -func (w *watchGrpcStream) waitCancelSubstreams(stopc <-chan struct{}) <-chan struct{} { +func (w *watchGRPCStream) waitCancelSubstreams(stopc <-chan struct{}) <-chan struct{} { var wg sync.WaitGroup wg.Add(len(w.resuming)) donec := make(chan struct{}) @@ -959,7 +960,7 @@ func (w *watchGrpcStream) waitCancelSubstreams(stopc <-chan struct{}) <-chan str } // joinSubstreams waits for all substream goroutines to complete. -func (w *watchGrpcStream) joinSubstreams() { +func (w *watchGRPCStream) joinSubstreams() { for _, ws := range w.substreams { <-ws.donec } @@ -972,7 +973,7 @@ func (w *watchGrpcStream) joinSubstreams() { var maxBackoff = 100 * time.Millisecond -func (w *watchGrpcStream) backoffIfUnavailable(backoff time.Duration, err error) time.Duration { +func (w *watchGRPCStream) backoffIfUnavailable(backoff time.Duration, err error) time.Duration { if isUnavailableErr(w.ctx, err) { // retry, but backoff if backoff < maxBackoff { @@ -990,7 +991,7 @@ func (w *watchGrpcStream) backoffIfUnavailable(backoff time.Duration, err error) // openWatchClient retries opening a watch client until success or halt. // manually retry in case "ws==nil && err==nil" // TODO: remove FailFast=false -func (w *watchGrpcStream) openWatchClient() (ws pb.Watch_WatchClient, err error) { +func (w *watchGRPCStream) openWatchClient() (ws pb.Watch_WatchClient, err error) { backoff := time.Millisecond for { select { diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/config.go b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/config.go index 9e87fb4bb1..296407f38e 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/config.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/config.go @@ -9,18 +9,12 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/propagation" - semconv "go.opentelemetry.io/otel/semconv/v1.17.0" "go.opentelemetry.io/otel/trace" ) -const ( - // ScopeName is the instrumentation scope name. - ScopeName = "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" - // GRPCStatusCodeKey is convention for numeric status code of a gRPC request. - GRPCStatusCodeKey = attribute.Key("rpc.grpc.status_code") -) +// ScopeName is the instrumentation scope name. +const ScopeName = "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" // InterceptorFilter is a predicate used to determine whether a given request in // interceptor info should be instrumented. A InterceptorFilter must return true if @@ -47,15 +41,6 @@ type config struct { ReceivedEvent bool SentEvent bool - - tracer trace.Tracer - meter metric.Meter - - rpcDuration metric.Float64Histogram - rpcInBytes metric.Int64Histogram - rpcOutBytes metric.Int64Histogram - rpcInMessages metric.Int64Histogram - rpcOutMessages metric.Int64Histogram } // Option applies an option value for a config. @@ -64,7 +49,7 @@ type Option interface { } // newConfig returns a config configured with all the passed Options. -func newConfig(opts []Option, role string) *config { +func newConfig(opts []Option) *config { c := &config{ Propagators: otel.GetTextMapPropagator(), TracerProvider: otel.GetTracerProvider(), @@ -73,87 +58,6 @@ func newConfig(opts []Option, role string) *config { for _, o := range opts { o.apply(c) } - - c.tracer = c.TracerProvider.Tracer( - ScopeName, - trace.WithInstrumentationVersion(SemVersion()), - ) - - c.meter = c.MeterProvider.Meter( - ScopeName, - metric.WithInstrumentationVersion(Version()), - metric.WithSchemaURL(semconv.SchemaURL), - ) - - var err error - c.rpcDuration, err = c.meter.Float64Histogram("rpc."+role+".duration", - metric.WithDescription("Measures the duration of inbound RPC."), - metric.WithUnit("ms")) - if err != nil { - otel.Handle(err) - if c.rpcDuration == nil { - c.rpcDuration = noop.Float64Histogram{} - } - } - - rpcRequestSize, err := c.meter.Int64Histogram("rpc."+role+".request.size", - metric.WithDescription("Measures size of RPC request messages (uncompressed)."), - metric.WithUnit("By")) - if err != nil { - otel.Handle(err) - if rpcRequestSize == nil { - rpcRequestSize = noop.Int64Histogram{} - } - } - - rpcResponseSize, err := c.meter.Int64Histogram("rpc."+role+".response.size", - metric.WithDescription("Measures size of RPC response messages (uncompressed)."), - metric.WithUnit("By")) - if err != nil { - otel.Handle(err) - if rpcResponseSize == nil { - rpcResponseSize = noop.Int64Histogram{} - } - } - - rpcRequestsPerRPC, err := c.meter.Int64Histogram("rpc."+role+".requests_per_rpc", - metric.WithDescription("Measures the number of messages received per RPC. Should be 1 for all non-streaming RPCs."), - metric.WithUnit("{count}")) - if err != nil { - otel.Handle(err) - if rpcRequestsPerRPC == nil { - rpcRequestsPerRPC = noop.Int64Histogram{} - } - } - - rpcResponsesPerRPC, err := c.meter.Int64Histogram("rpc."+role+".responses_per_rpc", - metric.WithDescription("Measures the number of messages received per RPC. Should be 1 for all non-streaming RPCs."), - metric.WithUnit("{count}")) - if err != nil { - otel.Handle(err) - if rpcResponsesPerRPC == nil { - rpcResponsesPerRPC = noop.Int64Histogram{} - } - } - - switch role { - case "client": - c.rpcInBytes = rpcResponseSize - c.rpcInMessages = rpcResponsesPerRPC - c.rpcOutBytes = rpcRequestSize - c.rpcOutMessages = rpcRequestsPerRPC - case "server": - c.rpcInBytes = rpcRequestSize - c.rpcInMessages = rpcRequestsPerRPC - c.rpcOutBytes = rpcResponseSize - c.rpcOutMessages = rpcResponsesPerRPC - default: - c.rpcInBytes = noop.Int64Histogram{} - c.rpcInMessages = noop.Int64Histogram{} - c.rpcOutBytes = noop.Int64Histogram{} - c.rpcOutMessages = noop.Int64Histogram{} - } - return c } diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go index 7d5ed05808..f63513d456 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go @@ -11,7 +11,6 @@ import ( "io" "net" "strconv" - "time" "google.golang.org/grpc" grpc_codes "google.golang.org/grpc/codes" @@ -23,8 +22,7 @@ import ( "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/metric" - semconv "go.opentelemetry.io/otel/semconv/v1.17.0" + semconv "go.opentelemetry.io/otel/semconv/v1.30.0" "go.opentelemetry.io/otel/trace" ) @@ -39,82 +37,15 @@ func (m messageType) Event(ctx context.Context, id int, _ interface{}) { } span.AddEvent("message", trace.WithAttributes( attribute.KeyValue(m), - RPCMessageIDKey.Int(id), + semconv.RPCMessageIDKey.Int(id), )) } var ( - messageSent = messageType(RPCMessageTypeSent) - messageReceived = messageType(RPCMessageTypeReceived) + messageSent = messageType(semconv.RPCMessageTypeSent) + messageReceived = messageType(semconv.RPCMessageTypeReceived) ) -// UnaryClientInterceptor returns a grpc.UnaryClientInterceptor suitable -// for use in a grpc.NewClient call. -// -// Deprecated: Use [NewClientHandler] instead. -func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor { - cfg := newConfig(opts, "client") - tracer := cfg.TracerProvider.Tracer( - ScopeName, - trace.WithInstrumentationVersion(Version()), - ) - - return func( - ctx context.Context, - method string, - req, reply interface{}, - cc *grpc.ClientConn, - invoker grpc.UnaryInvoker, - callOpts ...grpc.CallOption, - ) error { - i := &InterceptorInfo{ - Method: method, - Type: UnaryClient, - } - if cfg.InterceptorFilter != nil && !cfg.InterceptorFilter(i) { - return invoker(ctx, method, req, reply, cc, callOpts...) - } - - name, attr, _ := telemetryAttributes(method, cc.Target()) - - startOpts := append([]trace.SpanStartOption{ - trace.WithSpanKind(trace.SpanKindClient), - trace.WithAttributes(attr...), - }, - cfg.SpanStartOptions..., - ) - - ctx, span := tracer.Start( - ctx, - name, - startOpts..., - ) - defer span.End() - - ctx = inject(ctx, cfg.Propagators) - - if cfg.SentEvent { - messageSent.Event(ctx, 1, req) - } - - err := invoker(ctx, method, req, reply, cc, callOpts...) - - if cfg.ReceivedEvent { - messageReceived.Event(ctx, 1, reply) - } - - if err != nil { - s, _ := status.FromError(err) - span.SetStatus(codes.Error, s.Message()) - span.SetAttributes(statusCodeAttr(s.Code())) - } else { - span.SetAttributes(statusCodeAttr(grpc_codes.OK)) - } - - return err - } -} - // clientStream wraps around the embedded grpc.ClientStream, and intercepts the RecvMsg and // SendMsg method call. type clientStream struct { @@ -213,7 +144,7 @@ func (w *clientStream) endSpan(err error) { // // Deprecated: Use [NewClientHandler] instead. func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor { - cfg := newConfig(opts, "client") + cfg := newConfig(opts) tracer := cfg.TracerProvider.Tracer( ScopeName, trace.WithInstrumentationVersion(Version()), @@ -235,7 +166,7 @@ func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor { return streamer(ctx, desc, cc, method, callOpts...) } - name, attr, _ := telemetryAttributes(method, cc.Target()) + name, attr := telemetryAttributes(method, cc.Target()) startOpts := append([]trace.SpanStartOption{ trace.WithSpanKind(trace.SpanKindClient), @@ -265,81 +196,6 @@ func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor { } } -// UnaryServerInterceptor returns a grpc.UnaryServerInterceptor suitable -// for use in a grpc.NewServer call. -// -// Deprecated: Use [NewServerHandler] instead. -func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor { - cfg := newConfig(opts, "server") - tracer := cfg.TracerProvider.Tracer( - ScopeName, - trace.WithInstrumentationVersion(Version()), - ) - - return func( - ctx context.Context, - req interface{}, - info *grpc.UnaryServerInfo, - handler grpc.UnaryHandler, - ) (interface{}, error) { - i := &InterceptorInfo{ - UnaryServerInfo: info, - Type: UnaryServer, - } - if cfg.InterceptorFilter != nil && !cfg.InterceptorFilter(i) { - return handler(ctx, req) - } - - ctx = extract(ctx, cfg.Propagators) - name, attr, metricAttrs := telemetryAttributes(info.FullMethod, peerFromCtx(ctx)) - - startOpts := append([]trace.SpanStartOption{ - trace.WithSpanKind(trace.SpanKindServer), - trace.WithAttributes(attr...), - }, - cfg.SpanStartOptions..., - ) - - ctx, span := tracer.Start( - trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)), - name, - startOpts..., - ) - defer span.End() - - if cfg.ReceivedEvent { - messageReceived.Event(ctx, 1, req) - } - - before := time.Now() - - resp, err := handler(ctx, req) - - s, _ := status.FromError(err) - if err != nil { - statusCode, msg := serverStatus(s) - span.SetStatus(statusCode, msg) - if cfg.SentEvent { - messageSent.Event(ctx, 1, s.Proto()) - } - } else { - if cfg.SentEvent { - messageSent.Event(ctx, 1, resp) - } - } - grpcStatusCodeAttr := statusCodeAttr(s.Code()) - span.SetAttributes(grpcStatusCodeAttr) - - // Use floating point division here for higher precision (instead of Millisecond method). - elapsedTime := float64(time.Since(before)) / float64(time.Millisecond) - - metricAttrs = append(metricAttrs, grpcStatusCodeAttr) - cfg.rpcDuration.Record(ctx, elapsedTime, metric.WithAttributeSet(attribute.NewSet(metricAttrs...))) - - return resp, err - } -} - // serverStream wraps around the embedded grpc.ServerStream, and intercepts the RecvMsg and // SendMsg method call. type serverStream struct { @@ -395,7 +251,7 @@ func wrapServerStream(ctx context.Context, ss grpc.ServerStream, cfg *config) *s // // Deprecated: Use [NewServerHandler] instead. func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { - cfg := newConfig(opts, "server") + cfg := newConfig(opts) tracer := cfg.TracerProvider.Tracer( ScopeName, trace.WithInstrumentationVersion(Version()), @@ -417,7 +273,7 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { } ctx = extract(ctx, cfg.Propagators) - name, attr, _ := telemetryAttributes(info.FullMethod, peerFromCtx(ctx)) + name, attr := telemetryAttributes(info.FullMethod, peerFromCtx(ctx)) startOpts := append([]trace.SpanStartOption{ trace.WithSpanKind(trace.SpanKindServer), @@ -449,47 +305,32 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { // telemetryAttributes returns a span name and span and metric attributes from // the gRPC method and peer address. -func telemetryAttributes(fullMethod, peerAddress string) (string, []attribute.KeyValue, []attribute.KeyValue) { +func telemetryAttributes(fullMethod, sererAddr string) (string, []attribute.KeyValue) { name, methodAttrs := internal.ParseFullMethod(fullMethod) - peerAttrs := peerAttr(peerAddress) + srvAttrs := serverAddrAttrs(sererAddr) - attrs := make([]attribute.KeyValue, 0, 1+len(methodAttrs)+len(peerAttrs)) - attrs = append(attrs, RPCSystemGRPC) + attrs := make([]attribute.KeyValue, 0, 1+len(methodAttrs)+len(srvAttrs)) + attrs = append(attrs, semconv.RPCSystemGRPC) attrs = append(attrs, methodAttrs...) - metricAttrs := attrs[:1+len(methodAttrs)] - attrs = append(attrs, peerAttrs...) - return name, attrs, metricAttrs + attrs = append(attrs, srvAttrs...) + return name, attrs } -// peerAttr returns attributes about the peer address. -func peerAttr(addr string) []attribute.KeyValue { - host, p, err := net.SplitHostPort(addr) +// serverAddrAttrs returns the server address attributes for the hostport. +func serverAddrAttrs(hostport string) []attribute.KeyValue { + h, pStr, err := net.SplitHostPort(hostport) if err != nil { - return nil + // The server.address attribute is required. + return []attribute.KeyValue{semconv.ServerAddress(hostport)} } - - if host == "" { - host = "127.0.0.1" - } - port, err := strconv.Atoi(p) + p, err := strconv.Atoi(pStr) if err != nil { - return nil + return []attribute.KeyValue{semconv.ServerAddress(h)} } - - var attr []attribute.KeyValue - if ip := net.ParseIP(host); ip != nil { - attr = []attribute.KeyValue{ - semconv.NetSockPeerAddr(host), - semconv.NetSockPeerPort(port), - } - } else { - attr = []attribute.KeyValue{ - semconv.NetPeerName(host), - semconv.NetPeerPort(port), - } + return []attribute.KeyValue{ + semconv.ServerAddress(h), + semconv.ServerPort(p), } - - return attr } // peerFromCtx returns a peer address from a context, if one exists. @@ -503,7 +344,7 @@ func peerFromCtx(ctx context.Context) string { // statusCodeAttr returns status code attribute based on given gRPC code. func statusCodeAttr(c grpc_codes.Code) attribute.KeyValue { - return GRPCStatusCodeKey.Int64(int64(c)) + return semconv.RPCGRPCStatusCodeKey.Int64(int64(c)) } // serverStatus returns a span status code and message for a given gRPC diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal/parse.go b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal/parse.go index bef07b7a3c..1fa73c2f94 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal/parse.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal/parse.go @@ -1,13 +1,14 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +// Package internal provides internal functionality for the otelgrpc package. package internal // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal" import ( "strings" "go.opentelemetry.io/otel/attribute" - semconv "go.opentelemetry.io/otel/semconv/v1.17.0" + semconv "go.opentelemetry.io/otel/semconv/v1.30.0" ) // ParseFullMethod returns a span name following the OpenTelemetry semantic diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/metadata_supplier.go b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/metadata_supplier.go index 3aa37915df..6e67f0216b 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/metadata_supplier.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/metadata_supplier.go @@ -45,7 +45,7 @@ func (s *metadataSupplier) Keys() []string { // requests. // Deprecated: Unnecessary public func. func Inject(ctx context.Context, md *metadata.MD, opts ...Option) { - c := newConfig(opts, "") + c := newConfig(opts) c.Propagators.Inject(ctx, &metadataSupplier{ metadata: md, }) @@ -67,7 +67,7 @@ func inject(ctx context.Context, propagators propagation.TextMapPropagator) cont // This function is meant to be used on incoming requests. // Deprecated: Unnecessary public func. func Extract(ctx context.Context, md *metadata.MD, opts ...Option) (baggage.Baggage, trace.SpanContext) { - c := newConfig(opts, "") + c := newConfig(opts) ctx = c.Propagators.Extract(ctx, &metadataSupplier{ metadata: md, }) diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/semconv.go b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/semconv.go deleted file mode 100644 index 409c621b74..0000000000 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/semconv.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" - -import ( - "go.opentelemetry.io/otel/attribute" - semconv "go.opentelemetry.io/otel/semconv/v1.17.0" -) - -// Semantic conventions for attribute keys for gRPC. -const ( - // Name of message transmitted or received. - RPCNameKey = attribute.Key("name") - - // Type of message transmitted or received. - RPCMessageTypeKey = attribute.Key("message.type") - - // Identifier of message transmitted or received. - RPCMessageIDKey = attribute.Key("message.id") - - // The compressed size of the message transmitted or received in bytes. - RPCMessageCompressedSizeKey = attribute.Key("message.compressed_size") - - // The uncompressed size of the message transmitted or received in - // bytes. - RPCMessageUncompressedSizeKey = attribute.Key("message.uncompressed_size") -) - -// Semantic conventions for common RPC attributes. -var ( - // Semantic convention for gRPC as the remoting system. - RPCSystemGRPC = semconv.RPCSystemGRPC - - // Semantic convention for a message named message. - RPCNameMessage = RPCNameKey.String("message") - - // Semantic conventions for RPC message types. - RPCMessageTypeSent = RPCMessageTypeKey.String("SENT") - RPCMessageTypeReceived = RPCMessageTypeKey.String("RECEIVED") -) diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler.go b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler.go index c01cb897cd..9bec51df33 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler.go @@ -13,10 +13,12 @@ import ( "google.golang.org/grpc/stats" "google.golang.org/grpc/status" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/metric" - semconv "go.opentelemetry.io/otel/semconv/v1.17.0" + "go.opentelemetry.io/otel/metric/noop" + semconv "go.opentelemetry.io/otel/semconv/v1.30.0" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal" @@ -33,12 +35,91 @@ type gRPCContext struct { type serverHandler struct { *config + + tracer trace.Tracer + + duration metric.Float64Histogram + inSize metric.Int64Histogram + outSize metric.Int64Histogram + inMsg metric.Int64Histogram + outMsg metric.Int64Histogram } // NewServerHandler creates a stats.Handler for a gRPC server. func NewServerHandler(opts ...Option) stats.Handler { - h := &serverHandler{ - config: newConfig(opts, "server"), + c := newConfig(opts) + h := &serverHandler{config: c} + + h.tracer = c.TracerProvider.Tracer( + ScopeName, + trace.WithInstrumentationVersion(Version()), + ) + + meter := c.MeterProvider.Meter( + ScopeName, + metric.WithInstrumentationVersion(Version()), + metric.WithSchemaURL(semconv.SchemaURL), + ) + + var err error + h.duration, err = meter.Float64Histogram( + semconv.RPCServerDurationName, + metric.WithDescription(semconv.RPCServerDurationDescription), + metric.WithUnit(semconv.RPCServerDurationUnit), + ) + if err != nil { + otel.Handle(err) + if h.duration == nil { + h.duration = noop.Float64Histogram{} + } + } + + h.inSize, err = meter.Int64Histogram( + semconv.RPCServerRequestSizeName, + metric.WithDescription(semconv.RPCServerRequestSizeDescription), + metric.WithUnit(semconv.RPCServerRequestSizeUnit), + ) + if err != nil { + otel.Handle(err) + if h.inSize == nil { + h.inSize = noop.Int64Histogram{} + } + } + + h.outSize, err = meter.Int64Histogram( + semconv.RPCServerResponseSizeName, + metric.WithDescription(semconv.RPCServerResponseSizeDescription), + metric.WithUnit(semconv.RPCServerResponseSizeUnit), + ) + if err != nil { + otel.Handle(err) + if h.outSize == nil { + h.outSize = noop.Int64Histogram{} + } + } + + h.inMsg, err = meter.Int64Histogram( + semconv.RPCServerRequestsPerRPCName, + metric.WithDescription(semconv.RPCServerRequestsPerRPCDescription), + metric.WithUnit(semconv.RPCServerRequestsPerRPCUnit), + ) + if err != nil { + otel.Handle(err) + if h.inMsg == nil { + h.inMsg = noop.Int64Histogram{} + } + } + + h.outMsg, err = meter.Int64Histogram( + semconv.RPCServerResponsesPerRPCName, + metric.WithDescription(semconv.RPCServerResponsesPerRPCDescription), + metric.WithUnit(semconv.RPCServerResponsesPerRPCUnit), + ) + if err != nil { + otel.Handle(err) + if h.outMsg == nil { + h.outMsg = noop.Int64Histogram{} + } } return h @@ -55,41 +136,125 @@ func (h *serverHandler) HandleConn(ctx context.Context, info stats.ConnStats) { // TagRPC can attach some information to the given context. func (h *serverHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context { - ctx = extract(ctx, h.config.Propagators) + ctx = extract(ctx, h.Propagators) name, attrs := internal.ParseFullMethod(info.FullMethodName) - attrs = append(attrs, RPCSystemGRPC) - ctx, _ = h.tracer.Start( - trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)), - name, - trace.WithSpanKind(trace.SpanKindServer), - trace.WithAttributes(append(attrs, h.config.SpanAttributes...)...), - ) + attrs = append(attrs, semconv.RPCSystemGRPC) - gctx := gRPCContext{ - metricAttrs: append(attrs, h.config.MetricAttributes...), - record: true, + record := true + if h.Filter != nil { + record = h.Filter(info) } - if h.config.Filter != nil { - gctx.record = h.config.Filter(info) + + if record { + ctx, _ = h.tracer.Start( + trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)), + name, + trace.WithSpanKind(trace.SpanKindServer), + trace.WithAttributes(append(attrs, h.SpanAttributes...)...), + ) } + + gctx := gRPCContext{ + metricAttrs: append(attrs, h.MetricAttributes...), + record: record, + } + return context.WithValue(ctx, gRPCContextKey{}, &gctx) } // HandleRPC processes the RPC stats. func (h *serverHandler) HandleRPC(ctx context.Context, rs stats.RPCStats) { - isServer := true - h.handleRPC(ctx, rs, isServer) + h.handleRPC(ctx, rs, h.duration, h.inSize, h.outSize, h.inMsg, h.outMsg, serverStatus) } type clientHandler struct { *config + + tracer trace.Tracer + + duration metric.Float64Histogram + inSize metric.Int64Histogram + outSize metric.Int64Histogram + inMsg metric.Int64Histogram + outMsg metric.Int64Histogram } // NewClientHandler creates a stats.Handler for a gRPC client. func NewClientHandler(opts ...Option) stats.Handler { - h := &clientHandler{ - config: newConfig(opts, "client"), + c := newConfig(opts) + h := &clientHandler{config: c} + + h.tracer = c.TracerProvider.Tracer( + ScopeName, + trace.WithInstrumentationVersion(Version()), + ) + + meter := c.MeterProvider.Meter( + ScopeName, + metric.WithInstrumentationVersion(Version()), + metric.WithSchemaURL(semconv.SchemaURL), + ) + + var err error + h.duration, err = meter.Float64Histogram( + semconv.RPCClientDurationName, + metric.WithDescription(semconv.RPCClientDurationDescription), + metric.WithUnit(semconv.RPCClientDurationUnit), + ) + if err != nil { + otel.Handle(err) + if h.duration == nil { + h.duration = noop.Float64Histogram{} + } + } + + h.outSize, err = meter.Int64Histogram( + semconv.RPCClientRequestSizeName, + metric.WithDescription(semconv.RPCClientRequestSizeDescription), + metric.WithUnit(semconv.RPCClientRequestSizeUnit), + ) + if err != nil { + otel.Handle(err) + if h.outSize == nil { + h.outSize = noop.Int64Histogram{} + } + } + + h.inSize, err = meter.Int64Histogram( + semconv.RPCClientResponseSizeName, + metric.WithDescription(semconv.RPCClientResponseSizeDescription), + metric.WithUnit(semconv.RPCClientResponseSizeUnit), + ) + if err != nil { + otel.Handle(err) + if h.inSize == nil { + h.inSize = noop.Int64Histogram{} + } + } + + h.outMsg, err = meter.Int64Histogram( + semconv.RPCClientRequestsPerRPCName, + metric.WithDescription(semconv.RPCClientRequestsPerRPCDescription), + metric.WithUnit(semconv.RPCClientRequestsPerRPCUnit), + ) + if err != nil { + otel.Handle(err) + if h.outMsg == nil { + h.outMsg = noop.Int64Histogram{} + } + } + + h.inMsg, err = meter.Int64Histogram( + semconv.RPCClientResponsesPerRPCName, + metric.WithDescription(semconv.RPCClientResponsesPerRPCDescription), + metric.WithUnit(semconv.RPCClientResponsesPerRPCUnit), + ) + if err != nil { + otel.Handle(err) + if h.inMsg == nil { + h.inMsg = noop.Int64Histogram{} + } } return h @@ -98,29 +263,38 @@ func NewClientHandler(opts ...Option) stats.Handler { // TagRPC can attach some information to the given context. func (h *clientHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context { name, attrs := internal.ParseFullMethod(info.FullMethodName) - attrs = append(attrs, RPCSystemGRPC) - ctx, _ = h.tracer.Start( - ctx, - name, - trace.WithSpanKind(trace.SpanKindClient), - trace.WithAttributes(append(attrs, h.config.SpanAttributes...)...), - ) + attrs = append(attrs, semconv.RPCSystemGRPC) - gctx := gRPCContext{ - metricAttrs: append(attrs, h.config.MetricAttributes...), - record: true, + record := true + if h.Filter != nil { + record = h.Filter(info) } - if h.config.Filter != nil { - gctx.record = h.config.Filter(info) + + if record { + ctx, _ = h.tracer.Start( + ctx, + name, + trace.WithSpanKind(trace.SpanKindClient), + trace.WithAttributes(append(attrs, h.SpanAttributes...)...), + ) } - return inject(context.WithValue(ctx, gRPCContextKey{}, &gctx), h.config.Propagators) + gctx := gRPCContext{ + metricAttrs: append(attrs, h.MetricAttributes...), + record: record, + } + + return inject(context.WithValue(ctx, gRPCContextKey{}, &gctx), h.Propagators) } // HandleRPC processes the RPC stats. func (h *clientHandler) HandleRPC(ctx context.Context, rs stats.RPCStats) { - isServer := false - h.handleRPC(ctx, rs, isServer) + h.handleRPC( + ctx, rs, h.duration, h.inSize, h.outSize, h.inMsg, h.outMsg, + func(s *status.Status) (codes.Code, string) { + return codes.Error, s.Message() + }, + ) } // TagConn can attach some information to the given context. @@ -133,77 +307,86 @@ func (h *clientHandler) HandleConn(context.Context, stats.ConnStats) { // no-op } -func (c *config) handleRPC(ctx context.Context, rs stats.RPCStats, isServer bool) { // nolint: revive // isServer is not a control flag. - span := trace.SpanFromContext(ctx) - var metricAttrs []attribute.KeyValue - var messageId int64 - +func (c *config) handleRPC( + ctx context.Context, + rs stats.RPCStats, + duration metric.Float64Histogram, + inSize, outSize, inMsg, outMsg metric.Int64Histogram, + recordStatus func(*status.Status) (codes.Code, string), +) { gctx, _ := ctx.Value(gRPCContextKey{}).(*gRPCContext) - if gctx != nil { - if !gctx.record { - return - } - metricAttrs = make([]attribute.KeyValue, 0, len(gctx.metricAttrs)+1) - metricAttrs = append(metricAttrs, gctx.metricAttrs...) + if gctx != nil && !gctx.record { + return } + span := trace.SpanFromContext(ctx) + var messageId int64 + switch rs := rs.(type) { case *stats.Begin: case *stats.InPayload: if gctx != nil { messageId = atomic.AddInt64(&gctx.inMessages, 1) - c.rpcInBytes.Record(ctx, int64(rs.Length), metric.WithAttributeSet(attribute.NewSet(metricAttrs...))) + inSize.Record(ctx, int64(rs.Length), metric.WithAttributes(gctx.metricAttrs...)) } - if c.ReceivedEvent { + if c.ReceivedEvent && span.IsRecording() { span.AddEvent("message", trace.WithAttributes( - semconv.MessageTypeReceived, - semconv.MessageIDKey.Int64(messageId), - semconv.MessageCompressedSizeKey.Int(rs.CompressedLength), - semconv.MessageUncompressedSizeKey.Int(rs.Length), + semconv.RPCMessageTypeReceived, + semconv.RPCMessageIDKey.Int64(messageId), + semconv.RPCMessageCompressedSizeKey.Int(rs.CompressedLength), + semconv.RPCMessageUncompressedSizeKey.Int(rs.Length), ), ) } case *stats.OutPayload: if gctx != nil { messageId = atomic.AddInt64(&gctx.outMessages, 1) - c.rpcOutBytes.Record(ctx, int64(rs.Length), metric.WithAttributeSet(attribute.NewSet(metricAttrs...))) + outSize.Record(ctx, int64(rs.Length), metric.WithAttributes(gctx.metricAttrs...)) } - if c.SentEvent { + if c.SentEvent && span.IsRecording() { span.AddEvent("message", trace.WithAttributes( - semconv.MessageTypeSent, - semconv.MessageIDKey.Int64(messageId), - semconv.MessageCompressedSizeKey.Int(rs.CompressedLength), - semconv.MessageUncompressedSizeKey.Int(rs.Length), + semconv.RPCMessageTypeSent, + semconv.RPCMessageIDKey.Int64(messageId), + semconv.RPCMessageCompressedSizeKey.Int(rs.CompressedLength), + semconv.RPCMessageUncompressedSizeKey.Int(rs.Length), ), ) } case *stats.OutTrailer: case *stats.OutHeader: - if p, ok := peer.FromContext(ctx); ok { - span.SetAttributes(peerAttr(p.Addr.String())...) + if span.IsRecording() { + if p, ok := peer.FromContext(ctx); ok { + span.SetAttributes(serverAddrAttrs(p.Addr.String())...) + } } case *stats.End: var rpcStatusAttr attribute.KeyValue + var s *status.Status if rs.Error != nil { - s, _ := status.FromError(rs.Error) - if isServer { - statusCode, msg := serverStatus(s) - span.SetStatus(statusCode, msg) - } else { - span.SetStatus(codes.Error, s.Message()) - } + s, _ = status.FromError(rs.Error) rpcStatusAttr = semconv.RPCGRPCStatusCodeKey.Int(int(s.Code())) } else { rpcStatusAttr = semconv.RPCGRPCStatusCodeKey.Int(int(grpc_codes.OK)) } - span.SetAttributes(rpcStatusAttr) - span.End() + if span.IsRecording() { + if s != nil { + c, m := recordStatus(s) + span.SetStatus(c, m) + } + span.SetAttributes(rpcStatusAttr) + span.End() + } + var metricAttrs []attribute.KeyValue + if gctx != nil { + metricAttrs = make([]attribute.KeyValue, 0, len(gctx.metricAttrs)+1) + metricAttrs = append(metricAttrs, gctx.metricAttrs...) + } metricAttrs = append(metricAttrs, rpcStatusAttr) // Allocate vararg slice once. recordOpts := []metric.RecordOption{metric.WithAttributeSet(attribute.NewSet(metricAttrs...))} @@ -212,10 +395,10 @@ func (c *config) handleRPC(ctx context.Context, rs stats.RPCStats, isServer bool // Measure right before calling Record() to capture as much elapsed time as possible. elapsedTime := float64(rs.EndTime.Sub(rs.BeginTime)) / float64(time.Millisecond) - c.rpcDuration.Record(ctx, elapsedTime, recordOpts...) + duration.Record(ctx, elapsedTime, recordOpts...) if gctx != nil { - c.rpcInMessages.Record(ctx, atomic.LoadInt64(&gctx.inMessages), recordOpts...) - c.rpcOutMessages.Record(ctx, atomic.LoadInt64(&gctx.outMessages), recordOpts...) + inMsg.Record(ctx, atomic.LoadInt64(&gctx.inMessages), recordOpts...) + outMsg.Record(ctx, atomic.LoadInt64(&gctx.outMessages), recordOpts...) } default: return diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/version.go b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/version.go index 25a3a86296..b1feeca494 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/version.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/version.go @@ -5,13 +5,6 @@ package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.g // Version is the current release version of the gRPC instrumentation. func Version() string { - return "0.58.0" + return "0.61.0" // This string is updated by the pre_release.sh script during release } - -// SemVersion is the semantic version to be supplied to tracer/meter creation. -// -// Deprecated: Use [Version] instead. -func SemVersion() string { - return Version() -} diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/MIGRATION.md b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/MIGRATION.md new file mode 100644 index 0000000000..8a11ea28d3 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/MIGRATION.md @@ -0,0 +1,155 @@ +# Semantic Convention Changes + +The `go.opentelemetry.io/otel/semconv/v1.30.0` should be a drop-in replacement for `go.opentelemetry.io/otel/semconv/v1.28.0` with the following exceptions. + +Note: `go.opentelemetry.io/otel/semconv/v1.29.0` does not exist due to bugs from the upstream [OpenTelemetry Semantic Conventions]. + +## Dropped deprecations + +The following declarations have been deprecated in the [OpenTelemetry Semantic Conventions]. +Refer to the respective documentation in that repository for deprecation instructions for each type. + +- `CodeColumn` +- `CodeColumnKey` +- `CodeFunction` +- `CodeFunctionKey` +- `DBCassandraConsistencyLevelAll` +- `DBCassandraConsistencyLevelAny` +- `DBCassandraConsistencyLevelEachQuorum` +- `DBCassandraConsistencyLevelKey` +- `DBCassandraConsistencyLevelLocalOne` +- `DBCassandraConsistencyLevelLocalQuorum` +- `DBCassandraConsistencyLevelLocalSerial` +- `DBCassandraConsistencyLevelOne` +- `DBCassandraConsistencyLevelQuorum` +- `DBCassandraConsistencyLevelSerial` +- `DBCassandraConsistencyLevelThree` +- `DBCassandraConsistencyLevelTwo` +- `DBCassandraCoordinatorDC` +- `DBCassandraCoordinatorDCKey` +- `DBCassandraCoordinatorID` +- `DBCassandraCoordinatorIDKey` +- `DBCassandraIdempotence` +- `DBCassandraIdempotenceKey` +- `DBCassandraPageSize` +- `DBCassandraPageSizeKey` +- `DBCassandraSpeculativeExecutionCount` +- `DBCassandraSpeculativeExecutionCountKey` +- `DBCosmosDBClientID` +- `DBCosmosDBClientIDKey` +- `DBCosmosDBConnectionModeDirect` +- `DBCosmosDBConnectionModeGateway` +- `DBCosmosDBConnectionModeKey` +- `DBCosmosDBOperationTypeBatch` +- `DBCosmosDBOperationTypeCreate` +- `DBCosmosDBOperationTypeDelete` +- `DBCosmosDBOperationTypeExecute` +- `DBCosmosDBOperationTypeExecuteJavascript` +- `DBCosmosDBOperationTypeHead` +- `DBCosmosDBOperationTypeHeadFeed` +- `DBCosmosDBOperationTypeInvalid` +- `DBCosmosDBOperationTypeKey` +- `DBCosmosDBOperationTypePatch` +- `DBCosmosDBOperationTypeQuery` +- `DBCosmosDBOperationTypeQueryPlan` +- `DBCosmosDBOperationTypeRead` +- `DBCosmosDBOperationTypeReadFeed` +- `DBCosmosDBOperationTypeReplace` +- `DBCosmosDBOperationTypeUpsert` +- `DBCosmosDBRequestCharge` +- `DBCosmosDBRequestChargeKey` +- `DBCosmosDBRequestContentLength` +- `DBCosmosDBRequestContentLengthKey` +- `DBCosmosDBSubStatusCode` +- `DBCosmosDBSubStatusCodeKey` +- `DBElasticsearchNodeName` +- `DBElasticsearchNodeNameKey` +- `DBSystemAdabas` +- `DBSystemCache` +- `DBSystemCassandra` +- `DBSystemClickhouse` +- `DBSystemCloudscape` +- `DBSystemCockroachdb` +- `DBSystemColdfusion` +- `DBSystemCosmosDB` +- `DBSystemCouchDB` +- `DBSystemCouchbase` +- `DBSystemDb2` +- `DBSystemDerby` +- `DBSystemDynamoDB` +- `DBSystemEDB` +- `DBSystemElasticsearch` +- `DBSystemFilemaker` +- `DBSystemFirebird` +- `DBSystemFirstSQL` +- `DBSystemGeode` +- `DBSystemH2` +- `DBSystemHBase` +- `DBSystemHSQLDB` +- `DBSystemHanaDB` +- `DBSystemHive` +- `DBSystemInfluxdb` +- `DBSystemInformix` +- `DBSystemIngres` +- `DBSystemInstantDB` +- `DBSystemInterbase` +- `DBSystemIntersystemsCache` +- `DBSystemKey` +- `DBSystemMSSQL` +- `DBSystemMariaDB` +- `DBSystemMaxDB` +- `DBSystemMemcached` +- `DBSystemMongoDB` +- `DBSystemMssqlcompact` +- `DBSystemMySQL` +- `DBSystemNeo4j` +- `DBSystemNetezza` +- `DBSystemOpensearch` +- `DBSystemOracle` +- `DBSystemOtherSQL` +- `DBSystemPervasive` +- `DBSystemPointbase` +- `DBSystemPostgreSQL` +- `DBSystemProgress` +- `DBSystemRedis` +- `DBSystemRedshift` +- `DBSystemSpanner` +- `DBSystemSqlite` +- `DBSystemSybase` +- `DBSystemTeradata` +- `DBSystemTrino` +- `DBSystemVertica` +- `EventName` +- `EventNameKey` +- `ExceptionEscaped` +- `ExceptionEscapedKey` +- `GenAIOpenaiRequestSeed` +- `GenAIOpenaiRequestSeedKey` +- `ProcessExecutableBuildIDProfiling` +- `ProcessExecutableBuildIDProfilingKey` +- `SystemNetworkStateClose` +- `SystemNetworkStateCloseWait` +- `SystemNetworkStateClosing` +- `SystemNetworkStateDelete` +- `SystemNetworkStateEstablished` +- `SystemNetworkStateFinWait1` +- `SystemNetworkStateFinWait2` +- `SystemNetworkStateKey` +- `SystemNetworkStateLastAck` +- `SystemNetworkStateListen` +- `SystemNetworkStateSynRecv` +- `SystemNetworkStateSynSent` +- `SystemNetworkStateTimeWait` +- `VCSRepositoryChangeID` +- `VCSRepositoryChangeIDKey` +- `VCSRepositoryChangeTitle` +- `VCSRepositoryChangeTitleKey` +- `VCSRepositoryRefName` +- `VCSRepositoryRefNameKey` +- `VCSRepositoryRefRevision` +- `VCSRepositoryRefRevisionKey` +- `VCSRepositoryRefTypeBranch` +- `VCSRepositoryRefTypeKey` +- `VCSRepositoryRefTypeTag` + +[OpenTelemetry Semantic Conventions]: https://github.com/open-telemetry/semantic-conventions diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/README.md b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/README.md new file mode 100644 index 0000000000..072ea6928f --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/README.md @@ -0,0 +1,3 @@ +# Semconv v1.30.0 + +[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/semconv/v1.30.0)](https://pkg.go.dev/go.opentelemetry.io/otel/semconv/v1.30.0) diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/attribute_group.go b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/attribute_group.go new file mode 100644 index 0000000000..60f3df0db5 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/attribute_group.go @@ -0,0 +1,12333 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Code generated from semantic convention specification. DO NOT EDIT. + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.30.0" + +import "go.opentelemetry.io/otel/attribute" + +// Namespace: android +const ( + // AndroidOSAPILevelKey is the attribute Key conforming to the + // "android.os.api_level" semantic conventions. It represents the uniquely + // identifies the framework API revision offered by a version (`os.version`) of + // the android operating system. More information can be found [here]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "33", "32" + // + // [here]: https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels + AndroidOSAPILevelKey = attribute.Key("android.os.api_level") +) + +// AndroidOSAPILevel returns an attribute KeyValue conforming to the +// "android.os.api_level" semantic conventions. It represents the uniquely +// identifies the framework API revision offered by a version (`os.version`) of +// the android operating system. More information can be found [here]. +// +// [here]: https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels +func AndroidOSAPILevel(val string) attribute.KeyValue { + return AndroidOSAPILevelKey.String(val) +} + +// Namespace: artifact +const ( + // ArtifactAttestationFilenameKey is the attribute Key conforming to the + // "artifact.attestation.filename" semantic conventions. It represents the + // provenance filename of the built attestation which directly relates to the + // build artifact filename. This filename SHOULD accompany the artifact at + // publish time. See the [SLSA Relationship] specification for more information. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "golang-binary-amd64-v0.1.0.attestation", + // "docker-image-amd64-v0.1.0.intoto.json1", "release-1.tar.gz.attestation", + // "file-name-package.tar.gz.intoto.json1" + // + // [SLSA Relationship]: https://slsa.dev/spec/v1.0/distributing-provenance#relationship-between-artifacts-and-attestations + ArtifactAttestationFilenameKey = attribute.Key("artifact.attestation.filename") + + // ArtifactAttestationHashKey is the attribute Key conforming to the + // "artifact.attestation.hash" semantic conventions. It represents the full + // [hash value (see glossary)], of the built attestation. Some envelopes in the + // [software attestation space] also refer to this as the **digest**. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1b31dfcd5b7f9267bf2ff47651df1cfb9147b9e4df1f335accf65b4cda498408" + // + // [hash value (see glossary)]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf + // [software attestation space]: https://github.com/in-toto/attestation/tree/main/spec + ArtifactAttestationHashKey = attribute.Key("artifact.attestation.hash") + + // ArtifactAttestationIDKey is the attribute Key conforming to the + // "artifact.attestation.id" semantic conventions. It represents the id of the + // build [software attestation]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "123" + // + // [software attestation]: https://slsa.dev/attestation-model + ArtifactAttestationIDKey = attribute.Key("artifact.attestation.id") + + // ArtifactFilenameKey is the attribute Key conforming to the + // "artifact.filename" semantic conventions. It represents the human readable + // file name of the artifact, typically generated during build and release + // processes. Often includes the package name and version in the file name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "golang-binary-amd64-v0.1.0", "docker-image-amd64-v0.1.0", + // "release-1.tar.gz", "file-name-package.tar.gz" + // Note: This file name can also act as the [Package Name] + // in cases where the package ecosystem maps accordingly. + // Additionally, the artifact [can be published] + // for others, but that is not a guarantee. + // + // [Package Name]: https://slsa.dev/spec/v1.0/terminology#package-model + // [can be published]: https://slsa.dev/spec/v1.0/terminology#software-supply-chain + ArtifactFilenameKey = attribute.Key("artifact.filename") + + // ArtifactHashKey is the attribute Key conforming to the "artifact.hash" + // semantic conventions. It represents the full [hash value (see glossary)], + // often found in checksum.txt on a release of the artifact and used to verify + // package integrity. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "9ff4c52759e2c4ac70b7d517bc7fcdc1cda631ca0045271ddd1b192544f8a3e9" + // Note: The specific algorithm used to create the cryptographic hash value is + // not defined. In situations where an artifact has multiple + // cryptographic hashes, it is up to the implementer to choose which + // hash value to set here; this should be the most secure hash algorithm + // that is suitable for the situation and consistent with the + // corresponding attestation. The implementer can then provide the other + // hash values through an additional set of attribute extensions as they + // deem necessary. + // + // [hash value (see glossary)]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf + ArtifactHashKey = attribute.Key("artifact.hash") + + // ArtifactPurlKey is the attribute Key conforming to the "artifact.purl" + // semantic conventions. It represents the [Package URL] of the + // [package artifact] provides a standard way to identify and locate the + // packaged artifact. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "pkg:github/package-url/purl-spec@1209109710924", + // "pkg:npm/foo@12.12.3" + // + // [Package URL]: https://github.com/package-url/purl-spec + // [package artifact]: https://slsa.dev/spec/v1.0/terminology#package-model + ArtifactPurlKey = attribute.Key("artifact.purl") + + // ArtifactVersionKey is the attribute Key conforming to the "artifact.version" + // semantic conventions. It represents the version of the artifact. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "v0.1.0", "1.2.1", "122691-build" + ArtifactVersionKey = attribute.Key("artifact.version") +) + +// ArtifactAttestationFilename returns an attribute KeyValue conforming to the +// "artifact.attestation.filename" semantic conventions. It represents the +// provenance filename of the built attestation which directly relates to the +// build artifact filename. This filename SHOULD accompany the artifact at +// publish time. See the [SLSA Relationship] specification for more information. +// +// [SLSA Relationship]: https://slsa.dev/spec/v1.0/distributing-provenance#relationship-between-artifacts-and-attestations +func ArtifactAttestationFilename(val string) attribute.KeyValue { + return ArtifactAttestationFilenameKey.String(val) +} + +// ArtifactAttestationHash returns an attribute KeyValue conforming to the +// "artifact.attestation.hash" semantic conventions. It represents the full +// [hash value (see glossary)], of the built attestation. Some envelopes in the +// [software attestation space] also refer to this as the **digest**. +// +// [hash value (see glossary)]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf +// [software attestation space]: https://github.com/in-toto/attestation/tree/main/spec +func ArtifactAttestationHash(val string) attribute.KeyValue { + return ArtifactAttestationHashKey.String(val) +} + +// ArtifactAttestationID returns an attribute KeyValue conforming to the +// "artifact.attestation.id" semantic conventions. It represents the id of the +// build [software attestation]. +// +// [software attestation]: https://slsa.dev/attestation-model +func ArtifactAttestationID(val string) attribute.KeyValue { + return ArtifactAttestationIDKey.String(val) +} + +// ArtifactFilename returns an attribute KeyValue conforming to the +// "artifact.filename" semantic conventions. It represents the human readable +// file name of the artifact, typically generated during build and release +// processes. Often includes the package name and version in the file name. +func ArtifactFilename(val string) attribute.KeyValue { + return ArtifactFilenameKey.String(val) +} + +// ArtifactHash returns an attribute KeyValue conforming to the "artifact.hash" +// semantic conventions. It represents the full [hash value (see glossary)], +// often found in checksum.txt on a release of the artifact and used to verify +// package integrity. +// +// [hash value (see glossary)]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf +func ArtifactHash(val string) attribute.KeyValue { + return ArtifactHashKey.String(val) +} + +// ArtifactPurl returns an attribute KeyValue conforming to the "artifact.purl" +// semantic conventions. It represents the [Package URL] of the +// [package artifact] provides a standard way to identify and locate the packaged +// artifact. +// +// [Package URL]: https://github.com/package-url/purl-spec +// [package artifact]: https://slsa.dev/spec/v1.0/terminology#package-model +func ArtifactPurl(val string) attribute.KeyValue { + return ArtifactPurlKey.String(val) +} + +// ArtifactVersion returns an attribute KeyValue conforming to the +// "artifact.version" semantic conventions. It represents the version of the +// artifact. +func ArtifactVersion(val string) attribute.KeyValue { + return ArtifactVersionKey.String(val) +} + +// Namespace: aws +const ( + // AWSDynamoDBAttributeDefinitionsKey is the attribute Key conforming to the + // "aws.dynamodb.attribute_definitions" semantic conventions. It represents the + // JSON-serialized value of each item in the `AttributeDefinitions` request + // field. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "{ "AttributeName": "string", "AttributeType": "string" }" + AWSDynamoDBAttributeDefinitionsKey = attribute.Key("aws.dynamodb.attribute_definitions") + + // AWSDynamoDBAttributesToGetKey is the attribute Key conforming to the + // "aws.dynamodb.attributes_to_get" semantic conventions. It represents the + // value of the `AttributesToGet` request parameter. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "lives", "id" + AWSDynamoDBAttributesToGetKey = attribute.Key("aws.dynamodb.attributes_to_get") + + // AWSDynamoDBConsistentReadKey is the attribute Key conforming to the + // "aws.dynamodb.consistent_read" semantic conventions. It represents the value + // of the `ConsistentRead` request parameter. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + AWSDynamoDBConsistentReadKey = attribute.Key("aws.dynamodb.consistent_read") + + // AWSDynamoDBConsumedCapacityKey is the attribute Key conforming to the + // "aws.dynamodb.consumed_capacity" semantic conventions. It represents the + // JSON-serialized value of each item in the `ConsumedCapacity` response field. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "{ "CapacityUnits": number, "GlobalSecondaryIndexes": { "string" : + // { "CapacityUnits": number, "ReadCapacityUnits": number, "WriteCapacityUnits": + // number } }, "LocalSecondaryIndexes": { "string" : { "CapacityUnits": number, + // "ReadCapacityUnits": number, "WriteCapacityUnits": number } }, + // "ReadCapacityUnits": number, "Table": { "CapacityUnits": number, + // "ReadCapacityUnits": number, "WriteCapacityUnits": number }, "TableName": + // "string", "WriteCapacityUnits": number }" + AWSDynamoDBConsumedCapacityKey = attribute.Key("aws.dynamodb.consumed_capacity") + + // AWSDynamoDBCountKey is the attribute Key conforming to the + // "aws.dynamodb.count" semantic conventions. It represents the value of the + // `Count` response parameter. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 10 + AWSDynamoDBCountKey = attribute.Key("aws.dynamodb.count") + + // AWSDynamoDBExclusiveStartTableKey is the attribute Key conforming to the + // "aws.dynamodb.exclusive_start_table" semantic conventions. It represents the + // value of the `ExclusiveStartTableName` request parameter. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Users", "CatsTable" + AWSDynamoDBExclusiveStartTableKey = attribute.Key("aws.dynamodb.exclusive_start_table") + + // AWSDynamoDBGlobalSecondaryIndexUpdatesKey is the attribute Key conforming to + // the "aws.dynamodb.global_secondary_index_updates" semantic conventions. It + // represents the JSON-serialized value of each item in the + // `GlobalSecondaryIndexUpdates` request field. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "{ "Create": { "IndexName": "string", "KeySchema": [ { + // "AttributeName": "string", "KeyType": "string" } ], "Projection": { + // "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, + // "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": + // number } }" + AWSDynamoDBGlobalSecondaryIndexUpdatesKey = attribute.Key("aws.dynamodb.global_secondary_index_updates") + + // AWSDynamoDBGlobalSecondaryIndexesKey is the attribute Key conforming to the + // "aws.dynamodb.global_secondary_indexes" semantic conventions. It represents + // the JSON-serialized value of each item of the `GlobalSecondaryIndexes` + // request field. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "{ "IndexName": "string", "KeySchema": [ { "AttributeName": + // "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ + // "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { + // "ReadCapacityUnits": number, "WriteCapacityUnits": number } }" + AWSDynamoDBGlobalSecondaryIndexesKey = attribute.Key("aws.dynamodb.global_secondary_indexes") + + // AWSDynamoDBIndexNameKey is the attribute Key conforming to the + // "aws.dynamodb.index_name" semantic conventions. It represents the value of + // the `IndexName` request parameter. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "name_to_group" + AWSDynamoDBIndexNameKey = attribute.Key("aws.dynamodb.index_name") + + // AWSDynamoDBItemCollectionMetricsKey is the attribute Key conforming to the + // "aws.dynamodb.item_collection_metrics" semantic conventions. It represents + // the JSON-serialized value of the `ItemCollectionMetrics` response field. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "{ "string" : [ { "ItemCollectionKey": { "string" : { "B": blob, + // "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : + // "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": + // "string", "SS": [ "string" ] } }, "SizeEstimateRangeGB": [ number ] } ] }" + AWSDynamoDBItemCollectionMetricsKey = attribute.Key("aws.dynamodb.item_collection_metrics") + + // AWSDynamoDBLimitKey is the attribute Key conforming to the + // "aws.dynamodb.limit" semantic conventions. It represents the value of the + // `Limit` request parameter. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 10 + AWSDynamoDBLimitKey = attribute.Key("aws.dynamodb.limit") + + // AWSDynamoDBLocalSecondaryIndexesKey is the attribute Key conforming to the + // "aws.dynamodb.local_secondary_indexes" semantic conventions. It represents + // the JSON-serialized value of each item of the `LocalSecondaryIndexes` request + // field. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "{ "IndexArn": "string", "IndexName": "string", "IndexSizeBytes": + // number, "ItemCount": number, "KeySchema": [ { "AttributeName": "string", + // "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], + // "ProjectionType": "string" } }" + AWSDynamoDBLocalSecondaryIndexesKey = attribute.Key("aws.dynamodb.local_secondary_indexes") + + // AWSDynamoDBProjectionKey is the attribute Key conforming to the + // "aws.dynamodb.projection" semantic conventions. It represents the value of + // the `ProjectionExpression` request parameter. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Title", "Title, Price, Color", "Title, Description, RelatedItems, + // ProductReviews" + AWSDynamoDBProjectionKey = attribute.Key("aws.dynamodb.projection") + + // AWSDynamoDBProvisionedReadCapacityKey is the attribute Key conforming to the + // "aws.dynamodb.provisioned_read_capacity" semantic conventions. It represents + // the value of the `ProvisionedThroughput.ReadCapacityUnits` request parameter. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1.0, 2.0 + AWSDynamoDBProvisionedReadCapacityKey = attribute.Key("aws.dynamodb.provisioned_read_capacity") + + // AWSDynamoDBProvisionedWriteCapacityKey is the attribute Key conforming to the + // "aws.dynamodb.provisioned_write_capacity" semantic conventions. It represents + // the value of the `ProvisionedThroughput.WriteCapacityUnits` request + // parameter. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1.0, 2.0 + AWSDynamoDBProvisionedWriteCapacityKey = attribute.Key("aws.dynamodb.provisioned_write_capacity") + + // AWSDynamoDBScanForwardKey is the attribute Key conforming to the + // "aws.dynamodb.scan_forward" semantic conventions. It represents the value of + // the `ScanIndexForward` request parameter. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + AWSDynamoDBScanForwardKey = attribute.Key("aws.dynamodb.scan_forward") + + // AWSDynamoDBScannedCountKey is the attribute Key conforming to the + // "aws.dynamodb.scanned_count" semantic conventions. It represents the value of + // the `ScannedCount` response parameter. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 50 + AWSDynamoDBScannedCountKey = attribute.Key("aws.dynamodb.scanned_count") + + // AWSDynamoDBSegmentKey is the attribute Key conforming to the + // "aws.dynamodb.segment" semantic conventions. It represents the value of the + // `Segment` request parameter. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 10 + AWSDynamoDBSegmentKey = attribute.Key("aws.dynamodb.segment") + + // AWSDynamoDBSelectKey is the attribute Key conforming to the + // "aws.dynamodb.select" semantic conventions. It represents the value of the + // `Select` request parameter. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "ALL_ATTRIBUTES", "COUNT" + AWSDynamoDBSelectKey = attribute.Key("aws.dynamodb.select") + + // AWSDynamoDBTableCountKey is the attribute Key conforming to the + // "aws.dynamodb.table_count" semantic conventions. It represents the number of + // items in the `TableNames` response parameter. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 20 + AWSDynamoDBTableCountKey = attribute.Key("aws.dynamodb.table_count") + + // AWSDynamoDBTableNamesKey is the attribute Key conforming to the + // "aws.dynamodb.table_names" semantic conventions. It represents the keys in + // the `RequestItems` object field. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Users", "Cats" + AWSDynamoDBTableNamesKey = attribute.Key("aws.dynamodb.table_names") + + // AWSDynamoDBTotalSegmentsKey is the attribute Key conforming to the + // "aws.dynamodb.total_segments" semantic conventions. It represents the value + // of the `TotalSegments` request parameter. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 100 + AWSDynamoDBTotalSegmentsKey = attribute.Key("aws.dynamodb.total_segments") + + // AWSECSClusterARNKey is the attribute Key conforming to the + // "aws.ecs.cluster.arn" semantic conventions. It represents the ARN of an + // [ECS cluster]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster" + // + // [ECS cluster]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html + AWSECSClusterARNKey = attribute.Key("aws.ecs.cluster.arn") + + // AWSECSContainerARNKey is the attribute Key conforming to the + // "aws.ecs.container.arn" semantic conventions. It represents the Amazon + // Resource Name (ARN) of an [ECS container instance]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "arn:aws:ecs:us-west-1:123456789123:container/32624152-9086-4f0e-acae-1a75b14fe4d9" + // + // [ECS container instance]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html + AWSECSContainerARNKey = attribute.Key("aws.ecs.container.arn") + + // AWSECSLaunchtypeKey is the attribute Key conforming to the + // "aws.ecs.launchtype" semantic conventions. It represents the [launch type] + // for an ECS task. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // + // [launch type]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html + AWSECSLaunchtypeKey = attribute.Key("aws.ecs.launchtype") + + // AWSECSTaskARNKey is the attribute Key conforming to the "aws.ecs.task.arn" + // semantic conventions. It represents the ARN of a running [ECS task]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "arn:aws:ecs:us-west-1:123456789123:task/10838bed-421f-43ef-870a-f43feacbbb5b", + // "arn:aws:ecs:us-west-1:123456789123:task/my-cluster/task-id/23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd" + // + // [ECS task]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids + AWSECSTaskARNKey = attribute.Key("aws.ecs.task.arn") + + // AWSECSTaskFamilyKey is the attribute Key conforming to the + // "aws.ecs.task.family" semantic conventions. It represents the family name of + // the [ECS task definition] used to create the ECS task. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry-family" + // + // [ECS task definition]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html + AWSECSTaskFamilyKey = attribute.Key("aws.ecs.task.family") + + // AWSECSTaskIDKey is the attribute Key conforming to the "aws.ecs.task.id" + // semantic conventions. It represents the ID of a running ECS task. The ID MUST + // be extracted from `task.arn`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "10838bed-421f-43ef-870a-f43feacbbb5b", + // "23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd" + AWSECSTaskIDKey = attribute.Key("aws.ecs.task.id") + + // AWSECSTaskRevisionKey is the attribute Key conforming to the + // "aws.ecs.task.revision" semantic conventions. It represents the revision for + // the task definition used to create the ECS task. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "8", "26" + AWSECSTaskRevisionKey = attribute.Key("aws.ecs.task.revision") + + // AWSEKSClusterARNKey is the attribute Key conforming to the + // "aws.eks.cluster.arn" semantic conventions. It represents the ARN of an EKS + // cluster. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster" + AWSEKSClusterARNKey = attribute.Key("aws.eks.cluster.arn") + + // AWSExtendedRequestIDKey is the attribute Key conforming to the + // "aws.extended_request_id" semantic conventions. It represents the AWS + // extended request ID as returned in the response header `x-amz-id-2`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "wzHcyEWfmOGDIE5QOhTAqFDoDWP3y8IUvpNINCwL9N4TEHbUw0/gZJ+VZTmCNCWR7fezEN3eCiQ=" + AWSExtendedRequestIDKey = attribute.Key("aws.extended_request_id") + + // AWSLambdaInvokedARNKey is the attribute Key conforming to the + // "aws.lambda.invoked_arn" semantic conventions. It represents the full invoked + // ARN as provided on the `Context` passed to the function ( + // `Lambda-Runtime-Invoked-Function-Arn` header on the + // `/runtime/invocation/next` applicable). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "arn:aws:lambda:us-east-1:123456:function:myfunction:myalias" + // Note: This may be different from `cloud.resource_id` if an alias is involved. + AWSLambdaInvokedARNKey = attribute.Key("aws.lambda.invoked_arn") + + // AWSLogGroupARNsKey is the attribute Key conforming to the + // "aws.log.group.arns" semantic conventions. It represents the Amazon Resource + // Name(s) (ARN) of the AWS log group(s). + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*" + // Note: See the [log group ARN format documentation]. + // + // [log group ARN format documentation]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format + AWSLogGroupARNsKey = attribute.Key("aws.log.group.arns") + + // AWSLogGroupNamesKey is the attribute Key conforming to the + // "aws.log.group.names" semantic conventions. It represents the name(s) of the + // AWS log group(s) an application is writing to. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/aws/lambda/my-function", "opentelemetry-service" + // Note: Multiple log groups must be supported for cases like multi-container + // applications, where a single application has sidecar containers, and each + // write to their own log group. + AWSLogGroupNamesKey = attribute.Key("aws.log.group.names") + + // AWSLogStreamARNsKey is the attribute Key conforming to the + // "aws.log.stream.arns" semantic conventions. It represents the ARN(s) of the + // AWS log stream(s). + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:log-stream:logs/main/10838bed-421f-43ef-870a-f43feacbbb5b" + // Note: See the [log stream ARN format documentation]. One log group can + // contain several log streams, so these ARNs necessarily identify both a log + // group and a log stream. + // + // [log stream ARN format documentation]: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format + AWSLogStreamARNsKey = attribute.Key("aws.log.stream.arns") + + // AWSLogStreamNamesKey is the attribute Key conforming to the + // "aws.log.stream.names" semantic conventions. It represents the name(s) of the + // AWS log stream(s) an application is writing to. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "logs/main/10838bed-421f-43ef-870a-f43feacbbb5b" + AWSLogStreamNamesKey = attribute.Key("aws.log.stream.names") + + // AWSRequestIDKey is the attribute Key conforming to the "aws.request_id" + // semantic conventions. It represents the AWS request ID as returned in the + // response headers `x-amzn-requestid`, `x-amzn-request-id` or + // `x-amz-request-id`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "79b9da39-b7ae-508a-a6bc-864b2829c622", "C9ER4AJX75574TDJ" + AWSRequestIDKey = attribute.Key("aws.request_id") + + // AWSS3BucketKey is the attribute Key conforming to the "aws.s3.bucket" + // semantic conventions. It represents the S3 bucket name the request refers to. + // Corresponds to the `--bucket` parameter of the [S3 API] operations. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "some-bucket-name" + // Note: The `bucket` attribute is applicable to all S3 operations that + // reference a bucket, i.e. that require the bucket name as a mandatory + // parameter. + // This applies to almost all S3 operations except `list-buckets`. + // + // [S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html + AWSS3BucketKey = attribute.Key("aws.s3.bucket") + + // AWSS3CopySourceKey is the attribute Key conforming to the + // "aws.s3.copy_source" semantic conventions. It represents the source object + // (in the form `bucket`/`key`) for the copy operation. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "someFile.yml" + // Note: The `copy_source` attribute applies to S3 copy operations and + // corresponds to the `--copy-source` parameter + // of the [copy-object operation within the S3 API]. + // This applies in particular to the following operations: + // + // - [copy-object] + // - [upload-part-copy] + // + // + // [copy-object operation within the S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html + // [copy-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html + // [upload-part-copy]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html + AWSS3CopySourceKey = attribute.Key("aws.s3.copy_source") + + // AWSS3DeleteKey is the attribute Key conforming to the "aws.s3.delete" + // semantic conventions. It represents the delete request container that + // specifies the objects to be deleted. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "Objects=[{Key=string,VersionId=string},{Key=string,VersionId=string}],Quiet=boolean" + // Note: The `delete` attribute is only applicable to the [delete-object] + // operation. + // The `delete` attribute corresponds to the `--delete` parameter of the + // [delete-objects operation within the S3 API]. + // + // [delete-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html + // [delete-objects operation within the S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-objects.html + AWSS3DeleteKey = attribute.Key("aws.s3.delete") + + // AWSS3KeyKey is the attribute Key conforming to the "aws.s3.key" semantic + // conventions. It represents the S3 object key the request refers to. + // Corresponds to the `--key` parameter of the [S3 API] operations. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "someFile.yml" + // Note: The `key` attribute is applicable to all object-related S3 operations, + // i.e. that require the object key as a mandatory parameter. + // This applies in particular to the following operations: + // + // - [copy-object] + // - [delete-object] + // - [get-object] + // - [head-object] + // - [put-object] + // - [restore-object] + // - [select-object-content] + // - [abort-multipart-upload] + // - [complete-multipart-upload] + // - [create-multipart-upload] + // - [list-parts] + // - [upload-part] + // - [upload-part-copy] + // + // + // [S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html + // [copy-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html + // [delete-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html + // [get-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html + // [head-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html + // [put-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html + // [restore-object]: https://docs.aws.amazon.com/cli/latest/reference/s3api/restore-object.html + // [select-object-content]: https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html + // [abort-multipart-upload]: https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html + // [complete-multipart-upload]: https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html + // [create-multipart-upload]: https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html + // [list-parts]: https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html + // [upload-part]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html + // [upload-part-copy]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html + AWSS3KeyKey = attribute.Key("aws.s3.key") + + // AWSS3PartNumberKey is the attribute Key conforming to the + // "aws.s3.part_number" semantic conventions. It represents the part number of + // the part being uploaded in a multipart-upload operation. This is a positive + // integer between 1 and 10,000. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 3456 + // Note: The `part_number` attribute is only applicable to the [upload-part] + // and [upload-part-copy] operations. + // The `part_number` attribute corresponds to the `--part-number` parameter of + // the + // [upload-part operation within the S3 API]. + // + // [upload-part]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html + // [upload-part-copy]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html + // [upload-part operation within the S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html + AWSS3PartNumberKey = attribute.Key("aws.s3.part_number") + + // AWSS3UploadIDKey is the attribute Key conforming to the "aws.s3.upload_id" + // semantic conventions. It represents the upload ID that identifies the + // multipart upload. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "dfRtDYWFbkRONycy.Yxwh66Yjlx.cph0gtNBtJ" + // Note: The `upload_id` attribute applies to S3 multipart-upload operations and + // corresponds to the `--upload-id` parameter + // of the [S3 API] multipart operations. + // This applies in particular to the following operations: + // + // - [abort-multipart-upload] + // - [complete-multipart-upload] + // - [list-parts] + // - [upload-part] + // - [upload-part-copy] + // + // + // [S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html + // [abort-multipart-upload]: https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html + // [complete-multipart-upload]: https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html + // [list-parts]: https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html + // [upload-part]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html + // [upload-part-copy]: https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html + AWSS3UploadIDKey = attribute.Key("aws.s3.upload_id") +) + +// AWSDynamoDBAttributeDefinitions returns an attribute KeyValue conforming to +// the "aws.dynamodb.attribute_definitions" semantic conventions. It represents +// the JSON-serialized value of each item in the `AttributeDefinitions` request +// field. +func AWSDynamoDBAttributeDefinitions(val ...string) attribute.KeyValue { + return AWSDynamoDBAttributeDefinitionsKey.StringSlice(val) +} + +// AWSDynamoDBAttributesToGet returns an attribute KeyValue conforming to the +// "aws.dynamodb.attributes_to_get" semantic conventions. It represents the value +// of the `AttributesToGet` request parameter. +func AWSDynamoDBAttributesToGet(val ...string) attribute.KeyValue { + return AWSDynamoDBAttributesToGetKey.StringSlice(val) +} + +// AWSDynamoDBConsistentRead returns an attribute KeyValue conforming to the +// "aws.dynamodb.consistent_read" semantic conventions. It represents the value +// of the `ConsistentRead` request parameter. +func AWSDynamoDBConsistentRead(val bool) attribute.KeyValue { + return AWSDynamoDBConsistentReadKey.Bool(val) +} + +// AWSDynamoDBConsumedCapacity returns an attribute KeyValue conforming to the +// "aws.dynamodb.consumed_capacity" semantic conventions. It represents the +// JSON-serialized value of each item in the `ConsumedCapacity` response field. +func AWSDynamoDBConsumedCapacity(val ...string) attribute.KeyValue { + return AWSDynamoDBConsumedCapacityKey.StringSlice(val) +} + +// AWSDynamoDBCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.count" semantic conventions. It represents the value of the +// `Count` response parameter. +func AWSDynamoDBCount(val int) attribute.KeyValue { + return AWSDynamoDBCountKey.Int(val) +} + +// AWSDynamoDBExclusiveStartTable returns an attribute KeyValue conforming to the +// "aws.dynamodb.exclusive_start_table" semantic conventions. It represents the +// value of the `ExclusiveStartTableName` request parameter. +func AWSDynamoDBExclusiveStartTable(val string) attribute.KeyValue { + return AWSDynamoDBExclusiveStartTableKey.String(val) +} + +// AWSDynamoDBGlobalSecondaryIndexUpdates returns an attribute KeyValue +// conforming to the "aws.dynamodb.global_secondary_index_updates" semantic +// conventions. It represents the JSON-serialized value of each item in the +// `GlobalSecondaryIndexUpdates` request field. +func AWSDynamoDBGlobalSecondaryIndexUpdates(val ...string) attribute.KeyValue { + return AWSDynamoDBGlobalSecondaryIndexUpdatesKey.StringSlice(val) +} + +// AWSDynamoDBGlobalSecondaryIndexes returns an attribute KeyValue conforming to +// the "aws.dynamodb.global_secondary_indexes" semantic conventions. It +// represents the JSON-serialized value of each item of the +// `GlobalSecondaryIndexes` request field. +func AWSDynamoDBGlobalSecondaryIndexes(val ...string) attribute.KeyValue { + return AWSDynamoDBGlobalSecondaryIndexesKey.StringSlice(val) +} + +// AWSDynamoDBIndexName returns an attribute KeyValue conforming to the +// "aws.dynamodb.index_name" semantic conventions. It represents the value of the +// `IndexName` request parameter. +func AWSDynamoDBIndexName(val string) attribute.KeyValue { + return AWSDynamoDBIndexNameKey.String(val) +} + +// AWSDynamoDBItemCollectionMetrics returns an attribute KeyValue conforming to +// the "aws.dynamodb.item_collection_metrics" semantic conventions. It represents +// the JSON-serialized value of the `ItemCollectionMetrics` response field. +func AWSDynamoDBItemCollectionMetrics(val string) attribute.KeyValue { + return AWSDynamoDBItemCollectionMetricsKey.String(val) +} + +// AWSDynamoDBLimit returns an attribute KeyValue conforming to the +// "aws.dynamodb.limit" semantic conventions. It represents the value of the +// `Limit` request parameter. +func AWSDynamoDBLimit(val int) attribute.KeyValue { + return AWSDynamoDBLimitKey.Int(val) +} + +// AWSDynamoDBLocalSecondaryIndexes returns an attribute KeyValue conforming to +// the "aws.dynamodb.local_secondary_indexes" semantic conventions. It represents +// the JSON-serialized value of each item of the `LocalSecondaryIndexes` request +// field. +func AWSDynamoDBLocalSecondaryIndexes(val ...string) attribute.KeyValue { + return AWSDynamoDBLocalSecondaryIndexesKey.StringSlice(val) +} + +// AWSDynamoDBProjection returns an attribute KeyValue conforming to the +// "aws.dynamodb.projection" semantic conventions. It represents the value of the +// `ProjectionExpression` request parameter. +func AWSDynamoDBProjection(val string) attribute.KeyValue { + return AWSDynamoDBProjectionKey.String(val) +} + +// AWSDynamoDBProvisionedReadCapacity returns an attribute KeyValue conforming to +// the "aws.dynamodb.provisioned_read_capacity" semantic conventions. It +// represents the value of the `ProvisionedThroughput.ReadCapacityUnits` request +// parameter. +func AWSDynamoDBProvisionedReadCapacity(val float64) attribute.KeyValue { + return AWSDynamoDBProvisionedReadCapacityKey.Float64(val) +} + +// AWSDynamoDBProvisionedWriteCapacity returns an attribute KeyValue conforming +// to the "aws.dynamodb.provisioned_write_capacity" semantic conventions. It +// represents the value of the `ProvisionedThroughput.WriteCapacityUnits` request +// parameter. +func AWSDynamoDBProvisionedWriteCapacity(val float64) attribute.KeyValue { + return AWSDynamoDBProvisionedWriteCapacityKey.Float64(val) +} + +// AWSDynamoDBScanForward returns an attribute KeyValue conforming to the +// "aws.dynamodb.scan_forward" semantic conventions. It represents the value of +// the `ScanIndexForward` request parameter. +func AWSDynamoDBScanForward(val bool) attribute.KeyValue { + return AWSDynamoDBScanForwardKey.Bool(val) +} + +// AWSDynamoDBScannedCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.scanned_count" semantic conventions. It represents the value of +// the `ScannedCount` response parameter. +func AWSDynamoDBScannedCount(val int) attribute.KeyValue { + return AWSDynamoDBScannedCountKey.Int(val) +} + +// AWSDynamoDBSegment returns an attribute KeyValue conforming to the +// "aws.dynamodb.segment" semantic conventions. It represents the value of the +// `Segment` request parameter. +func AWSDynamoDBSegment(val int) attribute.KeyValue { + return AWSDynamoDBSegmentKey.Int(val) +} + +// AWSDynamoDBSelect returns an attribute KeyValue conforming to the +// "aws.dynamodb.select" semantic conventions. It represents the value of the +// `Select` request parameter. +func AWSDynamoDBSelect(val string) attribute.KeyValue { + return AWSDynamoDBSelectKey.String(val) +} + +// AWSDynamoDBTableCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.table_count" semantic conventions. It represents the number of +// items in the `TableNames` response parameter. +func AWSDynamoDBTableCount(val int) attribute.KeyValue { + return AWSDynamoDBTableCountKey.Int(val) +} + +// AWSDynamoDBTableNames returns an attribute KeyValue conforming to the +// "aws.dynamodb.table_names" semantic conventions. It represents the keys in the +// `RequestItems` object field. +func AWSDynamoDBTableNames(val ...string) attribute.KeyValue { + return AWSDynamoDBTableNamesKey.StringSlice(val) +} + +// AWSDynamoDBTotalSegments returns an attribute KeyValue conforming to the +// "aws.dynamodb.total_segments" semantic conventions. It represents the value of +// the `TotalSegments` request parameter. +func AWSDynamoDBTotalSegments(val int) attribute.KeyValue { + return AWSDynamoDBTotalSegmentsKey.Int(val) +} + +// AWSECSClusterARN returns an attribute KeyValue conforming to the +// "aws.ecs.cluster.arn" semantic conventions. It represents the ARN of an +// [ECS cluster]. +// +// [ECS cluster]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html +func AWSECSClusterARN(val string) attribute.KeyValue { + return AWSECSClusterARNKey.String(val) +} + +// AWSECSContainerARN returns an attribute KeyValue conforming to the +// "aws.ecs.container.arn" semantic conventions. It represents the Amazon +// Resource Name (ARN) of an [ECS container instance]. +// +// [ECS container instance]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html +func AWSECSContainerARN(val string) attribute.KeyValue { + return AWSECSContainerARNKey.String(val) +} + +// AWSECSTaskARN returns an attribute KeyValue conforming to the +// "aws.ecs.task.arn" semantic conventions. It represents the ARN of a running +// [ECS task]. +// +// [ECS task]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids +func AWSECSTaskARN(val string) attribute.KeyValue { + return AWSECSTaskARNKey.String(val) +} + +// AWSECSTaskFamily returns an attribute KeyValue conforming to the +// "aws.ecs.task.family" semantic conventions. It represents the family name of +// the [ECS task definition] used to create the ECS task. +// +// [ECS task definition]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html +func AWSECSTaskFamily(val string) attribute.KeyValue { + return AWSECSTaskFamilyKey.String(val) +} + +// AWSECSTaskID returns an attribute KeyValue conforming to the "aws.ecs.task.id" +// semantic conventions. It represents the ID of a running ECS task. The ID MUST +// be extracted from `task.arn`. +func AWSECSTaskID(val string) attribute.KeyValue { + return AWSECSTaskIDKey.String(val) +} + +// AWSECSTaskRevision returns an attribute KeyValue conforming to the +// "aws.ecs.task.revision" semantic conventions. It represents the revision for +// the task definition used to create the ECS task. +func AWSECSTaskRevision(val string) attribute.KeyValue { + return AWSECSTaskRevisionKey.String(val) +} + +// AWSEKSClusterARN returns an attribute KeyValue conforming to the +// "aws.eks.cluster.arn" semantic conventions. It represents the ARN of an EKS +// cluster. +func AWSEKSClusterARN(val string) attribute.KeyValue { + return AWSEKSClusterARNKey.String(val) +} + +// AWSExtendedRequestID returns an attribute KeyValue conforming to the +// "aws.extended_request_id" semantic conventions. It represents the AWS extended +// request ID as returned in the response header `x-amz-id-2`. +func AWSExtendedRequestID(val string) attribute.KeyValue { + return AWSExtendedRequestIDKey.String(val) +} + +// AWSLambdaInvokedARN returns an attribute KeyValue conforming to the +// "aws.lambda.invoked_arn" semantic conventions. It represents the full invoked +// ARN as provided on the `Context` passed to the function ( +// `Lambda-Runtime-Invoked-Function-Arn` header on the `/runtime/invocation/next` +// applicable). +func AWSLambdaInvokedARN(val string) attribute.KeyValue { + return AWSLambdaInvokedARNKey.String(val) +} + +// AWSLogGroupARNs returns an attribute KeyValue conforming to the +// "aws.log.group.arns" semantic conventions. It represents the Amazon Resource +// Name(s) (ARN) of the AWS log group(s). +func AWSLogGroupARNs(val ...string) attribute.KeyValue { + return AWSLogGroupARNsKey.StringSlice(val) +} + +// AWSLogGroupNames returns an attribute KeyValue conforming to the +// "aws.log.group.names" semantic conventions. It represents the name(s) of the +// AWS log group(s) an application is writing to. +func AWSLogGroupNames(val ...string) attribute.KeyValue { + return AWSLogGroupNamesKey.StringSlice(val) +} + +// AWSLogStreamARNs returns an attribute KeyValue conforming to the +// "aws.log.stream.arns" semantic conventions. It represents the ARN(s) of the +// AWS log stream(s). +func AWSLogStreamARNs(val ...string) attribute.KeyValue { + return AWSLogStreamARNsKey.StringSlice(val) +} + +// AWSLogStreamNames returns an attribute KeyValue conforming to the +// "aws.log.stream.names" semantic conventions. It represents the name(s) of the +// AWS log stream(s) an application is writing to. +func AWSLogStreamNames(val ...string) attribute.KeyValue { + return AWSLogStreamNamesKey.StringSlice(val) +} + +// AWSRequestID returns an attribute KeyValue conforming to the "aws.request_id" +// semantic conventions. It represents the AWS request ID as returned in the +// response headers `x-amzn-requestid`, `x-amzn-request-id` or `x-amz-request-id` +// . +func AWSRequestID(val string) attribute.KeyValue { + return AWSRequestIDKey.String(val) +} + +// AWSS3Bucket returns an attribute KeyValue conforming to the "aws.s3.bucket" +// semantic conventions. It represents the S3 bucket name the request refers to. +// Corresponds to the `--bucket` parameter of the [S3 API] operations. +// +// [S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html +func AWSS3Bucket(val string) attribute.KeyValue { + return AWSS3BucketKey.String(val) +} + +// AWSS3CopySource returns an attribute KeyValue conforming to the +// "aws.s3.copy_source" semantic conventions. It represents the source object (in +// the form `bucket`/`key`) for the copy operation. +func AWSS3CopySource(val string) attribute.KeyValue { + return AWSS3CopySourceKey.String(val) +} + +// AWSS3Delete returns an attribute KeyValue conforming to the "aws.s3.delete" +// semantic conventions. It represents the delete request container that +// specifies the objects to be deleted. +func AWSS3Delete(val string) attribute.KeyValue { + return AWSS3DeleteKey.String(val) +} + +// AWSS3Key returns an attribute KeyValue conforming to the "aws.s3.key" semantic +// conventions. It represents the S3 object key the request refers to. +// Corresponds to the `--key` parameter of the [S3 API] operations. +// +// [S3 API]: https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html +func AWSS3Key(val string) attribute.KeyValue { + return AWSS3KeyKey.String(val) +} + +// AWSS3PartNumber returns an attribute KeyValue conforming to the +// "aws.s3.part_number" semantic conventions. It represents the part number of +// the part being uploaded in a multipart-upload operation. This is a positive +// integer between 1 and 10,000. +func AWSS3PartNumber(val int) attribute.KeyValue { + return AWSS3PartNumberKey.Int(val) +} + +// AWSS3UploadID returns an attribute KeyValue conforming to the +// "aws.s3.upload_id" semantic conventions. It represents the upload ID that +// identifies the multipart upload. +func AWSS3UploadID(val string) attribute.KeyValue { + return AWSS3UploadIDKey.String(val) +} + +// Enum values for aws.ecs.launchtype +var ( + // ec2 + // Stability: development + AWSECSLaunchtypeEC2 = AWSECSLaunchtypeKey.String("ec2") + // fargate + // Stability: development + AWSECSLaunchtypeFargate = AWSECSLaunchtypeKey.String("fargate") +) + +// Namespace: az +const ( + // AzNamespaceKey is the attribute Key conforming to the "az.namespace" semantic + // conventions. It represents the [Azure Resource Provider Namespace] as + // recognized by the client. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ServiceBus" + // + // [Azure Resource Provider Namespace]: https://learn.microsoft.com/azure/azure-resource-manager/management/azure-services-resource-providers + AzNamespaceKey = attribute.Key("az.namespace") + + // AzServiceRequestIDKey is the attribute Key conforming to the + // "az.service_request_id" semantic conventions. It represents the unique + // identifier of the service request. It's generated by the Azure service and + // returned with the response. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "00000000-0000-0000-0000-000000000000" + AzServiceRequestIDKey = attribute.Key("az.service_request_id") +) + +// AzNamespace returns an attribute KeyValue conforming to the "az.namespace" +// semantic conventions. It represents the [Azure Resource Provider Namespace] as +// recognized by the client. +// +// [Azure Resource Provider Namespace]: https://learn.microsoft.com/azure/azure-resource-manager/management/azure-services-resource-providers +func AzNamespace(val string) attribute.KeyValue { + return AzNamespaceKey.String(val) +} + +// AzServiceRequestID returns an attribute KeyValue conforming to the +// "az.service_request_id" semantic conventions. It represents the unique +// identifier of the service request. It's generated by the Azure service and +// returned with the response. +func AzServiceRequestID(val string) attribute.KeyValue { + return AzServiceRequestIDKey.String(val) +} + +// Namespace: azure +const ( + // AzureClientIDKey is the attribute Key conforming to the "azure.client.id" + // semantic conventions. It represents the unique identifier of the client + // instance. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "3ba4827d-4422-483f-b59f-85b74211c11d", "storage-client-1" + AzureClientIDKey = attribute.Key("azure.client.id") + + // AzureCosmosDBConnectionModeKey is the attribute Key conforming to the + // "azure.cosmosdb.connection.mode" semantic conventions. It represents the + // cosmos client connection mode. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + AzureCosmosDBConnectionModeKey = attribute.Key("azure.cosmosdb.connection.mode") + + // AzureCosmosDBConsistencyLevelKey is the attribute Key conforming to the + // "azure.cosmosdb.consistency.level" semantic conventions. It represents the + // account or request [consistency level]. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Eventual", "ConsistentPrefix", "BoundedStaleness", "Strong", + // "Session" + // + // [consistency level]: https://learn.microsoft.com/azure/cosmos-db/consistency-levels + AzureCosmosDBConsistencyLevelKey = attribute.Key("azure.cosmosdb.consistency.level") + + // AzureCosmosDBOperationContactedRegionsKey is the attribute Key conforming to + // the "azure.cosmosdb.operation.contacted_regions" semantic conventions. It + // represents the list of regions contacted during operation in the order that + // they were contacted. If there is more than one region listed, it indicates + // that the operation was performed on multiple regions i.e. cross-regional + // call. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "North Central US", "Australia East", "Australia Southeast" + // Note: Region name matches the format of `displayName` in [Azure Location API] + // + // [Azure Location API]: https://learn.microsoft.com/rest/api/subscription/subscriptions/list-locations?view=rest-subscription-2021-10-01&tabs=HTTP#location + AzureCosmosDBOperationContactedRegionsKey = attribute.Key("azure.cosmosdb.operation.contacted_regions") + + // AzureCosmosDBOperationRequestChargeKey is the attribute Key conforming to the + // "azure.cosmosdb.operation.request_charge" semantic conventions. It represents + // the number of request units consumed by the operation. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 46.18, 1.0 + AzureCosmosDBOperationRequestChargeKey = attribute.Key("azure.cosmosdb.operation.request_charge") + + // AzureCosmosDBRequestBodySizeKey is the attribute Key conforming to the + // "azure.cosmosdb.request.body.size" semantic conventions. It represents the + // request payload size in bytes. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + AzureCosmosDBRequestBodySizeKey = attribute.Key("azure.cosmosdb.request.body.size") + + // AzureCosmosDBResponseSubStatusCodeKey is the attribute Key conforming to the + // "azure.cosmosdb.response.sub_status_code" semantic conventions. It represents + // the cosmos DB sub status code. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1000, 1002 + AzureCosmosDBResponseSubStatusCodeKey = attribute.Key("azure.cosmosdb.response.sub_status_code") +) + +// AzureClientID returns an attribute KeyValue conforming to the +// "azure.client.id" semantic conventions. It represents the unique identifier of +// the client instance. +func AzureClientID(val string) attribute.KeyValue { + return AzureClientIDKey.String(val) +} + +// AzureCosmosDBOperationContactedRegions returns an attribute KeyValue +// conforming to the "azure.cosmosdb.operation.contacted_regions" semantic +// conventions. It represents the list of regions contacted during operation in +// the order that they were contacted. If there is more than one region listed, +// it indicates that the operation was performed on multiple regions i.e. +// cross-regional call. +func AzureCosmosDBOperationContactedRegions(val ...string) attribute.KeyValue { + return AzureCosmosDBOperationContactedRegionsKey.StringSlice(val) +} + +// AzureCosmosDBOperationRequestCharge returns an attribute KeyValue conforming +// to the "azure.cosmosdb.operation.request_charge" semantic conventions. It +// represents the number of request units consumed by the operation. +func AzureCosmosDBOperationRequestCharge(val float64) attribute.KeyValue { + return AzureCosmosDBOperationRequestChargeKey.Float64(val) +} + +// AzureCosmosDBRequestBodySize returns an attribute KeyValue conforming to the +// "azure.cosmosdb.request.body.size" semantic conventions. It represents the +// request payload size in bytes. +func AzureCosmosDBRequestBodySize(val int) attribute.KeyValue { + return AzureCosmosDBRequestBodySizeKey.Int(val) +} + +// AzureCosmosDBResponseSubStatusCode returns an attribute KeyValue conforming to +// the "azure.cosmosdb.response.sub_status_code" semantic conventions. It +// represents the cosmos DB sub status code. +func AzureCosmosDBResponseSubStatusCode(val int) attribute.KeyValue { + return AzureCosmosDBResponseSubStatusCodeKey.Int(val) +} + +// Enum values for azure.cosmosdb.connection.mode +var ( + // Gateway (HTTP) connection. + // Stability: development + AzureCosmosDBConnectionModeGateway = AzureCosmosDBConnectionModeKey.String("gateway") + // Direct connection. + // Stability: development + AzureCosmosDBConnectionModeDirect = AzureCosmosDBConnectionModeKey.String("direct") +) + +// Enum values for azure.cosmosdb.consistency.level +var ( + // strong + // Stability: development + AzureCosmosDBConsistencyLevelStrong = AzureCosmosDBConsistencyLevelKey.String("Strong") + // bounded_staleness + // Stability: development + AzureCosmosDBConsistencyLevelBoundedStaleness = AzureCosmosDBConsistencyLevelKey.String("BoundedStaleness") + // session + // Stability: development + AzureCosmosDBConsistencyLevelSession = AzureCosmosDBConsistencyLevelKey.String("Session") + // eventual + // Stability: development + AzureCosmosDBConsistencyLevelEventual = AzureCosmosDBConsistencyLevelKey.String("Eventual") + // consistent_prefix + // Stability: development + AzureCosmosDBConsistencyLevelConsistentPrefix = AzureCosmosDBConsistencyLevelKey.String("ConsistentPrefix") +) + +// Namespace: browser +const ( + // BrowserBrandsKey is the attribute Key conforming to the "browser.brands" + // semantic conventions. It represents the array of brand name and version + // separated by a space. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: " Not A;Brand 99", "Chromium 99", "Chrome 99" + // Note: This value is intended to be taken from the [UA client hints API] ( + // `navigator.userAgentData.brands`). + // + // [UA client hints API]: https://wicg.github.io/ua-client-hints/#interface + BrowserBrandsKey = attribute.Key("browser.brands") + + // BrowserLanguageKey is the attribute Key conforming to the "browser.language" + // semantic conventions. It represents the preferred language of the user using + // the browser. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "en", "en-US", "fr", "fr-FR" + // Note: This value is intended to be taken from the Navigator API + // `navigator.language`. + BrowserLanguageKey = attribute.Key("browser.language") + + // BrowserMobileKey is the attribute Key conforming to the "browser.mobile" + // semantic conventions. It represents a boolean that is true if the browser is + // running on a mobile device. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: This value is intended to be taken from the [UA client hints API] ( + // `navigator.userAgentData.mobile`). If unavailable, this attribute SHOULD be + // left unset. + // + // [UA client hints API]: https://wicg.github.io/ua-client-hints/#interface + BrowserMobileKey = attribute.Key("browser.mobile") + + // BrowserPlatformKey is the attribute Key conforming to the "browser.platform" + // semantic conventions. It represents the platform on which the browser is + // running. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Windows", "macOS", "Android" + // Note: This value is intended to be taken from the [UA client hints API] ( + // `navigator.userAgentData.platform`). If unavailable, the legacy + // `navigator.platform` API SHOULD NOT be used instead and this attribute SHOULD + // be left unset in order for the values to be consistent. + // The list of possible values is defined in the + // [W3C User-Agent Client Hints specification]. Note that some (but not all) of + // these values can overlap with values in the + // [`os.type` and `os.name` attributes]. However, for consistency, the values in + // the `browser.platform` attribute should capture the exact value that the user + // agent provides. + // + // [UA client hints API]: https://wicg.github.io/ua-client-hints/#interface + // [W3C User-Agent Client Hints specification]: https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform + // [`os.type` and `os.name` attributes]: ./os.md + BrowserPlatformKey = attribute.Key("browser.platform") +) + +// BrowserBrands returns an attribute KeyValue conforming to the "browser.brands" +// semantic conventions. It represents the array of brand name and version +// separated by a space. +func BrowserBrands(val ...string) attribute.KeyValue { + return BrowserBrandsKey.StringSlice(val) +} + +// BrowserLanguage returns an attribute KeyValue conforming to the +// "browser.language" semantic conventions. It represents the preferred language +// of the user using the browser. +func BrowserLanguage(val string) attribute.KeyValue { + return BrowserLanguageKey.String(val) +} + +// BrowserMobile returns an attribute KeyValue conforming to the "browser.mobile" +// semantic conventions. It represents a boolean that is true if the browser is +// running on a mobile device. +func BrowserMobile(val bool) attribute.KeyValue { + return BrowserMobileKey.Bool(val) +} + +// BrowserPlatform returns an attribute KeyValue conforming to the +// "browser.platform" semantic conventions. It represents the platform on which +// the browser is running. +func BrowserPlatform(val string) attribute.KeyValue { + return BrowserPlatformKey.String(val) +} + +// Namespace: cassandra +const ( + // CassandraConsistencyLevelKey is the attribute Key conforming to the + // "cassandra.consistency.level" semantic conventions. It represents the + // consistency level of the query. Based on consistency values from [CQL]. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // + // [CQL]: https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlConfigConsistency.html + CassandraConsistencyLevelKey = attribute.Key("cassandra.consistency.level") + + // CassandraCoordinatorDCKey is the attribute Key conforming to the + // "cassandra.coordinator.dc" semantic conventions. It represents the data + // center of the coordinating node for a query. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: us-west-2 + CassandraCoordinatorDCKey = attribute.Key("cassandra.coordinator.dc") + + // CassandraCoordinatorIDKey is the attribute Key conforming to the + // "cassandra.coordinator.id" semantic conventions. It represents the ID of the + // coordinating node for a query. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: be13faa2-8574-4d71-926d-27f16cf8a7af + CassandraCoordinatorIDKey = attribute.Key("cassandra.coordinator.id") + + // CassandraPageSizeKey is the attribute Key conforming to the + // "cassandra.page.size" semantic conventions. It represents the fetch size used + // for paging, i.e. how many rows will be returned at once. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 5000 + CassandraPageSizeKey = attribute.Key("cassandra.page.size") + + // CassandraQueryIdempotentKey is the attribute Key conforming to the + // "cassandra.query.idempotent" semantic conventions. It represents the whether + // or not the query is idempotent. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + CassandraQueryIdempotentKey = attribute.Key("cassandra.query.idempotent") + + // CassandraSpeculativeExecutionCountKey is the attribute Key conforming to the + // "cassandra.speculative_execution.count" semantic conventions. It represents + // the number of times a query was speculatively executed. Not set or `0` if the + // query was not executed speculatively. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 0, 2 + CassandraSpeculativeExecutionCountKey = attribute.Key("cassandra.speculative_execution.count") +) + +// CassandraCoordinatorDC returns an attribute KeyValue conforming to the +// "cassandra.coordinator.dc" semantic conventions. It represents the data center +// of the coordinating node for a query. +func CassandraCoordinatorDC(val string) attribute.KeyValue { + return CassandraCoordinatorDCKey.String(val) +} + +// CassandraCoordinatorID returns an attribute KeyValue conforming to the +// "cassandra.coordinator.id" semantic conventions. It represents the ID of the +// coordinating node for a query. +func CassandraCoordinatorID(val string) attribute.KeyValue { + return CassandraCoordinatorIDKey.String(val) +} + +// CassandraPageSize returns an attribute KeyValue conforming to the +// "cassandra.page.size" semantic conventions. It represents the fetch size used +// for paging, i.e. how many rows will be returned at once. +func CassandraPageSize(val int) attribute.KeyValue { + return CassandraPageSizeKey.Int(val) +} + +// CassandraQueryIdempotent returns an attribute KeyValue conforming to the +// "cassandra.query.idempotent" semantic conventions. It represents the whether +// or not the query is idempotent. +func CassandraQueryIdempotent(val bool) attribute.KeyValue { + return CassandraQueryIdempotentKey.Bool(val) +} + +// CassandraSpeculativeExecutionCount returns an attribute KeyValue conforming to +// the "cassandra.speculative_execution.count" semantic conventions. It +// represents the number of times a query was speculatively executed. Not set or +// `0` if the query was not executed speculatively. +func CassandraSpeculativeExecutionCount(val int) attribute.KeyValue { + return CassandraSpeculativeExecutionCountKey.Int(val) +} + +// Enum values for cassandra.consistency.level +var ( + // all + // Stability: development + CassandraConsistencyLevelAll = CassandraConsistencyLevelKey.String("all") + // each_quorum + // Stability: development + CassandraConsistencyLevelEachQuorum = CassandraConsistencyLevelKey.String("each_quorum") + // quorum + // Stability: development + CassandraConsistencyLevelQuorum = CassandraConsistencyLevelKey.String("quorum") + // local_quorum + // Stability: development + CassandraConsistencyLevelLocalQuorum = CassandraConsistencyLevelKey.String("local_quorum") + // one + // Stability: development + CassandraConsistencyLevelOne = CassandraConsistencyLevelKey.String("one") + // two + // Stability: development + CassandraConsistencyLevelTwo = CassandraConsistencyLevelKey.String("two") + // three + // Stability: development + CassandraConsistencyLevelThree = CassandraConsistencyLevelKey.String("three") + // local_one + // Stability: development + CassandraConsistencyLevelLocalOne = CassandraConsistencyLevelKey.String("local_one") + // any + // Stability: development + CassandraConsistencyLevelAny = CassandraConsistencyLevelKey.String("any") + // serial + // Stability: development + CassandraConsistencyLevelSerial = CassandraConsistencyLevelKey.String("serial") + // local_serial + // Stability: development + CassandraConsistencyLevelLocalSerial = CassandraConsistencyLevelKey.String("local_serial") +) + +// Namespace: cicd +const ( + // CICDPipelineNameKey is the attribute Key conforming to the + // "cicd.pipeline.name" semantic conventions. It represents the human readable + // name of the pipeline within a CI/CD system. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Build and Test", "Lint", "Deploy Go Project", + // "deploy_to_environment" + CICDPipelineNameKey = attribute.Key("cicd.pipeline.name") + + // CICDPipelineResultKey is the attribute Key conforming to the + // "cicd.pipeline.result" semantic conventions. It represents the result of a + // pipeline run. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "success", "failure", "timeout", "skipped" + CICDPipelineResultKey = attribute.Key("cicd.pipeline.result") + + // CICDPipelineRunIDKey is the attribute Key conforming to the + // "cicd.pipeline.run.id" semantic conventions. It represents the unique + // identifier of a pipeline run within a CI/CD system. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "120912" + CICDPipelineRunIDKey = attribute.Key("cicd.pipeline.run.id") + + // CICDPipelineRunStateKey is the attribute Key conforming to the + // "cicd.pipeline.run.state" semantic conventions. It represents the pipeline + // run goes through these states during its lifecycle. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "pending", "executing", "finalizing" + CICDPipelineRunStateKey = attribute.Key("cicd.pipeline.run.state") + + // CICDPipelineTaskNameKey is the attribute Key conforming to the + // "cicd.pipeline.task.name" semantic conventions. It represents the human + // readable name of a task within a pipeline. Task here most closely aligns with + // a [computing process] in a pipeline. Other terms for tasks include commands, + // steps, and procedures. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Run GoLang Linter", "Go Build", "go-test", "deploy_binary" + // + // [computing process]: https://wikipedia.org/wiki/Pipeline_(computing) + CICDPipelineTaskNameKey = attribute.Key("cicd.pipeline.task.name") + + // CICDPipelineTaskRunIDKey is the attribute Key conforming to the + // "cicd.pipeline.task.run.id" semantic conventions. It represents the unique + // identifier of a task run within a pipeline. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "12097" + CICDPipelineTaskRunIDKey = attribute.Key("cicd.pipeline.task.run.id") + + // CICDPipelineTaskRunURLFullKey is the attribute Key conforming to the + // "cicd.pipeline.task.run.url.full" semantic conventions. It represents the + // [URL] of the pipeline run providing the complete address in order to locate + // and identify the pipeline run. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "https://github.com/open-telemetry/semantic-conventions/actions/runs/9753949763/job/26920038674?pr=1075" + // + // [URL]: https://wikipedia.org/wiki/URL + CICDPipelineTaskRunURLFullKey = attribute.Key("cicd.pipeline.task.run.url.full") + + // CICDPipelineTaskTypeKey is the attribute Key conforming to the + // "cicd.pipeline.task.type" semantic conventions. It represents the type of the + // task within a pipeline. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "build", "test", "deploy" + CICDPipelineTaskTypeKey = attribute.Key("cicd.pipeline.task.type") + + // CICDSystemComponentKey is the attribute Key conforming to the + // "cicd.system.component" semantic conventions. It represents the name of a + // component of the CICD system. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "controller", "scheduler", "agent" + CICDSystemComponentKey = attribute.Key("cicd.system.component") + + // CICDWorkerStateKey is the attribute Key conforming to the "cicd.worker.state" + // semantic conventions. It represents the state of a CICD worker / agent. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "idle", "busy", "down" + CICDWorkerStateKey = attribute.Key("cicd.worker.state") +) + +// CICDPipelineName returns an attribute KeyValue conforming to the +// "cicd.pipeline.name" semantic conventions. It represents the human readable +// name of the pipeline within a CI/CD system. +func CICDPipelineName(val string) attribute.KeyValue { + return CICDPipelineNameKey.String(val) +} + +// CICDPipelineRunID returns an attribute KeyValue conforming to the +// "cicd.pipeline.run.id" semantic conventions. It represents the unique +// identifier of a pipeline run within a CI/CD system. +func CICDPipelineRunID(val string) attribute.KeyValue { + return CICDPipelineRunIDKey.String(val) +} + +// CICDPipelineTaskName returns an attribute KeyValue conforming to the +// "cicd.pipeline.task.name" semantic conventions. It represents the human +// readable name of a task within a pipeline. Task here most closely aligns with +// a [computing process] in a pipeline. Other terms for tasks include commands, +// steps, and procedures. +// +// [computing process]: https://wikipedia.org/wiki/Pipeline_(computing) +func CICDPipelineTaskName(val string) attribute.KeyValue { + return CICDPipelineTaskNameKey.String(val) +} + +// CICDPipelineTaskRunID returns an attribute KeyValue conforming to the +// "cicd.pipeline.task.run.id" semantic conventions. It represents the unique +// identifier of a task run within a pipeline. +func CICDPipelineTaskRunID(val string) attribute.KeyValue { + return CICDPipelineTaskRunIDKey.String(val) +} + +// CICDPipelineTaskRunURLFull returns an attribute KeyValue conforming to the +// "cicd.pipeline.task.run.url.full" semantic conventions. It represents the +// [URL] of the pipeline run providing the complete address in order to locate +// and identify the pipeline run. +// +// [URL]: https://wikipedia.org/wiki/URL +func CICDPipelineTaskRunURLFull(val string) attribute.KeyValue { + return CICDPipelineTaskRunURLFullKey.String(val) +} + +// CICDSystemComponent returns an attribute KeyValue conforming to the +// "cicd.system.component" semantic conventions. It represents the name of a +// component of the CICD system. +func CICDSystemComponent(val string) attribute.KeyValue { + return CICDSystemComponentKey.String(val) +} + +// Enum values for cicd.pipeline.result +var ( + // The pipeline run finished successfully. + // Stability: development + CICDPipelineResultSuccess = CICDPipelineResultKey.String("success") + // The pipeline run did not finish successfully, eg. due to a compile error or a + // failing test. Such failures are usually detected by non-zero exit codes of + // the tools executed in the pipeline run. + // Stability: development + CICDPipelineResultFailure = CICDPipelineResultKey.String("failure") + // The pipeline run failed due to an error in the CICD system, eg. due to the + // worker being killed. + // Stability: development + CICDPipelineResultError = CICDPipelineResultKey.String("error") + // A timeout caused the pipeline run to be interrupted. + // Stability: development + CICDPipelineResultTimeout = CICDPipelineResultKey.String("timeout") + // The pipeline run was cancelled, eg. by a user manually cancelling the + // pipeline run. + // Stability: development + CICDPipelineResultCancellation = CICDPipelineResultKey.String("cancellation") + // The pipeline run was skipped, eg. due to a precondition not being met. + // Stability: development + CICDPipelineResultSkip = CICDPipelineResultKey.String("skip") +) + +// Enum values for cicd.pipeline.run.state +var ( + // The run pending state spans from the event triggering the pipeline run until + // the execution of the run starts (eg. time spent in a queue, provisioning + // agents, creating run resources). + // + // Stability: development + CICDPipelineRunStatePending = CICDPipelineRunStateKey.String("pending") + // The executing state spans the execution of any run tasks (eg. build, test). + // Stability: development + CICDPipelineRunStateExecuting = CICDPipelineRunStateKey.String("executing") + // The finalizing state spans from when the run has finished executing (eg. + // cleanup of run resources). + // Stability: development + CICDPipelineRunStateFinalizing = CICDPipelineRunStateKey.String("finalizing") +) + +// Enum values for cicd.pipeline.task.type +var ( + // build + // Stability: development + CICDPipelineTaskTypeBuild = CICDPipelineTaskTypeKey.String("build") + // test + // Stability: development + CICDPipelineTaskTypeTest = CICDPipelineTaskTypeKey.String("test") + // deploy + // Stability: development + CICDPipelineTaskTypeDeploy = CICDPipelineTaskTypeKey.String("deploy") +) + +// Enum values for cicd.worker.state +var ( + // The worker is not performing work for the CICD system. It is available to the + // CICD system to perform work on (online / idle). + // Stability: development + CICDWorkerStateAvailable = CICDWorkerStateKey.String("available") + // The worker is performing work for the CICD system. + // Stability: development + CICDWorkerStateBusy = CICDWorkerStateKey.String("busy") + // The worker is not available to the CICD system (disconnected / down). + // Stability: development + CICDWorkerStateOffline = CICDWorkerStateKey.String("offline") +) + +// Namespace: client +const ( + // ClientAddressKey is the attribute Key conforming to the "client.address" + // semantic conventions. It represents the client address - domain name if + // available without reverse DNS lookup; otherwise, IP address or Unix domain + // socket name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "client.example.com", "10.1.2.80", "/tmp/my.sock" + // Note: When observed from the server side, and when communicating through an + // intermediary, `client.address` SHOULD represent the client address behind any + // intermediaries, for example proxies, if it's available. + ClientAddressKey = attribute.Key("client.address") + + // ClientPortKey is the attribute Key conforming to the "client.port" semantic + // conventions. It represents the client port number. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: 65123 + // Note: When observed from the server side, and when communicating through an + // intermediary, `client.port` SHOULD represent the client port behind any + // intermediaries, for example proxies, if it's available. + ClientPortKey = attribute.Key("client.port") +) + +// ClientAddress returns an attribute KeyValue conforming to the "client.address" +// semantic conventions. It represents the client address - domain name if +// available without reverse DNS lookup; otherwise, IP address or Unix domain +// socket name. +func ClientAddress(val string) attribute.KeyValue { + return ClientAddressKey.String(val) +} + +// ClientPort returns an attribute KeyValue conforming to the "client.port" +// semantic conventions. It represents the client port number. +func ClientPort(val int) attribute.KeyValue { + return ClientPortKey.Int(val) +} + +// Namespace: cloud +const ( + // CloudAccountIDKey is the attribute Key conforming to the "cloud.account.id" + // semantic conventions. It represents the cloud account ID the resource is + // assigned to. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "111111111111", "opentelemetry" + CloudAccountIDKey = attribute.Key("cloud.account.id") + + // CloudAvailabilityZoneKey is the attribute Key conforming to the + // "cloud.availability_zone" semantic conventions. It represents the cloud + // regions often have multiple, isolated locations known as zones to increase + // availability. Availability zone represents the zone where the resource is + // running. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "us-east-1c" + // Note: Availability zones are called "zones" on Alibaba Cloud and Google + // Cloud. + CloudAvailabilityZoneKey = attribute.Key("cloud.availability_zone") + + // CloudPlatformKey is the attribute Key conforming to the "cloud.platform" + // semantic conventions. It represents the cloud platform in use. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: The prefix of the service SHOULD match the one specified in + // `cloud.provider`. + CloudPlatformKey = attribute.Key("cloud.platform") + + // CloudProviderKey is the attribute Key conforming to the "cloud.provider" + // semantic conventions. It represents the name of the cloud provider. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + CloudProviderKey = attribute.Key("cloud.provider") + + // CloudRegionKey is the attribute Key conforming to the "cloud.region" semantic + // conventions. It represents the geographical region the resource is running. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "us-central1", "us-east-1" + // Note: Refer to your provider's docs to see the available regions, for example + // [Alibaba Cloud regions], [AWS regions], [Azure regions], + // [Google Cloud regions], or [Tencent Cloud regions]. + // + // [Alibaba Cloud regions]: https://www.alibabacloud.com/help/doc-detail/40654.htm + // [AWS regions]: https://aws.amazon.com/about-aws/global-infrastructure/regions_az/ + // [Azure regions]: https://azure.microsoft.com/global-infrastructure/geographies/ + // [Google Cloud regions]: https://cloud.google.com/about/locations + // [Tencent Cloud regions]: https://www.tencentcloud.com/document/product/213/6091 + CloudRegionKey = attribute.Key("cloud.region") + + // CloudResourceIDKey is the attribute Key conforming to the "cloud.resource_id" + // semantic conventions. It represents the cloud provider-specific native + // identifier of the monitored cloud resource (e.g. an [ARN] on AWS, a + // [fully qualified resource ID] on Azure, a [full resource name] on GCP). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function", + // "//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID", + // "/subscriptions//resourceGroups/ + // /providers/Microsoft.Web/sites//functions/" + // Note: On some cloud providers, it may not be possible to determine the full + // ID at startup, + // so it may be necessary to set `cloud.resource_id` as a span attribute + // instead. + // + // The exact value to use for `cloud.resource_id` depends on the cloud provider. + // The following well-known definitions MUST be used if you set this attribute + // and they apply: + // + // - **AWS Lambda:** The function [ARN]. + // Take care not to use the "invoked ARN" directly but replace any + // [alias suffix] + // with the resolved function version, as the same runtime instance may be + // invocable with + // multiple different aliases. + // - **GCP:** The [URI of the resource] + // - **Azure:** The [Fully Qualified Resource ID] of the invoked function, + // *not* the function app, having the form + // + // `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` + // . + // This means that a span attribute MUST be used, as an Azure function app + // can host multiple functions that would usually share + // a TracerProvider. + // + // + // [ARN]: https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html + // [fully qualified resource ID]: https://learn.microsoft.com/rest/api/resources/resources/get-by-id + // [full resource name]: https://cloud.google.com/apis/design/resource_names#full_resource_name + // [ARN]: https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html + // [alias suffix]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html + // [URI of the resource]: https://cloud.google.com/iam/docs/full-resource-names + // [Fully Qualified Resource ID]: https://docs.microsoft.com/rest/api/resources/resources/get-by-id + CloudResourceIDKey = attribute.Key("cloud.resource_id") +) + +// CloudAccountID returns an attribute KeyValue conforming to the +// "cloud.account.id" semantic conventions. It represents the cloud account ID +// the resource is assigned to. +func CloudAccountID(val string) attribute.KeyValue { + return CloudAccountIDKey.String(val) +} + +// CloudAvailabilityZone returns an attribute KeyValue conforming to the +// "cloud.availability_zone" semantic conventions. It represents the cloud +// regions often have multiple, isolated locations known as zones to increase +// availability. Availability zone represents the zone where the resource is +// running. +func CloudAvailabilityZone(val string) attribute.KeyValue { + return CloudAvailabilityZoneKey.String(val) +} + +// CloudRegion returns an attribute KeyValue conforming to the "cloud.region" +// semantic conventions. It represents the geographical region the resource is +// running. +func CloudRegion(val string) attribute.KeyValue { + return CloudRegionKey.String(val) +} + +// CloudResourceID returns an attribute KeyValue conforming to the +// "cloud.resource_id" semantic conventions. It represents the cloud +// provider-specific native identifier of the monitored cloud resource (e.g. an +// [ARN] on AWS, a [fully qualified resource ID] on Azure, a [full resource name] +// on GCP). +// +// [ARN]: https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html +// [fully qualified resource ID]: https://learn.microsoft.com/rest/api/resources/resources/get-by-id +// [full resource name]: https://cloud.google.com/apis/design/resource_names#full_resource_name +func CloudResourceID(val string) attribute.KeyValue { + return CloudResourceIDKey.String(val) +} + +// Enum values for cloud.platform +var ( + // Alibaba Cloud Elastic Compute Service + // Stability: development + CloudPlatformAlibabaCloudECS = CloudPlatformKey.String("alibaba_cloud_ecs") + // Alibaba Cloud Function Compute + // Stability: development + CloudPlatformAlibabaCloudFc = CloudPlatformKey.String("alibaba_cloud_fc") + // Red Hat OpenShift on Alibaba Cloud + // Stability: development + CloudPlatformAlibabaCloudOpenshift = CloudPlatformKey.String("alibaba_cloud_openshift") + // AWS Elastic Compute Cloud + // Stability: development + CloudPlatformAWSEC2 = CloudPlatformKey.String("aws_ec2") + // AWS Elastic Container Service + // Stability: development + CloudPlatformAWSECS = CloudPlatformKey.String("aws_ecs") + // AWS Elastic Kubernetes Service + // Stability: development + CloudPlatformAWSEKS = CloudPlatformKey.String("aws_eks") + // AWS Lambda + // Stability: development + CloudPlatformAWSLambda = CloudPlatformKey.String("aws_lambda") + // AWS Elastic Beanstalk + // Stability: development + CloudPlatformAWSElasticBeanstalk = CloudPlatformKey.String("aws_elastic_beanstalk") + // AWS App Runner + // Stability: development + CloudPlatformAWSAppRunner = CloudPlatformKey.String("aws_app_runner") + // Red Hat OpenShift on AWS (ROSA) + // Stability: development + CloudPlatformAWSOpenshift = CloudPlatformKey.String("aws_openshift") + // Azure Virtual Machines + // Stability: development + CloudPlatformAzureVM = CloudPlatformKey.String("azure_vm") + // Azure Container Apps + // Stability: development + CloudPlatformAzureContainerApps = CloudPlatformKey.String("azure_container_apps") + // Azure Container Instances + // Stability: development + CloudPlatformAzureContainerInstances = CloudPlatformKey.String("azure_container_instances") + // Azure Kubernetes Service + // Stability: development + CloudPlatformAzureAKS = CloudPlatformKey.String("azure_aks") + // Azure Functions + // Stability: development + CloudPlatformAzureFunctions = CloudPlatformKey.String("azure_functions") + // Azure App Service + // Stability: development + CloudPlatformAzureAppService = CloudPlatformKey.String("azure_app_service") + // Azure Red Hat OpenShift + // Stability: development + CloudPlatformAzureOpenshift = CloudPlatformKey.String("azure_openshift") + // Google Bare Metal Solution (BMS) + // Stability: development + CloudPlatformGCPBareMetalSolution = CloudPlatformKey.String("gcp_bare_metal_solution") + // Google Cloud Compute Engine (GCE) + // Stability: development + CloudPlatformGCPComputeEngine = CloudPlatformKey.String("gcp_compute_engine") + // Google Cloud Run + // Stability: development + CloudPlatformGCPCloudRun = CloudPlatformKey.String("gcp_cloud_run") + // Google Cloud Kubernetes Engine (GKE) + // Stability: development + CloudPlatformGCPKubernetesEngine = CloudPlatformKey.String("gcp_kubernetes_engine") + // Google Cloud Functions (GCF) + // Stability: development + CloudPlatformGCPCloudFunctions = CloudPlatformKey.String("gcp_cloud_functions") + // Google Cloud App Engine (GAE) + // Stability: development + CloudPlatformGCPAppEngine = CloudPlatformKey.String("gcp_app_engine") + // Red Hat OpenShift on Google Cloud + // Stability: development + CloudPlatformGCPOpenshift = CloudPlatformKey.String("gcp_openshift") + // Red Hat OpenShift on IBM Cloud + // Stability: development + CloudPlatformIbmCloudOpenshift = CloudPlatformKey.String("ibm_cloud_openshift") + // Compute on Oracle Cloud Infrastructure (OCI) + // Stability: development + CloudPlatformOracleCloudCompute = CloudPlatformKey.String("oracle_cloud_compute") + // Kubernetes Engine (OKE) on Oracle Cloud Infrastructure (OCI) + // Stability: development + CloudPlatformOracleCloudOke = CloudPlatformKey.String("oracle_cloud_oke") + // Tencent Cloud Cloud Virtual Machine (CVM) + // Stability: development + CloudPlatformTencentCloudCvm = CloudPlatformKey.String("tencent_cloud_cvm") + // Tencent Cloud Elastic Kubernetes Service (EKS) + // Stability: development + CloudPlatformTencentCloudEKS = CloudPlatformKey.String("tencent_cloud_eks") + // Tencent Cloud Serverless Cloud Function (SCF) + // Stability: development + CloudPlatformTencentCloudScf = CloudPlatformKey.String("tencent_cloud_scf") +) + +// Enum values for cloud.provider +var ( + // Alibaba Cloud + // Stability: development + CloudProviderAlibabaCloud = CloudProviderKey.String("alibaba_cloud") + // Amazon Web Services + // Stability: development + CloudProviderAWS = CloudProviderKey.String("aws") + // Microsoft Azure + // Stability: development + CloudProviderAzure = CloudProviderKey.String("azure") + // Google Cloud Platform + // Stability: development + CloudProviderGCP = CloudProviderKey.String("gcp") + // Heroku Platform as a Service + // Stability: development + CloudProviderHeroku = CloudProviderKey.String("heroku") + // IBM Cloud + // Stability: development + CloudProviderIbmCloud = CloudProviderKey.String("ibm_cloud") + // Oracle Cloud Infrastructure (OCI) + // Stability: development + CloudProviderOracleCloud = CloudProviderKey.String("oracle_cloud") + // Tencent Cloud + // Stability: development + CloudProviderTencentCloud = CloudProviderKey.String("tencent_cloud") +) + +// Namespace: cloudevents +const ( + // CloudeventsEventIDKey is the attribute Key conforming to the + // "cloudevents.event_id" semantic conventions. It represents the [event_id] + // uniquely identifies the event. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "123e4567-e89b-12d3-a456-426614174000", "0001" + // + // [event_id]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#id + CloudeventsEventIDKey = attribute.Key("cloudevents.event_id") + + // CloudeventsEventSourceKey is the attribute Key conforming to the + // "cloudevents.event_source" semantic conventions. It represents the [source] + // identifies the context in which an event happened. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "https://github.com/cloudevents", "/cloudevents/spec/pull/123", + // "my-service" + // + // [source]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#source-1 + CloudeventsEventSourceKey = attribute.Key("cloudevents.event_source") + + // CloudeventsEventSpecVersionKey is the attribute Key conforming to the + // "cloudevents.event_spec_version" semantic conventions. It represents the + // [version of the CloudEvents specification] which the event uses. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1.0 + // + // [version of the CloudEvents specification]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#specversion + CloudeventsEventSpecVersionKey = attribute.Key("cloudevents.event_spec_version") + + // CloudeventsEventSubjectKey is the attribute Key conforming to the + // "cloudevents.event_subject" semantic conventions. It represents the [subject] + // of the event in the context of the event producer (identified by source). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: mynewfile.jpg + // + // [subject]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#subject + CloudeventsEventSubjectKey = attribute.Key("cloudevents.event_subject") + + // CloudeventsEventTypeKey is the attribute Key conforming to the + // "cloudevents.event_type" semantic conventions. It represents the [event_type] + // contains a value describing the type of event related to the originating + // occurrence. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "com.github.pull_request.opened", "com.example.object.deleted.v2" + // + // [event_type]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#type + CloudeventsEventTypeKey = attribute.Key("cloudevents.event_type") +) + +// CloudeventsEventID returns an attribute KeyValue conforming to the +// "cloudevents.event_id" semantic conventions. It represents the [event_id] +// uniquely identifies the event. +// +// [event_id]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#id +func CloudeventsEventID(val string) attribute.KeyValue { + return CloudeventsEventIDKey.String(val) +} + +// CloudeventsEventSource returns an attribute KeyValue conforming to the +// "cloudevents.event_source" semantic conventions. It represents the [source] +// identifies the context in which an event happened. +// +// [source]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#source-1 +func CloudeventsEventSource(val string) attribute.KeyValue { + return CloudeventsEventSourceKey.String(val) +} + +// CloudeventsEventSpecVersion returns an attribute KeyValue conforming to the +// "cloudevents.event_spec_version" semantic conventions. It represents the +// [version of the CloudEvents specification] which the event uses. +// +// [version of the CloudEvents specification]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#specversion +func CloudeventsEventSpecVersion(val string) attribute.KeyValue { + return CloudeventsEventSpecVersionKey.String(val) +} + +// CloudeventsEventSubject returns an attribute KeyValue conforming to the +// "cloudevents.event_subject" semantic conventions. It represents the [subject] +// of the event in the context of the event producer (identified by source). +// +// [subject]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#subject +func CloudeventsEventSubject(val string) attribute.KeyValue { + return CloudeventsEventSubjectKey.String(val) +} + +// CloudeventsEventType returns an attribute KeyValue conforming to the +// "cloudevents.event_type" semantic conventions. It represents the [event_type] +// contains a value describing the type of event related to the originating +// occurrence. +// +// [event_type]: https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#type +func CloudeventsEventType(val string) attribute.KeyValue { + return CloudeventsEventTypeKey.String(val) +} + +// Namespace: cloudfoundry +const ( + // CloudfoundryAppIDKey is the attribute Key conforming to the + // "cloudfoundry.app.id" semantic conventions. It represents the guid of the + // application. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "218fc5a9-a5f1-4b54-aa05-46717d0ab26d" + // Note: Application instrumentation should use the value from environment + // variable `VCAP_APPLICATION.application_id`. This is the same value as + // reported by `cf app --guid`. + CloudfoundryAppIDKey = attribute.Key("cloudfoundry.app.id") + + // CloudfoundryAppInstanceIDKey is the attribute Key conforming to the + // "cloudfoundry.app.instance.id" semantic conventions. It represents the index + // of the application instance. 0 when just one instance is active. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "0", "1" + // Note: CloudFoundry defines the `instance_id` in the [Loggregator v2 envelope] + // . + // It is used for logs and metrics emitted by CloudFoundry. It is + // supposed to contain the application instance index for applications + // deployed on the runtime. + // + // Application instrumentation should use the value from environment + // variable `CF_INSTANCE_INDEX`. + // + // [Loggregator v2 envelope]: https://github.com/cloudfoundry/loggregator-api#v2-envelope + CloudfoundryAppInstanceIDKey = attribute.Key("cloudfoundry.app.instance.id") + + // CloudfoundryAppNameKey is the attribute Key conforming to the + // "cloudfoundry.app.name" semantic conventions. It represents the name of the + // application. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-app-name" + // Note: Application instrumentation should use the value from environment + // variable `VCAP_APPLICATION.application_name`. This is the same value + // as reported by `cf apps`. + CloudfoundryAppNameKey = attribute.Key("cloudfoundry.app.name") + + // CloudfoundryOrgIDKey is the attribute Key conforming to the + // "cloudfoundry.org.id" semantic conventions. It represents the guid of the + // CloudFoundry org the application is running in. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "218fc5a9-a5f1-4b54-aa05-46717d0ab26d" + // Note: Application instrumentation should use the value from environment + // variable `VCAP_APPLICATION.org_id`. This is the same value as + // reported by `cf org --guid`. + CloudfoundryOrgIDKey = attribute.Key("cloudfoundry.org.id") + + // CloudfoundryOrgNameKey is the attribute Key conforming to the + // "cloudfoundry.org.name" semantic conventions. It represents the name of the + // CloudFoundry organization the app is running in. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-org-name" + // Note: Application instrumentation should use the value from environment + // variable `VCAP_APPLICATION.org_name`. This is the same value as + // reported by `cf orgs`. + CloudfoundryOrgNameKey = attribute.Key("cloudfoundry.org.name") + + // CloudfoundryProcessIDKey is the attribute Key conforming to the + // "cloudfoundry.process.id" semantic conventions. It represents the UID + // identifying the process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "218fc5a9-a5f1-4b54-aa05-46717d0ab26d" + // Note: Application instrumentation should use the value from environment + // variable `VCAP_APPLICATION.process_id`. It is supposed to be equal to + // `VCAP_APPLICATION.app_id` for applications deployed to the runtime. + // For system components, this could be the actual PID. + CloudfoundryProcessIDKey = attribute.Key("cloudfoundry.process.id") + + // CloudfoundryProcessTypeKey is the attribute Key conforming to the + // "cloudfoundry.process.type" semantic conventions. It represents the type of + // process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "web" + // Note: CloudFoundry applications can consist of multiple jobs. Usually the + // main process will be of type `web`. There can be additional background + // tasks or side-cars with different process types. + CloudfoundryProcessTypeKey = attribute.Key("cloudfoundry.process.type") + + // CloudfoundrySpaceIDKey is the attribute Key conforming to the + // "cloudfoundry.space.id" semantic conventions. It represents the guid of the + // CloudFoundry space the application is running in. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "218fc5a9-a5f1-4b54-aa05-46717d0ab26d" + // Note: Application instrumentation should use the value from environment + // variable `VCAP_APPLICATION.space_id`. This is the same value as + // reported by `cf space --guid`. + CloudfoundrySpaceIDKey = attribute.Key("cloudfoundry.space.id") + + // CloudfoundrySpaceNameKey is the attribute Key conforming to the + // "cloudfoundry.space.name" semantic conventions. It represents the name of the + // CloudFoundry space the application is running in. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-space-name" + // Note: Application instrumentation should use the value from environment + // variable `VCAP_APPLICATION.space_name`. This is the same value as + // reported by `cf spaces`. + CloudfoundrySpaceNameKey = attribute.Key("cloudfoundry.space.name") + + // CloudfoundrySystemIDKey is the attribute Key conforming to the + // "cloudfoundry.system.id" semantic conventions. It represents a guid or + // another name describing the event source. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "cf/gorouter" + // Note: CloudFoundry defines the `source_id` in the [Loggregator v2 envelope]. + // It is used for logs and metrics emitted by CloudFoundry. It is + // supposed to contain the component name, e.g. "gorouter", for + // CloudFoundry components. + // + // When system components are instrumented, values from the + // [Bosh spec] + // should be used. The `system.id` should be set to + // `spec.deployment/spec.name`. + // + // [Loggregator v2 envelope]: https://github.com/cloudfoundry/loggregator-api#v2-envelope + // [Bosh spec]: https://bosh.io/docs/jobs/#properties-spec + CloudfoundrySystemIDKey = attribute.Key("cloudfoundry.system.id") + + // CloudfoundrySystemInstanceIDKey is the attribute Key conforming to the + // "cloudfoundry.system.instance.id" semantic conventions. It represents a guid + // describing the concrete instance of the event source. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "218fc5a9-a5f1-4b54-aa05-46717d0ab26d" + // Note: CloudFoundry defines the `instance_id` in the [Loggregator v2 envelope] + // . + // It is used for logs and metrics emitted by CloudFoundry. It is + // supposed to contain the vm id for CloudFoundry components. + // + // When system components are instrumented, values from the + // [Bosh spec] + // should be used. The `system.instance.id` should be set to `spec.id`. + // + // [Loggregator v2 envelope]: https://github.com/cloudfoundry/loggregator-api#v2-envelope + // [Bosh spec]: https://bosh.io/docs/jobs/#properties-spec + CloudfoundrySystemInstanceIDKey = attribute.Key("cloudfoundry.system.instance.id") +) + +// CloudfoundryAppID returns an attribute KeyValue conforming to the +// "cloudfoundry.app.id" semantic conventions. It represents the guid of the +// application. +func CloudfoundryAppID(val string) attribute.KeyValue { + return CloudfoundryAppIDKey.String(val) +} + +// CloudfoundryAppInstanceID returns an attribute KeyValue conforming to the +// "cloudfoundry.app.instance.id" semantic conventions. It represents the index +// of the application instance. 0 when just one instance is active. +func CloudfoundryAppInstanceID(val string) attribute.KeyValue { + return CloudfoundryAppInstanceIDKey.String(val) +} + +// CloudfoundryAppName returns an attribute KeyValue conforming to the +// "cloudfoundry.app.name" semantic conventions. It represents the name of the +// application. +func CloudfoundryAppName(val string) attribute.KeyValue { + return CloudfoundryAppNameKey.String(val) +} + +// CloudfoundryOrgID returns an attribute KeyValue conforming to the +// "cloudfoundry.org.id" semantic conventions. It represents the guid of the +// CloudFoundry org the application is running in. +func CloudfoundryOrgID(val string) attribute.KeyValue { + return CloudfoundryOrgIDKey.String(val) +} + +// CloudfoundryOrgName returns an attribute KeyValue conforming to the +// "cloudfoundry.org.name" semantic conventions. It represents the name of the +// CloudFoundry organization the app is running in. +func CloudfoundryOrgName(val string) attribute.KeyValue { + return CloudfoundryOrgNameKey.String(val) +} + +// CloudfoundryProcessID returns an attribute KeyValue conforming to the +// "cloudfoundry.process.id" semantic conventions. It represents the UID +// identifying the process. +func CloudfoundryProcessID(val string) attribute.KeyValue { + return CloudfoundryProcessIDKey.String(val) +} + +// CloudfoundryProcessType returns an attribute KeyValue conforming to the +// "cloudfoundry.process.type" semantic conventions. It represents the type of +// process. +func CloudfoundryProcessType(val string) attribute.KeyValue { + return CloudfoundryProcessTypeKey.String(val) +} + +// CloudfoundrySpaceID returns an attribute KeyValue conforming to the +// "cloudfoundry.space.id" semantic conventions. It represents the guid of the +// CloudFoundry space the application is running in. +func CloudfoundrySpaceID(val string) attribute.KeyValue { + return CloudfoundrySpaceIDKey.String(val) +} + +// CloudfoundrySpaceName returns an attribute KeyValue conforming to the +// "cloudfoundry.space.name" semantic conventions. It represents the name of the +// CloudFoundry space the application is running in. +func CloudfoundrySpaceName(val string) attribute.KeyValue { + return CloudfoundrySpaceNameKey.String(val) +} + +// CloudfoundrySystemID returns an attribute KeyValue conforming to the +// "cloudfoundry.system.id" semantic conventions. It represents a guid or another +// name describing the event source. +func CloudfoundrySystemID(val string) attribute.KeyValue { + return CloudfoundrySystemIDKey.String(val) +} + +// CloudfoundrySystemInstanceID returns an attribute KeyValue conforming to the +// "cloudfoundry.system.instance.id" semantic conventions. It represents a guid +// describing the concrete instance of the event source. +func CloudfoundrySystemInstanceID(val string) attribute.KeyValue { + return CloudfoundrySystemInstanceIDKey.String(val) +} + +// Namespace: code +const ( + // CodeColumnNumberKey is the attribute Key conforming to the + // "code.column.number" semantic conventions. It represents the column number in + // `code.file.path` best representing the operation. It SHOULD point within the + // code unit named in `code.function.name`. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + CodeColumnNumberKey = attribute.Key("code.column.number") + + // CodeFilePathKey is the attribute Key conforming to the "code.file.path" + // semantic conventions. It represents the source code file name that identifies + // the code unit as uniquely as possible (preferably an absolute file path). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: /usr/local/MyApplication/content_root/app/index.php + CodeFilePathKey = attribute.Key("code.file.path") + + // CodeFilepathKey is the attribute Key conforming to the "code.filepath" + // semantic conventions. It represents the deprecated, use `code.file.path` + // instead. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: /usr/local/MyApplication/content_root/app/index.php + CodeFilepathKey = attribute.Key("code.filepath") + + // CodeFunctionNameKey is the attribute Key conforming to the + // "code.function.name" semantic conventions. It represents the method or + // function name, or equivalent (usually rightmost part of the code unit's + // name). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: serveRequest + CodeFunctionNameKey = attribute.Key("code.function.name") + + // CodeLineNumberKey is the attribute Key conforming to the "code.line.number" + // semantic conventions. It represents the line number in `code.file.path` best + // representing the operation. It SHOULD point within the code unit named in + // `code.function.name`. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + CodeLineNumberKey = attribute.Key("code.line.number") + + // CodeNamespaceKey is the attribute Key conforming to the "code.namespace" + // semantic conventions. It represents the "namespace" within which + // `code.function.name` is defined. Usually the qualified class or module name, + // such that `code.namespace` + some separator + `code.function.name` form a + // unique identifier for the code unit. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: com.example.MyHttpService + CodeNamespaceKey = attribute.Key("code.namespace") + + // CodeStacktraceKey is the attribute Key conforming to the "code.stacktrace" + // semantic conventions. It represents a stacktrace as a string in the natural + // representation for the language runtime. The representation is to be + // determined and documented by each language SIG. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n at + // com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n at + // com.example.GenerateTrace.main(GenerateTrace.java:5) + CodeStacktraceKey = attribute.Key("code.stacktrace") +) + +// CodeColumnNumber returns an attribute KeyValue conforming to the +// "code.column.number" semantic conventions. It represents the column number in +// `code.file.path` best representing the operation. It SHOULD point within the +// code unit named in `code.function.name`. +func CodeColumnNumber(val int) attribute.KeyValue { + return CodeColumnNumberKey.Int(val) +} + +// CodeFilePath returns an attribute KeyValue conforming to the "code.file.path" +// semantic conventions. It represents the source code file name that identifies +// the code unit as uniquely as possible (preferably an absolute file path). +func CodeFilePath(val string) attribute.KeyValue { + return CodeFilePathKey.String(val) +} + +// CodeFilepath returns an attribute KeyValue conforming to the "code.filepath" +// semantic conventions. It represents the deprecated, use `code.file.path` +// instead. +func CodeFilepath(val string) attribute.KeyValue { + return CodeFilepathKey.String(val) +} + +// CodeFunctionName returns an attribute KeyValue conforming to the +// "code.function.name" semantic conventions. It represents the method or +// function name, or equivalent (usually rightmost part of the code unit's name). +func CodeFunctionName(val string) attribute.KeyValue { + return CodeFunctionNameKey.String(val) +} + +// CodeLineNumber returns an attribute KeyValue conforming to the +// "code.line.number" semantic conventions. It represents the line number in +// `code.file.path` best representing the operation. It SHOULD point within the +// code unit named in `code.function.name`. +func CodeLineNumber(val int) attribute.KeyValue { + return CodeLineNumberKey.Int(val) +} + +// CodeNamespace returns an attribute KeyValue conforming to the "code.namespace" +// semantic conventions. It represents the "namespace" within which +// `code.function.name` is defined. Usually the qualified class or module name, +// such that `code.namespace` + some separator + `code.function.name` form a +// unique identifier for the code unit. +func CodeNamespace(val string) attribute.KeyValue { + return CodeNamespaceKey.String(val) +} + +// CodeStacktrace returns an attribute KeyValue conforming to the +// "code.stacktrace" semantic conventions. It represents a stacktrace as a string +// in the natural representation for the language runtime. The representation is +// to be determined and documented by each language SIG. +func CodeStacktrace(val string) attribute.KeyValue { + return CodeStacktraceKey.String(val) +} + +// Namespace: container +const ( + // ContainerCommandKey is the attribute Key conforming to the + // "container.command" semantic conventions. It represents the command used to + // run the container (i.e. the command name). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "otelcontribcol" + // Note: If using embedded credentials or sensitive data, it is recommended to + // remove them to prevent potential leakage. + ContainerCommandKey = attribute.Key("container.command") + + // ContainerCommandArgsKey is the attribute Key conforming to the + // "container.command_args" semantic conventions. It represents the all the + // command arguments (including the command/executable itself) run by the + // container. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "otelcontribcol", "--config", "config.yaml" + ContainerCommandArgsKey = attribute.Key("container.command_args") + + // ContainerCommandLineKey is the attribute Key conforming to the + // "container.command_line" semantic conventions. It represents the full command + // run by the container as a single string representing the full command. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "otelcontribcol --config config.yaml" + ContainerCommandLineKey = attribute.Key("container.command_line") + + // ContainerCsiPluginNameKey is the attribute Key conforming to the + // "container.csi.plugin.name" semantic conventions. It represents the name of + // the CSI ([Container Storage Interface]) plugin used by the volume. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "pd.csi.storage.gke.io" + // Note: This can sometimes be referred to as a "driver" in CSI implementations. + // This should represent the `name` field of the GetPluginInfo RPC. + // + // [Container Storage Interface]: https://github.com/container-storage-interface/spec + ContainerCsiPluginNameKey = attribute.Key("container.csi.plugin.name") + + // ContainerCsiVolumeIDKey is the attribute Key conforming to the + // "container.csi.volume.id" semantic conventions. It represents the unique + // volume ID returned by the CSI ([Container Storage Interface]) plugin. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "projects/my-gcp-project/zones/my-gcp-zone/disks/my-gcp-disk" + // Note: This can sometimes be referred to as a "volume handle" in CSI + // implementations. This should represent the `Volume.volume_id` field in CSI + // spec. + // + // [Container Storage Interface]: https://github.com/container-storage-interface/spec + ContainerCsiVolumeIDKey = attribute.Key("container.csi.volume.id") + + // ContainerIDKey is the attribute Key conforming to the "container.id" semantic + // conventions. It represents the container ID. Usually a UUID, as for example + // used to [identify Docker containers]. The UUID might be abbreviated. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "a3bf90e006b2" + // + // [identify Docker containers]: https://docs.docker.com/engine/containers/run/#container-identification + ContainerIDKey = attribute.Key("container.id") + + // ContainerImageIDKey is the attribute Key conforming to the + // "container.image.id" semantic conventions. It represents the runtime specific + // image identifier. Usually a hash algorithm followed by a UUID. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "sha256:19c92d0a00d1b66d897bceaa7319bee0dd38a10a851c60bcec9474aa3f01e50f" + // Note: Docker defines a sha256 of the image id; `container.image.id` + // corresponds to the `Image` field from the Docker container inspect [API] + // endpoint. + // K8s defines a link to the container registry repository with digest + // `"imageID": "registry.azurecr.io /namespace/service/dockerfile@sha256:bdeabd40c3a8a492eaf9e8e44d0ebbb84bac7ee25ac0cf8a7159d25f62555625"` + // . + // The ID is assigned by the container runtime and can vary in different + // environments. Consider using `oci.manifest.digest` if it is important to + // identify the same image in different environments/runtimes. + // + // [API]: https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerInspect + ContainerImageIDKey = attribute.Key("container.image.id") + + // ContainerImageNameKey is the attribute Key conforming to the + // "container.image.name" semantic conventions. It represents the name of the + // image the container was built on. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "gcr.io/opentelemetry/operator" + ContainerImageNameKey = attribute.Key("container.image.name") + + // ContainerImageRepoDigestsKey is the attribute Key conforming to the + // "container.image.repo_digests" semantic conventions. It represents the repo + // digests of the container image as provided by the container runtime. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb", + // "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578" + // Note: [Docker] and [CRI] report those under the `RepoDigests` field. + // + // [Docker]: https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect + // [CRI]: https://github.com/kubernetes/cri-api/blob/c75ef5b473bbe2d0a4fc92f82235efd665ea8e9f/pkg/apis/runtime/v1/api.proto#L1237-L1238 + ContainerImageRepoDigestsKey = attribute.Key("container.image.repo_digests") + + // ContainerImageTagsKey is the attribute Key conforming to the + // "container.image.tags" semantic conventions. It represents the container + // image tags. An example can be found in [Docker Image Inspect]. Should be only + // the `` section of the full name for example from + // `registry.example.com/my-org/my-image:`. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "v1.27.1", "3.5.7-0" + // + // [Docker Image Inspect]: https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect + ContainerImageTagsKey = attribute.Key("container.image.tags") + + // ContainerNameKey is the attribute Key conforming to the "container.name" + // semantic conventions. It represents the container name used by container + // runtime. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry-autoconf" + ContainerNameKey = attribute.Key("container.name") + + // ContainerRuntimeKey is the attribute Key conforming to the + // "container.runtime" semantic conventions. It represents the container runtime + // managing this container. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "docker", "containerd", "rkt" + ContainerRuntimeKey = attribute.Key("container.runtime") +) + +// ContainerCommand returns an attribute KeyValue conforming to the +// "container.command" semantic conventions. It represents the command used to +// run the container (i.e. the command name). +func ContainerCommand(val string) attribute.KeyValue { + return ContainerCommandKey.String(val) +} + +// ContainerCommandArgs returns an attribute KeyValue conforming to the +// "container.command_args" semantic conventions. It represents the all the +// command arguments (including the command/executable itself) run by the +// container. +func ContainerCommandArgs(val ...string) attribute.KeyValue { + return ContainerCommandArgsKey.StringSlice(val) +} + +// ContainerCommandLine returns an attribute KeyValue conforming to the +// "container.command_line" semantic conventions. It represents the full command +// run by the container as a single string representing the full command. +func ContainerCommandLine(val string) attribute.KeyValue { + return ContainerCommandLineKey.String(val) +} + +// ContainerCsiPluginName returns an attribute KeyValue conforming to the +// "container.csi.plugin.name" semantic conventions. It represents the name of +// the CSI ([Container Storage Interface]) plugin used by the volume. +// +// [Container Storage Interface]: https://github.com/container-storage-interface/spec +func ContainerCsiPluginName(val string) attribute.KeyValue { + return ContainerCsiPluginNameKey.String(val) +} + +// ContainerCsiVolumeID returns an attribute KeyValue conforming to the +// "container.csi.volume.id" semantic conventions. It represents the unique +// volume ID returned by the CSI ([Container Storage Interface]) plugin. +// +// [Container Storage Interface]: https://github.com/container-storage-interface/spec +func ContainerCsiVolumeID(val string) attribute.KeyValue { + return ContainerCsiVolumeIDKey.String(val) +} + +// ContainerID returns an attribute KeyValue conforming to the "container.id" +// semantic conventions. It represents the container ID. Usually a UUID, as for +// example used to [identify Docker containers]. The UUID might be abbreviated. +// +// [identify Docker containers]: https://docs.docker.com/engine/containers/run/#container-identification +func ContainerID(val string) attribute.KeyValue { + return ContainerIDKey.String(val) +} + +// ContainerImageID returns an attribute KeyValue conforming to the +// "container.image.id" semantic conventions. It represents the runtime specific +// image identifier. Usually a hash algorithm followed by a UUID. +func ContainerImageID(val string) attribute.KeyValue { + return ContainerImageIDKey.String(val) +} + +// ContainerImageName returns an attribute KeyValue conforming to the +// "container.image.name" semantic conventions. It represents the name of the +// image the container was built on. +func ContainerImageName(val string) attribute.KeyValue { + return ContainerImageNameKey.String(val) +} + +// ContainerImageRepoDigests returns an attribute KeyValue conforming to the +// "container.image.repo_digests" semantic conventions. It represents the repo +// digests of the container image as provided by the container runtime. +func ContainerImageRepoDigests(val ...string) attribute.KeyValue { + return ContainerImageRepoDigestsKey.StringSlice(val) +} + +// ContainerImageTags returns an attribute KeyValue conforming to the +// "container.image.tags" semantic conventions. It represents the container image +// tags. An example can be found in [Docker Image Inspect]. Should be only the +// `` section of the full name for example from +// `registry.example.com/my-org/my-image:`. +// +// [Docker Image Inspect]: https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect +func ContainerImageTags(val ...string) attribute.KeyValue { + return ContainerImageTagsKey.StringSlice(val) +} + +// ContainerName returns an attribute KeyValue conforming to the "container.name" +// semantic conventions. It represents the container name used by container +// runtime. +func ContainerName(val string) attribute.KeyValue { + return ContainerNameKey.String(val) +} + +// ContainerRuntime returns an attribute KeyValue conforming to the +// "container.runtime" semantic conventions. It represents the container runtime +// managing this container. +func ContainerRuntime(val string) attribute.KeyValue { + return ContainerRuntimeKey.String(val) +} + +// Namespace: cpu +const ( + // CPUModeKey is the attribute Key conforming to the "cpu.mode" semantic + // conventions. It represents the mode of the CPU. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "user", "system" + CPUModeKey = attribute.Key("cpu.mode") +) + +// Enum values for cpu.mode +var ( + // user + // Stability: development + CPUModeUser = CPUModeKey.String("user") + // system + // Stability: development + CPUModeSystem = CPUModeKey.String("system") + // nice + // Stability: development + CPUModeNice = CPUModeKey.String("nice") + // idle + // Stability: development + CPUModeIdle = CPUModeKey.String("idle") + // iowait + // Stability: development + CPUModeIowait = CPUModeKey.String("iowait") + // interrupt + // Stability: development + CPUModeInterrupt = CPUModeKey.String("interrupt") + // steal + // Stability: development + CPUModeSteal = CPUModeKey.String("steal") + // kernel + // Stability: development + CPUModeKernel = CPUModeKey.String("kernel") +) + +// Namespace: db +const ( + // DBClientConnectionPoolNameKey is the attribute Key conforming to the + // "db.client.connection.pool.name" semantic conventions. It represents the name + // of the connection pool; unique within the instrumented application. In case + // the connection pool implementation doesn't provide a name, instrumentation + // SHOULD use a combination of parameters that would make the name unique, for + // example, combining attributes `server.address`, `server.port`, and + // `db.namespace`, formatted as `server.address:server.port/db.namespace`. + // Instrumentations that generate connection pool name following different + // patterns SHOULD document it. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "myDataSource" + DBClientConnectionPoolNameKey = attribute.Key("db.client.connection.pool.name") + + // DBClientConnectionStateKey is the attribute Key conforming to the + // "db.client.connection.state" semantic conventions. It represents the state of + // a connection in the pool. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "idle" + DBClientConnectionStateKey = attribute.Key("db.client.connection.state") + + // DBCollectionNameKey is the attribute Key conforming to the + // "db.collection.name" semantic conventions. It represents the name of a + // collection (table, container) within the database. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: "public.users", "customers" + // Note: It is RECOMMENDED to capture the value as provided by the application + // without attempting to do any case normalization. + // + // The collection name SHOULD NOT be extracted from `db.query.text`, + // unless the query format is known to only ever have a single collection name + // present. + // + // For batch operations, if the individual operations are known to have the same + // collection name + // then that collection name SHOULD be used. + DBCollectionNameKey = attribute.Key("db.collection.name") + + // DBNamespaceKey is the attribute Key conforming to the "db.namespace" semantic + // conventions. It represents the name of the database, fully qualified within + // the server address and port. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: "customers", "test.users" + // Note: If a database system has multiple namespace components, they SHOULD be + // concatenated (potentially using database system specific conventions) from + // most general to most specific namespace component, and more specific + // namespaces SHOULD NOT be captured without the more general namespaces, to + // ensure that "startswith" queries for the more general namespaces will be + // valid. + // Semantic conventions for individual database systems SHOULD document what + // `db.namespace` means in the context of that system. + // It is RECOMMENDED to capture the value as provided by the application without + // attempting to do any case normalization. + DBNamespaceKey = attribute.Key("db.namespace") + + // DBOperationBatchSizeKey is the attribute Key conforming to the + // "db.operation.batch.size" semantic conventions. It represents the number of + // queries included in a batch operation. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: 2, 3, 4 + // Note: Operations are only considered batches when they contain two or more + // operations, and so `db.operation.batch.size` SHOULD never be `1`. + DBOperationBatchSizeKey = attribute.Key("db.operation.batch.size") + + // DBOperationNameKey is the attribute Key conforming to the "db.operation.name" + // semantic conventions. It represents the name of the operation or command + // being executed. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: "findAndModify", "HMSET", "SELECT" + // Note: It is RECOMMENDED to capture the value as provided by the application + // without attempting to do any case normalization. + // + // The operation name SHOULD NOT be extracted from `db.query.text`, + // unless the query format is known to only ever have a single operation name + // present. + // + // For batch operations, if the individual operations are known to have the same + // operation name + // then that operation name SHOULD be used prepended by `BATCH `, + // otherwise `db.operation.name` SHOULD be `BATCH` or some other database + // system specific term if more applicable. + DBOperationNameKey = attribute.Key("db.operation.name") + + // DBQuerySummaryKey is the attribute Key conforming to the "db.query.summary" + // semantic conventions. It represents the low cardinality representation of a + // database query text. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: "SELECT wuser_table", "INSERT shipping_details SELECT orders", "get + // user by id" + // Note: `db.query.summary` provides static summary of the query text. It + // describes a class of database queries and is useful as a grouping key, + // especially when analyzing telemetry for database calls involving complex + // queries. + // Summary may be available to the instrumentation through instrumentation hooks + // or other means. If it is not available, instrumentations that support query + // parsing SHOULD generate a summary following [Generating query summary] + // section. + // + // [Generating query summary]: ../../docs/database/database-spans.md#generating-a-summary-of-the-query-text + DBQuerySummaryKey = attribute.Key("db.query.summary") + + // DBQueryTextKey is the attribute Key conforming to the "db.query.text" + // semantic conventions. It represents the database query being executed. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: "SELECT * FROM wuser_table where username = ?", "SET mykey ?" + // Note: For sanitization see [Sanitization of `db.query.text`]. + // For batch operations, if the individual operations are known to have the same + // query text then that query text SHOULD be used, otherwise all of the + // individual query texts SHOULD be concatenated with separator `; ` or some + // other database system specific separator if more applicable. + // Even though parameterized query text can potentially have sensitive data, by + // using a parameterized query the user is giving a strong signal that any + // sensitive data will be passed as parameter values, and the benefit to + // observability of capturing the static part of the query text by default + // outweighs the risk. + // + // [Sanitization of `db.query.text`]: ../../docs/database/database-spans.md#sanitization-of-dbquerytext + DBQueryTextKey = attribute.Key("db.query.text") + + // DBResponseReturnedRowsKey is the attribute Key conforming to the + // "db.response.returned_rows" semantic conventions. It represents the number of + // rows returned by the operation. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 10, 30, 1000 + DBResponseReturnedRowsKey = attribute.Key("db.response.returned_rows") + + // DBResponseStatusCodeKey is the attribute Key conforming to the + // "db.response.status_code" semantic conventions. It represents the database + // response status code. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: "102", "ORA-17002", "08P01", "404" + // Note: The status code returned by the database. Usually it represents an + // error code, but may also represent partial success, warning, or differentiate + // between various types of successful outcomes. + // Semantic conventions for individual database systems SHOULD document what + // `db.response.status_code` means in the context of that system. + DBResponseStatusCodeKey = attribute.Key("db.response.status_code") + + // DBSystemNameKey is the attribute Key conforming to the "db.system.name" + // semantic conventions. It represents the database management system (DBMS) + // product as identified by the client instrumentation. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Release_Candidate + // + // Examples: + // Note: The actual DBMS may differ from the one identified by the client. For + // example, when using PostgreSQL client libraries to connect to a CockroachDB, + // the `db.system.name` is set to `postgresql` based on the instrumentation's + // best knowledge. + DBSystemNameKey = attribute.Key("db.system.name") +) + +// DBClientConnectionPoolName returns an attribute KeyValue conforming to the +// "db.client.connection.pool.name" semantic conventions. It represents the name +// of the connection pool; unique within the instrumented application. In case +// the connection pool implementation doesn't provide a name, instrumentation +// SHOULD use a combination of parameters that would make the name unique, for +// example, combining attributes `server.address`, `server.port`, and +// `db.namespace`, formatted as `server.address:server.port/db.namespace`. +// Instrumentations that generate connection pool name following different +// patterns SHOULD document it. +func DBClientConnectionPoolName(val string) attribute.KeyValue { + return DBClientConnectionPoolNameKey.String(val) +} + +// DBCollectionName returns an attribute KeyValue conforming to the +// "db.collection.name" semantic conventions. It represents the name of a +// collection (table, container) within the database. +func DBCollectionName(val string) attribute.KeyValue { + return DBCollectionNameKey.String(val) +} + +// DBNamespace returns an attribute KeyValue conforming to the "db.namespace" +// semantic conventions. It represents the name of the database, fully qualified +// within the server address and port. +func DBNamespace(val string) attribute.KeyValue { + return DBNamespaceKey.String(val) +} + +// DBOperationBatchSize returns an attribute KeyValue conforming to the +// "db.operation.batch.size" semantic conventions. It represents the number of +// queries included in a batch operation. +func DBOperationBatchSize(val int) attribute.KeyValue { + return DBOperationBatchSizeKey.Int(val) +} + +// DBOperationName returns an attribute KeyValue conforming to the +// "db.operation.name" semantic conventions. It represents the name of the +// operation or command being executed. +func DBOperationName(val string) attribute.KeyValue { + return DBOperationNameKey.String(val) +} + +// DBQuerySummary returns an attribute KeyValue conforming to the +// "db.query.summary" semantic conventions. It represents the low cardinality +// representation of a database query text. +func DBQuerySummary(val string) attribute.KeyValue { + return DBQuerySummaryKey.String(val) +} + +// DBQueryText returns an attribute KeyValue conforming to the "db.query.text" +// semantic conventions. It represents the database query being executed. +func DBQueryText(val string) attribute.KeyValue { + return DBQueryTextKey.String(val) +} + +// DBResponseReturnedRows returns an attribute KeyValue conforming to the +// "db.response.returned_rows" semantic conventions. It represents the number of +// rows returned by the operation. +func DBResponseReturnedRows(val int) attribute.KeyValue { + return DBResponseReturnedRowsKey.Int(val) +} + +// DBResponseStatusCode returns an attribute KeyValue conforming to the +// "db.response.status_code" semantic conventions. It represents the database +// response status code. +func DBResponseStatusCode(val string) attribute.KeyValue { + return DBResponseStatusCodeKey.String(val) +} + +// Enum values for db.client.connection.state +var ( + // idle + // Stability: development + DBClientConnectionStateIdle = DBClientConnectionStateKey.String("idle") + // used + // Stability: development + DBClientConnectionStateUsed = DBClientConnectionStateKey.String("used") +) + +// Enum values for db.system.name +var ( + // Some other SQL database. Fallback only. + // Stability: development + DBSystemNameOtherSQL = DBSystemNameKey.String("other_sql") + // [Adabas (Adaptable Database System)] + // Stability: development + // + // [Adabas (Adaptable Database System)]: https://documentation.softwareag.com/?pf=adabas + DBSystemNameSoftwareagAdabas = DBSystemNameKey.String("softwareag.adabas") + // [Actian Ingres] + // Stability: development + // + // [Actian Ingres]: https://www.actian.com/databases/ingres/ + DBSystemNameActianIngres = DBSystemNameKey.String("actian.ingres") + // [Amazon DynamoDB] + // Stability: development + // + // [Amazon DynamoDB]: https://aws.amazon.com/pm/dynamodb/ + DBSystemNameAWSDynamoDB = DBSystemNameKey.String("aws.dynamodb") + // [Amazon Redshift] + // Stability: development + // + // [Amazon Redshift]: https://aws.amazon.com/redshift/ + DBSystemNameAWSRedshift = DBSystemNameKey.String("aws.redshift") + // [Azure Cosmos DB] + // Stability: development + // + // [Azure Cosmos DB]: https://learn.microsoft.com/azure/cosmos-db + DBSystemNameAzureCosmosDB = DBSystemNameKey.String("azure.cosmosdb") + // [InterSystems Caché] + // Stability: development + // + // [InterSystems Caché]: https://www.intersystems.com/products/cache/ + DBSystemNameIntersystemsCache = DBSystemNameKey.String("intersystems.cache") + // [Apache Cassandra] + // Stability: development + // + // [Apache Cassandra]: https://cassandra.apache.org/ + DBSystemNameCassandra = DBSystemNameKey.String("cassandra") + // [ClickHouse] + // Stability: development + // + // [ClickHouse]: https://clickhouse.com/ + DBSystemNameClickhouse = DBSystemNameKey.String("clickhouse") + // [CockroachDB] + // Stability: development + // + // [CockroachDB]: https://www.cockroachlabs.com/ + DBSystemNameCockroachdb = DBSystemNameKey.String("cockroachdb") + // [Couchbase] + // Stability: development + // + // [Couchbase]: https://www.couchbase.com/ + DBSystemNameCouchbase = DBSystemNameKey.String("couchbase") + // [Apache CouchDB] + // Stability: development + // + // [Apache CouchDB]: https://couchdb.apache.org/ + DBSystemNameCouchDB = DBSystemNameKey.String("couchdb") + // [Apache Derby] + // Stability: development + // + // [Apache Derby]: https://db.apache.org/derby/ + DBSystemNameDerby = DBSystemNameKey.String("derby") + // [Elasticsearch] + // Stability: development + // + // [Elasticsearch]: https://www.elastic.co/elasticsearch + DBSystemNameElasticsearch = DBSystemNameKey.String("elasticsearch") + // [Firebird] + // Stability: development + // + // [Firebird]: https://www.firebirdsql.org/ + DBSystemNameFirebirdsql = DBSystemNameKey.String("firebirdsql") + // [Google Cloud Spanner] + // Stability: development + // + // [Google Cloud Spanner]: https://cloud.google.com/spanner + DBSystemNameGCPSpanner = DBSystemNameKey.String("gcp.spanner") + // [Apache Geode] + // Stability: development + // + // [Apache Geode]: https://geode.apache.org/ + DBSystemNameGeode = DBSystemNameKey.String("geode") + // [H2 Database] + // Stability: development + // + // [H2 Database]: https://h2database.com/ + DBSystemNameH2database = DBSystemNameKey.String("h2database") + // [Apache HBase] + // Stability: development + // + // [Apache HBase]: https://hbase.apache.org/ + DBSystemNameHBase = DBSystemNameKey.String("hbase") + // [Apache Hive] + // Stability: development + // + // [Apache Hive]: https://hive.apache.org/ + DBSystemNameHive = DBSystemNameKey.String("hive") + // [HyperSQL Database] + // Stability: development + // + // [HyperSQL Database]: https://hsqldb.org/ + DBSystemNameHSQLDB = DBSystemNameKey.String("hsqldb") + // [IBM Db2] + // Stability: development + // + // [IBM Db2]: https://www.ibm.com/db2 + DBSystemNameIbmDb2 = DBSystemNameKey.String("ibm.db2") + // [IBM Informix] + // Stability: development + // + // [IBM Informix]: https://www.ibm.com/products/informix + DBSystemNameIbmInformix = DBSystemNameKey.String("ibm.informix") + // [IBM Netezza] + // Stability: development + // + // [IBM Netezza]: https://www.ibm.com/products/netezza + DBSystemNameIbmNetezza = DBSystemNameKey.String("ibm.netezza") + // [InfluxDB] + // Stability: development + // + // [InfluxDB]: https://www.influxdata.com/ + DBSystemNameInfluxdb = DBSystemNameKey.String("influxdb") + // [Instant] + // Stability: development + // + // [Instant]: https://www.instantdb.com/ + DBSystemNameInstantDB = DBSystemNameKey.String("instantdb") + // [MariaDB] + // Stability: release_candidate + // + // [MariaDB]: https://mariadb.org/ + DBSystemNameMariaDB = DBSystemNameKey.String("mariadb") + // [Memcached] + // Stability: development + // + // [Memcached]: https://memcached.org/ + DBSystemNameMemcached = DBSystemNameKey.String("memcached") + // [MongoDB] + // Stability: development + // + // [MongoDB]: https://www.mongodb.com/ + DBSystemNameMongoDB = DBSystemNameKey.String("mongodb") + // [Microsoft SQL Server] + // Stability: release_candidate + // + // [Microsoft SQL Server]: https://www.microsoft.com/sql-server + DBSystemNameMicrosoftSQLServer = DBSystemNameKey.String("microsoft.sql_server") + // [MySQL] + // Stability: release_candidate + // + // [MySQL]: https://www.mysql.com/ + DBSystemNameMySQL = DBSystemNameKey.String("mysql") + // [Neo4j] + // Stability: development + // + // [Neo4j]: https://neo4j.com/ + DBSystemNameNeo4j = DBSystemNameKey.String("neo4j") + // [OpenSearch] + // Stability: development + // + // [OpenSearch]: https://opensearch.org/ + DBSystemNameOpensearch = DBSystemNameKey.String("opensearch") + // [Oracle Database] + // Stability: development + // + // [Oracle Database]: https://www.oracle.com/database/ + DBSystemNameOracleDB = DBSystemNameKey.String("oracle.db") + // [PostgreSQL] + // Stability: release_candidate + // + // [PostgreSQL]: https://www.postgresql.org/ + DBSystemNamePostgreSQL = DBSystemNameKey.String("postgresql") + // [Redis] + // Stability: development + // + // [Redis]: https://redis.io/ + DBSystemNameRedis = DBSystemNameKey.String("redis") + // [SAP HANA] + // Stability: development + // + // [SAP HANA]: https://www.sap.com/products/technology-platform/hana/what-is-sap-hana.html + DBSystemNameSapHana = DBSystemNameKey.String("sap.hana") + // [SAP MaxDB] + // Stability: development + // + // [SAP MaxDB]: https://maxdb.sap.com/ + DBSystemNameSapMaxDB = DBSystemNameKey.String("sap.maxdb") + // [SQLite] + // Stability: development + // + // [SQLite]: https://www.sqlite.org/ + DBSystemNameSqlite = DBSystemNameKey.String("sqlite") + // [Teradata] + // Stability: development + // + // [Teradata]: https://www.teradata.com/ + DBSystemNameTeradata = DBSystemNameKey.String("teradata") + // [Trino] + // Stability: development + // + // [Trino]: https://trino.io/ + DBSystemNameTrino = DBSystemNameKey.String("trino") +) + +// Namespace: deployment +const ( + // DeploymentEnvironmentNameKey is the attribute Key conforming to the + // "deployment.environment.name" semantic conventions. It represents the name of + // the [deployment environment] (aka deployment tier). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "staging", "production" + // Note: `deployment.environment.name` does not affect the uniqueness + // constraints defined through + // the `service.namespace`, `service.name` and `service.instance.id` resource + // attributes. + // This implies that resources carrying the following attribute combinations + // MUST be + // considered to be identifying the same service: + // + // - `service.name=frontend`, `deployment.environment.name=production` + // - `service.name=frontend`, `deployment.environment.name=staging`. + // + // + // [deployment environment]: https://wikipedia.org/wiki/Deployment_environment + DeploymentEnvironmentNameKey = attribute.Key("deployment.environment.name") + + // DeploymentIDKey is the attribute Key conforming to the "deployment.id" + // semantic conventions. It represents the id of the deployment. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1208" + DeploymentIDKey = attribute.Key("deployment.id") + + // DeploymentNameKey is the attribute Key conforming to the "deployment.name" + // semantic conventions. It represents the name of the deployment. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "deploy my app", "deploy-frontend" + DeploymentNameKey = attribute.Key("deployment.name") + + // DeploymentStatusKey is the attribute Key conforming to the + // "deployment.status" semantic conventions. It represents the status of the + // deployment. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + DeploymentStatusKey = attribute.Key("deployment.status") +) + +// DeploymentEnvironmentName returns an attribute KeyValue conforming to the +// "deployment.environment.name" semantic conventions. It represents the name of +// the [deployment environment] (aka deployment tier). +// +// [deployment environment]: https://wikipedia.org/wiki/Deployment_environment +func DeploymentEnvironmentName(val string) attribute.KeyValue { + return DeploymentEnvironmentNameKey.String(val) +} + +// DeploymentID returns an attribute KeyValue conforming to the "deployment.id" +// semantic conventions. It represents the id of the deployment. +func DeploymentID(val string) attribute.KeyValue { + return DeploymentIDKey.String(val) +} + +// DeploymentName returns an attribute KeyValue conforming to the +// "deployment.name" semantic conventions. It represents the name of the +// deployment. +func DeploymentName(val string) attribute.KeyValue { + return DeploymentNameKey.String(val) +} + +// Enum values for deployment.status +var ( + // failed + // Stability: development + DeploymentStatusFailed = DeploymentStatusKey.String("failed") + // succeeded + // Stability: development + DeploymentStatusSucceeded = DeploymentStatusKey.String("succeeded") +) + +// Namespace: destination +const ( + // DestinationAddressKey is the attribute Key conforming to the + // "destination.address" semantic conventions. It represents the destination + // address - domain name if available without reverse DNS lookup; otherwise, IP + // address or Unix domain socket name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "destination.example.com", "10.1.2.80", "/tmp/my.sock" + // Note: When observed from the source side, and when communicating through an + // intermediary, `destination.address` SHOULD represent the destination address + // behind any intermediaries, for example proxies, if it's available. + DestinationAddressKey = attribute.Key("destination.address") + + // DestinationPortKey is the attribute Key conforming to the "destination.port" + // semantic conventions. It represents the destination port number. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 3389, 2888 + DestinationPortKey = attribute.Key("destination.port") +) + +// DestinationAddress returns an attribute KeyValue conforming to the +// "destination.address" semantic conventions. It represents the destination +// address - domain name if available without reverse DNS lookup; otherwise, IP +// address or Unix domain socket name. +func DestinationAddress(val string) attribute.KeyValue { + return DestinationAddressKey.String(val) +} + +// DestinationPort returns an attribute KeyValue conforming to the +// "destination.port" semantic conventions. It represents the destination port +// number. +func DestinationPort(val int) attribute.KeyValue { + return DestinationPortKey.Int(val) +} + +// Namespace: device +const ( + // DeviceIDKey is the attribute Key conforming to the "device.id" semantic + // conventions. It represents a unique identifier representing the device. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2ab2916d-a51f-4ac8-80ee-45ac31a28092" + // Note: The device identifier MUST only be defined using the values outlined + // below. This value is not an advertising identifier and MUST NOT be used as + // such. On iOS (Swift or Objective-C), this value MUST be equal to the + // [vendor identifier]. On Android (Java or Kotlin), this value MUST be equal to + // the Firebase Installation ID or a globally unique UUID which is persisted + // across sessions in your application. More information can be found [here] on + // best practices and exact implementation details. Caution should be taken when + // storing personal data or anything which can identify a user. GDPR and data + // protection laws may apply, ensure you do your own due diligence. + // + // [vendor identifier]: https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor + // [here]: https://developer.android.com/training/articles/user-data-ids + DeviceIDKey = attribute.Key("device.id") + + // DeviceManufacturerKey is the attribute Key conforming to the + // "device.manufacturer" semantic conventions. It represents the name of the + // device manufacturer. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Apple", "Samsung" + // Note: The Android OS provides this field via [Build]. iOS apps SHOULD + // hardcode the value `Apple`. + // + // [Build]: https://developer.android.com/reference/android/os/Build#MANUFACTURER + DeviceManufacturerKey = attribute.Key("device.manufacturer") + + // DeviceModelIdentifierKey is the attribute Key conforming to the + // "device.model.identifier" semantic conventions. It represents the model + // identifier for the device. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "iPhone3,4", "SM-G920F" + // Note: It's recommended this value represents a machine-readable version of + // the model identifier rather than the market or consumer-friendly name of the + // device. + DeviceModelIdentifierKey = attribute.Key("device.model.identifier") + + // DeviceModelNameKey is the attribute Key conforming to the "device.model.name" + // semantic conventions. It represents the marketing name for the device model. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "iPhone 6s Plus", "Samsung Galaxy S6" + // Note: It's recommended this value represents a human-readable version of the + // device model rather than a machine-readable alternative. + DeviceModelNameKey = attribute.Key("device.model.name") +) + +// DeviceID returns an attribute KeyValue conforming to the "device.id" semantic +// conventions. It represents a unique identifier representing the device. +func DeviceID(val string) attribute.KeyValue { + return DeviceIDKey.String(val) +} + +// DeviceManufacturer returns an attribute KeyValue conforming to the +// "device.manufacturer" semantic conventions. It represents the name of the +// device manufacturer. +func DeviceManufacturer(val string) attribute.KeyValue { + return DeviceManufacturerKey.String(val) +} + +// DeviceModelIdentifier returns an attribute KeyValue conforming to the +// "device.model.identifier" semantic conventions. It represents the model +// identifier for the device. +func DeviceModelIdentifier(val string) attribute.KeyValue { + return DeviceModelIdentifierKey.String(val) +} + +// DeviceModelName returns an attribute KeyValue conforming to the +// "device.model.name" semantic conventions. It represents the marketing name for +// the device model. +func DeviceModelName(val string) attribute.KeyValue { + return DeviceModelNameKey.String(val) +} + +// Namespace: disk +const ( + // DiskIoDirectionKey is the attribute Key conforming to the "disk.io.direction" + // semantic conventions. It represents the disk IO operation direction. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "read" + DiskIoDirectionKey = attribute.Key("disk.io.direction") +) + +// Enum values for disk.io.direction +var ( + // read + // Stability: development + DiskIoDirectionRead = DiskIoDirectionKey.String("read") + // write + // Stability: development + DiskIoDirectionWrite = DiskIoDirectionKey.String("write") +) + +// Namespace: dns +const ( + // DNSQuestionNameKey is the attribute Key conforming to the "dns.question.name" + // semantic conventions. It represents the name being queried. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "www.example.com", "opentelemetry.io" + // Note: If the name field contains non-printable characters (below 32 or above + // 126), those characters should be represented as escaped base 10 integers + // (\DDD). Back slashes and quotes should be escaped. Tabs, carriage returns, + // and line feeds should be converted to \t, \r, and \n respectively. + DNSQuestionNameKey = attribute.Key("dns.question.name") +) + +// DNSQuestionName returns an attribute KeyValue conforming to the +// "dns.question.name" semantic conventions. It represents the name being +// queried. +func DNSQuestionName(val string) attribute.KeyValue { + return DNSQuestionNameKey.String(val) +} + +// Namespace: elasticsearch +const ( + // ElasticsearchNodeNameKey is the attribute Key conforming to the + // "elasticsearch.node.name" semantic conventions. It represents the represents + // the human-readable identifier of the node/instance to which a request was + // routed. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "instance-0000000001" + ElasticsearchNodeNameKey = attribute.Key("elasticsearch.node.name") +) + +// ElasticsearchNodeName returns an attribute KeyValue conforming to the +// "elasticsearch.node.name" semantic conventions. It represents the represents +// the human-readable identifier of the node/instance to which a request was +// routed. +func ElasticsearchNodeName(val string) attribute.KeyValue { + return ElasticsearchNodeNameKey.String(val) +} + +// Namespace: error +const ( + // ErrorTypeKey is the attribute Key conforming to the "error.type" semantic + // conventions. It represents the describes a class of error the operation ended + // with. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "timeout", "java.net.UnknownHostException", + // "server_certificate_invalid", "500" + // Note: The `error.type` SHOULD be predictable, and SHOULD have low + // cardinality. + // + // When `error.type` is set to a type (e.g., an exception type), its + // canonical class name identifying the type within the artifact SHOULD be used. + // + // Instrumentations SHOULD document the list of errors they report. + // + // The cardinality of `error.type` within one instrumentation library SHOULD be + // low. + // Telemetry consumers that aggregate data from multiple instrumentation + // libraries and applications + // should be prepared for `error.type` to have high cardinality at query time + // when no + // additional filters are applied. + // + // If the operation has completed successfully, instrumentations SHOULD NOT set + // `error.type`. + // + // If a specific domain defines its own set of error identifiers (such as HTTP + // or gRPC status codes), + // it's RECOMMENDED to: + // + // - Use a domain-specific attribute + // - Set `error.type` to capture all errors, regardless of whether they are + // defined within the domain-specific set or not. + ErrorTypeKey = attribute.Key("error.type") +) + +// Enum values for error.type +var ( + // A fallback error value to be used when the instrumentation doesn't define a + // custom value. + // + // Stability: stable + ErrorTypeOther = ErrorTypeKey.String("_OTHER") +) + +// Namespace: exception +const ( + // ExceptionMessageKey is the attribute Key conforming to the + // "exception.message" semantic conventions. It represents the exception + // message. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "Division by zero", "Can't convert 'int' object to str implicitly" + ExceptionMessageKey = attribute.Key("exception.message") + + // ExceptionStacktraceKey is the attribute Key conforming to the + // "exception.stacktrace" semantic conventions. It represents a stacktrace as a + // string in the natural representation for the language runtime. The + // representation is to be determined and documented by each language SIG. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: Exception in thread "main" java.lang.RuntimeException: Test + // exception\n at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n at + // com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n at + // com.example.GenerateTrace.main(GenerateTrace.java:5) + ExceptionStacktraceKey = attribute.Key("exception.stacktrace") + + // ExceptionTypeKey is the attribute Key conforming to the "exception.type" + // semantic conventions. It represents the type of the exception (its + // fully-qualified class name, if applicable). The dynamic type of the exception + // should be preferred over the static type in languages that support it. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "java.net.ConnectException", "OSError" + ExceptionTypeKey = attribute.Key("exception.type") +) + +// ExceptionMessage returns an attribute KeyValue conforming to the +// "exception.message" semantic conventions. It represents the exception message. +func ExceptionMessage(val string) attribute.KeyValue { + return ExceptionMessageKey.String(val) +} + +// ExceptionStacktrace returns an attribute KeyValue conforming to the +// "exception.stacktrace" semantic conventions. It represents a stacktrace as a +// string in the natural representation for the language runtime. The +// representation is to be determined and documented by each language SIG. +func ExceptionStacktrace(val string) attribute.KeyValue { + return ExceptionStacktraceKey.String(val) +} + +// ExceptionType returns an attribute KeyValue conforming to the "exception.type" +// semantic conventions. It represents the type of the exception (its +// fully-qualified class name, if applicable). The dynamic type of the exception +// should be preferred over the static type in languages that support it. +func ExceptionType(val string) attribute.KeyValue { + return ExceptionTypeKey.String(val) +} + +// Namespace: faas +const ( + // FaaSColdstartKey is the attribute Key conforming to the "faas.coldstart" + // semantic conventions. It represents a boolean that is true if the serverless + // function is executed for the first time (aka cold-start). + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + FaaSColdstartKey = attribute.Key("faas.coldstart") + + // FaaSCronKey is the attribute Key conforming to the "faas.cron" semantic + // conventions. It represents a string containing the schedule period as + // [Cron Expression]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 0/5 * * * ? * + // + // [Cron Expression]: https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm + FaaSCronKey = attribute.Key("faas.cron") + + // FaaSDocumentCollectionKey is the attribute Key conforming to the + // "faas.document.collection" semantic conventions. It represents the name of + // the source on which the triggering operation was performed. For example, in + // Cloud Storage or S3 corresponds to the bucket name, and in Cosmos DB to the + // database name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "myBucketName", "myDbName" + FaaSDocumentCollectionKey = attribute.Key("faas.document.collection") + + // FaaSDocumentNameKey is the attribute Key conforming to the + // "faas.document.name" semantic conventions. It represents the document + // name/table subjected to the operation. For example, in Cloud Storage or S3 is + // the name of the file, and in Cosmos DB the table name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "myFile.txt", "myTableName" + FaaSDocumentNameKey = attribute.Key("faas.document.name") + + // FaaSDocumentOperationKey is the attribute Key conforming to the + // "faas.document.operation" semantic conventions. It represents the describes + // the type of the operation that was performed on the data. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + FaaSDocumentOperationKey = attribute.Key("faas.document.operation") + + // FaaSDocumentTimeKey is the attribute Key conforming to the + // "faas.document.time" semantic conventions. It represents a string containing + // the time when the data was accessed in the [ISO 8601] format expressed in + // [UTC]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 2020-01-23T13:47:06Z + // + // [ISO 8601]: https://www.iso.org/iso-8601-date-and-time-format.html + // [UTC]: https://www.w3.org/TR/NOTE-datetime + FaaSDocumentTimeKey = attribute.Key("faas.document.time") + + // FaaSInstanceKey is the attribute Key conforming to the "faas.instance" + // semantic conventions. It represents the execution environment ID as a string, + // that will be potentially reused for other invocations to the same + // function/function version. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2021/06/28/[$LATEST]2f399eb14537447da05ab2a2e39309de" + // Note: - **AWS Lambda:** Use the (full) log stream name. + FaaSInstanceKey = attribute.Key("faas.instance") + + // FaaSInvocationIDKey is the attribute Key conforming to the + // "faas.invocation_id" semantic conventions. It represents the invocation ID of + // the current function invocation. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: af9d5aa4-a685-4c5f-a22b-444f80b3cc28 + FaaSInvocationIDKey = attribute.Key("faas.invocation_id") + + // FaaSInvokedNameKey is the attribute Key conforming to the "faas.invoked_name" + // semantic conventions. It represents the name of the invoked function. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: my-function + // Note: SHOULD be equal to the `faas.name` resource attribute of the invoked + // function. + FaaSInvokedNameKey = attribute.Key("faas.invoked_name") + + // FaaSInvokedProviderKey is the attribute Key conforming to the + // "faas.invoked_provider" semantic conventions. It represents the cloud + // provider of the invoked function. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: SHOULD be equal to the `cloud.provider` resource attribute of the + // invoked function. + FaaSInvokedProviderKey = attribute.Key("faas.invoked_provider") + + // FaaSInvokedRegionKey is the attribute Key conforming to the + // "faas.invoked_region" semantic conventions. It represents the cloud region of + // the invoked function. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: eu-central-1 + // Note: SHOULD be equal to the `cloud.region` resource attribute of the invoked + // function. + FaaSInvokedRegionKey = attribute.Key("faas.invoked_region") + + // FaaSMaxMemoryKey is the attribute Key conforming to the "faas.max_memory" + // semantic conventions. It represents the amount of memory available to the + // serverless function converted to Bytes. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Note: It's recommended to set this attribute since e.g. too little memory can + // easily stop a Java AWS Lambda function from working correctly. On AWS Lambda, + // the environment variable `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` provides this + // information (which must be multiplied by 1,048,576). + FaaSMaxMemoryKey = attribute.Key("faas.max_memory") + + // FaaSNameKey is the attribute Key conforming to the "faas.name" semantic + // conventions. It represents the name of the single function that this runtime + // instance executes. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-function", "myazurefunctionapp/some-function-name" + // Note: This is the name of the function as configured/deployed on the FaaS + // platform and is usually different from the name of the callback + // function (which may be stored in the + // [`code.namespace`/`code.function.name`] + // span attributes). + // + // For some cloud providers, the above definition is ambiguous. The following + // definition of function name MUST be used for this attribute + // (and consequently the span name) for the listed cloud providers/products: + // + // - **Azure:** The full name `/`, i.e., function app name + // followed by a forward slash followed by the function name (this form + // can also be seen in the resource JSON for the function). + // This means that a span attribute MUST be used, as an Azure function + // app can host multiple functions that would usually share + // a TracerProvider (see also the `cloud.resource_id` attribute). + // + // + // [`code.namespace`/`code.function.name`]: /docs/general/attributes.md#source-code-attributes + FaaSNameKey = attribute.Key("faas.name") + + // FaaSTimeKey is the attribute Key conforming to the "faas.time" semantic + // conventions. It represents a string containing the function invocation time + // in the [ISO 8601] format expressed in [UTC]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 2020-01-23T13:47:06Z + // + // [ISO 8601]: https://www.iso.org/iso-8601-date-and-time-format.html + // [UTC]: https://www.w3.org/TR/NOTE-datetime + FaaSTimeKey = attribute.Key("faas.time") + + // FaaSTriggerKey is the attribute Key conforming to the "faas.trigger" semantic + // conventions. It represents the type of the trigger which caused this function + // invocation. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + FaaSTriggerKey = attribute.Key("faas.trigger") + + // FaaSVersionKey is the attribute Key conforming to the "faas.version" semantic + // conventions. It represents the immutable version of the function being + // executed. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "26", "pinkfroid-00002" + // Note: Depending on the cloud provider and platform, use: + // + // - **AWS Lambda:** The [function version] + // (an integer represented as a decimal string). + // - **Google Cloud Run (Services):** The [revision] + // (i.e., the function name plus the revision suffix). + // - **Google Cloud Functions:** The value of the + // [`K_REVISION` environment variable]. + // - **Azure Functions:** Not applicable. Do not set this attribute. + // + // + // [function version]: https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html + // [revision]: https://cloud.google.com/run/docs/managing/revisions + // [`K_REVISION` environment variable]: https://cloud.google.com/functions/docs/env-var#runtime_environment_variables_set_automatically + FaaSVersionKey = attribute.Key("faas.version") +) + +// FaaSColdstart returns an attribute KeyValue conforming to the "faas.coldstart" +// semantic conventions. It represents a boolean that is true if the serverless +// function is executed for the first time (aka cold-start). +func FaaSColdstart(val bool) attribute.KeyValue { + return FaaSColdstartKey.Bool(val) +} + +// FaaSCron returns an attribute KeyValue conforming to the "faas.cron" semantic +// conventions. It represents a string containing the schedule period as +// [Cron Expression]. +// +// [Cron Expression]: https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm +func FaaSCron(val string) attribute.KeyValue { + return FaaSCronKey.String(val) +} + +// FaaSDocumentCollection returns an attribute KeyValue conforming to the +// "faas.document.collection" semantic conventions. It represents the name of the +// source on which the triggering operation was performed. For example, in Cloud +// Storage or S3 corresponds to the bucket name, and in Cosmos DB to the database +// name. +func FaaSDocumentCollection(val string) attribute.KeyValue { + return FaaSDocumentCollectionKey.String(val) +} + +// FaaSDocumentName returns an attribute KeyValue conforming to the +// "faas.document.name" semantic conventions. It represents the document +// name/table subjected to the operation. For example, in Cloud Storage or S3 is +// the name of the file, and in Cosmos DB the table name. +func FaaSDocumentName(val string) attribute.KeyValue { + return FaaSDocumentNameKey.String(val) +} + +// FaaSDocumentTime returns an attribute KeyValue conforming to the +// "faas.document.time" semantic conventions. It represents a string containing +// the time when the data was accessed in the [ISO 8601] format expressed in +// [UTC]. +// +// [ISO 8601]: https://www.iso.org/iso-8601-date-and-time-format.html +// [UTC]: https://www.w3.org/TR/NOTE-datetime +func FaaSDocumentTime(val string) attribute.KeyValue { + return FaaSDocumentTimeKey.String(val) +} + +// FaaSInstance returns an attribute KeyValue conforming to the "faas.instance" +// semantic conventions. It represents the execution environment ID as a string, +// that will be potentially reused for other invocations to the same +// function/function version. +func FaaSInstance(val string) attribute.KeyValue { + return FaaSInstanceKey.String(val) +} + +// FaaSInvocationID returns an attribute KeyValue conforming to the +// "faas.invocation_id" semantic conventions. It represents the invocation ID of +// the current function invocation. +func FaaSInvocationID(val string) attribute.KeyValue { + return FaaSInvocationIDKey.String(val) +} + +// FaaSInvokedName returns an attribute KeyValue conforming to the +// "faas.invoked_name" semantic conventions. It represents the name of the +// invoked function. +func FaaSInvokedName(val string) attribute.KeyValue { + return FaaSInvokedNameKey.String(val) +} + +// FaaSInvokedRegion returns an attribute KeyValue conforming to the +// "faas.invoked_region" semantic conventions. It represents the cloud region of +// the invoked function. +func FaaSInvokedRegion(val string) attribute.KeyValue { + return FaaSInvokedRegionKey.String(val) +} + +// FaaSMaxMemory returns an attribute KeyValue conforming to the +// "faas.max_memory" semantic conventions. It represents the amount of memory +// available to the serverless function converted to Bytes. +func FaaSMaxMemory(val int) attribute.KeyValue { + return FaaSMaxMemoryKey.Int(val) +} + +// FaaSName returns an attribute KeyValue conforming to the "faas.name" semantic +// conventions. It represents the name of the single function that this runtime +// instance executes. +func FaaSName(val string) attribute.KeyValue { + return FaaSNameKey.String(val) +} + +// FaaSTime returns an attribute KeyValue conforming to the "faas.time" semantic +// conventions. It represents a string containing the function invocation time in +// the [ISO 8601] format expressed in [UTC]. +// +// [ISO 8601]: https://www.iso.org/iso-8601-date-and-time-format.html +// [UTC]: https://www.w3.org/TR/NOTE-datetime +func FaaSTime(val string) attribute.KeyValue { + return FaaSTimeKey.String(val) +} + +// FaaSVersion returns an attribute KeyValue conforming to the "faas.version" +// semantic conventions. It represents the immutable version of the function +// being executed. +func FaaSVersion(val string) attribute.KeyValue { + return FaaSVersionKey.String(val) +} + +// Enum values for faas.document.operation +var ( + // When a new object is created. + // Stability: development + FaaSDocumentOperationInsert = FaaSDocumentOperationKey.String("insert") + // When an object is modified. + // Stability: development + FaaSDocumentOperationEdit = FaaSDocumentOperationKey.String("edit") + // When an object is deleted. + // Stability: development + FaaSDocumentOperationDelete = FaaSDocumentOperationKey.String("delete") +) + +// Enum values for faas.invoked_provider +var ( + // Alibaba Cloud + // Stability: development + FaaSInvokedProviderAlibabaCloud = FaaSInvokedProviderKey.String("alibaba_cloud") + // Amazon Web Services + // Stability: development + FaaSInvokedProviderAWS = FaaSInvokedProviderKey.String("aws") + // Microsoft Azure + // Stability: development + FaaSInvokedProviderAzure = FaaSInvokedProviderKey.String("azure") + // Google Cloud Platform + // Stability: development + FaaSInvokedProviderGCP = FaaSInvokedProviderKey.String("gcp") + // Tencent Cloud + // Stability: development + FaaSInvokedProviderTencentCloud = FaaSInvokedProviderKey.String("tencent_cloud") +) + +// Enum values for faas.trigger +var ( + // A response to some data source operation such as a database or filesystem + // read/write + // Stability: development + FaaSTriggerDatasource = FaaSTriggerKey.String("datasource") + // To provide an answer to an inbound HTTP request + // Stability: development + FaaSTriggerHTTP = FaaSTriggerKey.String("http") + // A function is set to be executed when messages are sent to a messaging system + // Stability: development + FaaSTriggerPubsub = FaaSTriggerKey.String("pubsub") + // A function is scheduled to be executed regularly + // Stability: development + FaaSTriggerTimer = FaaSTriggerKey.String("timer") + // If none of the others apply + // Stability: development + FaaSTriggerOther = FaaSTriggerKey.String("other") +) + +// Namespace: feature_flag +const ( + // FeatureFlagContextIDKey is the attribute Key conforming to the + // "feature_flag.context.id" semantic conventions. It represents the unique + // identifier for the flag evaluation context. For example, the targeting key. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "5157782b-2203-4c80-a857-dbbd5e7761db" + FeatureFlagContextIDKey = attribute.Key("feature_flag.context.id") + + // FeatureFlagEvaluationErrorMessageKey is the attribute Key conforming to the + // "feature_flag.evaluation.error.message" semantic conventions. It represents a + // message explaining the nature of an error occurring during flag evaluation. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Flag `header-color` expected type `string` but found type `number` + // " + FeatureFlagEvaluationErrorMessageKey = attribute.Key("feature_flag.evaluation.error.message") + + // FeatureFlagEvaluationReasonKey is the attribute Key conforming to the + // "feature_flag.evaluation.reason" semantic conventions. It represents the + // reason code which shows how a feature flag value was determined. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "static", "targeting_match", "error", "default" + FeatureFlagEvaluationReasonKey = attribute.Key("feature_flag.evaluation.reason") + + // FeatureFlagKeyKey is the attribute Key conforming to the "feature_flag.key" + // semantic conventions. It represents the lookup key of the feature flag. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "logo-color" + FeatureFlagKeyKey = attribute.Key("feature_flag.key") + + // FeatureFlagProviderNameKey is the attribute Key conforming to the + // "feature_flag.provider_name" semantic conventions. It represents the + // identifies the feature flag provider. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Flag Manager" + FeatureFlagProviderNameKey = attribute.Key("feature_flag.provider_name") + + // FeatureFlagSetIDKey is the attribute Key conforming to the + // "feature_flag.set.id" semantic conventions. It represents the identifier of + // the [flag set] to which the feature flag belongs. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "proj-1", "ab98sgs", "service1/dev" + // + // [flag set]: https://openfeature.dev/specification/glossary/#flag-set + FeatureFlagSetIDKey = attribute.Key("feature_flag.set.id") + + // FeatureFlagVariantKey is the attribute Key conforming to the + // "feature_flag.variant" semantic conventions. It represents a semantic + // identifier for an evaluated flag value. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "red", "true", "on" + // Note: A semantic identifier, commonly referred to as a variant, provides a + // means + // for referring to a value without including the value itself. This can + // provide additional context for understanding the meaning behind a value. + // For example, the variant `red` maybe be used for the value `#c05543`. + FeatureFlagVariantKey = attribute.Key("feature_flag.variant") + + // FeatureFlagVersionKey is the attribute Key conforming to the + // "feature_flag.version" semantic conventions. It represents the version of the + // ruleset used during the evaluation. This may be any stable value which + // uniquely identifies the ruleset. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1", "01ABCDEF" + FeatureFlagVersionKey = attribute.Key("feature_flag.version") +) + +// FeatureFlagContextID returns an attribute KeyValue conforming to the +// "feature_flag.context.id" semantic conventions. It represents the unique +// identifier for the flag evaluation context. For example, the targeting key. +func FeatureFlagContextID(val string) attribute.KeyValue { + return FeatureFlagContextIDKey.String(val) +} + +// FeatureFlagEvaluationErrorMessage returns an attribute KeyValue conforming to +// the "feature_flag.evaluation.error.message" semantic conventions. It +// represents a message explaining the nature of an error occurring during flag +// evaluation. +func FeatureFlagEvaluationErrorMessage(val string) attribute.KeyValue { + return FeatureFlagEvaluationErrorMessageKey.String(val) +} + +// FeatureFlagKey returns an attribute KeyValue conforming to the +// "feature_flag.key" semantic conventions. It represents the lookup key of the +// feature flag. +func FeatureFlagKey(val string) attribute.KeyValue { + return FeatureFlagKeyKey.String(val) +} + +// FeatureFlagProviderName returns an attribute KeyValue conforming to the +// "feature_flag.provider_name" semantic conventions. It represents the +// identifies the feature flag provider. +func FeatureFlagProviderName(val string) attribute.KeyValue { + return FeatureFlagProviderNameKey.String(val) +} + +// FeatureFlagSetID returns an attribute KeyValue conforming to the +// "feature_flag.set.id" semantic conventions. It represents the identifier of +// the [flag set] to which the feature flag belongs. +// +// [flag set]: https://openfeature.dev/specification/glossary/#flag-set +func FeatureFlagSetID(val string) attribute.KeyValue { + return FeatureFlagSetIDKey.String(val) +} + +// FeatureFlagVariant returns an attribute KeyValue conforming to the +// "feature_flag.variant" semantic conventions. It represents a semantic +// identifier for an evaluated flag value. +func FeatureFlagVariant(val string) attribute.KeyValue { + return FeatureFlagVariantKey.String(val) +} + +// FeatureFlagVersion returns an attribute KeyValue conforming to the +// "feature_flag.version" semantic conventions. It represents the version of the +// ruleset used during the evaluation. This may be any stable value which +// uniquely identifies the ruleset. +func FeatureFlagVersion(val string) attribute.KeyValue { + return FeatureFlagVersionKey.String(val) +} + +// Enum values for feature_flag.evaluation.reason +var ( + // The resolved value is static (no dynamic evaluation). + // Stability: development + FeatureFlagEvaluationReasonStatic = FeatureFlagEvaluationReasonKey.String("static") + // The resolved value fell back to a pre-configured value (no dynamic evaluation + // occurred or dynamic evaluation yielded no result). + // Stability: development + FeatureFlagEvaluationReasonDefault = FeatureFlagEvaluationReasonKey.String("default") + // The resolved value was the result of a dynamic evaluation, such as a rule or + // specific user-targeting. + // Stability: development + FeatureFlagEvaluationReasonTargetingMatch = FeatureFlagEvaluationReasonKey.String("targeting_match") + // The resolved value was the result of pseudorandom assignment. + // Stability: development + FeatureFlagEvaluationReasonSplit = FeatureFlagEvaluationReasonKey.String("split") + // The resolved value was retrieved from cache. + // Stability: development + FeatureFlagEvaluationReasonCached = FeatureFlagEvaluationReasonKey.String("cached") + // The resolved value was the result of the flag being disabled in the + // management system. + // Stability: development + FeatureFlagEvaluationReasonDisabled = FeatureFlagEvaluationReasonKey.String("disabled") + // The reason for the resolved value could not be determined. + // Stability: development + FeatureFlagEvaluationReasonUnknown = FeatureFlagEvaluationReasonKey.String("unknown") + // The resolved value is non-authoritative or possibly out of date + // Stability: development + FeatureFlagEvaluationReasonStale = FeatureFlagEvaluationReasonKey.String("stale") + // The resolved value was the result of an error. + // Stability: development + FeatureFlagEvaluationReasonError = FeatureFlagEvaluationReasonKey.String("error") +) + +// Namespace: file +const ( + // FileAccessedKey is the attribute Key conforming to the "file.accessed" + // semantic conventions. It represents the time when the file was last accessed, + // in ISO 8601 format. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2021-01-01T12:00:00Z" + // Note: This attribute might not be supported by some file systems — NFS, + // FAT32, in embedded OS, etc. + FileAccessedKey = attribute.Key("file.accessed") + + // FileAttributesKey is the attribute Key conforming to the "file.attributes" + // semantic conventions. It represents the array of file attributes. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "readonly", "hidden" + // Note: Attributes names depend on the OS or file system. Here’s a + // non-exhaustive list of values expected for this attribute: `archive`, + // `compressed`, `directory`, `encrypted`, `execute`, `hidden`, `immutable`, + // `journaled`, `read`, `readonly`, `symbolic link`, `system`, `temporary`, + // `write`. + FileAttributesKey = attribute.Key("file.attributes") + + // FileChangedKey is the attribute Key conforming to the "file.changed" semantic + // conventions. It represents the time when the file attributes or metadata was + // last changed, in ISO 8601 format. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2021-01-01T12:00:00Z" + // Note: `file.changed` captures the time when any of the file's properties or + // attributes (including the content) are changed, while `file.modified` + // captures the timestamp when the file content is modified. + FileChangedKey = attribute.Key("file.changed") + + // FileCreatedKey is the attribute Key conforming to the "file.created" semantic + // conventions. It represents the time when the file was created, in ISO 8601 + // format. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2021-01-01T12:00:00Z" + // Note: This attribute might not be supported by some file systems — NFS, + // FAT32, in embedded OS, etc. + FileCreatedKey = attribute.Key("file.created") + + // FileDirectoryKey is the attribute Key conforming to the "file.directory" + // semantic conventions. It represents the directory where the file is located. + // It should include the drive letter, when appropriate. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/home/user", "C:\Program Files\MyApp" + FileDirectoryKey = attribute.Key("file.directory") + + // FileExtensionKey is the attribute Key conforming to the "file.extension" + // semantic conventions. It represents the file extension, excluding the leading + // dot. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "png", "gz" + // Note: When the file name has multiple extensions (example.tar.gz), only the + // last one should be captured ("gz", not "tar.gz"). + FileExtensionKey = attribute.Key("file.extension") + + // FileForkNameKey is the attribute Key conforming to the "file.fork_name" + // semantic conventions. It represents the name of the fork. A fork is + // additional data associated with a filesystem object. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Zone.Identifer" + // Note: On Linux, a resource fork is used to store additional data with a + // filesystem object. A file always has at least one fork for the data portion, + // and additional forks may exist. + // On NTFS, this is analogous to an Alternate Data Stream (ADS), and the default + // data stream for a file is just called $DATA. Zone.Identifier is commonly used + // by Windows to track contents downloaded from the Internet. An ADS is + // typically of the form: C:\path\to\filename.extension:some_fork_name, and + // some_fork_name is the value that should populate `fork_name`. + // `filename.extension` should populate `file.name`, and `extension` should + // populate `file.extension`. The full path, `file.path`, will include the fork + // name. + FileForkNameKey = attribute.Key("file.fork_name") + + // FileGroupIDKey is the attribute Key conforming to the "file.group.id" + // semantic conventions. It represents the primary Group ID (GID) of the file. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1000" + FileGroupIDKey = attribute.Key("file.group.id") + + // FileGroupNameKey is the attribute Key conforming to the "file.group.name" + // semantic conventions. It represents the primary group name of the file. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "users" + FileGroupNameKey = attribute.Key("file.group.name") + + // FileInodeKey is the attribute Key conforming to the "file.inode" semantic + // conventions. It represents the inode representing the file in the filesystem. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "256383" + FileInodeKey = attribute.Key("file.inode") + + // FileModeKey is the attribute Key conforming to the "file.mode" semantic + // conventions. It represents the mode of the file in octal representation. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "0640" + FileModeKey = attribute.Key("file.mode") + + // FileModifiedKey is the attribute Key conforming to the "file.modified" + // semantic conventions. It represents the time when the file content was last + // modified, in ISO 8601 format. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2021-01-01T12:00:00Z" + FileModifiedKey = attribute.Key("file.modified") + + // FileNameKey is the attribute Key conforming to the "file.name" semantic + // conventions. It represents the name of the file including the extension, + // without the directory. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "example.png" + FileNameKey = attribute.Key("file.name") + + // FileOwnerIDKey is the attribute Key conforming to the "file.owner.id" + // semantic conventions. It represents the user ID (UID) or security identifier + // (SID) of the file owner. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1000" + FileOwnerIDKey = attribute.Key("file.owner.id") + + // FileOwnerNameKey is the attribute Key conforming to the "file.owner.name" + // semantic conventions. It represents the username of the file owner. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "root" + FileOwnerNameKey = attribute.Key("file.owner.name") + + // FilePathKey is the attribute Key conforming to the "file.path" semantic + // conventions. It represents the full path to the file, including the file + // name. It should include the drive letter, when appropriate. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/home/alice/example.png", "C:\Program Files\MyApp\myapp.exe" + FilePathKey = attribute.Key("file.path") + + // FileSizeKey is the attribute Key conforming to the "file.size" semantic + // conventions. It represents the file size in bytes. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + FileSizeKey = attribute.Key("file.size") + + // FileSymbolicLinkTargetPathKey is the attribute Key conforming to the + // "file.symbolic_link.target_path" semantic conventions. It represents the path + // to the target of a symbolic link. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/usr/bin/python3" + // Note: This attribute is only applicable to symbolic links. + FileSymbolicLinkTargetPathKey = attribute.Key("file.symbolic_link.target_path") +) + +// FileAccessed returns an attribute KeyValue conforming to the "file.accessed" +// semantic conventions. It represents the time when the file was last accessed, +// in ISO 8601 format. +func FileAccessed(val string) attribute.KeyValue { + return FileAccessedKey.String(val) +} + +// FileAttributes returns an attribute KeyValue conforming to the +// "file.attributes" semantic conventions. It represents the array of file +// attributes. +func FileAttributes(val ...string) attribute.KeyValue { + return FileAttributesKey.StringSlice(val) +} + +// FileChanged returns an attribute KeyValue conforming to the "file.changed" +// semantic conventions. It represents the time when the file attributes or +// metadata was last changed, in ISO 8601 format. +func FileChanged(val string) attribute.KeyValue { + return FileChangedKey.String(val) +} + +// FileCreated returns an attribute KeyValue conforming to the "file.created" +// semantic conventions. It represents the time when the file was created, in ISO +// 8601 format. +func FileCreated(val string) attribute.KeyValue { + return FileCreatedKey.String(val) +} + +// FileDirectory returns an attribute KeyValue conforming to the "file.directory" +// semantic conventions. It represents the directory where the file is located. +// It should include the drive letter, when appropriate. +func FileDirectory(val string) attribute.KeyValue { + return FileDirectoryKey.String(val) +} + +// FileExtension returns an attribute KeyValue conforming to the "file.extension" +// semantic conventions. It represents the file extension, excluding the leading +// dot. +func FileExtension(val string) attribute.KeyValue { + return FileExtensionKey.String(val) +} + +// FileForkName returns an attribute KeyValue conforming to the "file.fork_name" +// semantic conventions. It represents the name of the fork. A fork is additional +// data associated with a filesystem object. +func FileForkName(val string) attribute.KeyValue { + return FileForkNameKey.String(val) +} + +// FileGroupID returns an attribute KeyValue conforming to the "file.group.id" +// semantic conventions. It represents the primary Group ID (GID) of the file. +func FileGroupID(val string) attribute.KeyValue { + return FileGroupIDKey.String(val) +} + +// FileGroupName returns an attribute KeyValue conforming to the +// "file.group.name" semantic conventions. It represents the primary group name +// of the file. +func FileGroupName(val string) attribute.KeyValue { + return FileGroupNameKey.String(val) +} + +// FileInode returns an attribute KeyValue conforming to the "file.inode" +// semantic conventions. It represents the inode representing the file in the +// filesystem. +func FileInode(val string) attribute.KeyValue { + return FileInodeKey.String(val) +} + +// FileMode returns an attribute KeyValue conforming to the "file.mode" semantic +// conventions. It represents the mode of the file in octal representation. +func FileMode(val string) attribute.KeyValue { + return FileModeKey.String(val) +} + +// FileModified returns an attribute KeyValue conforming to the "file.modified" +// semantic conventions. It represents the time when the file content was last +// modified, in ISO 8601 format. +func FileModified(val string) attribute.KeyValue { + return FileModifiedKey.String(val) +} + +// FileName returns an attribute KeyValue conforming to the "file.name" semantic +// conventions. It represents the name of the file including the extension, +// without the directory. +func FileName(val string) attribute.KeyValue { + return FileNameKey.String(val) +} + +// FileOwnerID returns an attribute KeyValue conforming to the "file.owner.id" +// semantic conventions. It represents the user ID (UID) or security identifier +// (SID) of the file owner. +func FileOwnerID(val string) attribute.KeyValue { + return FileOwnerIDKey.String(val) +} + +// FileOwnerName returns an attribute KeyValue conforming to the +// "file.owner.name" semantic conventions. It represents the username of the file +// owner. +func FileOwnerName(val string) attribute.KeyValue { + return FileOwnerNameKey.String(val) +} + +// FilePath returns an attribute KeyValue conforming to the "file.path" semantic +// conventions. It represents the full path to the file, including the file name. +// It should include the drive letter, when appropriate. +func FilePath(val string) attribute.KeyValue { + return FilePathKey.String(val) +} + +// FileSize returns an attribute KeyValue conforming to the "file.size" semantic +// conventions. It represents the file size in bytes. +func FileSize(val int) attribute.KeyValue { + return FileSizeKey.Int(val) +} + +// FileSymbolicLinkTargetPath returns an attribute KeyValue conforming to the +// "file.symbolic_link.target_path" semantic conventions. It represents the path +// to the target of a symbolic link. +func FileSymbolicLinkTargetPath(val string) attribute.KeyValue { + return FileSymbolicLinkTargetPathKey.String(val) +} + +// Namespace: gcp +const ( + // GCPClientServiceKey is the attribute Key conforming to the + // "gcp.client.service" semantic conventions. It represents the identifies the + // Google Cloud service for which the official client library is intended. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "appengine", "run", "firestore", "alloydb", "spanner" + // Note: Intended to be a stable identifier for Google Cloud client libraries + // that is uniform across implementation languages. The value should be derived + // from the canonical service domain for the service; for example, + // 'foo.googleapis.com' should result in a value of 'foo'. + GCPClientServiceKey = attribute.Key("gcp.client.service") + + // GCPCloudRunJobExecutionKey is the attribute Key conforming to the + // "gcp.cloud_run.job.execution" semantic conventions. It represents the name of + // the Cloud Run [execution] being run for the Job, as set by the + // [`CLOUD_RUN_EXECUTION`] environment variable. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "job-name-xxxx", "sample-job-mdw84" + // + // [execution]: https://cloud.google.com/run/docs/managing/job-executions + // [`CLOUD_RUN_EXECUTION`]: https://cloud.google.com/run/docs/container-contract#jobs-env-vars + GCPCloudRunJobExecutionKey = attribute.Key("gcp.cloud_run.job.execution") + + // GCPCloudRunJobTaskIndexKey is the attribute Key conforming to the + // "gcp.cloud_run.job.task_index" semantic conventions. It represents the index + // for a task within an execution as provided by the [`CLOUD_RUN_TASK_INDEX`] + // environment variable. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 0, 1 + // + // [`CLOUD_RUN_TASK_INDEX`]: https://cloud.google.com/run/docs/container-contract#jobs-env-vars + GCPCloudRunJobTaskIndexKey = attribute.Key("gcp.cloud_run.job.task_index") + + // GCPGceInstanceHostnameKey is the attribute Key conforming to the + // "gcp.gce.instance.hostname" semantic conventions. It represents the hostname + // of a GCE instance. This is the full value of the default or [custom hostname] + // . + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-host1234.example.com", + // "sample-vm.us-west1-b.c.my-project.internal" + // + // [custom hostname]: https://cloud.google.com/compute/docs/instances/custom-hostname-vm + GCPGceInstanceHostnameKey = attribute.Key("gcp.gce.instance.hostname") + + // GCPGceInstanceNameKey is the attribute Key conforming to the + // "gcp.gce.instance.name" semantic conventions. It represents the instance name + // of a GCE instance. This is the value provided by `host.name`, the visible + // name of the instance in the Cloud Console UI, and the prefix for the default + // hostname of the instance as defined by the [default internal DNS name]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "instance-1", "my-vm-name" + // + // [default internal DNS name]: https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names + GCPGceInstanceNameKey = attribute.Key("gcp.gce.instance.name") +) + +// GCPClientService returns an attribute KeyValue conforming to the +// "gcp.client.service" semantic conventions. It represents the identifies the +// Google Cloud service for which the official client library is intended. +func GCPClientService(val string) attribute.KeyValue { + return GCPClientServiceKey.String(val) +} + +// GCPCloudRunJobExecution returns an attribute KeyValue conforming to the +// "gcp.cloud_run.job.execution" semantic conventions. It represents the name of +// the Cloud Run [execution] being run for the Job, as set by the +// [`CLOUD_RUN_EXECUTION`] environment variable. +// +// [execution]: https://cloud.google.com/run/docs/managing/job-executions +// [`CLOUD_RUN_EXECUTION`]: https://cloud.google.com/run/docs/container-contract#jobs-env-vars +func GCPCloudRunJobExecution(val string) attribute.KeyValue { + return GCPCloudRunJobExecutionKey.String(val) +} + +// GCPCloudRunJobTaskIndex returns an attribute KeyValue conforming to the +// "gcp.cloud_run.job.task_index" semantic conventions. It represents the index +// for a task within an execution as provided by the [`CLOUD_RUN_TASK_INDEX`] +// environment variable. +// +// [`CLOUD_RUN_TASK_INDEX`]: https://cloud.google.com/run/docs/container-contract#jobs-env-vars +func GCPCloudRunJobTaskIndex(val int) attribute.KeyValue { + return GCPCloudRunJobTaskIndexKey.Int(val) +} + +// GCPGceInstanceHostname returns an attribute KeyValue conforming to the +// "gcp.gce.instance.hostname" semantic conventions. It represents the hostname +// of a GCE instance. This is the full value of the default or [custom hostname] +// . +// +// [custom hostname]: https://cloud.google.com/compute/docs/instances/custom-hostname-vm +func GCPGceInstanceHostname(val string) attribute.KeyValue { + return GCPGceInstanceHostnameKey.String(val) +} + +// GCPGceInstanceName returns an attribute KeyValue conforming to the +// "gcp.gce.instance.name" semantic conventions. It represents the instance name +// of a GCE instance. This is the value provided by `host.name`, the visible name +// of the instance in the Cloud Console UI, and the prefix for the default +// hostname of the instance as defined by the [default internal DNS name]. +// +// [default internal DNS name]: https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names +func GCPGceInstanceName(val string) attribute.KeyValue { + return GCPGceInstanceNameKey.String(val) +} + +// Namespace: gen_ai +const ( + // GenAIOpenaiRequestResponseFormatKey is the attribute Key conforming to the + // "gen_ai.openai.request.response_format" semantic conventions. It represents + // the response format that is requested. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "json" + GenAIOpenaiRequestResponseFormatKey = attribute.Key("gen_ai.openai.request.response_format") + + // GenAIOpenaiRequestServiceTierKey is the attribute Key conforming to the + // "gen_ai.openai.request.service_tier" semantic conventions. It represents the + // service tier requested. May be a specific tier, default, or auto. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "auto", "default" + GenAIOpenaiRequestServiceTierKey = attribute.Key("gen_ai.openai.request.service_tier") + + // GenAIOpenaiResponseServiceTierKey is the attribute Key conforming to the + // "gen_ai.openai.response.service_tier" semantic conventions. It represents the + // service tier used for the response. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "scale", "default" + GenAIOpenaiResponseServiceTierKey = attribute.Key("gen_ai.openai.response.service_tier") + + // GenAIOpenaiResponseSystemFingerprintKey is the attribute Key conforming to + // the "gen_ai.openai.response.system_fingerprint" semantic conventions. It + // represents a fingerprint to track any eventual change in the Generative AI + // environment. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "fp_44709d6fcb" + GenAIOpenaiResponseSystemFingerprintKey = attribute.Key("gen_ai.openai.response.system_fingerprint") + + // GenAIOperationNameKey is the attribute Key conforming to the + // "gen_ai.operation.name" semantic conventions. It represents the name of the + // operation being performed. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: If one of the predefined values applies, but specific system uses a + // different name it's RECOMMENDED to document it in the semantic conventions + // for specific GenAI system and use system-specific name in the + // instrumentation. If a different name is not documented, instrumentation + // libraries SHOULD use applicable predefined value. + GenAIOperationNameKey = attribute.Key("gen_ai.operation.name") + + // GenAIRequestEncodingFormatsKey is the attribute Key conforming to the + // "gen_ai.request.encoding_formats" semantic conventions. It represents the + // encoding formats requested in an embeddings operation, if specified. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "base64"], ["float", "binary" + // Note: In some GenAI systems the encoding formats are called embedding types. + // Also, some GenAI systems only accept a single format per request. + GenAIRequestEncodingFormatsKey = attribute.Key("gen_ai.request.encoding_formats") + + // GenAIRequestFrequencyPenaltyKey is the attribute Key conforming to the + // "gen_ai.request.frequency_penalty" semantic conventions. It represents the + // frequency penalty setting for the GenAI request. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 0.1 + GenAIRequestFrequencyPenaltyKey = attribute.Key("gen_ai.request.frequency_penalty") + + // GenAIRequestMaxTokensKey is the attribute Key conforming to the + // "gen_ai.request.max_tokens" semantic conventions. It represents the maximum + // number of tokens the model generates for a request. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 100 + GenAIRequestMaxTokensKey = attribute.Key("gen_ai.request.max_tokens") + + // GenAIRequestModelKey is the attribute Key conforming to the + // "gen_ai.request.model" semantic conventions. It represents the name of the + // GenAI model a request is being made to. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: gpt-4 + GenAIRequestModelKey = attribute.Key("gen_ai.request.model") + + // GenAIRequestPresencePenaltyKey is the attribute Key conforming to the + // "gen_ai.request.presence_penalty" semantic conventions. It represents the + // presence penalty setting for the GenAI request. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 0.1 + GenAIRequestPresencePenaltyKey = attribute.Key("gen_ai.request.presence_penalty") + + // GenAIRequestSeedKey is the attribute Key conforming to the + // "gen_ai.request.seed" semantic conventions. It represents the requests with + // same seed value more likely to return same result. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 100 + GenAIRequestSeedKey = attribute.Key("gen_ai.request.seed") + + // GenAIRequestStopSequencesKey is the attribute Key conforming to the + // "gen_ai.request.stop_sequences" semantic conventions. It represents the list + // of sequences that the model will use to stop generating further tokens. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "forest", "lived" + GenAIRequestStopSequencesKey = attribute.Key("gen_ai.request.stop_sequences") + + // GenAIRequestTemperatureKey is the attribute Key conforming to the + // "gen_ai.request.temperature" semantic conventions. It represents the + // temperature setting for the GenAI request. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 0.0 + GenAIRequestTemperatureKey = attribute.Key("gen_ai.request.temperature") + + // GenAIRequestTopKKey is the attribute Key conforming to the + // "gen_ai.request.top_k" semantic conventions. It represents the top_k sampling + // setting for the GenAI request. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1.0 + GenAIRequestTopKKey = attribute.Key("gen_ai.request.top_k") + + // GenAIRequestTopPKey is the attribute Key conforming to the + // "gen_ai.request.top_p" semantic conventions. It represents the top_p sampling + // setting for the GenAI request. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1.0 + GenAIRequestTopPKey = attribute.Key("gen_ai.request.top_p") + + // GenAIResponseFinishReasonsKey is the attribute Key conforming to the + // "gen_ai.response.finish_reasons" semantic conventions. It represents the + // array of reasons the model stopped generating tokens, corresponding to each + // generation received. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "stop"], ["stop", "length" + GenAIResponseFinishReasonsKey = attribute.Key("gen_ai.response.finish_reasons") + + // GenAIResponseIDKey is the attribute Key conforming to the + // "gen_ai.response.id" semantic conventions. It represents the unique + // identifier for the completion. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "chatcmpl-123" + GenAIResponseIDKey = attribute.Key("gen_ai.response.id") + + // GenAIResponseModelKey is the attribute Key conforming to the + // "gen_ai.response.model" semantic conventions. It represents the name of the + // model that generated the response. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "gpt-4-0613" + GenAIResponseModelKey = attribute.Key("gen_ai.response.model") + + // GenAISystemKey is the attribute Key conforming to the "gen_ai.system" + // semantic conventions. It represents the Generative AI product as identified + // by the client or server instrumentation. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: openai + // Note: The `gen_ai.system` describes a family of GenAI models with specific + // model identified + // by `gen_ai.request.model` and `gen_ai.response.model` attributes. + // + // The actual GenAI product may differ from the one identified by the client. + // Multiple systems, including Azure OpenAI and Gemini, are accessible by OpenAI + // client + // libraries. In such cases, the `gen_ai.system` is set to `openai` based on the + // instrumentation's best knowledge, instead of the actual system. The + // `server.address` + // attribute may help identify the actual system in use for `openai`. + // + // For custom model, a custom friendly name SHOULD be used. + // If none of these options apply, the `gen_ai.system` SHOULD be set to `_OTHER` + // . + GenAISystemKey = attribute.Key("gen_ai.system") + + // GenAITokenTypeKey is the attribute Key conforming to the "gen_ai.token.type" + // semantic conventions. It represents the type of token being counted. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "input", "output" + GenAITokenTypeKey = attribute.Key("gen_ai.token.type") + + // GenAIUsageInputTokensKey is the attribute Key conforming to the + // "gen_ai.usage.input_tokens" semantic conventions. It represents the number of + // tokens used in the GenAI input (prompt). + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 100 + GenAIUsageInputTokensKey = attribute.Key("gen_ai.usage.input_tokens") + + // GenAIUsageOutputTokensKey is the attribute Key conforming to the + // "gen_ai.usage.output_tokens" semantic conventions. It represents the number + // of tokens used in the GenAI response (completion). + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 180 + GenAIUsageOutputTokensKey = attribute.Key("gen_ai.usage.output_tokens") +) + +// GenAIOpenaiResponseServiceTier returns an attribute KeyValue conforming to the +// "gen_ai.openai.response.service_tier" semantic conventions. It represents the +// service tier used for the response. +func GenAIOpenaiResponseServiceTier(val string) attribute.KeyValue { + return GenAIOpenaiResponseServiceTierKey.String(val) +} + +// GenAIOpenaiResponseSystemFingerprint returns an attribute KeyValue conforming +// to the "gen_ai.openai.response.system_fingerprint" semantic conventions. It +// represents a fingerprint to track any eventual change in the Generative AI +// environment. +func GenAIOpenaiResponseSystemFingerprint(val string) attribute.KeyValue { + return GenAIOpenaiResponseSystemFingerprintKey.String(val) +} + +// GenAIRequestEncodingFormats returns an attribute KeyValue conforming to the +// "gen_ai.request.encoding_formats" semantic conventions. It represents the +// encoding formats requested in an embeddings operation, if specified. +func GenAIRequestEncodingFormats(val ...string) attribute.KeyValue { + return GenAIRequestEncodingFormatsKey.StringSlice(val) +} + +// GenAIRequestFrequencyPenalty returns an attribute KeyValue conforming to the +// "gen_ai.request.frequency_penalty" semantic conventions. It represents the +// frequency penalty setting for the GenAI request. +func GenAIRequestFrequencyPenalty(val float64) attribute.KeyValue { + return GenAIRequestFrequencyPenaltyKey.Float64(val) +} + +// GenAIRequestMaxTokens returns an attribute KeyValue conforming to the +// "gen_ai.request.max_tokens" semantic conventions. It represents the maximum +// number of tokens the model generates for a request. +func GenAIRequestMaxTokens(val int) attribute.KeyValue { + return GenAIRequestMaxTokensKey.Int(val) +} + +// GenAIRequestModel returns an attribute KeyValue conforming to the +// "gen_ai.request.model" semantic conventions. It represents the name of the +// GenAI model a request is being made to. +func GenAIRequestModel(val string) attribute.KeyValue { + return GenAIRequestModelKey.String(val) +} + +// GenAIRequestPresencePenalty returns an attribute KeyValue conforming to the +// "gen_ai.request.presence_penalty" semantic conventions. It represents the +// presence penalty setting for the GenAI request. +func GenAIRequestPresencePenalty(val float64) attribute.KeyValue { + return GenAIRequestPresencePenaltyKey.Float64(val) +} + +// GenAIRequestSeed returns an attribute KeyValue conforming to the +// "gen_ai.request.seed" semantic conventions. It represents the requests with +// same seed value more likely to return same result. +func GenAIRequestSeed(val int) attribute.KeyValue { + return GenAIRequestSeedKey.Int(val) +} + +// GenAIRequestStopSequences returns an attribute KeyValue conforming to the +// "gen_ai.request.stop_sequences" semantic conventions. It represents the list +// of sequences that the model will use to stop generating further tokens. +func GenAIRequestStopSequences(val ...string) attribute.KeyValue { + return GenAIRequestStopSequencesKey.StringSlice(val) +} + +// GenAIRequestTemperature returns an attribute KeyValue conforming to the +// "gen_ai.request.temperature" semantic conventions. It represents the +// temperature setting for the GenAI request. +func GenAIRequestTemperature(val float64) attribute.KeyValue { + return GenAIRequestTemperatureKey.Float64(val) +} + +// GenAIRequestTopK returns an attribute KeyValue conforming to the +// "gen_ai.request.top_k" semantic conventions. It represents the top_k sampling +// setting for the GenAI request. +func GenAIRequestTopK(val float64) attribute.KeyValue { + return GenAIRequestTopKKey.Float64(val) +} + +// GenAIRequestTopP returns an attribute KeyValue conforming to the +// "gen_ai.request.top_p" semantic conventions. It represents the top_p sampling +// setting for the GenAI request. +func GenAIRequestTopP(val float64) attribute.KeyValue { + return GenAIRequestTopPKey.Float64(val) +} + +// GenAIResponseFinishReasons returns an attribute KeyValue conforming to the +// "gen_ai.response.finish_reasons" semantic conventions. It represents the array +// of reasons the model stopped generating tokens, corresponding to each +// generation received. +func GenAIResponseFinishReasons(val ...string) attribute.KeyValue { + return GenAIResponseFinishReasonsKey.StringSlice(val) +} + +// GenAIResponseID returns an attribute KeyValue conforming to the +// "gen_ai.response.id" semantic conventions. It represents the unique identifier +// for the completion. +func GenAIResponseID(val string) attribute.KeyValue { + return GenAIResponseIDKey.String(val) +} + +// GenAIResponseModel returns an attribute KeyValue conforming to the +// "gen_ai.response.model" semantic conventions. It represents the name of the +// model that generated the response. +func GenAIResponseModel(val string) attribute.KeyValue { + return GenAIResponseModelKey.String(val) +} + +// GenAIUsageInputTokens returns an attribute KeyValue conforming to the +// "gen_ai.usage.input_tokens" semantic conventions. It represents the number of +// tokens used in the GenAI input (prompt). +func GenAIUsageInputTokens(val int) attribute.KeyValue { + return GenAIUsageInputTokensKey.Int(val) +} + +// GenAIUsageOutputTokens returns an attribute KeyValue conforming to the +// "gen_ai.usage.output_tokens" semantic conventions. It represents the number of +// tokens used in the GenAI response (completion). +func GenAIUsageOutputTokens(val int) attribute.KeyValue { + return GenAIUsageOutputTokensKey.Int(val) +} + +// Enum values for gen_ai.openai.request.response_format +var ( + // Text response format + // Stability: development + GenAIOpenaiRequestResponseFormatText = GenAIOpenaiRequestResponseFormatKey.String("text") + // JSON object response format + // Stability: development + GenAIOpenaiRequestResponseFormatJSONObject = GenAIOpenaiRequestResponseFormatKey.String("json_object") + // JSON schema response format + // Stability: development + GenAIOpenaiRequestResponseFormatJSONSchema = GenAIOpenaiRequestResponseFormatKey.String("json_schema") +) + +// Enum values for gen_ai.openai.request.service_tier +var ( + // The system will utilize scale tier credits until they are exhausted. + // Stability: development + GenAIOpenaiRequestServiceTierAuto = GenAIOpenaiRequestServiceTierKey.String("auto") + // The system will utilize the default scale tier. + // Stability: development + GenAIOpenaiRequestServiceTierDefault = GenAIOpenaiRequestServiceTierKey.String("default") +) + +// Enum values for gen_ai.operation.name +var ( + // Chat completion operation such as [OpenAI Chat API] + // Stability: development + // + // [OpenAI Chat API]: https://platform.openai.com/docs/api-reference/chat + GenAIOperationNameChat = GenAIOperationNameKey.String("chat") + // Text completions operation such as [OpenAI Completions API (Legacy)] + // Stability: development + // + // [OpenAI Completions API (Legacy)]: https://platform.openai.com/docs/api-reference/completions + GenAIOperationNameTextCompletion = GenAIOperationNameKey.String("text_completion") + // Embeddings operation such as [OpenAI Create embeddings API] + // Stability: development + // + // [OpenAI Create embeddings API]: https://platform.openai.com/docs/api-reference/embeddings/create + GenAIOperationNameEmbeddings = GenAIOperationNameKey.String("embeddings") +) + +// Enum values for gen_ai.system +var ( + // OpenAI + // Stability: development + GenAISystemOpenai = GenAISystemKey.String("openai") + // Vertex AI + // Stability: development + GenAISystemVertexAI = GenAISystemKey.String("vertex_ai") + // Gemini + // Stability: development + GenAISystemGemini = GenAISystemKey.String("gemini") + // Anthropic + // Stability: development + GenAISystemAnthropic = GenAISystemKey.String("anthropic") + // Cohere + // Stability: development + GenAISystemCohere = GenAISystemKey.String("cohere") + // Azure AI Inference + // Stability: development + GenAISystemAzAIInference = GenAISystemKey.String("az.ai.inference") + // Azure OpenAI + // Stability: development + GenAISystemAzAIOpenai = GenAISystemKey.String("az.ai.openai") + // IBM Watsonx AI + // Stability: development + GenAISystemIbmWatsonxAI = GenAISystemKey.String("ibm.watsonx.ai") + // AWS Bedrock + // Stability: development + GenAISystemAWSBedrock = GenAISystemKey.String("aws.bedrock") + // Perplexity + // Stability: development + GenAISystemPerplexity = GenAISystemKey.String("perplexity") + // xAI + // Stability: development + GenAISystemXai = GenAISystemKey.String("xai") + // DeepSeek + // Stability: development + GenAISystemDeepseek = GenAISystemKey.String("deepseek") + // Groq + // Stability: development + GenAISystemGroq = GenAISystemKey.String("groq") + // Mistral AI + // Stability: development + GenAISystemMistralAI = GenAISystemKey.String("mistral_ai") +) + +// Enum values for gen_ai.token.type +var ( + // Input tokens (prompt, input, etc.) + // Stability: development + GenAITokenTypeInput = GenAITokenTypeKey.String("input") + // Output tokens (completion, response, etc.) + // Stability: development + GenAITokenTypeCompletion = GenAITokenTypeKey.String("output") +) + +// Namespace: geo +const ( + // GeoContinentCodeKey is the attribute Key conforming to the + // "geo.continent.code" semantic conventions. It represents the two-letter code + // representing continent’s name. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + GeoContinentCodeKey = attribute.Key("geo.continent.code") + + // GeoCountryIsoCodeKey is the attribute Key conforming to the + // "geo.country.iso_code" semantic conventions. It represents the two-letter ISO + // Country Code ([ISO 3166-1 alpha2]). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "CA" + // + // [ISO 3166-1 alpha2]: https://wikipedia.org/wiki/ISO_3166-1#Codes + GeoCountryIsoCodeKey = attribute.Key("geo.country.iso_code") + + // GeoLocalityNameKey is the attribute Key conforming to the "geo.locality.name" + // semantic conventions. It represents the locality name. Represents the name of + // a city, town, village, or similar populated place. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Montreal", "Berlin" + GeoLocalityNameKey = attribute.Key("geo.locality.name") + + // GeoLocationLatKey is the attribute Key conforming to the "geo.location.lat" + // semantic conventions. It represents the latitude of the geo location in + // [WGS84]. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 45.505918 + // + // [WGS84]: https://wikipedia.org/wiki/World_Geodetic_System#WGS84 + GeoLocationLatKey = attribute.Key("geo.location.lat") + + // GeoLocationLonKey is the attribute Key conforming to the "geo.location.lon" + // semantic conventions. It represents the longitude of the geo location in + // [WGS84]. + // + // Type: double + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: -73.61483 + // + // [WGS84]: https://wikipedia.org/wiki/World_Geodetic_System#WGS84 + GeoLocationLonKey = attribute.Key("geo.location.lon") + + // GeoPostalCodeKey is the attribute Key conforming to the "geo.postal_code" + // semantic conventions. It represents the postal code associated with the + // location. Values appropriate for this field may also be known as a postcode + // or ZIP code and will vary widely from country to country. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "94040" + GeoPostalCodeKey = attribute.Key("geo.postal_code") + + // GeoRegionIsoCodeKey is the attribute Key conforming to the + // "geo.region.iso_code" semantic conventions. It represents the region ISO code + // ([ISO 3166-2]). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "CA-QC" + // + // [ISO 3166-2]: https://wikipedia.org/wiki/ISO_3166-2 + GeoRegionIsoCodeKey = attribute.Key("geo.region.iso_code") +) + +// GeoCountryIsoCode returns an attribute KeyValue conforming to the +// "geo.country.iso_code" semantic conventions. It represents the two-letter ISO +// Country Code ([ISO 3166-1 alpha2]). +// +// [ISO 3166-1 alpha2]: https://wikipedia.org/wiki/ISO_3166-1#Codes +func GeoCountryIsoCode(val string) attribute.KeyValue { + return GeoCountryIsoCodeKey.String(val) +} + +// GeoLocalityName returns an attribute KeyValue conforming to the +// "geo.locality.name" semantic conventions. It represents the locality name. +// Represents the name of a city, town, village, or similar populated place. +func GeoLocalityName(val string) attribute.KeyValue { + return GeoLocalityNameKey.String(val) +} + +// GeoLocationLat returns an attribute KeyValue conforming to the +// "geo.location.lat" semantic conventions. It represents the latitude of the geo +// location in [WGS84]. +// +// [WGS84]: https://wikipedia.org/wiki/World_Geodetic_System#WGS84 +func GeoLocationLat(val float64) attribute.KeyValue { + return GeoLocationLatKey.Float64(val) +} + +// GeoLocationLon returns an attribute KeyValue conforming to the +// "geo.location.lon" semantic conventions. It represents the longitude of the +// geo location in [WGS84]. +// +// [WGS84]: https://wikipedia.org/wiki/World_Geodetic_System#WGS84 +func GeoLocationLon(val float64) attribute.KeyValue { + return GeoLocationLonKey.Float64(val) +} + +// GeoPostalCode returns an attribute KeyValue conforming to the +// "geo.postal_code" semantic conventions. It represents the postal code +// associated with the location. Values appropriate for this field may also be +// known as a postcode or ZIP code and will vary widely from country to country. +func GeoPostalCode(val string) attribute.KeyValue { + return GeoPostalCodeKey.String(val) +} + +// GeoRegionIsoCode returns an attribute KeyValue conforming to the +// "geo.region.iso_code" semantic conventions. It represents the region ISO code +// ([ISO 3166-2]). +// +// [ISO 3166-2]: https://wikipedia.org/wiki/ISO_3166-2 +func GeoRegionIsoCode(val string) attribute.KeyValue { + return GeoRegionIsoCodeKey.String(val) +} + +// Enum values for geo.continent.code +var ( + // Africa + // Stability: development + GeoContinentCodeAf = GeoContinentCodeKey.String("AF") + // Antarctica + // Stability: development + GeoContinentCodeAn = GeoContinentCodeKey.String("AN") + // Asia + // Stability: development + GeoContinentCodeAs = GeoContinentCodeKey.String("AS") + // Europe + // Stability: development + GeoContinentCodeEu = GeoContinentCodeKey.String("EU") + // North America + // Stability: development + GeoContinentCodeNa = GeoContinentCodeKey.String("NA") + // Oceania + // Stability: development + GeoContinentCodeOc = GeoContinentCodeKey.String("OC") + // South America + // Stability: development + GeoContinentCodeSa = GeoContinentCodeKey.String("SA") +) + +// Namespace: go +const ( + // GoMemoryTypeKey is the attribute Key conforming to the "go.memory.type" + // semantic conventions. It represents the type of memory. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "other", "stack" + GoMemoryTypeKey = attribute.Key("go.memory.type") +) + +// Enum values for go.memory.type +var ( + // Memory allocated from the heap that is reserved for stack space, whether or + // not it is currently in-use. + // Stability: development + GoMemoryTypeStack = GoMemoryTypeKey.String("stack") + // Memory used by the Go runtime, excluding other categories of memory usage + // described in this enumeration. + // Stability: development + GoMemoryTypeOther = GoMemoryTypeKey.String("other") +) + +// Namespace: graphql +const ( + // GraphqlDocumentKey is the attribute Key conforming to the "graphql.document" + // semantic conventions. It represents the GraphQL document being executed. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: query findBookById { bookById(id: ?) { name } } + // Note: The value may be sanitized to exclude sensitive information. + GraphqlDocumentKey = attribute.Key("graphql.document") + + // GraphqlOperationNameKey is the attribute Key conforming to the + // "graphql.operation.name" semantic conventions. It represents the name of the + // operation being executed. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: findBookById + GraphqlOperationNameKey = attribute.Key("graphql.operation.name") + + // GraphqlOperationTypeKey is the attribute Key conforming to the + // "graphql.operation.type" semantic conventions. It represents the type of the + // operation being executed. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "query", "mutation", "subscription" + GraphqlOperationTypeKey = attribute.Key("graphql.operation.type") +) + +// GraphqlDocument returns an attribute KeyValue conforming to the +// "graphql.document" semantic conventions. It represents the GraphQL document +// being executed. +func GraphqlDocument(val string) attribute.KeyValue { + return GraphqlDocumentKey.String(val) +} + +// GraphqlOperationName returns an attribute KeyValue conforming to the +// "graphql.operation.name" semantic conventions. It represents the name of the +// operation being executed. +func GraphqlOperationName(val string) attribute.KeyValue { + return GraphqlOperationNameKey.String(val) +} + +// Enum values for graphql.operation.type +var ( + // GraphQL query + // Stability: development + GraphqlOperationTypeQuery = GraphqlOperationTypeKey.String("query") + // GraphQL mutation + // Stability: development + GraphqlOperationTypeMutation = GraphqlOperationTypeKey.String("mutation") + // GraphQL subscription + // Stability: development + GraphqlOperationTypeSubscription = GraphqlOperationTypeKey.String("subscription") +) + +// Namespace: heroku +const ( + // HerokuAppIDKey is the attribute Key conforming to the "heroku.app.id" + // semantic conventions. It represents the unique identifier for the + // application. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2daa2797-e42b-4624-9322-ec3f968df4da" + HerokuAppIDKey = attribute.Key("heroku.app.id") + + // HerokuReleaseCommitKey is the attribute Key conforming to the + // "heroku.release.commit" semantic conventions. It represents the commit hash + // for the current release. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "e6134959463efd8966b20e75b913cafe3f5ec" + HerokuReleaseCommitKey = attribute.Key("heroku.release.commit") + + // HerokuReleaseCreationTimestampKey is the attribute Key conforming to the + // "heroku.release.creation_timestamp" semantic conventions. It represents the + // time and date the release was created. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2022-10-23T18:00:42Z" + HerokuReleaseCreationTimestampKey = attribute.Key("heroku.release.creation_timestamp") +) + +// HerokuAppID returns an attribute KeyValue conforming to the "heroku.app.id" +// semantic conventions. It represents the unique identifier for the application. +func HerokuAppID(val string) attribute.KeyValue { + return HerokuAppIDKey.String(val) +} + +// HerokuReleaseCommit returns an attribute KeyValue conforming to the +// "heroku.release.commit" semantic conventions. It represents the commit hash +// for the current release. +func HerokuReleaseCommit(val string) attribute.KeyValue { + return HerokuReleaseCommitKey.String(val) +} + +// HerokuReleaseCreationTimestamp returns an attribute KeyValue conforming to the +// "heroku.release.creation_timestamp" semantic conventions. It represents the +// time and date the release was created. +func HerokuReleaseCreationTimestamp(val string) attribute.KeyValue { + return HerokuReleaseCreationTimestampKey.String(val) +} + +// Namespace: host +const ( + // HostArchKey is the attribute Key conforming to the "host.arch" semantic + // conventions. It represents the CPU architecture the host system is running + // on. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + HostArchKey = attribute.Key("host.arch") + + // HostCPUCacheL2SizeKey is the attribute Key conforming to the + // "host.cpu.cache.l2.size" semantic conventions. It represents the amount of + // level 2 memory cache available to the processor (in Bytes). + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 12288000 + HostCPUCacheL2SizeKey = attribute.Key("host.cpu.cache.l2.size") + + // HostCPUFamilyKey is the attribute Key conforming to the "host.cpu.family" + // semantic conventions. It represents the family or generation of the CPU. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "6", "PA-RISC 1.1e" + HostCPUFamilyKey = attribute.Key("host.cpu.family") + + // HostCPUModelIDKey is the attribute Key conforming to the "host.cpu.model.id" + // semantic conventions. It represents the model identifier. It provides more + // granular information about the CPU, distinguishing it from other CPUs within + // the same family. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "6", "9000/778/B180L" + HostCPUModelIDKey = attribute.Key("host.cpu.model.id") + + // HostCPUModelNameKey is the attribute Key conforming to the + // "host.cpu.model.name" semantic conventions. It represents the model + // designation of the processor. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz" + HostCPUModelNameKey = attribute.Key("host.cpu.model.name") + + // HostCPUSteppingKey is the attribute Key conforming to the "host.cpu.stepping" + // semantic conventions. It represents the stepping or core revisions. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1", "r1p1" + HostCPUSteppingKey = attribute.Key("host.cpu.stepping") + + // HostCPUVendorIDKey is the attribute Key conforming to the + // "host.cpu.vendor.id" semantic conventions. It represents the processor + // manufacturer identifier. A maximum 12-character string. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "GenuineIntel" + // Note: [CPUID] command returns the vendor ID string in EBX, EDX and ECX + // registers. Writing these to memory in this order results in a 12-character + // string. + // + // [CPUID]: https://wiki.osdev.org/CPUID + HostCPUVendorIDKey = attribute.Key("host.cpu.vendor.id") + + // HostIDKey is the attribute Key conforming to the "host.id" semantic + // conventions. It represents the unique host ID. For Cloud, this must be the + // instance_id assigned by the cloud provider. For non-containerized systems, + // this should be the `machine-id`. See the table below for the sources to use + // to determine the `machine-id` based on operating system. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "fdbf79e8af94cb7f9e8df36789187052" + HostIDKey = attribute.Key("host.id") + + // HostImageIDKey is the attribute Key conforming to the "host.image.id" + // semantic conventions. It represents the vM image ID or host OS image ID. For + // Cloud, this value is from the provider. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "ami-07b06b442921831e5" + HostImageIDKey = attribute.Key("host.image.id") + + // HostImageNameKey is the attribute Key conforming to the "host.image.name" + // semantic conventions. It represents the name of the VM image or OS install + // the host was instantiated from. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "infra-ami-eks-worker-node-7d4ec78312", "CentOS-8-x86_64-1905" + HostImageNameKey = attribute.Key("host.image.name") + + // HostImageVersionKey is the attribute Key conforming to the + // "host.image.version" semantic conventions. It represents the version string + // of the VM image or host OS as defined in [Version Attributes]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "0.1" + // + // [Version Attributes]: /docs/resource/README.md#version-attributes + HostImageVersionKey = attribute.Key("host.image.version") + + // HostIPKey is the attribute Key conforming to the "host.ip" semantic + // conventions. It represents the available IP addresses of the host, excluding + // loopback interfaces. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "192.168.1.140", "fe80::abc2:4a28:737a:609e" + // Note: IPv4 Addresses MUST be specified in dotted-quad notation. IPv6 + // addresses MUST be specified in the [RFC 5952] format. + // + // [RFC 5952]: https://www.rfc-editor.org/rfc/rfc5952.html + HostIPKey = attribute.Key("host.ip") + + // HostMacKey is the attribute Key conforming to the "host.mac" semantic + // conventions. It represents the available MAC addresses of the host, excluding + // loopback interfaces. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "AC-DE-48-23-45-67", "AC-DE-48-23-45-67-01-9F" + // Note: MAC Addresses MUST be represented in [IEEE RA hexadecimal form]: as + // hyphen-separated octets in uppercase hexadecimal form from most to least + // significant. + // + // [IEEE RA hexadecimal form]: https://standards.ieee.org/wp-content/uploads/import/documents/tutorials/eui.pdf + HostMacKey = attribute.Key("host.mac") + + // HostNameKey is the attribute Key conforming to the "host.name" semantic + // conventions. It represents the name of the host. On Unix systems, it may + // contain what the hostname command returns, or the fully qualified hostname, + // or another name specified by the user. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry-test" + HostNameKey = attribute.Key("host.name") + + // HostTypeKey is the attribute Key conforming to the "host.type" semantic + // conventions. It represents the type of host. For Cloud, this must be the + // machine type. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "n1-standard-1" + HostTypeKey = attribute.Key("host.type") +) + +// HostCPUCacheL2Size returns an attribute KeyValue conforming to the +// "host.cpu.cache.l2.size" semantic conventions. It represents the amount of +// level 2 memory cache available to the processor (in Bytes). +func HostCPUCacheL2Size(val int) attribute.KeyValue { + return HostCPUCacheL2SizeKey.Int(val) +} + +// HostCPUFamily returns an attribute KeyValue conforming to the +// "host.cpu.family" semantic conventions. It represents the family or generation +// of the CPU. +func HostCPUFamily(val string) attribute.KeyValue { + return HostCPUFamilyKey.String(val) +} + +// HostCPUModelID returns an attribute KeyValue conforming to the +// "host.cpu.model.id" semantic conventions. It represents the model identifier. +// It provides more granular information about the CPU, distinguishing it from +// other CPUs within the same family. +func HostCPUModelID(val string) attribute.KeyValue { + return HostCPUModelIDKey.String(val) +} + +// HostCPUModelName returns an attribute KeyValue conforming to the +// "host.cpu.model.name" semantic conventions. It represents the model +// designation of the processor. +func HostCPUModelName(val string) attribute.KeyValue { + return HostCPUModelNameKey.String(val) +} + +// HostCPUStepping returns an attribute KeyValue conforming to the +// "host.cpu.stepping" semantic conventions. It represents the stepping or core +// revisions. +func HostCPUStepping(val string) attribute.KeyValue { + return HostCPUSteppingKey.String(val) +} + +// HostCPUVendorID returns an attribute KeyValue conforming to the +// "host.cpu.vendor.id" semantic conventions. It represents the processor +// manufacturer identifier. A maximum 12-character string. +func HostCPUVendorID(val string) attribute.KeyValue { + return HostCPUVendorIDKey.String(val) +} + +// HostID returns an attribute KeyValue conforming to the "host.id" semantic +// conventions. It represents the unique host ID. For Cloud, this must be the +// instance_id assigned by the cloud provider. For non-containerized systems, +// this should be the `machine-id`. See the table below for the sources to use to +// determine the `machine-id` based on operating system. +func HostID(val string) attribute.KeyValue { + return HostIDKey.String(val) +} + +// HostImageID returns an attribute KeyValue conforming to the "host.image.id" +// semantic conventions. It represents the vM image ID or host OS image ID. For +// Cloud, this value is from the provider. +func HostImageID(val string) attribute.KeyValue { + return HostImageIDKey.String(val) +} + +// HostImageName returns an attribute KeyValue conforming to the +// "host.image.name" semantic conventions. It represents the name of the VM image +// or OS install the host was instantiated from. +func HostImageName(val string) attribute.KeyValue { + return HostImageNameKey.String(val) +} + +// HostImageVersion returns an attribute KeyValue conforming to the +// "host.image.version" semantic conventions. It represents the version string of +// the VM image or host OS as defined in [Version Attributes]. +// +// [Version Attributes]: /docs/resource/README.md#version-attributes +func HostImageVersion(val string) attribute.KeyValue { + return HostImageVersionKey.String(val) +} + +// HostIP returns an attribute KeyValue conforming to the "host.ip" semantic +// conventions. It represents the available IP addresses of the host, excluding +// loopback interfaces. +func HostIP(val ...string) attribute.KeyValue { + return HostIPKey.StringSlice(val) +} + +// HostMac returns an attribute KeyValue conforming to the "host.mac" semantic +// conventions. It represents the available MAC addresses of the host, excluding +// loopback interfaces. +func HostMac(val ...string) attribute.KeyValue { + return HostMacKey.StringSlice(val) +} + +// HostName returns an attribute KeyValue conforming to the "host.name" semantic +// conventions. It represents the name of the host. On Unix systems, it may +// contain what the hostname command returns, or the fully qualified hostname, or +// another name specified by the user. +func HostName(val string) attribute.KeyValue { + return HostNameKey.String(val) +} + +// HostType returns an attribute KeyValue conforming to the "host.type" semantic +// conventions. It represents the type of host. For Cloud, this must be the +// machine type. +func HostType(val string) attribute.KeyValue { + return HostTypeKey.String(val) +} + +// Enum values for host.arch +var ( + // AMD64 + // Stability: development + HostArchAMD64 = HostArchKey.String("amd64") + // ARM32 + // Stability: development + HostArchARM32 = HostArchKey.String("arm32") + // ARM64 + // Stability: development + HostArchARM64 = HostArchKey.String("arm64") + // Itanium + // Stability: development + HostArchIA64 = HostArchKey.String("ia64") + // 32-bit PowerPC + // Stability: development + HostArchPPC32 = HostArchKey.String("ppc32") + // 64-bit PowerPC + // Stability: development + HostArchPPC64 = HostArchKey.String("ppc64") + // IBM z/Architecture + // Stability: development + HostArchS390x = HostArchKey.String("s390x") + // 32-bit x86 + // Stability: development + HostArchX86 = HostArchKey.String("x86") +) + +// Namespace: http +const ( + // HTTPConnectionStateKey is the attribute Key conforming to the + // "http.connection.state" semantic conventions. It represents the state of the + // HTTP connection in the HTTP connection pool. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "active", "idle" + HTTPConnectionStateKey = attribute.Key("http.connection.state") + + // HTTPRequestBodySizeKey is the attribute Key conforming to the + // "http.request.body.size" semantic conventions. It represents the size of the + // request payload body in bytes. This is the number of bytes transferred + // excluding headers and is often, but not always, present as the + // [Content-Length] header. For requests using transport encoding, this should + // be the compressed size. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // [Content-Length]: https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length + HTTPRequestBodySizeKey = attribute.Key("http.request.body.size") + + // HTTPRequestMethodKey is the attribute Key conforming to the + // "http.request.method" semantic conventions. It represents the hTTP request + // method. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "GET", "POST", "HEAD" + // Note: HTTP request method value SHOULD be "known" to the instrumentation. + // By default, this convention defines "known" methods as the ones listed in + // [RFC9110] + // and the PATCH method defined in [RFC5789]. + // + // If the HTTP request method is not known to instrumentation, it MUST set the + // `http.request.method` attribute to `_OTHER`. + // + // If the HTTP instrumentation could end up converting valid HTTP request + // methods to `_OTHER`, then it MUST provide a way to override + // the list of known HTTP methods. If this override is done via environment + // variable, then the environment variable MUST be named + // OTEL_INSTRUMENTATION_HTTP_KNOWN_METHODS and support a comma-separated list of + // case-sensitive known HTTP methods + // (this list MUST be a full override of the default known method, it is not a + // list of known methods in addition to the defaults). + // + // HTTP method names are case-sensitive and `http.request.method` attribute + // value MUST match a known HTTP method name exactly. + // Instrumentations for specific web frameworks that consider HTTP methods to be + // case insensitive, SHOULD populate a canonical equivalent. + // Tracing instrumentations that do so, MUST also set + // `http.request.method_original` to the original value. + // + // [RFC9110]: https://www.rfc-editor.org/rfc/rfc9110.html#name-methods + // [RFC5789]: https://www.rfc-editor.org/rfc/rfc5789.html + HTTPRequestMethodKey = attribute.Key("http.request.method") + + // HTTPRequestMethodOriginalKey is the attribute Key conforming to the + // "http.request.method_original" semantic conventions. It represents the + // original HTTP method sent by the client in the request line. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "GeT", "ACL", "foo" + HTTPRequestMethodOriginalKey = attribute.Key("http.request.method_original") + + // HTTPRequestResendCountKey is the attribute Key conforming to the + // "http.request.resend_count" semantic conventions. It represents the ordinal + // number of request resending attempt (for any reason, including redirects). + // + // Type: int + // RequirementLevel: Recommended + // Stability: Stable + // + // Note: The resend count SHOULD be updated each time an HTTP request gets + // resent by the client, regardless of what was the cause of the resending (e.g. + // redirection, authorization failure, 503 Server Unavailable, network issues, + // or any other). + HTTPRequestResendCountKey = attribute.Key("http.request.resend_count") + + // HTTPRequestSizeKey is the attribute Key conforming to the "http.request.size" + // semantic conventions. It represents the total size of the request in bytes. + // This should be the total number of bytes sent over the wire, including the + // request line (HTTP/1.1), framing (HTTP/2 and HTTP/3), headers, and request + // body if any. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + HTTPRequestSizeKey = attribute.Key("http.request.size") + + // HTTPResponseBodySizeKey is the attribute Key conforming to the + // "http.response.body.size" semantic conventions. It represents the size of the + // response payload body in bytes. This is the number of bytes transferred + // excluding headers and is often, but not always, present as the + // [Content-Length] header. For requests using transport encoding, this should + // be the compressed size. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // [Content-Length]: https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length + HTTPResponseBodySizeKey = attribute.Key("http.response.body.size") + + // HTTPResponseSizeKey is the attribute Key conforming to the + // "http.response.size" semantic conventions. It represents the total size of + // the response in bytes. This should be the total number of bytes sent over the + // wire, including the status line (HTTP/1.1), framing (HTTP/2 and HTTP/3), + // headers, and response body and trailers if any. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + HTTPResponseSizeKey = attribute.Key("http.response.size") + + // HTTPResponseStatusCodeKey is the attribute Key conforming to the + // "http.response.status_code" semantic conventions. It represents the + // [HTTP response status code]. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: 200 + // + // [HTTP response status code]: https://tools.ietf.org/html/rfc7231#section-6 + HTTPResponseStatusCodeKey = attribute.Key("http.response.status_code") + + // HTTPRouteKey is the attribute Key conforming to the "http.route" semantic + // conventions. It represents the matched route, that is, the path template in + // the format used by the respective server framework. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "/users/:userID?", "{controller}/{action}/{id?}" + // Note: MUST NOT be populated when this is not supported by the HTTP server + // framework as the route attribute should have low-cardinality and the URI path + // can NOT substitute it. + // SHOULD include the [application root] if there is one. + // + // [application root]: /docs/http/http-spans.md#http-server-definitions + HTTPRouteKey = attribute.Key("http.route") +) + +// HTTPRequestBodySize returns an attribute KeyValue conforming to the +// "http.request.body.size" semantic conventions. It represents the size of the +// request payload body in bytes. This is the number of bytes transferred +// excluding headers and is often, but not always, present as the +// [Content-Length] header. For requests using transport encoding, this should be +// the compressed size. +// +// [Content-Length]: https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length +func HTTPRequestBodySize(val int) attribute.KeyValue { + return HTTPRequestBodySizeKey.Int(val) +} + +// HTTPRequestMethodOriginal returns an attribute KeyValue conforming to the +// "http.request.method_original" semantic conventions. It represents the +// original HTTP method sent by the client in the request line. +func HTTPRequestMethodOriginal(val string) attribute.KeyValue { + return HTTPRequestMethodOriginalKey.String(val) +} + +// HTTPRequestResendCount returns an attribute KeyValue conforming to the +// "http.request.resend_count" semantic conventions. It represents the ordinal +// number of request resending attempt (for any reason, including redirects). +func HTTPRequestResendCount(val int) attribute.KeyValue { + return HTTPRequestResendCountKey.Int(val) +} + +// HTTPRequestSize returns an attribute KeyValue conforming to the +// "http.request.size" semantic conventions. It represents the total size of the +// request in bytes. This should be the total number of bytes sent over the wire, +// including the request line (HTTP/1.1), framing (HTTP/2 and HTTP/3), headers, +// and request body if any. +func HTTPRequestSize(val int) attribute.KeyValue { + return HTTPRequestSizeKey.Int(val) +} + +// HTTPResponseBodySize returns an attribute KeyValue conforming to the +// "http.response.body.size" semantic conventions. It represents the size of the +// response payload body in bytes. This is the number of bytes transferred +// excluding headers and is often, but not always, present as the +// [Content-Length] header. For requests using transport encoding, this should be +// the compressed size. +// +// [Content-Length]: https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length +func HTTPResponseBodySize(val int) attribute.KeyValue { + return HTTPResponseBodySizeKey.Int(val) +} + +// HTTPResponseSize returns an attribute KeyValue conforming to the +// "http.response.size" semantic conventions. It represents the total size of the +// response in bytes. This should be the total number of bytes sent over the +// wire, including the status line (HTTP/1.1), framing (HTTP/2 and HTTP/3), +// headers, and response body and trailers if any. +func HTTPResponseSize(val int) attribute.KeyValue { + return HTTPResponseSizeKey.Int(val) +} + +// HTTPResponseStatusCode returns an attribute KeyValue conforming to the +// "http.response.status_code" semantic conventions. It represents the +// [HTTP response status code]. +// +// [HTTP response status code]: https://tools.ietf.org/html/rfc7231#section-6 +func HTTPResponseStatusCode(val int) attribute.KeyValue { + return HTTPResponseStatusCodeKey.Int(val) +} + +// HTTPRoute returns an attribute KeyValue conforming to the "http.route" +// semantic conventions. It represents the matched route, that is, the path +// template in the format used by the respective server framework. +func HTTPRoute(val string) attribute.KeyValue { + return HTTPRouteKey.String(val) +} + +// Enum values for http.connection.state +var ( + // active state. + // Stability: development + HTTPConnectionStateActive = HTTPConnectionStateKey.String("active") + // idle state. + // Stability: development + HTTPConnectionStateIdle = HTTPConnectionStateKey.String("idle") +) + +// Enum values for http.request.method +var ( + // CONNECT method. + // Stability: stable + HTTPRequestMethodConnect = HTTPRequestMethodKey.String("CONNECT") + // DELETE method. + // Stability: stable + HTTPRequestMethodDelete = HTTPRequestMethodKey.String("DELETE") + // GET method. + // Stability: stable + HTTPRequestMethodGet = HTTPRequestMethodKey.String("GET") + // HEAD method. + // Stability: stable + HTTPRequestMethodHead = HTTPRequestMethodKey.String("HEAD") + // OPTIONS method. + // Stability: stable + HTTPRequestMethodOptions = HTTPRequestMethodKey.String("OPTIONS") + // PATCH method. + // Stability: stable + HTTPRequestMethodPatch = HTTPRequestMethodKey.String("PATCH") + // POST method. + // Stability: stable + HTTPRequestMethodPost = HTTPRequestMethodKey.String("POST") + // PUT method. + // Stability: stable + HTTPRequestMethodPut = HTTPRequestMethodKey.String("PUT") + // TRACE method. + // Stability: stable + HTTPRequestMethodTrace = HTTPRequestMethodKey.String("TRACE") + // Any HTTP method that the instrumentation has no prior knowledge of. + // Stability: stable + HTTPRequestMethodOther = HTTPRequestMethodKey.String("_OTHER") +) + +// Namespace: hw +const ( + // HwIDKey is the attribute Key conforming to the "hw.id" semantic conventions. + // It represents an identifier for the hardware component, unique within the + // monitored host. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "win32battery_battery_testsysa33_1" + HwIDKey = attribute.Key("hw.id") + + // HwNameKey is the attribute Key conforming to the "hw.name" semantic + // conventions. It represents an easily-recognizable name for the hardware + // component. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "eth0" + HwNameKey = attribute.Key("hw.name") + + // HwParentKey is the attribute Key conforming to the "hw.parent" semantic + // conventions. It represents the unique identifier of the parent component + // (typically the `hw.id` attribute of the enclosure, or disk controller). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "dellStorage_perc_0" + HwParentKey = attribute.Key("hw.parent") + + // HwStateKey is the attribute Key conforming to the "hw.state" semantic + // conventions. It represents the current state of the component. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + HwStateKey = attribute.Key("hw.state") + + // HwTypeKey is the attribute Key conforming to the "hw.type" semantic + // conventions. It represents the type of the component. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: Describes the category of the hardware component for which `hw.state` + // is being reported. For example, `hw.type=temperature` along with + // `hw.state=degraded` would indicate that the temperature of the hardware + // component has been reported as `degraded`. + HwTypeKey = attribute.Key("hw.type") +) + +// HwID returns an attribute KeyValue conforming to the "hw.id" semantic +// conventions. It represents an identifier for the hardware component, unique +// within the monitored host. +func HwID(val string) attribute.KeyValue { + return HwIDKey.String(val) +} + +// HwName returns an attribute KeyValue conforming to the "hw.name" semantic +// conventions. It represents an easily-recognizable name for the hardware +// component. +func HwName(val string) attribute.KeyValue { + return HwNameKey.String(val) +} + +// HwParent returns an attribute KeyValue conforming to the "hw.parent" semantic +// conventions. It represents the unique identifier of the parent component +// (typically the `hw.id` attribute of the enclosure, or disk controller). +func HwParent(val string) attribute.KeyValue { + return HwParentKey.String(val) +} + +// Enum values for hw.state +var ( + // Ok + // Stability: development + HwStateOk = HwStateKey.String("ok") + // Degraded + // Stability: development + HwStateDegraded = HwStateKey.String("degraded") + // Failed + // Stability: development + HwStateFailed = HwStateKey.String("failed") +) + +// Enum values for hw.type +var ( + // Battery + // Stability: development + HwTypeBattery = HwTypeKey.String("battery") + // CPU + // Stability: development + HwTypeCPU = HwTypeKey.String("cpu") + // Disk controller + // Stability: development + HwTypeDiskController = HwTypeKey.String("disk_controller") + // Enclosure + // Stability: development + HwTypeEnclosure = HwTypeKey.String("enclosure") + // Fan + // Stability: development + HwTypeFan = HwTypeKey.String("fan") + // GPU + // Stability: development + HwTypeGpu = HwTypeKey.String("gpu") + // Logical disk + // Stability: development + HwTypeLogicalDisk = HwTypeKey.String("logical_disk") + // Memory + // Stability: development + HwTypeMemory = HwTypeKey.String("memory") + // Network + // Stability: development + HwTypeNetwork = HwTypeKey.String("network") + // Physical disk + // Stability: development + HwTypePhysicalDisk = HwTypeKey.String("physical_disk") + // Power supply + // Stability: development + HwTypePowerSupply = HwTypeKey.String("power_supply") + // Tape drive + // Stability: development + HwTypeTapeDrive = HwTypeKey.String("tape_drive") + // Temperature + // Stability: development + HwTypeTemperature = HwTypeKey.String("temperature") + // Voltage + // Stability: development + HwTypeVoltage = HwTypeKey.String("voltage") +) + +// Namespace: k8s +const ( + // K8SClusterNameKey is the attribute Key conforming to the "k8s.cluster.name" + // semantic conventions. It represents the name of the cluster. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry-cluster" + K8SClusterNameKey = attribute.Key("k8s.cluster.name") + + // K8SClusterUIDKey is the attribute Key conforming to the "k8s.cluster.uid" + // semantic conventions. It represents a pseudo-ID for the cluster, set to the + // UID of the `kube-system` namespace. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "218fc5a9-a5f1-4b54-aa05-46717d0ab26d" + // Note: K8s doesn't have support for obtaining a cluster ID. If this is ever + // added, we will recommend collecting the `k8s.cluster.uid` through the + // official APIs. In the meantime, we are able to use the `uid` of the + // `kube-system` namespace as a proxy for cluster ID. Read on for the + // rationale. + // + // Every object created in a K8s cluster is assigned a distinct UID. The + // `kube-system` namespace is used by Kubernetes itself and will exist + // for the lifetime of the cluster. Using the `uid` of the `kube-system` + // namespace is a reasonable proxy for the K8s ClusterID as it will only + // change if the cluster is rebuilt. Furthermore, Kubernetes UIDs are + // UUIDs as standardized by + // [ISO/IEC 9834-8 and ITU-T X.667]. + // Which states: + // + // > If generated according to one of the mechanisms defined in Rec. + // > ITU-T X.667 | ISO/IEC 9834-8, a UUID is either guaranteed to be + // > different from all other UUIDs generated before 3603 A.D., or is + // > extremely likely to be different (depending on the mechanism chosen). + // + // Therefore, UIDs between clusters should be extremely unlikely to + // conflict. + // + // [ISO/IEC 9834-8 and ITU-T X.667]: https://www.itu.int/ITU-T/studygroups/com17/oid.html + K8SClusterUIDKey = attribute.Key("k8s.cluster.uid") + + // K8SContainerNameKey is the attribute Key conforming to the + // "k8s.container.name" semantic conventions. It represents the name of the + // Container from Pod specification, must be unique within a Pod. Container + // runtime usually uses different globally unique name (`container.name`). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "redis" + K8SContainerNameKey = attribute.Key("k8s.container.name") + + // K8SContainerRestartCountKey is the attribute Key conforming to the + // "k8s.container.restart_count" semantic conventions. It represents the number + // of times the container was restarted. This attribute can be used to identify + // a particular container (running or stopped) within a container spec. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + K8SContainerRestartCountKey = attribute.Key("k8s.container.restart_count") + + // K8SContainerStatusLastTerminatedReasonKey is the attribute Key conforming to + // the "k8s.container.status.last_terminated_reason" semantic conventions. It + // represents the last terminated reason of the Container. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Evicted", "Error" + K8SContainerStatusLastTerminatedReasonKey = attribute.Key("k8s.container.status.last_terminated_reason") + + // K8SCronJobNameKey is the attribute Key conforming to the "k8s.cronjob.name" + // semantic conventions. It represents the name of the CronJob. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry" + K8SCronJobNameKey = attribute.Key("k8s.cronjob.name") + + // K8SCronJobUIDKey is the attribute Key conforming to the "k8s.cronjob.uid" + // semantic conventions. It represents the UID of the CronJob. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff" + K8SCronJobUIDKey = attribute.Key("k8s.cronjob.uid") + + // K8SDaemonSetNameKey is the attribute Key conforming to the + // "k8s.daemonset.name" semantic conventions. It represents the name of the + // DaemonSet. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry" + K8SDaemonSetNameKey = attribute.Key("k8s.daemonset.name") + + // K8SDaemonSetUIDKey is the attribute Key conforming to the "k8s.daemonset.uid" + // semantic conventions. It represents the UID of the DaemonSet. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff" + K8SDaemonSetUIDKey = attribute.Key("k8s.daemonset.uid") + + // K8SDeploymentNameKey is the attribute Key conforming to the + // "k8s.deployment.name" semantic conventions. It represents the name of the + // Deployment. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry" + K8SDeploymentNameKey = attribute.Key("k8s.deployment.name") + + // K8SDeploymentUIDKey is the attribute Key conforming to the + // "k8s.deployment.uid" semantic conventions. It represents the UID of the + // Deployment. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff" + K8SDeploymentUIDKey = attribute.Key("k8s.deployment.uid") + + // K8SJobNameKey is the attribute Key conforming to the "k8s.job.name" semantic + // conventions. It represents the name of the Job. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry" + K8SJobNameKey = attribute.Key("k8s.job.name") + + // K8SJobUIDKey is the attribute Key conforming to the "k8s.job.uid" semantic + // conventions. It represents the UID of the Job. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff" + K8SJobUIDKey = attribute.Key("k8s.job.uid") + + // K8SNamespaceNameKey is the attribute Key conforming to the + // "k8s.namespace.name" semantic conventions. It represents the name of the + // namespace that the pod is running in. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "default" + K8SNamespaceNameKey = attribute.Key("k8s.namespace.name") + + // K8SNamespacePhaseKey is the attribute Key conforming to the + // "k8s.namespace.phase" semantic conventions. It represents the phase of the + // K8s namespace. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "active", "terminating" + // Note: This attribute aligns with the `phase` field of the + // [K8s NamespaceStatus] + // + // [K8s NamespaceStatus]: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#namespacestatus-v1-core + K8SNamespacePhaseKey = attribute.Key("k8s.namespace.phase") + + // K8SNodeNameKey is the attribute Key conforming to the "k8s.node.name" + // semantic conventions. It represents the name of the Node. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "node-1" + K8SNodeNameKey = attribute.Key("k8s.node.name") + + // K8SNodeUIDKey is the attribute Key conforming to the "k8s.node.uid" semantic + // conventions. It represents the UID of the Node. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1eb3a0c6-0477-4080-a9cb-0cb7db65c6a2" + K8SNodeUIDKey = attribute.Key("k8s.node.uid") + + // K8SPodNameKey is the attribute Key conforming to the "k8s.pod.name" semantic + // conventions. It represents the name of the Pod. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry-pod-autoconf" + K8SPodNameKey = attribute.Key("k8s.pod.name") + + // K8SPodUIDKey is the attribute Key conforming to the "k8s.pod.uid" semantic + // conventions. It represents the UID of the Pod. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff" + K8SPodUIDKey = attribute.Key("k8s.pod.uid") + + // K8SReplicaSetNameKey is the attribute Key conforming to the + // "k8s.replicaset.name" semantic conventions. It represents the name of the + // ReplicaSet. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry" + K8SReplicaSetNameKey = attribute.Key("k8s.replicaset.name") + + // K8SReplicaSetUIDKey is the attribute Key conforming to the + // "k8s.replicaset.uid" semantic conventions. It represents the UID of the + // ReplicaSet. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff" + K8SReplicaSetUIDKey = attribute.Key("k8s.replicaset.uid") + + // K8SStatefulSetNameKey is the attribute Key conforming to the + // "k8s.statefulset.name" semantic conventions. It represents the name of the + // StatefulSet. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "opentelemetry" + K8SStatefulSetNameKey = attribute.Key("k8s.statefulset.name") + + // K8SStatefulSetUIDKey is the attribute Key conforming to the + // "k8s.statefulset.uid" semantic conventions. It represents the UID of the + // StatefulSet. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "275ecb36-5aa8-4c2a-9c47-d8bb681b9aff" + K8SStatefulSetUIDKey = attribute.Key("k8s.statefulset.uid") + + // K8SVolumeNameKey is the attribute Key conforming to the "k8s.volume.name" + // semantic conventions. It represents the name of the K8s volume. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "volume0" + K8SVolumeNameKey = attribute.Key("k8s.volume.name") + + // K8SVolumeTypeKey is the attribute Key conforming to the "k8s.volume.type" + // semantic conventions. It represents the type of the K8s volume. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "emptyDir", "persistentVolumeClaim" + K8SVolumeTypeKey = attribute.Key("k8s.volume.type") +) + +// K8SClusterName returns an attribute KeyValue conforming to the +// "k8s.cluster.name" semantic conventions. It represents the name of the +// cluster. +func K8SClusterName(val string) attribute.KeyValue { + return K8SClusterNameKey.String(val) +} + +// K8SClusterUID returns an attribute KeyValue conforming to the +// "k8s.cluster.uid" semantic conventions. It represents a pseudo-ID for the +// cluster, set to the UID of the `kube-system` namespace. +func K8SClusterUID(val string) attribute.KeyValue { + return K8SClusterUIDKey.String(val) +} + +// K8SContainerName returns an attribute KeyValue conforming to the +// "k8s.container.name" semantic conventions. It represents the name of the +// Container from Pod specification, must be unique within a Pod. Container +// runtime usually uses different globally unique name (`container.name`). +func K8SContainerName(val string) attribute.KeyValue { + return K8SContainerNameKey.String(val) +} + +// K8SContainerRestartCount returns an attribute KeyValue conforming to the +// "k8s.container.restart_count" semantic conventions. It represents the number +// of times the container was restarted. This attribute can be used to identify a +// particular container (running or stopped) within a container spec. +func K8SContainerRestartCount(val int) attribute.KeyValue { + return K8SContainerRestartCountKey.Int(val) +} + +// K8SContainerStatusLastTerminatedReason returns an attribute KeyValue +// conforming to the "k8s.container.status.last_terminated_reason" semantic +// conventions. It represents the last terminated reason of the Container. +func K8SContainerStatusLastTerminatedReason(val string) attribute.KeyValue { + return K8SContainerStatusLastTerminatedReasonKey.String(val) +} + +// K8SCronJobName returns an attribute KeyValue conforming to the +// "k8s.cronjob.name" semantic conventions. It represents the name of the +// CronJob. +func K8SCronJobName(val string) attribute.KeyValue { + return K8SCronJobNameKey.String(val) +} + +// K8SCronJobUID returns an attribute KeyValue conforming to the +// "k8s.cronjob.uid" semantic conventions. It represents the UID of the CronJob. +func K8SCronJobUID(val string) attribute.KeyValue { + return K8SCronJobUIDKey.String(val) +} + +// K8SDaemonSetName returns an attribute KeyValue conforming to the +// "k8s.daemonset.name" semantic conventions. It represents the name of the +// DaemonSet. +func K8SDaemonSetName(val string) attribute.KeyValue { + return K8SDaemonSetNameKey.String(val) +} + +// K8SDaemonSetUID returns an attribute KeyValue conforming to the +// "k8s.daemonset.uid" semantic conventions. It represents the UID of the +// DaemonSet. +func K8SDaemonSetUID(val string) attribute.KeyValue { + return K8SDaemonSetUIDKey.String(val) +} + +// K8SDeploymentName returns an attribute KeyValue conforming to the +// "k8s.deployment.name" semantic conventions. It represents the name of the +// Deployment. +func K8SDeploymentName(val string) attribute.KeyValue { + return K8SDeploymentNameKey.String(val) +} + +// K8SDeploymentUID returns an attribute KeyValue conforming to the +// "k8s.deployment.uid" semantic conventions. It represents the UID of the +// Deployment. +func K8SDeploymentUID(val string) attribute.KeyValue { + return K8SDeploymentUIDKey.String(val) +} + +// K8SJobName returns an attribute KeyValue conforming to the "k8s.job.name" +// semantic conventions. It represents the name of the Job. +func K8SJobName(val string) attribute.KeyValue { + return K8SJobNameKey.String(val) +} + +// K8SJobUID returns an attribute KeyValue conforming to the "k8s.job.uid" +// semantic conventions. It represents the UID of the Job. +func K8SJobUID(val string) attribute.KeyValue { + return K8SJobUIDKey.String(val) +} + +// K8SNamespaceName returns an attribute KeyValue conforming to the +// "k8s.namespace.name" semantic conventions. It represents the name of the +// namespace that the pod is running in. +func K8SNamespaceName(val string) attribute.KeyValue { + return K8SNamespaceNameKey.String(val) +} + +// K8SNodeName returns an attribute KeyValue conforming to the "k8s.node.name" +// semantic conventions. It represents the name of the Node. +func K8SNodeName(val string) attribute.KeyValue { + return K8SNodeNameKey.String(val) +} + +// K8SNodeUID returns an attribute KeyValue conforming to the "k8s.node.uid" +// semantic conventions. It represents the UID of the Node. +func K8SNodeUID(val string) attribute.KeyValue { + return K8SNodeUIDKey.String(val) +} + +// K8SPodName returns an attribute KeyValue conforming to the "k8s.pod.name" +// semantic conventions. It represents the name of the Pod. +func K8SPodName(val string) attribute.KeyValue { + return K8SPodNameKey.String(val) +} + +// K8SPodUID returns an attribute KeyValue conforming to the "k8s.pod.uid" +// semantic conventions. It represents the UID of the Pod. +func K8SPodUID(val string) attribute.KeyValue { + return K8SPodUIDKey.String(val) +} + +// K8SReplicaSetName returns an attribute KeyValue conforming to the +// "k8s.replicaset.name" semantic conventions. It represents the name of the +// ReplicaSet. +func K8SReplicaSetName(val string) attribute.KeyValue { + return K8SReplicaSetNameKey.String(val) +} + +// K8SReplicaSetUID returns an attribute KeyValue conforming to the +// "k8s.replicaset.uid" semantic conventions. It represents the UID of the +// ReplicaSet. +func K8SReplicaSetUID(val string) attribute.KeyValue { + return K8SReplicaSetUIDKey.String(val) +} + +// K8SStatefulSetName returns an attribute KeyValue conforming to the +// "k8s.statefulset.name" semantic conventions. It represents the name of the +// StatefulSet. +func K8SStatefulSetName(val string) attribute.KeyValue { + return K8SStatefulSetNameKey.String(val) +} + +// K8SStatefulSetUID returns an attribute KeyValue conforming to the +// "k8s.statefulset.uid" semantic conventions. It represents the UID of the +// StatefulSet. +func K8SStatefulSetUID(val string) attribute.KeyValue { + return K8SStatefulSetUIDKey.String(val) +} + +// K8SVolumeName returns an attribute KeyValue conforming to the +// "k8s.volume.name" semantic conventions. It represents the name of the K8s +// volume. +func K8SVolumeName(val string) attribute.KeyValue { + return K8SVolumeNameKey.String(val) +} + +// Enum values for k8s.namespace.phase +var ( + // Active namespace phase as described by [K8s API] + // Stability: development + // + // [K8s API]: https://pkg.go.dev/k8s.io/api@v0.31.3/core/v1#NamespacePhase + K8SNamespacePhaseActive = K8SNamespacePhaseKey.String("active") + // Terminating namespace phase as described by [K8s API] + // Stability: development + // + // [K8s API]: https://pkg.go.dev/k8s.io/api@v0.31.3/core/v1#NamespacePhase + K8SNamespacePhaseTerminating = K8SNamespacePhaseKey.String("terminating") +) + +// Enum values for k8s.volume.type +var ( + // A [persistentVolumeClaim] volume + // Stability: development + // + // [persistentVolumeClaim]: https://v1-30.docs.kubernetes.io/docs/concepts/storage/volumes/#persistentvolumeclaim + K8SVolumeTypePersistentVolumeClaim = K8SVolumeTypeKey.String("persistentVolumeClaim") + // A [configMap] volume + // Stability: development + // + // [configMap]: https://v1-30.docs.kubernetes.io/docs/concepts/storage/volumes/#configmap + K8SVolumeTypeConfigMap = K8SVolumeTypeKey.String("configMap") + // A [downwardAPI] volume + // Stability: development + // + // [downwardAPI]: https://v1-30.docs.kubernetes.io/docs/concepts/storage/volumes/#downwardapi + K8SVolumeTypeDownwardAPI = K8SVolumeTypeKey.String("downwardAPI") + // An [emptyDir] volume + // Stability: development + // + // [emptyDir]: https://v1-30.docs.kubernetes.io/docs/concepts/storage/volumes/#emptydir + K8SVolumeTypeEmptyDir = K8SVolumeTypeKey.String("emptyDir") + // A [secret] volume + // Stability: development + // + // [secret]: https://v1-30.docs.kubernetes.io/docs/concepts/storage/volumes/#secret + K8SVolumeTypeSecret = K8SVolumeTypeKey.String("secret") + // A [local] volume + // Stability: development + // + // [local]: https://v1-30.docs.kubernetes.io/docs/concepts/storage/volumes/#local + K8SVolumeTypeLocal = K8SVolumeTypeKey.String("local") +) + +// Namespace: linux +const ( + // LinuxMemorySlabStateKey is the attribute Key conforming to the + // "linux.memory.slab.state" semantic conventions. It represents the Linux Slab + // memory state. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "reclaimable", "unreclaimable" + LinuxMemorySlabStateKey = attribute.Key("linux.memory.slab.state") +) + +// Enum values for linux.memory.slab.state +var ( + // reclaimable + // Stability: development + LinuxMemorySlabStateReclaimable = LinuxMemorySlabStateKey.String("reclaimable") + // unreclaimable + // Stability: development + LinuxMemorySlabStateUnreclaimable = LinuxMemorySlabStateKey.String("unreclaimable") +) + +// Namespace: log +const ( + // LogFileNameKey is the attribute Key conforming to the "log.file.name" + // semantic conventions. It represents the basename of the file. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "audit.log" + LogFileNameKey = attribute.Key("log.file.name") + + // LogFileNameResolvedKey is the attribute Key conforming to the + // "log.file.name_resolved" semantic conventions. It represents the basename of + // the file, with symlinks resolved. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "uuid.log" + LogFileNameResolvedKey = attribute.Key("log.file.name_resolved") + + // LogFilePathKey is the attribute Key conforming to the "log.file.path" + // semantic conventions. It represents the full path to the file. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/var/log/mysql/audit.log" + LogFilePathKey = attribute.Key("log.file.path") + + // LogFilePathResolvedKey is the attribute Key conforming to the + // "log.file.path_resolved" semantic conventions. It represents the full path to + // the file, with symlinks resolved. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/var/lib/docker/uuid.log" + LogFilePathResolvedKey = attribute.Key("log.file.path_resolved") + + // LogIostreamKey is the attribute Key conforming to the "log.iostream" semantic + // conventions. It represents the stream associated with the log. See below for + // a list of well-known values. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + LogIostreamKey = attribute.Key("log.iostream") + + // LogRecordOriginalKey is the attribute Key conforming to the + // "log.record.original" semantic conventions. It represents the complete + // original Log Record. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "77 <86>1 2015-08-06T21:58:59.694Z 192.168.2.133 inactive - - - + // Something happened", "[INFO] 8/3/24 12:34:56 Something happened" + // Note: This value MAY be added when processing a Log Record which was + // originally transmitted as a string or equivalent data type AND the Body field + // of the Log Record does not contain the same value. (e.g. a syslog or a log + // record read from a file.) + LogRecordOriginalKey = attribute.Key("log.record.original") + + // LogRecordUIDKey is the attribute Key conforming to the "log.record.uid" + // semantic conventions. It represents a unique identifier for the Log Record. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "01ARZ3NDEKTSV4RRFFQ69G5FAV" + // Note: If an id is provided, other log records with the same id will be + // considered duplicates and can be removed safely. This means, that two + // distinguishable log records MUST have different values. + // The id MAY be an + // [Universally Unique Lexicographically Sortable Identifier (ULID)], but other + // identifiers (e.g. UUID) may be used as needed. + // + // [Universally Unique Lexicographically Sortable Identifier (ULID)]: https://github.com/ulid/spec + LogRecordUIDKey = attribute.Key("log.record.uid") +) + +// LogFileName returns an attribute KeyValue conforming to the "log.file.name" +// semantic conventions. It represents the basename of the file. +func LogFileName(val string) attribute.KeyValue { + return LogFileNameKey.String(val) +} + +// LogFileNameResolved returns an attribute KeyValue conforming to the +// "log.file.name_resolved" semantic conventions. It represents the basename of +// the file, with symlinks resolved. +func LogFileNameResolved(val string) attribute.KeyValue { + return LogFileNameResolvedKey.String(val) +} + +// LogFilePath returns an attribute KeyValue conforming to the "log.file.path" +// semantic conventions. It represents the full path to the file. +func LogFilePath(val string) attribute.KeyValue { + return LogFilePathKey.String(val) +} + +// LogFilePathResolved returns an attribute KeyValue conforming to the +// "log.file.path_resolved" semantic conventions. It represents the full path to +// the file, with symlinks resolved. +func LogFilePathResolved(val string) attribute.KeyValue { + return LogFilePathResolvedKey.String(val) +} + +// LogRecordOriginal returns an attribute KeyValue conforming to the +// "log.record.original" semantic conventions. It represents the complete +// original Log Record. +func LogRecordOriginal(val string) attribute.KeyValue { + return LogRecordOriginalKey.String(val) +} + +// LogRecordUID returns an attribute KeyValue conforming to the "log.record.uid" +// semantic conventions. It represents a unique identifier for the Log Record. +func LogRecordUID(val string) attribute.KeyValue { + return LogRecordUIDKey.String(val) +} + +// Enum values for log.iostream +var ( + // Logs from stdout stream + // Stability: development + LogIostreamStdout = LogIostreamKey.String("stdout") + // Events from stderr stream + // Stability: development + LogIostreamStderr = LogIostreamKey.String("stderr") +) + +// Namespace: messaging +const ( + // MessagingBatchMessageCountKey is the attribute Key conforming to the + // "messaging.batch.message_count" semantic conventions. It represents the + // number of messages sent, received, or processed in the scope of the batching + // operation. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 0, 1, 2 + // Note: Instrumentations SHOULD NOT set `messaging.batch.message_count` on + // spans that operate with a single message. When a messaging client library + // supports both batch and single-message API for the same operation, + // instrumentations SHOULD use `messaging.batch.message_count` for batching APIs + // and SHOULD NOT use it for single-message APIs. + MessagingBatchMessageCountKey = attribute.Key("messaging.batch.message_count") + + // MessagingClientIDKey is the attribute Key conforming to the + // "messaging.client.id" semantic conventions. It represents a unique identifier + // for the client that consumes or produces a message. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "client-5", "myhost@8742@s8083jm" + MessagingClientIDKey = attribute.Key("messaging.client.id") + + // MessagingConsumerGroupNameKey is the attribute Key conforming to the + // "messaging.consumer.group.name" semantic conventions. It represents the name + // of the consumer group with which a consumer is associated. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-group", "indexer" + // Note: Semantic conventions for individual messaging systems SHOULD document + // whether `messaging.consumer.group.name` is applicable and what it means in + // the context of that system. + MessagingConsumerGroupNameKey = attribute.Key("messaging.consumer.group.name") + + // MessagingDestinationAnonymousKey is the attribute Key conforming to the + // "messaging.destination.anonymous" semantic conventions. It represents a + // boolean that is true if the message destination is anonymous (could be + // unnamed or have auto-generated name). + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + MessagingDestinationAnonymousKey = attribute.Key("messaging.destination.anonymous") + + // MessagingDestinationNameKey is the attribute Key conforming to the + // "messaging.destination.name" semantic conventions. It represents the message + // destination name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "MyQueue", "MyTopic" + // Note: Destination name SHOULD uniquely identify a specific queue, topic or + // other entity within the broker. If + // the broker doesn't have such notion, the destination name SHOULD uniquely + // identify the broker. + MessagingDestinationNameKey = attribute.Key("messaging.destination.name") + + // MessagingDestinationPartitionIDKey is the attribute Key conforming to the + // "messaging.destination.partition.id" semantic conventions. It represents the + // identifier of the partition messages are sent to or received from, unique + // within the `messaging.destination.name`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1 + MessagingDestinationPartitionIDKey = attribute.Key("messaging.destination.partition.id") + + // MessagingDestinationSubscriptionNameKey is the attribute Key conforming to + // the "messaging.destination.subscription.name" semantic conventions. It + // represents the name of the destination subscription from which a message is + // consumed. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "subscription-a" + // Note: Semantic conventions for individual messaging systems SHOULD document + // whether `messaging.destination.subscription.name` is applicable and what it + // means in the context of that system. + MessagingDestinationSubscriptionNameKey = attribute.Key("messaging.destination.subscription.name") + + // MessagingDestinationTemplateKey is the attribute Key conforming to the + // "messaging.destination.template" semantic conventions. It represents the low + // cardinality representation of the messaging destination name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/customers/{customerId}" + // Note: Destination names could be constructed from templates. An example would + // be a destination name involving a user name or product id. Although the + // destination name in this case is of high cardinality, the underlying template + // is of low cardinality and can be effectively used for grouping and + // aggregation. + MessagingDestinationTemplateKey = attribute.Key("messaging.destination.template") + + // MessagingDestinationTemporaryKey is the attribute Key conforming to the + // "messaging.destination.temporary" semantic conventions. It represents a + // boolean that is true if the message destination is temporary and might not + // exist anymore after messages are processed. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + MessagingDestinationTemporaryKey = attribute.Key("messaging.destination.temporary") + + // MessagingEventhubsMessageEnqueuedTimeKey is the attribute Key conforming to + // the "messaging.eventhubs.message.enqueued_time" semantic conventions. It + // represents the UTC epoch seconds at which the message has been accepted and + // stored in the entity. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingEventhubsMessageEnqueuedTimeKey = attribute.Key("messaging.eventhubs.message.enqueued_time") + + // MessagingGCPPubsubMessageAckDeadlineKey is the attribute Key conforming to + // the "messaging.gcp_pubsub.message.ack_deadline" semantic conventions. It + // represents the ack deadline in seconds set for the modify ack deadline + // request. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingGCPPubsubMessageAckDeadlineKey = attribute.Key("messaging.gcp_pubsub.message.ack_deadline") + + // MessagingGCPPubsubMessageAckIDKey is the attribute Key conforming to the + // "messaging.gcp_pubsub.message.ack_id" semantic conventions. It represents the + // ack id for a given message. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: ack_id + MessagingGCPPubsubMessageAckIDKey = attribute.Key("messaging.gcp_pubsub.message.ack_id") + + // MessagingGCPPubsubMessageDeliveryAttemptKey is the attribute Key conforming + // to the "messaging.gcp_pubsub.message.delivery_attempt" semantic conventions. + // It represents the delivery attempt for a given message. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingGCPPubsubMessageDeliveryAttemptKey = attribute.Key("messaging.gcp_pubsub.message.delivery_attempt") + + // MessagingGCPPubsubMessageOrderingKeyKey is the attribute Key conforming to + // the "messaging.gcp_pubsub.message.ordering_key" semantic conventions. It + // represents the ordering key for a given message. If the attribute is not + // present, the message does not have an ordering key. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: ordering_key + MessagingGCPPubsubMessageOrderingKeyKey = attribute.Key("messaging.gcp_pubsub.message.ordering_key") + + // MessagingKafkaMessageKeyKey is the attribute Key conforming to the + // "messaging.kafka.message.key" semantic conventions. It represents the message + // keys in Kafka are used for grouping alike messages to ensure they're + // processed on the same partition. They differ from `messaging.message.id` in + // that they're not unique. If the key is `null`, the attribute MUST NOT be set. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: myKey + // Note: If the key type is not string, it's string representation has to be + // supplied for the attribute. If the key has no unambiguous, canonical string + // form, don't include its value. + MessagingKafkaMessageKeyKey = attribute.Key("messaging.kafka.message.key") + + // MessagingKafkaMessageTombstoneKey is the attribute Key conforming to the + // "messaging.kafka.message.tombstone" semantic conventions. It represents a + // boolean that is true if the message is a tombstone. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + MessagingKafkaMessageTombstoneKey = attribute.Key("messaging.kafka.message.tombstone") + + // MessagingKafkaOffsetKey is the attribute Key conforming to the + // "messaging.kafka.offset" semantic conventions. It represents the offset of a + // record in the corresponding Kafka partition. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingKafkaOffsetKey = attribute.Key("messaging.kafka.offset") + + // MessagingMessageBodySizeKey is the attribute Key conforming to the + // "messaging.message.body.size" semantic conventions. It represents the size of + // the message body in bytes. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Note: This can refer to both the compressed or uncompressed body size. If + // both sizes are known, the uncompressed + // body size should be used. + MessagingMessageBodySizeKey = attribute.Key("messaging.message.body.size") + + // MessagingMessageConversationIDKey is the attribute Key conforming to the + // "messaging.message.conversation_id" semantic conventions. It represents the + // conversation ID identifying the conversation to which the message belongs, + // represented as a string. Sometimes called "Correlation ID". + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: MyConversationId + MessagingMessageConversationIDKey = attribute.Key("messaging.message.conversation_id") + + // MessagingMessageEnvelopeSizeKey is the attribute Key conforming to the + // "messaging.message.envelope.size" semantic conventions. It represents the + // size of the message body and metadata in bytes. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Note: This can refer to both the compressed or uncompressed size. If both + // sizes are known, the uncompressed + // size should be used. + MessagingMessageEnvelopeSizeKey = attribute.Key("messaging.message.envelope.size") + + // MessagingMessageIDKey is the attribute Key conforming to the + // "messaging.message.id" semantic conventions. It represents a value used by + // the messaging system as an identifier for the message, represented as a + // string. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 452a7c7c7c7048c2f887f61572b18fc2 + MessagingMessageIDKey = attribute.Key("messaging.message.id") + + // MessagingOperationNameKey is the attribute Key conforming to the + // "messaging.operation.name" semantic conventions. It represents the + // system-specific name of the messaging operation. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "ack", "nack", "send" + MessagingOperationNameKey = attribute.Key("messaging.operation.name") + + // MessagingOperationTypeKey is the attribute Key conforming to the + // "messaging.operation.type" semantic conventions. It represents a string + // identifying the type of the messaging operation. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: If a custom value is used, it MUST be of low cardinality. + MessagingOperationTypeKey = attribute.Key("messaging.operation.type") + + // MessagingRabbitmqDestinationRoutingKeyKey is the attribute Key conforming to + // the "messaging.rabbitmq.destination.routing_key" semantic conventions. It + // represents the rabbitMQ message routing key. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: myKey + MessagingRabbitmqDestinationRoutingKeyKey = attribute.Key("messaging.rabbitmq.destination.routing_key") + + // MessagingRabbitmqMessageDeliveryTagKey is the attribute Key conforming to the + // "messaging.rabbitmq.message.delivery_tag" semantic conventions. It represents + // the rabbitMQ message delivery tag. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingRabbitmqMessageDeliveryTagKey = attribute.Key("messaging.rabbitmq.message.delivery_tag") + + // MessagingRocketmqConsumptionModelKey is the attribute Key conforming to the + // "messaging.rocketmq.consumption_model" semantic conventions. It represents + // the model of message consumption. This only applies to consumer spans. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + MessagingRocketmqConsumptionModelKey = attribute.Key("messaging.rocketmq.consumption_model") + + // MessagingRocketmqMessageDelayTimeLevelKey is the attribute Key conforming to + // the "messaging.rocketmq.message.delay_time_level" semantic conventions. It + // represents the delay time level for delay message, which determines the + // message delay time. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingRocketmqMessageDelayTimeLevelKey = attribute.Key("messaging.rocketmq.message.delay_time_level") + + // MessagingRocketmqMessageDeliveryTimestampKey is the attribute Key conforming + // to the "messaging.rocketmq.message.delivery_timestamp" semantic conventions. + // It represents the timestamp in milliseconds that the delay message is + // expected to be delivered to consumer. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingRocketmqMessageDeliveryTimestampKey = attribute.Key("messaging.rocketmq.message.delivery_timestamp") + + // MessagingRocketmqMessageGroupKey is the attribute Key conforming to the + // "messaging.rocketmq.message.group" semantic conventions. It represents the it + // is essential for FIFO message. Messages that belong to the same message group + // are always processed one by one within the same consumer group. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: myMessageGroup + MessagingRocketmqMessageGroupKey = attribute.Key("messaging.rocketmq.message.group") + + // MessagingRocketmqMessageKeysKey is the attribute Key conforming to the + // "messaging.rocketmq.message.keys" semantic conventions. It represents the + // key(s) of message, another way to mark message besides message id. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "keyA", "keyB" + MessagingRocketmqMessageKeysKey = attribute.Key("messaging.rocketmq.message.keys") + + // MessagingRocketmqMessageTagKey is the attribute Key conforming to the + // "messaging.rocketmq.message.tag" semantic conventions. It represents the + // secondary classifier of message besides topic. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: tagA + MessagingRocketmqMessageTagKey = attribute.Key("messaging.rocketmq.message.tag") + + // MessagingRocketmqMessageTypeKey is the attribute Key conforming to the + // "messaging.rocketmq.message.type" semantic conventions. It represents the + // type of message. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + MessagingRocketmqMessageTypeKey = attribute.Key("messaging.rocketmq.message.type") + + // MessagingRocketmqNamespaceKey is the attribute Key conforming to the + // "messaging.rocketmq.namespace" semantic conventions. It represents the + // namespace of RocketMQ resources, resources in different namespaces are + // individual. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: myNamespace + MessagingRocketmqNamespaceKey = attribute.Key("messaging.rocketmq.namespace") + + // MessagingServicebusDispositionStatusKey is the attribute Key conforming to + // the "messaging.servicebus.disposition_status" semantic conventions. It + // represents the describes the [settlement type]. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // + // [settlement type]: https://learn.microsoft.com/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock + MessagingServicebusDispositionStatusKey = attribute.Key("messaging.servicebus.disposition_status") + + // MessagingServicebusMessageDeliveryCountKey is the attribute Key conforming to + // the "messaging.servicebus.message.delivery_count" semantic conventions. It + // represents the number of deliveries that have been attempted for this + // message. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingServicebusMessageDeliveryCountKey = attribute.Key("messaging.servicebus.message.delivery_count") + + // MessagingServicebusMessageEnqueuedTimeKey is the attribute Key conforming to + // the "messaging.servicebus.message.enqueued_time" semantic conventions. It + // represents the UTC epoch seconds at which the message has been accepted and + // stored in the entity. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + MessagingServicebusMessageEnqueuedTimeKey = attribute.Key("messaging.servicebus.message.enqueued_time") + + // MessagingSystemKey is the attribute Key conforming to the "messaging.system" + // semantic conventions. It represents the messaging system as identified by the + // client instrumentation. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: The actual messaging system may differ from the one known by the + // client. For example, when using Kafka client libraries to communicate with + // Azure Event Hubs, the `messaging.system` is set to `kafka` based on the + // instrumentation's best knowledge. + MessagingSystemKey = attribute.Key("messaging.system") +) + +// MessagingBatchMessageCount returns an attribute KeyValue conforming to the +// "messaging.batch.message_count" semantic conventions. It represents the number +// of messages sent, received, or processed in the scope of the batching +// operation. +func MessagingBatchMessageCount(val int) attribute.KeyValue { + return MessagingBatchMessageCountKey.Int(val) +} + +// MessagingClientID returns an attribute KeyValue conforming to the +// "messaging.client.id" semantic conventions. It represents a unique identifier +// for the client that consumes or produces a message. +func MessagingClientID(val string) attribute.KeyValue { + return MessagingClientIDKey.String(val) +} + +// MessagingConsumerGroupName returns an attribute KeyValue conforming to the +// "messaging.consumer.group.name" semantic conventions. It represents the name +// of the consumer group with which a consumer is associated. +func MessagingConsumerGroupName(val string) attribute.KeyValue { + return MessagingConsumerGroupNameKey.String(val) +} + +// MessagingDestinationAnonymous returns an attribute KeyValue conforming to the +// "messaging.destination.anonymous" semantic conventions. It represents a +// boolean that is true if the message destination is anonymous (could be unnamed +// or have auto-generated name). +func MessagingDestinationAnonymous(val bool) attribute.KeyValue { + return MessagingDestinationAnonymousKey.Bool(val) +} + +// MessagingDestinationName returns an attribute KeyValue conforming to the +// "messaging.destination.name" semantic conventions. It represents the message +// destination name. +func MessagingDestinationName(val string) attribute.KeyValue { + return MessagingDestinationNameKey.String(val) +} + +// MessagingDestinationPartitionID returns an attribute KeyValue conforming to +// the "messaging.destination.partition.id" semantic conventions. It represents +// the identifier of the partition messages are sent to or received from, unique +// within the `messaging.destination.name`. +func MessagingDestinationPartitionID(val string) attribute.KeyValue { + return MessagingDestinationPartitionIDKey.String(val) +} + +// MessagingDestinationSubscriptionName returns an attribute KeyValue conforming +// to the "messaging.destination.subscription.name" semantic conventions. It +// represents the name of the destination subscription from which a message is +// consumed. +func MessagingDestinationSubscriptionName(val string) attribute.KeyValue { + return MessagingDestinationSubscriptionNameKey.String(val) +} + +// MessagingDestinationTemplate returns an attribute KeyValue conforming to the +// "messaging.destination.template" semantic conventions. It represents the low +// cardinality representation of the messaging destination name. +func MessagingDestinationTemplate(val string) attribute.KeyValue { + return MessagingDestinationTemplateKey.String(val) +} + +// MessagingDestinationTemporary returns an attribute KeyValue conforming to the +// "messaging.destination.temporary" semantic conventions. It represents a +// boolean that is true if the message destination is temporary and might not +// exist anymore after messages are processed. +func MessagingDestinationTemporary(val bool) attribute.KeyValue { + return MessagingDestinationTemporaryKey.Bool(val) +} + +// MessagingEventhubsMessageEnqueuedTime returns an attribute KeyValue conforming +// to the "messaging.eventhubs.message.enqueued_time" semantic conventions. It +// represents the UTC epoch seconds at which the message has been accepted and +// stored in the entity. +func MessagingEventhubsMessageEnqueuedTime(val int) attribute.KeyValue { + return MessagingEventhubsMessageEnqueuedTimeKey.Int(val) +} + +// MessagingGCPPubsubMessageAckDeadline returns an attribute KeyValue conforming +// to the "messaging.gcp_pubsub.message.ack_deadline" semantic conventions. It +// represents the ack deadline in seconds set for the modify ack deadline +// request. +func MessagingGCPPubsubMessageAckDeadline(val int) attribute.KeyValue { + return MessagingGCPPubsubMessageAckDeadlineKey.Int(val) +} + +// MessagingGCPPubsubMessageAckID returns an attribute KeyValue conforming to the +// "messaging.gcp_pubsub.message.ack_id" semantic conventions. It represents the +// ack id for a given message. +func MessagingGCPPubsubMessageAckID(val string) attribute.KeyValue { + return MessagingGCPPubsubMessageAckIDKey.String(val) +} + +// MessagingGCPPubsubMessageDeliveryAttempt returns an attribute KeyValue +// conforming to the "messaging.gcp_pubsub.message.delivery_attempt" semantic +// conventions. It represents the delivery attempt for a given message. +func MessagingGCPPubsubMessageDeliveryAttempt(val int) attribute.KeyValue { + return MessagingGCPPubsubMessageDeliveryAttemptKey.Int(val) +} + +// MessagingGCPPubsubMessageOrderingKey returns an attribute KeyValue conforming +// to the "messaging.gcp_pubsub.message.ordering_key" semantic conventions. It +// represents the ordering key for a given message. If the attribute is not +// present, the message does not have an ordering key. +func MessagingGCPPubsubMessageOrderingKey(val string) attribute.KeyValue { + return MessagingGCPPubsubMessageOrderingKeyKey.String(val) +} + +// MessagingKafkaMessageKey returns an attribute KeyValue conforming to the +// "messaging.kafka.message.key" semantic conventions. It represents the message +// keys in Kafka are used for grouping alike messages to ensure they're processed +// on the same partition. They differ from `messaging.message.id` in that they're +// not unique. If the key is `null`, the attribute MUST NOT be set. +func MessagingKafkaMessageKey(val string) attribute.KeyValue { + return MessagingKafkaMessageKeyKey.String(val) +} + +// MessagingKafkaMessageTombstone returns an attribute KeyValue conforming to the +// "messaging.kafka.message.tombstone" semantic conventions. It represents a +// boolean that is true if the message is a tombstone. +func MessagingKafkaMessageTombstone(val bool) attribute.KeyValue { + return MessagingKafkaMessageTombstoneKey.Bool(val) +} + +// MessagingKafkaOffset returns an attribute KeyValue conforming to the +// "messaging.kafka.offset" semantic conventions. It represents the offset of a +// record in the corresponding Kafka partition. +func MessagingKafkaOffset(val int) attribute.KeyValue { + return MessagingKafkaOffsetKey.Int(val) +} + +// MessagingMessageBodySize returns an attribute KeyValue conforming to the +// "messaging.message.body.size" semantic conventions. It represents the size of +// the message body in bytes. +func MessagingMessageBodySize(val int) attribute.KeyValue { + return MessagingMessageBodySizeKey.Int(val) +} + +// MessagingMessageConversationID returns an attribute KeyValue conforming to the +// "messaging.message.conversation_id" semantic conventions. It represents the +// conversation ID identifying the conversation to which the message belongs, +// represented as a string. Sometimes called "Correlation ID". +func MessagingMessageConversationID(val string) attribute.KeyValue { + return MessagingMessageConversationIDKey.String(val) +} + +// MessagingMessageEnvelopeSize returns an attribute KeyValue conforming to the +// "messaging.message.envelope.size" semantic conventions. It represents the size +// of the message body and metadata in bytes. +func MessagingMessageEnvelopeSize(val int) attribute.KeyValue { + return MessagingMessageEnvelopeSizeKey.Int(val) +} + +// MessagingMessageID returns an attribute KeyValue conforming to the +// "messaging.message.id" semantic conventions. It represents a value used by the +// messaging system as an identifier for the message, represented as a string. +func MessagingMessageID(val string) attribute.KeyValue { + return MessagingMessageIDKey.String(val) +} + +// MessagingOperationName returns an attribute KeyValue conforming to the +// "messaging.operation.name" semantic conventions. It represents the +// system-specific name of the messaging operation. +func MessagingOperationName(val string) attribute.KeyValue { + return MessagingOperationNameKey.String(val) +} + +// MessagingRabbitmqDestinationRoutingKey returns an attribute KeyValue +// conforming to the "messaging.rabbitmq.destination.routing_key" semantic +// conventions. It represents the rabbitMQ message routing key. +func MessagingRabbitmqDestinationRoutingKey(val string) attribute.KeyValue { + return MessagingRabbitmqDestinationRoutingKeyKey.String(val) +} + +// MessagingRabbitmqMessageDeliveryTag returns an attribute KeyValue conforming +// to the "messaging.rabbitmq.message.delivery_tag" semantic conventions. It +// represents the rabbitMQ message delivery tag. +func MessagingRabbitmqMessageDeliveryTag(val int) attribute.KeyValue { + return MessagingRabbitmqMessageDeliveryTagKey.Int(val) +} + +// MessagingRocketmqMessageDelayTimeLevel returns an attribute KeyValue +// conforming to the "messaging.rocketmq.message.delay_time_level" semantic +// conventions. It represents the delay time level for delay message, which +// determines the message delay time. +func MessagingRocketmqMessageDelayTimeLevel(val int) attribute.KeyValue { + return MessagingRocketmqMessageDelayTimeLevelKey.Int(val) +} + +// MessagingRocketmqMessageDeliveryTimestamp returns an attribute KeyValue +// conforming to the "messaging.rocketmq.message.delivery_timestamp" semantic +// conventions. It represents the timestamp in milliseconds that the delay +// message is expected to be delivered to consumer. +func MessagingRocketmqMessageDeliveryTimestamp(val int) attribute.KeyValue { + return MessagingRocketmqMessageDeliveryTimestampKey.Int(val) +} + +// MessagingRocketmqMessageGroup returns an attribute KeyValue conforming to the +// "messaging.rocketmq.message.group" semantic conventions. It represents the it +// is essential for FIFO message. Messages that belong to the same message group +// are always processed one by one within the same consumer group. +func MessagingRocketmqMessageGroup(val string) attribute.KeyValue { + return MessagingRocketmqMessageGroupKey.String(val) +} + +// MessagingRocketmqMessageKeys returns an attribute KeyValue conforming to the +// "messaging.rocketmq.message.keys" semantic conventions. It represents the +// key(s) of message, another way to mark message besides message id. +func MessagingRocketmqMessageKeys(val ...string) attribute.KeyValue { + return MessagingRocketmqMessageKeysKey.StringSlice(val) +} + +// MessagingRocketmqMessageTag returns an attribute KeyValue conforming to the +// "messaging.rocketmq.message.tag" semantic conventions. It represents the +// secondary classifier of message besides topic. +func MessagingRocketmqMessageTag(val string) attribute.KeyValue { + return MessagingRocketmqMessageTagKey.String(val) +} + +// MessagingRocketmqNamespace returns an attribute KeyValue conforming to the +// "messaging.rocketmq.namespace" semantic conventions. It represents the +// namespace of RocketMQ resources, resources in different namespaces are +// individual. +func MessagingRocketmqNamespace(val string) attribute.KeyValue { + return MessagingRocketmqNamespaceKey.String(val) +} + +// MessagingServicebusMessageDeliveryCount returns an attribute KeyValue +// conforming to the "messaging.servicebus.message.delivery_count" semantic +// conventions. It represents the number of deliveries that have been attempted +// for this message. +func MessagingServicebusMessageDeliveryCount(val int) attribute.KeyValue { + return MessagingServicebusMessageDeliveryCountKey.Int(val) +} + +// MessagingServicebusMessageEnqueuedTime returns an attribute KeyValue +// conforming to the "messaging.servicebus.message.enqueued_time" semantic +// conventions. It represents the UTC epoch seconds at which the message has been +// accepted and stored in the entity. +func MessagingServicebusMessageEnqueuedTime(val int) attribute.KeyValue { + return MessagingServicebusMessageEnqueuedTimeKey.Int(val) +} + +// Enum values for messaging.operation.type +var ( + // A message is created. "Create" spans always refer to a single message and are + // used to provide a unique creation context for messages in batch sending + // scenarios. + // + // Stability: development + MessagingOperationTypeCreate = MessagingOperationTypeKey.String("create") + // One or more messages are provided for sending to an intermediary. If a single + // message is sent, the context of the "Send" span can be used as the creation + // context and no "Create" span needs to be created. + // + // Stability: development + MessagingOperationTypeSend = MessagingOperationTypeKey.String("send") + // One or more messages are requested by a consumer. This operation refers to + // pull-based scenarios, where consumers explicitly call methods of messaging + // SDKs to receive messages. + // + // Stability: development + MessagingOperationTypeReceive = MessagingOperationTypeKey.String("receive") + // One or more messages are processed by a consumer. + // + // Stability: development + MessagingOperationTypeProcess = MessagingOperationTypeKey.String("process") + // One or more messages are settled. + // + // Stability: development + MessagingOperationTypeSettle = MessagingOperationTypeKey.String("settle") + // Deprecated: Replaced by `process`. + MessagingOperationTypeDeliver = MessagingOperationTypeKey.String("deliver") + // Deprecated: Replaced by `send`. + MessagingOperationTypePublish = MessagingOperationTypeKey.String("publish") +) + +// Enum values for messaging.rocketmq.consumption_model +var ( + // Clustering consumption model + // Stability: development + MessagingRocketmqConsumptionModelClustering = MessagingRocketmqConsumptionModelKey.String("clustering") + // Broadcasting consumption model + // Stability: development + MessagingRocketmqConsumptionModelBroadcasting = MessagingRocketmqConsumptionModelKey.String("broadcasting") +) + +// Enum values for messaging.rocketmq.message.type +var ( + // Normal message + // Stability: development + MessagingRocketmqMessageTypeNormal = MessagingRocketmqMessageTypeKey.String("normal") + // FIFO message + // Stability: development + MessagingRocketmqMessageTypeFifo = MessagingRocketmqMessageTypeKey.String("fifo") + // Delay message + // Stability: development + MessagingRocketmqMessageTypeDelay = MessagingRocketmqMessageTypeKey.String("delay") + // Transaction message + // Stability: development + MessagingRocketmqMessageTypeTransaction = MessagingRocketmqMessageTypeKey.String("transaction") +) + +// Enum values for messaging.servicebus.disposition_status +var ( + // Message is completed + // Stability: development + MessagingServicebusDispositionStatusComplete = MessagingServicebusDispositionStatusKey.String("complete") + // Message is abandoned + // Stability: development + MessagingServicebusDispositionStatusAbandon = MessagingServicebusDispositionStatusKey.String("abandon") + // Message is sent to dead letter queue + // Stability: development + MessagingServicebusDispositionStatusDeadLetter = MessagingServicebusDispositionStatusKey.String("dead_letter") + // Message is deferred + // Stability: development + MessagingServicebusDispositionStatusDefer = MessagingServicebusDispositionStatusKey.String("defer") +) + +// Enum values for messaging.system +var ( + // Apache ActiveMQ + // Stability: development + MessagingSystemActivemq = MessagingSystemKey.String("activemq") + // Amazon Simple Queue Service (SQS) + // Stability: development + MessagingSystemAWSSqs = MessagingSystemKey.String("aws_sqs") + // Azure Event Grid + // Stability: development + MessagingSystemEventgrid = MessagingSystemKey.String("eventgrid") + // Azure Event Hubs + // Stability: development + MessagingSystemEventhubs = MessagingSystemKey.String("eventhubs") + // Azure Service Bus + // Stability: development + MessagingSystemServicebus = MessagingSystemKey.String("servicebus") + // Google Cloud Pub/Sub + // Stability: development + MessagingSystemGCPPubsub = MessagingSystemKey.String("gcp_pubsub") + // Java Message Service + // Stability: development + MessagingSystemJms = MessagingSystemKey.String("jms") + // Apache Kafka + // Stability: development + MessagingSystemKafka = MessagingSystemKey.String("kafka") + // RabbitMQ + // Stability: development + MessagingSystemRabbitmq = MessagingSystemKey.String("rabbitmq") + // Apache RocketMQ + // Stability: development + MessagingSystemRocketmq = MessagingSystemKey.String("rocketmq") + // Apache Pulsar + // Stability: development + MessagingSystemPulsar = MessagingSystemKey.String("pulsar") +) + +// Namespace: network +const ( + // NetworkCarrierIccKey is the attribute Key conforming to the + // "network.carrier.icc" semantic conventions. It represents the ISO 3166-1 + // alpha-2 2-character country code associated with the mobile carrier network. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: DE + NetworkCarrierIccKey = attribute.Key("network.carrier.icc") + + // NetworkCarrierMccKey is the attribute Key conforming to the + // "network.carrier.mcc" semantic conventions. It represents the mobile carrier + // country code. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 310 + NetworkCarrierMccKey = attribute.Key("network.carrier.mcc") + + // NetworkCarrierMncKey is the attribute Key conforming to the + // "network.carrier.mnc" semantic conventions. It represents the mobile carrier + // network code. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 001 + NetworkCarrierMncKey = attribute.Key("network.carrier.mnc") + + // NetworkCarrierNameKey is the attribute Key conforming to the + // "network.carrier.name" semantic conventions. It represents the name of the + // mobile carrier. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: sprint + NetworkCarrierNameKey = attribute.Key("network.carrier.name") + + // NetworkConnectionStateKey is the attribute Key conforming to the + // "network.connection.state" semantic conventions. It represents the state of + // network connection. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "close_wait" + // Note: Connection states are defined as part of the [rfc9293] + // + // [rfc9293]: https://datatracker.ietf.org/doc/html/rfc9293#section-3.3.2 + NetworkConnectionStateKey = attribute.Key("network.connection.state") + + // NetworkConnectionSubtypeKey is the attribute Key conforming to the + // "network.connection.subtype" semantic conventions. It represents the this + // describes more details regarding the connection.type. It may be the type of + // cell technology connection, but it could be used for describing details about + // a wifi connection. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: LTE + NetworkConnectionSubtypeKey = attribute.Key("network.connection.subtype") + + // NetworkConnectionTypeKey is the attribute Key conforming to the + // "network.connection.type" semantic conventions. It represents the internet + // connection type. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: wifi + NetworkConnectionTypeKey = attribute.Key("network.connection.type") + + // NetworkInterfaceNameKey is the attribute Key conforming to the + // "network.interface.name" semantic conventions. It represents the network + // interface name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "lo", "eth0" + NetworkInterfaceNameKey = attribute.Key("network.interface.name") + + // NetworkIoDirectionKey is the attribute Key conforming to the + // "network.io.direction" semantic conventions. It represents the network IO + // operation direction. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "transmit" + NetworkIoDirectionKey = attribute.Key("network.io.direction") + + // NetworkLocalAddressKey is the attribute Key conforming to the + // "network.local.address" semantic conventions. It represents the local address + // of the network connection - IP address or Unix domain socket name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "10.1.2.80", "/tmp/my.sock" + NetworkLocalAddressKey = attribute.Key("network.local.address") + + // NetworkLocalPortKey is the attribute Key conforming to the + // "network.local.port" semantic conventions. It represents the local port + // number of the network connection. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: 65123 + NetworkLocalPortKey = attribute.Key("network.local.port") + + // NetworkPeerAddressKey is the attribute Key conforming to the + // "network.peer.address" semantic conventions. It represents the peer address + // of the network connection - IP address or Unix domain socket name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "10.1.2.80", "/tmp/my.sock" + NetworkPeerAddressKey = attribute.Key("network.peer.address") + + // NetworkPeerPortKey is the attribute Key conforming to the "network.peer.port" + // semantic conventions. It represents the peer port number of the network + // connection. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: 65123 + NetworkPeerPortKey = attribute.Key("network.peer.port") + + // NetworkProtocolNameKey is the attribute Key conforming to the + // "network.protocol.name" semantic conventions. It represents the + // [OSI application layer] or non-OSI equivalent. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "amqp", "http", "mqtt" + // Note: The value SHOULD be normalized to lowercase. + // + // [OSI application layer]: https://wikipedia.org/wiki/Application_layer + NetworkProtocolNameKey = attribute.Key("network.protocol.name") + + // NetworkProtocolVersionKey is the attribute Key conforming to the + // "network.protocol.version" semantic conventions. It represents the actual + // version of the protocol used for network communication. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "1.1", "2" + // Note: If protocol version is subject to negotiation (for example using [ALPN] + // ), this attribute SHOULD be set to the negotiated version. If the actual + // protocol version is not known, this attribute SHOULD NOT be set. + // + // [ALPN]: https://www.rfc-editor.org/rfc/rfc7301.html + NetworkProtocolVersionKey = attribute.Key("network.protocol.version") + + // NetworkTransportKey is the attribute Key conforming to the + // "network.transport" semantic conventions. It represents the + // [OSI transport layer] or [inter-process communication method]. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "tcp", "udp" + // Note: The value SHOULD be normalized to lowercase. + // + // Consider always setting the transport when setting a port number, since + // a port number is ambiguous without knowing the transport. For example + // different processes could be listening on TCP port 12345 and UDP port 12345. + // + // [OSI transport layer]: https://wikipedia.org/wiki/Transport_layer + // [inter-process communication method]: https://wikipedia.org/wiki/Inter-process_communication + NetworkTransportKey = attribute.Key("network.transport") + + // NetworkTypeKey is the attribute Key conforming to the "network.type" semantic + // conventions. It represents the [OSI network layer] or non-OSI equivalent. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "ipv4", "ipv6" + // Note: The value SHOULD be normalized to lowercase. + // + // [OSI network layer]: https://wikipedia.org/wiki/Network_layer + NetworkTypeKey = attribute.Key("network.type") +) + +// NetworkCarrierIcc returns an attribute KeyValue conforming to the +// "network.carrier.icc" semantic conventions. It represents the ISO 3166-1 +// alpha-2 2-character country code associated with the mobile carrier network. +func NetworkCarrierIcc(val string) attribute.KeyValue { + return NetworkCarrierIccKey.String(val) +} + +// NetworkCarrierMcc returns an attribute KeyValue conforming to the +// "network.carrier.mcc" semantic conventions. It represents the mobile carrier +// country code. +func NetworkCarrierMcc(val string) attribute.KeyValue { + return NetworkCarrierMccKey.String(val) +} + +// NetworkCarrierMnc returns an attribute KeyValue conforming to the +// "network.carrier.mnc" semantic conventions. It represents the mobile carrier +// network code. +func NetworkCarrierMnc(val string) attribute.KeyValue { + return NetworkCarrierMncKey.String(val) +} + +// NetworkCarrierName returns an attribute KeyValue conforming to the +// "network.carrier.name" semantic conventions. It represents the name of the +// mobile carrier. +func NetworkCarrierName(val string) attribute.KeyValue { + return NetworkCarrierNameKey.String(val) +} + +// NetworkInterfaceName returns an attribute KeyValue conforming to the +// "network.interface.name" semantic conventions. It represents the network +// interface name. +func NetworkInterfaceName(val string) attribute.KeyValue { + return NetworkInterfaceNameKey.String(val) +} + +// NetworkLocalAddress returns an attribute KeyValue conforming to the +// "network.local.address" semantic conventions. It represents the local address +// of the network connection - IP address or Unix domain socket name. +func NetworkLocalAddress(val string) attribute.KeyValue { + return NetworkLocalAddressKey.String(val) +} + +// NetworkLocalPort returns an attribute KeyValue conforming to the +// "network.local.port" semantic conventions. It represents the local port number +// of the network connection. +func NetworkLocalPort(val int) attribute.KeyValue { + return NetworkLocalPortKey.Int(val) +} + +// NetworkPeerAddress returns an attribute KeyValue conforming to the +// "network.peer.address" semantic conventions. It represents the peer address of +// the network connection - IP address or Unix domain socket name. +func NetworkPeerAddress(val string) attribute.KeyValue { + return NetworkPeerAddressKey.String(val) +} + +// NetworkPeerPort returns an attribute KeyValue conforming to the +// "network.peer.port" semantic conventions. It represents the peer port number +// of the network connection. +func NetworkPeerPort(val int) attribute.KeyValue { + return NetworkPeerPortKey.Int(val) +} + +// NetworkProtocolName returns an attribute KeyValue conforming to the +// "network.protocol.name" semantic conventions. It represents the +// [OSI application layer] or non-OSI equivalent. +// +// [OSI application layer]: https://wikipedia.org/wiki/Application_layer +func NetworkProtocolName(val string) attribute.KeyValue { + return NetworkProtocolNameKey.String(val) +} + +// NetworkProtocolVersion returns an attribute KeyValue conforming to the +// "network.protocol.version" semantic conventions. It represents the actual +// version of the protocol used for network communication. +func NetworkProtocolVersion(val string) attribute.KeyValue { + return NetworkProtocolVersionKey.String(val) +} + +// Enum values for network.connection.state +var ( + // closed + // Stability: development + NetworkConnectionStateClosed = NetworkConnectionStateKey.String("closed") + // close_wait + // Stability: development + NetworkConnectionStateCloseWait = NetworkConnectionStateKey.String("close_wait") + // closing + // Stability: development + NetworkConnectionStateClosing = NetworkConnectionStateKey.String("closing") + // established + // Stability: development + NetworkConnectionStateEstablished = NetworkConnectionStateKey.String("established") + // fin_wait_1 + // Stability: development + NetworkConnectionStateFinWait1 = NetworkConnectionStateKey.String("fin_wait_1") + // fin_wait_2 + // Stability: development + NetworkConnectionStateFinWait2 = NetworkConnectionStateKey.String("fin_wait_2") + // last_ack + // Stability: development + NetworkConnectionStateLastAck = NetworkConnectionStateKey.String("last_ack") + // listen + // Stability: development + NetworkConnectionStateListen = NetworkConnectionStateKey.String("listen") + // syn_received + // Stability: development + NetworkConnectionStateSynReceived = NetworkConnectionStateKey.String("syn_received") + // syn_sent + // Stability: development + NetworkConnectionStateSynSent = NetworkConnectionStateKey.String("syn_sent") + // time_wait + // Stability: development + NetworkConnectionStateTimeWait = NetworkConnectionStateKey.String("time_wait") +) + +// Enum values for network.connection.subtype +var ( + // GPRS + // Stability: development + NetworkConnectionSubtypeGprs = NetworkConnectionSubtypeKey.String("gprs") + // EDGE + // Stability: development + NetworkConnectionSubtypeEdge = NetworkConnectionSubtypeKey.String("edge") + // UMTS + // Stability: development + NetworkConnectionSubtypeUmts = NetworkConnectionSubtypeKey.String("umts") + // CDMA + // Stability: development + NetworkConnectionSubtypeCdma = NetworkConnectionSubtypeKey.String("cdma") + // EVDO Rel. 0 + // Stability: development + NetworkConnectionSubtypeEvdo0 = NetworkConnectionSubtypeKey.String("evdo_0") + // EVDO Rev. A + // Stability: development + NetworkConnectionSubtypeEvdoA = NetworkConnectionSubtypeKey.String("evdo_a") + // CDMA2000 1XRTT + // Stability: development + NetworkConnectionSubtypeCdma20001xrtt = NetworkConnectionSubtypeKey.String("cdma2000_1xrtt") + // HSDPA + // Stability: development + NetworkConnectionSubtypeHsdpa = NetworkConnectionSubtypeKey.String("hsdpa") + // HSUPA + // Stability: development + NetworkConnectionSubtypeHsupa = NetworkConnectionSubtypeKey.String("hsupa") + // HSPA + // Stability: development + NetworkConnectionSubtypeHspa = NetworkConnectionSubtypeKey.String("hspa") + // IDEN + // Stability: development + NetworkConnectionSubtypeIden = NetworkConnectionSubtypeKey.String("iden") + // EVDO Rev. B + // Stability: development + NetworkConnectionSubtypeEvdoB = NetworkConnectionSubtypeKey.String("evdo_b") + // LTE + // Stability: development + NetworkConnectionSubtypeLte = NetworkConnectionSubtypeKey.String("lte") + // EHRPD + // Stability: development + NetworkConnectionSubtypeEhrpd = NetworkConnectionSubtypeKey.String("ehrpd") + // HSPAP + // Stability: development + NetworkConnectionSubtypeHspap = NetworkConnectionSubtypeKey.String("hspap") + // GSM + // Stability: development + NetworkConnectionSubtypeGsm = NetworkConnectionSubtypeKey.String("gsm") + // TD-SCDMA + // Stability: development + NetworkConnectionSubtypeTdScdma = NetworkConnectionSubtypeKey.String("td_scdma") + // IWLAN + // Stability: development + NetworkConnectionSubtypeIwlan = NetworkConnectionSubtypeKey.String("iwlan") + // 5G NR (New Radio) + // Stability: development + NetworkConnectionSubtypeNr = NetworkConnectionSubtypeKey.String("nr") + // 5G NRNSA (New Radio Non-Standalone) + // Stability: development + NetworkConnectionSubtypeNrnsa = NetworkConnectionSubtypeKey.String("nrnsa") + // LTE CA + // Stability: development + NetworkConnectionSubtypeLteCa = NetworkConnectionSubtypeKey.String("lte_ca") +) + +// Enum values for network.connection.type +var ( + // wifi + // Stability: development + NetworkConnectionTypeWifi = NetworkConnectionTypeKey.String("wifi") + // wired + // Stability: development + NetworkConnectionTypeWired = NetworkConnectionTypeKey.String("wired") + // cell + // Stability: development + NetworkConnectionTypeCell = NetworkConnectionTypeKey.String("cell") + // unavailable + // Stability: development + NetworkConnectionTypeUnavailable = NetworkConnectionTypeKey.String("unavailable") + // unknown + // Stability: development + NetworkConnectionTypeUnknown = NetworkConnectionTypeKey.String("unknown") +) + +// Enum values for network.io.direction +var ( + // transmit + // Stability: development + NetworkIoDirectionTransmit = NetworkIoDirectionKey.String("transmit") + // receive + // Stability: development + NetworkIoDirectionReceive = NetworkIoDirectionKey.String("receive") +) + +// Enum values for network.transport +var ( + // TCP + // Stability: stable + NetworkTransportTCP = NetworkTransportKey.String("tcp") + // UDP + // Stability: stable + NetworkTransportUDP = NetworkTransportKey.String("udp") + // Named or anonymous pipe. + // Stability: stable + NetworkTransportPipe = NetworkTransportKey.String("pipe") + // Unix domain socket + // Stability: stable + NetworkTransportUnix = NetworkTransportKey.String("unix") + // QUIC + // Stability: development + NetworkTransportQUIC = NetworkTransportKey.String("quic") +) + +// Enum values for network.type +var ( + // IPv4 + // Stability: stable + NetworkTypeIpv4 = NetworkTypeKey.String("ipv4") + // IPv6 + // Stability: stable + NetworkTypeIpv6 = NetworkTypeKey.String("ipv6") +) + +// Namespace: oci +const ( + // OciManifestDigestKey is the attribute Key conforming to the + // "oci.manifest.digest" semantic conventions. It represents the digest of the + // OCI image manifest. For container images specifically is the digest by which + // the container image is known. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "sha256:e4ca62c0d62f3e886e684806dfe9d4e0cda60d54986898173c1083856cfda0f4" + // Note: Follows [OCI Image Manifest Specification], and specifically the + // [Digest property]. + // An example can be found in [Example Image Manifest]. + // + // [OCI Image Manifest Specification]: https://github.com/opencontainers/image-spec/blob/main/manifest.md + // [Digest property]: https://github.com/opencontainers/image-spec/blob/main/descriptor.md#digests + // [Example Image Manifest]: https://docs.docker.com/registry/spec/manifest-v2-2/#example-image-manifest + OciManifestDigestKey = attribute.Key("oci.manifest.digest") +) + +// OciManifestDigest returns an attribute KeyValue conforming to the +// "oci.manifest.digest" semantic conventions. It represents the digest of the +// OCI image manifest. For container images specifically is the digest by which +// the container image is known. +func OciManifestDigest(val string) attribute.KeyValue { + return OciManifestDigestKey.String(val) +} + +// Namespace: opentracing +const ( + // OpentracingRefTypeKey is the attribute Key conforming to the + // "opentracing.ref_type" semantic conventions. It represents the parent-child + // Reference type. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: The causal relationship between a child Span and a parent Span. + OpentracingRefTypeKey = attribute.Key("opentracing.ref_type") +) + +// Enum values for opentracing.ref_type +var ( + // The parent Span depends on the child Span in some capacity + // Stability: development + OpentracingRefTypeChildOf = OpentracingRefTypeKey.String("child_of") + // The parent Span doesn't depend in any way on the result of the child Span + // Stability: development + OpentracingRefTypeFollowsFrom = OpentracingRefTypeKey.String("follows_from") +) + +// Namespace: os +const ( + // OSBuildIDKey is the attribute Key conforming to the "os.build_id" semantic + // conventions. It represents the unique identifier for a particular build or + // compilation of the operating system. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "TQ3C.230805.001.B2", "20E247", "22621" + OSBuildIDKey = attribute.Key("os.build_id") + + // OSDescriptionKey is the attribute Key conforming to the "os.description" + // semantic conventions. It represents the human readable (not intended to be + // parsed) OS version information, like e.g. reported by `ver` or + // `lsb_release -a` commands. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Microsoft Windows [Version 10.0.18363.778]", "Ubuntu 18.04.1 LTS" + OSDescriptionKey = attribute.Key("os.description") + + // OSNameKey is the attribute Key conforming to the "os.name" semantic + // conventions. It represents the human readable operating system name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "iOS", "Android", "Ubuntu" + OSNameKey = attribute.Key("os.name") + + // OSTypeKey is the attribute Key conforming to the "os.type" semantic + // conventions. It represents the operating system type. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + OSTypeKey = attribute.Key("os.type") + + // OSVersionKey is the attribute Key conforming to the "os.version" semantic + // conventions. It represents the version string of the operating system as + // defined in [Version Attributes]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "14.2.1", "18.04.1" + // + // [Version Attributes]: /docs/resource/README.md#version-attributes + OSVersionKey = attribute.Key("os.version") +) + +// OSBuildID returns an attribute KeyValue conforming to the "os.build_id" +// semantic conventions. It represents the unique identifier for a particular +// build or compilation of the operating system. +func OSBuildID(val string) attribute.KeyValue { + return OSBuildIDKey.String(val) +} + +// OSDescription returns an attribute KeyValue conforming to the "os.description" +// semantic conventions. It represents the human readable (not intended to be +// parsed) OS version information, like e.g. reported by `ver` or +// `lsb_release -a` commands. +func OSDescription(val string) attribute.KeyValue { + return OSDescriptionKey.String(val) +} + +// OSName returns an attribute KeyValue conforming to the "os.name" semantic +// conventions. It represents the human readable operating system name. +func OSName(val string) attribute.KeyValue { + return OSNameKey.String(val) +} + +// OSVersion returns an attribute KeyValue conforming to the "os.version" +// semantic conventions. It represents the version string of the operating system +// as defined in [Version Attributes]. +// +// [Version Attributes]: /docs/resource/README.md#version-attributes +func OSVersion(val string) attribute.KeyValue { + return OSVersionKey.String(val) +} + +// Enum values for os.type +var ( + // Microsoft Windows + // Stability: development + OSTypeWindows = OSTypeKey.String("windows") + // Linux + // Stability: development + OSTypeLinux = OSTypeKey.String("linux") + // Apple Darwin + // Stability: development + OSTypeDarwin = OSTypeKey.String("darwin") + // FreeBSD + // Stability: development + OSTypeFreeBSD = OSTypeKey.String("freebsd") + // NetBSD + // Stability: development + OSTypeNetBSD = OSTypeKey.String("netbsd") + // OpenBSD + // Stability: development + OSTypeOpenBSD = OSTypeKey.String("openbsd") + // DragonFly BSD + // Stability: development + OSTypeDragonflyBSD = OSTypeKey.String("dragonflybsd") + // HP-UX (Hewlett Packard Unix) + // Stability: development + OSTypeHPUX = OSTypeKey.String("hpux") + // AIX (Advanced Interactive eXecutive) + // Stability: development + OSTypeAIX = OSTypeKey.String("aix") + // SunOS, Oracle Solaris + // Stability: development + OSTypeSolaris = OSTypeKey.String("solaris") + // IBM z/OS + // Stability: development + OSTypeZOS = OSTypeKey.String("z_os") +) + +// Namespace: otel +const ( + // OTelScopeNameKey is the attribute Key conforming to the "otel.scope.name" + // semantic conventions. It represents the name of the instrumentation scope - ( + // `InstrumentationScope.Name` in OTLP). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "io.opentelemetry.contrib.mongodb" + OTelScopeNameKey = attribute.Key("otel.scope.name") + + // OTelScopeVersionKey is the attribute Key conforming to the + // "otel.scope.version" semantic conventions. It represents the version of the + // instrumentation scope - (`InstrumentationScope.Version` in OTLP). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "1.0.0" + OTelScopeVersionKey = attribute.Key("otel.scope.version") + + // OTelStatusCodeKey is the attribute Key conforming to the "otel.status_code" + // semantic conventions. It represents the name of the code, either "OK" or + // "ERROR". MUST NOT be set if the status code is UNSET. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: + OTelStatusCodeKey = attribute.Key("otel.status_code") + + // OTelStatusDescriptionKey is the attribute Key conforming to the + // "otel.status_description" semantic conventions. It represents the description + // of the Status if it has a value, otherwise not set. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "resource not found" + OTelStatusDescriptionKey = attribute.Key("otel.status_description") +) + +// OTelScopeName returns an attribute KeyValue conforming to the +// "otel.scope.name" semantic conventions. It represents the name of the +// instrumentation scope - (`InstrumentationScope.Name` in OTLP). +func OTelScopeName(val string) attribute.KeyValue { + return OTelScopeNameKey.String(val) +} + +// OTelScopeVersion returns an attribute KeyValue conforming to the +// "otel.scope.version" semantic conventions. It represents the version of the +// instrumentation scope - (`InstrumentationScope.Version` in OTLP). +func OTelScopeVersion(val string) attribute.KeyValue { + return OTelScopeVersionKey.String(val) +} + +// OTelStatusDescription returns an attribute KeyValue conforming to the +// "otel.status_description" semantic conventions. It represents the description +// of the Status if it has a value, otherwise not set. +func OTelStatusDescription(val string) attribute.KeyValue { + return OTelStatusDescriptionKey.String(val) +} + +// Enum values for otel.status_code +var ( + // The operation has been validated by an Application developer or Operator to + // have completed successfully. + // Stability: stable + OTelStatusCodeOk = OTelStatusCodeKey.String("OK") + // The operation contains an error. + // Stability: stable + OTelStatusCodeError = OTelStatusCodeKey.String("ERROR") +) + +// Namespace: peer +const ( + // PeerServiceKey is the attribute Key conforming to the "peer.service" semantic + // conventions. It represents the [`service.name`] of the remote service. SHOULD + // be equal to the actual `service.name` resource attribute of the remote + // service if any. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: AuthTokenCache + // + // [`service.name`]: /docs/resource/README.md#service + PeerServiceKey = attribute.Key("peer.service") +) + +// PeerService returns an attribute KeyValue conforming to the "peer.service" +// semantic conventions. It represents the [`service.name`] of the remote +// service. SHOULD be equal to the actual `service.name` resource attribute of +// the remote service if any. +// +// [`service.name`]: /docs/resource/README.md#service +func PeerService(val string) attribute.KeyValue { + return PeerServiceKey.String(val) +} + +// Namespace: process +const ( + // ProcessArgsCountKey is the attribute Key conforming to the + // "process.args_count" semantic conventions. It represents the length of the + // process.command_args array. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 4 + // Note: This field can be useful for querying or performing bucket analysis on + // how many arguments were provided to start a process. More arguments may be an + // indication of suspicious activity. + ProcessArgsCountKey = attribute.Key("process.args_count") + + // ProcessCommandKey is the attribute Key conforming to the "process.command" + // semantic conventions. It represents the command used to launch the process + // (i.e. the command name). On Linux based systems, can be set to the zeroth + // string in `proc/[pid]/cmdline`. On Windows, can be set to the first parameter + // extracted from `GetCommandLineW`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "cmd/otelcol" + ProcessCommandKey = attribute.Key("process.command") + + // ProcessCommandArgsKey is the attribute Key conforming to the + // "process.command_args" semantic conventions. It represents the all the + // command arguments (including the command/executable itself) as received by + // the process. On Linux-based systems (and some other Unixoid systems + // supporting procfs), can be set according to the list of null-delimited + // strings extracted from `proc/[pid]/cmdline`. For libc-based executables, this + // would be the full argv vector passed to `main`. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "cmd/otecol", "--config=config.yaml" + ProcessCommandArgsKey = attribute.Key("process.command_args") + + // ProcessCommandLineKey is the attribute Key conforming to the + // "process.command_line" semantic conventions. It represents the full command + // used to launch the process as a single string representing the full command. + // On Windows, can be set to the result of `GetCommandLineW`. Do not set this if + // you have to assemble it just for monitoring; use `process.command_args` + // instead. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "C:\cmd\otecol --config="my directory\config.yaml"" + ProcessCommandLineKey = attribute.Key("process.command_line") + + // ProcessContextSwitchTypeKey is the attribute Key conforming to the + // "process.context_switch_type" semantic conventions. It represents the + // specifies whether the context switches for this data point were voluntary or + // involuntary. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + ProcessContextSwitchTypeKey = attribute.Key("process.context_switch_type") + + // ProcessCreationTimeKey is the attribute Key conforming to the + // "process.creation.time" semantic conventions. It represents the date and time + // the process was created, in ISO 8601 format. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2023-11-21T09:25:34.853Z" + ProcessCreationTimeKey = attribute.Key("process.creation.time") + + // ProcessExecutableBuildIDGnuKey is the attribute Key conforming to the + // "process.executable.build_id.gnu" semantic conventions. It represents the GNU + // build ID as found in the `.note.gnu.build-id` ELF section (hex string). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "c89b11207f6479603b0d49bf291c092c2b719293" + ProcessExecutableBuildIDGnuKey = attribute.Key("process.executable.build_id.gnu") + + // ProcessExecutableBuildIDGoKey is the attribute Key conforming to the + // "process.executable.build_id.go" semantic conventions. It represents the Go + // build ID as retrieved by `go tool buildid `. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "foh3mEXu7BLZjsN9pOwG/kATcXlYVCDEFouRMQed_/WwRFB1hPo9LBkekthSPG/x8hMC8emW2cCjXD0_1aY" + ProcessExecutableBuildIDGoKey = attribute.Key("process.executable.build_id.go") + + // ProcessExecutableBuildIDHtlhashKey is the attribute Key conforming to the + // "process.executable.build_id.htlhash" semantic conventions. It represents the + // profiling specific build ID for executables. See the OTel specification for + // Profiles for more information. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "600DCAFE4A110000F2BF38C493F5FB92" + ProcessExecutableBuildIDHtlhashKey = attribute.Key("process.executable.build_id.htlhash") + + // ProcessExecutableNameKey is the attribute Key conforming to the + // "process.executable.name" semantic conventions. It represents the name of the + // process executable. On Linux based systems, can be set to the `Name` in + // `proc/[pid]/status`. On Windows, can be set to the base name of + // `GetProcessImageFileNameW`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "otelcol" + ProcessExecutableNameKey = attribute.Key("process.executable.name") + + // ProcessExecutablePathKey is the attribute Key conforming to the + // "process.executable.path" semantic conventions. It represents the full path + // to the process executable. On Linux based systems, can be set to the target + // of `proc/[pid]/exe`. On Windows, can be set to the result of + // `GetProcessImageFileNameW`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/usr/bin/cmd/otelcol" + ProcessExecutablePathKey = attribute.Key("process.executable.path") + + // ProcessExitCodeKey is the attribute Key conforming to the "process.exit.code" + // semantic conventions. It represents the exit code of the process. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 127 + ProcessExitCodeKey = attribute.Key("process.exit.code") + + // ProcessExitTimeKey is the attribute Key conforming to the "process.exit.time" + // semantic conventions. It represents the date and time the process exited, in + // ISO 8601 format. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2023-11-21T09:26:12.315Z" + ProcessExitTimeKey = attribute.Key("process.exit.time") + + // ProcessGroupLeaderPIDKey is the attribute Key conforming to the + // "process.group_leader.pid" semantic conventions. It represents the PID of the + // process's group leader. This is also the process group ID (PGID) of the + // process. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 23 + ProcessGroupLeaderPIDKey = attribute.Key("process.group_leader.pid") + + // ProcessInteractiveKey is the attribute Key conforming to the + // "process.interactive" semantic conventions. It represents the whether the + // process is connected to an interactive shell. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + ProcessInteractiveKey = attribute.Key("process.interactive") + + // ProcessLinuxCgroupKey is the attribute Key conforming to the + // "process.linux.cgroup" semantic conventions. It represents the control group + // associated with the process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1:name=systemd:/user.slice/user-1000.slice/session-3.scope", + // "0::/user.slice/user-1000.slice/user@1000.service/tmux-spawn-0267755b-4639-4a27-90ed-f19f88e53748.scope" + // Note: Control groups (cgroups) are a kernel feature used to organize and + // manage process resources. This attribute provides the path(s) to the + // cgroup(s) associated with the process, which should match the contents of the + // [/proc/[PID]/cgroup] file. + // + // [/proc/[PID]/cgroup]: https://man7.org/linux/man-pages/man7/cgroups.7.html + ProcessLinuxCgroupKey = attribute.Key("process.linux.cgroup") + + // ProcessOwnerKey is the attribute Key conforming to the "process.owner" + // semantic conventions. It represents the username of the user that owns the + // process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "root" + ProcessOwnerKey = attribute.Key("process.owner") + + // ProcessPagingFaultTypeKey is the attribute Key conforming to the + // "process.paging.fault_type" semantic conventions. It represents the type of + // page fault for this data point. Type `major` is for major/hard page faults, + // and `minor` is for minor/soft page faults. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + ProcessPagingFaultTypeKey = attribute.Key("process.paging.fault_type") + + // ProcessParentPIDKey is the attribute Key conforming to the + // "process.parent_pid" semantic conventions. It represents the parent Process + // identifier (PPID). + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 111 + ProcessParentPIDKey = attribute.Key("process.parent_pid") + + // ProcessPIDKey is the attribute Key conforming to the "process.pid" semantic + // conventions. It represents the process identifier (PID). + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1234 + ProcessPIDKey = attribute.Key("process.pid") + + // ProcessRealUserIDKey is the attribute Key conforming to the + // "process.real_user.id" semantic conventions. It represents the real user ID + // (RUID) of the process. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1000 + ProcessRealUserIDKey = attribute.Key("process.real_user.id") + + // ProcessRealUserNameKey is the attribute Key conforming to the + // "process.real_user.name" semantic conventions. It represents the username of + // the real user of the process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "operator" + ProcessRealUserNameKey = attribute.Key("process.real_user.name") + + // ProcessRuntimeDescriptionKey is the attribute Key conforming to the + // "process.runtime.description" semantic conventions. It represents an + // additional description about the runtime of the process, for example a + // specific vendor customization of the runtime environment. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0 + ProcessRuntimeDescriptionKey = attribute.Key("process.runtime.description") + + // ProcessRuntimeNameKey is the attribute Key conforming to the + // "process.runtime.name" semantic conventions. It represents the name of the + // runtime of this process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "OpenJDK Runtime Environment" + ProcessRuntimeNameKey = attribute.Key("process.runtime.name") + + // ProcessRuntimeVersionKey is the attribute Key conforming to the + // "process.runtime.version" semantic conventions. It represents the version of + // the runtime of this process, as returned by the runtime without modification. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 14.0.2 + ProcessRuntimeVersionKey = attribute.Key("process.runtime.version") + + // ProcessSavedUserIDKey is the attribute Key conforming to the + // "process.saved_user.id" semantic conventions. It represents the saved user ID + // (SUID) of the process. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1002 + ProcessSavedUserIDKey = attribute.Key("process.saved_user.id") + + // ProcessSavedUserNameKey is the attribute Key conforming to the + // "process.saved_user.name" semantic conventions. It represents the username of + // the saved user. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "operator" + ProcessSavedUserNameKey = attribute.Key("process.saved_user.name") + + // ProcessSessionLeaderPIDKey is the attribute Key conforming to the + // "process.session_leader.pid" semantic conventions. It represents the PID of + // the process's session leader. This is also the session ID (SID) of the + // process. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 14 + ProcessSessionLeaderPIDKey = attribute.Key("process.session_leader.pid") + + // ProcessTitleKey is the attribute Key conforming to the "process.title" + // semantic conventions. It represents the process title (proctitle). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "cat /etc/hostname", "xfce4-session", "bash" + // Note: In many Unix-like systems, process title (proctitle), is the string + // that represents the name or command line of a running process, displayed by + // system monitoring tools like ps, top, and htop. + ProcessTitleKey = attribute.Key("process.title") + + // ProcessUserIDKey is the attribute Key conforming to the "process.user.id" + // semantic conventions. It represents the effective user ID (EUID) of the + // process. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1001 + ProcessUserIDKey = attribute.Key("process.user.id") + + // ProcessUserNameKey is the attribute Key conforming to the "process.user.name" + // semantic conventions. It represents the username of the effective user of the + // process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "root" + ProcessUserNameKey = attribute.Key("process.user.name") + + // ProcessVpidKey is the attribute Key conforming to the "process.vpid" semantic + // conventions. It represents the virtual process identifier. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 12 + // Note: The process ID within a PID namespace. This is not necessarily unique + // across all processes on the host but it is unique within the process + // namespace that the process exists within. + ProcessVpidKey = attribute.Key("process.vpid") + + // ProcessWorkingDirectoryKey is the attribute Key conforming to the + // "process.working_directory" semantic conventions. It represents the working + // directory of the process. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/root" + ProcessWorkingDirectoryKey = attribute.Key("process.working_directory") +) + +// ProcessArgsCount returns an attribute KeyValue conforming to the +// "process.args_count" semantic conventions. It represents the length of the +// process.command_args array. +func ProcessArgsCount(val int) attribute.KeyValue { + return ProcessArgsCountKey.Int(val) +} + +// ProcessCommand returns an attribute KeyValue conforming to the +// "process.command" semantic conventions. It represents the command used to +// launch the process (i.e. the command name). On Linux based systems, can be set +// to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to the +// first parameter extracted from `GetCommandLineW`. +func ProcessCommand(val string) attribute.KeyValue { + return ProcessCommandKey.String(val) +} + +// ProcessCommandArgs returns an attribute KeyValue conforming to the +// "process.command_args" semantic conventions. It represents the all the command +// arguments (including the command/executable itself) as received by the +// process. On Linux-based systems (and some other Unixoid systems supporting +// procfs), can be set according to the list of null-delimited strings extracted +// from `proc/[pid]/cmdline`. For libc-based executables, this would be the full +// argv vector passed to `main`. +func ProcessCommandArgs(val ...string) attribute.KeyValue { + return ProcessCommandArgsKey.StringSlice(val) +} + +// ProcessCommandLine returns an attribute KeyValue conforming to the +// "process.command_line" semantic conventions. It represents the full command +// used to launch the process as a single string representing the full command. +// On Windows, can be set to the result of `GetCommandLineW`. Do not set this if +// you have to assemble it just for monitoring; use `process.command_args` +// instead. +func ProcessCommandLine(val string) attribute.KeyValue { + return ProcessCommandLineKey.String(val) +} + +// ProcessCreationTime returns an attribute KeyValue conforming to the +// "process.creation.time" semantic conventions. It represents the date and time +// the process was created, in ISO 8601 format. +func ProcessCreationTime(val string) attribute.KeyValue { + return ProcessCreationTimeKey.String(val) +} + +// ProcessExecutableBuildIDGnu returns an attribute KeyValue conforming to the +// "process.executable.build_id.gnu" semantic conventions. It represents the GNU +// build ID as found in the `.note.gnu.build-id` ELF section (hex string). +func ProcessExecutableBuildIDGnu(val string) attribute.KeyValue { + return ProcessExecutableBuildIDGnuKey.String(val) +} + +// ProcessExecutableBuildIDGo returns an attribute KeyValue conforming to the +// "process.executable.build_id.go" semantic conventions. It represents the Go +// build ID as retrieved by `go tool buildid `. +func ProcessExecutableBuildIDGo(val string) attribute.KeyValue { + return ProcessExecutableBuildIDGoKey.String(val) +} + +// ProcessExecutableBuildIDHtlhash returns an attribute KeyValue conforming to +// the "process.executable.build_id.htlhash" semantic conventions. It represents +// the profiling specific build ID for executables. See the OTel specification +// for Profiles for more information. +func ProcessExecutableBuildIDHtlhash(val string) attribute.KeyValue { + return ProcessExecutableBuildIDHtlhashKey.String(val) +} + +// ProcessExecutableName returns an attribute KeyValue conforming to the +// "process.executable.name" semantic conventions. It represents the name of the +// process executable. On Linux based systems, can be set to the `Name` in +// `proc/[pid]/status`. On Windows, can be set to the base name of +// `GetProcessImageFileNameW`. +func ProcessExecutableName(val string) attribute.KeyValue { + return ProcessExecutableNameKey.String(val) +} + +// ProcessExecutablePath returns an attribute KeyValue conforming to the +// "process.executable.path" semantic conventions. It represents the full path to +// the process executable. On Linux based systems, can be set to the target of +// `proc/[pid]/exe`. On Windows, can be set to the result of +// `GetProcessImageFileNameW`. +func ProcessExecutablePath(val string) attribute.KeyValue { + return ProcessExecutablePathKey.String(val) +} + +// ProcessExitCode returns an attribute KeyValue conforming to the +// "process.exit.code" semantic conventions. It represents the exit code of the +// process. +func ProcessExitCode(val int) attribute.KeyValue { + return ProcessExitCodeKey.Int(val) +} + +// ProcessExitTime returns an attribute KeyValue conforming to the +// "process.exit.time" semantic conventions. It represents the date and time the +// process exited, in ISO 8601 format. +func ProcessExitTime(val string) attribute.KeyValue { + return ProcessExitTimeKey.String(val) +} + +// ProcessGroupLeaderPID returns an attribute KeyValue conforming to the +// "process.group_leader.pid" semantic conventions. It represents the PID of the +// process's group leader. This is also the process group ID (PGID) of the +// process. +func ProcessGroupLeaderPID(val int) attribute.KeyValue { + return ProcessGroupLeaderPIDKey.Int(val) +} + +// ProcessInteractive returns an attribute KeyValue conforming to the +// "process.interactive" semantic conventions. It represents the whether the +// process is connected to an interactive shell. +func ProcessInteractive(val bool) attribute.KeyValue { + return ProcessInteractiveKey.Bool(val) +} + +// ProcessLinuxCgroup returns an attribute KeyValue conforming to the +// "process.linux.cgroup" semantic conventions. It represents the control group +// associated with the process. +func ProcessLinuxCgroup(val string) attribute.KeyValue { + return ProcessLinuxCgroupKey.String(val) +} + +// ProcessOwner returns an attribute KeyValue conforming to the "process.owner" +// semantic conventions. It represents the username of the user that owns the +// process. +func ProcessOwner(val string) attribute.KeyValue { + return ProcessOwnerKey.String(val) +} + +// ProcessParentPID returns an attribute KeyValue conforming to the +// "process.parent_pid" semantic conventions. It represents the parent Process +// identifier (PPID). +func ProcessParentPID(val int) attribute.KeyValue { + return ProcessParentPIDKey.Int(val) +} + +// ProcessPID returns an attribute KeyValue conforming to the "process.pid" +// semantic conventions. It represents the process identifier (PID). +func ProcessPID(val int) attribute.KeyValue { + return ProcessPIDKey.Int(val) +} + +// ProcessRealUserID returns an attribute KeyValue conforming to the +// "process.real_user.id" semantic conventions. It represents the real user ID +// (RUID) of the process. +func ProcessRealUserID(val int) attribute.KeyValue { + return ProcessRealUserIDKey.Int(val) +} + +// ProcessRealUserName returns an attribute KeyValue conforming to the +// "process.real_user.name" semantic conventions. It represents the username of +// the real user of the process. +func ProcessRealUserName(val string) attribute.KeyValue { + return ProcessRealUserNameKey.String(val) +} + +// ProcessRuntimeDescription returns an attribute KeyValue conforming to the +// "process.runtime.description" semantic conventions. It represents an +// additional description about the runtime of the process, for example a +// specific vendor customization of the runtime environment. +func ProcessRuntimeDescription(val string) attribute.KeyValue { + return ProcessRuntimeDescriptionKey.String(val) +} + +// ProcessRuntimeName returns an attribute KeyValue conforming to the +// "process.runtime.name" semantic conventions. It represents the name of the +// runtime of this process. +func ProcessRuntimeName(val string) attribute.KeyValue { + return ProcessRuntimeNameKey.String(val) +} + +// ProcessRuntimeVersion returns an attribute KeyValue conforming to the +// "process.runtime.version" semantic conventions. It represents the version of +// the runtime of this process, as returned by the runtime without modification. +func ProcessRuntimeVersion(val string) attribute.KeyValue { + return ProcessRuntimeVersionKey.String(val) +} + +// ProcessSavedUserID returns an attribute KeyValue conforming to the +// "process.saved_user.id" semantic conventions. It represents the saved user ID +// (SUID) of the process. +func ProcessSavedUserID(val int) attribute.KeyValue { + return ProcessSavedUserIDKey.Int(val) +} + +// ProcessSavedUserName returns an attribute KeyValue conforming to the +// "process.saved_user.name" semantic conventions. It represents the username of +// the saved user. +func ProcessSavedUserName(val string) attribute.KeyValue { + return ProcessSavedUserNameKey.String(val) +} + +// ProcessSessionLeaderPID returns an attribute KeyValue conforming to the +// "process.session_leader.pid" semantic conventions. It represents the PID of +// the process's session leader. This is also the session ID (SID) of the +// process. +func ProcessSessionLeaderPID(val int) attribute.KeyValue { + return ProcessSessionLeaderPIDKey.Int(val) +} + +// ProcessTitle returns an attribute KeyValue conforming to the "process.title" +// semantic conventions. It represents the process title (proctitle). +func ProcessTitle(val string) attribute.KeyValue { + return ProcessTitleKey.String(val) +} + +// ProcessUserID returns an attribute KeyValue conforming to the +// "process.user.id" semantic conventions. It represents the effective user ID +// (EUID) of the process. +func ProcessUserID(val int) attribute.KeyValue { + return ProcessUserIDKey.Int(val) +} + +// ProcessUserName returns an attribute KeyValue conforming to the +// "process.user.name" semantic conventions. It represents the username of the +// effective user of the process. +func ProcessUserName(val string) attribute.KeyValue { + return ProcessUserNameKey.String(val) +} + +// ProcessVpid returns an attribute KeyValue conforming to the "process.vpid" +// semantic conventions. It represents the virtual process identifier. +func ProcessVpid(val int) attribute.KeyValue { + return ProcessVpidKey.Int(val) +} + +// ProcessWorkingDirectory returns an attribute KeyValue conforming to the +// "process.working_directory" semantic conventions. It represents the working +// directory of the process. +func ProcessWorkingDirectory(val string) attribute.KeyValue { + return ProcessWorkingDirectoryKey.String(val) +} + +// Enum values for process.context_switch_type +var ( + // voluntary + // Stability: development + ProcessContextSwitchTypeVoluntary = ProcessContextSwitchTypeKey.String("voluntary") + // involuntary + // Stability: development + ProcessContextSwitchTypeInvoluntary = ProcessContextSwitchTypeKey.String("involuntary") +) + +// Enum values for process.paging.fault_type +var ( + // major + // Stability: development + ProcessPagingFaultTypeMajor = ProcessPagingFaultTypeKey.String("major") + // minor + // Stability: development + ProcessPagingFaultTypeMinor = ProcessPagingFaultTypeKey.String("minor") +) + +// Namespace: profile +const ( + // ProfileFrameTypeKey is the attribute Key conforming to the + // "profile.frame.type" semantic conventions. It represents the describes the + // interpreter or compiler of a single frame. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "cpython" + ProfileFrameTypeKey = attribute.Key("profile.frame.type") +) + +// Enum values for profile.frame.type +var ( + // [.NET] + // + // Stability: development + // + // [.NET]: https://wikipedia.org/wiki/.NET + ProfileFrameTypeDotnet = ProfileFrameTypeKey.String("dotnet") + // [JVM] + // + // Stability: development + // + // [JVM]: https://wikipedia.org/wiki/Java_virtual_machine + ProfileFrameTypeJVM = ProfileFrameTypeKey.String("jvm") + // [Kernel] + // + // Stability: development + // + // [Kernel]: https://wikipedia.org/wiki/Kernel_(operating_system) + ProfileFrameTypeKernel = ProfileFrameTypeKey.String("kernel") + // [C], [C++], [Go], [Rust] + // + // Stability: development + // + // [C]: https://wikipedia.org/wiki/C_(programming_language) + // [C++]: https://wikipedia.org/wiki/C%2B%2B + // [Go]: https://wikipedia.org/wiki/Go_(programming_language) + // [Rust]: https://wikipedia.org/wiki/Rust_(programming_language) + ProfileFrameTypeNative = ProfileFrameTypeKey.String("native") + // [Perl] + // + // Stability: development + // + // [Perl]: https://wikipedia.org/wiki/Perl + ProfileFrameTypePerl = ProfileFrameTypeKey.String("perl") + // [PHP] + // + // Stability: development + // + // [PHP]: https://wikipedia.org/wiki/PHP + ProfileFrameTypePHP = ProfileFrameTypeKey.String("php") + // [Python] + // + // Stability: development + // + // [Python]: https://wikipedia.org/wiki/Python_(programming_language) + ProfileFrameTypeCpython = ProfileFrameTypeKey.String("cpython") + // [Ruby] + // + // Stability: development + // + // [Ruby]: https://wikipedia.org/wiki/Ruby_(programming_language) + ProfileFrameTypeRuby = ProfileFrameTypeKey.String("ruby") + // [V8JS] + // + // Stability: development + // + // [V8JS]: https://wikipedia.org/wiki/V8_(JavaScript_engine) + ProfileFrameTypeV8JS = ProfileFrameTypeKey.String("v8js") + // [Erlang] + // + // Stability: development + // + // [Erlang]: https://en.wikipedia.org/wiki/BEAM_(Erlang_virtual_machine) + ProfileFrameTypeBeam = ProfileFrameTypeKey.String("beam") +) + +// Namespace: rpc +const ( + // RPCConnectRPCErrorCodeKey is the attribute Key conforming to the + // "rpc.connect_rpc.error_code" semantic conventions. It represents the + // [error codes] of the Connect request. Error codes are always string values. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // + // [error codes]: https://connect.build/docs/protocol/#error-codes + RPCConnectRPCErrorCodeKey = attribute.Key("rpc.connect_rpc.error_code") + + // RPCGRPCStatusCodeKey is the attribute Key conforming to the + // "rpc.grpc.status_code" semantic conventions. It represents the + // [numeric status code] of the gRPC request. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // + // [numeric status code]: https://github.com/grpc/grpc/blob/v1.33.2/doc/statuscodes.md + RPCGRPCStatusCodeKey = attribute.Key("rpc.grpc.status_code") + + // RPCJsonrpcErrorCodeKey is the attribute Key conforming to the + // "rpc.jsonrpc.error_code" semantic conventions. It represents the `error.code` + // property of response if it is an error response. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: -32700, 100 + RPCJsonrpcErrorCodeKey = attribute.Key("rpc.jsonrpc.error_code") + + // RPCJsonrpcErrorMessageKey is the attribute Key conforming to the + // "rpc.jsonrpc.error_message" semantic conventions. It represents the + // `error.message` property of response if it is an error response. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Parse error", "User already exists" + RPCJsonrpcErrorMessageKey = attribute.Key("rpc.jsonrpc.error_message") + + // RPCJsonrpcRequestIDKey is the attribute Key conforming to the + // "rpc.jsonrpc.request_id" semantic conventions. It represents the `id` + // property of request or response. Since protocol allows id to be int, string, + // `null` or missing (for notifications), value is expected to be cast to string + // for simplicity. Use empty string in case of `null` value. Omit entirely if + // this is a notification. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "10", "request-7", "" + RPCJsonrpcRequestIDKey = attribute.Key("rpc.jsonrpc.request_id") + + // RPCJsonrpcVersionKey is the attribute Key conforming to the + // "rpc.jsonrpc.version" semantic conventions. It represents the protocol + // version as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 + // doesn't specify this, the value can be omitted. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2.0", "1.0" + RPCJsonrpcVersionKey = attribute.Key("rpc.jsonrpc.version") + + // RPCMessageCompressedSizeKey is the attribute Key conforming to the + // "rpc.message.compressed_size" semantic conventions. It represents the + // compressed size of the message in bytes. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + RPCMessageCompressedSizeKey = attribute.Key("rpc.message.compressed_size") + + // RPCMessageIDKey is the attribute Key conforming to the "rpc.message.id" + // semantic conventions. It represents the mUST be calculated as two different + // counters starting from `1` one for sent messages and one for received + // message. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: This way we guarantee that the values will be consistent between + // different implementations. + RPCMessageIDKey = attribute.Key("rpc.message.id") + + // RPCMessageTypeKey is the attribute Key conforming to the "rpc.message.type" + // semantic conventions. It represents the whether this is a received or sent + // message. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + RPCMessageTypeKey = attribute.Key("rpc.message.type") + + // RPCMessageUncompressedSizeKey is the attribute Key conforming to the + // "rpc.message.uncompressed_size" semantic conventions. It represents the + // uncompressed size of the message in bytes. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + RPCMessageUncompressedSizeKey = attribute.Key("rpc.message.uncompressed_size") + + // RPCMethodKey is the attribute Key conforming to the "rpc.method" semantic + // conventions. It represents the name of the (logical) method being called, + // must be equal to the $method part in the span name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: exampleMethod + // Note: This is the logical name of the method from the RPC interface + // perspective, which can be different from the name of any implementing + // method/function. The `code.function.name` attribute may be used to store the + // latter (e.g., method actually executing the call on the server side, RPC + // client stub method on the client side). + RPCMethodKey = attribute.Key("rpc.method") + + // RPCServiceKey is the attribute Key conforming to the "rpc.service" semantic + // conventions. It represents the full (logical) name of the service being + // called, including its package name, if applicable. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: myservice.EchoService + // Note: This is the logical name of the service from the RPC interface + // perspective, which can be different from the name of any implementing class. + // The `code.namespace` attribute may be used to store the latter (despite the + // attribute name, it may include a class name; e.g., class with method actually + // executing the call on the server side, RPC client stub class on the client + // side). + RPCServiceKey = attribute.Key("rpc.service") + + // RPCSystemKey is the attribute Key conforming to the "rpc.system" semantic + // conventions. It represents a string identifying the remoting system. See + // below for a list of well-known identifiers. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + RPCSystemKey = attribute.Key("rpc.system") +) + +// RPCJsonrpcErrorCode returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.error_code" semantic conventions. It represents the `error.code` +// property of response if it is an error response. +func RPCJsonrpcErrorCode(val int) attribute.KeyValue { + return RPCJsonrpcErrorCodeKey.Int(val) +} + +// RPCJsonrpcErrorMessage returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.error_message" semantic conventions. It represents the +// `error.message` property of response if it is an error response. +func RPCJsonrpcErrorMessage(val string) attribute.KeyValue { + return RPCJsonrpcErrorMessageKey.String(val) +} + +// RPCJsonrpcRequestID returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.request_id" semantic conventions. It represents the `id` property +// of request or response. Since protocol allows id to be int, string, `null` or +// missing (for notifications), value is expected to be cast to string for +// simplicity. Use empty string in case of `null` value. Omit entirely if this is +// a notification. +func RPCJsonrpcRequestID(val string) attribute.KeyValue { + return RPCJsonrpcRequestIDKey.String(val) +} + +// RPCJsonrpcVersion returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.version" semantic conventions. It represents the protocol version +// as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 doesn't +// specify this, the value can be omitted. +func RPCJsonrpcVersion(val string) attribute.KeyValue { + return RPCJsonrpcVersionKey.String(val) +} + +// RPCMessageCompressedSize returns an attribute KeyValue conforming to the +// "rpc.message.compressed_size" semantic conventions. It represents the +// compressed size of the message in bytes. +func RPCMessageCompressedSize(val int) attribute.KeyValue { + return RPCMessageCompressedSizeKey.Int(val) +} + +// RPCMessageID returns an attribute KeyValue conforming to the "rpc.message.id" +// semantic conventions. It represents the mUST be calculated as two different +// counters starting from `1` one for sent messages and one for received message. +func RPCMessageID(val int) attribute.KeyValue { + return RPCMessageIDKey.Int(val) +} + +// RPCMessageUncompressedSize returns an attribute KeyValue conforming to the +// "rpc.message.uncompressed_size" semantic conventions. It represents the +// uncompressed size of the message in bytes. +func RPCMessageUncompressedSize(val int) attribute.KeyValue { + return RPCMessageUncompressedSizeKey.Int(val) +} + +// RPCMethod returns an attribute KeyValue conforming to the "rpc.method" +// semantic conventions. It represents the name of the (logical) method being +// called, must be equal to the $method part in the span name. +func RPCMethod(val string) attribute.KeyValue { + return RPCMethodKey.String(val) +} + +// RPCService returns an attribute KeyValue conforming to the "rpc.service" +// semantic conventions. It represents the full (logical) name of the service +// being called, including its package name, if applicable. +func RPCService(val string) attribute.KeyValue { + return RPCServiceKey.String(val) +} + +// Enum values for rpc.connect_rpc.error_code +var ( + // cancelled + // Stability: development + RPCConnectRPCErrorCodeCancelled = RPCConnectRPCErrorCodeKey.String("cancelled") + // unknown + // Stability: development + RPCConnectRPCErrorCodeUnknown = RPCConnectRPCErrorCodeKey.String("unknown") + // invalid_argument + // Stability: development + RPCConnectRPCErrorCodeInvalidArgument = RPCConnectRPCErrorCodeKey.String("invalid_argument") + // deadline_exceeded + // Stability: development + RPCConnectRPCErrorCodeDeadlineExceeded = RPCConnectRPCErrorCodeKey.String("deadline_exceeded") + // not_found + // Stability: development + RPCConnectRPCErrorCodeNotFound = RPCConnectRPCErrorCodeKey.String("not_found") + // already_exists + // Stability: development + RPCConnectRPCErrorCodeAlreadyExists = RPCConnectRPCErrorCodeKey.String("already_exists") + // permission_denied + // Stability: development + RPCConnectRPCErrorCodePermissionDenied = RPCConnectRPCErrorCodeKey.String("permission_denied") + // resource_exhausted + // Stability: development + RPCConnectRPCErrorCodeResourceExhausted = RPCConnectRPCErrorCodeKey.String("resource_exhausted") + // failed_precondition + // Stability: development + RPCConnectRPCErrorCodeFailedPrecondition = RPCConnectRPCErrorCodeKey.String("failed_precondition") + // aborted + // Stability: development + RPCConnectRPCErrorCodeAborted = RPCConnectRPCErrorCodeKey.String("aborted") + // out_of_range + // Stability: development + RPCConnectRPCErrorCodeOutOfRange = RPCConnectRPCErrorCodeKey.String("out_of_range") + // unimplemented + // Stability: development + RPCConnectRPCErrorCodeUnimplemented = RPCConnectRPCErrorCodeKey.String("unimplemented") + // internal + // Stability: development + RPCConnectRPCErrorCodeInternal = RPCConnectRPCErrorCodeKey.String("internal") + // unavailable + // Stability: development + RPCConnectRPCErrorCodeUnavailable = RPCConnectRPCErrorCodeKey.String("unavailable") + // data_loss + // Stability: development + RPCConnectRPCErrorCodeDataLoss = RPCConnectRPCErrorCodeKey.String("data_loss") + // unauthenticated + // Stability: development + RPCConnectRPCErrorCodeUnauthenticated = RPCConnectRPCErrorCodeKey.String("unauthenticated") +) + +// Enum values for rpc.grpc.status_code +var ( + // OK + // Stability: development + RPCGRPCStatusCodeOk = RPCGRPCStatusCodeKey.Int(0) + // CANCELLED + // Stability: development + RPCGRPCStatusCodeCancelled = RPCGRPCStatusCodeKey.Int(1) + // UNKNOWN + // Stability: development + RPCGRPCStatusCodeUnknown = RPCGRPCStatusCodeKey.Int(2) + // INVALID_ARGUMENT + // Stability: development + RPCGRPCStatusCodeInvalidArgument = RPCGRPCStatusCodeKey.Int(3) + // DEADLINE_EXCEEDED + // Stability: development + RPCGRPCStatusCodeDeadlineExceeded = RPCGRPCStatusCodeKey.Int(4) + // NOT_FOUND + // Stability: development + RPCGRPCStatusCodeNotFound = RPCGRPCStatusCodeKey.Int(5) + // ALREADY_EXISTS + // Stability: development + RPCGRPCStatusCodeAlreadyExists = RPCGRPCStatusCodeKey.Int(6) + // PERMISSION_DENIED + // Stability: development + RPCGRPCStatusCodePermissionDenied = RPCGRPCStatusCodeKey.Int(7) + // RESOURCE_EXHAUSTED + // Stability: development + RPCGRPCStatusCodeResourceExhausted = RPCGRPCStatusCodeKey.Int(8) + // FAILED_PRECONDITION + // Stability: development + RPCGRPCStatusCodeFailedPrecondition = RPCGRPCStatusCodeKey.Int(9) + // ABORTED + // Stability: development + RPCGRPCStatusCodeAborted = RPCGRPCStatusCodeKey.Int(10) + // OUT_OF_RANGE + // Stability: development + RPCGRPCStatusCodeOutOfRange = RPCGRPCStatusCodeKey.Int(11) + // UNIMPLEMENTED + // Stability: development + RPCGRPCStatusCodeUnimplemented = RPCGRPCStatusCodeKey.Int(12) + // INTERNAL + // Stability: development + RPCGRPCStatusCodeInternal = RPCGRPCStatusCodeKey.Int(13) + // UNAVAILABLE + // Stability: development + RPCGRPCStatusCodeUnavailable = RPCGRPCStatusCodeKey.Int(14) + // DATA_LOSS + // Stability: development + RPCGRPCStatusCodeDataLoss = RPCGRPCStatusCodeKey.Int(15) + // UNAUTHENTICATED + // Stability: development + RPCGRPCStatusCodeUnauthenticated = RPCGRPCStatusCodeKey.Int(16) +) + +// Enum values for rpc.message.type +var ( + // sent + // Stability: development + RPCMessageTypeSent = RPCMessageTypeKey.String("SENT") + // received + // Stability: development + RPCMessageTypeReceived = RPCMessageTypeKey.String("RECEIVED") +) + +// Enum values for rpc.system +var ( + // gRPC + // Stability: development + RPCSystemGRPC = RPCSystemKey.String("grpc") + // Java RMI + // Stability: development + RPCSystemJavaRmi = RPCSystemKey.String("java_rmi") + // .NET WCF + // Stability: development + RPCSystemDotnetWcf = RPCSystemKey.String("dotnet_wcf") + // Apache Dubbo + // Stability: development + RPCSystemApacheDubbo = RPCSystemKey.String("apache_dubbo") + // Connect RPC + // Stability: development + RPCSystemConnectRPC = RPCSystemKey.String("connect_rpc") +) + +// Namespace: security_rule +const ( + // SecurityRuleCategoryKey is the attribute Key conforming to the + // "security_rule.category" semantic conventions. It represents a categorization + // value keyword used by the entity using the rule for detection of this event. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Attempted Information Leak" + SecurityRuleCategoryKey = attribute.Key("security_rule.category") + + // SecurityRuleDescriptionKey is the attribute Key conforming to the + // "security_rule.description" semantic conventions. It represents the + // description of the rule generating the event. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Block requests to public DNS over HTTPS / TLS protocols" + SecurityRuleDescriptionKey = attribute.Key("security_rule.description") + + // SecurityRuleLicenseKey is the attribute Key conforming to the + // "security_rule.license" semantic conventions. It represents the name of the + // license under which the rule used to generate this event is made available. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Apache 2.0" + SecurityRuleLicenseKey = attribute.Key("security_rule.license") + + // SecurityRuleNameKey is the attribute Key conforming to the + // "security_rule.name" semantic conventions. It represents the name of the rule + // or signature generating the event. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "BLOCK_DNS_over_TLS" + SecurityRuleNameKey = attribute.Key("security_rule.name") + + // SecurityRuleReferenceKey is the attribute Key conforming to the + // "security_rule.reference" semantic conventions. It represents the reference + // URL to additional information about the rule used to generate this event. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "https://en.wikipedia.org/wiki/DNS_over_TLS" + // Note: The URL can point to the vendor’s documentation about the rule. If + // that’s not available, it can also be a link to a more general page + // describing this type of alert. + SecurityRuleReferenceKey = attribute.Key("security_rule.reference") + + // SecurityRuleRulesetNameKey is the attribute Key conforming to the + // "security_rule.ruleset.name" semantic conventions. It represents the name of + // the ruleset, policy, group, or parent category in which the rule used to + // generate this event is a member. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Standard_Protocol_Filters" + SecurityRuleRulesetNameKey = attribute.Key("security_rule.ruleset.name") + + // SecurityRuleUUIDKey is the attribute Key conforming to the + // "security_rule.uuid" semantic conventions. It represents a rule ID that is + // unique within the scope of a set or group of agents, observers, or other + // entities using the rule for detection of this event. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "550e8400-e29b-41d4-a716-446655440000", "1100110011" + SecurityRuleUUIDKey = attribute.Key("security_rule.uuid") + + // SecurityRuleVersionKey is the attribute Key conforming to the + // "security_rule.version" semantic conventions. It represents the version / + // revision of the rule being used for analysis. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1.0.0" + SecurityRuleVersionKey = attribute.Key("security_rule.version") +) + +// SecurityRuleCategory returns an attribute KeyValue conforming to the +// "security_rule.category" semantic conventions. It represents a categorization +// value keyword used by the entity using the rule for detection of this event. +func SecurityRuleCategory(val string) attribute.KeyValue { + return SecurityRuleCategoryKey.String(val) +} + +// SecurityRuleDescription returns an attribute KeyValue conforming to the +// "security_rule.description" semantic conventions. It represents the +// description of the rule generating the event. +func SecurityRuleDescription(val string) attribute.KeyValue { + return SecurityRuleDescriptionKey.String(val) +} + +// SecurityRuleLicense returns an attribute KeyValue conforming to the +// "security_rule.license" semantic conventions. It represents the name of the +// license under which the rule used to generate this event is made available. +func SecurityRuleLicense(val string) attribute.KeyValue { + return SecurityRuleLicenseKey.String(val) +} + +// SecurityRuleName returns an attribute KeyValue conforming to the +// "security_rule.name" semantic conventions. It represents the name of the rule +// or signature generating the event. +func SecurityRuleName(val string) attribute.KeyValue { + return SecurityRuleNameKey.String(val) +} + +// SecurityRuleReference returns an attribute KeyValue conforming to the +// "security_rule.reference" semantic conventions. It represents the reference +// URL to additional information about the rule used to generate this event. +func SecurityRuleReference(val string) attribute.KeyValue { + return SecurityRuleReferenceKey.String(val) +} + +// SecurityRuleRulesetName returns an attribute KeyValue conforming to the +// "security_rule.ruleset.name" semantic conventions. It represents the name of +// the ruleset, policy, group, or parent category in which the rule used to +// generate this event is a member. +func SecurityRuleRulesetName(val string) attribute.KeyValue { + return SecurityRuleRulesetNameKey.String(val) +} + +// SecurityRuleUUID returns an attribute KeyValue conforming to the +// "security_rule.uuid" semantic conventions. It represents a rule ID that is +// unique within the scope of a set or group of agents, observers, or other +// entities using the rule for detection of this event. +func SecurityRuleUUID(val string) attribute.KeyValue { + return SecurityRuleUUIDKey.String(val) +} + +// SecurityRuleVersion returns an attribute KeyValue conforming to the +// "security_rule.version" semantic conventions. It represents the version / +// revision of the rule being used for analysis. +func SecurityRuleVersion(val string) attribute.KeyValue { + return SecurityRuleVersionKey.String(val) +} + +// Namespace: server +const ( + // ServerAddressKey is the attribute Key conforming to the "server.address" + // semantic conventions. It represents the server domain name if available + // without reverse DNS lookup; otherwise, IP address or Unix domain socket name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "example.com", "10.1.2.80", "/tmp/my.sock" + // Note: When observed from the client side, and when communicating through an + // intermediary, `server.address` SHOULD represent the server address behind any + // intermediaries, for example proxies, if it's available. + ServerAddressKey = attribute.Key("server.address") + + // ServerPortKey is the attribute Key conforming to the "server.port" semantic + // conventions. It represents the server port number. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: 80, 8080, 443 + // Note: When observed from the client side, and when communicating through an + // intermediary, `server.port` SHOULD represent the server port behind any + // intermediaries, for example proxies, if it's available. + ServerPortKey = attribute.Key("server.port") +) + +// ServerAddress returns an attribute KeyValue conforming to the "server.address" +// semantic conventions. It represents the server domain name if available +// without reverse DNS lookup; otherwise, IP address or Unix domain socket name. +func ServerAddress(val string) attribute.KeyValue { + return ServerAddressKey.String(val) +} + +// ServerPort returns an attribute KeyValue conforming to the "server.port" +// semantic conventions. It represents the server port number. +func ServerPort(val int) attribute.KeyValue { + return ServerPortKey.Int(val) +} + +// Namespace: service +const ( + // ServiceInstanceIDKey is the attribute Key conforming to the + // "service.instance.id" semantic conventions. It represents the string ID of + // the service instance. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "627cc493-f310-47de-96bd-71410b7dec09" + // Note: MUST be unique for each instance of the same + // `service.namespace,service.name` pair (in other words + // `service.namespace,service.name,service.instance.id` triplet MUST be globally + // unique). The ID helps to + // distinguish instances of the same service that exist at the same time (e.g. + // instances of a horizontally scaled + // service). + // + // Implementations, such as SDKs, are recommended to generate a random Version 1 + // or Version 4 [RFC + // 4122] UUID, but are free to use an inherent unique ID as + // the source of + // this value if stability is desirable. In that case, the ID SHOULD be used as + // source of a UUID Version 5 and + // SHOULD use the following UUID as the namespace: + // `4d63009a-8d0f-11ee-aad7-4c796ed8e320`. + // + // UUIDs are typically recommended, as only an opaque value for the purposes of + // identifying a service instance is + // needed. Similar to what can be seen in the man page for the + // [`/etc/machine-id`] file, the underlying + // data, such as pod name and namespace should be treated as confidential, being + // the user's choice to expose it + // or not via another resource attribute. + // + // For applications running behind an application server (like unicorn), we do + // not recommend using one identifier + // for all processes participating in the application. Instead, it's recommended + // each division (e.g. a worker + // thread in unicorn) to have its own instance.id. + // + // It's not recommended for a Collector to set `service.instance.id` if it can't + // unambiguously determine the + // service instance that is generating that telemetry. For instance, creating an + // UUID based on `pod.name` will + // likely be wrong, as the Collector might not know from which container within + // that pod the telemetry originated. + // However, Collectors can set the `service.instance.id` if they can + // unambiguously determine the service instance + // for that telemetry. This is typically the case for scraping receivers, as + // they know the target address and + // port. + // + // [RFC + // 4122]: https://www.ietf.org/rfc/rfc4122.txt + // [`/etc/machine-id`]: https://www.freedesktop.org/software/systemd/man/latest/machine-id.html + ServiceInstanceIDKey = attribute.Key("service.instance.id") + + // ServiceNameKey is the attribute Key conforming to the "service.name" semantic + // conventions. It represents the logical name of the service. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "shoppingcart" + // Note: MUST be the same for all instances of horizontally scaled services. If + // the value was not specified, SDKs MUST fallback to `unknown_service:` + // concatenated with [`process.executable.name`], e.g. `unknown_service:bash`. + // If `process.executable.name` is not available, the value MUST be set to + // `unknown_service`. + // + // [`process.executable.name`]: process.md + ServiceNameKey = attribute.Key("service.name") + + // ServiceNamespaceKey is the attribute Key conforming to the + // "service.namespace" semantic conventions. It represents a namespace for + // `service.name`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Shop" + // Note: A string value having a meaning that helps to distinguish a group of + // services, for example the team name that owns a group of services. + // `service.name` is expected to be unique within the same namespace. If + // `service.namespace` is not specified in the Resource then `service.name` is + // expected to be unique for all services that have no explicit namespace + // defined (so the empty/unspecified namespace is simply one more valid + // namespace). Zero-length namespace string is assumed equal to unspecified + // namespace. + ServiceNamespaceKey = attribute.Key("service.namespace") + + // ServiceVersionKey is the attribute Key conforming to the "service.version" + // semantic conventions. It represents the version string of the service API or + // implementation. The format is not defined by these conventions. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "2.0.0", "a01dbef8a" + ServiceVersionKey = attribute.Key("service.version") +) + +// ServiceInstanceID returns an attribute KeyValue conforming to the +// "service.instance.id" semantic conventions. It represents the string ID of the +// service instance. +func ServiceInstanceID(val string) attribute.KeyValue { + return ServiceInstanceIDKey.String(val) +} + +// ServiceName returns an attribute KeyValue conforming to the "service.name" +// semantic conventions. It represents the logical name of the service. +func ServiceName(val string) attribute.KeyValue { + return ServiceNameKey.String(val) +} + +// ServiceNamespace returns an attribute KeyValue conforming to the +// "service.namespace" semantic conventions. It represents a namespace for +// `service.name`. +func ServiceNamespace(val string) attribute.KeyValue { + return ServiceNamespaceKey.String(val) +} + +// ServiceVersion returns an attribute KeyValue conforming to the +// "service.version" semantic conventions. It represents the version string of +// the service API or implementation. The format is not defined by these +// conventions. +func ServiceVersion(val string) attribute.KeyValue { + return ServiceVersionKey.String(val) +} + +// Namespace: session +const ( + // SessionIDKey is the attribute Key conforming to the "session.id" semantic + // conventions. It represents a unique id to identify a session. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 00112233-4455-6677-8899-aabbccddeeff + SessionIDKey = attribute.Key("session.id") + + // SessionPreviousIDKey is the attribute Key conforming to the + // "session.previous_id" semantic conventions. It represents the previous + // `session.id` for this user, when known. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 00112233-4455-6677-8899-aabbccddeeff + SessionPreviousIDKey = attribute.Key("session.previous_id") +) + +// SessionID returns an attribute KeyValue conforming to the "session.id" +// semantic conventions. It represents a unique id to identify a session. +func SessionID(val string) attribute.KeyValue { + return SessionIDKey.String(val) +} + +// SessionPreviousID returns an attribute KeyValue conforming to the +// "session.previous_id" semantic conventions. It represents the previous +// `session.id` for this user, when known. +func SessionPreviousID(val string) attribute.KeyValue { + return SessionPreviousIDKey.String(val) +} + +// Namespace: signalr +const ( + // SignalrConnectionStatusKey is the attribute Key conforming to the + // "signalr.connection.status" semantic conventions. It represents the signalR + // HTTP connection closure status. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "app_shutdown", "timeout" + SignalrConnectionStatusKey = attribute.Key("signalr.connection.status") + + // SignalrTransportKey is the attribute Key conforming to the + // "signalr.transport" semantic conventions. It represents the + // [SignalR transport type]. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "web_sockets", "long_polling" + // + // [SignalR transport type]: https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/TransportProtocols.md + SignalrTransportKey = attribute.Key("signalr.transport") +) + +// Enum values for signalr.connection.status +var ( + // The connection was closed normally. + // Stability: stable + SignalrConnectionStatusNormalClosure = SignalrConnectionStatusKey.String("normal_closure") + // The connection was closed due to a timeout. + // Stability: stable + SignalrConnectionStatusTimeout = SignalrConnectionStatusKey.String("timeout") + // The connection was closed because the app is shutting down. + // Stability: stable + SignalrConnectionStatusAppShutdown = SignalrConnectionStatusKey.String("app_shutdown") +) + +// Enum values for signalr.transport +var ( + // ServerSentEvents protocol + // Stability: stable + SignalrTransportServerSentEvents = SignalrTransportKey.String("server_sent_events") + // LongPolling protocol + // Stability: stable + SignalrTransportLongPolling = SignalrTransportKey.String("long_polling") + // WebSockets protocol + // Stability: stable + SignalrTransportWebSockets = SignalrTransportKey.String("web_sockets") +) + +// Namespace: source +const ( + // SourceAddressKey is the attribute Key conforming to the "source.address" + // semantic conventions. It represents the source address - domain name if + // available without reverse DNS lookup; otherwise, IP address or Unix domain + // socket name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "source.example.com", "10.1.2.80", "/tmp/my.sock" + // Note: When observed from the destination side, and when communicating through + // an intermediary, `source.address` SHOULD represent the source address behind + // any intermediaries, for example proxies, if it's available. + SourceAddressKey = attribute.Key("source.address") + + // SourcePortKey is the attribute Key conforming to the "source.port" semantic + // conventions. It represents the source port number. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 3389, 2888 + SourcePortKey = attribute.Key("source.port") +) + +// SourceAddress returns an attribute KeyValue conforming to the "source.address" +// semantic conventions. It represents the source address - domain name if +// available without reverse DNS lookup; otherwise, IP address or Unix domain +// socket name. +func SourceAddress(val string) attribute.KeyValue { + return SourceAddressKey.String(val) +} + +// SourcePort returns an attribute KeyValue conforming to the "source.port" +// semantic conventions. It represents the source port number. +func SourcePort(val int) attribute.KeyValue { + return SourcePortKey.Int(val) +} + +// Namespace: system +const ( + // SystemCPULogicalNumberKey is the attribute Key conforming to the + // "system.cpu.logical_number" semantic conventions. It represents the logical + // CPU number [0..n-1]. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 1 + SystemCPULogicalNumberKey = attribute.Key("system.cpu.logical_number") + + // SystemDeviceKey is the attribute Key conforming to the "system.device" + // semantic conventions. It represents the device identifier. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "(identifier)" + SystemDeviceKey = attribute.Key("system.device") + + // SystemFilesystemModeKey is the attribute Key conforming to the + // "system.filesystem.mode" semantic conventions. It represents the filesystem + // mode. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "rw, ro" + SystemFilesystemModeKey = attribute.Key("system.filesystem.mode") + + // SystemFilesystemMountpointKey is the attribute Key conforming to the + // "system.filesystem.mountpoint" semantic conventions. It represents the + // filesystem mount path. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/mnt/data" + SystemFilesystemMountpointKey = attribute.Key("system.filesystem.mountpoint") + + // SystemFilesystemStateKey is the attribute Key conforming to the + // "system.filesystem.state" semantic conventions. It represents the filesystem + // state. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "used" + SystemFilesystemStateKey = attribute.Key("system.filesystem.state") + + // SystemFilesystemTypeKey is the attribute Key conforming to the + // "system.filesystem.type" semantic conventions. It represents the filesystem + // type. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "ext4" + SystemFilesystemTypeKey = attribute.Key("system.filesystem.type") + + // SystemMemoryStateKey is the attribute Key conforming to the + // "system.memory.state" semantic conventions. It represents the memory state. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "free", "cached" + SystemMemoryStateKey = attribute.Key("system.memory.state") + + // SystemPagingDirectionKey is the attribute Key conforming to the + // "system.paging.direction" semantic conventions. It represents the paging + // access direction. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "in" + SystemPagingDirectionKey = attribute.Key("system.paging.direction") + + // SystemPagingStateKey is the attribute Key conforming to the + // "system.paging.state" semantic conventions. It represents the memory paging + // state. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "free" + SystemPagingStateKey = attribute.Key("system.paging.state") + + // SystemPagingTypeKey is the attribute Key conforming to the + // "system.paging.type" semantic conventions. It represents the memory paging + // type. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "minor" + SystemPagingTypeKey = attribute.Key("system.paging.type") + + // SystemProcessStatusKey is the attribute Key conforming to the + // "system.process.status" semantic conventions. It represents the process + // state, e.g., [Linux Process State Codes]. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "running" + // + // [Linux Process State Codes]: https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES + SystemProcessStatusKey = attribute.Key("system.process.status") +) + +// SystemCPULogicalNumber returns an attribute KeyValue conforming to the +// "system.cpu.logical_number" semantic conventions. It represents the logical +// CPU number [0..n-1]. +func SystemCPULogicalNumber(val int) attribute.KeyValue { + return SystemCPULogicalNumberKey.Int(val) +} + +// SystemDevice returns an attribute KeyValue conforming to the "system.device" +// semantic conventions. It represents the device identifier. +func SystemDevice(val string) attribute.KeyValue { + return SystemDeviceKey.String(val) +} + +// SystemFilesystemMode returns an attribute KeyValue conforming to the +// "system.filesystem.mode" semantic conventions. It represents the filesystem +// mode. +func SystemFilesystemMode(val string) attribute.KeyValue { + return SystemFilesystemModeKey.String(val) +} + +// SystemFilesystemMountpoint returns an attribute KeyValue conforming to the +// "system.filesystem.mountpoint" semantic conventions. It represents the +// filesystem mount path. +func SystemFilesystemMountpoint(val string) attribute.KeyValue { + return SystemFilesystemMountpointKey.String(val) +} + +// Enum values for system.filesystem.state +var ( + // used + // Stability: development + SystemFilesystemStateUsed = SystemFilesystemStateKey.String("used") + // free + // Stability: development + SystemFilesystemStateFree = SystemFilesystemStateKey.String("free") + // reserved + // Stability: development + SystemFilesystemStateReserved = SystemFilesystemStateKey.String("reserved") +) + +// Enum values for system.filesystem.type +var ( + // fat32 + // Stability: development + SystemFilesystemTypeFat32 = SystemFilesystemTypeKey.String("fat32") + // exfat + // Stability: development + SystemFilesystemTypeExfat = SystemFilesystemTypeKey.String("exfat") + // ntfs + // Stability: development + SystemFilesystemTypeNtfs = SystemFilesystemTypeKey.String("ntfs") + // refs + // Stability: development + SystemFilesystemTypeRefs = SystemFilesystemTypeKey.String("refs") + // hfsplus + // Stability: development + SystemFilesystemTypeHfsplus = SystemFilesystemTypeKey.String("hfsplus") + // ext4 + // Stability: development + SystemFilesystemTypeExt4 = SystemFilesystemTypeKey.String("ext4") +) + +// Enum values for system.memory.state +var ( + // used + // Stability: development + SystemMemoryStateUsed = SystemMemoryStateKey.String("used") + // free + // Stability: development + SystemMemoryStateFree = SystemMemoryStateKey.String("free") + // Deprecated: Removed, report shared memory usage with + // `metric.system.memory.shared` metric. + SystemMemoryStateShared = SystemMemoryStateKey.String("shared") + // buffers + // Stability: development + SystemMemoryStateBuffers = SystemMemoryStateKey.String("buffers") + // cached + // Stability: development + SystemMemoryStateCached = SystemMemoryStateKey.String("cached") +) + +// Enum values for system.paging.direction +var ( + // in + // Stability: development + SystemPagingDirectionIn = SystemPagingDirectionKey.String("in") + // out + // Stability: development + SystemPagingDirectionOut = SystemPagingDirectionKey.String("out") +) + +// Enum values for system.paging.state +var ( + // used + // Stability: development + SystemPagingStateUsed = SystemPagingStateKey.String("used") + // free + // Stability: development + SystemPagingStateFree = SystemPagingStateKey.String("free") +) + +// Enum values for system.paging.type +var ( + // major + // Stability: development + SystemPagingTypeMajor = SystemPagingTypeKey.String("major") + // minor + // Stability: development + SystemPagingTypeMinor = SystemPagingTypeKey.String("minor") +) + +// Enum values for system.process.status +var ( + // running + // Stability: development + SystemProcessStatusRunning = SystemProcessStatusKey.String("running") + // sleeping + // Stability: development + SystemProcessStatusSleeping = SystemProcessStatusKey.String("sleeping") + // stopped + // Stability: development + SystemProcessStatusStopped = SystemProcessStatusKey.String("stopped") + // defunct + // Stability: development + SystemProcessStatusDefunct = SystemProcessStatusKey.String("defunct") +) + +// Namespace: telemetry +const ( + // TelemetryDistroNameKey is the attribute Key conforming to the + // "telemetry.distro.name" semantic conventions. It represents the name of the + // auto instrumentation agent or distribution, if used. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "parts-unlimited-java" + // Note: Official auto instrumentation agents and distributions SHOULD set the + // `telemetry.distro.name` attribute to + // a string starting with `opentelemetry-`, e.g. + // `opentelemetry-java-instrumentation`. + TelemetryDistroNameKey = attribute.Key("telemetry.distro.name") + + // TelemetryDistroVersionKey is the attribute Key conforming to the + // "telemetry.distro.version" semantic conventions. It represents the version + // string of the auto instrumentation agent or distribution, if used. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1.2.3" + TelemetryDistroVersionKey = attribute.Key("telemetry.distro.version") + + // TelemetrySDKLanguageKey is the attribute Key conforming to the + // "telemetry.sdk.language" semantic conventions. It represents the language of + // the telemetry SDK. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: + TelemetrySDKLanguageKey = attribute.Key("telemetry.sdk.language") + + // TelemetrySDKNameKey is the attribute Key conforming to the + // "telemetry.sdk.name" semantic conventions. It represents the name of the + // telemetry SDK as defined above. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "opentelemetry" + // Note: The OpenTelemetry SDK MUST set the `telemetry.sdk.name` attribute to + // `opentelemetry`. + // If another SDK, like a fork or a vendor-provided implementation, is used, + // this SDK MUST set the + // `telemetry.sdk.name` attribute to the fully-qualified class or module name of + // this SDK's main entry point + // or another suitable identifier depending on the language. + // The identifier `opentelemetry` is reserved and MUST NOT be used in this case. + // All custom identifiers SHOULD be stable across different versions of an + // implementation. + TelemetrySDKNameKey = attribute.Key("telemetry.sdk.name") + + // TelemetrySDKVersionKey is the attribute Key conforming to the + // "telemetry.sdk.version" semantic conventions. It represents the version + // string of the telemetry SDK. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "1.2.3" + TelemetrySDKVersionKey = attribute.Key("telemetry.sdk.version") +) + +// TelemetryDistroName returns an attribute KeyValue conforming to the +// "telemetry.distro.name" semantic conventions. It represents the name of the +// auto instrumentation agent or distribution, if used. +func TelemetryDistroName(val string) attribute.KeyValue { + return TelemetryDistroNameKey.String(val) +} + +// TelemetryDistroVersion returns an attribute KeyValue conforming to the +// "telemetry.distro.version" semantic conventions. It represents the version +// string of the auto instrumentation agent or distribution, if used. +func TelemetryDistroVersion(val string) attribute.KeyValue { + return TelemetryDistroVersionKey.String(val) +} + +// TelemetrySDKName returns an attribute KeyValue conforming to the +// "telemetry.sdk.name" semantic conventions. It represents the name of the +// telemetry SDK as defined above. +func TelemetrySDKName(val string) attribute.KeyValue { + return TelemetrySDKNameKey.String(val) +} + +// TelemetrySDKVersion returns an attribute KeyValue conforming to the +// "telemetry.sdk.version" semantic conventions. It represents the version string +// of the telemetry SDK. +func TelemetrySDKVersion(val string) attribute.KeyValue { + return TelemetrySDKVersionKey.String(val) +} + +// Enum values for telemetry.sdk.language +var ( + // cpp + // Stability: stable + TelemetrySDKLanguageCPP = TelemetrySDKLanguageKey.String("cpp") + // dotnet + // Stability: stable + TelemetrySDKLanguageDotnet = TelemetrySDKLanguageKey.String("dotnet") + // erlang + // Stability: stable + TelemetrySDKLanguageErlang = TelemetrySDKLanguageKey.String("erlang") + // go + // Stability: stable + TelemetrySDKLanguageGo = TelemetrySDKLanguageKey.String("go") + // java + // Stability: stable + TelemetrySDKLanguageJava = TelemetrySDKLanguageKey.String("java") + // nodejs + // Stability: stable + TelemetrySDKLanguageNodejs = TelemetrySDKLanguageKey.String("nodejs") + // php + // Stability: stable + TelemetrySDKLanguagePHP = TelemetrySDKLanguageKey.String("php") + // python + // Stability: stable + TelemetrySDKLanguagePython = TelemetrySDKLanguageKey.String("python") + // ruby + // Stability: stable + TelemetrySDKLanguageRuby = TelemetrySDKLanguageKey.String("ruby") + // rust + // Stability: stable + TelemetrySDKLanguageRust = TelemetrySDKLanguageKey.String("rust") + // swift + // Stability: stable + TelemetrySDKLanguageSwift = TelemetrySDKLanguageKey.String("swift") + // webjs + // Stability: stable + TelemetrySDKLanguageWebjs = TelemetrySDKLanguageKey.String("webjs") +) + +// Namespace: test +const ( + // TestCaseNameKey is the attribute Key conforming to the "test.case.name" + // semantic conventions. It represents the fully qualified human readable name + // of the [test case]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "org.example.TestCase1.test1", "example/tests/TestCase1.test1", + // "ExampleTestCase1_test1" + // + // [test case]: https://wikipedia.org/wiki/Test_case + TestCaseNameKey = attribute.Key("test.case.name") + + // TestCaseResultStatusKey is the attribute Key conforming to the + // "test.case.result.status" semantic conventions. It represents the status of + // the actual test case result from test execution. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "pass", "fail" + TestCaseResultStatusKey = attribute.Key("test.case.result.status") + + // TestSuiteNameKey is the attribute Key conforming to the "test.suite.name" + // semantic conventions. It represents the human readable name of a [test suite] + // . + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "TestSuite1" + // + // [test suite]: https://wikipedia.org/wiki/Test_suite + TestSuiteNameKey = attribute.Key("test.suite.name") + + // TestSuiteRunStatusKey is the attribute Key conforming to the + // "test.suite.run.status" semantic conventions. It represents the status of the + // test suite run. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "success", "failure", "skipped", "aborted", "timed_out", + // "in_progress" + TestSuiteRunStatusKey = attribute.Key("test.suite.run.status") +) + +// TestCaseName returns an attribute KeyValue conforming to the "test.case.name" +// semantic conventions. It represents the fully qualified human readable name of +// the [test case]. +// +// [test case]: https://wikipedia.org/wiki/Test_case +func TestCaseName(val string) attribute.KeyValue { + return TestCaseNameKey.String(val) +} + +// TestSuiteName returns an attribute KeyValue conforming to the +// "test.suite.name" semantic conventions. It represents the human readable name +// of a [test suite]. +// +// [test suite]: https://wikipedia.org/wiki/Test_suite +func TestSuiteName(val string) attribute.KeyValue { + return TestSuiteNameKey.String(val) +} + +// Enum values for test.case.result.status +var ( + // pass + // Stability: development + TestCaseResultStatusPass = TestCaseResultStatusKey.String("pass") + // fail + // Stability: development + TestCaseResultStatusFail = TestCaseResultStatusKey.String("fail") +) + +// Enum values for test.suite.run.status +var ( + // success + // Stability: development + TestSuiteRunStatusSuccess = TestSuiteRunStatusKey.String("success") + // failure + // Stability: development + TestSuiteRunStatusFailure = TestSuiteRunStatusKey.String("failure") + // skipped + // Stability: development + TestSuiteRunStatusSkipped = TestSuiteRunStatusKey.String("skipped") + // aborted + // Stability: development + TestSuiteRunStatusAborted = TestSuiteRunStatusKey.String("aborted") + // timed_out + // Stability: development + TestSuiteRunStatusTimedOut = TestSuiteRunStatusKey.String("timed_out") + // in_progress + // Stability: development + TestSuiteRunStatusInProgress = TestSuiteRunStatusKey.String("in_progress") +) + +// Namespace: thread +const ( + // ThreadIDKey is the attribute Key conforming to the "thread.id" semantic + // conventions. It represents the current "managed" thread ID (as opposed to OS + // thread ID). + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + ThreadIDKey = attribute.Key("thread.id") + + // ThreadNameKey is the attribute Key conforming to the "thread.name" semantic + // conventions. It represents the current thread name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: main + ThreadNameKey = attribute.Key("thread.name") +) + +// ThreadID returns an attribute KeyValue conforming to the "thread.id" semantic +// conventions. It represents the current "managed" thread ID (as opposed to OS +// thread ID). +func ThreadID(val int) attribute.KeyValue { + return ThreadIDKey.Int(val) +} + +// ThreadName returns an attribute KeyValue conforming to the "thread.name" +// semantic conventions. It represents the current thread name. +func ThreadName(val string) attribute.KeyValue { + return ThreadNameKey.String(val) +} + +// Namespace: tls +const ( + // TLSCipherKey is the attribute Key conforming to the "tls.cipher" semantic + // conventions. It represents the string indicating the [cipher] used during the + // current connection. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "TLS_RSA_WITH_3DES_EDE_CBC_SHA", + // "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256" + // Note: The values allowed for `tls.cipher` MUST be one of the `Descriptions` + // of the [registered TLS Cipher Suits]. + // + // [cipher]: https://datatracker.ietf.org/doc/html/rfc5246#appendix-A.5 + // [registered TLS Cipher Suits]: https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#table-tls-parameters-4 + TLSCipherKey = attribute.Key("tls.cipher") + + // TLSClientCertificateKey is the attribute Key conforming to the + // "tls.client.certificate" semantic conventions. It represents the pEM-encoded + // stand-alone certificate offered by the client. This is usually + // mutually-exclusive of `client.certificate_chain` since this value also exists + // in that list. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "MII..." + TLSClientCertificateKey = attribute.Key("tls.client.certificate") + + // TLSClientCertificateChainKey is the attribute Key conforming to the + // "tls.client.certificate_chain" semantic conventions. It represents the array + // of PEM-encoded certificates that make up the certificate chain offered by the + // client. This is usually mutually-exclusive of `client.certificate` since that + // value should be the first certificate in the chain. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "MII...", "MI..." + TLSClientCertificateChainKey = attribute.Key("tls.client.certificate_chain") + + // TLSClientHashMd5Key is the attribute Key conforming to the + // "tls.client.hash.md5" semantic conventions. It represents the certificate + // fingerprint using the MD5 digest of DER-encoded version of certificate + // offered by the client. For consistency with other hash values, this value + // should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC" + TLSClientHashMd5Key = attribute.Key("tls.client.hash.md5") + + // TLSClientHashSha1Key is the attribute Key conforming to the + // "tls.client.hash.sha1" semantic conventions. It represents the certificate + // fingerprint using the SHA1 digest of DER-encoded version of certificate + // offered by the client. For consistency with other hash values, this value + // should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "9E393D93138888D288266C2D915214D1D1CCEB2A" + TLSClientHashSha1Key = attribute.Key("tls.client.hash.sha1") + + // TLSClientHashSha256Key is the attribute Key conforming to the + // "tls.client.hash.sha256" semantic conventions. It represents the certificate + // fingerprint using the SHA256 digest of DER-encoded version of certificate + // offered by the client. For consistency with other hash values, this value + // should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0" + TLSClientHashSha256Key = attribute.Key("tls.client.hash.sha256") + + // TLSClientIssuerKey is the attribute Key conforming to the "tls.client.issuer" + // semantic conventions. It represents the distinguished name of [subject] of + // the issuer of the x.509 certificate presented by the client. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "CN=Example Root CA, OU=Infrastructure Team, DC=example, DC=com" + // + // [subject]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6 + TLSClientIssuerKey = attribute.Key("tls.client.issuer") + + // TLSClientJa3Key is the attribute Key conforming to the "tls.client.ja3" + // semantic conventions. It represents a hash that identifies clients based on + // how they perform an SSL/TLS handshake. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "d4e5b18d6b55c71272893221c96ba240" + TLSClientJa3Key = attribute.Key("tls.client.ja3") + + // TLSClientNotAfterKey is the attribute Key conforming to the + // "tls.client.not_after" semantic conventions. It represents the date/Time + // indicating when client certificate is no longer considered valid. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2021-01-01T00:00:00.000Z" + TLSClientNotAfterKey = attribute.Key("tls.client.not_after") + + // TLSClientNotBeforeKey is the attribute Key conforming to the + // "tls.client.not_before" semantic conventions. It represents the date/Time + // indicating when client certificate is first considered valid. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1970-01-01T00:00:00.000Z" + TLSClientNotBeforeKey = attribute.Key("tls.client.not_before") + + // TLSClientSubjectKey is the attribute Key conforming to the + // "tls.client.subject" semantic conventions. It represents the distinguished + // name of subject of the x.509 certificate presented by the client. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "CN=myclient, OU=Documentation Team, DC=example, DC=com" + TLSClientSubjectKey = attribute.Key("tls.client.subject") + + // TLSClientSupportedCiphersKey is the attribute Key conforming to the + // "tls.client.supported_ciphers" semantic conventions. It represents the array + // of ciphers offered by the client during the client hello. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", + // "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" + TLSClientSupportedCiphersKey = attribute.Key("tls.client.supported_ciphers") + + // TLSCurveKey is the attribute Key conforming to the "tls.curve" semantic + // conventions. It represents the string indicating the curve used for the given + // cipher, when applicable. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "secp256r1" + TLSCurveKey = attribute.Key("tls.curve") + + // TLSEstablishedKey is the attribute Key conforming to the "tls.established" + // semantic conventions. It represents the boolean flag indicating if the TLS + // negotiation was successful and transitioned to an encrypted tunnel. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: true + TLSEstablishedKey = attribute.Key("tls.established") + + // TLSNextProtocolKey is the attribute Key conforming to the "tls.next_protocol" + // semantic conventions. It represents the string indicating the protocol being + // tunneled. Per the values in the [IANA registry], this string should be lower + // case. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "http/1.1" + // + // [IANA registry]: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + TLSNextProtocolKey = attribute.Key("tls.next_protocol") + + // TLSProtocolNameKey is the attribute Key conforming to the "tls.protocol.name" + // semantic conventions. It represents the normalized lowercase protocol name + // parsed from original string of the negotiated [SSL/TLS protocol version]. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // + // [SSL/TLS protocol version]: https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html#RETURN-VALUES + TLSProtocolNameKey = attribute.Key("tls.protocol.name") + + // TLSProtocolVersionKey is the attribute Key conforming to the + // "tls.protocol.version" semantic conventions. It represents the numeric part + // of the version parsed from the original string of the negotiated + // [SSL/TLS protocol version]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1.2", "3" + // + // [SSL/TLS protocol version]: https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html#RETURN-VALUES + TLSProtocolVersionKey = attribute.Key("tls.protocol.version") + + // TLSResumedKey is the attribute Key conforming to the "tls.resumed" semantic + // conventions. It represents the boolean flag indicating if this TLS connection + // was resumed from an existing TLS negotiation. + // + // Type: boolean + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: true + TLSResumedKey = attribute.Key("tls.resumed") + + // TLSServerCertificateKey is the attribute Key conforming to the + // "tls.server.certificate" semantic conventions. It represents the pEM-encoded + // stand-alone certificate offered by the server. This is usually + // mutually-exclusive of `server.certificate_chain` since this value also exists + // in that list. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "MII..." + TLSServerCertificateKey = attribute.Key("tls.server.certificate") + + // TLSServerCertificateChainKey is the attribute Key conforming to the + // "tls.server.certificate_chain" semantic conventions. It represents the array + // of PEM-encoded certificates that make up the certificate chain offered by the + // server. This is usually mutually-exclusive of `server.certificate` since that + // value should be the first certificate in the chain. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "MII...", "MI..." + TLSServerCertificateChainKey = attribute.Key("tls.server.certificate_chain") + + // TLSServerHashMd5Key is the attribute Key conforming to the + // "tls.server.hash.md5" semantic conventions. It represents the certificate + // fingerprint using the MD5 digest of DER-encoded version of certificate + // offered by the server. For consistency with other hash values, this value + // should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC" + TLSServerHashMd5Key = attribute.Key("tls.server.hash.md5") + + // TLSServerHashSha1Key is the attribute Key conforming to the + // "tls.server.hash.sha1" semantic conventions. It represents the certificate + // fingerprint using the SHA1 digest of DER-encoded version of certificate + // offered by the server. For consistency with other hash values, this value + // should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "9E393D93138888D288266C2D915214D1D1CCEB2A" + TLSServerHashSha1Key = attribute.Key("tls.server.hash.sha1") + + // TLSServerHashSha256Key is the attribute Key conforming to the + // "tls.server.hash.sha256" semantic conventions. It represents the certificate + // fingerprint using the SHA256 digest of DER-encoded version of certificate + // offered by the server. For consistency with other hash values, this value + // should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0" + TLSServerHashSha256Key = attribute.Key("tls.server.hash.sha256") + + // TLSServerIssuerKey is the attribute Key conforming to the "tls.server.issuer" + // semantic conventions. It represents the distinguished name of [subject] of + // the issuer of the x.509 certificate presented by the client. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "CN=Example Root CA, OU=Infrastructure Team, DC=example, DC=com" + // + // [subject]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6 + TLSServerIssuerKey = attribute.Key("tls.server.issuer") + + // TLSServerJa3sKey is the attribute Key conforming to the "tls.server.ja3s" + // semantic conventions. It represents a hash that identifies servers based on + // how they perform an SSL/TLS handshake. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "d4e5b18d6b55c71272893221c96ba240" + TLSServerJa3sKey = attribute.Key("tls.server.ja3s") + + // TLSServerNotAfterKey is the attribute Key conforming to the + // "tls.server.not_after" semantic conventions. It represents the date/Time + // indicating when server certificate is no longer considered valid. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "2021-01-01T00:00:00.000Z" + TLSServerNotAfterKey = attribute.Key("tls.server.not_after") + + // TLSServerNotBeforeKey is the attribute Key conforming to the + // "tls.server.not_before" semantic conventions. It represents the date/Time + // indicating when server certificate is first considered valid. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "1970-01-01T00:00:00.000Z" + TLSServerNotBeforeKey = attribute.Key("tls.server.not_before") + + // TLSServerSubjectKey is the attribute Key conforming to the + // "tls.server.subject" semantic conventions. It represents the distinguished + // name of subject of the x.509 certificate presented by the server. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "CN=myserver, OU=Documentation Team, DC=example, DC=com" + TLSServerSubjectKey = attribute.Key("tls.server.subject") +) + +// TLSCipher returns an attribute KeyValue conforming to the "tls.cipher" +// semantic conventions. It represents the string indicating the [cipher] used +// during the current connection. +// +// [cipher]: https://datatracker.ietf.org/doc/html/rfc5246#appendix-A.5 +func TLSCipher(val string) attribute.KeyValue { + return TLSCipherKey.String(val) +} + +// TLSClientCertificate returns an attribute KeyValue conforming to the +// "tls.client.certificate" semantic conventions. It represents the pEM-encoded +// stand-alone certificate offered by the client. This is usually +// mutually-exclusive of `client.certificate_chain` since this value also exists +// in that list. +func TLSClientCertificate(val string) attribute.KeyValue { + return TLSClientCertificateKey.String(val) +} + +// TLSClientCertificateChain returns an attribute KeyValue conforming to the +// "tls.client.certificate_chain" semantic conventions. It represents the array +// of PEM-encoded certificates that make up the certificate chain offered by the +// client. This is usually mutually-exclusive of `client.certificate` since that +// value should be the first certificate in the chain. +func TLSClientCertificateChain(val ...string) attribute.KeyValue { + return TLSClientCertificateChainKey.StringSlice(val) +} + +// TLSClientHashMd5 returns an attribute KeyValue conforming to the +// "tls.client.hash.md5" semantic conventions. It represents the certificate +// fingerprint using the MD5 digest of DER-encoded version of certificate offered +// by the client. For consistency with other hash values, this value should be +// formatted as an uppercase hash. +func TLSClientHashMd5(val string) attribute.KeyValue { + return TLSClientHashMd5Key.String(val) +} + +// TLSClientHashSha1 returns an attribute KeyValue conforming to the +// "tls.client.hash.sha1" semantic conventions. It represents the certificate +// fingerprint using the SHA1 digest of DER-encoded version of certificate +// offered by the client. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSClientHashSha1(val string) attribute.KeyValue { + return TLSClientHashSha1Key.String(val) +} + +// TLSClientHashSha256 returns an attribute KeyValue conforming to the +// "tls.client.hash.sha256" semantic conventions. It represents the certificate +// fingerprint using the SHA256 digest of DER-encoded version of certificate +// offered by the client. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSClientHashSha256(val string) attribute.KeyValue { + return TLSClientHashSha256Key.String(val) +} + +// TLSClientIssuer returns an attribute KeyValue conforming to the +// "tls.client.issuer" semantic conventions. It represents the distinguished name +// of [subject] of the issuer of the x.509 certificate presented by the client. +// +// [subject]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6 +func TLSClientIssuer(val string) attribute.KeyValue { + return TLSClientIssuerKey.String(val) +} + +// TLSClientJa3 returns an attribute KeyValue conforming to the "tls.client.ja3" +// semantic conventions. It represents a hash that identifies clients based on +// how they perform an SSL/TLS handshake. +func TLSClientJa3(val string) attribute.KeyValue { + return TLSClientJa3Key.String(val) +} + +// TLSClientNotAfter returns an attribute KeyValue conforming to the +// "tls.client.not_after" semantic conventions. It represents the date/Time +// indicating when client certificate is no longer considered valid. +func TLSClientNotAfter(val string) attribute.KeyValue { + return TLSClientNotAfterKey.String(val) +} + +// TLSClientNotBefore returns an attribute KeyValue conforming to the +// "tls.client.not_before" semantic conventions. It represents the date/Time +// indicating when client certificate is first considered valid. +func TLSClientNotBefore(val string) attribute.KeyValue { + return TLSClientNotBeforeKey.String(val) +} + +// TLSClientSubject returns an attribute KeyValue conforming to the +// "tls.client.subject" semantic conventions. It represents the distinguished +// name of subject of the x.509 certificate presented by the client. +func TLSClientSubject(val string) attribute.KeyValue { + return TLSClientSubjectKey.String(val) +} + +// TLSClientSupportedCiphers returns an attribute KeyValue conforming to the +// "tls.client.supported_ciphers" semantic conventions. It represents the array +// of ciphers offered by the client during the client hello. +func TLSClientSupportedCiphers(val ...string) attribute.KeyValue { + return TLSClientSupportedCiphersKey.StringSlice(val) +} + +// TLSCurve returns an attribute KeyValue conforming to the "tls.curve" semantic +// conventions. It represents the string indicating the curve used for the given +// cipher, when applicable. +func TLSCurve(val string) attribute.KeyValue { + return TLSCurveKey.String(val) +} + +// TLSEstablished returns an attribute KeyValue conforming to the +// "tls.established" semantic conventions. It represents the boolean flag +// indicating if the TLS negotiation was successful and transitioned to an +// encrypted tunnel. +func TLSEstablished(val bool) attribute.KeyValue { + return TLSEstablishedKey.Bool(val) +} + +// TLSNextProtocol returns an attribute KeyValue conforming to the +// "tls.next_protocol" semantic conventions. It represents the string indicating +// the protocol being tunneled. Per the values in the [IANA registry], this +// string should be lower case. +// +// [IANA registry]: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids +func TLSNextProtocol(val string) attribute.KeyValue { + return TLSNextProtocolKey.String(val) +} + +// TLSProtocolVersion returns an attribute KeyValue conforming to the +// "tls.protocol.version" semantic conventions. It represents the numeric part of +// the version parsed from the original string of the negotiated +// [SSL/TLS protocol version]. +// +// [SSL/TLS protocol version]: https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html#RETURN-VALUES +func TLSProtocolVersion(val string) attribute.KeyValue { + return TLSProtocolVersionKey.String(val) +} + +// TLSResumed returns an attribute KeyValue conforming to the "tls.resumed" +// semantic conventions. It represents the boolean flag indicating if this TLS +// connection was resumed from an existing TLS negotiation. +func TLSResumed(val bool) attribute.KeyValue { + return TLSResumedKey.Bool(val) +} + +// TLSServerCertificate returns an attribute KeyValue conforming to the +// "tls.server.certificate" semantic conventions. It represents the pEM-encoded +// stand-alone certificate offered by the server. This is usually +// mutually-exclusive of `server.certificate_chain` since this value also exists +// in that list. +func TLSServerCertificate(val string) attribute.KeyValue { + return TLSServerCertificateKey.String(val) +} + +// TLSServerCertificateChain returns an attribute KeyValue conforming to the +// "tls.server.certificate_chain" semantic conventions. It represents the array +// of PEM-encoded certificates that make up the certificate chain offered by the +// server. This is usually mutually-exclusive of `server.certificate` since that +// value should be the first certificate in the chain. +func TLSServerCertificateChain(val ...string) attribute.KeyValue { + return TLSServerCertificateChainKey.StringSlice(val) +} + +// TLSServerHashMd5 returns an attribute KeyValue conforming to the +// "tls.server.hash.md5" semantic conventions. It represents the certificate +// fingerprint using the MD5 digest of DER-encoded version of certificate offered +// by the server. For consistency with other hash values, this value should be +// formatted as an uppercase hash. +func TLSServerHashMd5(val string) attribute.KeyValue { + return TLSServerHashMd5Key.String(val) +} + +// TLSServerHashSha1 returns an attribute KeyValue conforming to the +// "tls.server.hash.sha1" semantic conventions. It represents the certificate +// fingerprint using the SHA1 digest of DER-encoded version of certificate +// offered by the server. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSServerHashSha1(val string) attribute.KeyValue { + return TLSServerHashSha1Key.String(val) +} + +// TLSServerHashSha256 returns an attribute KeyValue conforming to the +// "tls.server.hash.sha256" semantic conventions. It represents the certificate +// fingerprint using the SHA256 digest of DER-encoded version of certificate +// offered by the server. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSServerHashSha256(val string) attribute.KeyValue { + return TLSServerHashSha256Key.String(val) +} + +// TLSServerIssuer returns an attribute KeyValue conforming to the +// "tls.server.issuer" semantic conventions. It represents the distinguished name +// of [subject] of the issuer of the x.509 certificate presented by the client. +// +// [subject]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6 +func TLSServerIssuer(val string) attribute.KeyValue { + return TLSServerIssuerKey.String(val) +} + +// TLSServerJa3s returns an attribute KeyValue conforming to the +// "tls.server.ja3s" semantic conventions. It represents a hash that identifies +// servers based on how they perform an SSL/TLS handshake. +func TLSServerJa3s(val string) attribute.KeyValue { + return TLSServerJa3sKey.String(val) +} + +// TLSServerNotAfter returns an attribute KeyValue conforming to the +// "tls.server.not_after" semantic conventions. It represents the date/Time +// indicating when server certificate is no longer considered valid. +func TLSServerNotAfter(val string) attribute.KeyValue { + return TLSServerNotAfterKey.String(val) +} + +// TLSServerNotBefore returns an attribute KeyValue conforming to the +// "tls.server.not_before" semantic conventions. It represents the date/Time +// indicating when server certificate is first considered valid. +func TLSServerNotBefore(val string) attribute.KeyValue { + return TLSServerNotBeforeKey.String(val) +} + +// TLSServerSubject returns an attribute KeyValue conforming to the +// "tls.server.subject" semantic conventions. It represents the distinguished +// name of subject of the x.509 certificate presented by the server. +func TLSServerSubject(val string) attribute.KeyValue { + return TLSServerSubjectKey.String(val) +} + +// Enum values for tls.protocol.name +var ( + // ssl + // Stability: development + TLSProtocolNameSsl = TLSProtocolNameKey.String("ssl") + // tls + // Stability: development + TLSProtocolNameTLS = TLSProtocolNameKey.String("tls") +) + +// Namespace: url +const ( + // URLDomainKey is the attribute Key conforming to the "url.domain" semantic + // conventions. It represents the domain extracted from the `url.full`, such as + // "opentelemetry.io". + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "www.foo.bar", "opentelemetry.io", "3.12.167.2", + // "[1080:0:0:0:8:800:200C:417A]" + // Note: In some cases a URL may refer to an IP and/or port directly, without a + // domain name. In this case, the IP address would go to the domain field. If + // the URL contains a [literal IPv6 address] enclosed by `[` and `]`, the `[` + // and `]` characters should also be captured in the domain field. + // + // [literal IPv6 address]: https://www.rfc-editor.org/rfc/rfc2732#section-2 + URLDomainKey = attribute.Key("url.domain") + + // URLExtensionKey is the attribute Key conforming to the "url.extension" + // semantic conventions. It represents the file extension extracted from the + // `url.full`, excluding the leading dot. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "png", "gz" + // Note: The file extension is only set if it exists, as not every url has a + // file extension. When the file name has multiple extensions `example.tar.gz`, + // only the last one should be captured `gz`, not `tar.gz`. + URLExtensionKey = attribute.Key("url.extension") + + // URLFragmentKey is the attribute Key conforming to the "url.fragment" semantic + // conventions. It represents the [URI fragment] component. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "SemConv" + // + // [URI fragment]: https://www.rfc-editor.org/rfc/rfc3986#section-3.5 + URLFragmentKey = attribute.Key("url.fragment") + + // URLFullKey is the attribute Key conforming to the "url.full" semantic + // conventions. It represents the absolute URL describing a network resource + // according to [RFC3986]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "https://www.foo.bar/search?q=OpenTelemetry#SemConv", "//localhost" + // Note: For network calls, URL usually has + // `scheme://host[:port][path][?query][#fragment]` format, where the fragment + // is not transmitted over HTTP, but if it is known, it SHOULD be included + // nevertheless. + // + // `url.full` MUST NOT contain credentials passed via URL in form of + // `https://username:password@www.example.com/`. + // In such case username and password SHOULD be redacted and attribute's value + // SHOULD be `https://REDACTED:REDACTED@www.example.com/`. + // + // `url.full` SHOULD capture the absolute URL when it is available (or can be + // reconstructed). + // + // Sensitive content provided in `url.full` SHOULD be scrubbed when + // instrumentations can identify it. + // + // + // Query string values for the following keys SHOULD be redacted by default and + // replaced by the + // value `REDACTED`: + // + // - [`AWSAccessKeyId`] + // - [`Signature`] + // - [`sig`] + // - [`X-Goog-Signature`] + // + // This list is subject to change over time. + // + // When a query string value is redacted, the query string key SHOULD still be + // preserved, e.g. + // `https://www.example.com/path?color=blue&sig=REDACTED`. + // + // [RFC3986]: https://www.rfc-editor.org/rfc/rfc3986 + // [`AWSAccessKeyId`]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html#RESTAuthenticationQueryStringAuth + // [`Signature`]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html#RESTAuthenticationQueryStringAuth + // [`sig`]: https://learn.microsoft.com/azure/storage/common/storage-sas-overview#sas-token + // [`X-Goog-Signature`]: https://cloud.google.com/storage/docs/access-control/signed-urls + URLFullKey = attribute.Key("url.full") + + // URLOriginalKey is the attribute Key conforming to the "url.original" semantic + // conventions. It represents the unmodified original URL as seen in the event + // source. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "https://www.foo.bar/search?q=OpenTelemetry#SemConv", + // "search?q=OpenTelemetry" + // Note: In network monitoring, the observed URL may be a full URL, whereas in + // access logs, the URL is often just represented as a path. This field is meant + // to represent the URL as it was observed, complete or not. + // `url.original` might contain credentials passed via URL in form of + // `https://username:password@www.example.com/`. In such case password and + // username SHOULD NOT be redacted and attribute's value SHOULD remain the same. + URLOriginalKey = attribute.Key("url.original") + + // URLPathKey is the attribute Key conforming to the "url.path" semantic + // conventions. It represents the [URI path] component. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "/search" + // Note: Sensitive content provided in `url.path` SHOULD be scrubbed when + // instrumentations can identify it. + // + // [URI path]: https://www.rfc-editor.org/rfc/rfc3986#section-3.3 + URLPathKey = attribute.Key("url.path") + + // URLPortKey is the attribute Key conforming to the "url.port" semantic + // conventions. It represents the port extracted from the `url.full`. + // + // Type: int + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: 443 + URLPortKey = attribute.Key("url.port") + + // URLQueryKey is the attribute Key conforming to the "url.query" semantic + // conventions. It represents the [URI query] component. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "q=OpenTelemetry" + // Note: Sensitive content provided in `url.query` SHOULD be scrubbed when + // instrumentations can identify it. + // + // + // Query string values for the following keys SHOULD be redacted by default and + // replaced by the value `REDACTED`: + // + // - [`AWSAccessKeyId`] + // - [`Signature`] + // - [`sig`] + // - [`X-Goog-Signature`] + // + // This list is subject to change over time. + // + // When a query string value is redacted, the query string key SHOULD still be + // preserved, e.g. + // `q=OpenTelemetry&sig=REDACTED`. + // + // [URI query]: https://www.rfc-editor.org/rfc/rfc3986#section-3.4 + // [`AWSAccessKeyId`]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html#RESTAuthenticationQueryStringAuth + // [`Signature`]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html#RESTAuthenticationQueryStringAuth + // [`sig`]: https://learn.microsoft.com/azure/storage/common/storage-sas-overview#sas-token + // [`X-Goog-Signature`]: https://cloud.google.com/storage/docs/access-control/signed-urls + URLQueryKey = attribute.Key("url.query") + + // URLRegisteredDomainKey is the attribute Key conforming to the + // "url.registered_domain" semantic conventions. It represents the highest + // registered url domain, stripped of the subdomain. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "example.com", "foo.co.uk" + // Note: This value can be determined precisely with the [public suffix list]. + // For example, the registered domain for `foo.example.com` is `example.com`. + // Trying to approximate this by simply taking the last two labels will not work + // well for TLDs such as `co.uk`. + // + // [public suffix list]: http://publicsuffix.org + URLRegisteredDomainKey = attribute.Key("url.registered_domain") + + // URLSchemeKey is the attribute Key conforming to the "url.scheme" semantic + // conventions. It represents the [URI scheme] component identifying the used + // protocol. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "https", "ftp", "telnet" + // + // [URI scheme]: https://www.rfc-editor.org/rfc/rfc3986#section-3.1 + URLSchemeKey = attribute.Key("url.scheme") + + // URLSubdomainKey is the attribute Key conforming to the "url.subdomain" + // semantic conventions. It represents the subdomain portion of a fully + // qualified domain name includes all of the names except the host name under + // the registered_domain. In a partially qualified domain, or if the + // qualification level of the full name cannot be determined, subdomain contains + // all of the names below the registered domain. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "east", "sub2.sub1" + // Note: The subdomain portion of `www.east.mydomain.co.uk` is `east`. If the + // domain has multiple levels of subdomain, such as `sub2.sub1.example.com`, the + // subdomain field should contain `sub2.sub1`, with no trailing period. + URLSubdomainKey = attribute.Key("url.subdomain") + + // URLTemplateKey is the attribute Key conforming to the "url.template" semantic + // conventions. It represents the low-cardinality template of an + // [absolute path reference]. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "/users/{id}", "/users/:id", "/users?id={id}" + // + // [absolute path reference]: https://www.rfc-editor.org/rfc/rfc3986#section-4.2 + URLTemplateKey = attribute.Key("url.template") + + // URLTopLevelDomainKey is the attribute Key conforming to the + // "url.top_level_domain" semantic conventions. It represents the effective top + // level domain (eTLD), also known as the domain suffix, is the last part of the + // domain name. For example, the top level domain for example.com is `com`. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "com", "co.uk" + // Note: This value can be determined precisely with the [public suffix list]. + // + // [public suffix list]: http://publicsuffix.org + URLTopLevelDomainKey = attribute.Key("url.top_level_domain") +) + +// URLDomain returns an attribute KeyValue conforming to the "url.domain" +// semantic conventions. It represents the domain extracted from the `url.full`, +// such as "opentelemetry.io". +func URLDomain(val string) attribute.KeyValue { + return URLDomainKey.String(val) +} + +// URLExtension returns an attribute KeyValue conforming to the "url.extension" +// semantic conventions. It represents the file extension extracted from the +// `url.full`, excluding the leading dot. +func URLExtension(val string) attribute.KeyValue { + return URLExtensionKey.String(val) +} + +// URLFragment returns an attribute KeyValue conforming to the "url.fragment" +// semantic conventions. It represents the [URI fragment] component. +// +// [URI fragment]: https://www.rfc-editor.org/rfc/rfc3986#section-3.5 +func URLFragment(val string) attribute.KeyValue { + return URLFragmentKey.String(val) +} + +// URLFull returns an attribute KeyValue conforming to the "url.full" semantic +// conventions. It represents the absolute URL describing a network resource +// according to [RFC3986]. +// +// [RFC3986]: https://www.rfc-editor.org/rfc/rfc3986 +func URLFull(val string) attribute.KeyValue { + return URLFullKey.String(val) +} + +// URLOriginal returns an attribute KeyValue conforming to the "url.original" +// semantic conventions. It represents the unmodified original URL as seen in the +// event source. +func URLOriginal(val string) attribute.KeyValue { + return URLOriginalKey.String(val) +} + +// URLPath returns an attribute KeyValue conforming to the "url.path" semantic +// conventions. It represents the [URI path] component. +// +// [URI path]: https://www.rfc-editor.org/rfc/rfc3986#section-3.3 +func URLPath(val string) attribute.KeyValue { + return URLPathKey.String(val) +} + +// URLPort returns an attribute KeyValue conforming to the "url.port" semantic +// conventions. It represents the port extracted from the `url.full`. +func URLPort(val int) attribute.KeyValue { + return URLPortKey.Int(val) +} + +// URLQuery returns an attribute KeyValue conforming to the "url.query" semantic +// conventions. It represents the [URI query] component. +// +// [URI query]: https://www.rfc-editor.org/rfc/rfc3986#section-3.4 +func URLQuery(val string) attribute.KeyValue { + return URLQueryKey.String(val) +} + +// URLRegisteredDomain returns an attribute KeyValue conforming to the +// "url.registered_domain" semantic conventions. It represents the highest +// registered url domain, stripped of the subdomain. +func URLRegisteredDomain(val string) attribute.KeyValue { + return URLRegisteredDomainKey.String(val) +} + +// URLScheme returns an attribute KeyValue conforming to the "url.scheme" +// semantic conventions. It represents the [URI scheme] component identifying the +// used protocol. +// +// [URI scheme]: https://www.rfc-editor.org/rfc/rfc3986#section-3.1 +func URLScheme(val string) attribute.KeyValue { + return URLSchemeKey.String(val) +} + +// URLSubdomain returns an attribute KeyValue conforming to the "url.subdomain" +// semantic conventions. It represents the subdomain portion of a fully qualified +// domain name includes all of the names except the host name under the +// registered_domain. In a partially qualified domain, or if the qualification +// level of the full name cannot be determined, subdomain contains all of the +// names below the registered domain. +func URLSubdomain(val string) attribute.KeyValue { + return URLSubdomainKey.String(val) +} + +// URLTemplate returns an attribute KeyValue conforming to the "url.template" +// semantic conventions. It represents the low-cardinality template of an +// [absolute path reference]. +// +// [absolute path reference]: https://www.rfc-editor.org/rfc/rfc3986#section-4.2 +func URLTemplate(val string) attribute.KeyValue { + return URLTemplateKey.String(val) +} + +// URLTopLevelDomain returns an attribute KeyValue conforming to the +// "url.top_level_domain" semantic conventions. It represents the effective top +// level domain (eTLD), also known as the domain suffix, is the last part of the +// domain name. For example, the top level domain for example.com is `com`. +func URLTopLevelDomain(val string) attribute.KeyValue { + return URLTopLevelDomainKey.String(val) +} + +// Namespace: user +const ( + // UserEmailKey is the attribute Key conforming to the "user.email" semantic + // conventions. It represents the user email address. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "a.einstein@example.com" + UserEmailKey = attribute.Key("user.email") + + // UserFullNameKey is the attribute Key conforming to the "user.full_name" + // semantic conventions. It represents the user's full name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Albert Einstein" + UserFullNameKey = attribute.Key("user.full_name") + + // UserHashKey is the attribute Key conforming to the "user.hash" semantic + // conventions. It represents the unique user hash to correlate information for + // a user in anonymized form. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "364fc68eaf4c8acec74a4e52d7d1feaa" + // Note: Useful if `user.id` or `user.name` contain confidential information and + // cannot be used. + UserHashKey = attribute.Key("user.hash") + + // UserIDKey is the attribute Key conforming to the "user.id" semantic + // conventions. It represents the unique identifier of the user. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "S-1-5-21-202424912787-2692429404-2351956786-1000" + UserIDKey = attribute.Key("user.id") + + // UserNameKey is the attribute Key conforming to the "user.name" semantic + // conventions. It represents the short name or login/username of the user. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "a.einstein" + UserNameKey = attribute.Key("user.name") + + // UserRolesKey is the attribute Key conforming to the "user.roles" semantic + // conventions. It represents the array of user roles at the time of the event. + // + // Type: string[] + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "admin", "reporting_user" + UserRolesKey = attribute.Key("user.roles") +) + +// UserEmail returns an attribute KeyValue conforming to the "user.email" +// semantic conventions. It represents the user email address. +func UserEmail(val string) attribute.KeyValue { + return UserEmailKey.String(val) +} + +// UserFullName returns an attribute KeyValue conforming to the "user.full_name" +// semantic conventions. It represents the user's full name. +func UserFullName(val string) attribute.KeyValue { + return UserFullNameKey.String(val) +} + +// UserHash returns an attribute KeyValue conforming to the "user.hash" semantic +// conventions. It represents the unique user hash to correlate information for a +// user in anonymized form. +func UserHash(val string) attribute.KeyValue { + return UserHashKey.String(val) +} + +// UserID returns an attribute KeyValue conforming to the "user.id" semantic +// conventions. It represents the unique identifier of the user. +func UserID(val string) attribute.KeyValue { + return UserIDKey.String(val) +} + +// UserName returns an attribute KeyValue conforming to the "user.name" semantic +// conventions. It represents the short name or login/username of the user. +func UserName(val string) attribute.KeyValue { + return UserNameKey.String(val) +} + +// UserRoles returns an attribute KeyValue conforming to the "user.roles" +// semantic conventions. It represents the array of user roles at the time of the +// event. +func UserRoles(val ...string) attribute.KeyValue { + return UserRolesKey.StringSlice(val) +} + +// Namespace: user_agent +const ( + // UserAgentNameKey is the attribute Key conforming to the "user_agent.name" + // semantic conventions. It represents the name of the user-agent extracted from + // original. Usually refers to the browser's name. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Safari", "YourApp" + // Note: [Example] of extracting browser's name from original string. In the + // case of using a user-agent for non-browser products, such as microservices + // with multiple names/versions inside the `user_agent.original`, the most + // significant name SHOULD be selected. In such a scenario it should align with + // `user_agent.version` + // + // [Example]: https://www.whatsmyua.info + UserAgentNameKey = attribute.Key("user_agent.name") + + // UserAgentOriginalKey is the attribute Key conforming to the + // "user_agent.original" semantic conventions. It represents the value of the + // [HTTP User-Agent] header sent by the client. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Stable + // + // Examples: "CERN-LineMode/2.15 libwww/2.17b3", "Mozilla/5.0 (iPhone; CPU + // iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) + // Version/14.1.2 Mobile/15E148 Safari/604.1", "YourApp/1.0.0 + // grpc-java-okhttp/1.27.2" + // + // [HTTP User-Agent]: https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent + UserAgentOriginalKey = attribute.Key("user_agent.original") + + // UserAgentSyntheticTypeKey is the attribute Key conforming to the + // "user_agent.synthetic.type" semantic conventions. It represents the specifies + // the category of synthetic traffic, such as tests or bots. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // Note: This attribute MAY be derived from the contents of the + // `user_agent.original` attribute. Components that populate the attribute are + // responsible for determining what they consider to be synthetic bot or test + // traffic. This attribute can either be set for self-identification purposes, + // or on telemetry detected to be generated as a result of a synthetic request. + // This attribute is useful for distinguishing between genuine client traffic + // and synthetic traffic generated by bots or tests. + UserAgentSyntheticTypeKey = attribute.Key("user_agent.synthetic.type") + + // UserAgentVersionKey is the attribute Key conforming to the + // "user_agent.version" semantic conventions. It represents the version of the + // user-agent extracted from original. Usually refers to the browser's version. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "14.1.2", "1.0.0" + // Note: [Example] of extracting browser's version from original string. In the + // case of using a user-agent for non-browser products, such as microservices + // with multiple names/versions inside the `user_agent.original`, the most + // significant version SHOULD be selected. In such a scenario it should align + // with `user_agent.name` + // + // [Example]: https://www.whatsmyua.info + UserAgentVersionKey = attribute.Key("user_agent.version") +) + +// UserAgentName returns an attribute KeyValue conforming to the +// "user_agent.name" semantic conventions. It represents the name of the +// user-agent extracted from original. Usually refers to the browser's name. +func UserAgentName(val string) attribute.KeyValue { + return UserAgentNameKey.String(val) +} + +// UserAgentOriginal returns an attribute KeyValue conforming to the +// "user_agent.original" semantic conventions. It represents the value of the +// [HTTP User-Agent] header sent by the client. +// +// [HTTP User-Agent]: https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent +func UserAgentOriginal(val string) attribute.KeyValue { + return UserAgentOriginalKey.String(val) +} + +// UserAgentVersion returns an attribute KeyValue conforming to the +// "user_agent.version" semantic conventions. It represents the version of the +// user-agent extracted from original. Usually refers to the browser's version. +func UserAgentVersion(val string) attribute.KeyValue { + return UserAgentVersionKey.String(val) +} + +// Enum values for user_agent.synthetic.type +var ( + // Bot source. + // Stability: development + UserAgentSyntheticTypeBot = UserAgentSyntheticTypeKey.String("bot") + // Synthetic test source. + // Stability: development + UserAgentSyntheticTypeTest = UserAgentSyntheticTypeKey.String("test") +) + +// Namespace: vcs +const ( + // VCSChangeIDKey is the attribute Key conforming to the "vcs.change.id" + // semantic conventions. It represents the ID of the change (pull request/merge + // request/changelist) if applicable. This is usually a unique (within + // repository) identifier generated by the VCS system. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "123" + VCSChangeIDKey = attribute.Key("vcs.change.id") + + // VCSChangeStateKey is the attribute Key conforming to the "vcs.change.state" + // semantic conventions. It represents the state of the change (pull + // request/merge request/changelist). + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "open", "closed", "merged" + VCSChangeStateKey = attribute.Key("vcs.change.state") + + // VCSChangeTitleKey is the attribute Key conforming to the "vcs.change.title" + // semantic conventions. It represents the human readable title of the change + // (pull request/merge request/changelist). This title is often a brief summary + // of the change and may get merged in to a ref as the commit summary. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "Fixes broken thing", "feat: add my new feature", "[chore] update + // dependency" + VCSChangeTitleKey = attribute.Key("vcs.change.title") + + // VCSLineChangeTypeKey is the attribute Key conforming to the + // "vcs.line_change.type" semantic conventions. It represents the type of line + // change being measured on a branch or change. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "added", "removed" + VCSLineChangeTypeKey = attribute.Key("vcs.line_change.type") + + // VCSRefBaseNameKey is the attribute Key conforming to the "vcs.ref.base.name" + // semantic conventions. It represents the name of the [reference] such as + // **branch** or **tag** in the repository. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-feature-branch", "tag-1-test" + // Note: `base` refers to the starting point of a change. For example, `main` + // would be the base reference of type branch if you've created a new + // reference of type branch from it and created new commits. + // + // [reference]: https://git-scm.com/docs/gitglossary#def_ref + VCSRefBaseNameKey = attribute.Key("vcs.ref.base.name") + + // VCSRefBaseRevisionKey is the attribute Key conforming to the + // "vcs.ref.base.revision" semantic conventions. It represents the revision, + // literally [revised version], The revision most often refers to a commit + // object in Git, or a revision number in SVN. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "9d59409acf479dfa0df1aa568182e43e43df8bbe28d60fcf2bc52e30068802cc", + // "main", "123", "HEAD" + // Note: `base` refers to the starting point of a change. For example, `main` + // would be the base reference of type branch if you've created a new + // reference of type branch from it and created new commits. The + // revision can be a full [hash value (see + // glossary)], + // of the recorded change to a ref within a repository pointing to a + // commit [commit] object. It does + // not necessarily have to be a hash; it can simply define a [revision + // number] + // which is an integer that is monotonically increasing. In cases where + // it is identical to the `ref.base.name`, it SHOULD still be included. + // It is up to the implementer to decide which value to set as the + // revision based on the VCS system and situational context. + // + // [revised version]: https://www.merriam-webster.com/dictionary/revision + // [hash value (see + // glossary)]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf + // [commit]: https://git-scm.com/docs/git-commit + // [revision + // number]: https://svnbook.red-bean.com/en/1.7/svn.tour.revs.specifiers.html + VCSRefBaseRevisionKey = attribute.Key("vcs.ref.base.revision") + + // VCSRefBaseTypeKey is the attribute Key conforming to the "vcs.ref.base.type" + // semantic conventions. It represents the type of the [reference] in the + // repository. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "branch", "tag" + // Note: `base` refers to the starting point of a change. For example, `main` + // would be the base reference of type branch if you've created a new + // reference of type branch from it and created new commits. + // + // [reference]: https://git-scm.com/docs/gitglossary#def_ref + VCSRefBaseTypeKey = attribute.Key("vcs.ref.base.type") + + // VCSRefHeadNameKey is the attribute Key conforming to the "vcs.ref.head.name" + // semantic conventions. It represents the name of the [reference] such as + // **branch** or **tag** in the repository. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "my-feature-branch", "tag-1-test" + // Note: `head` refers to where you are right now; the current reference at a + // given time. + // + // [reference]: https://git-scm.com/docs/gitglossary#def_ref + VCSRefHeadNameKey = attribute.Key("vcs.ref.head.name") + + // VCSRefHeadRevisionKey is the attribute Key conforming to the + // "vcs.ref.head.revision" semantic conventions. It represents the revision, + // literally [revised version], The revision most often refers to a commit + // object in Git, or a revision number in SVN. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "9d59409acf479dfa0df1aa568182e43e43df8bbe28d60fcf2bc52e30068802cc", + // "main", "123", "HEAD" + // Note: `head` refers to where you are right now; the current reference at a + // given time.The revision can be a full [hash value (see + // glossary)], + // of the recorded change to a ref within a repository pointing to a + // commit [commit] object. It does + // not necessarily have to be a hash; it can simply define a [revision + // number] + // which is an integer that is monotonically increasing. In cases where + // it is identical to the `ref.head.name`, it SHOULD still be included. + // It is up to the implementer to decide which value to set as the + // revision based on the VCS system and situational context. + // + // [revised version]: https://www.merriam-webster.com/dictionary/revision + // [hash value (see + // glossary)]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf + // [commit]: https://git-scm.com/docs/git-commit + // [revision + // number]: https://svnbook.red-bean.com/en/1.7/svn.tour.revs.specifiers.html + VCSRefHeadRevisionKey = attribute.Key("vcs.ref.head.revision") + + // VCSRefHeadTypeKey is the attribute Key conforming to the "vcs.ref.head.type" + // semantic conventions. It represents the type of the [reference] in the + // repository. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "branch", "tag" + // Note: `head` refers to where you are right now; the current reference at a + // given time. + // + // [reference]: https://git-scm.com/docs/gitglossary#def_ref + VCSRefHeadTypeKey = attribute.Key("vcs.ref.head.type") + + // VCSRefTypeKey is the attribute Key conforming to the "vcs.ref.type" semantic + // conventions. It represents the type of the [reference] in the repository. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "branch", "tag" + // + // [reference]: https://git-scm.com/docs/gitglossary#def_ref + VCSRefTypeKey = attribute.Key("vcs.ref.type") + + // VCSRepositoryNameKey is the attribute Key conforming to the + // "vcs.repository.name" semantic conventions. It represents the human readable + // name of the repository. It SHOULD NOT include any additional identifier like + // Group/SubGroup in GitLab or organization in GitHub. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "semantic-conventions", "my-cool-repo" + // Note: Due to it only being the name, it can clash with forks of the same + // repository if collecting telemetry across multiple orgs or groups in + // the same backends. + VCSRepositoryNameKey = attribute.Key("vcs.repository.name") + + // VCSRepositoryURLFullKey is the attribute Key conforming to the + // "vcs.repository.url.full" semantic conventions. It represents the + // [canonical URL] of the repository providing the complete HTTP(S) address in + // order to locate and identify the repository through a browser. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: + // "https://github.com/opentelemetry/open-telemetry-collector-contrib", + // "https://gitlab.com/my-org/my-project/my-projects-project/repo" + // Note: In Git Version Control Systems, the canonical URL SHOULD NOT include + // the `.git` extension. + // + // [canonical URL]: https://support.google.com/webmasters/answer/10347851?hl=en#:~:text=A%20canonical%20URL%20is%20the,Google%20chooses%20one%20as%20canonical. + VCSRepositoryURLFullKey = attribute.Key("vcs.repository.url.full") + + // VCSRevisionDeltaDirectionKey is the attribute Key conforming to the + // "vcs.revision_delta.direction" semantic conventions. It represents the type + // of revision comparison. + // + // Type: Enum + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "ahead", "behind" + VCSRevisionDeltaDirectionKey = attribute.Key("vcs.revision_delta.direction") +) + +// VCSChangeID returns an attribute KeyValue conforming to the "vcs.change.id" +// semantic conventions. It represents the ID of the change (pull request/merge +// request/changelist) if applicable. This is usually a unique (within +// repository) identifier generated by the VCS system. +func VCSChangeID(val string) attribute.KeyValue { + return VCSChangeIDKey.String(val) +} + +// VCSChangeTitle returns an attribute KeyValue conforming to the +// "vcs.change.title" semantic conventions. It represents the human readable +// title of the change (pull request/merge request/changelist). This title is +// often a brief summary of the change and may get merged in to a ref as the +// commit summary. +func VCSChangeTitle(val string) attribute.KeyValue { + return VCSChangeTitleKey.String(val) +} + +// VCSRefBaseName returns an attribute KeyValue conforming to the +// "vcs.ref.base.name" semantic conventions. It represents the name of the +// [reference] such as **branch** or **tag** in the repository. +// +// [reference]: https://git-scm.com/docs/gitglossary#def_ref +func VCSRefBaseName(val string) attribute.KeyValue { + return VCSRefBaseNameKey.String(val) +} + +// VCSRefBaseRevision returns an attribute KeyValue conforming to the +// "vcs.ref.base.revision" semantic conventions. It represents the revision, +// literally [revised version], The revision most often refers to a commit object +// in Git, or a revision number in SVN. +// +// [revised version]: https://www.merriam-webster.com/dictionary/revision +func VCSRefBaseRevision(val string) attribute.KeyValue { + return VCSRefBaseRevisionKey.String(val) +} + +// VCSRefHeadName returns an attribute KeyValue conforming to the +// "vcs.ref.head.name" semantic conventions. It represents the name of the +// [reference] such as **branch** or **tag** in the repository. +// +// [reference]: https://git-scm.com/docs/gitglossary#def_ref +func VCSRefHeadName(val string) attribute.KeyValue { + return VCSRefHeadNameKey.String(val) +} + +// VCSRefHeadRevision returns an attribute KeyValue conforming to the +// "vcs.ref.head.revision" semantic conventions. It represents the revision, +// literally [revised version], The revision most often refers to a commit object +// in Git, or a revision number in SVN. +// +// [revised version]: https://www.merriam-webster.com/dictionary/revision +func VCSRefHeadRevision(val string) attribute.KeyValue { + return VCSRefHeadRevisionKey.String(val) +} + +// VCSRepositoryName returns an attribute KeyValue conforming to the +// "vcs.repository.name" semantic conventions. It represents the human readable +// name of the repository. It SHOULD NOT include any additional identifier like +// Group/SubGroup in GitLab or organization in GitHub. +func VCSRepositoryName(val string) attribute.KeyValue { + return VCSRepositoryNameKey.String(val) +} + +// VCSRepositoryURLFull returns an attribute KeyValue conforming to the +// "vcs.repository.url.full" semantic conventions. It represents the +// [canonical URL] of the repository providing the complete HTTP(S) address in +// order to locate and identify the repository through a browser. +// +// [canonical URL]: https://support.google.com/webmasters/answer/10347851?hl=en#:~:text=A%20canonical%20URL%20is%20the,Google%20chooses%20one%20as%20canonical. +func VCSRepositoryURLFull(val string) attribute.KeyValue { + return VCSRepositoryURLFullKey.String(val) +} + +// Enum values for vcs.change.state +var ( + // Open means the change is currently active and under review. It hasn't been + // merged into the target branch yet, and it's still possible to make changes or + // add comments. + // Stability: development + VCSChangeStateOpen = VCSChangeStateKey.String("open") + // WIP (work-in-progress, draft) means the change is still in progress and not + // yet ready for a full review. It might still undergo significant changes. + // Stability: development + VCSChangeStateWip = VCSChangeStateKey.String("wip") + // Closed means the merge request has been closed without merging. This can + // happen for various reasons, such as the changes being deemed unnecessary, the + // issue being resolved in another way, or the author deciding to withdraw the + // request. + // Stability: development + VCSChangeStateClosed = VCSChangeStateKey.String("closed") + // Merged indicates that the change has been successfully integrated into the + // target codebase. + // Stability: development + VCSChangeStateMerged = VCSChangeStateKey.String("merged") +) + +// Enum values for vcs.line_change.type +var ( + // How many lines were added. + // Stability: development + VCSLineChangeTypeAdded = VCSLineChangeTypeKey.String("added") + // How many lines were removed. + // Stability: development + VCSLineChangeTypeRemoved = VCSLineChangeTypeKey.String("removed") +) + +// Enum values for vcs.ref.base.type +var ( + // [branch] + // Stability: development + // + // [branch]: https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefbranchabranch + VCSRefBaseTypeBranch = VCSRefBaseTypeKey.String("branch") + // [tag] + // Stability: development + // + // [tag]: https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddeftagatag + VCSRefBaseTypeTag = VCSRefBaseTypeKey.String("tag") +) + +// Enum values for vcs.ref.head.type +var ( + // [branch] + // Stability: development + // + // [branch]: https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefbranchabranch + VCSRefHeadTypeBranch = VCSRefHeadTypeKey.String("branch") + // [tag] + // Stability: development + // + // [tag]: https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddeftagatag + VCSRefHeadTypeTag = VCSRefHeadTypeKey.String("tag") +) + +// Enum values for vcs.ref.type +var ( + // [branch] + // Stability: development + // + // [branch]: https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefbranchabranch + VCSRefTypeBranch = VCSRefTypeKey.String("branch") + // [tag] + // Stability: development + // + // [tag]: https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddeftagatag + VCSRefTypeTag = VCSRefTypeKey.String("tag") +) + +// Enum values for vcs.revision_delta.direction +var ( + // How many revisions the change is behind the target ref. + // Stability: development + VCSRevisionDeltaDirectionBehind = VCSRevisionDeltaDirectionKey.String("behind") + // How many revisions the change is ahead of the target ref. + // Stability: development + VCSRevisionDeltaDirectionAhead = VCSRevisionDeltaDirectionKey.String("ahead") +) + +// Namespace: webengine +const ( + // WebEngineDescriptionKey is the attribute Key conforming to the + // "webengine.description" semantic conventions. It represents the additional + // description of the web engine (e.g. detailed version and edition + // information). + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "WildFly Full 21.0.0.Final (WildFly Core 13.0.1.Final) - + // 2.2.2.Final" + WebEngineDescriptionKey = attribute.Key("webengine.description") + + // WebEngineNameKey is the attribute Key conforming to the "webengine.name" + // semantic conventions. It represents the name of the web engine. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "WildFly" + WebEngineNameKey = attribute.Key("webengine.name") + + // WebEngineVersionKey is the attribute Key conforming to the + // "webengine.version" semantic conventions. It represents the version of the + // web engine. + // + // Type: string + // RequirementLevel: Recommended + // Stability: Development + // + // Examples: "21.0.0" + WebEngineVersionKey = attribute.Key("webengine.version") +) + +// WebEngineDescription returns an attribute KeyValue conforming to the +// "webengine.description" semantic conventions. It represents the additional +// description of the web engine (e.g. detailed version and edition information). +func WebEngineDescription(val string) attribute.KeyValue { + return WebEngineDescriptionKey.String(val) +} + +// WebEngineName returns an attribute KeyValue conforming to the "webengine.name" +// semantic conventions. It represents the name of the web engine. +func WebEngineName(val string) attribute.KeyValue { + return WebEngineNameKey.String(val) +} + +// WebEngineVersion returns an attribute KeyValue conforming to the +// "webengine.version" semantic conventions. It represents the version of the web +// engine. +func WebEngineVersion(val string) attribute.KeyValue { + return WebEngineVersionKey.String(val) +} \ No newline at end of file diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/doc.go b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/doc.go new file mode 100644 index 0000000000..787f5b0f4d --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/doc.go @@ -0,0 +1,9 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package semconv implements OpenTelemetry semantic conventions. +// +// OpenTelemetry semantic conventions are agreed standardized naming +// patterns for OpenTelemetry things. This package represents the v1.30.0 +// version of the OpenTelemetry semantic conventions. +package semconv // import "go.opentelemetry.io/otel/semconv/v1.30.0" diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/exception.go b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/exception.go new file mode 100644 index 0000000000..4332a795f3 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/exception.go @@ -0,0 +1,9 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.30.0" + +const ( + // ExceptionEventName is the name of the Span event representing an exception. + ExceptionEventName = "exception" +) diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/metric.go b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/metric.go new file mode 100644 index 0000000000..fe6beb91dd --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/metric.go @@ -0,0 +1,1750 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Code generated from semantic convention specification. DO NOT EDIT. + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.30.0" + +const ( + // AzureCosmosDBClientActiveInstanceCount is the metric conforming to the + // "azure.cosmosdb.client.active_instance.count" semantic conventions. It + // represents the number of active client instances. + // Instrument: updowncounter + // Unit: {instance} + // Stability: development + AzureCosmosDBClientActiveInstanceCountName = "azure.cosmosdb.client.active_instance.count" + AzureCosmosDBClientActiveInstanceCountUnit = "{instance}" + AzureCosmosDBClientActiveInstanceCountDescription = "Number of active client instances" + // AzureCosmosDBClientOperationRequestCharge is the metric conforming to the + // "azure.cosmosdb.client.operation.request_charge" semantic conventions. It + // represents the [Request units] consumed by the operation. + // + // [Request units]: https://learn.microsoft.com/azure/cosmos-db/request-units + // Instrument: histogram + // Unit: {request_unit} + // Stability: development + AzureCosmosDBClientOperationRequestChargeName = "azure.cosmosdb.client.operation.request_charge" + AzureCosmosDBClientOperationRequestChargeUnit = "{request_unit}" + AzureCosmosDBClientOperationRequestChargeDescription = "[Request units](https://learn.microsoft.com/azure/cosmos-db/request-units) consumed by the operation" + // CICDPipelineRunActive is the metric conforming to the + // "cicd.pipeline.run.active" semantic conventions. It represents the number of + // pipeline runs currently active in the system by state. + // Instrument: updowncounter + // Unit: {run} + // Stability: development + CICDPipelineRunActiveName = "cicd.pipeline.run.active" + CICDPipelineRunActiveUnit = "{run}" + CICDPipelineRunActiveDescription = "The number of pipeline runs currently active in the system by state." + // CICDPipelineRunDuration is the metric conforming to the + // "cicd.pipeline.run.duration" semantic conventions. It represents the + // duration of a pipeline run grouped by pipeline, state and result. + // Instrument: histogram + // Unit: s + // Stability: development + CICDPipelineRunDurationName = "cicd.pipeline.run.duration" + CICDPipelineRunDurationUnit = "s" + CICDPipelineRunDurationDescription = "Duration of a pipeline run grouped by pipeline, state and result." + // CICDPipelineRunErrors is the metric conforming to the + // "cicd.pipeline.run.errors" semantic conventions. It represents the number of + // errors encountered in pipeline runs (eg. compile, test failures). + // Instrument: counter + // Unit: {error} + // Stability: development + CICDPipelineRunErrorsName = "cicd.pipeline.run.errors" + CICDPipelineRunErrorsUnit = "{error}" + CICDPipelineRunErrorsDescription = "The number of errors encountered in pipeline runs (eg. compile, test failures)." + // CICDSystemErrors is the metric conforming to the "cicd.system.errors" + // semantic conventions. It represents the number of errors in a component of + // the CICD system (eg. controller, scheduler, agent). + // Instrument: counter + // Unit: {error} + // Stability: development + CICDSystemErrorsName = "cicd.system.errors" + CICDSystemErrorsUnit = "{error}" + CICDSystemErrorsDescription = "The number of errors in a component of the CICD system (eg. controller, scheduler, agent)." + // CICDWorkerCount is the metric conforming to the "cicd.worker.count" semantic + // conventions. It represents the number of workers on the CICD system by + // state. + // Instrument: updowncounter + // Unit: {count} + // Stability: development + CICDWorkerCountName = "cicd.worker.count" + CICDWorkerCountUnit = "{count}" + CICDWorkerCountDescription = "The number of workers on the CICD system by state." + // ContainerCPUTime is the metric conforming to the "container.cpu.time" + // semantic conventions. It represents the total CPU time consumed. + // Instrument: counter + // Unit: s + // Stability: development + ContainerCPUTimeName = "container.cpu.time" + ContainerCPUTimeUnit = "s" + ContainerCPUTimeDescription = "Total CPU time consumed" + // ContainerCPUUsage is the metric conforming to the "container.cpu.usage" + // semantic conventions. It represents the container's CPU usage, measured in + // cpus. Range from 0 to the number of allocatable CPUs. + // Instrument: gauge + // Unit: {cpu} + // Stability: development + ContainerCPUUsageName = "container.cpu.usage" + ContainerCPUUsageUnit = "{cpu}" + ContainerCPUUsageDescription = "Container's CPU usage, measured in cpus. Range from 0 to the number of allocatable CPUs" + // ContainerDiskIo is the metric conforming to the "container.disk.io" semantic + // conventions. It represents the disk bytes for the container. + // Instrument: counter + // Unit: By + // Stability: development + ContainerDiskIoName = "container.disk.io" + ContainerDiskIoUnit = "By" + ContainerDiskIoDescription = "Disk bytes for the container." + // ContainerMemoryUsage is the metric conforming to the + // "container.memory.usage" semantic conventions. It represents the memory + // usage of the container. + // Instrument: counter + // Unit: By + // Stability: development + ContainerMemoryUsageName = "container.memory.usage" + ContainerMemoryUsageUnit = "By" + ContainerMemoryUsageDescription = "Memory usage of the container." + // ContainerNetworkIo is the metric conforming to the "container.network.io" + // semantic conventions. It represents the network bytes for the container. + // Instrument: counter + // Unit: By + // Stability: development + ContainerNetworkIoName = "container.network.io" + ContainerNetworkIoUnit = "By" + ContainerNetworkIoDescription = "Network bytes for the container." + // ContainerUptime is the metric conforming to the "container.uptime" semantic + // conventions. It represents the time the container has been running. + // Instrument: gauge + // Unit: s + // Stability: development + ContainerUptimeName = "container.uptime" + ContainerUptimeUnit = "s" + ContainerUptimeDescription = "The time the container has been running" + // DBClientConnectionCount is the metric conforming to the + // "db.client.connection.count" semantic conventions. It represents the number + // of connections that are currently in state described by the `state` + // attribute. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + DBClientConnectionCountName = "db.client.connection.count" + DBClientConnectionCountUnit = "{connection}" + DBClientConnectionCountDescription = "The number of connections that are currently in state described by the `state` attribute" + // DBClientConnectionCreateTime is the metric conforming to the + // "db.client.connection.create_time" semantic conventions. It represents the + // time it took to create a new connection. + // Instrument: histogram + // Unit: s + // Stability: development + DBClientConnectionCreateTimeName = "db.client.connection.create_time" + DBClientConnectionCreateTimeUnit = "s" + DBClientConnectionCreateTimeDescription = "The time it took to create a new connection" + // DBClientConnectionIdleMax is the metric conforming to the + // "db.client.connection.idle.max" semantic conventions. It represents the + // maximum number of idle open connections allowed. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + DBClientConnectionIdleMaxName = "db.client.connection.idle.max" + DBClientConnectionIdleMaxUnit = "{connection}" + DBClientConnectionIdleMaxDescription = "The maximum number of idle open connections allowed" + // DBClientConnectionIdleMin is the metric conforming to the + // "db.client.connection.idle.min" semantic conventions. It represents the + // minimum number of idle open connections allowed. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + DBClientConnectionIdleMinName = "db.client.connection.idle.min" + DBClientConnectionIdleMinUnit = "{connection}" + DBClientConnectionIdleMinDescription = "The minimum number of idle open connections allowed" + // DBClientConnectionMax is the metric conforming to the + // "db.client.connection.max" semantic conventions. It represents the maximum + // number of open connections allowed. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + DBClientConnectionMaxName = "db.client.connection.max" + DBClientConnectionMaxUnit = "{connection}" + DBClientConnectionMaxDescription = "The maximum number of open connections allowed" + // DBClientConnectionPendingRequests is the metric conforming to the + // "db.client.connection.pending_requests" semantic conventions. It represents + // the number of current pending requests for an open connection. + // Instrument: updowncounter + // Unit: {request} + // Stability: development + DBClientConnectionPendingRequestsName = "db.client.connection.pending_requests" + DBClientConnectionPendingRequestsUnit = "{request}" + DBClientConnectionPendingRequestsDescription = "The number of current pending requests for an open connection" + // DBClientConnectionTimeouts is the metric conforming to the + // "db.client.connection.timeouts" semantic conventions. It represents the + // number of connection timeouts that have occurred trying to obtain a + // connection from the pool. + // Instrument: counter + // Unit: {timeout} + // Stability: development + DBClientConnectionTimeoutsName = "db.client.connection.timeouts" + DBClientConnectionTimeoutsUnit = "{timeout}" + DBClientConnectionTimeoutsDescription = "The number of connection timeouts that have occurred trying to obtain a connection from the pool" + // DBClientConnectionUseTime is the metric conforming to the + // "db.client.connection.use_time" semantic conventions. It represents the time + // between borrowing a connection and returning it to the pool. + // Instrument: histogram + // Unit: s + // Stability: development + DBClientConnectionUseTimeName = "db.client.connection.use_time" + DBClientConnectionUseTimeUnit = "s" + DBClientConnectionUseTimeDescription = "The time between borrowing a connection and returning it to the pool" + // DBClientConnectionWaitTime is the metric conforming to the + // "db.client.connection.wait_time" semantic conventions. It represents the + // time it took to obtain an open connection from the pool. + // Instrument: histogram + // Unit: s + // Stability: development + DBClientConnectionWaitTimeName = "db.client.connection.wait_time" + DBClientConnectionWaitTimeUnit = "s" + DBClientConnectionWaitTimeDescription = "The time it took to obtain an open connection from the pool" + // DBClientConnectionsCreateTime is the metric conforming to the + // "db.client.connections.create_time" semantic conventions. It represents the + // deprecated, use `db.client.connection.create_time` instead. Note: the unit + // also changed from `ms` to `s`. + // Instrument: histogram + // Unit: ms + // Stability: development + // Deprecated: Replaced by `db.client.connection.create_time`. Note: the unit also changed from `ms` to `s`. + DBClientConnectionsCreateTimeName = "db.client.connections.create_time" + DBClientConnectionsCreateTimeUnit = "ms" + DBClientConnectionsCreateTimeDescription = "Deprecated, use `db.client.connection.create_time` instead. Note: the unit also changed from `ms` to `s`." + // DBClientConnectionsIdleMax is the metric conforming to the + // "db.client.connections.idle.max" semantic conventions. It represents the + // deprecated, use `db.client.connection.idle.max` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + // Deprecated: Replaced by `db.client.connection.idle.max`. + DBClientConnectionsIdleMaxName = "db.client.connections.idle.max" + DBClientConnectionsIdleMaxUnit = "{connection}" + DBClientConnectionsIdleMaxDescription = "Deprecated, use `db.client.connection.idle.max` instead." + // DBClientConnectionsIdleMin is the metric conforming to the + // "db.client.connections.idle.min" semantic conventions. It represents the + // deprecated, use `db.client.connection.idle.min` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + // Deprecated: Replaced by `db.client.connection.idle.min`. + DBClientConnectionsIdleMinName = "db.client.connections.idle.min" + DBClientConnectionsIdleMinUnit = "{connection}" + DBClientConnectionsIdleMinDescription = "Deprecated, use `db.client.connection.idle.min` instead." + // DBClientConnectionsMax is the metric conforming to the + // "db.client.connections.max" semantic conventions. It represents the + // deprecated, use `db.client.connection.max` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + // Deprecated: Replaced by `db.client.connection.max`. + DBClientConnectionsMaxName = "db.client.connections.max" + DBClientConnectionsMaxUnit = "{connection}" + DBClientConnectionsMaxDescription = "Deprecated, use `db.client.connection.max` instead." + // DBClientConnectionsPendingRequests is the metric conforming to the + // "db.client.connections.pending_requests" semantic conventions. It represents + // the deprecated, use `db.client.connection.pending_requests` instead. + // Instrument: updowncounter + // Unit: {request} + // Stability: development + // Deprecated: Replaced by `db.client.connection.pending_requests`. + DBClientConnectionsPendingRequestsName = "db.client.connections.pending_requests" + DBClientConnectionsPendingRequestsUnit = "{request}" + DBClientConnectionsPendingRequestsDescription = "Deprecated, use `db.client.connection.pending_requests` instead." + // DBClientConnectionsTimeouts is the metric conforming to the + // "db.client.connections.timeouts" semantic conventions. It represents the + // deprecated, use `db.client.connection.timeouts` instead. + // Instrument: counter + // Unit: {timeout} + // Stability: development + // Deprecated: Replaced by `db.client.connection.timeouts`. + DBClientConnectionsTimeoutsName = "db.client.connections.timeouts" + DBClientConnectionsTimeoutsUnit = "{timeout}" + DBClientConnectionsTimeoutsDescription = "Deprecated, use `db.client.connection.timeouts` instead." + // DBClientConnectionsUsage is the metric conforming to the + // "db.client.connections.usage" semantic conventions. It represents the + // deprecated, use `db.client.connection.count` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + // Deprecated: Replaced by `db.client.connection.count`. + DBClientConnectionsUsageName = "db.client.connections.usage" + DBClientConnectionsUsageUnit = "{connection}" + DBClientConnectionsUsageDescription = "Deprecated, use `db.client.connection.count` instead." + // DBClientConnectionsUseTime is the metric conforming to the + // "db.client.connections.use_time" semantic conventions. It represents the + // deprecated, use `db.client.connection.use_time` instead. Note: the unit also + // changed from `ms` to `s`. + // Instrument: histogram + // Unit: ms + // Stability: development + // Deprecated: Replaced by `db.client.connection.use_time`. Note: the unit also changed from `ms` to `s`. + DBClientConnectionsUseTimeName = "db.client.connections.use_time" + DBClientConnectionsUseTimeUnit = "ms" + DBClientConnectionsUseTimeDescription = "Deprecated, use `db.client.connection.use_time` instead. Note: the unit also changed from `ms` to `s`." + // DBClientConnectionsWaitTime is the metric conforming to the + // "db.client.connections.wait_time" semantic conventions. It represents the + // deprecated, use `db.client.connection.wait_time` instead. Note: the unit + // also changed from `ms` to `s`. + // Instrument: histogram + // Unit: ms + // Stability: development + // Deprecated: Replaced by `db.client.connection.wait_time`. Note: the unit also changed from `ms` to `s`. + DBClientConnectionsWaitTimeName = "db.client.connections.wait_time" + DBClientConnectionsWaitTimeUnit = "ms" + DBClientConnectionsWaitTimeDescription = "Deprecated, use `db.client.connection.wait_time` instead. Note: the unit also changed from `ms` to `s`." + // DBClientCosmosDBActiveInstanceCount is the metric conforming to the + // "db.client.cosmosdb.active_instance.count" semantic conventions. It + // represents the deprecated, use `azure.cosmosdb.client.active_instance.count` + // instead. + // Instrument: updowncounter + // Unit: {instance} + // Stability: development + // Deprecated: Replaced by `azure.cosmosdb.client.active_instance.count`. + DBClientCosmosDBActiveInstanceCountName = "db.client.cosmosdb.active_instance.count" + DBClientCosmosDBActiveInstanceCountUnit = "{instance}" + DBClientCosmosDBActiveInstanceCountDescription = "Deprecated, use `azure.cosmosdb.client.active_instance.count` instead." + // DBClientCosmosDBOperationRequestCharge is the metric conforming to the + // "db.client.cosmosdb.operation.request_charge" semantic conventions. It + // represents the deprecated, use + // `azure.cosmosdb.client.operation.request_charge` instead. + // Instrument: histogram + // Unit: {request_unit} + // Stability: development + // Deprecated: Replaced by `azure.cosmosdb.client.operation.request_charge`. + DBClientCosmosDBOperationRequestChargeName = "db.client.cosmosdb.operation.request_charge" + DBClientCosmosDBOperationRequestChargeUnit = "{request_unit}" + DBClientCosmosDBOperationRequestChargeDescription = "Deprecated, use `azure.cosmosdb.client.operation.request_charge` instead." + // DBClientOperationDuration is the metric conforming to the + // "db.client.operation.duration" semantic conventions. It represents the + // duration of database client operations. + // Instrument: histogram + // Unit: s + // Stability: release_candidate + DBClientOperationDurationName = "db.client.operation.duration" + DBClientOperationDurationUnit = "s" + DBClientOperationDurationDescription = "Duration of database client operations." + // DBClientResponseReturnedRows is the metric conforming to the + // "db.client.response.returned_rows" semantic conventions. It represents the + // actual number of records returned by the database operation. + // Instrument: histogram + // Unit: {row} + // Stability: development + DBClientResponseReturnedRowsName = "db.client.response.returned_rows" + DBClientResponseReturnedRowsUnit = "{row}" + DBClientResponseReturnedRowsDescription = "The actual number of records returned by the database operation." + // DNSLookupDuration is the metric conforming to the "dns.lookup.duration" + // semantic conventions. It represents the measures the time taken to perform a + // DNS lookup. + // Instrument: histogram + // Unit: s + // Stability: development + DNSLookupDurationName = "dns.lookup.duration" + DNSLookupDurationUnit = "s" + DNSLookupDurationDescription = "Measures the time taken to perform a DNS lookup." + // FaaSColdstarts is the metric conforming to the "faas.coldstarts" semantic + // conventions. It represents the number of invocation cold starts. + // Instrument: counter + // Unit: {coldstart} + // Stability: development + FaaSColdstartsName = "faas.coldstarts" + FaaSColdstartsUnit = "{coldstart}" + FaaSColdstartsDescription = "Number of invocation cold starts" + // FaaSCPUUsage is the metric conforming to the "faas.cpu_usage" semantic + // conventions. It represents the distribution of CPU usage per invocation. + // Instrument: histogram + // Unit: s + // Stability: development + FaaSCPUUsageName = "faas.cpu_usage" + FaaSCPUUsageUnit = "s" + FaaSCPUUsageDescription = "Distribution of CPU usage per invocation" + // FaaSErrors is the metric conforming to the "faas.errors" semantic + // conventions. It represents the number of invocation errors. + // Instrument: counter + // Unit: {error} + // Stability: development + FaaSErrorsName = "faas.errors" + FaaSErrorsUnit = "{error}" + FaaSErrorsDescription = "Number of invocation errors" + // FaaSInitDuration is the metric conforming to the "faas.init_duration" + // semantic conventions. It represents the measures the duration of the + // function's initialization, such as a cold start. + // Instrument: histogram + // Unit: s + // Stability: development + FaaSInitDurationName = "faas.init_duration" + FaaSInitDurationUnit = "s" + FaaSInitDurationDescription = "Measures the duration of the function's initialization, such as a cold start" + // FaaSInvocations is the metric conforming to the "faas.invocations" semantic + // conventions. It represents the number of successful invocations. + // Instrument: counter + // Unit: {invocation} + // Stability: development + FaaSInvocationsName = "faas.invocations" + FaaSInvocationsUnit = "{invocation}" + FaaSInvocationsDescription = "Number of successful invocations" + // FaaSInvokeDuration is the metric conforming to the "faas.invoke_duration" + // semantic conventions. It represents the measures the duration of the + // function's logic execution. + // Instrument: histogram + // Unit: s + // Stability: development + FaaSInvokeDurationName = "faas.invoke_duration" + FaaSInvokeDurationUnit = "s" + FaaSInvokeDurationDescription = "Measures the duration of the function's logic execution" + // FaaSMemUsage is the metric conforming to the "faas.mem_usage" semantic + // conventions. It represents the distribution of max memory usage per + // invocation. + // Instrument: histogram + // Unit: By + // Stability: development + FaaSMemUsageName = "faas.mem_usage" + FaaSMemUsageUnit = "By" + FaaSMemUsageDescription = "Distribution of max memory usage per invocation" + // FaaSNetIo is the metric conforming to the "faas.net_io" semantic + // conventions. It represents the distribution of net I/O usage per invocation. + // Instrument: histogram + // Unit: By + // Stability: development + FaaSNetIoName = "faas.net_io" + FaaSNetIoUnit = "By" + FaaSNetIoDescription = "Distribution of net I/O usage per invocation" + // FaaSTimeouts is the metric conforming to the "faas.timeouts" semantic + // conventions. It represents the number of invocation timeouts. + // Instrument: counter + // Unit: {timeout} + // Stability: development + FaaSTimeoutsName = "faas.timeouts" + FaaSTimeoutsUnit = "{timeout}" + FaaSTimeoutsDescription = "Number of invocation timeouts" + // GenAIClientOperationDuration is the metric conforming to the + // "gen_ai.client.operation.duration" semantic conventions. It represents the + // genAI operation duration. + // Instrument: histogram + // Unit: s + // Stability: development + GenAIClientOperationDurationName = "gen_ai.client.operation.duration" + GenAIClientOperationDurationUnit = "s" + GenAIClientOperationDurationDescription = "GenAI operation duration" + // GenAIClientTokenUsage is the metric conforming to the + // "gen_ai.client.token.usage" semantic conventions. It represents the measures + // number of input and output tokens used. + // Instrument: histogram + // Unit: {token} + // Stability: development + GenAIClientTokenUsageName = "gen_ai.client.token.usage" + GenAIClientTokenUsageUnit = "{token}" + GenAIClientTokenUsageDescription = "Measures number of input and output tokens used" + // GenAIServerRequestDuration is the metric conforming to the + // "gen_ai.server.request.duration" semantic conventions. It represents the + // generative AI server request duration such as time-to-last byte or last + // output token. + // Instrument: histogram + // Unit: s + // Stability: development + GenAIServerRequestDurationName = "gen_ai.server.request.duration" + GenAIServerRequestDurationUnit = "s" + GenAIServerRequestDurationDescription = "Generative AI server request duration such as time-to-last byte or last output token" + // GenAIServerTimePerOutputToken is the metric conforming to the + // "gen_ai.server.time_per_output_token" semantic conventions. It represents + // the time per output token generated after the first token for successful + // responses. + // Instrument: histogram + // Unit: s + // Stability: development + GenAIServerTimePerOutputTokenName = "gen_ai.server.time_per_output_token" + GenAIServerTimePerOutputTokenUnit = "s" + GenAIServerTimePerOutputTokenDescription = "Time per output token generated after the first token for successful responses" + // GenAIServerTimeToFirstToken is the metric conforming to the + // "gen_ai.server.time_to_first_token" semantic conventions. It represents the + // time to generate first token for successful responses. + // Instrument: histogram + // Unit: s + // Stability: development + GenAIServerTimeToFirstTokenName = "gen_ai.server.time_to_first_token" + GenAIServerTimeToFirstTokenUnit = "s" + GenAIServerTimeToFirstTokenDescription = "Time to generate first token for successful responses" + // GoConfigGogc is the metric conforming to the "go.config.gogc" semantic + // conventions. It represents the heap size target percentage configured by the + // user, otherwise 100. + // Instrument: updowncounter + // Unit: % + // Stability: development + GoConfigGogcName = "go.config.gogc" + GoConfigGogcUnit = "%" + GoConfigGogcDescription = "Heap size target percentage configured by the user, otherwise 100." + // GoGoroutineCount is the metric conforming to the "go.goroutine.count" + // semantic conventions. It represents the count of live goroutines. + // Instrument: updowncounter + // Unit: {goroutine} + // Stability: development + GoGoroutineCountName = "go.goroutine.count" + GoGoroutineCountUnit = "{goroutine}" + GoGoroutineCountDescription = "Count of live goroutines." + // GoMemoryAllocated is the metric conforming to the "go.memory.allocated" + // semantic conventions. It represents the memory allocated to the heap by the + // application. + // Instrument: counter + // Unit: By + // Stability: development + GoMemoryAllocatedName = "go.memory.allocated" + GoMemoryAllocatedUnit = "By" + GoMemoryAllocatedDescription = "Memory allocated to the heap by the application." + // GoMemoryAllocations is the metric conforming to the "go.memory.allocations" + // semantic conventions. It represents the count of allocations to the heap by + // the application. + // Instrument: counter + // Unit: {allocation} + // Stability: development + GoMemoryAllocationsName = "go.memory.allocations" + GoMemoryAllocationsUnit = "{allocation}" + GoMemoryAllocationsDescription = "Count of allocations to the heap by the application." + // GoMemoryGCGoal is the metric conforming to the "go.memory.gc.goal" semantic + // conventions. It represents the heap size target for the end of the GC cycle. + // Instrument: updowncounter + // Unit: By + // Stability: development + GoMemoryGCGoalName = "go.memory.gc.goal" + GoMemoryGCGoalUnit = "By" + GoMemoryGCGoalDescription = "Heap size target for the end of the GC cycle." + // GoMemoryLimit is the metric conforming to the "go.memory.limit" semantic + // conventions. It represents the go runtime memory limit configured by the + // user, if a limit exists. + // Instrument: updowncounter + // Unit: By + // Stability: development + GoMemoryLimitName = "go.memory.limit" + GoMemoryLimitUnit = "By" + GoMemoryLimitDescription = "Go runtime memory limit configured by the user, if a limit exists." + // GoMemoryUsed is the metric conforming to the "go.memory.used" semantic + // conventions. It represents the memory used by the Go runtime. + // Instrument: updowncounter + // Unit: By + // Stability: development + GoMemoryUsedName = "go.memory.used" + GoMemoryUsedUnit = "By" + GoMemoryUsedDescription = "Memory used by the Go runtime." + // GoProcessorLimit is the metric conforming to the "go.processor.limit" + // semantic conventions. It represents the number of OS threads that can + // execute user-level Go code simultaneously. + // Instrument: updowncounter + // Unit: {thread} + // Stability: development + GoProcessorLimitName = "go.processor.limit" + GoProcessorLimitUnit = "{thread}" + GoProcessorLimitDescription = "The number of OS threads that can execute user-level Go code simultaneously." + // GoScheduleDuration is the metric conforming to the "go.schedule.duration" + // semantic conventions. It represents the time goroutines have spent in the + // scheduler in a runnable state before actually running. + // Instrument: histogram + // Unit: s + // Stability: development + GoScheduleDurationName = "go.schedule.duration" + GoScheduleDurationUnit = "s" + GoScheduleDurationDescription = "The time goroutines have spent in the scheduler in a runnable state before actually running." + // HTTPClientActiveRequests is the metric conforming to the + // "http.client.active_requests" semantic conventions. It represents the number + // of active HTTP requests. + // Instrument: updowncounter + // Unit: {request} + // Stability: development + HTTPClientActiveRequestsName = "http.client.active_requests" + HTTPClientActiveRequestsUnit = "{request}" + HTTPClientActiveRequestsDescription = "Number of active HTTP requests." + // HTTPClientConnectionDuration is the metric conforming to the + // "http.client.connection.duration" semantic conventions. It represents the + // duration of the successfully established outbound HTTP connections. + // Instrument: histogram + // Unit: s + // Stability: development + HTTPClientConnectionDurationName = "http.client.connection.duration" + HTTPClientConnectionDurationUnit = "s" + HTTPClientConnectionDurationDescription = "The duration of the successfully established outbound HTTP connections." + // HTTPClientOpenConnections is the metric conforming to the + // "http.client.open_connections" semantic conventions. It represents the + // number of outbound HTTP connections that are currently active or idle on the + // client. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + HTTPClientOpenConnectionsName = "http.client.open_connections" + HTTPClientOpenConnectionsUnit = "{connection}" + HTTPClientOpenConnectionsDescription = "Number of outbound HTTP connections that are currently active or idle on the client." + // HTTPClientRequestBodySize is the metric conforming to the + // "http.client.request.body.size" semantic conventions. It represents the size + // of HTTP client request bodies. + // Instrument: histogram + // Unit: By + // Stability: development + HTTPClientRequestBodySizeName = "http.client.request.body.size" + HTTPClientRequestBodySizeUnit = "By" + HTTPClientRequestBodySizeDescription = "Size of HTTP client request bodies." + // HTTPClientRequestDuration is the metric conforming to the + // "http.client.request.duration" semantic conventions. It represents the + // duration of HTTP client requests. + // Instrument: histogram + // Unit: s + // Stability: stable + HTTPClientRequestDurationName = "http.client.request.duration" + HTTPClientRequestDurationUnit = "s" + HTTPClientRequestDurationDescription = "Duration of HTTP client requests." + // HTTPClientResponseBodySize is the metric conforming to the + // "http.client.response.body.size" semantic conventions. It represents the + // size of HTTP client response bodies. + // Instrument: histogram + // Unit: By + // Stability: development + HTTPClientResponseBodySizeName = "http.client.response.body.size" + HTTPClientResponseBodySizeUnit = "By" + HTTPClientResponseBodySizeDescription = "Size of HTTP client response bodies." + // HTTPServerActiveRequests is the metric conforming to the + // "http.server.active_requests" semantic conventions. It represents the number + // of active HTTP server requests. + // Instrument: updowncounter + // Unit: {request} + // Stability: development + HTTPServerActiveRequestsName = "http.server.active_requests" + HTTPServerActiveRequestsUnit = "{request}" + HTTPServerActiveRequestsDescription = "Number of active HTTP server requests." + // HTTPServerRequestBodySize is the metric conforming to the + // "http.server.request.body.size" semantic conventions. It represents the size + // of HTTP server request bodies. + // Instrument: histogram + // Unit: By + // Stability: development + HTTPServerRequestBodySizeName = "http.server.request.body.size" + HTTPServerRequestBodySizeUnit = "By" + HTTPServerRequestBodySizeDescription = "Size of HTTP server request bodies." + // HTTPServerRequestDuration is the metric conforming to the + // "http.server.request.duration" semantic conventions. It represents the + // duration of HTTP server requests. + // Instrument: histogram + // Unit: s + // Stability: stable + HTTPServerRequestDurationName = "http.server.request.duration" + HTTPServerRequestDurationUnit = "s" + HTTPServerRequestDurationDescription = "Duration of HTTP server requests." + // HTTPServerResponseBodySize is the metric conforming to the + // "http.server.response.body.size" semantic conventions. It represents the + // size of HTTP server response bodies. + // Instrument: histogram + // Unit: By + // Stability: development + HTTPServerResponseBodySizeName = "http.server.response.body.size" + HTTPServerResponseBodySizeUnit = "By" + HTTPServerResponseBodySizeDescription = "Size of HTTP server response bodies." + // HwEnergy is the metric conforming to the "hw.energy" semantic conventions. + // It represents the energy consumed by the component. + // Instrument: counter + // Unit: J + // Stability: development + HwEnergyName = "hw.energy" + HwEnergyUnit = "J" + HwEnergyDescription = "Energy consumed by the component" + // HwErrors is the metric conforming to the "hw.errors" semantic conventions. + // It represents the number of errors encountered by the component. + // Instrument: counter + // Unit: {error} + // Stability: development + HwErrorsName = "hw.errors" + HwErrorsUnit = "{error}" + HwErrorsDescription = "Number of errors encountered by the component" + // HwPower is the metric conforming to the "hw.power" semantic conventions. It + // represents the instantaneous power consumed by the component. + // Instrument: gauge + // Unit: W + // Stability: development + HwPowerName = "hw.power" + HwPowerUnit = "W" + HwPowerDescription = "Instantaneous power consumed by the component" + // HwStatus is the metric conforming to the "hw.status" semantic conventions. + // It represents the operational status: `1` (true) or `0` (false) for each of + // the possible states. + // Instrument: updowncounter + // Unit: 1 + // Stability: development + HwStatusName = "hw.status" + HwStatusUnit = "1" + HwStatusDescription = "Operational status: `1` (true) or `0` (false) for each of the possible states" + // K8SCronJobActiveJobs is the metric conforming to the + // "k8s.cronjob.active_jobs" semantic conventions. It represents the number of + // actively running jobs for a cronjob. + // Instrument: updowncounter + // Unit: {job} + // Stability: development + K8SCronJobActiveJobsName = "k8s.cronjob.active_jobs" + K8SCronJobActiveJobsUnit = "{job}" + K8SCronJobActiveJobsDescription = "The number of actively running jobs for a cronjob" + // K8SDaemonSetCurrentScheduledNodes is the metric conforming to the + // "k8s.daemonset.current_scheduled_nodes" semantic conventions. It represents + // the number of nodes that are running at least 1 daemon pod and are supposed + // to run the daemon pod. + // Instrument: updowncounter + // Unit: {node} + // Stability: development + K8SDaemonSetCurrentScheduledNodesName = "k8s.daemonset.current_scheduled_nodes" + K8SDaemonSetCurrentScheduledNodesUnit = "{node}" + K8SDaemonSetCurrentScheduledNodesDescription = "Number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod" + // K8SDaemonSetDesiredScheduledNodes is the metric conforming to the + // "k8s.daemonset.desired_scheduled_nodes" semantic conventions. It represents + // the number of nodes that should be running the daemon pod (including nodes + // currently running the daemon pod). + // Instrument: updowncounter + // Unit: {node} + // Stability: development + K8SDaemonSetDesiredScheduledNodesName = "k8s.daemonset.desired_scheduled_nodes" + K8SDaemonSetDesiredScheduledNodesUnit = "{node}" + K8SDaemonSetDesiredScheduledNodesDescription = "Number of nodes that should be running the daemon pod (including nodes currently running the daemon pod)" + // K8SDaemonSetMisscheduledNodes is the metric conforming to the + // "k8s.daemonset.misscheduled_nodes" semantic conventions. It represents the + // number of nodes that are running the daemon pod, but are not supposed to run + // the daemon pod. + // Instrument: updowncounter + // Unit: {node} + // Stability: development + K8SDaemonSetMisscheduledNodesName = "k8s.daemonset.misscheduled_nodes" + K8SDaemonSetMisscheduledNodesUnit = "{node}" + K8SDaemonSetMisscheduledNodesDescription = "Number of nodes that are running the daemon pod, but are not supposed to run the daemon pod" + // K8SDaemonSetReadyNodes is the metric conforming to the + // "k8s.daemonset.ready_nodes" semantic conventions. It represents the number + // of nodes that should be running the daemon pod and have one or more of the + // daemon pod running and ready. + // Instrument: updowncounter + // Unit: {node} + // Stability: development + K8SDaemonSetReadyNodesName = "k8s.daemonset.ready_nodes" + K8SDaemonSetReadyNodesUnit = "{node}" + K8SDaemonSetReadyNodesDescription = "Number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready" + // K8SDeploymentAvailablePods is the metric conforming to the + // "k8s.deployment.available_pods" semantic conventions. It represents the + // total number of available replica pods (ready for at least minReadySeconds) + // targeted by this deployment. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SDeploymentAvailablePodsName = "k8s.deployment.available_pods" + K8SDeploymentAvailablePodsUnit = "{pod}" + K8SDeploymentAvailablePodsDescription = "Total number of available replica pods (ready for at least minReadySeconds) targeted by this deployment" + // K8SDeploymentDesiredPods is the metric conforming to the + // "k8s.deployment.desired_pods" semantic conventions. It represents the number + // of desired replica pods in this deployment. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SDeploymentDesiredPodsName = "k8s.deployment.desired_pods" + K8SDeploymentDesiredPodsUnit = "{pod}" + K8SDeploymentDesiredPodsDescription = "Number of desired replica pods in this deployment" + // K8SHpaCurrentPods is the metric conforming to the "k8s.hpa.current_pods" + // semantic conventions. It represents the current number of replica pods + // managed by this horizontal pod autoscaler, as last seen by the autoscaler. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SHpaCurrentPodsName = "k8s.hpa.current_pods" + K8SHpaCurrentPodsUnit = "{pod}" + K8SHpaCurrentPodsDescription = "Current number of replica pods managed by this horizontal pod autoscaler, as last seen by the autoscaler" + // K8SHpaDesiredPods is the metric conforming to the "k8s.hpa.desired_pods" + // semantic conventions. It represents the desired number of replica pods + // managed by this horizontal pod autoscaler, as last calculated by the + // autoscaler. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SHpaDesiredPodsName = "k8s.hpa.desired_pods" + K8SHpaDesiredPodsUnit = "{pod}" + K8SHpaDesiredPodsDescription = "Desired number of replica pods managed by this horizontal pod autoscaler, as last calculated by the autoscaler" + // K8SHpaMaxPods is the metric conforming to the "k8s.hpa.max_pods" semantic + // conventions. It represents the upper limit for the number of replica pods to + // which the autoscaler can scale up. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SHpaMaxPodsName = "k8s.hpa.max_pods" + K8SHpaMaxPodsUnit = "{pod}" + K8SHpaMaxPodsDescription = "The upper limit for the number of replica pods to which the autoscaler can scale up" + // K8SHpaMinPods is the metric conforming to the "k8s.hpa.min_pods" semantic + // conventions. It represents the lower limit for the number of replica pods to + // which the autoscaler can scale down. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SHpaMinPodsName = "k8s.hpa.min_pods" + K8SHpaMinPodsUnit = "{pod}" + K8SHpaMinPodsDescription = "The lower limit for the number of replica pods to which the autoscaler can scale down" + // K8SJobActivePods is the metric conforming to the "k8s.job.active_pods" + // semantic conventions. It represents the number of pending and actively + // running pods for a job. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SJobActivePodsName = "k8s.job.active_pods" + K8SJobActivePodsUnit = "{pod}" + K8SJobActivePodsDescription = "The number of pending and actively running pods for a job" + // K8SJobDesiredSuccessfulPods is the metric conforming to the + // "k8s.job.desired_successful_pods" semantic conventions. It represents the + // desired number of successfully finished pods the job should be run with. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SJobDesiredSuccessfulPodsName = "k8s.job.desired_successful_pods" + K8SJobDesiredSuccessfulPodsUnit = "{pod}" + K8SJobDesiredSuccessfulPodsDescription = "The desired number of successfully finished pods the job should be run with" + // K8SJobFailedPods is the metric conforming to the "k8s.job.failed_pods" + // semantic conventions. It represents the number of pods which reached phase + // Failed for a job. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SJobFailedPodsName = "k8s.job.failed_pods" + K8SJobFailedPodsUnit = "{pod}" + K8SJobFailedPodsDescription = "The number of pods which reached phase Failed for a job" + // K8SJobMaxParallelPods is the metric conforming to the + // "k8s.job.max_parallel_pods" semantic conventions. It represents the max + // desired number of pods the job should run at any given time. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SJobMaxParallelPodsName = "k8s.job.max_parallel_pods" + K8SJobMaxParallelPodsUnit = "{pod}" + K8SJobMaxParallelPodsDescription = "The max desired number of pods the job should run at any given time" + // K8SJobSuccessfulPods is the metric conforming to the + // "k8s.job.successful_pods" semantic conventions. It represents the number of + // pods which reached phase Succeeded for a job. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SJobSuccessfulPodsName = "k8s.job.successful_pods" + K8SJobSuccessfulPodsUnit = "{pod}" + K8SJobSuccessfulPodsDescription = "The number of pods which reached phase Succeeded for a job" + // K8SNamespacePhase is the metric conforming to the "k8s.namespace.phase" + // semantic conventions. It represents the describes number of K8s namespaces + // that are currently in a given phase. + // Instrument: updowncounter + // Unit: {namespace} + // Stability: development + K8SNamespacePhaseName = "k8s.namespace.phase" + K8SNamespacePhaseUnit = "{namespace}" + K8SNamespacePhaseDescription = "Describes number of K8s namespaces that are currently in a given phase." + // K8SNodeCPUTime is the metric conforming to the "k8s.node.cpu.time" semantic + // conventions. It represents the total CPU time consumed. + // Instrument: counter + // Unit: s + // Stability: development + K8SNodeCPUTimeName = "k8s.node.cpu.time" + K8SNodeCPUTimeUnit = "s" + K8SNodeCPUTimeDescription = "Total CPU time consumed" + // K8SNodeCPUUsage is the metric conforming to the "k8s.node.cpu.usage" + // semantic conventions. It represents the node's CPU usage, measured in cpus. + // Range from 0 to the number of allocatable CPUs. + // Instrument: gauge + // Unit: {cpu} + // Stability: development + K8SNodeCPUUsageName = "k8s.node.cpu.usage" + K8SNodeCPUUsageUnit = "{cpu}" + K8SNodeCPUUsageDescription = "Node's CPU usage, measured in cpus. Range from 0 to the number of allocatable CPUs" + // K8SNodeMemoryUsage is the metric conforming to the "k8s.node.memory.usage" + // semantic conventions. It represents the memory usage of the Node. + // Instrument: gauge + // Unit: By + // Stability: development + K8SNodeMemoryUsageName = "k8s.node.memory.usage" + K8SNodeMemoryUsageUnit = "By" + K8SNodeMemoryUsageDescription = "Memory usage of the Node" + // K8SNodeNetworkErrors is the metric conforming to the + // "k8s.node.network.errors" semantic conventions. It represents the node + // network errors. + // Instrument: counter + // Unit: {error} + // Stability: development + K8SNodeNetworkErrorsName = "k8s.node.network.errors" + K8SNodeNetworkErrorsUnit = "{error}" + K8SNodeNetworkErrorsDescription = "Node network errors" + // K8SNodeNetworkIo is the metric conforming to the "k8s.node.network.io" + // semantic conventions. It represents the network bytes for the Node. + // Instrument: counter + // Unit: By + // Stability: development + K8SNodeNetworkIoName = "k8s.node.network.io" + K8SNodeNetworkIoUnit = "By" + K8SNodeNetworkIoDescription = "Network bytes for the Node" + // K8SNodeUptime is the metric conforming to the "k8s.node.uptime" semantic + // conventions. It represents the time the Node has been running. + // Instrument: gauge + // Unit: s + // Stability: development + K8SNodeUptimeName = "k8s.node.uptime" + K8SNodeUptimeUnit = "s" + K8SNodeUptimeDescription = "The time the Node has been running" + // K8SPodCPUTime is the metric conforming to the "k8s.pod.cpu.time" semantic + // conventions. It represents the total CPU time consumed. + // Instrument: counter + // Unit: s + // Stability: development + K8SPodCPUTimeName = "k8s.pod.cpu.time" + K8SPodCPUTimeUnit = "s" + K8SPodCPUTimeDescription = "Total CPU time consumed" + // K8SPodCPUUsage is the metric conforming to the "k8s.pod.cpu.usage" semantic + // conventions. It represents the pod's CPU usage, measured in cpus. Range from + // 0 to the number of allocatable CPUs. + // Instrument: gauge + // Unit: {cpu} + // Stability: development + K8SPodCPUUsageName = "k8s.pod.cpu.usage" + K8SPodCPUUsageUnit = "{cpu}" + K8SPodCPUUsageDescription = "Pod's CPU usage, measured in cpus. Range from 0 to the number of allocatable CPUs" + // K8SPodMemoryUsage is the metric conforming to the "k8s.pod.memory.usage" + // semantic conventions. It represents the memory usage of the Pod. + // Instrument: gauge + // Unit: By + // Stability: development + K8SPodMemoryUsageName = "k8s.pod.memory.usage" + K8SPodMemoryUsageUnit = "By" + K8SPodMemoryUsageDescription = "Memory usage of the Pod" + // K8SPodNetworkErrors is the metric conforming to the "k8s.pod.network.errors" + // semantic conventions. It represents the pod network errors. + // Instrument: counter + // Unit: {error} + // Stability: development + K8SPodNetworkErrorsName = "k8s.pod.network.errors" + K8SPodNetworkErrorsUnit = "{error}" + K8SPodNetworkErrorsDescription = "Pod network errors" + // K8SPodNetworkIo is the metric conforming to the "k8s.pod.network.io" + // semantic conventions. It represents the network bytes for the Pod. + // Instrument: counter + // Unit: By + // Stability: development + K8SPodNetworkIoName = "k8s.pod.network.io" + K8SPodNetworkIoUnit = "By" + K8SPodNetworkIoDescription = "Network bytes for the Pod" + // K8SPodUptime is the metric conforming to the "k8s.pod.uptime" semantic + // conventions. It represents the time the Pod has been running. + // Instrument: gauge + // Unit: s + // Stability: development + K8SPodUptimeName = "k8s.pod.uptime" + K8SPodUptimeUnit = "s" + K8SPodUptimeDescription = "The time the Pod has been running" + // K8SReplicaSetAvailablePods is the metric conforming to the + // "k8s.replicaset.available_pods" semantic conventions. It represents the + // total number of available replica pods (ready for at least minReadySeconds) + // targeted by this replicaset. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SReplicaSetAvailablePodsName = "k8s.replicaset.available_pods" + K8SReplicaSetAvailablePodsUnit = "{pod}" + K8SReplicaSetAvailablePodsDescription = "Total number of available replica pods (ready for at least minReadySeconds) targeted by this replicaset" + // K8SReplicaSetDesiredPods is the metric conforming to the + // "k8s.replicaset.desired_pods" semantic conventions. It represents the number + // of desired replica pods in this replicaset. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SReplicaSetDesiredPodsName = "k8s.replicaset.desired_pods" + K8SReplicaSetDesiredPodsUnit = "{pod}" + K8SReplicaSetDesiredPodsDescription = "Number of desired replica pods in this replicaset" + // K8SReplicationControllerAvailablePods is the metric conforming to the + // "k8s.replication_controller.available_pods" semantic conventions. It + // represents the total number of available replica pods (ready for at least + // minReadySeconds) targeted by this replication controller. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SReplicationControllerAvailablePodsName = "k8s.replication_controller.available_pods" + K8SReplicationControllerAvailablePodsUnit = "{pod}" + K8SReplicationControllerAvailablePodsDescription = "Total number of available replica pods (ready for at least minReadySeconds) targeted by this replication controller" + // K8SReplicationControllerDesiredPods is the metric conforming to the + // "k8s.replication_controller.desired_pods" semantic conventions. It + // represents the number of desired replica pods in this replication + // controller. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SReplicationControllerDesiredPodsName = "k8s.replication_controller.desired_pods" + K8SReplicationControllerDesiredPodsUnit = "{pod}" + K8SReplicationControllerDesiredPodsDescription = "Number of desired replica pods in this replication controller" + // K8SStatefulSetCurrentPods is the metric conforming to the + // "k8s.statefulset.current_pods" semantic conventions. It represents the + // number of replica pods created by the statefulset controller from the + // statefulset version indicated by currentRevision. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SStatefulSetCurrentPodsName = "k8s.statefulset.current_pods" + K8SStatefulSetCurrentPodsUnit = "{pod}" + K8SStatefulSetCurrentPodsDescription = "The number of replica pods created by the statefulset controller from the statefulset version indicated by currentRevision" + // K8SStatefulSetDesiredPods is the metric conforming to the + // "k8s.statefulset.desired_pods" semantic conventions. It represents the + // number of desired replica pods in this statefulset. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SStatefulSetDesiredPodsName = "k8s.statefulset.desired_pods" + K8SStatefulSetDesiredPodsUnit = "{pod}" + K8SStatefulSetDesiredPodsDescription = "Number of desired replica pods in this statefulset" + // K8SStatefulSetReadyPods is the metric conforming to the + // "k8s.statefulset.ready_pods" semantic conventions. It represents the number + // of replica pods created for this statefulset with a Ready Condition. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SStatefulSetReadyPodsName = "k8s.statefulset.ready_pods" + K8SStatefulSetReadyPodsUnit = "{pod}" + K8SStatefulSetReadyPodsDescription = "The number of replica pods created for this statefulset with a Ready Condition" + // K8SStatefulSetUpdatedPods is the metric conforming to the + // "k8s.statefulset.updated_pods" semantic conventions. It represents the + // number of replica pods created by the statefulset controller from the + // statefulset version indicated by updateRevision. + // Instrument: updowncounter + // Unit: {pod} + // Stability: development + K8SStatefulSetUpdatedPodsName = "k8s.statefulset.updated_pods" + K8SStatefulSetUpdatedPodsUnit = "{pod}" + K8SStatefulSetUpdatedPodsDescription = "Number of replica pods created by the statefulset controller from the statefulset version indicated by updateRevision" + // KestrelActiveConnections is the metric conforming to the + // "kestrel.active_connections" semantic conventions. It represents the number + // of connections that are currently active on the server. + // Instrument: updowncounter + // Unit: {connection} + // Stability: stable + KestrelActiveConnectionsName = "kestrel.active_connections" + KestrelActiveConnectionsUnit = "{connection}" + KestrelActiveConnectionsDescription = "Number of connections that are currently active on the server." + // KestrelActiveTLSHandshakes is the metric conforming to the + // "kestrel.active_tls_handshakes" semantic conventions. It represents the + // number of TLS handshakes that are currently in progress on the server. + // Instrument: updowncounter + // Unit: {handshake} + // Stability: stable + KestrelActiveTLSHandshakesName = "kestrel.active_tls_handshakes" + KestrelActiveTLSHandshakesUnit = "{handshake}" + KestrelActiveTLSHandshakesDescription = "Number of TLS handshakes that are currently in progress on the server." + // KestrelConnectionDuration is the metric conforming to the + // "kestrel.connection.duration" semantic conventions. It represents the + // duration of connections on the server. + // Instrument: histogram + // Unit: s + // Stability: stable + KestrelConnectionDurationName = "kestrel.connection.duration" + KestrelConnectionDurationUnit = "s" + KestrelConnectionDurationDescription = "The duration of connections on the server." + // KestrelQueuedConnections is the metric conforming to the + // "kestrel.queued_connections" semantic conventions. It represents the number + // of connections that are currently queued and are waiting to start. + // Instrument: updowncounter + // Unit: {connection} + // Stability: stable + KestrelQueuedConnectionsName = "kestrel.queued_connections" + KestrelQueuedConnectionsUnit = "{connection}" + KestrelQueuedConnectionsDescription = "Number of connections that are currently queued and are waiting to start." + // KestrelQueuedRequests is the metric conforming to the + // "kestrel.queued_requests" semantic conventions. It represents the number of + // HTTP requests on multiplexed connections (HTTP/2 and HTTP/3) that are + // currently queued and are waiting to start. + // Instrument: updowncounter + // Unit: {request} + // Stability: stable + KestrelQueuedRequestsName = "kestrel.queued_requests" + KestrelQueuedRequestsUnit = "{request}" + KestrelQueuedRequestsDescription = "Number of HTTP requests on multiplexed connections (HTTP/2 and HTTP/3) that are currently queued and are waiting to start." + // KestrelRejectedConnections is the metric conforming to the + // "kestrel.rejected_connections" semantic conventions. It represents the + // number of connections rejected by the server. + // Instrument: counter + // Unit: {connection} + // Stability: stable + KestrelRejectedConnectionsName = "kestrel.rejected_connections" + KestrelRejectedConnectionsUnit = "{connection}" + KestrelRejectedConnectionsDescription = "Number of connections rejected by the server." + // KestrelTLSHandshakeDuration is the metric conforming to the + // "kestrel.tls_handshake.duration" semantic conventions. It represents the + // duration of TLS handshakes on the server. + // Instrument: histogram + // Unit: s + // Stability: stable + KestrelTLSHandshakeDurationName = "kestrel.tls_handshake.duration" + KestrelTLSHandshakeDurationUnit = "s" + KestrelTLSHandshakeDurationDescription = "The duration of TLS handshakes on the server." + // KestrelUpgradedConnections is the metric conforming to the + // "kestrel.upgraded_connections" semantic conventions. It represents the + // number of connections that are currently upgraded (WebSockets). . + // Instrument: updowncounter + // Unit: {connection} + // Stability: stable + KestrelUpgradedConnectionsName = "kestrel.upgraded_connections" + KestrelUpgradedConnectionsUnit = "{connection}" + KestrelUpgradedConnectionsDescription = "Number of connections that are currently upgraded (WebSockets). ." + // MessagingClientConsumedMessages is the metric conforming to the + // "messaging.client.consumed.messages" semantic conventions. It represents the + // number of messages that were delivered to the application. + // Instrument: counter + // Unit: {message} + // Stability: development + MessagingClientConsumedMessagesName = "messaging.client.consumed.messages" + MessagingClientConsumedMessagesUnit = "{message}" + MessagingClientConsumedMessagesDescription = "Number of messages that were delivered to the application." + // MessagingClientOperationDuration is the metric conforming to the + // "messaging.client.operation.duration" semantic conventions. It represents + // the duration of messaging operation initiated by a producer or consumer + // client. + // Instrument: histogram + // Unit: s + // Stability: development + MessagingClientOperationDurationName = "messaging.client.operation.duration" + MessagingClientOperationDurationUnit = "s" + MessagingClientOperationDurationDescription = "Duration of messaging operation initiated by a producer or consumer client." + // MessagingClientPublishedMessages is the metric conforming to the + // "messaging.client.published.messages" semantic conventions. It represents + // the deprecated. Use `messaging.client.sent.messages` instead. + // Instrument: counter + // Unit: {message} + // Stability: development + // Deprecated: Replaced by `messaging.client.sent.messages`. + MessagingClientPublishedMessagesName = "messaging.client.published.messages" + MessagingClientPublishedMessagesUnit = "{message}" + MessagingClientPublishedMessagesDescription = "Deprecated. Use `messaging.client.sent.messages` instead." + // MessagingClientSentMessages is the metric conforming to the + // "messaging.client.sent.messages" semantic conventions. It represents the + // number of messages producer attempted to send to the broker. + // Instrument: counter + // Unit: {message} + // Stability: development + MessagingClientSentMessagesName = "messaging.client.sent.messages" + MessagingClientSentMessagesUnit = "{message}" + MessagingClientSentMessagesDescription = "Number of messages producer attempted to send to the broker." + // MessagingProcessDuration is the metric conforming to the + // "messaging.process.duration" semantic conventions. It represents the + // duration of processing operation. + // Instrument: histogram + // Unit: s + // Stability: development + MessagingProcessDurationName = "messaging.process.duration" + MessagingProcessDurationUnit = "s" + MessagingProcessDurationDescription = "Duration of processing operation." + // MessagingProcessMessages is the metric conforming to the + // "messaging.process.messages" semantic conventions. It represents the + // deprecated. Use `messaging.client.consumed.messages` instead. + // Instrument: counter + // Unit: {message} + // Stability: development + // Deprecated: Replaced by `messaging.client.consumed.messages`. + MessagingProcessMessagesName = "messaging.process.messages" + MessagingProcessMessagesUnit = "{message}" + MessagingProcessMessagesDescription = "Deprecated. Use `messaging.client.consumed.messages` instead." + // MessagingPublishDuration is the metric conforming to the + // "messaging.publish.duration" semantic conventions. It represents the + // deprecated. Use `messaging.client.operation.duration` instead. + // Instrument: histogram + // Unit: s + // Stability: development + // Deprecated: Replaced by `messaging.client.operation.duration`. + MessagingPublishDurationName = "messaging.publish.duration" + MessagingPublishDurationUnit = "s" + MessagingPublishDurationDescription = "Deprecated. Use `messaging.client.operation.duration` instead." + // MessagingPublishMessages is the metric conforming to the + // "messaging.publish.messages" semantic conventions. It represents the + // deprecated. Use `messaging.client.produced.messages` instead. + // Instrument: counter + // Unit: {message} + // Stability: development + // Deprecated: Replaced by `messaging.client.produced.messages`. + MessagingPublishMessagesName = "messaging.publish.messages" + MessagingPublishMessagesUnit = "{message}" + MessagingPublishMessagesDescription = "Deprecated. Use `messaging.client.produced.messages` instead." + // MessagingReceiveDuration is the metric conforming to the + // "messaging.receive.duration" semantic conventions. It represents the + // deprecated. Use `messaging.client.operation.duration` instead. + // Instrument: histogram + // Unit: s + // Stability: development + // Deprecated: Replaced by `messaging.client.operation.duration`. + MessagingReceiveDurationName = "messaging.receive.duration" + MessagingReceiveDurationUnit = "s" + MessagingReceiveDurationDescription = "Deprecated. Use `messaging.client.operation.duration` instead." + // MessagingReceiveMessages is the metric conforming to the + // "messaging.receive.messages" semantic conventions. It represents the + // deprecated. Use `messaging.client.consumed.messages` instead. + // Instrument: counter + // Unit: {message} + // Stability: development + // Deprecated: Replaced by `messaging.client.consumed.messages`. + MessagingReceiveMessagesName = "messaging.receive.messages" + MessagingReceiveMessagesUnit = "{message}" + MessagingReceiveMessagesDescription = "Deprecated. Use `messaging.client.consumed.messages` instead." + // ProcessContextSwitches is the metric conforming to the + // "process.context_switches" semantic conventions. It represents the number of + // times the process has been context switched. + // Instrument: counter + // Unit: {count} + // Stability: development + ProcessContextSwitchesName = "process.context_switches" + ProcessContextSwitchesUnit = "{count}" + ProcessContextSwitchesDescription = "Number of times the process has been context switched." + // ProcessCPUTime is the metric conforming to the "process.cpu.time" semantic + // conventions. It represents the total CPU seconds broken down by different + // states. + // Instrument: counter + // Unit: s + // Stability: development + ProcessCPUTimeName = "process.cpu.time" + ProcessCPUTimeUnit = "s" + ProcessCPUTimeDescription = "Total CPU seconds broken down by different states." + // ProcessCPUUtilization is the metric conforming to the + // "process.cpu.utilization" semantic conventions. It represents the difference + // in process.cpu.time since the last measurement, divided by the elapsed time + // and number of CPUs available to the process. + // Instrument: gauge + // Unit: 1 + // Stability: development + ProcessCPUUtilizationName = "process.cpu.utilization" + ProcessCPUUtilizationUnit = "1" + ProcessCPUUtilizationDescription = "Difference in process.cpu.time since the last measurement, divided by the elapsed time and number of CPUs available to the process." + // ProcessDiskIo is the metric conforming to the "process.disk.io" semantic + // conventions. It represents the disk bytes transferred. + // Instrument: counter + // Unit: By + // Stability: development + ProcessDiskIoName = "process.disk.io" + ProcessDiskIoUnit = "By" + ProcessDiskIoDescription = "Disk bytes transferred." + // ProcessMemoryUsage is the metric conforming to the "process.memory.usage" + // semantic conventions. It represents the amount of physical memory in use. + // Instrument: updowncounter + // Unit: By + // Stability: development + ProcessMemoryUsageName = "process.memory.usage" + ProcessMemoryUsageUnit = "By" + ProcessMemoryUsageDescription = "The amount of physical memory in use." + // ProcessMemoryVirtual is the metric conforming to the + // "process.memory.virtual" semantic conventions. It represents the amount of + // committed virtual memory. + // Instrument: updowncounter + // Unit: By + // Stability: development + ProcessMemoryVirtualName = "process.memory.virtual" + ProcessMemoryVirtualUnit = "By" + ProcessMemoryVirtualDescription = "The amount of committed virtual memory." + // ProcessNetworkIo is the metric conforming to the "process.network.io" + // semantic conventions. It represents the network bytes transferred. + // Instrument: counter + // Unit: By + // Stability: development + ProcessNetworkIoName = "process.network.io" + ProcessNetworkIoUnit = "By" + ProcessNetworkIoDescription = "Network bytes transferred." + // ProcessOpenFileDescriptorCount is the metric conforming to the + // "process.open_file_descriptor.count" semantic conventions. It represents the + // number of file descriptors in use by the process. + // Instrument: updowncounter + // Unit: {count} + // Stability: development + ProcessOpenFileDescriptorCountName = "process.open_file_descriptor.count" + ProcessOpenFileDescriptorCountUnit = "{count}" + ProcessOpenFileDescriptorCountDescription = "Number of file descriptors in use by the process." + // ProcessPagingFaults is the metric conforming to the "process.paging.faults" + // semantic conventions. It represents the number of page faults the process + // has made. + // Instrument: counter + // Unit: {fault} + // Stability: development + ProcessPagingFaultsName = "process.paging.faults" + ProcessPagingFaultsUnit = "{fault}" + ProcessPagingFaultsDescription = "Number of page faults the process has made." + // ProcessThreadCount is the metric conforming to the "process.thread.count" + // semantic conventions. It represents the process threads count. + // Instrument: updowncounter + // Unit: {thread} + // Stability: development + ProcessThreadCountName = "process.thread.count" + ProcessThreadCountUnit = "{thread}" + ProcessThreadCountDescription = "Process threads count." + // ProcessUptime is the metric conforming to the "process.uptime" semantic + // conventions. It represents the time the process has been running. + // Instrument: gauge + // Unit: s + // Stability: development + ProcessUptimeName = "process.uptime" + ProcessUptimeUnit = "s" + ProcessUptimeDescription = "The time the process has been running." + // RPCClientDuration is the metric conforming to the "rpc.client.duration" + // semantic conventions. It represents the measures the duration of outbound + // RPC. + // Instrument: histogram + // Unit: ms + // Stability: development + RPCClientDurationName = "rpc.client.duration" + RPCClientDurationUnit = "ms" + RPCClientDurationDescription = "Measures the duration of outbound RPC." + // RPCClientRequestSize is the metric conforming to the + // "rpc.client.request.size" semantic conventions. It represents the measures + // the size of RPC request messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: development + RPCClientRequestSizeName = "rpc.client.request.size" + RPCClientRequestSizeUnit = "By" + RPCClientRequestSizeDescription = "Measures the size of RPC request messages (uncompressed)." + // RPCClientRequestsPerRPC is the metric conforming to the + // "rpc.client.requests_per_rpc" semantic conventions. It represents the + // measures the number of messages received per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: development + RPCClientRequestsPerRPCName = "rpc.client.requests_per_rpc" + RPCClientRequestsPerRPCUnit = "{count}" + RPCClientRequestsPerRPCDescription = "Measures the number of messages received per RPC." + // RPCClientResponseSize is the metric conforming to the + // "rpc.client.response.size" semantic conventions. It represents the measures + // the size of RPC response messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: development + RPCClientResponseSizeName = "rpc.client.response.size" + RPCClientResponseSizeUnit = "By" + RPCClientResponseSizeDescription = "Measures the size of RPC response messages (uncompressed)." + // RPCClientResponsesPerRPC is the metric conforming to the + // "rpc.client.responses_per_rpc" semantic conventions. It represents the + // measures the number of messages sent per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: development + RPCClientResponsesPerRPCName = "rpc.client.responses_per_rpc" + RPCClientResponsesPerRPCUnit = "{count}" + RPCClientResponsesPerRPCDescription = "Measures the number of messages sent per RPC." + // RPCServerDuration is the metric conforming to the "rpc.server.duration" + // semantic conventions. It represents the measures the duration of inbound + // RPC. + // Instrument: histogram + // Unit: ms + // Stability: development + RPCServerDurationName = "rpc.server.duration" + RPCServerDurationUnit = "ms" + RPCServerDurationDescription = "Measures the duration of inbound RPC." + // RPCServerRequestSize is the metric conforming to the + // "rpc.server.request.size" semantic conventions. It represents the measures + // the size of RPC request messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: development + RPCServerRequestSizeName = "rpc.server.request.size" + RPCServerRequestSizeUnit = "By" + RPCServerRequestSizeDescription = "Measures the size of RPC request messages (uncompressed)." + // RPCServerRequestsPerRPC is the metric conforming to the + // "rpc.server.requests_per_rpc" semantic conventions. It represents the + // measures the number of messages received per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: development + RPCServerRequestsPerRPCName = "rpc.server.requests_per_rpc" + RPCServerRequestsPerRPCUnit = "{count}" + RPCServerRequestsPerRPCDescription = "Measures the number of messages received per RPC." + // RPCServerResponseSize is the metric conforming to the + // "rpc.server.response.size" semantic conventions. It represents the measures + // the size of RPC response messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: development + RPCServerResponseSizeName = "rpc.server.response.size" + RPCServerResponseSizeUnit = "By" + RPCServerResponseSizeDescription = "Measures the size of RPC response messages (uncompressed)." + // RPCServerResponsesPerRPC is the metric conforming to the + // "rpc.server.responses_per_rpc" semantic conventions. It represents the + // measures the number of messages sent per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: development + RPCServerResponsesPerRPCName = "rpc.server.responses_per_rpc" + RPCServerResponsesPerRPCUnit = "{count}" + RPCServerResponsesPerRPCDescription = "Measures the number of messages sent per RPC." + // SignalrServerActiveConnections is the metric conforming to the + // "signalr.server.active_connections" semantic conventions. It represents the + // number of connections that are currently active on the server. + // Instrument: updowncounter + // Unit: {connection} + // Stability: stable + SignalrServerActiveConnectionsName = "signalr.server.active_connections" + SignalrServerActiveConnectionsUnit = "{connection}" + SignalrServerActiveConnectionsDescription = "Number of connections that are currently active on the server." + // SignalrServerConnectionDuration is the metric conforming to the + // "signalr.server.connection.duration" semantic conventions. It represents the + // duration of connections on the server. + // Instrument: histogram + // Unit: s + // Stability: stable + SignalrServerConnectionDurationName = "signalr.server.connection.duration" + SignalrServerConnectionDurationUnit = "s" + SignalrServerConnectionDurationDescription = "The duration of connections on the server." + // SystemCPUFrequency is the metric conforming to the "system.cpu.frequency" + // semantic conventions. It represents the reports the current frequency of the + // CPU in Hz. + // Instrument: gauge + // Unit: {Hz} + // Stability: development + SystemCPUFrequencyName = "system.cpu.frequency" + SystemCPUFrequencyUnit = "{Hz}" + SystemCPUFrequencyDescription = "Reports the current frequency of the CPU in Hz" + // SystemCPULogicalCount is the metric conforming to the + // "system.cpu.logical.count" semantic conventions. It represents the reports + // the number of logical (virtual) processor cores created by the operating + // system to manage multitasking. + // Instrument: updowncounter + // Unit: {cpu} + // Stability: development + SystemCPULogicalCountName = "system.cpu.logical.count" + SystemCPULogicalCountUnit = "{cpu}" + SystemCPULogicalCountDescription = "Reports the number of logical (virtual) processor cores created by the operating system to manage multitasking" + // SystemCPUPhysicalCount is the metric conforming to the + // "system.cpu.physical.count" semantic conventions. It represents the reports + // the number of actual physical processor cores on the hardware. + // Instrument: updowncounter + // Unit: {cpu} + // Stability: development + SystemCPUPhysicalCountName = "system.cpu.physical.count" + SystemCPUPhysicalCountUnit = "{cpu}" + SystemCPUPhysicalCountDescription = "Reports the number of actual physical processor cores on the hardware" + // SystemCPUTime is the metric conforming to the "system.cpu.time" semantic + // conventions. It represents the seconds each logical CPU spent on each mode. + // Instrument: counter + // Unit: s + // Stability: development + SystemCPUTimeName = "system.cpu.time" + SystemCPUTimeUnit = "s" + SystemCPUTimeDescription = "Seconds each logical CPU spent on each mode" + // SystemCPUUtilization is the metric conforming to the + // "system.cpu.utilization" semantic conventions. It represents the difference + // in system.cpu.time since the last measurement, divided by the elapsed time + // and number of logical CPUs. + // Instrument: gauge + // Unit: 1 + // Stability: development + SystemCPUUtilizationName = "system.cpu.utilization" + SystemCPUUtilizationUnit = "1" + SystemCPUUtilizationDescription = "Difference in system.cpu.time since the last measurement, divided by the elapsed time and number of logical CPUs" + // SystemDiskIo is the metric conforming to the "system.disk.io" semantic + // conventions. + // Instrument: counter + // Unit: By + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemDiskIoName = "system.disk.io" + SystemDiskIoUnit = "By" + // SystemDiskIoTime is the metric conforming to the "system.disk.io_time" + // semantic conventions. It represents the time disk spent activated. + // Instrument: counter + // Unit: s + // Stability: development + SystemDiskIoTimeName = "system.disk.io_time" + SystemDiskIoTimeUnit = "s" + SystemDiskIoTimeDescription = "Time disk spent activated" + // SystemDiskLimit is the metric conforming to the "system.disk.limit" semantic + // conventions. It represents the total storage capacity of the disk. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemDiskLimitName = "system.disk.limit" + SystemDiskLimitUnit = "By" + SystemDiskLimitDescription = "The total storage capacity of the disk" + // SystemDiskMerged is the metric conforming to the "system.disk.merged" + // semantic conventions. + // Instrument: counter + // Unit: {operation} + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemDiskMergedName = "system.disk.merged" + SystemDiskMergedUnit = "{operation}" + // SystemDiskOperationTime is the metric conforming to the + // "system.disk.operation_time" semantic conventions. It represents the sum of + // the time each operation took to complete. + // Instrument: counter + // Unit: s + // Stability: development + SystemDiskOperationTimeName = "system.disk.operation_time" + SystemDiskOperationTimeUnit = "s" + SystemDiskOperationTimeDescription = "Sum of the time each operation took to complete" + // SystemDiskOperations is the metric conforming to the + // "system.disk.operations" semantic conventions. + // Instrument: counter + // Unit: {operation} + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemDiskOperationsName = "system.disk.operations" + SystemDiskOperationsUnit = "{operation}" + // SystemFilesystemLimit is the metric conforming to the + // "system.filesystem.limit" semantic conventions. It represents the total + // storage capacity of the filesystem. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemFilesystemLimitName = "system.filesystem.limit" + SystemFilesystemLimitUnit = "By" + SystemFilesystemLimitDescription = "The total storage capacity of the filesystem" + // SystemFilesystemUsage is the metric conforming to the + // "system.filesystem.usage" semantic conventions. It represents the reports a + // filesystem's space usage across different states. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemFilesystemUsageName = "system.filesystem.usage" + SystemFilesystemUsageUnit = "By" + SystemFilesystemUsageDescription = "Reports a filesystem's space usage across different states." + // SystemFilesystemUtilization is the metric conforming to the + // "system.filesystem.utilization" semantic conventions. + // Instrument: gauge + // Unit: 1 + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemFilesystemUtilizationName = "system.filesystem.utilization" + SystemFilesystemUtilizationUnit = "1" + // SystemLinuxMemoryAvailable is the metric conforming to the + // "system.linux.memory.available" semantic conventions. It represents an + // estimate of how much memory is available for starting new applications, + // without causing swapping. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemLinuxMemoryAvailableName = "system.linux.memory.available" + SystemLinuxMemoryAvailableUnit = "By" + SystemLinuxMemoryAvailableDescription = "An estimate of how much memory is available for starting new applications, without causing swapping" + // SystemLinuxMemorySlabUsage is the metric conforming to the + // "system.linux.memory.slab.usage" semantic conventions. It represents the + // reports the memory used by the Linux kernel for managing caches of + // frequently used objects. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemLinuxMemorySlabUsageName = "system.linux.memory.slab.usage" + SystemLinuxMemorySlabUsageUnit = "By" + SystemLinuxMemorySlabUsageDescription = "Reports the memory used by the Linux kernel for managing caches of frequently used objects." + // SystemMemoryLimit is the metric conforming to the "system.memory.limit" + // semantic conventions. It represents the total memory available in the + // system. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemMemoryLimitName = "system.memory.limit" + SystemMemoryLimitUnit = "By" + SystemMemoryLimitDescription = "Total memory available in the system." + // SystemMemoryShared is the metric conforming to the "system.memory.shared" + // semantic conventions. It represents the shared memory used (mostly by + // tmpfs). + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemMemorySharedName = "system.memory.shared" + SystemMemorySharedUnit = "By" + SystemMemorySharedDescription = "Shared memory used (mostly by tmpfs)." + // SystemMemoryUsage is the metric conforming to the "system.memory.usage" + // semantic conventions. It represents the reports memory in use by state. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemMemoryUsageName = "system.memory.usage" + SystemMemoryUsageUnit = "By" + SystemMemoryUsageDescription = "Reports memory in use by state." + // SystemMemoryUtilization is the metric conforming to the + // "system.memory.utilization" semantic conventions. + // Instrument: gauge + // Unit: 1 + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemMemoryUtilizationName = "system.memory.utilization" + SystemMemoryUtilizationUnit = "1" + // SystemNetworkConnections is the metric conforming to the + // "system.network.connections" semantic conventions. + // Instrument: updowncounter + // Unit: {connection} + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemNetworkConnectionsName = "system.network.connections" + SystemNetworkConnectionsUnit = "{connection}" + // SystemNetworkDropped is the metric conforming to the + // "system.network.dropped" semantic conventions. It represents the count of + // packets that are dropped or discarded even though there was no error. + // Instrument: counter + // Unit: {packet} + // Stability: development + SystemNetworkDroppedName = "system.network.dropped" + SystemNetworkDroppedUnit = "{packet}" + SystemNetworkDroppedDescription = "Count of packets that are dropped or discarded even though there was no error" + // SystemNetworkErrors is the metric conforming to the "system.network.errors" + // semantic conventions. It represents the count of network errors detected. + // Instrument: counter + // Unit: {error} + // Stability: development + SystemNetworkErrorsName = "system.network.errors" + SystemNetworkErrorsUnit = "{error}" + SystemNetworkErrorsDescription = "Count of network errors detected" + // SystemNetworkIo is the metric conforming to the "system.network.io" semantic + // conventions. + // Instrument: counter + // Unit: By + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemNetworkIoName = "system.network.io" + SystemNetworkIoUnit = "By" + // SystemNetworkPackets is the metric conforming to the + // "system.network.packets" semantic conventions. + // Instrument: counter + // Unit: {packet} + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemNetworkPacketsName = "system.network.packets" + SystemNetworkPacketsUnit = "{packet}" + // SystemPagingFaults is the metric conforming to the "system.paging.faults" + // semantic conventions. + // Instrument: counter + // Unit: {fault} + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemPagingFaultsName = "system.paging.faults" + SystemPagingFaultsUnit = "{fault}" + // SystemPagingOperations is the metric conforming to the + // "system.paging.operations" semantic conventions. + // Instrument: counter + // Unit: {operation} + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemPagingOperationsName = "system.paging.operations" + SystemPagingOperationsUnit = "{operation}" + // SystemPagingUsage is the metric conforming to the "system.paging.usage" + // semantic conventions. It represents the unix swap or windows pagefile usage. + // Instrument: updowncounter + // Unit: By + // Stability: development + SystemPagingUsageName = "system.paging.usage" + SystemPagingUsageUnit = "By" + SystemPagingUsageDescription = "Unix swap or windows pagefile usage" + // SystemPagingUtilization is the metric conforming to the + // "system.paging.utilization" semantic conventions. + // Instrument: gauge + // Unit: 1 + // Stability: development + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemPagingUtilizationName = "system.paging.utilization" + SystemPagingUtilizationUnit = "1" + // SystemProcessCount is the metric conforming to the "system.process.count" + // semantic conventions. It represents the total number of processes in each + // state. + // Instrument: updowncounter + // Unit: {process} + // Stability: development + SystemProcessCountName = "system.process.count" + SystemProcessCountUnit = "{process}" + SystemProcessCountDescription = "Total number of processes in each state" + // SystemProcessCreated is the metric conforming to the + // "system.process.created" semantic conventions. It represents the total + // number of processes created over uptime of the host. + // Instrument: counter + // Unit: {process} + // Stability: development + SystemProcessCreatedName = "system.process.created" + SystemProcessCreatedUnit = "{process}" + SystemProcessCreatedDescription = "Total number of processes created over uptime of the host" + // SystemUptime is the metric conforming to the "system.uptime" semantic + // conventions. It represents the time the system has been running. + // Instrument: gauge + // Unit: s + // Stability: development + SystemUptimeName = "system.uptime" + SystemUptimeUnit = "s" + SystemUptimeDescription = "The time the system has been running" + // VCSChangeCount is the metric conforming to the "vcs.change.count" semantic + // conventions. It represents the number of changes (pull requests/merge + // requests/changelists) in a repository, categorized by their state (e.g. open + // or merged). + // Instrument: updowncounter + // Unit: {change} + // Stability: development + VCSChangeCountName = "vcs.change.count" + VCSChangeCountUnit = "{change}" + VCSChangeCountDescription = "The number of changes (pull requests/merge requests/changelists) in a repository, categorized by their state (e.g. open or merged)" + // VCSChangeDuration is the metric conforming to the "vcs.change.duration" + // semantic conventions. It represents the time duration a change (pull + // request/merge request/changelist) has been in a given state. + // Instrument: gauge + // Unit: s + // Stability: development + VCSChangeDurationName = "vcs.change.duration" + VCSChangeDurationUnit = "s" + VCSChangeDurationDescription = "The time duration a change (pull request/merge request/changelist) has been in a given state." + // VCSChangeTimeToApproval is the metric conforming to the + // "vcs.change.time_to_approval" semantic conventions. It represents the amount + // of time since its creation it took a change (pull request/merge + // request/changelist) to get the first approval. + // Instrument: gauge + // Unit: s + // Stability: development + VCSChangeTimeToApprovalName = "vcs.change.time_to_approval" + VCSChangeTimeToApprovalUnit = "s" + VCSChangeTimeToApprovalDescription = "The amount of time since its creation it took a change (pull request/merge request/changelist) to get the first approval." + // VCSChangeTimeToMerge is the metric conforming to the + // "vcs.change.time_to_merge" semantic conventions. It represents the amount of + // time since its creation it took a change (pull request/merge + // request/changelist) to get merged into the target(base) ref. + // Instrument: gauge + // Unit: s + // Stability: development + VCSChangeTimeToMergeName = "vcs.change.time_to_merge" + VCSChangeTimeToMergeUnit = "s" + VCSChangeTimeToMergeDescription = "The amount of time since its creation it took a change (pull request/merge request/changelist) to get merged into the target(base) ref." + // VCSContributorCount is the metric conforming to the "vcs.contributor.count" + // semantic conventions. It represents the number of unique contributors to a + // repository. + // Instrument: gauge + // Unit: {contributor} + // Stability: development + VCSContributorCountName = "vcs.contributor.count" + VCSContributorCountUnit = "{contributor}" + VCSContributorCountDescription = "The number of unique contributors to a repository" + // VCSRefCount is the metric conforming to the "vcs.ref.count" semantic + // conventions. It represents the number of refs of type branch or tag in a + // repository. + // Instrument: updowncounter + // Unit: {ref} + // Stability: development + VCSRefCountName = "vcs.ref.count" + VCSRefCountUnit = "{ref}" + VCSRefCountDescription = "The number of refs of type branch or tag in a repository." + // VCSRefLinesDelta is the metric conforming to the "vcs.ref.lines_delta" + // semantic conventions. It represents the number of lines added/removed in a + // ref (branch) relative to the ref from the `vcs.ref.base.name` attribute. + // Instrument: gauge + // Unit: {line} + // Stability: development + VCSRefLinesDeltaName = "vcs.ref.lines_delta" + VCSRefLinesDeltaUnit = "{line}" + VCSRefLinesDeltaDescription = "The number of lines added/removed in a ref (branch) relative to the ref from the `vcs.ref.base.name` attribute." + // VCSRefRevisionsDelta is the metric conforming to the + // "vcs.ref.revisions_delta" semantic conventions. It represents the number of + // revisions (commits) a ref (branch) is ahead/behind the branch from the + // `vcs.ref.base.name` attribute. + // Instrument: gauge + // Unit: {revision} + // Stability: development + VCSRefRevisionsDeltaName = "vcs.ref.revisions_delta" + VCSRefRevisionsDeltaUnit = "{revision}" + VCSRefRevisionsDeltaDescription = "The number of revisions (commits) a ref (branch) is ahead/behind the branch from the `vcs.ref.base.name` attribute" + // VCSRefTime is the metric conforming to the "vcs.ref.time" semantic + // conventions. It represents the time a ref (branch) created from the default + // branch (trunk) has existed. The `ref.type` attribute will always be `branch` + // . + // Instrument: gauge + // Unit: s + // Stability: development + VCSRefTimeName = "vcs.ref.time" + VCSRefTimeUnit = "s" + VCSRefTimeDescription = "Time a ref (branch) created from the default branch (trunk) has existed. The `ref.type` attribute will always be `branch`" + // VCSRepositoryCount is the metric conforming to the "vcs.repository.count" + // semantic conventions. It represents the number of repositories in an + // organization. + // Instrument: updowncounter + // Unit: {repository} + // Stability: development + VCSRepositoryCountName = "vcs.repository.count" + VCSRepositoryCountUnit = "{repository}" + VCSRepositoryCountDescription = "The number of repositories in an organization." +) \ No newline at end of file diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/schema.go b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/schema.go new file mode 100644 index 0000000000..b2e7a515ac --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.30.0/schema.go @@ -0,0 +1,9 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.30.0" + +// SchemaURL is the schema URL that matches the version of the semantic conventions +// that this package defines. Semconv packages starting from v1.4.0 must declare +// non-empty schema URL in the form https://opentelemetry.io/schemas/ +const SchemaURL = "https://opentelemetry.io/schemas/1.30.0" diff --git a/vendor/go.yaml.in/yaml/v3/LICENSE b/vendor/go.yaml.in/yaml/v3/LICENSE new file mode 100644 index 0000000000..2683e4bb1f --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/LICENSE @@ -0,0 +1,50 @@ + +This project is covered by two different licenses: MIT and Apache. + +#### MIT License #### + +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original MIT license, with the additional +copyright staring in 2011 when the project was ported over: + + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go + +Copyright (c) 2006-2010 Kirill Simonov +Copyright (c) 2006-2011 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +### Apache License ### + +All the remaining project files are covered by the Apache license: + +Copyright (c) 2011-2019 Canonical Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/k8s.io/client-go/listers/networking/v1alpha1/expansion_generated.go b/vendor/go.yaml.in/yaml/v3/NOTICE similarity index 58% rename from vendor/k8s.io/client-go/listers/networking/v1alpha1/expansion_generated.go rename to vendor/go.yaml.in/yaml/v3/NOTICE index fc7316521b..866d74a7ad 100644 --- a/vendor/k8s.io/client-go/listers/networking/v1alpha1/expansion_generated.go +++ b/vendor/go.yaml.in/yaml/v3/NOTICE @@ -1,5 +1,4 @@ -/* -Copyright The Kubernetes Authors. +Copyright 2011-2016 Canonical Ltd. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,16 +11,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 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 lister-gen. DO NOT EDIT. - -package v1alpha1 - -// IPAddressListerExpansion allows custom methods to be added to -// IPAddressLister. -type IPAddressListerExpansion interface{} - -// ServiceCIDRListerExpansion allows custom methods to be added to -// ServiceCIDRLister. -type ServiceCIDRListerExpansion interface{} diff --git a/vendor/go.yaml.in/yaml/v3/README.md b/vendor/go.yaml.in/yaml/v3/README.md new file mode 100644 index 0000000000..15a85a6350 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/README.md @@ -0,0 +1,171 @@ +go.yaml.in/yaml +=============== + +YAML Support for the Go Language + + +## Introduction + +The `yaml` package enables [Go](https://go.dev/) programs to comfortably encode +and decode [YAML](https://yaml.org/) values. + +It was originally developed within [Canonical](https://www.canonical.com) as +part of the [juju](https://juju.ubuntu.com) project, and is based on a pure Go +port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) C library to +parse and generate YAML data quickly and reliably. + + +## Project Status + +This project started as a fork of the extremely popular [go-yaml]( +https://github.com/go-yaml/yaml/) +project, and is being maintained by the official [YAML organization]( +https://github.com/yaml/). + +The YAML team took over ongoing maintenance and development of the project after +discussion with go-yaml's author, @niemeyer, following his decision to +[label the project repository as "unmaintained"]( +https://github.com/go-yaml/yaml/blob/944c86a7d2/README.md) in April 2025. + +We have put together a team of dedicated maintainers including representatives +of go-yaml's most important downstream projects. + +We will strive to earn the trust of the various go-yaml forks to switch back to +this repository as their upstream. + +Please [contact us](https://cloud-native.slack.com/archives/C08PPAT8PS7) if you +would like to contribute or be involved. + + +## Compatibility + +The `yaml` package supports most of YAML 1.2, but preserves some behavior from +1.1 for backwards compatibility. + +Specifically, v3 of the `yaml` package: + +* Supports YAML 1.1 bools (`yes`/`no`, `on`/`off`) as long as they are being + decoded into a typed bool value. + Otherwise they behave as a string. + Booleans in YAML 1.2 are `true`/`false` only. +* Supports octals encoded and decoded as `0777` per YAML 1.1, rather than + `0o777` as specified in YAML 1.2, because most parsers still use the old + format. + Octals in the `0o777` format are supported though, so new files work. +* Does not support base-60 floats. + These are gone from YAML 1.2, and were actually never supported by this + package as it's clearly a poor choice. + + +## Installation and Usage + +The import path for the package is *go.yaml.in/yaml/v3*. + +To install it, run: + +```bash +go get go.yaml.in/yaml/v3 +``` + + +## API Documentation + +See: + + +## API Stability + +The package API for yaml v3 will remain stable as described in [gopkg.in]( +https://gopkg.in). + + +## Example + +```go +package main + +import ( + "fmt" + "log" + + "go.yaml.in/yaml/v3" +) + +var data = ` +a: Easy! +b: + c: 2 + d: [3, 4] +` + +// Note: struct fields must be public in order for unmarshal to +// correctly populate the data. +type T struct { + A string + B struct { + RenamedC int `yaml:"c"` + D []int `yaml:",flow"` + } +} + +func main() { + t := T{} + + err := yaml.Unmarshal([]byte(data), &t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t:\n%v\n\n", t) + + d, err := yaml.Marshal(&t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t dump:\n%s\n\n", string(d)) + + m := make(map[interface{}]interface{}) + + err = yaml.Unmarshal([]byte(data), &m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m:\n%v\n\n", m) + + d, err = yaml.Marshal(&m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m dump:\n%s\n\n", string(d)) +} +``` + +This example will generate the following output: + +``` +--- t: +{Easy! {2 [3 4]}} + +--- t dump: +a: Easy! +b: + c: 2 + d: [3, 4] + + +--- m: +map[a:Easy! b:map[c:2 d:[3 4]]] + +--- m dump: +a: Easy! +b: + c: 2 + d: + - 3 + - 4 +``` + + +## License + +The yaml package is licensed under the MIT and Apache License 2.0 licenses. +Please see the LICENSE file for details. diff --git a/vendor/go.yaml.in/yaml/v3/apic.go b/vendor/go.yaml.in/yaml/v3/apic.go new file mode 100644 index 0000000000..05fd305da1 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/apic.go @@ -0,0 +1,747 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "io" +) + +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { + //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) + + // Check if we can move the queue at the beginning of the buffer. + if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { + if parser.tokens_head != len(parser.tokens) { + copy(parser.tokens, parser.tokens[parser.tokens_head:]) + } + parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] + parser.tokens_head = 0 + } + parser.tokens = append(parser.tokens, *token) + if pos < 0 { + return + } + copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) + parser.tokens[parser.tokens_head+pos] = *token +} + +// Create a new parser object. +func yaml_parser_initialize(parser *yaml_parser_t) bool { + *parser = yaml_parser_t{ + raw_buffer: make([]byte, 0, input_raw_buffer_size), + buffer: make([]byte, 0, input_buffer_size), + } + return true +} + +// Destroy a parser object. +func yaml_parser_delete(parser *yaml_parser_t) { + *parser = yaml_parser_t{} +} + +// String read handler. +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + if parser.input_pos == len(parser.input) { + return 0, io.EOF + } + n = copy(buffer, parser.input[parser.input_pos:]) + parser.input_pos += n + return n, nil +} + +// Reader read handler. +func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + return parser.input_reader.Read(buffer) +} + +// Set a string input. +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_string_read_handler + parser.input = input + parser.input_pos = 0 +} + +// Set a file input. +func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_reader_read_handler + parser.input_reader = r +} + +// Set the source encoding. +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { + if parser.encoding != yaml_ANY_ENCODING { + panic("must set the encoding only once") + } + parser.encoding = encoding +} + +// Create a new emitter object. +func yaml_emitter_initialize(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{ + buffer: make([]byte, output_buffer_size), + raw_buffer: make([]byte, 0, output_raw_buffer_size), + states: make([]yaml_emitter_state_t, 0, initial_stack_size), + events: make([]yaml_event_t, 0, initial_queue_size), + best_width: -1, + } +} + +// Destroy an emitter object. +func yaml_emitter_delete(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{} +} + +// String write handler. +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + *emitter.output_buffer = append(*emitter.output_buffer, buffer...) + return nil +} + +// yaml_writer_write_handler uses emitter.output_writer to write the +// emitted text. +func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + _, err := emitter.output_writer.Write(buffer) + return err +} + +// Set a string output. +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_string_write_handler + emitter.output_buffer = output_buffer +} + +// Set a file output. +func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_writer_write_handler + emitter.output_writer = w +} + +// Set the output encoding. +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { + if emitter.encoding != yaml_ANY_ENCODING { + panic("must set the output encoding only once") + } + emitter.encoding = encoding +} + +// Set the canonical output style. +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { + emitter.canonical = canonical +} + +// Set the indentation increment. +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { + if indent < 2 || indent > 9 { + indent = 2 + } + emitter.best_indent = indent +} + +// Set the preferred line width. +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { + if width < 0 { + width = -1 + } + emitter.best_width = width +} + +// Set if unescaped non-ASCII characters are allowed. +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { + emitter.unicode = unicode +} + +// Set the preferred line break character. +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { + emitter.line_break = line_break +} + +///* +// * Destroy a token object. +// */ +// +//YAML_DECLARE(void) +//yaml_token_delete(yaml_token_t *token) +//{ +// assert(token); // Non-NULL token object expected. +// +// switch (token.type) +// { +// case YAML_TAG_DIRECTIVE_TOKEN: +// yaml_free(token.data.tag_directive.handle); +// yaml_free(token.data.tag_directive.prefix); +// break; +// +// case YAML_ALIAS_TOKEN: +// yaml_free(token.data.alias.value); +// break; +// +// case YAML_ANCHOR_TOKEN: +// yaml_free(token.data.anchor.value); +// break; +// +// case YAML_TAG_TOKEN: +// yaml_free(token.data.tag.handle); +// yaml_free(token.data.tag.suffix); +// break; +// +// case YAML_SCALAR_TOKEN: +// yaml_free(token.data.scalar.value); +// break; +// +// default: +// break; +// } +// +// memset(token, 0, sizeof(yaml_token_t)); +//} +// +///* +// * Check if a string is a valid UTF-8 sequence. +// * +// * Check 'reader.c' for more details on UTF-8 encoding. +// */ +// +//static int +//yaml_check_utf8(yaml_char_t *start, size_t length) +//{ +// yaml_char_t *end = start+length; +// yaml_char_t *pointer = start; +// +// while (pointer < end) { +// unsigned char octet; +// unsigned int width; +// unsigned int value; +// size_t k; +// +// octet = pointer[0]; +// width = (octet & 0x80) == 0x00 ? 1 : +// (octet & 0xE0) == 0xC0 ? 2 : +// (octet & 0xF0) == 0xE0 ? 3 : +// (octet & 0xF8) == 0xF0 ? 4 : 0; +// value = (octet & 0x80) == 0x00 ? octet & 0x7F : +// (octet & 0xE0) == 0xC0 ? octet & 0x1F : +// (octet & 0xF0) == 0xE0 ? octet & 0x0F : +// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; +// if (!width) return 0; +// if (pointer+width > end) return 0; +// for (k = 1; k < width; k ++) { +// octet = pointer[k]; +// if ((octet & 0xC0) != 0x80) return 0; +// value = (value << 6) + (octet & 0x3F); +// } +// if (!((width == 1) || +// (width == 2 && value >= 0x80) || +// (width == 3 && value >= 0x800) || +// (width == 4 && value >= 0x10000))) return 0; +// +// pointer += width; +// } +// +// return 1; +//} +// + +// Create STREAM-START. +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + encoding: encoding, + } +} + +// Create STREAM-END. +func yaml_stream_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + } +} + +// Create DOCUMENT-START. +func yaml_document_start_event_initialize( + event *yaml_event_t, + version_directive *yaml_version_directive_t, + tag_directives []yaml_tag_directive_t, + implicit bool, +) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: implicit, + } +} + +// Create DOCUMENT-END. +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + implicit: implicit, + } +} + +// Create ALIAS. +func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool { + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + anchor: anchor, + } + return true +} + +// Create SCALAR. +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + anchor: anchor, + tag: tag, + value: value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-START. +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-END. +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + } + return true +} + +// Create MAPPING-START. +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } +} + +// Create MAPPING-END. +func yaml_mapping_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + } +} + +// Destroy an event object. +func yaml_event_delete(event *yaml_event_t) { + *event = yaml_event_t{} +} + +///* +// * Create a document object. +// */ +// +//YAML_DECLARE(int) +//yaml_document_initialize(document *yaml_document_t, +// version_directive *yaml_version_directive_t, +// tag_directives_start *yaml_tag_directive_t, +// tag_directives_end *yaml_tag_directive_t, +// start_implicit int, end_implicit int) +//{ +// struct { +// error yaml_error_type_t +// } context +// struct { +// start *yaml_node_t +// end *yaml_node_t +// top *yaml_node_t +// } nodes = { NULL, NULL, NULL } +// version_directive_copy *yaml_version_directive_t = NULL +// struct { +// start *yaml_tag_directive_t +// end *yaml_tag_directive_t +// top *yaml_tag_directive_t +// } tag_directives_copy = { NULL, NULL, NULL } +// value yaml_tag_directive_t = { NULL, NULL } +// mark yaml_mark_t = { 0, 0, 0 } +// +// assert(document) // Non-NULL document object is expected. +// assert((tag_directives_start && tag_directives_end) || +// (tag_directives_start == tag_directives_end)) +// // Valid tag directives are expected. +// +// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error +// +// if (version_directive) { +// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) +// if (!version_directive_copy) goto error +// version_directive_copy.major = version_directive.major +// version_directive_copy.minor = version_directive.minor +// } +// +// if (tag_directives_start != tag_directives_end) { +// tag_directive *yaml_tag_directive_t +// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) +// goto error +// for (tag_directive = tag_directives_start +// tag_directive != tag_directives_end; tag_directive ++) { +// assert(tag_directive.handle) +// assert(tag_directive.prefix) +// if (!yaml_check_utf8(tag_directive.handle, +// strlen((char *)tag_directive.handle))) +// goto error +// if (!yaml_check_utf8(tag_directive.prefix, +// strlen((char *)tag_directive.prefix))) +// goto error +// value.handle = yaml_strdup(tag_directive.handle) +// value.prefix = yaml_strdup(tag_directive.prefix) +// if (!value.handle || !value.prefix) goto error +// if (!PUSH(&context, tag_directives_copy, value)) +// goto error +// value.handle = NULL +// value.prefix = NULL +// } +// } +// +// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, +// tag_directives_copy.start, tag_directives_copy.top, +// start_implicit, end_implicit, mark, mark) +// +// return 1 +// +//error: +// STACK_DEL(&context, nodes) +// yaml_free(version_directive_copy) +// while (!STACK_EMPTY(&context, tag_directives_copy)) { +// value yaml_tag_directive_t = POP(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// } +// STACK_DEL(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// +// return 0 +//} +// +///* +// * Destroy a document object. +// */ +// +//YAML_DECLARE(void) +//yaml_document_delete(document *yaml_document_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// tag_directive *yaml_tag_directive_t +// +// context.error = YAML_NO_ERROR // Eliminate a compiler warning. +// +// assert(document) // Non-NULL document object is expected. +// +// while (!STACK_EMPTY(&context, document.nodes)) { +// node yaml_node_t = POP(&context, document.nodes) +// yaml_free(node.tag) +// switch (node.type) { +// case YAML_SCALAR_NODE: +// yaml_free(node.data.scalar.value) +// break +// case YAML_SEQUENCE_NODE: +// STACK_DEL(&context, node.data.sequence.items) +// break +// case YAML_MAPPING_NODE: +// STACK_DEL(&context, node.data.mapping.pairs) +// break +// default: +// assert(0) // Should not happen. +// } +// } +// STACK_DEL(&context, document.nodes) +// +// yaml_free(document.version_directive) +// for (tag_directive = document.tag_directives.start +// tag_directive != document.tag_directives.end +// tag_directive++) { +// yaml_free(tag_directive.handle) +// yaml_free(tag_directive.prefix) +// } +// yaml_free(document.tag_directives.start) +// +// memset(document, 0, sizeof(yaml_document_t)) +//} +// +///** +// * Get a document node. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_node(document *yaml_document_t, index int) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (index > 0 && document.nodes.start + index <= document.nodes.top) { +// return document.nodes.start + index - 1 +// } +// return NULL +//} +// +///** +// * Get the root object. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_root_node(document *yaml_document_t) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (document.nodes.top != document.nodes.start) { +// return document.nodes.start +// } +// return NULL +//} +// +///* +// * Add a scalar node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_scalar(document *yaml_document_t, +// tag *yaml_char_t, value *yaml_char_t, length int, +// style yaml_scalar_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// value_copy *yaml_char_t = NULL +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// assert(value) // Non-NULL value is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (length < 0) { +// length = strlen((char *)value) +// } +// +// if (!yaml_check_utf8(value, length)) goto error +// value_copy = yaml_malloc(length+1) +// if (!value_copy) goto error +// memcpy(value_copy, value, length) +// value_copy[length] = '\0' +// +// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// yaml_free(tag_copy) +// yaml_free(value_copy) +// +// return 0 +//} +// +///* +// * Add a sequence node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_sequence(document *yaml_document_t, +// tag *yaml_char_t, style yaml_sequence_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_item_t +// end *yaml_node_item_t +// top *yaml_node_item_t +// } items = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error +// +// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, items) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Add a mapping node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_mapping(document *yaml_document_t, +// tag *yaml_char_t, style yaml_mapping_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_pair_t +// end *yaml_node_pair_t +// top *yaml_node_pair_t +// } pairs = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error +// +// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, pairs) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Append an item to a sequence node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_sequence_item(document *yaml_document_t, +// sequence int, item int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// assert(document) // Non-NULL document is required. +// assert(sequence > 0 +// && document.nodes.start + sequence <= document.nodes.top) +// // Valid sequence id is required. +// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) +// // A sequence node is required. +// assert(item > 0 && document.nodes.start + item <= document.nodes.top) +// // Valid item id is required. +// +// if (!PUSH(&context, +// document.nodes.start[sequence-1].data.sequence.items, item)) +// return 0 +// +// return 1 +//} +// +///* +// * Append a pair of a key and a value to a mapping node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_mapping_pair(document *yaml_document_t, +// mapping int, key int, value int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// pair yaml_node_pair_t +// +// assert(document) // Non-NULL document is required. +// assert(mapping > 0 +// && document.nodes.start + mapping <= document.nodes.top) +// // Valid mapping id is required. +// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) +// // A mapping node is required. +// assert(key > 0 && document.nodes.start + key <= document.nodes.top) +// // Valid key id is required. +// assert(value > 0 && document.nodes.start + value <= document.nodes.top) +// // Valid value id is required. +// +// pair.key = key +// pair.value = value +// +// if (!PUSH(&context, +// document.nodes.start[mapping-1].data.mapping.pairs, pair)) +// return 0 +// +// return 1 +//} +// +// diff --git a/vendor/go.yaml.in/yaml/v3/decode.go b/vendor/go.yaml.in/yaml/v3/decode.go new file mode 100644 index 0000000000..02e2b17bfe --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/decode.go @@ -0,0 +1,1018 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding" + "encoding/base64" + "fmt" + "io" + "math" + "reflect" + "strconv" + "time" +) + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *Node + anchors map[string]*Node + doneInit bool + textless bool +} + +func newParser(b []byte) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + if len(b) == 0 { + b = []byte{'\n'} + } + yaml_parser_set_input_string(&p.parser, b) + return &p +} + +func newParserFromReader(r io.Reader) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + yaml_parser_set_input_reader(&p.parser, r) + return &p +} + +func (p *parser) init() { + if p.doneInit { + return + } + p.anchors = make(map[string]*Node) + p.expect(yaml_STREAM_START_EVENT) + p.doneInit = true +} + +func (p *parser) destroy() { + if p.event.typ != yaml_NO_EVENT { + yaml_event_delete(&p.event) + } + yaml_parser_delete(&p.parser) +} + +// expect consumes an event from the event stream and +// checks that it's of the expected type. +func (p *parser) expect(e yaml_event_type_t) { + if p.event.typ == yaml_NO_EVENT { + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + } + if p.event.typ == yaml_STREAM_END_EVENT { + failf("attempted to go past the end of stream; corrupted value?") + } + if p.event.typ != e { + p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) + p.fail() + } + yaml_event_delete(&p.event) + p.event.typ = yaml_NO_EVENT +} + +// peek peeks at the next event in the event stream, +// puts the results into p.event and returns the event type. +func (p *parser) peek() yaml_event_type_t { + if p.event.typ != yaml_NO_EVENT { + return p.event.typ + } + // It's curious choice from the underlying API to generally return a + // positive result on success, but on this case return true in an error + // scenario. This was the source of bugs in the past (issue #666). + if !yaml_parser_parse(&p.parser, &p.event) || p.parser.error != yaml_NO_ERROR { + p.fail() + } + return p.event.typ +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } else if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } + if line != 0 { + where = "line " + strconv.Itoa(line) + ": " + } + var msg string + if len(p.parser.problem) > 0 { + msg = p.parser.problem + } else { + msg = "unknown problem parsing YAML content" + } + failf("%s%s", where, msg) +} + +func (p *parser) anchor(n *Node, anchor []byte) { + if anchor != nil { + n.Anchor = string(anchor) + p.anchors[n.Anchor] = n + } +} + +func (p *parser) parse() *Node { + p.init() + switch p.peek() { + case yaml_SCALAR_EVENT: + return p.scalar() + case yaml_ALIAS_EVENT: + return p.alias() + case yaml_MAPPING_START_EVENT: + return p.mapping() + case yaml_SEQUENCE_START_EVENT: + return p.sequence() + case yaml_DOCUMENT_START_EVENT: + return p.document() + case yaml_STREAM_END_EVENT: + // Happens when attempting to decode an empty buffer. + return nil + case yaml_TAIL_COMMENT_EVENT: + panic("internal error: unexpected tail comment event (please report)") + default: + panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String()) + } +} + +func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node { + var style Style + if tag != "" && tag != "!" { + tag = shortTag(tag) + style = TaggedStyle + } else if defaultTag != "" { + tag = defaultTag + } else if kind == ScalarNode { + tag, _ = resolve("", value) + } + n := &Node{ + Kind: kind, + Tag: tag, + Value: value, + Style: style, + } + if !p.textless { + n.Line = p.event.start_mark.line + 1 + n.Column = p.event.start_mark.column + 1 + n.HeadComment = string(p.event.head_comment) + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + } + return n +} + +func (p *parser) parseChild(parent *Node) *Node { + child := p.parse() + parent.Content = append(parent.Content, child) + return child +} + +func (p *parser) document() *Node { + n := p.node(DocumentNode, "", "", "") + p.doc = n + p.expect(yaml_DOCUMENT_START_EVENT) + p.parseChild(n) + if p.peek() == yaml_DOCUMENT_END_EVENT { + n.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_DOCUMENT_END_EVENT) + return n +} + +func (p *parser) alias() *Node { + n := p.node(AliasNode, "", "", string(p.event.anchor)) + n.Alias = p.anchors[n.Value] + if n.Alias == nil { + failf("unknown anchor '%s' referenced", n.Value) + } + p.expect(yaml_ALIAS_EVENT) + return n +} + +func (p *parser) scalar() *Node { + var parsedStyle = p.event.scalar_style() + var nodeStyle Style + switch { + case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = DoubleQuotedStyle + case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = SingleQuotedStyle + case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0: + nodeStyle = LiteralStyle + case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0: + nodeStyle = FoldedStyle + } + var nodeValue = string(p.event.value) + var nodeTag = string(p.event.tag) + var defaultTag string + if nodeStyle == 0 { + if nodeValue == "<<" { + defaultTag = mergeTag + } + } else { + defaultTag = strTag + } + n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue) + n.Style |= nodeStyle + p.anchor(n, p.event.anchor) + p.expect(yaml_SCALAR_EVENT) + return n +} + +func (p *parser) sequence() *Node { + n := p.node(SequenceNode, seqTag, string(p.event.tag), "") + if p.event.sequence_style()&yaml_FLOW_SEQUENCE_STYLE != 0 { + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_SEQUENCE_START_EVENT) + for p.peek() != yaml_SEQUENCE_END_EVENT { + p.parseChild(n) + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + p.expect(yaml_SEQUENCE_END_EVENT) + return n +} + +func (p *parser) mapping() *Node { + n := p.node(MappingNode, mapTag, string(p.event.tag), "") + block := true + if p.event.mapping_style()&yaml_FLOW_MAPPING_STYLE != 0 { + block = false + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_MAPPING_START_EVENT) + for p.peek() != yaml_MAPPING_END_EVENT { + k := p.parseChild(n) + if block && k.FootComment != "" { + // Must be a foot comment for the prior value when being dedented. + if len(n.Content) > 2 { + n.Content[len(n.Content)-3].FootComment = k.FootComment + k.FootComment = "" + } + } + v := p.parseChild(n) + if k.FootComment == "" && v.FootComment != "" { + k.FootComment = v.FootComment + v.FootComment = "" + } + if p.peek() == yaml_TAIL_COMMENT_EVENT { + if k.FootComment == "" { + k.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_TAIL_COMMENT_EVENT) + } + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 { + n.Content[len(n.Content)-2].FootComment = n.FootComment + n.FootComment = "" + } + p.expect(yaml_MAPPING_END_EVENT) + return n +} + +// ---------------------------------------------------------------------------- +// Decoder, unmarshals a node into a provided value. + +type decoder struct { + doc *Node + aliases map[*Node]bool + terrors []string + + stringMapType reflect.Type + generalMapType reflect.Type + + knownFields bool + uniqueKeys bool + decodeCount int + aliasCount int + aliasDepth int + + mergedFields map[interface{}]bool +} + +var ( + nodeType = reflect.TypeOf(Node{}) + durationType = reflect.TypeOf(time.Duration(0)) + stringMapType = reflect.TypeOf(map[string]interface{}{}) + generalMapType = reflect.TypeOf(map[interface{}]interface{}{}) + ifaceType = generalMapType.Elem() + timeType = reflect.TypeOf(time.Time{}) + ptrTimeType = reflect.TypeOf(&time.Time{}) +) + +func newDecoder() *decoder { + d := &decoder{ + stringMapType: stringMapType, + generalMapType: generalMapType, + uniqueKeys: true, + } + d.aliases = make(map[*Node]bool) + return d +} + +func (d *decoder) terror(n *Node, tag string, out reflect.Value) { + if n.Tag != "" { + tag = n.Tag + } + value := n.Value + if tag != seqTag && tag != mapTag { + if len(value) > 10 { + value = " `" + value[:7] + "...`" + } else { + value = " `" + value + "`" + } + } + d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.Line, shortTag(tag), value, out.Type())) +} + +func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) { + err := u.UnmarshalYAML(n) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (good bool) { + terrlen := len(d.terrors) + err := u.UnmarshalYAML(func(v interface{}) (err error) { + defer handleErr(&err) + d.unmarshal(n, reflect.ValueOf(v)) + if len(d.terrors) > terrlen { + issues := d.terrors[terrlen:] + d.terrors = d.terrors[:terrlen] + return &TypeError{issues} + } + return nil + }) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML +// if a value is found to implement it. +// It returns the initialized and dereferenced out value, whether +// unmarshalling was already done by UnmarshalYAML, and if so whether +// its types unmarshalled appropriately. +// +// If n holds a null value, prepare returns before doing anything. +func (d *decoder) prepare(n *Node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { + if n.ShortTag() == nullTag { + return out, false, false + } + again := true + for again { + again = false + if out.Kind() == reflect.Ptr { + if out.IsNil() { + out.Set(reflect.New(out.Type().Elem())) + } + out = out.Elem() + again = true + } + if out.CanAddr() { + outi := out.Addr().Interface() + if u, ok := outi.(Unmarshaler); ok { + good = d.callUnmarshaler(n, u) + return out, true, good + } + if u, ok := outi.(obsoleteUnmarshaler); ok { + good = d.callObsoleteUnmarshaler(n, u) + return out, true, good + } + } + } + return out, false, false +} + +func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) { + if n.ShortTag() == nullTag { + return reflect.Value{} + } + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +const ( + // 400,000 decode operations is ~500kb of dense object declarations, or + // ~5kb of dense object declarations with 10000% alias expansion + alias_ratio_range_low = 400000 + + // 4,000,000 decode operations is ~5MB of dense object declarations, or + // ~4.5MB of dense object declarations with 10% alias expansion + alias_ratio_range_high = 4000000 + + // alias_ratio_range is the range over which we scale allowed alias ratios + alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low) +) + +func allowedAliasRatio(decodeCount int) float64 { + switch { + case decodeCount <= alias_ratio_range_low: + // allow 99% to come from alias expansion for small-to-medium documents + return 0.99 + case decodeCount >= alias_ratio_range_high: + // allow 10% to come from alias expansion for very large documents + return 0.10 + default: + // scale smoothly from 99% down to 10% over the range. + // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range. + // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps). + return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range) + } +} + +func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) { + d.decodeCount++ + if d.aliasDepth > 0 { + d.aliasCount++ + } + if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) { + failf("document contains excessive aliasing") + } + if out.Type() == nodeType { + out.Set(reflect.ValueOf(n).Elem()) + return true + } + switch n.Kind { + case DocumentNode: + return d.document(n, out) + case AliasNode: + return d.alias(n, out) + } + out, unmarshaled, good := d.prepare(n, out) + if unmarshaled { + return good + } + switch n.Kind { + case ScalarNode: + good = d.scalar(n, out) + case MappingNode: + good = d.mapping(n, out) + case SequenceNode: + good = d.sequence(n, out) + case 0: + if n.IsZero() { + return d.null(out) + } + fallthrough + default: + failf("cannot decode node with unknown kind %d", n.Kind) + } + return good +} + +func (d *decoder) document(n *Node, out reflect.Value) (good bool) { + if len(n.Content) == 1 { + d.doc = n + d.unmarshal(n.Content[0], out) + return true + } + return false +} + +func (d *decoder) alias(n *Node, out reflect.Value) (good bool) { + if d.aliases[n] { + // TODO this could actually be allowed in some circumstances. + failf("anchor '%s' value contains itself", n.Value) + } + d.aliases[n] = true + d.aliasDepth++ + good = d.unmarshal(n.Alias, out) + d.aliasDepth-- + delete(d.aliases, n) + return good +} + +var zeroValue reflect.Value + +func resetMap(out reflect.Value) { + for _, k := range out.MapKeys() { + out.SetMapIndex(k, zeroValue) + } +} + +func (d *decoder) null(out reflect.Value) bool { + if out.CanAddr() { + switch out.Kind() { + case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: + out.Set(reflect.Zero(out.Type())) + return true + } + } + return false +} + +func (d *decoder) scalar(n *Node, out reflect.Value) bool { + var tag string + var resolved interface{} + if n.indicatedString() { + tag = strTag + resolved = n.Value + } else { + tag, resolved = resolve(n.Tag, n.Value) + if tag == binaryTag { + data, err := base64.StdEncoding.DecodeString(resolved.(string)) + if err != nil { + failf("!!binary value contains invalid base64 data") + } + resolved = string(data) + } + } + if resolved == nil { + return d.null(out) + } + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + // We've resolved to exactly the type we want, so use that. + out.Set(resolvedv) + return true + } + // Perhaps we can use the value as a TextUnmarshaler to + // set its value. + if out.CanAddr() { + u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) + if ok { + var text []byte + if tag == binaryTag { + text = []byte(resolved.(string)) + } else { + // We let any value be unmarshaled into TextUnmarshaler. + // That might be more lax than we'd like, but the + // TextUnmarshaler itself should bowl out any dubious values. + text = []byte(n.Value) + } + err := u.UnmarshalText(text) + if err != nil { + fail(err) + } + return true + } + } + switch out.Kind() { + case reflect.String: + if tag == binaryTag { + out.SetString(resolved.(string)) + return true + } + out.SetString(n.Value) + return true + case reflect.Interface: + out.Set(reflect.ValueOf(resolved)) + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + // This used to work in v2, but it's very unfriendly. + isDuration := out.Type() == durationType + + switch resolved := resolved.(type) { + case int: + if !isDuration && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case int64: + if !isDuration && !out.OverflowInt(resolved) { + out.SetInt(resolved) + return true + } + case uint64: + if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case float64: + if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case string: + if out.Type() == durationType { + d, err := time.ParseDuration(resolved) + if err == nil { + out.SetInt(int64(d)) + return true + } + } + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch resolved := resolved.(type) { + case int: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case int64: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case uint64: + if !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case float64: + if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + } + case reflect.Bool: + switch resolved := resolved.(type) { + case bool: + out.SetBool(resolved) + return true + case string: + // This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html). + // It only works if explicitly attempting to unmarshal into a typed bool value. + switch resolved { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON": + out.SetBool(true) + return true + case "n", "N", "no", "No", "NO", "off", "Off", "OFF": + out.SetBool(false) + return true + } + } + case reflect.Float32, reflect.Float64: + switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + return true + case int64: + out.SetFloat(float64(resolved)) + return true + case uint64: + out.SetFloat(float64(resolved)) + return true + case float64: + out.SetFloat(resolved) + return true + } + case reflect.Struct: + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + out.Set(resolvedv) + return true + } + case reflect.Ptr: + panic("yaml internal error: please report the issue") + } + d.terror(n, tag, out) + return false +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +func (d *decoder) sequence(n *Node, out reflect.Value) (good bool) { + l := len(n.Content) + + var iface reflect.Value + switch out.Kind() { + case reflect.Slice: + out.Set(reflect.MakeSlice(out.Type(), l, l)) + case reflect.Array: + if l != out.Len() { + failf("invalid array: want %d elements but got %d", out.Len(), l) + } + case reflect.Interface: + // No type hints. Will have to use a generic sequence. + iface = out + out = settableValueOf(make([]interface{}, l)) + default: + d.terror(n, seqTag, out) + return false + } + et := out.Type().Elem() + + j := 0 + for i := 0; i < l; i++ { + e := reflect.New(et).Elem() + if ok := d.unmarshal(n.Content[i], e); ok { + out.Index(j).Set(e) + j++ + } + } + if out.Kind() != reflect.Array { + out.Set(out.Slice(0, j)) + } + if iface.IsValid() { + iface.Set(out) + } + return true +} + +func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { + l := len(n.Content) + if d.uniqueKeys { + nerrs := len(d.terrors) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + for j := i + 2; j < l; j += 2 { + nj := n.Content[j] + if ni.Kind == nj.Kind && ni.Value == nj.Value { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line)) + } + } + } + if len(d.terrors) > nerrs { + return false + } + } + switch out.Kind() { + case reflect.Struct: + return d.mappingStruct(n, out) + case reflect.Map: + // okay + case reflect.Interface: + iface := out + if isStringMap(n) { + out = reflect.MakeMap(d.stringMapType) + } else { + out = reflect.MakeMap(d.generalMapType) + } + iface.Set(out) + default: + d.terror(n, mapTag, out) + return false + } + + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + stringMapType := d.stringMapType + generalMapType := d.generalMapType + if outt.Elem() == ifaceType { + if outt.Key().Kind() == reflect.String { + d.stringMapType = outt + } else if outt.Key() == ifaceType { + d.generalMapType = outt + } + } + + mergedFields := d.mergedFields + d.mergedFields = nil + + var mergeNode *Node + + mapIsNew := false + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + mapIsNew = true + } + for i := 0; i < l; i += 2 { + if isMerge(n.Content[i]) { + mergeNode = n.Content[i+1] + continue + } + k := reflect.New(kt).Elem() + if d.unmarshal(n.Content[i], k) { + if mergedFields != nil { + ki := k.Interface() + if d.getPossiblyUnhashableKey(mergedFields, ki) { + continue + } + d.setPossiblyUnhashableKey(mergedFields, ki, true) + } + kkind := k.Kind() + if kkind == reflect.Interface { + kkind = k.Elem().Kind() + } + if kkind == reflect.Map || kkind == reflect.Slice { + failf("invalid map key: %#v", k.Interface()) + } + e := reflect.New(et).Elem() + if d.unmarshal(n.Content[i+1], e) || n.Content[i+1].ShortTag() == nullTag && (mapIsNew || !out.MapIndex(k).IsValid()) { + out.SetMapIndex(k, e) + } + } + } + + d.mergedFields = mergedFields + if mergeNode != nil { + d.merge(n, mergeNode, out) + } + + d.stringMapType = stringMapType + d.generalMapType = generalMapType + return true +} + +func isStringMap(n *Node) bool { + if n.Kind != MappingNode { + return false + } + l := len(n.Content) + for i := 0; i < l; i += 2 { + shortTag := n.Content[i].ShortTag() + if shortTag != strTag && shortTag != mergeTag { + return false + } + } + return true +} + +func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + + var inlineMap reflect.Value + var elemType reflect.Type + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + elemType = inlineMap.Type().Elem() + } + + for _, index := range sinfo.InlineUnmarshalers { + field := d.fieldByIndex(n, out, index) + d.prepare(n, field) + } + + mergedFields := d.mergedFields + d.mergedFields = nil + var mergeNode *Node + var doneFields []bool + if d.uniqueKeys { + doneFields = make([]bool, len(sinfo.FieldsList)) + } + name := settableValueOf("") + l := len(n.Content) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + if isMerge(ni) { + mergeNode = n.Content[i+1] + continue + } + if !d.unmarshal(ni, name) { + continue + } + sname := name.String() + if mergedFields != nil { + if mergedFields[sname] { + continue + } + mergedFields[sname] = true + } + if info, ok := sinfo.FieldsMap[sname]; ok { + if d.uniqueKeys { + if doneFields[info.Id] { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type())) + continue + } + doneFields[info.Id] = true + } + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = d.fieldByIndex(n, out, info.Inline) + } + d.unmarshal(n.Content[i+1], field) + } else if sinfo.InlineMap != -1 { + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + value := reflect.New(elemType).Elem() + d.unmarshal(n.Content[i+1], value) + inlineMap.SetMapIndex(name, value) + } else if d.knownFields { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type())) + } + } + + d.mergedFields = mergedFields + if mergeNode != nil { + d.merge(n, mergeNode, out) + } + return true +} + +func failWantMap() { + failf("map merge requires map or sequence of maps as the value") +} + +func (d *decoder) setPossiblyUnhashableKey(m map[interface{}]bool, key interface{}, value bool) { + defer func() { + if err := recover(); err != nil { + failf("%v", err) + } + }() + m[key] = value +} + +func (d *decoder) getPossiblyUnhashableKey(m map[interface{}]bool, key interface{}) bool { + defer func() { + if err := recover(); err != nil { + failf("%v", err) + } + }() + return m[key] +} + +func (d *decoder) merge(parent *Node, merge *Node, out reflect.Value) { + mergedFields := d.mergedFields + if mergedFields == nil { + d.mergedFields = make(map[interface{}]bool) + for i := 0; i < len(parent.Content); i += 2 { + k := reflect.New(ifaceType).Elem() + if d.unmarshal(parent.Content[i], k) { + d.setPossiblyUnhashableKey(d.mergedFields, k.Interface(), true) + } + } + } + + switch merge.Kind { + case MappingNode: + d.unmarshal(merge, out) + case AliasNode: + if merge.Alias != nil && merge.Alias.Kind != MappingNode { + failWantMap() + } + d.unmarshal(merge, out) + case SequenceNode: + for i := 0; i < len(merge.Content); i++ { + ni := merge.Content[i] + if ni.Kind == AliasNode { + if ni.Alias != nil && ni.Alias.Kind != MappingNode { + failWantMap() + } + } else if ni.Kind != MappingNode { + failWantMap() + } + d.unmarshal(ni, out) + } + default: + failWantMap() + } + + d.mergedFields = mergedFields +} + +func isMerge(n *Node) bool { + return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag) +} diff --git a/vendor/go.yaml.in/yaml/v3/emitterc.go b/vendor/go.yaml.in/yaml/v3/emitterc.go new file mode 100644 index 0000000000..ab4e03ba72 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/emitterc.go @@ -0,0 +1,2054 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "bytes" + "fmt" +) + +// Flush the buffer if needed. +func flush(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) { + return yaml_emitter_flush(emitter) + } + return true +} + +// Put a character to the output buffer. +func put(emitter *yaml_emitter_t, value byte) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + emitter.buffer[emitter.buffer_pos] = value + emitter.buffer_pos++ + emitter.column++ + return true +} + +// Put a line break to the output buffer. +func put_break(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + switch emitter.line_break { + case yaml_CR_BREAK: + emitter.buffer[emitter.buffer_pos] = '\r' + emitter.buffer_pos += 1 + case yaml_LN_BREAK: + emitter.buffer[emitter.buffer_pos] = '\n' + emitter.buffer_pos += 1 + case yaml_CRLN_BREAK: + emitter.buffer[emitter.buffer_pos+0] = '\r' + emitter.buffer[emitter.buffer_pos+1] = '\n' + emitter.buffer_pos += 2 + default: + panic("unknown line break setting") + } + if emitter.column == 0 { + emitter.space_above = true + } + emitter.column = 0 + emitter.line++ + // [Go] Do this here and below and drop from everywhere else (see commented lines). + emitter.indention = true + return true +} + +// Copy a character from a string into buffer. +func write(emitter *yaml_emitter_t, s []byte, i *int) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + p := emitter.buffer_pos + w := width(s[*i]) + switch w { + case 4: + emitter.buffer[p+3] = s[*i+3] + fallthrough + case 3: + emitter.buffer[p+2] = s[*i+2] + fallthrough + case 2: + emitter.buffer[p+1] = s[*i+1] + fallthrough + case 1: + emitter.buffer[p+0] = s[*i+0] + default: + panic("unknown character width") + } + emitter.column++ + emitter.buffer_pos += w + *i += w + return true +} + +// Write a whole string into buffer. +func write_all(emitter *yaml_emitter_t, s []byte) bool { + for i := 0; i < len(s); { + if !write(emitter, s, &i) { + return false + } + } + return true +} + +// Copy a line break character from a string into buffer. +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { + if s[*i] == '\n' { + if !put_break(emitter) { + return false + } + *i++ + } else { + if !write(emitter, s, i) { + return false + } + if emitter.column == 0 { + emitter.space_above = true + } + emitter.column = 0 + emitter.line++ + // [Go] Do this here and above and drop from everywhere else (see commented lines). + emitter.indention = true + } + return true +} + +// Set an emitter error and return false. +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_EMITTER_ERROR + emitter.problem = problem + return false +} + +// Emit an event. +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.events = append(emitter.events, *event) + for !yaml_emitter_need_more_events(emitter) { + event := &emitter.events[emitter.events_head] + if !yaml_emitter_analyze_event(emitter, event) { + return false + } + if !yaml_emitter_state_machine(emitter, event) { + return false + } + yaml_event_delete(event) + emitter.events_head++ + } + return true +} + +// Check if we need to accumulate more events before emitting. +// +// We accumulate extra +// - 1 event for DOCUMENT-START +// - 2 events for SEQUENCE-START +// - 3 events for MAPPING-START +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { + if emitter.events_head == len(emitter.events) { + return true + } + var accumulate int + switch emitter.events[emitter.events_head].typ { + case yaml_DOCUMENT_START_EVENT: + accumulate = 1 + break + case yaml_SEQUENCE_START_EVENT: + accumulate = 2 + break + case yaml_MAPPING_START_EVENT: + accumulate = 3 + break + default: + return false + } + if len(emitter.events)-emitter.events_head > accumulate { + return false + } + var level int + for i := emitter.events_head; i < len(emitter.events); i++ { + switch emitter.events[i].typ { + case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: + level++ + case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: + level-- + } + if level == 0 { + return false + } + } + return true +} + +// Append a directive to the directives stack. +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { + for i := 0; i < len(emitter.tag_directives); i++ { + if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") + } + } + + // [Go] Do we actually need to copy this given garbage collection + // and the lack of deallocating destructors? + tag_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(tag_copy.handle, value.handle) + copy(tag_copy.prefix, value.prefix) + emitter.tag_directives = append(emitter.tag_directives, tag_copy) + return true +} + +// Increase the indentation level. +func yaml_emitter_increase_indent_compact(emitter *yaml_emitter_t, flow, indentless bool, compact_seq bool) bool { + emitter.indents = append(emitter.indents, emitter.indent) + if emitter.indent < 0 { + if flow { + emitter.indent = emitter.best_indent + } else { + emitter.indent = 0 + } + } else if !indentless { + // [Go] This was changed so that indentations are more regular. + if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { + // The first indent inside a sequence will just skip the "- " indicator. + emitter.indent += 2 + } else { + // Everything else aligns to the chosen indentation. + emitter.indent = emitter.best_indent * ((emitter.indent + emitter.best_indent) / emitter.best_indent) + if compact_seq { + // The value compact_seq passed in is almost always set to `false` when this function is called, + // except when we are dealing with sequence nodes. So this gets triggered to subtract 2 only when we + // are increasing the indent to account for sequence nodes, which will be correct because we need to + // subtract 2 to account for the - at the beginning of the sequence node. + emitter.indent = emitter.indent - 2 + } + } + } + return true +} + +// State dispatcher. +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { + switch emitter.state { + default: + case yaml_EMIT_STREAM_START_STATE: + return yaml_emitter_emit_stream_start(emitter, event) + + case yaml_EMIT_FIRST_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, true) + + case yaml_EMIT_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, false) + + case yaml_EMIT_DOCUMENT_CONTENT_STATE: + return yaml_emitter_emit_document_content(emitter, event) + + case yaml_EMIT_DOCUMENT_END_STATE: + return yaml_emitter_emit_document_end(emitter, event) + + case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false) + + case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true) + + case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false) + + case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false) + + case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true) + + case yaml_EMIT_FLOW_MAPPING_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false) + + case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, false) + + case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, true) + + case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, false) + + case yaml_EMIT_END_STATE: + return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") + } + panic("invalid emitter state") +} + +// Expect STREAM-START. +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_STREAM_START_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") + } + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = event.encoding + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = yaml_UTF8_ENCODING + } + } + if emitter.best_indent < 2 || emitter.best_indent > 9 { + emitter.best_indent = 2 + } + if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { + emitter.best_width = 80 + } + if emitter.best_width < 0 { + emitter.best_width = 1<<31 - 1 + } + if emitter.line_break == yaml_ANY_BREAK { + emitter.line_break = yaml_LN_BREAK + } + + emitter.indent = -1 + emitter.line = 0 + emitter.column = 0 + emitter.whitespace = true + emitter.indention = true + emitter.space_above = true + emitter.foot_indent = -1 + + if emitter.encoding != yaml_UTF8_ENCODING { + if !yaml_emitter_write_bom(emitter) { + return false + } + } + emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE + return true +} + +// Expect DOCUMENT-START or STREAM-END. +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + + if event.typ == yaml_DOCUMENT_START_EVENT { + + if event.version_directive != nil { + if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { + return false + } + } + + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { + return false + } + if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { + return false + } + } + + for i := 0; i < len(default_tag_directives); i++ { + tag_directive := &default_tag_directives[i] + if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { + return false + } + } + + implicit := event.implicit + if !first || emitter.canonical { + implicit = false + } + + if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if event.version_directive != nil { + implicit = false + if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if len(event.tag_directives) > 0 { + implicit = false + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { + return false + } + if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if yaml_emitter_check_empty_document(emitter) { + implicit = false + } + if !implicit { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { + return false + } + if emitter.canonical || true { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if len(emitter.head_comment) > 0 { + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !put_break(emitter) { + return false + } + } + + emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE + return true + } + + if event.typ == yaml_STREAM_END_EVENT { + if emitter.open_ended { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_END_STATE + return true + } + + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") +} + +// yaml_emitter_increase_indent preserves the original signature and delegates to +// yaml_emitter_increase_indent_compact without compact-sequence indentation +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + return yaml_emitter_increase_indent_compact(emitter, flow, indentless, false) +} + +// yaml_emitter_process_line_comment preserves the original signature and delegates to +// yaml_emitter_process_line_comment_linebreak passing false for linebreak +func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { + return yaml_emitter_process_line_comment_linebreak(emitter, false) +} + +// Expect the root node. +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect DOCUMENT-END. +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_DOCUMENT_END_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") + } + // [Go] Force document foot separation. + emitter.foot_indent = 0 + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.foot_indent = -1 + if !yaml_emitter_write_indent(emitter) { + return false + } + if !event.implicit { + // [Go] Allocate the slice elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_DOCUMENT_START_STATE + emitter.tag_directives = emitter.tag_directives[:0] + return true +} + +// Expect a flow item node. +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_SEQUENCE_END_EVENT { + if emitter.canonical && !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.column == 0 || emitter.canonical && !first { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + + return true + } + + if !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect a flow key node. +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_MAPPING_END_EVENT { + if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + + if !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a flow value node. +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { + return false + } + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect a block item node. +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + // emitter.mapping context tells us if we are currently in a mapping context. + // emiiter.column tells us which column we are in in the yaml output. 0 is the first char of the column. + // emitter.indentation tells us if the last character was an indentation character. + // emitter.compact_sequence_indent tells us if '- ' is considered part of the indentation for sequence elements. + // So, `seq` means that we are in a mapping context, and we are either at the first char of the column or + // the last character was not an indentation character, and we consider '- ' part of the indentation + // for sequence elements. + seq := emitter.mapping_context && (emitter.column == 0 || !emitter.indention) && + emitter.compact_sequence_indent + if !yaml_emitter_increase_indent_compact(emitter, false, false, seq) { + return false + } + } + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect a block key node. +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, false) { + return false + } + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if event.typ == yaml_MAPPING_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if len(emitter.line_comment) > 0 { + // [Go] A line comment was provided for the key. That's unusual as the + // scanner associates line comments with the value. Either way, + // save the line comment and render it appropriately later. + emitter.key_line_comment = emitter.line_comment + emitter.line_comment = nil + } + if yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block value node. +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { + return false + } + } + if len(emitter.key_line_comment) > 0 { + // [Go] Line comments are generally associated with the value, but when there's + // no value on the same line as a mapping key they end up attached to the + // key itself. + if event.typ == yaml_SCALAR_EVENT { + if len(emitter.line_comment) == 0 { + // A scalar is coming and it has no line comments by itself yet, + // so just let it handle the line comment as usual. If it has a + // line comment, we can't have both so the one from the key is lost. + emitter.line_comment = emitter.key_line_comment + emitter.key_line_comment = nil + } + } else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) { + // An indented block follows, so write the comment right now. + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + if !yaml_emitter_process_line_comment(emitter) { + return false + } + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + } + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0 +} + +// Expect a node. +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, + root bool, sequence bool, mapping bool, simple_key bool) bool { + + emitter.root_context = root + emitter.sequence_context = sequence + emitter.mapping_context = mapping + emitter.simple_key_context = simple_key + + switch event.typ { + case yaml_ALIAS_EVENT: + return yaml_emitter_emit_alias(emitter, event) + case yaml_SCALAR_EVENT: + return yaml_emitter_emit_scalar(emitter, event) + case yaml_SEQUENCE_START_EVENT: + return yaml_emitter_emit_sequence_start(emitter, event) + case yaml_MAPPING_START_EVENT: + return yaml_emitter_emit_mapping_start(emitter, event) + default: + return yaml_emitter_set_emitter_error(emitter, + fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) + } +} + +// Expect ALIAS. +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SCALAR. +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_select_scalar_style(emitter, event) { + return false + } + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + if !yaml_emitter_process_scalar(emitter) { + return false + } + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SEQUENCE-START. +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || + yaml_emitter_check_empty_sequence(emitter) { + emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE + } + return true +} + +// Expect MAPPING-START. +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || + yaml_emitter_check_empty_mapping(emitter) { + emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE + } + return true +} + +// Check if the document content is an empty scalar. +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { + return false // [Go] Huh? +} + +// Check if the next events represent an empty sequence. +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT +} + +// Check if the next events represent an empty mapping. +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT +} + +// Check if the next node can be expressed as a simple key. +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { + length := 0 + switch emitter.events[emitter.events_head].typ { + case yaml_ALIAS_EVENT: + length += len(emitter.anchor_data.anchor) + case yaml_SCALAR_EVENT: + if emitter.scalar_data.multiline { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + + len(emitter.scalar_data.value) + case yaml_SEQUENCE_START_EVENT: + if !yaml_emitter_check_empty_sequence(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + case yaml_MAPPING_START_EVENT: + if !yaml_emitter_check_empty_mapping(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + default: + return false + } + return length <= 128 +} + +// Determine an acceptable scalar style. +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 + if no_tag && !event.implicit && !event.quoted_implicit { + return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") + } + + style := event.scalar_style() + if style == yaml_ANY_SCALAR_STYLE { + style = yaml_PLAIN_SCALAR_STYLE + } + if emitter.canonical { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + if emitter.simple_key_context && emitter.scalar_data.multiline { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + if style == yaml_PLAIN_SCALAR_STYLE { + if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || + emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if no_tag && !event.implicit { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { + if !emitter.scalar_data.single_quoted_allowed { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { + if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + + if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { + emitter.tag_data.handle = []byte{'!'} + } + emitter.scalar_data.style = style + return true +} + +// Write an anchor. +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { + if emitter.anchor_data.anchor == nil { + return true + } + c := []byte{'&'} + if emitter.anchor_data.alias { + c[0] = '*' + } + if !yaml_emitter_write_indicator(emitter, c, true, false, false) { + return false + } + return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) +} + +// Write a tag. +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { + if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { + return true + } + if len(emitter.tag_data.handle) > 0 { + if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { + return false + } + if len(emitter.tag_data.suffix) > 0 { + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + } + } else { + // [Go] Allocate these slices elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { + return false + } + } + return true +} + +// Write a scalar. +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { + switch emitter.scalar_data.style { + case yaml_PLAIN_SCALAR_STYLE: + return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_SINGLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_DOUBLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_LITERAL_SCALAR_STYLE: + return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) + + case yaml_FOLDED_SCALAR_STYLE: + return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) + } + panic("unknown scalar style") +} + +// Write a head comment. +func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { + if len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.tail_comment) { + return false + } + emitter.tail_comment = emitter.tail_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + } + + if len(emitter.head_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.head_comment) { + return false + } + emitter.head_comment = emitter.head_comment[:0] + return true +} + +// Write an line comment. +func yaml_emitter_process_line_comment_linebreak(emitter *yaml_emitter_t, linebreak bool) bool { + if len(emitter.line_comment) == 0 { + // The next 3 lines are needed to resolve an issue with leading newlines + // See https://github.com/go-yaml/yaml/issues/755 + // When linebreak is set to true, put_break will be called and will add + // the needed newline. + if linebreak && !put_break(emitter) { + return false + } + return true + } + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !yaml_emitter_write_comment(emitter, emitter.line_comment) { + return false + } + emitter.line_comment = emitter.line_comment[:0] + return true +} + +// Write a foot comment. +func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool { + if len(emitter.foot_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.foot_comment) { + return false + } + emitter.foot_comment = emitter.foot_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + return true +} + +// Check if a %YAML directive is valid. +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { + if version_directive.major != 1 || version_directive.minor != 1 { + return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") + } + return true +} + +// Check if a %TAG directive is valid. +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { + handle := tag_directive.handle + prefix := tag_directive.prefix + if len(handle) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") + } + if handle[0] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") + } + if handle[len(handle)-1] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") + } + for i := 1; i < len(handle)-1; i += width(handle[i]) { + if !is_alpha(handle, i) { + return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") + } + } + if len(prefix) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") + } + return true +} + +// Check if an anchor is valid. +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { + if len(anchor) == 0 { + problem := "anchor value must not be empty" + if alias { + problem = "alias value must not be empty" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + for i := 0; i < len(anchor); i += width(anchor[i]) { + if !is_alpha(anchor, i) { + problem := "anchor value must contain alphanumerical characters only" + if alias { + problem = "alias value must contain alphanumerical characters only" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + } + emitter.anchor_data.anchor = anchor + emitter.anchor_data.alias = alias + return true +} + +// Check if a tag is valid. +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { + if len(tag) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") + } + for i := 0; i < len(emitter.tag_directives); i++ { + tag_directive := &emitter.tag_directives[i] + if bytes.HasPrefix(tag, tag_directive.prefix) { + emitter.tag_data.handle = tag_directive.handle + emitter.tag_data.suffix = tag[len(tag_directive.prefix):] + return true + } + } + emitter.tag_data.suffix = tag + return true +} + +// Check if a scalar is valid. +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { + var ( + block_indicators = false + flow_indicators = false + line_breaks = false + special_characters = false + tab_characters = false + + leading_space = false + leading_break = false + trailing_space = false + trailing_break = false + break_space = false + space_break = false + + preceded_by_whitespace = false + followed_by_whitespace = false + previous_space = false + previous_break = false + ) + + emitter.scalar_data.value = value + + if len(value) == 0 { + emitter.scalar_data.multiline = false + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = false + return true + } + + if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { + block_indicators = true + flow_indicators = true + } + + preceded_by_whitespace = true + for i, w := 0, 0; i < len(value); i += w { + w = width(value[i]) + followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) + + if i == 0 { + switch value[i] { + case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': + flow_indicators = true + block_indicators = true + case '?', ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '-': + if followed_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } else { + switch value[i] { + case ',', '?', '[', ']', '{', '}': + flow_indicators = true + case ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '#': + if preceded_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } + + if value[i] == '\t' { + tab_characters = true + } else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { + special_characters = true + } + if is_space(value, i) { + if i == 0 { + leading_space = true + } + if i+width(value[i]) == len(value) { + trailing_space = true + } + if previous_break { + break_space = true + } + previous_space = true + previous_break = false + } else if is_break(value, i) { + line_breaks = true + if i == 0 { + leading_break = true + } + if i+width(value[i]) == len(value) { + trailing_break = true + } + if previous_space { + space_break = true + } + previous_space = false + previous_break = true + } else { + previous_space = false + previous_break = false + } + + // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. + preceded_by_whitespace = is_blankz(value, i) + } + + emitter.scalar_data.multiline = line_breaks + emitter.scalar_data.flow_plain_allowed = true + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = true + + if leading_space || leading_break || trailing_space || trailing_break { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if trailing_space { + emitter.scalar_data.block_allowed = false + } + if break_space { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || tab_characters || special_characters { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || special_characters { + emitter.scalar_data.block_allowed = false + } + if line_breaks { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if flow_indicators { + emitter.scalar_data.flow_plain_allowed = false + } + if block_indicators { + emitter.scalar_data.block_plain_allowed = false + } + return true +} + +// Check if the event data is valid. +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + emitter.anchor_data.anchor = nil + emitter.tag_data.handle = nil + emitter.tag_data.suffix = nil + emitter.scalar_data.value = nil + + if len(event.head_comment) > 0 { + emitter.head_comment = event.head_comment + } + if len(event.line_comment) > 0 { + emitter.line_comment = event.line_comment + } + if len(event.foot_comment) > 0 { + emitter.foot_comment = event.foot_comment + } + if len(event.tail_comment) > 0 { + emitter.tail_comment = event.tail_comment + } + + switch event.typ { + case yaml_ALIAS_EVENT: + if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { + return false + } + + case yaml_SCALAR_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + if !yaml_emitter_analyze_scalar(emitter, event.value) { + return false + } + + case yaml_SEQUENCE_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + + case yaml_MAPPING_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + } + return true +} + +// Write the BOM character. +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { + if !flush(emitter) { + return false + } + pos := emitter.buffer_pos + emitter.buffer[pos+0] = '\xEF' + emitter.buffer[pos+1] = '\xBB' + emitter.buffer[pos+2] = '\xBF' + emitter.buffer_pos += 3 + return true +} + +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { + indent := emitter.indent + if indent < 0 { + indent = 0 + } + if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { + if !put_break(emitter) { + return false + } + } + if emitter.foot_indent == indent { + if !put_break(emitter) { + return false + } + } + for emitter.column < indent { + if !put(emitter, ' ') { + return false + } + } + emitter.whitespace = true + //emitter.indention = true + emitter.space_above = false + emitter.foot_indent = -1 + return true +} + +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, indicator) { + return false + } + emitter.whitespace = is_whitespace + emitter.indention = (emitter.indention && is_indention) + emitter.open_ended = false + return true +} + +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + for i := 0; i < len(value); { + var must_write bool + switch value[i] { + case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': + must_write = true + default: + must_write = is_alpha(value, i) + } + if must_write { + if !write(emitter, value, &i) { + return false + } + } else { + w := width(value[i]) + for k := 0; k < w; k++ { + octet := value[i] + i++ + if !put(emitter, '%') { + return false + } + + c := octet >> 4 + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + + c = octet & 0x0f + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + } + } + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + if len(value) > 0 && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + + if len(value) > 0 { + emitter.whitespace = false + } + emitter.indention = false + if emitter.root_context { + emitter.open_ended = true + } + + return true +} + +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { + return false + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if value[i] == '\'' { + if !put(emitter, '\'') { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + spaces := false + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { + return false + } + + for i := 0; i < len(value); { + if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || + is_bom(value, i) || is_break(value, i) || + value[i] == '"' || value[i] == '\\' { + + octet := value[i] + + var w int + var v rune + switch { + case octet&0x80 == 0x00: + w, v = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, v = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, v = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, v = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = value[i+k] + v = (v << 6) + (rune(octet) & 0x3F) + } + i += w + + if !put(emitter, '\\') { + return false + } + + var ok bool + switch v { + case 0x00: + ok = put(emitter, '0') + case 0x07: + ok = put(emitter, 'a') + case 0x08: + ok = put(emitter, 'b') + case 0x09: + ok = put(emitter, 't') + case 0x0A: + ok = put(emitter, 'n') + case 0x0b: + ok = put(emitter, 'v') + case 0x0c: + ok = put(emitter, 'f') + case 0x0d: + ok = put(emitter, 'r') + case 0x1b: + ok = put(emitter, 'e') + case 0x22: + ok = put(emitter, '"') + case 0x5c: + ok = put(emitter, '\\') + case 0x85: + ok = put(emitter, 'N') + case 0xA0: + ok = put(emitter, '_') + case 0x2028: + ok = put(emitter, 'L') + case 0x2029: + ok = put(emitter, 'P') + default: + if v <= 0xFF { + ok = put(emitter, 'x') + w = 2 + } else if v <= 0xFFFF { + ok = put(emitter, 'u') + w = 4 + } else { + ok = put(emitter, 'U') + w = 8 + } + for k := (w - 1) * 4; ok && k >= 0; k -= 4 { + digit := byte((v >> uint(k)) & 0x0F) + if digit < 10 { + ok = put(emitter, digit+'0') + } else { + ok = put(emitter, digit+'A'-10) + } + } + } + if !ok { + return false + } + spaces = false + } else if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if is_space(value, i+1) { + if !put(emitter, '\\') { + return false + } + } + i += width(value[i]) + } else if !write(emitter, value, &i) { + return false + } + spaces = true + } else { + if !write(emitter, value, &i) { + return false + } + spaces = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { + if is_space(value, 0) || is_break(value, 0) { + indent_hint := []byte{'0' + byte(emitter.best_indent)} + if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { + return false + } + } + + emitter.open_ended = false + + var chomp_hint [1]byte + if len(value) == 0 { + chomp_hint[0] = '-' + } else { + i := len(value) - 1 + for value[i]&0xC0 == 0x80 { + i-- + } + if !is_break(value, i) { + chomp_hint[0] = '-' + } else if i == 0 { + chomp_hint[0] = '+' + emitter.open_ended = true + } else { + i-- + for value[i]&0xC0 == 0x80 { + i-- + } + if is_break(value, i) { + chomp_hint[0] = '+' + emitter.open_ended = true + } + } + } + if chomp_hint[0] != 0 { + if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { + return false + } + } + return true +} + +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + if !yaml_emitter_process_line_comment_linebreak(emitter, true) { + return false + } + //emitter.indention = true + emitter.whitespace = true + breaks := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + + return true +} + +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + if !yaml_emitter_process_line_comment_linebreak(emitter, true) { + return false + } + + //emitter.indention = true + emitter.whitespace = true + + breaks := true + leading_spaces := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !breaks && !leading_spaces && value[i] == '\n' { + k := 0 + for is_break(value, k) { + k += width(value[k]) + } + if !is_blankz(value, k) { + if !put_break(emitter) { + return false + } + } + } + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + leading_spaces = is_blank(value, i) + } + if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + emitter.indention = false + breaks = false + } + } + return true +} + +func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool { + breaks := false + pound := false + for i := 0; i < len(comment); { + if is_break(comment, i) { + if !write_break(emitter, comment, &i) { + return false + } + //emitter.indention = true + breaks = true + pound = false + } else { + if breaks && !yaml_emitter_write_indent(emitter) { + return false + } + if !pound { + if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) { + return false + } + pound = true + } + if !write(emitter, comment, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + if !breaks && !put_break(emitter) { + return false + } + + emitter.whitespace = true + //emitter.indention = true + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/encode.go b/vendor/go.yaml.in/yaml/v3/encode.go new file mode 100644 index 0000000000..de9e72a3e6 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/encode.go @@ -0,0 +1,577 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding" + "fmt" + "io" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +type encoder struct { + emitter yaml_emitter_t + event yaml_event_t + out []byte + flow bool + indent int + doneInit bool +} + +func newEncoder() *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_string(&e.emitter, &e.out) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func newEncoderWithWriter(w io.Writer) *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_writer(&e.emitter, w) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func (e *encoder) init() { + if e.doneInit { + return + } + if e.indent == 0 { + e.indent = 4 + } + e.emitter.best_indent = e.indent + yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) + e.emit() + e.doneInit = true +} + +func (e *encoder) finish() { + e.emitter.open_ended = false + yaml_stream_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) destroy() { + yaml_emitter_delete(&e.emitter) +} + +func (e *encoder) emit() { + // This will internally delete the e.event value. + e.must(yaml_emitter_emit(&e.emitter, &e.event)) +} + +func (e *encoder) must(ok bool) { + if !ok { + msg := e.emitter.problem + if msg == "" { + msg = "unknown problem generating YAML content" + } + failf("%s", msg) + } +} + +func (e *encoder) marshalDoc(tag string, in reflect.Value) { + e.init() + var node *Node + if in.IsValid() { + node, _ = in.Interface().(*Node) + } + if node != nil && node.Kind == DocumentNode { + e.nodev(in) + } else { + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.emit() + e.marshal(tag, in) + yaml_document_end_event_initialize(&e.event, true) + e.emit() + } +} + +func (e *encoder) marshal(tag string, in reflect.Value) { + tag = shortTag(tag) + if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { + e.nilv() + return + } + iface := in.Interface() + switch value := iface.(type) { + case *Node: + e.nodev(in) + return + case Node: + if !in.CanAddr() { + var n = reflect.New(in.Type()).Elem() + n.Set(in) + in = n + } + e.nodev(in.Addr()) + return + case time.Time: + e.timev(tag, in) + return + case *time.Time: + e.timev(tag, in.Elem()) + return + case time.Duration: + e.stringv(tag, reflect.ValueOf(value.String())) + return + case Marshaler: + v, err := value.MarshalYAML() + if err != nil { + fail(err) + } + if v == nil { + e.nilv() + return + } + e.marshal(tag, reflect.ValueOf(v)) + return + case encoding.TextMarshaler: + text, err := value.MarshalText() + if err != nil { + fail(err) + } + in = reflect.ValueOf(string(text)) + case nil: + e.nilv() + return + } + switch in.Kind() { + case reflect.Interface: + e.marshal(tag, in.Elem()) + case reflect.Map: + e.mapv(tag, in) + case reflect.Ptr: + e.marshal(tag, in.Elem()) + case reflect.Struct: + e.structv(tag, in) + case reflect.Slice, reflect.Array: + e.slicev(tag, in) + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + e.intv(tag, in) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + e.uintv(tag, in) + case reflect.Float32, reflect.Float64: + e.floatv(tag, in) + case reflect.Bool: + e.boolv(tag, in) + default: + panic("cannot marshal type: " + in.Type().String()) + } +} + +func (e *encoder) mapv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + keys := keyList(in.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + e.marshal("", k) + e.marshal("", in.MapIndex(k)) + } + }) +} + +func (e *encoder) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) { + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + return reflect.Value{} + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +func (e *encoder) structv(tag string, in reflect.Value) { + sinfo, err := getStructInfo(in.Type()) + if err != nil { + panic(err) + } + e.mappingv(tag, func() { + for _, info := range sinfo.FieldsList { + var value reflect.Value + if info.Inline == nil { + value = in.Field(info.Num) + } else { + value = e.fieldByIndex(in, info.Inline) + if !value.IsValid() { + continue + } + } + if info.OmitEmpty && isZero(value) { + continue + } + e.marshal("", reflect.ValueOf(info.Key)) + e.flow = info.Flow + e.marshal("", value) + } + if sinfo.InlineMap >= 0 { + m := in.Field(sinfo.InlineMap) + if m.Len() > 0 { + e.flow = false + keys := keyList(m.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + if _, found := sinfo.FieldsMap[k.String()]; found { + panic(fmt.Sprintf("cannot have key %q in inlined map: conflicts with struct field", k.String())) + } + e.marshal("", k) + e.flow = false + e.marshal("", m.MapIndex(k)) + } + } + } + }) +} + +func (e *encoder) mappingv(tag string, f func()) { + implicit := tag == "" + style := yaml_BLOCK_MAPPING_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) + e.emit() + f() + yaml_mapping_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) slicev(tag string, in reflect.Value) { + implicit := tag == "" + style := yaml_BLOCK_SEQUENCE_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + n := in.Len() + for i := 0; i < n; i++ { + e.marshal("", in.Index(i)) + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.emit() +} + +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. +// +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported +// in YAML 1.2 and by this package, but these should be marshalled quoted for +// the time being for compatibility with other parsers. +func isBase60Float(s string) (result bool) { + // Fast path. + if s == "" { + return false + } + c := s[0] + if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { + return false + } + // Do the full match. + return base60float.MatchString(s) +} + +// From http://yaml.org/type/float.html, except the regular expression there +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) + +// isOldBool returns whether s is bool notation as defined in YAML 1.1. +// +// We continue to force strings that YAML 1.1 would interpret as booleans to be +// rendered as quotes strings so that the marshalled output valid for YAML 1.1 +// parsing. +func isOldBool(s string) (result bool) { + switch s { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON", + "n", "N", "no", "No", "NO", "off", "Off", "OFF": + return true + default: + return false + } +} + +func (e *encoder) stringv(tag string, in reflect.Value) { + var style yaml_scalar_style_t + s := in.String() + canUsePlain := true + switch { + case !utf8.ValidString(s): + if tag == binaryTag { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if tag != "" { + failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = binaryTag + s = encodeBase64(s) + case tag == "": + // Check to see if it would resolve to a specific + // tag when encoded unquoted. If it doesn't, + // there's no need to quote it. + rtag, _ := resolve("", s) + canUsePlain = rtag == strTag && !(isBase60Float(s) || isOldBool(s)) + } + // Note: it's possible for user code to emit invalid YAML + // if they explicitly specify a tag and a string containing + // text that's incompatible with that tag. + switch { + case strings.Contains(s, "\n"): + if e.flow { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } else { + style = yaml_LITERAL_SCALAR_STYLE + } + case canUsePlain: + style = yaml_PLAIN_SCALAR_STYLE + default: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style, nil, nil, nil, nil) +} + +func (e *encoder) boolv(tag string, in reflect.Value) { + var s string + if in.Bool() { + s = "true" + } else { + s = "false" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) timev(tag string, in reflect.Value) { + t := in.Interface().(time.Time) + s := t.Format(time.RFC3339Nano) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // Issue #352: When formatting, use the precision of the underlying value + precision := 64 + if in.Kind() == reflect.Float32 { + precision = 32 + } + + s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t, head, line, foot, tail []byte) { + // TODO Kill this function. Replace all initialize calls by their underlining Go literals. + implicit := tag == "" + if !implicit { + tag = longTag(tag) + } + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.event.head_comment = head + e.event.line_comment = line + e.event.foot_comment = foot + e.event.tail_comment = tail + e.emit() +} + +func (e *encoder) nodev(in reflect.Value) { + e.node(in.Interface().(*Node), "") +} + +func (e *encoder) node(node *Node, tail string) { + // Zero nodes behave as nil. + if node.Kind == 0 && node.IsZero() { + e.nilv() + return + } + + // If the tag was not explicitly requested, and dropping it won't change the + // implicit tag of the value, don't include it in the presentation. + var tag = node.Tag + var stag = shortTag(tag) + var forceQuoting bool + if tag != "" && node.Style&TaggedStyle == 0 { + if node.Kind == ScalarNode { + if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 { + tag = "" + } else { + rtag, _ := resolve("", node.Value) + if rtag == stag { + tag = "" + } else if stag == strTag { + tag = "" + forceQuoting = true + } + } + } else { + var rtag string + switch node.Kind { + case MappingNode: + rtag = mapTag + case SequenceNode: + rtag = seqTag + } + if rtag == stag { + tag = "" + } + } + } + + switch node.Kind { + case DocumentNode: + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + yaml_document_end_event_initialize(&e.event, true) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case SequenceNode: + style := yaml_BLOCK_SEQUENCE_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style)) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case MappingNode: + style := yaml_BLOCK_MAPPING_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style) + e.event.tail_comment = []byte(tail) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + + // The tail logic below moves the foot comment of prior keys to the following key, + // since the value for each key may be a nested structure and the foot needs to be + // processed only the entirety of the value is streamed. The last tail is processed + // with the mapping end event. + var tail string + for i := 0; i+1 < len(node.Content); i += 2 { + k := node.Content[i] + foot := k.FootComment + if foot != "" { + kopy := *k + kopy.FootComment = "" + k = &kopy + } + e.node(k, tail) + tail = foot + + v := node.Content[i+1] + e.node(v, "") + } + + yaml_mapping_end_event_initialize(&e.event) + e.event.tail_comment = []byte(tail) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case AliasNode: + yaml_alias_event_initialize(&e.event, []byte(node.Value)) + e.event.head_comment = []byte(node.HeadComment) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case ScalarNode: + value := node.Value + if !utf8.ValidString(value) { + if stag == binaryTag { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if stag != "" { + failf("cannot marshal invalid UTF-8 data as %s", stag) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = binaryTag + value = encodeBase64(value) + } + + style := yaml_PLAIN_SCALAR_STYLE + switch { + case node.Style&DoubleQuotedStyle != 0: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + case node.Style&SingleQuotedStyle != 0: + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + case node.Style&LiteralStyle != 0: + style = yaml_LITERAL_SCALAR_STYLE + case node.Style&FoldedStyle != 0: + style = yaml_FOLDED_SCALAR_STYLE + case strings.Contains(value, "\n"): + style = yaml_LITERAL_SCALAR_STYLE + case forceQuoting: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail)) + default: + failf("cannot encode node with unknown kind %d", node.Kind) + } +} diff --git a/vendor/go.yaml.in/yaml/v3/parserc.go b/vendor/go.yaml.in/yaml/v3/parserc.go new file mode 100644 index 0000000000..25fe823637 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/parserc.go @@ -0,0 +1,1274 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "bytes" +) + +// The parser implements the following grammar: +// +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// implicit_document ::= block_node DOCUMENT-END* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// block_node_or_indentless_sequence ::= +// ALIAS +// | properties (block_content | indentless_block_sequence)? +// | block_content +// | indentless_block_sequence +// block_node ::= ALIAS +// | properties block_content? +// | block_content +// flow_node ::= ALIAS +// | properties flow_content? +// | flow_content +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// block_content ::= block_collection | flow_collection | SCALAR +// flow_content ::= flow_collection | SCALAR +// block_collection ::= block_sequence | block_mapping +// flow_collection ::= flow_sequence | flow_mapping +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// block_mapping ::= BLOCK-MAPPING_START +// ((KEY block_node_or_indentless_sequence?)? +// (VALUE block_node_or_indentless_sequence?)?)* +// BLOCK-END +// flow_sequence ::= FLOW-SEQUENCE-START +// (flow_sequence_entry FLOW-ENTRY)* +// flow_sequence_entry? +// FLOW-SEQUENCE-END +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// flow_mapping ::= FLOW-MAPPING-START +// (flow_mapping_entry FLOW-ENTRY)* +// flow_mapping_entry? +// FLOW-MAPPING-END +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + +// Peek the next token in the token queue. +func peek_token(parser *yaml_parser_t) *yaml_token_t { + if parser.token_available || yaml_parser_fetch_more_tokens(parser) { + token := &parser.tokens[parser.tokens_head] + yaml_parser_unfold_comments(parser, token) + return token + } + return nil +} + +// yaml_parser_unfold_comments walks through the comments queue and joins all +// comments behind the position of the provided token into the respective +// top-level comment slices in the parser. +func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) { + for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index { + comment := &parser.comments[parser.comments_head] + if len(comment.head) > 0 { + if token.typ == yaml_BLOCK_END_TOKEN { + // No heads on ends, so keep comment.head for a follow up token. + break + } + if len(parser.head_comment) > 0 { + parser.head_comment = append(parser.head_comment, '\n') + } + parser.head_comment = append(parser.head_comment, comment.head...) + } + if len(comment.foot) > 0 { + if len(parser.foot_comment) > 0 { + parser.foot_comment = append(parser.foot_comment, '\n') + } + parser.foot_comment = append(parser.foot_comment, comment.foot...) + } + if len(comment.line) > 0 { + if len(parser.line_comment) > 0 { + parser.line_comment = append(parser.line_comment, '\n') + } + parser.line_comment = append(parser.line_comment, comment.line...) + } + *comment = yaml_comment_t{} + parser.comments_head++ + } +} + +// Remove the next token from the queue (must be called after peek_token). +func skip_token(parser *yaml_parser_t) { + parser.token_available = false + parser.tokens_parsed++ + parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN + parser.tokens_head++ +} + +// Get the next event. +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { + // Erase the event object. + *event = yaml_event_t{} + + // No events after the end of the stream or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { + return true + } + + // Generate the next event. + return yaml_parser_state_machine(parser, event) +} + +// Set parser error. +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +// State dispatcher. +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { + //trace("yaml_parser_state_machine", "state:", parser.state.String()) + + switch parser.state { + case yaml_PARSE_STREAM_START_STATE: + return yaml_parser_parse_stream_start(parser, event) + + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, true) + + case yaml_PARSE_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, false) + + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return yaml_parser_parse_document_content(parser, event) + + case yaml_PARSE_DOCUMENT_END_STATE: + return yaml_parser_parse_document_end(parser, event) + + case yaml_PARSE_BLOCK_NODE_STATE: + return yaml_parser_parse_node(parser, event, true, false) + + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return yaml_parser_parse_node(parser, event, true, true) + + case yaml_PARSE_FLOW_NODE_STATE: + return yaml_parser_parse_node(parser, event, false, false) + + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, true) + + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, false) + + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_indentless_sequence_entry(parser, event) + + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, true) + + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, false) + + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return yaml_parser_parse_block_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, true) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, false) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) + + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, true) + + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, true) + + default: + panic("invalid parser state") + } +} + +// Parse the production: +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// +// ************ +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_STREAM_START_TOKEN { + return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) + } + parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + encoding: token.encoding, + } + skip_token(parser) + return true +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// +// * +// +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// +// ************************* +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { + + token := peek_token(parser) + if token == nil { + return false + } + + // Parse extra document end indicators. + if !implicit { + for token.typ == yaml_DOCUMENT_END_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && + token.typ != yaml_TAG_DIRECTIVE_TOKEN && + token.typ != yaml_DOCUMENT_START_TOKEN && + token.typ != yaml_STREAM_END_TOKEN { + // Parse an implicit document. + if !yaml_parser_process_directives(parser, nil, nil) { + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_BLOCK_NODE_STATE + + var head_comment []byte + if len(parser.head_comment) > 0 { + // [Go] Scan the header comment backwards, and if an empty line is found, break + // the header so the part before the last empty line goes into the + // document header, while the bottom of it goes into a follow up event. + for i := len(parser.head_comment) - 1; i > 0; i-- { + if parser.head_comment[i] == '\n' { + if i == len(parser.head_comment)-1 { + head_comment = parser.head_comment[:i] + parser.head_comment = parser.head_comment[i+1:] + break + } else if parser.head_comment[i-1] == '\n' { + head_comment = parser.head_comment[:i-1] + parser.head_comment = parser.head_comment[i+1:] + break + } + } + } + } + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + + head_comment: head_comment, + } + + } else if token.typ != yaml_STREAM_END_TOKEN { + // Parse an explicit document. + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + start_mark := token.start_mark + if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { + return false + } + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_DOCUMENT_START_TOKEN { + yaml_parser_set_parser_error(parser, + "did not find expected ", token.start_mark) + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE + end_mark := token.end_mark + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: false, + } + skip_token(parser) + + } else { + // Parse the stream end. + parser.state = yaml_PARSE_END_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + } + + return true +} + +// Parse the productions: +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// +// *********** +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || + token.typ == yaml_TAG_DIRECTIVE_TOKEN || + token.typ == yaml_DOCUMENT_START_TOKEN || + token.typ == yaml_DOCUMENT_END_TOKEN || + token.typ == yaml_STREAM_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + return yaml_parser_process_empty_scalar(parser, event, + token.start_mark) + } + return yaml_parser_parse_node(parser, event, true, false) +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// +// ************* +// +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + start_mark := token.start_mark + end_mark := token.start_mark + + implicit := true + if token.typ == yaml_DOCUMENT_END_TOKEN { + end_mark = token.end_mark + skip_token(parser) + implicit = false + } + + parser.tag_directives = parser.tag_directives[:0] + + parser.state = yaml_PARSE_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + start_mark: start_mark, + end_mark: end_mark, + implicit: implicit, + } + yaml_parser_set_event_comments(parser, event) + if len(event.head_comment) > 0 && len(event.foot_comment) == 0 { + event.foot_comment = event.head_comment + event.head_comment = nil + } + return true +} + +func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) { + event.head_comment = parser.head_comment + event.line_comment = parser.line_comment + event.foot_comment = parser.foot_comment + parser.head_comment = nil + parser.line_comment = nil + parser.foot_comment = nil + parser.tail_comment = nil + parser.stem_comment = nil +} + +// Parse the productions: +// block_node_or_indentless_sequence ::= +// +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * +// +// block_node ::= ALIAS +// +// ***** +// | properties block_content? +// ********** * +// | block_content +// * +// +// flow_node ::= ALIAS +// +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * +// +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// +// ************************* +// +// block_content ::= block_collection | flow_collection | SCALAR +// +// ****** +// +// flow_content ::= flow_collection | SCALAR +// +// ****** +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { + //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_ALIAS_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + anchor: token.value, + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true + } + + start_mark := token.start_mark + end_mark := token.start_mark + + var tag_token bool + var tag_handle, tag_suffix, anchor []byte + var tag_mark yaml_mark_t + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + start_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } else if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + start_mark = token.start_mark + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + var tag []byte + if tag_token { + if len(tag_handle) == 0 { + tag = tag_suffix + tag_suffix = nil + } else { + for i := range parser.tag_directives { + if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { + tag = append([]byte(nil), parser.tag_directives[i].prefix...) + tag = append(tag, tag_suffix...) + break + } + } + if len(tag) == 0 { + yaml_parser_set_parser_error_context(parser, + "while parsing a node", start_mark, + "found undefined tag handle", tag_mark) + return false + } + } + } + + implicit := len(tag) == 0 + if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_SCALAR_TOKEN { + var plain_implicit, quoted_implicit bool + end_mark = token.end_mark + if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { + plain_implicit = true + } else if len(tag) == 0 { + quoted_implicit = true + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + value: token.value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(token.style), + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true + } + if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { + // [Go] Some of the events below can be merged as they differ only on style. + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), + } + yaml_parser_set_event_comments(parser, event) + return true + } + if token.typ == yaml_FLOW_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + yaml_parser_set_event_comments(parser, event) + return true + } + if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } + return true + } + if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), + } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } + return true + } + if len(anchor) > 0 || len(tag) > 0 { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + quoted_implicit: false, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true + } + + context := "while parsing a flow node" + if block { + context = "while parsing a block node" + } + yaml_parser_set_parser_error_context(parser, context, start_mark, + "did not find expected node content", token.start_mark) + return false +} + +// Parse the productions: +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// +// ******************** *********** * ********* +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + if token == nil { + return false + } + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + prior_head_len := len(parser.head_comment) + skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } else { + parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } + if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block collection", context_mark, + "did not find expected '-' indicator", token.start_mark) +} + +// Parse the productions: +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// +// *********** * +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + prior_head_len := len(parser.head_comment) + skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && + token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? + } + return true +} + +// Split stem comment from head comment. +// +// When a sequence or map is found under a sequence entry, the former head comment +// is assigned to the underlying sequence or map as a whole, not the individual +// sequence or map entry as would be expected otherwise. To handle this case the +// previous head comment is moved aside as the stem comment. +func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { + if stem_len == 0 { + return + } + + token := peek_token(parser) + if token == nil || token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { + return + } + + parser.stem_comment = parser.head_comment[:stem_len] + if len(parser.head_comment) == stem_len { + parser.head_comment = nil + } else { + // Copy suffix to prevent very strange bugs if someone ever appends + // further bytes to the prefix in the stem_comment slice above. + parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...) + } +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* +// +// BLOCK-END +// ********* +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + if token == nil { + return false + } + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + // [Go] A tail comment was left from the prior mapping value processed. Emit an event + // as it needs to be processed with that value and not the following key. + if len(parser.tail_comment) > 0 { + *event = yaml_event_t{ + typ: yaml_TAIL_COMMENT_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + foot_comment: parser.tail_comment, + } + parser.tail_comment = nil + return true + } + + if token.typ == yaml_KEY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } else { + parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } else if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block mapping", context_mark, + "did not find expected key", token.start_mark) +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// +// ((KEY block_node_or_indentless_sequence?)? +// +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence ::= FLOW-SEQUENCE-START +// +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** +// +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// +// * +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + if token == nil { + return false + } + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow sequence", context_mark, + "did not find expected ',' or ']'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + implicit: true, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + skip_token(parser) + return true + } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + yaml_parser_set_event_comments(parser, event) + + skip_token(parser) + return true +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// +// *** * +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + mark := token.end_mark + skip_token(parser) + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// +// ***** * +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// +// * +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? + } + return true +} + +// Parse the productions: +// flow_mapping ::= FLOW-MAPPING-START +// +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** +// +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// - *** * +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow mapping", context_mark, + "did not find expected ',' or '}'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } else { + parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true +} + +// Parse the productions: +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// - ***** * +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { + token := peek_token(parser) + if token == nil { + return false + } + if empty { + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Generate an empty scalar event. +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: mark, + end_mark: mark, + value: nil, // Empty + implicit: true, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true +} + +var default_tag_directives = []yaml_tag_directive_t{ + {[]byte("!"), []byte("!")}, + {[]byte("!!"), []byte("tag:yaml.org,2002:")}, +} + +// Parse directives. +func yaml_parser_process_directives(parser *yaml_parser_t, + version_directive_ref **yaml_version_directive_t, + tag_directives_ref *[]yaml_tag_directive_t) bool { + + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + + token := peek_token(parser) + if token == nil { + return false + } + + for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { + if version_directive != nil { + yaml_parser_set_parser_error(parser, + "found duplicate %YAML directive", token.start_mark) + return false + } + if token.major != 1 || token.minor != 1 { + yaml_parser_set_parser_error(parser, + "found incompatible YAML document", token.start_mark) + return false + } + version_directive = &yaml_version_directive_t{ + major: token.major, + minor: token.minor, + } + } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { + value := yaml_tag_directive_t{ + handle: token.value, + prefix: token.prefix, + } + if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { + return false + } + tag_directives = append(tag_directives, value) + } + + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + + for i := range default_tag_directives { + if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { + return false + } + } + + if version_directive_ref != nil { + *version_directive_ref = version_directive + } + if tag_directives_ref != nil { + *tag_directives_ref = tag_directives + } + return true +} + +// Append a tag directive to the directives stack. +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { + for i := range parser.tag_directives { + if bytes.Equal(value.handle, parser.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) + } + } + + // [Go] I suspect the copy is unnecessary. This was likely done + // because there was no way to track ownership of the data. + value_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(value_copy.handle, value.handle) + copy(value_copy.prefix, value.prefix) + parser.tag_directives = append(parser.tag_directives, value_copy) + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/readerc.go b/vendor/go.yaml.in/yaml/v3/readerc.go new file mode 100644 index 0000000000..56af245366 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/readerc.go @@ -0,0 +1,434 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "io" +) + +// Set the reader error and return 0. +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { + parser.error = yaml_READER_ERROR + parser.problem = problem + parser.problem_offset = offset + parser.problem_value = value + return false +} + +// Byte order marks. +const ( + bom_UTF8 = "\xef\xbb\xbf" + bom_UTF16LE = "\xff\xfe" + bom_UTF16BE = "\xfe\xff" +) + +// Determine the input stream encoding by checking the BOM symbol. If no BOM is +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { + // Ensure that we had enough bytes in the raw buffer. + for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { + if !yaml_parser_update_raw_buffer(parser) { + return false + } + } + + // Determine the encoding. + buf := parser.raw_buffer + pos := parser.raw_buffer_pos + avail := len(buf) - pos + if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { + parser.encoding = yaml_UTF16LE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { + parser.encoding = yaml_UTF16BE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { + parser.encoding = yaml_UTF8_ENCODING + parser.raw_buffer_pos += 3 + parser.offset += 3 + } else { + parser.encoding = yaml_UTF8_ENCODING + } + return true +} + +// Update the raw buffer. +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { + size_read := 0 + + // Return if the raw buffer is full. + if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { + return true + } + + // Return on EOF. + if parser.eof { + return true + } + + // Move the remaining bytes in the raw buffer to the beginning. + if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { + copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) + } + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] + parser.raw_buffer_pos = 0 + + // Call the read handler to fill the buffer. + size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] + if err == io.EOF { + parser.eof = true + } else if err != nil { + return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) + } + return true +} + +// Ensure that the buffer contains at least `length` characters. +// Return true on success, false on failure. +// +// The length is supposed to be significantly less that the buffer size. +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { + if parser.read_handler == nil { + panic("read handler must be set") + } + + // [Go] This function was changed to guarantee the requested length size at EOF. + // The fact we need to do this is pretty awful, but the description above implies + // for that to be the case, and there are tests + + // If the EOF flag is set and the raw buffer is empty, do nothing. + if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { + // [Go] ACTUALLY! Read the documentation of this function above. + // This is just broken. To return true, we need to have the + // given length in the buffer. Not doing that means every single + // check that calls this function to make sure the buffer has a + // given length is Go) panicking; or C) accessing invalid memory. + //return true + } + + // Return if the buffer contains enough characters. + if parser.unread >= length { + return true + } + + // Determine the input encoding if it is not known yet. + if parser.encoding == yaml_ANY_ENCODING { + if !yaml_parser_determine_encoding(parser) { + return false + } + } + + // Move the unread characters to the beginning of the buffer. + buffer_len := len(parser.buffer) + if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { + copy(parser.buffer, parser.buffer[parser.buffer_pos:]) + buffer_len -= parser.buffer_pos + parser.buffer_pos = 0 + } else if parser.buffer_pos == buffer_len { + buffer_len = 0 + parser.buffer_pos = 0 + } + + // Open the whole buffer for writing, and cut it before returning. + parser.buffer = parser.buffer[:cap(parser.buffer)] + + // Fill the buffer until it has enough characters. + first := true + for parser.unread < length { + + // Fill the raw buffer if necessary. + if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { + if !yaml_parser_update_raw_buffer(parser) { + parser.buffer = parser.buffer[:buffer_len] + return false + } + } + first = false + + // Decode the raw buffer. + inner: + for parser.raw_buffer_pos != len(parser.raw_buffer) { + var value rune + var width int + + raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos + + // Decode the next character. + switch parser.encoding { + case yaml_UTF8_ENCODING: + // Decode a UTF-8 character. Check RFC 3629 + // (http://www.ietf.org/rfc/rfc3629.txt) for more details. + // + // The following table (taken from the RFC) is used for + // decoding. + // + // Char. number range | UTF-8 octet sequence + // (hexadecimal) | (binary) + // --------------------+------------------------------------ + // 0000 0000-0000 007F | 0xxxxxxx + // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + // + // Additionally, the characters in the range 0xD800-0xDFFF + // are prohibited as they are reserved for use with UTF-16 + // surrogate pairs. + + // Determine the length of the UTF-8 sequence. + octet := parser.raw_buffer[parser.raw_buffer_pos] + switch { + case octet&0x80 == 0x00: + width = 1 + case octet&0xE0 == 0xC0: + width = 2 + case octet&0xF0 == 0xE0: + width = 3 + case octet&0xF8 == 0xF0: + width = 4 + default: + // The leading octet is invalid. + return yaml_parser_set_reader_error(parser, + "invalid leading UTF-8 octet", + parser.offset, int(octet)) + } + + // Check if the raw buffer contains an incomplete character. + if width > raw_unread { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-8 octet sequence", + parser.offset, -1) + } + break inner + } + + // Decode the leading octet. + switch { + case octet&0x80 == 0x00: + value = rune(octet & 0x7F) + case octet&0xE0 == 0xC0: + value = rune(octet & 0x1F) + case octet&0xF0 == 0xE0: + value = rune(octet & 0x0F) + case octet&0xF8 == 0xF0: + value = rune(octet & 0x07) + default: + value = 0 + } + + // Check and decode the trailing octets. + for k := 1; k < width; k++ { + octet = parser.raw_buffer[parser.raw_buffer_pos+k] + + // Check if the octet is valid. + if (octet & 0xC0) != 0x80 { + return yaml_parser_set_reader_error(parser, + "invalid trailing UTF-8 octet", + parser.offset+k, int(octet)) + } + + // Decode the octet. + value = (value << 6) + rune(octet&0x3F) + } + + // Check the length of the sequence against the value. + switch { + case width == 1: + case width == 2 && value >= 0x80: + case width == 3 && value >= 0x800: + case width == 4 && value >= 0x10000: + default: + return yaml_parser_set_reader_error(parser, + "invalid length of a UTF-8 sequence", + parser.offset, -1) + } + + // Check the range of the value. + if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { + return yaml_parser_set_reader_error(parser, + "invalid Unicode character", + parser.offset, int(value)) + } + + case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: + var low, high int + if parser.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + low, high = 1, 0 + } + + // The UTF-16 encoding is not as simple as one might + // naively think. Check RFC 2781 + // (http://www.ietf.org/rfc/rfc2781.txt). + // + // Normally, two subsequent bytes describe a Unicode + // character. However a special technique (called a + // surrogate pair) is used for specifying character + // values larger than 0xFFFF. + // + // A surrogate pair consists of two pseudo-characters: + // high surrogate area (0xD800-0xDBFF) + // low surrogate area (0xDC00-0xDFFF) + // + // The following formulas are used for decoding + // and encoding characters using surrogate pairs: + // + // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) + // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) + // W1 = 110110yyyyyyyyyy + // W2 = 110111xxxxxxxxxx + // + // where U is the character value, W1 is the high surrogate + // area, W2 is the low surrogate area. + + // Check for incomplete UTF-16 character. + if raw_unread < 2 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 character", + parser.offset, -1) + } + break inner + } + + // Get the character. + value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) + + // Check for unexpected low surrogate area. + if value&0xFC00 == 0xDC00 { + return yaml_parser_set_reader_error(parser, + "unexpected low surrogate area", + parser.offset, int(value)) + } + + // Check for a high surrogate area. + if value&0xFC00 == 0xD800 { + width = 4 + + // Check for incomplete surrogate pair. + if raw_unread < 4 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 surrogate pair", + parser.offset, -1) + } + break inner + } + + // Get the next character. + value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) + + // Check for a low surrogate area. + if value2&0xFC00 != 0xDC00 { + return yaml_parser_set_reader_error(parser, + "expected low surrogate area", + parser.offset+2, int(value2)) + } + + // Generate the value of the surrogate pair. + value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) + } else { + width = 2 + } + + default: + panic("impossible") + } + + // Check if the character is in the allowed range: + // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) + // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) + // | [#x10000-#x10FFFF] (32 bit) + switch { + case value == 0x09: + case value == 0x0A: + case value == 0x0D: + case value >= 0x20 && value <= 0x7E: + case value == 0x85: + case value >= 0xA0 && value <= 0xD7FF: + case value >= 0xE000 && value <= 0xFFFD: + case value >= 0x10000 && value <= 0x10FFFF: + default: + return yaml_parser_set_reader_error(parser, + "control characters are not allowed", + parser.offset, int(value)) + } + + // Move the raw pointers. + parser.raw_buffer_pos += width + parser.offset += width + + // Finally put the character into the buffer. + if value <= 0x7F { + // 0000 0000-0000 007F . 0xxxxxxx + parser.buffer[buffer_len+0] = byte(value) + buffer_len += 1 + } else if value <= 0x7FF { + // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) + parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) + buffer_len += 2 + } else if value <= 0xFFFF { + // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) + buffer_len += 3 + } else { + // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) + buffer_len += 4 + } + + parser.unread++ + } + + // On EOF, put NUL into the buffer and return. + if parser.eof { + parser.buffer[buffer_len] = 0 + buffer_len++ + parser.unread++ + break + } + } + // [Go] Read the documentation of this function above. To return true, + // we need to have the given length in the buffer. Not doing that means + // every single check that calls this function to make sure the buffer + // has a given length is Go) panicking; or C) accessing invalid memory. + // This happens here due to the EOF above breaking early. + for buffer_len < length { + parser.buffer[buffer_len] = 0 + buffer_len++ + } + parser.buffer = parser.buffer[:buffer_len] + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/resolve.go b/vendor/go.yaml.in/yaml/v3/resolve.go new file mode 100644 index 0000000000..64ae888057 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/resolve.go @@ -0,0 +1,326 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding/base64" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +type resolveMapItem struct { + value interface{} + tag string +} + +var resolveTable = make([]byte, 256) +var resolveMap = make(map[string]resolveMapItem) + +func init() { + t := resolveTable + t[int('+')] = 'S' // Sign + t[int('-')] = 'S' + for _, c := range "0123456789" { + t[int(c)] = 'D' // Digit + } + for _, c := range "yYnNtTfFoO~" { + t[int(c)] = 'M' // In map + } + t[int('.')] = '.' // Float (potentially in map) + + var resolveMapList = []struct { + v interface{} + tag string + l []string + }{ + {true, boolTag, []string{"true", "True", "TRUE"}}, + {false, boolTag, []string{"false", "False", "FALSE"}}, + {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}}, + {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}}, + {"<<", mergeTag, []string{"<<"}}, + } + + m := resolveMap + for _, item := range resolveMapList { + for _, s := range item.l { + m[s] = resolveMapItem{item.v, item.tag} + } + } +} + +const ( + nullTag = "!!null" + boolTag = "!!bool" + strTag = "!!str" + intTag = "!!int" + floatTag = "!!float" + timestampTag = "!!timestamp" + seqTag = "!!seq" + mapTag = "!!map" + binaryTag = "!!binary" + mergeTag = "!!merge" +) + +var longTags = make(map[string]string) +var shortTags = make(map[string]string) + +func init() { + for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} { + ltag := longTag(stag) + longTags[stag] = ltag + shortTags[ltag] = stag + } +} + +const longTagPrefix = "tag:yaml.org,2002:" + +func shortTag(tag string) string { + if strings.HasPrefix(tag, longTagPrefix) { + if stag, ok := shortTags[tag]; ok { + return stag + } + return "!!" + tag[len(longTagPrefix):] + } + return tag +} + +func longTag(tag string) string { + if strings.HasPrefix(tag, "!!") { + if ltag, ok := longTags[tag]; ok { + return ltag + } + return longTagPrefix + tag[2:] + } + return tag +} + +func resolvableTag(tag string) bool { + switch tag { + case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag: + return true + } + return false +} + +var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) + +func resolve(tag string, in string) (rtag string, out interface{}) { + tag = shortTag(tag) + if !resolvableTag(tag) { + return tag, in + } + + defer func() { + switch tag { + case "", rtag, strTag, binaryTag: + return + case floatTag: + if rtag == intTag { + switch v := out.(type) { + case int64: + rtag = floatTag + out = float64(v) + return + case int: + rtag = floatTag + out = float64(v) + return + } + } + } + failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) + }() + + // Any data is accepted as a !!str or !!binary. + // Otherwise, the prefix is enough of a hint about what it might be. + hint := byte('N') + if in != "" { + hint = resolveTable[in[0]] + } + if hint != 0 && tag != strTag && tag != binaryTag { + // Handle things we can lookup in a map. + if item, ok := resolveMap[in]; ok { + return item.tag, item.value + } + + // Base 60 floats are a bad idea, were dropped in YAML 1.2, and + // are purposefully unsupported here. They're still quoted on + // the way out for compatibility with other parser, though. + + switch hint { + case 'M': + // We've already checked the map above. + + case '.': + // Not in the map, so maybe a normal float. + floatv, err := strconv.ParseFloat(in, 64) + if err == nil { + return floatTag, floatv + } + + case 'D', 'S': + // Int, float, or timestamp. + // Only try values as a timestamp if the value is unquoted or there's an explicit + // !!timestamp tag. + if tag == "" || tag == timestampTag { + t, ok := parseTimestamp(in) + if ok { + return timestampTag, t + } + } + + plain := strings.Replace(in, "_", "", -1) + intv, err := strconv.ParseInt(plain, 0, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain, 0, 64) + if err == nil { + return intTag, uintv + } + if yamlStyleFloat.MatchString(plain) { + floatv, err := strconv.ParseFloat(plain, 64) + if err == nil { + return floatTag, floatv + } + } + if strings.HasPrefix(plain, "0b") { + intv, err := strconv.ParseInt(plain[2:], 2, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 2, 64) + if err == nil { + return intTag, uintv + } + } else if strings.HasPrefix(plain, "-0b") { + intv, err := strconv.ParseInt("-"+plain[3:], 2, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + } + // Octals as introduced in version 1.2 of the spec. + // Octals from the 1.1 spec, spelled as 0777, are still + // decoded by default in v3 as well for compatibility. + // May be dropped in v4 depending on how usage evolves. + if strings.HasPrefix(plain, "0o") { + intv, err := strconv.ParseInt(plain[2:], 8, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 8, 64) + if err == nil { + return intTag, uintv + } + } else if strings.HasPrefix(plain, "-0o") { + intv, err := strconv.ParseInt("-"+plain[3:], 8, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + } + default: + panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")") + } + } + return strTag, in +} + +// encodeBase64 encodes s as base64 that is broken up into multiple lines +// as appropriate for the resulting length. +func encodeBase64(s string) string { + const lineLen = 70 + encLen := base64.StdEncoding.EncodedLen(len(s)) + lines := encLen/lineLen + 1 + buf := make([]byte, encLen*2+lines) + in := buf[0:encLen] + out := buf[encLen:] + base64.StdEncoding.Encode(in, []byte(s)) + k := 0 + for i := 0; i < len(in); i += lineLen { + j := i + lineLen + if j > len(in) { + j = len(in) + } + k += copy(out[k:], in[i:j]) + if lines > 1 { + out[k] = '\n' + k++ + } + } + return string(out[:k]) +} + +// This is a subset of the formats allowed by the regular expression +// defined at http://yaml.org/type/timestamp.html. +var allowedTimestampFormats = []string{ + "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. + "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". + "2006-1-2 15:4:5.999999999", // space separated with no time zone + "2006-1-2", // date only + // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" + // from the set of examples. +} + +// parseTimestamp parses s as a timestamp string and +// returns the timestamp and reports whether it succeeded. +// Timestamp formats are defined at http://yaml.org/type/timestamp.html +func parseTimestamp(s string) (time.Time, bool) { + // TODO write code to check all the formats supported by + // http://yaml.org/type/timestamp.html instead of using time.Parse. + + // Quick check: all date formats start with YYYY-. + i := 0 + for ; i < len(s); i++ { + if c := s[i]; c < '0' || c > '9' { + break + } + } + if i != 4 || i == len(s) || s[i] != '-' { + return time.Time{}, false + } + for _, format := range allowedTimestampFormats { + if t, err := time.Parse(format, s); err == nil { + return t, true + } + } + return time.Time{}, false +} diff --git a/vendor/go.yaml.in/yaml/v3/scannerc.go b/vendor/go.yaml.in/yaml/v3/scannerc.go new file mode 100644 index 0000000000..30b1f08920 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/scannerc.go @@ -0,0 +1,3040 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "bytes" + "fmt" +) + +// Introduction +// ************ +// +// The following notes assume that you are familiar with the YAML specification +// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in +// some cases we are less restrictive that it requires. +// +// The process of transforming a YAML stream into a sequence of events is +// divided on two steps: Scanning and Parsing. +// +// The Scanner transforms the input stream into a sequence of tokens, while the +// parser transform the sequence of tokens produced by the Scanner into a +// sequence of parsing events. +// +// The Scanner is rather clever and complicated. The Parser, on the contrary, +// is a straightforward implementation of a recursive-descendant parser (or, +// LL(1) parser, as it is usually called). +// +// Actually there are two issues of Scanning that might be called "clever", the +// rest is quite straightforward. The issues are "block collection start" and +// "simple keys". Both issues are explained below in details. +// +// Here the Scanning step is explained and implemented. We start with the list +// of all the tokens produced by the Scanner together with short descriptions. +// +// Now, tokens: +// +// STREAM-START(encoding) # The stream start. +// STREAM-END # The stream end. +// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. +// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. +// DOCUMENT-START # '---' +// DOCUMENT-END # '...' +// BLOCK-SEQUENCE-START # Indentation increase denoting a block +// BLOCK-MAPPING-START # sequence or a block mapping. +// BLOCK-END # Indentation decrease. +// FLOW-SEQUENCE-START # '[' +// FLOW-SEQUENCE-END # ']' +// BLOCK-SEQUENCE-START # '{' +// BLOCK-SEQUENCE-END # '}' +// BLOCK-ENTRY # '-' +// FLOW-ENTRY # ',' +// KEY # '?' or nothing (simple keys). +// VALUE # ':' +// ALIAS(anchor) # '*anchor' +// ANCHOR(anchor) # '&anchor' +// TAG(handle,suffix) # '!handle!suffix' +// SCALAR(value,style) # A scalar. +// +// The following two tokens are "virtual" tokens denoting the beginning and the +// end of the stream: +// +// STREAM-START(encoding) +// STREAM-END +// +// We pass the information about the input stream encoding with the +// STREAM-START token. +// +// The next two tokens are responsible for tags: +// +// VERSION-DIRECTIVE(major,minor) +// TAG-DIRECTIVE(handle,prefix) +// +// Example: +// +// %YAML 1.1 +// %TAG ! !foo +// %TAG !yaml! tag:yaml.org,2002: +// --- +// +// The correspoding sequence of tokens: +// +// STREAM-START(utf-8) +// VERSION-DIRECTIVE(1,1) +// TAG-DIRECTIVE("!","!foo") +// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") +// DOCUMENT-START +// STREAM-END +// +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole +// line. +// +// The document start and end indicators are represented by: +// +// DOCUMENT-START +// DOCUMENT-END +// +// Note that if a YAML stream contains an implicit document (without '---' +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be +// produced. +// +// In the following examples, we present whole documents together with the +// produced tokens. +// +// 1. An implicit document: +// +// 'a scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// STREAM-END +// +// 2. An explicit document: +// +// --- +// 'a scalar' +// ... +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// SCALAR("a scalar",single-quoted) +// DOCUMENT-END +// STREAM-END +// +// 3. Several documents in a stream: +// +// 'a scalar' +// --- +// 'another scalar' +// --- +// 'yet another scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// DOCUMENT-START +// SCALAR("another scalar",single-quoted) +// DOCUMENT-START +// SCALAR("yet another scalar",single-quoted) +// STREAM-END +// +// We have already introduced the SCALAR token above. The following tokens are +// used to describe aliases, anchors, tag, and scalars: +// +// ALIAS(anchor) +// ANCHOR(anchor) +// TAG(handle,suffix) +// SCALAR(value,style) +// +// The following series of examples illustrate the usage of these tokens: +// +// 1. A recursive sequence: +// +// &A [ *A ] +// +// Tokens: +// +// STREAM-START(utf-8) +// ANCHOR("A") +// FLOW-SEQUENCE-START +// ALIAS("A") +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A tagged scalar: +// +// !!float "3.14" # A good approximation. +// +// Tokens: +// +// STREAM-START(utf-8) +// TAG("!!","float") +// SCALAR("3.14",double-quoted) +// STREAM-END +// +// 3. Various scalar styles: +// +// --- # Implicit empty plain scalars do not produce tokens. +// --- a plain scalar +// --- 'a single-quoted scalar' +// --- "a double-quoted scalar" +// --- |- +// a literal scalar +// --- >- +// a folded +// scalar +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// DOCUMENT-START +// SCALAR("a plain scalar",plain) +// DOCUMENT-START +// SCALAR("a single-quoted scalar",single-quoted) +// DOCUMENT-START +// SCALAR("a double-quoted scalar",double-quoted) +// DOCUMENT-START +// SCALAR("a literal scalar",literal) +// DOCUMENT-START +// SCALAR("a folded scalar",folded) +// STREAM-END +// +// Now it's time to review collection-related tokens. We will start with +// flow collections: +// +// FLOW-SEQUENCE-START +// FLOW-SEQUENCE-END +// FLOW-MAPPING-START +// FLOW-MAPPING-END +// FLOW-ENTRY +// KEY +// VALUE +// +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' +// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the +// indicators '?' and ':', which are used for denoting mapping keys and values, +// are represented by the KEY and VALUE tokens. +// +// The following examples show flow collections: +// +// 1. A flow sequence: +// +// [item 1, item 2, item 3] +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-SEQUENCE-START +// SCALAR("item 1",plain) +// FLOW-ENTRY +// SCALAR("item 2",plain) +// FLOW-ENTRY +// SCALAR("item 3",plain) +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A flow mapping: +// +// { +// a simple key: a value, # Note that the KEY token is produced. +// ? a complex key: another value, +// } +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// FLOW-ENTRY +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// FLOW-ENTRY +// FLOW-MAPPING-END +// STREAM-END +// +// A simple key is a key which is not denoted by the '?' indicator. Note that +// the Scanner still produce the KEY token whenever it encounters a simple key. +// +// For scanning block collections, the following tokens are used (note that we +// repeat KEY and VALUE here): +// +// BLOCK-SEQUENCE-START +// BLOCK-MAPPING-START +// BLOCK-END +// BLOCK-ENTRY +// KEY +// VALUE +// +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation +// increase that precedes a block collection (cf. the INDENT token in Python). +// The token BLOCK-END denote indentation decrease that ends a block collection +// (cf. the DEDENT token in Python). However YAML has some syntax pecularities +// that makes detections of these tokens more complex. +// +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators +// '-', '?', and ':' correspondingly. +// +// The following examples show how the tokens BLOCK-SEQUENCE-START, +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: +// +// 1. Block sequences: +// +// - item 1 +// - item 2 +// - +// - item 3.1 +// - item 3.2 +// - +// key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 3.1",plain) +// BLOCK-ENTRY +// SCALAR("item 3.2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Block mappings: +// +// a simple key: a value # The KEY token is produced here. +// ? a complex key +// : another value +// a mapping: +// key 1: value 1 +// key 2: value 2 +// a sequence: +// - item 1 +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// KEY +// SCALAR("a mapping",plain) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML does not always require to start a new block collection from a new +// line. If the current line contains only '-', '?', and ':' indicators, a new +// block collection may start at the current line. The following examples +// illustrate this case: +// +// 1. Collections in a sequence: +// +// - - item 1 +// - item 2 +// - key 1: value 1 +// key 2: value 2 +// - ? complex key +// : complex value +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("complex key") +// VALUE +// SCALAR("complex value") +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Collections in a mapping: +// +// ? a sequence +// : - item 1 +// - item 2 +// ? a mapping +// : key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// KEY +// SCALAR("a mapping",plain) +// VALUE +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML also permits non-indented sequences if they are included into a block +// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: +// +// key: +// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key",plain) +// VALUE +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// + +// Ensure that the buffer contains the required number of characters. +// Return true on success, false on failure (reader error or memory error). +func cache(parser *yaml_parser_t, length int) bool { + // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) + return parser.unread >= length || yaml_parser_update_buffer(parser, length) +} + +// Advance the buffer pointer. +func skip(parser *yaml_parser_t) { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) +} + +func skip_line(parser *yaml_parser_t) { + if is_crlf(parser.buffer, parser.buffer_pos) { + parser.mark.index += 2 + parser.mark.column = 0 + parser.mark.line++ + parser.unread -= 2 + parser.buffer_pos += 2 + parser.newlines++ + } else if is_break(parser.buffer, parser.buffer_pos) { + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) + parser.newlines++ + } +} + +// Copy a character to a string buffer and advance pointers. +func read(parser *yaml_parser_t, s []byte) []byte { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } + w := width(parser.buffer[parser.buffer_pos]) + if w == 0 { + panic("invalid character sequence") + } + if len(s) == 0 { + s = make([]byte, 0, 32) + } + if w == 1 && len(s)+w <= cap(s) { + s = s[:len(s)+1] + s[len(s)-1] = parser.buffer[parser.buffer_pos] + parser.buffer_pos++ + } else { + s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + parser.buffer_pos += w + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + return s +} + +// Copy a line break character to a string buffer and advance pointers. +func read_line(parser *yaml_parser_t, s []byte) []byte { + buf := parser.buffer + pos := parser.buffer_pos + switch { + case buf[pos] == '\r' && buf[pos+1] == '\n': + // CR LF . LF + s = append(s, '\n') + parser.buffer_pos += 2 + parser.mark.index++ + parser.unread-- + case buf[pos] == '\r' || buf[pos] == '\n': + // CR|LF . LF + s = append(s, '\n') + parser.buffer_pos += 1 + case buf[pos] == '\xC2' && buf[pos+1] == '\x85': + // NEL . LF + s = append(s, '\n') + parser.buffer_pos += 2 + case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): + // LS|PS . LS|PS + s = append(s, buf[parser.buffer_pos:pos+3]...) + parser.buffer_pos += 3 + default: + return s + } + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.newlines++ + return s +} + +// Get the next token. +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { + // Erase the token object. + *token = yaml_token_t{} // [Go] Is this necessary? + + // No tokens after STREAM-END or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR { + return true + } + + // Ensure that the tokens queue contains enough tokens. + if !parser.token_available { + if !yaml_parser_fetch_more_tokens(parser) { + return false + } + } + + // Fetch the next token from the queue. + *token = parser.tokens[parser.tokens_head] + parser.tokens_head++ + parser.tokens_parsed++ + parser.token_available = false + + if token.typ == yaml_STREAM_END_TOKEN { + parser.stream_end_produced = true + } + return true +} + +// Set the scanner error and return false. +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { + parser.error = yaml_SCANNER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = parser.mark + return false +} + +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { + context := "while parsing a tag" + if directive { + context = "while parsing a %TAG directive" + } + return yaml_parser_set_scanner_error(parser, context, context_mark, problem) +} + +func trace(args ...interface{}) func() { + pargs := append([]interface{}{"+++"}, args...) + fmt.Println(pargs...) + pargs = append([]interface{}{"---"}, args...) + return func() { fmt.Println(pargs...) } +} + +// Ensure that the tokens queue contains at least one token which can be +// returned to the Parser. +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { + // While we need more tokens to fetch, do it. + for { + // [Go] The comment parsing logic requires a lookahead of two tokens + // so that foot comments may be parsed in time of associating them + // with the tokens that are parsed before them, and also for line + // comments to be transformed into head comments in some edge cases. + if parser.tokens_head < len(parser.tokens)-2 { + // If a potential simple key is at the head position, we need to fetch + // the next token to disambiguate it. + head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed] + if !ok { + break + } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok { + return false + } else if !valid { + break + } + } + // Fetch the next token. + if !yaml_parser_fetch_next_token(parser) { + return false + } + } + + parser.token_available = true + return true +} + +// The dispatcher for token fetchers. +func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) { + // Ensure that the buffer is initialized. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we just started scanning. Fetch STREAM-START then. + if !parser.stream_start_produced { + return yaml_parser_fetch_stream_start(parser) + } + + scan_mark := parser.mark + + // Eat whitespaces and comments until we reach the next token. + if !yaml_parser_scan_to_next_token(parser) { + return false + } + + // [Go] While unrolling indents, transform the head comments of prior + // indentation levels observed after scan_start into foot comments at + // the respective indexes. + + // Check the indentation level against the current column. + if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) { + return false + } + + // Ensure that the buffer contains at least 4 characters. 4 is the length + // of the longest indicators ('--- ' and '... '). + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + // Is it the end of the stream? + if is_z(parser.buffer, parser.buffer_pos) { + return yaml_parser_fetch_stream_end(parser) + } + + // Is it a directive? + if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { + return yaml_parser_fetch_directive(parser) + } + + buf := parser.buffer + pos := parser.buffer_pos + + // Is it the document start indicator? + if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) + } + + // Is it the document end indicator? + if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) + } + + comment_mark := parser.mark + if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') { + // Associate any following comments with the prior token. + comment_mark = parser.tokens[len(parser.tokens)-1].start_mark + } + defer func() { + if !ok { + return + } + if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN { + // Sequence indicators alone have no line comments. It becomes + // a head comment for whatever follows. + return + } + if !yaml_parser_scan_line_comment(parser, comment_mark) { + ok = false + return + } + }() + + // Is it the flow sequence start indicator? + if buf[pos] == '[' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) + } + + // Is it the flow mapping start indicator? + if parser.buffer[parser.buffer_pos] == '{' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) + } + + // Is it the flow sequence end indicator? + if parser.buffer[parser.buffer_pos] == ']' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_SEQUENCE_END_TOKEN) + } + + // Is it the flow mapping end indicator? + if parser.buffer[parser.buffer_pos] == '}' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_MAPPING_END_TOKEN) + } + + // Is it the flow entry indicator? + if parser.buffer[parser.buffer_pos] == ',' { + return yaml_parser_fetch_flow_entry(parser) + } + + // Is it the block entry indicator? + if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { + return yaml_parser_fetch_block_entry(parser) + } + + // Is it the key indicator? + if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_key(parser) + } + + // Is it the value indicator? + if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_value(parser) + } + + // Is it an alias? + if parser.buffer[parser.buffer_pos] == '*' { + return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) + } + + // Is it an anchor? + if parser.buffer[parser.buffer_pos] == '&' { + return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) + } + + // Is it a tag? + if parser.buffer[parser.buffer_pos] == '!' { + return yaml_parser_fetch_tag(parser) + } + + // Is it a literal scalar? + if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, true) + } + + // Is it a folded scalar? + if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, false) + } + + // Is it a single-quoted scalar? + if parser.buffer[parser.buffer_pos] == '\'' { + return yaml_parser_fetch_flow_scalar(parser, true) + } + + // Is it a double-quoted scalar? + if parser.buffer[parser.buffer_pos] == '"' { + return yaml_parser_fetch_flow_scalar(parser, false) + } + + // Is it a plain scalar? + // + // A plain scalar may start with any non-blank characters except + // + // '-', '?', ':', ',', '[', ']', '{', '}', + // '#', '&', '*', '!', '|', '>', '\'', '\"', + // '%', '@', '`'. + // + // In the block context (and, for the '-' indicator, in the flow context + // too), it may also start with the characters + // + // '-', '?', ':' + // + // if it is followed by a non-space character. + // + // The last rule is more restrictive than the specification requires. + // [Go] TODO Make this logic more reasonable. + //switch parser.buffer[parser.buffer_pos] { + //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': + //} + if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || + parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || + parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || + (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level == 0 && + (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && + !is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_plain_scalar(parser) + } + + // If we don't determine the token type so far, it is an error. + return yaml_parser_set_scanner_error(parser, + "while scanning for the next token", parser.mark, + "found character that cannot start any token") +} + +func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) { + if !simple_key.possible { + return false, true + } + + // The 1.2 specification says: + // + // "If the ? indicator is omitted, parsing needs to see past the + // implicit key to recognize it as such. To limit the amount of + // lookahead required, the “:” indicator must appear at most 1024 + // Unicode characters beyond the start of the key. In addition, the key + // is restricted to a single line." + // + if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index { + // Check if the potential simple key to be removed is required. + if simple_key.required { + return false, yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") + } + simple_key.possible = false + return false, true + } + return true, true +} + +// Check if a simple key may start at the current position and add it if +// needed. +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { + // A simple key is required at the current position if the scanner is in + // the block context and the current column coincides with the indentation + // level. + + required := parser.flow_level == 0 && parser.indent == parser.mark.column + + // + // If the current position may start a simple key, save it. + // + if parser.simple_key_allowed { + simple_key := yaml_simple_key_t{ + possible: true, + required: required, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + } + + if !yaml_parser_remove_simple_key(parser) { + return false + } + parser.simple_keys[len(parser.simple_keys)-1] = simple_key + parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1 + } + return true +} + +// Remove a potential simple key at the current flow level. +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { + i := len(parser.simple_keys) - 1 + if parser.simple_keys[i].possible { + // If the key is required, it is an error. + if parser.simple_keys[i].required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", parser.simple_keys[i].mark, + "could not find expected ':'") + } + // Remove the key from the stack. + parser.simple_keys[i].possible = false + delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number) + } + return true +} + +// max_flow_level limits the flow_level +const max_flow_level = 10000 + +// Increase the flow level and resize the simple key list if needed. +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { + // Reset the simple key on the next level. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{ + possible: false, + required: false, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + }) + + // Increase the flow level. + parser.flow_level++ + if parser.flow_level > max_flow_level { + return yaml_parser_set_scanner_error(parser, + "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_flow_level)) + } + return true +} + +// Decrease the flow level. +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { + if parser.flow_level > 0 { + parser.flow_level-- + last := len(parser.simple_keys) - 1 + delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number) + parser.simple_keys = parser.simple_keys[:last] + } + return true +} + +// max_indents limits the indents stack size +const max_indents = 10000 + +// Push the current indentation level to the stack and set the new level +// the current column is greater than the indentation level. In this case, +// append or insert the specified token into the token queue. +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + if parser.indent < column { + // Push the current indentation level to the stack and set the new + // indentation level. + parser.indents = append(parser.indents, parser.indent) + parser.indent = column + if len(parser.indents) > max_indents { + return yaml_parser_set_scanner_error(parser, + "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_indents)) + } + + // Create a token and insert it into the queue. + token := yaml_token_t{ + typ: typ, + start_mark: mark, + end_mark: mark, + } + if number > -1 { + number -= parser.tokens_parsed + } + yaml_insert_token(parser, number, &token) + } + return true +} + +// Pop indentation levels from the indents stack until the current level +// becomes less or equal to the column. For each indentation level, append +// the BLOCK-END token. +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int, scan_mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + block_mark := scan_mark + block_mark.index-- + + // Loop through the indentation levels in the stack. + for parser.indent > column { + + // [Go] Reposition the end token before potential following + // foot comments of parent blocks. For that, search + // backwards for recent comments that were at the same + // indent as the block that is ending now. + stop_index := block_mark.index + for i := len(parser.comments) - 1; i >= 0; i-- { + comment := &parser.comments[i] + + if comment.end_mark.index < stop_index { + // Don't go back beyond the start of the comment/whitespace scan, unless column < 0. + // If requested indent column is < 0, then the document is over and everything else + // is a foot anyway. + break + } + if comment.start_mark.column == parser.indent+1 { + // This is a good match. But maybe there's a former comment + // at that same indent level, so keep searching. + block_mark = comment.start_mark + } + + // While the end of the former comment matches with + // the start of the following one, we know there's + // nothing in between and scanning is still safe. + stop_index = comment.scan_mark.index + } + + // Create a token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_END_TOKEN, + start_mark: block_mark, + end_mark: block_mark, + } + yaml_insert_token(parser, -1, &token) + + // Pop the indentation level. + parser.indent = parser.indents[len(parser.indents)-1] + parser.indents = parser.indents[:len(parser.indents)-1] + } + return true +} + +// Initialize the scanner and produce the STREAM-START token. +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { + + // Set the initial indentation. + parser.indent = -1 + + // Initialize the simple key stack. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + parser.simple_keys_by_tok = make(map[int]int) + + // A simple key is allowed at the beginning of the stream. + parser.simple_key_allowed = true + + // We have started. + parser.stream_start_produced = true + + // Create the STREAM-START token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_START_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + encoding: parser.encoding, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the STREAM-END token and shut down the scanner. +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { + + // Force new line. + if parser.mark.column != 0 { + parser.mark.column = 0 + parser.mark.line++ + } + + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the STREAM-END token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. + token := yaml_token_t{} + if !yaml_parser_scan_directive(parser, &token) { + return false + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the DOCUMENT-START or DOCUMENT-END token. +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Consume the token. + start_mark := parser.mark + + skip(parser) + skip(parser) + skip(parser) + + end_mark := parser.mark + + // Create the DOCUMENT-START or DOCUMENT-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { + + // The indicators '[' and '{' may start a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // Increase the flow level. + if !yaml_parser_increase_flow_level(parser) { + return false + } + + // A simple key may follow the indicators '[' and '{'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset any potential simple key on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Decrease the flow level. + if !yaml_parser_decrease_flow_level(parser) { + return false + } + + // No simple keys after the indicators ']' and '}'. + parser.simple_key_allowed = false + + // Consume the token. + + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-ENTRY token. +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after ','. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_FLOW_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the BLOCK-ENTRY token. +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { + // Check if the scanner is in the block context. + if parser.flow_level == 0 { + // Check if we are allowed to start a new entry. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "block sequence entries are not allowed in this context") + } + // Add the BLOCK-SEQUENCE-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { + return false + } + } else { + // It is an error for the '-' indicator to occur in the flow context, + // but we let the Parser detect and report about it because the Parser + // is able to point to the context. + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '-'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the BLOCK-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the KEY token. +func yaml_parser_fetch_key(parser *yaml_parser_t) bool { + + // In the block context, additional checks are required. + if parser.flow_level == 0 { + // Check if we are allowed to start a new key (not nessesary simple). + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping keys are not allowed in this context") + } + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '?' in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the KEY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the VALUE token. +func yaml_parser_fetch_value(parser *yaml_parser_t) bool { + + simple_key := &parser.simple_keys[len(parser.simple_keys)-1] + + // Have we found a simple key? + if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok { + return false + + } else if valid { + + // Create the KEY token and insert it into the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: simple_key.mark, + end_mark: simple_key.mark, + } + yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) + + // In the block context, we may need to add the BLOCK-MAPPING-START token. + if !yaml_parser_roll_indent(parser, simple_key.mark.column, + simple_key.token_number, + yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { + return false + } + + // Remove the simple key. + simple_key.possible = false + delete(parser.simple_keys_by_tok, simple_key.token_number) + + // A simple key cannot follow another simple key. + parser.simple_key_allowed = false + + } else { + // The ':' indicator follows a complex key. + + // In the block context, extra checks are required. + if parser.flow_level == 0 { + + // Check if we are allowed to start a complex value. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping values are not allowed in this context") + } + + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Simple keys after ':' are allowed in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + } + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the VALUE token and append it to the queue. + token := yaml_token_t{ + typ: yaml_VALUE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the ALIAS or ANCHOR token. +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // An anchor or an alias could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow an anchor or an alias. + parser.simple_key_allowed = false + + // Create the ALIAS or ANCHOR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_anchor(parser, &token, typ) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the TAG token. +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { + // A tag could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a tag. + parser.simple_key_allowed = false + + // Create the TAG token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_tag(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { + // Remove any potential simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // A simple key may follow a block scalar. + parser.simple_key_allowed = true + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_block_scalar(parser, &token, literal) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_flow_scalar(parser, &token, single) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,plain) token. +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_plain_scalar(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Eat whitespaces and comments until the next token is found. +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { + + scan_mark := parser.mark + + // Until the next token is not found. + for { + // Allow the BOM mark to start a line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { + skip(parser) + } + + // Eat whitespaces. + // Tabs are allowed: + // - in the flow context + // - in the block context, but not at the beginning of the line or + // after '-', '?', or ':' (complex value). + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if we just had a line comment under a sequence entry that + // looks more like a header to the following content. Similar to this: + // + // - # The comment + // - Some data + // + // If so, transform the line comment to a head comment and reposition. + if len(parser.comments) > 0 && len(parser.tokens) > 1 { + tokenA := parser.tokens[len(parser.tokens)-2] + tokenB := parser.tokens[len(parser.tokens)-1] + comment := &parser.comments[len(parser.comments)-1] + if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) { + // If it was in the prior line, reposition so it becomes a + // header of the follow up token. Otherwise, keep it in place + // so it becomes a header of the former. + comment.head = comment.line + comment.line = nil + if comment.start_mark.line == parser.mark.line-1 { + comment.token_mark = parser.mark + } + } + } + + // Eat a comment until a line break. + if parser.buffer[parser.buffer_pos] == '#' { + if !yaml_parser_scan_comments(parser, scan_mark) { + return false + } + } + + // If it is a line break, eat it. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + + // In the block context, a new line may start a simple key. + if parser.flow_level == 0 { + parser.simple_key_allowed = true + } + } else { + break // We have found a token. + } + } + + return true +} + +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. +// +// Scope: +// +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { + // Eat '%'. + start_mark := parser.mark + skip(parser) + + // Scan the directive name. + var name []byte + if !yaml_parser_scan_directive_name(parser, start_mark, &name) { + return false + } + + // Is it a YAML directive? + if bytes.Equal(name, []byte("YAML")) { + // Scan the VERSION directive value. + var major, minor int8 + if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { + return false + } + end_mark := parser.mark + + // Create a VERSION-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_VERSION_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + major: major, + minor: minor, + } + + // Is it a TAG directive? + } else if bytes.Equal(name, []byte("TAG")) { + // Scan the TAG directive value. + var handle, prefix []byte + if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { + return false + } + end_mark := parser.mark + + // Create a TAG-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_TAG_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + prefix: prefix, + } + + // Unknown directive. + } else { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unknown directive name") + return false + } + + // Eat the rest of the line including any comments. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + if parser.buffer[parser.buffer_pos] == '#' { + // [Go] Discard this inline comment for the time being. + //if !yaml_parser_scan_line_comment(parser, start_mark) { + // return false + //} + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + return true +} + +// Scan the directive name. +// +// Scope: +// +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { + // Consume the directive name. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + var s []byte + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the name is empty. + if len(s) == 0 { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "could not find expected directive name") + return false + } + + // Check for an blank character after the name. + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unexpected non-alphabetical character") + return false + } + *name = s + return true +} + +// Scan the value of VERSION-DIRECTIVE. +// +// Scope: +// +// %YAML 1.1 # a comment \n +// ^^^^^^ +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the major version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { + return false + } + + // Eat '.'. + if parser.buffer[parser.buffer_pos] != '.' { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected digit or '.' character") + } + + skip(parser) + + // Consume the minor version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { + return false + } + return true +} + +const max_number_length = 2 + +// Scan the version number of VERSION-DIRECTIVE. +// +// Scope: +// +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { + + // Repeat while the next character is digit. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var value, length int8 + for is_digit(parser.buffer, parser.buffer_pos) { + // Check if the number is too long. + length++ + if length > max_number_length { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "found extremely long version number") + } + value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the number was present. + if length == 0 { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected version number") + } + *number = value + return true +} + +// Scan the value of a TAG-DIRECTIVE token. +// +// Scope: +// +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { + var handle_value, prefix_value []byte + + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a handle. + if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { + return false + } + + // Expect a whitespace. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blank(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace") + return false + } + + // Eat whitespaces. + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a prefix. + if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { + return false + } + + // Expect a whitespace or line break. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace or line break") + return false + } + + *handle = handle_value + *prefix = prefix_value + return true +} + +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { + var s []byte + + // Eat the indicator character. + start_mark := parser.mark + skip(parser) + + // Consume the value. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + end_mark := parser.mark + + /* + * Check if length of the anchor is greater than 0 and it is followed by + * a whitespace character or one of the indicators: + * + * '?', ':', ',', ']', '}', '%', '@', '`'. + */ + + if len(s) == 0 || + !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || + parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '`') { + context := "while scanning an alias" + if typ == yaml_ANCHOR_TOKEN { + context = "while scanning an anchor" + } + yaml_parser_set_scanner_error(parser, context, start_mark, + "did not find expected alphabetic or numeric character") + return false + } + + // Create a token. + *token = yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + value: s, + } + + return true +} + +/* + * Scan a TAG token. + */ + +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { + var handle, suffix []byte + + start_mark := parser.mark + + // Check if the tag is in the canonical form. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + if parser.buffer[parser.buffer_pos+1] == '<' { + // Keep the handle as '' + + // Eat '!<' + skip(parser) + skip(parser) + + // Consume the tag value. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + + // Check for '>' and eat it. + if parser.buffer[parser.buffer_pos] != '>' { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find the expected '>'") + return false + } + + skip(parser) + } else { + // The tag has either the '!suffix' or the '!handle!suffix' form. + + // First, try to scan a handle. + if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { + return false + } + + // Check if it is, indeed, handle. + if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { + // Scan the suffix now. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + } else { + // It wasn't a handle after all. Scan the rest of the tag. + if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { + return false + } + + // Set the handle to '!'. + handle = []byte{'!'} + + // A special case: the '!' tag. Set the handle to '' and the + // suffix to '!'. + if len(suffix) == 0 { + handle, suffix = suffix, handle + } + } + } + + // Check the character which ends the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find expected whitespace or line break") + return false + } + + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_TAG_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + suffix: suffix, + } + return true +} + +// Scan a tag handle. +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { + // Check the initial '!' character. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] != '!' { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + + var s []byte + + // Copy the '!' character. + s = read(parser, s) + + // Copy all subsequent alphabetical and numerical characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the trailing character is '!' and copy it. + if parser.buffer[parser.buffer_pos] == '!' { + s = read(parser, s) + } else { + // It's either the '!' tag or not really a tag handle. If it's a %TAG + // directive, it's an error. If it's a tag token, it must be a part of URI. + if directive && string(s) != "!" { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + } + + *handle = s + return true +} + +// Scan a tag. +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { + //size_t length = head ? strlen((char *)head) : 0 + var s []byte + hasTag := len(head) > 0 + + // Copy the head if needed. + // + // Note that we don't copy the leading '!' character. + if len(head) > 1 { + s = append(s, head[1:]...) + } + + // Scan the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // The set of characters that may appear in URI is as follows: + // + // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', + // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', + // '%'. + // [Go] TODO Convert this into more reasonable logic. + for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || + parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || + parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || + parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || + parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || + parser.buffer[parser.buffer_pos] == '%' { + // Check if it is a URI-escape sequence. + if parser.buffer[parser.buffer_pos] == '%' { + if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { + return false + } + } else { + s = read(parser, s) + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + hasTag = true + } + + if !hasTag { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected tag URI") + return false + } + *uri = s + return true +} + +// Decode an URI-escape sequence corresponding to a single UTF-8 character. +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { + + // Decode the required number of characters. + w := 1024 + for w > 0 { + // Check for a URI-escaped octet. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + + if !(parser.buffer[parser.buffer_pos] == '%' && + is_hex(parser.buffer, parser.buffer_pos+1) && + is_hex(parser.buffer, parser.buffer_pos+2)) { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find URI escaped octet") + } + + // Get the octet. + octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) + + // If it is the leading octet, determine the length of the UTF-8 sequence. + if w == 1024 { + w = width(octet) + if w == 0 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect leading UTF-8 octet") + } + } else { + // Check if the trailing octet is correct. + if octet&0xC0 != 0x80 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect trailing UTF-8 octet") + } + } + + // Copy the octet and move the pointers. + *s = append(*s, octet) + skip(parser) + skip(parser) + skip(parser) + w-- + } + return true +} + +// Scan a block scalar. +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { + // Eat the indicator '|' or '>'. + start_mark := parser.mark + skip(parser) + + // Scan the additional block scalar indicators. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check for a chomping indicator. + var chomping, increment int + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + // Set the chomping method and eat the indicator. + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + + // Check for an indentation indicator. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_digit(parser.buffer, parser.buffer_pos) { + // Check that the indentation is greater than 0. + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + + // Get the indentation level and eat the indicator. + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + } + + } else if is_digit(parser.buffer, parser.buffer_pos) { + // Do the same as above, but in the opposite order. + + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + } + } + + // Eat whitespaces and comments to the end of the line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.buffer[parser.buffer_pos] == '#' { + if !yaml_parser_scan_line_comment(parser, start_mark) { + return false + } + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + end_mark := parser.mark + + // Set the indentation level if it was specified. + var indent int + if increment > 0 { + if parser.indent >= 0 { + indent = parser.indent + increment + } else { + indent = increment + } + } + + // Scan the leading line breaks and determine the indentation level if needed. + var s, leading_break, trailing_breaks []byte + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + + // Scan the block scalar content. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var leading_blank, trailing_blank bool + for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { + // We are at the beginning of a non-empty line. + + // Is it a trailing whitespace? + trailing_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Check if we need to fold the leading line break. + if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { + // Do we need to join the lines by space? + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } + } else { + s = append(s, leading_break...) + } + leading_break = leading_break[:0] + + // Append the remaining line breaks. + s = append(s, trailing_breaks...) + trailing_breaks = trailing_breaks[:0] + + // Is it a leading whitespace? + leading_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Consume the current line. + for !is_breakz(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + leading_break = read_line(parser, leading_break) + + // Eat the following indentation spaces and line breaks. + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + } + + // Chomp the tail. + if chomping != -1 { + s = append(s, leading_break...) + } + if chomping == 1 { + s = append(s, trailing_breaks...) + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_LITERAL_SCALAR_STYLE, + } + if !literal { + token.style = yaml_FOLDED_SCALAR_STYLE + } + return true +} + +// Scan indentation spaces and line breaks for a block scalar. Determine the +// indentation level if needed. +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { + *end_mark = parser.mark + + // Eat the indentation spaces and line breaks. + max_indent := 0 + for { + // Eat the indentation spaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.mark.column > max_indent { + max_indent = parser.mark.column + } + + // Check for a tab character messing the indentation. + if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { + return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found a tab character where an indentation space is expected") + } + + // Have we found a non-empty line? + if !is_break(parser.buffer, parser.buffer_pos) { + break + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + // [Go] Should really be returning breaks instead. + *breaks = read_line(parser, *breaks) + *end_mark = parser.mark + } + + // Determine the indentation level if needed. + if *indent == 0 { + *indent = max_indent + if *indent < parser.indent+1 { + *indent = parser.indent + 1 + } + if *indent < 1 { + *indent = 1 + } + } + return true +} + +// Scan a quoted scalar. +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { + // Eat the left quote. + start_mark := parser.mark + skip(parser) + + // Consume the content of the quoted scalar. + var s, leading_break, trailing_breaks, whitespaces []byte + for { + // Check that there are no document indicators at the beginning of the line. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected document indicator") + return false + } + + // Check for EOF. + if is_z(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected end of stream") + return false + } + + // Consume non-blank characters. + leading_blanks := false + for !is_blankz(parser.buffer, parser.buffer_pos) { + if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { + // Is is an escaped single quote. + s = append(s, '\'') + skip(parser) + skip(parser) + + } else if single && parser.buffer[parser.buffer_pos] == '\'' { + // It is a right single quote. + break + } else if !single && parser.buffer[parser.buffer_pos] == '"' { + // It is a right double quote. + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { + // It is an escaped line break. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + skip(parser) + skip_line(parser) + leading_blanks = true + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' { + // It is an escape sequence. + code_length := 0 + + // Check the escape character. + switch parser.buffer[parser.buffer_pos+1] { + case '0': + s = append(s, 0) + case 'a': + s = append(s, '\x07') + case 'b': + s = append(s, '\x08') + case 't', '\t': + s = append(s, '\x09') + case 'n': + s = append(s, '\x0A') + case 'v': + s = append(s, '\x0B') + case 'f': + s = append(s, '\x0C') + case 'r': + s = append(s, '\x0D') + case 'e': + s = append(s, '\x1B') + case ' ': + s = append(s, '\x20') + case '"': + s = append(s, '"') + case '\'': + s = append(s, '\'') + case '\\': + s = append(s, '\\') + case 'N': // NEL (#x85) + s = append(s, '\xC2') + s = append(s, '\x85') + case '_': // #xA0 + s = append(s, '\xC2') + s = append(s, '\xA0') + case 'L': // LS (#x2028) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA8') + case 'P': // PS (#x2029) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA9') + case 'x': + code_length = 2 + case 'u': + code_length = 4 + case 'U': + code_length = 8 + default: + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found unknown escape character") + return false + } + + skip(parser) + skip(parser) + + // Consume an arbitrary escape code. + if code_length > 0 { + var value int + + // Scan the character value. + if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { + return false + } + for k := 0; k < code_length; k++ { + if !is_hex(parser.buffer, parser.buffer_pos+k) { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "did not find expected hexdecimal number") + return false + } + value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) + } + + // Check the value and write the character. + if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found invalid Unicode character escape code") + return false + } + if value <= 0x7F { + s = append(s, byte(value)) + } else if value <= 0x7FF { + s = append(s, byte(0xC0+(value>>6))) + s = append(s, byte(0x80+(value&0x3F))) + } else if value <= 0xFFFF { + s = append(s, byte(0xE0+(value>>12))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } else { + s = append(s, byte(0xF0+(value>>18))) + s = append(s, byte(0x80+((value>>12)&0x3F))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } + + // Advance the pointer. + for k := 0; k < code_length; k++ { + skip(parser) + } + } + } else { + // It is a non-escaped non-blank character. + s = read(parser, s) + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we are at the end of the scalar. + if single { + if parser.buffer[parser.buffer_pos] == '\'' { + break + } + } else { + if parser.buffer[parser.buffer_pos] == '"' { + break + } + } + + // Consume blank characters. + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Join the whitespaces or fold line breaks. + if leading_blanks { + // Do we need to fold line breaks? + if len(leading_break) > 0 && leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Eat the right quote. + skip(parser) + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_SINGLE_QUOTED_SCALAR_STYLE, + } + if !single { + token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + return true +} + +// Scan a plain scalar. +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { + + var s, leading_break, trailing_breaks, whitespaces []byte + var leading_blanks bool + var indent = parser.indent + 1 + + start_mark := parser.mark + end_mark := parser.mark + + // Consume the content of the plain scalar. + for { + // Check for a document indicator. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + break + } + + // Check for a comment. + if parser.buffer[parser.buffer_pos] == '#' { + break + } + + // Consume non-blank characters. + for !is_blankz(parser.buffer, parser.buffer_pos) { + + // Check for indicators that may end a plain scalar. + if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level > 0 && + (parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}')) { + break + } + + // Check if we need to join whitespaces and breaks. + if leading_blanks || len(whitespaces) > 0 { + if leading_blanks { + // Do we need to fold line breaks? + if leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + leading_blanks = false + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Copy the character. + s = read(parser, s) + + end_mark = parser.mark + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Is it the end? + if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { + break + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + + // Check for tab characters that abuse indentation. + if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found a tab character that violates indentation") + return false + } + + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check indentation level. + if parser.flow_level == 0 && parser.mark.column < indent { + break + } + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_PLAIN_SCALAR_STYLE, + } + + // Note that we change the 'simple_key_allowed' flag. + if leading_blanks { + parser.simple_key_allowed = true + } + return true +} + +func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool { + if parser.newlines > 0 { + return true + } + + var start_mark yaml_mark_t + var text []byte + + for peek := 0; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + if parser.buffer[parser.buffer_pos+peek] == '#' { + seen := parser.mark.index + peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + if len(text) == 0 { + start_mark = parser.mark + } + text = read(parser, text) + } else { + skip(parser) + } + } + } + break + } + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + token_mark: token_mark, + start_mark: start_mark, + line: text, + }) + } + return true +} + +func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool { + token := parser.tokens[len(parser.tokens)-1] + + if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 { + token = parser.tokens[len(parser.tokens)-2] + } + + var token_mark = token.start_mark + var start_mark yaml_mark_t + var next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } + + var recent_empty = false + var first_empty = parser.newlines <= 1 + + var line = parser.mark.line + var column = parser.mark.column + + var text []byte + + // The foot line is the place where a comment must start to + // still be considered as a foot of the prior content. + // If there's some content in the currently parsed line, then + // the foot is the line below it. + var foot_line = -1 + if scan_mark.line > 0 { + foot_line = parser.mark.line - parser.newlines + 1 + if parser.newlines == 0 && parser.mark.column > 1 { + foot_line++ + } + } + + var peek = 0 + for ; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + column++ + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + c := parser.buffer[parser.buffer_pos+peek] + var close_flow = parser.flow_level > 0 && (c == ']' || c == '}') + if close_flow || is_breakz(parser.buffer, parser.buffer_pos+peek) { + // Got line break or terminator. + if close_flow || !recent_empty { + if close_flow || first_empty && (start_mark.line == foot_line && token.typ != yaml_VALUE_TOKEN || start_mark.column-1 < next_indent) { + // This is the first empty line and there were no empty lines before, + // so this initial part of the comment is a foot of the prior token + // instead of being a head for the following one. Split it up. + // Alternatively, this might also be the last comment inside a flow + // scope, so it must be a footer. + if len(text) > 0 { + if start_mark.column-1 < next_indent { + // If dedented it's unrelated to the prior token. + token_mark = start_mark + } + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + } else { + if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 { + text = append(text, '\n') + } + } + } + if !is_break(parser.buffer, parser.buffer_pos+peek) { + break + } + first_empty = false + recent_empty = true + column = 0 + line++ + continue + } + + if len(text) > 0 && (close_flow || column-1 < next_indent && column != start_mark.column) { + // The comment at the different indentation is a foot of the + // preceding data rather than a head of the upcoming one. + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + + if parser.buffer[parser.buffer_pos+peek] != '#' { + break + } + + if len(text) == 0 { + start_mark = yaml_mark_t{parser.mark.index + peek, line, column} + } else { + text = append(text, '\n') + } + + recent_empty = false + + // Consume until after the consumed comment line. + seen := parser.mark.index + peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + text = read(parser, text) + } else { + skip(parser) + } + } + + peek = 0 + column = 0 + line = parser.mark.line + next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } + } + + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: start_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek - 1, line, column}, + head: text, + }) + } + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/sorter.go b/vendor/go.yaml.in/yaml/v3/sorter.go new file mode 100644 index 0000000000..9210ece7e9 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/sorter.go @@ -0,0 +1,134 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "reflect" + "unicode" +) + +type keyList []reflect.Value + +func (l keyList) Len() int { return len(l) } +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l keyList) Less(i, j int) bool { + a := l[i] + b := l[j] + ak := a.Kind() + bk := b.Kind() + for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { + a = a.Elem() + ak = a.Kind() + } + for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { + b = b.Elem() + bk = b.Kind() + } + af, aok := keyFloat(a) + bf, bok := keyFloat(b) + if aok && bok { + if af != bf { + return af < bf + } + if ak != bk { + return ak < bk + } + return numLess(a, b) + } + if ak != reflect.String || bk != reflect.String { + return ak < bk + } + ar, br := []rune(a.String()), []rune(b.String()) + digits := false + for i := 0; i < len(ar) && i < len(br); i++ { + if ar[i] == br[i] { + digits = unicode.IsDigit(ar[i]) + continue + } + al := unicode.IsLetter(ar[i]) + bl := unicode.IsLetter(br[i]) + if al && bl { + return ar[i] < br[i] + } + if al || bl { + if digits { + return al + } else { + return bl + } + } + var ai, bi int + var an, bn int64 + if ar[i] == '0' || br[i] == '0' { + for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- { + if ar[j] != '0' { + an = 1 + bn = 1 + break + } + } + } + for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { + an = an*10 + int64(ar[ai]-'0') + } + for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { + bn = bn*10 + int64(br[bi]-'0') + } + if an != bn { + return an < bn + } + if ai != bi { + return ai < bi + } + return ar[i] < br[i] + } + return len(ar) < len(br) +} + +// keyFloat returns a float value for v if it is a number/bool +// and whether it is a number/bool or not. +func keyFloat(v reflect.Value) (f float64, ok bool) { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return float64(v.Int()), true + case reflect.Float32, reflect.Float64: + return v.Float(), true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return float64(v.Uint()), true + case reflect.Bool: + if v.Bool() { + return 1, true + } + return 0, true + } + return 0, false +} + +// numLess returns whether a < b. +// a and b must necessarily have the same kind. +func numLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return a.Int() < b.Int() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Bool: + return !a.Bool() && b.Bool() + } + panic("not a number") +} diff --git a/vendor/go.yaml.in/yaml/v3/writerc.go b/vendor/go.yaml.in/yaml/v3/writerc.go new file mode 100644 index 0000000000..266d0b092c --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/writerc.go @@ -0,0 +1,48 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +// Set the writer error and return false. +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_WRITER_ERROR + emitter.problem = problem + return false +} + +// Flush the output buffer. +func yaml_emitter_flush(emitter *yaml_emitter_t) bool { + if emitter.write_handler == nil { + panic("write handler not set") + } + + // Check if the buffer is empty. + if emitter.buffer_pos == 0 { + return true + } + + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/yaml.go b/vendor/go.yaml.in/yaml/v3/yaml.go new file mode 100644 index 0000000000..0b101cd20d --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/yaml.go @@ -0,0 +1,703 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package yaml implements YAML support for the Go language. +// +// Source code and other details for the project are available at GitHub: +// +// https://github.com/yaml/go-yaml +package yaml + +import ( + "errors" + "fmt" + "io" + "reflect" + "strings" + "sync" + "unicode/utf8" +) + +// The Unmarshaler interface may be implemented by types to customize their +// behavior when being unmarshaled from a YAML document. +type Unmarshaler interface { + UnmarshalYAML(value *Node) error +} + +type obsoleteUnmarshaler interface { + UnmarshalYAML(unmarshal func(interface{}) error) error +} + +// The Marshaler interface may be implemented by types to customize their +// behavior when being marshaled into a YAML document. The returned value +// is marshaled in place of the original value implementing Marshaler. +// +// If an error is returned by MarshalYAML, the marshaling procedure stops +// and returns with the provided error. +type Marshaler interface { + MarshalYAML() (interface{}, error) +} + +// Unmarshal decodes the first document found within the in byte slice +// and assigns decoded values into the out value. +// +// Maps and pointers (to a struct, string, int, etc) are accepted as out +// values. If an internal pointer within a struct is not initialized, +// the yaml package will initialize it if necessary for unmarshalling +// the provided data. The out parameter must not be nil. +// +// The type of the decoded values should be compatible with the respective +// values in out. If one or more values cannot be decoded due to a type +// mismatches, decoding continues partially until the end of the YAML +// content, and a *yaml.TypeError is returned with details for all +// missed values. +// +// Struct fields are only unmarshalled if they are exported (have an +// upper case first letter), and are unmarshalled using the field name +// lowercased as the default key. Custom keys may be defined via the +// "yaml" name in the field tag: the content preceding the first comma +// is used as the key, and the following comma-separated options are +// used to tweak the marshalling process (see Marshal). +// Conflicting names result in a runtime error. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// var t T +// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) +// +// See the documentation of Marshal for the format of tags and a list of +// supported tag options. +func Unmarshal(in []byte, out interface{}) (err error) { + return unmarshal(in, out, false) +} + +// A Decoder reads and decodes YAML values from an input stream. +type Decoder struct { + parser *parser + knownFields bool +} + +// NewDecoder returns a new decoder that reads from r. +// +// The decoder introduces its own buffering and may read +// data from r beyond the YAML values requested. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + parser: newParserFromReader(r), + } +} + +// KnownFields ensures that the keys in decoded mappings to +// exist as fields in the struct being decoded into. +func (dec *Decoder) KnownFields(enable bool) { + dec.knownFields = enable +} + +// Decode reads the next YAML-encoded value from its input +// and stores it in the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (dec *Decoder) Decode(v interface{}) (err error) { + d := newDecoder() + d.knownFields = dec.knownFields + defer handleErr(&err) + node := dec.parser.parse() + if node == nil { + return io.EOF + } + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(node, out) + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +// Decode decodes the node and stores its data into the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (n *Node) Decode(v interface{}) (err error) { + d := newDecoder() + defer handleErr(&err) + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(n, out) + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +func unmarshal(in []byte, out interface{}, strict bool) (err error) { + defer handleErr(&err) + d := newDecoder() + p := newParser(in) + defer p.destroy() + node := p.parse() + if node != nil { + v := reflect.ValueOf(out) + if v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + d.unmarshal(node, v) + } + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +// Marshal serializes the value provided into a YAML document. The structure +// of the generated document will reflect the structure of the value itself. +// Maps and pointers (to struct, string, int, etc) are accepted as the in value. +// +// Struct fields are only marshalled if they are exported (have an upper case +// first letter), and are marshalled using the field name lowercased as the +// default key. Custom keys may be defined via the "yaml" name in the field +// tag: the content preceding the first comma is used as the key, and the +// following comma-separated options are used to tweak the marshalling process. +// Conflicting names result in a runtime error. +// +// The field tag format accepted is: +// +// `(...) yaml:"[][,[,]]" (...)` +// +// The following flags are currently supported: +// +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// Zero valued structs will be omitted if all their public +// fields are zero, unless they implement an IsZero +// method (see the IsZeroer interface type), in which +// case the field will be excluded if IsZero returns true. +// +// flow Marshal using a flow style (useful for structs, +// sequences and maps). +// +// inline Inline the field, which must be a struct or a map, +// causing all of its fields or keys to be processed as if +// they were part of the outer struct. For maps, keys must +// not conflict with the yaml keys of other struct fields. +// +// In addition, if the key is "-", the field is ignored. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" +// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +func Marshal(in interface{}) (out []byte, err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(in)) + e.finish() + out = e.out + return +} + +// An Encoder writes YAML values to an output stream. +type Encoder struct { + encoder *encoder +} + +// NewEncoder returns a new encoder that writes to w. +// The Encoder should be closed after use to flush all data +// to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + encoder: newEncoderWithWriter(w), + } +} + +// Encode writes the YAML encoding of v to the stream. +// If multiple items are encoded to the stream, the +// second and subsequent document will be preceded +// with a "---" document separator, but the first will not. +// +// See the documentation for Marshal for details about the conversion of Go +// values to YAML. +func (e *Encoder) Encode(v interface{}) (err error) { + defer handleErr(&err) + e.encoder.marshalDoc("", reflect.ValueOf(v)) + return nil +} + +// Encode encodes value v and stores its representation in n. +// +// See the documentation for Marshal for details about the +// conversion of Go values into YAML. +func (n *Node) Encode(v interface{}) (err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(v)) + e.finish() + p := newParser(e.out) + p.textless = true + defer p.destroy() + doc := p.parse() + *n = *doc.Content[0] + return nil +} + +// SetIndent changes the used indentation used when encoding. +func (e *Encoder) SetIndent(spaces int) { + if spaces < 0 { + panic("yaml: cannot indent to a negative number of spaces") + } + e.encoder.indent = spaces +} + +// CompactSeqIndent makes it so that '- ' is considered part of the indentation. +func (e *Encoder) CompactSeqIndent() { + e.encoder.emitter.compact_sequence_indent = true +} + +// DefaultSeqIndent makes it so that '- ' is not considered part of the indentation. +func (e *Encoder) DefaultSeqIndent() { + e.encoder.emitter.compact_sequence_indent = false +} + +// Close closes the encoder by writing any remaining data. +// It does not write a stream terminating string "...". +func (e *Encoder) Close() (err error) { + defer handleErr(&err) + e.encoder.finish() + return nil +} + +func handleErr(err *error) { + if v := recover(); v != nil { + if e, ok := v.(yamlError); ok { + *err = e.err + } else { + panic(v) + } + } +} + +type yamlError struct { + err error +} + +func fail(err error) { + panic(yamlError{err}) +} + +func failf(format string, args ...interface{}) { + panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) +} + +// A TypeError is returned by Unmarshal when one or more fields in +// the YAML document cannot be properly decoded into the requested +// types. When this error is returned, the value is still +// unmarshaled partially. +type TypeError struct { + Errors []string +} + +func (e *TypeError) Error() string { + return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) +} + +type Kind uint32 + +const ( + DocumentNode Kind = 1 << iota + SequenceNode + MappingNode + ScalarNode + AliasNode +) + +type Style uint32 + +const ( + TaggedStyle Style = 1 << iota + DoubleQuotedStyle + SingleQuotedStyle + LiteralStyle + FoldedStyle + FlowStyle +) + +// Node represents an element in the YAML document hierarchy. While documents +// are typically encoded and decoded into higher level types, such as structs +// and maps, Node is an intermediate representation that allows detailed +// control over the content being decoded or encoded. +// +// It's worth noting that although Node offers access into details such as +// line numbers, colums, and comments, the content when re-encoded will not +// have its original textual representation preserved. An effort is made to +// render the data plesantly, and to preserve comments near the data they +// describe, though. +// +// Values that make use of the Node type interact with the yaml package in the +// same way any other type would do, by encoding and decoding yaml data +// directly or indirectly into them. +// +// For example: +// +// var person struct { +// Name string +// Address yaml.Node +// } +// err := yaml.Unmarshal(data, &person) +// +// Or by itself: +// +// var person Node +// err := yaml.Unmarshal(data, &person) +type Node struct { + // Kind defines whether the node is a document, a mapping, a sequence, + // a scalar value, or an alias to another node. The specific data type of + // scalar nodes may be obtained via the ShortTag and LongTag methods. + Kind Kind + + // Style allows customizing the apperance of the node in the tree. + Style Style + + // Tag holds the YAML tag defining the data type for the value. + // When decoding, this field will always be set to the resolved tag, + // even when it wasn't explicitly provided in the YAML content. + // When encoding, if this field is unset the value type will be + // implied from the node properties, and if it is set, it will only + // be serialized into the representation if TaggedStyle is used or + // the implicit tag diverges from the provided one. + Tag string + + // Value holds the unescaped and unquoted represenation of the value. + Value string + + // Anchor holds the anchor name for this node, which allows aliases to point to it. + Anchor string + + // Alias holds the node that this alias points to. Only valid when Kind is AliasNode. + Alias *Node + + // Content holds contained nodes for documents, mappings, and sequences. + Content []*Node + + // HeadComment holds any comments in the lines preceding the node and + // not separated by an empty line. + HeadComment string + + // LineComment holds any comments at the end of the line where the node is in. + LineComment string + + // FootComment holds any comments following the node and before empty lines. + FootComment string + + // Line and Column hold the node position in the decoded YAML text. + // These fields are not respected when encoding the node. + Line int + Column int +} + +// IsZero returns whether the node has all of its fields unset. +func (n *Node) IsZero() bool { + return n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && n.Anchor == "" && n.Alias == nil && n.Content == nil && + n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0 +} + +// LongTag returns the long form of the tag that indicates the data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) LongTag() string { + return longTag(n.ShortTag()) +} + +// ShortTag returns the short form of the YAML tag that indicates data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) ShortTag() string { + if n.indicatedString() { + return strTag + } + if n.Tag == "" || n.Tag == "!" { + switch n.Kind { + case MappingNode: + return mapTag + case SequenceNode: + return seqTag + case AliasNode: + if n.Alias != nil { + return n.Alias.ShortTag() + } + case ScalarNode: + tag, _ := resolve("", n.Value) + return tag + case 0: + // Special case to make the zero value convenient. + if n.IsZero() { + return nullTag + } + } + return "" + } + return shortTag(n.Tag) +} + +func (n *Node) indicatedString() bool { + return n.Kind == ScalarNode && + (shortTag(n.Tag) == strTag || + (n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0) +} + +// SetString is a convenience function that sets the node to a string value +// and defines its style in a pleasant way depending on its content. +func (n *Node) SetString(s string) { + n.Kind = ScalarNode + if utf8.ValidString(s) { + n.Value = s + n.Tag = strTag + } else { + n.Value = encodeBase64(s) + n.Tag = binaryTag + } + if strings.Contains(n.Value, "\n") { + n.Style = LiteralStyle + } +} + +// -------------------------------------------------------------------------- +// Maintain a mapping of keys to structure field indexes + +// The code in this section was copied from mgo/bson. + +// structInfo holds details for the serialization of fields of +// a given struct. +type structInfo struct { + FieldsMap map[string]fieldInfo + FieldsList []fieldInfo + + // InlineMap is the number of the field in the struct that + // contains an ,inline map, or -1 if there's none. + InlineMap int + + // InlineUnmarshalers holds indexes to inlined fields that + // contain unmarshaler values. + InlineUnmarshalers [][]int +} + +type fieldInfo struct { + Key string + Num int + OmitEmpty bool + Flow bool + // Id holds the unique field identifier, so we can cheaply + // check for field duplicates without maintaining an extra map. + Id int + + // Inline holds the field index if the field is part of an inlined struct. + Inline []int +} + +var structMap = make(map[reflect.Type]*structInfo) +var fieldMapMutex sync.RWMutex +var unmarshalerType reflect.Type + +func init() { + var v Unmarshaler + unmarshalerType = reflect.ValueOf(&v).Elem().Type() +} + +func getStructInfo(st reflect.Type) (*structInfo, error) { + fieldMapMutex.RLock() + sinfo, found := structMap[st] + fieldMapMutex.RUnlock() + if found { + return sinfo, nil + } + + n := st.NumField() + fieldsMap := make(map[string]fieldInfo) + fieldsList := make([]fieldInfo, 0, n) + inlineMap := -1 + inlineUnmarshalers := [][]int(nil) + for i := 0; i != n; i++ { + field := st.Field(i) + if field.PkgPath != "" && !field.Anonymous { + continue // Private field + } + + info := fieldInfo{Num: i} + + tag := field.Tag.Get("yaml") + if tag == "" && strings.Index(string(field.Tag), ":") < 0 { + tag = string(field.Tag) + } + if tag == "-" { + continue + } + + inline := false + fields := strings.Split(tag, ",") + if len(fields) > 1 { + for _, flag := range fields[1:] { + switch flag { + case "omitempty": + info.OmitEmpty = true + case "flow": + info.Flow = true + case "inline": + inline = true + default: + return nil, errors.New(fmt.Sprintf("unsupported flag %q in tag %q of type %s", flag, tag, st)) + } + } + tag = fields[0] + } + + if inline { + switch field.Type.Kind() { + case reflect.Map: + if inlineMap >= 0 { + return nil, errors.New("multiple ,inline maps in struct " + st.String()) + } + if field.Type.Key() != reflect.TypeOf("") { + return nil, errors.New("option ,inline needs a map with string keys in struct " + st.String()) + } + inlineMap = info.Num + case reflect.Struct, reflect.Ptr: + ftype := field.Type + for ftype.Kind() == reflect.Ptr { + ftype = ftype.Elem() + } + if ftype.Kind() != reflect.Struct { + return nil, errors.New("option ,inline may only be used on a struct or map field") + } + if reflect.PtrTo(ftype).Implements(unmarshalerType) { + inlineUnmarshalers = append(inlineUnmarshalers, []int{i}) + } else { + sinfo, err := getStructInfo(ftype) + if err != nil { + return nil, err + } + for _, index := range sinfo.InlineUnmarshalers { + inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...)) + } + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + finfo.Id = len(fieldsList) + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) + } + } + default: + return nil, errors.New("option ,inline may only be used on a struct or map field") + } + continue + } + + if tag != "" { + info.Key = tag + } else { + info.Key = strings.ToLower(field.Name) + } + + if _, found = fieldsMap[info.Key]; found { + msg := "duplicated key '" + info.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + + info.Id = len(fieldsList) + fieldsList = append(fieldsList, info) + fieldsMap[info.Key] = info + } + + sinfo = &structInfo{ + FieldsMap: fieldsMap, + FieldsList: fieldsList, + InlineMap: inlineMap, + InlineUnmarshalers: inlineUnmarshalers, + } + + fieldMapMutex.Lock() + structMap[st] = sinfo + fieldMapMutex.Unlock() + return sinfo, nil +} + +// IsZeroer is used to check whether an object is zero to +// determine whether it should be omitted when marshaling +// with the omitempty flag. One notable implementation +// is time.Time. +type IsZeroer interface { + IsZero() bool +} + +func isZero(v reflect.Value) bool { + kind := v.Kind() + if z, ok := v.Interface().(IsZeroer); ok { + if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { + return true + } + return z.IsZero() + } + switch kind { + case reflect.String: + return len(v.String()) == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflect.Slice: + return v.Len() == 0 + case reflect.Map: + return v.Len() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Struct: + vt := v.Type() + for i := v.NumField() - 1; i >= 0; i-- { + if vt.Field(i).PkgPath != "" { + continue // Private field + } + if !isZero(v.Field(i)) { + return false + } + } + return true + } + return false +} diff --git a/vendor/go.yaml.in/yaml/v3/yamlh.go b/vendor/go.yaml.in/yaml/v3/yamlh.go new file mode 100644 index 0000000000..f59aa40f64 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/yamlh.go @@ -0,0 +1,811 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "fmt" + "io" +) + +// The version directive data. +type yaml_version_directive_t struct { + major int8 // The major version number. + minor int8 // The minor version number. +} + +// The tag directive data. +type yaml_tag_directive_t struct { + handle []byte // The tag handle. + prefix []byte // The tag prefix. +} + +type yaml_encoding_t int + +// The stream encoding. +const ( + // Let the parser choose the encoding. + yaml_ANY_ENCODING yaml_encoding_t = iota + + yaml_UTF8_ENCODING // The default UTF-8 encoding. + yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. + yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. +) + +type yaml_break_t int + +// Line break types. +const ( + // Let the parser choose the break type. + yaml_ANY_BREAK yaml_break_t = iota + + yaml_CR_BREAK // Use CR for line breaks (Mac style). + yaml_LN_BREAK // Use LN for line breaks (Unix style). + yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). +) + +type yaml_error_type_t int + +// Many bad things could happen with the parser and emitter. +const ( + // No error is produced. + yaml_NO_ERROR yaml_error_type_t = iota + + yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. + yaml_READER_ERROR // Cannot read or decode the input stream. + yaml_SCANNER_ERROR // Cannot scan the input stream. + yaml_PARSER_ERROR // Cannot parse the input stream. + yaml_COMPOSER_ERROR // Cannot compose a YAML document. + yaml_WRITER_ERROR // Cannot write to the output stream. + yaml_EMITTER_ERROR // Cannot emit a YAML stream. +) + +// The pointer position. +type yaml_mark_t struct { + index int // The position index. + line int // The position line. + column int // The position column. +} + +// Node Styles + +type yaml_style_t int8 + +type yaml_scalar_style_t yaml_style_t + +// Scalar styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = 0 + + yaml_PLAIN_SCALAR_STYLE yaml_scalar_style_t = 1 << iota // The plain scalar style. + yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. + yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. + yaml_LITERAL_SCALAR_STYLE // The literal scalar style. + yaml_FOLDED_SCALAR_STYLE // The folded scalar style. +) + +type yaml_sequence_style_t yaml_style_t + +// Sequence styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota + + yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. + yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. +) + +type yaml_mapping_style_t yaml_style_t + +// Mapping styles. +const ( + // Let the emitter choose the style. + yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota + + yaml_BLOCK_MAPPING_STYLE // The block mapping style. + yaml_FLOW_MAPPING_STYLE // The flow mapping style. +) + +// Tokens + +type yaml_token_type_t int + +// Token types. +const ( + // An empty token. + yaml_NO_TOKEN yaml_token_type_t = iota + + yaml_STREAM_START_TOKEN // A STREAM-START token. + yaml_STREAM_END_TOKEN // A STREAM-END token. + + yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. + yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. + yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. + yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. + + yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. + yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. + yaml_BLOCK_END_TOKEN // A BLOCK-END token. + + yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. + yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. + yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. + yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. + + yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. + yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. + yaml_KEY_TOKEN // A KEY token. + yaml_VALUE_TOKEN // A VALUE token. + + yaml_ALIAS_TOKEN // An ALIAS token. + yaml_ANCHOR_TOKEN // An ANCHOR token. + yaml_TAG_TOKEN // A TAG token. + yaml_SCALAR_TOKEN // A SCALAR token. +) + +func (tt yaml_token_type_t) String() string { + switch tt { + case yaml_NO_TOKEN: + return "yaml_NO_TOKEN" + case yaml_STREAM_START_TOKEN: + return "yaml_STREAM_START_TOKEN" + case yaml_STREAM_END_TOKEN: + return "yaml_STREAM_END_TOKEN" + case yaml_VERSION_DIRECTIVE_TOKEN: + return "yaml_VERSION_DIRECTIVE_TOKEN" + case yaml_TAG_DIRECTIVE_TOKEN: + return "yaml_TAG_DIRECTIVE_TOKEN" + case yaml_DOCUMENT_START_TOKEN: + return "yaml_DOCUMENT_START_TOKEN" + case yaml_DOCUMENT_END_TOKEN: + return "yaml_DOCUMENT_END_TOKEN" + case yaml_BLOCK_SEQUENCE_START_TOKEN: + return "yaml_BLOCK_SEQUENCE_START_TOKEN" + case yaml_BLOCK_MAPPING_START_TOKEN: + return "yaml_BLOCK_MAPPING_START_TOKEN" + case yaml_BLOCK_END_TOKEN: + return "yaml_BLOCK_END_TOKEN" + case yaml_FLOW_SEQUENCE_START_TOKEN: + return "yaml_FLOW_SEQUENCE_START_TOKEN" + case yaml_FLOW_SEQUENCE_END_TOKEN: + return "yaml_FLOW_SEQUENCE_END_TOKEN" + case yaml_FLOW_MAPPING_START_TOKEN: + return "yaml_FLOW_MAPPING_START_TOKEN" + case yaml_FLOW_MAPPING_END_TOKEN: + return "yaml_FLOW_MAPPING_END_TOKEN" + case yaml_BLOCK_ENTRY_TOKEN: + return "yaml_BLOCK_ENTRY_TOKEN" + case yaml_FLOW_ENTRY_TOKEN: + return "yaml_FLOW_ENTRY_TOKEN" + case yaml_KEY_TOKEN: + return "yaml_KEY_TOKEN" + case yaml_VALUE_TOKEN: + return "yaml_VALUE_TOKEN" + case yaml_ALIAS_TOKEN: + return "yaml_ALIAS_TOKEN" + case yaml_ANCHOR_TOKEN: + return "yaml_ANCHOR_TOKEN" + case yaml_TAG_TOKEN: + return "yaml_TAG_TOKEN" + case yaml_SCALAR_TOKEN: + return "yaml_SCALAR_TOKEN" + } + return "" +} + +// The token structure. +type yaml_token_t struct { + // The token type. + typ yaml_token_type_t + + // The start/end of the token. + start_mark, end_mark yaml_mark_t + + // The stream encoding (for yaml_STREAM_START_TOKEN). + encoding yaml_encoding_t + + // The alias/anchor/scalar value or tag/tag directive handle + // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). + value []byte + + // The tag suffix (for yaml_TAG_TOKEN). + suffix []byte + + // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). + prefix []byte + + // The scalar style (for yaml_SCALAR_TOKEN). + style yaml_scalar_style_t + + // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). + major, minor int8 +} + +// Events + +type yaml_event_type_t int8 + +// Event types. +const ( + // An empty event. + yaml_NO_EVENT yaml_event_type_t = iota + + yaml_STREAM_START_EVENT // A STREAM-START event. + yaml_STREAM_END_EVENT // A STREAM-END event. + yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. + yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. + yaml_ALIAS_EVENT // An ALIAS event. + yaml_SCALAR_EVENT // A SCALAR event. + yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. + yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. + yaml_MAPPING_START_EVENT // A MAPPING-START event. + yaml_MAPPING_END_EVENT // A MAPPING-END event. + yaml_TAIL_COMMENT_EVENT +) + +var eventStrings = []string{ + yaml_NO_EVENT: "none", + yaml_STREAM_START_EVENT: "stream start", + yaml_STREAM_END_EVENT: "stream end", + yaml_DOCUMENT_START_EVENT: "document start", + yaml_DOCUMENT_END_EVENT: "document end", + yaml_ALIAS_EVENT: "alias", + yaml_SCALAR_EVENT: "scalar", + yaml_SEQUENCE_START_EVENT: "sequence start", + yaml_SEQUENCE_END_EVENT: "sequence end", + yaml_MAPPING_START_EVENT: "mapping start", + yaml_MAPPING_END_EVENT: "mapping end", + yaml_TAIL_COMMENT_EVENT: "tail comment", +} + +func (e yaml_event_type_t) String() string { + if e < 0 || int(e) >= len(eventStrings) { + return fmt.Sprintf("unknown event %d", e) + } + return eventStrings[e] +} + +// The event structure. +type yaml_event_t struct { + + // The event type. + typ yaml_event_type_t + + // The start and end of the event. + start_mark, end_mark yaml_mark_t + + // The document encoding (for yaml_STREAM_START_EVENT). + encoding yaml_encoding_t + + // The version directive (for yaml_DOCUMENT_START_EVENT). + version_directive *yaml_version_directive_t + + // The list of tag directives (for yaml_DOCUMENT_START_EVENT). + tag_directives []yaml_tag_directive_t + + // The comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + + // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). + anchor []byte + + // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + tag []byte + + // The scalar value (for yaml_SCALAR_EVENT). + value []byte + + // Is the document start/end indicator implicit, or the tag optional? + // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). + implicit bool + + // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). + quoted_implicit bool + + // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + style yaml_style_t +} + +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } + +// Nodes + +const ( + yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. + yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. + yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. + yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. + yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. + yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. + + yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. + yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. + + // Not in original libyaml. + yaml_BINARY_TAG = "tag:yaml.org,2002:binary" + yaml_MERGE_TAG = "tag:yaml.org,2002:merge" + + yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. + yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. + yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. +) + +type yaml_node_type_t int + +// Node types. +const ( + // An empty node. + yaml_NO_NODE yaml_node_type_t = iota + + yaml_SCALAR_NODE // A scalar node. + yaml_SEQUENCE_NODE // A sequence node. + yaml_MAPPING_NODE // A mapping node. +) + +// An element of a sequence node. +type yaml_node_item_t int + +// An element of a mapping node. +type yaml_node_pair_t struct { + key int // The key of the element. + value int // The value of the element. +} + +// The node structure. +type yaml_node_t struct { + typ yaml_node_type_t // The node type. + tag []byte // The node tag. + + // The node data. + + // The scalar parameters (for yaml_SCALAR_NODE). + scalar struct { + value []byte // The scalar value. + length int // The length of the scalar value. + style yaml_scalar_style_t // The scalar style. + } + + // The sequence parameters (for YAML_SEQUENCE_NODE). + sequence struct { + items_data []yaml_node_item_t // The stack of sequence items. + style yaml_sequence_style_t // The sequence style. + } + + // The mapping parameters (for yaml_MAPPING_NODE). + mapping struct { + pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). + pairs_start *yaml_node_pair_t // The beginning of the stack. + pairs_end *yaml_node_pair_t // The end of the stack. + pairs_top *yaml_node_pair_t // The top of the stack. + style yaml_mapping_style_t // The mapping style. + } + + start_mark yaml_mark_t // The beginning of the node. + end_mark yaml_mark_t // The end of the node. + +} + +// The document structure. +type yaml_document_t struct { + + // The document nodes. + nodes []yaml_node_t + + // The version directive. + version_directive *yaml_version_directive_t + + // The list of tag directives. + tag_directives_data []yaml_tag_directive_t + tag_directives_start int // The beginning of the tag directives list. + tag_directives_end int // The end of the tag directives list. + + start_implicit int // Is the document start indicator implicit? + end_implicit int // Is the document end indicator implicit? + + // The start/end of the document. + start_mark, end_mark yaml_mark_t +} + +// The prototype of a read handler. +// +// The read handler is called when the parser needs to read more bytes from the +// source. The handler should write not more than size bytes to the buffer. +// The number of written bytes should be set to the size_read variable. +// +// [in,out] data A pointer to an application data specified by +// +// yaml_parser_set_input(). +// +// [out] buffer The buffer to write the data from the source. +// [in] size The size of the buffer. +// [out] size_read The actual number of bytes read from the source. +// +// On success, the handler should return 1. If the handler failed, +// the returned value should be 0. On EOF, the handler should set the +// size_read to 0 and return 1. +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) + +// This structure holds information about a potential simple key. +type yaml_simple_key_t struct { + possible bool // Is a simple key possible? + required bool // Is a simple key required? + token_number int // The number of the token. + mark yaml_mark_t // The position mark. +} + +// The states of the parser. +type yaml_parser_state_t int + +const ( + yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota + + yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. + yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. + yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. + yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. + yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. + yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. + yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. + yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. + yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. + yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. + yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. + yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. + yaml_PARSE_END_STATE // Expect nothing. +) + +func (ps yaml_parser_state_t) String() string { + switch ps { + case yaml_PARSE_STREAM_START_STATE: + return "yaml_PARSE_STREAM_START_STATE" + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_START_STATE: + return "yaml_PARSE_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return "yaml_PARSE_DOCUMENT_CONTENT_STATE" + case yaml_PARSE_DOCUMENT_END_STATE: + return "yaml_PARSE_DOCUMENT_END_STATE" + case yaml_PARSE_BLOCK_NODE_STATE: + return "yaml_PARSE_BLOCK_NODE_STATE" + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" + case yaml_PARSE_FLOW_NODE_STATE: + return "yaml_PARSE_FLOW_NODE_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" + case yaml_PARSE_END_STATE: + return "yaml_PARSE_END_STATE" + } + return "" +} + +// This structure holds aliases data. +type yaml_alias_data_t struct { + anchor []byte // The anchor. + index int // The node id. + mark yaml_mark_t // The anchor mark. +} + +// The parser structure. +// +// All members are internal. Manage the structure using the +// yaml_parser_ family of functions. +type yaml_parser_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + + problem string // Error description. + + // The byte about which the problem occurred. + problem_offset int + problem_value int + problem_mark yaml_mark_t + + // The error context. + context string + context_mark yaml_mark_t + + // Reader stuff + + read_handler yaml_read_handler_t // Read handler. + + input_reader io.Reader // File input data. + input []byte // String input data. + input_pos int + + eof bool // EOF flag + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + unread int // The number of unread characters in the buffer. + + newlines int // The number of line breaks since last non-break/non-blank character + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The input encoding. + + offset int // The offset of the current position (in bytes). + mark yaml_mark_t // The mark of the current position. + + // Comments + + head_comment []byte // The current head comments + line_comment []byte // The current line comments + foot_comment []byte // The current foot comments + tail_comment []byte // Foot comment that happens at the end of a block. + stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc) + + comments []yaml_comment_t // The folded comments for all parsed tokens + comments_head int + + // Scanner stuff + + stream_start_produced bool // Have we started to scan the input stream? + stream_end_produced bool // Have we reached the end of the input stream? + + flow_level int // The number of unclosed '[' and '{' indicators. + + tokens []yaml_token_t // The tokens queue. + tokens_head int // The head of the tokens queue. + tokens_parsed int // The number of tokens fetched from the queue. + token_available bool // Does the tokens queue contain a token ready for dequeueing. + + indent int // The current indentation level. + indents []int // The indentation levels stack. + + simple_key_allowed bool // May a simple key occur at the current position? + simple_keys []yaml_simple_key_t // The stack of simple keys. + simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number + + // Parser stuff + + state yaml_parser_state_t // The current parser state. + states []yaml_parser_state_t // The parser states stack. + marks []yaml_mark_t // The stack of marks. + tag_directives []yaml_tag_directive_t // The list of TAG directives. + + // Dumper stuff + + aliases []yaml_alias_data_t // The alias data. + + document *yaml_document_t // The currently parsed document. +} + +type yaml_comment_t struct { + scan_mark yaml_mark_t // Position where scanning for comments started + token_mark yaml_mark_t // Position after which tokens will be associated with this comment + start_mark yaml_mark_t // Position of '#' comment mark + end_mark yaml_mark_t // Position where comment terminated + + head []byte + line []byte + foot []byte +} + +// Emitter Definitions + +// The prototype of a write handler. +// +// The write handler is called when the emitter needs to flush the accumulated +// characters to the output. The handler should write @a size bytes of the +// @a buffer to the output. +// +// @param[in,out] data A pointer to an application data specified by +// +// yaml_emitter_set_output(). +// +// @param[in] buffer The buffer with bytes to be written. +// @param[in] size The size of the buffer. +// +// @returns On success, the handler should return @c 1. If the handler failed, +// the returned value should be @c 0. +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error + +type yaml_emitter_state_t int + +// The emitter states. +const ( + // Expect STREAM-START. + yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota + + yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. + yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE // Expect the next item of a flow sequence, with the comma already written out + yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. + yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE // Expect the next key of a flow mapping, with the comma already written out + yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. + yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. + yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. + yaml_EMIT_END_STATE // Expect nothing. +) + +// The emitter structure. +// +// All members are internal. Manage the structure using the @c yaml_emitter_ +// family of functions. +type yaml_emitter_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + problem string // Error description. + + // Writer stuff + + write_handler yaml_write_handler_t // Write handler. + + output_buffer *[]byte // String output data. + output_writer io.Writer // File output data. + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The stream encoding. + + // Emitter stuff + + canonical bool // If the output is in the canonical style? + best_indent int // The number of indentation spaces. + best_width int // The preferred width of the output lines. + unicode bool // Allow unescaped non-ASCII characters? + line_break yaml_break_t // The preferred line break. + + state yaml_emitter_state_t // The current emitter state. + states []yaml_emitter_state_t // The stack of states. + + events []yaml_event_t // The event queue. + events_head int // The head of the event queue. + + indents []int // The stack of indentation levels. + + tag_directives []yaml_tag_directive_t // The list of tag directives. + + indent int // The current indentation level. + + compact_sequence_indent bool // Is '- ' is considered part of the indentation for sequence elements? + + flow_level int // The current flow level. + + root_context bool // Is it the document root context? + sequence_context bool // Is it a sequence context? + mapping_context bool // Is it a mapping context? + simple_key_context bool // Is it a simple mapping key context? + + line int // The current line. + column int // The current column. + whitespace bool // If the last character was a whitespace? + indention bool // If the last character was an indentation character (' ', '-', '?', ':')? + open_ended bool // If an explicit document end is required? + + space_above bool // Is there's an empty line above? + foot_indent int // The indent used to write the foot comment above, or -1 if none. + + // Anchor analysis. + anchor_data struct { + anchor []byte // The anchor value. + alias bool // Is it an alias? + } + + // Tag analysis. + tag_data struct { + handle []byte // The tag handle. + suffix []byte // The tag suffix. + } + + // Scalar analysis. + scalar_data struct { + value []byte // The scalar value. + multiline bool // Does the scalar contain line breaks? + flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? + block_plain_allowed bool // Can the scalar be expressed in the block plain style? + single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? + block_allowed bool // Can the scalar be expressed in the literal or folded styles? + style yaml_scalar_style_t // The output style. + } + + // Comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + + key_line_comment []byte + + // Dumper stuff + + opened bool // If the stream was already opened? + closed bool // If the stream was already closed? + + // The information associated with the document nodes. + anchors *struct { + references int // The number of references. + anchor int // The anchor id. + serialized bool // If the node has been emitted? + } + + last_anchor_id int // The last assigned anchor id. + + document *yaml_document_t // The currently emitted document. +} diff --git a/vendor/go.yaml.in/yaml/v3/yamlprivateh.go b/vendor/go.yaml.in/yaml/v3/yamlprivateh.go new file mode 100644 index 0000000000..dea1ba9610 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/yamlprivateh.go @@ -0,0 +1,198 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +const ( + // The size of the input raw buffer. + input_raw_buffer_size = 512 + + // The size of the input buffer. + // It should be possible to decode the whole raw buffer. + input_buffer_size = input_raw_buffer_size * 3 + + // The size of the output buffer. + output_buffer_size = 128 + + // The size of the output raw buffer. + // It should be possible to encode the whole output buffer. + output_raw_buffer_size = (output_buffer_size*2 + 2) + + // The size of other stacks and queues. + initial_stack_size = 16 + initial_queue_size = 16 + initial_string_size = 16 +) + +// Check if the character at the specified position is an alphabetical +// character, a digit, '_', or '-'. +func is_alpha(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' +} + +// Check if the character at the specified position is a digit. +func is_digit(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' +} + +// Get the value of a digit. +func as_digit(b []byte, i int) int { + return int(b[i]) - '0' +} + +// Check if the character at the specified position is a hex-digit. +func is_hex(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' +} + +// Get the value of a hex-digit. +func as_hex(b []byte, i int) int { + bi := b[i] + if bi >= 'A' && bi <= 'F' { + return int(bi) - 'A' + 10 + } + if bi >= 'a' && bi <= 'f' { + return int(bi) - 'a' + 10 + } + return int(bi) - '0' +} + +// Check if the character is ASCII. +func is_ascii(b []byte, i int) bool { + return b[i] <= 0x7F +} + +// Check if the character at the start of the buffer can be printed unescaped. +func is_printable(b []byte, i int) bool { + return ((b[i] == 0x0A) || // . == #x0A + (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E + (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF + (b[i] > 0xC2 && b[i] < 0xED) || + (b[i] == 0xED && b[i+1] < 0xA0) || + (b[i] == 0xEE) || + (b[i] == 0xEF && // #xE000 <= . <= #xFFFD + !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF + !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) +} + +// Check if the character at the specified position is NUL. +func is_z(b []byte, i int) bool { + return b[i] == 0x00 +} + +// Check if the beginning of the buffer is a BOM. +func is_bom(b []byte, i int) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +// Check if the character at the specified position is space. +func is_space(b []byte, i int) bool { + return b[i] == ' ' +} + +// Check if the character at the specified position is tab. +func is_tab(b []byte, i int) bool { + return b[i] == '\t' +} + +// Check if the character at the specified position is blank (space or tab). +func is_blank(b []byte, i int) bool { + //return is_space(b, i) || is_tab(b, i) + return b[i] == ' ' || b[i] == '\t' +} + +// Check if the character at the specified position is a line break. +func is_break(b []byte, i int) bool { + return (b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) +} + +func is_crlf(b []byte, i int) bool { + return b[i] == '\r' && b[i+1] == '\n' +} + +// Check if the character is a line break or NUL. +func is_breakz(b []byte, i int) bool { + //return is_break(b, i) || is_z(b, i) + return ( + // is_break: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + // is_z: + b[i] == 0) +} + +// Check if the character is a line break, space, or NUL. +func is_spacez(b []byte, i int) bool { + //return is_space(b, i) || is_breakz(b, i) + return ( + // is_space: + b[i] == ' ' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Check if the character is a line break, space, tab, or NUL. +func is_blankz(b []byte, i int) bool { + //return is_blank(b, i) || is_breakz(b, i) + return ( + // is_blank: + b[i] == ' ' || b[i] == '\t' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Determine the width of the character. +func width(b byte) int { + // Don't replace these by a switch without first + // confirming that it is being inlined. + if b&0x80 == 0x00 { + return 1 + } + if b&0xE0 == 0xC0 { + return 2 + } + if b&0xF0 == 0xE0 { + return 3 + } + if b&0xF8 == 0xF0 { + return 4 + } + return 0 + +} diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go b/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go index 3685b34458..75df77406d 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go +++ b/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go @@ -3,6 +3,10 @@ // license that can be found in the LICENSE file. // Package salsa provides low-level access to functions in the Salsa family. +// +// Deprecated: this package exposes unsafe low-level operations. New applications +// should consider using the AEAD construction in golang.org/x/crypto/chacha20poly1305 +// instead. Existing users should migrate to golang.org/x/crypto/salsa20. package salsa import "math/bits" diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go index 04c6bec210..12f2273706 100644 --- a/vendor/golang.org/x/net/html/escape.go +++ b/vendor/golang.org/x/net/html/escape.go @@ -299,7 +299,7 @@ func escape(w writer, s string) error { case '\r': esc = " " default: - panic("unrecognized escape character") + panic("html: unrecognized escape character") } s = s[i+1:] if _, err := w.WriteString(esc); err != nil { diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go index 518ee4c94e..88fc0056a3 100644 --- a/vendor/golang.org/x/net/html/parse.go +++ b/vendor/golang.org/x/net/html/parse.go @@ -136,7 +136,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { return -1 } default: - panic("unreachable") + panic(fmt.Sprintf("html: internal error: indexOfElementInScope unknown scope: %d", s)) } } switch s { @@ -179,7 +179,7 @@ func (p *parser) clearStackToContext(s scope) { return } default: - panic("unreachable") + panic(fmt.Sprintf("html: internal error: clearStackToContext unknown scope: %d", s)) } } } @@ -231,7 +231,14 @@ func (p *parser) addChild(n *Node) { } if n.Type == ElementNode { - p.oe = append(p.oe, n) + p.insertOpenElement(n) + } +} + +func (p *parser) insertOpenElement(n *Node) { + p.oe = append(p.oe, n) + if len(p.oe) > 512 { + panic("html: open stack of elements exceeds 512 nodes") } } @@ -810,7 +817,7 @@ func afterHeadIM(p *parser) bool { p.im = inFramesetIM return true case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: - p.oe = append(p.oe, p.head) + p.insertOpenElement(p.head) defer p.oe.remove(p.head) return inHeadIM(p) case a.Head: @@ -1678,7 +1685,7 @@ func inTableBodyIM(p *parser) bool { return inTableIM(p) } -// Section 12.2.6.4.14. +// Section 13.2.6.4.14. func inRowIM(p *parser) bool { switch p.tok.Type { case StartTagToken: @@ -1690,7 +1697,9 @@ func inRowIM(p *parser) bool { p.im = inCellIM return true case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr: - if p.popUntil(tableScope, a.Tr) { + if p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() p.im = inTableBodyIM return false } @@ -1700,22 +1709,28 @@ func inRowIM(p *parser) bool { case EndTagToken: switch p.tok.DataAtom { case a.Tr: - if p.popUntil(tableScope, a.Tr) { + if p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() p.im = inTableBodyIM return true } // Ignore the token. return true case a.Table: - if p.popUntil(tableScope, a.Tr) { + if p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() p.im = inTableBodyIM return false } // Ignore the token. return true case a.Tbody, a.Tfoot, a.Thead: - if p.elementInScope(tableScope, p.tok.DataAtom) { - p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String()) + if p.elementInScope(tableScope, p.tok.DataAtom) && p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() + p.im = inTableBodyIM return false } // Ignore the token. @@ -2222,16 +2237,20 @@ func parseForeignContent(p *parser) bool { p.acknowledgeSelfClosingTag() } case EndTagToken: + if strings.EqualFold(p.oe[len(p.oe)-1].Data, p.tok.Data) { + p.oe = p.oe[:len(p.oe)-1] + return true + } for i := len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].Namespace == "" { - return p.im(p) - } if strings.EqualFold(p.oe[i].Data, p.tok.Data) { p.oe = p.oe[:i] + return true + } + if i > 0 && p.oe[i-1].Namespace == "" { break } } - return true + return p.im(p) default: // Ignore the token. } @@ -2312,9 +2331,13 @@ func (p *parser) parseCurrentToken() { } } -func (p *parser) parse() error { +func (p *parser) parse() (err error) { + defer func() { + if panicErr := recover(); panicErr != nil { + err = fmt.Errorf("%s", panicErr) + } + }() // Iterate until EOF. Any other error will cause an early return. - var err error for err != io.EOF { // CDATA sections are allowed only in foreign content. n := p.oe.top() @@ -2343,6 +2366,8 @@ func (p *parser) parse() error { // s. Conversely, explicit s in r's data can be silently dropped, // with no corresponding node in the resulting tree. // +// Parse will reject HTML that is nested deeper than 512 elements. +// // The input is assumed to be UTF-8 encoded. func Parse(r io.Reader) (*Node, error) { return ParseWithOptions(r) diff --git a/vendor/golang.org/x/net/html/render.go b/vendor/golang.org/x/net/html/render.go index e8c1233455..0157d89e1f 100644 --- a/vendor/golang.org/x/net/html/render.go +++ b/vendor/golang.org/x/net/html/render.go @@ -184,7 +184,7 @@ func render1(w writer, n *Node) error { return err } - // Add initial newline where there is danger of a newline beging ignored. + // Add initial newline where there is danger of a newline being ignored. if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") { switch n.Data { case "pre", "listing", "textarea": diff --git a/vendor/golang.org/x/net/http2/config.go b/vendor/golang.org/x/net/http2/config.go index 02fe0c2d48..8a7a89d016 100644 --- a/vendor/golang.org/x/net/http2/config.go +++ b/vendor/golang.org/x/net/http2/config.go @@ -27,6 +27,7 @@ import ( // - If the resulting value is zero or out of range, use a default. type http2Config struct { MaxConcurrentStreams uint32 + StrictMaxConcurrentRequests bool MaxDecoderHeaderTableSize uint32 MaxEncoderHeaderTableSize uint32 MaxReadFrameSize uint32 @@ -64,12 +65,13 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config { // (the net/http Transport). func configFromTransport(h2 *Transport) http2Config { conf := http2Config{ - MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize, - MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize, - MaxReadFrameSize: h2.MaxReadFrameSize, - SendPingTimeout: h2.ReadIdleTimeout, - PingTimeout: h2.PingTimeout, - WriteByteTimeout: h2.WriteByteTimeout, + StrictMaxConcurrentRequests: h2.StrictMaxConcurrentStreams, + MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize, + MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize, + MaxReadFrameSize: h2.MaxReadFrameSize, + SendPingTimeout: h2.ReadIdleTimeout, + PingTimeout: h2.PingTimeout, + WriteByteTimeout: h2.WriteByteTimeout, } // Unlike most config fields, where out-of-range values revert to the default, @@ -128,6 +130,9 @@ func fillNetHTTPConfig(conf *http2Config, h2 *http.HTTP2Config) { if h2.MaxConcurrentStreams != 0 { conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams) } + if http2ConfigStrictMaxConcurrentRequests(h2) { + conf.StrictMaxConcurrentRequests = true + } if h2.MaxEncoderHeaderTableSize != 0 { conf.MaxEncoderHeaderTableSize = uint32(h2.MaxEncoderHeaderTableSize) } diff --git a/vendor/golang.org/x/net/http2/config_go125.go b/vendor/golang.org/x/net/http2/config_go125.go new file mode 100644 index 0000000000..b4373fe33c --- /dev/null +++ b/vendor/golang.org/x/net/http2/config_go125.go @@ -0,0 +1,15 @@ +// Copyright 2025 The Go 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.26 + +package http2 + +import ( + "net/http" +) + +func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool { + return false +} diff --git a/vendor/golang.org/x/net/http2/config_go126.go b/vendor/golang.org/x/net/http2/config_go126.go new file mode 100644 index 0000000000..6b071c149d --- /dev/null +++ b/vendor/golang.org/x/net/http2/config_go126.go @@ -0,0 +1,15 @@ +// Copyright 2025 The Go 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.26 + +package http2 + +import ( + "net/http" +) + +func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool { + return h2.StrictMaxConcurrentRequests +} diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index db3264da8c..93bcaab03a 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -347,7 +347,7 @@ func (fr *Framer) maxHeaderListSize() uint32 { func (f *Framer) startWrite(ftype FrameType, flags Flags, streamID uint32) { // Write the FrameHeader. f.wbuf = append(f.wbuf[:0], - 0, // 3 bytes of length, filled in in endWrite + 0, // 3 bytes of length, filled in endWrite 0, 0, byte(ftype), @@ -1152,6 +1152,15 @@ type PriorityFrame struct { PriorityParam } +var defaultRFC9218Priority = PriorityParam{ + incremental: 0, + urgency: 3, +} + +// Note that HTTP/2 has had two different prioritization schemes, and +// PriorityParam struct below is a superset of both schemes. The exported +// symbols are from RFC 7540 and the non-exported ones are from RFC 9218. + // PriorityParam are the stream prioritzation parameters. type PriorityParam struct { // StreamDep is a 31-bit stream identifier for the @@ -1167,6 +1176,20 @@ type PriorityParam struct { // the spec, "Add one to the value to obtain a weight between // 1 and 256." Weight uint8 + + // "The urgency (u) parameter value is Integer (see Section 3.3.1 of + // [STRUCTURED-FIELDS]), between 0 and 7 inclusive, in descending order of + // priority. The default is 3." + urgency uint8 + + // "The incremental (i) parameter value is Boolean (see Section 3.3.6 of + // [STRUCTURED-FIELDS]). It indicates if an HTTP response can be processed + // incrementally, i.e., provide some meaningful output as chunks of the + // response arrive." + // + // We use uint8 (i.e. 0 is false, 1 is true) instead of bool so we can + // avoid unnecessary type conversions and because either type takes 1 byte. + incremental uint8 } func (p PriorityParam) IsZero() bool { diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index 6878f8ecc9..105fe12fef 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -34,7 +34,6 @@ var ( VerboseLogs bool logFrameWrites bool logFrameReads bool - inTests bool // Enabling extended CONNECT by causes browsers to attempt to use // WebSockets-over-HTTP/2. This results in problems when the server's websocket diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 64085f6e16..bdc5520ebd 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -181,6 +181,10 @@ type Server struct { type serverInternalState struct { mu sync.Mutex activeConns map[*serverConn]struct{} + + // Pool of error channels. This is per-Server rather than global + // because channels can't be reused across synctest bubbles. + errChanPool sync.Pool } func (s *serverInternalState) registerConn(sc *serverConn) { @@ -212,6 +216,27 @@ func (s *serverInternalState) startGracefulShutdown() { s.mu.Unlock() } +// Global error channel pool used for uninitialized Servers. +// We use a per-Server pool when possible to avoid using channels across synctest bubbles. +var errChanPool = sync.Pool{ + New: func() any { return make(chan error, 1) }, +} + +func (s *serverInternalState) getErrChan() chan error { + if s == nil { + return errChanPool.Get().(chan error) // Server used without calling ConfigureServer + } + return s.errChanPool.Get().(chan error) +} + +func (s *serverInternalState) putErrChan(ch chan error) { + if s == nil { + errChanPool.Put(ch) // Server used without calling ConfigureServer + return + } + s.errChanPool.Put(ch) +} + // ConfigureServer adds HTTP/2 support to a net/http Server. // // The configuration conf may be nil. @@ -224,7 +249,10 @@ func ConfigureServer(s *http.Server, conf *Server) error { if conf == nil { conf = new(Server) } - conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})} + conf.state = &serverInternalState{ + activeConns: make(map[*serverConn]struct{}), + errChanPool: sync.Pool{New: func() any { return make(chan error, 1) }}, + } if h1, h2 := s, conf; h2.IdleTimeout == 0 { if h1.IdleTimeout != 0 { h2.IdleTimeout = h1.IdleTimeout @@ -1124,25 +1152,6 @@ func (sc *serverConn) readPreface() error { } } -var errChanPool = sync.Pool{ - New: func() interface{} { return make(chan error, 1) }, -} - -func getErrChan() chan error { - if inTests { - // Channels cannot be reused across synctest tests. - return make(chan error, 1) - } else { - return errChanPool.Get().(chan error) - } -} - -func putErrChan(ch chan error) { - if !inTests { - errChanPool.Put(ch) - } -} - var writeDataPool = sync.Pool{ New: func() interface{} { return new(writeData) }, } @@ -1150,7 +1159,7 @@ var writeDataPool = sync.Pool{ // writeDataFromHandler writes DATA response frames from a handler on // the given stream. func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error { - ch := getErrChan() + ch := sc.srv.state.getErrChan() writeArg := writeDataPool.Get().(*writeData) *writeArg = writeData{stream.id, data, endStream} err := sc.writeFrameFromHandler(FrameWriteRequest{ @@ -1182,7 +1191,7 @@ func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStrea return errStreamClosed } } - putErrChan(ch) + sc.srv.state.putErrChan(ch) if frameWriteDone { writeDataPool.Put(writeArg) } @@ -2436,7 +2445,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro // waiting for this frame to be written, so an http.Flush mid-handler // writes out the correct value of keys, before a handler later potentially // mutates it. - errc = getErrChan() + errc = sc.srv.state.getErrChan() } if err := sc.writeFrameFromHandler(FrameWriteRequest{ write: headerData, @@ -2448,7 +2457,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro if errc != nil { select { case err := <-errc: - putErrChan(errc) + sc.srv.state.putErrChan(errc) return err case <-sc.doneServing: return errClientDisconnected @@ -3129,7 +3138,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error { method: opts.Method, url: u, header: cloneHeader(opts.Header), - done: getErrChan(), + done: sc.srv.state.getErrChan(), } select { @@ -3146,7 +3155,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error { case <-st.cw: return errStreamClosed case err := <-msg.done: - putErrChan(msg.done) + sc.srv.state.putErrChan(msg.done) return err } } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 35e3902519..be759b6065 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -355,6 +355,7 @@ type ClientConn struct { readIdleTimeout time.Duration pingTimeout time.Duration extendedConnectAllowed bool + strictMaxConcurrentStreams bool // rstStreamPingsBlocked works around an unfortunate gRPC behavior. // gRPC strictly limits the number of PING frames that it will receive. @@ -784,7 +785,8 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro initialWindowSize: 65535, // spec default initialStreamRecvWindowSize: conf.MaxUploadBufferPerStream, maxConcurrentStreams: initialMaxConcurrentStreams, // "infinite", per spec. Use a smaller value until we have received server settings. - peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead. + strictMaxConcurrentStreams: conf.StrictMaxConcurrentRequests, + peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead. streams: make(map[uint32]*clientStream), singleUse: singleUse, seenSettingsChan: make(chan struct{}), @@ -1018,7 +1020,7 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { return } var maxConcurrentOkay bool - if cc.t.StrictMaxConcurrentStreams { + if cc.strictMaxConcurrentStreams { // We'll tell the caller we can take a new request to // prevent the caller from dialing a new TCP // connection, but then we'll block later before diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go index cc893adc29..4d3890f99a 100644 --- a/vendor/golang.org/x/net/http2/writesched.go +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -42,6 +42,8 @@ type OpenStreamOptions struct { // PusherID is zero if the stream was initiated by the client. Otherwise, // PusherID names the stream that pushed the newly opened stream. PusherID uint32 + // priority is used to set the priority of the newly opened stream. + priority PriorityParam } // FrameWriteRequest is a request to write a frame. diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go similarity index 78% rename from vendor/golang.org/x/net/http2/writesched_priority.go rename to vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go index f6783339d1..6d24d6a1b9 100644 --- a/vendor/golang.org/x/net/http2/writesched_priority.go +++ b/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go @@ -11,7 +11,7 @@ import ( ) // RFC 7540, Section 5.3.5: the default weight is 16. -const priorityDefaultWeight = 15 // 16 = 15 + 1 +const priorityDefaultWeightRFC7540 = 15 // 16 = 15 + 1 // PriorityWriteSchedulerConfig configures a priorityWriteScheduler. type PriorityWriteSchedulerConfig struct { @@ -66,8 +66,8 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler } } - ws := &priorityWriteScheduler{ - nodes: make(map[uint32]*priorityNode), + ws := &priorityWriteSchedulerRFC7540{ + nodes: make(map[uint32]*priorityNodeRFC7540), maxClosedNodesInTree: cfg.MaxClosedNodesInTree, maxIdleNodesInTree: cfg.MaxIdleNodesInTree, enableWriteThrottle: cfg.ThrottleOutOfOrderWrites, @@ -81,32 +81,32 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler return ws } -type priorityNodeState int +type priorityNodeStateRFC7540 int const ( - priorityNodeOpen priorityNodeState = iota - priorityNodeClosed - priorityNodeIdle + priorityNodeOpenRFC7540 priorityNodeStateRFC7540 = iota + priorityNodeClosedRFC7540 + priorityNodeIdleRFC7540 ) -// priorityNode is a node in an HTTP/2 priority tree. +// priorityNodeRFC7540 is a node in an HTTP/2 priority tree. // Each node is associated with a single stream ID. // See RFC 7540, Section 5.3. -type priorityNode struct { - q writeQueue // queue of pending frames to write - id uint32 // id of the stream, or 0 for the root of the tree - weight uint8 // the actual weight is weight+1, so the value is in [1,256] - state priorityNodeState // open | closed | idle - bytes int64 // number of bytes written by this node, or 0 if closed - subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree +type priorityNodeRFC7540 struct { + q writeQueue // queue of pending frames to write + id uint32 // id of the stream, or 0 for the root of the tree + weight uint8 // the actual weight is weight+1, so the value is in [1,256] + state priorityNodeStateRFC7540 // open | closed | idle + bytes int64 // number of bytes written by this node, or 0 if closed + subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree // These links form the priority tree. - parent *priorityNode - kids *priorityNode // start of the kids list - prev, next *priorityNode // doubly-linked list of siblings + parent *priorityNodeRFC7540 + kids *priorityNodeRFC7540 // start of the kids list + prev, next *priorityNodeRFC7540 // doubly-linked list of siblings } -func (n *priorityNode) setParent(parent *priorityNode) { +func (n *priorityNodeRFC7540) setParent(parent *priorityNodeRFC7540) { if n == parent { panic("setParent to self") } @@ -141,7 +141,7 @@ func (n *priorityNode) setParent(parent *priorityNode) { } } -func (n *priorityNode) addBytes(b int64) { +func (n *priorityNodeRFC7540) addBytes(b int64) { n.bytes += b for ; n != nil; n = n.parent { n.subtreeBytes += b @@ -154,7 +154,7 @@ func (n *priorityNode) addBytes(b int64) { // // f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true // if any ancestor p of n is still open (ignoring the root node). -func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool { +func (n *priorityNodeRFC7540) walkReadyInOrder(openParent bool, tmp *[]*priorityNodeRFC7540, f func(*priorityNodeRFC7540, bool) bool) bool { if !n.q.empty() && f(n, openParent) { return true } @@ -165,7 +165,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f // Don't consider the root "open" when updating openParent since // we can't send data frames on the root stream (only control frames). if n.id != 0 { - openParent = openParent || (n.state == priorityNodeOpen) + openParent = openParent || (n.state == priorityNodeOpenRFC7540) } // Common case: only one kid or all kids have the same weight. @@ -195,7 +195,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f *tmp = append(*tmp, n.kids) n.kids.setParent(nil) } - sort.Sort(sortPriorityNodeSiblings(*tmp)) + sort.Sort(sortPriorityNodeSiblingsRFC7540(*tmp)) for i := len(*tmp) - 1; i >= 0; i-- { (*tmp)[i].setParent(n) // setParent inserts at the head of n.kids } @@ -207,11 +207,11 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f return false } -type sortPriorityNodeSiblings []*priorityNode +type sortPriorityNodeSiblingsRFC7540 []*priorityNodeRFC7540 -func (z sortPriorityNodeSiblings) Len() int { return len(z) } -func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] } -func (z sortPriorityNodeSiblings) Less(i, k int) bool { +func (z sortPriorityNodeSiblingsRFC7540) Len() int { return len(z) } +func (z sortPriorityNodeSiblingsRFC7540) Swap(i, k int) { z[i], z[k] = z[k], z[i] } +func (z sortPriorityNodeSiblingsRFC7540) Less(i, k int) bool { // Prefer the subtree that has sent fewer bytes relative to its weight. // See sections 5.3.2 and 5.3.4. wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes) @@ -225,13 +225,13 @@ func (z sortPriorityNodeSiblings) Less(i, k int) bool { return bi/bk <= wi/wk } -type priorityWriteScheduler struct { +type priorityWriteSchedulerRFC7540 struct { // root is the root of the priority tree, where root.id = 0. // The root queues control frames that are not associated with any stream. - root priorityNode + root priorityNodeRFC7540 // nodes maps stream ids to priority tree nodes. - nodes map[uint32]*priorityNode + nodes map[uint32]*priorityNodeRFC7540 // maxID is the maximum stream id in nodes. maxID uint32 @@ -239,7 +239,7 @@ type priorityWriteScheduler struct { // lists of nodes that have been closed or are idle, but are kept in // the tree for improved prioritization. When the lengths exceed either // maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded. - closedNodes, idleNodes []*priorityNode + closedNodes, idleNodes []*priorityNodeRFC7540 // From the config. maxClosedNodesInTree int @@ -248,19 +248,19 @@ type priorityWriteScheduler struct { enableWriteThrottle bool // tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations. - tmp []*priorityNode + tmp []*priorityNodeRFC7540 // pool of empty queues for reuse. queuePool writeQueuePool } -func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { +func (ws *priorityWriteSchedulerRFC7540) OpenStream(streamID uint32, options OpenStreamOptions) { // The stream may be currently idle but cannot be opened or closed. if curr := ws.nodes[streamID]; curr != nil { - if curr.state != priorityNodeIdle { + if curr.state != priorityNodeIdleRFC7540 { panic(fmt.Sprintf("stream %d already opened", streamID)) } - curr.state = priorityNodeOpen + curr.state = priorityNodeOpenRFC7540 return } @@ -272,11 +272,11 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream if parent == nil { parent = &ws.root } - n := &priorityNode{ + n := &priorityNodeRFC7540{ q: *ws.queuePool.get(), id: streamID, - weight: priorityDefaultWeight, - state: priorityNodeOpen, + weight: priorityDefaultWeightRFC7540, + state: priorityNodeOpenRFC7540, } n.setParent(parent) ws.nodes[streamID] = n @@ -285,19 +285,19 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream } } -func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { +func (ws *priorityWriteSchedulerRFC7540) CloseStream(streamID uint32) { if streamID == 0 { panic("violation of WriteScheduler interface: cannot close stream 0") } if ws.nodes[streamID] == nil { panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID)) } - if ws.nodes[streamID].state != priorityNodeOpen { + if ws.nodes[streamID].state != priorityNodeOpenRFC7540 { panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID)) } n := ws.nodes[streamID] - n.state = priorityNodeClosed + n.state = priorityNodeClosedRFC7540 n.addBytes(-n.bytes) q := n.q @@ -310,7 +310,7 @@ func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { } } -func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { +func (ws *priorityWriteSchedulerRFC7540) AdjustStream(streamID uint32, priority PriorityParam) { if streamID == 0 { panic("adjustPriority on root") } @@ -324,11 +324,11 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit return } ws.maxID = streamID - n = &priorityNode{ + n = &priorityNodeRFC7540{ q: *ws.queuePool.get(), id: streamID, - weight: priorityDefaultWeight, - state: priorityNodeIdle, + weight: priorityDefaultWeightRFC7540, + state: priorityNodeIdleRFC7540, } n.setParent(&ws.root) ws.nodes[streamID] = n @@ -340,7 +340,7 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit parent := ws.nodes[priority.StreamDep] if parent == nil { n.setParent(&ws.root) - n.weight = priorityDefaultWeight + n.weight = priorityDefaultWeightRFC7540 return } @@ -381,8 +381,8 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit n.weight = priority.Weight } -func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { - var n *priorityNode +func (ws *priorityWriteSchedulerRFC7540) Push(wr FrameWriteRequest) { + var n *priorityNodeRFC7540 if wr.isControl() { n = &ws.root } else { @@ -401,8 +401,8 @@ func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { n.q.push(wr) } -func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { - ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool { +func (ws *priorityWriteSchedulerRFC7540) Pop() (wr FrameWriteRequest, ok bool) { + ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNodeRFC7540, openParent bool) bool { limit := int32(math.MaxInt32) if openParent { limit = ws.writeThrottleLimit @@ -428,7 +428,7 @@ func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { return wr, ok } -func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) { +func (ws *priorityWriteSchedulerRFC7540) addClosedOrIdleNode(list *[]*priorityNodeRFC7540, maxSize int, n *priorityNodeRFC7540) { if maxSize == 0 { return } @@ -442,7 +442,7 @@ func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, max *list = append(*list, n) } -func (ws *priorityWriteScheduler) removeNode(n *priorityNode) { +func (ws *priorityWriteSchedulerRFC7540) removeNode(n *priorityNodeRFC7540) { for n.kids != nil { n.kids.setParent(n.parent) } diff --git a/vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go b/vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go new file mode 100644 index 0000000000..9b5b8808eb --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go @@ -0,0 +1,209 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package http2 + +import ( + "fmt" + "math" +) + +type streamMetadata struct { + location *writeQueue + priority PriorityParam +} + +type priorityWriteSchedulerRFC9218 struct { + // control contains control frames (SETTINGS, PING, etc.). + control writeQueue + + // heads contain the head of a circular list of streams. + // We put these heads within a nested array that represents urgency and + // incremental, as defined in + // https://www.rfc-editor.org/rfc/rfc9218.html#name-priority-parameters. + // 8 represents u=0 up to u=7, and 2 represents i=false and i=true. + heads [8][2]*writeQueue + + // streams contains a mapping between each stream ID and their metadata, so + // we can quickly locate them when needing to, for example, adjust their + // priority. + streams map[uint32]streamMetadata + + // queuePool are empty queues for reuse. + queuePool writeQueuePool + + // prioritizeIncremental is used to determine whether we should prioritize + // incremental streams or not, when urgency is the same in a given Pop() + // call. + prioritizeIncremental bool +} + +func newPriorityWriteSchedulerRFC9128() WriteScheduler { + ws := &priorityWriteSchedulerRFC9218{ + streams: make(map[uint32]streamMetadata), + } + return ws +} + +func (ws *priorityWriteSchedulerRFC9218) OpenStream(streamID uint32, opt OpenStreamOptions) { + if ws.streams[streamID].location != nil { + panic(fmt.Errorf("stream %d already opened", streamID)) + } + q := ws.queuePool.get() + ws.streams[streamID] = streamMetadata{ + location: q, + priority: opt.priority, + } + + u, i := opt.priority.urgency, opt.priority.incremental + if ws.heads[u][i] == nil { + ws.heads[u][i] = q + q.next = q + q.prev = q + } else { + // Queues are stored in a ring. + // Insert the new stream before ws.head, putting it at the end of the list. + q.prev = ws.heads[u][i].prev + q.next = ws.heads[u][i] + q.prev.next = q + q.next.prev = q + } +} + +func (ws *priorityWriteSchedulerRFC9218) CloseStream(streamID uint32) { + metadata := ws.streams[streamID] + q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental + if q == nil { + return + } + if q.next == q { + // This was the only open stream. + ws.heads[u][i] = nil + } else { + q.prev.next = q.next + q.next.prev = q.prev + if ws.heads[u][i] == q { + ws.heads[u][i] = q.next + } + } + delete(ws.streams, streamID) + ws.queuePool.put(q) +} + +func (ws *priorityWriteSchedulerRFC9218) AdjustStream(streamID uint32, priority PriorityParam) { + metadata := ws.streams[streamID] + q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental + if q == nil { + return + } + + // Remove stream from current location. + if q.next == q { + // This was the only open stream. + ws.heads[u][i] = nil + } else { + q.prev.next = q.next + q.next.prev = q.prev + if ws.heads[u][i] == q { + ws.heads[u][i] = q.next + } + } + + // Insert stream to the new queue. + u, i = priority.urgency, priority.incremental + if ws.heads[u][i] == nil { + ws.heads[u][i] = q + q.next = q + q.prev = q + } else { + // Queues are stored in a ring. + // Insert the new stream before ws.head, putting it at the end of the list. + q.prev = ws.heads[u][i].prev + q.next = ws.heads[u][i] + q.prev.next = q + q.next.prev = q + } + + // Update the metadata. + ws.streams[streamID] = streamMetadata{ + location: q, + priority: priority, + } +} + +func (ws *priorityWriteSchedulerRFC9218) Push(wr FrameWriteRequest) { + if wr.isControl() { + ws.control.push(wr) + return + } + q := ws.streams[wr.StreamID()].location + if q == nil { + // This is a closed stream. + // wr should not be a HEADERS or DATA frame. + // We push the request onto the control queue. + if wr.DataSize() > 0 { + panic("add DATA on non-open stream") + } + ws.control.push(wr) + return + } + q.push(wr) +} + +func (ws *priorityWriteSchedulerRFC9218) Pop() (FrameWriteRequest, bool) { + // Control and RST_STREAM frames first. + if !ws.control.empty() { + return ws.control.shift(), true + } + + // On the next Pop(), we want to prioritize incremental if we prioritized + // non-incremental request of the same urgency this time. Vice-versa. + // i.e. when there are incremental and non-incremental requests at the same + // priority, we give 50% of our bandwidth to the incremental ones in + // aggregate and 50% to the first non-incremental one (since + // non-incremental streams do not use round-robin writes). + ws.prioritizeIncremental = !ws.prioritizeIncremental + + // Always prioritize lowest u (i.e. highest urgency level). + for u := range ws.heads { + for i := range ws.heads[u] { + // When we want to prioritize incremental, we try to pop i=true + // first before i=false when u is the same. + if ws.prioritizeIncremental { + i = (i + 1) % 2 + } + q := ws.heads[u][i] + if q == nil { + continue + } + for { + if wr, ok := q.consume(math.MaxInt32); ok { + if i == 1 { + // For incremental streams, we update head to q.next so + // we can round-robin between multiple streams that can + // immediately benefit from partial writes. + ws.heads[u][i] = q.next + } else { + // For non-incremental streams, we try to finish one to + // completion rather than doing round-robin. However, + // we update head here so that if q.consume() is !ok + // (e.g. the stream has no more frame to consume), head + // is updated to the next q that has frames to consume + // on future iterations. This way, we do not prioritize + // writing to unavailable stream on next Pop() calls, + // preventing head-of-line blocking. + ws.heads[u][i] = q + } + return wr, true + } + q = q.next + if q == ws.heads[u][i] { + break + } + } + + } + } + return FrameWriteRequest{}, false +} diff --git a/vendor/golang.org/x/net/http2/writesched_roundrobin.go b/vendor/golang.org/x/net/http2/writesched_roundrobin.go index 54fe86322d..737cff9ecb 100644 --- a/vendor/golang.org/x/net/http2/writesched_roundrobin.go +++ b/vendor/golang.org/x/net/http2/writesched_roundrobin.go @@ -25,7 +25,7 @@ type roundRobinWriteScheduler struct { } // newRoundRobinWriteScheduler constructs a new write scheduler. -// The round robin scheduler priorizes control frames +// The round robin scheduler prioritizes control frames // like SETTINGS and PING over DATA frames. // When there are no control frames to send, it performs a round-robin // selection from the ready streams. diff --git a/vendor/golang.org/x/net/internal/httpcommon/request.go b/vendor/golang.org/x/net/internal/httpcommon/request.go index 4b70553179..1e10f89ebf 100644 --- a/vendor/golang.org/x/net/internal/httpcommon/request.go +++ b/vendor/golang.org/x/net/internal/httpcommon/request.go @@ -51,7 +51,7 @@ type EncodeHeadersParam struct { DefaultUserAgent string } -// EncodeHeadersParam is the result of EncodeHeaders. +// EncodeHeadersResult is the result of EncodeHeaders. type EncodeHeadersResult struct { HasBody bool HasTrailers bool @@ -399,7 +399,7 @@ type ServerRequestResult struct { // If the request should be rejected, this is a short string suitable for passing // to the http2 package's CountError function. - // It might be a bit odd to return errors this way rather than returing an error, + // It might be a bit odd to return errors this way rather than returning an error, // but this ensures we don't forget to include a CountError reason. InvalidReason string } diff --git a/vendor/golang.org/x/net/internal/socks/socks.go b/vendor/golang.org/x/net/internal/socks/socks.go index 84fcc32b63..8eedb84cec 100644 --- a/vendor/golang.org/x/net/internal/socks/socks.go +++ b/vendor/golang.org/x/net/internal/socks/socks.go @@ -297,7 +297,7 @@ func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, b = append(b, up.Username...) b = append(b, byte(len(up.Password))) b = append(b, up.Password...) - // TODO(mikio): handle IO deadlines and cancelation if + // TODO(mikio): handle IO deadlines and cancellation if // necessary if _, err := rw.Write(b); err != nil { return err diff --git a/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/golang.org/x/sys/unix/affinity_linux.go index 3c7a6d6e2f..3ea470387b 100644 --- a/vendor/golang.org/x/sys/unix/affinity_linux.go +++ b/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -41,6 +41,15 @@ func (s *CPUSet) Zero() { clear(s[:]) } +// Fill adds all possible CPU bits to the set s. On Linux, [SchedSetaffinity] +// will silently ignore any invalid CPU bits in [CPUSet] so this is an +// efficient way of resetting the CPU affinity of a process. +func (s *CPUSet) Fill() { + for i := range s { + s[i] = ^cpuMask(0) + } +} + func cpuBitsIndex(cpu int) int { return cpu / _NCPUBITS } diff --git a/vendor/golang.org/x/sys/unix/fdset.go b/vendor/golang.org/x/sys/unix/fdset.go index 9e83d18cd0..62ed12645f 100644 --- a/vendor/golang.org/x/sys/unix/fdset.go +++ b/vendor/golang.org/x/sys/unix/fdset.go @@ -23,7 +23,5 @@ func (fds *FdSet) IsSet(fd int) bool { // Zero clears the set fds. func (fds *FdSet) Zero() { - for i := range fds.Bits { - fds.Bits[i] = 0 - } + clear(fds.Bits[:]) } diff --git a/vendor/golang.org/x/sys/unix/ifreq_linux.go b/vendor/golang.org/x/sys/unix/ifreq_linux.go index 848840ae4c..309f5a2b0c 100644 --- a/vendor/golang.org/x/sys/unix/ifreq_linux.go +++ b/vendor/golang.org/x/sys/unix/ifreq_linux.go @@ -111,9 +111,7 @@ func (ifr *Ifreq) SetUint32(v uint32) { // clear zeroes the ifreq's union field to prevent trailing garbage data from // being sent to the kernel if an ifreq is reused. func (ifr *Ifreq) clear() { - for i := range ifr.raw.Ifru { - ifr.raw.Ifru[i] = 0 - } + clear(ifr.raw.Ifru[:]) } // TODO(mdlayher): export as IfreqData? For now we can provide helpers such as diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index e6f31d374d..d0ed611912 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -49,6 +49,7 @@ esac if [[ "$GOOS" = "linux" ]]; then # Use the Docker-based build system # Files generated through docker (use $cmd so you can Ctl-C the build or run) + set -e $cmd docker build --tag generate:$GOOS $GOOS $cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS exit diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 4958a65708..9439af961d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -801,9 +801,7 @@ func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) { // one. The kernel expects SID to be in network byte order. binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID) copy(sa.raw[8:14], sa.Remote) - for i := 14; i < 14+IFNAMSIZ; i++ { - sa.raw[i] = 0 - } + clear(sa.raw[14 : 14+IFNAMSIZ]) copy(sa.raw[14:], sa.Dev) return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 88162099af..34a4676973 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -248,6 +248,23 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { return Statvfs1(path, buf, ST_WAIT) } +func Getvfsstat(buf []Statvfs_t, flags int) (n int, err error) { + var ( + _p0 unsafe.Pointer + bufsize uintptr + ) + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statvfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETVFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + /* * Exposed directly */ diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 640f6b153f..bd51337306 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -321,6 +321,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP //sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW //sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) = kernel32.GetNumberOfConsoleInputEvents +//sys FlushConsoleInputBuffer(console Handle) (err error) = kernel32.FlushConsoleInputBuffer //sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot //sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 993a2297db..358be3c7f5 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -65,6 +65,22 @@ var signals = [...]string{ 15: "terminated", } +// File flags for [os.OpenFile]. The O_ prefix is used to indicate +// that these flags are specific to the OpenFile function. +const ( + O_FILE_FLAG_OPEN_NO_RECALL = FILE_FLAG_OPEN_NO_RECALL + O_FILE_FLAG_OPEN_REPARSE_POINT = FILE_FLAG_OPEN_REPARSE_POINT + O_FILE_FLAG_SESSION_AWARE = FILE_FLAG_SESSION_AWARE + O_FILE_FLAG_POSIX_SEMANTICS = FILE_FLAG_POSIX_SEMANTICS + O_FILE_FLAG_BACKUP_SEMANTICS = FILE_FLAG_BACKUP_SEMANTICS + O_FILE_FLAG_DELETE_ON_CLOSE = FILE_FLAG_DELETE_ON_CLOSE + O_FILE_FLAG_SEQUENTIAL_SCAN = FILE_FLAG_SEQUENTIAL_SCAN + O_FILE_FLAG_RANDOM_ACCESS = FILE_FLAG_RANDOM_ACCESS + O_FILE_FLAG_NO_BUFFERING = FILE_FLAG_NO_BUFFERING + O_FILE_FLAG_OVERLAPPED = FILE_FLAG_OVERLAPPED + O_FILE_FLAG_WRITE_THROUGH = FILE_FLAG_WRITE_THROUGH +) + const ( FILE_READ_DATA = 0x00000001 FILE_READ_ATTRIBUTES = 0x00000080 diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 641a5f4b77..426151a019 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -238,6 +238,7 @@ var ( procFindResourceW = modkernel32.NewProc("FindResourceW") procFindVolumeClose = modkernel32.NewProc("FindVolumeClose") procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose") + procFlushConsoleInputBuffer = modkernel32.NewProc("FlushConsoleInputBuffer") procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") procFormatMessageW = modkernel32.NewProc("FormatMessageW") @@ -284,6 +285,7 @@ var ( procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") procGetNamedPipeServerProcessId = modkernel32.NewProc("GetNamedPipeServerProcessId") + procGetNumberOfConsoleInputEvents = modkernel32.NewProc("GetNumberOfConsoleInputEvents") procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") procGetPriorityClass = modkernel32.NewProc("GetPriorityClass") procGetProcAddress = modkernel32.NewProc("GetProcAddress") @@ -2111,6 +2113,14 @@ func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) { return } +func FlushConsoleInputBuffer(console Handle) (err error) { + r1, _, e1 := syscall.SyscallN(procFlushConsoleInputBuffer.Addr(), uintptr(console)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func FlushFileBuffers(handle Handle) (err error) { r1, _, e1 := syscall.SyscallN(procFlushFileBuffers.Addr(), uintptr(handle)) if r1 == 0 { @@ -2481,6 +2491,14 @@ func GetNamedPipeServerProcessId(pipe Handle, serverProcessID *uint32) (err erro return } +func GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) { + r1, _, e1 := syscall.SyscallN(procGetNumberOfConsoleInputEvents.Addr(), uintptr(console), uintptr(unsafe.Pointer(numevents))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) { var _p0 uint32 if wait { diff --git a/vendor/golang.org/x/text/unicode/bidi/core.go b/vendor/golang.org/x/text/unicode/bidi/core.go index 9d2ae547b5..fb8273236d 100644 --- a/vendor/golang.org/x/text/unicode/bidi/core.go +++ b/vendor/golang.org/x/text/unicode/bidi/core.go @@ -427,13 +427,6 @@ type isolatingRunSequence struct { func (i *isolatingRunSequence) Len() int { return len(i.indexes) } -func maxLevel(a, b level) level { - if a > b { - return a - } - return b -} - // Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types, // either L or R, for each isolating run sequence. func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { @@ -474,8 +467,8 @@ func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { indexes: indexes, types: types, level: level, - sos: typeForLevel(maxLevel(prevLevel, level)), - eos: typeForLevel(maxLevel(succLevel, level)), + sos: typeForLevel(max(prevLevel, level)), + eos: typeForLevel(max(succLevel, level)), } } diff --git a/vendor/golang.org/x/time/rate/rate.go b/vendor/golang.org/x/time/rate/rate.go index 794b2e32bf..563270c154 100644 --- a/vendor/golang.org/x/time/rate/rate.go +++ b/vendor/golang.org/x/time/rate/rate.go @@ -195,7 +195,7 @@ func (r *Reservation) CancelAt(t time.Time) { // update state r.lim.last = t r.lim.tokens = tokens - if r.timeToAct == r.lim.lastEvent { + if r.timeToAct.Equal(r.lim.lastEvent) { prevEvent := r.timeToAct.Add(r.limit.durationFromTokens(float64(-r.tokens))) if !prevEvent.Before(t) { r.lim.lastEvent = prevEvent diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go index 5e5601aa46..5bacc0fa49 100644 --- a/vendor/golang.org/x/tools/go/ast/astutil/imports.go +++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go @@ -209,48 +209,46 @@ func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) // DeleteNamedImport deletes the import with the given name and path from the file f, if present. // If there are duplicate import declarations, all matching ones are deleted. func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) { - var delspecs []*ast.ImportSpec - var delcomments []*ast.CommentGroup + var ( + delspecs = make(map[*ast.ImportSpec]bool) + delcomments = make(map[*ast.CommentGroup]bool) + ) // Find the import nodes that import path, if any. for i := 0; i < len(f.Decls); i++ { - decl := f.Decls[i] - gen, ok := decl.(*ast.GenDecl) + gen, ok := f.Decls[i].(*ast.GenDecl) if !ok || gen.Tok != token.IMPORT { continue } for j := 0; j < len(gen.Specs); j++ { - spec := gen.Specs[j] - impspec := spec.(*ast.ImportSpec) + impspec := gen.Specs[j].(*ast.ImportSpec) if importName(impspec) != name || importPath(impspec) != path { continue } // We found an import spec that imports path. // Delete it. - delspecs = append(delspecs, impspec) + delspecs[impspec] = true deleted = true - copy(gen.Specs[j:], gen.Specs[j+1:]) - gen.Specs = gen.Specs[:len(gen.Specs)-1] + gen.Specs = slices.Delete(gen.Specs, j, j+1) // If this was the last import spec in this decl, // delete the decl, too. if len(gen.Specs) == 0 { - copy(f.Decls[i:], f.Decls[i+1:]) - f.Decls = f.Decls[:len(f.Decls)-1] + f.Decls = slices.Delete(f.Decls, i, i+1) i-- break } else if len(gen.Specs) == 1 { if impspec.Doc != nil { - delcomments = append(delcomments, impspec.Doc) + delcomments[impspec.Doc] = true } if impspec.Comment != nil { - delcomments = append(delcomments, impspec.Comment) + delcomments[impspec.Comment] = true } for _, cg := range f.Comments { // Found comment on the same line as the import spec. if cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line { - delcomments = append(delcomments, cg) + delcomments[cg] = true break } } @@ -294,38 +292,21 @@ func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (del } // Delete imports from f.Imports. - for i := 0; i < len(f.Imports); i++ { - imp := f.Imports[i] - for j, del := range delspecs { - if imp == del { - copy(f.Imports[i:], f.Imports[i+1:]) - f.Imports = f.Imports[:len(f.Imports)-1] - copy(delspecs[j:], delspecs[j+1:]) - delspecs = delspecs[:len(delspecs)-1] - i-- - break - } - } + before := len(f.Imports) + f.Imports = slices.DeleteFunc(f.Imports, func(imp *ast.ImportSpec) bool { + _, ok := delspecs[imp] + return ok + }) + if len(f.Imports)+len(delspecs) != before { + // This can happen when the AST is invalid (i.e. imports differ between f.Decls and f.Imports). + panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs)) } // Delete comments from f.Comments. - for i := 0; i < len(f.Comments); i++ { - cg := f.Comments[i] - for j, del := range delcomments { - if cg == del { - copy(f.Comments[i:], f.Comments[i+1:]) - f.Comments = f.Comments[:len(f.Comments)-1] - copy(delcomments[j:], delcomments[j+1:]) - delcomments = delcomments[:len(delcomments)-1] - i-- - break - } - } - } - - if len(delspecs) > 0 { - panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs)) - } + f.Comments = slices.DeleteFunc(f.Comments, func(cg *ast.CommentGroup) bool { + _, ok := delcomments[cg] + return ok + }) return } diff --git a/vendor/golang.org/x/tools/go/ast/inspector/cursor.go b/vendor/golang.org/x/tools/go/ast/inspector/cursor.go index 31c8d2f240..7e72d3c284 100644 --- a/vendor/golang.org/x/tools/go/ast/inspector/cursor.go +++ b/vendor/golang.org/x/tools/go/ast/inspector/cursor.go @@ -40,7 +40,7 @@ type Cursor struct { // Root returns a cursor for the virtual root node, // whose children are the files provided to [New]. // -// Its [Cursor.Node] and [Cursor.Stack] methods return nil. +// Its [Cursor.Node] method return nil. func (in *Inspector) Root() Cursor { return Cursor{in, -1} } diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 89f89dd2dc..680a70ca8f 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -364,12 +364,6 @@ type jsonPackage struct { DepsErrors []*packagesinternal.PackageError } -type jsonPackageError struct { - ImportStack []string - Pos string - Err string -} - func otherFiles(p *jsonPackage) [][]string { return [][]string{p.CFiles, p.CXXFiles, p.MFiles, p.HFiles, p.FFiles, p.SFiles, p.SwigFiles, p.SwigCXXFiles, p.SysoFiles} } diff --git a/vendor/golang.org/x/tools/go/packages/visit.go b/vendor/golang.org/x/tools/go/packages/visit.go index df14ffd94d..af6a60d75f 100644 --- a/vendor/golang.org/x/tools/go/packages/visit.go +++ b/vendor/golang.org/x/tools/go/packages/visit.go @@ -5,9 +5,11 @@ package packages import ( + "cmp" "fmt" + "iter" "os" - "sort" + "slices" ) // Visit visits all the packages in the import graph whose roots are @@ -16,6 +18,20 @@ import ( // package's dependencies have been visited (postorder). // The boolean result of pre(pkg) determines whether // the imports of package pkg are visited. +// +// Example: +// +// pkgs, err := Load(...) +// if err != nil { ... } +// Visit(pkgs, nil, func(pkg *Package) { +// log.Println(pkg) +// }) +// +// In most cases, it is more convenient to use [Postorder]: +// +// for pkg := range Postorder(pkgs) { +// log.Println(pkg) +// } func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) { seen := make(map[*Package]bool) var visit func(*Package) @@ -24,13 +40,8 @@ func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) { seen[pkg] = true if pre == nil || pre(pkg) { - paths := make([]string, 0, len(pkg.Imports)) - for path := range pkg.Imports { - paths = append(paths, path) - } - sort.Strings(paths) // Imports is a map, this makes visit stable - for _, path := range paths { - visit(pkg.Imports[path]) + for _, imp := range sorted(pkg.Imports) { // for determinism + visit(imp) } } @@ -50,7 +61,7 @@ func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) { func PrintErrors(pkgs []*Package) int { var n int errModules := make(map[*Module]bool) - Visit(pkgs, nil, func(pkg *Package) { + for pkg := range Postorder(pkgs) { for _, err := range pkg.Errors { fmt.Fprintln(os.Stderr, err) n++ @@ -63,6 +74,60 @@ func PrintErrors(pkgs []*Package) int { fmt.Fprintln(os.Stderr, mod.Error.Err) n++ } - }) + } return n } + +// Postorder returns an iterator over the the packages in +// the import graph whose roots are pkg. +// Packages are enumerated in dependencies-first order. +func Postorder(pkgs []*Package) iter.Seq[*Package] { + return func(yield func(*Package) bool) { + seen := make(map[*Package]bool) + var visit func(*Package) bool + visit = func(pkg *Package) bool { + if !seen[pkg] { + seen[pkg] = true + for _, imp := range sorted(pkg.Imports) { // for determinism + if !visit(imp) { + return false + } + } + if !yield(pkg) { + return false + } + } + return true + } + for _, pkg := range pkgs { + if !visit(pkg) { + break + } + } + } +} + +// -- copied from golang.org.x/tools/gopls/internal/util/moremaps -- + +// sorted returns an iterator over the entries of m in key order. +func sorted[M ~map[K]V, K cmp.Ordered, V any](m M) iter.Seq2[K, V] { + // TODO(adonovan): use maps.Sorted if proposal #68598 is accepted. + return func(yield func(K, V) bool) { + keys := keySlice(m) + slices.Sort(keys) + for _, k := range keys { + if !yield(k, m[k]) { + break + } + } + } +} + +// KeySlice returns the keys of the map M, like slices.Collect(maps.Keys(m)). +func keySlice[M ~map[K]V, K comparable, V any](m M) []K { + r := make([]K, 0, len(m)) + for k := range m { + r = append(r, k) + } + return r +} diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go index d3c2913bef..6c0c74968f 100644 --- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -698,7 +698,10 @@ func Object(pkg *types.Package, p Path) (types.Object, error) { } else if false && aliases.Enabled() { // The Enabled check is too expensive, so for now we // simply assume that aliases are not enabled. - // TODO(adonovan): replace with "if true {" when go1.24 is assured. + // + // Now that go1.24 is assured, we should be able to + // replace this with "if true {", but it causes tests + // to fail. TODO(adonovan): investigate. return nil, fmt.Errorf("cannot apply %q to %s (got %T, want alias)", code, t, t) } diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go index b6d542c64e..f035a0b6be 100644 --- a/vendor/golang.org/x/tools/go/types/typeutil/map.go +++ b/vendor/golang.org/x/tools/go/types/typeutil/map.go @@ -11,7 +11,6 @@ import ( "fmt" "go/types" "hash/maphash" - "unsafe" "golang.org/x/tools/internal/typeparams" ) @@ -380,22 +379,8 @@ var theSeed = maphash.MakeSeed() func (hasher) hashTypeName(tname *types.TypeName) uint32 { // Since types.Identical uses == to compare TypeNames, // the Hash function uses maphash.Comparable. - // TODO(adonovan): or will, when it becomes available in go1.24. - // In the meantime we use the pointer's numeric value. - // - // hash := maphash.Comparable(theSeed, tname) - // - // (Another approach would be to hash the name and package - // path, and whether or not it is a package-level typename. It - // is rare for a package to define multiple local types with - // the same name.) - ptr := uintptr(unsafe.Pointer(tname)) - if unsafe.Sizeof(ptr) == 8 { - hash := uint64(ptr) - return uint32(hash ^ (hash >> 32)) - } else { - return uint32(ptr) - } + hash := maphash.Comparable(theSeed, tname) + return uint32(hash ^ (hash >> 32)) } // shallowHash computes a hash of t without looking at any of its diff --git a/vendor/golang.org/x/tools/imports/forward.go b/vendor/golang.org/x/tools/imports/forward.go index cb6db8893f..22ae777726 100644 --- a/vendor/golang.org/x/tools/imports/forward.go +++ b/vendor/golang.org/x/tools/imports/forward.go @@ -69,9 +69,3 @@ func Process(filename string, src []byte, opt *Options) ([]byte, error) { } return intimp.Process(filename, src, intopt) } - -// VendorlessPath returns the devendorized version of the import path ipath. -// For example, VendorlessPath("foo/bar/vendor/a/b") returns "a/b". -func VendorlessPath(ipath string) string { - return intimp.VendorlessPath(ipath) -} diff --git a/vendor/golang.org/x/tools/internal/event/core/event.go b/vendor/golang.org/x/tools/internal/event/core/event.go index a6cf0e64a4..ade5d1e799 100644 --- a/vendor/golang.org/x/tools/internal/event/core/event.go +++ b/vendor/golang.org/x/tools/internal/event/core/event.go @@ -28,11 +28,6 @@ type Event struct { dynamic []label.Label // dynamically sized storage for remaining labels } -// eventLabelMap implements label.Map for a the labels of an Event. -type eventLabelMap struct { - event Event -} - func (ev Event) At() time.Time { return ev.at } func (ev Event) Format(f fmt.State, r rune) { diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go index 780873e3ae..4a4357d2bd 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go @@ -569,7 +569,6 @@ func (p *iexporter) exportName(obj types.Object) (res string) { type iexporter struct { fset *token.FileSet - out *bytes.Buffer version int shallow bool // don't put types from other packages in the index diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go b/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go deleted file mode 100644 index 7586bfaca6..0000000000 --- a/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2024 The Go 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.22 && !go1.24 - -package gcimporter - -import ( - "go/token" - "go/types" - "unsafe" -) - -// TODO(rfindley): delete this workaround once go1.24 is assured. - -func init() { - // Update markBlack so that it correctly sets the color - // of imported TypeNames. - // - // See the doc comment for markBlack for details. - - type color uint32 - const ( - white color = iota - black - grey - ) - type object struct { - _ *types.Scope - _ token.Pos - _ *types.Package - _ string - _ types.Type - _ uint32 - color_ color - _ token.Pos - } - type typeName struct { - object - } - - // If the size of types.TypeName changes, this will fail to compile. - const delta = int64(unsafe.Sizeof(typeName{})) - int64(unsafe.Sizeof(types.TypeName{})) - var _ [-delta * delta]int - - markBlack = func(obj *types.TypeName) { - type uP = unsafe.Pointer - var ptr *typeName - *(*uP)(uP(&ptr)) = uP(obj) - ptr.color_ = black - } -} diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go index 50b6ca51a6..1b4dc0cb5d 100644 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/vendor/golang.org/x/tools/internal/imports/fix.go @@ -16,6 +16,7 @@ import ( "go/types" "io/fs" "io/ioutil" + "maps" "os" "path" "path/filepath" @@ -27,8 +28,6 @@ import ( "unicode" "unicode/utf8" - "maps" - "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" @@ -43,7 +42,7 @@ var importToGroup = []func(localPrefix, importPath string) (num int, ok bool){ if localPrefix == "" { return } - for _, p := range strings.Split(localPrefix, ",") { + for p := range strings.SplitSeq(localPrefix, ",") { if strings.HasPrefix(importPath, p) || strings.TrimSuffix(p, "/") == importPath { return 3, true } @@ -1251,7 +1250,6 @@ func ImportPathToAssumedName(importPath string) string { // gopathResolver implements resolver for GOPATH workspaces. type gopathResolver struct { env *ProcessEnv - walked bool cache *DirInfoCache scanSema chan struct{} // scanSema prevents concurrent scans. } diff --git a/vendor/golang.org/x/tools/internal/modindex/symbols.go b/vendor/golang.org/x/tools/internal/modindex/symbols.go index fe24db9b13..8e9702d84b 100644 --- a/vendor/golang.org/x/tools/internal/modindex/symbols.go +++ b/vendor/golang.org/x/tools/internal/modindex/symbols.go @@ -206,8 +206,7 @@ func isDeprecated(doc *ast.CommentGroup) bool { // go.dev/wiki/Deprecated Paragraph starting 'Deprecated:' // This code fails for /* Deprecated: */, but it's the code from // gopls/internal/analysis/deprecated - lines := strings.Split(doc.Text(), "\n\n") - for _, line := range lines { + for line := range strings.SplitSeq(doc.Text(), "\n\n") { if strings.HasPrefix(line, "Deprecated:") { return true } diff --git a/vendor/golang.org/x/tools/internal/stdlib/deps.go b/vendor/golang.org/x/tools/internal/stdlib/deps.go index 77cf8d2181..96ad6c5821 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/deps.go +++ b/vendor/golang.org/x/tools/internal/stdlib/deps.go @@ -12,348 +12,354 @@ type pkginfo struct { } var deps = [...]pkginfo{ - {"archive/tar", "\x03j\x03E5\x01\v\x01#\x01\x01\x02\x05\n\x02\x01\x02\x02\v"}, - {"archive/zip", "\x02\x04`\a\x16\x0205\x01+\x05\x01\x11\x03\x02\r\x04"}, - {"bufio", "\x03j}F\x13"}, - {"bytes", "m+R\x03\fH\x02\x02"}, + {"archive/tar", "\x03k\x03E;\x01\n\x01$\x01\x01\x02\x05\b\x02\x01\x02\x02\f"}, + {"archive/zip", "\x02\x04a\a\x03\x12\x021;\x01+\x05\x01\x0f\x03\x02\x0e\x04"}, + {"bufio", "\x03k\x83\x01D\x14"}, + {"bytes", "n*Y\x03\fG\x02\x02"}, {"cmp", ""}, - {"compress/bzip2", "\x02\x02\xe6\x01C"}, - {"compress/flate", "\x02k\x03z\r\x025\x01\x03"}, - {"compress/gzip", "\x02\x04`\a\x03\x15eU"}, - {"compress/lzw", "\x02k\x03z"}, - {"compress/zlib", "\x02\x04`\a\x03\x13\x01f"}, - {"container/heap", "\xae\x02"}, + {"compress/bzip2", "\x02\x02\xed\x01A"}, + {"compress/flate", "\x02l\x03\x80\x01\f\x033\x01\x03"}, + {"compress/gzip", "\x02\x04a\a\x03\x14lT"}, + {"compress/lzw", "\x02l\x03\x80\x01"}, + {"compress/zlib", "\x02\x04a\a\x03\x12\x01m"}, + {"container/heap", "\xb3\x02"}, {"container/list", ""}, {"container/ring", ""}, - {"context", "m\\i\x01\f"}, - {"crypto", "\x83\x01gE"}, - {"crypto/aes", "\x10\n\a\x8e\x02"}, - {"crypto/cipher", "\x03\x1e\x01\x01\x1d\x11\x1c,Q"}, - {"crypto/des", "\x10\x13\x1d-,\x96\x01\x03"}, - {"crypto/dsa", "@\x04)}\x0e"}, - {"crypto/ecdh", "\x03\v\f\x0e\x04\x14\x04\r\x1c}"}, - {"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x0e\x16\x01\x04\f\x01\x1c}\x0e\x04L\x01"}, - {"crypto/ed25519", "\x0e\x1c\x16\n\a\x1c}E"}, - {"crypto/elliptic", "0=}\x0e:"}, - {"crypto/fips140", " \x05\x90\x01"}, - {"crypto/hkdf", "-\x12\x01-\x16"}, - {"crypto/hmac", "\x1a\x14\x11\x01\x112"}, + {"context", "n\\m\x01\r"}, + {"crypto", "\x83\x01nC"}, + {"crypto/aes", "\x10\n\a\x93\x02"}, + {"crypto/cipher", "\x03\x1e\x01\x01\x1e\x11\x1c+X"}, + {"crypto/des", "\x10\x13\x1e-+\x9b\x01\x03"}, + {"crypto/dsa", "A\x04)\x83\x01\r"}, + {"crypto/ecdh", "\x03\v\f\x0e\x04\x15\x04\r\x1c\x83\x01"}, + {"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x0e\a\v\x05\x01\x04\f\x01\x1c\x83\x01\r\x05K\x01"}, + {"crypto/ed25519", "\x0e\x1c\x11\x06\n\a\x1c\x83\x01C"}, + {"crypto/elliptic", "0>\x83\x01\r9"}, + {"crypto/fips140", " \x05"}, + {"crypto/hkdf", "-\x13\x01-\x15"}, + {"crypto/hmac", "\x1a\x14\x12\x01\x111"}, {"crypto/internal/boring", "\x0e\x02\rf"}, - {"crypto/internal/boring/bbig", "\x1a\xde\x01M"}, - {"crypto/internal/boring/bcache", "\xb3\x02\x12"}, + {"crypto/internal/boring/bbig", "\x1a\xe4\x01M"}, + {"crypto/internal/boring/bcache", "\xb8\x02\x13"}, {"crypto/internal/boring/sig", ""}, - {"crypto/internal/cryptotest", "\x03\r\n)\x0e\x19\x06\x13\x12#\a\t\x11\x11\x11\x1b\x01\f\r\x05\n"}, - {"crypto/internal/entropy", "E"}, - {"crypto/internal/fips140", ">/}9\r\x15"}, - {"crypto/internal/fips140/aes", "\x03\x1d\x03\x02\x13\x04\x01\x01\x05*\x8c\x016"}, - {"crypto/internal/fips140/aes/gcm", " \x01\x02\x02\x02\x11\x04\x01\x06*\x8a\x01"}, - {"crypto/internal/fips140/alias", "\xc5\x02"}, - {"crypto/internal/fips140/bigmod", "%\x17\x01\x06*\x8c\x01"}, - {"crypto/internal/fips140/check", " \x0e\x06\b\x02\xac\x01["}, - {"crypto/internal/fips140/check/checktest", "%\xfe\x01\""}, - {"crypto/internal/fips140/drbg", "\x03\x1c\x01\x01\x04\x13\x04\b\x01(}\x0f9"}, - {"crypto/internal/fips140/ecdh", "\x03\x1d\x05\x02\t\f1}\x0f9"}, - {"crypto/internal/fips140/ecdsa", "\x03\x1d\x04\x01\x02\a\x02\x067}H"}, - {"crypto/internal/fips140/ed25519", "\x03\x1d\x05\x02\x04\v7\xc2\x01\x03"}, - {"crypto/internal/fips140/edwards25519", "%\a\f\x041\x8c\x019"}, - {"crypto/internal/fips140/edwards25519/field", "%\x13\x041\x8c\x01"}, - {"crypto/internal/fips140/hkdf", "\x03\x1d\x05\t\x069"}, - {"crypto/internal/fips140/hmac", "\x03\x1d\x14\x01\x017"}, - {"crypto/internal/fips140/mlkem", "\x03\x1d\x05\x02\x0e\x03\x041"}, - {"crypto/internal/fips140/nistec", "%\f\a\x041\x8c\x01*\x0f\x13"}, - {"crypto/internal/fips140/nistec/fiat", "%\x135\x8c\x01"}, - {"crypto/internal/fips140/pbkdf2", "\x03\x1d\x05\t\x069"}, - {"crypto/internal/fips140/rsa", "\x03\x1d\x04\x01\x02\r\x01\x01\x025}H"}, - {"crypto/internal/fips140/sha256", "\x03\x1d\x1c\x01\x06*\x8c\x01"}, - {"crypto/internal/fips140/sha3", "\x03\x1d\x18\x04\x010\x8c\x01L"}, - {"crypto/internal/fips140/sha512", "\x03\x1d\x1c\x01\x06*\x8c\x01"}, - {"crypto/internal/fips140/ssh", " \x05"}, - {"crypto/internal/fips140/subtle", "#"}, - {"crypto/internal/fips140/tls12", "\x03\x1d\x05\t\x06\x027"}, - {"crypto/internal/fips140/tls13", "\x03\x1d\x05\b\a\b1"}, + {"crypto/internal/cryptotest", "\x03\r\n\x06$\x0e\x19\x06\x12\x12 \x04\a\t\x16\x01\x11\x11\x1b\x01\a\x05\b\x03\x05\v"}, + {"crypto/internal/entropy", "F"}, + {"crypto/internal/fips140", "?/\x15\xa7\x01\v\x16"}, + {"crypto/internal/fips140/aes", "\x03\x1d\x03\x02\x13\x05\x01\x01\x05*\x92\x014"}, + {"crypto/internal/fips140/aes/gcm", " \x01\x02\x02\x02\x11\x05\x01\x06*\x8f\x01"}, + {"crypto/internal/fips140/alias", "\xcb\x02"}, + {"crypto/internal/fips140/bigmod", "%\x18\x01\x06*\x92\x01"}, + {"crypto/internal/fips140/check", " \x0e\x06\t\x02\xb2\x01Z"}, + {"crypto/internal/fips140/check/checktest", "%\x85\x02!"}, + {"crypto/internal/fips140/drbg", "\x03\x1c\x01\x01\x04\x13\x05\b\x01(\x83\x01\x0f7"}, + {"crypto/internal/fips140/ecdh", "\x03\x1d\x05\x02\t\r1\x83\x01\x0f7"}, + {"crypto/internal/fips140/ecdsa", "\x03\x1d\x04\x01\x02\a\x02\x068\x15nF"}, + {"crypto/internal/fips140/ed25519", "\x03\x1d\x05\x02\x04\v8\xc6\x01\x03"}, + {"crypto/internal/fips140/edwards25519", "%\a\f\x051\x92\x017"}, + {"crypto/internal/fips140/edwards25519/field", "%\x13\x051\x92\x01"}, + {"crypto/internal/fips140/hkdf", "\x03\x1d\x05\t\x06:\x15"}, + {"crypto/internal/fips140/hmac", "\x03\x1d\x14\x01\x018\x15"}, + {"crypto/internal/fips140/mlkem", "\x03\x1d\x05\x02\x0e\x03\x051"}, + {"crypto/internal/fips140/nistec", "%\f\a\x051\x92\x01*\r\x14"}, + {"crypto/internal/fips140/nistec/fiat", "%\x136\x92\x01"}, + {"crypto/internal/fips140/pbkdf2", "\x03\x1d\x05\t\x06:\x15"}, + {"crypto/internal/fips140/rsa", "\x03\x1d\x04\x01\x02\r\x01\x01\x026\x15nF"}, + {"crypto/internal/fips140/sha256", "\x03\x1d\x1d\x01\x06*\x15}"}, + {"crypto/internal/fips140/sha3", "\x03\x1d\x18\x05\x010\x92\x01K"}, + {"crypto/internal/fips140/sha512", "\x03\x1d\x1d\x01\x06*\x15}"}, + {"crypto/internal/fips140/ssh", "%^"}, + {"crypto/internal/fips140/subtle", "#\x1a\xc3\x01"}, + {"crypto/internal/fips140/tls12", "\x03\x1d\x05\t\x06\x028\x15"}, + {"crypto/internal/fips140/tls13", "\x03\x1d\x05\b\a\t1\x15"}, + {"crypto/internal/fips140cache", "\xaa\x02\r&"}, {"crypto/internal/fips140deps", ""}, {"crypto/internal/fips140deps/byteorder", "\x99\x01"}, - {"crypto/internal/fips140deps/cpu", "\xad\x01\a"}, - {"crypto/internal/fips140deps/godebug", "\xb5\x01"}, - {"crypto/internal/fips140hash", "5\x1a4\xc2\x01"}, - {"crypto/internal/fips140only", "'\r\x01\x01M25"}, + {"crypto/internal/fips140deps/cpu", "\xae\x01\a"}, + {"crypto/internal/fips140deps/godebug", "\xb6\x01"}, + {"crypto/internal/fips140hash", "5\x1b3\xc8\x01"}, + {"crypto/internal/fips140only", "'\r\x01\x01M3;"}, {"crypto/internal/fips140test", ""}, - {"crypto/internal/hpke", "\x0e\x01\x01\x03\x1a\x1d#,`N"}, - {"crypto/internal/impl", "\xb0\x02"}, - {"crypto/internal/randutil", "\xea\x01\x12"}, - {"crypto/internal/sysrand", "mi!\x1f\r\x0f\x01\x01\v\x06"}, - {"crypto/internal/sysrand/internal/seccomp", "m"}, - {"crypto/md5", "\x0e2-\x16\x16`"}, + {"crypto/internal/hpke", "\x0e\x01\x01\x03\x053#+gM"}, + {"crypto/internal/impl", "\xb5\x02"}, + {"crypto/internal/randutil", "\xf1\x01\x12"}, + {"crypto/internal/sysrand", "nn! \r\r\x01\x01\f\x06"}, + {"crypto/internal/sysrand/internal/seccomp", "n"}, + {"crypto/md5", "\x0e3-\x15\x16g"}, {"crypto/mlkem", "/"}, - {"crypto/pbkdf2", "2\r\x01-\x16"}, - {"crypto/rand", "\x1a\x06\a\x19\x04\x01(}\x0eM"}, - {"crypto/rc4", "#\x1d-\xc2\x01"}, - {"crypto/rsa", "\x0e\f\x01\t\x0f\f\x01\x04\x06\a\x1c\x03\x1325\r\x01"}, - {"crypto/sha1", "\x0e\f&-\x16\x16\x14L"}, + {"crypto/pbkdf2", "2\x0e\x01-\x15"}, + {"crypto/rand", "\x1a\x06\a\x1a\x04\x01(\x83\x01\rM"}, + {"crypto/rc4", "#\x1e-\xc6\x01"}, + {"crypto/rsa", "\x0e\f\x01\t\x0f\r\x01\x04\x06\a\x1c\x03\x123;\f\x01"}, + {"crypto/sha1", "\x0e\f'\x03*\x15\x16\x15R"}, {"crypto/sha256", "\x0e\f\x1aO"}, - {"crypto/sha3", "\x0e'N\xc2\x01"}, + {"crypto/sha3", "\x0e'N\xc8\x01"}, {"crypto/sha512", "\x0e\f\x1cM"}, - {"crypto/subtle", "8\x96\x01U"}, - {"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x03\x01\a\x01\v\x02\n\x01\b\x05\x03\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x13\x16\x14\b5\x16\x16\r\n\x01\x01\x01\x02\x01\f\x06\x02\x01"}, - {"crypto/tls/internal/fips140tls", " \x93\x02"}, - {"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x011\x03\x02\x01\x01\x02\x05\x0e\x06\x02\x02\x03E\x032\x01\x02\t\x01\x01\x01\a\x10\x05\x01\x06\x02\x05\f\x01\x02\r\x02\x01\x01\x02\x03\x01"}, - {"crypto/x509/pkix", "c\x06\a\x88\x01G"}, - {"database/sql", "\x03\nJ\x16\x03z\f\x06\"\x05\n\x02\x03\x01\f\x02\x02\x02"}, - {"database/sql/driver", "\r`\x03\xae\x01\x11\x10"}, - {"debug/buildinfo", "\x03W\x02\x01\x01\b\a\x03`\x18\x02\x01+\x0f "}, - {"debug/dwarf", "\x03c\a\x03z1\x13\x01\x01"}, - {"debug/elf", "\x03\x06P\r\a\x03`\x19\x01,\x19\x01\x15"}, - {"debug/gosym", "\x03c\n\xbe\x01\x01\x01\x02"}, - {"debug/macho", "\x03\x06P\r\n`\x1a,\x19\x01"}, - {"debug/pe", "\x03\x06P\r\a\x03`\x1a,\x19\x01\x15"}, - {"debug/plan9obj", "f\a\x03`\x1a,"}, - {"embed", "m+:\x18\x01T"}, + {"crypto/subtle", "8\x9b\x01W"}, + {"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x02\x01\x01\a\x01\r\n\x01\t\x05\x03\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x12\x16\x15\b;\x16\x16\r\b\x01\x01\x01\x02\x01\r\x06\x02\x01\x0f"}, + {"crypto/tls/internal/fips140tls", "\x17\xa1\x02"}, + {"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x012\x05\x01\x01\x02\x05\x0e\x06\x02\x02\x03E\x038\x01\x02\b\x01\x01\x02\a\x10\x05\x01\x06\x02\x05\n\x01\x02\x0e\x02\x01\x01\x02\x03\x01"}, + {"crypto/x509/pkix", "d\x06\a\x8d\x01G"}, + {"database/sql", "\x03\nK\x16\x03\x80\x01\v\a\"\x05\b\x02\x03\x01\r\x02\x02\x02"}, + {"database/sql/driver", "\ra\x03\xb4\x01\x0f\x11"}, + {"debug/buildinfo", "\x03X\x02\x01\x01\b\a\x03e\x19\x02\x01+\x0f\x1f"}, + {"debug/dwarf", "\x03d\a\x03\x80\x011\x11\x01\x01"}, + {"debug/elf", "\x03\x06Q\r\a\x03e\x1a\x01,\x17\x01\x16"}, + {"debug/gosym", "\x03d\n\xc2\x01\x01\x01\x02"}, + {"debug/macho", "\x03\x06Q\r\ne\x1b,\x17\x01"}, + {"debug/pe", "\x03\x06Q\r\a\x03e\x1b,\x17\x01\x16"}, + {"debug/plan9obj", "g\a\x03e\x1b,"}, + {"embed", "n*@\x19\x01S"}, {"embed/internal/embedtest", ""}, {"encoding", ""}, - {"encoding/ascii85", "\xea\x01E"}, - {"encoding/asn1", "\x03j\x03\x87\x01\x01&\x0f\x02\x01\x0f\x03\x01"}, - {"encoding/base32", "\xea\x01C\x02"}, - {"encoding/base64", "\x99\x01QC\x02"}, - {"encoding/binary", "m}\r'\x0f\x05"}, - {"encoding/csv", "\x02\x01j\x03zF\x11\x02"}, - {"encoding/gob", "\x02_\x05\a\x03`\x1a\f\x01\x02\x1d\b\x14\x01\x0e\x02"}, - {"encoding/hex", "m\x03zC\x03"}, - {"encoding/json", "\x03\x01]\x04\b\x03z\r'\x0f\x02\x01\x02\x0f\x01\x01\x02"}, - {"encoding/pem", "\x03b\b}C\x03"}, - {"encoding/xml", "\x02\x01^\f\x03z4\x05\f\x01\x02\x0f\x02"}, - {"errors", "\xc9\x01|"}, - {"expvar", "jK9\t\n\x15\r\n\x02\x03\x01\x10"}, - {"flag", "a\f\x03z,\b\x05\n\x02\x01\x0f"}, - {"fmt", "mE8\r\x1f\b\x0f\x02\x03\x11"}, - {"go/ast", "\x03\x01l\x0f\x01j\x03)\b\x0f\x02\x01"}, - {"go/ast/internal/tests", ""}, - {"go/build", "\x02\x01j\x03\x01\x03\x02\a\x02\x01\x17\x1e\x04\x02\t\x14\x12\x01+\x01\x04\x01\a\n\x02\x01\x11\x02\x02"}, - {"go/build/constraint", "m\xc2\x01\x01\x11\x02"}, - {"go/constant", "p\x10w\x01\x016\x01\x02\x11"}, - {"go/doc", "\x04l\x01\x06\t=-1\x12\x02\x01\x11\x02"}, - {"go/doc/comment", "\x03m\xbd\x01\x01\x01\x01\x11\x02"}, - {"go/format", "\x03m\x01\f\x01\x02jF"}, - {"go/importer", "s\a\x01\x01\x04\x01i9"}, - {"go/internal/gccgoimporter", "\x02\x01W\x13\x03\x05\v\x01g\x02,\x01\x05\x13\x01\v\b"}, - {"go/internal/gcimporter", "\x02n\x10\x01/\x05\x0e',\x17\x03\x02"}, - {"go/internal/srcimporter", "p\x01\x02\n\x03\x01i,\x01\x05\x14\x02\x13"}, - {"go/parser", "\x03j\x03\x01\x03\v\x01j\x01+\x06\x14"}, - {"go/printer", "p\x01\x03\x03\tj\r\x1f\x17\x02\x01\x02\n\x05\x02"}, - {"go/scanner", "\x03m\x10j2\x12\x01\x12\x02"}, - {"go/token", "\x04l\xbd\x01\x02\x03\x01\x0e\x02"}, - {"go/types", "\x03\x01\x06c\x03\x01\x04\b\x03\x02\x15\x1e\x06+\x04\x03\n%\a\n\x01\x01\x01\x02\x01\x0e\x02\x02"}, - {"go/version", "\xba\x01v"}, - {"hash", "\xea\x01"}, - {"hash/adler32", "m\x16\x16"}, - {"hash/crc32", "m\x16\x16\x14\x85\x01\x01\x12"}, - {"hash/crc64", "m\x16\x16\x99\x01"}, - {"hash/fnv", "m\x16\x16`"}, - {"hash/maphash", "\x94\x01\x05\x1b\x03@N"}, - {"html", "\xb0\x02\x02\x11"}, - {"html/template", "\x03g\x06\x19,5\x01\v \x05\x01\x02\x03\x0e\x01\x02\v\x01\x03\x02"}, - {"image", "\x02k\x1f^\x0f6\x03\x01"}, + {"encoding/ascii85", "\xf1\x01C"}, + {"encoding/asn1", "\x03k\x03\x8c\x01\x01'\r\x02\x01\x10\x03\x01"}, + {"encoding/base32", "\xf1\x01A\x02"}, + {"encoding/base64", "\x99\x01XA\x02"}, + {"encoding/binary", "n\x83\x01\f(\r\x05"}, + {"encoding/csv", "\x02\x01k\x03\x80\x01D\x12\x02"}, + {"encoding/gob", "\x02`\x05\a\x03e\x1b\v\x01\x03\x1d\b\x12\x01\x0f\x02"}, + {"encoding/hex", "n\x03\x80\x01A\x03"}, + {"encoding/json", "\x03\x01^\x04\b\x03\x80\x01\f(\r\x02\x01\x02\x10\x01\x01\x02"}, + {"encoding/pem", "\x03c\b\x83\x01A\x03"}, + {"encoding/xml", "\x02\x01_\f\x03\x80\x014\x05\n\x01\x02\x10\x02"}, + {"errors", "\xca\x01\x81\x01"}, + {"expvar", "kK?\b\v\x15\r\b\x02\x03\x01\x11"}, + {"flag", "b\f\x03\x80\x01,\b\x05\b\x02\x01\x10"}, + {"fmt", "nE>\f \b\r\x02\x03\x12"}, + {"go/ast", "\x03\x01m\x0e\x01q\x03)\b\r\x02\x01"}, + {"go/build", "\x02\x01k\x03\x01\x02\x02\a\x02\x01\x17\x1f\x04\x02\t\x19\x13\x01+\x01\x04\x01\a\b\x02\x01\x12\x02\x02"}, + {"go/build/constraint", "n\xc6\x01\x01\x12\x02"}, + {"go/constant", "q\x0f}\x01\x024\x01\x02\x12"}, + {"go/doc", "\x04m\x01\x05\t>31\x10\x02\x01\x12\x02"}, + {"go/doc/comment", "\x03n\xc1\x01\x01\x01\x01\x12\x02"}, + {"go/format", "\x03n\x01\v\x01\x02qD"}, + {"go/importer", "s\a\x01\x01\x04\x01p9"}, + {"go/internal/gccgoimporter", "\x02\x01X\x13\x03\x04\v\x01n\x02,\x01\x05\x11\x01\f\b"}, + {"go/internal/gcimporter", "\x02o\x0f\x010\x05\x0e-,\x15\x03\x02"}, + {"go/internal/srcimporter", "q\x01\x01\n\x03\x01p,\x01\x05\x12\x02\x14"}, + {"go/parser", "\x03k\x03\x01\x02\v\x01q\x01+\x06\x12"}, + {"go/printer", "q\x01\x02\x03\tq\f \x15\x02\x01\x02\v\x05\x02"}, + {"go/scanner", "\x03n\x0fq2\x10\x01\x13\x02"}, + {"go/token", "\x04m\x83\x01>\x02\x03\x01\x0f\x02"}, + {"go/types", "\x03\x01\x06d\x03\x01\x03\b\x03\x02\x15\x1f\x061\x04\x03\t \x06\a\b\x01\x01\x01\x02\x01\x0f\x02\x02"}, + {"go/version", "\xbb\x01z"}, + {"hash", "\xf1\x01"}, + {"hash/adler32", "n\x15\x16"}, + {"hash/crc32", "n\x15\x16\x15\x89\x01\x01\x13"}, + {"hash/crc64", "n\x15\x16\x9e\x01"}, + {"hash/fnv", "n\x15\x16g"}, + {"hash/maphash", "\x83\x01\x11!\x03\x93\x01"}, + {"html", "\xb5\x02\x02\x12"}, + {"html/template", "\x03h\x06\x18-;\x01\n!\x05\x01\x02\x03\f\x01\x02\f\x01\x03\x02"}, + {"image", "\x02l\x1ee\x0f4\x03\x01"}, {"image/color", ""}, {"image/color/palette", "\x8c\x01"}, {"image/draw", "\x8b\x01\x01\x04"}, - {"image/gif", "\x02\x01\x05e\x03\x1b\x01\x01\x01\vQ"}, + {"image/gif", "\x02\x01\x05f\x03\x1a\x01\x01\x01\vX"}, {"image/internal/imageutil", "\x8b\x01"}, - {"image/jpeg", "\x02k\x1e\x01\x04Z"}, - {"image/png", "\x02\a]\n\x13\x02\x06\x01^E"}, - {"index/suffixarray", "\x03c\a}\r*\f\x01"}, - {"internal/abi", "\xb4\x01\x91\x01"}, - {"internal/asan", "\xc5\x02"}, - {"internal/bisect", "\xa3\x02\x0f\x01"}, - {"internal/buildcfg", "pG_\x06\x02\x05\f\x01"}, - {"internal/bytealg", "\xad\x01\x98\x01"}, + {"image/jpeg", "\x02l\x1d\x01\x04a"}, + {"image/png", "\x02\a^\n\x12\x02\x06\x01eC"}, + {"index/suffixarray", "\x03d\a\x83\x01\f+\n\x01"}, + {"internal/abi", "\xb5\x01\x96\x01"}, + {"internal/asan", "\xcb\x02"}, + {"internal/bisect", "\xaa\x02\r\x01"}, + {"internal/buildcfg", "qGe\x06\x02\x05\n\x01"}, + {"internal/bytealg", "\xae\x01\x9d\x01"}, {"internal/byteorder", ""}, {"internal/cfg", ""}, - {"internal/chacha8rand", "\x99\x01\x1b\x91\x01"}, + {"internal/cgrouptest", "q[Q\x06\x0f\x02\x01\x04\x01"}, + {"internal/chacha8rand", "\x99\x01\x15\a\x96\x01"}, {"internal/copyright", ""}, {"internal/coverage", ""}, {"internal/coverage/calloc", ""}, - {"internal/coverage/cfile", "j\x06\x17\x16\x01\x02\x01\x01\x01\x01\x01\x01\x01#\x01\x1f,\x06\a\f\x01\x03\f\x06"}, - {"internal/coverage/cformat", "\x04l-\x04I\f7\x01\x02\f"}, - {"internal/coverage/cmerge", "p-Z"}, - {"internal/coverage/decodecounter", "f\n-\v\x02@,\x19\x16"}, - {"internal/coverage/decodemeta", "\x02d\n\x17\x16\v\x02@,"}, - {"internal/coverage/encodecounter", "\x02d\n-\f\x01\x02>\f \x17"}, - {"internal/coverage/encodemeta", "\x02\x01c\n\x13\x04\x16\r\x02>,/"}, - {"internal/coverage/pods", "\x04l-y\x06\x05\f\x02\x01"}, - {"internal/coverage/rtcov", "\xc5\x02"}, - {"internal/coverage/slicereader", "f\nz["}, - {"internal/coverage/slicewriter", "pz"}, - {"internal/coverage/stringtab", "p8\x04>"}, + {"internal/coverage/cfile", "k\x06\x16\x17\x01\x02\x01\x01\x01\x01\x01\x01\x01#\x02$,\x06\a\n\x01\x03\r\x06"}, + {"internal/coverage/cformat", "\x04m-\x04O\v6\x01\x02\r"}, + {"internal/coverage/cmerge", "q-_"}, + {"internal/coverage/decodecounter", "g\n-\v\x02F,\x17\x17"}, + {"internal/coverage/decodemeta", "\x02e\n\x16\x17\v\x02F,"}, + {"internal/coverage/encodecounter", "\x02e\n-\f\x01\x02D\v!\x15"}, + {"internal/coverage/encodemeta", "\x02\x01d\n\x12\x04\x17\r\x02D,."}, + {"internal/coverage/pods", "\x04m-\x7f\x06\x05\n\x02\x01"}, + {"internal/coverage/rtcov", "\xcb\x02"}, + {"internal/coverage/slicereader", "g\n\x80\x01Z"}, + {"internal/coverage/slicewriter", "q\x80\x01"}, + {"internal/coverage/stringtab", "q8\x04D"}, {"internal/coverage/test", ""}, {"internal/coverage/uleb128", ""}, - {"internal/cpu", "\xc5\x02"}, - {"internal/dag", "\x04l\xbd\x01\x03"}, - {"internal/diff", "\x03m\xbe\x01\x02"}, - {"internal/exportdata", "\x02\x01j\x03\x03]\x1a,\x01\x05\x13\x01\x02"}, - {"internal/filepathlite", "m+:\x19B"}, - {"internal/fmtsort", "\x04\x9a\x02\x0f"}, - {"internal/fuzz", "\x03\nA\x18\x04\x03\x03\x01\f\x0355\r\x02\x1d\x01\x05\x02\x05\f\x01\x02\x01\x01\v\x04\x02"}, + {"internal/cpu", "\xcb\x02"}, + {"internal/dag", "\x04m\xc1\x01\x03"}, + {"internal/diff", "\x03n\xc2\x01\x02"}, + {"internal/exportdata", "\x02\x01k\x03\x02c\x1b,\x01\x05\x11\x01\x02"}, + {"internal/filepathlite", "n*@\x1a@"}, + {"internal/fmtsort", "\x04\xa1\x02\r"}, + {"internal/fuzz", "\x03\nB\x18\x04\x03\x03\x01\v\x036;\f\x03\x1d\x01\x05\x02\x05\n\x01\x02\x01\x01\f\x04\x02"}, {"internal/goarch", ""}, - {"internal/godebug", "\x96\x01 |\x01\x12"}, + {"internal/godebug", "\x96\x01!\x80\x01\x01\x13"}, {"internal/godebugs", ""}, {"internal/goexperiment", ""}, {"internal/goos", ""}, - {"internal/goroot", "\x96\x02\x01\x05\x14\x02"}, + {"internal/goroot", "\x9d\x02\x01\x05\x12\x02"}, {"internal/gover", "\x04"}, {"internal/goversion", ""}, {"internal/itoa", ""}, - {"internal/lazyregexp", "\x96\x02\v\x0f\x02"}, - {"internal/lazytemplate", "\xea\x01,\x1a\x02\v"}, - {"internal/msan", "\xc5\x02"}, + {"internal/lazyregexp", "\x9d\x02\v\r\x02"}, + {"internal/lazytemplate", "\xf1\x01,\x18\x02\f"}, + {"internal/msan", "\xcb\x02"}, {"internal/nettrace", ""}, - {"internal/obscuretestdata", "e\x85\x01,"}, - {"internal/oserror", "m"}, - {"internal/pkgbits", "\x03K\x18\a\x03\x05\vj\x0e\x1e\r\f\x01"}, + {"internal/obscuretestdata", "f\x8b\x01,"}, + {"internal/oserror", "n"}, + {"internal/pkgbits", "\x03L\x18\a\x03\x04\vq\r\x1f\r\n\x01"}, {"internal/platform", ""}, - {"internal/poll", "mO\x1a\x149\x0f\x01\x01\v\x06"}, - {"internal/profile", "\x03\x04f\x03z7\r\x01\x01\x0f"}, + {"internal/poll", "nO\x1f\x159\r\x01\x01\f\x06"}, + {"internal/profile", "\x03\x04g\x03\x80\x017\v\x01\x01\x10"}, {"internal/profilerecord", ""}, - {"internal/race", "\x94\x01\xb1\x01"}, - {"internal/reflectlite", "\x94\x01 3<\""}, - {"internal/runtime/atomic", "\xc5\x02"}, - {"internal/runtime/exithook", "\xca\x01{"}, - {"internal/runtime/maps", "\x94\x01\x01\x1f\v\t\x05\x01w"}, - {"internal/runtime/math", "\xb4\x01"}, - {"internal/runtime/sys", "\xb4\x01\x04"}, - {"internal/runtime/syscall", "\xc5\x02"}, - {"internal/saferio", "\xea\x01["}, - {"internal/singleflight", "\xb2\x02"}, - {"internal/stringslite", "\x98\x01\xad\x01"}, - {"internal/sync", "\x94\x01 \x14k\x12"}, - {"internal/synctest", "\xc5\x02"}, - {"internal/syscall/execenv", "\xb4\x02"}, - {"internal/syscall/unix", "\xa3\x02\x10\x01\x11"}, - {"internal/sysinfo", "\x02\x01\xaa\x01=,\x1a\x02"}, + {"internal/race", "\x94\x01\xb7\x01"}, + {"internal/reflectlite", "\x94\x01!9\b\x13\x01\a\x03E;\x01\x03\a\x01\x03\x02\x02\x01\x02\x06\x02\x01\x01\n\x01\x01\x05\x01\x02\x05\b\x01\x01\x01\x02\x01\r\x02\x02\x02\b\x01\x01\x01"}, + {"net/http/cgi", "\x02Q\x1b\x03\x80\x01\x04\a\v\x01\x13\x01\x01\x01\x04\x01\x05\x02\b\x02\x01\x10\x0e"}, + {"net/http/cookiejar", "\x04j\x03\x96\x01\x01\b\f\x16\x03\x02\x0e\x04"}, + {"net/http/fcgi", "\x02\x01\nZ\a\x03\x80\x01\x16\x01\x01\x14\x18\x02\x0e"}, + {"net/http/httptest", "\x02\x01\nF\x02\x1b\x01\x80\x01\x04\x12\x01\n\t\x02\x17\x01\x02\x0e\x0e"}, + {"net/http/httptrace", "\rFnF\x14\n "}, + {"net/http/httputil", "\x02\x01\na\x03\x80\x01\x04\x0f\x03\x01\x05\x02\x01\v\x01\x19\x02\x0e\x0e"}, + {"net/http/internal", "\x02\x01k\x03\x80\x01"}, + {"net/http/internal/ascii", "\xb5\x02\x12"}, + {"net/http/internal/httpcommon", "\ra\x03\x9c\x01\x0e\x01\x17\x01\x01\x02\x1c\x02"}, + {"net/http/internal/testcert", "\xb5\x02"}, + {"net/http/pprof", "\x02\x01\nd\x18-\x11*\x04\x13\x14\x01\r\x04\x03\x01\x02\x01\x10"}, {"net/internal/cgotest", ""}, - {"net/internal/socktest", "p\xc2\x01\x02"}, - {"net/mail", "\x02k\x03z\x04\x0f\x03\x14\x1c\x02\r\x04"}, - {"net/netip", "\x04i+\x01#;\x026\x15"}, - {"net/rpc", "\x02f\x05\x03\x10\n`\x04\x12\x01\x1d\x0f\x03\x02"}, - {"net/rpc/jsonrpc", "j\x03\x03z\x16\x11!"}, - {"net/smtp", "\x19.\v\x13\b\x03z\x16\x14\x1c"}, - {"net/textproto", "\x02\x01j\x03z\r\t/\x01\x02\x13"}, - {"net/url", "m\x03\x86\x01%\x12\x02\x01\x15"}, - {"os", "m+\x01\x18\x03\b\t\r\x03\x01\x04\x10\x018\n\x05\x01\x01\v\x06"}, - {"os/exec", "\x03\n`H \x01\x14\x01+\x06\a\f\x01\x04\v"}, - {"os/exec/internal/fdtest", "\xb4\x02"}, - {"os/signal", "\r\x89\x02\x17\x05\x02"}, - {"os/user", "\x02\x01j\x03z,\r\f\x01\x02"}, - {"path", "m+\xab\x01"}, - {"path/filepath", "m+\x19:+\r\n\x03\x04\x0f"}, - {"plugin", "m"}, - {"reflect", "m'\x04\x1c\b\f\x04\x02\x19\x10,\f\x03\x0f\x02\x02"}, + {"net/internal/socktest", "q\xc6\x01\x02"}, + {"net/mail", "\x02l\x03\x80\x01\x04\x0f\x03\x14\x1a\x02\x0e\x04"}, + {"net/netip", "\x04j*\x01$@\x034\x16"}, + {"net/rpc", "\x02g\x05\x03\x0f\ng\x04\x12\x01\x1d\r\x03\x02"}, + {"net/rpc/jsonrpc", "k\x03\x03\x80\x01\x16\x11\x1f"}, + {"net/smtp", "\x19/\v\x13\b\x03\x80\x01\x16\x14\x1a"}, + {"net/textproto", "\x02\x01k\x03\x80\x01\f\n-\x01\x02\x14"}, + {"net/url", "n\x03\x8b\x01&\x10\x02\x01\x16"}, + {"os", "n*\x01\x19\x03\b\t\x12\x03\x01\x05\x10\x018\b\x05\x01\x01\f\x06"}, + {"os/exec", "\x03\naH%\x01\x15\x01+\x06\a\n\x01\x04\f"}, + {"os/exec/internal/fdtest", "\xb9\x02"}, + {"os/signal", "\r\x90\x02\x15\x05\x02"}, + {"os/user", "\x02\x01k\x03\x80\x01,\r\n\x01\x02"}, + {"path", "n*\xb1\x01"}, + {"path/filepath", "n*\x1a@+\r\b\x03\x04\x10"}, + {"plugin", "n"}, + {"reflect", "n&\x04\x1d\b\f\x06\x04\x1b\x06\t-\n\x03\x10\x02\x02"}, {"reflect/internal/example1", ""}, {"reflect/internal/example2", ""}, - {"regexp", "\x03\xe7\x018\v\x02\x01\x02\x0f\x02"}, - {"regexp/syntax", "\xad\x02\x01\x01\x01\x11\x02"}, - {"runtime", "\x94\x01\x04\x01\x02\f\x06\a\x02\x01\x01\x0f\x03\x01\x01\x01\x01\x01\x03\x0fd"}, - {"runtime/coverage", "\x9f\x01K"}, - {"runtime/debug", "pUQ\r\n\x02\x01\x0f\x06"}, - {"runtime/internal/startlinetest", ""}, - {"runtime/internal/wasitest", ""}, - {"runtime/metrics", "\xb6\x01A,\""}, - {"runtime/pprof", "\x02\x01\x01\x03\x06Y\a\x03$3#\r\x1f\r\n\x01\x01\x01\x02\x02\b\x03\x06"}, - {"runtime/race", "\xab\x02"}, + {"regexp", "\x03\xee\x018\t\x02\x01\x02\x10\x02"}, + {"regexp/syntax", "\xb2\x02\x01\x01\x01\x02\x10\x02"}, + {"runtime", "\x94\x01\x04\x01\x03\f\x06\a\x02\x01\x01\x0f\x03\x01\x01\x01\x01\x01\x02\x01\x01\x04\x10c"}, + {"runtime/coverage", "\xa0\x01Q"}, + {"runtime/debug", "qUW\r\b\x02\x01\x10\x06"}, + {"runtime/metrics", "\xb7\x01F-!"}, + {"runtime/pprof", "\x02\x01\x01\x03\x06Z\a\x03#4)\f \r\b\x01\x01\x01\x02\x02\t\x03\x06"}, + {"runtime/race", "\xb0\x02"}, {"runtime/race/internal/amd64v1", ""}, - {"runtime/trace", "\rcz9\x0f\x01\x12"}, - {"slices", "\x04\xe9\x01\fL"}, - {"sort", "\xc9\x0104"}, - {"strconv", "m+:%\x02J"}, - {"strings", "m'\x04:\x18\x03\f9\x0f\x02\x02"}, + {"runtime/trace", "\ra\x03w\t9\b\x05\x01\r\x06"}, + {"slices", "\x04\xf0\x01\fK"}, + {"sort", "\xca\x0162"}, + {"strconv", "n*@%\x03I"}, + {"strings", "n&\x04@\x19\x03\f7\x10\x02\x02"}, {"structs", ""}, - {"sync", "\xc8\x01\vP\x10\x12"}, - {"sync/atomic", "\xc5\x02"}, - {"syscall", "m(\x03\x01\x1b\b\x03\x03\x06\aT\n\x05\x01\x12"}, - {"testing", "\x03\n`\x02\x01X\x0f\x13\r\x04\x1b\x06\x02\x05\x02\a\x01\x02\x01\x02\x01\f\x02\x02\x02"}, - {"testing/fstest", "m\x03z\x01\v%\x12\x03\b\a"}, - {"testing/internal/testdeps", "\x02\v\xa6\x01'\x10,\x03\x05\x03\b\a\x02\r"}, - {"testing/iotest", "\x03j\x03z\x04"}, - {"testing/quick", "o\x01\x87\x01\x04#\x12\x0f"}, - {"testing/slogtest", "\r`\x03\x80\x01.\x05\x12\n"}, - {"text/scanner", "\x03mz,+\x02"}, - {"text/tabwriter", "pzY"}, - {"text/template", "m\x03B8\x01\v\x1f\x01\x05\x01\x02\x05\r\x02\f\x03\x02"}, - {"text/template/parse", "\x03m\xb3\x01\f\x01\x11\x02"}, - {"time", "m+\x1d\x1d'*\x0f\x02\x11"}, - {"time/tzdata", "m\xc7\x01\x11"}, + {"sync", "\xc9\x01\x10\x01P\x0e\x13"}, + {"sync/atomic", "\xcb\x02"}, + {"syscall", "n'\x03\x01\x1c\b\x03\x03\x06\vV\b\x05\x01\x13"}, + {"testing", "\x03\na\x02\x01X\x14\x14\f\x05\x1b\x06\x02\x05\x02\x05\x01\x02\x01\x02\x01\r\x02\x02\x02"}, + {"testing/fstest", "n\x03\x80\x01\x01\n&\x10\x03\b\b"}, + {"testing/internal/testdeps", "\x02\v\xa7\x01-\x10,\x03\x05\x03\x06\a\x02\x0e"}, + {"testing/iotest", "\x03k\x03\x80\x01\x04"}, + {"testing/quick", "p\x01\x8c\x01\x05#\x10\x10"}, + {"testing/slogtest", "\ra\x03\x86\x01.\x05\x10\v"}, + {"testing/synctest", "\xda\x01`\x11"}, + {"text/scanner", "\x03n\x80\x01,*\x02"}, + {"text/tabwriter", "q\x80\x01X"}, + {"text/template", "n\x03B>\x01\n \x01\x05\x01\x02\x05\v\x02\r\x03\x02"}, + {"text/template/parse", "\x03n\xb9\x01\n\x01\x12\x02"}, + {"time", "n*\x1e\"(*\r\x02\x12"}, + {"time/tzdata", "n\xcb\x01\x12"}, {"unicode", ""}, {"unicode/utf16", ""}, {"unicode/utf8", ""}, - {"unique", "\x94\x01>\x01P\x0f\x13\x12"}, + {"unique", "\x94\x01!#\x01Q\r\x01\x13\x12"}, {"unsafe", ""}, - {"vendor/golang.org/x/crypto/chacha20", "\x10V\a\x8c\x01*'"}, - {"vendor/golang.org/x/crypto/chacha20poly1305", "\x10V\a\xd9\x01\x04\x01\a"}, - {"vendor/golang.org/x/crypto/cryptobyte", "c\n\x03\x88\x01&!\n"}, + {"vendor/golang.org/x/crypto/chacha20", "\x10W\a\x92\x01*&"}, + {"vendor/golang.org/x/crypto/chacha20poly1305", "\x10W\a\xde\x01\x04\x01\a"}, + {"vendor/golang.org/x/crypto/cryptobyte", "d\n\x03\x8d\x01' \n"}, {"vendor/golang.org/x/crypto/cryptobyte/asn1", ""}, - {"vendor/golang.org/x/crypto/internal/alias", "\xc5\x02"}, - {"vendor/golang.org/x/crypto/internal/poly1305", "Q\x15\x93\x01"}, - {"vendor/golang.org/x/net/dns/dnsmessage", "m"}, - {"vendor/golang.org/x/net/http/httpguts", "\x80\x02\x14\x1c\x13\r"}, - {"vendor/golang.org/x/net/http/httpproxy", "m\x03\x90\x01\x15\x01\x1a\x13\r"}, - {"vendor/golang.org/x/net/http2/hpack", "\x03j\x03zH"}, - {"vendor/golang.org/x/net/idna", "p\x87\x019\x13\x10\x02\x01"}, - {"vendor/golang.org/x/net/nettest", "\x03c\a\x03z\x11\x05\x16\x01\f\f\x01\x02\x02\x01\n"}, - {"vendor/golang.org/x/sys/cpu", "\x96\x02\r\f\x01\x15"}, - {"vendor/golang.org/x/text/secure/bidirule", "m\xd6\x01\x11\x01"}, - {"vendor/golang.org/x/text/transform", "\x03j}Y"}, - {"vendor/golang.org/x/text/unicode/bidi", "\x03\be~@\x15"}, - {"vendor/golang.org/x/text/unicode/norm", "f\nzH\x11\x11"}, - {"weak", "\x94\x01\x8f\x01\""}, + {"vendor/golang.org/x/crypto/internal/alias", "\xcb\x02"}, + {"vendor/golang.org/x/crypto/internal/poly1305", "R\x15\x99\x01"}, + {"vendor/golang.org/x/net/dns/dnsmessage", "n"}, + {"vendor/golang.org/x/net/http/httpguts", "\x87\x02\x14\x1a\x14\r"}, + {"vendor/golang.org/x/net/http/httpproxy", "n\x03\x96\x01\x10\x05\x01\x18\x14\r"}, + {"vendor/golang.org/x/net/http2/hpack", "\x03k\x03\x80\x01F"}, + {"vendor/golang.org/x/net/idna", "q\x8c\x018\x14\x10\x02\x01"}, + {"vendor/golang.org/x/net/nettest", "\x03d\a\x03\x80\x01\x11\x05\x16\x01\f\n\x01\x02\x02\x01\v"}, + {"vendor/golang.org/x/sys/cpu", "\x9d\x02\r\n\x01\x16"}, + {"vendor/golang.org/x/text/secure/bidirule", "n\xdb\x01\x11\x01"}, + {"vendor/golang.org/x/text/transform", "\x03k\x83\x01X"}, + {"vendor/golang.org/x/text/unicode/bidi", "\x03\bf\x84\x01>\x16"}, + {"vendor/golang.org/x/text/unicode/norm", "g\n\x80\x01F\x12\x11"}, + {"weak", "\x94\x01\x96\x01!"}, } diff --git a/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/vendor/golang.org/x/tools/internal/stdlib/manifest.go index 64f0326b64..c1faa50d36 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/manifest.go +++ b/vendor/golang.org/x/tools/internal/stdlib/manifest.go @@ -502,6 +502,7 @@ var PackageSymbols = map[string][]Symbol{ {"MD4", Const, 0, ""}, {"MD5", Const, 0, ""}, {"MD5SHA1", Const, 0, ""}, + {"MessageSigner", Type, 25, ""}, {"PrivateKey", Type, 0, ""}, {"PublicKey", Type, 2, ""}, {"RIPEMD160", Const, 0, ""}, @@ -517,6 +518,7 @@ var PackageSymbols = map[string][]Symbol{ {"SHA512", Const, 0, ""}, {"SHA512_224", Const, 5, ""}, {"SHA512_256", Const, 5, ""}, + {"SignMessage", Func, 25, "func(signer Signer, rand io.Reader, msg []byte, opts SignerOpts) (signature []byte, err error)"}, {"Signer", Type, 4, ""}, {"SignerOpts", Type, 4, ""}, }, @@ -600,10 +602,12 @@ var PackageSymbols = map[string][]Symbol{ {"X25519", Func, 20, "func() Curve"}, }, "crypto/ecdsa": { + {"(*PrivateKey).Bytes", Method, 25, ""}, {"(*PrivateKey).ECDH", Method, 20, ""}, {"(*PrivateKey).Equal", Method, 15, ""}, {"(*PrivateKey).Public", Method, 4, ""}, {"(*PrivateKey).Sign", Method, 4, ""}, + {"(*PublicKey).Bytes", Method, 25, ""}, {"(*PublicKey).ECDH", Method, 20, ""}, {"(*PublicKey).Equal", Method, 15, ""}, {"(PrivateKey).Add", Method, 0, ""}, @@ -619,6 +623,8 @@ var PackageSymbols = map[string][]Symbol{ {"(PublicKey).ScalarBaseMult", Method, 0, ""}, {"(PublicKey).ScalarMult", Method, 0, ""}, {"GenerateKey", Func, 0, "func(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)"}, + {"ParseRawPrivateKey", Func, 25, "func(curve elliptic.Curve, data []byte) (*PrivateKey, error)"}, + {"ParseUncompressedPublicKey", Func, 25, "func(curve elliptic.Curve, data []byte) (*PublicKey, error)"}, {"PrivateKey", Type, 0, ""}, {"PrivateKey.D", Field, 0, ""}, {"PrivateKey.PublicKey", Field, 0, ""}, @@ -815,6 +821,7 @@ var PackageSymbols = map[string][]Symbol{ "crypto/sha3": { {"(*SHA3).AppendBinary", Method, 24, ""}, {"(*SHA3).BlockSize", Method, 24, ""}, + {"(*SHA3).Clone", Method, 25, ""}, {"(*SHA3).MarshalBinary", Method, 24, ""}, {"(*SHA3).Reset", Method, 24, ""}, {"(*SHA3).Size", Method, 24, ""}, @@ -967,6 +974,7 @@ var PackageSymbols = map[string][]Symbol{ {"Config.GetCertificate", Field, 4, ""}, {"Config.GetClientCertificate", Field, 8, ""}, {"Config.GetConfigForClient", Field, 8, ""}, + {"Config.GetEncryptedClientHelloKeys", Field, 25, ""}, {"Config.InsecureSkipVerify", Field, 0, ""}, {"Config.KeyLogWriter", Field, 8, ""}, {"Config.MaxVersion", Field, 2, ""}, @@ -5463,6 +5471,7 @@ var PackageSymbols = map[string][]Symbol{ {"ParenExpr.X", Field, 0, ""}, {"Pkg", Const, 0, ""}, {"Preorder", Func, 23, "func(root Node) iter.Seq[Node]"}, + {"PreorderStack", Func, 25, "func(root Node, stack []Node, f func(n Node, stack []Node) bool)"}, {"Print", Func, 0, "func(fset *token.FileSet, x any) error"}, {"RECV", Const, 0, ""}, {"RangeStmt", Type, 0, ""}, @@ -5933,6 +5942,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*File).SetLines", Method, 0, ""}, {"(*File).SetLinesForContent", Method, 0, ""}, {"(*File).Size", Method, 0, ""}, + {"(*FileSet).AddExistingFiles", Method, 25, ""}, {"(*FileSet).AddFile", Method, 0, ""}, {"(*FileSet).Base", Method, 0, ""}, {"(*FileSet).File", Method, 0, ""}, @@ -6382,7 +6392,7 @@ var PackageSymbols = map[string][]Symbol{ {"Label", Type, 5, ""}, {"LocalVar", Const, 25, ""}, {"LookupFieldOrMethod", Func, 5, "func(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool)"}, - {"LookupSelection", Func, 25, ""}, + {"LookupSelection", Func, 25, "func(T Type, addressable bool, pkg *Package, name string) (Selection, bool)"}, {"Map", Type, 5, ""}, {"MethodExpr", Const, 5, ""}, {"MethodSet", Type, 5, ""}, @@ -6490,9 +6500,11 @@ var PackageSymbols = map[string][]Symbol{ {"Lang", Func, 22, "func(x string) string"}, }, "hash": { + {"Cloner", Type, 25, ""}, {"Hash", Type, 0, ""}, {"Hash32", Type, 0, ""}, {"Hash64", Type, 0, ""}, + {"XOF", Type, 25, ""}, }, "hash/adler32": { {"Checksum", Func, 0, "func(data []byte) uint32"}, @@ -6533,6 +6545,7 @@ var PackageSymbols = map[string][]Symbol{ }, "hash/maphash": { {"(*Hash).BlockSize", Method, 14, ""}, + {"(*Hash).Clone", Method, 25, ""}, {"(*Hash).Reset", Method, 14, ""}, {"(*Hash).Seed", Method, 14, ""}, {"(*Hash).SetSeed", Method, 14, ""}, @@ -7133,7 +7146,7 @@ var PackageSymbols = map[string][]Symbol{ {"FormatFileInfo", Func, 21, "func(info FileInfo) string"}, {"Glob", Func, 16, "func(fsys FS, pattern string) (matches []string, err error)"}, {"GlobFS", Type, 16, ""}, - {"Lstat", Func, 25, ""}, + {"Lstat", Func, 25, "func(fsys FS, name string) (FileInfo, error)"}, {"ModeAppend", Const, 16, ""}, {"ModeCharDevice", Const, 16, ""}, {"ModeDevice", Const, 16, ""}, @@ -7158,7 +7171,7 @@ var PackageSymbols = map[string][]Symbol{ {"ReadDirFile", Type, 16, ""}, {"ReadFile", Func, 16, "func(fsys FS, name string) ([]byte, error)"}, {"ReadFileFS", Type, 16, ""}, - {"ReadLink", Func, 25, ""}, + {"ReadLink", Func, 25, "func(fsys FS, name string) (string, error)"}, {"ReadLinkFS", Type, 25, ""}, {"SkipAll", Var, 20, ""}, {"SkipDir", Var, 16, ""}, @@ -7275,6 +7288,7 @@ var PackageSymbols = map[string][]Symbol{ {"(Record).Attrs", Method, 21, ""}, {"(Record).Clone", Method, 21, ""}, {"(Record).NumAttrs", Method, 21, ""}, + {"(Record).Source", Method, 25, ""}, {"(Value).Any", Method, 21, ""}, {"(Value).Bool", Method, 21, ""}, {"(Value).Duration", Method, 21, ""}, @@ -7306,6 +7320,7 @@ var PackageSymbols = map[string][]Symbol{ {"Float64", Func, 21, "func(key string, v float64) Attr"}, {"Float64Value", Func, 21, "func(v float64) Value"}, {"Group", Func, 21, "func(key string, args ...any) Attr"}, + {"GroupAttrs", Func, 25, "func(key string, attrs ...Attr) Attr"}, {"GroupValue", Func, 21, "func(as ...Attr) Value"}, {"Handler", Type, 21, ""}, {"HandlerOptions", Type, 21, ""}, @@ -7916,7 +7931,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).WriteField", Method, 0, ""}, {"ErrMessageTooLarge", Var, 9, ""}, {"File", Type, 0, ""}, - {"FileContentDisposition", Func, 25, ""}, + {"FileContentDisposition", Func, 25, "func(fieldname string, filename string) string"}, {"FileHeader", Type, 0, ""}, {"FileHeader.Filename", Field, 0, ""}, {"FileHeader.Header", Field, 0, ""}, @@ -8294,6 +8309,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*Client).PostForm", Method, 0, ""}, {"(*Cookie).String", Method, 0, ""}, {"(*Cookie).Valid", Method, 18, ""}, + {"(*CrossOriginProtection).AddInsecureBypassPattern", Method, 25, ""}, + {"(*CrossOriginProtection).AddTrustedOrigin", Method, 25, ""}, + {"(*CrossOriginProtection).Check", Method, 25, ""}, + {"(*CrossOriginProtection).Handler", Method, 25, ""}, + {"(*CrossOriginProtection).SetDenyHandler", Method, 25, ""}, {"(*MaxBytesError).Error", Method, 19, ""}, {"(*ProtocolError).Error", Method, 0, ""}, {"(*ProtocolError).Is", Method, 21, ""}, @@ -8388,6 +8408,7 @@ var PackageSymbols = map[string][]Symbol{ {"Cookie.Unparsed", Field, 0, ""}, {"Cookie.Value", Field, 0, ""}, {"CookieJar", Type, 0, ""}, + {"CrossOriginProtection", Type, 25, ""}, {"DefaultClient", Var, 0, ""}, {"DefaultMaxHeaderBytes", Const, 0, ""}, {"DefaultMaxIdleConnsPerHost", Const, 0, ""}, @@ -8460,6 +8481,7 @@ var PackageSymbols = map[string][]Symbol{ {"MethodPost", Const, 6, ""}, {"MethodPut", Const, 6, ""}, {"MethodTrace", Const, 6, ""}, + {"NewCrossOriginProtection", Func, 25, "func() *CrossOriginProtection"}, {"NewFileTransport", Func, 0, "func(fs FileSystem) RoundTripper"}, {"NewFileTransportFS", Func, 22, "func(fsys fs.FS) RoundTripper"}, {"NewRequest", Func, 0, "func(method string, url string, body io.Reader) (*Request, error)"}, @@ -9174,15 +9196,19 @@ var PackageSymbols = map[string][]Symbol{ {"(*Root).Link", Method, 25, ""}, {"(*Root).Lstat", Method, 24, ""}, {"(*Root).Mkdir", Method, 24, ""}, + {"(*Root).MkdirAll", Method, 25, ""}, {"(*Root).Name", Method, 24, ""}, {"(*Root).Open", Method, 24, ""}, {"(*Root).OpenFile", Method, 24, ""}, {"(*Root).OpenRoot", Method, 24, ""}, + {"(*Root).ReadFile", Method, 25, ""}, {"(*Root).Readlink", Method, 25, ""}, {"(*Root).Remove", Method, 24, ""}, + {"(*Root).RemoveAll", Method, 25, ""}, {"(*Root).Rename", Method, 25, ""}, {"(*Root).Stat", Method, 24, ""}, {"(*Root).Symlink", Method, 25, ""}, + {"(*Root).WriteFile", Method, 25, ""}, {"(*SyscallError).Error", Method, 0, ""}, {"(*SyscallError).Timeout", Method, 10, ""}, {"(*SyscallError).Unwrap", Method, 13, ""}, @@ -9623,6 +9649,7 @@ var PackageSymbols = map[string][]Symbol{ {"StructTag", Type, 0, ""}, {"Swapper", Func, 8, "func(slice any) func(i int, j int)"}, {"Type", Type, 0, ""}, + {"TypeAssert", Func, 25, "func[T any](v Value) (T, bool)"}, {"TypeFor", Func, 22, "func[T any]() Type"}, {"TypeOf", Func, 0, "func(i any) Type"}, {"Uint", Const, 0, ""}, @@ -9909,6 +9936,7 @@ var PackageSymbols = map[string][]Symbol{ {"SetBlockProfileRate", Func, 1, "func(rate int)"}, {"SetCPUProfileRate", Func, 0, "func(hz int)"}, {"SetCgoTraceback", Func, 7, "func(version int, traceback unsafe.Pointer, context unsafe.Pointer, symbolizer unsafe.Pointer)"}, + {"SetDefaultGOMAXPROCS", Func, 25, "func()"}, {"SetFinalizer", Func, 0, "func(obj any, finalizer any)"}, {"SetMutexProfileFraction", Func, 8, "func(rate int) int"}, {"Stack", Func, 0, "func(buf []byte, all bool) int"}, @@ -10021,11 +10049,20 @@ var PackageSymbols = map[string][]Symbol{ {"WriteHeapProfile", Func, 0, "func(w io.Writer) error"}, }, "runtime/trace": { + {"(*FlightRecorder).Enabled", Method, 25, ""}, + {"(*FlightRecorder).Start", Method, 25, ""}, + {"(*FlightRecorder).Stop", Method, 25, ""}, + {"(*FlightRecorder).WriteTo", Method, 25, ""}, {"(*Region).End", Method, 11, ""}, {"(*Task).End", Method, 11, ""}, + {"FlightRecorder", Type, 25, ""}, + {"FlightRecorderConfig", Type, 25, ""}, + {"FlightRecorderConfig.MaxBytes", Field, 25, ""}, + {"FlightRecorderConfig.MinAge", Field, 25, ""}, {"IsEnabled", Func, 11, "func() bool"}, {"Log", Func, 11, "func(ctx context.Context, category string, message string)"}, {"Logf", Func, 11, "func(ctx context.Context, category string, format string, args ...any)"}, + {"NewFlightRecorder", Func, 25, "func(cfg FlightRecorderConfig) *FlightRecorder"}, {"NewTask", Func, 11, "func(pctx context.Context, taskType string) (ctx context.Context, task *Task)"}, {"Region", Type, 11, ""}, {"Start", Func, 5, "func(w io.Writer) error"}, @@ -16642,6 +16679,7 @@ var PackageSymbols = map[string][]Symbol{ {"ValueOf", Func, 0, ""}, }, "testing": { + {"(*B).Attr", Method, 25, ""}, {"(*B).Chdir", Method, 24, ""}, {"(*B).Cleanup", Method, 14, ""}, {"(*B).Context", Method, 24, ""}, @@ -16658,6 +16696,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*B).Logf", Method, 0, ""}, {"(*B).Loop", Method, 24, ""}, {"(*B).Name", Method, 8, ""}, + {"(*B).Output", Method, 25, ""}, {"(*B).ReportAllocs", Method, 1, ""}, {"(*B).ReportMetric", Method, 13, ""}, {"(*B).ResetTimer", Method, 0, ""}, @@ -16674,6 +16713,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*B).StopTimer", Method, 0, ""}, {"(*B).TempDir", Method, 15, ""}, {"(*F).Add", Method, 18, ""}, + {"(*F).Attr", Method, 25, ""}, {"(*F).Chdir", Method, 24, ""}, {"(*F).Cleanup", Method, 18, ""}, {"(*F).Context", Method, 24, ""}, @@ -16689,6 +16729,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*F).Log", Method, 18, ""}, {"(*F).Logf", Method, 18, ""}, {"(*F).Name", Method, 18, ""}, + {"(*F).Output", Method, 25, ""}, {"(*F).Setenv", Method, 18, ""}, {"(*F).Skip", Method, 18, ""}, {"(*F).SkipNow", Method, 18, ""}, @@ -16697,6 +16738,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*F).TempDir", Method, 18, ""}, {"(*M).Run", Method, 4, ""}, {"(*PB).Next", Method, 3, ""}, + {"(*T).Attr", Method, 25, ""}, {"(*T).Chdir", Method, 24, ""}, {"(*T).Cleanup", Method, 14, ""}, {"(*T).Context", Method, 24, ""}, @@ -16712,6 +16754,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*T).Log", Method, 0, ""}, {"(*T).Logf", Method, 0, ""}, {"(*T).Name", Method, 8, ""}, + {"(*T).Output", Method, 25, ""}, {"(*T).Parallel", Method, 0, ""}, {"(*T).Run", Method, 7, ""}, {"(*T).Setenv", Method, 17, ""}, @@ -16834,6 +16877,10 @@ var PackageSymbols = map[string][]Symbol{ {"Run", Func, 22, "func(t *testing.T, newHandler func(*testing.T) slog.Handler, result func(*testing.T) map[string]any)"}, {"TestHandler", Func, 21, "func(h slog.Handler, results func() []map[string]any) error"}, }, + "testing/synctest": { + {"Test", Func, 25, "func(t *testing.T, f func(*testing.T))"}, + {"Wait", Func, 25, "func()"}, + }, "text/scanner": { {"(*Position).IsValid", Method, 0, ""}, {"(*Scanner).Init", Method, 0, ""}, @@ -17347,6 +17394,7 @@ var PackageSymbols = map[string][]Symbol{ {"CaseRange.Lo", Field, 0, ""}, {"CaseRanges", Var, 0, ""}, {"Categories", Var, 0, ""}, + {"CategoryAliases", Var, 25, ""}, {"Caucasian_Albanian", Var, 4, ""}, {"Cc", Var, 0, ""}, {"Cf", Var, 0, ""}, @@ -17354,6 +17402,7 @@ var PackageSymbols = map[string][]Symbol{ {"Cham", Var, 0, ""}, {"Cherokee", Var, 0, ""}, {"Chorasmian", Var, 16, ""}, + {"Cn", Var, 25, ""}, {"Co", Var, 0, ""}, {"Common", Var, 0, ""}, {"Coptic", Var, 0, ""}, @@ -17432,6 +17481,7 @@ var PackageSymbols = map[string][]Symbol{ {"Khojki", Var, 4, ""}, {"Khudawadi", Var, 4, ""}, {"L", Var, 0, ""}, + {"LC", Var, 25, ""}, {"Lao", Var, 0, ""}, {"Latin", Var, 0, ""}, {"Lepcha", Var, 0, ""}, diff --git a/vendor/golang.org/x/tools/internal/typesinternal/fx.go b/vendor/golang.org/x/tools/internal/typesinternal/fx.go new file mode 100644 index 0000000000..93acff2170 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typesinternal/fx.go @@ -0,0 +1,49 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typesinternal + +import ( + "go/ast" + "go/token" + "go/types" +) + +// NoEffects reports whether the expression has no side effects, i.e., it +// does not modify the memory state. This function is conservative: it may +// return false even when the expression has no effect. +func NoEffects(info *types.Info, expr ast.Expr) bool { + noEffects := true + ast.Inspect(expr, func(n ast.Node) bool { + switch v := n.(type) { + case nil, *ast.Ident, *ast.BasicLit, *ast.BinaryExpr, *ast.ParenExpr, + *ast.SelectorExpr, *ast.IndexExpr, *ast.SliceExpr, *ast.TypeAssertExpr, + *ast.StarExpr, *ast.CompositeLit, *ast.ArrayType, *ast.StructType, + *ast.MapType, *ast.InterfaceType, *ast.KeyValueExpr: + // No effect + case *ast.UnaryExpr: + // Channel send <-ch has effects + if v.Op == token.ARROW { + noEffects = false + } + case *ast.CallExpr: + // Type conversion has no effects + if !info.Types[v.Fun].IsType() { + // TODO(adonovan): Add a case for built-in functions without side + // effects (by using callsPureBuiltin from tools/internal/refactor/inline) + + noEffects = false + } + case *ast.FuncLit: + // A FuncLit has no effects, but do not descend into it. + return false + default: + // All other expressions have effects + noEffects = false + } + + return noEffects + }) + return noEffects +} diff --git a/vendor/golang.org/x/tools/internal/typesinternal/isnamed.go b/vendor/golang.org/x/tools/internal/typesinternal/isnamed.go new file mode 100644 index 0000000000..f2affec4fb --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typesinternal/isnamed.go @@ -0,0 +1,71 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typesinternal + +import ( + "go/types" + "slices" +) + +// IsTypeNamed reports whether t is (or is an alias for) a +// package-level defined type with the given package path and one of +// the given names. It returns false if t is nil. +// +// This function avoids allocating the concatenation of "pkg.Name", +// which is important for the performance of syntax matching. +func IsTypeNamed(t types.Type, pkgPath string, names ...string) bool { + if named, ok := types.Unalias(t).(*types.Named); ok { + tname := named.Obj() + return tname != nil && + IsPackageLevel(tname) && + tname.Pkg().Path() == pkgPath && + slices.Contains(names, tname.Name()) + } + return false +} + +// IsPointerToNamed reports whether t is (or is an alias for) a pointer to a +// package-level defined type with the given package path and one of the given +// names. It returns false if t is not a pointer type. +func IsPointerToNamed(t types.Type, pkgPath string, names ...string) bool { + r := Unpointer(t) + if r == t { + return false + } + return IsTypeNamed(r, pkgPath, names...) +} + +// IsFunctionNamed reports whether obj is a package-level function +// defined in the given package and has one of the given names. +// It returns false if obj is nil. +// +// This function avoids allocating the concatenation of "pkg.Name", +// which is important for the performance of syntax matching. +func IsFunctionNamed(obj types.Object, pkgPath string, names ...string) bool { + f, ok := obj.(*types.Func) + return ok && + IsPackageLevel(obj) && + f.Pkg().Path() == pkgPath && + f.Type().(*types.Signature).Recv() == nil && + slices.Contains(names, f.Name()) +} + +// IsMethodNamed reports whether obj is a method defined on a +// package-level type with the given package and type name, and has +// one of the given names. It returns false if obj is nil. +// +// This function avoids allocating the concatenation of "pkg.TypeName.Name", +// which is important for the performance of syntax matching. +func IsMethodNamed(obj types.Object, pkgPath string, typeName string, names ...string) bool { + if fn, ok := obj.(*types.Func); ok { + if recv := fn.Type().(*types.Signature).Recv(); recv != nil { + _, T := ReceiverNamed(recv) + return T != nil && + IsTypeNamed(T, pkgPath, typeName) && + slices.Contains(names, fn.Name()) + } + } + return false +} diff --git a/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go b/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go index b64f714eb3..64f47919f0 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go @@ -15,6 +15,14 @@ import ( // file. // If the same package is imported multiple times, the last appearance is // recorded. +// +// TODO(adonovan): this function ignores the effect of shadowing. It +// should accept a [token.Pos] and a [types.Info] and compute only the +// set of imports that are not shadowed at that point, analogous to +// [analysisinternal.AddImport]. It could also compute (as a side +// effect) the set of additional imports required to ensure that there +// is an accessible import for each necessary package, making it +// converge even more closely with AddImport. func FileQualifier(f *ast.File, pkg *types.Package) types.Qualifier { // Construct mapping of import paths to their defined names. // It is only necessary to look at renaming imports. diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go index a5cd7e8dbf..fef74a7856 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -2,8 +2,20 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package typesinternal provides access to internal go/types APIs that are not -// yet exported. +// Package typesinternal provides helpful operators for dealing with +// go/types: +// +// - operators for querying typed syntax trees (e.g. [Imports], [IsFunctionNamed]); +// - functions for converting types to strings or syntax (e.g. [TypeExpr], FileQualifier]); +// - helpers for working with the [go/types] API (e.g. [NewTypesInfo]); +// - access to internal go/types APIs that are not yet +// exported (e.g. [SetUsesCgo], [ErrorCodeStartEnd], [VarKind]); and +// - common algorithms related to types (e.g. [TooNewStdSymbols]). +// +// See also: +// - [golang.org/x/tools/internal/astutil], for operations on untyped syntax; +// - [golang.org/x/tools/internal/analysisinernal], for helpers for analyzers; +// - [golang.org/x/tools/internal/refactor], for operators to compute text edits. package typesinternal import ( @@ -13,6 +25,7 @@ import ( "reflect" "unsafe" + "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/internal/aliases" ) @@ -60,6 +73,9 @@ func ErrorCodeStartEnd(err types.Error) (code ErrorCode, start, end token.Pos, o // which is often excessive.) // // If pkg is nil, it is equivalent to [*types.Package.Name]. +// +// TODO(adonovan): all uses of this with TypeString should be +// eliminated when https://go.dev/issues/75604 is resolved. func NameRelativeTo(pkg *types.Package) types.Qualifier { return func(other *types.Package) string { if pkg != nil && pkg == other { @@ -153,3 +169,31 @@ func NewTypesInfo() *types.Info { FileVersions: map[*ast.File]string{}, } } + +// EnclosingScope returns the innermost block logically enclosing the cursor. +func EnclosingScope(info *types.Info, cur inspector.Cursor) *types.Scope { + for cur := range cur.Enclosing() { + n := cur.Node() + // A function's Scope is associated with its FuncType. + switch f := n.(type) { + case *ast.FuncDecl: + n = f.Type + case *ast.FuncLit: + n = f.Type + } + if b := info.Scopes[n]; b != nil { + return b + } + } + panic("no Scope for *ast.File") +} + +// Imports reports whether path is imported by pkg. +func Imports(pkg *types.Package, path string) bool { + for _, imp := range pkg.Imports() { + if imp.Path() == path { + return true + } + } + return false +} diff --git a/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go b/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go index d272949c17..453bba2ad5 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go @@ -204,23 +204,12 @@ func ZeroExpr(t types.Type, qual types.Qualifier) (_ ast.Expr, isValid bool) { } } -// IsZeroExpr uses simple syntactic heuristics to report whether expr -// is a obvious zero value, such as 0, "", nil, or false. -// It cannot do better without type information. -func IsZeroExpr(expr ast.Expr) bool { - switch e := expr.(type) { - case *ast.BasicLit: - return e.Value == "0" || e.Value == `""` - case *ast.Ident: - return e.Name == "nil" || e.Name == "false" - default: - return false - } -} - // TypeExpr returns syntax for the specified type. References to named types // are qualified by an appropriate (optional) qualifier function. // It may panic for types such as Tuple or Union. +// +// See also https://go.dev/issues/75604, which will provide a robust +// Type-to-valid-Go-syntax formatter. func TypeExpr(t types.Type, qual types.Qualifier) ast.Expr { switch t := t.(type) { case *types.Basic: diff --git a/vendor/golang.org/x/xerrors/LICENSE b/vendor/golang.org/x/xerrors/LICENSE deleted file mode 100644 index c3c8b7d2b8..0000000000 --- a/vendor/golang.org/x/xerrors/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright 2019 The Go Authors. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google LLC nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/xerrors/PATENTS b/vendor/golang.org/x/xerrors/PATENTS deleted file mode 100644 index 733099041f..0000000000 --- a/vendor/golang.org/x/xerrors/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/xerrors/README b/vendor/golang.org/x/xerrors/README deleted file mode 100644 index aac7867a56..0000000000 --- a/vendor/golang.org/x/xerrors/README +++ /dev/null @@ -1,2 +0,0 @@ -This repository holds the transition packages for the new Go 1.13 error values. -See golang.org/design/29934-error-values. diff --git a/vendor/golang.org/x/xerrors/adaptor.go b/vendor/golang.org/x/xerrors/adaptor.go deleted file mode 100644 index 4317f24833..0000000000 --- a/vendor/golang.org/x/xerrors/adaptor.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xerrors - -import ( - "bytes" - "fmt" - "io" - "reflect" - "strconv" -) - -// FormatError calls the FormatError method of f with an errors.Printer -// configured according to s and verb, and writes the result to s. -func FormatError(f Formatter, s fmt.State, verb rune) { - // Assuming this function is only called from the Format method, and given - // that FormatError takes precedence over Format, it cannot be called from - // any package that supports errors.Formatter. It is therefore safe to - // disregard that State may be a specific printer implementation and use one - // of our choice instead. - - // limitations: does not support printing error as Go struct. - - var ( - sep = " " // separator before next error - p = &state{State: s} - direct = true - ) - - var err error = f - - switch verb { - // Note that this switch must match the preference order - // for ordinary string printing (%#v before %+v, and so on). - - case 'v': - if s.Flag('#') { - if stringer, ok := err.(fmt.GoStringer); ok { - io.WriteString(&p.buf, stringer.GoString()) - goto exit - } - // proceed as if it were %v - } else if s.Flag('+') { - p.printDetail = true - sep = "\n - " - } - case 's': - case 'q', 'x', 'X': - // Use an intermediate buffer in the rare cases that precision, - // truncation, or one of the alternative verbs (q, x, and X) are - // specified. - direct = false - - default: - p.buf.WriteString("%!") - p.buf.WriteRune(verb) - p.buf.WriteByte('(') - switch { - case err != nil: - p.buf.WriteString(reflect.TypeOf(f).String()) - default: - p.buf.WriteString("") - } - p.buf.WriteByte(')') - io.Copy(s, &p.buf) - return - } - -loop: - for { - switch v := err.(type) { - case Formatter: - err = v.FormatError((*printer)(p)) - case fmt.Formatter: - v.Format(p, 'v') - break loop - default: - io.WriteString(&p.buf, v.Error()) - break loop - } - if err == nil { - break - } - if p.needColon || !p.printDetail { - p.buf.WriteByte(':') - p.needColon = false - } - p.buf.WriteString(sep) - p.inDetail = false - p.needNewline = false - } - -exit: - width, okW := s.Width() - prec, okP := s.Precision() - - if !direct || (okW && width > 0) || okP { - // Construct format string from State s. - format := []byte{'%'} - if s.Flag('-') { - format = append(format, '-') - } - if s.Flag('+') { - format = append(format, '+') - } - if s.Flag(' ') { - format = append(format, ' ') - } - if okW { - format = strconv.AppendInt(format, int64(width), 10) - } - if okP { - format = append(format, '.') - format = strconv.AppendInt(format, int64(prec), 10) - } - format = append(format, string(verb)...) - fmt.Fprintf(s, string(format), p.buf.String()) - } else { - io.Copy(s, &p.buf) - } -} - -var detailSep = []byte("\n ") - -// state tracks error printing state. It implements fmt.State. -type state struct { - fmt.State - buf bytes.Buffer - - printDetail bool - inDetail bool - needColon bool - needNewline bool -} - -func (s *state) Write(b []byte) (n int, err error) { - if s.printDetail { - if len(b) == 0 { - return 0, nil - } - if s.inDetail && s.needColon { - s.needNewline = true - if b[0] == '\n' { - b = b[1:] - } - } - k := 0 - for i, c := range b { - if s.needNewline { - if s.inDetail && s.needColon { - s.buf.WriteByte(':') - s.needColon = false - } - s.buf.Write(detailSep) - s.needNewline = false - } - if c == '\n' { - s.buf.Write(b[k:i]) - k = i + 1 - s.needNewline = true - } - } - s.buf.Write(b[k:]) - if !s.inDetail { - s.needColon = true - } - } else if !s.inDetail { - s.buf.Write(b) - } - return len(b), nil -} - -// printer wraps a state to implement an xerrors.Printer. -type printer state - -func (s *printer) Print(args ...interface{}) { - if !s.inDetail || s.printDetail { - fmt.Fprint((*state)(s), args...) - } -} - -func (s *printer) Printf(format string, args ...interface{}) { - if !s.inDetail || s.printDetail { - fmt.Fprintf((*state)(s), format, args...) - } -} - -func (s *printer) Detail() bool { - s.inDetail = true - return s.printDetail -} diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg deleted file mode 100644 index 3f8b14b64e..0000000000 --- a/vendor/golang.org/x/xerrors/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/xerrors/doc.go b/vendor/golang.org/x/xerrors/doc.go deleted file mode 100644 index 2ef99f5a87..0000000000 --- a/vendor/golang.org/x/xerrors/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package xerrors implements functions to manipulate errors. -// -// This package is based on the Go 2 proposal for error values: -// -// https://golang.org/design/29934-error-values -// -// These functions were incorporated into the standard library's errors package -// in Go 1.13: -// - Is -// - As -// - Unwrap -// -// Also, Errorf's %w verb was incorporated into fmt.Errorf. -// -// Use this package to get equivalent behavior in all supported Go versions. -// -// No other features of this package were included in Go 1.13, and at present -// there are no plans to include any of them. -package xerrors // import "golang.org/x/xerrors" diff --git a/vendor/golang.org/x/xerrors/errors.go b/vendor/golang.org/x/xerrors/errors.go deleted file mode 100644 index e88d3772d8..0000000000 --- a/vendor/golang.org/x/xerrors/errors.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xerrors - -import "fmt" - -// errorString is a trivial implementation of error. -type errorString struct { - s string - frame Frame -} - -// New returns an error that formats as the given text. -// -// The returned error contains a Frame set to the caller's location and -// implements Formatter to show this information when printed with details. -func New(text string) error { - return &errorString{text, Caller(1)} -} - -func (e *errorString) Error() string { - return e.s -} - -func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) } - -func (e *errorString) FormatError(p Printer) (next error) { - p.Print(e.s) - e.frame.Format(p) - return nil -} diff --git a/vendor/golang.org/x/xerrors/fmt.go b/vendor/golang.org/x/xerrors/fmt.go deleted file mode 100644 index 27a5d70bd6..0000000000 --- a/vendor/golang.org/x/xerrors/fmt.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xerrors - -import ( - "fmt" - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/xerrors/internal" -) - -const percentBangString = "%!" - -// Errorf formats according to a format specifier and returns the string as a -// value that satisfies error. -// -// The returned error includes the file and line number of the caller when -// formatted with additional detail enabled. If the last argument is an error -// the returned error's Format method will return it if the format string ends -// with ": %s", ": %v", or ": %w". If the last argument is an error and the -// format string ends with ": %w", the returned error implements an Unwrap -// method returning it. -// -// If the format specifier includes a %w verb with an error operand in a -// position other than at the end, the returned error will still implement an -// Unwrap method returning the operand, but the error's Format method will not -// return the wrapped error. -// -// It is invalid to include more than one %w verb or to supply it with an -// operand that does not implement the error interface. The %w verb is otherwise -// a synonym for %v. -// -// Note that as of Go 1.13, the fmt.Errorf function will do error formatting, -// but it will not capture a stack backtrace. -func Errorf(format string, a ...interface{}) error { - format = formatPlusW(format) - // Support a ": %[wsv]" suffix, which works well with xerrors.Formatter. - wrap := strings.HasSuffix(format, ": %w") - idx, format2, ok := parsePercentW(format) - percentWElsewhere := !wrap && idx >= 0 - if !percentWElsewhere && (wrap || strings.HasSuffix(format, ": %s") || strings.HasSuffix(format, ": %v")) { - err := errorAt(a, len(a)-1) - if err == nil { - return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)} - } - // TODO: this is not entirely correct. The error value could be - // printed elsewhere in format if it mixes numbered with unnumbered - // substitutions. With relatively small changes to doPrintf we can - // have it optionally ignore extra arguments and pass the argument - // list in its entirety. - msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...) - frame := Frame{} - if internal.EnableTrace { - frame = Caller(1) - } - if wrap { - return &wrapError{msg, err, frame} - } - return &noWrapError{msg, err, frame} - } - // Support %w anywhere. - // TODO: don't repeat the wrapped error's message when %w occurs in the middle. - msg := fmt.Sprintf(format2, a...) - if idx < 0 { - return &noWrapError{msg, nil, Caller(1)} - } - err := errorAt(a, idx) - if !ok || err == nil { - // Too many %ws or argument of %w is not an error. Approximate the Go - // 1.13 fmt.Errorf message. - return &noWrapError{fmt.Sprintf("%sw(%s)", percentBangString, msg), nil, Caller(1)} - } - frame := Frame{} - if internal.EnableTrace { - frame = Caller(1) - } - return &wrapError{msg, err, frame} -} - -func errorAt(args []interface{}, i int) error { - if i < 0 || i >= len(args) { - return nil - } - err, ok := args[i].(error) - if !ok { - return nil - } - return err -} - -// formatPlusW is used to avoid the vet check that will barf at %w. -func formatPlusW(s string) string { - return s -} - -// Return the index of the only %w in format, or -1 if none. -// Also return a rewritten format string with %w replaced by %v, and -// false if there is more than one %w. -// TODO: handle "%[N]w". -func parsePercentW(format string) (idx int, newFormat string, ok bool) { - // Loosely copied from golang.org/x/tools/go/analysis/passes/printf/printf.go. - idx = -1 - ok = true - n := 0 - sz := 0 - var isW bool - for i := 0; i < len(format); i += sz { - if format[i] != '%' { - sz = 1 - continue - } - // "%%" is not a format directive. - if i+1 < len(format) && format[i+1] == '%' { - sz = 2 - continue - } - sz, isW = parsePrintfVerb(format[i:]) - if isW { - if idx >= 0 { - ok = false - } else { - idx = n - } - // "Replace" the last character, the 'w', with a 'v'. - p := i + sz - 1 - format = format[:p] + "v" + format[p+1:] - } - n++ - } - return idx, format, ok -} - -// Parse the printf verb starting with a % at s[0]. -// Return how many bytes it occupies and whether the verb is 'w'. -func parsePrintfVerb(s string) (int, bool) { - // Assume only that the directive is a sequence of non-letters followed by a single letter. - sz := 0 - var r rune - for i := 1; i < len(s); i += sz { - r, sz = utf8.DecodeRuneInString(s[i:]) - if unicode.IsLetter(r) { - return i + sz, r == 'w' - } - } - return len(s), false -} - -type noWrapError struct { - msg string - err error - frame Frame -} - -func (e *noWrapError) Error() string { - return fmt.Sprint(e) -} - -func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } - -func (e *noWrapError) FormatError(p Printer) (next error) { - p.Print(e.msg) - e.frame.Format(p) - return e.err -} - -type wrapError struct { - msg string - err error - frame Frame -} - -func (e *wrapError) Error() string { - return fmt.Sprint(e) -} - -func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } - -func (e *wrapError) FormatError(p Printer) (next error) { - p.Print(e.msg) - e.frame.Format(p) - return e.err -} - -func (e *wrapError) Unwrap() error { - return e.err -} diff --git a/vendor/golang.org/x/xerrors/format.go b/vendor/golang.org/x/xerrors/format.go deleted file mode 100644 index 1bc9c26b97..0000000000 --- a/vendor/golang.org/x/xerrors/format.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xerrors - -// A Formatter formats error messages. -type Formatter interface { - error - - // FormatError prints the receiver's first error and returns the next error in - // the error chain, if any. - FormatError(p Printer) (next error) -} - -// A Printer formats error messages. -// -// The most common implementation of Printer is the one provided by package fmt -// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message -// typically provide their own implementations. -type Printer interface { - // Print appends args to the message output. - Print(args ...interface{}) - - // Printf writes a formatted string. - Printf(format string, args ...interface{}) - - // Detail reports whether error detail is requested. - // After the first call to Detail, all text written to the Printer - // is formatted as additional detail, or ignored when - // detail has not been requested. - // If Detail returns false, the caller can avoid printing the detail at all. - Detail() bool -} diff --git a/vendor/golang.org/x/xerrors/frame.go b/vendor/golang.org/x/xerrors/frame.go deleted file mode 100644 index 0de628ec50..0000000000 --- a/vendor/golang.org/x/xerrors/frame.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xerrors - -import ( - "runtime" -) - -// A Frame contains part of a call stack. -type Frame struct { - // Make room for three PCs: the one we were asked for, what it called, - // and possibly a PC for skipPleaseUseCallersFrames. See: - // https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 - frames [3]uintptr -} - -// Caller returns a Frame that describes a frame on the caller's stack. -// The argument skip is the number of frames to skip over. -// Caller(0) returns the frame for the caller of Caller. -func Caller(skip int) Frame { - var s Frame - runtime.Callers(skip+1, s.frames[:]) - return s -} - -// location reports the file, line, and function of a frame. -// -// The returned function may be "" even if file and line are not. -func (f Frame) location() (function, file string, line int) { - frames := runtime.CallersFrames(f.frames[:]) - if _, ok := frames.Next(); !ok { - return "", "", 0 - } - fr, ok := frames.Next() - if !ok { - return "", "", 0 - } - return fr.Function, fr.File, fr.Line -} - -// Format prints the stack as error detail. -// It should be called from an error's Format implementation -// after printing any other error detail. -func (f Frame) Format(p Printer) { - if p.Detail() { - function, file, line := f.location() - if function != "" { - p.Printf("%s\n ", function) - } - if file != "" { - p.Printf("%s:%d\n", file, line) - } - } -} diff --git a/vendor/golang.org/x/xerrors/internal/internal.go b/vendor/golang.org/x/xerrors/internal/internal.go deleted file mode 100644 index 89f4eca5df..0000000000 --- a/vendor/golang.org/x/xerrors/internal/internal.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package internal - -// EnableTrace indicates whether stack information should be recorded in errors. -var EnableTrace = true diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go deleted file mode 100644 index 9842758ca7..0000000000 --- a/vendor/golang.org/x/xerrors/wrap.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xerrors - -import ( - "reflect" -) - -// A Wrapper provides context around another error. -type Wrapper interface { - // Unwrap returns the next error in the error chain. - // If there is no next error, Unwrap returns nil. - Unwrap() error -} - -// Opaque returns an error with the same error formatting as err -// but that does not match err and cannot be unwrapped. -func Opaque(err error) error { - return noWrapper{err} -} - -type noWrapper struct { - error -} - -func (e noWrapper) FormatError(p Printer) (next error) { - if f, ok := e.error.(Formatter); ok { - return f.FormatError(p) - } - p.Print(e.error) - return nil -} - -// Unwrap returns the result of calling the Unwrap method on err, if err implements -// Unwrap. Otherwise, Unwrap returns nil. -// -// Deprecated: As of Go 1.13, use errors.Unwrap instead. -func Unwrap(err error) error { - u, ok := err.(Wrapper) - if !ok { - return nil - } - return u.Unwrap() -} - -// Is reports whether any error in err's chain matches target. -// -// An error is considered to match a target if it is equal to that target or if -// it implements a method Is(error) bool such that Is(target) returns true. -// -// Deprecated: As of Go 1.13, use errors.Is instead. -func Is(err, target error) bool { - if target == nil { - return err == target - } - - isComparable := reflect.TypeOf(target).Comparable() - for { - if isComparable && err == target { - return true - } - if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { - return true - } - // TODO: consider supporing target.Is(err). This would allow - // user-definable predicates, but also may allow for coping with sloppy - // APIs, thereby making it easier to get away with them. - if err = Unwrap(err); err == nil { - return false - } - } -} - -// As finds the first error in err's chain that matches the type to which target -// points, and if so, sets the target to its value and returns true. An error -// matches a type if it is assignable to the target type, or if it has a method -// As(interface{}) bool such that As(target) returns true. As will panic if target -// is not a non-nil pointer to a type which implements error or is of interface type. -// -// The As method should set the target to its value and return true if err -// matches the type to which target points. -// -// Deprecated: As of Go 1.13, use errors.As instead. -func As(err error, target interface{}) bool { - if target == nil { - panic("errors: target cannot be nil") - } - val := reflect.ValueOf(target) - typ := val.Type() - if typ.Kind() != reflect.Ptr || val.IsNil() { - panic("errors: target must be a non-nil pointer") - } - if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) { - panic("errors: *target must be interface or implement error") - } - targetType := typ.Elem() - for err != nil { - if reflect.TypeOf(err).AssignableTo(targetType) { - val.Elem().Set(reflect.ValueOf(err)) - return true - } - if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { - return true - } - err = Unwrap(err) - } - return false -} - -var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md index 608aa6e1ac..2079de7b0e 100644 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -1,73 +1,159 @@ # How to contribute -We definitely welcome your patches and contributions to gRPC! Please read the gRPC -organization's [governance rules](https://github.com/grpc/grpc-community/blob/master/governance.md) -and [contribution guidelines](https://github.com/grpc/grpc-community/blob/master/CONTRIBUTING.md) before proceeding. +We welcome your patches and contributions to gRPC! Please read the gRPC +organization's [governance +rules](https://github.com/grpc/grpc-community/blob/master/governance.md) before +proceeding. -If you are new to github, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) +If you are new to GitHub, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) ## Legal requirements In order to protect both you and ourselves, you will need to sign the -[Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf). +[Contributor License +Agreement](https://identity.linuxfoundation.org/projects/cncf). When you create +your first PR, a link will be added as a comment that contains the steps needed +to complete this process. + +## Getting Started + +A great way to start is by searching through our open issues. [Unassigned issues +labeled as "help +wanted"](https://github.com/grpc/grpc-go/issues?q=sort%3Aupdated-desc%20is%3Aissue%20is%3Aopen%20label%3A%22Status%3A%20Help%20Wanted%22%20no%3Aassignee) +are especially nice for first-time contributors, as they should be well-defined +problems that already have agreed-upon solutions. + +## Code Style + +We follow [Google's published Go style +guide](https://google.github.io/styleguide/go/). Note that there are three +primary documents that make up this style guide; please follow them as closely +as possible. If a reviewer recommends something that contradicts those +guidelines, there may be valid reasons to do so, but it should be rare. ## Guidelines for Pull Requests -How to get your contributions merged smoothly and quickly. + +Please read the following carefully to ensure your contributions can be merged +smoothly and quickly. + +### PR Contents - Create **small PRs** that are narrowly focused on **addressing a single - concern**. We often times receive PRs that are trying to fix several things at - a time, but only one fix is considered acceptable, nothing gets merged and - both author's & review's time is wasted. Create more PRs to address different - concerns and everyone will be happy. + concern**. We often receive PRs that attempt to fix several things at the same + time, and if one part of the PR has a problem, that will hold up the entire + PR. + +- If your change does not address an **open issue** with an **agreed + resolution**, consider opening an issue and discussing it first. If you are + suggesting a behavioral or API change, consider starting with a [gRFC + proposal](https://github.com/grpc/proposal). Many new features that are not + bug fixes will require cross-language agreement. + +- If you want to fix **formatting or style**, consider whether your changes are + an obvious improvement or might be considered a personal preference. If a + style change is based on preference, it likely will not be accepted. If it + corrects widely agreed-upon anti-patterns, then please do create a PR and + explain the benefits of the change. + +- For correcting **misspellings**, please be aware that we use some terms that + are sometimes flagged by spell checkers. As an example, "if an only if" is + often written as "iff". Please do not make spelling correction changes unless + you are certain they are misspellings. + +- **All tests need to be passing** before your change can be merged. We + recommend you run tests locally before creating your PR to catch breakages + early on: -- If you are searching for features to work on, issues labeled [Status: Help - Wanted](https://github.com/grpc/grpc-go/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Status%3A+Help+Wanted%22) - is a great place to start. These issues are well-documented and usually can be - resolved with a single pull request. + - `./scripts/vet.sh` to catch vet errors. + - `go test -cpu 1,4 -timeout 7m ./...` to run the tests. + - `go test -race -cpu 1,4 -timeout 7m ./...` to run tests in race mode. -- If you are adding a new file, make sure it has the copyright message template - at the top as a comment. You can copy over the message from an existing file - and update the year. + Note that we have a multi-module repo, so `go test` commands may need to be + run from the root of each module in order to cause all tests to run. + + *Alternatively*, you may find it easier to push your changes to your fork on + GitHub, which will trigger a GitHub Actions run that you can use to verify + everything is passing. + +- Note that there are two GitHub actions checks that need not be green: + + 1. We test the freshness of the generated proto code we maintain via the + `vet-proto` check. If the source proto files are updated, but our repo is + not updated, an optional checker will fail. This will be fixed by our team + in a separate PR and will not prevent the merge of your PR. + + 2. We run a checker that will fail if there is any change in dependencies of + an exported package via the `dependencies` check. If new dependencies are + added that are not appropriate, we may not accept your PR (see below). + +- If you are adding a **new file**, make sure it has the **copyright message** + template at the top as a comment. You can copy the message from an existing + file and update the year. - The grpc package should only depend on standard Go packages and a small number - of exceptions. If your contribution introduces new dependencies which are NOT - in the [list](https://godoc.org/google.golang.org/grpc?imports), you need a - discussion with gRPC-Go authors and consultants. + of exceptions. **If your contribution introduces new dependencies**, you will + need a discussion with gRPC-Go maintainers. -- For speculative changes, consider opening an issue and discussing it first. If - you are suggesting a behavioral or API change, consider starting with a [gRFC - proposal](https://github.com/grpc/proposal). +### PR Descriptions -- Provide a good **PR description** as a record of **what** change is being made - and **why** it was made. Link to a github issue if it exists. +- **PR titles** should start with the name of the component being addressed, or + the type of change. Examples: transport, client, server, round_robin, xds, + cleanup, deps. -- If you want to fix formatting or style, consider whether your changes are an - obvious improvement or might be considered a personal preference. If a style - change is based on preference, it likely will not be accepted. If it corrects - widely agreed-upon anti-patterns, then please do create a PR and explain the - benefits of the change. +- Read and follow the **guidelines for PR titles and descriptions** here: + https://google.github.io/eng-practices/review/developer/cl-descriptions.html -- Unless your PR is trivial, you should expect there will be reviewer comments - that you'll need to address before merging. We'll mark it as `Status: Requires - Reporter Clarification` if we expect you to respond to these comments in a - timely manner. If the PR remains inactive for 6 days, it will be marked as - `stale` and automatically close 7 days after that if we don't hear back from - you. + *particularly* the sections "First Line" and "Body is Informative". -- Maintain **clean commit history** and use **meaningful commit messages**. PRs - with messy commit history are difficult to review and won't be merged. Use - `rebase -i upstream/master` to curate your commit history and/or to bring in - latest changes from master (but avoid rebasing in the middle of a code - review). + Note: your PR description will be used as the git commit message in a + squash-and-merge if your PR is approved. We may make changes to this as + necessary. -- Keep your PR up to date with upstream/master (if there are merge conflicts, we - can't really merge your change). +- **Does this PR relate to an open issue?** On the first line, please use the + tag `Fixes #` to ensure the issue is closed when the PR is merged. Or + use `Updates #` if the PR is related to an open issue, but does not fix + it. Consider filing an issue if one does not already exist. -- **All tests need to be passing** before your change can be merged. We - recommend you **run tests locally** before creating your PR to catch breakages - early on. - - `VET_SKIP_PROTO=1 ./vet.sh` to catch vet errors - - `go test -cpu 1,4 -timeout 7m ./...` to run the tests - - `go test -race -cpu 1,4 -timeout 7m ./...` to run tests in race mode +- PR descriptions *must* conclude with **release notes** as follows: + + ``` + RELEASE NOTES: + * :

+ ``` + + This need not match the PR title. + + The summary must: + + * be something that gRPC users will understand. + + * clearly explain the feature being added, the issue being fixed, or the + behavior being changed, etc. If fixing a bug, be clear about how the bug + can be triggered by an end-user. + + * begin with a capital letter and use complete sentences. -- Exceptions to the rules can be made if there's a compelling reason for doing so. + * be as short as possible to describe the change being made. + + If a PR is *not* end-user visible -- e.g. a cleanup, testing change, or + GitHub-related, use `RELEASE NOTES: n/a`. + +### PR Process + +- Please **self-review** your code changes before sending your PR. This will + prevent simple, obvious errors from causing delays. + +- Maintain a **clean commit history** and use **meaningful commit messages**. + PRs with messy commit histories are difficult to review and won't be merged. + Before sending your PR, ensure your changes are based on top of the latest + `upstream/master` commits, and avoid rebasing in the middle of a code review. + You should **never use `git push -f`** unless absolutely necessary during a + review, as it can interfere with GitHub's tracking of comments. + +- Unless your PR is trivial, you should **expect reviewer comments** that you + will need to address before merging. We'll label the PR as `Status: Requires + Reporter Clarification` if we expect you to respond to these comments in a + timely manner. If the PR remains inactive for 6 days, it will be marked as + `stale`, and we will automatically close it after 7 days if we don't hear back + from you. Please feel free to ping issues or bugs if you do not get a response + within a week. diff --git a/vendor/google.golang.org/grpc/MAINTAINERS.md b/vendor/google.golang.org/grpc/MAINTAINERS.md index c6672c0a3e..df35bb9a88 100644 --- a/vendor/google.golang.org/grpc/MAINTAINERS.md +++ b/vendor/google.golang.org/grpc/MAINTAINERS.md @@ -9,20 +9,28 @@ for general contribution guidelines. ## Maintainers (in alphabetical order) -- [cesarghali](https://github.com/cesarghali), Google LLC +- [arjan-bal](https://github.com/arjan-bal), Google LLC +- [arvindbr8](https://github.com/arvindbr8), Google LLC +- [atollena](https://github.com/atollena), Datadog, Inc. - [dfawley](https://github.com/dfawley), Google LLC - [easwars](https://github.com/easwars), Google LLC -- [menghanl](https://github.com/menghanl), Google LLC -- [srini100](https://github.com/srini100), Google LLC +- [gtcooke94](https://github.com/gtcooke94), Google LLC ## Emeritus Maintainers (in alphabetical order) -- [adelez](https://github.com/adelez), Google LLC -- [canguler](https://github.com/canguler), Google LLC -- [iamqizhao](https://github.com/iamqizhao), Google LLC -- [jadekler](https://github.com/jadekler), Google LLC -- [jtattermusch](https://github.com/jtattermusch), Google LLC -- [lyuxuan](https://github.com/lyuxuan), Google LLC -- [makmukhi](https://github.com/makmukhi), Google LLC -- [matt-kwong](https://github.com/matt-kwong), Google LLC -- [nicolasnoble](https://github.com/nicolasnoble), Google LLC -- [yongni](https://github.com/yongni), Google LLC +- [adelez](https://github.com/adelez) +- [aranjans](https://github.com/aranjans) +- [canguler](https://github.com/canguler) +- [cesarghali](https://github.com/cesarghali) +- [erm-g](https://github.com/erm-g) +- [iamqizhao](https://github.com/iamqizhao) +- [jeanbza](https://github.com/jeanbza) +- [jtattermusch](https://github.com/jtattermusch) +- [lyuxuan](https://github.com/lyuxuan) +- [makmukhi](https://github.com/makmukhi) +- [matt-kwong](https://github.com/matt-kwong) +- [menghanl](https://github.com/menghanl) +- [nicolasnoble](https://github.com/nicolasnoble) +- [purnesh42h](https://github.com/purnesh42h) +- [srini100](https://github.com/srini100) +- [yongni](https://github.com/yongni) +- [zasweq](https://github.com/zasweq) diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile index 1f8960922b..be38384ff6 100644 --- a/vendor/google.golang.org/grpc/Makefile +++ b/vendor/google.golang.org/grpc/Makefile @@ -30,17 +30,20 @@ testdeps: GO111MODULE=on go get -d -v -t google.golang.org/grpc/... vet: vetdeps - ./vet.sh + ./scripts/vet.sh vetdeps: - ./vet.sh -install + ./scripts/vet.sh -install .PHONY: \ all \ build \ clean \ + deps \ proto \ test \ + testsubmodule \ testrace \ + testdeps \ vet \ vetdeps diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md index ab0fbb79b8..f9a88d597e 100644 --- a/vendor/google.golang.org/grpc/README.md +++ b/vendor/google.golang.org/grpc/README.md @@ -10,7 +10,7 @@ RPC framework that puts mobile and HTTP/2 first. For more information see the ## Prerequisites -- **[Go][]**: any one of the **three latest major** [releases][go-releases]. +- **[Go][]**: any one of the **two latest major** [releases][go-releases]. ## Installation @@ -32,6 +32,7 @@ import "google.golang.org/grpc" - [Low-level technical docs](Documentation) from this repository - [Performance benchmark][] - [Examples](examples) +- [Contribution guidelines](CONTRIBUTING.md) ## FAQ diff --git a/vendor/google.golang.org/grpc/SECURITY.md b/vendor/google.golang.org/grpc/SECURITY.md index be6e108705..abab279379 100644 --- a/vendor/google.golang.org/grpc/SECURITY.md +++ b/vendor/google.golang.org/grpc/SECURITY.md @@ -1,3 +1,3 @@ # Security Policy -For information on gRPC Security Policy and reporting potentional security issues, please see [gRPC CVE Process](https://github.com/grpc/proposal/blob/master/P4-grpc-cve-process.md). +For information on gRPC Security Policy and reporting potential security issues, please see [gRPC CVE Process](https://github.com/grpc/proposal/blob/master/P4-grpc-cve-process.md). diff --git a/vendor/google.golang.org/grpc/backoff/backoff.go b/vendor/google.golang.org/grpc/backoff/backoff.go index 0787d0b50c..d7b40b7cb6 100644 --- a/vendor/google.golang.org/grpc/backoff/backoff.go +++ b/vendor/google.golang.org/grpc/backoff/backoff.go @@ -39,7 +39,7 @@ type Config struct { MaxDelay time.Duration } -// DefaultConfig is a backoff configuration with the default values specfied +// DefaultConfig is a backoff configuration with the default values specified // at https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. // // This should be useful for callers who want to configure backoff with diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go index f391744f72..b1264017db 100644 --- a/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -30,6 +30,7 @@ import ( "google.golang.org/grpc/channelz" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/credentials" + estats "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal" "google.golang.org/grpc/metadata" @@ -74,6 +75,8 @@ func unregisterForTesting(name string) { func init() { internal.BalancerUnregister = unregisterForTesting + internal.ConnectedAddress = connectedAddress + internal.SetConnectedAddress = setConnectedAddress } // Get returns the resolver builder registered with the given name. @@ -92,54 +95,6 @@ func Get(name string) Builder { return nil } -// A SubConn represents a single connection to a gRPC backend service. -// -// Each SubConn contains a list of addresses. -// -// All SubConns start in IDLE, and will not try to connect. To trigger the -// connecting, Balancers must call Connect. If a connection re-enters IDLE, -// Balancers must call Connect again to trigger a new connection attempt. -// -// gRPC will try to connect to the addresses in sequence, and stop trying the -// remainder once the first connection is successful. If an attempt to connect -// to all addresses encounters an error, the SubConn will enter -// TRANSIENT_FAILURE for a backoff period, and then transition to IDLE. -// -// Once established, if a connection is lost, the SubConn will transition -// directly to IDLE. -// -// This interface is to be implemented by gRPC. Users should not need their own -// implementation of this interface. For situations like testing, any -// implementations should embed this interface. This allows gRPC to add new -// methods to this interface. -type SubConn interface { - // UpdateAddresses updates the addresses used in this SubConn. - // gRPC checks if currently-connected address is still in the new list. - // If it's in the list, the connection will be kept. - // If it's not in the list, the connection will gracefully closed, and - // a new connection will be created. - // - // This will trigger a state transition for the SubConn. - // - // Deprecated: this method will be removed. Create new SubConns for new - // addresses instead. - UpdateAddresses([]resolver.Address) - // Connect starts the connecting for this SubConn. - Connect() - // GetOrBuildProducer returns a reference to the existing Producer for this - // ProducerBuilder in this SubConn, or, if one does not currently exist, - // creates a new one and returns it. Returns a close function which must - // be called when the Producer is no longer needed. - GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) - // Shutdown shuts down the SubConn gracefully. Any started RPCs will be - // allowed to complete. No future calls should be made on the SubConn. - // One final state update will be delivered to the StateListener (or - // UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to - // indicate the shutdown operation. This may be delivered before - // in-progress RPCs are complete and the actual connection is closed. - Shutdown() -} - // NewSubConnOptions contains options to create new SubConn. type NewSubConnOptions struct { // CredsBundle is the credentials bundle that will be used in the created @@ -174,6 +129,13 @@ type State struct { // brand new implementation of this interface. For the situations like // testing, the new implementation should embed this interface. This allows // gRPC to add new methods to this interface. +// +// NOTICE: This interface is intended to be implemented by gRPC, or intercepted +// by custom load balancing polices. Users should not need their own complete +// implementation of this interface -- they should always delegate to a +// ClientConn passed to Builder.Build() by embedding it in their +// implementations. An embedded ClientConn must never be nil, or runtime panics +// will occur. type ClientConn interface { // NewSubConn is called by balancer to create a new SubConn. // It doesn't block and wait for the connections to be established. @@ -212,6 +174,17 @@ type ClientConn interface { // // Deprecated: Use the Target field in the BuildOptions instead. Target() string + + // MetricsRecorder provides the metrics recorder that balancers can use to + // record metrics. Balancer implementations which do not register metrics on + // metrics registry and record on them can ignore this method. The returned + // MetricsRecorder is guaranteed to never be nil. + MetricsRecorder() estats.MetricsRecorder + + // EnforceClientConnEmbedding is included to force implementers to embed + // another implementation of this interface, allowing gRPC to add methods + // without breaking users. + internal.EnforceClientConnEmbedding } // BuildOptions contains additional information for Build. @@ -387,6 +360,10 @@ type Balancer interface { // call SubConn.Shutdown for its existing SubConns; however, this will be // required in a future release, so it is recommended. Close() + // ExitIdle instructs the LB policy to reconnect to backends / exit the + // IDLE state, if appropriate and possible. Note that SubConns that enter + // the IDLE state will not reconnect until SubConn.Connect is called. + ExitIdle() } // ExitIdler is an optional interface for balancers to implement. If @@ -394,8 +371,8 @@ type Balancer interface { // the ClientConn is idle. If unimplemented, ClientConn.Connect will cause // all SubConns to connect. // -// Notice: it will be required for all balancers to implement this in a future -// release. +// Deprecated: All balancers must implement this interface. This interface will +// be removed in a future release. type ExitIdler interface { // ExitIdle instructs the LB policy to reconnect to backends / exit the // IDLE state, if appropriate and possible. Note that SubConns that enter @@ -403,15 +380,6 @@ type ExitIdler interface { ExitIdle() } -// SubConnState describes the state of a SubConn. -type SubConnState struct { - // ConnectivityState is the connectivity state of the SubConn. - ConnectivityState connectivity.State - // ConnectionError is set if the ConnectivityState is TransientFailure, - // describing the reason the SubConn failed. Otherwise, it is nil. - ConnectionError error -} - // ClientConnState describes the state of a ClientConn relevant to the // balancer. type ClientConnState struct { @@ -424,20 +392,3 @@ type ClientConnState struct { // ErrBadResolverState may be returned by UpdateClientConnState to indicate a // problem with the provided name resolver data. var ErrBadResolverState = errors.New("bad resolver state") - -// A ProducerBuilder is a simple constructor for a Producer. It is used by the -// SubConn to create producers when needed. -type ProducerBuilder interface { - // Build creates a Producer. The first parameter is always a - // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the - // associated SubConn), but is declared as `any` to avoid a dependency - // cycle. Should also return a close function that will be called when all - // references to the Producer have been given up. - Build(grpcClientConnInterface any) (p Producer, close func()) -} - -// A Producer is a type shared among potentially many consumers. It is -// associated with a SubConn, and an implementation will typically contain -// other methods to provide additional functionality, e.g. configuration or -// subscription registration. -type Producer any diff --git a/vendor/google.golang.org/grpc/balancer/base/balancer.go b/vendor/google.golang.org/grpc/balancer/base/balancer.go index a7f1eeec8e..4d576876d8 100644 --- a/vendor/google.golang.org/grpc/balancer/base/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/base/balancer.go @@ -36,12 +36,12 @@ type baseBuilder struct { config Config } -func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { +func (bb *baseBuilder) Build(cc balancer.ClientConn, _ balancer.BuildOptions) balancer.Balancer { bal := &baseBalancer{ cc: cc, pickerBuilder: bb.pickerBuilder, - subConns: resolver.NewAddressMap(), + subConns: resolver.NewAddressMapV2[balancer.SubConn](), scStates: make(map[balancer.SubConn]connectivity.State), csEvltr: &balancer.ConnectivityStateEvaluator{}, config: bb.config, @@ -65,7 +65,7 @@ type baseBalancer struct { csEvltr *balancer.ConnectivityStateEvaluator state connectivity.State - subConns *resolver.AddressMap + subConns *resolver.AddressMapV2[balancer.SubConn] scStates map[balancer.SubConn]connectivity.State picker balancer.Picker config Config @@ -100,7 +100,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { // Successful resolution; clear resolver error and ensure we return nil. b.resolverErr = nil // addrsSet is the set converted from addrs, it's used for quick lookup of an address. - addrsSet := resolver.NewAddressMap() + addrsSet := resolver.NewAddressMapV2[any]() for _, a := range s.ResolverState.Addresses { addrsSet.Set(a, nil) if _, ok := b.subConns.Get(a); !ok { @@ -122,8 +122,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { } } for _, a := range b.subConns.Keys() { - sci, _ := b.subConns.Get(a) - sc := sci.(balancer.SubConn) + sc, _ := b.subConns.Get(a) // a was removed by resolver. if _, ok := addrsSet.Get(a); !ok { sc.Shutdown() @@ -133,7 +132,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { } } // If resolver state contains no addresses, return an error so ClientConn - // will trigger re-resolve. Also records this as an resolver error, so when + // will trigger re-resolve. Also records this as a resolver error, so when // the overall state turns transient failure, the error message will have // the zero address information. if len(s.ResolverState.Addresses) == 0 { @@ -173,8 +172,7 @@ func (b *baseBalancer) regeneratePicker() { // Filter out all ready SCs from full subConn map. for _, addr := range b.subConns.Keys() { - sci, _ := b.subConns.Get(addr) - sc := sci.(balancer.SubConn) + sc, _ := b.subConns.Get(addr) if st, ok := b.scStates[sc]; ok && st == connectivity.Ready { readySCs[sc] = SubConnInfo{Address: addr} } @@ -259,6 +257,6 @@ type errPicker struct { err error // Pick() always returns this err. } -func (p *errPicker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { +func (p *errPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { return balancer.PickResult{}, p.err } diff --git a/vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.go b/vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.go new file mode 100644 index 0000000000..360db08ebc --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.go @@ -0,0 +1,389 @@ +/* + * + * Copyright 2024 gRPC 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 endpointsharding implements a load balancing policy that manages +// homogeneous child policies each owning a single endpoint. +// +// # Experimental +// +// Notice: This package is EXPERIMENTAL and may be changed or removed in a +// later release. +package endpointsharding + +import ( + "errors" + rand "math/rand/v2" + "sync" + "sync/atomic" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/resolver" +) + +var randIntN = rand.IntN + +// ChildState is the balancer state of a child along with the endpoint which +// identifies the child balancer. +type ChildState struct { + Endpoint resolver.Endpoint + State balancer.State + + // Balancer exposes only the ExitIdler interface of the child LB policy. + // Other methods of the child policy are called only by endpointsharding. + Balancer ExitIdler +} + +// ExitIdler provides access to only the ExitIdle method of the child balancer. +type ExitIdler interface { + // ExitIdle instructs the LB policy to reconnect to backends / exit the + // IDLE state, if appropriate and possible. Note that SubConns that enter + // the IDLE state will not reconnect until SubConn.Connect is called. + ExitIdle() +} + +// Options are the options to configure the behaviour of the +// endpointsharding balancer. +type Options struct { + // DisableAutoReconnect allows the balancer to keep child balancer in the + // IDLE state until they are explicitly triggered to exit using the + // ChildState obtained from the endpointsharding picker. When set to false, + // the endpointsharding balancer will automatically call ExitIdle on child + // connections that report IDLE. + DisableAutoReconnect bool +} + +// ChildBuilderFunc creates a new balancer with the ClientConn. It has the same +// type as the balancer.Builder.Build method. +type ChildBuilderFunc func(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer + +// NewBalancer returns a load balancing policy that manages homogeneous child +// policies each owning a single endpoint. The endpointsharding balancer +// forwards the LoadBalancingConfig in ClientConn state updates to its children. +func NewBalancer(cc balancer.ClientConn, opts balancer.BuildOptions, childBuilder ChildBuilderFunc, esOpts Options) balancer.Balancer { + es := &endpointSharding{ + cc: cc, + bOpts: opts, + esOpts: esOpts, + childBuilder: childBuilder, + } + es.children.Store(resolver.NewEndpointMap[*balancerWrapper]()) + return es +} + +// endpointSharding is a balancer that wraps child balancers. It creates a child +// balancer with child config for every unique Endpoint received. It updates the +// child states on any update from parent or child. +type endpointSharding struct { + cc balancer.ClientConn + bOpts balancer.BuildOptions + esOpts Options + childBuilder ChildBuilderFunc + + // childMu synchronizes calls to any single child. It must be held for all + // calls into a child. To avoid deadlocks, do not acquire childMu while + // holding mu. + childMu sync.Mutex + children atomic.Pointer[resolver.EndpointMap[*balancerWrapper]] + + // inhibitChildUpdates is set during UpdateClientConnState/ResolverError + // calls (calls to children will each produce an update, only want one + // update). + inhibitChildUpdates atomic.Bool + + // mu synchronizes access to the state stored in balancerWrappers in the + // children field. mu must not be held during calls into a child since + // synchronous calls back from the child may require taking mu, causing a + // deadlock. To avoid deadlocks, do not acquire childMu while holding mu. + mu sync.Mutex +} + +// rotateEndpoints returns a slice of all the input endpoints rotated a random +// amount. +func rotateEndpoints(es []resolver.Endpoint) []resolver.Endpoint { + les := len(es) + if les == 0 { + return es + } + r := randIntN(les) + // Make a copy to avoid mutating data beyond the end of es. + ret := make([]resolver.Endpoint, les) + copy(ret, es[r:]) + copy(ret[les-r:], es[:r]) + return ret +} + +// UpdateClientConnState creates a child for new endpoints and deletes children +// for endpoints that are no longer present. It also updates all the children, +// and sends a single synchronous update of the childrens' aggregated state at +// the end of the UpdateClientConnState operation. If any endpoint has no +// addresses it will ignore that endpoint. Otherwise, returns first error found +// from a child, but fully processes the new update. +func (es *endpointSharding) UpdateClientConnState(state balancer.ClientConnState) error { + es.childMu.Lock() + defer es.childMu.Unlock() + + es.inhibitChildUpdates.Store(true) + defer func() { + es.inhibitChildUpdates.Store(false) + es.updateState() + }() + var ret error + + children := es.children.Load() + newChildren := resolver.NewEndpointMap[*balancerWrapper]() + + // Update/Create new children. + for _, endpoint := range rotateEndpoints(state.ResolverState.Endpoints) { + if _, ok := newChildren.Get(endpoint); ok { + // Endpoint child was already created, continue to avoid duplicate + // update. + continue + } + childBalancer, ok := children.Get(endpoint) + if ok { + // Endpoint attributes may have changed, update the stored endpoint. + es.mu.Lock() + childBalancer.childState.Endpoint = endpoint + es.mu.Unlock() + } else { + childBalancer = &balancerWrapper{ + childState: ChildState{Endpoint: endpoint}, + ClientConn: es.cc, + es: es, + } + childBalancer.childState.Balancer = childBalancer + childBalancer.child = es.childBuilder(childBalancer, es.bOpts) + } + newChildren.Set(endpoint, childBalancer) + if err := childBalancer.updateClientConnStateLocked(balancer.ClientConnState{ + BalancerConfig: state.BalancerConfig, + ResolverState: resolver.State{ + Endpoints: []resolver.Endpoint{endpoint}, + Attributes: state.ResolverState.Attributes, + }, + }); err != nil && ret == nil { + // Return first error found, and always commit full processing of + // updating children. If desired to process more specific errors + // across all endpoints, caller should make these specific + // validations, this is a current limitation for simplicity sake. + ret = err + } + } + // Delete old children that are no longer present. + for _, e := range children.Keys() { + child, _ := children.Get(e) + if _, ok := newChildren.Get(e); !ok { + child.closeLocked() + } + } + es.children.Store(newChildren) + if newChildren.Len() == 0 { + return balancer.ErrBadResolverState + } + return ret +} + +// ResolverError forwards the resolver error to all of the endpointSharding's +// children and sends a single synchronous update of the childStates at the end +// of the ResolverError operation. +func (es *endpointSharding) ResolverError(err error) { + es.childMu.Lock() + defer es.childMu.Unlock() + es.inhibitChildUpdates.Store(true) + defer func() { + es.inhibitChildUpdates.Store(false) + es.updateState() + }() + children := es.children.Load() + for _, child := range children.Values() { + child.resolverErrorLocked(err) + } +} + +func (es *endpointSharding) UpdateSubConnState(balancer.SubConn, balancer.SubConnState) { + // UpdateSubConnState is deprecated. +} + +func (es *endpointSharding) Close() { + es.childMu.Lock() + defer es.childMu.Unlock() + children := es.children.Load() + for _, child := range children.Values() { + child.closeLocked() + } +} + +func (es *endpointSharding) ExitIdle() { + es.childMu.Lock() + defer es.childMu.Unlock() + for _, bw := range es.children.Load().Values() { + if !bw.isClosed { + bw.child.ExitIdle() + } + } +} + +// updateState updates this component's state. It sends the aggregated state, +// and a picker with round robin behavior with all the child states present if +// needed. +func (es *endpointSharding) updateState() { + if es.inhibitChildUpdates.Load() { + return + } + var readyPickers, connectingPickers, idlePickers, transientFailurePickers []balancer.Picker + + es.mu.Lock() + defer es.mu.Unlock() + + children := es.children.Load() + childStates := make([]ChildState, 0, children.Len()) + + for _, child := range children.Values() { + childState := child.childState + childStates = append(childStates, childState) + childPicker := childState.State.Picker + switch childState.State.ConnectivityState { + case connectivity.Ready: + readyPickers = append(readyPickers, childPicker) + case connectivity.Connecting: + connectingPickers = append(connectingPickers, childPicker) + case connectivity.Idle: + idlePickers = append(idlePickers, childPicker) + case connectivity.TransientFailure: + transientFailurePickers = append(transientFailurePickers, childPicker) + // connectivity.Shutdown shouldn't appear. + } + } + + // Construct the round robin picker based off the aggregated state. Whatever + // the aggregated state, use the pickers present that are currently in that + // state only. + var aggState connectivity.State + var pickers []balancer.Picker + if len(readyPickers) >= 1 { + aggState = connectivity.Ready + pickers = readyPickers + } else if len(connectingPickers) >= 1 { + aggState = connectivity.Connecting + pickers = connectingPickers + } else if len(idlePickers) >= 1 { + aggState = connectivity.Idle + pickers = idlePickers + } else if len(transientFailurePickers) >= 1 { + aggState = connectivity.TransientFailure + pickers = transientFailurePickers + } else { + aggState = connectivity.TransientFailure + pickers = []balancer.Picker{base.NewErrPicker(errors.New("no children to pick from"))} + } // No children (resolver error before valid update). + p := &pickerWithChildStates{ + pickers: pickers, + childStates: childStates, + next: uint32(randIntN(len(pickers))), + } + es.cc.UpdateState(balancer.State{ + ConnectivityState: aggState, + Picker: p, + }) +} + +// pickerWithChildStates delegates to the pickers it holds in a round robin +// fashion. It also contains the childStates of all the endpointSharding's +// children. +type pickerWithChildStates struct { + pickers []balancer.Picker + childStates []ChildState + next uint32 +} + +func (p *pickerWithChildStates) Pick(info balancer.PickInfo) (balancer.PickResult, error) { + nextIndex := atomic.AddUint32(&p.next, 1) + picker := p.pickers[nextIndex%uint32(len(p.pickers))] + return picker.Pick(info) +} + +// ChildStatesFromPicker returns the state of all the children managed by the +// endpoint sharding balancer that created this picker. +func ChildStatesFromPicker(picker balancer.Picker) []ChildState { + p, ok := picker.(*pickerWithChildStates) + if !ok { + return nil + } + return p.childStates +} + +// balancerWrapper is a wrapper of a balancer. It ID's a child balancer by +// endpoint, and persists recent child balancer state. +type balancerWrapper struct { + // The following fields are initialized at build time and read-only after + // that and therefore do not need to be guarded by a mutex. + + // child contains the wrapped balancer. Access its methods only through + // methods on balancerWrapper to ensure proper synchronization + child balancer.Balancer + balancer.ClientConn // embed to intercept UpdateState, doesn't deal with SubConns + + es *endpointSharding + + // Access to the following fields is guarded by es.mu. + + childState ChildState + isClosed bool +} + +func (bw *balancerWrapper) UpdateState(state balancer.State) { + bw.es.mu.Lock() + bw.childState.State = state + bw.es.mu.Unlock() + if state.ConnectivityState == connectivity.Idle && !bw.es.esOpts.DisableAutoReconnect { + bw.ExitIdle() + } + bw.es.updateState() +} + +// ExitIdle pings an IDLE child balancer to exit idle in a new goroutine to +// avoid deadlocks due to synchronous balancer state updates. +func (bw *balancerWrapper) ExitIdle() { + go func() { + bw.es.childMu.Lock() + if !bw.isClosed { + bw.child.ExitIdle() + } + bw.es.childMu.Unlock() + }() +} + +// updateClientConnStateLocked delivers the ClientConnState to the child +// balancer. Callers must hold the child mutex of the parent endpointsharding +// balancer. +func (bw *balancerWrapper) updateClientConnStateLocked(ccs balancer.ClientConnState) error { + return bw.child.UpdateClientConnState(ccs) +} + +// closeLocked closes the child balancer. Callers must hold the child mutext of +// the parent endpointsharding balancer. +func (bw *balancerWrapper) closeLocked() { + bw.child.Close() + bw.isClosed = true +} + +func (bw *balancerWrapper) resolverErrorLocked(err error) { + bw.child.ResolverError(err) +} diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go new file mode 100644 index 0000000000..7d66cb491c --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go @@ -0,0 +1,35 @@ +/* + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains code internal to the pickfirst package. +package internal + +import ( + rand "math/rand/v2" + "time" +) + +var ( + // RandShuffle pseudo-randomizes the order of addresses. + RandShuffle = rand.Shuffle + // TimeAfterFunc allows mocking the timer for testing connection delay + // related functionality. + TimeAfterFunc = func(d time.Duration, f func()) func() { + timer := time.AfterFunc(d, f) + return func() { timer.Stop() } + } +) diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go similarity index 70% rename from vendor/google.golang.org/grpc/pickfirst.go rename to vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go index e3ea42ba96..b15c10e46b 100644 --- a/vendor/google.golang.org/grpc/pickfirst.go +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go @@ -16,45 +16,60 @@ * */ -package grpc +// Package pickfirst contains the pick_first load balancing policy. +package pickfirst import ( "encoding/json" "errors" "fmt" + rand "math/rand/v2" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst/internal" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/envconfig" internalgrpclog "google.golang.org/grpc/internal/grpclog" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/pretty" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" + + _ "google.golang.org/grpc/balancer/pickfirst/pickfirstleaf" // For automatically registering the new pickfirst if required. ) +func init() { + if envconfig.NewPickFirstEnabled { + return + } + balancer.Register(pickfirstBuilder{}) +} + +var logger = grpclog.Component("pick-first-lb") + const ( - // PickFirstBalancerName is the name of the pick_first balancer. - PickFirstBalancerName = "pick_first" - logPrefix = "[pick-first-lb %p] " + // Name is the name of the pick_first balancer. + Name = "pick_first" + logPrefix = "[pick-first-lb %p] " ) type pickfirstBuilder struct{} -func (pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { +func (pickfirstBuilder) Build(cc balancer.ClientConn, _ balancer.BuildOptions) balancer.Balancer { b := &pickfirstBalancer{cc: cc} b.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf(logPrefix, b)) return b } func (pickfirstBuilder) Name() string { - return PickFirstBalancerName + return Name } type pfConfig struct { serviceconfig.LoadBalancingConfig `json:"-"` // If set to true, instructs the LB policy to shuffle the order of the list - // of addresses received from the name resolver before attempting to + // of endpoints received from the name resolver before attempting to // connect to them. ShuffleAddressList bool `json:"shuffleAddressList"` } @@ -93,9 +108,17 @@ func (b *pickfirstBalancer) ResolverError(err error) { }) } +// Shuffler is an interface for shuffling an address list. +type Shuffler interface { + ShuffleAddressListForTesting(n int, swap func(i, j int)) +} + +// ShuffleAddressListForTesting pseudo-randomizes the order of addresses. n +// is the number of elements. swap swaps the elements with indexes i and j. +func ShuffleAddressListForTesting(n int, swap func(i, j int)) { rand.Shuffle(n, swap) } + func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { - addrs := state.ResolverState.Addresses - if len(addrs) == 0 { + if len(state.ResolverState.Addresses) == 0 && len(state.ResolverState.Endpoints) == 0 { // The resolver reported an empty address list. Treat it like an error by // calling b.ResolverError. if b.subConn != nil { @@ -107,22 +130,49 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState b.ResolverError(errors.New("produced zero addresses")) return balancer.ErrBadResolverState } - // We don't have to guard this block with the env var because ParseConfig // already does so. cfg, ok := state.BalancerConfig.(pfConfig) if state.BalancerConfig != nil && !ok { return fmt.Errorf("pickfirst: received illegal BalancerConfig (type %T): %v", state.BalancerConfig, state.BalancerConfig) } - if cfg.ShuffleAddressList { - addrs = append([]resolver.Address{}, addrs...) - grpcrand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) - } if b.logger.V(2) { b.logger.Infof("Received new config %s, resolver state %s", pretty.ToJSON(cfg), pretty.ToJSON(state.ResolverState)) } + var addrs []resolver.Address + if endpoints := state.ResolverState.Endpoints; len(endpoints) != 0 { + // Perform the optional shuffling described in gRFC A62. The shuffling will + // change the order of endpoints but not touch the order of the addresses + // within each endpoint. - A61 + if cfg.ShuffleAddressList { + endpoints = append([]resolver.Endpoint{}, endpoints...) + internal.RandShuffle(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + } + + // "Flatten the list by concatenating the ordered list of addresses for each + // of the endpoints, in order." - A61 + for _, endpoint := range endpoints { + // "In the flattened list, interleave addresses from the two address + // families, as per RFC-8304 section 4." - A61 + // TODO: support the above language. + addrs = append(addrs, endpoint.Addresses...) + } + } else { + // Endpoints not set, process addresses until we migrate resolver + // emissions fully to Endpoints. The top channel does wrap emitted + // addresses with endpoints, however some balancers such as weighted + // target do not forward the corresponding correct endpoints down/split + // endpoints properly. Once all balancers correctly forward endpoints + // down, can delete this else conditional. + addrs = state.ResolverState.Addresses + if cfg.ShuffleAddressList { + addrs = append([]resolver.Address{}, addrs...) + internal.RandShuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) + } + } + if b.subConn != nil { b.cc.UpdateAddresses(b.subConn, addrs) return nil diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go new file mode 100644 index 0000000000..9ffdd28a01 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go @@ -0,0 +1,913 @@ +/* + * + * Copyright 2024 gRPC 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 pickfirstleaf contains the pick_first load balancing policy which +// will be the universal leaf policy after dualstack changes are implemented. +// +// # Experimental +// +// Notice: This package is EXPERIMENTAL and may be changed or removed in a +// later release. +package pickfirstleaf + +import ( + "encoding/json" + "errors" + "fmt" + "net" + "net/netip" + "sync" + "time" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst/internal" + "google.golang.org/grpc/connectivity" + expstats "google.golang.org/grpc/experimental/stats" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/envconfig" + internalgrpclog "google.golang.org/grpc/internal/grpclog" + "google.golang.org/grpc/internal/pretty" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +func init() { + if envconfig.NewPickFirstEnabled { + // Register as the default pick_first balancer. + Name = "pick_first" + } + balancer.Register(pickfirstBuilder{}) +} + +// enableHealthListenerKeyType is a unique key type used in resolver +// attributes to indicate whether the health listener usage is enabled. +type enableHealthListenerKeyType struct{} + +var ( + logger = grpclog.Component("pick-first-leaf-lb") + // Name is the name of the pick_first_leaf balancer. + // It is changed to "pick_first" in init() if this balancer is to be + // registered as the default pickfirst. + Name = "pick_first_leaf" + disconnectionsMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.disconnections", + Description: "EXPERIMENTAL. Number of times the selected subchannel becomes disconnected.", + Unit: "{disconnection}", + Labels: []string{"grpc.target"}, + Default: false, + }) + connectionAttemptsSucceededMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.connection_attempts_succeeded", + Description: "EXPERIMENTAL. Number of successful connection attempts.", + Unit: "{attempt}", + Labels: []string{"grpc.target"}, + Default: false, + }) + connectionAttemptsFailedMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.connection_attempts_failed", + Description: "EXPERIMENTAL. Number of failed connection attempts.", + Unit: "{attempt}", + Labels: []string{"grpc.target"}, + Default: false, + }) +) + +const ( + // TODO: change to pick-first when this becomes the default pick_first policy. + logPrefix = "[pick-first-leaf-lb %p] " + // connectionDelayInterval is the time to wait for during the happy eyeballs + // pass before starting the next connection attempt. + connectionDelayInterval = 250 * time.Millisecond +) + +type ipAddrFamily int + +const ( + // ipAddrFamilyUnknown represents strings that can't be parsed as an IP + // address. + ipAddrFamilyUnknown ipAddrFamily = iota + ipAddrFamilyV4 + ipAddrFamilyV6 +) + +type pickfirstBuilder struct{} + +func (pickfirstBuilder) Build(cc balancer.ClientConn, bo balancer.BuildOptions) balancer.Balancer { + b := &pickfirstBalancer{ + cc: cc, + target: bo.Target.String(), + metricsRecorder: cc.MetricsRecorder(), + + subConns: resolver.NewAddressMapV2[*scData](), + state: connectivity.Connecting, + cancelConnectionTimer: func() {}, + } + b.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf(logPrefix, b)) + return b +} + +func (b pickfirstBuilder) Name() string { + return Name +} + +func (pickfirstBuilder) ParseConfig(js json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { + var cfg pfConfig + if err := json.Unmarshal(js, &cfg); err != nil { + return nil, fmt.Errorf("pickfirst: unable to unmarshal LB policy config: %s, error: %v", string(js), err) + } + return cfg, nil +} + +// EnableHealthListener updates the state to configure pickfirst for using a +// generic health listener. +func EnableHealthListener(state resolver.State) resolver.State { + state.Attributes = state.Attributes.WithValue(enableHealthListenerKeyType{}, true) + return state +} + +type pfConfig struct { + serviceconfig.LoadBalancingConfig `json:"-"` + + // If set to true, instructs the LB policy to shuffle the order of the list + // of endpoints received from the name resolver before attempting to + // connect to them. + ShuffleAddressList bool `json:"shuffleAddressList"` +} + +// scData keeps track of the current state of the subConn. +// It is not safe for concurrent access. +type scData struct { + // The following fields are initialized at build time and read-only after + // that. + subConn balancer.SubConn + addr resolver.Address + + rawConnectivityState connectivity.State + // The effective connectivity state based on raw connectivity, health state + // and after following sticky TransientFailure behaviour defined in A62. + effectiveState connectivity.State + lastErr error + connectionFailedInFirstPass bool +} + +func (b *pickfirstBalancer) newSCData(addr resolver.Address) (*scData, error) { + sd := &scData{ + rawConnectivityState: connectivity.Idle, + effectiveState: connectivity.Idle, + addr: addr, + } + sc, err := b.cc.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{ + StateListener: func(state balancer.SubConnState) { + b.updateSubConnState(sd, state) + }, + }) + if err != nil { + return nil, err + } + sd.subConn = sc + return sd, nil +} + +type pickfirstBalancer struct { + // The following fields are initialized at build time and read-only after + // that and therefore do not need to be guarded by a mutex. + logger *internalgrpclog.PrefixLogger + cc balancer.ClientConn + target string + metricsRecorder expstats.MetricsRecorder // guaranteed to be non nil + + // The mutex is used to ensure synchronization of updates triggered + // from the idle picker and the already serialized resolver, + // SubConn state updates. + mu sync.Mutex + // State reported to the channel based on SubConn states and resolver + // updates. + state connectivity.State + // scData for active subonns mapped by address. + subConns *resolver.AddressMapV2[*scData] + addressList addressList + firstPass bool + numTF int + cancelConnectionTimer func() + healthCheckingEnabled bool +} + +// ResolverError is called by the ClientConn when the name resolver produces +// an error or when pickfirst determined the resolver update to be invalid. +func (b *pickfirstBalancer) ResolverError(err error) { + b.mu.Lock() + defer b.mu.Unlock() + b.resolverErrorLocked(err) +} + +func (b *pickfirstBalancer) resolverErrorLocked(err error) { + if b.logger.V(2) { + b.logger.Infof("Received error from the name resolver: %v", err) + } + + // The picker will not change since the balancer does not currently + // report an error. If the balancer hasn't received a single good resolver + // update yet, transition to TRANSIENT_FAILURE. + if b.state != connectivity.TransientFailure && b.addressList.size() > 0 { + if b.logger.V(2) { + b.logger.Infof("Ignoring resolver error because balancer is using a previous good update.") + } + return + } + + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)}, + }) +} + +func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { + b.mu.Lock() + defer b.mu.Unlock() + b.cancelConnectionTimer() + if len(state.ResolverState.Addresses) == 0 && len(state.ResolverState.Endpoints) == 0 { + // Cleanup state pertaining to the previous resolver state. + // Treat an empty address list like an error by calling b.ResolverError. + b.closeSubConnsLocked() + b.addressList.updateAddrs(nil) + b.resolverErrorLocked(errors.New("produced zero addresses")) + return balancer.ErrBadResolverState + } + b.healthCheckingEnabled = state.ResolverState.Attributes.Value(enableHealthListenerKeyType{}) != nil + cfg, ok := state.BalancerConfig.(pfConfig) + if state.BalancerConfig != nil && !ok { + return fmt.Errorf("pickfirst: received illegal BalancerConfig (type %T): %v: %w", state.BalancerConfig, state.BalancerConfig, balancer.ErrBadResolverState) + } + + if b.logger.V(2) { + b.logger.Infof("Received new config %s, resolver state %s", pretty.ToJSON(cfg), pretty.ToJSON(state.ResolverState)) + } + + var newAddrs []resolver.Address + if endpoints := state.ResolverState.Endpoints; len(endpoints) != 0 { + // Perform the optional shuffling described in gRFC A62. The shuffling + // will change the order of endpoints but not touch the order of the + // addresses within each endpoint. - A61 + if cfg.ShuffleAddressList { + endpoints = append([]resolver.Endpoint{}, endpoints...) + internal.RandShuffle(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + } + + // "Flatten the list by concatenating the ordered list of addresses for + // each of the endpoints, in order." - A61 + for _, endpoint := range endpoints { + newAddrs = append(newAddrs, endpoint.Addresses...) + } + } else { + // Endpoints not set, process addresses until we migrate resolver + // emissions fully to Endpoints. The top channel does wrap emitted + // addresses with endpoints, however some balancers such as weighted + // target do not forward the corresponding correct endpoints down/split + // endpoints properly. Once all balancers correctly forward endpoints + // down, can delete this else conditional. + newAddrs = state.ResolverState.Addresses + if cfg.ShuffleAddressList { + newAddrs = append([]resolver.Address{}, newAddrs...) + internal.RandShuffle(len(newAddrs), func(i, j int) { newAddrs[i], newAddrs[j] = newAddrs[j], newAddrs[i] }) + } + } + + // If an address appears in multiple endpoints or in the same endpoint + // multiple times, we keep it only once. We will create only one SubConn + // for the address because an AddressMap is used to store SubConns. + // Not de-duplicating would result in attempting to connect to the same + // SubConn multiple times in the same pass. We don't want this. + newAddrs = deDupAddresses(newAddrs) + newAddrs = interleaveAddresses(newAddrs) + + prevAddr := b.addressList.currentAddress() + prevSCData, found := b.subConns.Get(prevAddr) + prevAddrsCount := b.addressList.size() + isPrevRawConnectivityStateReady := found && prevSCData.rawConnectivityState == connectivity.Ready + b.addressList.updateAddrs(newAddrs) + + // If the previous ready SubConn exists in new address list, + // keep this connection and don't create new SubConns. + if isPrevRawConnectivityStateReady && b.addressList.seekTo(prevAddr) { + return nil + } + + b.reconcileSubConnsLocked(newAddrs) + // If it's the first resolver update or the balancer was already READY + // (but the new address list does not contain the ready SubConn) or + // CONNECTING, enter CONNECTING. + // We may be in TRANSIENT_FAILURE due to a previous empty address list, + // we should still enter CONNECTING because the sticky TF behaviour + // mentioned in A62 applies only when the TRANSIENT_FAILURE is reported + // due to connectivity failures. + if isPrevRawConnectivityStateReady || b.state == connectivity.Connecting || prevAddrsCount == 0 { + // Start connection attempt at first address. + b.forceUpdateConcludedStateLocked(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + b.startFirstPassLocked() + } else if b.state == connectivity.TransientFailure { + // If we're in TRANSIENT_FAILURE, we stay in TRANSIENT_FAILURE until + // we're READY. See A62. + b.startFirstPassLocked() + } + return nil +} + +// UpdateSubConnState is unused as a StateListener is always registered when +// creating SubConns. +func (b *pickfirstBalancer) UpdateSubConnState(subConn balancer.SubConn, state balancer.SubConnState) { + b.logger.Errorf("UpdateSubConnState(%v, %+v) called unexpectedly", subConn, state) +} + +func (b *pickfirstBalancer) Close() { + b.mu.Lock() + defer b.mu.Unlock() + b.closeSubConnsLocked() + b.cancelConnectionTimer() + b.state = connectivity.Shutdown +} + +// ExitIdle moves the balancer out of idle state. It can be called concurrently +// by the idlePicker and clientConn so access to variables should be +// synchronized. +func (b *pickfirstBalancer) ExitIdle() { + b.mu.Lock() + defer b.mu.Unlock() + if b.state == connectivity.Idle { + // Move the balancer into CONNECTING state immediately. This is done to + // avoid staying in IDLE if a resolver update arrives before the first + // SubConn reports CONNECTING. + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + b.startFirstPassLocked() + } +} + +func (b *pickfirstBalancer) startFirstPassLocked() { + b.firstPass = true + b.numTF = 0 + // Reset the connection attempt record for existing SubConns. + for _, sd := range b.subConns.Values() { + sd.connectionFailedInFirstPass = false + } + b.requestConnectionLocked() +} + +func (b *pickfirstBalancer) closeSubConnsLocked() { + for _, sd := range b.subConns.Values() { + sd.subConn.Shutdown() + } + b.subConns = resolver.NewAddressMapV2[*scData]() +} + +// deDupAddresses ensures that each address appears only once in the slice. +func deDupAddresses(addrs []resolver.Address) []resolver.Address { + seenAddrs := resolver.NewAddressMapV2[*scData]() + retAddrs := []resolver.Address{} + + for _, addr := range addrs { + if _, ok := seenAddrs.Get(addr); ok { + continue + } + retAddrs = append(retAddrs, addr) + } + return retAddrs +} + +// interleaveAddresses interleaves addresses of both families (IPv4 and IPv6) +// as per RFC-8305 section 4. +// Whichever address family is first in the list is followed by an address of +// the other address family; that is, if the first address in the list is IPv6, +// then the first IPv4 address should be moved up in the list to be second in +// the list. It doesn't support configuring "First Address Family Count", i.e. +// there will always be a single member of the first address family at the +// beginning of the interleaved list. +// Addresses that are neither IPv4 nor IPv6 are treated as part of a third +// "unknown" family for interleaving. +// See: https://datatracker.ietf.org/doc/html/rfc8305#autoid-6 +func interleaveAddresses(addrs []resolver.Address) []resolver.Address { + familyAddrsMap := map[ipAddrFamily][]resolver.Address{} + interleavingOrder := []ipAddrFamily{} + for _, addr := range addrs { + family := addressFamily(addr.Addr) + if _, found := familyAddrsMap[family]; !found { + interleavingOrder = append(interleavingOrder, family) + } + familyAddrsMap[family] = append(familyAddrsMap[family], addr) + } + + interleavedAddrs := make([]resolver.Address, 0, len(addrs)) + + for curFamilyIdx := 0; len(interleavedAddrs) < len(addrs); curFamilyIdx = (curFamilyIdx + 1) % len(interleavingOrder) { + // Some IP types may have fewer addresses than others, so we look for + // the next type that has a remaining member to add to the interleaved + // list. + family := interleavingOrder[curFamilyIdx] + remainingMembers := familyAddrsMap[family] + if len(remainingMembers) > 0 { + interleavedAddrs = append(interleavedAddrs, remainingMembers[0]) + familyAddrsMap[family] = remainingMembers[1:] + } + } + + return interleavedAddrs +} + +// addressFamily returns the ipAddrFamily after parsing the address string. +// If the address isn't of the format "ip-address:port", it returns +// ipAddrFamilyUnknown. The address may be valid even if it's not an IP when +// using a resolver like passthrough where the address may be a hostname in +// some format that the dialer can resolve. +func addressFamily(address string) ipAddrFamily { + // Parse the IP after removing the port. + host, _, err := net.SplitHostPort(address) + if err != nil { + return ipAddrFamilyUnknown + } + ip, err := netip.ParseAddr(host) + if err != nil { + return ipAddrFamilyUnknown + } + switch { + case ip.Is4() || ip.Is4In6(): + return ipAddrFamilyV4 + case ip.Is6(): + return ipAddrFamilyV6 + default: + return ipAddrFamilyUnknown + } +} + +// reconcileSubConnsLocked updates the active subchannels based on a new address +// list from the resolver. It does this by: +// - closing subchannels: any existing subchannels associated with addresses +// that are no longer in the updated list are shut down. +// - removing subchannels: entries for these closed subchannels are removed +// from the subchannel map. +// +// This ensures that the subchannel map accurately reflects the current set of +// addresses received from the name resolver. +func (b *pickfirstBalancer) reconcileSubConnsLocked(newAddrs []resolver.Address) { + newAddrsMap := resolver.NewAddressMapV2[bool]() + for _, addr := range newAddrs { + newAddrsMap.Set(addr, true) + } + + for _, oldAddr := range b.subConns.Keys() { + if _, ok := newAddrsMap.Get(oldAddr); ok { + continue + } + val, _ := b.subConns.Get(oldAddr) + val.subConn.Shutdown() + b.subConns.Delete(oldAddr) + } +} + +// shutdownRemainingLocked shuts down remaining subConns. Called when a subConn +// becomes ready, which means that all other subConn must be shutdown. +func (b *pickfirstBalancer) shutdownRemainingLocked(selected *scData) { + b.cancelConnectionTimer() + for _, sd := range b.subConns.Values() { + if sd.subConn != selected.subConn { + sd.subConn.Shutdown() + } + } + b.subConns = resolver.NewAddressMapV2[*scData]() + b.subConns.Set(selected.addr, selected) +} + +// requestConnectionLocked starts connecting on the subchannel corresponding to +// the current address. If no subchannel exists, one is created. If the current +// subchannel is in TransientFailure, a connection to the next address is +// attempted until a subchannel is found. +func (b *pickfirstBalancer) requestConnectionLocked() { + if !b.addressList.isValid() { + return + } + var lastErr error + for valid := true; valid; valid = b.addressList.increment() { + curAddr := b.addressList.currentAddress() + sd, ok := b.subConns.Get(curAddr) + if !ok { + var err error + // We want to assign the new scData to sd from the outer scope, + // hence we can't use := below. + sd, err = b.newSCData(curAddr) + if err != nil { + // This should never happen, unless the clientConn is being shut + // down. + if b.logger.V(2) { + b.logger.Infof("Failed to create a subConn for address %v: %v", curAddr.String(), err) + } + // Do nothing, the LB policy will be closed soon. + return + } + b.subConns.Set(curAddr, sd) + } + + switch sd.rawConnectivityState { + case connectivity.Idle: + sd.subConn.Connect() + b.scheduleNextConnectionLocked() + return + case connectivity.TransientFailure: + // The SubConn is being re-used and failed during a previous pass + // over the addressList. It has not completed backoff yet. + // Mark it as having failed and try the next address. + sd.connectionFailedInFirstPass = true + lastErr = sd.lastErr + continue + case connectivity.Connecting: + // Wait for the connection attempt to complete or the timer to fire + // before attempting the next address. + b.scheduleNextConnectionLocked() + return + default: + b.logger.Errorf("SubConn with unexpected state %v present in SubConns map.", sd.rawConnectivityState) + return + + } + } + + // All the remaining addresses in the list are in TRANSIENT_FAILURE, end the + // first pass if possible. + b.endFirstPassIfPossibleLocked(lastErr) +} + +func (b *pickfirstBalancer) scheduleNextConnectionLocked() { + b.cancelConnectionTimer() + if !b.addressList.hasNext() { + return + } + curAddr := b.addressList.currentAddress() + cancelled := false // Access to this is protected by the balancer's mutex. + closeFn := internal.TimeAfterFunc(connectionDelayInterval, func() { + b.mu.Lock() + defer b.mu.Unlock() + // If the scheduled task is cancelled while acquiring the mutex, return. + if cancelled { + return + } + if b.logger.V(2) { + b.logger.Infof("Happy Eyeballs timer expired while waiting for connection to %q.", curAddr.Addr) + } + if b.addressList.increment() { + b.requestConnectionLocked() + } + }) + // Access to the cancellation callback held by the balancer is guarded by + // the balancer's mutex, so it's safe to set the boolean from the callback. + b.cancelConnectionTimer = sync.OnceFunc(func() { + cancelled = true + closeFn() + }) +} + +func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.SubConnState) { + b.mu.Lock() + defer b.mu.Unlock() + oldState := sd.rawConnectivityState + sd.rawConnectivityState = newState.ConnectivityState + // Previously relevant SubConns can still callback with state updates. + // To prevent pickers from returning these obsolete SubConns, this logic + // is included to check if the current list of active SubConns includes this + // SubConn. + if !b.isActiveSCData(sd) { + return + } + if newState.ConnectivityState == connectivity.Shutdown { + sd.effectiveState = connectivity.Shutdown + return + } + + // Record a connection attempt when exiting CONNECTING. + if newState.ConnectivityState == connectivity.TransientFailure { + sd.connectionFailedInFirstPass = true + connectionAttemptsFailedMetric.Record(b.metricsRecorder, 1, b.target) + } + + if newState.ConnectivityState == connectivity.Ready { + connectionAttemptsSucceededMetric.Record(b.metricsRecorder, 1, b.target) + b.shutdownRemainingLocked(sd) + if !b.addressList.seekTo(sd.addr) { + // This should not fail as we should have only one SubConn after + // entering READY. The SubConn should be present in the addressList. + b.logger.Errorf("Address %q not found address list in %v", sd.addr, b.addressList.addresses) + return + } + if !b.healthCheckingEnabled { + if b.logger.V(2) { + b.logger.Infof("SubConn %p reported connectivity state READY and the health listener is disabled. Transitioning SubConn to READY.", sd.subConn) + } + + sd.effectiveState = connectivity.Ready + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Ready, + Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + }) + return + } + if b.logger.V(2) { + b.logger.Infof("SubConn %p reported connectivity state READY. Registering health listener.", sd.subConn) + } + // Send a CONNECTING update to take the SubConn out of sticky-TF if + // required. + sd.effectiveState = connectivity.Connecting + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + sd.subConn.RegisterHealthListener(func(scs balancer.SubConnState) { + b.updateSubConnHealthState(sd, scs) + }) + return + } + + // If the LB policy is READY, and it receives a subchannel state change, + // it means that the READY subchannel has failed. + // A SubConn can also transition from CONNECTING directly to IDLE when + // a transport is successfully created, but the connection fails + // before the SubConn can send the notification for READY. We treat + // this as a successful connection and transition to IDLE. + // TODO: https://github.com/grpc/grpc-go/issues/7862 - Remove the second + // part of the if condition below once the issue is fixed. + if oldState == connectivity.Ready || (oldState == connectivity.Connecting && newState.ConnectivityState == connectivity.Idle) { + // Once a transport fails, the balancer enters IDLE and starts from + // the first address when the picker is used. + b.shutdownRemainingLocked(sd) + sd.effectiveState = newState.ConnectivityState + // READY SubConn interspliced in between CONNECTING and IDLE, need to + // account for that. + if oldState == connectivity.Connecting { + // A known issue (https://github.com/grpc/grpc-go/issues/7862) + // causes a race that prevents the READY state change notification. + // This works around it. + connectionAttemptsSucceededMetric.Record(b.metricsRecorder, 1, b.target) + } + disconnectionsMetric.Record(b.metricsRecorder, 1, b.target) + b.addressList.reset() + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Idle, + Picker: &idlePicker{exitIdle: sync.OnceFunc(b.ExitIdle)}, + }) + return + } + + if b.firstPass { + switch newState.ConnectivityState { + case connectivity.Connecting: + // The effective state can be in either IDLE, CONNECTING or + // TRANSIENT_FAILURE. If it's TRANSIENT_FAILURE, stay in + // TRANSIENT_FAILURE until it's READY. See A62. + if sd.effectiveState != connectivity.TransientFailure { + sd.effectiveState = connectivity.Connecting + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + } + case connectivity.TransientFailure: + sd.lastErr = newState.ConnectionError + sd.effectiveState = connectivity.TransientFailure + // Since we're re-using common SubConns while handling resolver + // updates, we could receive an out of turn TRANSIENT_FAILURE from + // a pass over the previous address list. Happy Eyeballs will also + // cause out of order updates to arrive. + + if curAddr := b.addressList.currentAddress(); equalAddressIgnoringBalAttributes(&curAddr, &sd.addr) { + b.cancelConnectionTimer() + if b.addressList.increment() { + b.requestConnectionLocked() + return + } + } + + // End the first pass if we've seen a TRANSIENT_FAILURE from all + // SubConns once. + b.endFirstPassIfPossibleLocked(newState.ConnectionError) + } + return + } + + // We have finished the first pass, keep re-connecting failing SubConns. + switch newState.ConnectivityState { + case connectivity.TransientFailure: + b.numTF = (b.numTF + 1) % b.subConns.Len() + sd.lastErr = newState.ConnectionError + if b.numTF%b.subConns.Len() == 0 { + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: newState.ConnectionError}, + }) + } + // We don't need to request re-resolution since the SubConn already + // does that before reporting TRANSIENT_FAILURE. + // TODO: #7534 - Move re-resolution requests from SubConn into + // pick_first. + case connectivity.Idle: + sd.subConn.Connect() + } +} + +// endFirstPassIfPossibleLocked ends the first happy-eyeballs pass if all the +// addresses are tried and their SubConns have reported a failure. +func (b *pickfirstBalancer) endFirstPassIfPossibleLocked(lastErr error) { + // An optimization to avoid iterating over the entire SubConn map. + if b.addressList.isValid() { + return + } + // Connect() has been called on all the SubConns. The first pass can be + // ended if all the SubConns have reported a failure. + for _, sd := range b.subConns.Values() { + if !sd.connectionFailedInFirstPass { + return + } + } + b.firstPass = false + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: lastErr}, + }) + // Start re-connecting all the SubConns that are already in IDLE. + for _, sd := range b.subConns.Values() { + if sd.rawConnectivityState == connectivity.Idle { + sd.subConn.Connect() + } + } +} + +func (b *pickfirstBalancer) isActiveSCData(sd *scData) bool { + activeSD, found := b.subConns.Get(sd.addr) + return found && activeSD == sd +} + +func (b *pickfirstBalancer) updateSubConnHealthState(sd *scData, state balancer.SubConnState) { + b.mu.Lock() + defer b.mu.Unlock() + // Previously relevant SubConns can still callback with state updates. + // To prevent pickers from returning these obsolete SubConns, this logic + // is included to check if the current list of active SubConns includes + // this SubConn. + if !b.isActiveSCData(sd) { + return + } + sd.effectiveState = state.ConnectivityState + switch state.ConnectivityState { + case connectivity.Ready: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Ready, + Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + }) + case connectivity.TransientFailure: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: fmt.Errorf("pickfirst: health check failure: %v", state.ConnectionError)}, + }) + case connectivity.Connecting: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + default: + b.logger.Errorf("Got unexpected health update for SubConn %p: %v", state) + } +} + +// updateBalancerState stores the state reported to the channel and calls +// ClientConn.UpdateState(). As an optimization, it avoids sending duplicate +// updates to the channel. +func (b *pickfirstBalancer) updateBalancerState(newState balancer.State) { + // In case of TransientFailures allow the picker to be updated to update + // the connectivity error, in all other cases don't send duplicate state + // updates. + if newState.ConnectivityState == b.state && b.state != connectivity.TransientFailure { + return + } + b.forceUpdateConcludedStateLocked(newState) +} + +// forceUpdateConcludedStateLocked stores the state reported to the channel and +// calls ClientConn.UpdateState(). +// A separate function is defined to force update the ClientConn state since the +// channel doesn't correctly assume that LB policies start in CONNECTING and +// relies on LB policy to send an initial CONNECTING update. +func (b *pickfirstBalancer) forceUpdateConcludedStateLocked(newState balancer.State) { + b.state = newState.ConnectivityState + b.cc.UpdateState(newState) +} + +type picker struct { + result balancer.PickResult + err error +} + +func (p *picker) Pick(balancer.PickInfo) (balancer.PickResult, error) { + return p.result, p.err +} + +// idlePicker is used when the SubConn is IDLE and kicks the SubConn into +// CONNECTING when Pick is called. +type idlePicker struct { + exitIdle func() +} + +func (i *idlePicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { + i.exitIdle() + return balancer.PickResult{}, balancer.ErrNoSubConnAvailable +} + +// addressList manages sequentially iterating over addresses present in a list +// of endpoints. It provides a 1 dimensional view of the addresses present in +// the endpoints. +// This type is not safe for concurrent access. +type addressList struct { + addresses []resolver.Address + idx int +} + +func (al *addressList) isValid() bool { + return al.idx < len(al.addresses) +} + +func (al *addressList) size() int { + return len(al.addresses) +} + +// increment moves to the next index in the address list. +// This method returns false if it went off the list, true otherwise. +func (al *addressList) increment() bool { + if !al.isValid() { + return false + } + al.idx++ + return al.idx < len(al.addresses) +} + +// currentAddress returns the current address pointed to in the addressList. +// If the list is in an invalid state, it returns an empty address instead. +func (al *addressList) currentAddress() resolver.Address { + if !al.isValid() { + return resolver.Address{} + } + return al.addresses[al.idx] +} + +func (al *addressList) reset() { + al.idx = 0 +} + +func (al *addressList) updateAddrs(addrs []resolver.Address) { + al.addresses = addrs + al.reset() +} + +// seekTo returns false if the needle was not found and the current index was +// left unchanged. +func (al *addressList) seekTo(needle resolver.Address) bool { + for ai, addr := range al.addresses { + if !equalAddressIgnoringBalAttributes(&addr, &needle) { + continue + } + al.idx = ai + return true + } + return false +} + +// hasNext returns whether incrementing the addressList will result in moving +// past the end of the list. If the list has already moved past the end, it +// returns false. +func (al *addressList) hasNext() bool { + if !al.isValid() { + return false + } + return al.idx+1 < len(al.addresses) +} + +// equalAddressIgnoringBalAttributes returns true is a and b are considered +// equal. This is different from the Equal method on the resolver.Address type +// which considers all fields to determine equality. Here, we only consider +// fields that are meaningful to the SubConn. +func equalAddressIgnoringBalAttributes(a, b *resolver.Address) bool { + return a.Addr == b.Addr && a.ServerName == b.ServerName && + a.Attributes.Equal(b.Attributes) +} diff --git a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go index f7031ad225..22045bf394 100644 --- a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go +++ b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go @@ -22,12 +22,13 @@ package roundrobin import ( - "sync/atomic" + "fmt" "google.golang.org/grpc/balancer" - "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/balancer/endpointsharding" + "google.golang.org/grpc/balancer/pickfirst/pickfirstleaf" "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal/grpcrand" + internalgrpclog "google.golang.org/grpc/internal/grpclog" ) // Name is the name of round_robin balancer. @@ -35,47 +36,37 @@ const Name = "round_robin" var logger = grpclog.Component("roundrobin") -// newBuilder creates a new roundrobin balancer builder. -func newBuilder() balancer.Builder { - return base.NewBalancerBuilder(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true}) -} - func init() { - balancer.Register(newBuilder()) + balancer.Register(builder{}) } -type rrPickerBuilder struct{} +type builder struct{} -func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker { - logger.Infof("roundrobinPicker: Build called with info: %v", info) - if len(info.ReadySCs) == 0 { - return base.NewErrPicker(balancer.ErrNoSubConnAvailable) - } - scs := make([]balancer.SubConn, 0, len(info.ReadySCs)) - for sc := range info.ReadySCs { - scs = append(scs, sc) - } - return &rrPicker{ - subConns: scs, - // Start at a random index, as the same RR balancer rebuilds a new - // picker when SubConn states change, and we don't want to apply excess - // load to the first server in the list. - next: uint32(grpcrand.Intn(len(scs))), - } +func (bb builder) Name() string { + return Name } -type rrPicker struct { - // subConns is the snapshot of the roundrobin balancer when this picker was - // created. The slice is immutable. Each Get() will do a round robin - // selection from it and return the selected SubConn. - subConns []balancer.SubConn - next uint32 +func (bb builder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer { + childBuilder := balancer.Get(pickfirstleaf.Name).Build + bal := &rrBalancer{ + cc: cc, + Balancer: endpointsharding.NewBalancer(cc, opts, childBuilder, endpointsharding.Options{}), + } + bal.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[%p] ", bal)) + bal.logger.Infof("Created") + return bal } -func (p *rrPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { - subConnsLen := uint32(len(p.subConns)) - nextIndex := atomic.AddUint32(&p.next, 1) +type rrBalancer struct { + balancer.Balancer + cc balancer.ClientConn + logger *internalgrpclog.PrefixLogger +} - sc := p.subConns[nextIndex%subConnsLen] - return balancer.PickResult{SubConn: sc}, nil +func (b *rrBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error { + return b.Balancer.UpdateClientConnState(balancer.ClientConnState{ + // Enable the health listener in pickfirst children for client side health + // checks and outlier detection, if configured. + ResolverState: pickfirstleaf.EnableHealthListener(ccs.ResolverState), + }) } diff --git a/vendor/google.golang.org/grpc/balancer/subconn.go b/vendor/google.golang.org/grpc/balancer/subconn.go new file mode 100644 index 0000000000..9ee44d4af0 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/subconn.go @@ -0,0 +1,134 @@ +/* + * + * Copyright 2024 gRPC 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 balancer + +import ( + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/resolver" +) + +// A SubConn represents a single connection to a gRPC backend service. +// +// All SubConns start in IDLE, and will not try to connect. To trigger a +// connection attempt, Balancers must call Connect. +// +// If the connection attempt fails, the SubConn will transition to +// TRANSIENT_FAILURE for a backoff period, and then return to IDLE. If the +// connection attempt succeeds, it will transition to READY. +// +// If a READY SubConn becomes disconnected, the SubConn will transition to IDLE. +// +// If a connection re-enters IDLE, Balancers must call Connect again to trigger +// a new connection attempt. +// +// Each SubConn contains a list of addresses. gRPC will try to connect to the +// addresses in sequence, and stop trying the remainder once the first +// connection is successful. However, this behavior is deprecated. SubConns +// should only use a single address. +// +// NOTICE: This interface is intended to be implemented by gRPC, or intercepted +// by custom load balancing polices. Users should not need their own complete +// implementation of this interface -- they should always delegate to a SubConn +// returned by ClientConn.NewSubConn() by embedding it in their implementations. +// An embedded SubConn must never be nil, or runtime panics will occur. +type SubConn interface { + // UpdateAddresses updates the addresses used in this SubConn. + // gRPC checks if currently-connected address is still in the new list. + // If it's in the list, the connection will be kept. + // If it's not in the list, the connection will gracefully close, and + // a new connection will be created. + // + // This will trigger a state transition for the SubConn. + // + // Deprecated: this method will be removed. Create new SubConns for new + // addresses instead. + UpdateAddresses([]resolver.Address) + // Connect starts the connecting for this SubConn. + Connect() + // GetOrBuildProducer returns a reference to the existing Producer for this + // ProducerBuilder in this SubConn, or, if one does not currently exist, + // creates a new one and returns it. Returns a close function which may be + // called when the Producer is no longer needed. Otherwise the producer + // will automatically be closed upon connection loss or subchannel close. + // Should only be called on a SubConn in state Ready. Otherwise the + // producer will be unable to create streams. + GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) + // Shutdown shuts down the SubConn gracefully. Any started RPCs will be + // allowed to complete. No future calls should be made on the SubConn. + // One final state update will be delivered to the StateListener (or + // UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to + // indicate the shutdown operation. This may be delivered before + // in-progress RPCs are complete and the actual connection is closed. + Shutdown() + // RegisterHealthListener registers a health listener that receives health + // updates for a Ready SubConn. Only one health listener can be registered + // at a time. A health listener should be registered each time the SubConn's + // connectivity state changes to READY. Registering a health listener when + // the connectivity state is not READY may result in undefined behaviour. + // This method must not be called synchronously while handling an update + // from a previously registered health listener. + RegisterHealthListener(func(SubConnState)) + // EnforceSubConnEmbedding is included to force implementers to embed + // another implementation of this interface, allowing gRPC to add methods + // without breaking users. + internal.EnforceSubConnEmbedding +} + +// A ProducerBuilder is a simple constructor for a Producer. It is used by the +// SubConn to create producers when needed. +type ProducerBuilder interface { + // Build creates a Producer. The first parameter is always a + // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the + // associated SubConn), but is declared as `any` to avoid a dependency + // cycle. Build also returns a close function that will be called when all + // references to the Producer have been given up for a SubConn, or when a + // connectivity state change occurs on the SubConn. The close function + // should always block until all asynchronous cleanup work is completed. + Build(grpcClientConnInterface any) (p Producer, close func()) +} + +// SubConnState describes the state of a SubConn. +type SubConnState struct { + // ConnectivityState is the connectivity state of the SubConn. + ConnectivityState connectivity.State + // ConnectionError is set if the ConnectivityState is TransientFailure, + // describing the reason the SubConn failed. Otherwise, it is nil. + ConnectionError error + // connectedAddr contains the connected address when ConnectivityState is + // Ready. Otherwise, it is indeterminate. + connectedAddress resolver.Address +} + +// connectedAddress returns the connected address for a SubConnState. The +// address is only valid if the state is READY. +func connectedAddress(scs SubConnState) resolver.Address { + return scs.connectedAddress +} + +// setConnectedAddress sets the connected address for a SubConnState. +func setConnectedAddress(scs *SubConnState, addr resolver.Address) { + scs.connectedAddress = addr +} + +// A Producer is a type shared among potentially many consumers. It is +// associated with a SubConn, and an implementation will typically contain +// other methods to provide additional functionality, e.g. configuration or +// subscription registration. +type Producer any diff --git a/vendor/google.golang.org/grpc/balancer_wrapper.go b/vendor/google.golang.org/grpc/balancer_wrapper.go index af39b8a4c7..948a21ef68 100644 --- a/vendor/google.golang.org/grpc/balancer_wrapper.go +++ b/vendor/google.golang.org/grpc/balancer_wrapper.go @@ -24,11 +24,25 @@ import ( "sync" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/experimental/stats" + "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/balancer/gracefulswitch" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/resolver" + "google.golang.org/grpc/status" +) + +var ( + setConnectedAddress = internal.SetConnectedAddress.(func(*balancer.SubConnState, resolver.Address)) + // noOpRegisterHealthListenerFn is used when client side health checking is + // disabled. It sends a single READY update on the registered listener. + noOpRegisterHealthListenerFn = func(_ context.Context, listener func(balancer.SubConnState)) func() { + listener(balancer.SubConnState{ConnectivityState: connectivity.Ready}) + return func() {} + } ) // ccBalancerWrapper sits between the ClientConn and the Balancer. @@ -46,6 +60,7 @@ import ( // It uses the gracefulswitch.Balancer internally to ensure that balancer // switches happen in a graceful manner. type ccBalancerWrapper struct { + internal.EnforceClientConnEmbedding // The following fields are initialized when the wrapper is created and are // read-only afterwards, and therefore can be accessed without a mutex. cc *ClientConn @@ -87,12 +102,16 @@ func newCCBalancerWrapper(cc *ClientConn) *ccBalancerWrapper { return ccb } +func (ccb *ccBalancerWrapper) MetricsRecorder() stats.MetricsRecorder { + return ccb.cc.metricsRecorderList +} + // updateClientConnState is invoked by grpc to push a ClientConnState update to // the underlying balancer. This is always executed from the serializer, so // it is safe to call into the balancer here. func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error { errCh := make(chan error) - ok := ccb.serializer.Schedule(func(ctx context.Context) { + uccs := func(ctx context.Context) { defer close(errCh) if ctx.Err() != nil || ccb.balancer == nil { return @@ -107,17 +126,23 @@ func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnStat logger.Infof("error from balancer.UpdateClientConnState: %v", err) } errCh <- err - }) - if !ok { - return nil } + onFailure := func() { close(errCh) } + + // UpdateClientConnState can race with Close, and when the latter wins, the + // serializer is closed, and the attempt to schedule the callback will fail. + // It is acceptable to ignore this failure. But since we want to handle the + // state update in a blocking fashion (when we successfully schedule the + // callback), we have to use the ScheduleOr method and not the MaybeSchedule + // method on the serializer. + ccb.serializer.ScheduleOr(uccs, onFailure) return <-errCh } // resolverError is invoked by grpc to push a resolver error to the underlying // balancer. The call to the balancer is executed from the serializer. func (ccb *ccBalancerWrapper) resolverError(err error) { - ccb.serializer.Schedule(func(ctx context.Context) { + ccb.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || ccb.balancer == nil { return } @@ -133,7 +158,7 @@ func (ccb *ccBalancerWrapper) close() { ccb.closed = true ccb.mu.Unlock() channelz.Info(logger, ccb.cc.channelz, "ccBalancerWrapper: closing") - ccb.serializer.Schedule(func(context.Context) { + ccb.serializer.TrySchedule(func(context.Context) { if ccb.balancer == nil { return } @@ -145,7 +170,7 @@ func (ccb *ccBalancerWrapper) close() { // exitIdle invokes the balancer's exitIdle method in the serializer. func (ccb *ccBalancerWrapper) exitIdle() { - ccb.serializer.Schedule(func(ctx context.Context) { + ccb.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || ccb.balancer == nil { return } @@ -177,12 +202,13 @@ func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer ac: ac, producers: make(map[balancer.ProducerBuilder]*refCountedProducer), stateListener: opts.StateListener, + healthData: newHealthData(connectivity.Idle), } ac.acbw = acbw return acbw, nil } -func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) { +func (ccb *ccBalancerWrapper) RemoveSubConn(balancer.SubConn) { // The graceful switch balancer will never call this. logger.Errorf("ccb RemoveSubConn(%v) called unexpectedly, sc") } @@ -198,6 +224,10 @@ func (ccb *ccBalancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resol func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { ccb.cc.mu.Lock() defer ccb.cc.mu.Unlock() + if ccb.cc.conns == nil { + // The CC has been closed; ignore this update. + return + } ccb.mu.Lock() if ccb.closed { @@ -238,25 +268,77 @@ func (ccb *ccBalancerWrapper) Target() string { // acBalancerWrapper is a wrapper on top of ac for balancers. // It implements balancer.SubConn interface. type acBalancerWrapper struct { + internal.EnforceSubConnEmbedding ac *addrConn // read-only ccb *ccBalancerWrapper // read-only stateListener func(balancer.SubConnState) - mu sync.Mutex - producers map[balancer.ProducerBuilder]*refCountedProducer + producersMu sync.Mutex + producers map[balancer.ProducerBuilder]*refCountedProducer + + // Access to healthData is protected by healthMu. + healthMu sync.Mutex + // healthData is stored as a pointer to detect when the health listener is + // dropped or updated. This is required as closures can't be compared for + // equality. + healthData *healthData +} + +// healthData holds data related to health state reporting. +type healthData struct { + // connectivityState stores the most recent connectivity state delivered + // to the LB policy. This is stored to avoid sending updates when the + // SubConn has already exited connectivity state READY. + connectivityState connectivity.State + // closeHealthProducer stores function to close the ref counted health + // producer. The health producer is automatically closed when the SubConn + // state changes. + closeHealthProducer func() +} + +func newHealthData(s connectivity.State) *healthData { + return &healthData{ + connectivityState: s, + closeHealthProducer: func() {}, + } } // updateState is invoked by grpc to push a subConn state update to the // underlying balancer. -func (acbw *acBalancerWrapper) updateState(s connectivity.State, err error) { - acbw.ccb.serializer.Schedule(func(ctx context.Context) { +func (acbw *acBalancerWrapper) updateState(s connectivity.State, curAddr resolver.Address, err error) { + acbw.ccb.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || acbw.ccb.balancer == nil { return } + // Invalidate all producers on any state change. + acbw.closeProducers() + // Even though it is optional for balancers, gracefulswitch ensures // opts.StateListener is set, so this cannot ever be nil. // TODO: delete this comment when UpdateSubConnState is removed. - acbw.stateListener(balancer.SubConnState{ConnectivityState: s, ConnectionError: err}) + scs := balancer.SubConnState{ConnectivityState: s, ConnectionError: err} + if s == connectivity.Ready { + setConnectedAddress(&scs, curAddr) + } + // Invalidate the health listener by updating the healthData. + acbw.healthMu.Lock() + // A race may occur if a health listener is registered soon after the + // connectivity state is set but before the stateListener is called. + // Two cases may arise: + // 1. The new state is not READY: RegisterHealthListener has checks to + // ensure no updates are sent when the connectivity state is not + // READY. + // 2. The new state is READY: This means that the old state wasn't Ready. + // The RegisterHealthListener API mentions that a health listener + // must not be registered when a SubConn is not ready to avoid such + // races. When this happens, the LB policy would get health updates + // on the old listener. When the LB policy registers a new listener + // on receiving the connectivity update, the health updates will be + // sent to the new health listener. + acbw.healthData = newHealthData(scs.ConnectivityState) + acbw.healthMu.Unlock() + + acbw.stateListener(scs) }) } @@ -273,6 +355,7 @@ func (acbw *acBalancerWrapper) Connect() { } func (acbw *acBalancerWrapper) Shutdown() { + acbw.closeProducers() acbw.ccb.cc.removeAddrConn(acbw.ac, errConnDrain) } @@ -280,9 +363,10 @@ func (acbw *acBalancerWrapper) Shutdown() { // ready, blocks until it is or ctx expires. Returns an error when the context // expires or the addrConn is shut down. func (acbw *acBalancerWrapper) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { - transport, err := acbw.ac.getTransport(ctx) - if err != nil { - return nil, err + transport := acbw.ac.getReadyTransport() + if transport == nil { + return nil, status.Errorf(codes.Unavailable, "SubConn state is not Ready") + } return newNonRetryClientStream(ctx, desc, method, transport, acbw.ac, opts...) } @@ -307,15 +391,15 @@ type refCountedProducer struct { } func (acbw *acBalancerWrapper) GetOrBuildProducer(pb balancer.ProducerBuilder) (balancer.Producer, func()) { - acbw.mu.Lock() - defer acbw.mu.Unlock() + acbw.producersMu.Lock() + defer acbw.producersMu.Unlock() // Look up existing producer from this builder. pData := acbw.producers[pb] if pData == nil { // Not found; create a new one and add it to the producers map. - p, close := pb.Build(acbw) - pData = &refCountedProducer{producer: p, close: close} + p, closeFn := pb.Build(acbw) + pData = &refCountedProducer{producer: p, close: closeFn} acbw.producers[pb] = pData } // Account for this new reference. @@ -325,13 +409,112 @@ func (acbw *acBalancerWrapper) GetOrBuildProducer(pb balancer.ProducerBuilder) ( // and delete the refCountedProducer from the map if the total reference // count goes to zero. unref := func() { - acbw.mu.Lock() + acbw.producersMu.Lock() + // If closeProducers has already closed this producer instance, refs is + // set to 0, so the check after decrementing will never pass, and the + // producer will not be double-closed. pData.refs-- if pData.refs == 0 { defer pData.close() // Run outside the acbw mutex delete(acbw.producers, pb) } - acbw.mu.Unlock() + acbw.producersMu.Unlock() + } + return pData.producer, sync.OnceFunc(unref) +} + +func (acbw *acBalancerWrapper) closeProducers() { + acbw.producersMu.Lock() + defer acbw.producersMu.Unlock() + for pb, pData := range acbw.producers { + pData.refs = 0 + pData.close() + delete(acbw.producers, pb) } - return pData.producer, grpcsync.OnceFunc(unref) +} + +// healthProducerRegisterFn is a type alias for the health producer's function +// for registering listeners. +type healthProducerRegisterFn = func(context.Context, balancer.SubConn, string, func(balancer.SubConnState)) func() + +// healthListenerRegFn returns a function to register a listener for health +// updates. If client side health checks are disabled, the registered listener +// will get a single READY (raw connectivity state) update. +// +// Client side health checking is enabled when all the following +// conditions are satisfied: +// 1. Health checking is not disabled using the dial option. +// 2. The health package is imported. +// 3. The health check config is present in the service config. +func (acbw *acBalancerWrapper) healthListenerRegFn() func(context.Context, func(balancer.SubConnState)) func() { + if acbw.ccb.cc.dopts.disableHealthCheck { + return noOpRegisterHealthListenerFn + } + regHealthLisFn := internal.RegisterClientHealthCheckListener + if regHealthLisFn == nil { + // The health package is not imported. + return noOpRegisterHealthListenerFn + } + cfg := acbw.ac.cc.healthCheckConfig() + if cfg == nil { + return noOpRegisterHealthListenerFn + } + return func(ctx context.Context, listener func(balancer.SubConnState)) func() { + return regHealthLisFn.(healthProducerRegisterFn)(ctx, acbw, cfg.ServiceName, listener) + } +} + +// RegisterHealthListener accepts a health listener from the LB policy. It sends +// updates to the health listener as long as the SubConn's connectivity state +// doesn't change and a new health listener is not registered. To invalidate +// the currently registered health listener, acbw updates the healthData. If a +// nil listener is registered, the active health listener is dropped. +func (acbw *acBalancerWrapper) RegisterHealthListener(listener func(balancer.SubConnState)) { + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + acbw.healthData.closeHealthProducer() + // listeners should not be registered when the connectivity state + // isn't Ready. This may happen when the balancer registers a listener + // after the connectivityState is updated, but before it is notified + // of the update. + if acbw.healthData.connectivityState != connectivity.Ready { + return + } + // Replace the health data to stop sending updates to any previously + // registered health listeners. + hd := newHealthData(connectivity.Ready) + acbw.healthData = hd + if listener == nil { + return + } + + registerFn := acbw.healthListenerRegFn() + acbw.ccb.serializer.TrySchedule(func(ctx context.Context) { + if ctx.Err() != nil || acbw.ccb.balancer == nil { + return + } + // Don't send updates if a new listener is registered. + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + if acbw.healthData != hd { + return + } + // Serialize the health updates from the health producer with + // other calls into the LB policy. + listenerWrapper := func(scs balancer.SubConnState) { + acbw.ccb.serializer.TrySchedule(func(ctx context.Context) { + if ctx.Err() != nil || acbw.ccb.balancer == nil { + return + } + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + if acbw.healthData != hd { + return + } + listener(scs) + }) + } + + hd.closeHealthProducer = registerFn(ctx, listenerWrapper) + }) } diff --git a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go index 856c75dd4e..b1364a0325 100644 --- a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go +++ b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go @@ -18,8 +18,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/binlog/v1/binarylog.proto package grpc_binarylog_v1 @@ -31,6 +31,7 @@ import ( timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -233,10 +234,7 @@ func (Address_Type) EnumDescriptor() ([]byte, []int) { // Log entry we store in binary logs type GrpcLogEntry struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The timestamp of the binary log message Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Uniquely identifies a call. The value must not be 0 in order to disambiguate @@ -255,7 +253,7 @@ type GrpcLogEntry struct { // The logger uses one of the following fields to record the payload, // according to the type of the log entry. // - // Types that are assignable to Payload: + // Types that are valid to be assigned to Payload: // // *GrpcLogEntry_ClientHeader // *GrpcLogEntry_ServerHeader @@ -269,16 +267,16 @@ type GrpcLogEntry struct { // EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in // the case of trailers-only. On server side, peer is always // logged on EVENT_TYPE_CLIENT_HEADER. - Peer *Address `protobuf:"bytes,11,opt,name=peer,proto3" json:"peer,omitempty"` + Peer *Address `protobuf:"bytes,11,opt,name=peer,proto3" json:"peer,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GrpcLogEntry) Reset() { *x = GrpcLogEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GrpcLogEntry) String() string { @@ -289,7 +287,7 @@ func (*GrpcLogEntry) ProtoMessage() {} func (x *GrpcLogEntry) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -339,37 +337,45 @@ func (x *GrpcLogEntry) GetLogger() GrpcLogEntry_Logger { return GrpcLogEntry_LOGGER_UNKNOWN } -func (m *GrpcLogEntry) GetPayload() isGrpcLogEntry_Payload { - if m != nil { - return m.Payload +func (x *GrpcLogEntry) GetPayload() isGrpcLogEntry_Payload { + if x != nil { + return x.Payload } return nil } func (x *GrpcLogEntry) GetClientHeader() *ClientHeader { - if x, ok := x.GetPayload().(*GrpcLogEntry_ClientHeader); ok { - return x.ClientHeader + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_ClientHeader); ok { + return x.ClientHeader + } } return nil } func (x *GrpcLogEntry) GetServerHeader() *ServerHeader { - if x, ok := x.GetPayload().(*GrpcLogEntry_ServerHeader); ok { - return x.ServerHeader + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_ServerHeader); ok { + return x.ServerHeader + } } return nil } func (x *GrpcLogEntry) GetMessage() *Message { - if x, ok := x.GetPayload().(*GrpcLogEntry_Message); ok { - return x.Message + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_Message); ok { + return x.Message + } } return nil } func (x *GrpcLogEntry) GetTrailer() *Trailer { - if x, ok := x.GetPayload().(*GrpcLogEntry_Trailer); ok { - return x.Trailer + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_Trailer); ok { + return x.Trailer + } } return nil } @@ -418,10 +424,7 @@ func (*GrpcLogEntry_Message) isGrpcLogEntry_Payload() {} func (*GrpcLogEntry_Trailer) isGrpcLogEntry_Payload() {} type ClientHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This contains only the metadata from the application. Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` // The name of the RPC method, which looks something like: @@ -435,16 +438,16 @@ type ClientHeader struct { // or : . Authority string `protobuf:"bytes,3,opt,name=authority,proto3" json:"authority,omitempty"` // the RPC timeout - Timeout *durationpb.Duration `protobuf:"bytes,4,opt,name=timeout,proto3" json:"timeout,omitempty"` + Timeout *durationpb.Duration `protobuf:"bytes,4,opt,name=timeout,proto3" json:"timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ClientHeader) Reset() { *x = ClientHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ClientHeader) String() string { @@ -455,7 +458,7 @@ func (*ClientHeader) ProtoMessage() {} func (x *ClientHeader) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -499,21 +502,18 @@ func (x *ClientHeader) GetTimeout() *durationpb.Duration { } type ServerHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This contains only the metadata from the application. - Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerHeader) Reset() { *x = ServerHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerHeader) String() string { @@ -524,7 +524,7 @@ func (*ServerHeader) ProtoMessage() {} func (x *ServerHeader) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -547,10 +547,7 @@ func (x *ServerHeader) GetMetadata() *Metadata { } type Trailer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This contains only the metadata from the application. Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` // The gRPC status code. @@ -561,15 +558,15 @@ type Trailer struct { // The value of the 'grpc-status-details-bin' metadata key. If // present, this is always an encoded 'google.rpc.Status' message. StatusDetails []byte `protobuf:"bytes,4,opt,name=status_details,json=statusDetails,proto3" json:"status_details,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Trailer) Reset() { *x = Trailer{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Trailer) String() string { @@ -580,7 +577,7 @@ func (*Trailer) ProtoMessage() {} func (x *Trailer) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -625,24 +622,21 @@ func (x *Trailer) GetStatusDetails() []byte { // Message payload, used by CLIENT_MESSAGE and SERVER_MESSAGE type Message struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Length of the message. It may not be the same as the length of the // data field, as the logging payload can be truncated or omitted. Length uint32 `protobuf:"varint,1,opt,name=length,proto3" json:"length,omitempty"` // May be truncated or omitted. - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Message) Reset() { *x = Message{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Message) String() string { @@ -653,7 +647,7 @@ func (*Message) ProtoMessage() {} func (x *Message) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -704,20 +698,17 @@ func (x *Message) GetData() []byte { // header is just a normal metadata key. // The pair will not count towards the size limit. type Metadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Entry []*MetadataEntry `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"` unknownFields protoimpl.UnknownFields - - Entry []*MetadataEntry `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Metadata) Reset() { *x = Metadata{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata) String() string { @@ -728,7 +719,7 @@ func (*Metadata) ProtoMessage() {} func (x *Metadata) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -752,21 +743,18 @@ func (x *Metadata) GetEntry() []*MetadataEntry { // A metadata key value pair type MetadataEntry struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields - - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MetadataEntry) Reset() { *x = MetadataEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MetadataEntry) String() string { @@ -777,7 +765,7 @@ func (*MetadataEntry) ProtoMessage() {} func (x *MetadataEntry) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -808,23 +796,20 @@ func (x *MetadataEntry) GetValue() []byte { // Address information type Address struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type Address_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.binarylog.v1.Address_Type" json:"type,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Type Address_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.binarylog.v1.Address_Type" json:"type,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` // only for TYPE_IPV4 and TYPE_IPV6 - IpPort uint32 `protobuf:"varint,3,opt,name=ip_port,json=ipPort,proto3" json:"ip_port,omitempty"` + IpPort uint32 `protobuf:"varint,3,opt,name=ip_port,json=ipPort,proto3" json:"ip_port,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Address) Reset() { *x = Address{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Address) String() string { @@ -835,7 +820,7 @@ func (*Address) ProtoMessage() {} func (x *Address) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -873,149 +858,84 @@ func (x *Address) GetIpPort() uint32 { var File_grpc_binlog_v1_binarylog_proto protoreflect.FileDescriptor -var file_grpc_binlog_v1_binarylog_proto_rawDesc = []byte{ - 0x0a, 0x1e, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x2f, 0x76, 0x31, - 0x2f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x11, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 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, 0xbb, 0x07, 0x0a, 0x0c, 0x47, 0x72, 0x70, 0x63, 0x4c, 0x6f, 0x67, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 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, 0x12, - 0x17, 0x0a, 0x07, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x57, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x12, - 0x3d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3e, - 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x12, 0x46, - 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, - 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x36, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, - 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, - 0x6c, 0x65, 0x72, 0x48, 0x00, 0x52, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x2b, - 0x0a, 0x11, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x70, - 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x22, 0xf5, 0x01, 0x0a, 0x09, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x01, 0x12, - 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, - 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x49, 0x45, - 0x4e, 0x54, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, - 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x05, 0x12, 0x1d, 0x0a, - 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x45, 0x52, 0x5f, 0x54, 0x52, 0x41, 0x49, 0x4c, 0x45, 0x52, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, - 0x4c, 0x10, 0x07, 0x22, 0x42, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, - 0x0e, 0x4c, 0x4f, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x4f, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x49, 0x45, - 0x4e, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x4f, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0xbb, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, - 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x22, 0x47, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, - 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb1, 0x01, 0x0a, 0x07, 0x54, 0x72, - 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x35, 0x0a, - 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x42, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x36, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x37, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x33, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, - 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x69, - 0x70, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x45, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, - 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x50, 0x56, 0x34, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x50, 0x56, 0x36, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x03, 0x42, 0x5c, 0x0a, 0x14, - 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, - 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x62, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x69, - 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x5f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} +const file_grpc_binlog_v1_binarylog_proto_rawDesc = "" + + "\n" + + "\x1egrpc/binlog/v1/binarylog.proto\x12\x11grpc.binarylog.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xbb\a\n" + + "\fGrpcLogEntry\x128\n" + + "\ttimestamp\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12\x17\n" + + "\acall_id\x18\x02 \x01(\x04R\x06callId\x125\n" + + "\x17sequence_id_within_call\x18\x03 \x01(\x04R\x14sequenceIdWithinCall\x12=\n" + + "\x04type\x18\x04 \x01(\x0e2).grpc.binarylog.v1.GrpcLogEntry.EventTypeR\x04type\x12>\n" + + "\x06logger\x18\x05 \x01(\x0e2&.grpc.binarylog.v1.GrpcLogEntry.LoggerR\x06logger\x12F\n" + + "\rclient_header\x18\x06 \x01(\v2\x1f.grpc.binarylog.v1.ClientHeaderH\x00R\fclientHeader\x12F\n" + + "\rserver_header\x18\a \x01(\v2\x1f.grpc.binarylog.v1.ServerHeaderH\x00R\fserverHeader\x126\n" + + "\amessage\x18\b \x01(\v2\x1a.grpc.binarylog.v1.MessageH\x00R\amessage\x126\n" + + "\atrailer\x18\t \x01(\v2\x1a.grpc.binarylog.v1.TrailerH\x00R\atrailer\x12+\n" + + "\x11payload_truncated\x18\n" + + " \x01(\bR\x10payloadTruncated\x12.\n" + + "\x04peer\x18\v \x01(\v2\x1a.grpc.binarylog.v1.AddressR\x04peer\"\xf5\x01\n" + + "\tEventType\x12\x16\n" + + "\x12EVENT_TYPE_UNKNOWN\x10\x00\x12\x1c\n" + + "\x18EVENT_TYPE_CLIENT_HEADER\x10\x01\x12\x1c\n" + + "\x18EVENT_TYPE_SERVER_HEADER\x10\x02\x12\x1d\n" + + "\x19EVENT_TYPE_CLIENT_MESSAGE\x10\x03\x12\x1d\n" + + "\x19EVENT_TYPE_SERVER_MESSAGE\x10\x04\x12 \n" + + "\x1cEVENT_TYPE_CLIENT_HALF_CLOSE\x10\x05\x12\x1d\n" + + "\x19EVENT_TYPE_SERVER_TRAILER\x10\x06\x12\x15\n" + + "\x11EVENT_TYPE_CANCEL\x10\a\"B\n" + + "\x06Logger\x12\x12\n" + + "\x0eLOGGER_UNKNOWN\x10\x00\x12\x11\n" + + "\rLOGGER_CLIENT\x10\x01\x12\x11\n" + + "\rLOGGER_SERVER\x10\x02B\t\n" + + "\apayload\"\xbb\x01\n" + + "\fClientHeader\x127\n" + + "\bmetadata\x18\x01 \x01(\v2\x1b.grpc.binarylog.v1.MetadataR\bmetadata\x12\x1f\n" + + "\vmethod_name\x18\x02 \x01(\tR\n" + + "methodName\x12\x1c\n" + + "\tauthority\x18\x03 \x01(\tR\tauthority\x123\n" + + "\atimeout\x18\x04 \x01(\v2\x19.google.protobuf.DurationR\atimeout\"G\n" + + "\fServerHeader\x127\n" + + "\bmetadata\x18\x01 \x01(\v2\x1b.grpc.binarylog.v1.MetadataR\bmetadata\"\xb1\x01\n" + + "\aTrailer\x127\n" + + "\bmetadata\x18\x01 \x01(\v2\x1b.grpc.binarylog.v1.MetadataR\bmetadata\x12\x1f\n" + + "\vstatus_code\x18\x02 \x01(\rR\n" + + "statusCode\x12%\n" + + "\x0estatus_message\x18\x03 \x01(\tR\rstatusMessage\x12%\n" + + "\x0estatus_details\x18\x04 \x01(\fR\rstatusDetails\"5\n" + + "\aMessage\x12\x16\n" + + "\x06length\x18\x01 \x01(\rR\x06length\x12\x12\n" + + "\x04data\x18\x02 \x01(\fR\x04data\"B\n" + + "\bMetadata\x126\n" + + "\x05entry\x18\x01 \x03(\v2 .grpc.binarylog.v1.MetadataEntryR\x05entry\"7\n" + + "\rMetadataEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\fR\x05value\"\xb8\x01\n" + + "\aAddress\x123\n" + + "\x04type\x18\x01 \x01(\x0e2\x1f.grpc.binarylog.v1.Address.TypeR\x04type\x12\x18\n" + + "\aaddress\x18\x02 \x01(\tR\aaddress\x12\x17\n" + + "\aip_port\x18\x03 \x01(\rR\x06ipPort\"E\n" + + "\x04Type\x12\x10\n" + + "\fTYPE_UNKNOWN\x10\x00\x12\r\n" + + "\tTYPE_IPV4\x10\x01\x12\r\n" + + "\tTYPE_IPV6\x10\x02\x12\r\n" + + "\tTYPE_UNIX\x10\x03B\\\n" + + "\x14io.grpc.binarylog.v1B\x0eBinaryLogProtoP\x01Z2google.golang.org/grpc/binarylog/grpc_binarylog_v1b\x06proto3" var ( file_grpc_binlog_v1_binarylog_proto_rawDescOnce sync.Once - file_grpc_binlog_v1_binarylog_proto_rawDescData = file_grpc_binlog_v1_binarylog_proto_rawDesc + file_grpc_binlog_v1_binarylog_proto_rawDescData []byte ) func file_grpc_binlog_v1_binarylog_proto_rawDescGZIP() []byte { file_grpc_binlog_v1_binarylog_proto_rawDescOnce.Do(func() { - file_grpc_binlog_v1_binarylog_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_binlog_v1_binarylog_proto_rawDescData) + file_grpc_binlog_v1_binarylog_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_binlog_v1_binarylog_proto_rawDesc), len(file_grpc_binlog_v1_binarylog_proto_rawDesc))) }) return file_grpc_binlog_v1_binarylog_proto_rawDescData } var file_grpc_binlog_v1_binarylog_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_grpc_binlog_v1_binarylog_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_grpc_binlog_v1_binarylog_proto_goTypes = []interface{}{ +var file_grpc_binlog_v1_binarylog_proto_goTypes = []any{ (GrpcLogEntry_EventType)(0), // 0: grpc.binarylog.v1.GrpcLogEntry.EventType (GrpcLogEntry_Logger)(0), // 1: grpc.binarylog.v1.GrpcLogEntry.Logger (Address_Type)(0), // 2: grpc.binarylog.v1.Address.Type @@ -1057,105 +977,7 @@ func file_grpc_binlog_v1_binarylog_proto_init() { if File_grpc_binlog_v1_binarylog_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_binlog_v1_binarylog_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GrpcLogEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Trailer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Message); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetadataEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Address); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_grpc_binlog_v1_binarylog_proto_msgTypes[0].OneofWrappers = []any{ (*GrpcLogEntry_ClientHeader)(nil), (*GrpcLogEntry_ServerHeader)(nil), (*GrpcLogEntry_Message)(nil), @@ -1165,7 +987,7 @@ func file_grpc_binlog_v1_binarylog_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_binlog_v1_binarylog_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_binlog_v1_binarylog_proto_rawDesc), len(file_grpc_binlog_v1_binarylog_proto_rawDesc)), NumEnums: 3, NumMessages: 8, NumExtensions: 0, @@ -1177,7 +999,6 @@ func file_grpc_binlog_v1_binarylog_proto_init() { MessageInfos: file_grpc_binlog_v1_binarylog_proto_msgTypes, }.Build() File_grpc_binlog_v1_binarylog_proto = out.File - file_grpc_binlog_v1_binarylog_proto_rawDesc = nil file_grpc_binlog_v1_binarylog_proto_goTypes = nil file_grpc_binlog_v1_binarylog_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index c7f2607114..a3c315f2d7 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -24,6 +24,7 @@ import ( "fmt" "math" "net/url" + "slices" "strings" "sync" "sync/atomic" @@ -31,14 +32,15 @@ import ( "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/balancer/pickfirst" "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/idle" - "google.golang.org/grpc/internal/pretty" iresolver "google.golang.org/grpc/internal/resolver" + "google.golang.org/grpc/internal/stats" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/resolver" @@ -73,6 +75,8 @@ var ( // invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default // service config. invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid" + // PickFirstBalancerName is the name of the pick_first balancer. + PickFirstBalancerName = pickfirst.Name ) // The following errors are returned from Dial and DialContext @@ -114,15 +118,30 @@ func (dcs *defaultConfigSelector) SelectConfig(rpcInfo iresolver.RPCInfo) (*ires // NewClient creates a new gRPC "channel" for the target URI provided. No I/O // is performed. Use of the ClientConn for RPCs will automatically cause it to -// connect. Connect may be used to manually create a connection, but for most -// users this is unnecessary. +// connect. The Connect method may be called to manually create a connection, +// but for most users this should be unnecessary. // // The target name syntax is defined in -// https://github.com/grpc/grpc/blob/master/doc/naming.md. e.g. to use dns -// resolver, a "dns:///" prefix should be applied to the target. +// https://github.com/grpc/grpc/blob/master/doc/naming.md. E.g. to use the dns +// name resolver, a "dns:///" prefix may be applied to the target. The default +// name resolver will be used if no scheme is detected, or if the parsed scheme +// is not a registered name resolver. The default resolver is "dns" but can be +// overridden using the resolver package's SetDefaultScheme. // -// The DialOptions returned by WithBlock, WithTimeout, and -// WithReturnConnectionError are ignored by this function. +// Examples: +// +// - "foo.googleapis.com:8080" +// - "dns:///foo.googleapis.com:8080" +// - "dns:///foo.googleapis.com" +// - "dns:///10.0.0.213:8080" +// - "dns:///%5B2001:db8:85a3:8d3:1319:8a2e:370:7348%5D:443" +// - "dns://8.8.8.8/foo.googleapis.com:8080" +// - "dns://8.8.8.8/foo.googleapis.com" +// - "zookeeper://zk.example.com:9900/example_service" +// +// The DialOptions returned by WithBlock, WithTimeout, +// WithReturnConnectionError, and FailOnNonTempDialError are ignored by this +// function. func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) { cc := &ClientConn{ target: target, @@ -152,6 +171,16 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) for _, opt := range opts { opt.apply(&cc.dopts) } + + // Determine the resolver to use. + if err := cc.initParsedTargetAndResolverBuilder(); err != nil { + return nil, err + } + + for _, opt := range globalPerTargetDialOptions { + opt.DialOptionForTarget(cc.parsedTarget.URL).apply(&cc.dopts) + } + chainUnaryClientInterceptors(cc) chainStreamClientInterceptors(cc) @@ -160,42 +189,38 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) } if cc.dopts.defaultServiceConfigRawJSON != nil { - scpr := parseServiceConfig(*cc.dopts.defaultServiceConfigRawJSON) + scpr := parseServiceConfig(*cc.dopts.defaultServiceConfigRawJSON, cc.dopts.maxCallAttempts) if scpr.Err != nil { return nil, fmt.Errorf("%s: %v", invalidDefaultServiceConfigErrPrefix, scpr.Err) } cc.dopts.defaultServiceConfig, _ = scpr.Config.(*ServiceConfig) } - cc.mkp = cc.dopts.copts.KeepaliveParams + cc.keepaliveParams = cc.dopts.copts.KeepaliveParams - // Register ClientConn with channelz. - cc.channelzRegistration(target) - - // TODO: Ideally it should be impossible to error from this function after - // channelz registration. This will require removing some channelz logs - // from the following functions that can error. Errors can be returned to - // the user, and successful logs can be emitted here, after the checks have - // passed and channelz is subsequently registered. - - // Determine the resolver to use. - if err := cc.parseTargetAndFindResolver(); err != nil { - channelz.RemoveEntry(cc.channelz.ID) - return nil, err - } - if err = cc.determineAuthority(); err != nil { - channelz.RemoveEntry(cc.channelz.ID) + if err = cc.initAuthority(); err != nil { return nil, err } + // Register ClientConn with channelz. Note that this is only done after + // channel creation cannot fail. + cc.channelzRegistration(target) + channelz.Infof(logger, cc.channelz, "parsed dial target is: %#v", cc.parsedTarget) + channelz.Infof(logger, cc.channelz, "Channel authority set to %q", cc.authority) + cc.csMgr = newConnectivityStateManager(cc.ctx, cc.channelz) - cc.pickerWrapper = newPickerWrapper(cc.dopts.copts.StatsHandlers) + cc.pickerWrapper = newPickerWrapper() + + cc.metricsRecorderList = stats.NewMetricsRecorderList(cc.dopts.copts.StatsHandlers) cc.initIdleStateLocked() // Safe to call without the lock, since nothing else has a reference to cc. cc.idlenessMgr = idle.NewManager((*idler)(cc), cc.dopts.idleTimeout) + return cc, nil } // Dial calls DialContext(context.Background(), target, opts...). +// +// Deprecated: use NewClient instead. Will be supported throughout 1.x. func Dial(target string, opts ...DialOption) (*ClientConn, error) { return DialContext(context.Background(), target, opts...) } @@ -209,10 +234,17 @@ func Dial(target string, opts ...DialOption) (*ClientConn, error) { // "passthrough" for backward compatibility. This distinction should not matter // to most users, but could matter to legacy users that specify a custom dialer // and expect it to receive the target string directly. +// +// Deprecated: use NewClient instead. Will be supported throughout 1.x. func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { // At the end of this method, we kick the channel out of idle, rather than // waiting for the first rpc. - opts = append([]DialOption{withDefaultScheme("passthrough")}, opts...) + // + // WithLocalDNSResolution dial option in `grpc.Dial` ensures that it + // preserves behavior: when default scheme passthrough is used, skip + // hostname resolution, when "dns" is used for resolution, perform + // resolution on the client. + opts = append([]DialOption{withDefaultScheme("passthrough"), WithLocalDNSResolution()}, opts...) cc, err := NewClient(target, opts...) if err != nil { return nil, err @@ -424,7 +456,7 @@ func (cc *ClientConn) validateTransportCredentials() error { func (cc *ClientConn) channelzRegistration(target string) { parentChannel, _ := cc.dopts.channelzParent.(*channelz.Channel) cc.channelz = channelz.RegisterChannel(parentChannel, target) - cc.addTraceEvent("created") + cc.addTraceEvent(fmt.Sprintf("created for target %q", target)) } // chainUnaryClientInterceptors chains all unary client interceptors into one. @@ -582,13 +614,14 @@ type ClientConn struct { cancel context.CancelFunc // Cancelled on close. // The following are initialized at dial time, and are read-only after that. - target string // User's dial target. - parsedTarget resolver.Target // See parseTargetAndFindResolver(). - authority string // See determineAuthority(). - dopts dialOptions // Default and user specified dial options. - channelz *channelz.Channel // Channelz object. - resolverBuilder resolver.Builder // See parseTargetAndFindResolver(). - idlenessMgr *idle.Manager + target string // User's dial target. + parsedTarget resolver.Target // See initParsedTargetAndResolverBuilder(). + authority string // See initAuthority(). + dopts dialOptions // Default and user specified dial options. + channelz *channelz.Channel // Channelz object. + resolverBuilder resolver.Builder // See initParsedTargetAndResolverBuilder(). + idlenessMgr *idle.Manager + metricsRecorderList *stats.MetricsRecorderList // The following provide their own synchronization, and therefore don't // require cc.mu to be held to access them. @@ -604,7 +637,7 @@ type ClientConn struct { balancerWrapper *ccBalancerWrapper // Always recreated whenever entering idle to simplify Close. sc *ServiceConfig // Latest service config received from the resolver. conns map[*addrConn]struct{} // Set to nil on close. - mkp keepalive.ClientParameters // May be updated upon receipt of a GoAway. + keepaliveParams keepalive.ClientParameters // May be updated upon receipt of a GoAway. // firstResolveEvent is used to track whether the name resolver sent us at // least one update. RPCs block on this event. May be accessed without mu // if we know we cannot be asked to enter idle mode while accessing it (e.g. @@ -618,11 +651,6 @@ type ClientConn struct { // WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or // ctx expires. A true value is returned in former case and false in latter. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connectivity.State) bool { ch := cc.csMgr.getNotifyChan() if cc.csMgr.getState() != sourceState { @@ -637,11 +665,6 @@ func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connec } // GetState returns the connectivity.State of ClientConn. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a later -// release. func (cc *ClientConn) GetState() connectivity.State { return cc.csMgr.getState() } @@ -666,30 +689,38 @@ func (cc *ClientConn) Connect() { cc.mu.Unlock() } -// waitForResolvedAddrs blocks until the resolver has provided addresses or the -// context expires. Returns nil unless the context expires first; otherwise -// returns a status error based on the context. -func (cc *ClientConn) waitForResolvedAddrs(ctx context.Context) error { +// waitForResolvedAddrs blocks until the resolver provides addresses or the +// context expires, whichever happens first. +// +// Error is nil unless the context expires first; otherwise returns a status +// error based on the context. +// +// The returned boolean indicates whether it did block or not. If the +// resolution has already happened once before, it returns false without +// blocking. Otherwise, it wait for the resolution and return true if +// resolution has succeeded or return false along with error if resolution has +// failed. +func (cc *ClientConn) waitForResolvedAddrs(ctx context.Context) (bool, error) { // This is on the RPC path, so we use a fast path to avoid the // more-expensive "select" below after the resolver has returned once. if cc.firstResolveEvent.HasFired() { - return nil + return false, nil } + internal.NewStreamWaitingForResolver() select { case <-cc.firstResolveEvent.Done(): - return nil + return true, nil case <-ctx.Done(): - return status.FromContextError(ctx.Err()).Err() + return false, status.FromContextError(ctx.Err()).Err() case <-cc.ctx.Done(): - return ErrClientConnClosing + return false, ErrClientConnClosing } } var emptyServiceConfig *ServiceConfig func init() { - balancer.Register(pickfirstBuilder{}) - cfg := parseServiceConfig("{}") + cfg := parseServiceConfig("{}", defaultMaxCallAttempts) if cfg.Err != nil { panic(fmt.Sprintf("impossible error parsing empty service config: %v", cfg.Err)) } @@ -772,10 +803,7 @@ func (cc *ClientConn) updateResolverStateAndUnlock(s resolver.State, err error) } } - var balCfg serviceconfig.LoadBalancingConfig - if cc.sc != nil && cc.sc.lbConfig != nil { - balCfg = cc.sc.lbConfig - } + balCfg := cc.sc.lbConfig bw := cc.balancerWrapper cc.mu.Unlock() @@ -805,17 +833,11 @@ func (cc *ClientConn) applyFailingLBLocked(sc *serviceconfig.ParseResult) { cc.csMgr.updateState(connectivity.TransientFailure) } -// Makes a copy of the input addresses slice and clears out the balancer -// attributes field. Addresses are passed during subconn creation and address -// update operations. In both cases, we will clear the balancer attributes by -// calling this function, and therefore we will be able to use the Equal method -// provided by the resolver.Address type for comparison. -func copyAddressesWithoutBalancerAttributes(in []resolver.Address) []resolver.Address { +// Makes a copy of the input addresses slice. Addresses are passed during +// subconn creation and address update operations. +func copyAddresses(in []resolver.Address) []resolver.Address { out := make([]resolver.Address, len(in)) - for i := range in { - out[i] = in[i] - out[i].BalancerAttributes = nil - } + copy(out, in) return out } @@ -830,14 +852,16 @@ func (cc *ClientConn) newAddrConnLocked(addrs []resolver.Address, opts balancer. ac := &addrConn{ state: connectivity.Idle, cc: cc, - addrs: copyAddressesWithoutBalancerAttributes(addrs), + addrs: copyAddresses(addrs), scopts: opts, dopts: cc.dopts, channelz: channelz.RegisterSubChannel(cc.channelz, ""), resetBackoff: make(chan struct{}), - stateChan: make(chan struct{}), } ac.ctx, ac.cancel = context.WithCancel(cc.ctx) + // Start with our address set to the first address; this may be updated if + // we connect to different addresses. + ac.channelz.ChannelMetrics.Target.Store(&addrs[0].Addr) channelz.AddTraceEvent(logger, ac.channelz, 0, &channelz.TraceEvent{ Desc: "Subchannel created", @@ -871,7 +895,13 @@ func (cc *ClientConn) Target() string { return cc.target } -// CanonicalTarget returns the canonical target string of the ClientConn. +// CanonicalTarget returns the canonical target string used when creating cc. +// +// This always has the form "://[authority]/". For example: +// +// - "dns:///example.com:42" +// - "dns://8.8.8.8/example.com:42" +// - "unix:///path/to/socket" func (cc *ClientConn) CanonicalTarget() string { return cc.parsedTarget.String() } @@ -908,32 +938,37 @@ func (ac *addrConn) connect() error { ac.mu.Unlock() return nil } - ac.mu.Unlock() - ac.resetTransport() + ac.resetTransportAndUnlock() return nil } -func equalAddresses(a, b []resolver.Address) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if !v.Equal(b[i]) { - return false - } - } - return true +// equalAddressIgnoringBalAttributes returns true is a and b are considered equal. +// This is different from the Equal method on the resolver.Address type which +// considers all fields to determine equality. Here, we only consider fields +// that are meaningful to the subConn. +func equalAddressIgnoringBalAttributes(a, b *resolver.Address) bool { + return a.Addr == b.Addr && a.ServerName == b.ServerName && + a.Attributes.Equal(b.Attributes) && + a.Metadata == b.Metadata +} + +func equalAddressesIgnoringBalAttributes(a, b []resolver.Address) bool { + return slices.EqualFunc(a, b, func(a, b resolver.Address) bool { return equalAddressIgnoringBalAttributes(&a, &b) }) } // updateAddrs updates ac.addrs with the new addresses list and handles active // connections or connection attempts. func (ac *addrConn) updateAddrs(addrs []resolver.Address) { - ac.mu.Lock() - channelz.Infof(logger, ac.channelz, "addrConn: updateAddrs curAddr: %v, addrs: %v", pretty.ToJSON(ac.curAddr), pretty.ToJSON(addrs)) + addrs = copyAddresses(addrs) + limit := len(addrs) + if limit > 5 { + limit = 5 + } + channelz.Infof(logger, ac.channelz, "addrConn: updateAddrs addrs (%d of %d): %v", limit, len(addrs), addrs[:limit]) - addrs = copyAddressesWithoutBalancerAttributes(addrs) - if equalAddresses(ac.addrs, addrs) { + ac.mu.Lock() + if equalAddressesIgnoringBalAttributes(ac.addrs, addrs) { ac.mu.Unlock() return } @@ -952,7 +987,7 @@ func (ac *addrConn) updateAddrs(addrs []resolver.Address) { // Try to find the connected address. for _, a := range addrs { a.ServerName = ac.cc.getServerName(a) - if a.Equal(ac.curAddr) { + if equalAddressIgnoringBalAttributes(&a, &ac.curAddr) { // We are connected to a valid address, so do nothing but // update the addresses. ac.mu.Unlock() @@ -978,11 +1013,9 @@ func (ac *addrConn) updateAddrs(addrs []resolver.Address) { ac.updateConnectivityState(connectivity.Idle, nil) } - ac.mu.Unlock() - // Since we were connecting/connected, we should start a new connection // attempt. - go ac.resetTransport() + go ac.resetTransportAndUnlock() } // getServerName determines the serverName to be used in the connection @@ -1043,13 +1076,6 @@ func (cc *ClientConn) healthCheckConfig() *healthCheckConfig { return cc.sc.healthCheckConfig } -func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method string) (transport.ClientTransport, balancer.PickResult, error) { - return cc.pickerWrapper.pick(ctx, failfast, balancer.PickInfo{ - Ctx: ctx, - FullMethodName: method, - }) -} - func (cc *ClientConn) applyServiceConfigAndBalancer(sc *ServiceConfig, configSelector iresolver.ConfigSelector) { if sc == nil { // should never reach here. @@ -1138,10 +1164,15 @@ func (cc *ClientConn) Close() error { <-cc.resolverWrapper.serializer.Done() <-cc.balancerWrapper.serializer.Done() - + var wg sync.WaitGroup for ac := range conns { - ac.tearDown(ErrClientConnClosing) + wg.Add(1) + go func(ac *addrConn) { + defer wg.Done() + ac.tearDown(ErrClientConnClosing) + }(ac) } + wg.Wait() cc.addTraceEvent("deleted") // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add // trace reference to the entity being deleted, and thus prevent it from being @@ -1167,13 +1198,16 @@ type addrConn struct { // is received, transport is closed, ac has been torn down). transport transport.ClientTransport // The current transport. + // This mutex is used on the RPC path, so its usage should be minimized as + // much as possible. + // TODO: Find a lock-free way to retrieve the transport and state from the + // addrConn. mu sync.Mutex curAddr resolver.Address // The current address. addrs []resolver.Address // All addresses that the resolver resolved to. // Use updateConnectivityState for updating addrConn's connectivity state. - state connectivity.State - stateChan chan struct{} // closed and recreated on every state change. + state connectivity.State backoffIdx int // Needs to be stateful for resetConnectBackoff. resetBackoff chan struct{} @@ -1186,9 +1220,6 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) if ac.state == s { return } - // When changing states, reset the state change channel. - close(ac.stateChan) - ac.stateChan = make(chan struct{}) ac.state = s ac.channelz.ChannelMetrics.State.Store(&s) if lastErr == nil { @@ -1196,25 +1227,26 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) } else { channelz.Infof(logger, ac.channelz, "Subchannel Connectivity change to %v, last error: %s", s, lastErr) } - ac.acbw.updateState(s, lastErr) + ac.acbw.updateState(s, ac.curAddr, lastErr) } // adjustParams updates parameters used to create transports upon // receiving a GoAway. func (ac *addrConn) adjustParams(r transport.GoAwayReason) { - switch r { - case transport.GoAwayTooManyPings: + if r == transport.GoAwayTooManyPings { v := 2 * ac.dopts.copts.KeepaliveParams.Time ac.cc.mu.Lock() - if v > ac.cc.mkp.Time { - ac.cc.mkp.Time = v + if v > ac.cc.keepaliveParams.Time { + ac.cc.keepaliveParams.Time = v } ac.cc.mu.Unlock() } } -func (ac *addrConn) resetTransport() { - ac.mu.Lock() +// resetTransportAndUnlock unconditionally connects the addrConn. +// +// ac.mu must be held by the caller, and this function will guarantee it is released. +func (ac *addrConn) resetTransportAndUnlock() { acCtx := ac.ctx if acCtx.Err() != nil { ac.mu.Unlock() @@ -1245,6 +1277,8 @@ func (ac *addrConn) resetTransport() { ac.mu.Unlock() if err := ac.tryAllAddrs(acCtx, addrs, connectDeadline); err != nil { + // TODO: #7534 - Move re-resolution requests into the pick_first LB policy + // to ensure one resolution request per pass instead of per subconn failure. ac.cc.resolveNow(resolver.ResolveNowOptions{}) ac.mu.Lock() if acCtx.Err() != nil { @@ -1286,19 +1320,20 @@ func (ac *addrConn) resetTransport() { ac.mu.Unlock() } -// tryAllAddrs tries to creates a connection to the addresses, and stop when at +// tryAllAddrs tries to create a connection to the addresses, and stop when at // the first successful one. It returns an error if no address was successfully // connected, or updates ac appropriately with the new transport. func (ac *addrConn) tryAllAddrs(ctx context.Context, addrs []resolver.Address, connectDeadline time.Time) error { var firstConnErr error for _, addr := range addrs { + ac.channelz.ChannelMetrics.Target.Store(&addr.Addr) if ctx.Err() != nil { return errConnClosing } ac.mu.Lock() ac.cc.mu.RLock() - ac.dopts.copts.KeepaliveParams = ac.cc.mkp + ac.dopts.copts.KeepaliveParams = ac.cc.keepaliveParams ac.cc.mu.RUnlock() copts := ac.dopts.copts @@ -1362,7 +1397,7 @@ func (ac *addrConn) createTransport(ctx context.Context, addr resolver.Address, defer cancel() copts.ChannelzParent = ac.channelz - newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onClose) + newTr, err := transport.NewHTTP2Client(connectCtx, ac.cc.ctx, addr, copts, onClose) if err != nil { if logger.V(2) { logger.Infof("Creating new client transport to %q: %v", addr, err) @@ -1436,7 +1471,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { if !ac.scopts.HealthCheckEnabled { return } - healthCheckFunc := ac.cc.dopts.healthCheckFunc + healthCheckFunc := internal.HealthCheckFunc if healthCheckFunc == nil { // The health package is not imported to set health check function. // @@ -1468,7 +1503,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { } // Start the health checking stream. go func() { - err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) + err := healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) if err != nil { if status.Code(err) == codes.Unimplemented { channelz.Error(logger, ac.channelz, "Subchannel health check is unimplemented at server side, thus health check is disabled") @@ -1497,29 +1532,6 @@ func (ac *addrConn) getReadyTransport() transport.ClientTransport { return nil } -// getTransport waits until the addrconn is ready and returns the transport. -// If the context expires first, returns an appropriate status. If the -// addrConn is stopped first, returns an Unavailable status error. -func (ac *addrConn) getTransport(ctx context.Context) (transport.ClientTransport, error) { - for ctx.Err() == nil { - ac.mu.Lock() - t, state, sc := ac.transport, ac.state, ac.stateChan - ac.mu.Unlock() - if state == connectivity.Ready { - return t, nil - } - if state == connectivity.Shutdown { - return nil, status.Errorf(codes.Unavailable, "SubConn shutting down") - } - - select { - case <-ctx.Done(): - case <-sc: - } - } - return nil, status.FromContextError(ctx.Err()).Err() -} - // tearDown starts to tear down the addrConn. // // Note that tearDown doesn't remove ac from ac.cc.conns, so the addrConn struct @@ -1566,7 +1578,7 @@ func (ac *addrConn) tearDown(err error) { } else { // Hard close the transport when the channel is entering idle or is // being shutdown. In the case where the channel is being shutdown, - // closing of transports is also taken care of by cancelation of cc.ctx. + // closing of transports is also taken care of by cancellation of cc.ctx. // But in the case where the channel is entering idle, we need to // explicitly close the transports here. Instead of distinguishing // between these two cases, it is simpler to close the transport @@ -1657,22 +1669,19 @@ func (cc *ClientConn) connectionError() error { return cc.lastConnectionError } -// parseTargetAndFindResolver parses the user's dial target and stores the -// parsed target in `cc.parsedTarget`. +// initParsedTargetAndResolverBuilder parses the user's dial target and stores +// the parsed target in `cc.parsedTarget`. // // The resolver to use is determined based on the scheme in the parsed target // and the same is stored in `cc.resolverBuilder`. // // Doesn't grab cc.mu as this method is expected to be called only at Dial time. -func (cc *ClientConn) parseTargetAndFindResolver() error { - channelz.Infof(logger, cc.channelz, "original dial target is: %q", cc.target) +func (cc *ClientConn) initParsedTargetAndResolverBuilder() error { + logger.Infof("original dial target is: %q", cc.target) var rb resolver.Builder parsedTarget, err := parseTarget(cc.target) - if err != nil { - channelz.Infof(logger, cc.channelz, "dial target %q parse failed: %v", cc.target, err) - } else { - channelz.Infof(logger, cc.channelz, "parsed dial target is: %#v", parsedTarget) + if err == nil { rb = cc.getResolver(parsedTarget.URL.Scheme) if rb != nil { cc.parsedTarget = parsedTarget @@ -1691,15 +1700,12 @@ func (cc *ClientConn) parseTargetAndFindResolver() error { defScheme = resolver.GetDefaultScheme() } - channelz.Infof(logger, cc.channelz, "fallback to scheme %q", defScheme) canonicalTarget := defScheme + ":///" + cc.target parsedTarget, err = parseTarget(canonicalTarget) if err != nil { - channelz.Infof(logger, cc.channelz, "dial target %q parse failed: %v", canonicalTarget, err) return err } - channelz.Infof(logger, cc.channelz, "parsed dial target is: %+v", parsedTarget) rb = cc.getResolver(parsedTarget.URL.Scheme) if rb == nil { return fmt.Errorf("could not get resolver for default scheme: %q", parsedTarget.URL.Scheme) @@ -1739,7 +1745,7 @@ func encodeAuthority(authority string) string { return false case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // Subdelim characters return false - case ':', '[', ']', '@': // Authority related delimeters + case ':', '[', ']', '@': // Authority related delimiters return false } // Everything else must be escaped. @@ -1789,7 +1795,7 @@ func encodeAuthority(authority string) string { // credentials do not match the authority configured through the dial option. // // Doesn't grab cc.mu as this method is expected to be called only at Dial time. -func (cc *ClientConn) determineAuthority() error { +func (cc *ClientConn) initAuthority() error { dopts := cc.dopts // Historically, we had two options for users to specify the serverName or // authority for a channel. One was through the transport credentials @@ -1818,10 +1824,9 @@ func (cc *ClientConn) determineAuthority() error { } else if auth, ok := cc.resolverBuilder.(resolver.AuthorityOverrider); ok { cc.authority = auth.OverrideAuthority(cc.parsedTarget) } else if strings.HasPrefix(endpoint, ":") { - cc.authority = "localhost" + endpoint + cc.authority = "localhost" + encodeAuthority(endpoint) } else { cc.authority = encodeAuthority(endpoint) } - channelz.Infof(logger, cc.channelz, "Channel authority set to %q", cc.authority) return nil } diff --git a/vendor/google.golang.org/grpc/codec.go b/vendor/google.golang.org/grpc/codec.go index 411e3dfd47..959c2f99d4 100644 --- a/vendor/google.golang.org/grpc/codec.go +++ b/vendor/google.golang.org/grpc/codec.go @@ -21,18 +21,73 @@ package grpc import ( "google.golang.org/grpc/encoding" _ "google.golang.org/grpc/encoding/proto" // to register the Codec for "proto" + "google.golang.org/grpc/mem" ) -// baseCodec contains the functionality of both Codec and encoding.Codec, but -// omits the name/string, which vary between the two and are not needed for -// anything besides the registry in the encoding package. +// baseCodec captures the new encoding.CodecV2 interface without the Name +// function, allowing it to be implemented by older Codec and encoding.Codec +// implementations. The omitted Name function is only needed for the register in +// the encoding package and is not part of the core functionality. type baseCodec interface { - Marshal(v any) ([]byte, error) - Unmarshal(data []byte, v any) error + Marshal(v any) (mem.BufferSlice, error) + Unmarshal(data mem.BufferSlice, v any) error +} + +// getCodec returns an encoding.CodecV2 for the codec of the given name (if +// registered). Initially checks the V2 registry with encoding.GetCodecV2 and +// returns the V2 codec if it is registered. Otherwise, it checks the V1 registry +// with encoding.GetCodec and if it is registered wraps it with newCodecV1Bridge +// to turn it into an encoding.CodecV2. Returns nil otherwise. +func getCodec(name string) encoding.CodecV2 { + if codecV1 := encoding.GetCodec(name); codecV1 != nil { + return newCodecV1Bridge(codecV1) + } + + return encoding.GetCodecV2(name) +} + +func newCodecV0Bridge(c Codec) baseCodec { + return codecV0Bridge{codec: c} +} + +func newCodecV1Bridge(c encoding.Codec) encoding.CodecV2 { + return codecV1Bridge{ + codecV0Bridge: codecV0Bridge{codec: c}, + name: c.Name(), + } +} + +var _ baseCodec = codecV0Bridge{} + +type codecV0Bridge struct { + codec interface { + Marshal(v any) ([]byte, error) + Unmarshal(data []byte, v any) error + } +} + +func (c codecV0Bridge) Marshal(v any) (mem.BufferSlice, error) { + data, err := c.codec.Marshal(v) + if err != nil { + return nil, err + } + return mem.BufferSlice{mem.SliceBuffer(data)}, nil +} + +func (c codecV0Bridge) Unmarshal(data mem.BufferSlice, v any) (err error) { + return c.codec.Unmarshal(data.Materialize(), v) } -var _ baseCodec = Codec(nil) -var _ baseCodec = encoding.Codec(nil) +var _ encoding.CodecV2 = codecV1Bridge{} + +type codecV1Bridge struct { + codecV0Bridge + name string +} + +func (c codecV1Bridge) Name() string { + return c.name +} // Codec defines the interface gRPC uses to encode and decode messages. // Note that implementations of this interface must be thread safe; diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh deleted file mode 100644 index 4cdc6ba7c0..0000000000 --- a/vendor/google.golang.org/grpc/codegen.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# This script serves as an example to demonstrate how to generate the gRPC-Go -# interface and the related messages from .proto file. -# -# It assumes the installation of i) Google proto buffer compiler at -# https://github.com/google/protobuf (after v2.6.1) and ii) the Go codegen -# plugin at https://github.com/golang/protobuf (after 2015-02-20). If you have -# not, please install them first. -# -# We recommend running this script at $GOPATH/src. -# -# If this is not what you need, feel free to make your own scripts. Again, this -# script is for demonstration purpose. -# -proto=$1 -protoc --go_out=plugins=grpc:. $proto diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go index 08476ad1fe..0b42c302b2 100644 --- a/vendor/google.golang.org/grpc/codes/codes.go +++ b/vendor/google.golang.org/grpc/codes/codes.go @@ -235,7 +235,7 @@ func (c *Code) UnmarshalJSON(b []byte) error { if ci, err := strconv.ParseUint(string(b), 10, 32); err == nil { if ci >= _maxCode { - return fmt.Errorf("invalid code: %q", ci) + return fmt.Errorf("invalid code: %d", ci) } *c = Code(ci) diff --git a/vendor/google.golang.org/grpc/credentials/alts/alts.go b/vendor/google.golang.org/grpc/credentials/alts/alts.go index afcdb8a0db..35539eb1ad 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/alts.go +++ b/vendor/google.golang.org/grpc/credentials/alts/alts.go @@ -133,10 +133,11 @@ func DefaultServerOptions() *ServerOptions { // altsTC is the credentials required for authenticating a connection using ALTS. // It implements credentials.TransportCredentials interface. type altsTC struct { - info *credentials.ProtocolInfo - side core.Side - accounts []string - hsAddress string + info *credentials.ProtocolInfo + side core.Side + accounts []string + hsAddress string + boundAccessToken string } // NewClientCreds constructs a client-side ALTS TransportCredentials object. @@ -198,6 +199,7 @@ func (g *altsTC) ClientHandshake(ctx context.Context, addr string, rawConn net.C MaxRpcVersion: maxRPCVersion, MinRpcVersion: minRPCVersion, } + opts.BoundAccessToken = g.boundAccessToken chs, err := handshaker.NewClientHandshaker(ctx, hsConn, rawConn, opts) if err != nil { return nil, nil, err diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go index 43726e877b..7e4bfee888 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go @@ -49,7 +49,7 @@ func (k KeySizeError) Error() string { // newRekeyAEAD creates a new instance of aes128gcm with rekeying. // The key argument should be 44 bytes, the first 32 bytes are used as a key -// for HKDF-expand and the remainining 12 bytes are used as a random mask for +// for HKDF-expand and the remaining 12 bytes are used as a random mask for // the counter. func newRekeyAEAD(key []byte) (*rekeyAEAD, error) { k := len(key) diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go index 6a9035ea25..b5bbb5497a 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go @@ -51,7 +51,7 @@ type aes128gcmRekey struct { // NewAES128GCMRekey creates an instance that uses aes128gcm with rekeying // for ALTS record. The key argument should be 44 bytes, the first 32 bytes -// are used as a key for HKDF-expand and the remainining 12 bytes are used +// are used as a key for HKDF-expand and the remaining 12 bytes are used // as a random mask for the counter. func NewAES128GCMRekey(side core.Side, key []byte) (ALTSRecordCrypto, error) { inCounter := NewInCounter(side, overflowLenAES128GCMRekey) diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go index 1795d0c9e3..46617132a4 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go @@ -54,11 +54,10 @@ func SliceForAppend(in []byte, n int) (head, tail []byte) { func ParseFramedMsg(b []byte, maxLen uint32) ([]byte, []byte, error) { // If the size field is not complete, return the provided buffer as // remaining buffer. - if len(b) < MsgLenFieldSize { + length, sufficientBytes := parseMessageLength(b) + if !sufficientBytes { return nil, b, nil } - msgLenField := b[:MsgLenFieldSize] - length := binary.LittleEndian.Uint32(msgLenField) if length > maxLen { return nil, nil, fmt.Errorf("received the frame length %d larger than the limit %d", length, maxLen) } @@ -68,3 +67,14 @@ func ParseFramedMsg(b []byte, maxLen uint32) ([]byte, []byte, error) { } return b[:MsgLenFieldSize+length], b[MsgLenFieldSize+length:], nil } + +// parseMessageLength returns the message length based on frame header. It also +// returns a boolean indicating if the buffer contains sufficient bytes to parse +// the length header. If there are insufficient bytes, (0, false) is returned. +func parseMessageLength(b []byte) (uint32, bool) { + if len(b) < MsgLenFieldSize { + return 0, false + } + msgLenField := b[:MsgLenFieldSize] + return binary.LittleEndian.Uint32(msgLenField), true +} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go index 0d64fb37a1..f9d2646d4b 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go @@ -31,14 +31,18 @@ import ( // ALTSRecordCrypto is the interface for gRPC ALTS record protocol. type ALTSRecordCrypto interface { - // Encrypt encrypts the plaintext and computes the tag (if any) of dst - // and plaintext. dst and plaintext may fully overlap or not at all. + // Encrypt encrypts the plaintext, computes the tag (if any) of dst and + // plaintext, and appends the result to dst, returning the updated slice. + // dst and plaintext may fully overlap or not at all. Encrypt(dst, plaintext []byte) ([]byte, error) // EncryptionOverhead returns the tag size (if any) in bytes. EncryptionOverhead() int - // Decrypt decrypts ciphertext and verify the tag (if any). dst and - // ciphertext may alias exactly or not at all. To reuse ciphertext's - // storage for the decrypted output, use ciphertext[:0] as dst. + // Decrypt decrypts ciphertext and verifies the tag (if any). If successful, + // this function appends the resulting plaintext to dst, returning the + // updated slice. dst and ciphertext may alias exactly or not at all. To + // reuse ciphertext's storage for the decrypted output, use ciphertext[:0] + // as dst. Even if the function fails, the contents of dst, up to its + // capacity, may be overwritten. Decrypt(dst, ciphertext []byte) ([]byte, error) } @@ -63,6 +67,8 @@ const ( // The maximum write buffer size. This *must* be multiple of // altsRecordDefaultLength. altsWriteBufferMaxSize = 512 * 1024 // 512KiB + // The initial buffer used to read from the network. + altsReadBufferInitialSize = 32 * 1024 // 32KiB ) var ( @@ -83,7 +89,7 @@ type conn struct { net.Conn crypto ALTSRecordCrypto // buf holds data that has been read from the connection and decrypted, - // but has not yet been returned by Read. + // but has not yet been returned by Read. It is a sub-slice of protected. buf []byte payloadLengthLimit int // protected holds data read from the network but have not yet been @@ -111,21 +117,13 @@ func NewConn(c net.Conn, side core.Side, recordProtocol string, key []byte, prot } overhead := MsgLenFieldSize + msgTypeFieldSize + crypto.EncryptionOverhead() payloadLengthLimit := altsRecordDefaultLength - overhead - var protectedBuf []byte - if protected == nil { - // We pre-allocate protected to be of size - // 2*altsRecordDefaultLength-1 during initialization. We only - // read from the network into protected when protected does not - // contain a complete frame, which is at most - // altsRecordDefaultLength-1 (bytes). And we read at most - // altsRecordDefaultLength (bytes) data into protected at one - // time. Therefore, 2*altsRecordDefaultLength-1 is large enough - // to buffer data read from the network. - protectedBuf = make([]byte, 0, 2*altsRecordDefaultLength-1) - } else { - protectedBuf = make([]byte, len(protected)) - copy(protectedBuf, protected) - } + // We pre-allocate protected to be of size 32KB during initialization. + // We increase the size of the buffer by the required amount if it can't + // hold a complete encrypted record. + protectedBuf := make([]byte, max(altsReadBufferInitialSize, len(protected))) + // Copy additional data from hanshaker service. + copy(protectedBuf, protected) + protectedBuf = protectedBuf[:len(protected)] altsConn := &conn{ Conn: c, @@ -162,11 +160,26 @@ func (p *conn) Read(b []byte) (n int, err error) { // Check whether a complete frame has been received yet. for len(framedMsg) == 0 { if len(p.protected) == cap(p.protected) { - tmp := make([]byte, len(p.protected), cap(p.protected)+altsRecordDefaultLength) - copy(tmp, p.protected) - p.protected = tmp + // We can parse the length header to know exactly how large + // the buffer needs to be to hold the entire frame. + length, didParse := parseMessageLength(p.protected) + if !didParse { + // The protected buffer is initialized with a capacity of + // larger than 4B. It should always hold the message length + // header. + panic(fmt.Sprintf("protected buffer length shorter than expected: %d vs %d", len(p.protected), MsgLenFieldSize)) + } + oldProtectedBuf := p.protected + // The new buffer must be able to hold the message length header + // and the entire message. + requiredCapacity := int(length) + MsgLenFieldSize + p.protected = make([]byte, requiredCapacity) + // Copy the contents of the old buffer and set the length of the + // new buffer to the number of bytes already read. + copy(p.protected, oldProtectedBuf) + p.protected = p.protected[:len(oldProtectedBuf)] } - n, err = p.Conn.Read(p.protected[len(p.protected):min(cap(p.protected), len(p.protected)+altsRecordDefaultLength)]) + n, err = p.Conn.Read(p.protected[len(p.protected):cap(p.protected)]) if err != nil { return 0, err } @@ -185,6 +198,15 @@ func (p *conn) Read(b []byte) (n int, err error) { } ciphertext := msg[msgTypeFieldSize:] + // Decrypt directly into the buffer, avoiding a copy from p.buf if + // possible. + if len(b) >= len(ciphertext) { + dec, err := p.crypto.Decrypt(b[:0], ciphertext) + if err != nil { + return 0, err + } + return len(dec), nil + } // Decrypt requires that if the dst and ciphertext alias, they // must alias exactly. Code here used to use msg[:0], but msg // starts MsgLenFieldSize+msgTypeFieldSize bytes earlier than @@ -266,10 +288,3 @@ func (p *conn) Write(b []byte) (n int, err error) { } return n, nil } - -func min(a, b int) int { - if a < b { - return a - } - return b -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go index 6c867dd850..f4974b504b 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go @@ -88,6 +88,8 @@ type ClientHandshakerOptions struct { TargetServiceAccounts []string // RPCVersions specifies the gRPC versions accepted by the client. RPCVersions *altspb.RpcProtocolVersions + // BoundAccessToken is a bound access token to be sent to the server for authentication. + BoundAccessToken string } // ServerHandshakerOptions contains the server handshaker options that can @@ -128,7 +130,7 @@ type altsHandshaker struct { // NewClientHandshaker creates a core.Handshaker that performs a client-side // ALTS handshake by acting as a proxy between the peer and the ALTS handshaker // service in the metadata server. -func NewClientHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, opts *ClientHandshakerOptions) (core.Handshaker, error) { +func NewClientHandshaker(_ context.Context, conn *grpc.ClientConn, c net.Conn, opts *ClientHandshakerOptions) (core.Handshaker, error) { return &altsHandshaker{ stream: nil, conn: c, @@ -141,7 +143,7 @@ func NewClientHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, // NewServerHandshaker creates a core.Handshaker that performs a server-side // ALTS handshake by acting as a proxy between the peer and the ALTS handshaker // service in the metadata server. -func NewServerHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, opts *ServerHandshakerOptions) (core.Handshaker, error) { +func NewServerHandshaker(_ context.Context, conn *grpc.ClientConn, c net.Conn, opts *ServerHandshakerOptions) (core.Handshaker, error) { return &altsHandshaker{ stream: nil, conn: c, @@ -195,7 +197,9 @@ func (h *altsHandshaker) ClientHandshake(ctx context.Context) (net.Conn, credent }, }, } - + if h.clientOpts.BoundAccessToken != "" { + req.GetClientStart().AccessToken = h.clientOpts.BoundAccessToken + } conn, result, err := h.doHandshake(req) if err != nil { return nil, nil, err @@ -294,11 +298,11 @@ func (h *altsHandshaker) doHandshake(req *altspb.HandshakerReq) (net.Conn, *alts func (h *altsHandshaker) accessHandshakerService(req *altspb.HandshakerReq) (*altspb.HandshakerResp, error) { if err := h.stream.Send(req); err != nil { - return nil, err + return nil, fmt.Errorf("failed to send ALTS handshaker request: %w", err) } resp, err := h.stream.Recv() if err != nil { - return nil, err + return nil, fmt.Errorf("failed to receive ALTS handshaker response: %w", err) } return resp, nil } @@ -308,6 +312,7 @@ func (h *altsHandshaker) accessHandshakerService(req *altspb.HandshakerReq) (*al // whatever received from the network and send it to the handshaker service. func (h *altsHandshaker) processUntilDone(resp *altspb.HandshakerResp, extra []byte) (*altspb.HandshakerResult, []byte, error) { var lastWriteTime time.Time + buf := make([]byte, frameLimit) for { if len(resp.OutFrames) > 0 { lastWriteTime = time.Now() @@ -318,7 +323,6 @@ func (h *altsHandshaker) processUntilDone(resp *altspb.HandshakerResp, extra []b if resp.Result != nil { return resp.Result, extra, nil } - buf := make([]byte, frameLimit) n, err := h.conn.Read(buf) if err != nil && err != io.EOF { return nil, nil, err diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go index e1cdafb980..2580995d99 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go @@ -22,9 +22,12 @@ package service import ( "sync" + "time" grpc "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/internal/envconfig" + "google.golang.org/grpc/keepalive" ) var ( @@ -34,8 +37,6 @@ var ( // to a corresponding connection to a hypervisor handshaker service // instance. hsConnMap = make(map[string]*grpc.ClientConn) - // hsDialer will be reassigned in tests. - hsDialer = grpc.Dial ) // Dial dials the handshake service in the hypervisor. If a connection has @@ -49,8 +50,20 @@ func Dial(hsAddress string) (*grpc.ClientConn, error) { if !ok { // Create a new connection to the handshaker service. Note that // this connection stays open until the application is closed. + // Disable the service config to avoid unnecessary TXT record lookups that + // cause timeouts with some versions of systemd-resolved. var err error - hsConn, err = hsDialer(hsAddress, grpc.WithTransportCredentials(insecure.NewCredentials())) + opts := []grpc.DialOption{ + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithDisableServiceConfig(), + } + if envconfig.ALTSHandshakerKeepaliveParams { + opts = append(opts, grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Timeout: 10 * time.Second, + Time: 10 * time.Minute, + })) + } + hsConn, err = grpc.NewClient(hsAddress, opts...) if err != nil { return nil, err } diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go index ca4d033154..331dd6c846 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/gcp/altscontext.proto package grpc_gcp @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -38,10 +39,7 @@ const ( ) type AltsContext struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The application protocol negotiated for this connection. ApplicationProtocol string `protobuf:"bytes,1,opt,name=application_protocol,json=applicationProtocol,proto3" json:"application_protocol,omitempty"` // The record protocol negotiated for this connection. @@ -55,16 +53,16 @@ type AltsContext struct { // The RPC protocol versions supported by the peer. PeerRpcVersions *RpcProtocolVersions `protobuf:"bytes,6,opt,name=peer_rpc_versions,json=peerRpcVersions,proto3" json:"peer_rpc_versions,omitempty"` // Additional attributes of the peer. - PeerAttributes map[string]string `protobuf:"bytes,7,rep,name=peer_attributes,json=peerAttributes,proto3" json:"peer_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + PeerAttributes map[string]string `protobuf:"bytes,7,rep,name=peer_attributes,json=peerAttributes,proto3" json:"peer_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AltsContext) Reset() { *x = AltsContext{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_altscontext_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_altscontext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AltsContext) String() string { @@ -75,7 +73,7 @@ func (*AltsContext) ProtoMessage() {} func (x *AltsContext) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_altscontext_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -141,67 +139,36 @@ func (x *AltsContext) GetPeerAttributes() map[string]string { var File_grpc_gcp_altscontext_proto protoreflect.FileDescriptor -var file_grpc_gcp_altscontext_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, 0x61, 0x6c, 0x74, 0x73, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x1a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, - 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xf1, 0x03, 0x0a, 0x0b, 0x41, 0x6c, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x31, 0x0a, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x3e, 0x0a, 0x0e, - 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0d, 0x73, - 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x14, - 0x70, 0x65, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x65, 0x65, 0x72, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, - 0x0a, 0x15, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x49, 0x0a, 0x11, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x70, 0x65, - 0x65, 0x72, 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x52, 0x0a, - 0x0f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x41, 0x6c, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x50, 0x65, - 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x70, 0x65, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x42, 0x6c, 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x61, 0x6c, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x10, 0x41, - 0x6c, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x3f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, - 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2f, 0x61, 0x6c, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, - 0x63, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_gcp_altscontext_proto_rawDesc = "" + + "\n" + + "\x1agrpc/gcp/altscontext.proto\x12\bgrpc.gcp\x1a(grpc/gcp/transport_security_common.proto\"\xf1\x03\n" + + "\vAltsContext\x121\n" + + "\x14application_protocol\x18\x01 \x01(\tR\x13applicationProtocol\x12'\n" + + "\x0frecord_protocol\x18\x02 \x01(\tR\x0erecordProtocol\x12>\n" + + "\x0esecurity_level\x18\x03 \x01(\x0e2\x17.grpc.gcp.SecurityLevelR\rsecurityLevel\x120\n" + + "\x14peer_service_account\x18\x04 \x01(\tR\x12peerServiceAccount\x122\n" + + "\x15local_service_account\x18\x05 \x01(\tR\x13localServiceAccount\x12I\n" + + "\x11peer_rpc_versions\x18\x06 \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\x0fpeerRpcVersions\x12R\n" + + "\x0fpeer_attributes\x18\a \x03(\v2).grpc.gcp.AltsContext.PeerAttributesEntryR\x0epeerAttributes\x1aA\n" + + "\x13PeerAttributesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01Bl\n" + + "\x15io.grpc.alts.internalB\x10AltsContextProtoP\x01Z?google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcpb\x06proto3" var ( file_grpc_gcp_altscontext_proto_rawDescOnce sync.Once - file_grpc_gcp_altscontext_proto_rawDescData = file_grpc_gcp_altscontext_proto_rawDesc + file_grpc_gcp_altscontext_proto_rawDescData []byte ) func file_grpc_gcp_altscontext_proto_rawDescGZIP() []byte { file_grpc_gcp_altscontext_proto_rawDescOnce.Do(func() { - file_grpc_gcp_altscontext_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_altscontext_proto_rawDescData) + file_grpc_gcp_altscontext_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_gcp_altscontext_proto_rawDesc), len(file_grpc_gcp_altscontext_proto_rawDesc))) }) return file_grpc_gcp_altscontext_proto_rawDescData } var file_grpc_gcp_altscontext_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_grpc_gcp_altscontext_proto_goTypes = []interface{}{ +var file_grpc_gcp_altscontext_proto_goTypes = []any{ (*AltsContext)(nil), // 0: grpc.gcp.AltsContext nil, // 1: grpc.gcp.AltsContext.PeerAttributesEntry (SecurityLevel)(0), // 2: grpc.gcp.SecurityLevel @@ -224,25 +191,11 @@ func file_grpc_gcp_altscontext_proto_init() { return } file_grpc_gcp_transport_security_common_proto_init() - if !protoimpl.UnsafeEnabled { - file_grpc_gcp_altscontext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AltsContext); 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_grpc_gcp_altscontext_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_gcp_altscontext_proto_rawDesc), len(file_grpc_gcp_altscontext_proto_rawDesc)), NumEnums: 0, NumMessages: 2, NumExtensions: 0, @@ -253,7 +206,6 @@ func file_grpc_gcp_altscontext_proto_init() { MessageInfos: file_grpc_gcp_altscontext_proto_msgTypes, }.Build() File_grpc_gcp_altscontext_proto = out.File - file_grpc_gcp_altscontext_proto_rawDesc = nil file_grpc_gcp_altscontext_proto_goTypes = nil file_grpc_gcp_altscontext_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go index 93ceaeb2f9..6370b2a6d2 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/gcp/handshaker.proto package grpc_gcp @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -139,26 +140,23 @@ func (NetworkProtocol) EnumDescriptor() ([]byte, []int) { } type Endpoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // IP address. It should contain an IPv4 or IPv6 string literal, e.g. // "192.168.0.1" or "2001:db8::1". IpAddress string `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` // Port number. Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` // Network protocol (e.g., TCP, UDP) associated with this endpoint. - Protocol NetworkProtocol `protobuf:"varint,3,opt,name=protocol,proto3,enum=grpc.gcp.NetworkProtocol" json:"protocol,omitempty"` + Protocol NetworkProtocol `protobuf:"varint,3,opt,name=protocol,proto3,enum=grpc.gcp.NetworkProtocol" json:"protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Endpoint) Reset() { *x = Endpoint{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Endpoint) String() string { @@ -169,7 +167,7 @@ func (*Endpoint) ProtoMessage() {} func (x *Endpoint) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -206,26 +204,23 @@ func (x *Endpoint) GetProtocol() NetworkProtocol { } type Identity struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to IdentityOneof: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to IdentityOneof: // // *Identity_ServiceAccount // *Identity_Hostname IdentityOneof isIdentity_IdentityOneof `protobuf_oneof:"identity_oneof"` // Additional attributes of the identity. - Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Identity) Reset() { *x = Identity{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Identity) String() string { @@ -236,7 +231,7 @@ func (*Identity) ProtoMessage() {} func (x *Identity) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -251,23 +246,27 @@ func (*Identity) Descriptor() ([]byte, []int) { return file_grpc_gcp_handshaker_proto_rawDescGZIP(), []int{1} } -func (m *Identity) GetIdentityOneof() isIdentity_IdentityOneof { - if m != nil { - return m.IdentityOneof +func (x *Identity) GetIdentityOneof() isIdentity_IdentityOneof { + if x != nil { + return x.IdentityOneof } return nil } func (x *Identity) GetServiceAccount() string { - if x, ok := x.GetIdentityOneof().(*Identity_ServiceAccount); ok { - return x.ServiceAccount + if x != nil { + if x, ok := x.IdentityOneof.(*Identity_ServiceAccount); ok { + return x.ServiceAccount + } } return "" } func (x *Identity) GetHostname() string { - if x, ok := x.GetIdentityOneof().(*Identity_Hostname); ok { - return x.Hostname + if x != nil { + if x, ok := x.IdentityOneof.(*Identity_Hostname); ok { + return x.Hostname + } } return "" } @@ -298,10 +297,7 @@ func (*Identity_ServiceAccount) isIdentity_IdentityOneof() {} func (*Identity_Hostname) isIdentity_IdentityOneof() {} type StartClientHandshakeReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Handshake security protocol requested by the client. HandshakeSecurityProtocol HandshakeProtocol `protobuf:"varint,1,opt,name=handshake_security_protocol,json=handshakeSecurityProtocol,proto3,enum=grpc.gcp.HandshakeProtocol" json:"handshake_security_protocol,omitempty"` // The application protocols supported by the client, e.g., "h2" (for http2), @@ -336,15 +332,17 @@ type StartClientHandshakeReq struct { // the peer. The access token MUST be strongly bound to the ALTS credentials // used to establish the connection that the token is sent over. AccessToken string `protobuf:"bytes,11,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + // (Optional) Ordered transport protocol preferences supported by the client. + TransportProtocolPreferences *TransportProtocolPreferences `protobuf:"bytes,12,opt,name=transport_protocol_preferences,json=transportProtocolPreferences,proto3" json:"transport_protocol_preferences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StartClientHandshakeReq) Reset() { *x = StartClientHandshakeReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartClientHandshakeReq) String() string { @@ -355,7 +353,7 @@ func (*StartClientHandshakeReq) ProtoMessage() {} func (x *StartClientHandshakeReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -447,31 +445,35 @@ func (x *StartClientHandshakeReq) GetAccessToken() string { return "" } -type ServerHandshakeParameters struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *StartClientHandshakeReq) GetTransportProtocolPreferences() *TransportProtocolPreferences { + if x != nil { + return x.TransportProtocolPreferences + } + return nil +} +type ServerHandshakeParameters struct { + state protoimpl.MessageState `protogen:"open.v1"` // The record protocols supported by the server, e.g., // "ALTSRP_GCM_AES128". RecordProtocols []string `protobuf:"bytes,1,rep,name=record_protocols,json=recordProtocols,proto3" json:"record_protocols,omitempty"` // (Optional) A list of local identities supported by the server, if // specified. Otherwise, the handshaker chooses a default local identity. LocalIdentities []*Identity `protobuf:"bytes,2,rep,name=local_identities,json=localIdentities,proto3" json:"local_identities,omitempty"` - // (Optional) An access token created by the caller only intended for use in - // ALTS connections. The access token that should be used to authenticate to - // the peer. The access token MUST be strongly bound to the ALTS credentials + // A token created by the caller only intended for use in + // ALTS connections. The token should be used to authenticate to + // the peer. The token MUST be strongly bound to the ALTS credentials // used to establish the connection that the token is sent over. - AccessToken *string `protobuf:"bytes,3,opt,name=access_token,json=accessToken,proto3,oneof" json:"access_token,omitempty"` + Token *string `protobuf:"bytes,3,opt,name=token,proto3,oneof" json:"token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerHandshakeParameters) Reset() { *x = ServerHandshakeParameters{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerHandshakeParameters) String() string { @@ -482,7 +484,7 @@ func (*ServerHandshakeParameters) ProtoMessage() {} func (x *ServerHandshakeParameters) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -511,18 +513,15 @@ func (x *ServerHandshakeParameters) GetLocalIdentities() []*Identity { return nil } -func (x *ServerHandshakeParameters) GetAccessToken() string { - if x != nil && x.AccessToken != nil { - return *x.AccessToken +func (x *ServerHandshakeParameters) GetToken() string { + if x != nil && x.Token != nil { + return *x.Token } return "" } type StartServerHandshakeReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The application protocols supported by the server, e.g., "h2" (for http2), // "grpc". ApplicationProtocols []string `protobuf:"bytes,1,rep,name=application_protocols,json=applicationProtocols,proto3" json:"application_protocols,omitempty"` @@ -531,9 +530,9 @@ type StartServerHandshakeReq struct { // protocol (e.g., TLS or ALTS) has its own set of record protocols and local // identities. Since protobuf does not support enum as key to the map, the key // to handshake_parameters is the integer value of HandshakeProtocol enum. - HandshakeParameters map[int32]*ServerHandshakeParameters `protobuf:"bytes,2,rep,name=handshake_parameters,json=handshakeParameters,proto3" json:"handshake_parameters,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + HandshakeParameters map[int32]*ServerHandshakeParameters `protobuf:"bytes,2,rep,name=handshake_parameters,json=handshakeParameters,proto3" json:"handshake_parameters,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Bytes in out_frames returned from the peer's HandshakerResp. It is possible - // that the peer's out_frames are split into multiple HandshakReq messages. + // that the peer's out_frames are split into multiple HandshakeReq messages. InBytes []byte `protobuf:"bytes,3,opt,name=in_bytes,json=inBytes,proto3" json:"in_bytes,omitempty"` // (Optional) Local endpoint information of the connection to the client, // such as local IP address, port number, and network protocol. @@ -545,15 +544,17 @@ type StartServerHandshakeReq struct { RpcVersions *RpcProtocolVersions `protobuf:"bytes,6,opt,name=rpc_versions,json=rpcVersions,proto3" json:"rpc_versions,omitempty"` // (Optional) Maximum frame size supported by the server. MaxFrameSize uint32 `protobuf:"varint,7,opt,name=max_frame_size,json=maxFrameSize,proto3" json:"max_frame_size,omitempty"` + // (Optional) Transport protocol preferences supported by the server. + TransportProtocolPreferences *TransportProtocolPreferences `protobuf:"bytes,8,opt,name=transport_protocol_preferences,json=transportProtocolPreferences,proto3" json:"transport_protocol_preferences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StartServerHandshakeReq) Reset() { *x = StartServerHandshakeReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartServerHandshakeReq) String() string { @@ -564,7 +565,7 @@ func (*StartServerHandshakeReq) ProtoMessage() {} func (x *StartServerHandshakeReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -628,11 +629,15 @@ func (x *StartServerHandshakeReq) GetMaxFrameSize() uint32 { return 0 } -type NextHandshakeMessageReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *StartServerHandshakeReq) GetTransportProtocolPreferences() *TransportProtocolPreferences { + if x != nil { + return x.TransportProtocolPreferences + } + return nil +} +type NextHandshakeMessageReq struct { + state protoimpl.MessageState `protogen:"open.v1"` // Bytes in out_frames returned from the peer's HandshakerResp. It is possible // that the peer's out_frames are split into multiple NextHandshakerMessageReq // messages. @@ -641,15 +646,15 @@ type NextHandshakeMessageReq struct { // message to the peer and when the application received the current handshake // message (in the in_bytes field) from the peer. NetworkLatencyMs uint32 `protobuf:"varint,2,opt,name=network_latency_ms,json=networkLatencyMs,proto3" json:"network_latency_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NextHandshakeMessageReq) Reset() { *x = NextHandshakeMessageReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *NextHandshakeMessageReq) String() string { @@ -660,7 +665,7 @@ func (*NextHandshakeMessageReq) ProtoMessage() {} func (x *NextHandshakeMessageReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -690,25 +695,22 @@ func (x *NextHandshakeMessageReq) GetNetworkLatencyMs() uint32 { } type HandshakerReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to ReqOneof: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to ReqOneof: // // *HandshakerReq_ClientStart // *HandshakerReq_ServerStart // *HandshakerReq_Next - ReqOneof isHandshakerReq_ReqOneof `protobuf_oneof:"req_oneof"` + ReqOneof isHandshakerReq_ReqOneof `protobuf_oneof:"req_oneof"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerReq) Reset() { *x = HandshakerReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerReq) String() string { @@ -719,7 +721,7 @@ func (*HandshakerReq) ProtoMessage() {} func (x *HandshakerReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -734,30 +736,36 @@ func (*HandshakerReq) Descriptor() ([]byte, []int) { return file_grpc_gcp_handshaker_proto_rawDescGZIP(), []int{6} } -func (m *HandshakerReq) GetReqOneof() isHandshakerReq_ReqOneof { - if m != nil { - return m.ReqOneof +func (x *HandshakerReq) GetReqOneof() isHandshakerReq_ReqOneof { + if x != nil { + return x.ReqOneof } return nil } func (x *HandshakerReq) GetClientStart() *StartClientHandshakeReq { - if x, ok := x.GetReqOneof().(*HandshakerReq_ClientStart); ok { - return x.ClientStart + if x != nil { + if x, ok := x.ReqOneof.(*HandshakerReq_ClientStart); ok { + return x.ClientStart + } } return nil } func (x *HandshakerReq) GetServerStart() *StartServerHandshakeReq { - if x, ok := x.GetReqOneof().(*HandshakerReq_ServerStart); ok { - return x.ServerStart + if x != nil { + if x, ok := x.ReqOneof.(*HandshakerReq_ServerStart); ok { + return x.ServerStart + } } return nil } func (x *HandshakerReq) GetNext() *NextHandshakeMessageReq { - if x, ok := x.GetReqOneof().(*HandshakerReq_Next); ok { - return x.Next + if x != nil { + if x, ok := x.ReqOneof.(*HandshakerReq_Next); ok { + return x.Next + } } return nil } @@ -788,10 +796,7 @@ func (*HandshakerReq_ServerStart) isHandshakerReq_ReqOneof() {} func (*HandshakerReq_Next) isHandshakerReq_ReqOneof() {} type HandshakerResult struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The application protocol negotiated for this connection. ApplicationProtocol string `protobuf:"bytes,1,opt,name=application_protocol,json=applicationProtocol,proto3" json:"application_protocol,omitempty"` // The record protocol negotiated for this connection. @@ -812,15 +817,17 @@ type HandshakerResult struct { PeerRpcVersions *RpcProtocolVersions `protobuf:"bytes,7,opt,name=peer_rpc_versions,json=peerRpcVersions,proto3" json:"peer_rpc_versions,omitempty"` // The maximum frame size of the peer. MaxFrameSize uint32 `protobuf:"varint,8,opt,name=max_frame_size,json=maxFrameSize,proto3" json:"max_frame_size,omitempty"` + // (Optional) The transport protocol negotiated for this connection. + TransportProtocol *NegotiatedTransportProtocol `protobuf:"bytes,9,opt,name=transport_protocol,json=transportProtocol,proto3" json:"transport_protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerResult) Reset() { *x = HandshakerResult{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerResult) String() string { @@ -831,7 +838,7 @@ func (*HandshakerResult) ProtoMessage() {} func (x *HandshakerResult) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -902,24 +909,28 @@ func (x *HandshakerResult) GetMaxFrameSize() uint32 { return 0 } -type HandshakerStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *HandshakerResult) GetTransportProtocol() *NegotiatedTransportProtocol { + if x != nil { + return x.TransportProtocol + } + return nil +} +type HandshakerStatus struct { + state protoimpl.MessageState `protogen:"open.v1"` // The status code. This could be the gRPC status code. Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // The status details. - Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerStatus) Reset() { *x = HandshakerStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerStatus) String() string { @@ -930,7 +941,7 @@ func (*HandshakerStatus) ProtoMessage() {} func (x *HandshakerStatus) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -960,10 +971,7 @@ func (x *HandshakerStatus) GetDetails() string { } type HandshakerResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Frames to be given to the peer for the NextHandshakeMessageReq. May be // empty if no out_frames have to be sent to the peer or if in_bytes in the // HandshakerReq are incomplete. All the non-empty out frames must be sent to @@ -978,16 +986,16 @@ type HandshakerResp struct { // to frames that needs to be forwarded to the peer. Result *HandshakerResult `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"` // Status of the handshaker. - Status *HandshakerStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Status *HandshakerStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerResp) Reset() { *x = HandshakerResp{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerResp) String() string { @@ -998,7 +1006,7 @@ func (*HandshakerResp) ProtoMessage() {} func (x *HandshakerResp) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1043,238 +1051,127 @@ func (x *HandshakerResp) GetStatus() *HandshakerStatus { var File_grpc_gcp_handshaker_proto protoreflect.FileDescriptor -var file_grpc_gcp_handshaker_proto_rawDesc = []byte{ - 0x0a, 0x19, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x73, - 0x68, 0x61, 0x6b, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x67, 0x63, 0x70, 0x1a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x74, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x35, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0xe8, 0x01, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x29, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x10, - 0x0a, 0x0e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, - 0x22, 0xf6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x1b, - 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x48, 0x61, 0x6e, - 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x19, - 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x29, - 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x11, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x3b, 0x0a, 0x0f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, - 0x0a, 0x0c, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x72, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbe, 0x01, 0x0a, 0x19, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa5, 0x04, 0x0a, 0x17, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x6d, 0x0a, 0x14, 0x68, - 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x2e, 0x48, 0x61, 0x6e, - 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x69, 0x6e, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x3b, 0x0a, 0x0f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x40, 0x0a, - 0x0c, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x52, - 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0b, 0x72, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x6b, 0x0a, 0x18, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, - 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x62, 0x0a, 0x17, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x69, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x0d, 0x48, 0x61, 0x6e, 0x64, 0x73, - 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x46, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, - 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x65, 0x78, - 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x9a, - 0x03, 0x0a, 0x10, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x0d, 0x70, 0x65, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2a, - 0x0a, 0x11, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6f, - 0x70, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x49, 0x0a, 0x11, 0x70, 0x65, - 0x65, 0x72, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, - 0x2e, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x70, 0x65, 0x65, 0x72, 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, - 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x40, 0x0a, 0x10, 0x48, - 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xbe, 0x01, - 0x0a, 0x0e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x25, 0x0a, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x4a, - 0x0a, 0x11, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x41, 0x4e, 0x44, 0x53, 0x48, 0x41, 0x4b, 0x45, - 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x41, 0x4c, 0x54, 0x53, 0x10, 0x02, 0x2a, 0x45, 0x0a, 0x0f, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x20, 0x0a, - 0x1c, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, - 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, - 0x02, 0x32, 0x5b, 0x0a, 0x11, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x6f, 0x48, 0x61, 0x6e, 0x64, - 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, - 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6b, - 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x61, 0x6c, 0x74, 0x73, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x0f, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, - 0x6b, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3f, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, - 0x70, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2f, 0x61, - 0x6c, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, -} +const file_grpc_gcp_handshaker_proto_rawDesc = "" + + "\n" + + "\x19grpc/gcp/handshaker.proto\x12\bgrpc.gcp\x1a(grpc/gcp/transport_security_common.proto\"t\n" + + "\bEndpoint\x12\x1d\n" + + "\n" + + "ip_address\x18\x01 \x01(\tR\tipAddress\x12\x12\n" + + "\x04port\x18\x02 \x01(\x05R\x04port\x125\n" + + "\bprotocol\x18\x03 \x01(\x0e2\x19.grpc.gcp.NetworkProtocolR\bprotocol\"\xe8\x01\n" + + "\bIdentity\x12)\n" + + "\x0fservice_account\x18\x01 \x01(\tH\x00R\x0eserviceAccount\x12\x1c\n" + + "\bhostname\x18\x02 \x01(\tH\x00R\bhostname\x12B\n" + + "\n" + + "attributes\x18\x03 \x03(\v2\".grpc.gcp.Identity.AttributesEntryR\n" + + "attributes\x1a=\n" + + "\x0fAttributesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x10\n" + + "\x0eidentity_oneof\"\xe9\x05\n" + + "\x17StartClientHandshakeReq\x12[\n" + + "\x1bhandshake_security_protocol\x18\x01 \x01(\x0e2\x1b.grpc.gcp.HandshakeProtocolR\x19handshakeSecurityProtocol\x123\n" + + "\x15application_protocols\x18\x02 \x03(\tR\x14applicationProtocols\x12)\n" + + "\x10record_protocols\x18\x03 \x03(\tR\x0frecordProtocols\x12?\n" + + "\x11target_identities\x18\x04 \x03(\v2\x12.grpc.gcp.IdentityR\x10targetIdentities\x129\n" + + "\x0elocal_identity\x18\x05 \x01(\v2\x12.grpc.gcp.IdentityR\rlocalIdentity\x129\n" + + "\x0elocal_endpoint\x18\x06 \x01(\v2\x12.grpc.gcp.EndpointR\rlocalEndpoint\x12;\n" + + "\x0fremote_endpoint\x18\a \x01(\v2\x12.grpc.gcp.EndpointR\x0eremoteEndpoint\x12\x1f\n" + + "\vtarget_name\x18\b \x01(\tR\n" + + "targetName\x12@\n" + + "\frpc_versions\x18\t \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\vrpcVersions\x12$\n" + + "\x0emax_frame_size\x18\n" + + " \x01(\rR\fmaxFrameSize\x12&\n" + + "\faccess_token\x18\v \x01(\tB\x03\x80\x01\x01R\vaccessToken\x12l\n" + + "\x1etransport_protocol_preferences\x18\f \x01(\v2&.grpc.gcp.TransportProtocolPreferencesR\x1ctransportProtocolPreferences\"\xaf\x01\n" + + "\x19ServerHandshakeParameters\x12)\n" + + "\x10record_protocols\x18\x01 \x03(\tR\x0frecordProtocols\x12=\n" + + "\x10local_identities\x18\x02 \x03(\v2\x12.grpc.gcp.IdentityR\x0flocalIdentities\x12\x1e\n" + + "\x05token\x18\x03 \x01(\tB\x03\x80\x01\x01H\x00R\x05token\x88\x01\x01B\b\n" + + "\x06_token\"\x93\x05\n" + + "\x17StartServerHandshakeReq\x123\n" + + "\x15application_protocols\x18\x01 \x03(\tR\x14applicationProtocols\x12m\n" + + "\x14handshake_parameters\x18\x02 \x03(\v2:.grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntryR\x13handshakeParameters\x12\x19\n" + + "\bin_bytes\x18\x03 \x01(\fR\ainBytes\x129\n" + + "\x0elocal_endpoint\x18\x04 \x01(\v2\x12.grpc.gcp.EndpointR\rlocalEndpoint\x12;\n" + + "\x0fremote_endpoint\x18\x05 \x01(\v2\x12.grpc.gcp.EndpointR\x0eremoteEndpoint\x12@\n" + + "\frpc_versions\x18\x06 \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\vrpcVersions\x12$\n" + + "\x0emax_frame_size\x18\a \x01(\rR\fmaxFrameSize\x12l\n" + + "\x1etransport_protocol_preferences\x18\b \x01(\v2&.grpc.gcp.TransportProtocolPreferencesR\x1ctransportProtocolPreferences\x1ak\n" + + "\x18HandshakeParametersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\x05R\x03key\x129\n" + + "\x05value\x18\x02 \x01(\v2#.grpc.gcp.ServerHandshakeParametersR\x05value:\x028\x01\"b\n" + + "\x17NextHandshakeMessageReq\x12\x19\n" + + "\bin_bytes\x18\x01 \x01(\fR\ainBytes\x12,\n" + + "\x12network_latency_ms\x18\x02 \x01(\rR\x10networkLatencyMs\"\xe5\x01\n" + + "\rHandshakerReq\x12F\n" + + "\fclient_start\x18\x01 \x01(\v2!.grpc.gcp.StartClientHandshakeReqH\x00R\vclientStart\x12F\n" + + "\fserver_start\x18\x02 \x01(\v2!.grpc.gcp.StartServerHandshakeReqH\x00R\vserverStart\x127\n" + + "\x04next\x18\x03 \x01(\v2!.grpc.gcp.NextHandshakeMessageReqH\x00R\x04nextB\v\n" + + "\treq_oneof\"\xf0\x03\n" + + "\x10HandshakerResult\x121\n" + + "\x14application_protocol\x18\x01 \x01(\tR\x13applicationProtocol\x12'\n" + + "\x0frecord_protocol\x18\x02 \x01(\tR\x0erecordProtocol\x12\x19\n" + + "\bkey_data\x18\x03 \x01(\fR\akeyData\x127\n" + + "\rpeer_identity\x18\x04 \x01(\v2\x12.grpc.gcp.IdentityR\fpeerIdentity\x129\n" + + "\x0elocal_identity\x18\x05 \x01(\v2\x12.grpc.gcp.IdentityR\rlocalIdentity\x12*\n" + + "\x11keep_channel_open\x18\x06 \x01(\bR\x0fkeepChannelOpen\x12I\n" + + "\x11peer_rpc_versions\x18\a \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\x0fpeerRpcVersions\x12$\n" + + "\x0emax_frame_size\x18\b \x01(\rR\fmaxFrameSize\x12T\n" + + "\x12transport_protocol\x18\t \x01(\v2%.grpc.gcp.NegotiatedTransportProtocolR\x11transportProtocol\"@\n" + + "\x10HandshakerStatus\x12\x12\n" + + "\x04code\x18\x01 \x01(\rR\x04code\x12\x18\n" + + "\adetails\x18\x02 \x01(\tR\adetails\"\xbe\x01\n" + + "\x0eHandshakerResp\x12\x1d\n" + + "\n" + + "out_frames\x18\x01 \x01(\fR\toutFrames\x12%\n" + + "\x0ebytes_consumed\x18\x02 \x01(\rR\rbytesConsumed\x122\n" + + "\x06result\x18\x03 \x01(\v2\x1a.grpc.gcp.HandshakerResultR\x06result\x122\n" + + "\x06status\x18\x04 \x01(\v2\x1a.grpc.gcp.HandshakerStatusR\x06status*J\n" + + "\x11HandshakeProtocol\x12\"\n" + + "\x1eHANDSHAKE_PROTOCOL_UNSPECIFIED\x10\x00\x12\a\n" + + "\x03TLS\x10\x01\x12\b\n" + + "\x04ALTS\x10\x02*E\n" + + "\x0fNetworkProtocol\x12 \n" + + "\x1cNETWORK_PROTOCOL_UNSPECIFIED\x10\x00\x12\a\n" + + "\x03TCP\x10\x01\x12\a\n" + + "\x03UDP\x10\x022[\n" + + "\x11HandshakerService\x12F\n" + + "\vDoHandshake\x12\x17.grpc.gcp.HandshakerReq\x1a\x18.grpc.gcp.HandshakerResp\"\x00(\x010\x01Bk\n" + + "\x15io.grpc.alts.internalB\x0fHandshakerProtoP\x01Z?google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcpb\x06proto3" var ( file_grpc_gcp_handshaker_proto_rawDescOnce sync.Once - file_grpc_gcp_handshaker_proto_rawDescData = file_grpc_gcp_handshaker_proto_rawDesc + file_grpc_gcp_handshaker_proto_rawDescData []byte ) func file_grpc_gcp_handshaker_proto_rawDescGZIP() []byte { file_grpc_gcp_handshaker_proto_rawDescOnce.Do(func() { - file_grpc_gcp_handshaker_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_handshaker_proto_rawDescData) + file_grpc_gcp_handshaker_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_gcp_handshaker_proto_rawDesc), len(file_grpc_gcp_handshaker_proto_rawDesc))) }) return file_grpc_gcp_handshaker_proto_rawDescData } var file_grpc_gcp_handshaker_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_grpc_gcp_handshaker_proto_msgTypes = make([]protoimpl.MessageInfo, 12) -var file_grpc_gcp_handshaker_proto_goTypes = []interface{}{ - (HandshakeProtocol)(0), // 0: grpc.gcp.HandshakeProtocol - (NetworkProtocol)(0), // 1: grpc.gcp.NetworkProtocol - (*Endpoint)(nil), // 2: grpc.gcp.Endpoint - (*Identity)(nil), // 3: grpc.gcp.Identity - (*StartClientHandshakeReq)(nil), // 4: grpc.gcp.StartClientHandshakeReq - (*ServerHandshakeParameters)(nil), // 5: grpc.gcp.ServerHandshakeParameters - (*StartServerHandshakeReq)(nil), // 6: grpc.gcp.StartServerHandshakeReq - (*NextHandshakeMessageReq)(nil), // 7: grpc.gcp.NextHandshakeMessageReq - (*HandshakerReq)(nil), // 8: grpc.gcp.HandshakerReq - (*HandshakerResult)(nil), // 9: grpc.gcp.HandshakerResult - (*HandshakerStatus)(nil), // 10: grpc.gcp.HandshakerStatus - (*HandshakerResp)(nil), // 11: grpc.gcp.HandshakerResp - nil, // 12: grpc.gcp.Identity.AttributesEntry - nil, // 13: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry - (*RpcProtocolVersions)(nil), // 14: grpc.gcp.RpcProtocolVersions +var file_grpc_gcp_handshaker_proto_goTypes = []any{ + (HandshakeProtocol)(0), // 0: grpc.gcp.HandshakeProtocol + (NetworkProtocol)(0), // 1: grpc.gcp.NetworkProtocol + (*Endpoint)(nil), // 2: grpc.gcp.Endpoint + (*Identity)(nil), // 3: grpc.gcp.Identity + (*StartClientHandshakeReq)(nil), // 4: grpc.gcp.StartClientHandshakeReq + (*ServerHandshakeParameters)(nil), // 5: grpc.gcp.ServerHandshakeParameters + (*StartServerHandshakeReq)(nil), // 6: grpc.gcp.StartServerHandshakeReq + (*NextHandshakeMessageReq)(nil), // 7: grpc.gcp.NextHandshakeMessageReq + (*HandshakerReq)(nil), // 8: grpc.gcp.HandshakerReq + (*HandshakerResult)(nil), // 9: grpc.gcp.HandshakerResult + (*HandshakerStatus)(nil), // 10: grpc.gcp.HandshakerStatus + (*HandshakerResp)(nil), // 11: grpc.gcp.HandshakerResp + nil, // 12: grpc.gcp.Identity.AttributesEntry + nil, // 13: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry + (*RpcProtocolVersions)(nil), // 14: grpc.gcp.RpcProtocolVersions + (*TransportProtocolPreferences)(nil), // 15: grpc.gcp.TransportProtocolPreferences + (*NegotiatedTransportProtocol)(nil), // 16: grpc.gcp.NegotiatedTransportProtocol } var file_grpc_gcp_handshaker_proto_depIdxs = []int32{ 1, // 0: grpc.gcp.Endpoint.protocol:type_name -> grpc.gcp.NetworkProtocol @@ -1285,27 +1182,30 @@ var file_grpc_gcp_handshaker_proto_depIdxs = []int32{ 2, // 5: grpc.gcp.StartClientHandshakeReq.local_endpoint:type_name -> grpc.gcp.Endpoint 2, // 6: grpc.gcp.StartClientHandshakeReq.remote_endpoint:type_name -> grpc.gcp.Endpoint 14, // 7: grpc.gcp.StartClientHandshakeReq.rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions - 3, // 8: grpc.gcp.ServerHandshakeParameters.local_identities:type_name -> grpc.gcp.Identity - 13, // 9: grpc.gcp.StartServerHandshakeReq.handshake_parameters:type_name -> grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry - 2, // 10: grpc.gcp.StartServerHandshakeReq.local_endpoint:type_name -> grpc.gcp.Endpoint - 2, // 11: grpc.gcp.StartServerHandshakeReq.remote_endpoint:type_name -> grpc.gcp.Endpoint - 14, // 12: grpc.gcp.StartServerHandshakeReq.rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions - 4, // 13: grpc.gcp.HandshakerReq.client_start:type_name -> grpc.gcp.StartClientHandshakeReq - 6, // 14: grpc.gcp.HandshakerReq.server_start:type_name -> grpc.gcp.StartServerHandshakeReq - 7, // 15: grpc.gcp.HandshakerReq.next:type_name -> grpc.gcp.NextHandshakeMessageReq - 3, // 16: grpc.gcp.HandshakerResult.peer_identity:type_name -> grpc.gcp.Identity - 3, // 17: grpc.gcp.HandshakerResult.local_identity:type_name -> grpc.gcp.Identity - 14, // 18: grpc.gcp.HandshakerResult.peer_rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions - 9, // 19: grpc.gcp.HandshakerResp.result:type_name -> grpc.gcp.HandshakerResult - 10, // 20: grpc.gcp.HandshakerResp.status:type_name -> grpc.gcp.HandshakerStatus - 5, // 21: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry.value:type_name -> grpc.gcp.ServerHandshakeParameters - 8, // 22: grpc.gcp.HandshakerService.DoHandshake:input_type -> grpc.gcp.HandshakerReq - 11, // 23: grpc.gcp.HandshakerService.DoHandshake:output_type -> grpc.gcp.HandshakerResp - 23, // [23:24] is the sub-list for method output_type - 22, // [22:23] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 15, // 8: grpc.gcp.StartClientHandshakeReq.transport_protocol_preferences:type_name -> grpc.gcp.TransportProtocolPreferences + 3, // 9: grpc.gcp.ServerHandshakeParameters.local_identities:type_name -> grpc.gcp.Identity + 13, // 10: grpc.gcp.StartServerHandshakeReq.handshake_parameters:type_name -> grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry + 2, // 11: grpc.gcp.StartServerHandshakeReq.local_endpoint:type_name -> grpc.gcp.Endpoint + 2, // 12: grpc.gcp.StartServerHandshakeReq.remote_endpoint:type_name -> grpc.gcp.Endpoint + 14, // 13: grpc.gcp.StartServerHandshakeReq.rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions + 15, // 14: grpc.gcp.StartServerHandshakeReq.transport_protocol_preferences:type_name -> grpc.gcp.TransportProtocolPreferences + 4, // 15: grpc.gcp.HandshakerReq.client_start:type_name -> grpc.gcp.StartClientHandshakeReq + 6, // 16: grpc.gcp.HandshakerReq.server_start:type_name -> grpc.gcp.StartServerHandshakeReq + 7, // 17: grpc.gcp.HandshakerReq.next:type_name -> grpc.gcp.NextHandshakeMessageReq + 3, // 18: grpc.gcp.HandshakerResult.peer_identity:type_name -> grpc.gcp.Identity + 3, // 19: grpc.gcp.HandshakerResult.local_identity:type_name -> grpc.gcp.Identity + 14, // 20: grpc.gcp.HandshakerResult.peer_rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions + 16, // 21: grpc.gcp.HandshakerResult.transport_protocol:type_name -> grpc.gcp.NegotiatedTransportProtocol + 9, // 22: grpc.gcp.HandshakerResp.result:type_name -> grpc.gcp.HandshakerResult + 10, // 23: grpc.gcp.HandshakerResp.status:type_name -> grpc.gcp.HandshakerStatus + 5, // 24: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry.value:type_name -> grpc.gcp.ServerHandshakeParameters + 8, // 25: grpc.gcp.HandshakerService.DoHandshake:input_type -> grpc.gcp.HandshakerReq + 11, // 26: grpc.gcp.HandshakerService.DoHandshake:output_type -> grpc.gcp.HandshakerResp + 26, // [26:27] is the sub-list for method output_type + 25, // [25:26] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_grpc_gcp_handshaker_proto_init() } @@ -1314,134 +1214,12 @@ func file_grpc_gcp_handshaker_proto_init() { return } file_grpc_gcp_transport_security_common_proto_init() - if !protoimpl.UnsafeEnabled { - file_grpc_gcp_handshaker_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Endpoint); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Identity); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartClientHandshakeReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerHandshakeParameters); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartServerHandshakeReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NextHandshakeMessageReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerResult); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerStatus); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_gcp_handshaker_proto_msgTypes[1].OneofWrappers = []interface{}{ + file_grpc_gcp_handshaker_proto_msgTypes[1].OneofWrappers = []any{ (*Identity_ServiceAccount)(nil), (*Identity_Hostname)(nil), } - file_grpc_gcp_handshaker_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_grpc_gcp_handshaker_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_grpc_gcp_handshaker_proto_msgTypes[3].OneofWrappers = []any{} + file_grpc_gcp_handshaker_proto_msgTypes[6].OneofWrappers = []any{ (*HandshakerReq_ClientStart)(nil), (*HandshakerReq_ServerStart)(nil), (*HandshakerReq_Next)(nil), @@ -1450,7 +1228,7 @@ func file_grpc_gcp_handshaker_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_gcp_handshaker_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_gcp_handshaker_proto_rawDesc), len(file_grpc_gcp_handshaker_proto_rawDesc)), NumEnums: 2, NumMessages: 12, NumExtensions: 0, @@ -1462,7 +1240,6 @@ func file_grpc_gcp_handshaker_proto_init() { MessageInfos: file_grpc_gcp_handshaker_proto_msgTypes, }.Build() File_grpc_gcp_handshaker_proto = out.File - file_grpc_gcp_handshaker_proto_rawDesc = nil file_grpc_gcp_handshaker_proto_goTypes = nil file_grpc_gcp_handshaker_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go index ba1c46f64b..21cb01be66 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // source: grpc/gcp/handshaker.proto package grpc_gcp @@ -32,8 +32,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( HandshakerService_DoHandshake_FullMethodName = "/grpc.gcp.HandshakerService/DoHandshake" @@ -49,7 +49,7 @@ type HandshakerServiceClient interface { // messages with next. Each time client sends a request, the handshaker // service expects to respond. Client does not have to wait for service's // response before sending next request. - DoHandshake(ctx context.Context, opts ...grpc.CallOption) (HandshakerService_DoHandshakeClient, error) + DoHandshake(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[HandshakerReq, HandshakerResp], error) } type handshakerServiceClient struct { @@ -60,40 +60,22 @@ func NewHandshakerServiceClient(cc grpc.ClientConnInterface) HandshakerServiceCl return &handshakerServiceClient{cc} } -func (c *handshakerServiceClient) DoHandshake(ctx context.Context, opts ...grpc.CallOption) (HandshakerService_DoHandshakeClient, error) { - stream, err := c.cc.NewStream(ctx, &HandshakerService_ServiceDesc.Streams[0], HandshakerService_DoHandshake_FullMethodName, opts...) +func (c *handshakerServiceClient) DoHandshake(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[HandshakerReq, HandshakerResp], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &HandshakerService_ServiceDesc.Streams[0], HandshakerService_DoHandshake_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &handshakerServiceDoHandshakeClient{stream} + x := &grpc.GenericClientStream[HandshakerReq, HandshakerResp]{ClientStream: stream} return x, nil } -type HandshakerService_DoHandshakeClient interface { - Send(*HandshakerReq) error - Recv() (*HandshakerResp, error) - grpc.ClientStream -} - -type handshakerServiceDoHandshakeClient struct { - grpc.ClientStream -} - -func (x *handshakerServiceDoHandshakeClient) Send(m *HandshakerReq) error { - return x.ClientStream.SendMsg(m) -} - -func (x *handshakerServiceDoHandshakeClient) Recv() (*HandshakerResp, error) { - m := new(HandshakerResp) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type HandshakerService_DoHandshakeClient = grpc.BidiStreamingClient[HandshakerReq, HandshakerResp] // HandshakerServiceServer is the server API for HandshakerService service. // All implementations must embed UnimplementedHandshakerServiceServer -// for forward compatibility +// for forward compatibility. type HandshakerServiceServer interface { // Handshaker service accepts a stream of handshaker request, returning a // stream of handshaker response. Client is expected to send exactly one @@ -101,18 +83,22 @@ type HandshakerServiceServer interface { // messages with next. Each time client sends a request, the handshaker // service expects to respond. Client does not have to wait for service's // response before sending next request. - DoHandshake(HandshakerService_DoHandshakeServer) error + DoHandshake(grpc.BidiStreamingServer[HandshakerReq, HandshakerResp]) error mustEmbedUnimplementedHandshakerServiceServer() } -// UnimplementedHandshakerServiceServer must be embedded to have forward compatible implementations. -type UnimplementedHandshakerServiceServer struct { -} +// UnimplementedHandshakerServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedHandshakerServiceServer struct{} -func (UnimplementedHandshakerServiceServer) DoHandshake(HandshakerService_DoHandshakeServer) error { - return status.Errorf(codes.Unimplemented, "method DoHandshake not implemented") +func (UnimplementedHandshakerServiceServer) DoHandshake(grpc.BidiStreamingServer[HandshakerReq, HandshakerResp]) error { + return status.Error(codes.Unimplemented, "method DoHandshake not implemented") } func (UnimplementedHandshakerServiceServer) mustEmbedUnimplementedHandshakerServiceServer() {} +func (UnimplementedHandshakerServiceServer) testEmbeddedByValue() {} // UnsafeHandshakerServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to HandshakerServiceServer will @@ -122,34 +108,22 @@ type UnsafeHandshakerServiceServer interface { } func RegisterHandshakerServiceServer(s grpc.ServiceRegistrar, srv HandshakerServiceServer) { + // If the following call panics, it indicates UnimplementedHandshakerServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&HandshakerService_ServiceDesc, srv) } func _HandshakerService_DoHandshake_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(HandshakerServiceServer).DoHandshake(&handshakerServiceDoHandshakeServer{stream}) -} - -type HandshakerService_DoHandshakeServer interface { - Send(*HandshakerResp) error - Recv() (*HandshakerReq, error) - grpc.ServerStream -} - -type handshakerServiceDoHandshakeServer struct { - grpc.ServerStream + return srv.(HandshakerServiceServer).DoHandshake(&grpc.GenericServerStream[HandshakerReq, HandshakerResp]{ServerStream: stream}) } -func (x *handshakerServiceDoHandshakeServer) Send(m *HandshakerResp) error { - return x.ServerStream.SendMsg(m) -} - -func (x *handshakerServiceDoHandshakeServer) Recv() (*HandshakerReq, error) { - m := new(HandshakerReq) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type HandshakerService_DoHandshakeServer = grpc.BidiStreamingServer[HandshakerReq, HandshakerResp] // HandshakerService_ServiceDesc is the grpc.ServiceDesc for HandshakerService service. // It's only intended for direct use with grpc.RegisterService, diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go index 3e53b2b13b..cf48193cb2 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/gcp/transport_security_common.proto package grpc_gcp @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -90,23 +91,20 @@ func (SecurityLevel) EnumDescriptor() ([]byte, []int) { // Max and min supported RPC protocol versions. type RpcProtocolVersions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Maximum supported RPC version. MaxRpcVersion *RpcProtocolVersions_Version `protobuf:"bytes,1,opt,name=max_rpc_version,json=maxRpcVersion,proto3" json:"max_rpc_version,omitempty"` // Minimum supported RPC version. MinRpcVersion *RpcProtocolVersions_Version `protobuf:"bytes,2,opt,name=min_rpc_version,json=minRpcVersion,proto3" json:"min_rpc_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RpcProtocolVersions) Reset() { *x = RpcProtocolVersions{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RpcProtocolVersions) String() string { @@ -117,7 +115,7 @@ func (*RpcProtocolVersions) ProtoMessage() {} func (x *RpcProtocolVersions) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -146,23 +144,111 @@ func (x *RpcProtocolVersions) GetMinRpcVersion() *RpcProtocolVersions_Version { return nil } +// The ordered list of protocols that the client wishes to use, or the set +// that the server supports. +type TransportProtocolPreferences struct { + state protoimpl.MessageState `protogen:"open.v1"` + TransportProtocol []string `protobuf:"bytes,1,rep,name=transport_protocol,json=transportProtocol,proto3" json:"transport_protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TransportProtocolPreferences) Reset() { + *x = TransportProtocolPreferences{} + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TransportProtocolPreferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransportProtocolPreferences) ProtoMessage() {} + +func (x *TransportProtocolPreferences) ProtoReflect() protoreflect.Message { + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransportProtocolPreferences.ProtoReflect.Descriptor instead. +func (*TransportProtocolPreferences) Descriptor() ([]byte, []int) { + return file_grpc_gcp_transport_security_common_proto_rawDescGZIP(), []int{1} +} + +func (x *TransportProtocolPreferences) GetTransportProtocol() []string { + if x != nil { + return x.TransportProtocol + } + return nil +} + +// The negotiated transport protocol. +type NegotiatedTransportProtocol struct { + state protoimpl.MessageState `protogen:"open.v1"` + TransportProtocol string `protobuf:"bytes,1,opt,name=transport_protocol,json=transportProtocol,proto3" json:"transport_protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NegotiatedTransportProtocol) Reset() { + *x = NegotiatedTransportProtocol{} + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NegotiatedTransportProtocol) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NegotiatedTransportProtocol) ProtoMessage() {} + +func (x *NegotiatedTransportProtocol) ProtoReflect() protoreflect.Message { + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NegotiatedTransportProtocol.ProtoReflect.Descriptor instead. +func (*NegotiatedTransportProtocol) Descriptor() ([]byte, []int) { + return file_grpc_gcp_transport_security_common_proto_rawDescGZIP(), []int{2} +} + +func (x *NegotiatedTransportProtocol) GetTransportProtocol() string { + if x != nil { + return x.TransportProtocol + } + return "" +} + // RPC version contains a major version and a minor version. type RpcProtocolVersions_Version struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` unknownFields protoimpl.UnknownFields - - Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RpcProtocolVersions_Version) Reset() { *x = RpcProtocolVersions_Version{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RpcProtocolVersions_Version) String() string { @@ -172,8 +258,8 @@ func (x *RpcProtocolVersions_Version) String() string { func (*RpcProtocolVersions_Version) ProtoMessage() {} func (x *RpcProtocolVersions_Version) ProtoReflect() protoreflect.Message { - mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[3] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -204,63 +290,49 @@ func (x *RpcProtocolVersions_Version) GetMinor() uint32 { var File_grpc_gcp_transport_security_common_proto protoreflect.FileDescriptor -var file_grpc_gcp_transport_security_common_proto_rawDesc = []byte{ - 0x0a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x22, 0xea, 0x01, 0x0a, 0x13, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x0f, - 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, - 0x2e, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6d, 0x61, - 0x78, 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x0f, 0x6d, - 0x69, 0x6e, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6d, 0x69, 0x6e, - 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x35, 0x0a, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, - 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, - 0x72, 0x2a, 0x51, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4e, - 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x49, - 0x54, 0x59, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, - 0x43, 0x59, 0x10, 0x02, 0x42, 0x78, 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x61, 0x6c, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x1c, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3f, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, - 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x2f, 0x61, 0x6c, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, 0x70, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_gcp_transport_security_common_proto_rawDesc = "" + + "\n" + + "(grpc/gcp/transport_security_common.proto\x12\bgrpc.gcp\"\xea\x01\n" + + "\x13RpcProtocolVersions\x12M\n" + + "\x0fmax_rpc_version\x18\x01 \x01(\v2%.grpc.gcp.RpcProtocolVersions.VersionR\rmaxRpcVersion\x12M\n" + + "\x0fmin_rpc_version\x18\x02 \x01(\v2%.grpc.gcp.RpcProtocolVersions.VersionR\rminRpcVersion\x1a5\n" + + "\aVersion\x12\x14\n" + + "\x05major\x18\x01 \x01(\rR\x05major\x12\x14\n" + + "\x05minor\x18\x02 \x01(\rR\x05minor\"M\n" + + "\x1cTransportProtocolPreferences\x12-\n" + + "\x12transport_protocol\x18\x01 \x03(\tR\x11transportProtocol\"L\n" + + "\x1bNegotiatedTransportProtocol\x12-\n" + + "\x12transport_protocol\x18\x01 \x01(\tR\x11transportProtocol*Q\n" + + "\rSecurityLevel\x12\x11\n" + + "\rSECURITY_NONE\x10\x00\x12\x12\n" + + "\x0eINTEGRITY_ONLY\x10\x01\x12\x19\n" + + "\x15INTEGRITY_AND_PRIVACY\x10\x02Bx\n" + + "\x15io.grpc.alts.internalB\x1cTransportSecurityCommonProtoP\x01Z?google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcpb\x06proto3" var ( file_grpc_gcp_transport_security_common_proto_rawDescOnce sync.Once - file_grpc_gcp_transport_security_common_proto_rawDescData = file_grpc_gcp_transport_security_common_proto_rawDesc + file_grpc_gcp_transport_security_common_proto_rawDescData []byte ) func file_grpc_gcp_transport_security_common_proto_rawDescGZIP() []byte { file_grpc_gcp_transport_security_common_proto_rawDescOnce.Do(func() { - file_grpc_gcp_transport_security_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_transport_security_common_proto_rawDescData) + file_grpc_gcp_transport_security_common_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_gcp_transport_security_common_proto_rawDesc), len(file_grpc_gcp_transport_security_common_proto_rawDesc))) }) return file_grpc_gcp_transport_security_common_proto_rawDescData } var file_grpc_gcp_transport_security_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_grpc_gcp_transport_security_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_grpc_gcp_transport_security_common_proto_goTypes = []interface{}{ - (SecurityLevel)(0), // 0: grpc.gcp.SecurityLevel - (*RpcProtocolVersions)(nil), // 1: grpc.gcp.RpcProtocolVersions - (*RpcProtocolVersions_Version)(nil), // 2: grpc.gcp.RpcProtocolVersions.Version +var file_grpc_gcp_transport_security_common_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_grpc_gcp_transport_security_common_proto_goTypes = []any{ + (SecurityLevel)(0), // 0: grpc.gcp.SecurityLevel + (*RpcProtocolVersions)(nil), // 1: grpc.gcp.RpcProtocolVersions + (*TransportProtocolPreferences)(nil), // 2: grpc.gcp.TransportProtocolPreferences + (*NegotiatedTransportProtocol)(nil), // 3: grpc.gcp.NegotiatedTransportProtocol + (*RpcProtocolVersions_Version)(nil), // 4: grpc.gcp.RpcProtocolVersions.Version } var file_grpc_gcp_transport_security_common_proto_depIdxs = []int32{ - 2, // 0: grpc.gcp.RpcProtocolVersions.max_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version - 2, // 1: grpc.gcp.RpcProtocolVersions.min_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version + 4, // 0: grpc.gcp.RpcProtocolVersions.max_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version + 4, // 1: grpc.gcp.RpcProtocolVersions.min_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name @@ -273,39 +345,13 @@ func file_grpc_gcp_transport_security_common_proto_init() { if File_grpc_gcp_transport_security_common_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_gcp_transport_security_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RpcProtocolVersions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_transport_security_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RpcProtocolVersions_Version); 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_grpc_gcp_transport_security_common_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_gcp_transport_security_common_proto_rawDesc), len(file_grpc_gcp_transport_security_common_proto_rawDesc)), NumEnums: 1, - NumMessages: 2, + NumMessages: 4, NumExtensions: 0, NumServices: 0, }, @@ -315,7 +361,6 @@ func file_grpc_gcp_transport_security_common_proto_init() { MessageInfos: file_grpc_gcp_transport_security_common_proto_msgTypes, }.Build() File_grpc_gcp_transport_security_common_proto = out.File - file_grpc_gcp_transport_security_common_proto_rawDesc = nil file_grpc_gcp_transport_security_common_proto_goTypes = nil file_grpc_gcp_transport_security_common_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go index f6b55c68b5..c8e337cdda 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/credentials/credentials.go @@ -30,7 +30,7 @@ import ( "google.golang.org/grpc/attributes" icredentials "google.golang.org/grpc/internal/credentials" - "google.golang.org/protobuf/protoadapt" + "google.golang.org/protobuf/proto" ) // PerRPCCredentials defines the common interface for the credentials which need to @@ -96,10 +96,11 @@ func (c CommonAuthInfo) GetCommonAuthInfo() CommonAuthInfo { return c } -// ProtocolInfo provides information regarding the gRPC wire protocol version, -// security protocol, security protocol version in use, server name, etc. +// ProtocolInfo provides static information regarding transport credentials. type ProtocolInfo struct { // ProtocolVersion is the gRPC wire protocol version. + // + // Deprecated: this is unused by gRPC. ProtocolVersion string // SecurityProtocol is the security protocol in use. SecurityProtocol string @@ -109,7 +110,16 @@ type ProtocolInfo struct { // // Deprecated: please use Peer.AuthInfo. SecurityVersion string - // ServerName is the user-configured server name. + // ServerName is the user-configured server name. If set, this overrides + // the default :authority header used for all RPCs on the channel using the + // containing credentials, unless grpc.WithAuthority is set on the channel, + // in which case that setting will take precedence. + // + // This must be a valid `:authority` header according to + // [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2). + // + // Deprecated: Users should use grpc.WithAuthority to override the authority + // on a channel instead of configuring the credentials. ServerName string } @@ -120,6 +130,20 @@ type AuthInfo interface { AuthType() string } +// AuthorityValidator validates the authority used to override the `:authority` +// header. This is an optional interface that implementations of AuthInfo can +// implement if they support per-RPC authority overrides. It is invoked when the +// application attempts to override the HTTP/2 `:authority` header using the +// CallAuthority call option. +type AuthorityValidator interface { + // ValidateAuthority checks the authority value used to override the + // `:authority` header. The authority parameter is the override value + // provided by the application via the CallAuthority option. This value + // typically corresponds to the server hostname or endpoint the RPC is + // targeting. It returns non-nil error if the validation fails. + ValidateAuthority(authority string) error +} + // ErrConnDispatched indicates that rawConn has been dispatched out of gRPC // and the caller should not close rawConn. var ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC") @@ -159,12 +183,17 @@ type TransportCredentials interface { // Clone makes a copy of this TransportCredentials. Clone() TransportCredentials // OverrideServerName specifies the value used for the following: + // // - verifying the hostname on the returned certificates // - as SNI in the client's handshake to support virtual hosting // - as the value for `:authority` header at stream creation time // - // Deprecated: use grpc.WithAuthority instead. Will be supported - // throughout 1.x. + // The provided string should be a valid `:authority` header according to + // [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2). + // + // Deprecated: this method is unused by gRPC. Users should use + // grpc.WithAuthority to override the authority on a channel instead of + // configuring the credentials. OverrideServerName(string) error } @@ -207,14 +236,32 @@ type RequestInfo struct { AuthInfo AuthInfo } +// requestInfoKey is a struct to be used as the key to store RequestInfo in a +// context. +type requestInfoKey struct{} + // RequestInfoFromContext extracts the RequestInfo from the context if it exists. // // This API is experimental. func RequestInfoFromContext(ctx context.Context) (ri RequestInfo, ok bool) { - ri, ok = icredentials.RequestInfoFromContext(ctx).(RequestInfo) + ri, ok = ctx.Value(requestInfoKey{}).(RequestInfo) return ri, ok } +// NewContextWithRequestInfo creates a new context from ctx and attaches ri to it. +// +// This RequestInfo will be accessible via RequestInfoFromContext. +// +// Intended to be used from tests for PerRPCCredentials implementations (that +// often need to check connection's SecurityLevel). Should not be used from +// non-test code: the gRPC client already prepares a context with the correct +// RequestInfo attached when calling PerRPCCredentials.GetRequestMetadata. +// +// This API is experimental. +func NewContextWithRequestInfo(ctx context.Context, ri RequestInfo) context.Context { + return context.WithValue(ctx, requestInfoKey{}, ri) +} + // ClientHandshakeInfo holds data to be passed to ClientHandshake. This makes // it possible to pass arbitrary data to the handshaker from gRPC, resolver, // balancer etc. Individual credential implementations control the actual @@ -237,7 +284,7 @@ func ClientHandshakeInfoFromContext(ctx context.Context) ClientHandshakeInfo { } // CheckSecurityLevel checks if a connection's security level is greater than or equal to the specified one. -// It returns success if 1) the condition is satisified or 2) AuthInfo struct does not implement GetCommonAuthInfo() method +// It returns success if 1) the condition is satisfied or 2) AuthInfo struct does not implement GetCommonAuthInfo() method // or 3) CommonAuthInfo.SecurityLevel has an invalid zero value. For 2) and 3), it is for the purpose of backward-compatibility. // // This API is experimental. @@ -287,5 +334,5 @@ type ChannelzSecurityValue interface { type OtherChannelzSecurityValue struct { ChannelzSecurityValue Name string - Value protoadapt.MessageV1 + Value proto.Message } diff --git a/vendor/google.golang.org/grpc/credentials/insecure/insecure.go b/vendor/google.golang.org/grpc/credentials/insecure/insecure.go index 82bee1443b..93156c0f34 100644 --- a/vendor/google.golang.org/grpc/credentials/insecure/insecure.go +++ b/vendor/google.golang.org/grpc/credentials/insecure/insecure.go @@ -30,7 +30,7 @@ import ( // NewCredentials returns a credentials which disables transport security. // // Note that using this credentials with per-RPC credentials which require -// transport security is incompatible and will cause grpc.Dial() to fail. +// transport security is incompatible and will cause RPCs to fail. func NewCredentials() credentials.TransportCredentials { return insecureTC{} } @@ -40,7 +40,7 @@ func NewCredentials() credentials.TransportCredentials { // NoSecurity. type insecureTC struct{} -func (insecureTC) ClientHandshake(ctx context.Context, _ string, conn net.Conn) (net.Conn, credentials.AuthInfo, error) { +func (insecureTC) ClientHandshake(_ context.Context, _ string, conn net.Conn) (net.Conn, credentials.AuthInfo, error) { return conn, info{credentials.CommonAuthInfo{SecurityLevel: credentials.NoSecurity}}, nil } @@ -71,6 +71,12 @@ func (info) AuthType() string { return "insecure" } +// ValidateAuthority allows any value to be overridden for the :authority +// header. +func (info) ValidateAuthority(string) error { + return nil +} + // insecureBundle implements an insecure bundle. // An insecure bundle provides a thin wrapper around insecureTC to support // the credentials.Bundle interface. diff --git a/vendor/google.golang.org/grpc/credentials/tls.go b/vendor/google.golang.org/grpc/credentials/tls.go index 5dafd34edf..8277be7d6f 100644 --- a/vendor/google.golang.org/grpc/credentials/tls.go +++ b/vendor/google.golang.org/grpc/credentials/tls.go @@ -22,14 +22,21 @@ import ( "context" "crypto/tls" "crypto/x509" + "errors" "fmt" "net" "net/url" "os" + "google.golang.org/grpc/grpclog" credinternal "google.golang.org/grpc/internal/credentials" + "google.golang.org/grpc/internal/envconfig" ) +const alpnFailureHelpMessage = "If you upgraded from a grpc-go version earlier than 1.67, your TLS connections may have stopped working due to ALPN enforcement. For more details, see: https://github.com/grpc/grpc-go/issues/434" + +var logger = grpclog.Component("credentials") + // TLSInfo contains the auth information for a TLS authenticated connection. // It implements the AuthInfo interface. type TLSInfo struct { @@ -44,6 +51,21 @@ func (t TLSInfo) AuthType() string { return "tls" } +// ValidateAuthority validates the provided authority being used to override the +// :authority header by verifying it against the peer certificates. It returns a +// non-nil error if the validation fails. +func (t TLSInfo) ValidateAuthority(authority string) error { + var errs []error + for _, cert := range t.State.PeerCertificates { + var err error + if err = cert.VerifyHostname(authority); err == nil { + return nil + } + errs = append(errs, err) + } + return fmt.Errorf("credentials: invalid authority %q: %v", authority, errors.Join(errs...)) +} + // cipherSuiteLookup returns the string version of a TLS cipher suite ID. func cipherSuiteLookup(cipherSuiteID uint16) string { for _, s := range tls.CipherSuites() { @@ -88,14 +110,14 @@ func (c tlsCreds) Info() ProtocolInfo { func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) { // use local cfg to avoid clobbering ServerName if using multiple endpoints cfg := credinternal.CloneTLSConfig(c.config) - if cfg.ServerName == "" { - serverName, _, err := net.SplitHostPort(authority) - if err != nil { - // If the authority had no host port or if the authority cannot be parsed, use it as-is. - serverName = authority - } - cfg.ServerName = serverName + + serverName, _, err := net.SplitHostPort(authority) + if err != nil { + // If the authority had no host port or if the authority cannot be parsed, use it as-is. + serverName = authority } + cfg.ServerName = serverName + conn := tls.Client(rawConn, cfg) errChannel := make(chan error, 1) go func() { @@ -112,6 +134,22 @@ func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawCon conn.Close() return nil, nil, ctx.Err() } + + // The negotiated protocol can be either of the following: + // 1. h2: When the server supports ALPN. Only HTTP/2 can be negotiated since + // it is the only protocol advertised by the client during the handshake. + // The tls library ensures that the server chooses a protocol advertised + // by the client. + // 2. "" (empty string): If the server doesn't support ALPN. ALPN is a requirement + // for using HTTP/2 over TLS. We can terminate the connection immediately. + np := conn.ConnectionState().NegotiatedProtocol + if np == "" { + if envconfig.EnforceALPNEnabled { + conn.Close() + return nil, nil, fmt.Errorf("credentials: cannot check peer: missing selected ALPN property. %s", alpnFailureHelpMessage) + } + logger.Warningf("Allowing TLS connection to server %q with ALPN disabled. TLS connections to servers with ALPN disabled will be disallowed in future grpc-go releases", cfg.ServerName) + } tlsInfo := TLSInfo{ State: conn.ConnectionState(), CommonAuthInfo: CommonAuthInfo{ @@ -131,8 +169,20 @@ func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) conn.Close() return nil, nil, err } + cs := conn.ConnectionState() + // The negotiated application protocol can be empty only if the client doesn't + // support ALPN. In such cases, we can close the connection since ALPN is required + // for using HTTP/2 over TLS. + if cs.NegotiatedProtocol == "" { + if envconfig.EnforceALPNEnabled { + conn.Close() + return nil, nil, fmt.Errorf("credentials: cannot check peer: missing selected ALPN property. %s", alpnFailureHelpMessage) + } else if logger.V(2) { + logger.Info("Allowing TLS connection from client with ALPN disabled. TLS connections with ALPN disabled will be disallowed in future grpc-go releases") + } + } tlsInfo := TLSInfo{ - State: conn.ConnectionState(), + State: cs, CommonAuthInfo: CommonAuthInfo{ SecurityLevel: PrivacyAndIntegrity, }, @@ -168,25 +218,40 @@ var tls12ForbiddenCipherSuites = map[uint16]struct{}{ // NewTLS uses c to construct a TransportCredentials based on TLS. func NewTLS(c *tls.Config) TransportCredentials { - tc := &tlsCreds{credinternal.CloneTLSConfig(c)} - tc.config.NextProtos = credinternal.AppendH2ToNextProtos(tc.config.NextProtos) + config := applyDefaults(c) + if config.GetConfigForClient != nil { + oldFn := config.GetConfigForClient + config.GetConfigForClient = func(hello *tls.ClientHelloInfo) (*tls.Config, error) { + cfgForClient, err := oldFn(hello) + if err != nil || cfgForClient == nil { + return cfgForClient, err + } + return applyDefaults(cfgForClient), nil + } + } + return &tlsCreds{config: config} +} + +func applyDefaults(c *tls.Config) *tls.Config { + config := credinternal.CloneTLSConfig(c) + config.NextProtos = credinternal.AppendH2ToNextProtos(config.NextProtos) // If the user did not configure a MinVersion and did not configure a // MaxVersion < 1.2, use MinVersion=1.2, which is required by // https://datatracker.ietf.org/doc/html/rfc7540#section-9.2 - if tc.config.MinVersion == 0 && (tc.config.MaxVersion == 0 || tc.config.MaxVersion >= tls.VersionTLS12) { - tc.config.MinVersion = tls.VersionTLS12 + if config.MinVersion == 0 && (config.MaxVersion == 0 || config.MaxVersion >= tls.VersionTLS12) { + config.MinVersion = tls.VersionTLS12 } // If the user did not configure CipherSuites, use all "secure" cipher // suites reported by the TLS package, but remove some explicitly forbidden // by https://datatracker.ietf.org/doc/html/rfc7540#appendix-A - if tc.config.CipherSuites == nil { + if config.CipherSuites == nil { for _, cs := range tls.CipherSuites() { if _, ok := tls12ForbiddenCipherSuites[cs.ID]; !ok { - tc.config.CipherSuites = append(tc.config.CipherSuites, cs.ID) + config.CipherSuites = append(config.CipherSuites, cs.ID) } } } - return tc + return config } // NewClientTLSFromCert constructs TLS credentials from the provided root @@ -194,9 +259,11 @@ func NewTLS(c *tls.Config) TransportCredentials { // certificates to establish the identity of the client need to be included in // the credentials (eg: for mTLS), use NewTLS instead, where a complete // tls.Config can be specified. -// serverNameOverride is for testing only. If set to a non empty string, -// it will override the virtual host name of authority (e.g. :authority header -// field) in requests. +// +// serverNameOverride is for testing only. If set to a non empty string, it will +// override the virtual host name of authority (e.g. :authority header field) in +// requests. Users should use grpc.WithAuthority passed to grpc.NewClient to +// override the authority of the client instead. func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials { return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}) } @@ -206,9 +273,11 @@ func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) Transpor // certificates to establish the identity of the client need to be included in // the credentials (eg: for mTLS), use NewTLS instead, where a complete // tls.Config can be specified. -// serverNameOverride is for testing only. If set to a non empty string, -// it will override the virtual host name of authority (e.g. :authority header -// field) in requests. +// +// serverNameOverride is for testing only. If set to a non empty string, it will +// override the virtual host name of authority (e.g. :authority header field) in +// requests. Users should use grpc.WithAuthority passed to grpc.NewClient to +// override the authority of the client instead. func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { b, err := os.ReadFile(certFile) if err != nil { diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 402493224e..7a5ac2e7c4 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -21,6 +21,7 @@ package grpc import ( "context" "net" + "net/url" "time" "google.golang.org/grpc/backoff" @@ -32,10 +33,16 @@ import ( "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/resolver" "google.golang.org/grpc/stats" ) +const ( + // https://github.com/grpc/proposal/blob/master/A6-client-retries.md#limits-on-retries-and-hedges + defaultMaxCallAttempts = 5 +) + func init() { internal.AddGlobalDialOptions = func(opt ...DialOption) { globalDialOptions = append(globalDialOptions, opt...) @@ -43,10 +50,18 @@ func init() { internal.ClearGlobalDialOptions = func() { globalDialOptions = nil } + internal.AddGlobalPerTargetDialOptions = func(opt any) { + if ptdo, ok := opt.(perTargetDialOption); ok { + globalPerTargetDialOptions = append(globalPerTargetDialOptions, ptdo) + } + } + internal.ClearGlobalPerTargetDialOptions = func() { + globalPerTargetDialOptions = nil + } internal.WithBinaryLogger = withBinaryLogger internal.JoinDialOptions = newJoinDialOption internal.DisableGlobalDialOptions = newDisableGlobalDialOptions - internal.WithRecvBufferPool = withRecvBufferPool + internal.WithBufferPool = withBufferPool } // dialOptions configure a Dial call. dialOptions are set by the DialOption @@ -58,7 +73,7 @@ type dialOptions struct { chainUnaryInts []UnaryClientInterceptor chainStreamInts []StreamClientInterceptor - cp Compressor + compressorV0 Compressor dc Decompressor bs internalbackoff.Strategy block bool @@ -72,14 +87,15 @@ type dialOptions struct { disableServiceConfig bool disableRetry bool disableHealthCheck bool - healthCheckFunc internal.HealthChecker minConnectTimeout func() time.Duration defaultServiceConfig *ServiceConfig // defaultServiceConfig is parsed from defaultServiceConfigRawJSON. defaultServiceConfigRawJSON *string resolvers []resolver.Builder idleTimeout time.Duration - recvBufferPool SharedBufferPool defaultScheme string + maxCallAttempts int + enableLocalDNSResolution bool // Specifies if target hostnames should be resolved when proxying is enabled. + useProxy bool // Specifies if a server should be connected via proxy. } // DialOption configures how we set up the connection. @@ -89,6 +105,19 @@ type DialOption interface { var globalDialOptions []DialOption +// perTargetDialOption takes a parsed target and returns a dial option to apply. +// +// This gets called after NewClient() parses the target, and allows per target +// configuration set through a returned DialOption. The DialOption will not take +// effect if specifies a resolver builder, as that Dial Option is factored in +// while parsing target. +type perTargetDialOption interface { + // DialOption returns a Dial Option to apply. + DialOptionForTarget(parsedTarget url.URL) DialOption +} + +var globalPerTargetDialOptions []perTargetDialOption + // EmptyDialOption does not alter the dial configuration. It can be embedded in // another structure to build custom dial options. // @@ -184,6 +213,7 @@ func WithReadBufferSize(s int) DialOption { func WithInitialWindowSize(s int32) DialOption { return newFuncDialOption(func(o *dialOptions) { o.copts.InitialWindowSize = s + o.copts.StaticWindowSize = true }) } @@ -193,6 +223,26 @@ func WithInitialWindowSize(s int32) DialOption { func WithInitialConnWindowSize(s int32) DialOption { return newFuncDialOption(func(o *dialOptions) { o.copts.InitialConnWindowSize = s + o.copts.StaticWindowSize = true + }) +} + +// WithStaticStreamWindowSize returns a DialOption which sets the initial +// stream window size to the value provided and disables dynamic flow control. +func WithStaticStreamWindowSize(s int32) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.InitialWindowSize = s + o.copts.StaticWindowSize = true + }) +} + +// WithStaticConnWindowSize returns a DialOption which sets the initial +// connection window size to the value provided and disables dynamic flow +// control. +func WithStaticConnWindowSize(s int32) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.InitialConnWindowSize = s + o.copts.StaticWindowSize = true }) } @@ -229,7 +279,7 @@ func WithCodec(c Codec) DialOption { // Deprecated: use UseCompressor instead. Will be supported throughout 1.x. func WithCompressor(cp Compressor) DialOption { return newFuncDialOption(func(o *dialOptions) { - o.cp = cp + o.compressorV0 = cp }) } @@ -300,6 +350,9 @@ func withBackoff(bs internalbackoff.Strategy) DialOption { // // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md +// +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithBlock() DialOption { return newFuncDialOption(func(o *dialOptions) { o.block = true @@ -314,10 +367,8 @@ func WithBlock() DialOption { // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md // -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithReturnConnectionError() DialOption { return newFuncDialOption(func(o *dialOptions) { o.block = true @@ -330,7 +381,7 @@ func WithReturnConnectionError() DialOption { // // Note that using this DialOption with per-RPC credentials (through // WithCredentialsBundle or WithPerRPCCredentials) which require transport -// security is incompatible and will cause grpc.Dial() to fail. +// security is incompatible and will cause RPCs to fail. // // Deprecated: use WithTransportCredentials and insecure.NewCredentials() // instead. Will be supported throughout 1.x. @@ -349,7 +400,22 @@ func WithInsecure() DialOption { // later release. func WithNoProxy() DialOption { return newFuncDialOption(func(o *dialOptions) { - o.copts.UseProxy = false + o.useProxy = false + }) +} + +// WithLocalDNSResolution forces local DNS name resolution even when a proxy is +// specified in the environment. By default, the server name is provided +// directly to the proxy as part of the CONNECT handshake. This is ignored if +// WithNoProxy is used. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func WithLocalDNSResolution() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.enableLocalDNSResolution = true }) } @@ -387,8 +453,8 @@ func WithCredentialsBundle(b credentials.Bundle) DialOption { // WithTimeout returns a DialOption that configures a timeout for dialing a // ClientConn initially. This is valid if and only if WithBlock() is present. // -// Deprecated: use DialContext instead of Dial and context.WithTimeout -// instead. Will be supported throughout 1.x. +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithTimeout(d time.Duration) DialOption { return newFuncDialOption(func(o *dialOptions) { o.timeout = d @@ -400,6 +466,11 @@ func WithTimeout(d time.Duration) DialOption { // returned by f, gRPC checks the error's Temporary() method to decide if it // should try to reconnect to the network address. // +// Note that gRPC by default performs name resolution on the target passed to +// NewClient. To bypass name resolution and cause the target string to be +// passed directly to the dialer here instead, use the "passthrough" resolver +// by specifying it in the target string, e.g. "passthrough:target". +// // Note: All supported releases of Go (as of December 2023) override the OS // defaults for TCP keepalive time and interval to 15s. To enable TCP keepalive // with OS defaults for keepalive time and interval, use a net.Dialer that sets @@ -407,7 +478,7 @@ func WithTimeout(d time.Duration) DialOption { // option to true from the Control field. For a concrete example of how to do // this, see internal.NetDialerWithTCPKeepalive(). // -// For more information, please see [issue 23459] in the Go github repo. +// For more information, please see [issue 23459] in the Go GitHub repo. // // [issue 23459]: https://github.com/golang/go/issues/23459 func WithContextDialer(f func(context.Context, string) (net.Conn, error)) DialOption { @@ -416,10 +487,6 @@ func WithContextDialer(f func(context.Context, string) (net.Conn, error)) DialOp }) } -func init() { - internal.WithHealthCheckFunc = withHealthCheckFunc -} - // WithDialer returns a DialOption that specifies a function to use for dialing // network addresses. If FailOnNonTempDialError() is set to true, and an error // is returned by f, gRPC checks the error's Temporary() method to decide if it @@ -470,9 +537,8 @@ func withBinaryLogger(bl binarylog.Logger) DialOption { // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md // -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// Deprecated: this DialOption is not supported by NewClient. +// This API may be changed or removed in a // later release. func FailOnNonTempDialError(f bool) DialOption { return newFuncDialOption(func(o *dialOptions) { @@ -490,6 +556,8 @@ func WithUserAgent(s string) DialOption { // WithKeepaliveParams returns a DialOption that specifies keepalive parameters // for the client transport. +// +// Keepalive is disabled by default. func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption { if kp.Time < internal.KeepaliveMinPingTime { logger.Warningf("Adjusting keepalive ping interval to minimum period of %v", internal.KeepaliveMinPingTime) @@ -540,6 +608,8 @@ func WithChainStreamInterceptor(interceptors ...StreamClientInterceptor) DialOpt // WithAuthority returns a DialOption that specifies the value to be used as the // :authority pseudo-header and as the server name in authentication handshake. +// This overrides all other ways of setting authority on the channel, but can be +// overridden per-call by using grpc.CallAuthority. func WithAuthority(a string) DialOption { return newFuncDialOption(func(o *dialOptions) { o.authority = a @@ -601,12 +671,22 @@ func WithDisableRetry() DialOption { }) } +// MaxHeaderListSizeDialOption is a DialOption that specifies the maximum +// (uncompressed) size of header list that the client is prepared to accept. +type MaxHeaderListSizeDialOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeDialOption) apply(do *dialOptions) { + do.copts.MaxHeaderListSize = &o.MaxHeaderListSize +} + // WithMaxHeaderListSize returns a DialOption that specifies the maximum // (uncompressed) size of header list that the client is prepared to accept. func WithMaxHeaderListSize(s uint32) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.copts.MaxHeaderListSize = &s - }) + return MaxHeaderListSizeDialOption{ + MaxHeaderListSize: s, + } } // WithDisableHealthCheck disables the LB channel health checking for all @@ -622,33 +702,24 @@ func WithDisableHealthCheck() DialOption { }) } -// withHealthCheckFunc replaces the default health check function with the -// provided one. It makes tests easier to change the health check function. -// -// For testing purpose only. -func withHealthCheckFunc(f internal.HealthChecker) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.healthCheckFunc = f - }) -} - func defaultDialOptions() dialOptions { return dialOptions{ copts: transport.ConnectOptions{ ReadBufferSize: defaultReadBufSize, WriteBufferSize: defaultWriteBufSize, - UseProxy: true, UserAgent: grpcUA, + BufferPool: mem.DefaultBufferPool(), }, - bs: internalbackoff.DefaultExponential, - healthCheckFunc: internal.HealthCheckFunc, - idleTimeout: 30 * time.Minute, - recvBufferPool: nopBufferPool{}, - defaultScheme: "dns", + bs: internalbackoff.DefaultExponential, + idleTimeout: 30 * time.Minute, + defaultScheme: "dns", + maxCallAttempts: defaultMaxCallAttempts, + useProxy: true, + enableLocalDNSResolution: false, } } -// withGetMinConnectDeadline specifies the function that clientconn uses to +// withMinConnectDeadline specifies the function that clientconn uses to // get minConnectDeadline. This can be used to make connection attempts happen // faster/slower. // @@ -702,25 +773,25 @@ func WithIdleTimeout(d time.Duration) DialOption { }) } -// WithRecvBufferPool returns a DialOption that configures the ClientConn -// to use the provided shared buffer pool for parsing incoming messages. Depending -// on the application's workload, this could result in reduced memory allocation. -// -// If you are unsure about how to implement a memory pool but want to utilize one, -// begin with grpc.NewSharedBufferPool. -// -// Note: The shared buffer pool feature will not be active if any of the following -// options are used: WithStatsHandler, EnableTracing, or binary logging. In such -// cases, the shared buffer pool will be ignored. +// WithMaxCallAttempts returns a DialOption that configures the maximum number +// of attempts per call (including retries and hedging) using the channel. +// Service owners may specify a higher value for these parameters, but higher +// values will be treated as equal to the maximum value by the client +// implementation. This mitigates security concerns related to the service +// config being transferred to the client via DNS. // -// Deprecated: use experimental.WithRecvBufferPool instead. Will be deleted in -// v1.60.0 or later. -func WithRecvBufferPool(bufferPool SharedBufferPool) DialOption { - return withRecvBufferPool(bufferPool) +// A value of 5 will be used if this dial option is not set or n < 2. +func WithMaxCallAttempts(n int) DialOption { + return newFuncDialOption(func(o *dialOptions) { + if n < 2 { + n = defaultMaxCallAttempts + } + o.maxCallAttempts = n + }) } -func withRecvBufferPool(bufferPool SharedBufferPool) DialOption { +func withBufferPool(bufferPool mem.BufferPool) DialOption { return newFuncDialOption(func(o *dialOptions) { - o.recvBufferPool = bufferPool + o.copts.BufferPool = bufferPool }) } diff --git a/vendor/google.golang.org/grpc/doc.go b/vendor/google.golang.org/grpc/doc.go index 0022859ad7..e7b532b6f8 100644 --- a/vendor/google.golang.org/grpc/doc.go +++ b/vendor/google.golang.org/grpc/doc.go @@ -16,7 +16,7 @@ * */ -//go:generate ./regenerate.sh +//go:generate ./scripts/regenerate.sh /* Package grpc implements an RPC system called gRPC. diff --git a/vendor/google.golang.org/grpc/encoding/encoding.go b/vendor/google.golang.org/grpc/encoding/encoding.go index 5ebf88d714..11d0ae142c 100644 --- a/vendor/google.golang.org/grpc/encoding/encoding.go +++ b/vendor/google.golang.org/grpc/encoding/encoding.go @@ -94,7 +94,7 @@ type Codec interface { Name() string } -var registeredCodecs = make(map[string]Codec) +var registeredCodecs = make(map[string]any) // RegisterCodec registers the provided Codec for use with all gRPC clients and // servers. @@ -126,5 +126,6 @@ func RegisterCodec(codec Codec) { // // The content-subtype is expected to be lowercase. func GetCodec(contentSubtype string) Codec { - return registeredCodecs[contentSubtype] + c, _ := registeredCodecs[contentSubtype].(Codec) + return c } diff --git a/vendor/google.golang.org/grpc/encoding/encoding_v2.go b/vendor/google.golang.org/grpc/encoding/encoding_v2.go new file mode 100644 index 0000000000..074c5e234a --- /dev/null +++ b/vendor/google.golang.org/grpc/encoding/encoding_v2.go @@ -0,0 +1,81 @@ +/* + * + * Copyright 2024 gRPC 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 encoding + +import ( + "strings" + + "google.golang.org/grpc/mem" +) + +// CodecV2 defines the interface gRPC uses to encode and decode messages. Note +// that implementations of this interface must be thread safe; a CodecV2's +// methods can be called from concurrent goroutines. +type CodecV2 interface { + // Marshal returns the wire format of v. The buffers in the returned + // [mem.BufferSlice] must have at least one reference each, which will be freed + // by gRPC when they are no longer needed. + Marshal(v any) (out mem.BufferSlice, err error) + // Unmarshal parses the wire format into v. Note that data will be freed as soon + // as this function returns. If the codec wishes to guarantee access to the data + // after this function, it must take its own reference that it frees when it is + // no longer needed. + Unmarshal(data mem.BufferSlice, v any) error + // Name returns the name of the Codec implementation. The returned string + // will be used as part of content type in transmission. The result must be + // static; the result cannot change between calls. + Name() string +} + +// RegisterCodecV2 registers the provided CodecV2 for use with all gRPC clients and +// servers. +// +// The CodecV2 will be stored and looked up by result of its Name() method, which +// should match the content-subtype of the encoding handled by the CodecV2. This +// is case-insensitive, and is stored and looked up as lowercase. If the +// result of calling Name() is an empty string, RegisterCodecV2 will panic. See +// Content-Type on +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +// +// If both a Codec and CodecV2 are registered with the same name, the CodecV2 +// will be used. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple Codecs are +// registered with the same name, the one registered last will take effect. +func RegisterCodecV2(codec CodecV2) { + if codec == nil { + panic("cannot register a nil CodecV2") + } + if codec.Name() == "" { + panic("cannot register CodecV2 with empty string result for Name()") + } + contentSubtype := strings.ToLower(codec.Name()) + registeredCodecs[contentSubtype] = codec +} + +// GetCodecV2 gets a registered CodecV2 by content-subtype, or nil if no CodecV2 is +// registered for the content-subtype. +// +// The content-subtype is expected to be lowercase. +func GetCodecV2(contentSubtype string) CodecV2 { + c, _ := registeredCodecs[contentSubtype].(CodecV2) + return c +} diff --git a/vendor/google.golang.org/grpc/encoding/proto/proto.go b/vendor/google.golang.org/grpc/encoding/proto/proto.go index 66d5cdf03e..1ab874c7ad 100644 --- a/vendor/google.golang.org/grpc/encoding/proto/proto.go +++ b/vendor/google.golang.org/grpc/encoding/proto/proto.go @@ -1,6 +1,6 @@ /* * - * Copyright 2018 gRPC authors. + * Copyright 2024 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import ( "fmt" "google.golang.org/grpc/encoding" + "google.golang.org/grpc/mem" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/protoadapt" ) @@ -32,28 +33,67 @@ import ( const Name = "proto" func init() { - encoding.RegisterCodec(codec{}) + encoding.RegisterCodecV2(&codecV2{}) } -// codec is a Codec implementation with protobuf. It is the default codec for gRPC. -type codec struct{} +// codec is a CodecV2 implementation with protobuf. It is the default codec for +// gRPC. +type codecV2 struct{} -func (codec) Marshal(v any) ([]byte, error) { +func (c *codecV2) Marshal(v any) (data mem.BufferSlice, err error) { vv := messageV2Of(v) if vv == nil { - return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v) + return nil, fmt.Errorf("proto: failed to marshal, message is %T, want proto.Message", v) } - return proto.Marshal(vv) + // Important: if we remove this Size call then we cannot use + // UseCachedSize in MarshalOptions below. + size := proto.Size(vv) + + // MarshalOptions with UseCachedSize allows reusing the result from the + // previous Size call. This is safe here because: + // + // 1. We just computed the size. + // 2. We assume the message is not being mutated concurrently. + // + // Important: If the proto.Size call above is removed, using UseCachedSize + // becomes unsafe and may lead to incorrect marshaling. + // + // For more details, see the doc of UseCachedSize: + // https://pkg.go.dev/google.golang.org/protobuf/proto#MarshalOptions + marshalOptions := proto.MarshalOptions{UseCachedSize: true} + + if mem.IsBelowBufferPoolingThreshold(size) { + buf, err := marshalOptions.Marshal(vv) + if err != nil { + return nil, err + } + data = append(data, mem.SliceBuffer(buf)) + } else { + pool := mem.DefaultBufferPool() + buf := pool.Get(size) + if _, err := marshalOptions.MarshalAppend((*buf)[:0], vv); err != nil { + pool.Put(buf) + return nil, err + } + data = append(data, mem.NewBuffer(buf, pool)) + } + + return data, nil } -func (codec) Unmarshal(data []byte, v any) error { +func (c *codecV2) Unmarshal(data mem.BufferSlice, v any) (err error) { vv := messageV2Of(v) if vv == nil { return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v) } - return proto.Unmarshal(data, vv) + buf := data.MaterializeToBuffer(mem.DefaultBufferPool()) + defer buf.Free() + // TODO: Upgrade proto.Unmarshal to support mem.BufferSlice. Right now, it's not + // really possible without a major overhaul of the proto package, but the + // vtprotobuf library may be able to support this. + return proto.Unmarshal(buf.ReadOnlyData(), vv) } func messageV2Of(v any) proto.Message { @@ -67,6 +107,6 @@ func messageV2Of(v any) proto.Message { return nil } -func (codec) Name() string { +func (c *codecV2) Name() string { return Name } diff --git a/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go b/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go new file mode 100644 index 0000000000..ad75313a18 --- /dev/null +++ b/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go @@ -0,0 +1,270 @@ +/* + * + * Copyright 2024 gRPC 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 stats + +import ( + "maps" + + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/stats" +) + +func init() { + internal.SnapshotMetricRegistryForTesting = snapshotMetricsRegistryForTesting +} + +var logger = grpclog.Component("metrics-registry") + +// DefaultMetrics are the default metrics registered through global metrics +// registry. This is written to at initialization time only, and is read only +// after initialization. +var DefaultMetrics = stats.NewMetricSet() + +// MetricDescriptor is the data for a registered metric. +type MetricDescriptor struct { + // The name of this metric. This name must be unique across the whole binary + // (including any per call metrics). See + // https://github.com/grpc/proposal/blob/master/A79-non-per-call-metrics-architecture.md#metric-instrument-naming-conventions + // for metric naming conventions. + Name string + // The description of this metric. + Description string + // The unit (e.g. entries, seconds) of this metric. + Unit string + // The required label keys for this metric. These are intended to + // metrics emitted from a stats handler. + Labels []string + // The optional label keys for this metric. These are intended to attached + // to metrics emitted from a stats handler if configured. + OptionalLabels []string + // Whether this metric is on by default. + Default bool + // The type of metric. This is set by the metric registry, and not intended + // to be set by a component registering a metric. + Type MetricType + // Bounds are the bounds of this metric. This only applies to histogram + // metrics. If unset or set with length 0, stats handlers will fall back to + // default bounds. + Bounds []float64 +} + +// MetricType is the type of metric. +type MetricType int + +// Type of metric supported by this instrument registry. +const ( + MetricTypeIntCount MetricType = iota + MetricTypeFloatCount + MetricTypeIntHisto + MetricTypeFloatHisto + MetricTypeIntGauge +) + +// Int64CountHandle is a typed handle for a int count metric. This handle +// is passed at the recording point in order to know which metric to record +// on. +type Int64CountHandle MetricDescriptor + +// Descriptor returns the int64 count handle typecast to a pointer to a +// MetricDescriptor. +func (h *Int64CountHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the int64 count value on the metrics recorder provided. +func (h *Int64CountHandle) Record(recorder MetricsRecorder, incr int64, labels ...string) { + recorder.RecordInt64Count(h, incr, labels...) +} + +// Float64CountHandle is a typed handle for a float count metric. This handle is +// passed at the recording point in order to know which metric to record on. +type Float64CountHandle MetricDescriptor + +// Descriptor returns the float64 count handle typecast to a pointer to a +// MetricDescriptor. +func (h *Float64CountHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the float64 count value on the metrics recorder provided. +func (h *Float64CountHandle) Record(recorder MetricsRecorder, incr float64, labels ...string) { + recorder.RecordFloat64Count(h, incr, labels...) +} + +// Int64HistoHandle is a typed handle for an int histogram metric. This handle +// is passed at the recording point in order to know which metric to record on. +type Int64HistoHandle MetricDescriptor + +// Descriptor returns the int64 histo handle typecast to a pointer to a +// MetricDescriptor. +func (h *Int64HistoHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the int64 histo value on the metrics recorder provided. +func (h *Int64HistoHandle) Record(recorder MetricsRecorder, incr int64, labels ...string) { + recorder.RecordInt64Histo(h, incr, labels...) +} + +// Float64HistoHandle is a typed handle for a float histogram metric. This +// handle is passed at the recording point in order to know which metric to +// record on. +type Float64HistoHandle MetricDescriptor + +// Descriptor returns the float64 histo handle typecast to a pointer to a +// MetricDescriptor. +func (h *Float64HistoHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the float64 histo value on the metrics recorder provided. +func (h *Float64HistoHandle) Record(recorder MetricsRecorder, incr float64, labels ...string) { + recorder.RecordFloat64Histo(h, incr, labels...) +} + +// Int64GaugeHandle is a typed handle for an int gauge metric. This handle is +// passed at the recording point in order to know which metric to record on. +type Int64GaugeHandle MetricDescriptor + +// Descriptor returns the int64 gauge handle typecast to a pointer to a +// MetricDescriptor. +func (h *Int64GaugeHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the int64 histo value on the metrics recorder provided. +func (h *Int64GaugeHandle) Record(recorder MetricsRecorder, incr int64, labels ...string) { + recorder.RecordInt64Gauge(h, incr, labels...) +} + +// registeredMetrics are the registered metric descriptor names. +var registeredMetrics = make(map[string]bool) + +// metricsRegistry contains all of the registered metrics. +// +// This is written to only at init time, and read only after that. +var metricsRegistry = make(map[string]*MetricDescriptor) + +// DescriptorForMetric returns the MetricDescriptor from the global registry. +// +// Returns nil if MetricDescriptor not present. +func DescriptorForMetric(metricName string) *MetricDescriptor { + return metricsRegistry[metricName] +} + +func registerMetric(metricName string, def bool) { + if registeredMetrics[metricName] { + logger.Fatalf("metric %v already registered", metricName) + } + registeredMetrics[metricName] = true + if def { + DefaultMetrics = DefaultMetrics.Add(metricName) + } +} + +// RegisterInt64Count registers the metric description onto the global registry. +// It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterInt64Count(descriptor MetricDescriptor) *Int64CountHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeIntCount + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Int64CountHandle)(descPtr) +} + +// RegisterFloat64Count registers the metric description onto the global +// registry. It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterFloat64Count(descriptor MetricDescriptor) *Float64CountHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeFloatCount + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Float64CountHandle)(descPtr) +} + +// RegisterInt64Histo registers the metric description onto the global registry. +// It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterInt64Histo(descriptor MetricDescriptor) *Int64HistoHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeIntHisto + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Int64HistoHandle)(descPtr) +} + +// RegisterFloat64Histo registers the metric description onto the global +// registry. It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterFloat64Histo(descriptor MetricDescriptor) *Float64HistoHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeFloatHisto + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Float64HistoHandle)(descPtr) +} + +// RegisterInt64Gauge registers the metric description onto the global registry. +// It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterInt64Gauge(descriptor MetricDescriptor) *Int64GaugeHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeIntGauge + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Int64GaugeHandle)(descPtr) +} + +// snapshotMetricsRegistryForTesting snapshots the global data of the metrics +// registry. Returns a cleanup function that sets the metrics registry to its +// original state. +func snapshotMetricsRegistryForTesting() func() { + oldDefaultMetrics := DefaultMetrics + oldRegisteredMetrics := registeredMetrics + oldMetricsRegistry := metricsRegistry + + registeredMetrics = make(map[string]bool) + metricsRegistry = make(map[string]*MetricDescriptor) + maps.Copy(registeredMetrics, registeredMetrics) + maps.Copy(metricsRegistry, metricsRegistry) + + return func() { + DefaultMetrics = oldDefaultMetrics + registeredMetrics = oldRegisteredMetrics + metricsRegistry = oldMetricsRegistry + } +} diff --git a/vendor/google.golang.org/grpc/experimental/stats/metrics.go b/vendor/google.golang.org/grpc/experimental/stats/metrics.go new file mode 100644 index 0000000000..ee1423605a --- /dev/null +++ b/vendor/google.golang.org/grpc/experimental/stats/metrics.go @@ -0,0 +1,54 @@ +/* + * + * Copyright 2024 gRPC 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 stats contains experimental metrics/stats API's. +package stats + +import "google.golang.org/grpc/stats" + +// MetricsRecorder records on metrics derived from metric registry. +type MetricsRecorder interface { + // RecordInt64Count records the measurement alongside labels on the int + // count associated with the provided handle. + RecordInt64Count(handle *Int64CountHandle, incr int64, labels ...string) + // RecordFloat64Count records the measurement alongside labels on the float + // count associated with the provided handle. + RecordFloat64Count(handle *Float64CountHandle, incr float64, labels ...string) + // RecordInt64Histo records the measurement alongside labels on the int + // histo associated with the provided handle. + RecordInt64Histo(handle *Int64HistoHandle, incr int64, labels ...string) + // RecordFloat64Histo records the measurement alongside labels on the float + // histo associated with the provided handle. + RecordFloat64Histo(handle *Float64HistoHandle, incr float64, labels ...string) + // RecordInt64Gauge records the measurement alongside labels on the int + // gauge associated with the provided handle. + RecordInt64Gauge(handle *Int64GaugeHandle, incr int64, labels ...string) +} + +// Metrics is an experimental legacy alias of the now-stable stats.MetricSet. +// Metrics will be deleted in a future release. +type Metrics = stats.MetricSet + +// Metric was replaced by direct usage of strings. +type Metric = string + +// NewMetrics is an experimental legacy alias of the now-stable +// stats.NewMetricSet. NewMetrics will be deleted in a future release. +func NewMetrics(metrics ...Metric) *Metrics { + return stats.NewMetricSet(metrics...) +} diff --git a/vendor/google.golang.org/grpc/grpclog/component.go b/vendor/google.golang.org/grpc/grpclog/component.go index ac73c9ced2..f1ae080dcb 100644 --- a/vendor/google.golang.org/grpc/grpclog/component.go +++ b/vendor/google.golang.org/grpc/grpclog/component.go @@ -20,8 +20,6 @@ package grpclog import ( "fmt" - - "google.golang.org/grpc/internal/grpclog" ) // componentData records the settings for a component. @@ -33,22 +31,22 @@ var cache = map[string]*componentData{} func (c *componentData) InfoDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.InfoDepth(depth+1, args...) + InfoDepth(depth+1, args...) } func (c *componentData) WarningDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.WarningDepth(depth+1, args...) + WarningDepth(depth+1, args...) } func (c *componentData) ErrorDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.ErrorDepth(depth+1, args...) + ErrorDepth(depth+1, args...) } func (c *componentData) FatalDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.FatalDepth(depth+1, args...) + FatalDepth(depth+1, args...) } func (c *componentData) Info(args ...any) { diff --git a/vendor/google.golang.org/grpc/grpclog/grpclog.go b/vendor/google.golang.org/grpc/grpclog/grpclog.go index 16928c9cb9..db320105e6 100644 --- a/vendor/google.golang.org/grpc/grpclog/grpclog.go +++ b/vendor/google.golang.org/grpc/grpclog/grpclog.go @@ -18,18 +18,15 @@ // Package grpclog defines logging for grpc. // -// All logs in transport and grpclb packages only go to verbose level 2. -// All logs in other packages in grpc are logged in spite of the verbosity level. -// -// In the default logger, -// severity level can be set by environment variable GRPC_GO_LOG_SEVERITY_LEVEL, -// verbosity level can be set by GRPC_GO_LOG_VERBOSITY_LEVEL. -package grpclog // import "google.golang.org/grpc/grpclog" +// In the default logger, severity level can be set by environment variable +// GRPC_GO_LOG_SEVERITY_LEVEL, verbosity level can be set by +// GRPC_GO_LOG_VERBOSITY_LEVEL. +package grpclog import ( "os" - "google.golang.org/grpc/internal/grpclog" + "google.golang.org/grpc/grpclog/internal" ) func init() { @@ -38,58 +35,58 @@ func init() { // V reports whether verbosity level l is at least the requested verbose level. func V(l int) bool { - return grpclog.Logger.V(l) + return internal.LoggerV2Impl.V(l) } // Info logs to the INFO log. func Info(args ...any) { - grpclog.Logger.Info(args...) + internal.LoggerV2Impl.Info(args...) } // Infof logs to the INFO log. Arguments are handled in the manner of fmt.Printf. func Infof(format string, args ...any) { - grpclog.Logger.Infof(format, args...) + internal.LoggerV2Impl.Infof(format, args...) } // Infoln logs to the INFO log. Arguments are handled in the manner of fmt.Println. func Infoln(args ...any) { - grpclog.Logger.Infoln(args...) + internal.LoggerV2Impl.Infoln(args...) } // Warning logs to the WARNING log. func Warning(args ...any) { - grpclog.Logger.Warning(args...) + internal.LoggerV2Impl.Warning(args...) } // Warningf logs to the WARNING log. Arguments are handled in the manner of fmt.Printf. func Warningf(format string, args ...any) { - grpclog.Logger.Warningf(format, args...) + internal.LoggerV2Impl.Warningf(format, args...) } // Warningln logs to the WARNING log. Arguments are handled in the manner of fmt.Println. func Warningln(args ...any) { - grpclog.Logger.Warningln(args...) + internal.LoggerV2Impl.Warningln(args...) } // Error logs to the ERROR log. func Error(args ...any) { - grpclog.Logger.Error(args...) + internal.LoggerV2Impl.Error(args...) } // Errorf logs to the ERROR log. Arguments are handled in the manner of fmt.Printf. func Errorf(format string, args ...any) { - grpclog.Logger.Errorf(format, args...) + internal.LoggerV2Impl.Errorf(format, args...) } // Errorln logs to the ERROR log. Arguments are handled in the manner of fmt.Println. func Errorln(args ...any) { - grpclog.Logger.Errorln(args...) + internal.LoggerV2Impl.Errorln(args...) } // Fatal logs to the FATAL log. Arguments are handled in the manner of fmt.Print. // It calls os.Exit() with exit code 1. func Fatal(args ...any) { - grpclog.Logger.Fatal(args...) + internal.LoggerV2Impl.Fatal(args...) // Make sure fatal logs will exit. os.Exit(1) } @@ -97,15 +94,15 @@ func Fatal(args ...any) { // Fatalf logs to the FATAL log. Arguments are handled in the manner of fmt.Printf. // It calls os.Exit() with exit code 1. func Fatalf(format string, args ...any) { - grpclog.Logger.Fatalf(format, args...) + internal.LoggerV2Impl.Fatalf(format, args...) // Make sure fatal logs will exit. os.Exit(1) } // Fatalln logs to the FATAL log. Arguments are handled in the manner of fmt.Println. -// It calle os.Exit()) with exit code 1. +// It calls os.Exit() with exit code 1. func Fatalln(args ...any) { - grpclog.Logger.Fatalln(args...) + internal.LoggerV2Impl.Fatalln(args...) // Make sure fatal logs will exit. os.Exit(1) } @@ -114,19 +111,76 @@ func Fatalln(args ...any) { // // Deprecated: use Info. func Print(args ...any) { - grpclog.Logger.Info(args...) + internal.LoggerV2Impl.Info(args...) } // Printf prints to the logger. Arguments are handled in the manner of fmt.Printf. // // Deprecated: use Infof. func Printf(format string, args ...any) { - grpclog.Logger.Infof(format, args...) + internal.LoggerV2Impl.Infof(format, args...) } // Println prints to the logger. Arguments are handled in the manner of fmt.Println. // // Deprecated: use Infoln. func Println(args ...any) { - grpclog.Logger.Infoln(args...) + internal.LoggerV2Impl.Infoln(args...) +} + +// InfoDepth logs to the INFO log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func InfoDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.InfoDepth(depth, args...) + } else { + internal.LoggerV2Impl.Infoln(args...) + } +} + +// WarningDepth logs to the WARNING log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func WarningDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.WarningDepth(depth, args...) + } else { + internal.LoggerV2Impl.Warningln(args...) + } +} + +// ErrorDepth logs to the ERROR log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func ErrorDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.ErrorDepth(depth, args...) + } else { + internal.LoggerV2Impl.Errorln(args...) + } +} + +// FatalDepth logs to the FATAL log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func FatalDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.FatalDepth(depth, args...) + } else { + internal.LoggerV2Impl.Fatalln(args...) + } + os.Exit(1) } diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go b/vendor/google.golang.org/grpc/grpclog/internal/grpclog.go similarity index 63% rename from vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go rename to vendor/google.golang.org/grpc/grpclog/internal/grpclog.go index 6635f7bca9..59c03bc14c 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go +++ b/vendor/google.golang.org/grpc/grpclog/internal/grpclog.go @@ -1,6 +1,6 @@ /* * - * Copyright 2022 gRPC authors. + * Copyright 2024 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +16,11 @@ * */ -package grpcsync +// Package internal contains functionality internal to the grpclog package. +package internal -import ( - "sync" -) +// LoggerV2Impl is the logger used for the non-depth log functions. +var LoggerV2Impl LoggerV2 -// OnceFunc returns a function wrapping f which ensures f is only executed -// once even if the returned function is executed multiple times. -func OnceFunc(f func()) func() { - var once sync.Once - return func() { - once.Do(f) - } -} +// DepthLoggerV2Impl is the logger used for the depth log functions. +var DepthLoggerV2Impl DepthLoggerV2 diff --git a/vendor/google.golang.org/grpc/grpclog/internal/logger.go b/vendor/google.golang.org/grpc/grpclog/internal/logger.go new file mode 100644 index 0000000000..e524fdd40b --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/internal/logger.go @@ -0,0 +1,87 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package internal + +// Logger mimics golang's standard Logger as an interface. +// +// Deprecated: use LoggerV2. +type Logger interface { + Fatal(args ...any) + Fatalf(format string, args ...any) + Fatalln(args ...any) + Print(args ...any) + Printf(format string, args ...any) + Println(args ...any) +} + +// LoggerWrapper wraps Logger into a LoggerV2. +type LoggerWrapper struct { + Logger +} + +// Info logs to INFO log. Arguments are handled in the manner of fmt.Print. +func (l *LoggerWrapper) Info(args ...any) { + l.Logger.Print(args...) +} + +// Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. +func (l *LoggerWrapper) Infoln(args ...any) { + l.Logger.Println(args...) +} + +// Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. +func (l *LoggerWrapper) Infof(format string, args ...any) { + l.Logger.Printf(format, args...) +} + +// Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. +func (l *LoggerWrapper) Warning(args ...any) { + l.Logger.Print(args...) +} + +// Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. +func (l *LoggerWrapper) Warningln(args ...any) { + l.Logger.Println(args...) +} + +// Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. +func (l *LoggerWrapper) Warningf(format string, args ...any) { + l.Logger.Printf(format, args...) +} + +// Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. +func (l *LoggerWrapper) Error(args ...any) { + l.Logger.Print(args...) +} + +// Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. +func (l *LoggerWrapper) Errorln(args ...any) { + l.Logger.Println(args...) +} + +// Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. +func (l *LoggerWrapper) Errorf(format string, args ...any) { + l.Logger.Printf(format, args...) +} + +// V reports whether verbosity level l is at least the requested verbose level. +func (*LoggerWrapper) V(int) bool { + // Returns true for all verbose level. + return true +} diff --git a/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go new file mode 100644 index 0000000000..ed90060c3c --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go @@ -0,0 +1,267 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package internal + +import ( + "encoding/json" + "fmt" + "io" + "log" + "os" +) + +// LoggerV2 does underlying logging work for grpclog. +type LoggerV2 interface { + // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. + Info(args ...any) + // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. + Infoln(args ...any) + // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. + Infof(format string, args ...any) + // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. + Warning(args ...any) + // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. + Warningln(args ...any) + // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. + Warningf(format string, args ...any) + // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. + Error(args ...any) + // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + Errorln(args ...any) + // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + Errorf(format string, args ...any) + // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatal(args ...any) + // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalln(args ...any) + // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalf(format string, args ...any) + // V reports whether verbosity level l is at least the requested verbose level. + V(l int) bool +} + +// DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements +// DepthLoggerV2, the below functions will be called with the appropriate stack +// depth set for trivial functions the logger may ignore. +// +// # Experimental +// +// Notice: This type is EXPERIMENTAL and may be changed or removed in a +// later release. +type DepthLoggerV2 interface { + LoggerV2 + // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. + InfoDepth(depth int, args ...any) + // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. + WarningDepth(depth int, args ...any) + // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. + ErrorDepth(depth int, args ...any) + // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. + FatalDepth(depth int, args ...any) +} + +const ( + // infoLog indicates Info severity. + infoLog int = iota + // warningLog indicates Warning severity. + warningLog + // errorLog indicates Error severity. + errorLog + // fatalLog indicates Fatal severity. + fatalLog +) + +// severityName contains the string representation of each severity. +var severityName = []string{ + infoLog: "INFO", + warningLog: "WARNING", + errorLog: "ERROR", + fatalLog: "FATAL", +} + +// sprintf is fmt.Sprintf. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprintf = fmt.Sprintf + +// sprint is fmt.Sprint. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprint = fmt.Sprint + +// sprintln is fmt.Sprintln. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprintln = fmt.Sprintln + +// exit is os.Exit. +// This var exists to make it possible to test functions calling os.Exit. +var exit = os.Exit + +// loggerT is the default logger used by grpclog. +type loggerT struct { + m []*log.Logger + v int + jsonFormat bool +} + +func (g *loggerT) output(severity int, s string) { + sevStr := severityName[severity] + if !g.jsonFormat { + g.m[severity].Output(2, sevStr+": "+s) + return + } + // TODO: we can also include the logging component, but that needs more + // (API) changes. + b, _ := json.Marshal(map[string]string{ + "severity": sevStr, + "message": s, + }) + g.m[severity].Output(2, string(b)) +} + +func (g *loggerT) printf(severity int, format string, args ...any) { + // Note the discard check is duplicated in each print func, rather than in + // output, to avoid the expensive Sprint calls. + // De-duplicating this by moving to output would be a significant performance regression! + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprintf(format, args...)) +} + +func (g *loggerT) print(severity int, v ...any) { + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprint(v...)) +} + +func (g *loggerT) println(severity int, v ...any) { + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprintln(v...)) +} + +func (g *loggerT) Info(args ...any) { + g.print(infoLog, args...) +} + +func (g *loggerT) Infoln(args ...any) { + g.println(infoLog, args...) +} + +func (g *loggerT) Infof(format string, args ...any) { + g.printf(infoLog, format, args...) +} + +func (g *loggerT) Warning(args ...any) { + g.print(warningLog, args...) +} + +func (g *loggerT) Warningln(args ...any) { + g.println(warningLog, args...) +} + +func (g *loggerT) Warningf(format string, args ...any) { + g.printf(warningLog, format, args...) +} + +func (g *loggerT) Error(args ...any) { + g.print(errorLog, args...) +} + +func (g *loggerT) Errorln(args ...any) { + g.println(errorLog, args...) +} + +func (g *loggerT) Errorf(format string, args ...any) { + g.printf(errorLog, format, args...) +} + +func (g *loggerT) Fatal(args ...any) { + g.print(fatalLog, args...) + exit(1) +} + +func (g *loggerT) Fatalln(args ...any) { + g.println(fatalLog, args...) + exit(1) +} + +func (g *loggerT) Fatalf(format string, args ...any) { + g.printf(fatalLog, format, args...) + exit(1) +} + +func (g *loggerT) V(l int) bool { + return l <= g.v +} + +// LoggerV2Config configures the LoggerV2 implementation. +type LoggerV2Config struct { + // Verbosity sets the verbosity level of the logger. + Verbosity int + // FormatJSON controls whether the logger should output logs in JSON format. + FormatJSON bool +} + +// combineLoggers returns a combined logger for both higher & lower severity logs, +// or only one if the other is io.Discard. +// +// This uses io.Discard instead of io.MultiWriter when all loggers +// are set to io.Discard. Both this package and the standard log package have +// significant optimizations for io.Discard, which io.MultiWriter lacks (as of +// this writing). +func combineLoggers(lower, higher io.Writer) io.Writer { + if lower == io.Discard { + return higher + } + if higher == io.Discard { + return lower + } + return io.MultiWriter(lower, higher) +} + +// NewLoggerV2 creates a new LoggerV2 instance with the provided configuration. +// The infoW, warningW, and errorW writers are used to write log messages of +// different severity levels. +func NewLoggerV2(infoW, warningW, errorW io.Writer, c LoggerV2Config) LoggerV2 { + flag := log.LstdFlags + if c.FormatJSON { + flag = 0 + } + + warningW = combineLoggers(infoW, warningW) + errorW = combineLoggers(errorW, warningW) + + fatalW := errorW + + m := []*log.Logger{ + log.New(infoW, "", flag), + log.New(warningW, "", flag), + log.New(errorW, "", flag), + log.New(fatalW, "", flag), + } + return &loggerT{m: m, v: c.Verbosity, jsonFormat: c.FormatJSON} +} diff --git a/vendor/google.golang.org/grpc/grpclog/logger.go b/vendor/google.golang.org/grpc/grpclog/logger.go index b1674d8267..4b20358570 100644 --- a/vendor/google.golang.org/grpc/grpclog/logger.go +++ b/vendor/google.golang.org/grpc/grpclog/logger.go @@ -18,70 +18,17 @@ package grpclog -import "google.golang.org/grpc/internal/grpclog" +import "google.golang.org/grpc/grpclog/internal" // Logger mimics golang's standard Logger as an interface. // // Deprecated: use LoggerV2. -type Logger interface { - Fatal(args ...any) - Fatalf(format string, args ...any) - Fatalln(args ...any) - Print(args ...any) - Printf(format string, args ...any) - Println(args ...any) -} +type Logger internal.Logger // SetLogger sets the logger that is used in grpc. Call only from // init() functions. // // Deprecated: use SetLoggerV2. func SetLogger(l Logger) { - grpclog.Logger = &loggerWrapper{Logger: l} -} - -// loggerWrapper wraps Logger into a LoggerV2. -type loggerWrapper struct { - Logger -} - -func (g *loggerWrapper) Info(args ...any) { - g.Logger.Print(args...) -} - -func (g *loggerWrapper) Infoln(args ...any) { - g.Logger.Println(args...) -} - -func (g *loggerWrapper) Infof(format string, args ...any) { - g.Logger.Printf(format, args...) -} - -func (g *loggerWrapper) Warning(args ...any) { - g.Logger.Print(args...) -} - -func (g *loggerWrapper) Warningln(args ...any) { - g.Logger.Println(args...) -} - -func (g *loggerWrapper) Warningf(format string, args ...any) { - g.Logger.Printf(format, args...) -} - -func (g *loggerWrapper) Error(args ...any) { - g.Logger.Print(args...) -} - -func (g *loggerWrapper) Errorln(args ...any) { - g.Logger.Println(args...) -} - -func (g *loggerWrapper) Errorf(format string, args ...any) { - g.Logger.Printf(format, args...) -} - -func (g *loggerWrapper) V(l int) bool { - // Returns true for all verbose level. - return true + internal.LoggerV2Impl = &internal.LoggerWrapper{Logger: l} } diff --git a/vendor/google.golang.org/grpc/grpclog/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/loggerv2.go index ecfd36d713..892dc13d16 100644 --- a/vendor/google.golang.org/grpc/grpclog/loggerv2.go +++ b/vendor/google.golang.org/grpc/grpclog/loggerv2.go @@ -19,52 +19,16 @@ package grpclog import ( - "encoding/json" - "fmt" "io" - "log" "os" "strconv" "strings" - "google.golang.org/grpc/internal/grpclog" + "google.golang.org/grpc/grpclog/internal" ) // LoggerV2 does underlying logging work for grpclog. -type LoggerV2 interface { - // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. - Info(args ...any) - // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. - Infoln(args ...any) - // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. - Infof(format string, args ...any) - // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. - Warning(args ...any) - // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. - Warningln(args ...any) - // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. - Warningf(format string, args ...any) - // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. - Error(args ...any) - // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - Errorln(args ...any) - // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - Errorf(format string, args ...any) - // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatal(args ...any) - // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalln(args ...any) - // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalf(format string, args ...any) - // V reports whether verbosity level l is at least the requested verbose level. - V(l int) bool -} +type LoggerV2 internal.LoggerV2 // SetLoggerV2 sets logger that is used in grpc to a V2 logger. // Not mutex-protected, should be called before any gRPC functions. @@ -72,34 +36,8 @@ func SetLoggerV2(l LoggerV2) { if _, ok := l.(*componentData); ok { panic("cannot use component logger as grpclog logger") } - grpclog.Logger = l - grpclog.DepthLogger, _ = l.(grpclog.DepthLoggerV2) -} - -const ( - // infoLog indicates Info severity. - infoLog int = iota - // warningLog indicates Warning severity. - warningLog - // errorLog indicates Error severity. - errorLog - // fatalLog indicates Fatal severity. - fatalLog -) - -// severityName contains the string representation of each severity. -var severityName = []string{ - infoLog: "INFO", - warningLog: "WARNING", - errorLog: "ERROR", - fatalLog: "FATAL", -} - -// loggerT is the default logger used by grpclog. -type loggerT struct { - m []*log.Logger - v int - jsonFormat bool + internal.LoggerV2Impl = l + internal.DepthLoggerV2Impl, _ = l.(internal.DepthLoggerV2) } // NewLoggerV2 creates a loggerV2 with the provided writers. @@ -108,32 +46,13 @@ type loggerT struct { // Warning logs will be written to warningW and infoW. // Info logs will be written to infoW. func NewLoggerV2(infoW, warningW, errorW io.Writer) LoggerV2 { - return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{}) + return internal.NewLoggerV2(infoW, warningW, errorW, internal.LoggerV2Config{}) } // NewLoggerV2WithVerbosity creates a loggerV2 with the provided writers and // verbosity level. func NewLoggerV2WithVerbosity(infoW, warningW, errorW io.Writer, v int) LoggerV2 { - return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{verbose: v}) -} - -type loggerV2Config struct { - verbose int - jsonFormat bool -} - -func newLoggerV2WithConfig(infoW, warningW, errorW io.Writer, c loggerV2Config) LoggerV2 { - var m []*log.Logger - flag := log.LstdFlags - if c.jsonFormat { - flag = 0 - } - m = append(m, log.New(infoW, "", flag)) - m = append(m, log.New(io.MultiWriter(infoW, warningW), "", flag)) - ew := io.MultiWriter(infoW, warningW, errorW) // ew will be used for error and fatal. - m = append(m, log.New(ew, "", flag)) - m = append(m, log.New(ew, "", flag)) - return &loggerT{m: m, v: c.verbose, jsonFormat: c.jsonFormat} + return internal.NewLoggerV2(infoW, warningW, errorW, internal.LoggerV2Config{Verbosity: v}) } // newLoggerV2 creates a loggerV2 to be used as default logger. @@ -161,80 +80,10 @@ func newLoggerV2() LoggerV2 { jsonFormat := strings.EqualFold(os.Getenv("GRPC_GO_LOG_FORMATTER"), "json") - return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{ - verbose: v, - jsonFormat: jsonFormat, - }) -} - -func (g *loggerT) output(severity int, s string) { - sevStr := severityName[severity] - if !g.jsonFormat { - g.m[severity].Output(2, fmt.Sprintf("%v: %v", sevStr, s)) - return - } - // TODO: we can also include the logging component, but that needs more - // (API) changes. - b, _ := json.Marshal(map[string]string{ - "severity": sevStr, - "message": s, + return internal.NewLoggerV2(infoW, warningW, errorW, internal.LoggerV2Config{ + Verbosity: v, + FormatJSON: jsonFormat, }) - g.m[severity].Output(2, string(b)) -} - -func (g *loggerT) Info(args ...any) { - g.output(infoLog, fmt.Sprint(args...)) -} - -func (g *loggerT) Infoln(args ...any) { - g.output(infoLog, fmt.Sprintln(args...)) -} - -func (g *loggerT) Infof(format string, args ...any) { - g.output(infoLog, fmt.Sprintf(format, args...)) -} - -func (g *loggerT) Warning(args ...any) { - g.output(warningLog, fmt.Sprint(args...)) -} - -func (g *loggerT) Warningln(args ...any) { - g.output(warningLog, fmt.Sprintln(args...)) -} - -func (g *loggerT) Warningf(format string, args ...any) { - g.output(warningLog, fmt.Sprintf(format, args...)) -} - -func (g *loggerT) Error(args ...any) { - g.output(errorLog, fmt.Sprint(args...)) -} - -func (g *loggerT) Errorln(args ...any) { - g.output(errorLog, fmt.Sprintln(args...)) -} - -func (g *loggerT) Errorf(format string, args ...any) { - g.output(errorLog, fmt.Sprintf(format, args...)) -} - -func (g *loggerT) Fatal(args ...any) { - g.output(fatalLog, fmt.Sprint(args...)) - os.Exit(1) -} - -func (g *loggerT) Fatalln(args ...any) { - g.output(fatalLog, fmt.Sprintln(args...)) - os.Exit(1) -} - -func (g *loggerT) Fatalf(format string, args ...any) { - g.output(fatalLog, fmt.Sprintf(format, args...)) - os.Exit(1) -} - -func (g *loggerT) V(l int) bool { - return l <= g.v } // DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements @@ -245,14 +94,4 @@ func (g *loggerT) V(l int) bool { // // Notice: This type is EXPERIMENTAL and may be changed or removed in a // later release. -type DepthLoggerV2 interface { - LoggerV2 - // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. - InfoDepth(depth int, args ...any) - // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. - WarningDepth(depth int, args ...any) - // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. - ErrorDepth(depth int, args ...any) - // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. - FatalDepth(depth int, args ...any) -} +type DepthLoggerV2 internal.DepthLoggerV2 diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go index 5bf880d419..22d263fb94 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/health/v1/health.proto package grpc_health_v1 @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -90,20 +91,17 @@ func (HealthCheckResponse_ServingStatus) EnumDescriptor() ([]byte, []int) { } type HealthCheckRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` unknownFields protoimpl.UnknownFields - - Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` + sizeCache protoimpl.SizeCache } func (x *HealthCheckRequest) Reset() { *x = HealthCheckRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_health_v1_health_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_health_v1_health_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HealthCheckRequest) String() string { @@ -114,7 +112,7 @@ func (*HealthCheckRequest) ProtoMessage() {} func (x *HealthCheckRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_health_v1_health_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -137,20 +135,17 @@ func (x *HealthCheckRequest) GetService() string { } type HealthCheckResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"` unknownFields protoimpl.UnknownFields - - Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"` + sizeCache protoimpl.SizeCache } func (x *HealthCheckResponse) Reset() { *x = HealthCheckResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_health_v1_health_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_health_v1_health_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HealthCheckResponse) String() string { @@ -161,7 +156,7 @@ func (*HealthCheckResponse) ProtoMessage() {} func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_health_v1_health_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -183,76 +178,150 @@ func (x *HealthCheckResponse) GetStatus() HealthCheckResponse_ServingStatus { return HealthCheckResponse_UNKNOWN } -var File_grpc_health_v1_health_proto protoreflect.FileDescriptor +type HealthListRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HealthListRequest) Reset() { + *x = HealthListRequest{} + mi := &file_grpc_health_v1_health_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HealthListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HealthListRequest) ProtoMessage() {} + +func (x *HealthListRequest) ProtoReflect() protoreflect.Message { + mi := &file_grpc_health_v1_health_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HealthListRequest.ProtoReflect.Descriptor instead. +func (*HealthListRequest) Descriptor() ([]byte, []int) { + return file_grpc_health_v1_health_proto_rawDescGZIP(), []int{2} +} -var file_grpc_health_v1_health_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2f, 0x76, 0x31, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x22, 0x2e, 0x0a, - 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xb1, 0x01, - 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x4f, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, - 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x03, 0x32, 0xae, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x50, 0x0a, 0x05, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, - 0x0a, 0x05, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x30, 0x01, 0x42, 0x61, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, - 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x5f, 0x76, 0x31, 0xaa, 0x02, 0x0e, 0x47, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x2e, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +type HealthListResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // statuses contains all the services and their respective status. + Statuses map[string]*HealthCheckResponse `protobuf:"bytes,1,rep,name=statuses,proto3" json:"statuses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } +func (x *HealthListResponse) Reset() { + *x = HealthListResponse{} + mi := &file_grpc_health_v1_health_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HealthListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HealthListResponse) ProtoMessage() {} + +func (x *HealthListResponse) ProtoReflect() protoreflect.Message { + mi := &file_grpc_health_v1_health_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HealthListResponse.ProtoReflect.Descriptor instead. +func (*HealthListResponse) Descriptor() ([]byte, []int) { + return file_grpc_health_v1_health_proto_rawDescGZIP(), []int{3} +} + +func (x *HealthListResponse) GetStatuses() map[string]*HealthCheckResponse { + if x != nil { + return x.Statuses + } + return nil +} + +var File_grpc_health_v1_health_proto protoreflect.FileDescriptor + +const file_grpc_health_v1_health_proto_rawDesc = "" + + "\n" + + "\x1bgrpc/health/v1/health.proto\x12\x0egrpc.health.v1\".\n" + + "\x12HealthCheckRequest\x12\x18\n" + + "\aservice\x18\x01 \x01(\tR\aservice\"\xb1\x01\n" + + "\x13HealthCheckResponse\x12I\n" + + "\x06status\x18\x01 \x01(\x0e21.grpc.health.v1.HealthCheckResponse.ServingStatusR\x06status\"O\n" + + "\rServingStatus\x12\v\n" + + "\aUNKNOWN\x10\x00\x12\v\n" + + "\aSERVING\x10\x01\x12\x0f\n" + + "\vNOT_SERVING\x10\x02\x12\x13\n" + + "\x0fSERVICE_UNKNOWN\x10\x03\"\x13\n" + + "\x11HealthListRequest\"\xc4\x01\n" + + "\x12HealthListResponse\x12L\n" + + "\bstatuses\x18\x01 \x03(\v20.grpc.health.v1.HealthListResponse.StatusesEntryR\bstatuses\x1a`\n" + + "\rStatusesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x129\n" + + "\x05value\x18\x02 \x01(\v2#.grpc.health.v1.HealthCheckResponseR\x05value:\x028\x012\xfd\x01\n" + + "\x06Health\x12P\n" + + "\x05Check\x12\".grpc.health.v1.HealthCheckRequest\x1a#.grpc.health.v1.HealthCheckResponse\x12M\n" + + "\x04List\x12!.grpc.health.v1.HealthListRequest\x1a\".grpc.health.v1.HealthListResponse\x12R\n" + + "\x05Watch\x12\".grpc.health.v1.HealthCheckRequest\x1a#.grpc.health.v1.HealthCheckResponse0\x01Bp\n" + + "\x11io.grpc.health.v1B\vHealthProtoP\x01Z,google.golang.org/grpc/health/grpc_health_v1\xa2\x02\fGrpcHealthV1\xaa\x02\x0eGrpc.Health.V1b\x06proto3" + var ( file_grpc_health_v1_health_proto_rawDescOnce sync.Once - file_grpc_health_v1_health_proto_rawDescData = file_grpc_health_v1_health_proto_rawDesc + file_grpc_health_v1_health_proto_rawDescData []byte ) func file_grpc_health_v1_health_proto_rawDescGZIP() []byte { file_grpc_health_v1_health_proto_rawDescOnce.Do(func() { - file_grpc_health_v1_health_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_health_v1_health_proto_rawDescData) + file_grpc_health_v1_health_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_health_v1_health_proto_rawDesc), len(file_grpc_health_v1_health_proto_rawDesc))) }) return file_grpc_health_v1_health_proto_rawDescData } var file_grpc_health_v1_health_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_grpc_health_v1_health_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_grpc_health_v1_health_proto_goTypes = []interface{}{ +var file_grpc_health_v1_health_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_grpc_health_v1_health_proto_goTypes = []any{ (HealthCheckResponse_ServingStatus)(0), // 0: grpc.health.v1.HealthCheckResponse.ServingStatus (*HealthCheckRequest)(nil), // 1: grpc.health.v1.HealthCheckRequest (*HealthCheckResponse)(nil), // 2: grpc.health.v1.HealthCheckResponse + (*HealthListRequest)(nil), // 3: grpc.health.v1.HealthListRequest + (*HealthListResponse)(nil), // 4: grpc.health.v1.HealthListResponse + nil, // 5: grpc.health.v1.HealthListResponse.StatusesEntry } var file_grpc_health_v1_health_proto_depIdxs = []int32{ 0, // 0: grpc.health.v1.HealthCheckResponse.status:type_name -> grpc.health.v1.HealthCheckResponse.ServingStatus - 1, // 1: grpc.health.v1.Health.Check:input_type -> grpc.health.v1.HealthCheckRequest - 1, // 2: grpc.health.v1.Health.Watch:input_type -> grpc.health.v1.HealthCheckRequest - 2, // 3: grpc.health.v1.Health.Check:output_type -> grpc.health.v1.HealthCheckResponse - 2, // 4: grpc.health.v1.Health.Watch:output_type -> grpc.health.v1.HealthCheckResponse - 3, // [3:5] is the sub-list for method output_type - 1, // [1:3] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 5, // 1: grpc.health.v1.HealthListResponse.statuses:type_name -> grpc.health.v1.HealthListResponse.StatusesEntry + 2, // 2: grpc.health.v1.HealthListResponse.StatusesEntry.value:type_name -> grpc.health.v1.HealthCheckResponse + 1, // 3: grpc.health.v1.Health.Check:input_type -> grpc.health.v1.HealthCheckRequest + 3, // 4: grpc.health.v1.Health.List:input_type -> grpc.health.v1.HealthListRequest + 1, // 5: grpc.health.v1.Health.Watch:input_type -> grpc.health.v1.HealthCheckRequest + 2, // 6: grpc.health.v1.Health.Check:output_type -> grpc.health.v1.HealthCheckResponse + 4, // 7: grpc.health.v1.Health.List:output_type -> grpc.health.v1.HealthListResponse + 2, // 8: grpc.health.v1.Health.Watch:output_type -> grpc.health.v1.HealthCheckResponse + 6, // [6:9] is the sub-list for method output_type + 3, // [3:6] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_grpc_health_v1_health_proto_init() } @@ -260,39 +329,13 @@ func file_grpc_health_v1_health_proto_init() { if File_grpc_health_v1_health_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_health_v1_health_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_health_v1_health_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckResponse); 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_grpc_health_v1_health_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_health_v1_health_proto_rawDesc), len(file_grpc_health_v1_health_proto_rawDesc)), NumEnums: 1, - NumMessages: 2, + NumMessages: 5, NumExtensions: 0, NumServices: 1, }, @@ -302,7 +345,6 @@ func file_grpc_health_v1_health_proto_init() { MessageInfos: file_grpc_health_v1_health_proto_msgTypes, }.Build() File_grpc_health_v1_health_proto = out.File - file_grpc_health_v1_health_proto_rawDesc = nil file_grpc_health_v1_health_proto_goTypes = nil file_grpc_health_v1_health_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go index 4c46c098dc..f2c01f296a 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // source: grpc/health/v1/health.proto package grpc_health_v1 @@ -32,17 +32,22 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Health_Check_FullMethodName = "/grpc.health.v1.Health/Check" + Health_List_FullMethodName = "/grpc.health.v1.Health/List" Health_Watch_FullMethodName = "/grpc.health.v1.Health/Watch" ) // HealthClient is the client API for Health service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// Health is gRPC's mechanism for checking whether a server is able to handle +// RPCs. Its semantics are documented in +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md. type HealthClient interface { // Check gets the health of the specified service. If the requested service // is unknown, the call will fail with status NOT_FOUND. If the caller does @@ -51,9 +56,19 @@ type HealthClient interface { // // Clients should set a deadline when calling Check, and can declare the // server unhealthy if they do not receive a timely response. - // - // Check implementations should be idempotent and side effect free. Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) + // List provides a non-atomic snapshot of the health of all the available + // services. + // + // The server may respond with a RESOURCE_EXHAUSTED error if too many services + // exist. + // + // Clients should set a deadline when calling List, and can declare the server + // unhealthy if they do not receive a timely response. + // + // Clients should keep in mind that the list of health services exposed by an + // application can change over the lifetime of the process. + List(ctx context.Context, in *HealthListRequest, opts ...grpc.CallOption) (*HealthListResponse, error) // Performs a watch for the serving status of the requested service. // The server will immediately send back a message indicating the current // serving status. It will then subsequently send a new message whenever @@ -69,7 +84,7 @@ type HealthClient interface { // should assume this method is not supported and should not retry the // call. If the call terminates with any other status (including OK), // clients should retry the call with appropriate exponential backoff. - Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error) + Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[HealthCheckResponse], error) } type healthClient struct { @@ -81,20 +96,32 @@ func NewHealthClient(cc grpc.ClientConnInterface) HealthClient { } func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HealthCheckResponse) - err := c.cc.Invoke(ctx, Health_Check_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Health_Check_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *healthClient) List(ctx context.Context, in *HealthListRequest, opts ...grpc.CallOption) (*HealthListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(HealthListResponse) + err := c.cc.Invoke(ctx, Health_List_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error) { - stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], Health_Watch_FullMethodName, opts...) +func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[HealthCheckResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], Health_Watch_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &healthWatchClient{stream} + x := &grpc.GenericClientStream[HealthCheckRequest, HealthCheckResponse]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -104,26 +131,16 @@ func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts . return x, nil } -type Health_WatchClient interface { - Recv() (*HealthCheckResponse, error) - grpc.ClientStream -} - -type healthWatchClient struct { - grpc.ClientStream -} - -func (x *healthWatchClient) Recv() (*HealthCheckResponse, error) { - m := new(HealthCheckResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Health_WatchClient = grpc.ServerStreamingClient[HealthCheckResponse] // HealthServer is the server API for Health service. // All implementations should embed UnimplementedHealthServer -// for forward compatibility +// for forward compatibility. +// +// Health is gRPC's mechanism for checking whether a server is able to handle +// RPCs. Its semantics are documented in +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md. type HealthServer interface { // Check gets the health of the specified service. If the requested service // is unknown, the call will fail with status NOT_FOUND. If the caller does @@ -132,9 +149,19 @@ type HealthServer interface { // // Clients should set a deadline when calling Check, and can declare the // server unhealthy if they do not receive a timely response. - // - // Check implementations should be idempotent and side effect free. Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) + // List provides a non-atomic snapshot of the health of all the available + // services. + // + // The server may respond with a RESOURCE_EXHAUSTED error if too many services + // exist. + // + // Clients should set a deadline when calling List, and can declare the server + // unhealthy if they do not receive a timely response. + // + // Clients should keep in mind that the list of health services exposed by an + // application can change over the lifetime of the process. + List(context.Context, *HealthListRequest) (*HealthListResponse, error) // Performs a watch for the serving status of the requested service. // The server will immediately send back a message indicating the current // serving status. It will then subsequently send a new message whenever @@ -150,19 +177,26 @@ type HealthServer interface { // should assume this method is not supported and should not retry the // call. If the call terminates with any other status (including OK), // clients should retry the call with appropriate exponential backoff. - Watch(*HealthCheckRequest, Health_WatchServer) error + Watch(*HealthCheckRequest, grpc.ServerStreamingServer[HealthCheckResponse]) error } -// UnimplementedHealthServer should be embedded to have forward compatible implementations. -type UnimplementedHealthServer struct { -} +// UnimplementedHealthServer should be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedHealthServer struct{} func (UnimplementedHealthServer) Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Check not implemented") + return nil, status.Error(codes.Unimplemented, "method Check not implemented") +} +func (UnimplementedHealthServer) List(context.Context, *HealthListRequest) (*HealthListResponse, error) { + return nil, status.Error(codes.Unimplemented, "method List not implemented") } -func (UnimplementedHealthServer) Watch(*HealthCheckRequest, Health_WatchServer) error { - return status.Errorf(codes.Unimplemented, "method Watch not implemented") +func (UnimplementedHealthServer) Watch(*HealthCheckRequest, grpc.ServerStreamingServer[HealthCheckResponse]) error { + return status.Error(codes.Unimplemented, "method Watch not implemented") } +func (UnimplementedHealthServer) testEmbeddedByValue() {} // UnsafeHealthServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to HealthServer will @@ -172,6 +206,13 @@ type UnsafeHealthServer interface { } func RegisterHealthServer(s grpc.ServiceRegistrar, srv HealthServer) { + // If the following call panics, it indicates UnimplementedHealthServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Health_ServiceDesc, srv) } @@ -193,26 +234,34 @@ func _Health_Check_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _Health_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HealthListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(HealthServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Health_List_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(HealthServer).List(ctx, req.(*HealthListRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Health_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(HealthCheckRequest) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(HealthServer).Watch(m, &healthWatchServer{stream}) + return srv.(HealthServer).Watch(m, &grpc.GenericServerStream[HealthCheckRequest, HealthCheckResponse]{ServerStream: stream}) } -type Health_WatchServer interface { - Send(*HealthCheckResponse) error - grpc.ServerStream -} - -type healthWatchServer struct { - grpc.ServerStream -} - -func (x *healthWatchServer) Send(m *HealthCheckResponse) error { - return x.ServerStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Health_WatchServer = grpc.ServerStreamingServer[HealthCheckResponse] // Health_ServiceDesc is the grpc.ServiceDesc for Health service. // It's only intended for direct use with grpc.RegisterService, @@ -225,6 +274,10 @@ var Health_ServiceDesc = grpc.ServiceDesc{ MethodName: "Check", Handler: _Health_Check_Handler, }, + { + MethodName: "List", + Handler: _Health_List_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/vendor/google.golang.org/grpc/internal/backoff/backoff.go b/vendor/google.golang.org/grpc/internal/backoff/backoff.go index fed1c011a3..b6ae7f2585 100644 --- a/vendor/google.golang.org/grpc/internal/backoff/backoff.go +++ b/vendor/google.golang.org/grpc/internal/backoff/backoff.go @@ -25,10 +25,10 @@ package backoff import ( "context" "errors" + rand "math/rand/v2" "time" grpcbackoff "google.golang.org/grpc/backoff" - "google.golang.org/grpc/internal/grpcrand" ) // Strategy defines the methodology for backing off after a grpc connection @@ -67,7 +67,7 @@ func (bc Exponential) Backoff(retries int) time.Duration { } // Randomize backoff delays so that if a cluster of requests start at // the same time, they won't operate in lockstep. - backoff *= 1 + bc.Config.Jitter*(grpcrand.Float64()*2-1) + backoff *= 1 + bc.Config.Jitter*(rand.Float64()*2-1) if backoff < 0 { return 0 } diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go index 6bf7f87396..85540f86a7 100644 --- a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go +++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go @@ -33,6 +33,8 @@ type lbConfig struct { childConfig serviceconfig.LoadBalancingConfig } +// ChildName returns the name of the child balancer of the gracefulswitch +// Balancer. func ChildName(l serviceconfig.LoadBalancingConfig) string { return l.(*lbConfig).childBuilder.Name() } @@ -75,7 +77,6 @@ func ParseConfig(cfg json.RawMessage) (serviceconfig.LoadBalancingConfig, error) if err != nil { return nil, fmt.Errorf("error parsing config for policy %q: %v", name, err) } - return &lbConfig{childBuilder: builder, childConfig: cfg}, nil } diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go index 45d5e50ea9..ba25b89887 100644 --- a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go +++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go @@ -109,8 +109,9 @@ func (gsb *Balancer) switchTo(builder balancer.Builder) (*balancerWrapper, error return nil, errBalancerClosed } bw := &balancerWrapper{ - builder: builder, - gsb: gsb, + ClientConn: gsb.cc, + builder: builder, + gsb: gsb, lastState: balancer.State{ ConnectivityState: connectivity.Connecting, Picker: base.NewErrPicker(balancer.ErrNoSubConnAvailable), @@ -169,7 +170,6 @@ func (gsb *Balancer) latestBalancer() *balancerWrapper { func (gsb *Balancer) UpdateClientConnState(state balancer.ClientConnState) error { // The resolver data is only relevant to the most recent LB Policy. balToUpdate := gsb.latestBalancer() - gsbCfg, ok := state.BalancerConfig.(*lbConfig) if ok { // Switch to the child in the config unless it is already active. @@ -223,15 +223,7 @@ func (gsb *Balancer) ExitIdle() { // There is no need to protect this read with a mutex, as the write to the // Balancer field happens in SwitchTo, which completes before this can be // called. - if ei, ok := balToUpdate.Balancer.(balancer.ExitIdler); ok { - ei.ExitIdle() - return - } - gsb.mu.Lock() - defer gsb.mu.Unlock() - for sc := range balToUpdate.subconns { - sc.Connect() - } + balToUpdate.ExitIdle() } // updateSubConnState forwards the update to the appropriate child. @@ -294,6 +286,7 @@ func (gsb *Balancer) Close() { // State updates from the wrapped balancer can result in invocation of the // graceful switch logic. type balancerWrapper struct { + balancer.ClientConn balancer.Balancer gsb *Balancer builder balancer.Builder @@ -414,7 +407,3 @@ func (bw *balancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resolver bw.gsb.mu.Unlock() bw.gsb.cc.UpdateAddresses(sc, addrs) } - -func (bw *balancerWrapper) Target() string { - return bw.gsb.cc.Target() -} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go index e8456a77c2..9669328914 100644 --- a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go +++ b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go @@ -65,7 +65,7 @@ type TruncatingMethodLogger struct { callID uint64 idWithinCallGen *callIDGenerator - sink Sink // TODO(blog): make this plugable. + sink Sink // TODO(blog): make this pluggable. } // NewTruncatingMethodLogger returns a new truncating method logger. @@ -80,7 +80,7 @@ func NewTruncatingMethodLogger(h, m uint64) *TruncatingMethodLogger { callID: idGen.next(), idWithinCallGen: &callIDGenerator{}, - sink: DefaultSink, // TODO(blog): make it plugable. + sink: DefaultSink, // TODO(blog): make it pluggable. } } @@ -106,7 +106,7 @@ func (ml *TruncatingMethodLogger) Build(c LogEntryConfig) *binlogpb.GrpcLogEntry } // Log creates a proto binary log entry, and logs it to the sink. -func (ml *TruncatingMethodLogger) Log(ctx context.Context, c LogEntryConfig) { +func (ml *TruncatingMethodLogger) Log(_ context.Context, c LogEntryConfig) { ml.sink.Write(ml.Build(c)) } @@ -397,7 +397,7 @@ func metadataKeyOmit(key string) bool { switch key { case "lb-token", ":path", ":authority", "content-encoding", "content-type", "user-agent", "te": return true - case "grpc-trace-bin": // grpc-trace-bin is special because it's visiable to users. + case "grpc-trace-bin": // grpc-trace-bin is special because it's visible to users. return false } return strings.HasPrefix(key, "grpc-") diff --git a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go index 11f91668ac..467392b8d4 100644 --- a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go +++ b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go @@ -83,6 +83,7 @@ func (b *Unbounded) Load() { default: } } else if b.closing && !b.closed { + b.closed = true close(b.c) } } diff --git a/vendor/google.golang.org/grpc/internal/channelz/channel.go b/vendor/google.golang.org/grpc/internal/channelz/channel.go index d7e9e1d54e..3ec662799a 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/channel.go +++ b/vendor/google.golang.org/grpc/internal/channelz/channel.go @@ -43,6 +43,8 @@ type Channel struct { // Non-zero traceRefCount means the trace of this channel cannot be deleted. traceRefCount int32 + // ChannelMetrics holds connectivity state, target and call metrics for the + // channel within channelz. ChannelMetrics ChannelMetrics } @@ -50,6 +52,8 @@ type Channel struct { // nesting. func (c *Channel) channelzIdentifier() {} +// String returns a string representation of the Channel, including its parent +// entity and ID. func (c *Channel) String() string { if c.Parent == nil { return fmt.Sprintf("Channel #%d", c.ID) @@ -61,24 +65,31 @@ func (c *Channel) id() int64 { return c.ID } +// SubChans returns a copy of the map of sub-channels associated with the +// Channel. func (c *Channel) SubChans() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(c.subChans) } +// NestedChans returns a copy of the map of nested channels associated with the +// Channel. func (c *Channel) NestedChans() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(c.nestedChans) } +// Trace returns a copy of the Channel's trace data. func (c *Channel) Trace() *ChannelTrace { db.mu.RLock() defer db.mu.RUnlock() return c.trace.copy() } +// ChannelMetrics holds connectivity state, target and call metrics for the +// channel within channelz. type ChannelMetrics struct { // The current connectivity state of the channel. State atomic.Pointer[connectivity.State] @@ -136,12 +147,16 @@ func strFromPointer(s *string) string { return *s } +// String returns a string representation of the ChannelMetrics, including its +// state, target, and call metrics. func (c *ChannelMetrics) String() string { return fmt.Sprintf("State: %v, Target: %s, CallsStarted: %v, CallsSucceeded: %v, CallsFailed: %v, LastCallStartedTimestamp: %v", c.State.Load(), strFromPointer(c.Target.Load()), c.CallsStarted.Load(), c.CallsSucceeded.Load(), c.CallsFailed.Load(), c.LastCallStartedTimestamp.Load(), ) } +// NewChannelMetricForTesting creates a new instance of ChannelMetrics with +// specified initial values for testing purposes. func NewChannelMetricForTesting(state connectivity.State, target string, started, succeeded, failed, timestamp int64) *ChannelMetrics { c := &ChannelMetrics{} c.State.Store(&state) diff --git a/vendor/google.golang.org/grpc/internal/channelz/channelmap.go b/vendor/google.golang.org/grpc/internal/channelz/channelmap.go index dfe18b0892..64c791953d 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/channelmap.go +++ b/vendor/google.golang.org/grpc/internal/channelz/channelmap.go @@ -46,7 +46,7 @@ type entry interface { // channelMap is the storage data structure for channelz. // -// Methods of channelMap can be divided in two two categories with respect to +// Methods of channelMap can be divided into two categories with respect to // locking. // // 1. Methods acquire the global lock. @@ -234,13 +234,6 @@ func copyMap(m map[int64]string) map[int64]string { return n } -func min(a, b int) int { - if a < b { - return a - } - return b -} - func (c *channelMap) getTopChannels(id int64, maxResults int) ([]*Channel, bool) { if maxResults <= 0 { maxResults = EntriesPerPage diff --git a/vendor/google.golang.org/grpc/internal/channelz/funcs.go b/vendor/google.golang.org/grpc/internal/channelz/funcs.go index 03e24e1507..078bb81238 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/funcs.go +++ b/vendor/google.golang.org/grpc/internal/channelz/funcs.go @@ -33,7 +33,7 @@ var ( // outside this package except by tests. IDGen IDGenerator - db *channelMap = newChannelMap() + db = newChannelMap() // EntriesPerPage defines the number of channelz entries to be shown on a web page. EntriesPerPage = 50 curState int32 diff --git a/vendor/google.golang.org/grpc/internal/channelz/server.go b/vendor/google.golang.org/grpc/internal/channelz/server.go index cdfc49d6ea..b5a8249929 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/server.go +++ b/vendor/google.golang.org/grpc/internal/channelz/server.go @@ -59,6 +59,8 @@ func NewServerMetricsForTesting(started, succeeded, failed, timestamp int64) *Se return sm } +// CopyFrom copies the metrics data from the provided ServerMetrics +// instance into the current instance. func (sm *ServerMetrics) CopyFrom(o *ServerMetrics) { sm.CallsStarted.Store(o.CallsStarted.Load()) sm.CallsSucceeded.Store(o.CallsSucceeded.Load()) diff --git a/vendor/google.golang.org/grpc/internal/channelz/socket.go b/vendor/google.golang.org/grpc/internal/channelz/socket.go index fa64834b25..90103847c5 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/socket.go +++ b/vendor/google.golang.org/grpc/internal/channelz/socket.go @@ -70,13 +70,18 @@ type EphemeralSocketMetrics struct { RemoteFlowControlWindow int64 } +// SocketType represents the type of socket. type SocketType string +// SocketType can be one of these. const ( SocketTypeNormal = "NormalSocket" SocketTypeListen = "ListenSocket" ) +// Socket represents a socket within channelz which includes socket +// metrics and data related to socket activity and provides methods +// for managing and interacting with sockets. type Socket struct { Entity SocketType SocketType @@ -100,6 +105,8 @@ type Socket struct { Security credentials.ChannelzSecurityValue } +// String returns a string representation of the Socket, including its parent +// entity, socket type, and ID. func (ls *Socket) String() string { return fmt.Sprintf("%s %s #%d", ls.Parent, ls.SocketType, ls.ID) } diff --git a/vendor/google.golang.org/grpc/internal/channelz/subchannel.go b/vendor/google.golang.org/grpc/internal/channelz/subchannel.go index 3b88e4cba8..b20802e6e9 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/subchannel.go +++ b/vendor/google.golang.org/grpc/internal/channelz/subchannel.go @@ -47,12 +47,14 @@ func (sc *SubChannel) id() int64 { return sc.ID } +// Sockets returns a copy of the sockets map associated with the SubChannel. func (sc *SubChannel) Sockets() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(sc.sockets) } +// Trace returns a copy of the ChannelTrace associated with the SubChannel. func (sc *SubChannel) Trace() *ChannelTrace { db.mu.RLock() defer db.mu.RUnlock() diff --git a/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go b/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go index d1ed8df6a5..0e6e18e185 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go +++ b/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go @@ -35,13 +35,13 @@ type SocketOptionData struct { // Getsockopt defines the function to get socket options requested by channelz. // It is to be passed to syscall.RawConn.Control(). // Windows OS doesn't support Socket Option -func (s *SocketOptionData) Getsockopt(fd uintptr) { +func (s *SocketOptionData) Getsockopt(uintptr) { once.Do(func() { logger.Warning("Channelz: socket options are not supported on non-linux environments") }) } // GetSocketOption gets the socket option info of the conn. -func GetSocketOption(c any) *SocketOptionData { +func GetSocketOption(any) *SocketOptionData { return nil } diff --git a/vendor/google.golang.org/grpc/internal/channelz/trace.go b/vendor/google.golang.org/grpc/internal/channelz/trace.go index 36b8674032..3b7ba59662 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/trace.go +++ b/vendor/google.golang.org/grpc/internal/channelz/trace.go @@ -79,13 +79,21 @@ type TraceEvent struct { Parent *TraceEvent } +// ChannelTrace provides tracing information for a channel. +// It tracks various events and metadata related to the channel's lifecycle +// and operations. type ChannelTrace struct { - cm *channelMap - clearCalled bool + cm *channelMap + clearCalled bool + // The time when the trace was created. CreationTime time.Time - EventNum int64 - mu sync.Mutex - Events []*traceEvent + // A counter for the number of events recorded in the + // trace. + EventNum int64 + mu sync.Mutex + // A slice of traceEvent pointers representing the events recorded for + // this channel. + Events []*traceEvent } func (c *ChannelTrace) copy() *ChannelTrace { @@ -175,6 +183,7 @@ var refChannelTypeToString = map[RefChannelType]string{ RefNormalSocket: "NormalSocket", } +// String returns a string representation of the RefChannelType func (r RefChannelType) String() string { return refChannelTypeToString[r] } @@ -185,7 +194,7 @@ func (r RefChannelType) String() string { // If channelz is not turned ON, this will simply log the event descriptions. func AddTraceEvent(l grpclog.DepthLoggerV2, e Entity, depth int, desc *TraceEvent) { // Log only the trace description associated with the bottom most entity. - d := fmt.Sprintf("[%s]%s", e, desc.Desc) + d := fmt.Sprintf("[%s] %s", e, desc.Desc) switch desc.Severity { case CtUnknown, CtInfo: l.InfoDepth(depth+1, d) diff --git a/vendor/google.golang.org/grpc/internal/credentials/credentials.go b/vendor/google.golang.org/grpc/internal/credentials/credentials.go index 9deee7f651..48b22d9cf0 100644 --- a/vendor/google.golang.org/grpc/internal/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/internal/credentials/credentials.go @@ -20,20 +20,6 @@ import ( "context" ) -// requestInfoKey is a struct to be used as the key to store RequestInfo in a -// context. -type requestInfoKey struct{} - -// NewRequestInfoContext creates a context with ri. -func NewRequestInfoContext(ctx context.Context, ri any) context.Context { - return context.WithValue(ctx, requestInfoKey{}, ri) -} - -// RequestInfoFromContext extracts the RequestInfo from ctx. -func RequestInfoFromContext(ctx context.Context) any { - return ctx.Value(requestInfoKey{}) -} - // clientHandshakeInfoKey is a struct used as the key to store // ClientHandshakeInfo in a context. type clientHandshakeInfoKey struct{} diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go index 685a3cb41b..7e060f5ed1 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -26,23 +26,55 @@ import ( ) var ( - // TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). + // EnableTXTServiceConfig is set if the DNS resolver should perform TXT + // lookups for service config ("GRPC_ENABLE_TXT_SERVICE_CONFIG" is not + // "false"). + EnableTXTServiceConfig = boolFromEnv("GRPC_ENABLE_TXT_SERVICE_CONFIG", true) + + // TXTErrIgnore is set if TXT errors should be ignored + // ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). TXTErrIgnore = boolFromEnv("GRPC_GO_IGNORE_TXT_ERRORS", true) - // AdvertiseCompressors is set if registered compressor should be advertised - // ("GRPC_GO_ADVERTISE_COMPRESSORS" is not "false"). - AdvertiseCompressors = boolFromEnv("GRPC_GO_ADVERTISE_COMPRESSORS", true) + // RingHashCap indicates the maximum ring size which defaults to 4096 // entries but may be overridden by setting the environment variable // "GRPC_RING_HASH_CAP". This does not override the default bounds // checking which NACKs configs specifying ring sizes > 8*1024*1024 (~8M). RingHashCap = uint64FromEnv("GRPC_RING_HASH_CAP", 4096, 1, 8*1024*1024) - // LeastRequestLB is set if we should support the least_request_experimental - // LB policy, which can be enabled by setting the environment variable - // "GRPC_EXPERIMENTAL_ENABLE_LEAST_REQUEST" to "true". - LeastRequestLB = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_LEAST_REQUEST", false) + // ALTSMaxConcurrentHandshakes is the maximum number of concurrent ALTS // handshakes that can be performed. ALTSMaxConcurrentHandshakes = uint64FromEnv("GRPC_ALTS_MAX_CONCURRENT_HANDSHAKES", 100, 1, 100) + + // EnforceALPNEnabled is set if TLS connections to servers with ALPN disabled + // should be rejected. The HTTP/2 protocol requires ALPN to be enabled, this + // option is present for backward compatibility. This option may be overridden + // by setting the environment variable "GRPC_ENFORCE_ALPN_ENABLED" to "true" + // or "false". + EnforceALPNEnabled = boolFromEnv("GRPC_ENFORCE_ALPN_ENABLED", true) + + // NewPickFirstEnabled is set if the new pickfirst leaf policy is to be used + // instead of the exiting pickfirst implementation. This can be disabled by + // setting the environment variable "GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST" + // to "false". + NewPickFirstEnabled = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST", true) + + // XDSEndpointHashKeyBackwardCompat controls the parsing of the endpoint hash + // key from EDS LbEndpoint metadata. Endpoint hash keys can be disabled by + // setting "GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT" to "true". When the + // implementation of A76 is stable, we will flip the default value to false + // in a subsequent release. A final release will remove this environment + // variable, enabling the new behavior unconditionally. + XDSEndpointHashKeyBackwardCompat = boolFromEnv("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT", true) + + // RingHashSetRequestHashKey is set if the ring hash balancer can get the + // request hash header by setting the "requestHashHeader" field, according + // to gRFC A76. It can be enabled by setting the environment variable + // "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY" to "true". + RingHashSetRequestHashKey = boolFromEnv("GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY", false) + + // ALTSHandshakerKeepaliveParams is set if we should add the + // KeepaliveParams when dial the ALTS handshaker service. + ALTSHandshakerKeepaliveParams = boolFromEnv("GRPC_EXPERIMENTAL_ALTS_HANDSHAKER_KEEPALIVE_PARAMS", false) ) func boolFromEnv(envVar string, def bool) bool { diff --git a/vendor/google.golang.org/grpc/internal/envconfig/xds.go b/vendor/google.golang.org/grpc/internal/envconfig/xds.go index 29f234acb1..b1f883bcac 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/xds.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/xds.go @@ -53,4 +53,25 @@ var ( // C2PResolverTestOnlyTrafficDirectorURI is the TD URI for testing. C2PResolverTestOnlyTrafficDirectorURI = os.Getenv("GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI") + + // XDSDualstackEndpointsEnabled is true if gRPC should read the + // "additional addresses" in the xDS endpoint resource. + XDSDualstackEndpointsEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS", true) + + // XDSSystemRootCertsEnabled is true when xDS enabled gRPC clients can use + // the system's default root certificates for TLS certificate validation. + // For more details, see: + // https://github.com/grpc/proposal/blob/master/A82-xds-system-root-certs.md. + XDSSystemRootCertsEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS", false) + + // XDSSPIFFEEnabled controls if SPIFFE Bundle Maps can be used as roots of + // trust. For more details, see: + // https://github.com/grpc/proposal/blob/master/A87-mtls-spiffe-support.md + XDSSPIFFEEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_MTLS_SPIFFE", false) + + // XDSHTTPConnectEnabled is true if gRPC should parse custom Metadata + // configuring use of an HTTP CONNECT proxy via xDS from cluster resources. + // For more details, see: + // https://github.com/grpc/proposal/blob/master/A86-xds-http-connect.md + XDSHTTPConnectEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_HTTP_CONNECT", false) ) diff --git a/vendor/google.golang.org/grpc/internal/experimental.go b/vendor/google.golang.org/grpc/internal/experimental.go index 7f7044e173..7617be2158 100644 --- a/vendor/google.golang.org/grpc/internal/experimental.go +++ b/vendor/google.golang.org/grpc/internal/experimental.go @@ -18,11 +18,11 @@ package internal var ( - // WithRecvBufferPool is implemented by the grpc package and returns a dial + // WithBufferPool is implemented by the grpc package and returns a dial // option to configure a shared buffer pool for a grpc.ClientConn. - WithRecvBufferPool any // func (grpc.SharedBufferPool) grpc.DialOption + WithBufferPool any // func (grpc.SharedBufferPool) grpc.DialOption - // RecvBufferPool is implemented by the grpc package and returns a server + // BufferPool is implemented by the grpc package and returns a server // option to configure a shared buffer pool for a grpc.Server. - RecvBufferPool any // func (grpc.SharedBufferPool) grpc.ServerOption + BufferPool any // func (grpc.SharedBufferPool) grpc.ServerOption ) diff --git a/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go b/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go index 6717b757f8..43423d8ad9 100644 --- a/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go +++ b/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go @@ -62,9 +62,9 @@ func isRunningOnGCE(manufacturer []byte, goos string) bool { name = strings.TrimSpace(name) return name == "Google" || name == "Google Compute Engine" case "windows": - name = strings.Replace(name, " ", "", -1) - name = strings.Replace(name, "\n", "", -1) - name = strings.Replace(name, "\r", "", -1) + name = strings.ReplaceAll(name, " ", "") + name = strings.ReplaceAll(name, "\n", "") + name = strings.ReplaceAll(name, "\r", "") return name == "Google" default: return false diff --git a/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go b/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go deleted file mode 100644 index bfc45102ab..0000000000 --- a/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go +++ /dev/null @@ -1,126 +0,0 @@ -/* - * - * Copyright 2020 gRPC 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 grpclog (internal) defines depth logging for grpc. -package grpclog - -import ( - "os" -) - -// Logger is the logger used for the non-depth log functions. -var Logger LoggerV2 - -// DepthLogger is the logger used for the depth log functions. -var DepthLogger DepthLoggerV2 - -// InfoDepth logs to the INFO log at the specified depth. -func InfoDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.InfoDepth(depth, args...) - } else { - Logger.Infoln(args...) - } -} - -// WarningDepth logs to the WARNING log at the specified depth. -func WarningDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.WarningDepth(depth, args...) - } else { - Logger.Warningln(args...) - } -} - -// ErrorDepth logs to the ERROR log at the specified depth. -func ErrorDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.ErrorDepth(depth, args...) - } else { - Logger.Errorln(args...) - } -} - -// FatalDepth logs to the FATAL log at the specified depth. -func FatalDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.FatalDepth(depth, args...) - } else { - Logger.Fatalln(args...) - } - os.Exit(1) -} - -// LoggerV2 does underlying logging work for grpclog. -// This is a copy of the LoggerV2 defined in the external grpclog package. It -// is defined here to avoid a circular dependency. -type LoggerV2 interface { - // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. - Info(args ...any) - // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. - Infoln(args ...any) - // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. - Infof(format string, args ...any) - // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. - Warning(args ...any) - // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. - Warningln(args ...any) - // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. - Warningf(format string, args ...any) - // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. - Error(args ...any) - // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - Errorln(args ...any) - // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - Errorf(format string, args ...any) - // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatal(args ...any) - // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalln(args ...any) - // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalf(format string, args ...any) - // V reports whether verbosity level l is at least the requested verbose level. - V(l int) bool -} - -// DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements -// DepthLoggerV2, the below functions will be called with the appropriate stack -// depth set for trivial functions the logger may ignore. -// This is a copy of the DepthLoggerV2 defined in the external grpclog package. -// It is defined here to avoid a circular dependency. -// -// # Experimental -// -// Notice: This type is EXPERIMENTAL and may be changed or removed in a -// later release. -type DepthLoggerV2 interface { - // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. - InfoDepth(depth int, args ...any) - // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. - WarningDepth(depth int, args ...any) - // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. - ErrorDepth(depth int, args ...any) - // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. - FatalDepth(depth int, args ...any) -} diff --git a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go b/vendor/google.golang.org/grpc/internal/grpclog/prefix_logger.go similarity index 63% rename from vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go rename to vendor/google.golang.org/grpc/internal/grpclog/prefix_logger.go index faa998de76..092ad187a2 100644 --- a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go +++ b/vendor/google.golang.org/grpc/internal/grpclog/prefix_logger.go @@ -16,17 +16,21 @@ * */ +// Package grpclog provides logging functionality for internal gRPC packages, +// outside of the functionality provided by the external `grpclog` package. package grpclog import ( "fmt" + + "google.golang.org/grpc/grpclog" ) // PrefixLogger does logging with a prefix. // // Logging method on a nil logs without any prefix. type PrefixLogger struct { - logger DepthLoggerV2 + logger grpclog.DepthLoggerV2 prefix string } @@ -38,7 +42,7 @@ func (pl *PrefixLogger) Infof(format string, args ...any) { pl.logger.InfoDepth(1, fmt.Sprintf(format, args...)) return } - InfoDepth(1, fmt.Sprintf(format, args...)) + grpclog.InfoDepth(1, fmt.Sprintf(format, args...)) } // Warningf does warning logging. @@ -48,7 +52,7 @@ func (pl *PrefixLogger) Warningf(format string, args ...any) { pl.logger.WarningDepth(1, fmt.Sprintf(format, args...)) return } - WarningDepth(1, fmt.Sprintf(format, args...)) + grpclog.WarningDepth(1, fmt.Sprintf(format, args...)) } // Errorf does error logging. @@ -58,36 +62,18 @@ func (pl *PrefixLogger) Errorf(format string, args ...any) { pl.logger.ErrorDepth(1, fmt.Sprintf(format, args...)) return } - ErrorDepth(1, fmt.Sprintf(format, args...)) -} - -// Debugf does info logging at verbose level 2. -func (pl *PrefixLogger) Debugf(format string, args ...any) { - // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe - // rewrite PrefixLogger a little to ensure that we don't use the global - // `Logger` here, and instead use the `logger` field. - if !Logger.V(2) { - return - } - if pl != nil { - // Handle nil, so the tests can pass in a nil logger. - format = pl.prefix + format - pl.logger.InfoDepth(1, fmt.Sprintf(format, args...)) - return - } - InfoDepth(1, fmt.Sprintf(format, args...)) - + grpclog.ErrorDepth(1, fmt.Sprintf(format, args...)) } // V reports whether verbosity level l is at least the requested verbose level. func (pl *PrefixLogger) V(l int) bool { - // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe - // rewrite PrefixLogger a little to ensure that we don't use the global - // `Logger` here, and instead use the `logger` field. - return Logger.V(l) + if pl != nil { + return pl.logger.V(l) + } + return true } // NewPrefixLogger creates a prefix logger with the given prefix. -func NewPrefixLogger(logger DepthLoggerV2, prefix string) *PrefixLogger { +func NewPrefixLogger(logger grpclog.DepthLoggerV2, prefix string) *PrefixLogger { return &PrefixLogger{logger: logger, prefix: prefix} } diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go deleted file mode 100644 index 0126d6b510..0000000000 --- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go +++ /dev/null @@ -1,100 +0,0 @@ -//go:build !go1.21 - -// TODO: when this file is deleted (after Go 1.20 support is dropped), delete -// all of grpcrand and call the rand package directly. - -/* - * - * Copyright 2018 gRPC 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 grpcrand implements math/rand functions in a concurrent-safe way -// with a global random source, independent of math/rand's global source. -package grpcrand - -import ( - "math/rand" - "sync" - "time" -) - -var ( - r = rand.New(rand.NewSource(time.Now().UnixNano())) - mu sync.Mutex -) - -// Int implements rand.Int on the grpcrand global source. -func Int() int { - mu.Lock() - defer mu.Unlock() - return r.Int() -} - -// Int63n implements rand.Int63n on the grpcrand global source. -func Int63n(n int64) int64 { - mu.Lock() - defer mu.Unlock() - return r.Int63n(n) -} - -// Intn implements rand.Intn on the grpcrand global source. -func Intn(n int) int { - mu.Lock() - defer mu.Unlock() - return r.Intn(n) -} - -// Int31n implements rand.Int31n on the grpcrand global source. -func Int31n(n int32) int32 { - mu.Lock() - defer mu.Unlock() - return r.Int31n(n) -} - -// Float64 implements rand.Float64 on the grpcrand global source. -func Float64() float64 { - mu.Lock() - defer mu.Unlock() - return r.Float64() -} - -// Uint64 implements rand.Uint64 on the grpcrand global source. -func Uint64() uint64 { - mu.Lock() - defer mu.Unlock() - return r.Uint64() -} - -// Uint32 implements rand.Uint32 on the grpcrand global source. -func Uint32() uint32 { - mu.Lock() - defer mu.Unlock() - return r.Uint32() -} - -// ExpFloat64 implements rand.ExpFloat64 on the grpcrand global source. -func ExpFloat64() float64 { - mu.Lock() - defer mu.Unlock() - return r.ExpFloat64() -} - -// Shuffle implements rand.Shuffle on the grpcrand global source. -var Shuffle = func(n int, f func(int, int)) { - mu.Lock() - defer mu.Unlock() - r.Shuffle(n, f) -} diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go deleted file mode 100644 index c37299af1e..0000000000 --- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:build go1.21 - -/* - * - * Copyright 2024 gRPC 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 grpcrand implements math/rand functions in a concurrent-safe way -// with a global random source, independent of math/rand's global source. -package grpcrand - -import "math/rand" - -// This implementation will be used for Go version 1.21 or newer. -// For older versions, the original implementation with mutex will be used. - -// Int implements rand.Int on the grpcrand global source. -func Int() int { - return rand.Int() -} - -// Int63n implements rand.Int63n on the grpcrand global source. -func Int63n(n int64) int64 { - return rand.Int63n(n) -} - -// Intn implements rand.Intn on the grpcrand global source. -func Intn(n int) int { - return rand.Intn(n) -} - -// Int31n implements rand.Int31n on the grpcrand global source. -func Int31n(n int32) int32 { - return rand.Int31n(n) -} - -// Float64 implements rand.Float64 on the grpcrand global source. -func Float64() float64 { - return rand.Float64() -} - -// Uint64 implements rand.Uint64 on the grpcrand global source. -func Uint64() uint64 { - return rand.Uint64() -} - -// Uint32 implements rand.Uint32 on the grpcrand global source. -func Uint32() uint32 { - return rand.Uint32() -} - -// ExpFloat64 implements rand.ExpFloat64 on the grpcrand global source. -func ExpFloat64() float64 { - return rand.ExpFloat64() -} - -// Shuffle implements rand.Shuffle on the grpcrand global source. -var Shuffle = func(n int, f func(int, int)) { - rand.Shuffle(n, f) -} diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go index f7f40a16ac..9b6d8a1fa3 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go +++ b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go @@ -53,40 +53,38 @@ func NewCallbackSerializer(ctx context.Context) *CallbackSerializer { return cs } -// Schedule adds a callback to be scheduled after existing callbacks are run. +// TrySchedule tries to schedule the provided callback function f to be +// executed in the order it was added. This is a best-effort operation. If the +// context passed to NewCallbackSerializer was canceled before this method is +// called, the callback will not be scheduled. // // Callbacks are expected to honor the context when performing any blocking // operations, and should return early when the context is canceled. +func (cs *CallbackSerializer) TrySchedule(f func(ctx context.Context)) { + cs.callbacks.Put(f) +} + +// ScheduleOr schedules the provided callback function f to be executed in the +// order it was added. If the context passed to NewCallbackSerializer has been +// canceled before this method is called, the onFailure callback will be +// executed inline instead. // -// Return value indicates if the callback was successfully added to the list of -// callbacks to be executed by the serializer. It is not possible to add -// callbacks once the context passed to NewCallbackSerializer is cancelled. -func (cs *CallbackSerializer) Schedule(f func(ctx context.Context)) bool { - return cs.callbacks.Put(f) == nil +// Callbacks are expected to honor the context when performing any blocking +// operations, and should return early when the context is canceled. +func (cs *CallbackSerializer) ScheduleOr(f func(ctx context.Context), onFailure func()) { + if cs.callbacks.Put(f) != nil { + onFailure() + } } func (cs *CallbackSerializer) run(ctx context.Context) { defer close(cs.done) - // TODO: when Go 1.21 is the oldest supported version, this loop and Close - // can be replaced with: - // - // context.AfterFunc(ctx, cs.callbacks.Close) - for ctx.Err() == nil { - select { - case <-ctx.Done(): - // Do nothing here. Next iteration of the for loop will not happen, - // since ctx.Err() would be non-nil. - case cb := <-cs.callbacks.Get(): - cs.callbacks.Load() - cb.(func(context.Context))(ctx) - } - } - - // Close the buffer to prevent new callbacks from being added. - cs.callbacks.Close() + // Close the buffer when the context is canceled + // to prevent new callbacks from being added. + context.AfterFunc(ctx, cs.callbacks.Close) - // Run all pending callbacks. + // Run all callbacks. for cb := range cs.callbacks.Get() { cs.callbacks.Load() cb.(func(context.Context))(ctx) diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/event.go b/vendor/google.golang.org/grpc/internal/grpcsync/event.go index fbe697c376..d788c24930 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/event.go +++ b/vendor/google.golang.org/grpc/internal/grpcsync/event.go @@ -21,28 +21,25 @@ package grpcsync import ( - "sync" "sync/atomic" ) // Event represents a one-time event that may occur in the future. type Event struct { - fired int32 + fired atomic.Bool c chan struct{} - o sync.Once } // Fire causes e to complete. It is safe to call multiple times, and // concurrently. It returns true iff this call to Fire caused the signaling -// channel returned by Done to close. +// channel returned by Done to close. If Fire returns false, it is possible +// the Done channel has not been closed yet. func (e *Event) Fire() bool { - ret := false - e.o.Do(func() { - atomic.StoreInt32(&e.fired, 1) + if e.fired.CompareAndSwap(false, true) { close(e.c) - ret = true - }) - return ret + return true + } + return false } // Done returns a channel that will be closed when Fire is called. @@ -52,7 +49,7 @@ func (e *Event) Done() <-chan struct{} { // HasFired returns true if Fire has been called. func (e *Event) HasFired() bool { - return atomic.LoadInt32(&e.fired) == 1 + return e.fired.Load() } // NewEvent returns a new, ready-to-use Event. diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go b/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go index aef8cec1ab..6d8c2f518d 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go +++ b/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go @@ -77,7 +77,7 @@ func (ps *PubSub) Subscribe(sub Subscriber) (cancel func()) { if ps.msg != nil { msg := ps.msg - ps.cs.Schedule(func(context.Context) { + ps.cs.TrySchedule(func(context.Context) { ps.mu.Lock() defer ps.mu.Unlock() if !ps.subscribers[sub] { @@ -103,7 +103,7 @@ func (ps *PubSub) Publish(msg any) { ps.msg = msg for sub := range ps.subscribers { s := sub - ps.cs.Schedule(func(context.Context) { + ps.cs.TrySchedule(func(context.Context) { ps.mu.Lock() defer ps.mu.Unlock() if !ps.subscribers[s] { diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go index 9f40909679..e8d866984b 100644 --- a/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go +++ b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go @@ -20,8 +20,6 @@ package grpcutil import ( "strings" - - "google.golang.org/grpc/internal/envconfig" ) // RegisteredCompressorNames holds names of the registered compressors. @@ -40,8 +38,5 @@ func IsCompressorNameRegistered(name string) bool { // RegisteredCompressors returns a string of registered compressor names // separated by comma. func RegisteredCompressors() string { - if !envconfig.AdvertiseCompressors { - return "" - } return strings.Join(RegisteredCompressorNames, ",") } diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/method.go b/vendor/google.golang.org/grpc/internal/grpcutil/method.go index ec62b4775e..683d1955c6 100644 --- a/vendor/google.golang.org/grpc/internal/grpcutil/method.go +++ b/vendor/google.golang.org/grpc/internal/grpcutil/method.go @@ -39,7 +39,7 @@ func ParseMethod(methodName string) (service, method string, _ error) { } // baseContentType is the base content-type for gRPC. This is a valid -// content-type on it's own, but can also include a content-subtype such as +// content-type on its own, but can also include a content-subtype such as // "proto" as a suffix after "+" or ";". See // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests // for more details. diff --git a/vendor/google.golang.org/grpc/internal/idle/idle.go b/vendor/google.golang.org/grpc/internal/idle/idle.go index fe49cb74c5..2c13ee9dac 100644 --- a/vendor/google.golang.org/grpc/internal/idle/idle.go +++ b/vendor/google.golang.org/grpc/internal/idle/idle.go @@ -182,6 +182,7 @@ func (m *Manager) tryEnterIdleMode() bool { return true } +// EnterIdleModeForTesting instructs the channel to enter idle mode. func (m *Manager) EnterIdleModeForTesting() { m.tryEnterIdleMode() } @@ -225,7 +226,7 @@ func (m *Manager) ExitIdleMode() error { // came in and OnCallBegin() noticed that the calls count is negative. // - Channel is in idle mode, and multiple new RPCs come in at the same // time, all of them notice a negative calls count in OnCallBegin and get - // here. The first one to get the lock would got the channel to exit idle. + // here. The first one to get the lock would get the channel to exit idle. // - Channel is not in idle mode, and the user calls Connect which calls // m.ExitIdleMode. // @@ -266,6 +267,7 @@ func (m *Manager) isClosed() bool { return atomic.LoadInt32(&m.closed) == 1 } +// Close stops the timer associated with the Manager, if it exists. func (m *Manager) Close() { atomic.StoreInt32(&m.closed, 1) diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index 48d24bdb4e..2699223a27 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -29,10 +29,12 @@ import ( ) var ( - // WithHealthCheckFunc is set by dialoptions.go - WithHealthCheckFunc any // func (HealthChecker) DialOption // HealthCheckFunc is used to provide client-side LB channel health checking HealthCheckFunc HealthChecker + // RegisterClientHealthCheckListener is used to provide a listener for + // updates from the client-side health checking service. It returns a + // function that can be called to stop the health producer. + RegisterClientHealthCheckListener any // func(ctx context.Context, sc balancer.SubConn, serviceName string, listener func(balancer.SubConnState)) func() // BalancerUnregister is exported by package balancer to unregister a balancer. BalancerUnregister func(name string) // KeepaliveMinPingTime is the minimum ping interval. This must be 10s by @@ -62,6 +64,9 @@ var ( // gRPC server. An xDS-enabled server needs to know what type of credentials // is configured on the underlying gRPC server. This is set by server.go. GetServerCredentials any // func (*grpc.Server) credentials.TransportCredentials + // MetricsRecorderForServer returns the MetricsRecorderList derived from a + // server's stats handlers. + MetricsRecorderForServer any // func (*grpc.Server) estats.MetricsRecorder // CanonicalString returns the canonical string of the code defined here: // https://github.com/grpc/grpc/blob/master/doc/statuscodes.md. // @@ -106,6 +111,14 @@ var ( // This is used in the 1.0 release of gcp/observability, and thus must not be // deleted or changed. ClearGlobalDialOptions func() + + // AddGlobalPerTargetDialOptions adds a PerTargetDialOption that will be + // configured for newly created ClientConns. + AddGlobalPerTargetDialOptions any // func (opt any) + // ClearGlobalPerTargetDialOptions clears the slice of global late apply + // dial options. + ClearGlobalPerTargetDialOptions func() + // JoinDialOptions combines the dial options passed as arguments into a // single dial option. JoinDialOptions any // func(...grpc.DialOption) grpc.DialOption @@ -126,7 +139,8 @@ var ( // deleted or changed. BinaryLogger any // func(binarylog.Logger) grpc.ServerOption - // SubscribeToConnectivityStateChanges adds a grpcsync.Subscriber to a provided grpc.ClientConn + // SubscribeToConnectivityStateChanges adds a grpcsync.Subscriber to a + // provided grpc.ClientConn. SubscribeToConnectivityStateChanges any // func(*grpc.ClientConn, grpcsync.Subscriber) // NewXDSResolverWithConfigForTesting creates a new xds resolver builder using @@ -140,41 +154,40 @@ var ( // other features, including the CSDS service. NewXDSResolverWithConfigForTesting any // func([]byte) (resolver.Builder, error) - // RegisterRLSClusterSpecifierPluginForTesting registers the RLS Cluster - // Specifier Plugin for testing purposes, regardless of the XDSRLS environment - // variable. + // NewXDSResolverWithPoolForTesting creates a new xDS resolver builder + // using the provided xDS pool instead of creating a new one using the + // bootstrap configuration specified by the supported environment variables. + // The resolver.Builder is meant to be used in conjunction with the + // grpc.WithResolvers DialOption. The resolver.Builder does not take + // ownership of the provided xDS client and it is the responsibility of the + // caller to close the client when no longer required. // - // TODO: Remove this function once the RLS env var is removed. - RegisterRLSClusterSpecifierPluginForTesting func() - - // UnregisterRLSClusterSpecifierPluginForTesting unregisters the RLS Cluster - // Specifier Plugin for testing purposes. This is needed because there is no way - // to unregister the RLS Cluster Specifier Plugin after registering it solely - // for testing purposes using RegisterRLSClusterSpecifierPluginForTesting(). + // Testing Only // - // TODO: Remove this function once the RLS env var is removed. - UnregisterRLSClusterSpecifierPluginForTesting func() + // This function should ONLY be used for testing and may not work with some + // other features, including the CSDS service. + NewXDSResolverWithPoolForTesting any // func(*xdsclient.Pool) (resolver.Builder, error) - // RegisterRBACHTTPFilterForTesting registers the RBAC HTTP Filter for testing - // purposes, regardless of the RBAC environment variable. + // NewXDSResolverWithClientForTesting creates a new xDS resolver builder + // using the provided xDS client instead of creating a new one using the + // bootstrap configuration specified by the supported environment variables. + // The resolver.Builder is meant to be used in conjunction with the + // grpc.WithResolvers DialOption. The resolver.Builder does not take + // ownership of the provided xDS client and it is the responsibility of the + // caller to close the client when no longer required. // - // TODO: Remove this function once the RBAC env var is removed. - RegisterRBACHTTPFilterForTesting func() - - // UnregisterRBACHTTPFilterForTesting unregisters the RBAC HTTP Filter for - // testing purposes. This is needed because there is no way to unregister the - // HTTP Filter after registering it solely for testing purposes using - // RegisterRBACHTTPFilterForTesting(). + // Testing Only // - // TODO: Remove this function once the RBAC env var is removed. - UnregisterRBACHTTPFilterForTesting func() + // This function should ONLY be used for testing and may not work with some + // other features, including the CSDS service. + NewXDSResolverWithClientForTesting any // func(xdsclient.XDSClient) (resolver.Builder, error) // ORCAAllowAnyMinReportingInterval is for examples/orca use ONLY. ORCAAllowAnyMinReportingInterval any // func(so *orca.ServiceOptions) // GRPCResolverSchemeExtraMetadata determines when gRPC will add extra // metadata to RPCs. - GRPCResolverSchemeExtraMetadata string = "xds" + GRPCResolverSchemeExtraMetadata = "xds" // EnterIdleModeForTesting gets the ClientConn to enter IDLE mode. EnterIdleModeForTesting any // func(*grpc.ClientConn) @@ -182,31 +195,63 @@ var ( // ExitIdleModeForTesting gets the ClientConn to exit IDLE mode. ExitIdleModeForTesting any // func(*grpc.ClientConn) error + // ChannelzTurnOffForTesting disables the Channelz service for testing + // purposes. ChannelzTurnOffForTesting func() - // TriggerXDSResourceNameNotFoundForTesting triggers the resource-not-found - // error for a given resource type and name. This is usually triggered when - // the associated watch timer fires. For testing purposes, having this - // function makes events more predictable than relying on timer events. - TriggerXDSResourceNameNotFoundForTesting any // func(func(xdsresource.Type, string), string, string) error - - // TriggerXDSResourceNameNotFoundClient invokes the testing xDS Client - // singleton to invoke resource not found for a resource type name and - // resource name. - TriggerXDSResourceNameNotFoundClient any // func(string, string) error + // TriggerXDSResourceNotFoundForTesting causes the provided xDS Client to + // invoke resource-not-found error for the given resource type and name. + TriggerXDSResourceNotFoundForTesting any // func(xdsclient.XDSClient, xdsresource.Type, string) error - // FromOutgoingContextRaw returns the un-merged, intermediary contents of metadata.rawMD. + // FromOutgoingContextRaw returns the un-merged, intermediary contents of + // metadata.rawMD. FromOutgoingContextRaw any // func(context.Context) (metadata.MD, [][]string, bool) - // UserSetDefaultScheme is set to true if the user has overridden the default resolver scheme. - UserSetDefaultScheme bool = false + // UserSetDefaultScheme is set to true if the user has overridden the + // default resolver scheme. + UserSetDefaultScheme = false + + // ConnectedAddress returns the connected address for a SubConnState. The + // address is only valid if the state is READY. + ConnectedAddress any // func (scs SubConnState) resolver.Address + + // SetConnectedAddress sets the connected address for a SubConnState. + SetConnectedAddress any // func(scs *SubConnState, addr resolver.Address) + + // SnapshotMetricRegistryForTesting snapshots the global data of the metric + // registry. Returns a cleanup function that sets the metric registry to its + // original state. Only called in testing functions. + SnapshotMetricRegistryForTesting func() func() + + // SetDefaultBufferPoolForTesting updates the default buffer pool, for + // testing purposes. + SetDefaultBufferPoolForTesting any // func(mem.BufferPool) + + // SetBufferPoolingThresholdForTesting updates the buffer pooling threshold, for + // testing purposes. + SetBufferPoolingThresholdForTesting any // func(int) + + // TimeAfterFunc is used to create timers. During tests the function is + // replaced to track allocated timers and fail the test if a timer isn't + // cancelled. + TimeAfterFunc = func(d time.Duration, f func()) Timer { + return time.AfterFunc(d, f) + } + + // NewStreamWaitingForResolver is a test hook that is triggered when a + // new stream blocks while waiting for name resolution. This can be + // used in tests to synchronize resolver updates and avoid race conditions. + // When set, the function will be called before the stream enters + // the blocking state. + NewStreamWaitingForResolver = func() {} ) -// HealthChecker defines the signature of the client-side LB channel health checking function. +// HealthChecker defines the signature of the client-side LB channel health +// checking function. // // The implementation is expected to create a health checking RPC stream by // calling newStream(), watch for the health status of serviceName, and report -// it's health back by calling setConnectivityState(). +// its health back by calling setConnectivityState(). // // The health checking protocol is defined at: // https://github.com/grpc/grpc/blob/master/doc/health-checking.md @@ -228,3 +273,21 @@ const ( // It currently has an experimental suffix which would be removed once // end-to-end testing of the policy is completed. const RLSLoadBalancingPolicyName = "rls_experimental" + +// EnforceSubConnEmbedding is used to enforce proper SubConn implementation +// embedding. +type EnforceSubConnEmbedding interface { + enforceSubConnEmbedding() +} + +// EnforceClientConnEmbedding is used to enforce proper ClientConn implementation +// embedding. +type EnforceClientConnEmbedding interface { + enforceClientConnEmbedding() +} + +// Timer is an interface to allow injecting different time.Timer implementations +// during tests. +type Timer interface { + Stop() bool +} diff --git a/vendor/google.golang.org/grpc/internal/metadata/metadata.go b/vendor/google.golang.org/grpc/internal/metadata/metadata.go index 900bfb7160..c4055bc00e 100644 --- a/vendor/google.golang.org/grpc/internal/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/internal/metadata/metadata.go @@ -97,13 +97,11 @@ func hasNotPrintable(msg string) bool { return false } -// ValidatePair validate a key-value pair with the following rules (the pseudo-header will be skipped) : -// -// - key must contain one or more characters. -// - the characters in the key must be contained in [0-9 a-z _ - .]. -// - if the key ends with a "-bin" suffix, no validation of the corresponding value is performed. -// - the characters in the every value must be printable (in [%x20-%x7E]). -func ValidatePair(key string, vals ...string) error { +// ValidateKey validates a key with the following rules (pseudo-headers are +// skipped): +// - the key must contain one or more characters. +// - the characters in the key must be in [0-9 a-z _ - .]. +func ValidateKey(key string) error { // key should not be empty if key == "" { return fmt.Errorf("there is an empty key in the header") @@ -119,6 +117,20 @@ func ValidatePair(key string, vals ...string) error { return fmt.Errorf("header key %q contains illegal characters not in [0-9a-z-_.]", key) } } + return nil +} + +// ValidatePair validates a key-value pair with the following rules +// (pseudo-header are skipped): +// - the key must contain one or more characters. +// - the characters in the key must be in [0-9 a-z _ - .]. +// - if the key ends with a "-bin" suffix, no validation of the corresponding +// value is performed. +// - the characters in every value must be printable (in [%x20-%x7E]). +func ValidatePair(key string, vals ...string) error { + if err := ValidateKey(key); err != nil { + return err + } if strings.HasSuffix(key, "-bin") { return nil } diff --git a/vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.go b/vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.go new file mode 100644 index 0000000000..1f61f1a49d --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.go @@ -0,0 +1,54 @@ +/* + * + * Copyright 2024 gRPC 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 proxyattributes contains functions for getting and setting proxy +// attributes like the CONNECT address and user info. +package proxyattributes + +import ( + "net/url" + + "google.golang.org/grpc/resolver" +) + +type keyType string + +const proxyOptionsKey = keyType("grpc.resolver.delegatingresolver.proxyOptions") + +// Options holds the proxy connection details needed during the CONNECT +// handshake. +type Options struct { + User *url.Userinfo + ConnectAddr string +} + +// Set returns a copy of addr with opts set in its attributes. +func Set(addr resolver.Address, opts Options) resolver.Address { + addr.Attributes = addr.Attributes.WithValue(proxyOptionsKey, opts) + return addr +} + +// Get returns the Options for the proxy [resolver.Address] and a boolean +// value representing if the attribute is present or not. The returned data +// should not be mutated. +func Get(addr resolver.Address) (Options, bool) { + if a := addr.Attributes.Value(proxyOptionsKey); a != nil { + return a.(Options), true + } + return Options{}, false +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go b/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go new file mode 100644 index 0000000000..20b8fb098a --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go @@ -0,0 +1,427 @@ +/* + * + * Copyright 2024 gRPC 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 delegatingresolver implements a resolver capable of resolving both +// target URIs and proxy addresses. +package delegatingresolver + +import ( + "fmt" + "net/http" + "net/url" + "sync" + + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/proxyattributes" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/internal/transport/networktype" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +var ( + logger = grpclog.Component("delegating-resolver") + // HTTPSProxyFromEnvironment will be overwritten in the tests + HTTPSProxyFromEnvironment = http.ProxyFromEnvironment +) + +// delegatingResolver manages both target URI and proxy address resolution by +// delegating these tasks to separate child resolvers. Essentially, it acts as +// an intermediary between the gRPC ClientConn and the child resolvers. +// +// It implements the [resolver.Resolver] interface. +type delegatingResolver struct { + target resolver.Target // parsed target URI to be resolved + cc resolver.ClientConn // gRPC ClientConn + proxyURL *url.URL // proxy URL, derived from proxy environment and target + + // We do not hold both mu and childMu in the same goroutine. Avoid holding + // both locks when calling into the child, as the child resolver may + // synchronously callback into the channel. + mu sync.Mutex // protects all the fields below + targetResolverState *resolver.State // state of the target resolver + proxyAddrs []resolver.Address // resolved proxy addresses; empty if no proxy is configured + + // childMu serializes calls into child resolvers. It also protects access to + // the following fields. + childMu sync.Mutex + targetResolver resolver.Resolver // resolver for the target URI, based on its scheme + proxyResolver resolver.Resolver // resolver for the proxy URI; nil if no proxy is configured +} + +// nopResolver is a resolver that does nothing. +type nopResolver struct{} + +func (nopResolver) ResolveNow(resolver.ResolveNowOptions) {} + +func (nopResolver) Close() {} + +// proxyURLForTarget determines the proxy URL for the given address based on the +// environment. It can return the following: +// - nil URL, nil error: No proxy is configured or the address is excluded +// using the `NO_PROXY` environment variable or if req.URL.Host is +// "localhost" (with or without // a port number) +// - nil URL, non-nil error: An error occurred while retrieving the proxy URL. +// - non-nil URL, nil error: A proxy is configured, and the proxy URL was +// retrieved successfully without any errors. +func proxyURLForTarget(address string) (*url.URL, error) { + req := &http.Request{URL: &url.URL{ + Scheme: "https", + Host: address, + }} + return HTTPSProxyFromEnvironment(req) +} + +// New creates a new delegating resolver that can create up to two child +// resolvers: +// - one to resolve the proxy address specified using the supported +// environment variables. This uses the registered resolver for the "dns" +// scheme. It is lazily built when a target resolver update contains at least +// one TCP address. +// - one to resolve the target URI using the resolver specified by the scheme +// in the target URI or specified by the user using the WithResolvers dial +// option. As a special case, if the target URI's scheme is "dns" and a +// proxy is specified using the supported environment variables, the target +// URI's path portion is used as the resolved address unless target +// resolution is enabled using the dial option. +func New(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions, targetResolverBuilder resolver.Builder, targetResolutionEnabled bool) (resolver.Resolver, error) { + r := &delegatingResolver{ + target: target, + cc: cc, + proxyResolver: nopResolver{}, + targetResolver: nopResolver{}, + } + + var err error + r.proxyURL, err = proxyURLForTarget(target.Endpoint()) + if err != nil { + return nil, fmt.Errorf("delegating_resolver: failed to determine proxy URL for target %s: %v", target, err) + } + + // proxy is not configured or proxy address excluded using `NO_PROXY` env + // var, so only target resolver is used. + if r.proxyURL == nil { + return targetResolverBuilder.Build(target, cc, opts) + } + + if logger.V(2) { + logger.Infof("Proxy URL detected : %s", r.proxyURL) + } + + // Resolver updates from one child may trigger calls into the other. Block + // updates until the children are initialized. + r.childMu.Lock() + defer r.childMu.Unlock() + // When the scheme is 'dns' and target resolution on client is not enabled, + // resolution should be handled by the proxy, not the client. Therefore, we + // bypass the target resolver and store the unresolved target address. + if target.URL.Scheme == "dns" && !targetResolutionEnabled { + r.targetResolverState = &resolver.State{ + Addresses: []resolver.Address{{Addr: target.Endpoint()}}, + Endpoints: []resolver.Endpoint{{Addresses: []resolver.Address{{Addr: target.Endpoint()}}}}, + } + r.updateTargetResolverState(*r.targetResolverState) + return r, nil + } + wcc := &wrappingClientConn{ + stateListener: r.updateTargetResolverState, + parent: r, + } + if r.targetResolver, err = targetResolverBuilder.Build(target, wcc, opts); err != nil { + return nil, fmt.Errorf("delegating_resolver: unable to build the resolver for target %s: %v", target, err) + } + return r, nil +} + +// proxyURIResolver creates a resolver for resolving proxy URIs using the "dns" +// scheme. It adjusts the proxyURL to conform to the "dns:///" format and builds +// a resolver with a wrappingClientConn to capture resolved addresses. +func (r *delegatingResolver) proxyURIResolver(opts resolver.BuildOptions) (resolver.Resolver, error) { + proxyBuilder := resolver.Get("dns") + if proxyBuilder == nil { + panic("delegating_resolver: resolver for proxy not found for scheme dns") + } + url := *r.proxyURL + url.Scheme = "dns" + url.Path = "/" + r.proxyURL.Host + url.Host = "" // Clear the Host field to conform to the "dns:///" format + + proxyTarget := resolver.Target{URL: url} + wcc := &wrappingClientConn{ + stateListener: r.updateProxyResolverState, + parent: r, + } + return proxyBuilder.Build(proxyTarget, wcc, opts) +} + +func (r *delegatingResolver) ResolveNow(o resolver.ResolveNowOptions) { + r.childMu.Lock() + defer r.childMu.Unlock() + r.targetResolver.ResolveNow(o) + r.proxyResolver.ResolveNow(o) +} + +func (r *delegatingResolver) Close() { + r.childMu.Lock() + defer r.childMu.Unlock() + r.targetResolver.Close() + r.targetResolver = nil + + r.proxyResolver.Close() + r.proxyResolver = nil +} + +func needsProxyResolver(state *resolver.State) bool { + for _, addr := range state.Addresses { + if !skipProxy(addr) { + return true + } + } + for _, endpoint := range state.Endpoints { + for _, addr := range endpoint.Addresses { + if !skipProxy(addr) { + return true + } + } + } + return false +} + +func skipProxy(address resolver.Address) bool { + // Avoid proxy when network is not tcp. + networkType, ok := networktype.Get(address) + if !ok { + networkType, _ = transport.ParseDialTarget(address.Addr) + } + if networkType != "tcp" { + return true + } + + req := &http.Request{URL: &url.URL{ + Scheme: "https", + Host: address.Addr, + }} + // Avoid proxy when address included in `NO_PROXY` environment variable or + // fails to get the proxy address. + url, err := HTTPSProxyFromEnvironment(req) + if err != nil || url == nil { + return true + } + return false +} + +// updateClientConnStateLocked constructs a combined list of addresses by +// pairing each proxy address with every target address of type TCP. For each +// pair, it creates a new [resolver.Address] using the proxy address and +// attaches the corresponding target address and user info as attributes. Target +// addresses that are not of type TCP are appended to the list as-is. The +// function returns nil if either resolver has not yet provided an update, and +// returns the result of ClientConn.UpdateState once both resolvers have +// provided at least one update. +func (r *delegatingResolver) updateClientConnStateLocked() error { + if r.targetResolverState == nil || r.proxyAddrs == nil { + return nil + } + + // If multiple resolved proxy addresses are present, we send only the + // unresolved proxy host and let net.Dial handle the proxy host name + // resolution when creating the transport. Sending all resolved addresses + // would increase the number of addresses passed to the ClientConn and + // subsequently to load balancing (LB) policies like Round Robin, leading + // to additional TCP connections. However, if there's only one resolved + // proxy address, we send it directly, as it doesn't affect the address + // count returned by the target resolver and the address count sent to the + // ClientConn. + var proxyAddr resolver.Address + if len(r.proxyAddrs) == 1 { + proxyAddr = r.proxyAddrs[0] + } else { + proxyAddr = resolver.Address{Addr: r.proxyURL.Host} + } + var addresses []resolver.Address + for _, targetAddr := range (*r.targetResolverState).Addresses { + if skipProxy(targetAddr) { + addresses = append(addresses, targetAddr) + continue + } + addresses = append(addresses, proxyattributes.Set(proxyAddr, proxyattributes.Options{ + User: r.proxyURL.User, + ConnectAddr: targetAddr.Addr, + })) + } + + // For each target endpoint, construct a new [resolver.Endpoint] that + // includes all addresses from all proxy endpoints and the addresses from + // that target endpoint, preserving the number of target endpoints. + var endpoints []resolver.Endpoint + for _, endpt := range (*r.targetResolverState).Endpoints { + var addrs []resolver.Address + for _, targetAddr := range endpt.Addresses { + // Avoid proxy when network is not tcp. + if skipProxy(targetAddr) { + addrs = append(addrs, targetAddr) + continue + } + for _, proxyAddr := range r.proxyAddrs { + addrs = append(addrs, proxyattributes.Set(proxyAddr, proxyattributes.Options{ + User: r.proxyURL.User, + ConnectAddr: targetAddr.Addr, + })) + } + } + endpoints = append(endpoints, resolver.Endpoint{Addresses: addrs}) + } + // Use the targetResolverState for its service config and attributes + // contents. The state update is only sent after both the target and proxy + // resolvers have sent their updates, and curState has been updated with the + // combined addresses. + curState := *r.targetResolverState + curState.Addresses = addresses + curState.Endpoints = endpoints + return r.cc.UpdateState(curState) +} + +// updateProxyResolverState updates the proxy resolver state by storing proxy +// addresses and endpoints, marking the resolver as ready, and triggering a +// state update if both proxy and target resolvers are ready. If the ClientConn +// returns a non-nil error, it calls `ResolveNow()` on the target resolver. It +// is a StateListener function of wrappingClientConn passed to the proxy +// resolver. +func (r *delegatingResolver) updateProxyResolverState(state resolver.State) error { + r.mu.Lock() + defer r.mu.Unlock() + if logger.V(2) { + logger.Infof("Addresses received from proxy resolver: %s", state.Addresses) + } + if len(state.Endpoints) > 0 { + // We expect exactly one address per endpoint because the proxy resolver + // uses "dns" resolution. + r.proxyAddrs = make([]resolver.Address, 0, len(state.Endpoints)) + for _, endpoint := range state.Endpoints { + r.proxyAddrs = append(r.proxyAddrs, endpoint.Addresses...) + } + } else if state.Addresses != nil { + r.proxyAddrs = state.Addresses + } else { + r.proxyAddrs = []resolver.Address{} // ensure proxyAddrs is non-nil to indicate an update has been received + } + err := r.updateClientConnStateLocked() + // Another possible approach was to block until updates are received from + // both resolvers. But this is not used because calling `New()` triggers + // `Build()` for the first resolver, which calls `UpdateState()`. And the + // second resolver hasn't sent an update yet, so it would cause `New()` to + // block indefinitely. + if err != nil { + go func() { + r.childMu.Lock() + defer r.childMu.Unlock() + if r.targetResolver != nil { + r.targetResolver.ResolveNow(resolver.ResolveNowOptions{}) + } + }() + } + return err +} + +// updateTargetResolverState is the StateListener function provided to the +// target resolver via wrappingClientConn. It updates the resolver state and +// marks the target resolver as ready. If the update includes at least one TCP +// address and the proxy resolver has not yet been constructed, it initializes +// the proxy resolver. A combined state update is triggered once both resolvers +// are ready. If all addresses are non-TCP, it proceeds without waiting for the +// proxy resolver. If ClientConn.UpdateState returns a non-nil error, +// ResolveNow() is called on the proxy resolver. +func (r *delegatingResolver) updateTargetResolverState(state resolver.State) error { + r.mu.Lock() + defer r.mu.Unlock() + + if logger.V(2) { + logger.Infof("Addresses received from target resolver: %v", state.Addresses) + } + r.targetResolverState = &state + // If all addresses returned by the target resolver have a non-TCP network + // type, or are listed in the `NO_PROXY` environment variable, do not wait + // for proxy update. + if !needsProxyResolver(r.targetResolverState) { + return r.cc.UpdateState(*r.targetResolverState) + } + + // The proxy resolver may be rebuilt multiple times, specifically each time + // the target resolver sends an update, even if the target resolver is built + // successfully but building the proxy resolver fails. + if len(r.proxyAddrs) == 0 { + go func() { + r.childMu.Lock() + defer r.childMu.Unlock() + if _, ok := r.proxyResolver.(nopResolver); !ok { + return + } + proxyResolver, err := r.proxyURIResolver(resolver.BuildOptions{}) + if err != nil { + r.cc.ReportError(fmt.Errorf("delegating_resolver: unable to build the proxy resolver: %v", err)) + return + } + r.proxyResolver = proxyResolver + }() + } + + err := r.updateClientConnStateLocked() + if err != nil { + go func() { + r.childMu.Lock() + defer r.childMu.Unlock() + if r.proxyResolver != nil { + r.proxyResolver.ResolveNow(resolver.ResolveNowOptions{}) + } + }() + } + return nil +} + +// wrappingClientConn serves as an intermediary between the parent ClientConn +// and the child resolvers created here. It implements the resolver.ClientConn +// interface and is passed in that capacity to the child resolvers. +type wrappingClientConn struct { + // Callback to deliver resolver state updates + stateListener func(state resolver.State) error + parent *delegatingResolver +} + +// UpdateState receives resolver state updates and forwards them to the +// appropriate listener function (either for the proxy or target resolver). +func (wcc *wrappingClientConn) UpdateState(state resolver.State) error { + return wcc.stateListener(state) +} + +// ReportError intercepts errors from the child resolvers and passes them to +// ClientConn. +func (wcc *wrappingClientConn) ReportError(err error) { + wcc.parent.cc.ReportError(err) +} + +// NewAddress intercepts the new resolved address from the child resolvers and +// passes them to ClientConn. +func (wcc *wrappingClientConn) NewAddress(addrs []resolver.Address) { + wcc.UpdateState(resolver.State{Addresses: addrs}) +} + +// ParseServiceConfig parses the provided service config and returns an object +// that provides the parsed config. +func (wcc *wrappingClientConn) ParseServiceConfig(serviceConfigJSON string) *serviceconfig.ParseResult { + return wcc.parent.cc.ParseServiceConfig(serviceConfigJSON) +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go index abab35e250..ada5251cff 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go @@ -24,7 +24,9 @@ import ( "context" "encoding/json" "fmt" + rand "math/rand/v2" "net" + "net/netip" "os" "strconv" "strings" @@ -35,28 +37,35 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal/backoff" "google.golang.org/grpc/internal/envconfig" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/resolver/dns/internal" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" ) -// EnableSRVLookups controls whether the DNS resolver attempts to fetch gRPCLB -// addresses from SRV records. Must not be changed after init time. -var EnableSRVLookups = false +var ( + // EnableSRVLookups controls whether the DNS resolver attempts to fetch gRPCLB + // addresses from SRV records. Must not be changed after init time. + EnableSRVLookups = false -// ResolvingTimeout specifies the maximum duration for a DNS resolution request. -// If the timeout expires before a response is received, the request will be canceled. -// -// It is recommended to set this value at application startup. Avoid modifying this variable -// after initialization as it's not thread-safe for concurrent modification. -var ResolvingTimeout = 30 * time.Second + // MinResolutionInterval is the minimum interval at which re-resolutions are + // allowed. This helps to prevent excessive re-resolution. + MinResolutionInterval = 30 * time.Second -var logger = grpclog.Component("dns") + // ResolvingTimeout specifies the maximum duration for a DNS resolution request. + // If the timeout expires before a response is received, the request will be canceled. + // + // It is recommended to set this value at application startup. Avoid modifying this variable + // after initialization as it's not thread-safe for concurrent modification. + ResolvingTimeout = 30 * time.Second + + logger = grpclog.Component("dns") +) func init() { resolver.Register(NewBuilder()) internal.TimeAfterFunc = time.After + internal.TimeNowFunc = time.Now + internal.TimeUntilFunc = time.Until internal.NewNetResolver = newNetResolver internal.AddressDialer = addressDialer } @@ -114,7 +123,7 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts } // IP address. - if ipAddr, ok := formatIP(host); ok { + if ipAddr, err := formatIP(host); err == nil { addr := []resolver.Address{{Addr: ipAddr + ":" + port}} cc.UpdateState(resolver.State{Addresses: addr}) return deadResolver{}, nil @@ -123,13 +132,13 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts // DNS address (non-IP). ctx, cancel := context.WithCancel(context.Background()) d := &dnsResolver{ - host: host, - port: port, - ctx: ctx, - cancel: cancel, - cc: cc, - rn: make(chan struct{}, 1), - disableServiceConfig: opts.DisableServiceConfig, + host: host, + port: port, + ctx: ctx, + cancel: cancel, + cc: cc, + rn: make(chan struct{}, 1), + enableServiceConfig: envconfig.EnableTXTServiceConfig && !opts.DisableServiceConfig, } d.resolver, err = internal.NewNetResolver(target.URL.Host) @@ -169,11 +178,11 @@ type dnsResolver struct { // finished. Otherwise, data race will be possible. [Race Example] in // dns_resolver_test we replace the real lookup functions with mocked ones to // facilitate testing. If Close() doesn't wait for watcher() goroutine - // finishes, race detector sometimes will warns lookup (READ the lookup + // finishes, race detector sometimes will warn lookup (READ the lookup // function pointers) inside watcher() goroutine has data race with // replaceNetFunc (WRITE the lookup function pointers). - wg sync.WaitGroup - disableServiceConfig bool + wg sync.WaitGroup + enableServiceConfig bool } // ResolveNow invoke an immediate resolution of the target that this @@ -203,12 +212,12 @@ func (d *dnsResolver) watcher() { err = d.cc.UpdateState(*state) } - var waitTime time.Duration + var nextResolutionTime time.Time if err == nil { // Success resolving, wait for the next ResolveNow. However, also wait 30 // seconds at the very least to prevent constantly re-resolving. backoffIndex = 1 - waitTime = internal.MinResolutionRate + nextResolutionTime = internal.TimeNowFunc().Add(MinResolutionInterval) select { case <-d.ctx.Done(): return @@ -217,19 +226,21 @@ func (d *dnsResolver) watcher() { } else { // Poll on an error found in DNS Resolver or an error received from // ClientConn. - waitTime = backoff.DefaultExponential.Backoff(backoffIndex) + nextResolutionTime = internal.TimeNowFunc().Add(backoff.DefaultExponential.Backoff(backoffIndex)) backoffIndex++ } select { case <-d.ctx.Done(): return - case <-internal.TimeAfterFunc(waitTime): + case <-internal.TimeAfterFunc(internal.TimeUntilFunc(nextResolutionTime)): } } } func (d *dnsResolver) lookupSRV(ctx context.Context) ([]resolver.Address, error) { - if !EnableSRVLookups { + // Skip this particular host to avoid timeouts with some versions of + // systemd-resolved. + if !EnableSRVLookups || d.host == "metadata.google.internal." { return nil, nil } var newAddrs []resolver.Address @@ -250,9 +261,9 @@ func (d *dnsResolver) lookupSRV(ctx context.Context) ([]resolver.Address, error) return nil, err } for _, a := range lbAddrs { - ip, ok := formatIP(a) - if !ok { - return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + ip, err := formatIP(a) + if err != nil { + return nil, fmt.Errorf("dns: error parsing A record IP address %v: %v", a, err) } addr := ip + ":" + strconv.Itoa(int(s.Port)) newAddrs = append(newAddrs, resolver.Address{Addr: addr, ServerName: s.Target}) @@ -312,9 +323,9 @@ func (d *dnsResolver) lookupHost(ctx context.Context) ([]resolver.Address, error } newAddrs := make([]resolver.Address, 0, len(addrs)) for _, a := range addrs { - ip, ok := formatIP(a) - if !ok { - return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + ip, err := formatIP(a) + if err != nil { + return nil, fmt.Errorf("dns: error parsing A record IP address %v: %v", a, err) } addr := ip + ":" + d.port newAddrs = append(newAddrs, resolver.Address{Addr: addr}) @@ -335,25 +346,25 @@ func (d *dnsResolver) lookup() (*resolver.State, error) { if len(srv) > 0 { state = grpclbstate.Set(state, &grpclbstate.State{BalancerAddresses: srv}) } - if !d.disableServiceConfig { + if d.enableServiceConfig { state.ServiceConfig = d.lookupTXT(ctx) } return &state, nil } -// formatIP returns ok = false if addr is not a valid textual representation of -// an IP address. If addr is an IPv4 address, return the addr and ok = true. +// formatIP returns an error if addr is not a valid textual representation of +// an IP address. If addr is an IPv4 address, return the addr and error = nil. // If addr is an IPv6 address, return the addr enclosed in square brackets and -// ok = true. -func formatIP(addr string) (addrIP string, ok bool) { - ip := net.ParseIP(addr) - if ip == nil { - return "", false +// error = nil. +func formatIP(addr string) (string, error) { + ip, err := netip.ParseAddr(addr) + if err != nil { + return "", err } - if ip.To4() != nil { - return addr, true + if ip.Is4() { + return addr, nil } - return "[" + addr + "]", true + return "[" + addr + "]", nil } // parseTarget takes the user input target string and default port, returns @@ -369,7 +380,7 @@ func parseTarget(target, defaultPort string) (host, port string, err error) { if target == "" { return "", "", internal.ErrMissingAddr } - if ip := net.ParseIP(target); ip != nil { + if _, err := netip.ParseAddr(target); err == nil { // target is an IPv4 or IPv6(without brackets) address return target, defaultPort, nil } @@ -417,7 +428,7 @@ func chosenByPercentage(a *int) bool { if a == nil { return true } - return grpcrand.Intn(100)+1 <= *a + return rand.IntN(100)+1 <= *a } func canaryingSC(js string) string { diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go b/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go index c7fc557d00..c0eae4f5f8 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go @@ -28,7 +28,7 @@ import ( // NetResolver groups the methods on net.Resolver that are used by the DNS // resolver implementation. This allows the default net.Resolver instance to be -// overidden from tests. +// overridden from tests. type NetResolver interface { LookupHost(ctx context.Context, host string) (addrs []string, err error) LookupSRV(ctx context.Context, service, proto, name string) (cname string, addrs []*net.SRV, err error) @@ -50,16 +50,23 @@ var ( // The following vars are overridden from tests. var ( - // MinResolutionRate is the minimum rate at which re-resolutions are - // allowed. This helps to prevent excessive re-resolution. - MinResolutionRate = 30 * time.Second - // TimeAfterFunc is used by the DNS resolver to wait for the given duration - // to elapse. In non-test code, this is implemented by time.After. In test + // to elapse. In non-test code, this is implemented by time.After. In test // code, this can be used to control the amount of time the resolver is // blocked waiting for the duration to elapse. TimeAfterFunc func(time.Duration) <-chan time.Time + // TimeNowFunc is used by the DNS resolver to get the current time. + // In non-test code, this is implemented by time.Now. In test code, + // this can be used to control the current time for the resolver. + TimeNowFunc func() time.Time + + // TimeUntilFunc is used by the DNS resolver to calculate the remaining + // wait time for re-resolution. In non-test code, this is implemented by + // time.Until. In test code, this can be used to control the remaining + // time for resolver to wait for re-resolution. + TimeUntilFunc func(time.Time) time.Duration + // NewNetResolver returns the net.Resolver instance for the given target. NewNetResolver func(string) (NetResolver, error) diff --git a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go index afac56572a..b901c7bace 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go +++ b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go @@ -55,7 +55,7 @@ func (r *passthroughResolver) start() { r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint()}}}) } -func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOptions) {} +func (*passthroughResolver) ResolveNow(resolver.ResolveNowOptions) {} func (*passthroughResolver) Close() {} diff --git a/vendor/google.golang.org/grpc/internal/stats/labels.go b/vendor/google.golang.org/grpc/internal/stats/labels.go new file mode 100644 index 0000000000..fd33af51ae --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/stats/labels.go @@ -0,0 +1,42 @@ +/* + * + * Copyright 2024 gRPC 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 stats provides internal stats related functionality. +package stats + +import "context" + +// Labels are the labels for metrics. +type Labels struct { + // TelemetryLabels are the telemetry labels to record. + TelemetryLabels map[string]string +} + +type labelsKey struct{} + +// GetLabels returns the Labels stored in the context, or nil if there is one. +func GetLabels(ctx context.Context) *Labels { + labels, _ := ctx.Value(labelsKey{}).(*Labels) + return labels +} + +// SetLabels sets the Labels in the context. +func SetLabels(ctx context.Context, labels *Labels) context.Context { + // could also append + return context.WithValue(ctx, labelsKey{}, labels) +} diff --git a/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go b/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go new file mode 100644 index 0000000000..79044657be --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go @@ -0,0 +1,105 @@ +/* + * Copyright 2024 gRPC 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 stats + +import ( + "fmt" + + estats "google.golang.org/grpc/experimental/stats" + "google.golang.org/grpc/stats" +) + +// MetricsRecorderList forwards Record calls to all of its metricsRecorders. +// +// It eats any record calls where the label values provided do not match the +// number of label keys. +type MetricsRecorderList struct { + // metricsRecorders are the metrics recorders this list will forward to. + metricsRecorders []estats.MetricsRecorder +} + +// NewMetricsRecorderList creates a new metric recorder list with all the stats +// handlers provided which implement the MetricsRecorder interface. +// If no stats handlers provided implement the MetricsRecorder interface, +// the MetricsRecorder list returned is a no-op. +func NewMetricsRecorderList(shs []stats.Handler) *MetricsRecorderList { + var mrs []estats.MetricsRecorder + for _, sh := range shs { + if mr, ok := sh.(estats.MetricsRecorder); ok { + mrs = append(mrs, mr) + } + } + return &MetricsRecorderList{ + metricsRecorders: mrs, + } +} + +func verifyLabels(desc *estats.MetricDescriptor, labelsRecv ...string) { + if got, want := len(labelsRecv), len(desc.Labels)+len(desc.OptionalLabels); got != want { + panic(fmt.Sprintf("Received %d labels in call to record metric %q, but expected %d.", got, desc.Name, want)) + } +} + +// RecordInt64Count records the measurement alongside labels on the int +// count associated with the provided handle. +func (l *MetricsRecorderList) RecordInt64Count(handle *estats.Int64CountHandle, incr int64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordInt64Count(handle, incr, labels...) + } +} + +// RecordFloat64Count records the measurement alongside labels on the float +// count associated with the provided handle. +func (l *MetricsRecorderList) RecordFloat64Count(handle *estats.Float64CountHandle, incr float64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordFloat64Count(handle, incr, labels...) + } +} + +// RecordInt64Histo records the measurement alongside labels on the int +// histo associated with the provided handle. +func (l *MetricsRecorderList) RecordInt64Histo(handle *estats.Int64HistoHandle, incr int64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordInt64Histo(handle, incr, labels...) + } +} + +// RecordFloat64Histo records the measurement alongside labels on the float +// histo associated with the provided handle. +func (l *MetricsRecorderList) RecordFloat64Histo(handle *estats.Float64HistoHandle, incr float64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordFloat64Histo(handle, incr, labels...) + } +} + +// RecordInt64Gauge records the measurement alongside labels on the int +// gauge associated with the provided handle. +func (l *MetricsRecorderList) RecordInt64Gauge(handle *estats.Int64GaugeHandle, incr int64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordInt64Gauge(handle, incr, labels...) + } +} diff --git a/vendor/google.golang.org/grpc/internal/status/status.go b/vendor/google.golang.org/grpc/internal/status/status.go index c7dbc82059..aad171cd02 100644 --- a/vendor/google.golang.org/grpc/internal/status/status.go +++ b/vendor/google.golang.org/grpc/internal/status/status.go @@ -138,17 +138,19 @@ func (s *Status) WithDetails(details ...protoadapt.MessageV1) (*Status, error) { // s.Code() != OK implies that s.Proto() != nil. p := s.Proto() for _, detail := range details { - any, err := anypb.New(protoadapt.MessageV2Of(detail)) + m, err := anypb.New(protoadapt.MessageV2Of(detail)) if err != nil { return nil, err } - p.Details = append(p.Details, any) + p.Details = append(p.Details, m) } return &Status{s: p}, nil } // Details returns a slice of details messages attached to the status. // If a detail cannot be decoded, the error is returned in place of the detail. +// If the detail can be decoded, the proto message returned is of the same +// type that was given to WithDetails(). func (s *Status) Details() []any { if s == nil || s.s == nil { return nil @@ -160,7 +162,38 @@ func (s *Status) Details() []any { details = append(details, err) continue } - details = append(details, detail) + // The call to MessageV1Of is required to unwrap the proto message if + // it implemented only the MessageV1 API. The proto message would have + // been wrapped in a V2 wrapper in Status.WithDetails. V2 messages are + // added to a global registry used by any.UnmarshalNew(). + // MessageV1Of has the following behaviour: + // 1. If the given message is a wrapped MessageV1, it returns the + // unwrapped value. + // 2. If the given message already implements MessageV1, it returns it + // as is. + // 3. Else, it wraps the MessageV2 in a MessageV1 wrapper. + // + // Since the Status.WithDetails() API only accepts MessageV1, calling + // MessageV1Of ensures we return the same type that was given to + // WithDetails: + // * If the give type implemented only MessageV1, the unwrapping from + // point 1 above will restore the type. + // * If the given type implemented both MessageV1 and MessageV2, point 2 + // above will ensure no wrapping is performed. + // * If the given type implemented only MessageV2 and was wrapped using + // MessageV1Of before passing to WithDetails(), it would be unwrapped + // in WithDetails by calling MessageV2Of(). Point 3 above will ensure + // that the type is wrapped in a MessageV1 wrapper again before + // returning. Note that protoc-gen-go doesn't generate code which + // implements ONLY MessageV2 at the time of writing. + // + // NOTE: Status details can also be added using the FromProto method. + // This could theoretically allow passing a Detail message that only + // implements the V2 API. In such a case the message will be wrapped in + // a MessageV1 wrapper when fetched using Details(). + // Since protoc-gen-go generates only code that implements both V1 and + // V2 APIs for backward compatibility, this is not a concern. + details = append(details, protoadapt.MessageV1Of(detail)) } return details } @@ -203,3 +236,11 @@ func IsRestrictedControlPlaneCode(s *Status) bool { } return false } + +// RawStatusProto returns the internal protobuf message for use by gRPC itself. +func RawStatusProto(s *Status) *spb.Status { + if s == nil { + return nil + } + return s.s +} diff --git a/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go index 999f52cd75..54c24c2ff3 100644 --- a/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go +++ b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go @@ -58,20 +58,20 @@ func GetRusage() *Rusage { // CPUTimeDiff returns the differences of user CPU time and system CPU time used // between two Rusage structs. It a no-op function for non-linux environments. -func CPUTimeDiff(first *Rusage, latest *Rusage) (float64, float64) { +func CPUTimeDiff(*Rusage, *Rusage) (float64, float64) { log() return 0, 0 } // SetTCPUserTimeout is a no-op function under non-linux environments. -func SetTCPUserTimeout(conn net.Conn, timeout time.Duration) error { +func SetTCPUserTimeout(net.Conn, time.Duration) error { log() return nil } // GetTCPUserTimeout is a no-op function under non-linux environments. // A negative return value indicates the operation is not supported -func GetTCPUserTimeout(conn net.Conn) (int, error) { +func GetTCPUserTimeout(net.Conn) (int, error) { log() return -1, nil } diff --git a/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go b/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go index 078137b7fd..7e7aaa5463 100644 --- a/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go +++ b/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go @@ -44,7 +44,7 @@ func NetDialerWithTCPKeepalive() *net.Dialer { // combination of unconditionally enabling TCP keepalives here, and // disabling the overriding of TCP keepalive parameters by setting the // KeepAlive field to a negative value above, results in OS defaults for - // the TCP keealive interval and time parameters. + // the TCP keepalive interval and time parameters. Control: func(_, _ string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_KEEPALIVE, 1) diff --git a/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go b/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go index fd7d43a890..d5c1085eea 100644 --- a/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go +++ b/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go @@ -44,7 +44,7 @@ func NetDialerWithTCPKeepalive() *net.Dialer { // combination of unconditionally enabling TCP keepalives here, and // disabling the overriding of TCP keepalive parameters by setting the // KeepAlive field to a negative value above, results in OS defaults for - // the TCP keealive interval and time parameters. + // the TCP keepalive interval and time parameters. Control: func(_, _ string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_KEEPALIVE, 1) diff --git a/vendor/google.golang.org/grpc/internal/transport/client_stream.go b/vendor/google.golang.org/grpc/internal/transport/client_stream.go new file mode 100644 index 0000000000..ccc0e017e5 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/client_stream.go @@ -0,0 +1,144 @@ +/* + * + * Copyright 2024 gRPC 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 transport + +import ( + "sync/atomic" + + "golang.org/x/net/http2" + "google.golang.org/grpc/mem" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// ClientStream implements streaming functionality for a gRPC client. +type ClientStream struct { + *Stream // Embed for common stream functionality. + + ct *http2Client + done chan struct{} // closed at the end of stream to unblock writers. + doneFunc func() // invoked at the end of stream. + + headerChan chan struct{} // closed to indicate the end of header metadata. + headerChanClosed uint32 // set when headerChan is closed. Used to avoid closing headerChan multiple times. + // headerValid indicates whether a valid header was received. Only + // meaningful after headerChan is closed (always call waitOnHeader() before + // reading its value). + headerValid bool + header metadata.MD // the received header metadata + noHeaders bool // set if the client never received headers (set only after the stream is done). + + bytesReceived atomic.Bool // indicates whether any bytes have been received on this stream + unprocessed atomic.Bool // set if the server sends a refused stream or GOAWAY including this stream + + status *status.Status // the status error received from the server +} + +// Read reads an n byte message from the input stream. +func (s *ClientStream) Read(n int) (mem.BufferSlice, error) { + b, err := s.Stream.read(n) + if err == nil { + s.ct.incrMsgRecv() + } + return b, err +} + +// Close closes the stream and propagates err to any readers. +func (s *ClientStream) Close(err error) { + var ( + rst bool + rstCode http2.ErrCode + ) + if err != nil { + rst = true + rstCode = http2.ErrCodeCancel + } + s.ct.closeStream(s, err, rst, rstCode, status.Convert(err), nil, false) +} + +// Write writes the hdr and data bytes to the output stream. +func (s *ClientStream) Write(hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { + return s.ct.write(s, hdr, data, opts) +} + +// BytesReceived indicates whether any bytes have been received on this stream. +func (s *ClientStream) BytesReceived() bool { + return s.bytesReceived.Load() +} + +// Unprocessed indicates whether the server did not process this stream -- +// i.e. it sent a refused stream or GOAWAY including this stream ID. +func (s *ClientStream) Unprocessed() bool { + return s.unprocessed.Load() +} + +func (s *ClientStream) waitOnHeader() { + select { + case <-s.ctx.Done(): + // Close the stream to prevent headers/trailers from changing after + // this function returns. + s.Close(ContextErr(s.ctx.Err())) + // headerChan could possibly not be closed yet if closeStream raced + // with operateHeaders; wait until it is closed explicitly here. + <-s.headerChan + case <-s.headerChan: + } +} + +// RecvCompress returns the compression algorithm applied to the inbound +// message. It is empty string if there is no compression applied. +func (s *ClientStream) RecvCompress() string { + s.waitOnHeader() + return s.recvCompress +} + +// Done returns a channel which is closed when it receives the final status +// from the server. +func (s *ClientStream) Done() <-chan struct{} { + return s.done +} + +// Header returns the header metadata of the stream. Acquires the key-value +// pairs of header metadata once it is available. It blocks until i) the +// metadata is ready or ii) there is no header metadata or iii) the stream is +// canceled/expired. +func (s *ClientStream) Header() (metadata.MD, error) { + s.waitOnHeader() + + if !s.headerValid || s.noHeaders { + return nil, s.status.Err() + } + + return s.header.Copy(), nil +} + +// TrailersOnly blocks until a header or trailers-only frame is received and +// then returns true if the stream was trailers-only. If the stream ends +// before headers are received, returns true, nil. +func (s *ClientStream) TrailersOnly() bool { + s.waitOnHeader() + return s.noHeaders +} + +// Status returns the status received from the server. +// Status can be read safely only after the stream has ended, +// that is, after Done() is closed. +func (s *ClientStream) Status() *status.Status { + return s.status +} diff --git a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go index 83c3829826..a2831e5d01 100644 --- a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go +++ b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go @@ -32,6 +32,7 @@ import ( "golang.org/x/net/http2/hpack" "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" + "google.golang.org/grpc/mem" "google.golang.org/grpc/status" ) @@ -39,6 +40,13 @@ var updateHeaderTblSize = func(e *hpack.Encoder, v uint32) { e.SetMaxDynamicTableSizeLimit(v) } +// itemNodePool is used to reduce heap allocations. +var itemNodePool = sync.Pool{ + New: func() any { + return &itemNode{} + }, +} + type itemNode struct { it any next *itemNode @@ -50,7 +58,9 @@ type itemList struct { } func (il *itemList) enqueue(i any) { - n := &itemNode{it: i} + n := itemNodePool.Get().(*itemNode) + n.next = nil + n.it = i if il.tail == nil { il.head, il.tail = n, n return @@ -70,7 +80,9 @@ func (il *itemList) dequeue() any { return nil } i := il.head.it + temp := il.head il.head = il.head.next + itemNodePool.Put(temp) if il.head == nil { il.tail = nil } @@ -145,12 +157,13 @@ type earlyAbortStream struct { func (*earlyAbortStream) isTransportResponseFrame() bool { return false } type dataFrame struct { - streamID uint32 - endStream bool - h []byte - d []byte + streamID uint32 + endStream bool + h []byte + data mem.BufferSlice + processing bool // onEachWrite is called every time - // a part of d is written out. + // a part of data is written out. onEachWrite func() } @@ -193,7 +206,7 @@ type goAway struct { code http2.ErrCode debugData []byte headsUp bool - closeConn error // if set, loopyWriter will exit, resulting in conn closure + closeConn error // if set, loopyWriter will exit with this error } func (*goAway) isTransportResponseFrame() bool { return false } @@ -233,6 +246,7 @@ type outStream struct { itl *itemList bytesOutStanding int wq *writeQuota + reader mem.Reader next *outStream prev *outStream @@ -289,18 +303,22 @@ func (l *outStreamList) dequeue() *outStream { } // controlBuffer is a way to pass information to loopy. -// Information is passed as specific struct types called control frames. -// A control frame not only represents data, messages or headers to be sent out -// but can also be used to instruct loopy to update its internal state. -// It shouldn't be confused with an HTTP2 frame, although some of the control frames -// like dataFrame and headerFrame do go out on wire as HTTP2 frames. +// +// Information is passed as specific struct types called control frames. A +// control frame not only represents data, messages or headers to be sent out +// but can also be used to instruct loopy to update its internal state. It +// shouldn't be confused with an HTTP2 frame, although some of the control +// frames like dataFrame and headerFrame do go out on wire as HTTP2 frames. type controlBuffer struct { - ch chan struct{} - done <-chan struct{} + wakeupCh chan struct{} // Unblocks readers waiting for something to read. + done <-chan struct{} // Closed when the transport is done. + + // Mutex guards all the fields below, except trfChan which can be read + // atomically without holding mu. mu sync.Mutex - consumerWaiting bool - list *itemList - err error + consumerWaiting bool // True when readers are blocked waiting for new data. + closed bool // True when the controlbuf is finished. + list *itemList // List of queued control frames. // transportResponseFrames counts the number of queued items that represent // the response of an action initiated by the peer. trfChan is created @@ -308,47 +326,59 @@ type controlBuffer struct { // closed and nilled when transportResponseFrames drops below the // threshold. Both fields are protected by mu. transportResponseFrames int - trfChan atomic.Value // chan struct{} + trfChan atomic.Pointer[chan struct{}] } func newControlBuffer(done <-chan struct{}) *controlBuffer { return &controlBuffer{ - ch: make(chan struct{}, 1), - list: &itemList{}, - done: done, + wakeupCh: make(chan struct{}, 1), + list: &itemList{}, + done: done, } } -// throttle blocks if there are too many incomingSettings/cleanupStreams in the -// controlbuf. +// throttle blocks if there are too many frames in the control buf that +// represent the response of an action initiated by the peer, like +// incomingSettings cleanupStreams etc. func (c *controlBuffer) throttle() { - ch, _ := c.trfChan.Load().(chan struct{}) - if ch != nil { + if ch := c.trfChan.Load(); ch != nil { select { - case <-ch: + case <-(*ch): case <-c.done: } } } +// put adds an item to the controlbuf. func (c *controlBuffer) put(it cbItem) error { _, err := c.executeAndPut(nil, it) return err } -func (c *controlBuffer) executeAndPut(f func(it any) bool, it cbItem) (bool, error) { - var wakeUp bool +// executeAndPut runs f, and if the return value is true, adds the given item to +// the controlbuf. The item could be nil, in which case, this method simply +// executes f and does not add the item to the controlbuf. +// +// The first return value indicates whether the item was successfully added to +// the control buffer. A non-nil error, specifically ErrConnClosing, is returned +// if the control buffer is already closed. +func (c *controlBuffer) executeAndPut(f func() bool, it cbItem) (bool, error) { c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return false, c.err + defer c.mu.Unlock() + + if c.closed { + return false, ErrConnClosing } if f != nil { - if !f(it) { // f wasn't successful - c.mu.Unlock() + if !f() { // f wasn't successful return false, nil } } + if it == nil { + return true, nil + } + + var wakeUp bool if c.consumerWaiting { wakeUp = true c.consumerWaiting = false @@ -359,98 +389,104 @@ func (c *controlBuffer) executeAndPut(f func(it any) bool, it cbItem) (bool, err if c.transportResponseFrames == maxQueuedTransportResponseFrames { // We are adding the frame that puts us over the threshold; create // a throttling channel. - c.trfChan.Store(make(chan struct{})) + ch := make(chan struct{}) + c.trfChan.Store(&ch) } } - c.mu.Unlock() if wakeUp { select { - case c.ch <- struct{}{}: + case c.wakeupCh <- struct{}{}: default: } } return true, nil } -// Note argument f should never be nil. -func (c *controlBuffer) execute(f func(it any) bool, it any) (bool, error) { - c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return false, c.err - } - if !f(it) { // f wasn't successful - c.mu.Unlock() - return false, nil - } - c.mu.Unlock() - return true, nil -} - +// get returns the next control frame from the control buffer. If block is true +// **and** there are no control frames in the control buffer, the call blocks +// until one of the conditions is met: there is a frame to return or the +// transport is closed. func (c *controlBuffer) get(block bool) (any, error) { for { c.mu.Lock() - if c.err != nil { + frame, err := c.getOnceLocked() + if frame != nil || err != nil || !block { + // If we read a frame or an error, we can return to the caller. The + // call to getOnceLocked() returns a nil frame and a nil error if + // there is nothing to read, and in that case, if the caller asked + // us not to block, we can return now as well. c.mu.Unlock() - return nil, c.err - } - if !c.list.isEmpty() { - h := c.list.dequeue().(cbItem) - if h.isTransportResponseFrame() { - if c.transportResponseFrames == maxQueuedTransportResponseFrames { - // We are removing the frame that put us over the - // threshold; close and clear the throttling channel. - ch := c.trfChan.Load().(chan struct{}) - close(ch) - c.trfChan.Store((chan struct{})(nil)) - } - c.transportResponseFrames-- - } - c.mu.Unlock() - return h, nil - } - if !block { - c.mu.Unlock() - return nil, nil + return frame, err } c.consumerWaiting = true c.mu.Unlock() + + // Release the lock above and wait to be woken up. select { - case <-c.ch: + case <-c.wakeupCh: case <-c.done: return nil, errors.New("transport closed by client") } } } +// Callers must not use this method, but should instead use get(). +// +// Caller must hold c.mu. +func (c *controlBuffer) getOnceLocked() (any, error) { + if c.closed { + return false, ErrConnClosing + } + if c.list.isEmpty() { + return nil, nil + } + h := c.list.dequeue().(cbItem) + if h.isTransportResponseFrame() { + if c.transportResponseFrames == maxQueuedTransportResponseFrames { + // We are removing the frame that put us over the + // threshold; close and clear the throttling channel. + ch := c.trfChan.Swap(nil) + close(*ch) + } + c.transportResponseFrames-- + } + return h, nil +} + +// finish closes the control buffer, cleaning up any streams that have queued +// header frames. Once this method returns, no more frames can be added to the +// control buffer, and attempts to do so will return ErrConnClosing. func (c *controlBuffer) finish() { c.mu.Lock() - if c.err != nil { - c.mu.Unlock() + defer c.mu.Unlock() + + if c.closed { return } - c.err = ErrConnClosing + c.closed = true // There may be headers for streams in the control buffer. // These streams need to be cleaned out since the transport // is still not aware of these yet. for head := c.list.dequeueAll(); head != nil; head = head.next { - hdr, ok := head.it.(*headerFrame) - if !ok { - continue - } - if hdr.onOrphaned != nil { // It will be nil on the server-side. - hdr.onOrphaned(ErrConnClosing) + switch v := head.it.(type) { + case *headerFrame: + if v.onOrphaned != nil { // It will be nil on the server-side. + v.onOrphaned(ErrConnClosing) + } + case *dataFrame: + if !v.processing { + v.data.Free() + } } } + // In case throttle() is currently in flight, it needs to be unblocked. // Otherwise, the transport may not close, since the transport is closed by // the reader encountering the connection error. - ch, _ := c.trfChan.Load().(chan struct{}) + ch := c.trfChan.Swap(nil) if ch != nil { - close(ch) + close(*ch) } - c.trfChan.Store((chan struct{})(nil)) - c.mu.Unlock() } type side int @@ -466,7 +502,7 @@ const ( // stream maintains a queue of data frames; as loopy receives data frames // it gets added to the queue of the relevant stream. // Loopy goes over this list of active streams by processing one node every iteration, -// thereby closely resemebling to a round-robin scheduling over all streams. While +// thereby closely resembling a round-robin scheduling over all streams. While // processing a stream, loopy writes out data bytes from this stream capped by the min // of http2MaxFrameLen, connection-level flow control and stream-level flow control. type loopyWriter struct { @@ -490,26 +526,29 @@ type loopyWriter struct { draining bool conn net.Conn logger *grpclog.PrefixLogger + bufferPool mem.BufferPool // Side-specific handlers ssGoAwayHandler func(*goAway) (bool, error) } -func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger) *loopyWriter { +func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger, goAwayHandler func(*goAway) (bool, error), bufferPool mem.BufferPool) *loopyWriter { var buf bytes.Buffer l := &loopyWriter{ - side: s, - cbuf: cbuf, - sendQuota: defaultWindowSize, - oiws: defaultWindowSize, - estdStreams: make(map[uint32]*outStream), - activeStreams: newOutStreamList(), - framer: fr, - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - bdpEst: bdpEst, - conn: conn, - logger: logger, + side: s, + cbuf: cbuf, + sendQuota: defaultWindowSize, + oiws: defaultWindowSize, + estdStreams: make(map[uint32]*outStream), + activeStreams: newOutStreamList(), + framer: fr, + hBuf: &buf, + hEnc: hpack.NewEncoder(&buf), + bdpEst: bdpEst, + conn: conn, + logger: logger, + ssGoAwayHandler: goAwayHandler, + bufferPool: bufferPool, } return l } @@ -626,10 +665,11 @@ func (l *loopyWriter) incomingSettingsHandler(s *incomingSettings) error { func (l *loopyWriter) registerStreamHandler(h *registerStream) { str := &outStream{ - id: h.streamID, - state: empty, - itl: &itemList{}, - wq: h.wq, + id: h.streamID, + state: empty, + itl: &itemList{}, + wq: h.wq, + reader: mem.BufferSlice{}.Reader(), } l.estdStreams[h.streamID] = str } @@ -661,10 +701,11 @@ func (l *loopyWriter) headerHandler(h *headerFrame) error { } // Case 2: Client wants to originate stream. str := &outStream{ - id: h.streamID, - state: empty, - itl: &itemList{}, - wq: h.wq, + id: h.streamID, + state: empty, + itl: &itemList{}, + wq: h.wq, + reader: mem.BufferSlice{}.Reader(), } return l.originateStream(str, h) } @@ -766,7 +807,15 @@ func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { // a RST_STREAM before stream initialization thus the stream might // not be established yet. delete(l.estdStreams, c.streamID) + str.reader.Close() str.deleteSelf() + for head := str.itl.dequeueAll(); head != nil; head = head.next { + if df, ok := head.it.(*dataFrame); ok { + if !df.processing { + df.data.Free() + } + } + } } if c.rst { // If RST_STREAM needs to be sent. if err := l.framer.fr.WriteRSTStream(c.streamID, c.rstCode); err != nil { @@ -899,19 +948,27 @@ func (l *loopyWriter) processData() (bool, error) { if str == nil { return true, nil } + reader := str.reader dataItem := str.itl.peek().(*dataFrame) // Peek at the first data item this stream. + if !dataItem.processing { + dataItem.processing = true + str.reader.Reset(dataItem.data) + dataItem.data.Free() + } // A data item is represented by a dataFrame, since it later translates into // multiple HTTP2 data frames. - // Every dataFrame has two buffers; h that keeps grpc-message header and d that is actual data. - // As an optimization to keep wire traffic low, data from d is copied to h to make as big as the - // maximum possible HTTP2 frame size. + // Every dataFrame has two buffers; h that keeps grpc-message header and data + // that is the actual message. As an optimization to keep wire traffic low, data + // from data is copied to h to make as big as the maximum possible HTTP2 frame + // size. - if len(dataItem.h) == 0 && len(dataItem.d) == 0 { // Empty data frame + if len(dataItem.h) == 0 && reader.Remaining() == 0 { // Empty data frame // Client sends out empty data frame with endStream = true if err := l.framer.fr.WriteData(dataItem.streamID, dataItem.endStream, nil); err != nil { return false, err } str.itl.dequeue() // remove the empty data item from stream + _ = reader.Close() if str.itl.isEmpty() { str.state = empty } else if trailer, ok := str.itl.peek().(*headerFrame); ok { // the next item is trailers. @@ -926,9 +983,7 @@ func (l *loopyWriter) processData() (bool, error) { } return false, nil } - var ( - buf []byte - ) + // Figure out the maximum size we can send maxSize := http2MaxFrameLen if strQuota := int(l.oiws) - str.bytesOutStanding; strQuota <= 0 { // stream-level flow control. @@ -942,43 +997,50 @@ func (l *loopyWriter) processData() (bool, error) { } // Compute how much of the header and data we can send within quota and max frame length hSize := min(maxSize, len(dataItem.h)) - dSize := min(maxSize-hSize, len(dataItem.d)) - if hSize != 0 { - if dSize == 0 { - buf = dataItem.h - } else { - // We can add some data to grpc message header to distribute bytes more equally across frames. - // Copy on the stack to avoid generating garbage - var localBuf [http2MaxFrameLen]byte - copy(localBuf[:hSize], dataItem.h) - copy(localBuf[hSize:], dataItem.d[:dSize]) - buf = localBuf[:hSize+dSize] - } + dSize := min(maxSize-hSize, reader.Remaining()) + remainingBytes := len(dataItem.h) + reader.Remaining() - hSize - dSize + size := hSize + dSize + + var buf *[]byte + + if hSize != 0 && dSize == 0 { + buf = &dataItem.h } else { - buf = dataItem.d - } + // Note: this is only necessary because the http2.Framer does not support + // partially writing a frame, so the sequence must be materialized into a buffer. + // TODO: Revisit once https://github.com/golang/go/issues/66655 is addressed. + pool := l.bufferPool + if pool == nil { + // Note that this is only supposed to be nil in tests. Otherwise, stream is + // always initialized with a BufferPool. + pool = mem.DefaultBufferPool() + } + buf = pool.Get(size) + defer pool.Put(buf) - size := hSize + dSize + copy((*buf)[:hSize], dataItem.h) + _, _ = reader.Read((*buf)[hSize:]) + } // Now that outgoing flow controls are checked we can replenish str's write quota str.wq.replenish(size) var endStream bool // If this is the last data message on this stream and all of it can be written in this iteration. - if dataItem.endStream && len(dataItem.h)+len(dataItem.d) <= size { + if dataItem.endStream && remainingBytes == 0 { endStream = true } if dataItem.onEachWrite != nil { dataItem.onEachWrite() } - if err := l.framer.fr.WriteData(dataItem.streamID, endStream, buf[:size]); err != nil { + if err := l.framer.fr.WriteData(dataItem.streamID, endStream, (*buf)[:size]); err != nil { return false, err } str.bytesOutStanding += size l.sendQuota -= uint32(size) dataItem.h = dataItem.h[hSize:] - dataItem.d = dataItem.d[dSize:] - if len(dataItem.h) == 0 && len(dataItem.d) == 0 { // All the data from that message was written out. + if remainingBytes == 0 { // All the data from that message was written out. + _ = reader.Close() str.itl.dequeue() } if str.itl.isEmpty() { @@ -997,10 +1059,3 @@ func (l *loopyWriter) processData() (bool, error) { } return false, nil } - -func min(a, b int) int { - if a < b { - return a - } - return b -} diff --git a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go index 97198c5158..dfc0f224ec 100644 --- a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go +++ b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go @@ -92,14 +92,11 @@ func (f *trInFlow) newLimit(n uint32) uint32 { func (f *trInFlow) onData(n uint32) uint32 { f.unacked += n - if f.unacked >= f.limit/4 { - w := f.unacked - f.unacked = 0 + if f.unacked < f.limit/4 { f.updateEffectiveWindowSize() - return w + return 0 } - f.updateEffectiveWindowSize() - return 0 + return f.reset() } func (f *trInFlow) reset() uint32 { diff --git a/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/vendor/google.golang.org/grpc/internal/transport/handler_server.go index 4a3ddce29a..d954a64c38 100644 --- a/vendor/google.golang.org/grpc/internal/transport/handler_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/handler_server.go @@ -24,7 +24,6 @@ package transport import ( - "bytes" "context" "errors" "fmt" @@ -40,6 +39,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -50,7 +50,7 @@ import ( // NewServerHandlerTransport returns a ServerTransport handling gRPC from // inside an http.Handler, or writes an HTTP error to w and returns an error. // It requires that the http Server supports HTTP/2. -func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []stats.Handler) (ServerTransport, error) { +func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []stats.Handler, bufferPool mem.BufferPool) (ServerTransport, error) { if r.Method != http.MethodPost { w.Header().Set("Allow", http.MethodPost) msg := fmt.Sprintf("invalid gRPC request method %q", r.Method) @@ -98,6 +98,7 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s contentType: contentType, contentSubtype: contentSubtype, stats: stats, + bufferPool: bufferPool, } st.logger = prefixLoggerForServerHandlerTransport(st) @@ -171,6 +172,8 @@ type serverHandlerTransport struct { stats []stats.Handler logger *grpclog.PrefixLogger + + bufferPool mem.BufferPool } func (ht *serverHandlerTransport) Close(err error) { @@ -222,7 +225,7 @@ func (ht *serverHandlerTransport) do(fn func()) error { } } -func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) error { +func (ht *serverHandlerTransport) writeStatus(s *ServerStream, st *status.Status) error { ht.writeStatusMu.Lock() defer ht.writeStatusMu.Unlock() @@ -244,6 +247,7 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro } s.hdrMu.Lock() + defer s.hdrMu.Unlock() if p := st.Proto(); p != nil && len(p.Details) > 0 { delete(s.trailer, grpcStatusDetailsBinHeader) stBytes, err := proto.Marshal(p) @@ -268,17 +272,18 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro } } } - s.hdrMu.Unlock() }) if err == nil { // transport has not been closed // Note: The trailer fields are compressed with hpack after this call returns. // No WireLength field is set here. + s.hdrMu.Lock() for _, sh := range ht.stats { sh.HandleRPC(s.Context(), &stats.OutTrailer{ Trailer: s.trailer.Copy(), }) } + s.hdrMu.Unlock() } ht.Close(errors.New("finished writing status")) return err @@ -286,14 +291,14 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro // writePendingHeaders sets common and custom headers on the first // write call (Write, WriteHeader, or WriteStatus) -func (ht *serverHandlerTransport) writePendingHeaders(s *Stream) { +func (ht *serverHandlerTransport) writePendingHeaders(s *ServerStream) { ht.writeCommonHeaders(s) ht.writeCustomHeaders(s) } // writeCommonHeaders sets common headers on the first write // call (Write, WriteHeader, or WriteStatus). -func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { +func (ht *serverHandlerTransport) writeCommonHeaders(s *ServerStream) { h := ht.rw.Header() h["Date"] = nil // suppress Date to make tests happy; TODO: restore h.Set("Content-Type", ht.contentType) @@ -314,7 +319,7 @@ func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { // writeCustomHeaders sets custom headers set on the stream via SetHeader // on the first write call (Write, WriteHeader, or WriteStatus) -func (ht *serverHandlerTransport) writeCustomHeaders(s *Stream) { +func (ht *serverHandlerTransport) writeCustomHeaders(s *ServerStream) { h := ht.rw.Header() s.hdrMu.Lock() @@ -330,19 +335,31 @@ func (ht *serverHandlerTransport) writeCustomHeaders(s *Stream) { s.hdrMu.Unlock() } -func (ht *serverHandlerTransport) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { +func (ht *serverHandlerTransport) write(s *ServerStream, hdr []byte, data mem.BufferSlice, _ *WriteOptions) error { + // Always take a reference because otherwise there is no guarantee the data will + // be available after this function returns. This is what callers to Write + // expect. + data.Ref() headersWritten := s.updateHeaderSent() - return ht.do(func() { + err := ht.do(func() { + defer data.Free() if !headersWritten { ht.writePendingHeaders(s) } ht.rw.Write(hdr) - ht.rw.Write(data) + for _, b := range data { + _, _ = ht.rw.Write(b.ReadOnlyData()) + } ht.rw.(http.Flusher).Flush() }) + if err != nil { + data.Free() + return err + } + return nil } -func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { +func (ht *serverHandlerTransport) writeHeader(s *ServerStream, md metadata.MD) error { if err := s.SetHeader(md); err != nil { return err } @@ -370,7 +387,7 @@ func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { return err } -func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream func(*Stream)) { +func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream func(*ServerStream)) { // With this transport type there will be exactly 1 stream: this HTTP request. var cancel context.CancelFunc if ht.timeoutSet { @@ -393,20 +410,22 @@ func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream ctx = metadata.NewIncomingContext(ctx, ht.headerMD) req := ht.req - s := &Stream{ - id: 0, // irrelevant - ctx: ctx, - requestRead: func(int) {}, + s := &ServerStream{ + Stream: &Stream{ + id: 0, // irrelevant + ctx: ctx, + requestRead: func(int) {}, + buf: newRecvBuffer(), + method: req.URL.Path, + recvCompress: req.Header.Get("grpc-encoding"), + contentSubtype: ht.contentSubtype, + }, cancel: cancel, - buf: newRecvBuffer(), st: ht, - method: req.URL.Path, - recvCompress: req.Header.Get("grpc-encoding"), - contentSubtype: ht.contentSubtype, headerWireLength: 0, // won't have access to header wire length until golang/go#18997. } s.trReader = &transportReader{ - reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf, freeBuffer: func(*bytes.Buffer) {}}, + reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf}, windowHandler: func(int) {}, } @@ -415,21 +434,19 @@ func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream go func() { defer close(readerDone) - // TODO: minimize garbage, optimize recvBuffer code/ownership - const readSize = 8196 - for buf := make([]byte, readSize); ; { - n, err := req.Body.Read(buf) + for { + buf := ht.bufferPool.Get(http2MaxFrameLen) + n, err := req.Body.Read(*buf) if n > 0 { - s.buf.put(recvMsg{buffer: bytes.NewBuffer(buf[:n:n])}) - buf = buf[n:] + *buf = (*buf)[:n] + s.buf.put(recvMsg{buffer: mem.NewBuffer(buf, ht.bufferPool)}) + } else { + ht.bufferPool.Put(buf) } if err != nil { s.buf.put(recvMsg{err: mapRecvMsgError(err)}) return } - if len(buf) == 0 { - buf = make([]byte, readSize) - } } }() @@ -458,11 +475,9 @@ func (ht *serverHandlerTransport) runStream() { } } -func (ht *serverHandlerTransport) IncrMsgSent() {} - -func (ht *serverHandlerTransport) IncrMsgRecv() {} +func (ht *serverHandlerTransport) incrMsgRecv() {} -func (ht *serverHandlerTransport) Drain(debugData string) { +func (ht *serverHandlerTransport) Drain(string) { panic("Drain() is not implemented") } @@ -485,5 +500,5 @@ func mapRecvMsgError(err error) error { if strings.Contains(err.Error(), "body closed by handler") { return status.Error(codes.Canceled, err.Error()) } - return connectionErrorf(true, err, err.Error()) + return connectionErrorf(true, err, "%s", err.Error()) } diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index deba0c4d9e..7cb238794f 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -43,10 +43,12 @@ import ( "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/grpcutil" imetadata "google.golang.org/grpc/internal/metadata" + "google.golang.org/grpc/internal/proxyattributes" istatus "google.golang.org/grpc/internal/status" isyscall "google.golang.org/grpc/internal/syscall" "google.golang.org/grpc/internal/transport/networktype" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/resolver" @@ -59,6 +61,8 @@ import ( // atomically. var clientConnectionCounter uint64 +var goAwayLoopyWriterTimeout = 5 * time.Second + var metadataFromOutgoingContextRaw = internal.FromOutgoingContextRaw.(func(context.Context) (metadata.MD, [][]string, bool)) // http2Client implements the ClientTransport interface with HTTP2. @@ -83,9 +87,9 @@ type http2Client struct { writerDone chan struct{} // sync point to enable testing. // goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor) // that the server sent GoAway on this transport. - goAway chan struct{} - - framer *framer + goAway chan struct{} + keepaliveDone chan struct{} // Closed when the keepalive goroutine exits. + framer *framer // controlBuf delivers all the control related tasks (e.g., window // updates, reset streams, and various settings) to the controller. // Do not access controlBuf with mu held. @@ -114,13 +118,13 @@ type http2Client struct { streamQuota int64 streamsQuotaAvailable chan struct{} waitingStreams uint32 - nextID uint32 registeredCompressors string // Do not access controlBuf with mu held. mu sync.Mutex // guard the following variables + nextID uint32 state transportState - activeStreams map[uint32]*Stream + activeStreams map[uint32]*ClientStream // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. prevGoAwayID uint32 // goAwayReason records the http2.ErrCode and debug data received with the @@ -144,13 +148,13 @@ type http2Client struct { onClose func(GoAwayReason) - bufferPool *bufferPool + bufferPool mem.BufferPool connectionID uint64 logger *grpclog.PrefixLogger } -func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr resolver.Address, useProxy bool, grpcUA string) (net.Conn, error) { +func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr resolver.Address, grpcUA string) (net.Conn, error) { address := addr.Addr networkType, ok := networktype.Get(addr) if fn != nil { @@ -172,10 +176,10 @@ func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error return fn(ctx, address) } if !ok { - networkType, address = parseDialTarget(address) + networkType, address = ParseDialTarget(address) } - if networkType == "tcp" && useProxy { - return proxyDial(ctx, address, grpcUA) + if opts, present := proxyattributes.Get(addr); present { + return proxyDial(ctx, addr, grpcUA, opts) } return internal.NetDialerWithTCPKeepalive().DialContext(ctx, networkType, address) } @@ -196,10 +200,10 @@ func isTemporary(err error) bool { return true } -// newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 +// NewHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 // and starts to receive messages on it. Non-nil error returns if construction // fails. -func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ *http2Client, err error) { +func NewHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ ClientTransport, err error) { scheme := "http" ctx, cancel := context.WithCancel(ctx) defer func() { @@ -214,7 +218,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts // address specific arbitrary data to reach custom dialers and credential handshakers. connectCtx = icredentials.NewClientHandshakeInfoContext(connectCtx, credentials.ClientHandshakeInfo{Attributes: addr.Attributes}) - conn, err := dial(connectCtx, opts.Dialer, addr, opts.UseProxy, opts.UserAgent) + conn, err := dial(connectCtx, opts.Dialer, addr, opts.UserAgent) if err != nil { if opts.FailOnNonTempDialError { return nil, connectionErrorf(isTemporary(err), err, "transport: error while dialing: %v", err) @@ -229,7 +233,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts } }(conn) - // The following defer and goroutine monitor the connectCtx for cancelation + // The following defer and goroutine monitor the connectCtx for cancellation // and deadline. On context expiration, the connection is hard closed and // this function will naturally fail as a result. Otherwise, the defer // waits for the goroutine to exit to prevent the context from being @@ -305,11 +309,9 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts scheme = "https" } } - dynamicWindow := true icwz := int32(initialWindowSize) if opts.InitialConnWindowSize >= defaultWindowSize { icwz = opts.InitialConnWindowSize - dynamicWindow = false } writeBufSize := opts.WriteBufferSize readBufSize := opts.ReadBufferSize @@ -332,10 +334,11 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts readerDone: make(chan struct{}), writerDone: make(chan struct{}), goAway: make(chan struct{}), + keepaliveDone: make(chan struct{}), framer: newFramer(conn, writeBufSize, readBufSize, opts.SharedWriteBuffer, maxHeaderListSize), fc: &trInFlow{limit: uint32(icwz)}, scheme: scheme, - activeStreams: make(map[uint32]*Stream), + activeStreams: make(map[uint32]*ClientStream), isSecure: isSecure, perRPCCreds: perRPCCreds, kp: kp, @@ -346,7 +349,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts streamQuota: defaultMaxStreamsClient, streamsQuotaAvailable: make(chan struct{}, 1), keepaliveEnabled: keepaliveEnabled, - bufferPool: newBufferPool(), + bufferPool: opts.BufferPool, onClose: onClose, } var czSecurity credentials.ChannelzSecurityValue @@ -376,9 +379,8 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts t.controlBuf = newControlBuffer(t.ctxDone) if opts.InitialWindowSize >= defaultWindowSize { t.initialWindowSize = opts.InitialWindowSize - dynamicWindow = false } - if dynamicWindow { + if !opts.StaticWindowSize { t.bdpEst = &bdpEstimator{ bdp: initialWindowSize, updateFlowControl: t.updateFlowControl, @@ -408,10 +410,10 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts readerErrCh := make(chan error, 1) go t.reader(readerErrCh) defer func() { - if err == nil { - err = <-readerErrCh - } if err != nil { + // writerDone should be closed since the loopy goroutine + // wouldn't have started in the case this function returns an error. + close(t.writerDone) t.Close(err) } }() @@ -458,8 +460,12 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts if err := t.framer.writer.Flush(); err != nil { return nil, err } + // Block until the server preface is received successfully or an error occurs. + if err = <-readerErrCh; err != nil { + return nil, err + } go func() { - t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) + t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger, t.outgoingGoAwayHandler, t.bufferPool) if err := t.loopy.run(); !isIOError(err) { // Immediately close the connection, as the loopy writer returns // when there are no more active streams and we were draining (the @@ -472,17 +478,19 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts return t, nil } -func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { +func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *ClientStream { // TODO(zhaoq): Handle uint32 overflow of Stream.id. - s := &Stream{ - ct: t, - done: make(chan struct{}), - method: callHdr.Method, - sendCompress: callHdr.SendCompress, - buf: newRecvBuffer(), - headerChan: make(chan struct{}), - contentSubtype: callHdr.ContentSubtype, - doneFunc: callHdr.DoneFunc, + s := &ClientStream{ + Stream: &Stream{ + method: callHdr.Method, + sendCompress: callHdr.SendCompress, + buf: newRecvBuffer(), + contentSubtype: callHdr.ContentSubtype, + }, + ct: t, + done: make(chan struct{}), + headerChan: make(chan struct{}), + doneFunc: callHdr.DoneFunc, } s.wq = newWriteQuota(defaultWriteQuota, s.done) s.requestRead = func(n int) { @@ -498,9 +506,8 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { ctxDone: s.ctx.Done(), recv: s.buf, closeStream: func(err error) { - t.CloseStream(s, err) + s.Close(err) }, - freeBuffer: t.bufferPool.put, }, windowHandler: func(n int) { t.updateWindow(s, uint32(n)) @@ -517,13 +524,25 @@ func (t *http2Client) getPeer() *peer.Peer { } } +// OutgoingGoAwayHandler writes a GOAWAY to the connection. Always returns (false, err) as we want the GoAway +// to be the last frame loopy writes to the transport. +func (t *http2Client) outgoingGoAwayHandler(g *goAway) (bool, error) { + t.mu.Lock() + maxStreamID := t.nextID - 2 + t.mu.Unlock() + if err := t.framer.fr.WriteGoAway(maxStreamID, http2.ErrCodeNo, g.debugData); err != nil { + return false, err + } + return false, g.closeConn +} + func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) ([]hpack.HeaderField, error) { aud := t.createAudience(callHdr) ri := credentials.RequestInfo{ Method: callHdr.Method, AuthInfo: t.authInfo, } - ctxWithRequestInfo := icredentials.NewRequestInfoContext(ctx, ri) + ctxWithRequestInfo := credentials.NewContextWithRequestInfo(ctx, ri) authData, err := t.getTrAuthData(ctxWithRequestInfo, aud) if err != nil { return nil, err @@ -537,6 +556,19 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) // Make the slice of certain predictable size to reduce allocations made by append. hfLen := 7 // :method, :scheme, :path, :authority, content-type, user-agent, te hfLen += len(authData) + len(callAuthData) + registeredCompressors := t.registeredCompressors + if callHdr.PreviousAttempts > 0 { + hfLen++ + } + if callHdr.SendCompress != "" { + hfLen++ + } + if registeredCompressors != "" { + hfLen++ + } + if _, ok := ctx.Deadline(); ok { + hfLen++ + } headerFields := make([]hpack.HeaderField, 0, hfLen) headerFields = append(headerFields, hpack.HeaderField{Name: ":method", Value: "POST"}) headerFields = append(headerFields, hpack.HeaderField{Name: ":scheme", Value: t.scheme}) @@ -549,7 +581,6 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-previous-rpc-attempts", Value: strconv.Itoa(callHdr.PreviousAttempts)}) } - registeredCompressors := t.registeredCompressors if callHdr.SendCompress != "" { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress}) // Include the outgoing compressor name when compressor is not registered @@ -570,6 +601,9 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) // Send out timeout regardless its value. The server can detect timeout context by itself. // TODO(mmukhi): Perhaps this field should be updated when actually writing out to the wire. timeout := time.Until(dl) + if timeout <= 0 { + return nil, status.Error(codes.DeadlineExceeded, context.DeadlineExceeded.Error()) + } headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-timeout", Value: grpcutil.EncodeDuration(timeout)}) } for k, v := range authData { @@ -578,12 +612,6 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) for k, v := range callAuthData { headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } - if b := stats.OutgoingTags(ctx); b != nil { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-tags-bin", Value: encodeBinHeader(b)}) - } - if b := stats.OutgoingTrace(ctx); b != nil { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-trace-bin", Value: encodeBinHeader(b)}) - } if md, added, ok := metadataFromOutgoingContextRaw(ctx); ok { var k string @@ -719,7 +747,7 @@ func (e NewStreamError) Error() string { // NewStream creates a stream and registers it into the transport as "active" // streams. All non-nil errors returned will be *NewStreamError. -func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) { +func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*ClientStream, error) { ctx = peer.NewContext(ctx, t.getPeer()) // ServerName field of the resolver returned address takes precedence over @@ -733,6 +761,25 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, callHdr = &newCallHdr } + // The authority specified via the `CallAuthority` CallOption takes the + // highest precedence when determining the `:authority` header. It overrides + // any value present in the Host field of CallHdr. Before applying this + // override, the authority string is validated. If the credentials do not + // implement the AuthorityValidator interface, or if validation fails, the + // RPC is failed with a status code of `UNAVAILABLE`. + if callHdr.Authority != "" { + auth, ok := t.authInfo.(credentials.AuthorityValidator) + if !ok { + return nil, &NewStreamError{Err: status.Errorf(codes.Unavailable, "credentials type %q does not implement the AuthorityValidator interface, but authority override specified with CallAuthority call option", t.authInfo.AuthType())} + } + if err := auth.ValidateAuthority(callHdr.Authority); err != nil { + return nil, &NewStreamError{Err: status.Errorf(codes.Unavailable, "failed to validate authority %q : %v", callHdr.Authority, err)} + } + newCallHdr := *callHdr + newCallHdr.Host = callHdr.Authority + callHdr = &newCallHdr + } + headerFields, err := t.createHeaderFields(ctx, callHdr) if err != nil { return nil, &NewStreamError{Err: err, AllowTransparentRetry: false} @@ -744,7 +791,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return } // The stream was unprocessed by the server. - atomic.StoreUint32(&s.unprocessed, 1) + s.unprocessed.Store(true) s.write(recvMsg{err: err}) close(s.done) // If headerChan isn't closed, then close it. @@ -755,7 +802,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, hdr := &headerFrame{ hf: headerFields, endStream: false, - initStream: func(id uint32) error { + initStream: func(uint32) error { t.mu.Lock() // TODO: handle transport closure in loopy instead and remove this // initStream is never called when transport is draining. @@ -781,7 +828,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, firstTry := true var ch chan struct{} transportDrainRequired := false - checkForStreamQuota := func(it any) bool { + checkForStreamQuota := func() bool { if t.streamQuota <= 0 { // Can go negative if server decreases it. if firstTry { t.waitingStreams++ @@ -793,23 +840,24 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, t.waitingStreams-- } t.streamQuota-- - h := it.(*headerFrame) - h.streamID = t.nextID - t.nextID += 2 - // Drain client transport if nextID > MaxStreamID which signals gRPC that - // the connection is closed and a new one must be created for subsequent RPCs. - transportDrainRequired = t.nextID > MaxStreamID - - s.id = h.streamID - s.fc = &inFlow{limit: uint32(t.initialWindowSize)} t.mu.Lock() if t.state == draining || t.activeStreams == nil { // Can be niled from Close(). t.mu.Unlock() return false // Don't create a stream if the transport is already closed. } + + hdr.streamID = t.nextID + t.nextID += 2 + // Drain client transport if nextID > MaxStreamID which signals gRPC that + // the connection is closed and a new one must be created for subsequent RPCs. + transportDrainRequired = t.nextID > MaxStreamID + + s.id = hdr.streamID + s.fc = &inFlow{limit: uint32(t.initialWindowSize)} t.activeStreams[s.id] = s t.mu.Unlock() + if t.streamQuota > 0 && t.waitingStreams > 0 { select { case t.streamsQuotaAvailable <- struct{}{}: @@ -819,13 +867,12 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return true } var hdrListSizeErr error - checkForHeaderListSize := func(it any) bool { + checkForHeaderListSize := func() bool { if t.maxSendHeaderListSize == nil { return true } - hdrFrame := it.(*headerFrame) var sz int64 - for _, f := range hdrFrame.hf { + for _, f := range hdr.hf { if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) { hdrListSizeErr = status.Errorf(codes.Internal, "header list size to send violates the maximum size (%d bytes) set by server", *t.maxSendHeaderListSize) return false @@ -834,8 +881,8 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return true } for { - success, err := t.controlBuf.executeAndPut(func(it any) bool { - return checkForHeaderListSize(it) && checkForStreamQuota(it) + success, err := t.controlBuf.executeAndPut(func() bool { + return checkForHeaderListSize() && checkForStreamQuota() }, hdr) if err != nil { // Connection closed. @@ -889,21 +936,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return s, nil } -// CloseStream clears the footprint of a stream when the stream is not needed any more. -// This must not be executed in reader's goroutine. -func (t *http2Client) CloseStream(s *Stream, err error) { - var ( - rst bool - rstCode http2.ErrCode - ) - if err != nil { - rst = true - rstCode = http2.ErrCodeCancel - } - t.closeStream(s, err, rst, rstCode, status.Convert(err), nil, false) -} - -func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2.ErrCode, st *status.Status, mdata map[string][]string, eosReceived bool) { +func (t *http2Client) closeStream(s *ClientStream, err error, rst bool, rstCode http2.ErrCode, st *status.Status, mdata map[string][]string, eosReceived bool) { // Set stream status to done. if s.swapState(streamDone) == streamDone { // If it was already done, return. If multiple closeStream calls @@ -946,7 +979,7 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2. rst: rst, rstCode: rstCode, } - addBackStreamQuota := func(any) bool { + addBackStreamQuota := func() bool { t.streamQuota++ if t.streamQuota > 0 && t.waitingStreams > 0 { select { @@ -966,8 +999,9 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2. // Close kicks off the shutdown process of the transport. This should be called // only once on a transport. Once it is called, the transport should not be -// accessed any more. +// accessed anymore. func (t *http2Client) Close(err error) { + t.conn.SetWriteDeadline(time.Now().Add(time.Second * 10)) t.mu.Lock() // Make sure we only close once. if t.state == closing { @@ -990,15 +1024,33 @@ func (t *http2Client) Close(err error) { // should unblock it so that the goroutine eventually exits. t.kpDormancyCond.Signal() } + // Append info about previous goaways if there were any, since this may be important + // for understanding the root cause for this connection to be closed. + goAwayDebugMessage := t.goAwayDebugMessage t.mu.Unlock() - t.controlBuf.finish() + + // Per HTTP/2 spec, a GOAWAY frame must be sent before closing the + // connection. See https://httpwg.org/specs/rfc7540.html#GOAWAY. It + // also waits for loopyWriter to be closed with a timer to avoid the + // long blocking in case the connection is blackholed, i.e. TCP is + // just stuck. + t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte("client transport shutdown"), closeConn: err}) + timer := time.NewTimer(goAwayLoopyWriterTimeout) + defer timer.Stop() + select { + case <-t.writerDone: // success + case <-timer.C: + t.logger.Infof("Failed to write a GOAWAY frame as part of connection close after %s. Giving up and closing the transport.", goAwayLoopyWriterTimeout) + } t.cancel() t.conn.Close() + // Waits for the reader and keepalive goroutines to exit before returning to + // ensure all resources are cleaned up before Close can return. + <-t.readerDone + if t.keepaliveEnabled { + <-t.keepaliveDone + } channelz.RemoveEntry(t.channelz.ID) - // Append info about previous goaways if there were any, since this may be important - // for understanding the root cause for this connection to be closed. - _, goAwayDebugMessage := t.GetGoAwayReason() - var st *status.Status if len(goAwayDebugMessage) > 0 { st = status.Newf(codes.Unavailable, "closing transport due to: %v, received prior goaway: %v", err, goAwayDebugMessage) @@ -1047,7 +1099,7 @@ func (t *http2Client) GracefulClose() { // Write formats the data into HTTP2 data frame(s) and sends it out. The caller // should proceed only if Write returns nil. -func (t *http2Client) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { +func (t *http2Client) write(s *ClientStream, hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { if opts.Last { // If it's the last message, update stream state. if !s.compareAndSwapState(streamActive, streamWriteDone) { @@ -1060,17 +1112,24 @@ func (t *http2Client) Write(s *Stream, hdr []byte, data []byte, opts *Options) e streamID: s.id, endStream: opts.Last, h: hdr, - d: data, + data: data, } - if hdr != nil || data != nil { // If it's not an empty data frame, check quota. - if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { + dataLen := data.Len() + if hdr != nil || dataLen != 0 { // If it's not an empty data frame, check quota. + if err := s.wq.get(int32(len(hdr) + dataLen)); err != nil { return err } } - return t.controlBuf.put(df) + data.Ref() + if err := t.controlBuf.put(df); err != nil { + data.Free() + return err + } + t.incrMsgSent() + return nil } -func (t *http2Client) getStream(f http2.Frame) *Stream { +func (t *http2Client) getStream(f http2.Frame) *ClientStream { t.mu.Lock() s := t.activeStreams[f.Header().StreamID] t.mu.Unlock() @@ -1080,7 +1139,7 @@ func (t *http2Client) getStream(f http2.Frame) *Stream { // adjustWindow sends out extra window update over the initial window size // of stream if the application is requesting data larger in size than // the window. -func (t *http2Client) adjustWindow(s *Stream, n uint32) { +func (t *http2Client) adjustWindow(s *ClientStream, n uint32) { if w := s.fc.maybeAdjust(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -1089,7 +1148,7 @@ func (t *http2Client) adjustWindow(s *Stream, n uint32) { // updateWindow adjusts the inbound quota for the stream. // Window updates will be sent out when the cumulative quota // exceeds the corresponding threshold. -func (t *http2Client) updateWindow(s *Stream, n uint32) { +func (t *http2Client) updateWindow(s *ClientStream, n uint32) { if w := s.fc.onRead(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -1099,7 +1158,7 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) { // for the transport and the stream based on the current bdp // estimation. func (t *http2Client) updateFlowControl(n uint32) { - updateIWS := func(any) bool { + updateIWS := func() bool { t.initialWindowSize = int32(n) t.mu.Lock() for _, s := range t.activeStreams { @@ -1172,10 +1231,13 @@ func (t *http2Client) handleData(f *http2.DataFrame) { // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? if len(f.Data()) > 0 { - buffer := t.bufferPool.get() - buffer.Reset() - buffer.Write(f.Data()) - s.write(recvMsg{buffer: buffer}) + pool := t.bufferPool + if pool == nil { + // Note that this is only supposed to be nil in tests. Otherwise, stream is + // always initialized with a BufferPool. + pool = mem.DefaultBufferPool() + } + s.write(recvMsg{buffer: mem.Copy(f.Data(), pool)}) } } // The server has closed the stream without sending trailers. Record that @@ -1192,7 +1254,7 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { } if f.ErrCode == http2.ErrCodeRefusedStream { // The stream was unprocessed by the server. - atomic.StoreUint32(&s.unprocessed, 1) + s.unprocessed.Store(true) } statusCode, ok := http2ErrConvTab[f.ErrCode] if !ok { @@ -1204,11 +1266,12 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { if statusCode == codes.Canceled { if d, ok := s.ctx.Deadline(); ok && !d.After(time.Now()) { // Our deadline was already exceeded, and that was likely the cause - // of this cancelation. Alter the status code accordingly. + // of this cancellation. Alter the status code accordingly. statusCode = codes.DeadlineExceeded } } - t.closeStream(s, io.EOF, false, http2.ErrCodeNo, status.Newf(statusCode, "stream terminated by RST_STREAM with error code: %v", f.ErrCode), nil, false) + st := status.Newf(statusCode, "stream terminated by RST_STREAM with error code: %v", f.ErrCode) + t.closeStream(s, st.Err(), false, http2.ErrCodeNo, st, nil, false) } func (t *http2Client) handleSettings(f *http2.SettingsFrame, isFirst bool) { @@ -1252,7 +1315,7 @@ func (t *http2Client) handleSettings(f *http2.SettingsFrame, isFirst bool) { } updateFuncs = append(updateFuncs, updateStreamQuota) } - t.controlBuf.executeAndPut(func(any) bool { + t.controlBuf.executeAndPut(func() bool { for _, f := range updateFuncs { f() } @@ -1273,11 +1336,11 @@ func (t *http2Client) handlePing(f *http2.PingFrame) { t.controlBuf.put(pingAck) } -func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { +func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) error { t.mu.Lock() if t.state == closing { t.mu.Unlock() - return + return nil } if f.ErrCode == http2.ErrCodeEnhanceYourCalm && string(f.DebugData()) == "too_many_pings" { // When a client receives a GOAWAY with error code ENHANCE_YOUR_CALM and debug @@ -1289,8 +1352,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { id := f.LastStreamID if id > 0 && id%2 == 0 { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway with non-zero even-numbered numbered stream id: %v", id)) - return + return connectionErrorf(true, nil, "received goaway with non-zero even-numbered stream id: %v", id) } // A client can receive multiple GoAways from the server (see // https://github.com/grpc/grpc-go/issues/1387). The idea is that the first @@ -1307,8 +1369,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { // If there are multiple GoAways the first one should always have an ID greater than the following ones. if id > t.prevGoAwayID { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway with stream id: %v, which exceeds stream id of previous goaway: %v", id, t.prevGoAwayID)) - return + return connectionErrorf(true, nil, "received goaway with stream id: %v, which exceeds stream id of previous goaway: %v", id, t.prevGoAwayID) } default: t.setGoAwayReason(f) @@ -1332,15 +1393,14 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { t.prevGoAwayID = id if len(t.activeStreams) == 0 { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway and there are no active streams")) - return + return connectionErrorf(true, nil, "received goaway and there are no active streams") } - streamsToClose := make([]*Stream, 0) + streamsToClose := make([]*ClientStream, 0) for streamID, stream := range t.activeStreams { if streamID > id && streamID <= upperLimit { // The stream was unprocessed by the server. - atomic.StoreUint32(&stream.unprocessed, 1) + stream.unprocessed.Store(true) streamsToClose = append(streamsToClose, stream) } } @@ -1350,6 +1410,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { for _, stream := range streamsToClose { t.closeStream(stream, errStreamDrain, false, http2.ErrCodeNo, statusGoAway, nil, false) } + return nil } // setGoAwayReason sets the value of t.goAwayReason based @@ -1358,8 +1419,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { // the caller. func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) { t.goAwayReason = GoAwayNoReason - switch f.ErrCode { - case http2.ErrCodeEnhanceYourCalm: + if f.ErrCode == http2.ErrCodeEnhanceYourCalm { if string(f.DebugData()) == "too_many_pings" { t.goAwayReason = GoAwayTooManyPings } @@ -1391,7 +1451,7 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { return } endStream := frame.StreamEnded() - atomic.StoreUint32(&s.bytesReceived, 1) + s.bytesReceived.Store(true) initialHeader := atomic.LoadUint32(&s.headerChanClosed) == 0 if !initialHeader && !endStream { @@ -1451,13 +1511,6 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { case "grpc-message": grpcMessage = decodeGrpcMessage(hf.Value) case ":status": - if hf.Value == "200" { - httpStatusErr = "" - statusCode := 200 - httpStatusCode = &statusCode - break - } - c, err := strconv.ParseInt(hf.Value, 10, 32) if err != nil { se := status.New(codes.Internal, fmt.Sprintf("transport: malformed http-status: %v", err)) @@ -1465,7 +1518,19 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { return } statusCode := int(c) + if statusCode >= 100 && statusCode < 200 { + if endStream { + se := status.New(codes.Internal, fmt.Sprintf( + "protocol error: informational header with status code %d must not have END_STREAM set", statusCode)) + t.closeStream(s, se.Err(), true, http2.ErrCodeProtocol, se, nil, endStream) + } + return + } httpStatusCode = &statusCode + if statusCode == 200 { + httpStatusErr = "" + break + } httpStatusErr = fmt.Sprintf( "unexpected HTTP status code received from server: %d (%s)", @@ -1585,7 +1650,13 @@ func (t *http2Client) readServerPreface() error { // network connection. If the server preface is not read successfully, an // error is pushed to errCh; otherwise errCh is closed with no error. func (t *http2Client) reader(errCh chan<- error) { - defer close(t.readerDone) + var errClose error + defer func() { + close(t.readerDone) + if errClose != nil { + t.Close(errClose) + } + }() if err := t.readServerPreface(); err != nil { errCh <- err @@ -1624,11 +1695,10 @@ func (t *http2Client) reader(errCh chan<- error) { t.closeStream(s, status.Error(code, msg), true, http2.ErrCodeProtocol, status.New(code, msg), nil, false) } continue - } else { - // Transport error. - t.Close(connectionErrorf(true, err, "error reading from server: %v", err)) - return } + // Transport error. + errClose = connectionErrorf(true, err, "error reading from server: %v", err) + return } switch frame := frame.(type) { case *http2.MetaHeadersFrame: @@ -1642,7 +1712,7 @@ func (t *http2Client) reader(errCh chan<- error) { case *http2.PingFrame: t.handlePing(frame) case *http2.GoAwayFrame: - t.handleGoAway(frame) + errClose = t.handleGoAway(frame) case *http2.WindowUpdateFrame: t.handleWindowUpdate(frame) default: @@ -1653,15 +1723,15 @@ func (t *http2Client) reader(errCh chan<- error) { } } -func minTime(a, b time.Duration) time.Duration { - if a < b { - return a - } - return b -} - // keepalive running in a separate goroutine makes sure the connection is alive by sending pings. func (t *http2Client) keepalive() { + var err error + defer func() { + close(t.keepaliveDone) + if err != nil { + t.Close(err) + } + }() p := &ping{data: [8]byte{}} // True iff a ping has been sent, and no data has been received since then. outstandingPing := false @@ -1685,7 +1755,7 @@ func (t *http2Client) keepalive() { continue } if outstandingPing && timeoutLeft <= 0 { - t.Close(connectionErrorf(true, nil, "keepalive ping failed to receive ACK within timeout")) + err = connectionErrorf(true, nil, "keepalive ping failed to receive ACK within timeout") return } t.mu.Lock() @@ -1727,7 +1797,7 @@ func (t *http2Client) keepalive() { // timeoutLeft. This will ensure that we wait only for kp.Time // before sending out the next ping (for cases where the ping is // acked). - sleepDuration := minTime(t.kp.Time, timeoutLeft) + sleepDuration := min(t.kp.Time, timeoutLeft) timeoutLeft -= sleepDuration timer.Reset(sleepDuration) case <-t.ctx.Done(): @@ -1756,14 +1826,18 @@ func (t *http2Client) socketMetrics() *channelz.EphemeralSocketMetrics { func (t *http2Client) RemoteAddr() net.Addr { return t.remoteAddr } -func (t *http2Client) IncrMsgSent() { - t.channelz.SocketMetrics.MessagesSent.Add(1) - t.channelz.SocketMetrics.LastMessageSentTimestamp.Store(time.Now().UnixNano()) +func (t *http2Client) incrMsgSent() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesSent.Add(1) + t.channelz.SocketMetrics.LastMessageSentTimestamp.Store(time.Now().UnixNano()) + } } -func (t *http2Client) IncrMsgRecv() { - t.channelz.SocketMetrics.MessagesReceived.Add(1) - t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Store(time.Now().UnixNano()) +func (t *http2Client) incrMsgRecv() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesReceived.Add(1) + t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Store(time.Now().UnixNano()) + } } func (t *http2Client) getOutFlowWindow() int64 { diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go index d582e04710..83cee314c8 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -25,6 +25,7 @@ import ( "fmt" "io" "math" + rand "math/rand/v2" "net" "net/http" "strconv" @@ -34,16 +35,18 @@ import ( "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" + "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" "google.golang.org/grpc/internal/pretty" + istatus "google.golang.org/grpc/internal/status" "google.golang.org/grpc/internal/syscall" + "google.golang.org/grpc/mem" "google.golang.org/protobuf/proto" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" @@ -110,7 +113,7 @@ type http2Server struct { // already initialized since draining is already underway. drainEvent *grpcsync.Event state transportState - activeStreams map[uint32]*Stream + activeStreams map[uint32]*ServerStream // idle is the time instant when the connection went idle. // This is either the beginning of the connection or when the number of // RPCs go down to 0. @@ -119,7 +122,7 @@ type http2Server struct { // Fields below are for channelz metric collection. channelz *channelz.Socket - bufferPool *bufferPool + bufferPool mem.BufferPool connectionID uint64 @@ -129,6 +132,10 @@ type http2Server struct { maxStreamID uint32 // max stream ID ever seen logger *grpclog.PrefixLogger + // setResetPingStrikes is stored as a closure instead of making this a + // method on http2Server to avoid a heap allocation when converting a method + // to a closure for passing to frames objects. + setResetPingStrikes func() } // NewServerTransport creates a http2 transport with conn and configuration @@ -173,16 +180,13 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, Val: config.MaxStreams, }) } - dynamicWindow := true iwz := int32(initialWindowSize) if config.InitialWindowSize >= defaultWindowSize { iwz = config.InitialWindowSize - dynamicWindow = false } icwz := int32(initialWindowSize) if config.InitialConnWindowSize >= defaultWindowSize { icwz = config.InitialConnWindowSize - dynamicWindow = false } if iwz != defaultWindowSize { isettings = append(isettings, http2.Setting{ @@ -255,13 +259,16 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, inTapHandle: config.InTapHandle, fc: &trInFlow{limit: uint32(icwz)}, state: reachable, - activeStreams: make(map[uint32]*Stream), + activeStreams: make(map[uint32]*ServerStream), stats: config.StatsHandlers, kp: kp, idle: time.Now(), kep: kep, initialWindowSize: iwz, - bufferPool: newBufferPool(), + bufferPool: config.BufferPool, + } + t.setResetPingStrikes = func() { + atomic.StoreUint32(&t.resetPingStrikes, 1) } var czSecurity credentials.ChannelzSecurityValue if au, ok := authInfo.(credentials.ChannelzSecurityInfo); ok { @@ -282,7 +289,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, t.logger = prefixLoggerForServerTransport(t) t.controlBuf = newControlBuffer(t.done) - if dynamicWindow { + if !config.StaticWindowSize { t.bdpEst = &bdpEstimator{ bdp: initialWindowSize, updateFlowControl: t.updateFlowControl, @@ -330,8 +337,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, t.handleSettings(sf) go func() { - t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) - t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler + t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger, t.outgoingGoAwayHandler, t.bufferPool) err := t.loopy.run() close(t.loopyWriterDone) if !isIOError(err) { @@ -359,7 +365,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, // operateHeaders takes action on the decoded headers. Returns an error if fatal // error encountered and transport needs to close, otherwise returns nil. -func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeadersFrame, handle func(*Stream)) error { +func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeadersFrame, handle func(*ServerStream)) error { // Acquire max stream ID lock for entire duration t.maxStreamMu.Lock() defer t.maxStreamMu.Unlock() @@ -385,11 +391,13 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade t.maxStreamID = streamID buf := newRecvBuffer() - s := &Stream{ - id: streamID, + s := &ServerStream{ + Stream: &Stream{ + id: streamID, + buf: buf, + fc: &inFlow{limit: uint32(t.initialWindowSize)}, + }, st: t, - buf: buf, - fc: &inFlow{limit: uint32(t.initialWindowSize)}, headerWireLength: int(frame.Header().Length), } var ( @@ -537,12 +545,6 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade // Attach the received metadata to the context. if len(mdata) > 0 { s.ctx = metadata.NewIncomingContext(s.ctx, mdata) - if statsTags := mdata["grpc-tags-bin"]; len(statsTags) > 0 { - s.ctx = stats.SetIncomingTags(s.ctx, []byte(statsTags[len(statsTags)-1])) - } - if statsTrace := mdata["grpc-trace-bin"]; len(statsTrace) > 0 { - s.ctx = stats.SetIncomingTrace(s.ctx, []byte(statsTrace[len(statsTrace)-1])) - } } t.mu.Lock() if t.state != reachable { @@ -568,7 +570,7 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade t.logger.Infof("Aborting the stream early: %v", errMsg) } t.controlBuf.put(&earlyAbortStream{ - httpStatus: 405, + httpStatus: http.StatusMethodNotAllowed, streamID: streamID, contentSubtype: s.contentSubtype, status: status.New(codes.Internal, errMsg), @@ -589,7 +591,7 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade stat = status.New(codes.PermissionDenied, err.Error()) } t.controlBuf.put(&earlyAbortStream{ - httpStatus: 200, + httpStatus: http.StatusOK, streamID: s.id, contentSubtype: s.contentSubtype, status: stat, @@ -598,10 +600,41 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade return nil } } + + if s.ctx.Err() != nil { + t.mu.Unlock() + // Early abort in case the timeout was zero or so low it already fired. + t.controlBuf.put(&earlyAbortStream{ + httpStatus: http.StatusOK, + streamID: s.id, + contentSubtype: s.contentSubtype, + status: status.New(codes.DeadlineExceeded, context.DeadlineExceeded.Error()), + rst: !frame.StreamEnded(), + }) + return nil + } + t.activeStreams[streamID] = s if len(t.activeStreams) == 1 { t.idle = time.Time{} } + + // Start a timer to close the stream on reaching the deadline. + if timeoutSet { + // We need to wait for s.cancel to be updated before calling + // t.closeStream to avoid data races. + cancelUpdated := make(chan struct{}) + timer := internal.TimeAfterFunc(timeout, func() { + <-cancelUpdated + t.closeStream(s, true, http2.ErrCodeCancel, false) + }) + oldCancel := s.cancel + s.cancel = func() { + oldCancel() + timer.Stop() + } + close(cancelUpdated) + } t.mu.Unlock() if channelz.IsOn() { t.channelz.SocketMetrics.StreamsStarted.Add(1) @@ -614,10 +647,9 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade s.wq = newWriteQuota(defaultWriteQuota, s.ctxDone) s.trReader = &transportReader{ reader: &recvBufferReader{ - ctx: s.ctx, - ctxDone: s.ctxDone, - recv: s.buf, - freeBuffer: t.bufferPool.put, + ctx: s.ctx, + ctxDone: s.ctxDone, + recv: s.buf, }, windowHandler: func(n int) { t.updateWindow(s, uint32(n)) @@ -635,7 +667,7 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade // HandleStreams receives incoming streams using the given handler. This is // typically run in a separate goroutine. // traceCtx attaches trace to ctx and returns the new context. -func (t *http2Server) HandleStreams(ctx context.Context, handle func(*Stream)) { +func (t *http2Server) HandleStreams(ctx context.Context, handle func(*ServerStream)) { defer func() { close(t.readerDone) <-t.loopyWriterDone @@ -699,7 +731,7 @@ func (t *http2Server) HandleStreams(ctx context.Context, handle func(*Stream)) { } } -func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { +func (t *http2Server) getStream(f http2.Frame) (*ServerStream, bool) { t.mu.Lock() defer t.mu.Unlock() if t.activeStreams == nil { @@ -717,7 +749,7 @@ func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { // adjustWindow sends out extra window update over the initial window size // of stream if the application is requesting data larger in size than // the window. -func (t *http2Server) adjustWindow(s *Stream, n uint32) { +func (t *http2Server) adjustWindow(s *ServerStream, n uint32) { if w := s.fc.maybeAdjust(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -727,7 +759,7 @@ func (t *http2Server) adjustWindow(s *Stream, n uint32) { // updateWindow adjusts the inbound quota for the stream and the transport. // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. -func (t *http2Server) updateWindow(s *Stream, n uint32) { +func (t *http2Server) updateWindow(s *ServerStream, n uint32) { if w := s.fc.onRead(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w, @@ -814,10 +846,13 @@ func (t *http2Server) handleData(f *http2.DataFrame) { // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? if len(f.Data()) > 0 { - buffer := t.bufferPool.get() - buffer.Reset() - buffer.Write(f.Data()) - s.write(recvMsg{buffer: buffer}) + pool := t.bufferPool + if pool == nil { + // Note that this is only supposed to be nil in tests. Otherwise, stream is + // always initialized with a BufferPool. + pool = mem.DefaultBufferPool() + } + s.write(recvMsg{buffer: mem.Copy(f.Data(), pool)}) } } if f.StreamEnded() { @@ -860,7 +895,7 @@ func (t *http2Server) handleSettings(f *http2.SettingsFrame) { } return nil }) - t.controlBuf.executeAndPut(func(any) bool { + t.controlBuf.executeAndPut(func() bool { for _, f := range updateFuncs { f() } @@ -961,7 +996,7 @@ func (t *http2Server) checkForHeaderListSize(it any) bool { return true } -func (t *http2Server) streamContextErr(s *Stream) error { +func (t *http2Server) streamContextErr(s *ServerStream) error { select { case <-t.done: return ErrConnClosing @@ -971,7 +1006,7 @@ func (t *http2Server) streamContextErr(s *Stream) error { } // WriteHeader sends the header metadata md back to the client. -func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { +func (t *http2Server) writeHeader(s *ServerStream, md metadata.MD) error { s.hdrMu.Lock() defer s.hdrMu.Unlock() if s.getState() == streamDone { @@ -1000,11 +1035,7 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { return nil } -func (t *http2Server) setResetPingStrikes() { - atomic.StoreUint32(&t.resetPingStrikes, 1) -} - -func (t *http2Server) writeHeaderLocked(s *Stream) error { +func (t *http2Server) writeHeaderLocked(s *ServerStream) error { // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields // first and create a slice of that exact size. headerFields := make([]hpack.HeaderField, 0, 2) // at least :status, content-type will be there if none else. @@ -1014,12 +1045,13 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress}) } headerFields = appendHeaderFieldsFromMD(headerFields, s.header) - success, err := t.controlBuf.executeAndPut(t.checkForHeaderListSize, &headerFrame{ + hf := &headerFrame{ streamID: s.id, hf: headerFields, endStream: false, onWrite: t.setResetPingStrikes, - }) + } + success, err := t.controlBuf.executeAndPut(func() bool { return t.checkForHeaderListSize(hf) }, hf) if !success { if err != nil { return err @@ -1039,11 +1071,11 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { return nil } -// WriteStatus sends stream status to the client and terminates the stream. +// writeStatus sends stream status to the client and terminates the stream. // There is no further I/O operations being able to perform on this stream. // TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early // OK is adopted. -func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { +func (t *http2Server) writeStatus(s *ServerStream, st *status.Status) error { s.hdrMu.Lock() defer s.hdrMu.Unlock() @@ -1067,7 +1099,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status", Value: strconv.Itoa(int(st.Code()))}) headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())}) - if p := st.Proto(); p != nil && len(p.Details) > 0 { + if p := istatus.RawStatusProto(st); len(p.GetDetails()) > 0 { // Do not use the user's grpc-status-details-bin (if present) if we are // even attempting to set our own. delete(s.trailer, grpcStatusDetailsBinHeader) @@ -1089,7 +1121,9 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { onWrite: t.setResetPingStrikes, } - success, err := t.controlBuf.execute(t.checkForHeaderListSize, trailingHeader) + success, err := t.controlBuf.executeAndPut(func() bool { + return t.checkForHeaderListSize(trailingHeader) + }, nil) if !success { if err != nil { return err @@ -1112,9 +1146,9 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { // Write converts the data into HTTP2 data frame and sends it out. Non-nil error // is returns if it fails (e.g., framing error, transport error). -func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { +func (t *http2Server) write(s *ServerStream, hdr []byte, data mem.BufferSlice, _ *WriteOptions) error { if !s.isHeaderSent() { // Headers haven't been written yet. - if err := t.WriteHeader(s, nil); err != nil { + if err := t.writeHeader(s, nil); err != nil { return err } } else { @@ -1123,16 +1157,24 @@ func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) e return t.streamContextErr(s) } } + df := &dataFrame{ streamID: s.id, h: hdr, - d: data, + data: data, onEachWrite: t.setResetPingStrikes, } - if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { + dataLen := data.Len() + if err := s.wq.get(int32(len(hdr) + dataLen)); err != nil { return t.streamContextErr(s) } - return t.controlBuf.put(df) + data.Ref() + if err := t.controlBuf.put(df); err != nil { + data.Free() + return err + } + t.incrMsgSent() + return nil } // keepalive running in a separate goroutine does the following: @@ -1208,7 +1250,7 @@ func (t *http2Server) keepalive() { continue } if outstandingPing && kpTimeoutLeft <= 0 { - t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Time)) + t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Timeout)) return } if !outstandingPing { @@ -1223,7 +1265,7 @@ func (t *http2Server) keepalive() { // timeoutLeft. This will ensure that we wait only for kp.Time // before sending out the next ping (for cases where the ping is // acked). - sleepDuration := minTime(t.kp.Time, kpTimeoutLeft) + sleepDuration := min(t.kp.Time, kpTimeoutLeft) kpTimeoutLeft -= sleepDuration kpTimer.Reset(sleepDuration) case <-t.done: @@ -1261,8 +1303,7 @@ func (t *http2Server) Close(err error) { } // deleteStream deletes the stream s from transport's active streams. -func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { - +func (t *http2Server) deleteStream(s *ServerStream, eosReceived bool) { t.mu.Lock() if _, ok := t.activeStreams[s.id]; ok { delete(t.activeStreams, s.id) @@ -1282,7 +1323,7 @@ func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { } // finishStream closes the stream and puts the trailing headerFrame into controlbuf. -func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { +func (t *http2Server) finishStream(s *ServerStream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be // called to interrupt the potential blocking on other goroutines. @@ -1306,12 +1347,15 @@ func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, h } // closeStream clears the footprint of a stream when the stream is not needed any more. -func (t *http2Server) closeStream(s *Stream, rst bool, rstCode http2.ErrCode, eosReceived bool) { +func (t *http2Server) closeStream(s *ServerStream, rst bool, rstCode http2.ErrCode, eosReceived bool) { // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be // called to interrupt the potential blocking on other goroutines. s.cancel() + // We can't return early even if the stream's state is "done" as the state + // might have been set by the `finishStream` method. Deleting the stream via + // `finishStream` can get blocked on flow control. s.swapState(streamDone) t.deleteStream(s, eosReceived) @@ -1400,14 +1444,18 @@ func (t *http2Server) socketMetrics() *channelz.EphemeralSocketMetrics { } } -func (t *http2Server) IncrMsgSent() { - t.channelz.SocketMetrics.MessagesSent.Add(1) - t.channelz.SocketMetrics.LastMessageSentTimestamp.Add(1) +func (t *http2Server) incrMsgSent() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesSent.Add(1) + t.channelz.SocketMetrics.LastMessageSentTimestamp.Add(1) + } } -func (t *http2Server) IncrMsgRecv() { - t.channelz.SocketMetrics.MessagesReceived.Add(1) - t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Add(1) +func (t *http2Server) incrMsgRecv() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesReceived.Add(1) + t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Add(1) + } } func (t *http2Server) getOutFlowWindow() int64 { @@ -1440,7 +1488,7 @@ func getJitter(v time.Duration) time.Duration { } // Generate a jitter between +/- 10% of the value. r := int64(v / 10) - j := grpcrand.Int63n(2*r) - r + j := rand.Int64N(2*r) - r return time.Duration(j) } diff --git a/vendor/google.golang.org/grpc/internal/transport/http_util.go b/vendor/google.golang.org/grpc/internal/transport/http_util.go index 39cef3bd44..e3663f87f3 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http_util.go +++ b/vendor/google.golang.org/grpc/internal/transport/http_util.go @@ -196,11 +196,11 @@ func decodeTimeout(s string) (time.Duration, error) { if !ok { return 0, fmt.Errorf("transport: timeout unit is not recognized: %q", s) } - t, err := strconv.ParseInt(s[:size-1], 10, 64) + t, err := strconv.ParseUint(s[:size-1], 10, 64) if err != nil { return 0, err } - const maxHours = math.MaxInt64 / int64(time.Hour) + const maxHours = math.MaxInt64 / uint64(time.Hour) if d == time.Hour && t > maxHours { // This timeout would overflow math.MaxInt64; clamp it. return time.Duration(math.MaxInt64), nil @@ -317,28 +317,32 @@ func newBufWriter(conn net.Conn, batchSize int, pool *sync.Pool) *bufWriter { return w } -func (w *bufWriter) Write(b []byte) (n int, err error) { +func (w *bufWriter) Write(b []byte) (int, error) { if w.err != nil { return 0, w.err } if w.batchSize == 0 { // Buffer has been disabled. - n, err = w.conn.Write(b) + n, err := w.conn.Write(b) return n, toIOError(err) } if w.buf == nil { b := w.pool.Get().(*[]byte) w.buf = *b } + written := 0 for len(b) > 0 { - nn := copy(w.buf[w.offset:], b) - b = b[nn:] - w.offset += nn - n += nn - if w.offset >= w.batchSize { - err = w.flushKeepBuffer() + copied := copy(w.buf[w.offset:], b) + b = b[copied:] + written += copied + w.offset += copied + if w.offset < w.batchSize { + continue + } + if err := w.flushKeepBuffer(); err != nil { + return written, err } } - return n, err + return written, nil } func (w *bufWriter) Flush() error { @@ -389,7 +393,7 @@ type framer struct { fr *http2.Framer } -var writeBufferPoolMap map[int]*sync.Pool = make(map[int]*sync.Pool) +var writeBufferPoolMap = make(map[int]*sync.Pool) var writeBufferMutex sync.Mutex func newFramer(conn net.Conn, writeBufferSize, readBufferSize int, sharedWriteBuffer bool, maxHeaderListSize uint32) *framer { @@ -435,8 +439,8 @@ func getWriteBufferPool(size int) *sync.Pool { return pool } -// parseDialTarget returns the network and address to pass to dialer. -func parseDialTarget(target string) (string, string) { +// ParseDialTarget returns the network and address to pass to dialer. +func ParseDialTarget(target string) (string, string) { net := "tcp" m1 := strings.Index(target, ":") m2 := strings.Index(target, ":/") diff --git a/vendor/google.golang.org/grpc/internal/transport/proxy.go b/vendor/google.golang.org/grpc/internal/transport/proxy.go index 24fa103257..d773845955 100644 --- a/vendor/google.golang.org/grpc/internal/transport/proxy.go +++ b/vendor/google.golang.org/grpc/internal/transport/proxy.go @@ -30,34 +30,16 @@ import ( "net/url" "google.golang.org/grpc/internal" + "google.golang.org/grpc/internal/proxyattributes" + "google.golang.org/grpc/resolver" ) const proxyAuthHeaderKey = "Proxy-Authorization" -var ( - // The following variable will be overwritten in the tests. - httpProxyFromEnvironment = http.ProxyFromEnvironment -) - -func mapAddress(address string) (*url.URL, error) { - req := &http.Request{ - URL: &url.URL{ - Scheme: "https", - Host: address, - }, - } - url, err := httpProxyFromEnvironment(req) - if err != nil { - return nil, err - } - return url, nil -} - // To read a response from a net.Conn, http.ReadResponse() takes a bufio.Reader. -// It's possible that this reader reads more than what's need for the response and stores -// those bytes in the buffer. -// bufConn wraps the original net.Conn and the bufio.Reader to make sure we don't lose the -// bytes in the buffer. +// It's possible that this reader reads more than what's need for the response +// and stores those bytes in the buffer. bufConn wraps the original net.Conn +// and the bufio.Reader to make sure we don't lose the bytes in the buffer. type bufConn struct { net.Conn r io.Reader @@ -72,7 +54,7 @@ func basicAuth(username, password string) string { return base64.StdEncoding.EncodeToString([]byte(auth)) } -func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr string, proxyURL *url.URL, grpcUA string) (_ net.Conn, err error) { +func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, grpcUA string, opts proxyattributes.Options) (_ net.Conn, err error) { defer func() { if err != nil { conn.Close() @@ -81,15 +63,14 @@ func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr stri req := &http.Request{ Method: http.MethodConnect, - URL: &url.URL{Host: backendAddr}, + URL: &url.URL{Host: opts.ConnectAddr}, Header: map[string][]string{"User-Agent": {grpcUA}}, } - if t := proxyURL.User; t != nil { - u := t.Username() - p, _ := t.Password() + if user := opts.User; user != nil { + u := user.Username() + p, _ := user.Password() req.Header.Add(proxyAuthHeaderKey, "Basic "+basicAuth(u, p)) } - if err := sendHTTPRequest(ctx, req, conn); err != nil { return nil, fmt.Errorf("failed to write the HTTP request: %v", err) } @@ -107,32 +88,23 @@ func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr stri } return nil, fmt.Errorf("failed to do connect handshake, response: %q", dump) } - - return &bufConn{Conn: conn, r: r}, nil -} - -// proxyDial dials, connecting to a proxy first if necessary. Checks if a proxy -// is necessary, dials, does the HTTP CONNECT handshake, and returns the -// connection. -func proxyDial(ctx context.Context, addr string, grpcUA string) (net.Conn, error) { - newAddr := addr - proxyURL, err := mapAddress(addr) - if err != nil { - return nil, err - } - if proxyURL != nil { - newAddr = proxyURL.Host + // The buffer could contain extra bytes from the target server, so we can't + // discard it. However, in many cases where the server waits for the client + // to send the first message (e.g. when TLS is being used), the buffer will + // be empty, so we can avoid the overhead of reading through this buffer. + if r.Buffered() != 0 { + return &bufConn{Conn: conn, r: r}, nil } + return conn, nil +} - conn, err := internal.NetDialerWithTCPKeepalive().DialContext(ctx, "tcp", newAddr) +// proxyDial establishes a TCP connection to the specified address and performs an HTTP CONNECT handshake. +func proxyDial(ctx context.Context, addr resolver.Address, grpcUA string, opts proxyattributes.Options) (net.Conn, error) { + conn, err := internal.NetDialerWithTCPKeepalive().DialContext(ctx, "tcp", addr.Addr) if err != nil { return nil, err } - if proxyURL == nil { - // proxy is disabled if proxyURL is nil. - return conn, err - } - return doHTTPConnectHandshake(ctx, conn, addr, proxyURL, grpcUA) + return doHTTPConnectHandshake(ctx, conn, grpcUA, opts) } func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error { diff --git a/vendor/google.golang.org/grpc/internal/transport/server_stream.go b/vendor/google.golang.org/grpc/internal/transport/server_stream.go new file mode 100644 index 0000000000..cf8da0b52d --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/server_stream.go @@ -0,0 +1,180 @@ +/* + * + * Copyright 2024 gRPC 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 transport + +import ( + "context" + "errors" + "strings" + "sync" + "sync/atomic" + + "google.golang.org/grpc/mem" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// ServerStream implements streaming functionality for a gRPC server. +type ServerStream struct { + *Stream // Embed for common stream functionality. + + st internalServerTransport + ctxDone <-chan struct{} // closed at the end of stream. Cache of ctx.Done() (for performance) + // cancel is invoked at the end of stream to cancel ctx. It also stops the + // timer for monitoring the rpc deadline if configured. + cancel func() + + // Holds compressor names passed in grpc-accept-encoding metadata from the + // client. + clientAdvertisedCompressors string + headerWireLength int + + // hdrMu protects outgoing header and trailer metadata. + hdrMu sync.Mutex + header metadata.MD // the outgoing header metadata. Updated by WriteHeader. + headerSent atomic.Bool // atomically set when the headers are sent out. +} + +// Read reads an n byte message from the input stream. +func (s *ServerStream) Read(n int) (mem.BufferSlice, error) { + b, err := s.Stream.read(n) + if err == nil { + s.st.incrMsgRecv() + } + return b, err +} + +// SendHeader sends the header metadata for the given stream. +func (s *ServerStream) SendHeader(md metadata.MD) error { + return s.st.writeHeader(s, md) +} + +// Write writes the hdr and data bytes to the output stream. +func (s *ServerStream) Write(hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { + return s.st.write(s, hdr, data, opts) +} + +// WriteStatus sends the status of a stream to the client. WriteStatus is +// the final call made on a stream and always occurs. +func (s *ServerStream) WriteStatus(st *status.Status) error { + return s.st.writeStatus(s, st) +} + +// isHeaderSent indicates whether headers have been sent. +func (s *ServerStream) isHeaderSent() bool { + return s.headerSent.Load() +} + +// updateHeaderSent updates headerSent and returns true +// if it was already set. +func (s *ServerStream) updateHeaderSent() bool { + return s.headerSent.Swap(true) +} + +// RecvCompress returns the compression algorithm applied to the inbound +// message. It is empty string if there is no compression applied. +func (s *ServerStream) RecvCompress() string { + return s.recvCompress +} + +// SendCompress returns the send compressor name. +func (s *ServerStream) SendCompress() string { + return s.sendCompress +} + +// ContentSubtype returns the content-subtype for a request. For example, a +// content-subtype of "proto" will result in a content-type of +// "application/grpc+proto". This will always be lowercase. See +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +func (s *ServerStream) ContentSubtype() string { + return s.contentSubtype +} + +// SetSendCompress sets the compression algorithm to the stream. +func (s *ServerStream) SetSendCompress(name string) error { + if s.isHeaderSent() || s.getState() == streamDone { + return errors.New("transport: set send compressor called after headers sent or stream done") + } + + s.sendCompress = name + return nil +} + +// SetContext sets the context of the stream. This will be deleted once the +// stats handler callouts all move to gRPC layer. +func (s *ServerStream) SetContext(ctx context.Context) { + s.ctx = ctx +} + +// ClientAdvertisedCompressors returns the compressor names advertised by the +// client via grpc-accept-encoding header. +func (s *ServerStream) ClientAdvertisedCompressors() []string { + values := strings.Split(s.clientAdvertisedCompressors, ",") + for i, v := range values { + values[i] = strings.TrimSpace(v) + } + return values +} + +// Header returns the header metadata of the stream. It returns the out header +// after t.WriteHeader is called. It does not block and must not be called +// until after WriteHeader. +func (s *ServerStream) Header() (metadata.MD, error) { + // Return the header in stream. It will be the out + // header after t.WriteHeader is called. + return s.header.Copy(), nil +} + +// HeaderWireLength returns the size of the headers of the stream as received +// from the wire. +func (s *ServerStream) HeaderWireLength() int { + return s.headerWireLength +} + +// SetHeader sets the header metadata. This can be called multiple times. +// This should not be called in parallel to other data writes. +func (s *ServerStream) SetHeader(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.isHeaderSent() || s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.header = metadata.Join(s.header, md) + s.hdrMu.Unlock() + return nil +} + +// SetTrailer sets the trailer metadata which will be sent with the RPC status +// by the server. This can be called multiple times. +// This should not be called parallel to other data writes. +func (s *ServerStream) SetTrailer(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.trailer = metadata.Join(s.trailer, md) + s.hdrMu.Unlock() + return nil +} diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go index 0d2a6e47f6..7dd53e80a7 100644 --- a/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -22,13 +22,11 @@ package transport import ( - "bytes" "context" "errors" "fmt" "io" "net" - "strings" "sync" "sync/atomic" "time" @@ -37,9 +35,9 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" - "google.golang.org/grpc/resolver" "google.golang.org/grpc/stats" "google.golang.org/grpc/status" "google.golang.org/grpc/tap" @@ -47,32 +45,10 @@ import ( const logLevel = 2 -type bufferPool struct { - pool sync.Pool -} - -func newBufferPool() *bufferPool { - return &bufferPool{ - pool: sync.Pool{ - New: func() any { - return new(bytes.Buffer) - }, - }, - } -} - -func (p *bufferPool) get() *bytes.Buffer { - return p.pool.Get().(*bytes.Buffer) -} - -func (p *bufferPool) put(b *bytes.Buffer) { - p.pool.Put(b) -} - // recvMsg represents the received msg from the transport. All transport // protocol specific info has been removed. type recvMsg struct { - buffer *bytes.Buffer + buffer mem.Buffer // nil: received some data // io.EOF: stream is completed. data is nil. // other non-nil error: transport failure. data is nil. @@ -102,6 +78,9 @@ func newRecvBuffer() *recvBuffer { func (b *recvBuffer) put(r recvMsg) { b.mu.Lock() if b.err != nil { + // drop the buffer on the floor. Since b.err is not nil, any subsequent reads + // will always return an error, making this buffer inaccessible. + r.buffer.Free() b.mu.Unlock() // An error had occurred earlier, don't accept more // data or errors. @@ -148,45 +127,97 @@ type recvBufferReader struct { ctx context.Context ctxDone <-chan struct{} // cache of ctx.Done() (for performance). recv *recvBuffer - last *bytes.Buffer // Stores the remaining data in the previous calls. + last mem.Buffer // Stores the remaining data in the previous calls. err error - freeBuffer func(*bytes.Buffer) } -// Read reads the next len(p) bytes from last. If last is drained, it tries to -// read additional data from recv. It blocks if there no additional data available -// in recv. If Read returns any non-nil error, it will continue to return that error. -func (r *recvBufferReader) Read(p []byte) (n int, err error) { +func (r *recvBufferReader) ReadMessageHeader(header []byte) (n int, err error) { if r.err != nil { return 0, r.err } if r.last != nil { - // Read remaining data left in last call. - copied, _ := r.last.Read(p) - if r.last.Len() == 0 { - r.freeBuffer(r.last) + n, r.last = mem.ReadUnsafe(header, r.last) + return n, nil + } + if r.closeStream != nil { + n, r.err = r.readMessageHeaderClient(header) + } else { + n, r.err = r.readMessageHeader(header) + } + return n, r.err +} + +// Read reads the next n bytes from last. If last is drained, it tries to read +// additional data from recv. It blocks if there no additional data available in +// recv. If Read returns any non-nil error, it will continue to return that +// error. +func (r *recvBufferReader) Read(n int) (buf mem.Buffer, err error) { + if r.err != nil { + return nil, r.err + } + if r.last != nil { + buf = r.last + if r.last.Len() > n { + buf, r.last = mem.SplitUnsafe(buf, n) + } else { r.last = nil } - return copied, nil + return buf, nil } if r.closeStream != nil { - n, r.err = r.readClient(p) + buf, r.err = r.readClient(n) } else { - n, r.err = r.read(p) + buf, r.err = r.read(n) } - return n, r.err + return buf, r.err } -func (r *recvBufferReader) read(p []byte) (n int, err error) { +func (r *recvBufferReader) readMessageHeader(header []byte) (n int, err error) { select { case <-r.ctxDone: return 0, ContextErr(r.ctx.Err()) case m := <-r.recv.get(): - return r.readAdditional(m, p) + return r.readMessageHeaderAdditional(m, header) + } +} + +func (r *recvBufferReader) read(n int) (buf mem.Buffer, err error) { + select { + case <-r.ctxDone: + return nil, ContextErr(r.ctx.Err()) + case m := <-r.recv.get(): + return r.readAdditional(m, n) + } +} + +func (r *recvBufferReader) readMessageHeaderClient(header []byte) (n int, err error) { + // If the context is canceled, then closes the stream with nil metadata. + // closeStream writes its error parameter to r.recv as a recvMsg. + // r.readAdditional acts on that message and returns the necessary error. + select { + case <-r.ctxDone: + // Note that this adds the ctx error to the end of recv buffer, and + // reads from the head. This will delay the error until recv buffer is + // empty, thus will delay ctx cancellation in Recv(). + // + // It's done this way to fix a race between ctx cancel and trailer. The + // race was, stream.Recv() may return ctx error if ctxDone wins the + // race, but stream.Trailer() may return a non-nil md because the stream + // was not marked as done when trailer is received. This closeStream + // call will mark stream as done, thus fix the race. + // + // TODO: delaying ctx error seems like a unnecessary side effect. What + // we really want is to mark the stream as done, and return ctx error + // faster. + r.closeStream(ContextErr(r.ctx.Err())) + m := <-r.recv.get() + return r.readMessageHeaderAdditional(m, header) + case m := <-r.recv.get(): + return r.readMessageHeaderAdditional(m, header) } } -func (r *recvBufferReader) readClient(p []byte) (n int, err error) { +func (r *recvBufferReader) readClient(n int) (buf mem.Buffer, err error) { // If the context is canceled, then closes the stream with nil metadata. // closeStream writes its error parameter to r.recv as a recvMsg. // r.readAdditional acts on that message and returns the necessary error. @@ -207,25 +238,40 @@ func (r *recvBufferReader) readClient(p []byte) (n int, err error) { // faster. r.closeStream(ContextErr(r.ctx.Err())) m := <-r.recv.get() - return r.readAdditional(m, p) + return r.readAdditional(m, n) case m := <-r.recv.get(): - return r.readAdditional(m, p) + return r.readAdditional(m, n) } } -func (r *recvBufferReader) readAdditional(m recvMsg, p []byte) (n int, err error) { +func (r *recvBufferReader) readMessageHeaderAdditional(m recvMsg, header []byte) (n int, err error) { r.recv.load() if m.err != nil { + if m.buffer != nil { + m.buffer.Free() + } return 0, m.err } - copied, _ := m.buffer.Read(p) - if m.buffer.Len() == 0 { - r.freeBuffer(m.buffer) - r.last = nil - } else { - r.last = m.buffer + + n, r.last = mem.ReadUnsafe(header, m.buffer) + + return n, nil +} + +func (r *recvBufferReader) readAdditional(m recvMsg, n int) (b mem.Buffer, err error) { + r.recv.load() + if m.err != nil { + if m.buffer != nil { + m.buffer.Free() + } + return nil, m.err + } + + if m.buffer.Len() > n { + m.buffer, r.last = mem.SplitUnsafe(m.buffer, n) } - return copied, nil + + return m.buffer, nil } type streamState uint32 @@ -240,73 +286,26 @@ const ( // Stream represents an RPC in the transport layer. type Stream struct { id uint32 - st ServerTransport // nil for client side Stream - ct *http2Client // nil for server side Stream - ctx context.Context // the associated context of the stream - cancel context.CancelFunc // always nil for client side Stream - done chan struct{} // closed at the end of stream to unblock writers. On the client side. - doneFunc func() // invoked at the end of stream on client side. - ctxDone <-chan struct{} // same as done chan but for server side. Cache of ctx.Done() (for performance) - method string // the associated RPC method of the stream + ctx context.Context // the associated context of the stream + method string // the associated RPC method of the stream recvCompress string sendCompress string buf *recvBuffer - trReader io.Reader + trReader *transportReader fc *inFlow wq *writeQuota - // Holds compressor names passed in grpc-accept-encoding metadata from the - // client. This is empty for the client side stream. - clientAdvertisedCompressors string // Callback to state application's intentions to read data. This // is used to adjust flow control, if needed. requestRead func(int) - headerChan chan struct{} // closed to indicate the end of header metadata. - headerChanClosed uint32 // set when headerChan is closed. Used to avoid closing headerChan multiple times. - // headerValid indicates whether a valid header was received. Only - // meaningful after headerChan is closed (always call waitOnHeader() before - // reading its value). Not valid on server side. - headerValid bool - headerWireLength int // Only set on server side. - - // hdrMu protects header and trailer metadata on the server-side. - hdrMu sync.Mutex - // On client side, header keeps the received header metadata. - // - // On server side, header keeps the header set by SetHeader(). The complete - // header will merged into this after t.WriteHeader() is called. - header metadata.MD - trailer metadata.MD // the key-value map of trailer metadata. - - noHeaders bool // set if the client never received headers (set only after the stream is done). - - // On the server-side, headerSent is atomically set to 1 when the headers are sent out. - headerSent uint32 - state streamState - // On client-side it is the status error received from the server. - // On server-side it is unused. - status *status.Status - - bytesReceived uint32 // indicates whether any bytes have been received on this stream - unprocessed uint32 // set if the server sends a refused stream or GOAWAY including this stream - // contentSubtype is the content-subtype for requests. // this must be lowercase or the behavior is undefined. contentSubtype string -} -// isHeaderSent is only valid on the server-side. -func (s *Stream) isHeaderSent() bool { - return atomic.LoadUint32(&s.headerSent) == 1 -} - -// updateHeaderSent updates headerSent and returns true -// if it was alreay set. It is valid only on server-side. -func (s *Stream) updateHeaderSent() bool { - return atomic.SwapUint32(&s.headerSent, 1) == 1 + trailer metadata.MD // the key-value map of trailer metadata. } func (s *Stream) swapState(st streamState) streamState { @@ -321,110 +320,12 @@ func (s *Stream) getState() streamState { return streamState(atomic.LoadUint32((*uint32)(&s.state))) } -func (s *Stream) waitOnHeader() { - if s.headerChan == nil { - // On the server headerChan is always nil since a stream originates - // only after having received headers. - return - } - select { - case <-s.ctx.Done(): - // Close the stream to prevent headers/trailers from changing after - // this function returns. - s.ct.CloseStream(s, ContextErr(s.ctx.Err())) - // headerChan could possibly not be closed yet if closeStream raced - // with operateHeaders; wait until it is closed explicitly here. - <-s.headerChan - case <-s.headerChan: - } -} - -// RecvCompress returns the compression algorithm applied to the inbound -// message. It is empty string if there is no compression applied. -func (s *Stream) RecvCompress() string { - s.waitOnHeader() - return s.recvCompress -} - -// SetSendCompress sets the compression algorithm to the stream. -func (s *Stream) SetSendCompress(name string) error { - if s.isHeaderSent() || s.getState() == streamDone { - return errors.New("transport: set send compressor called after headers sent or stream done") - } - - s.sendCompress = name - return nil -} - -// SendCompress returns the send compressor name. -func (s *Stream) SendCompress() string { - return s.sendCompress -} - -// ClientAdvertisedCompressors returns the compressor names advertised by the -// client via grpc-accept-encoding header. -func (s *Stream) ClientAdvertisedCompressors() []string { - values := strings.Split(s.clientAdvertisedCompressors, ",") - for i, v := range values { - values[i] = strings.TrimSpace(v) - } - return values -} - -// Done returns a channel which is closed when it receives the final status -// from the server. -func (s *Stream) Done() <-chan struct{} { - return s.done -} - -// Header returns the header metadata of the stream. -// -// On client side, it acquires the key-value pairs of header metadata once it is -// available. It blocks until i) the metadata is ready or ii) there is no header -// metadata or iii) the stream is canceled/expired. -// -// On server side, it returns the out header after t.WriteHeader is called. It -// does not block and must not be called until after WriteHeader. -func (s *Stream) Header() (metadata.MD, error) { - if s.headerChan == nil { - // On server side, return the header in stream. It will be the out - // header after t.WriteHeader is called. - return s.header.Copy(), nil - } - s.waitOnHeader() - - if !s.headerValid || s.noHeaders { - return nil, s.status.Err() - } - - return s.header.Copy(), nil -} - -// TrailersOnly blocks until a header or trailers-only frame is received and -// then returns true if the stream was trailers-only. If the stream ends -// before headers are received, returns true, nil. Client-side only. -func (s *Stream) TrailersOnly() bool { - s.waitOnHeader() - return s.noHeaders -} - -// Trailer returns the cached trailer metedata. Note that if it is not called -// after the entire stream is done, it could return an empty MD. Client -// side only. +// Trailer returns the cached trailer metadata. Note that if it is not called +// after the entire stream is done, it could return an empty MD. // It can be safely read only after stream has ended that is either read // or write have returned io.EOF. func (s *Stream) Trailer() metadata.MD { - c := s.trailer.Copy() - return c -} - -// ContentSubtype returns the content-subtype for a request. For example, a -// content-subtype of "proto" will result in a content-type of -// "application/grpc+proto". This will always be lowercase. See -// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for -// more details. -func (s *Stream) ContentSubtype() string { - return s.contentSubtype + return s.trailer.Copy() } // Context returns the context of the stream. @@ -432,114 +333,104 @@ func (s *Stream) Context() context.Context { return s.ctx } -// SetContext sets the context of the stream. This will be deleted once the -// stats handler callouts all move to gRPC layer. -func (s *Stream) SetContext(ctx context.Context) { - s.ctx = ctx -} - // Method returns the method for the stream. func (s *Stream) Method() string { return s.method } -// Status returns the status received from the server. -// Status can be read safely only after the stream has ended, -// that is, after Done() is closed. -func (s *Stream) Status() *status.Status { - return s.status -} - -// HeaderWireLength returns the size of the headers of the stream as received -// from the wire. Valid only on the server. -func (s *Stream) HeaderWireLength() int { - return s.headerWireLength -} - -// SetHeader sets the header metadata. This can be called multiple times. -// Server side only. -// This should not be called in parallel to other data writes. -func (s *Stream) SetHeader(md metadata.MD) error { - if md.Len() == 0 { - return nil - } - if s.isHeaderSent() || s.getState() == streamDone { - return ErrIllegalHeaderWrite - } - s.hdrMu.Lock() - s.header = metadata.Join(s.header, md) - s.hdrMu.Unlock() - return nil -} - -// SendHeader sends the given header metadata. The given metadata is -// combined with any metadata set by previous calls to SetHeader and -// then written to the transport stream. -func (s *Stream) SendHeader(md metadata.MD) error { - return s.st.WriteHeader(s, md) +func (s *Stream) write(m recvMsg) { + s.buf.put(m) } -// SetTrailer sets the trailer metadata which will be sent with the RPC status -// by the server. This can be called multiple times. Server side only. -// This should not be called parallel to other data writes. -func (s *Stream) SetTrailer(md metadata.MD) error { - if md.Len() == 0 { - return nil +// ReadMessageHeader reads data into the provided header slice from the stream. +// It first checks if there was an error during a previous read operation and +// returns it if present. It then requests a read operation for the length of +// the header. It continues to read from the stream until the entire header +// slice is filled or an error occurs. If an `io.EOF` error is encountered with +// partially read data, it is converted to `io.ErrUnexpectedEOF` to indicate an +// unexpected end of the stream. The method returns any error encountered during +// the read process or nil if the header was successfully read. +func (s *Stream) ReadMessageHeader(header []byte) (err error) { + // Don't request a read if there was an error earlier + if er := s.trReader.er; er != nil { + return er } - if s.getState() == streamDone { - return ErrIllegalHeaderWrite + s.requestRead(len(header)) + for len(header) != 0 { + n, err := s.trReader.ReadMessageHeader(header) + header = header[n:] + if len(header) == 0 { + err = nil + } + if err != nil { + if n > 0 && err == io.EOF { + err = io.ErrUnexpectedEOF + } + return err + } } - s.hdrMu.Lock() - s.trailer = metadata.Join(s.trailer, md) - s.hdrMu.Unlock() return nil } -func (s *Stream) write(m recvMsg) { - s.buf.put(m) -} - -// Read reads all p bytes from the wire for this stream. -func (s *Stream) Read(p []byte) (n int, err error) { +// Read reads n bytes from the wire for this stream. +func (s *Stream) read(n int) (data mem.BufferSlice, err error) { // Don't request a read if there was an error earlier - if er := s.trReader.(*transportReader).er; er != nil { - return 0, er + if er := s.trReader.er; er != nil { + return nil, er + } + s.requestRead(n) + for n != 0 { + buf, err := s.trReader.Read(n) + var bufLen int + if buf != nil { + bufLen = buf.Len() + } + n -= bufLen + if n == 0 { + err = nil + } + if err != nil { + if bufLen > 0 && err == io.EOF { + err = io.ErrUnexpectedEOF + } + data.Free() + return nil, err + } + data = append(data, buf) } - s.requestRead(len(p)) - return io.ReadFull(s.trReader, p) + return data, nil } -// tranportReader reads all the data available for this Stream from the transport and +// transportReader reads all the data available for this Stream from the transport and // passes them into the decoder, which converts them into a gRPC message stream. // The error is io.EOF when the stream is done or another non-nil error if // the stream broke. type transportReader struct { - reader io.Reader + reader *recvBufferReader // The handler to control the window update procedure for both this // particular stream and the associated transport. windowHandler func(int) er error } -func (t *transportReader) Read(p []byte) (n int, err error) { - n, err = t.reader.Read(p) +func (t *transportReader) ReadMessageHeader(header []byte) (int, error) { + n, err := t.reader.ReadMessageHeader(header) if err != nil { t.er = err - return + return 0, err } t.windowHandler(n) - return -} - -// BytesReceived indicates whether any bytes have been received on this stream. -func (s *Stream) BytesReceived() bool { - return atomic.LoadUint32(&s.bytesReceived) == 1 + return n, nil } -// Unprocessed indicates whether the server did not process this stream -- -// i.e. it sent a refused stream or GOAWAY including this stream ID. -func (s *Stream) Unprocessed() bool { - return atomic.LoadUint32(&s.unprocessed) == 1 +func (t *transportReader) Read(n int) (mem.Buffer, error) { + buf, err := t.reader.Read(n) + if err != nil { + t.er = err + return buf, err + } + t.windowHandler(buf.Len()) + return buf, nil } // GoString is implemented by Stream so context.String() won't @@ -574,6 +465,8 @@ type ServerConfig struct { ChannelzParent *channelz.Server MaxHeaderListSize *uint32 HeaderTableSize *uint32 + BufferPool mem.BufferPool + StaticWindowSize bool } // ConnectOptions covers all relevant options for communicating with the server. @@ -610,19 +503,15 @@ type ConnectOptions struct { ChannelzParent *channelz.SubChannel // MaxHeaderListSize sets the max (uncompressed) size of header list that is prepared to be received. MaxHeaderListSize *uint32 - // UseProxy specifies if a proxy should be used. - UseProxy bool -} - -// NewClientTransport establishes the transport with the required ConnectOptions -// and returns it to the caller. -func NewClientTransport(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (ClientTransport, error) { - return newHTTP2Client(connectCtx, ctx, addr, opts, onClose) + // The mem.BufferPool to use when reading/writing to the wire. + BufferPool mem.BufferPool + // StaticWindowSize controls whether dynamic window sizing is enabled. + StaticWindowSize bool } -// Options provides additional hints and information for message +// WriteOptions provides additional hints and information for message // transmission. -type Options struct { +type WriteOptions struct { // Last indicates whether this write is the last piece for // this stream. Last bool @@ -654,6 +543,11 @@ type CallHdr struct { PreviousAttempts int // value of grpc-previous-rpc-attempts header to set DoneFunc func() // called when the stream is finished + + // Authority is used to explicitly override the `:authority` header. If set, + // this value takes precedence over the Host field and will be used as the + // value for the `:authority` header. + Authority string } // ClientTransport is the common interface for all gRPC client-side transport @@ -671,18 +565,8 @@ type ClientTransport interface { // It does not block. GracefulClose() - // Write sends the data for the given stream. A nil stream indicates - // the write is to be performed on the transport as a whole. - Write(s *Stream, hdr []byte, data []byte, opts *Options) error - // NewStream creates a Stream for an RPC. - NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) - - // CloseStream clears the footprint of a stream when the stream is - // not needed any more. The err indicates the error incurred when - // CloseStream is called. Must be called when a stream is finished - // unless the associated transport is closing. - CloseStream(stream *Stream, err error) + NewStream(ctx context.Context, callHdr *CallHdr) (*ClientStream, error) // Error returns a channel that is closed when some I/O error // happens. Typically the caller should have a goroutine to monitor @@ -702,12 +586,6 @@ type ClientTransport interface { // RemoteAddr returns the remote network address. RemoteAddr() net.Addr - - // IncrMsgSent increments the number of message sent through this transport. - IncrMsgSent() - - // IncrMsgRecv increments the number of message received through this transport. - IncrMsgRecv() } // ServerTransport is the common interface for all gRPC server-side transport @@ -717,19 +595,7 @@ type ClientTransport interface { // Write methods for a given Stream will be called serially. type ServerTransport interface { // HandleStreams receives incoming streams using the given handler. - HandleStreams(context.Context, func(*Stream)) - - // WriteHeader sends the header metadata for the given stream. - // WriteHeader may not be called on all streams. - WriteHeader(s *Stream, md metadata.MD) error - - // Write sends the data for the given stream. - // Write may not be called on all streams. - Write(s *Stream, hdr []byte, data []byte, opts *Options) error - - // WriteStatus sends the status of a stream to the client. WriteStatus is - // the final call made on a stream and always occurs. - WriteStatus(s *Stream, st *status.Status) error + HandleStreams(context.Context, func(*ServerStream)) // Close tears down the transport. Once it is called, the transport // should not be accessed any more. All the pending streams and their @@ -741,12 +607,14 @@ type ServerTransport interface { // Drain notifies the client this ServerTransport stops accepting new RPCs. Drain(debugData string) +} - // IncrMsgSent increments the number of message sent through this transport. - IncrMsgSent() - - // IncrMsgRecv increments the number of message received through this transport. - IncrMsgRecv() +type internalServerTransport interface { + ServerTransport + writeHeader(s *ServerStream, md metadata.MD) error + write(s *ServerStream, hdr []byte, data mem.BufferSlice, opts *WriteOptions) error + writeStatus(s *ServerStream, st *status.Status) error + incrMsgRecv() } // connectionErrorf creates an ConnectionError with the specified error description. @@ -798,7 +666,7 @@ var ( // connection is draining. This could be caused by goaway or balancer // removing the address. errStreamDrain = status.Error(codes.Unavailable, "the connection is draining") - // errStreamDone is returned from write at the client side to indiacte application + // errStreamDone is returned from write at the client side to indicate application // layer of an error. errStreamDone = errors.New("the stream is done") // StatusGoAway indicates that the server sent a GOAWAY that included this diff --git a/vendor/google.golang.org/grpc/keepalive/keepalive.go b/vendor/google.golang.org/grpc/keepalive/keepalive.go index 34d31b5e7d..eb42b19fb9 100644 --- a/vendor/google.golang.org/grpc/keepalive/keepalive.go +++ b/vendor/google.golang.org/grpc/keepalive/keepalive.go @@ -34,15 +34,29 @@ type ClientParameters struct { // After a duration of this time if the client doesn't see any activity it // pings the server to see if the transport is still alive. // If set below 10s, a minimum value of 10s will be used instead. - Time time.Duration // The current default value is infinity. + // + // Note that gRPC servers have a default EnforcementPolicy.MinTime of 5 + // minutes (which means the client shouldn't ping more frequently than every + // 5 minutes). + // + // Though not ideal, it's not a strong requirement for Time to be less than + // EnforcementPolicy.MinTime. Time will automatically double if the server + // disconnects due to its enforcement policy. + // + // For more details, see + // https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md + Time time.Duration // After having pinged for keepalive check, the client waits for a duration // of Timeout and if no activity is seen even after that the connection is // closed. - Timeout time.Duration // The current default value is 20 seconds. + // + // If keepalive is enabled, and this value is not explicitly set, the default + // is 20 seconds. + Timeout time.Duration // If true, client sends keepalive pings even with no active RPCs. If false, // when there are no active RPCs, Time and Timeout will be ignored and no // keepalive pings will be sent. - PermitWithoutStream bool // false by default. + PermitWithoutStream bool } // ServerParameters is used to set keepalive and max-age parameters on the diff --git a/vendor/google.golang.org/grpc/mem/buffer_pool.go b/vendor/google.golang.org/grpc/mem/buffer_pool.go new file mode 100644 index 0000000000..c37c58c023 --- /dev/null +++ b/vendor/google.golang.org/grpc/mem/buffer_pool.go @@ -0,0 +1,194 @@ +/* + * + * Copyright 2024 gRPC 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 mem + +import ( + "sort" + "sync" + + "google.golang.org/grpc/internal" +) + +// BufferPool is a pool of buffers that can be shared and reused, resulting in +// decreased memory allocation. +type BufferPool interface { + // Get returns a buffer with specified length from the pool. + Get(length int) *[]byte + + // Put returns a buffer to the pool. + Put(*[]byte) +} + +var defaultBufferPoolSizes = []int{ + 256, + 4 << 10, // 4KB (go page size) + 16 << 10, // 16KB (max HTTP/2 frame size used by gRPC) + 32 << 10, // 32KB (default buffer size for io.Copy) + 1 << 20, // 1MB +} + +var defaultBufferPool BufferPool + +func init() { + defaultBufferPool = NewTieredBufferPool(defaultBufferPoolSizes...) + + internal.SetDefaultBufferPoolForTesting = func(pool BufferPool) { + defaultBufferPool = pool + } + + internal.SetBufferPoolingThresholdForTesting = func(threshold int) { + bufferPoolingThreshold = threshold + } +} + +// DefaultBufferPool returns the current default buffer pool. It is a BufferPool +// created with NewBufferPool that uses a set of default sizes optimized for +// expected workflows. +func DefaultBufferPool() BufferPool { + return defaultBufferPool +} + +// NewTieredBufferPool returns a BufferPool implementation that uses multiple +// underlying pools of the given pool sizes. +func NewTieredBufferPool(poolSizes ...int) BufferPool { + sort.Ints(poolSizes) + pools := make([]*sizedBufferPool, len(poolSizes)) + for i, s := range poolSizes { + pools[i] = newSizedBufferPool(s) + } + return &tieredBufferPool{ + sizedPools: pools, + } +} + +// tieredBufferPool implements the BufferPool interface with multiple tiers of +// buffer pools for different sizes of buffers. +type tieredBufferPool struct { + sizedPools []*sizedBufferPool + fallbackPool simpleBufferPool +} + +func (p *tieredBufferPool) Get(size int) *[]byte { + return p.getPool(size).Get(size) +} + +func (p *tieredBufferPool) Put(buf *[]byte) { + p.getPool(cap(*buf)).Put(buf) +} + +func (p *tieredBufferPool) getPool(size int) BufferPool { + poolIdx := sort.Search(len(p.sizedPools), func(i int) bool { + return p.sizedPools[i].defaultSize >= size + }) + + if poolIdx == len(p.sizedPools) { + return &p.fallbackPool + } + + return p.sizedPools[poolIdx] +} + +// sizedBufferPool is a BufferPool implementation that is optimized for specific +// buffer sizes. For example, HTTP/2 frames within gRPC have a default max size +// of 16kb and a sizedBufferPool can be configured to only return buffers with a +// capacity of 16kb. Note that however it does not support returning larger +// buffers and in fact panics if such a buffer is requested. Because of this, +// this BufferPool implementation is not meant to be used on its own and rather +// is intended to be embedded in a tieredBufferPool such that Get is only +// invoked when the required size is smaller than or equal to defaultSize. +type sizedBufferPool struct { + pool sync.Pool + defaultSize int +} + +func (p *sizedBufferPool) Get(size int) *[]byte { + buf := p.pool.Get().(*[]byte) + b := *buf + clear(b[:cap(b)]) + *buf = b[:size] + return buf +} + +func (p *sizedBufferPool) Put(buf *[]byte) { + if cap(*buf) < p.defaultSize { + // Ignore buffers that are too small to fit in the pool. Otherwise, when + // Get is called it will panic as it tries to index outside the bounds + // of the buffer. + return + } + p.pool.Put(buf) +} + +func newSizedBufferPool(size int) *sizedBufferPool { + return &sizedBufferPool{ + pool: sync.Pool{ + New: func() any { + buf := make([]byte, size) + return &buf + }, + }, + defaultSize: size, + } +} + +var _ BufferPool = (*simpleBufferPool)(nil) + +// simpleBufferPool is an implementation of the BufferPool interface that +// attempts to pool buffers with a sync.Pool. When Get is invoked, it tries to +// acquire a buffer from the pool but if that buffer is too small, it returns it +// to the pool and creates a new one. +type simpleBufferPool struct { + pool sync.Pool +} + +func (p *simpleBufferPool) Get(size int) *[]byte { + bs, ok := p.pool.Get().(*[]byte) + if ok && cap(*bs) >= size { + *bs = (*bs)[:size] + return bs + } + + // A buffer was pulled from the pool, but it is too small. Put it back in + // the pool and create one large enough. + if ok { + p.pool.Put(bs) + } + + b := make([]byte, size) + return &b +} + +func (p *simpleBufferPool) Put(buf *[]byte) { + p.pool.Put(buf) +} + +var _ BufferPool = NopBufferPool{} + +// NopBufferPool is a buffer pool that returns new buffers without pooling. +type NopBufferPool struct{} + +// Get returns a buffer with specified length from the pool. +func (NopBufferPool) Get(length int) *[]byte { + b := make([]byte, length) + return &b +} + +// Put returns a buffer to the pool. +func (NopBufferPool) Put(*[]byte) { +} diff --git a/vendor/google.golang.org/grpc/mem/buffer_slice.go b/vendor/google.golang.org/grpc/mem/buffer_slice.go new file mode 100644 index 0000000000..af510d20c5 --- /dev/null +++ b/vendor/google.golang.org/grpc/mem/buffer_slice.go @@ -0,0 +1,292 @@ +/* + * + * Copyright 2024 gRPC 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 mem + +import ( + "io" +) + +const ( + // 32 KiB is what io.Copy uses. + readAllBufSize = 32 * 1024 +) + +// BufferSlice offers a means to represent data that spans one or more Buffer +// instances. A BufferSlice is meant to be immutable after creation, and methods +// like Ref create and return copies of the slice. This is why all methods have +// value receivers rather than pointer receivers. +// +// Note that any of the methods that read the underlying buffers such as Ref, +// Len or CopyTo etc., will panic if any underlying buffers have already been +// freed. It is recommended to not directly interact with any of the underlying +// buffers directly, rather such interactions should be mediated through the +// various methods on this type. +// +// By convention, any APIs that return (mem.BufferSlice, error) should reduce +// the burden on the caller by never returning a mem.BufferSlice that needs to +// be freed if the error is non-nil, unless explicitly stated. +type BufferSlice []Buffer + +// Len returns the sum of the length of all the Buffers in this slice. +// +// # Warning +// +// Invoking the built-in len on a BufferSlice will return the number of buffers +// in the slice, and *not* the value returned by this function. +func (s BufferSlice) Len() int { + var length int + for _, b := range s { + length += b.Len() + } + return length +} + +// Ref invokes Ref on each buffer in the slice. +func (s BufferSlice) Ref() { + for _, b := range s { + b.Ref() + } +} + +// Free invokes Buffer.Free() on each Buffer in the slice. +func (s BufferSlice) Free() { + for _, b := range s { + b.Free() + } +} + +// CopyTo copies each of the underlying Buffer's data into the given buffer, +// returning the number of bytes copied. Has the same semantics as the copy +// builtin in that it will copy as many bytes as it can, stopping when either dst +// is full or s runs out of data, returning the minimum of s.Len() and len(dst). +func (s BufferSlice) CopyTo(dst []byte) int { + off := 0 + for _, b := range s { + off += copy(dst[off:], b.ReadOnlyData()) + } + return off +} + +// Materialize concatenates all the underlying Buffer's data into a single +// contiguous buffer using CopyTo. +func (s BufferSlice) Materialize() []byte { + l := s.Len() + if l == 0 { + return nil + } + out := make([]byte, l) + s.CopyTo(out) + return out +} + +// MaterializeToBuffer functions like Materialize except that it writes the data +// to a single Buffer pulled from the given BufferPool. +// +// As a special case, if the input BufferSlice only actually has one Buffer, this +// function simply increases the refcount before returning said Buffer. Freeing this +// buffer won't release it until the BufferSlice is itself released. +func (s BufferSlice) MaterializeToBuffer(pool BufferPool) Buffer { + if len(s) == 1 { + s[0].Ref() + return s[0] + } + sLen := s.Len() + if sLen == 0 { + return emptyBuffer{} + } + buf := pool.Get(sLen) + s.CopyTo(*buf) + return NewBuffer(buf, pool) +} + +// Reader returns a new Reader for the input slice after taking references to +// each underlying buffer. +func (s BufferSlice) Reader() Reader { + s.Ref() + return &sliceReader{ + data: s, + len: s.Len(), + } +} + +// Reader exposes a BufferSlice's data as an io.Reader, allowing it to interface +// with other parts systems. It also provides an additional convenience method +// Remaining(), which returns the number of unread bytes remaining in the slice. +// Buffers will be freed as they are read. +type Reader interface { + io.Reader + io.ByteReader + // Close frees the underlying BufferSlice and never returns an error. Subsequent + // calls to Read will return (0, io.EOF). + Close() error + // Remaining returns the number of unread bytes remaining in the slice. + Remaining() int + // Reset frees the currently held buffer slice and starts reading from the + // provided slice. This allows reusing the reader object. + Reset(s BufferSlice) +} + +type sliceReader struct { + data BufferSlice + len int + // The index into data[0].ReadOnlyData(). + bufferIdx int +} + +func (r *sliceReader) Remaining() int { + return r.len +} + +func (r *sliceReader) Reset(s BufferSlice) { + r.data.Free() + s.Ref() + r.data = s + r.len = s.Len() + r.bufferIdx = 0 +} + +func (r *sliceReader) Close() error { + r.data.Free() + r.data = nil + r.len = 0 + return nil +} + +func (r *sliceReader) freeFirstBufferIfEmpty() bool { + if len(r.data) == 0 || r.bufferIdx != len(r.data[0].ReadOnlyData()) { + return false + } + + r.data[0].Free() + r.data = r.data[1:] + r.bufferIdx = 0 + return true +} + +func (r *sliceReader) Read(buf []byte) (n int, _ error) { + if r.len == 0 { + return 0, io.EOF + } + + for len(buf) != 0 && r.len != 0 { + // Copy as much as possible from the first Buffer in the slice into the + // given byte slice. + data := r.data[0].ReadOnlyData() + copied := copy(buf, data[r.bufferIdx:]) + r.len -= copied // Reduce len by the number of bytes copied. + r.bufferIdx += copied // Increment the buffer index. + n += copied // Increment the total number of bytes read. + buf = buf[copied:] // Shrink the given byte slice. + + // If we have copied all the data from the first Buffer, free it and advance to + // the next in the slice. + r.freeFirstBufferIfEmpty() + } + + return n, nil +} + +func (r *sliceReader) ReadByte() (byte, error) { + if r.len == 0 { + return 0, io.EOF + } + + // There may be any number of empty buffers in the slice, clear them all until a + // non-empty buffer is reached. This is guaranteed to exit since r.len is not 0. + for r.freeFirstBufferIfEmpty() { + } + + b := r.data[0].ReadOnlyData()[r.bufferIdx] + r.len-- + r.bufferIdx++ + // Free the first buffer in the slice if the last byte was read + r.freeFirstBufferIfEmpty() + return b, nil +} + +var _ io.Writer = (*writer)(nil) + +type writer struct { + buffers *BufferSlice + pool BufferPool +} + +func (w *writer) Write(p []byte) (n int, err error) { + b := Copy(p, w.pool) + *w.buffers = append(*w.buffers, b) + return b.Len(), nil +} + +// NewWriter wraps the given BufferSlice and BufferPool to implement the +// io.Writer interface. Every call to Write copies the contents of the given +// buffer into a new Buffer pulled from the given pool and the Buffer is +// added to the given BufferSlice. +func NewWriter(buffers *BufferSlice, pool BufferPool) io.Writer { + return &writer{buffers: buffers, pool: pool} +} + +// ReadAll reads from r until an error or EOF and returns the data it read. +// A successful call returns err == nil, not err == EOF. Because ReadAll is +// defined to read from src until EOF, it does not treat an EOF from Read +// as an error to be reported. +// +// Important: A failed call returns a non-nil error and may also return +// partially read buffers. It is the responsibility of the caller to free the +// BufferSlice returned, or its memory will not be reused. +func ReadAll(r io.Reader, pool BufferPool) (BufferSlice, error) { + var result BufferSlice + if wt, ok := r.(io.WriterTo); ok { + // This is more optimal since wt knows the size of chunks it wants to + // write and, hence, we can allocate buffers of an optimal size to fit + // them. E.g. might be a single big chunk, and we wouldn't chop it + // into pieces. + w := NewWriter(&result, pool) + _, err := wt.WriteTo(w) + return result, err + } +nextBuffer: + for { + buf := pool.Get(readAllBufSize) + // We asked for 32KiB but may have been given a bigger buffer. + // Use all of it if that's the case. + *buf = (*buf)[:cap(*buf)] + usedCap := 0 + for { + n, err := r.Read((*buf)[usedCap:]) + usedCap += n + if err != nil { + if usedCap == 0 { + // Nothing in this buf, put it back + pool.Put(buf) + } else { + *buf = (*buf)[:usedCap] + result = append(result, NewBuffer(buf, pool)) + } + if err == io.EOF { + err = nil + } + return result, err + } + if len(*buf) == usedCap { + result = append(result, NewBuffer(buf, pool)) + continue nextBuffer + } + } + } +} diff --git a/vendor/google.golang.org/grpc/mem/buffers.go b/vendor/google.golang.org/grpc/mem/buffers.go new file mode 100644 index 0000000000..ecbf0b9a73 --- /dev/null +++ b/vendor/google.golang.org/grpc/mem/buffers.go @@ -0,0 +1,268 @@ +/* + * + * Copyright 2024 gRPC 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 mem provides utilities that facilitate memory reuse in byte slices +// that are used as buffers. +// +// # Experimental +// +// Notice: All APIs in this package are EXPERIMENTAL and may be changed or +// removed in a later release. +package mem + +import ( + "fmt" + "sync" + "sync/atomic" +) + +// A Buffer represents a reference counted piece of data (in bytes) that can be +// acquired by a call to NewBuffer() or Copy(). A reference to a Buffer may be +// released by calling Free(), which invokes the free function given at creation +// only after all references are released. +// +// Note that a Buffer is not safe for concurrent access and instead each +// goroutine should use its own reference to the data, which can be acquired via +// a call to Ref(). +// +// Attempts to access the underlying data after releasing the reference to the +// Buffer will panic. +type Buffer interface { + // ReadOnlyData returns the underlying byte slice. Note that it is undefined + // behavior to modify the contents of this slice in any way. + ReadOnlyData() []byte + // Ref increases the reference counter for this Buffer. + Ref() + // Free decrements this Buffer's reference counter and frees the underlying + // byte slice if the counter reaches 0 as a result of this call. + Free() + // Len returns the Buffer's size. + Len() int + + split(n int) (left, right Buffer) + read(buf []byte) (int, Buffer) +} + +var ( + bufferPoolingThreshold = 1 << 10 + + bufferObjectPool = sync.Pool{New: func() any { return new(buffer) }} + refObjectPool = sync.Pool{New: func() any { return new(atomic.Int32) }} +) + +// IsBelowBufferPoolingThreshold returns true if the given size is less than or +// equal to the threshold for buffer pooling. This is used to determine whether +// to pool buffers or allocate them directly. +func IsBelowBufferPoolingThreshold(size int) bool { + return size <= bufferPoolingThreshold +} + +type buffer struct { + origData *[]byte + data []byte + refs *atomic.Int32 + pool BufferPool +} + +func newBuffer() *buffer { + return bufferObjectPool.Get().(*buffer) +} + +// NewBuffer creates a new Buffer from the given data, initializing the reference +// counter to 1. The data will then be returned to the given pool when all +// references to the returned Buffer are released. As a special case to avoid +// additional allocations, if the given buffer pool is nil, the returned buffer +// will be a "no-op" Buffer where invoking Buffer.Free() does nothing and the +// underlying data is never freed. +// +// Note that the backing array of the given data is not copied. +func NewBuffer(data *[]byte, pool BufferPool) Buffer { + // Use the buffer's capacity instead of the length, otherwise buffers may + // not be reused under certain conditions. For example, if a large buffer + // is acquired from the pool, but fewer bytes than the buffering threshold + // are written to it, the buffer will not be returned to the pool. + if pool == nil || IsBelowBufferPoolingThreshold(cap(*data)) { + return (SliceBuffer)(*data) + } + b := newBuffer() + b.origData = data + b.data = *data + b.pool = pool + b.refs = refObjectPool.Get().(*atomic.Int32) + b.refs.Add(1) + return b +} + +// Copy creates a new Buffer from the given data, initializing the reference +// counter to 1. +// +// It acquires a []byte from the given pool and copies over the backing array +// of the given data. The []byte acquired from the pool is returned to the +// pool when all references to the returned Buffer are released. +func Copy(data []byte, pool BufferPool) Buffer { + if IsBelowBufferPoolingThreshold(len(data)) { + buf := make(SliceBuffer, len(data)) + copy(buf, data) + return buf + } + + buf := pool.Get(len(data)) + copy(*buf, data) + return NewBuffer(buf, pool) +} + +func (b *buffer) ReadOnlyData() []byte { + if b.refs == nil { + panic("Cannot read freed buffer") + } + return b.data +} + +func (b *buffer) Ref() { + if b.refs == nil { + panic("Cannot ref freed buffer") + } + b.refs.Add(1) +} + +func (b *buffer) Free() { + if b.refs == nil { + panic("Cannot free freed buffer") + } + + refs := b.refs.Add(-1) + switch { + case refs > 0: + return + case refs == 0: + if b.pool != nil { + b.pool.Put(b.origData) + } + + refObjectPool.Put(b.refs) + b.origData = nil + b.data = nil + b.refs = nil + b.pool = nil + bufferObjectPool.Put(b) + default: + panic("Cannot free freed buffer") + } +} + +func (b *buffer) Len() int { + return len(b.ReadOnlyData()) +} + +func (b *buffer) split(n int) (Buffer, Buffer) { + if b.refs == nil { + panic("Cannot split freed buffer") + } + + b.refs.Add(1) + split := newBuffer() + split.origData = b.origData + split.data = b.data[n:] + split.refs = b.refs + split.pool = b.pool + + b.data = b.data[:n] + + return b, split +} + +func (b *buffer) read(buf []byte) (int, Buffer) { + if b.refs == nil { + panic("Cannot read freed buffer") + } + + n := copy(buf, b.data) + if n == len(b.data) { + b.Free() + return n, nil + } + + b.data = b.data[n:] + return n, b +} + +func (b *buffer) String() string { + return fmt.Sprintf("mem.Buffer(%p, data: %p, length: %d)", b, b.ReadOnlyData(), len(b.ReadOnlyData())) +} + +// ReadUnsafe reads bytes from the given Buffer into the provided slice. +// It does not perform safety checks. +func ReadUnsafe(dst []byte, buf Buffer) (int, Buffer) { + return buf.read(dst) +} + +// SplitUnsafe modifies the receiver to point to the first n bytes while it +// returns a new reference to the remaining bytes. The returned Buffer +// functions just like a normal reference acquired using Ref(). +func SplitUnsafe(buf Buffer, n int) (left, right Buffer) { + return buf.split(n) +} + +type emptyBuffer struct{} + +func (e emptyBuffer) ReadOnlyData() []byte { + return nil +} + +func (e emptyBuffer) Ref() {} +func (e emptyBuffer) Free() {} + +func (e emptyBuffer) Len() int { + return 0 +} + +func (e emptyBuffer) split(int) (left, right Buffer) { + return e, e +} + +func (e emptyBuffer) read([]byte) (int, Buffer) { + return 0, e +} + +// SliceBuffer is a Buffer implementation that wraps a byte slice. It provides +// methods for reading, splitting, and managing the byte slice. +type SliceBuffer []byte + +// ReadOnlyData returns the byte slice. +func (s SliceBuffer) ReadOnlyData() []byte { return s } + +// Ref is a noop implementation of Ref. +func (s SliceBuffer) Ref() {} + +// Free is a noop implementation of Free. +func (s SliceBuffer) Free() {} + +// Len is a noop implementation of Len. +func (s SliceBuffer) Len() int { return len(s) } + +func (s SliceBuffer) split(n int) (left, right Buffer) { + return s[:n], s[n:] +} + +func (s SliceBuffer) read(buf []byte) (int, Buffer) { + n := copy(buf, s) + if n == len(s) { + return n, nil + } + return n, s[n:] +} diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go index 1e9485fd6e..d2e15253bb 100644 --- a/vendor/google.golang.org/grpc/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/metadata/metadata.go @@ -213,11 +213,6 @@ func FromIncomingContext(ctx context.Context) (MD, bool) { // ValueFromIncomingContext returns the metadata value corresponding to the metadata // key from the incoming metadata if it exists. Keys are matched in a case insensitive // manner. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. func ValueFromIncomingContext(ctx context.Context, key string) []string { md, ok := ctx.Value(mdIncomingKey{}).(MD) if !ok { @@ -228,7 +223,7 @@ func ValueFromIncomingContext(ctx context.Context, key string) []string { return copyOf(v) } for k, v := range md { - // Case insenitive comparison: MD is a map, and there's no guarantee + // Case insensitive comparison: MD is a map, and there's no guarantee // that the MD attached to the context is created using our helper // functions. if strings.EqualFold(k, key) { diff --git a/vendor/google.golang.org/grpc/peer/peer.go b/vendor/google.golang.org/grpc/peer/peer.go index a821ff9b2b..499a49c8c1 100644 --- a/vendor/google.golang.org/grpc/peer/peer.go +++ b/vendor/google.golang.org/grpc/peer/peer.go @@ -22,7 +22,9 @@ package peer import ( "context" + "fmt" "net" + "strings" "google.golang.org/grpc/credentials" ) @@ -39,6 +41,34 @@ type Peer struct { AuthInfo credentials.AuthInfo } +// String ensures the Peer types implements the Stringer interface in order to +// allow to print a context with a peerKey value effectively. +func (p *Peer) String() string { + if p == nil { + return "Peer" + } + sb := &strings.Builder{} + sb.WriteString("Peer{") + if p.Addr != nil { + fmt.Fprintf(sb, "Addr: '%s', ", p.Addr.String()) + } else { + fmt.Fprintf(sb, "Addr: , ") + } + if p.LocalAddr != nil { + fmt.Fprintf(sb, "LocalAddr: '%s', ", p.LocalAddr.String()) + } else { + fmt.Fprintf(sb, "LocalAddr: , ") + } + if p.AuthInfo != nil { + fmt.Fprintf(sb, "AuthInfo: '%s'", p.AuthInfo.AuthType()) + } else { + fmt.Fprintf(sb, "AuthInfo: ") + } + sb.WriteString("}") + + return sb.String() +} + type peerKey struct{} // NewContext creates a new context with peer information attached. diff --git a/vendor/google.golang.org/grpc/picker_wrapper.go b/vendor/google.golang.org/grpc/picker_wrapper.go index bf56faa76d..aa52bfe95f 100644 --- a/vendor/google.golang.org/grpc/picker_wrapper.go +++ b/vendor/google.golang.org/grpc/picker_wrapper.go @@ -20,47 +20,52 @@ package grpc import ( "context" + "fmt" "io" - "sync" + "sync/atomic" "google.golang.org/grpc/balancer" "google.golang.org/grpc/codes" "google.golang.org/grpc/internal/channelz" istatus "google.golang.org/grpc/internal/status" "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/stats" "google.golang.org/grpc/status" ) +// pickerGeneration stores a picker and a channel used to signal that a picker +// newer than this one is available. +type pickerGeneration struct { + // picker is the picker produced by the LB policy. May be nil if a picker + // has never been produced. + picker balancer.Picker + // blockingCh is closed when the picker has been invalidated because there + // is a new one available. + blockingCh chan struct{} +} + // pickerWrapper is a wrapper of balancer.Picker. It blocks on certain pick // actions and unblock when there's a picker update. type pickerWrapper struct { - mu sync.Mutex - done bool - blockingCh chan struct{} - picker balancer.Picker - statsHandlers []stats.Handler // to record blocking picker calls + // If pickerGen holds a nil pointer, the pickerWrapper is closed. + pickerGen atomic.Pointer[pickerGeneration] } -func newPickerWrapper(statsHandlers []stats.Handler) *pickerWrapper { - return &pickerWrapper{ - blockingCh: make(chan struct{}), - statsHandlers: statsHandlers, - } +func newPickerWrapper() *pickerWrapper { + pw := &pickerWrapper{} + pw.pickerGen.Store(&pickerGeneration{ + blockingCh: make(chan struct{}), + }) + return pw } -// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick. +// updatePicker is called by UpdateState calls from the LB policy. It +// unblocks all blocked pick. func (pw *pickerWrapper) updatePicker(p balancer.Picker) { - pw.mu.Lock() - if pw.done { - pw.mu.Unlock() - return - } - pw.picker = p - // pw.blockingCh should never be nil. - close(pw.blockingCh) - pw.blockingCh = make(chan struct{}) - pw.mu.Unlock() + old := pw.pickerGen.Swap(&pickerGeneration{ + picker: p, + blockingCh: make(chan struct{}), + }) + close(old.blockingCh) } // doneChannelzWrapper performs the following: @@ -84,6 +89,12 @@ func doneChannelzWrapper(acbw *acBalancerWrapper, result *balancer.PickResult) { } } +type pick struct { + transport transport.ClientTransport // the selected transport + result balancer.PickResult // the contents of the pick from the LB policy + blocked bool // set if a picker call queued for a new picker +} + // pick returns the transport that will be used for the RPC. // It may block in the following cases: // - there's no picker @@ -91,39 +102,37 @@ func doneChannelzWrapper(acbw *acBalancerWrapper, result *balancer.PickResult) { // - the current picker returns other errors and failfast is false. // - the subConn returned by the current picker is not READY // When one of these situations happens, pick blocks until the picker gets updated. -func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (transport.ClientTransport, balancer.PickResult, error) { +func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (pick, error) { var ch chan struct{} var lastPickErr error + pickBlocked := false for { - pw.mu.Lock() - if pw.done { - pw.mu.Unlock() - return nil, balancer.PickResult{}, ErrClientConnClosing + pg := pw.pickerGen.Load() + if pg == nil { + return pick{}, ErrClientConnClosing } - - if pw.picker == nil { - ch = pw.blockingCh + if pg.picker == nil { + ch = pg.blockingCh } - if ch == pw.blockingCh { + if ch == pg.blockingCh { // This could happen when either: // - pw.picker is nil (the previous if condition), or - // - has called pick on the current picker. - pw.mu.Unlock() + // - we have already called pick on the current picker. select { case <-ctx.Done(): var errStr string if lastPickErr != nil { errStr = "latest balancer error: " + lastPickErr.Error() } else { - errStr = ctx.Err().Error() + errStr = fmt.Sprintf("%v while waiting for connections to become ready", ctx.Err()) } switch ctx.Err() { case context.DeadlineExceeded: - return nil, balancer.PickResult{}, status.Error(codes.DeadlineExceeded, errStr) + return pick{}, status.Error(codes.DeadlineExceeded, errStr) case context.Canceled: - return nil, balancer.PickResult{}, status.Error(codes.Canceled, errStr) + return pick{}, status.Error(codes.Canceled, errStr) } case <-ch: } @@ -139,14 +148,11 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. // In the second case, the only way it will get to this conditional is // if there is a new picker. if ch != nil { - for _, sh := range pw.statsHandlers { - sh.HandleRPC(ctx, &stats.PickerUpdated{}) - } + pickBlocked = true } - ch = pw.blockingCh - p := pw.picker - pw.mu.Unlock() + ch = pg.blockingCh + p := pg.picker pickResult, err := p.Pick(info) if err != nil { @@ -159,7 +165,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. if istatus.IsRestrictedControlPlaneCode(st) { err = status.Errorf(codes.Internal, "received picker error with illegal status: %v", err) } - return nil, balancer.PickResult{}, dropError{error: err} + return pick{}, dropError{error: err} } // For all other errors, wait for ready RPCs should block and other // RPCs should fail with unavailable. @@ -167,7 +173,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. lastPickErr = err continue } - return nil, balancer.PickResult{}, status.Error(codes.Unavailable, err.Error()) + return pick{}, status.Error(codes.Unavailable, err.Error()) } acbw, ok := pickResult.SubConn.(*acBalancerWrapper) @@ -178,9 +184,8 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. if t := acbw.ac.getReadyTransport(); t != nil { if channelz.IsOn() { doneChannelzWrapper(acbw, &pickResult) - return t, pickResult, nil } - return t, pickResult, nil + return pick{transport: t, result: pickResult, blocked: pickBlocked}, nil } if pickResult.Done != nil { // Calling done with nil error, no bytes sent and no bytes received. @@ -196,24 +201,15 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. } func (pw *pickerWrapper) close() { - pw.mu.Lock() - defer pw.mu.Unlock() - if pw.done { - return - } - pw.done = true - close(pw.blockingCh) + old := pw.pickerGen.Swap(nil) + close(old.blockingCh) } // reset clears the pickerWrapper and prepares it for being used again when idle // mode is exited. func (pw *pickerWrapper) reset() { - pw.mu.Lock() - defer pw.mu.Unlock() - if pw.done { - return - } - pw.blockingCh = make(chan struct{}) + old := pw.pickerGen.Swap(&pickerGeneration{blockingCh: make(chan struct{})}) + close(old.blockingCh) } // dropError is a wrapper error that indicates the LB policy wishes to drop the diff --git a/vendor/google.golang.org/grpc/preloader.go b/vendor/google.golang.org/grpc/preloader.go index 73bd633643..ee0ff969af 100644 --- a/vendor/google.golang.org/grpc/preloader.go +++ b/vendor/google.golang.org/grpc/preloader.go @@ -20,6 +20,7 @@ package grpc import ( "google.golang.org/grpc/codes" + "google.golang.org/grpc/mem" "google.golang.org/grpc/status" ) @@ -31,9 +32,10 @@ import ( // later release. type PreparedMsg struct { // Struct for preparing msg before sending them - encodedData []byte + encodedData mem.BufferSlice hdr []byte - payload []byte + payload mem.BufferSlice + pf payloadFormat } // Encode marshalls and compresses the message using the codec and compressor for the stream. @@ -57,11 +59,27 @@ func (p *PreparedMsg) Encode(s Stream, msg any) error { if err != nil { return err } - p.encodedData = data - compData, err := compress(data, rpcInfo.preloaderInfo.cp, rpcInfo.preloaderInfo.comp) + + materializedData := data.Materialize() + data.Free() + p.encodedData = mem.BufferSlice{mem.SliceBuffer(materializedData)} + + // TODO: it should be possible to grab the bufferPool from the underlying + // stream implementation with a type cast to its actual type (such as + // addrConnStream) and accessing the buffer pool directly. + var compData mem.BufferSlice + compData, p.pf, err = compress(p.encodedData, rpcInfo.preloaderInfo.cp, rpcInfo.preloaderInfo.comp, mem.DefaultBufferPool()) if err != nil { return err } - p.hdr, p.payload = msgHeader(data, compData) + + if p.pf.isCompressed() { + materializedCompData := compData.Materialize() + compData.Free() + compData = mem.BufferSlice{mem.SliceBuffer(materializedCompData)} + } + + p.hdr, p.payload = msgHeader(p.encodedData, compData, p.pf) + return nil } diff --git a/vendor/google.golang.org/grpc/reflection/adapt.go b/vendor/google.golang.org/grpc/reflection/adapt.go index 33b907a36d..6997e47403 100644 --- a/vendor/google.golang.org/grpc/reflection/adapt.go +++ b/vendor/google.golang.org/grpc/reflection/adapt.go @@ -19,10 +19,11 @@ package reflection import ( + "google.golang.org/grpc/reflection/internal" + v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" - v1alphareflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" ) // asV1Alpha returns an implementation of the v1alpha version of the reflection @@ -44,7 +45,7 @@ type v1AlphaServerStreamAdapter struct { } func (s v1AlphaServerStreamAdapter) Send(response *v1reflectionpb.ServerReflectionResponse) error { - return s.ServerReflection_ServerReflectionInfoServer.Send(v1ToV1AlphaResponse(response)) + return s.ServerReflection_ServerReflectionInfoServer.Send(internal.V1ToV1AlphaResponse(response)) } func (s v1AlphaServerStreamAdapter) Recv() (*v1reflectionpb.ServerReflectionRequest, error) { @@ -52,136 +53,5 @@ func (s v1AlphaServerStreamAdapter) Recv() (*v1reflectionpb.ServerReflectionRequ if err != nil { return nil, err } - return v1AlphaToV1Request(resp), nil -} - -func v1ToV1AlphaResponse(v1 *v1reflectionpb.ServerReflectionResponse) *v1alphareflectionpb.ServerReflectionResponse { - var v1alpha v1alphareflectionpb.ServerReflectionResponse - v1alpha.ValidHost = v1.ValidHost - if v1.OriginalRequest != nil { - v1alpha.OriginalRequest = v1ToV1AlphaRequest(v1.OriginalRequest) - } - switch mr := v1.MessageResponse.(type) { - case *v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1alphareflectionpb.FileDescriptorResponse{ - FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ - AllExtensionNumbersResponse: &v1alphareflectionpb.ExtensionNumberResponse{ - BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), - ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_ListServicesResponse: - if mr != nil { - svcs := make([]*v1alphareflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) - for i, svc := range mr.ListServicesResponse.GetService() { - svcs[i] = &v1alphareflectionpb.ServiceResponse{ - Name: svc.GetName(), - } - } - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse{ - ListServicesResponse: &v1alphareflectionpb.ListServiceResponse{ - Service: svcs, - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_ErrorResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1alphareflectionpb.ErrorResponse{ - ErrorCode: mr.ErrorResponse.GetErrorCode(), - ErrorMessage: mr.ErrorResponse.GetErrorMessage(), - }, - } - } - default: - // no value set - } - return &v1alpha -} - -func v1AlphaToV1Request(v1alpha *v1alphareflectionpb.ServerReflectionRequest) *v1reflectionpb.ServerReflectionRequest { - var v1 v1reflectionpb.ServerReflectionRequest - v1.Host = v1alpha.Host - switch mr := v1alpha.MessageRequest.(type) { - case *v1alphareflectionpb.ServerReflectionRequest_FileByFilename: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileByFilename{ - FileByFilename: mr.FileByFilename, - } - case *v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingSymbol{ - FileContainingSymbol: mr.FileContainingSymbol, - } - case *v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension: - if mr.FileContainingExtension != nil { - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingExtension{ - FileContainingExtension: &v1reflectionpb.ExtensionRequest{ - ContainingType: mr.FileContainingExtension.GetContainingType(), - ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), - }, - } - } - case *v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ - AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, - } - case *v1alphareflectionpb.ServerReflectionRequest_ListServices: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_ListServices{ - ListServices: mr.ListServices, - } - default: - // no value set - } - return &v1 -} - -func v1ToV1AlphaRequest(v1 *v1reflectionpb.ServerReflectionRequest) *v1alphareflectionpb.ServerReflectionRequest { - var v1alpha v1alphareflectionpb.ServerReflectionRequest - v1alpha.Host = v1.Host - switch mr := v1.MessageRequest.(type) { - case *v1reflectionpb.ServerReflectionRequest_FileByFilename: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileByFilename{ - FileByFilename: mr.FileByFilename, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol{ - FileContainingSymbol: mr.FileContainingSymbol, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension{ - FileContainingExtension: &v1alphareflectionpb.ExtensionRequest{ - ContainingType: mr.FileContainingExtension.GetContainingType(), - ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), - }, - } - } - case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ - AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, - } - } - case *v1reflectionpb.ServerReflectionRequest_ListServices: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_ListServices{ - ListServices: mr.ListServices, - } - } - default: - // no value set - } - return &v1alpha + return internal.V1AlphaToV1Request(resp), nil } diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go index 8953c9d8d6..92f5292211 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go @@ -21,8 +21,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/reflection/v1/reflection.proto package grpc_reflection_v1 @@ -32,6 +32,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -43,16 +44,13 @@ const ( // The message sent by the client when calling ServerReflectionInfo method. type ServerReflectionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // To use reflection service, the client should set one of the following // fields in message_request. The server distinguishes requests by their // defined field and then handles them using corresponding methods. // - // Types that are assignable to MessageRequest: + // Types that are valid to be assigned to MessageRequest: // // *ServerReflectionRequest_FileByFilename // *ServerReflectionRequest_FileContainingSymbol @@ -60,15 +58,15 @@ type ServerReflectionRequest struct { // *ServerReflectionRequest_AllExtensionNumbersOfType // *ServerReflectionRequest_ListServices MessageRequest isServerReflectionRequest_MessageRequest `protobuf_oneof:"message_request"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionRequest) Reset() { *x = ServerReflectionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionRequest) String() string { @@ -79,7 +77,7 @@ func (*ServerReflectionRequest) ProtoMessage() {} func (x *ServerReflectionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -101,44 +99,54 @@ func (x *ServerReflectionRequest) GetHost() string { return "" } -func (m *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { - if m != nil { - return m.MessageRequest +func (x *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { + if x != nil { + return x.MessageRequest } return nil } func (x *ServerReflectionRequest) GetFileByFilename() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileByFilename); ok { - return x.FileByFilename + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileByFilename); ok { + return x.FileByFilename + } } return "" } func (x *ServerReflectionRequest) GetFileContainingSymbol() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingSymbol); ok { - return x.FileContainingSymbol + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingSymbol); ok { + return x.FileContainingSymbol + } } return "" } func (x *ServerReflectionRequest) GetFileContainingExtension() *ExtensionRequest { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingExtension); ok { - return x.FileContainingExtension + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingExtension); ok { + return x.FileContainingExtension + } } return nil } func (x *ServerReflectionRequest) GetAllExtensionNumbersOfType() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { - return x.AllExtensionNumbersOfType + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { + return x.AllExtensionNumbersOfType + } } return "" } func (x *ServerReflectionRequest) GetListServices() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_ListServices); ok { - return x.ListServices + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_ListServices); ok { + return x.ListServices + } } return "" } @@ -197,22 +205,19 @@ func (*ServerReflectionRequest_ListServices) isServerReflectionRequest_MessageRe // The type name and extension number sent by the client when requesting // file_containing_extension. type ExtensionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Fully-qualified type name. The format should be . ContainingType string `protobuf:"bytes,1,opt,name=containing_type,json=containingType,proto3" json:"containing_type,omitempty"` ExtensionNumber int32 `protobuf:"varint,2,opt,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionRequest) Reset() { *x = ExtensionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionRequest) String() string { @@ -223,7 +228,7 @@ func (*ExtensionRequest) ProtoMessage() {} func (x *ExtensionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -254,31 +259,28 @@ func (x *ExtensionRequest) GetExtensionNumber() int32 { // The message sent by the server to answer ServerReflectionInfo method. type ServerReflectionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ValidHost string `protobuf:"bytes,1,opt,name=valid_host,json=validHost,proto3" json:"valid_host,omitempty"` OriginalRequest *ServerReflectionRequest `protobuf:"bytes,2,opt,name=original_request,json=originalRequest,proto3" json:"original_request,omitempty"` // The server sets one of the following fields according to the message_request // in the request. // - // Types that are assignable to MessageResponse: + // Types that are valid to be assigned to MessageResponse: // // *ServerReflectionResponse_FileDescriptorResponse // *ServerReflectionResponse_AllExtensionNumbersResponse // *ServerReflectionResponse_ListServicesResponse // *ServerReflectionResponse_ErrorResponse MessageResponse isServerReflectionResponse_MessageResponse `protobuf_oneof:"message_response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionResponse) Reset() { *x = ServerReflectionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionResponse) String() string { @@ -289,7 +291,7 @@ func (*ServerReflectionResponse) ProtoMessage() {} func (x *ServerReflectionResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -318,37 +320,45 @@ func (x *ServerReflectionResponse) GetOriginalRequest() *ServerReflectionRequest return nil } -func (m *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { - if m != nil { - return m.MessageResponse +func (x *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { + if x != nil { + return x.MessageResponse } return nil } func (x *ServerReflectionResponse) GetFileDescriptorResponse() *FileDescriptorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_FileDescriptorResponse); ok { - return x.FileDescriptorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_FileDescriptorResponse); ok { + return x.FileDescriptorResponse + } } return nil } func (x *ServerReflectionResponse) GetAllExtensionNumbersResponse() *ExtensionNumberResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { - return x.AllExtensionNumbersResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { + return x.AllExtensionNumbersResponse + } } return nil } func (x *ServerReflectionResponse) GetListServicesResponse() *ListServiceResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ListServicesResponse); ok { - return x.ListServicesResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ListServicesResponse); ok { + return x.ListServicesResponse + } } return nil } func (x *ServerReflectionResponse) GetErrorResponse() *ErrorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ErrorResponse); ok { - return x.ErrorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ErrorResponse); ok { + return x.ErrorResponse + } } return nil } @@ -396,23 +406,20 @@ func (*ServerReflectionResponse_ErrorResponse) isServerReflectionResponse_Messag // a file_by_filename, file_containing_symbol, or file_containing_extension // request. type FileDescriptorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Serialized FileDescriptorProto messages. We avoid taking a dependency on // descriptor.proto, which uses proto2 only features, by making them opaque // bytes instead. FileDescriptorProto [][]byte `protobuf:"bytes,1,rep,name=file_descriptor_proto,json=fileDescriptorProto,proto3" json:"file_descriptor_proto,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FileDescriptorResponse) Reset() { *x = FileDescriptorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileDescriptorResponse) String() string { @@ -423,7 +430,7 @@ func (*FileDescriptorResponse) ProtoMessage() {} func (x *FileDescriptorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -448,23 +455,20 @@ func (x *FileDescriptorResponse) GetFileDescriptorProto() [][]byte { // A list of extension numbers sent by the server answering // all_extension_numbers_of_type request. type ExtensionNumberResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of the base type, including the package name. The format // is . BaseTypeName string `protobuf:"bytes,1,opt,name=base_type_name,json=baseTypeName,proto3" json:"base_type_name,omitempty"` ExtensionNumber []int32 `protobuf:"varint,2,rep,packed,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionNumberResponse) Reset() { *x = ExtensionNumberResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionNumberResponse) String() string { @@ -475,7 +479,7 @@ func (*ExtensionNumberResponse) ProtoMessage() {} func (x *ExtensionNumberResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -506,22 +510,19 @@ func (x *ExtensionNumberResponse) GetExtensionNumber() []int32 { // A list of ServiceResponse sent by the server answering list_services request. type ListServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The information of each service may be expanded in the future, so we use // ServiceResponse message to encapsulate it. - Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListServiceResponse) Reset() { *x = ListServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListServiceResponse) String() string { @@ -532,7 +533,7 @@ func (*ListServiceResponse) ProtoMessage() {} func (x *ListServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -557,22 +558,19 @@ func (x *ListServiceResponse) GetService() []*ServiceResponse { // The information of a single service used by ListServiceResponse to answer // list_services request. type ServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of a registered service, including its package name. The format // is . - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServiceResponse) Reset() { *x = ServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServiceResponse) String() string { @@ -583,7 +581,7 @@ func (*ServiceResponse) ProtoMessage() {} func (x *ServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -607,22 +605,19 @@ func (x *ServiceResponse) GetName() string { // The error code and error message sent by the server when an error occurs. type ErrorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This field uses the error codes defined in grpc::StatusCode. - ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` - ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ErrorResponse) Reset() { *x = ErrorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ErrorResponse) String() string { @@ -633,7 +628,7 @@ func (*ErrorResponse) ProtoMessage() {} func (x *ErrorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -664,132 +659,60 @@ func (x *ErrorResponse) GetErrorMessage() string { var File_grpc_reflection_v1_reflection_proto protoreflect.FileDescriptor -var file_grpc_reflection_v1_reflection_proto_rawDesc = []byte{ - 0x0a, 0x23, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, 0xf3, 0x02, 0x0a, 0x17, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x46, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x62, 0x0a, - 0x19, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x42, 0x0a, 0x1d, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x4f, - 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, - 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x66, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xae, 0x04, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x10, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x18, 0x66, - 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x66, 0x69, 0x6c, - 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x1e, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1b, 0x61, 0x6c, 0x6c, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x16, 0x6c, 0x69, 0x73, 0x74, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, - 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x14, 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0e, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x0a, 0x16, 0x46, 0x69, 0x6c, 0x65, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6a, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x54, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x53, 0x0a, 0x0d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x32, 0x89, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x75, 0x0a, 0x14, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, - 0x42, 0x66, 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x15, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x34, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, - 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_reflection_v1_reflection_proto_rawDesc = "" + + "\n" + + "#grpc/reflection/v1/reflection.proto\x12\x12grpc.reflection.v1\"\xf3\x02\n" + + "\x17ServerReflectionRequest\x12\x12\n" + + "\x04host\x18\x01 \x01(\tR\x04host\x12*\n" + + "\x10file_by_filename\x18\x03 \x01(\tH\x00R\x0efileByFilename\x126\n" + + "\x16file_containing_symbol\x18\x04 \x01(\tH\x00R\x14fileContainingSymbol\x12b\n" + + "\x19file_containing_extension\x18\x05 \x01(\v2$.grpc.reflection.v1.ExtensionRequestH\x00R\x17fileContainingExtension\x12B\n" + + "\x1dall_extension_numbers_of_type\x18\x06 \x01(\tH\x00R\x19allExtensionNumbersOfType\x12%\n" + + "\rlist_services\x18\a \x01(\tH\x00R\flistServicesB\x11\n" + + "\x0fmessage_request\"f\n" + + "\x10ExtensionRequest\x12'\n" + + "\x0fcontaining_type\x18\x01 \x01(\tR\x0econtainingType\x12)\n" + + "\x10extension_number\x18\x02 \x01(\x05R\x0fextensionNumber\"\xae\x04\n" + + "\x18ServerReflectionResponse\x12\x1d\n" + + "\n" + + "valid_host\x18\x01 \x01(\tR\tvalidHost\x12V\n" + + "\x10original_request\x18\x02 \x01(\v2+.grpc.reflection.v1.ServerReflectionRequestR\x0foriginalRequest\x12f\n" + + "\x18file_descriptor_response\x18\x04 \x01(\v2*.grpc.reflection.v1.FileDescriptorResponseH\x00R\x16fileDescriptorResponse\x12r\n" + + "\x1eall_extension_numbers_response\x18\x05 \x01(\v2+.grpc.reflection.v1.ExtensionNumberResponseH\x00R\x1ballExtensionNumbersResponse\x12_\n" + + "\x16list_services_response\x18\x06 \x01(\v2'.grpc.reflection.v1.ListServiceResponseH\x00R\x14listServicesResponse\x12J\n" + + "\x0eerror_response\x18\a \x01(\v2!.grpc.reflection.v1.ErrorResponseH\x00R\rerrorResponseB\x12\n" + + "\x10message_response\"L\n" + + "\x16FileDescriptorResponse\x122\n" + + "\x15file_descriptor_proto\x18\x01 \x03(\fR\x13fileDescriptorProto\"j\n" + + "\x17ExtensionNumberResponse\x12$\n" + + "\x0ebase_type_name\x18\x01 \x01(\tR\fbaseTypeName\x12)\n" + + "\x10extension_number\x18\x02 \x03(\x05R\x0fextensionNumber\"T\n" + + "\x13ListServiceResponse\x12=\n" + + "\aservice\x18\x01 \x03(\v2#.grpc.reflection.v1.ServiceResponseR\aservice\"%\n" + + "\x0fServiceResponse\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"S\n" + + "\rErrorResponse\x12\x1d\n" + + "\n" + + "error_code\x18\x01 \x01(\x05R\terrorCode\x12#\n" + + "\rerror_message\x18\x02 \x01(\tR\ferrorMessage2\x89\x01\n" + + "\x10ServerReflection\x12u\n" + + "\x14ServerReflectionInfo\x12+.grpc.reflection.v1.ServerReflectionRequest\x1a,.grpc.reflection.v1.ServerReflectionResponse(\x010\x01Bf\n" + + "\x15io.grpc.reflection.v1B\x15ServerReflectionProtoP\x01Z4google.golang.org/grpc/reflection/grpc_reflection_v1b\x06proto3" var ( file_grpc_reflection_v1_reflection_proto_rawDescOnce sync.Once - file_grpc_reflection_v1_reflection_proto_rawDescData = file_grpc_reflection_v1_reflection_proto_rawDesc + file_grpc_reflection_v1_reflection_proto_rawDescData []byte ) func file_grpc_reflection_v1_reflection_proto_rawDescGZIP() []byte { file_grpc_reflection_v1_reflection_proto_rawDescOnce.Do(func() { - file_grpc_reflection_v1_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_reflection_v1_reflection_proto_rawDescData) + file_grpc_reflection_v1_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1_reflection_proto_rawDesc), len(file_grpc_reflection_v1_reflection_proto_rawDesc))) }) return file_grpc_reflection_v1_reflection_proto_rawDescData } var file_grpc_reflection_v1_reflection_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_grpc_reflection_v1_reflection_proto_goTypes = []interface{}{ +var file_grpc_reflection_v1_reflection_proto_goTypes = []any{ (*ServerReflectionRequest)(nil), // 0: grpc.reflection.v1.ServerReflectionRequest (*ExtensionRequest)(nil), // 1: grpc.reflection.v1.ExtensionRequest (*ServerReflectionResponse)(nil), // 2: grpc.reflection.v1.ServerReflectionResponse @@ -821,112 +744,14 @@ func file_grpc_reflection_v1_reflection_proto_init() { if File_grpc_reflection_v1_reflection_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_reflection_v1_reflection_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileDescriptorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionNumberResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_grpc_reflection_v1_reflection_proto_msgTypes[0].OneofWrappers = []any{ (*ServerReflectionRequest_FileByFilename)(nil), (*ServerReflectionRequest_FileContainingSymbol)(nil), (*ServerReflectionRequest_FileContainingExtension)(nil), (*ServerReflectionRequest_AllExtensionNumbersOfType)(nil), (*ServerReflectionRequest_ListServices)(nil), } - file_grpc_reflection_v1_reflection_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_grpc_reflection_v1_reflection_proto_msgTypes[2].OneofWrappers = []any{ (*ServerReflectionResponse_FileDescriptorResponse)(nil), (*ServerReflectionResponse_AllExtensionNumbersResponse)(nil), (*ServerReflectionResponse_ListServicesResponse)(nil), @@ -936,7 +761,7 @@ func file_grpc_reflection_v1_reflection_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_reflection_v1_reflection_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1_reflection_proto_rawDesc), len(file_grpc_reflection_v1_reflection_proto_rawDesc)), NumEnums: 0, NumMessages: 8, NumExtensions: 0, @@ -947,7 +772,6 @@ func file_grpc_reflection_v1_reflection_proto_init() { MessageInfos: file_grpc_reflection_v1_reflection_proto_msgTypes, }.Build() File_grpc_reflection_v1_reflection_proto = out.File - file_grpc_reflection_v1_reflection_proto_rawDesc = nil file_grpc_reflection_v1_reflection_proto_goTypes = nil file_grpc_reflection_v1_reflection_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go index d6cdd5b54c..f4a361c644 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go @@ -21,8 +21,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // source: grpc/reflection/v1/reflection.proto package grpc_reflection_v1 @@ -36,8 +36,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( ServerReflection_ServerReflectionInfo_FullMethodName = "/grpc.reflection.v1.ServerReflection/ServerReflectionInfo" @@ -49,7 +49,7 @@ const ( type ServerReflectionClient interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) + ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) } type serverReflectionClient struct { @@ -60,53 +60,39 @@ func NewServerReflectionClient(cc grpc.ClientConnInterface) ServerReflectionClie return &serverReflectionClient{cc} } -func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) { - stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, opts...) +func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &serverReflectionServerReflectionInfoClient{stream} + x := &grpc.GenericClientStream[ServerReflectionRequest, ServerReflectionResponse]{ClientStream: stream} return x, nil } -type ServerReflection_ServerReflectionInfoClient interface { - Send(*ServerReflectionRequest) error - Recv() (*ServerReflectionResponse, error) - grpc.ClientStream -} - -type serverReflectionServerReflectionInfoClient struct { - grpc.ClientStream -} - -func (x *serverReflectionServerReflectionInfoClient) Send(m *ServerReflectionRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoClient) Recv() (*ServerReflectionResponse, error) { - m := new(ServerReflectionResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoClient = grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse] // ServerReflectionServer is the server API for ServerReflection service. // All implementations should embed UnimplementedServerReflectionServer -// for forward compatibility +// for forward compatibility. type ServerReflectionServer interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error + ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error } -// UnimplementedServerReflectionServer should be embedded to have forward compatible implementations. -type UnimplementedServerReflectionServer struct { -} +// UnimplementedServerReflectionServer should be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedServerReflectionServer struct{} -func (UnimplementedServerReflectionServer) ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error { - return status.Errorf(codes.Unimplemented, "method ServerReflectionInfo not implemented") +func (UnimplementedServerReflectionServer) ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error { + return status.Error(codes.Unimplemented, "method ServerReflectionInfo not implemented") } +func (UnimplementedServerReflectionServer) testEmbeddedByValue() {} // UnsafeServerReflectionServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ServerReflectionServer will @@ -116,34 +102,22 @@ type UnsafeServerReflectionServer interface { } func RegisterServerReflectionServer(s grpc.ServiceRegistrar, srv ServerReflectionServer) { + // If the following call panics, it indicates UnimplementedServerReflectionServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&ServerReflection_ServiceDesc, srv) } func _ServerReflection_ServerReflectionInfo_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{stream}) -} - -type ServerReflection_ServerReflectionInfoServer interface { - Send(*ServerReflectionResponse) error - Recv() (*ServerReflectionRequest, error) - grpc.ServerStream -} - -type serverReflectionServerReflectionInfoServer struct { - grpc.ServerStream + return srv.(ServerReflectionServer).ServerReflectionInfo(&grpc.GenericServerStream[ServerReflectionRequest, ServerReflectionResponse]{ServerStream: stream}) } -func (x *serverReflectionServerReflectionInfoServer) Send(m *ServerReflectionResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoServer) Recv() (*ServerReflectionRequest, error) { - m := new(ServerReflectionRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoServer = grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse] // ServerReflection_ServiceDesc is the grpc.ServiceDesc for ServerReflection service. // It's only intended for direct use with grpc.RegisterService, diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go index 929733e7bd..5253e862f0 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go @@ -18,8 +18,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // grpc/reflection/v1alpha/reflection.proto is a deprecated file. package grpc_reflection_v1alpha @@ -29,6 +29,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -42,17 +43,14 @@ const ( // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ServerReflectionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // To use reflection service, the client should set one of the following // fields in message_request. The server distinguishes requests by their // defined field and then handles them using corresponding methods. // - // Types that are assignable to MessageRequest: + // Types that are valid to be assigned to MessageRequest: // // *ServerReflectionRequest_FileByFilename // *ServerReflectionRequest_FileContainingSymbol @@ -60,15 +58,15 @@ type ServerReflectionRequest struct { // *ServerReflectionRequest_AllExtensionNumbersOfType // *ServerReflectionRequest_ListServices MessageRequest isServerReflectionRequest_MessageRequest `protobuf_oneof:"message_request"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionRequest) Reset() { *x = ServerReflectionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionRequest) String() string { @@ -79,7 +77,7 @@ func (*ServerReflectionRequest) ProtoMessage() {} func (x *ServerReflectionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -102,49 +100,59 @@ func (x *ServerReflectionRequest) GetHost() string { return "" } -func (m *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { - if m != nil { - return m.MessageRequest +func (x *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { + if x != nil { + return x.MessageRequest } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetFileByFilename() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileByFilename); ok { - return x.FileByFilename + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileByFilename); ok { + return x.FileByFilename + } } return "" } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetFileContainingSymbol() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingSymbol); ok { - return x.FileContainingSymbol + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingSymbol); ok { + return x.FileContainingSymbol + } } return "" } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetFileContainingExtension() *ExtensionRequest { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingExtension); ok { - return x.FileContainingExtension + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingExtension); ok { + return x.FileContainingExtension + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetAllExtensionNumbersOfType() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { - return x.AllExtensionNumbersOfType + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { + return x.AllExtensionNumbersOfType + } } return "" } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetListServices() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_ListServices); ok { - return x.ListServices + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_ListServices); ok { + return x.ListServices + } } return "" } @@ -215,25 +223,22 @@ func (*ServerReflectionRequest_ListServices) isServerReflectionRequest_MessageRe // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ExtensionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Fully-qualified type name. The format should be . // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ContainingType string `protobuf:"bytes,1,opt,name=containing_type,json=containingType,proto3" json:"containing_type,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ExtensionNumber int32 `protobuf:"varint,2,opt,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionRequest) Reset() { *x = ExtensionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionRequest) String() string { @@ -244,7 +249,7 @@ func (*ExtensionRequest) ProtoMessage() {} func (x *ExtensionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -279,10 +284,7 @@ func (x *ExtensionRequest) GetExtensionNumber() int32 { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ServerReflectionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ValidHost string `protobuf:"bytes,1,opt,name=valid_host,json=validHost,proto3" json:"valid_host,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. @@ -290,22 +292,22 @@ type ServerReflectionResponse struct { // The server set one of the following fields according to the message_request // in the request. // - // Types that are assignable to MessageResponse: + // Types that are valid to be assigned to MessageResponse: // // *ServerReflectionResponse_FileDescriptorResponse // *ServerReflectionResponse_AllExtensionNumbersResponse // *ServerReflectionResponse_ListServicesResponse // *ServerReflectionResponse_ErrorResponse MessageResponse isServerReflectionResponse_MessageResponse `protobuf_oneof:"message_response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionResponse) Reset() { *x = ServerReflectionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionResponse) String() string { @@ -316,7 +318,7 @@ func (*ServerReflectionResponse) ProtoMessage() {} func (x *ServerReflectionResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -347,41 +349,49 @@ func (x *ServerReflectionResponse) GetOriginalRequest() *ServerReflectionRequest return nil } -func (m *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { - if m != nil { - return m.MessageResponse +func (x *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { + if x != nil { + return x.MessageResponse } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetFileDescriptorResponse() *FileDescriptorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_FileDescriptorResponse); ok { - return x.FileDescriptorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_FileDescriptorResponse); ok { + return x.FileDescriptorResponse + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetAllExtensionNumbersResponse() *ExtensionNumberResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { - return x.AllExtensionNumbersResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { + return x.AllExtensionNumbersResponse + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetListServicesResponse() *ListServiceResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ListServicesResponse); ok { - return x.ListServicesResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ListServicesResponse); ok { + return x.ListServicesResponse + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetErrorResponse() *ErrorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ErrorResponse); ok { - return x.ErrorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ErrorResponse); ok { + return x.ErrorResponse + } } return nil } @@ -403,7 +413,7 @@ type ServerReflectionResponse_FileDescriptorResponse struct { } type ServerReflectionResponse_AllExtensionNumbersResponse struct { - // This message is used to answer all_extension_numbers_of_type requst. + // This message is used to answer all_extension_numbers_of_type request. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. AllExtensionNumbersResponse *ExtensionNumberResponse `protobuf:"bytes,5,opt,name=all_extension_numbers_response,json=allExtensionNumbersResponse,proto3,oneof"` @@ -439,25 +449,22 @@ func (*ServerReflectionResponse_ErrorResponse) isServerReflectionResponse_Messag // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type FileDescriptorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Serialized FileDescriptorProto messages. We avoid taking a dependency on // descriptor.proto, which uses proto2 only features, by making them opaque // bytes instead. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. FileDescriptorProto [][]byte `protobuf:"bytes,1,rep,name=file_descriptor_proto,json=fileDescriptorProto,proto3" json:"file_descriptor_proto,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FileDescriptorResponse) Reset() { *x = FileDescriptorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileDescriptorResponse) String() string { @@ -468,7 +475,7 @@ func (*FileDescriptorResponse) ProtoMessage() {} func (x *FileDescriptorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -496,10 +503,7 @@ func (x *FileDescriptorResponse) GetFileDescriptorProto() [][]byte { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ExtensionNumberResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of the base type, including the package name. The format // is . // @@ -507,15 +511,15 @@ type ExtensionNumberResponse struct { BaseTypeName string `protobuf:"bytes,1,opt,name=base_type_name,json=baseTypeName,proto3" json:"base_type_name,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ExtensionNumber []int32 `protobuf:"varint,2,rep,packed,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionNumberResponse) Reset() { *x = ExtensionNumberResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionNumberResponse) String() string { @@ -526,7 +530,7 @@ func (*ExtensionNumberResponse) ProtoMessage() {} func (x *ExtensionNumberResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -561,24 +565,21 @@ func (x *ExtensionNumberResponse) GetExtensionNumber() []int32 { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ListServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The information of each service may be expanded in the future, so we use // ServiceResponse message to encapsulate it. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. - Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListServiceResponse) Reset() { *x = ListServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListServiceResponse) String() string { @@ -589,7 +590,7 @@ func (*ListServiceResponse) ProtoMessage() {} func (x *ListServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -617,24 +618,21 @@ func (x *ListServiceResponse) GetService() []*ServiceResponse { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of a registered service, including its package name. The format // is . // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServiceResponse) Reset() { *x = ServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServiceResponse) String() string { @@ -645,7 +643,7 @@ func (*ServiceResponse) ProtoMessage() {} func (x *ServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -672,25 +670,22 @@ func (x *ServiceResponse) GetName() string { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ErrorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This field uses the error codes defined in grpc::StatusCode. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. - ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ErrorResponse) Reset() { *x = ErrorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ErrorResponse) String() string { @@ -701,7 +696,7 @@ func (*ErrorResponse) ProtoMessage() {} func (x *ErrorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -734,137 +729,60 @@ func (x *ErrorResponse) GetErrorMessage() string { var File_grpc_reflection_v1alpha_reflection_proto protoreflect.FileDescriptor -var file_grpc_reflection_v1alpha_reflection_proto_rawDesc = []byte{ - 0x0a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x22, 0xf8, 0x02, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, - 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, - 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x16, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x67, 0x0a, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x42, 0x0a, 0x1d, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x4f, 0x66, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6c, - 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, - 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xc7, 0x04, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x6f, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x10, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0f, - 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x6b, 0x0a, 0x18, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x1e, - 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1b, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x16, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x14, 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x12, 0x0a, 0x10, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4c, 0x0a, 0x16, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6a, - 0x0a, 0x17, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x61, 0x73, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x29, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x59, 0x0a, 0x13, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x0d, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x32, 0x93, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7f, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x30, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x73, 0x0a, 0x1a, 0x69, 0x6f, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x42, 0x15, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x39, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, - 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xb8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_reflection_v1alpha_reflection_proto_rawDesc = "" + + "\n" + + "(grpc/reflection/v1alpha/reflection.proto\x12\x17grpc.reflection.v1alpha\"\xf8\x02\n" + + "\x17ServerReflectionRequest\x12\x12\n" + + "\x04host\x18\x01 \x01(\tR\x04host\x12*\n" + + "\x10file_by_filename\x18\x03 \x01(\tH\x00R\x0efileByFilename\x126\n" + + "\x16file_containing_symbol\x18\x04 \x01(\tH\x00R\x14fileContainingSymbol\x12g\n" + + "\x19file_containing_extension\x18\x05 \x01(\v2).grpc.reflection.v1alpha.ExtensionRequestH\x00R\x17fileContainingExtension\x12B\n" + + "\x1dall_extension_numbers_of_type\x18\x06 \x01(\tH\x00R\x19allExtensionNumbersOfType\x12%\n" + + "\rlist_services\x18\a \x01(\tH\x00R\flistServicesB\x11\n" + + "\x0fmessage_request\"f\n" + + "\x10ExtensionRequest\x12'\n" + + "\x0fcontaining_type\x18\x01 \x01(\tR\x0econtainingType\x12)\n" + + "\x10extension_number\x18\x02 \x01(\x05R\x0fextensionNumber\"\xc7\x04\n" + + "\x18ServerReflectionResponse\x12\x1d\n" + + "\n" + + "valid_host\x18\x01 \x01(\tR\tvalidHost\x12[\n" + + "\x10original_request\x18\x02 \x01(\v20.grpc.reflection.v1alpha.ServerReflectionRequestR\x0foriginalRequest\x12k\n" + + "\x18file_descriptor_response\x18\x04 \x01(\v2/.grpc.reflection.v1alpha.FileDescriptorResponseH\x00R\x16fileDescriptorResponse\x12w\n" + + "\x1eall_extension_numbers_response\x18\x05 \x01(\v20.grpc.reflection.v1alpha.ExtensionNumberResponseH\x00R\x1ballExtensionNumbersResponse\x12d\n" + + "\x16list_services_response\x18\x06 \x01(\v2,.grpc.reflection.v1alpha.ListServiceResponseH\x00R\x14listServicesResponse\x12O\n" + + "\x0eerror_response\x18\a \x01(\v2&.grpc.reflection.v1alpha.ErrorResponseH\x00R\rerrorResponseB\x12\n" + + "\x10message_response\"L\n" + + "\x16FileDescriptorResponse\x122\n" + + "\x15file_descriptor_proto\x18\x01 \x03(\fR\x13fileDescriptorProto\"j\n" + + "\x17ExtensionNumberResponse\x12$\n" + + "\x0ebase_type_name\x18\x01 \x01(\tR\fbaseTypeName\x12)\n" + + "\x10extension_number\x18\x02 \x03(\x05R\x0fextensionNumber\"Y\n" + + "\x13ListServiceResponse\x12B\n" + + "\aservice\x18\x01 \x03(\v2(.grpc.reflection.v1alpha.ServiceResponseR\aservice\"%\n" + + "\x0fServiceResponse\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"S\n" + + "\rErrorResponse\x12\x1d\n" + + "\n" + + "error_code\x18\x01 \x01(\x05R\terrorCode\x12#\n" + + "\rerror_message\x18\x02 \x01(\tR\ferrorMessage2\x93\x01\n" + + "\x10ServerReflection\x12\x7f\n" + + "\x14ServerReflectionInfo\x120.grpc.reflection.v1alpha.ServerReflectionRequest\x1a1.grpc.reflection.v1alpha.ServerReflectionResponse(\x010\x01Bs\n" + + "\x1aio.grpc.reflection.v1alphaB\x15ServerReflectionProtoP\x01Z9google.golang.org/grpc/reflection/grpc_reflection_v1alpha\xb8\x01\x01b\x06proto3" var ( file_grpc_reflection_v1alpha_reflection_proto_rawDescOnce sync.Once - file_grpc_reflection_v1alpha_reflection_proto_rawDescData = file_grpc_reflection_v1alpha_reflection_proto_rawDesc + file_grpc_reflection_v1alpha_reflection_proto_rawDescData []byte ) func file_grpc_reflection_v1alpha_reflection_proto_rawDescGZIP() []byte { file_grpc_reflection_v1alpha_reflection_proto_rawDescOnce.Do(func() { - file_grpc_reflection_v1alpha_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_reflection_v1alpha_reflection_proto_rawDescData) + file_grpc_reflection_v1alpha_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1alpha_reflection_proto_rawDesc), len(file_grpc_reflection_v1alpha_reflection_proto_rawDesc))) }) return file_grpc_reflection_v1alpha_reflection_proto_rawDescData } var file_grpc_reflection_v1alpha_reflection_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_grpc_reflection_v1alpha_reflection_proto_goTypes = []interface{}{ +var file_grpc_reflection_v1alpha_reflection_proto_goTypes = []any{ (*ServerReflectionRequest)(nil), // 0: grpc.reflection.v1alpha.ServerReflectionRequest (*ExtensionRequest)(nil), // 1: grpc.reflection.v1alpha.ExtensionRequest (*ServerReflectionResponse)(nil), // 2: grpc.reflection.v1alpha.ServerReflectionResponse @@ -896,112 +814,14 @@ func file_grpc_reflection_v1alpha_reflection_proto_init() { if File_grpc_reflection_v1alpha_reflection_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileDescriptorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionNumberResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0].OneofWrappers = []any{ (*ServerReflectionRequest_FileByFilename)(nil), (*ServerReflectionRequest_FileContainingSymbol)(nil), (*ServerReflectionRequest_FileContainingExtension)(nil), (*ServerReflectionRequest_AllExtensionNumbersOfType)(nil), (*ServerReflectionRequest_ListServices)(nil), } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2].OneofWrappers = []any{ (*ServerReflectionResponse_FileDescriptorResponse)(nil), (*ServerReflectionResponse_AllExtensionNumbersResponse)(nil), (*ServerReflectionResponse_ListServicesResponse)(nil), @@ -1011,7 +831,7 @@ func file_grpc_reflection_v1alpha_reflection_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_reflection_v1alpha_reflection_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1alpha_reflection_proto_rawDesc), len(file_grpc_reflection_v1alpha_reflection_proto_rawDesc)), NumEnums: 0, NumMessages: 8, NumExtensions: 0, @@ -1022,7 +842,6 @@ func file_grpc_reflection_v1alpha_reflection_proto_init() { MessageInfos: file_grpc_reflection_v1alpha_reflection_proto_msgTypes, }.Build() File_grpc_reflection_v1alpha_reflection_proto = out.File - file_grpc_reflection_v1alpha_reflection_proto_rawDesc = nil file_grpc_reflection_v1alpha_reflection_proto_goTypes = nil file_grpc_reflection_v1alpha_reflection_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go index ef69140635..0a43b521c9 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go @@ -18,8 +18,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // grpc/reflection/v1alpha/reflection.proto is a deprecated file. package grpc_reflection_v1alpha @@ -33,8 +33,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( ServerReflection_ServerReflectionInfo_FullMethodName = "/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo" @@ -46,7 +46,7 @@ const ( type ServerReflectionClient interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) + ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) } type serverReflectionClient struct { @@ -57,53 +57,39 @@ func NewServerReflectionClient(cc grpc.ClientConnInterface) ServerReflectionClie return &serverReflectionClient{cc} } -func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) { - stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, opts...) +func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &serverReflectionServerReflectionInfoClient{stream} + x := &grpc.GenericClientStream[ServerReflectionRequest, ServerReflectionResponse]{ClientStream: stream} return x, nil } -type ServerReflection_ServerReflectionInfoClient interface { - Send(*ServerReflectionRequest) error - Recv() (*ServerReflectionResponse, error) - grpc.ClientStream -} - -type serverReflectionServerReflectionInfoClient struct { - grpc.ClientStream -} - -func (x *serverReflectionServerReflectionInfoClient) Send(m *ServerReflectionRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoClient) Recv() (*ServerReflectionResponse, error) { - m := new(ServerReflectionResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoClient = grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse] // ServerReflectionServer is the server API for ServerReflection service. // All implementations should embed UnimplementedServerReflectionServer -// for forward compatibility +// for forward compatibility. type ServerReflectionServer interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error + ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error } -// UnimplementedServerReflectionServer should be embedded to have forward compatible implementations. -type UnimplementedServerReflectionServer struct { -} +// UnimplementedServerReflectionServer should be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedServerReflectionServer struct{} -func (UnimplementedServerReflectionServer) ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error { - return status.Errorf(codes.Unimplemented, "method ServerReflectionInfo not implemented") +func (UnimplementedServerReflectionServer) ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error { + return status.Error(codes.Unimplemented, "method ServerReflectionInfo not implemented") } +func (UnimplementedServerReflectionServer) testEmbeddedByValue() {} // UnsafeServerReflectionServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ServerReflectionServer will @@ -113,34 +99,22 @@ type UnsafeServerReflectionServer interface { } func RegisterServerReflectionServer(s grpc.ServiceRegistrar, srv ServerReflectionServer) { + // If the following call panics, it indicates UnimplementedServerReflectionServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&ServerReflection_ServiceDesc, srv) } func _ServerReflection_ServerReflectionInfo_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{stream}) -} - -type ServerReflection_ServerReflectionInfoServer interface { - Send(*ServerReflectionResponse) error - Recv() (*ServerReflectionRequest, error) - grpc.ServerStream -} - -type serverReflectionServerReflectionInfoServer struct { - grpc.ServerStream + return srv.(ServerReflectionServer).ServerReflectionInfo(&grpc.GenericServerStream[ServerReflectionRequest, ServerReflectionResponse]{ServerStream: stream}) } -func (x *serverReflectionServerReflectionInfoServer) Send(m *ServerReflectionResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoServer) Recv() (*ServerReflectionRequest, error) { - m := new(ServerReflectionRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoServer = grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse] // ServerReflection_ServiceDesc is the grpc.ServiceDesc for ServerReflection service. // It's only intended for direct use with grpc.RegisterService, diff --git a/vendor/google.golang.org/grpc/reflection/internal/internal.go b/vendor/google.golang.org/grpc/reflection/internal/internal.go new file mode 100644 index 0000000000..902fc6d35c --- /dev/null +++ b/vendor/google.golang.org/grpc/reflection/internal/internal.go @@ -0,0 +1,436 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains code that is shared by both reflection package and +// the test package. The packages are split in this way inorder to avoid +// dependency to deprecated package github.com/golang/protobuf. +package internal + +import ( + "io" + "sort" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + + v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" + v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" + v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" + v1alphareflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" +) + +// ServiceInfoProvider is an interface used to retrieve metadata about the +// services to expose. +type ServiceInfoProvider interface { + GetServiceInfo() map[string]grpc.ServiceInfo +} + +// ExtensionResolver is the interface used to query details about extensions. +// This interface is satisfied by protoregistry.GlobalTypes. +type ExtensionResolver interface { + protoregistry.ExtensionTypeResolver + RangeExtensionsByMessage(message protoreflect.FullName, f func(protoreflect.ExtensionType) bool) +} + +// ServerReflectionServer is the server API for ServerReflection service. +type ServerReflectionServer struct { + v1alphareflectiongrpc.UnimplementedServerReflectionServer + S ServiceInfoProvider + DescResolver protodesc.Resolver + ExtResolver ExtensionResolver +} + +// FileDescWithDependencies returns a slice of serialized fileDescriptors in +// wire format ([]byte). The fileDescriptors will include fd and all the +// transitive dependencies of fd with names not in sentFileDescriptors. +func (s *ServerReflectionServer) FileDescWithDependencies(fd protoreflect.FileDescriptor, sentFileDescriptors map[string]bool) ([][]byte, error) { + if fd.IsPlaceholder() { + // If the given root file is a placeholder, treat it + // as missing instead of serializing it. + return nil, protoregistry.NotFound + } + var r [][]byte + queue := []protoreflect.FileDescriptor{fd} + for len(queue) > 0 { + currentfd := queue[0] + queue = queue[1:] + if currentfd.IsPlaceholder() { + // Skip any missing files in the dependency graph. + continue + } + if sent := sentFileDescriptors[currentfd.Path()]; len(r) == 0 || !sent { + sentFileDescriptors[currentfd.Path()] = true + fdProto := protodesc.ToFileDescriptorProto(currentfd) + currentfdEncoded, err := proto.Marshal(fdProto) + if err != nil { + return nil, err + } + r = append(r, currentfdEncoded) + } + for i := 0; i < currentfd.Imports().Len(); i++ { + queue = append(queue, currentfd.Imports().Get(i)) + } + } + return r, nil +} + +// FileDescEncodingContainingSymbol finds the file descriptor containing the +// given symbol, finds all of its previously unsent transitive dependencies, +// does marshalling on them, and returns the marshalled result. The given symbol +// can be a type, a service or a method. +func (s *ServerReflectionServer) FileDescEncodingContainingSymbol(name string, sentFileDescriptors map[string]bool) ([][]byte, error) { + d, err := s.DescResolver.FindDescriptorByName(protoreflect.FullName(name)) + if err != nil { + return nil, err + } + return s.FileDescWithDependencies(d.ParentFile(), sentFileDescriptors) +} + +// FileDescEncodingContainingExtension finds the file descriptor containing +// given extension, finds all of its previously unsent transitive dependencies, +// does marshalling on them, and returns the marshalled result. +func (s *ServerReflectionServer) FileDescEncodingContainingExtension(typeName string, extNum int32, sentFileDescriptors map[string]bool) ([][]byte, error) { + xt, err := s.ExtResolver.FindExtensionByNumber(protoreflect.FullName(typeName), protoreflect.FieldNumber(extNum)) + if err != nil { + return nil, err + } + return s.FileDescWithDependencies(xt.TypeDescriptor().ParentFile(), sentFileDescriptors) +} + +// AllExtensionNumbersForTypeName returns all extension numbers for the given type. +func (s *ServerReflectionServer) AllExtensionNumbersForTypeName(name string) ([]int32, error) { + var numbers []int32 + s.ExtResolver.RangeExtensionsByMessage(protoreflect.FullName(name), func(xt protoreflect.ExtensionType) bool { + numbers = append(numbers, int32(xt.TypeDescriptor().Number())) + return true + }) + sort.Slice(numbers, func(i, j int) bool { + return numbers[i] < numbers[j] + }) + if len(numbers) == 0 { + // maybe return an error if given type name is not known + if _, err := s.DescResolver.FindDescriptorByName(protoreflect.FullName(name)); err != nil { + return nil, err + } + } + return numbers, nil +} + +// ListServices returns the names of services this server exposes. +func (s *ServerReflectionServer) ListServices() []*v1reflectionpb.ServiceResponse { + serviceInfo := s.S.GetServiceInfo() + resp := make([]*v1reflectionpb.ServiceResponse, 0, len(serviceInfo)) + for svc := range serviceInfo { + resp = append(resp, &v1reflectionpb.ServiceResponse{Name: svc}) + } + sort.Slice(resp, func(i, j int) bool { + return resp[i].Name < resp[j].Name + }) + return resp +} + +// ServerReflectionInfo is the reflection service handler. +func (s *ServerReflectionServer) ServerReflectionInfo(stream v1reflectiongrpc.ServerReflection_ServerReflectionInfoServer) error { + sentFileDescriptors := make(map[string]bool) + for { + in, err := stream.Recv() + if err == io.EOF { + return nil + } + if err != nil { + return err + } + + out := &v1reflectionpb.ServerReflectionResponse{ + ValidHost: in.Host, + OriginalRequest: in, + } + switch req := in.MessageRequest.(type) { + case *v1reflectionpb.ServerReflectionRequest_FileByFilename: + var b [][]byte + fd, err := s.DescResolver.FindFileByPath(req.FileByFilename) + if err == nil { + b, err = s.FileDescWithDependencies(fd, sentFileDescriptors) + } + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: + b, err := s.FileDescEncodingContainingSymbol(req.FileContainingSymbol, sentFileDescriptors) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: + typeName := req.FileContainingExtension.ContainingType + extNum := req.FileContainingExtension.ExtensionNumber + b, err := s.FileDescEncodingContainingExtension(typeName, extNum, sentFileDescriptors) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + extNums, err := s.AllExtensionNumbersForTypeName(req.AllExtensionNumbersOfType) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ + BaseTypeName: req.AllExtensionNumbersOfType, + ExtensionNumber: extNums, + }, + } + } + case *v1reflectionpb.ServerReflectionRequest_ListServices: + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1reflectionpb.ListServiceResponse{ + Service: s.ListServices(), + }, + } + default: + return status.Errorf(codes.InvalidArgument, "invalid MessageRequest: %v", in.MessageRequest) + } + + if err := stream.Send(out); err != nil { + return err + } + } +} + +// V1ToV1AlphaResponse converts a v1 ServerReflectionResponse to a v1alpha. +func V1ToV1AlphaResponse(v1 *v1reflectionpb.ServerReflectionResponse) *v1alphareflectionpb.ServerReflectionResponse { + var v1alpha v1alphareflectionpb.ServerReflectionResponse + v1alpha.ValidHost = v1.ValidHost + if v1.OriginalRequest != nil { + v1alpha.OriginalRequest = V1ToV1AlphaRequest(v1.OriginalRequest) + } + switch mr := v1.MessageResponse.(type) { + case *v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1alphareflectionpb.FileDescriptorResponse{ + FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1alphareflectionpb.ExtensionNumberResponse{ + BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), + ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_ListServicesResponse: + if mr != nil { + svcs := make([]*v1alphareflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) + for i, svc := range mr.ListServicesResponse.GetService() { + svcs[i] = &v1alphareflectionpb.ServiceResponse{ + Name: svc.GetName(), + } + } + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1alphareflectionpb.ListServiceResponse{ + Service: svcs, + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_ErrorResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1alphareflectionpb.ErrorResponse{ + ErrorCode: mr.ErrorResponse.GetErrorCode(), + ErrorMessage: mr.ErrorResponse.GetErrorMessage(), + }, + } + } + default: + // no value set + } + return &v1alpha +} + +// V1AlphaToV1Request converts a v1alpha ServerReflectionRequest to a v1. +func V1AlphaToV1Request(v1alpha *v1alphareflectionpb.ServerReflectionRequest) *v1reflectionpb.ServerReflectionRequest { + var v1 v1reflectionpb.ServerReflectionRequest + v1.Host = v1alpha.Host + switch mr := v1alpha.MessageRequest.(type) { + case *v1alphareflectionpb.ServerReflectionRequest_FileByFilename: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileByFilename{ + FileByFilename: mr.FileByFilename, + } + case *v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingSymbol{ + FileContainingSymbol: mr.FileContainingSymbol, + } + case *v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension: + if mr.FileContainingExtension != nil { + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingExtension{ + FileContainingExtension: &v1reflectionpb.ExtensionRequest{ + ContainingType: mr.FileContainingExtension.GetContainingType(), + ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ + AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, + } + case *v1alphareflectionpb.ServerReflectionRequest_ListServices: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_ListServices{ + ListServices: mr.ListServices, + } + default: + // no value set + } + return &v1 +} + +// V1ToV1AlphaRequest converts a v1 ServerReflectionRequest to a v1alpha. +func V1ToV1AlphaRequest(v1 *v1reflectionpb.ServerReflectionRequest) *v1alphareflectionpb.ServerReflectionRequest { + var v1alpha v1alphareflectionpb.ServerReflectionRequest + v1alpha.Host = v1.Host + switch mr := v1.MessageRequest.(type) { + case *v1reflectionpb.ServerReflectionRequest_FileByFilename: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileByFilename{ + FileByFilename: mr.FileByFilename, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol{ + FileContainingSymbol: mr.FileContainingSymbol, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension{ + FileContainingExtension: &v1alphareflectionpb.ExtensionRequest{ + ContainingType: mr.FileContainingExtension.GetContainingType(), + ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), + }, + } + } + case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ + AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, + } + } + case *v1reflectionpb.ServerReflectionRequest_ListServices: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_ListServices{ + ListServices: mr.ListServices, + } + } + default: + // no value set + } + return &v1alpha +} + +// V1AlphaToV1Response converts a v1alpha ServerReflectionResponse to a v1. +func V1AlphaToV1Response(v1alpha *v1alphareflectionpb.ServerReflectionResponse) *v1reflectionpb.ServerReflectionResponse { + var v1 v1reflectionpb.ServerReflectionResponse + v1.ValidHost = v1alpha.ValidHost + if v1alpha.OriginalRequest != nil { + v1.OriginalRequest = V1AlphaToV1Request(v1alpha.OriginalRequest) + } + switch mr := v1alpha.MessageResponse.(type) { + case *v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{ + FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ + BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), + ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse: + if mr != nil { + svcs := make([]*v1reflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) + for i, svc := range mr.ListServicesResponse.GetService() { + svcs[i] = &v1reflectionpb.ServiceResponse{ + Name: svc.GetName(), + } + } + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1reflectionpb.ListServiceResponse{ + Service: svcs, + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_ErrorResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: mr.ErrorResponse.GetErrorCode(), + ErrorMessage: mr.ErrorResponse.GetErrorMessage(), + }, + } + } + default: + // no value set + } + return &v1 +} diff --git a/vendor/google.golang.org/grpc/reflection/serverreflection.go b/vendor/google.golang.org/grpc/reflection/serverreflection.go index c3b408392f..13a94e2dd2 100644 --- a/vendor/google.golang.org/grpc/reflection/serverreflection.go +++ b/vendor/google.golang.org/grpc/reflection/serverreflection.go @@ -37,19 +37,13 @@ To register server reflection on a gRPC server: package reflection // import "google.golang.org/grpc/reflection" import ( - "io" - "sort" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" + "google.golang.org/grpc/reflection/internal" "google.golang.org/protobuf/reflect/protodesc" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" - v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" ) @@ -158,203 +152,9 @@ func NewServerV1(opts ServerOptions) v1reflectiongrpc.ServerReflectionServer { if opts.ExtensionResolver == nil { opts.ExtensionResolver = protoregistry.GlobalTypes } - return &serverReflectionServer{ - s: opts.Services, - descResolver: opts.DescriptorResolver, - extResolver: opts.ExtensionResolver, - } -} - -type serverReflectionServer struct { - v1alphareflectiongrpc.UnimplementedServerReflectionServer - s ServiceInfoProvider - descResolver protodesc.Resolver - extResolver ExtensionResolver -} - -// fileDescWithDependencies returns a slice of serialized fileDescriptors in -// wire format ([]byte). The fileDescriptors will include fd and all the -// transitive dependencies of fd with names not in sentFileDescriptors. -func (s *serverReflectionServer) fileDescWithDependencies(fd protoreflect.FileDescriptor, sentFileDescriptors map[string]bool) ([][]byte, error) { - if fd.IsPlaceholder() { - // If the given root file is a placeholder, treat it - // as missing instead of serializing it. - return nil, protoregistry.NotFound - } - var r [][]byte - queue := []protoreflect.FileDescriptor{fd} - for len(queue) > 0 { - currentfd := queue[0] - queue = queue[1:] - if currentfd.IsPlaceholder() { - // Skip any missing files in the dependency graph. - continue - } - if sent := sentFileDescriptors[currentfd.Path()]; len(r) == 0 || !sent { - sentFileDescriptors[currentfd.Path()] = true - fdProto := protodesc.ToFileDescriptorProto(currentfd) - currentfdEncoded, err := proto.Marshal(fdProto) - if err != nil { - return nil, err - } - r = append(r, currentfdEncoded) - } - for i := 0; i < currentfd.Imports().Len(); i++ { - queue = append(queue, currentfd.Imports().Get(i)) - } - } - return r, nil -} - -// fileDescEncodingContainingSymbol finds the file descriptor containing the -// given symbol, finds all of its previously unsent transitive dependencies, -// does marshalling on them, and returns the marshalled result. The given symbol -// can be a type, a service or a method. -func (s *serverReflectionServer) fileDescEncodingContainingSymbol(name string, sentFileDescriptors map[string]bool) ([][]byte, error) { - d, err := s.descResolver.FindDescriptorByName(protoreflect.FullName(name)) - if err != nil { - return nil, err - } - return s.fileDescWithDependencies(d.ParentFile(), sentFileDescriptors) -} - -// fileDescEncodingContainingExtension finds the file descriptor containing -// given extension, finds all of its previously unsent transitive dependencies, -// does marshalling on them, and returns the marshalled result. -func (s *serverReflectionServer) fileDescEncodingContainingExtension(typeName string, extNum int32, sentFileDescriptors map[string]bool) ([][]byte, error) { - xt, err := s.extResolver.FindExtensionByNumber(protoreflect.FullName(typeName), protoreflect.FieldNumber(extNum)) - if err != nil { - return nil, err - } - return s.fileDescWithDependencies(xt.TypeDescriptor().ParentFile(), sentFileDescriptors) -} - -// allExtensionNumbersForTypeName returns all extension numbers for the given type. -func (s *serverReflectionServer) allExtensionNumbersForTypeName(name string) ([]int32, error) { - var numbers []int32 - s.extResolver.RangeExtensionsByMessage(protoreflect.FullName(name), func(xt protoreflect.ExtensionType) bool { - numbers = append(numbers, int32(xt.TypeDescriptor().Number())) - return true - }) - sort.Slice(numbers, func(i, j int) bool { - return numbers[i] < numbers[j] - }) - if len(numbers) == 0 { - // maybe return an error if given type name is not known - if _, err := s.descResolver.FindDescriptorByName(protoreflect.FullName(name)); err != nil { - return nil, err - } - } - return numbers, nil -} - -// listServices returns the names of services this server exposes. -func (s *serverReflectionServer) listServices() []*v1reflectionpb.ServiceResponse { - serviceInfo := s.s.GetServiceInfo() - resp := make([]*v1reflectionpb.ServiceResponse, 0, len(serviceInfo)) - for svc := range serviceInfo { - resp = append(resp, &v1reflectionpb.ServiceResponse{Name: svc}) - } - sort.Slice(resp, func(i, j int) bool { - return resp[i].Name < resp[j].Name - }) - return resp -} - -// ServerReflectionInfo is the reflection service handler. -func (s *serverReflectionServer) ServerReflectionInfo(stream v1reflectiongrpc.ServerReflection_ServerReflectionInfoServer) error { - sentFileDescriptors := make(map[string]bool) - for { - in, err := stream.Recv() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - - out := &v1reflectionpb.ServerReflectionResponse{ - ValidHost: in.Host, - OriginalRequest: in, - } - switch req := in.MessageRequest.(type) { - case *v1reflectionpb.ServerReflectionRequest_FileByFilename: - var b [][]byte - fd, err := s.descResolver.FindFileByPath(req.FileByFilename) - if err == nil { - b, err = s.fileDescWithDependencies(fd, sentFileDescriptors) - } - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: - b, err := s.fileDescEncodingContainingSymbol(req.FileContainingSymbol, sentFileDescriptors) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: - typeName := req.FileContainingExtension.ContainingType - extNum := req.FileContainingExtension.ExtensionNumber - b, err := s.fileDescEncodingContainingExtension(typeName, extNum, sentFileDescriptors) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - extNums, err := s.allExtensionNumbersForTypeName(req.AllExtensionNumbersOfType) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ - AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ - BaseTypeName: req.AllExtensionNumbersOfType, - ExtensionNumber: extNums, - }, - } - } - case *v1reflectionpb.ServerReflectionRequest_ListServices: - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ - ListServicesResponse: &v1reflectionpb.ListServiceResponse{ - Service: s.listServices(), - }, - } - default: - return status.Errorf(codes.InvalidArgument, "invalid MessageRequest: %v", in.MessageRequest) - } - - if err := stream.Send(out); err != nil { - return err - } + return &internal.ServerReflectionServer{ + S: opts.Services, + DescResolver: opts.DescriptorResolver, + ExtResolver: opts.ExtensionResolver, } } diff --git a/vendor/google.golang.org/grpc/regenerate.sh b/vendor/google.golang.org/grpc/regenerate.sh deleted file mode 100644 index a6f26c8ab0..0000000000 --- a/vendor/google.golang.org/grpc/regenerate.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/bash -# Copyright 2020 gRPC 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. - -set -eu -o pipefail - -WORKDIR=$(mktemp -d) - -function finish { - rm -rf "$WORKDIR" -} -trap finish EXIT - -export GOBIN=${WORKDIR}/bin -export PATH=${GOBIN}:${PATH} -mkdir -p ${GOBIN} - -echo "remove existing generated files" -# grpc_testing_not_regenerate/*.pb.go is not re-generated, -# see grpc_testing_not_regenerate/README.md for details. -rm -f $(find . -name '*.pb.go' | grep -v 'grpc_testing_not_regenerate') - -echo "go install google.golang.org/protobuf/cmd/protoc-gen-go" -(cd test/tools && go install google.golang.org/protobuf/cmd/protoc-gen-go) - -echo "go install cmd/protoc-gen-go-grpc" -(cd cmd/protoc-gen-go-grpc && go install .) - -echo "git clone https://github.com/grpc/grpc-proto" -git clone --quiet https://github.com/grpc/grpc-proto ${WORKDIR}/grpc-proto - -echo "git clone https://github.com/protocolbuffers/protobuf" -git clone --quiet https://github.com/protocolbuffers/protobuf ${WORKDIR}/protobuf - -# Pull in code.proto as a proto dependency -mkdir -p ${WORKDIR}/googleapis/google/rpc -echo "curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto" -curl --silent https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto > ${WORKDIR}/googleapis/google/rpc/code.proto - -mkdir -p ${WORKDIR}/out - -# Generates sources without the embed requirement -LEGACY_SOURCES=( - ${WORKDIR}/grpc-proto/grpc/binlog/v1/binarylog.proto - ${WORKDIR}/grpc-proto/grpc/channelz/v1/channelz.proto - ${WORKDIR}/grpc-proto/grpc/health/v1/health.proto - ${WORKDIR}/grpc-proto/grpc/lb/v1/load_balancer.proto - profiling/proto/service.proto - ${WORKDIR}/grpc-proto/grpc/reflection/v1alpha/reflection.proto - ${WORKDIR}/grpc-proto/grpc/reflection/v1/reflection.proto -) - -# Generates only the new gRPC Service symbols -SOURCES=( - $(git ls-files --exclude-standard --cached --others "*.proto" | grep -v '^\(profiling/proto/service.proto\|reflection/grpc_reflection_v1alpha/reflection.proto\)$') - ${WORKDIR}/grpc-proto/grpc/gcp/altscontext.proto - ${WORKDIR}/grpc-proto/grpc/gcp/handshaker.proto - ${WORKDIR}/grpc-proto/grpc/gcp/transport_security_common.proto - ${WORKDIR}/grpc-proto/grpc/lookup/v1/rls.proto - ${WORKDIR}/grpc-proto/grpc/lookup/v1/rls_config.proto - ${WORKDIR}/grpc-proto/grpc/testing/*.proto - ${WORKDIR}/grpc-proto/grpc/core/*.proto -) - -# These options of the form 'Mfoo.proto=bar' instruct the codegen to use an -# import path of 'bar' in the generated code when 'foo.proto' is imported in -# one of the sources. -# -# Note that the protos listed here are all for testing purposes. All protos to -# be used externally should have a go_package option (and they don't need to be -# listed here). -OPTS=Mgrpc/core/stats.proto=google.golang.org/grpc/interop/grpc_testing/core,\ -Mgrpc/testing/benchmark_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/stats.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/report_qps_scenario_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/messages.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/worker_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/control.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/test.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/payloads.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/empty.proto=google.golang.org/grpc/interop/grpc_testing - -for src in ${SOURCES[@]}; do - echo "protoc ${src}" - protoc --go_out=${OPTS}:${WORKDIR}/out --go-grpc_out=${OPTS}:${WORKDIR}/out \ - -I"." \ - -I${WORKDIR}/grpc-proto \ - -I${WORKDIR}/googleapis \ - -I${WORKDIR}/protobuf/src \ - ${src} -done - -for src in ${LEGACY_SOURCES[@]}; do - echo "protoc ${src}" - protoc --go_out=${OPTS}:${WORKDIR}/out --go-grpc_out=${OPTS},require_unimplemented_servers=false:${WORKDIR}/out \ - -I"." \ - -I${WORKDIR}/grpc-proto \ - -I${WORKDIR}/googleapis \ - -I${WORKDIR}/protobuf/src \ - ${src} -done - -# The go_package option in grpc/lookup/v1/rls.proto doesn't match the -# current location. Move it into the right place. -mkdir -p ${WORKDIR}/out/google.golang.org/grpc/internal/proto/grpc_lookup_v1 -mv ${WORKDIR}/out/google.golang.org/grpc/lookup/grpc_lookup_v1/* ${WORKDIR}/out/google.golang.org/grpc/internal/proto/grpc_lookup_v1 - -# grpc_testing_not_regenerate/*.pb.go are not re-generated, -# see grpc_testing_not_regenerate/README.md for details. -rm ${WORKDIR}/out/google.golang.org/grpc/reflection/grpc_testing_not_regenerate/*.pb.go - -cp -R ${WORKDIR}/out/google.golang.org/grpc/* . diff --git a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go index b54a3a3225..ef3d6ed6c4 100644 --- a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go @@ -18,9 +18,6 @@ // Package dns implements a dns resolver to be installed as the default resolver // in grpc. -// -// Deprecated: this package is imported by grpc and should not need to be -// imported directly by users. package dns import ( @@ -52,3 +49,12 @@ func SetResolvingTimeout(timeout time.Duration) { func NewBuilder() resolver.Builder { return dns.NewBuilder() } + +// SetMinResolutionInterval sets the default minimum interval at which DNS +// re-resolutions are allowed. This helps to prevent excessive re-resolution. +// +// It must be called only at application startup, before any gRPC calls are +// made. Modifying this value after initialization is not thread-safe. +func SetMinResolutionInterval(d time.Duration) { + dns.MinResolutionInterval = d +} diff --git a/vendor/google.golang.org/grpc/resolver/manual/manual.go b/vendor/google.golang.org/grpc/resolver/manual/manual.go index f2efa2a2cb..82fcc2e35f 100644 --- a/vendor/google.golang.org/grpc/resolver/manual/manual.go +++ b/vendor/google.golang.org/grpc/resolver/manual/manual.go @@ -62,7 +62,7 @@ type Resolver struct { // Fields actually belong to the resolver. // Guards access to below fields. mu sync.Mutex - CC resolver.ClientConn + cc resolver.ClientConn // Storing the most recent state update makes this resolver resilient to // restarts, which is possible with channel idleness. lastSeenState *resolver.State @@ -76,12 +76,14 @@ func (r *Resolver) InitialState(s resolver.State) { // Build returns itself for Resolver, because it's both a builder and a resolver. func (r *Resolver) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { - r.BuildCallback(target, cc, opts) r.mu.Lock() defer r.mu.Unlock() - r.CC = cc + // Call BuildCallback after locking to avoid a race when UpdateState or CC + // is called before Build returns. + r.BuildCallback(target, cc, opts) + r.cc = cc if r.lastSeenState != nil { - err := r.CC.UpdateState(*r.lastSeenState) + err := r.cc.UpdateState(*r.lastSeenState) go r.UpdateStateCallback(err) } return r, nil @@ -102,25 +104,27 @@ func (r *Resolver) Close() { r.CloseCallback() } -// UpdateState calls CC.UpdateState. +// UpdateState calls UpdateState(s) on the channel. If the resolver has not +// been Built before, this instead sets the initial state of the resolver, like +// InitialState. func (r *Resolver) UpdateState(s resolver.State) { r.mu.Lock() defer r.mu.Unlock() - var err error - if r.CC == nil { - panic("cannot update state as grpc.Dial with resolver has not been called") - } - err = r.CC.UpdateState(s) r.lastSeenState = &s + if r.cc == nil { + return + } + err := r.cc.UpdateState(s) r.UpdateStateCallback(err) } -// ReportError calls CC.ReportError. -func (r *Resolver) ReportError(err error) { +// CC returns r's ClientConn when r was last Built. Panics if the resolver has +// not been Built before. +func (r *Resolver) CC() resolver.ClientConn { r.mu.Lock() defer r.mu.Unlock() - if r.CC == nil { - panic("cannot report error as grpc.Dial with resolver has not been called") + if r.cc == nil { + panic("Manual resolver instance has not yet been built.") } - r.CC.ReportError(err) + return r.cc } diff --git a/vendor/google.golang.org/grpc/resolver/map.go b/vendor/google.golang.org/grpc/resolver/map.go index ada5b9bb79..c3c15ac96f 100644 --- a/vendor/google.golang.org/grpc/resolver/map.go +++ b/vendor/google.golang.org/grpc/resolver/map.go @@ -18,16 +18,28 @@ package resolver -type addressMapEntry struct { +import ( + "encoding/base64" + "sort" + "strings" +) + +type addressMapEntry[T any] struct { addr Address - value any + value T } -// AddressMap is a map of addresses to arbitrary values taking into account +// AddressMap is an AddressMapV2[any]. It will be deleted in an upcoming +// release of grpc-go. +// +// Deprecated: use the generic AddressMapV2 type instead. +type AddressMap = AddressMapV2[any] + +// AddressMapV2 is a map of addresses to arbitrary values taking into account // Attributes. BalancerAttributes are ignored, as are Metadata and Type. // Multiple accesses may not be performed concurrently. Must be created via // NewAddressMap; do not construct directly. -type AddressMap struct { +type AddressMapV2[T any] struct { // The underlying map is keyed by an Address with fields that we don't care // about being set to their zero values. The only fields that we care about // are `Addr`, `ServerName` and `Attributes`. Since we need to be able to @@ -41,23 +53,30 @@ type AddressMap struct { // The value type of the map contains a slice of addresses which match the key // in their `Addr` and `ServerName` fields and contain the corresponding value // associated with them. - m map[Address]addressMapEntryList + m map[Address]addressMapEntryList[T] } func toMapKey(addr *Address) Address { return Address{Addr: addr.Addr, ServerName: addr.ServerName} } -type addressMapEntryList []*addressMapEntry +type addressMapEntryList[T any] []*addressMapEntry[T] -// NewAddressMap creates a new AddressMap. +// NewAddressMap creates a new AddressMapV2[any]. +// +// Deprecated: use the generic NewAddressMapV2 constructor instead. func NewAddressMap() *AddressMap { - return &AddressMap{m: make(map[Address]addressMapEntryList)} + return NewAddressMapV2[any]() +} + +// NewAddressMapV2 creates a new AddressMapV2. +func NewAddressMapV2[T any]() *AddressMapV2[T] { + return &AddressMapV2[T]{m: make(map[Address]addressMapEntryList[T])} } // find returns the index of addr in the addressMapEntry slice, or -1 if not // present. -func (l addressMapEntryList) find(addr Address) int { +func (l addressMapEntryList[T]) find(addr Address) int { for i, entry := range l { // Attributes are the only thing to match on here, since `Addr` and // `ServerName` are already equal. @@ -69,28 +88,28 @@ func (l addressMapEntryList) find(addr Address) int { } // Get returns the value for the address in the map, if present. -func (a *AddressMap) Get(addr Address) (value any, ok bool) { +func (a *AddressMapV2[T]) Get(addr Address) (value T, ok bool) { addrKey := toMapKey(&addr) entryList := a.m[addrKey] if entry := entryList.find(addr); entry != -1 { return entryList[entry].value, true } - return nil, false + return value, false } // Set updates or adds the value to the address in the map. -func (a *AddressMap) Set(addr Address, value any) { +func (a *AddressMapV2[T]) Set(addr Address, value T) { addrKey := toMapKey(&addr) entryList := a.m[addrKey] if entry := entryList.find(addr); entry != -1 { entryList[entry].value = value return } - a.m[addrKey] = append(entryList, &addressMapEntry{addr: addr, value: value}) + a.m[addrKey] = append(entryList, &addressMapEntry[T]{addr: addr, value: value}) } // Delete removes addr from the map. -func (a *AddressMap) Delete(addr Address) { +func (a *AddressMapV2[T]) Delete(addr Address) { addrKey := toMapKey(&addr) entryList := a.m[addrKey] entry := entryList.find(addr) @@ -107,7 +126,7 @@ func (a *AddressMap) Delete(addr Address) { } // Len returns the number of entries in the map. -func (a *AddressMap) Len() int { +func (a *AddressMapV2[T]) Len() int { ret := 0 for _, entryList := range a.m { ret += len(entryList) @@ -116,7 +135,7 @@ func (a *AddressMap) Len() int { } // Keys returns a slice of all current map keys. -func (a *AddressMap) Keys() []Address { +func (a *AddressMapV2[T]) Keys() []Address { ret := make([]Address, 0, a.Len()) for _, entryList := range a.m { for _, entry := range entryList { @@ -127,8 +146,8 @@ func (a *AddressMap) Keys() []Address { } // Values returns a slice of all current map values. -func (a *AddressMap) Values() []any { - ret := make([]any, 0, a.Len()) +func (a *AddressMapV2[T]) Values() []T { + ret := make([]T, 0, a.Len()) for _, entryList := range a.m { for _, entry := range entryList { ret = append(ret, entry.value) @@ -137,70 +156,65 @@ func (a *AddressMap) Values() []any { return ret } -type endpointNode struct { - addrs map[string]struct{} -} - -// Equal returns whether the unordered set of addrs are the same between the -// endpoint nodes. -func (en *endpointNode) Equal(en2 *endpointNode) bool { - if len(en.addrs) != len(en2.addrs) { - return false - } - for addr := range en.addrs { - if _, ok := en2.addrs[addr]; !ok { - return false - } - } - return true -} - -func toEndpointNode(endpoint Endpoint) endpointNode { - en := make(map[string]struct{}) - for _, addr := range endpoint.Addresses { - en[addr.Addr] = struct{}{} - } - return endpointNode{ - addrs: en, - } -} +type endpointMapKey string // EndpointMap is a map of endpoints to arbitrary values keyed on only the // unordered set of address strings within an endpoint. This map is not thread // safe, thus it is unsafe to access concurrently. Must be created via // NewEndpointMap; do not construct directly. -type EndpointMap struct { - endpoints map[*endpointNode]any +type EndpointMap[T any] struct { + endpoints map[endpointMapKey]endpointData[T] +} + +type endpointData[T any] struct { + // decodedKey stores the original key to avoid decoding when iterating on + // EndpointMap keys. + decodedKey Endpoint + value T } // NewEndpointMap creates a new EndpointMap. -func NewEndpointMap() *EndpointMap { - return &EndpointMap{ - endpoints: make(map[*endpointNode]any), +func NewEndpointMap[T any]() *EndpointMap[T] { + return &EndpointMap[T]{ + endpoints: make(map[endpointMapKey]endpointData[T]), } } +// encodeEndpoint returns a string that uniquely identifies the unordered set of +// addresses within an endpoint. +func encodeEndpoint(e Endpoint) endpointMapKey { + addrs := make([]string, 0, len(e.Addresses)) + // base64 encoding the address strings restricts the characters present + // within the strings. This allows us to use a delimiter without the need of + // escape characters. + for _, addr := range e.Addresses { + addrs = append(addrs, base64.StdEncoding.EncodeToString([]byte(addr.Addr))) + } + sort.Strings(addrs) + // " " should not appear in base64 encoded strings. + return endpointMapKey(strings.Join(addrs, " ")) +} + // Get returns the value for the address in the map, if present. -func (em *EndpointMap) Get(e Endpoint) (value any, ok bool) { - en := toEndpointNode(e) - if endpoint := em.find(en); endpoint != nil { - return em.endpoints[endpoint], true +func (em *EndpointMap[T]) Get(e Endpoint) (value T, ok bool) { + val, found := em.endpoints[encodeEndpoint(e)] + if found { + return val.value, true } - return nil, false + return value, false } // Set updates or adds the value to the address in the map. -func (em *EndpointMap) Set(e Endpoint, value any) { - en := toEndpointNode(e) - if endpoint := em.find(en); endpoint != nil { - em.endpoints[endpoint] = value - return +func (em *EndpointMap[T]) Set(e Endpoint, value T) { + en := encodeEndpoint(e) + em.endpoints[en] = endpointData[T]{ + decodedKey: Endpoint{Addresses: e.Addresses}, + value: value, } - em.endpoints[&en] = value } // Len returns the number of entries in the map. -func (em *EndpointMap) Len() int { +func (em *EndpointMap[T]) Len() int { return len(em.endpoints) } @@ -209,43 +223,25 @@ func (em *EndpointMap) Len() int { // the unordered set of addresses. Thus, endpoint information returned is not // the full endpoint data (drops duplicated addresses and attributes) but can be // used for EndpointMap accesses. -func (em *EndpointMap) Keys() []Endpoint { +func (em *EndpointMap[T]) Keys() []Endpoint { ret := make([]Endpoint, 0, len(em.endpoints)) - for en := range em.endpoints { - var endpoint Endpoint - for addr := range en.addrs { - endpoint.Addresses = append(endpoint.Addresses, Address{Addr: addr}) - } - ret = append(ret, endpoint) + for _, en := range em.endpoints { + ret = append(ret, en.decodedKey) } return ret } // Values returns a slice of all current map values. -func (em *EndpointMap) Values() []any { - ret := make([]any, 0, len(em.endpoints)) +func (em *EndpointMap[T]) Values() []T { + ret := make([]T, 0, len(em.endpoints)) for _, val := range em.endpoints { - ret = append(ret, val) + ret = append(ret, val.value) } return ret } -// find returns a pointer to the endpoint node in em if the endpoint node is -// already present. If not found, nil is returned. The comparisons are done on -// the unordered set of addresses within an endpoint. -func (em EndpointMap) find(e endpointNode) *endpointNode { - for endpoint := range em.endpoints { - if e.Equal(endpoint) { - return endpoint - } - } - return nil -} - // Delete removes the specified endpoint from the map. -func (em *EndpointMap) Delete(e Endpoint) { - en := toEndpointNode(e) - if entry := em.find(en); entry != nil { - delete(em.endpoints, entry) - } +func (em *EndpointMap[T]) Delete(e Endpoint) { + en := encodeEndpoint(e) + delete(em.endpoints, en) } diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go index 202854511b..8e6af9514b 100644 --- a/vendor/google.golang.org/grpc/resolver/resolver.go +++ b/vendor/google.golang.org/grpc/resolver/resolver.go @@ -22,6 +22,7 @@ package resolver import ( "context" + "errors" "fmt" "net" "net/url" @@ -29,6 +30,7 @@ import ( "google.golang.org/grpc/attributes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/internal" "google.golang.org/grpc/serviceconfig" ) @@ -174,6 +176,8 @@ type BuildOptions struct { // Authority is the effective authority of the clientconn for which the // resolver is built. Authority string + // MetricsRecorder is the metrics recorder to do recording. + MetricsRecorder stats.MetricsRecorder } // An Endpoint is one network endpoint, or server, which may have multiple @@ -237,8 +241,8 @@ type ClientConn interface { // UpdateState can be omitted. UpdateState(State) error // ReportError notifies the ClientConn that the Resolver encountered an - // error. The ClientConn will notify the load balancer and begin calling - // ResolveNow on the Resolver with exponential backoff. + // error. The ClientConn then forwards this error to the load balancing + // policy. ReportError(error) // NewAddress is called by resolver to notify ClientConn a new list // of resolved addresses. @@ -328,5 +332,27 @@ type AuthorityOverrider interface { // OverrideAuthority returns the authority to use for a ClientConn with the // given target. The implementation must generate it without blocking, // typically in line, and must keep it unchanged. + // + // The returned string must be a valid ":authority" header value, i.e. be + // encoded according to + // [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2) as + // necessary. OverrideAuthority(Target) string } + +// ValidateEndpoints validates endpoints from a petiole policy's perspective. +// Petiole policies should call this before calling into their children. See +// [gRPC A61](https://github.com/grpc/proposal/blob/master/A61-IPv4-IPv6-dualstack-backends.md) +// for details. +func ValidateEndpoints(endpoints []Endpoint) error { + if len(endpoints) == 0 { + return errors.New("endpoints list is empty") + } + + for _, endpoint := range endpoints { + for range endpoint.Addresses { + return nil + } + } + return errors.New("endpoints list contains no addresses") +} diff --git a/vendor/google.golang.org/grpc/resolver_wrapper.go b/vendor/google.golang.org/grpc/resolver_wrapper.go index 9dcc9780f8..80e16a327c 100644 --- a/vendor/google.golang.org/grpc/resolver_wrapper.go +++ b/vendor/google.golang.org/grpc/resolver_wrapper.go @@ -26,6 +26,7 @@ import ( "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/pretty" + "google.golang.org/grpc/internal/resolver/delegatingresolver" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" ) @@ -66,7 +67,7 @@ func newCCResolverWrapper(cc *ClientConn) *ccResolverWrapper { // any newly created ccResolverWrapper, except that close may be called instead. func (ccr *ccResolverWrapper) start() error { errCh := make(chan error) - ccr.serializer.Schedule(func(ctx context.Context) { + ccr.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil { return } @@ -76,16 +77,26 @@ func (ccr *ccResolverWrapper) start() error { CredsBundle: ccr.cc.dopts.copts.CredsBundle, Dialer: ccr.cc.dopts.copts.Dialer, Authority: ccr.cc.authority, + MetricsRecorder: ccr.cc.metricsRecorderList, } var err error - ccr.resolver, err = ccr.cc.resolverBuilder.Build(ccr.cc.parsedTarget, ccr, opts) + // The delegating resolver is used unless: + // - A custom dialer is provided via WithContextDialer dialoption or + // - Proxy usage is disabled through WithNoProxy dialoption. + // In these cases, the resolver is built based on the scheme of target, + // using the appropriate resolver builder. + if ccr.cc.dopts.copts.Dialer != nil || !ccr.cc.dopts.useProxy { + ccr.resolver, err = ccr.cc.resolverBuilder.Build(ccr.cc.parsedTarget, ccr, opts) + } else { + ccr.resolver, err = delegatingresolver.New(ccr.cc.parsedTarget, ccr, opts, ccr.cc.resolverBuilder, ccr.cc.dopts.enableLocalDNSResolution) + } errCh <- err }) return <-errCh } func (ccr *ccResolverWrapper) resolveNow(o resolver.ResolveNowOptions) { - ccr.serializer.Schedule(func(ctx context.Context) { + ccr.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || ccr.resolver == nil { return } @@ -102,7 +113,7 @@ func (ccr *ccResolverWrapper) close() { ccr.closed = true ccr.mu.Unlock() - ccr.serializer.Schedule(func(context.Context) { + ccr.serializer.TrySchedule(func(context.Context) { if ccr.resolver == nil { return } @@ -123,12 +134,7 @@ func (ccr *ccResolverWrapper) UpdateState(s resolver.State) error { return nil } if s.Endpoints == nil { - s.Endpoints = make([]resolver.Endpoint, 0, len(s.Addresses)) - for _, a := range s.Addresses { - ep := resolver.Endpoint{Addresses: []resolver.Address{a}, Attributes: a.BalancerAttributes} - ep.Addresses[0].BalancerAttributes = nil - s.Endpoints = append(s.Endpoints, ep) - } + s.Endpoints = addressesToEndpoints(s.Addresses) } ccr.addChannelzTraceEvent(s) ccr.curState = s @@ -161,7 +167,11 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { ccr.cc.mu.Unlock() return } - s := resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig} + s := resolver.State{ + Addresses: addrs, + ServiceConfig: ccr.curState.ServiceConfig, + Endpoints: addressesToEndpoints(addrs), + } ccr.addChannelzTraceEvent(s) ccr.curState = s ccr.mu.Unlock() @@ -171,12 +181,15 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { // ParseServiceConfig is called by resolver implementations to parse a JSON // representation of the service config. func (ccr *ccResolverWrapper) ParseServiceConfig(scJSON string) *serviceconfig.ParseResult { - return parseServiceConfig(scJSON) + return parseServiceConfig(scJSON, ccr.cc.dopts.maxCallAttempts) } // addChannelzTraceEvent adds a channelz trace event containing the new // state received from resolver implementations. func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { + if !logger.V(0) && !channelz.IsOn() { + return + } var updates []string var oldSC, newSC *ServiceConfig var oldOK, newOK bool @@ -196,3 +209,13 @@ func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { } channelz.Infof(logger, ccr.cc.channelz, "Resolver state updated: %s (%v)", pretty.ToJSON(s), strings.Join(updates, "; ")) } + +func addressesToEndpoints(addrs []resolver.Address) []resolver.Endpoint { + endpoints := make([]resolver.Endpoint, 0, len(addrs)) + for _, a := range addrs { + ep := resolver.Endpoint{Addresses: []resolver.Address{a}, Attributes: a.BalancerAttributes} + ep.Addresses[0].BalancerAttributes = nil + endpoints = append(endpoints, ep) + } + return endpoints +} diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index 998e251ddc..47ea09f5c9 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -19,7 +19,6 @@ package grpc import ( - "bytes" "compress/gzip" "context" "encoding/binary" @@ -35,6 +34,7 @@ import ( "google.golang.org/grpc/encoding" "google.golang.org/grpc/encoding/proto" "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -151,7 +151,7 @@ func (d *gzipDecompressor) Type() string { // callInfo contains all related configuration and information about an RPC. type callInfo struct { - compressorType string + compressorName string failFast bool maxReceiveMessageSize *int maxSendMessageSize *int @@ -160,6 +160,7 @@ type callInfo struct { codec baseCodec maxRetryRPCBufferSize int onFinish []func(err error) + authority string } func defaultCallInfo() *callInfo { @@ -220,9 +221,9 @@ type HeaderCallOption struct { HeaderAddr *metadata.MD } -func (o HeaderCallOption) before(c *callInfo) error { return nil } -func (o HeaderCallOption) after(c *callInfo, attempt *csAttempt) { - *o.HeaderAddr, _ = attempt.s.Header() +func (o HeaderCallOption) before(*callInfo) error { return nil } +func (o HeaderCallOption) after(_ *callInfo, attempt *csAttempt) { + *o.HeaderAddr, _ = attempt.transportStream.Header() } // Trailer returns a CallOptions that retrieves the trailer metadata @@ -242,9 +243,9 @@ type TrailerCallOption struct { TrailerAddr *metadata.MD } -func (o TrailerCallOption) before(c *callInfo) error { return nil } -func (o TrailerCallOption) after(c *callInfo, attempt *csAttempt) { - *o.TrailerAddr = attempt.s.Trailer() +func (o TrailerCallOption) before(*callInfo) error { return nil } +func (o TrailerCallOption) after(_ *callInfo, attempt *csAttempt) { + *o.TrailerAddr = attempt.transportStream.Trailer() } // Peer returns a CallOption that retrieves peer information for a unary RPC. @@ -264,24 +265,20 @@ type PeerCallOption struct { PeerAddr *peer.Peer } -func (o PeerCallOption) before(c *callInfo) error { return nil } -func (o PeerCallOption) after(c *callInfo, attempt *csAttempt) { - if x, ok := peer.FromContext(attempt.s.Context()); ok { +func (o PeerCallOption) before(*callInfo) error { return nil } +func (o PeerCallOption) after(_ *callInfo, attempt *csAttempt) { + if x, ok := peer.FromContext(attempt.transportStream.Context()); ok { *o.PeerAddr = *x } } -// WaitForReady configures the action to take when an RPC is attempted on broken -// connections or unreachable servers. If waitForReady is false and the -// connection is in the TRANSIENT_FAILURE state, the RPC will fail -// immediately. Otherwise, the RPC client will block the call until a -// connection is available (or the call is canceled or times out) and will -// retry the call if it fails due to a transient error. gRPC will not retry if -// data was written to the wire unless the server indicates it did not process -// the data. Please refer to -// https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. +// WaitForReady configures the RPC's behavior when the client is in +// TRANSIENT_FAILURE, which occurs when all addresses fail to connect. If +// waitForReady is false, the RPC will fail immediately. Otherwise, the client +// will wait until a connection becomes available or the RPC's deadline is +// reached. // -// By default, RPCs don't "wait for ready". +// By default, RPCs do not "wait for ready". func WaitForReady(waitForReady bool) CallOption { return FailFastCallOption{FailFast: !waitForReady} } @@ -308,7 +305,7 @@ func (o FailFastCallOption) before(c *callInfo) error { c.failFast = o.FailFast return nil } -func (o FailFastCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o FailFastCallOption) after(*callInfo, *csAttempt) {} // OnFinish returns a CallOption that configures a callback to be called when // the call completes. The error passed to the callback is the status of the @@ -343,7 +340,7 @@ func (o OnFinishCallOption) before(c *callInfo) error { return nil } -func (o OnFinishCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o OnFinishCallOption) after(*callInfo, *csAttempt) {} // MaxCallRecvMsgSize returns a CallOption which sets the maximum message size // in bytes the client can receive. If this is not set, gRPC uses the default @@ -367,7 +364,37 @@ func (o MaxRecvMsgSizeCallOption) before(c *callInfo) error { c.maxReceiveMessageSize = &o.MaxRecvMsgSize return nil } -func (o MaxRecvMsgSizeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o MaxRecvMsgSizeCallOption) after(*callInfo, *csAttempt) {} + +// CallAuthority returns a CallOption that sets the HTTP/2 :authority header of +// an RPC to the specified value. When using CallAuthority, the credentials in +// use must implement the AuthorityValidator interface. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a later +// release. +func CallAuthority(authority string) CallOption { + return AuthorityOverrideCallOption{Authority: authority} +} + +// AuthorityOverrideCallOption is a CallOption that indicates the HTTP/2 +// :authority header value to use for the call. +// +// # Experimental +// +// Notice: This type is EXPERIMENTAL and may be changed or removed in a later +// release. +type AuthorityOverrideCallOption struct { + Authority string +} + +func (o AuthorityOverrideCallOption) before(c *callInfo) error { + c.authority = o.Authority + return nil +} + +func (o AuthorityOverrideCallOption) after(*callInfo, *csAttempt) {} // MaxCallSendMsgSize returns a CallOption which sets the maximum message size // in bytes the client can send. If this is not set, gRPC uses the default @@ -391,7 +418,7 @@ func (o MaxSendMsgSizeCallOption) before(c *callInfo) error { c.maxSendMessageSize = &o.MaxSendMsgSize return nil } -func (o MaxSendMsgSizeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o MaxSendMsgSizeCallOption) after(*callInfo, *csAttempt) {} // PerRPCCredentials returns a CallOption that sets credentials.PerRPCCredentials // for a call. @@ -414,7 +441,7 @@ func (o PerRPCCredsCallOption) before(c *callInfo) error { c.creds = o.Creds return nil } -func (o PerRPCCredsCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o PerRPCCredsCallOption) after(*callInfo, *csAttempt) {} // UseCompressor returns a CallOption which sets the compressor used when // sending the request. If WithCompressor is also set, UseCompressor has @@ -439,10 +466,10 @@ type CompressorCallOption struct { } func (o CompressorCallOption) before(c *callInfo) error { - c.compressorType = o.CompressorType + c.compressorName = o.CompressorType return nil } -func (o CompressorCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o CompressorCallOption) after(*callInfo, *csAttempt) {} // CallContentSubtype returns a CallOption that will set the content-subtype // for a call. For example, if content-subtype is "json", the Content-Type over @@ -479,7 +506,7 @@ func (o ContentSubtypeCallOption) before(c *callInfo) error { c.contentSubtype = o.ContentSubtype return nil } -func (o ContentSubtypeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o ContentSubtypeCallOption) after(*callInfo, *csAttempt) {} // ForceCodec returns a CallOption that will set codec to be used for all // request and response messages for a call. The result of calling Name() will @@ -515,10 +542,50 @@ type ForceCodecCallOption struct { } func (o ForceCodecCallOption) before(c *callInfo) error { - c.codec = o.Codec + c.codec = newCodecV1Bridge(o.Codec) return nil } -func (o ForceCodecCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o ForceCodecCallOption) after(*callInfo, *csAttempt) {} + +// ForceCodecV2 returns a CallOption that will set codec to be used for all +// request and response messages for a call. The result of calling Name() will +// be used as the content-subtype after converting to lowercase, unless +// CallContentSubtype is also used. +// +// See Content-Type on +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. Also see the documentation on RegisterCodec and +// CallContentSubtype for more details on the interaction between Codec and +// content-subtype. +// +// This function is provided for advanced users; prefer to use only +// CallContentSubtype to select a registered codec instead. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func ForceCodecV2(codec encoding.CodecV2) CallOption { + return ForceCodecV2CallOption{CodecV2: codec} +} + +// ForceCodecV2CallOption is a CallOption that indicates the codec used for +// marshaling messages. +// +// # Experimental +// +// Notice: This type is EXPERIMENTAL and may be changed or removed in a +// later release. +type ForceCodecV2CallOption struct { + CodecV2 encoding.CodecV2 +} + +func (o ForceCodecV2CallOption) before(c *callInfo) error { + c.codec = o.CodecV2 + return nil +} + +func (o ForceCodecV2CallOption) after(*callInfo, *csAttempt) {} // CallCustomCodec behaves like ForceCodec, but accepts a grpc.Codec instead of // an encoding.Codec. @@ -540,10 +607,10 @@ type CustomCodecCallOption struct { } func (o CustomCodecCallOption) before(c *callInfo) error { - c.codec = o.Codec + c.codec = newCodecV0Bridge(o.Codec) return nil } -func (o CustomCodecCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o CustomCodecCallOption) after(*callInfo, *csAttempt) {} // MaxRetryRPCBufferSize returns a CallOption that limits the amount of memory // used for buffering this RPC's requests for retry purposes. @@ -571,7 +638,7 @@ func (o MaxRetryRPCBufferSizeCallOption) before(c *callInfo) error { c.maxRetryRPCBufferSize = o.MaxRetryRPCBufferSize return nil } -func (o MaxRetryRPCBufferSizeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o MaxRetryRPCBufferSizeCallOption) after(*callInfo, *csAttempt) {} // The format of the payload: compressed or not? type payloadFormat uint8 @@ -581,19 +648,28 @@ const ( compressionMade payloadFormat = 1 // compressed ) +func (pf payloadFormat) isCompressed() bool { + return pf == compressionMade +} + +type streamReader interface { + ReadMessageHeader(header []byte) error + Read(n int) (mem.BufferSlice, error) +} + // parser reads complete gRPC messages from the underlying reader. type parser struct { // r is the underlying reader. // See the comment on recvMsg for the permissible // error types. - r io.Reader + r streamReader // The header of a gRPC message. Find more detail at // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md header [5]byte - // recvBufferPool is the pool of shared receive buffers. - recvBufferPool SharedBufferPool + // bufferPool is the pool of shared receive buffers. + bufferPool mem.BufferPool } // recvMsg reads a complete gRPC message from the stream. @@ -608,39 +684,38 @@ type parser struct { // - an error from the status package // // No other error values or types must be returned, which also means -// that the underlying io.Reader must not return an incompatible +// that the underlying streamReader must not return an incompatible // error. -func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byte, err error) { - if _, err := p.r.Read(p.header[:]); err != nil { +func (p *parser) recvMsg(maxReceiveMessageSize int) (payloadFormat, mem.BufferSlice, error) { + err := p.r.ReadMessageHeader(p.header[:]) + if err != nil { return 0, nil, err } - pf = payloadFormat(p.header[0]) + pf := payloadFormat(p.header[0]) length := binary.BigEndian.Uint32(p.header[1:]) - if length == 0 { - return pf, nil, nil - } if int64(length) > int64(maxInt) { return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max length allowed on current machine (%d vs. %d)", length, maxInt) } if int(length) > maxReceiveMessageSize { return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", length, maxReceiveMessageSize) } - msg = p.recvBufferPool.Get(int(length)) - if _, err := p.r.Read(msg); err != nil { + + data, err := p.r.Read(int(length)) + if err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF } return 0, nil, err } - return pf, msg, nil + return pf, data, nil } // encode serializes msg and returns a buffer containing the message, or an // error if it is too large to be transmitted by grpc. If msg is nil, it // generates an empty message. -func encode(c baseCodec, msg any) ([]byte, error) { +func encode(c baseCodec, msg any) (mem.BufferSlice, error) { if msg == nil { // NOTE: typed nils will not be caught by this check return nil, nil } @@ -648,8 +723,9 @@ func encode(c baseCodec, msg any) ([]byte, error) { if err != nil { return nil, status.Errorf(codes.Internal, "grpc: error while marshaling: %v", err.Error()) } - if uint(len(b)) > math.MaxUint32 { - return nil, status.Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", len(b)) + if bufSize := uint(b.Len()); bufSize > math.MaxUint32 { + b.Free() + return nil, status.Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", bufSize) } return b, nil } @@ -659,34 +735,41 @@ func encode(c baseCodec, msg any) ([]byte, error) { // indicating no compression was done. // // TODO(dfawley): eliminate cp parameter by wrapping Compressor in an encoding.Compressor. -func compress(in []byte, cp Compressor, compressor encoding.Compressor) ([]byte, error) { - if compressor == nil && cp == nil { - return nil, nil - } - if len(in) == 0 { - return nil, nil +func compress(in mem.BufferSlice, cp Compressor, compressor encoding.Compressor, pool mem.BufferPool) (mem.BufferSlice, payloadFormat, error) { + if (compressor == nil && cp == nil) || in.Len() == 0 { + return nil, compressionNone, nil } + var out mem.BufferSlice + w := mem.NewWriter(&out, pool) wrapErr := func(err error) error { + out.Free() return status.Errorf(codes.Internal, "grpc: error while compressing: %v", err.Error()) } - cbuf := &bytes.Buffer{} if compressor != nil { - z, err := compressor.Compress(cbuf) + z, err := compressor.Compress(w) if err != nil { - return nil, wrapErr(err) + return nil, 0, wrapErr(err) } - if _, err := z.Write(in); err != nil { - return nil, wrapErr(err) + for _, b := range in { + if _, err := z.Write(b.ReadOnlyData()); err != nil { + return nil, 0, wrapErr(err) + } } if err := z.Close(); err != nil { - return nil, wrapErr(err) + return nil, 0, wrapErr(err) } } else { - if err := cp.Do(cbuf, in); err != nil { - return nil, wrapErr(err) + // This is obviously really inefficient since it fully materializes the data, but + // there is no way around this with the old Compressor API. At least it attempts + // to return the buffer to the provider, in the hopes it can be reused (maybe + // even by a subsequent call to this very function). + buf := in.MaterializeToBuffer(pool) + defer buf.Free() + if err := cp.Do(w, buf.ReadOnlyData()); err != nil { + return nil, 0, wrapErr(err) } } - return cbuf.Bytes(), nil + return out, compressionMade, nil } const ( @@ -697,33 +780,36 @@ const ( // msgHeader returns a 5-byte header for the message being transmitted and the // payload, which is compData if non-nil or data otherwise. -func msgHeader(data, compData []byte) (hdr []byte, payload []byte) { +func msgHeader(data, compData mem.BufferSlice, pf payloadFormat) (hdr []byte, payload mem.BufferSlice) { hdr = make([]byte, headerLen) - if compData != nil { - hdr[0] = byte(compressionMade) - data = compData + hdr[0] = byte(pf) + + var length uint32 + if pf.isCompressed() { + length = uint32(compData.Len()) + payload = compData } else { - hdr[0] = byte(compressionNone) + length = uint32(data.Len()) + payload = data } // Write length of payload into buf - binary.BigEndian.PutUint32(hdr[payloadLen:], uint32(len(data))) - return hdr, data + binary.BigEndian.PutUint32(hdr[payloadLen:], length) + return hdr, payload } -func outPayload(client bool, msg any, data, payload []byte, t time.Time) *stats.OutPayload { +func outPayload(client bool, msg any, dataLength, payloadLength int, t time.Time) *stats.OutPayload { return &stats.OutPayload{ Client: client, Payload: msg, - Data: data, - Length: len(data), - WireLength: len(payload) + headerLen, - CompressedLength: len(payload), + Length: dataLength, + WireLength: payloadLength + headerLen, + CompressedLength: payloadLength, SentTime: t, } } -func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool) *status.Status { +func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool, isServer bool) *status.Status { switch pf { case compressionNone: case compressionMade: @@ -731,7 +817,10 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool return status.New(codes.Internal, "grpc: compressed flag set with identity or empty encoding") } if !haveCompressor { - return status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) + if isServer { + return status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) + } + return status.Newf(codes.Internal, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) } default: return status.Newf(codes.Internal, "grpc: received unexpected payload format %d", pf) @@ -741,104 +830,119 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool type payloadInfo struct { compressedLength int // The compressed length got from wire. - uncompressedBytes []byte + uncompressedBytes mem.BufferSlice +} + +func (p *payloadInfo) free() { + if p != nil && p.uncompressedBytes != nil { + p.uncompressedBytes.Free() + } } // recvAndDecompress reads a message from the stream, decompressing it if necessary. // // Cancelling the returned cancel function releases the buffer back to the pool. So the caller should cancel as soon as // the buffer is no longer needed. -func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, -) (uncompressedBuf []byte, cancel func(), err error) { - pf, compressedBuf, err := p.recvMsg(maxReceiveMessageSize) +// TODO: Refactor this function to reduce the number of arguments. +// See: https://google.github.io/styleguide/go/best-practices.html#function-argument-lists +func recvAndDecompress(p *parser, s recvCompressor, dc Decompressor, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool, +) (out mem.BufferSlice, err error) { + pf, compressed, err := p.recvMsg(maxReceiveMessageSize) if err != nil { - return nil, nil, err + return nil, err } - if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil); st != nil { - return nil, nil, st.Err() + compressedLength := compressed.Len() + + if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil, isServer); st != nil { + compressed.Free() + return nil, st.Err() } - var size int - if pf == compressionMade { + if pf.isCompressed() { + defer compressed.Free() // To match legacy behavior, if the decompressor is set by WithDecompressor or RPCDecompressor, // use this decompressor as the default. - if dc != nil { - uncompressedBuf, err = dc.Do(bytes.NewReader(compressedBuf)) - size = len(uncompressedBuf) - } else { - uncompressedBuf, size, err = decompress(compressor, compressedBuf, maxReceiveMessageSize) - } + out, err = decompress(compressor, compressed, dc, maxReceiveMessageSize, p.bufferPool) if err != nil { - return nil, nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message: %v", err) - } - if size > maxReceiveMessageSize { - // TODO: Revisit the error code. Currently keep it consistent with java - // implementation. - return nil, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message after decompression larger than max (%d vs. %d)", size, maxReceiveMessageSize) + return nil, err } } else { - uncompressedBuf = compressedBuf + out = compressed } if payInfo != nil { - payInfo.compressedLength = len(compressedBuf) - payInfo.uncompressedBytes = uncompressedBuf + payInfo.compressedLength = compressedLength + out.Ref() + payInfo.uncompressedBytes = out + } - cancel = func() {} - } else { - cancel = func() { - p.recvBufferPool.Put(&compressedBuf) + return out, nil +} + +// decompress processes the given data by decompressing it using either a custom decompressor or a standard compressor. +// If a custom decompressor is provided, it takes precedence. The function validates that the decompressed data +// does not exceed the specified maximum size and returns an error if this limit is exceeded. +// On success, it returns the decompressed data. Otherwise, it returns an error if decompression fails or the data exceeds the size limit. +func decompress(compressor encoding.Compressor, d mem.BufferSlice, dc Decompressor, maxReceiveMessageSize int, pool mem.BufferPool) (mem.BufferSlice, error) { + if dc != nil { + uncompressed, err := dc.Do(d.Reader()) + if err != nil { + return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message: %v", err) + } + if len(uncompressed) > maxReceiveMessageSize { + return nil, status.Errorf(codes.ResourceExhausted, "grpc: message after decompression larger than max (%d vs. %d)", len(uncompressed), maxReceiveMessageSize) } + return mem.BufferSlice{mem.SliceBuffer(uncompressed)}, nil } + if compressor != nil { + dcReader, err := compressor.Decompress(d.Reader()) + if err != nil { + return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the message: %v", err) + } - return uncompressedBuf, cancel, nil -} + // Read at most one byte more than the limit from the decompressor. + // Unless the limit is MaxInt64, in which case, that's impossible, so + // apply no limit. + if limit := int64(maxReceiveMessageSize); limit < math.MaxInt64 { + dcReader = io.LimitReader(dcReader, limit+1) + } + out, err := mem.ReadAll(dcReader, pool) + if err != nil { + out.Free() + return nil, status.Errorf(codes.Internal, "grpc: failed to read decompressed data: %v", err) + } -// Using compressor, decompress d, returning data and size. -// Optionally, if data will be over maxReceiveMessageSize, just return the size. -func decompress(compressor encoding.Compressor, d []byte, maxReceiveMessageSize int) ([]byte, int, error) { - dcReader, err := compressor.Decompress(bytes.NewReader(d)) - if err != nil { - return nil, 0, err - } - if sizer, ok := compressor.(interface { - DecompressedSize(compressedBytes []byte) int - }); ok { - if size := sizer.DecompressedSize(d); size >= 0 { - if size > maxReceiveMessageSize { - return nil, size, nil - } - // size is used as an estimate to size the buffer, but we - // will read more data if available. - // +MinRead so ReadFrom will not reallocate if size is correct. - // - // TODO: If we ensure that the buffer size is the same as the DecompressedSize, - // we can also utilize the recv buffer pool here. - buf := bytes.NewBuffer(make([]byte, 0, size+bytes.MinRead)) - bytesRead, err := buf.ReadFrom(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) - return buf.Bytes(), int(bytesRead), err + if out.Len() > maxReceiveMessageSize { + out.Free() + return nil, status.Errorf(codes.ResourceExhausted, "grpc: received message after decompression larger than max %d", maxReceiveMessageSize) } + return out, nil } - // Read from LimitReader with limit max+1. So if the underlying - // reader is over limit, the result will be bigger than max. - d, err = io.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) - return d, len(d), err + return nil, status.Errorf(codes.Internal, "grpc: no decompressor available for compressed payload") +} + +type recvCompressor interface { + RecvCompress() string } // For the two compressor parameters, both should not be set, but if they are, // dc takes precedence over compressor. // TODO(dfawley): wrap the old compressor/decompressor using the new API? -func recv(p *parser, c baseCodec, s *transport.Stream, dc Decompressor, m any, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor) error { - buf, cancel, err := recvAndDecompress(p, s, dc, maxReceiveMessageSize, payInfo, compressor) +func recv(p *parser, c baseCodec, s recvCompressor, dc Decompressor, m any, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool) error { + data, err := recvAndDecompress(p, s, dc, maxReceiveMessageSize, payInfo, compressor, isServer) if err != nil { return err } - defer cancel() - if err := c.Unmarshal(buf, m); err != nil { + // If the codec wants its own reference to the data, it can get it. Otherwise, always + // free the buffers. + defer data.Free() + + if err := c.Unmarshal(data, m); err != nil { return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message: %v", err) } + return nil } @@ -941,7 +1045,7 @@ func setCallInfoCodec(c *callInfo) error { // encoding.Codec (Name vs. String method name). We only support // setting content subtype from encoding.Codec to avoid a behavior // change with the deprecated version. - if ec, ok := c.codec.(encoding.Codec); ok { + if ec, ok := c.codec.(encoding.CodecV2); ok { c.contentSubtype = strings.ToLower(ec.Name()) } } @@ -950,12 +1054,12 @@ func setCallInfoCodec(c *callInfo) error { if c.contentSubtype == "" { // No codec specified in CallOptions; use proto by default. - c.codec = encoding.GetCodec(proto.Name) + c.codec = getCodec(proto.Name) return nil } // c.contentSubtype is already lowercased in CallContentSubtype - c.codec = encoding.GetCodec(c.contentSubtype) + c.codec = getCodec(c.contentSubtype) if c.codec == nil { return status.Errorf(codes.Internal, "no codec registered for content-subtype %s", c.contentSubtype) } @@ -964,7 +1068,7 @@ func setCallInfoCodec(c *callInfo) error { // The SupportPackageIsVersion variables are referenced from generated protocol // buffer files to ensure compatibility with the gRPC version used. The latest -// support package version is 7. +// support package version is 9. // // Older versions are kept for compatibility. // @@ -976,6 +1080,7 @@ const ( SupportPackageIsVersion6 = true SupportPackageIsVersion7 = true SupportPackageIsVersion8 = true + SupportPackageIsVersion9 = true ) const grpcUA = "grpc-go/" + Version diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index fd4558daa5..1da2a542ac 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -37,14 +37,17 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/encoding" "google.golang.org/grpc/encoding/proto" + estats "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/grpcutil" + istats "google.golang.org/grpc/internal/stats" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -80,18 +83,22 @@ func init() { } internal.BinaryLogger = binaryLogger internal.JoinServerOptions = newJoinServerOption - internal.RecvBufferPool = recvBufferPool + internal.BufferPool = bufferPool + internal.MetricsRecorderForServer = func(srv *Server) estats.MetricsRecorder { + return istats.NewMetricsRecorderList(srv.opts.statsHandlers) + } } var statusOK = status.New(codes.OK, "") var logger = grpclog.Component("core") -type methodHandler func(srv any, ctx context.Context, dec func(any) error, interceptor UnaryServerInterceptor) (any, error) +// MethodHandler is a function type that processes a unary RPC method call. +type MethodHandler func(srv any, ctx context.Context, dec func(any) error, interceptor UnaryServerInterceptor) (any, error) // MethodDesc represents an RPC service's method specification. type MethodDesc struct { MethodName string - Handler methodHandler + Handler MethodHandler } // ServiceDesc represents an RPC service's specification. @@ -170,8 +177,9 @@ type serverOptions struct { maxHeaderListSize *uint32 headerTableSize *uint32 numServerWorkers uint32 - recvBufferPool SharedBufferPool + bufferPool mem.BufferPool waitForHandlers bool + staticWindowSize bool } var defaultServerOptions = serverOptions{ @@ -181,7 +189,7 @@ var defaultServerOptions = serverOptions{ connectionTimeout: 120 * time.Second, writeBufferSize: defaultWriteBufSize, readBufferSize: defaultReadBufSize, - recvBufferPool: nopBufferPool{}, + bufferPool: mem.DefaultBufferPool(), } var globalServerOptions []ServerOption @@ -272,6 +280,7 @@ func ReadBufferSize(s int) ServerOption { func InitialWindowSize(s int32) ServerOption { return newFuncServerOption(func(o *serverOptions) { o.initialWindowSize = s + o.staticWindowSize = true }) } @@ -280,6 +289,29 @@ func InitialWindowSize(s int32) ServerOption { func InitialConnWindowSize(s int32) ServerOption { return newFuncServerOption(func(o *serverOptions) { o.initialConnWindowSize = s + o.staticWindowSize = true + }) +} + +// StaticStreamWindowSize returns a ServerOption to set the initial stream +// window size to the value provided and disables dynamic flow control. +// The lower bound for window size is 64K and any value smaller than that +// will be ignored. +func StaticStreamWindowSize(s int32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.initialWindowSize = s + o.staticWindowSize = true + }) +} + +// StaticConnWindowSize returns a ServerOption to set the initial connection +// window size to the value provided and disables dynamic flow control. +// The lower bound for window size is 64K and any value smaller than that +// will be ignored. +func StaticConnWindowSize(s int32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.initialConnWindowSize = s + o.staticWindowSize = true }) } @@ -313,7 +345,7 @@ func KeepaliveEnforcementPolicy(kep keepalive.EnforcementPolicy) ServerOption { // Will be supported throughout 1.x. func CustomCodec(codec Codec) ServerOption { return newFuncServerOption(func(o *serverOptions) { - o.codec = codec + o.codec = newCodecV0Bridge(codec) }) } @@ -342,7 +374,22 @@ func CustomCodec(codec Codec) ServerOption { // later release. func ForceServerCodec(codec encoding.Codec) ServerOption { return newFuncServerOption(func(o *serverOptions) { - o.codec = codec + o.codec = newCodecV1Bridge(codec) + }) +} + +// ForceServerCodecV2 is the equivalent of ForceServerCodec, but for the new +// CodecV2 interface. +// +// Will be supported throughout 1.x. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func ForceServerCodecV2(codecV2 encoding.CodecV2) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.codec = codecV2 }) } @@ -527,12 +574,22 @@ func ConnectionTimeout(d time.Duration) ServerOption { }) } +// MaxHeaderListSizeServerOption is a ServerOption that sets the max +// (uncompressed) size of header list that the server is prepared to accept. +type MaxHeaderListSizeServerOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeServerOption) apply(so *serverOptions) { + so.maxHeaderListSize = &o.MaxHeaderListSize +} + // MaxHeaderListSize returns a ServerOption that sets the max (uncompressed) size // of header list that the server is prepared to accept. func MaxHeaderListSize(s uint32) ServerOption { - return newFuncServerOption(func(o *serverOptions) { - o.maxHeaderListSize = &s - }) + return MaxHeaderListSizeServerOption{ + MaxHeaderListSize: s, + } } // HeaderTableSize returns a ServerOption that sets the size of dynamic @@ -582,26 +639,9 @@ func WaitForHandlers(w bool) ServerOption { }) } -// RecvBufferPool returns a ServerOption that configures the server -// to use the provided shared buffer pool for parsing incoming messages. Depending -// on the application's workload, this could result in reduced memory allocation. -// -// If you are unsure about how to implement a memory pool but want to utilize one, -// begin with grpc.NewSharedBufferPool. -// -// Note: The shared buffer pool feature will not be active if any of the following -// options are used: StatsHandler, EnableTracing, or binary logging. In such -// cases, the shared buffer pool will be ignored. -// -// Deprecated: use experimental.WithRecvBufferPool instead. Will be deleted in -// v1.60.0 or later. -func RecvBufferPool(bufferPool SharedBufferPool) ServerOption { - return recvBufferPool(bufferPool) -} - -func recvBufferPool(bufferPool SharedBufferPool) ServerOption { +func bufferPool(bufferPool mem.BufferPool) ServerOption { return newFuncServerOption(func(o *serverOptions) { - o.recvBufferPool = bufferPool + o.bufferPool = bufferPool }) } @@ -612,8 +652,8 @@ func recvBufferPool(bufferPool SharedBufferPool) ServerOption { // workload (assuming a QPS of a few thousand requests/sec). const serverWorkerResetThreshold = 1 << 16 -// serverWorkers blocks on a *transport.Stream channel forever and waits for -// data to be fed by serveStreams. This allows multiple requests to be +// serverWorker blocks on a *transport.ServerStream channel forever and waits +// for data to be fed by serveStreams. This allows multiple requests to be // processed by the same goroutine, removing the need for expensive stack // re-allocations (see the runtime.morestack problem [1]). // @@ -633,7 +673,7 @@ func (s *Server) serverWorker() { // connections to reduce the time spent overall on runtime.morestack. func (s *Server) initServerWorkers() { s.serverWorkerChannel = make(chan func()) - s.serverWorkerChannelClose = grpcsync.OnceFunc(func() { + s.serverWorkerChannelClose = sync.OnceFunc(func() { close(s.serverWorkerChannel) }) for i := uint32(0); i < s.opts.numServerWorkers; i++ { @@ -970,6 +1010,8 @@ func (s *Server) newHTTP2Transport(c net.Conn) transport.ServerTransport { ChannelzParent: s.channelz, MaxHeaderListSize: s.opts.maxHeaderListSize, HeaderTableSize: s.opts.headerTableSize, + BufferPool: s.opts.bufferPool, + StaticWindowSize: s.opts.staticWindowSize, } st, err := transport.NewServerTransport(c, config) if err != nil { @@ -1010,7 +1052,7 @@ func (s *Server) serveStreams(ctx context.Context, st transport.ServerTransport, }() streamQuota := newHandlerQuota(s.opts.maxConcurrentStreams) - st.HandleStreams(ctx, func(stream *transport.Stream) { + st.HandleStreams(ctx, func(stream *transport.ServerStream) { s.handlersWG.Add(1) streamQuota.acquire() f := func() { @@ -1062,7 +1104,7 @@ var _ http.Handler = (*Server)(nil) // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandlers) + st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandlers, s.opts.bufferPool) if err != nil { // Errors returned from transport.NewServerHandlerTransport have // already been written to w. @@ -1126,26 +1168,41 @@ func (s *Server) incrCallsFailed() { s.channelz.ServerMetrics.CallsFailed.Add(1) } -func (s *Server) sendResponse(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, msg any, cp Compressor, opts *transport.Options, comp encoding.Compressor) error { +func (s *Server) sendResponse(ctx context.Context, stream *transport.ServerStream, msg any, cp Compressor, opts *transport.WriteOptions, comp encoding.Compressor) error { data, err := encode(s.getCodec(stream.ContentSubtype()), msg) if err != nil { channelz.Error(logger, s.channelz, "grpc: server failed to encode response: ", err) return err } - compData, err := compress(data, cp, comp) + + compData, pf, err := compress(data, cp, comp, s.opts.bufferPool) if err != nil { + data.Free() channelz.Error(logger, s.channelz, "grpc: server failed to compress response: ", err) return err } - hdr, payload := msgHeader(data, compData) + + hdr, payload := msgHeader(data, compData, pf) + + defer func() { + compData.Free() + data.Free() + // payload does not need to be freed here, it is either data or compData, both of + // which are already freed. + }() + + dataLen := data.Len() + payloadLen := payload.Len() // TODO(dfawley): should we be checking len(data) instead? - if len(payload) > s.opts.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(payload), s.opts.maxSendMessageSize) + if payloadLen > s.opts.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", payloadLen, s.opts.maxSendMessageSize) } - err = t.Write(stream, hdr, payload, opts) + err = stream.Write(hdr, payload, opts) if err == nil { - for _, sh := range s.opts.statsHandlers { - sh.HandleRPC(ctx, outPayload(false, msg, data, payload, time.Now())) + if len(s.opts.statsHandlers) != 0 { + for _, sh := range s.opts.statsHandlers { + sh.HandleRPC(ctx, outPayload(false, msg, dataLen, payloadLen, time.Now())) + } } } return err @@ -1187,7 +1244,7 @@ func getChainUnaryHandler(interceptors []UnaryServerInterceptor, curr int, info } } -func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, info *serviceInfo, md *MethodDesc, trInfo *traceInfo) (err error) { +func (s *Server) processUnaryRPC(ctx context.Context, stream *transport.ServerStream, info *serviceInfo, md *MethodDesc, trInfo *traceInfo) (err error) { shs := s.opts.statsHandlers if len(shs) != 0 || trInfo != nil || channelz.IsOn() { if channelz.IsOn() { @@ -1295,7 +1352,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor decomp = encoding.GetCompressor(rc) if decomp == nil { st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) - t.WriteStatus(stream, st) + stream.WriteStatus(st) return st.Err() } } @@ -1324,37 +1381,42 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor var payInfo *payloadInfo if len(shs) != 0 || len(binlogs) != 0 { payInfo = &payloadInfo{} + defer payInfo.free() } - d, cancel, err := recvAndDecompress(&parser{r: stream, recvBufferPool: s.opts.recvBufferPool}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp) + d, err := recvAndDecompress(&parser{r: stream, bufferPool: s.opts.bufferPool}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp, true) if err != nil { - if e := t.WriteStatus(stream, status.Convert(err)); e != nil { + if e := stream.WriteStatus(status.Convert(err)); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } return err } - if channelz.IsOn() { - t.IncrMsgRecv() + freed := false + dataFree := func() { + if !freed { + d.Free() + freed = true + } } + defer dataFree() df := func(v any) error { - defer cancel() - + defer dataFree() if err := s.getCodec(stream.ContentSubtype()).Unmarshal(d, v); err != nil { return status.Errorf(codes.Internal, "grpc: error unmarshalling request: %v", err) } + for _, sh := range shs { sh.HandleRPC(ctx, &stats.InPayload{ RecvTime: time.Now(), Payload: v, - Length: len(d), + Length: d.Len(), WireLength: payInfo.compressedLength + headerLen, CompressedLength: payInfo.compressedLength, - Data: d, }) } if len(binlogs) != 0 { cm := &binarylog.ClientMessage{ - Message: d, + Message: d.Materialize(), } for _, binlog := range binlogs { binlog.Log(ctx, cm) @@ -1379,7 +1441,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor trInfo.tr.LazyLog(stringer(appStatus.Message()), true) trInfo.tr.SetError() } - if e := t.WriteStatus(stream, appStatus); e != nil { + if e := stream.WriteStatus(appStatus); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } if len(binlogs) != 0 { @@ -1406,20 +1468,20 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor if trInfo != nil { trInfo.tr.LazyLog(stringer("OK"), false) } - opts := &transport.Options{Last: true} + opts := &transport.WriteOptions{Last: true} // Server handler could have set new compressor by calling SetSendCompressor. // In case it is set, we need to use it for compressing outbound message. if stream.SendCompress() != sendCompressorName { comp = encoding.GetCompressor(stream.SendCompress()) } - if err := s.sendResponse(ctx, t, stream, reply, cp, opts, comp); err != nil { + if err := s.sendResponse(ctx, stream, reply, cp, opts, comp); err != nil { if err == io.EOF { // The entire stream is done (for unary RPC only). return err } if sts, ok := status.FromError(err); ok { - if e := t.WriteStatus(stream, sts); e != nil { + if e := stream.WriteStatus(sts); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } } else { @@ -1459,9 +1521,6 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor binlog.Log(ctx, sm) } } - if channelz.IsOn() { - t.IncrMsgSent() - } if trInfo != nil { trInfo.tr.LazyLog(&payload{sent: true, msg: reply}, true) } @@ -1477,7 +1536,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor binlog.Log(ctx, st) } } - return t.WriteStatus(stream, statusOK) + return stream.WriteStatus(statusOK) } // chainStreamServerInterceptors chains all stream server interceptors into one. @@ -1516,7 +1575,7 @@ func getChainStreamHandler(interceptors []StreamServerInterceptor, curr int, inf } } -func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, info *serviceInfo, sd *StreamDesc, trInfo *traceInfo) (err error) { +func (s *Server) processStreamingRPC(ctx context.Context, stream *transport.ServerStream, info *serviceInfo, sd *StreamDesc, trInfo *traceInfo) (err error) { if channelz.IsOn() { s.incrCallsStarted() } @@ -1536,10 +1595,10 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran ctx = NewContextWithServerTransportStream(ctx, stream) ss := &serverStream{ ctx: ctx, - t: t, s: stream, - p: &parser{r: stream, recvBufferPool: s.opts.recvBufferPool}, + p: &parser{r: stream, bufferPool: s.opts.bufferPool}, codec: s.getCodec(stream.ContentSubtype()), + desc: sd, maxReceiveMessageSize: s.opts.maxReceiveMessageSize, maxSendMessageSize: s.opts.maxSendMessageSize, trInfo: trInfo, @@ -1618,12 +1677,12 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran // If dc is set and matches the stream's compression, use it. Otherwise, try // to find a matching registered compressor for decomp. if rc := stream.RecvCompress(); s.opts.dc != nil && s.opts.dc.Type() == rc { - ss.dc = s.opts.dc + ss.decompressorV0 = s.opts.dc } else if rc != "" && rc != encoding.Identity { - ss.decomp = encoding.GetCompressor(rc) - if ss.decomp == nil { + ss.decompressorV1 = encoding.GetCompressor(rc) + if ss.decompressorV1 == nil { st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) - t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) return st.Err() } } @@ -1633,12 +1692,12 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran // // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. if s.opts.cp != nil { - ss.cp = s.opts.cp + ss.compressorV0 = s.opts.cp ss.sendCompressorName = s.opts.cp.Type() } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { // Legacy compressor not specified; attempt to respond with same encoding. - ss.comp = encoding.GetCompressor(rc) - if ss.comp != nil { + ss.compressorV1 = encoding.GetCompressor(rc) + if ss.compressorV1 != nil { ss.sendCompressorName = rc } } @@ -1649,7 +1708,7 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran } } - ss.ctx = newContextWithRPCInfo(ss.ctx, false, ss.codec, ss.cp, ss.comp) + ss.ctx = newContextWithRPCInfo(ss.ctx, false, ss.codec, ss.compressorV0, ss.compressorV1) if trInfo != nil { trInfo.tr.LazyLog(&trInfo.firstLine, false) @@ -1692,7 +1751,7 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran binlog.Log(ctx, st) } } - t.WriteStatus(ss.s, appStatus) + ss.s.WriteStatus(appStatus) // TODO: Should we log an error from WriteStatus here and below? return appErr } @@ -1710,10 +1769,10 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran binlog.Log(ctx, st) } } - return t.WriteStatus(ss.s, statusOK) + return ss.s.WriteStatus(statusOK) } -func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream) { +func (s *Server) handleStream(t transport.ServerTransport, stream *transport.ServerStream) { ctx := stream.Context() ctx = contextWithServer(ctx, s) var ti *traceInfo @@ -1743,7 +1802,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str ti.tr.SetError() } errDesc := fmt.Sprintf("malformed method name: %q", stream.Method()) - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { + if err := stream.WriteStatus(status.New(codes.Unimplemented, errDesc)); err != nil { if ti != nil { ti.tr.LazyLog(&fmtStringer{"%v", []any{err}}, true) ti.tr.SetError() @@ -1758,17 +1817,20 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str service := sm[:pos] method := sm[pos+1:] - md, _ := metadata.FromIncomingContext(ctx) - for _, sh := range s.opts.statsHandlers { - ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: stream.Method()}) - sh.HandleRPC(ctx, &stats.InHeader{ - FullMethod: stream.Method(), - RemoteAddr: t.Peer().Addr, - LocalAddr: t.Peer().LocalAddr, - Compression: stream.RecvCompress(), - WireLength: stream.HeaderWireLength(), - Header: md, - }) + // FromIncomingContext is expensive: skip if there are no statsHandlers + if len(s.opts.statsHandlers) > 0 { + md, _ := metadata.FromIncomingContext(ctx) + for _, sh := range s.opts.statsHandlers { + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: stream.Method()}) + sh.HandleRPC(ctx, &stats.InHeader{ + FullMethod: stream.Method(), + RemoteAddr: t.Peer().Addr, + LocalAddr: t.Peer().LocalAddr, + Compression: stream.RecvCompress(), + WireLength: stream.HeaderWireLength(), + Header: md, + }) + } } // To have calls in stream callouts work. Will delete once all stats handler // calls come from the gRPC layer. @@ -1777,17 +1839,17 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str srv, knownService := s.services[service] if knownService { if md, ok := srv.methods[method]; ok { - s.processUnaryRPC(ctx, t, stream, srv, md, ti) + s.processUnaryRPC(ctx, stream, srv, md, ti) return } if sd, ok := srv.streams[method]; ok { - s.processStreamingRPC(ctx, t, stream, srv, sd, ti) + s.processStreamingRPC(ctx, stream, srv, sd, ti) return } } // Unknown service, or known server unknown method. if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { - s.processStreamingRPC(ctx, t, stream, nil, unknownDesc, ti) + s.processStreamingRPC(ctx, stream, nil, unknownDesc, ti) return } var errDesc string @@ -1800,7 +1862,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str ti.tr.LazyPrintf("%s", errDesc) ti.tr.SetError() } - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { + if err := stream.WriteStatus(status.New(codes.Unimplemented, errDesc)); err != nil { if ti != nil { ti.tr.LazyLog(&fmtStringer{"%v", []any{err}}, true) ti.tr.SetError() @@ -1900,7 +1962,7 @@ func (s *Server) stop(graceful bool) { s.conns = nil if s.opts.numServerWorkers > 0 { - // Closing the channel (only once, via grpcsync.OnceFunc) after all the + // Closing the channel (only once, via sync.OnceFunc) after all the // connections have been closed above ensures that there are no // goroutines executing the callback passed to st.HandleStreams (where // the channel is written to). @@ -1953,12 +2015,12 @@ func (s *Server) getCodec(contentSubtype string) baseCodec { return s.opts.codec } if contentSubtype == "" { - return encoding.GetCodec(proto.Name) + return getCodec(proto.Name) } - codec := encoding.GetCodec(contentSubtype) + codec := getCodec(contentSubtype) if codec == nil { logger.Warningf("Unsupported codec %q. Defaulting to %q for now. This will start to fail in future releases.", contentSubtype, proto.Name) - return encoding.GetCodec(proto.Name) + return getCodec(proto.Name) } return codec } @@ -2075,7 +2137,7 @@ func SendHeader(ctx context.Context, md metadata.MD) error { // Notice: This function is EXPERIMENTAL and may be changed or removed in a // later release. func SetSendCompressor(ctx context.Context, name string) error { - stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.ServerStream) if !ok || stream == nil { return fmt.Errorf("failed to fetch the stream from the given context") } @@ -2097,7 +2159,7 @@ func SetSendCompressor(ctx context.Context, name string) error { // Notice: This function is EXPERIMENTAL and may be changed or removed in a // later release. func ClientSupportedCompressors(ctx context.Context) ([]string, error) { - stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.ServerStream) if !ok || stream == nil { return nil, fmt.Errorf("failed to fetch the stream from the given context %v", ctx) } diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go index 2b35c5d213..8d451e07c7 100644 --- a/vendor/google.golang.org/grpc/service_config.go +++ b/vendor/google.golang.org/grpc/service_config.go @@ -26,6 +26,7 @@ import ( "time" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst" "google.golang.org/grpc/codes" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/balancer/gracefulswitch" @@ -163,16 +164,19 @@ type jsonSC struct { } func init() { - internal.ParseServiceConfig = parseServiceConfig + internal.ParseServiceConfig = func(js string) *serviceconfig.ParseResult { + return parseServiceConfig(js, defaultMaxCallAttempts) + } } -func parseServiceConfig(js string) *serviceconfig.ParseResult { + +func parseServiceConfig(js string, maxAttempts int) *serviceconfig.ParseResult { if len(js) == 0 { return &serviceconfig.ParseResult{Err: fmt.Errorf("no JSON service config provided")} } var rsc jsonSC err := json.Unmarshal([]byte(js), &rsc) if err != nil { - logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) + logger.Warningf("grpc: unmarshalling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } sc := ServiceConfig{ @@ -183,12 +187,12 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { } c := rsc.LoadBalancingConfig if c == nil { - name := PickFirstBalancerName + name := pickfirst.Name if rsc.LoadBalancingPolicy != nil { name = *rsc.LoadBalancingPolicy } if balancer.Get(name) == nil { - name = PickFirstBalancerName + name = pickfirst.Name } cfg := []map[string]any{{name: struct{}{}}} strCfg, err := json.Marshal(cfg) @@ -218,8 +222,8 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { WaitForReady: m.WaitForReady, Timeout: (*time.Duration)(m.Timeout), } - if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil { - logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) + if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy, maxAttempts); err != nil { + logger.Warningf("grpc: unmarshalling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } if m.MaxRequestMessageBytes != nil { @@ -239,13 +243,13 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { for i, n := range *m.Name { path, err := n.generatePath() if err != nil { - logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshalling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } if _, ok := paths[path]; ok { err = errDuplicatedName - logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshalling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } paths[path] = struct{}{} @@ -264,38 +268,40 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { return &serviceconfig.ParseResult{Config: &sc} } -func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPolicy, err error) { +func isValidRetryPolicy(jrp *jsonRetryPolicy) bool { + return jrp.MaxAttempts > 1 && + jrp.InitialBackoff > 0 && + jrp.MaxBackoff > 0 && + jrp.BackoffMultiplier > 0 && + len(jrp.RetryableStatusCodes) > 0 +} + +func convertRetryPolicy(jrp *jsonRetryPolicy, maxAttempts int) (p *internalserviceconfig.RetryPolicy, err error) { if jrp == nil { return nil, nil } - if jrp.MaxAttempts <= 1 || - jrp.InitialBackoff <= 0 || - jrp.MaxBackoff <= 0 || - jrp.BackoffMultiplier <= 0 || - len(jrp.RetryableStatusCodes) == 0 { - logger.Warningf("grpc: ignoring retry policy %v due to illegal configuration", jrp) - return nil, nil + if !isValidRetryPolicy(jrp) { + return nil, fmt.Errorf("invalid retry policy (%+v): ", jrp) } + if jrp.MaxAttempts < maxAttempts { + maxAttempts = jrp.MaxAttempts + } rp := &internalserviceconfig.RetryPolicy{ - MaxAttempts: jrp.MaxAttempts, + MaxAttempts: maxAttempts, InitialBackoff: time.Duration(jrp.InitialBackoff), MaxBackoff: time.Duration(jrp.MaxBackoff), BackoffMultiplier: jrp.BackoffMultiplier, RetryableStatusCodes: make(map[codes.Code]bool), } - if rp.MaxAttempts > 5 { - // TODO(retry): Make the max maxAttempts configurable. - rp.MaxAttempts = 5 - } for _, code := range jrp.RetryableStatusCodes { rp.RetryableStatusCodes[code] = true } return rp, nil } -func min(a, b *int) *int { +func minPointers(a, b *int) *int { if *a < *b { return a } @@ -307,7 +313,7 @@ func getMaxSize(mcMax, doptMax *int, defaultVal int) *int { return &defaultVal } if mcMax != nil && doptMax != nil { - return min(mcMax, doptMax) + return minPointers(mcMax, doptMax) } if mcMax != nil { return mcMax diff --git a/vendor/google.golang.org/grpc/shared_buffer_pool.go b/vendor/google.golang.org/grpc/shared_buffer_pool.go deleted file mode 100644 index 48a64cfe8e..0000000000 --- a/vendor/google.golang.org/grpc/shared_buffer_pool.go +++ /dev/null @@ -1,154 +0,0 @@ -/* - * - * Copyright 2023 gRPC 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 grpc - -import "sync" - -// SharedBufferPool is a pool of buffers that can be shared, resulting in -// decreased memory allocation. Currently, in gRPC-go, it is only utilized -// for parsing incoming messages. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. -type SharedBufferPool interface { - // Get returns a buffer with specified length from the pool. - // - // The returned byte slice may be not zero initialized. - Get(length int) []byte - - // Put returns a buffer to the pool. - Put(*[]byte) -} - -// NewSharedBufferPool creates a simple SharedBufferPool with buckets -// of different sizes to optimize memory usage. This prevents the pool from -// wasting large amounts of memory, even when handling messages of varying sizes. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. -func NewSharedBufferPool() SharedBufferPool { - return &simpleSharedBufferPool{ - pools: [poolArraySize]simpleSharedBufferChildPool{ - newBytesPool(level0PoolMaxSize), - newBytesPool(level1PoolMaxSize), - newBytesPool(level2PoolMaxSize), - newBytesPool(level3PoolMaxSize), - newBytesPool(level4PoolMaxSize), - newBytesPool(0), - }, - } -} - -// simpleSharedBufferPool is a simple implementation of SharedBufferPool. -type simpleSharedBufferPool struct { - pools [poolArraySize]simpleSharedBufferChildPool -} - -func (p *simpleSharedBufferPool) Get(size int) []byte { - return p.pools[p.poolIdx(size)].Get(size) -} - -func (p *simpleSharedBufferPool) Put(bs *[]byte) { - p.pools[p.poolIdx(cap(*bs))].Put(bs) -} - -func (p *simpleSharedBufferPool) poolIdx(size int) int { - switch { - case size <= level0PoolMaxSize: - return level0PoolIdx - case size <= level1PoolMaxSize: - return level1PoolIdx - case size <= level2PoolMaxSize: - return level2PoolIdx - case size <= level3PoolMaxSize: - return level3PoolIdx - case size <= level4PoolMaxSize: - return level4PoolIdx - default: - return levelMaxPoolIdx - } -} - -const ( - level0PoolMaxSize = 16 // 16 B - level1PoolMaxSize = level0PoolMaxSize * 16 // 256 B - level2PoolMaxSize = level1PoolMaxSize * 16 // 4 KB - level3PoolMaxSize = level2PoolMaxSize * 16 // 64 KB - level4PoolMaxSize = level3PoolMaxSize * 16 // 1 MB -) - -const ( - level0PoolIdx = iota - level1PoolIdx - level2PoolIdx - level3PoolIdx - level4PoolIdx - levelMaxPoolIdx - poolArraySize -) - -type simpleSharedBufferChildPool interface { - Get(size int) []byte - Put(any) -} - -type bufferPool struct { - sync.Pool - - defaultSize int -} - -func (p *bufferPool) Get(size int) []byte { - bs := p.Pool.Get().(*[]byte) - - if cap(*bs) < size { - p.Pool.Put(bs) - - return make([]byte, size) - } - - return (*bs)[:size] -} - -func newBytesPool(size int) simpleSharedBufferChildPool { - return &bufferPool{ - Pool: sync.Pool{ - New: func() any { - bs := make([]byte, size) - return &bs - }, - }, - defaultSize: size, - } -} - -// nopBufferPool is a buffer pool just makes new buffer without pooling. -type nopBufferPool struct { -} - -func (nopBufferPool) Get(length int) []byte { - return make([]byte, length) -} - -func (nopBufferPool) Put(*[]byte) { -} diff --git a/vendor/google.golang.org/grpc/stats/handlers.go b/vendor/google.golang.org/grpc/stats/handlers.go index dc03731e45..67194a592f 100644 --- a/vendor/google.golang.org/grpc/stats/handlers.go +++ b/vendor/google.golang.org/grpc/stats/handlers.go @@ -38,6 +38,15 @@ type RPCTagInfo struct { // FailFast indicates if this RPC is failfast. // This field is only valid on client side, it's always false on server side. FailFast bool + // NameResolutionDelay indicates if the RPC needed to wait for the + // initial name resolver update before it could begin. This should only + // happen if the channel is IDLE when the RPC is started. Note that + // all retry or hedging attempts for an RPC that experienced a delay + // will have it set. + // + // This field is only valid on the client side; it is always false on + // the server side. + NameResolutionDelay bool } // Handler defines the interface for the related stats handling (e.g., RPCs, connections). diff --git a/vendor/google.golang.org/grpc/stats/metrics.go b/vendor/google.golang.org/grpc/stats/metrics.go new file mode 100644 index 0000000000..641c8e9794 --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/metrics.go @@ -0,0 +1,81 @@ +/* + * Copyright 2024 gRPC 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 stats + +import "maps" + +// MetricSet is a set of metrics to record. Once created, MetricSet is immutable, +// however Add and Remove can make copies with specific metrics added or +// removed, respectively. +// +// Do not construct directly; use NewMetricSet instead. +type MetricSet struct { + // metrics are the set of metrics to initialize. + metrics map[string]bool +} + +// NewMetricSet returns a MetricSet containing metricNames. +func NewMetricSet(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for _, metric := range metricNames { + newMetrics[metric] = true + } + return &MetricSet{metrics: newMetrics} +} + +// Metrics returns the metrics set. The returned map is read-only and must not +// be modified. +func (m *MetricSet) Metrics() map[string]bool { + return m.metrics +} + +// Add adds the metricNames to the metrics set and returns a new copy with the +// additional metrics. +func (m *MetricSet) Add(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for metric := range m.metrics { + newMetrics[metric] = true + } + + for _, metric := range metricNames { + newMetrics[metric] = true + } + return &MetricSet{metrics: newMetrics} +} + +// Join joins the metrics passed in with the metrics set, and returns a new copy +// with the merged metrics. +func (m *MetricSet) Join(metrics *MetricSet) *MetricSet { + newMetrics := make(map[string]bool) + maps.Copy(newMetrics, m.metrics) + maps.Copy(newMetrics, metrics.metrics) + return &MetricSet{metrics: newMetrics} +} + +// Remove removes the metricNames from the metrics set and returns a new copy +// with the metrics removed. +func (m *MetricSet) Remove(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for metric := range m.metrics { + newMetrics[metric] = true + } + + for _, metric := range metricNames { + delete(newMetrics, metric) + } + return &MetricSet{metrics: newMetrics} +} diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go index 4ab70e2d46..10bf998aa5 100644 --- a/vendor/google.golang.org/grpc/stats/stats.go +++ b/vendor/google.golang.org/grpc/stats/stats.go @@ -36,7 +36,12 @@ type RPCStats interface { IsClient() bool } -// Begin contains stats when an RPC attempt begins. +// Begin contains stats for the start of an RPC attempt. +// +// - Server-side: Triggered after `InHeader`, as headers are processed +// before the RPC lifecycle begins. +// - Client-side: The first stats event recorded. +// // FailFast is only valid if this Begin is from client side. type Begin struct { // Client is true if this Begin is from client side. @@ -59,24 +64,30 @@ func (s *Begin) IsClient() bool { return s.Client } func (s *Begin) isRPCStats() {} -// PickerUpdated indicates that the LB policy provided a new picker while the -// RPC was waiting for one. -type PickerUpdated struct{} +// DelayedPickComplete indicates that the RPC is unblocked following a delay in +// selecting a connection for the call. +type DelayedPickComplete struct{} -// IsClient indicates if the stats information is from client side. Only Client -// Side interfaces with a Picker, thus always returns true. -func (*PickerUpdated) IsClient() bool { return true } +// IsClient indicates DelayedPickComplete is available on the client. +func (*DelayedPickComplete) IsClient() bool { return true } -func (*PickerUpdated) isRPCStats() {} +func (*DelayedPickComplete) isRPCStats() {} -// InPayload contains the information for an incoming payload. +// PickerUpdated indicates that the RPC is unblocked following a delay in +// selecting a connection for the call. +// +// Deprecated: will be removed in a future release; use DelayedPickComplete +// instead. +type PickerUpdated = DelayedPickComplete + +// InPayload contains stats about an incoming payload. type InPayload struct { // Client is true if this InPayload is from client side. Client bool - // Payload is the payload with original type. + // Payload is the payload with original type. This may be modified after + // the call to HandleRPC which provides the InPayload returns and must be + // copied if needed later. Payload any - // Data is the serialized message payload. - Data []byte // Length is the size of the uncompressed payload data. Does not include any // framing (gRPC or HTTP/2). @@ -98,7 +109,9 @@ func (s *InPayload) IsClient() bool { return s.Client } func (s *InPayload) isRPCStats() {} -// InHeader contains stats when a header is received. +// InHeader contains stats about header reception. +// +// - Server-side: The first stats event after the RPC request is received. type InHeader struct { // Client is true if this InHeader is from client side. Client bool @@ -123,7 +136,7 @@ func (s *InHeader) IsClient() bool { return s.Client } func (s *InHeader) isRPCStats() {} -// InTrailer contains stats when a trailer is received. +// InTrailer contains stats about trailer reception. type InTrailer struct { // Client is true if this InTrailer is from client side. Client bool @@ -139,14 +152,14 @@ func (s *InTrailer) IsClient() bool { return s.Client } func (s *InTrailer) isRPCStats() {} -// OutPayload contains the information for an outgoing payload. +// OutPayload contains stats about an outgoing payload. type OutPayload struct { // Client is true if this OutPayload is from client side. Client bool - // Payload is the payload with original type. + // Payload is the payload with original type. This may be modified after + // the call to HandleRPC which provides the OutPayload returns and must be + // copied if needed later. Payload any - // Data is the serialized message payload. - Data []byte // Length is the size of the uncompressed payload data. Does not include any // framing (gRPC or HTTP/2). Length int @@ -166,7 +179,10 @@ func (s *OutPayload) IsClient() bool { return s.Client } func (s *OutPayload) isRPCStats() {} -// OutHeader contains stats when a header is sent. +// OutHeader contains stats about header transmission. +// +// - Client-side: Only occurs after 'Begin', as headers are always the first +// thing sent on a stream. type OutHeader struct { // Client is true if this OutHeader is from client side. Client bool @@ -189,14 +205,15 @@ func (s *OutHeader) IsClient() bool { return s.Client } func (s *OutHeader) isRPCStats() {} -// OutTrailer contains stats when a trailer is sent. +// OutTrailer contains stats about trailer transmission. type OutTrailer struct { // Client is true if this OutTrailer is from client side. Client bool // WireLength is the wire length of trailer. // - // Deprecated: This field is never set. The length is not known when this message is - // emitted because the trailer fields are compressed with hpack after that. + // Deprecated: This field is never set. The length is not known when this + // message is emitted because the trailer fields are compressed with hpack + // after that. WireLength int // Trailer contains the trailer metadata sent to the client. This // field is only valid if this OutTrailer is from the server side. @@ -208,7 +225,7 @@ func (s *OutTrailer) IsClient() bool { return s.Client } func (s *OutTrailer) isRPCStats() {} -// End contains stats when an RPC ends. +// End contains stats about RPC completion. type End struct { // Client is true if this End is from client side. Client bool @@ -238,7 +255,7 @@ type ConnStats interface { IsClient() bool } -// ConnBegin contains the stats of a connection when it is established. +// ConnBegin contains stats about connection establishment. type ConnBegin struct { // Client is true if this ConnBegin is from client side. Client bool @@ -249,7 +266,7 @@ func (s *ConnBegin) IsClient() bool { return s.Client } func (s *ConnBegin) isConnStats() {} -// ConnEnd contains the stats of a connection when it ends. +// ConnEnd contains stats about connection termination. type ConnEnd struct { // Client is true if this ConnEnd is from client side. Client bool @@ -260,84 +277,42 @@ func (s *ConnEnd) IsClient() bool { return s.Client } func (s *ConnEnd) isConnStats() {} -type incomingTagsKey struct{} -type outgoingTagsKey struct{} - // SetTags attaches stats tagging data to the context, which will be sent in // the outgoing RPC with the header grpc-tags-bin. Subsequent calls to // SetTags will overwrite the values from earlier calls. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: set the `grpc-tags-bin` header in the metadata instead. func SetTags(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, outgoingTagsKey{}, b) + return metadata.AppendToOutgoingContext(ctx, "grpc-tags-bin", string(b)) } // Tags returns the tags from the context for the inbound RPC. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: obtain the `grpc-tags-bin` header from metadata instead. func Tags(ctx context.Context) []byte { - b, _ := ctx.Value(incomingTagsKey{}).([]byte) - return b -} - -// SetIncomingTags attaches stats tagging data to the context, to be read by -// the application (not sent in outgoing RPCs). -// -// This is intended for gRPC-internal use ONLY. -func SetIncomingTags(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, incomingTagsKey{}, b) + traceValues := metadata.ValueFromIncomingContext(ctx, "grpc-tags-bin") + if len(traceValues) == 0 { + return nil + } + return []byte(traceValues[len(traceValues)-1]) } -// OutgoingTags returns the tags from the context for the outbound RPC. -// -// This is intended for gRPC-internal use ONLY. -func OutgoingTags(ctx context.Context) []byte { - b, _ := ctx.Value(outgoingTagsKey{}).([]byte) - return b -} - -type incomingTraceKey struct{} -type outgoingTraceKey struct{} - // SetTrace attaches stats tagging data to the context, which will be sent in // the outgoing RPC with the header grpc-trace-bin. Subsequent calls to // SetTrace will overwrite the values from earlier calls. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: set the `grpc-trace-bin` header in the metadata instead. func SetTrace(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, outgoingTraceKey{}, b) + return metadata.AppendToOutgoingContext(ctx, "grpc-trace-bin", string(b)) } // Trace returns the trace from the context for the inbound RPC. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: obtain the `grpc-trace-bin` header from metadata instead. func Trace(ctx context.Context) []byte { - b, _ := ctx.Value(incomingTraceKey{}).([]byte) - return b -} - -// SetIncomingTrace attaches stats tagging data to the context, to be read by -// the application (not sent in outgoing RPCs). It is intended for -// gRPC-internal use. -func SetIncomingTrace(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, incomingTraceKey{}, b) -} - -// OutgoingTrace returns the trace from the context for the outbound RPC. It is -// intended for gRPC-internal use. -func OutgoingTrace(ctx context.Context) []byte { - b, _ := ctx.Value(outgoingTraceKey{}).([]byte) - return b + traceValues := metadata.ValueFromIncomingContext(ctx, "grpc-trace-bin") + if len(traceValues) == 0 { + return nil + } + return []byte(traceValues[len(traceValues)-1]) } diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index d939ffc634..0a0af8961f 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -23,6 +23,7 @@ import ( "errors" "io" "math" + rand "math/rand/v2" "strconv" "sync" "time" @@ -34,13 +35,13 @@ import ( "google.golang.org/grpc/internal/balancerload" "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/grpcutil" imetadata "google.golang.org/grpc/internal/metadata" iresolver "google.golang.org/grpc/internal/resolver" "google.golang.org/grpc/internal/serviceconfig" istatus "google.golang.org/grpc/internal/status" "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -100,9 +101,9 @@ type ClientStream interface { // It must only be called after stream.CloseAndRecv has returned, or // stream.Recv has returned a non-nil error (including io.EOF). Trailer() metadata.MD - // CloseSend closes the send direction of the stream. It closes the stream - // when non-nil error is met. It is also not safe to call CloseSend - // concurrently with SendMsg. + // CloseSend closes the send direction of the stream. This method always + // returns a nil error. The status of the stream may be discovered using + // RecvMsg. It is also not safe to call CloseSend concurrently with SendMsg. CloseSend() error // Context returns the context for this stream. // @@ -112,7 +113,9 @@ type ClientStream interface { // SendMsg is generally called by generated code. On error, SendMsg aborts // the stream. If the error was generated by the client, the status is // returned directly; otherwise, io.EOF is returned and the status of - // the stream may be discovered using RecvMsg. + // the stream may be discovered using RecvMsg. For unary or server-streaming + // RPCs (StreamDesc.ClientStreams is false), a nil error is returned + // unconditionally. // // SendMsg blocks until: // - There is sufficient flow control to schedule m with the transport, or @@ -209,14 +212,15 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth } // Provide an opportunity for the first RPC to see the first service config // provided by the resolver. - if err := cc.waitForResolvedAddrs(ctx); err != nil { + nameResolutionDelayed, err := cc.waitForResolvedAddrs(ctx) + if err != nil { return nil, err } var mc serviceconfig.MethodConfig var onCommit func() - var newStream = func(ctx context.Context, done func()) (iresolver.ClientStream, error) { - return newClientStreamWithParams(ctx, desc, cc, method, mc, onCommit, done, opts...) + newStream := func(ctx context.Context, done func()) (iresolver.ClientStream, error) { + return newClientStreamWithParams(ctx, desc, cc, method, mc, onCommit, done, nameResolutionDelayed, opts...) } rpcInfo := iresolver.RPCInfo{Context: ctx, Method: method} @@ -254,10 +258,10 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth return newStream(ctx, func() {}) } -func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, mc serviceconfig.MethodConfig, onCommit, doneFunc func(), opts ...CallOption) (_ iresolver.ClientStream, err error) { - c := defaultCallInfo() +func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, mc serviceconfig.MethodConfig, onCommit, doneFunc func(), nameResolutionDelayed bool, opts ...CallOption) (_ iresolver.ClientStream, err error) { + callInfo := defaultCallInfo() if mc.WaitForReady != nil { - c.failFast = !*mc.WaitForReady + callInfo.failFast = !*mc.WaitForReady } // Possible context leak: @@ -278,59 +282,61 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client }() for _, o := range opts { - if err := o.before(c); err != nil { + if err := o.before(callInfo); err != nil { return nil, toRPCErr(err) } } - c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize) - c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) - if err := setCallInfoCodec(c); err != nil { + callInfo.maxSendMessageSize = getMaxSize(mc.MaxReqSize, callInfo.maxSendMessageSize, defaultClientMaxSendMessageSize) + callInfo.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, callInfo.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) + if err := setCallInfoCodec(callInfo); err != nil { return nil, err } callHdr := &transport.CallHdr{ Host: cc.authority, Method: method, - ContentSubtype: c.contentSubtype, + ContentSubtype: callInfo.contentSubtype, DoneFunc: doneFunc, + Authority: callInfo.authority, } // Set our outgoing compression according to the UseCompressor CallOption, if // set. In that case, also find the compressor from the encoding package. // Otherwise, use the compressor configured by the WithCompressor DialOption, // if set. - var cp Compressor - var comp encoding.Compressor - if ct := c.compressorType; ct != "" { + var compressorV0 Compressor + var compressorV1 encoding.Compressor + if ct := callInfo.compressorName; ct != "" { callHdr.SendCompress = ct if ct != encoding.Identity { - comp = encoding.GetCompressor(ct) - if comp == nil { + compressorV1 = encoding.GetCompressor(ct) + if compressorV1 == nil { return nil, status.Errorf(codes.Internal, "grpc: Compressor is not installed for requested grpc-encoding %q", ct) } } - } else if cc.dopts.cp != nil { - callHdr.SendCompress = cc.dopts.cp.Type() - cp = cc.dopts.cp + } else if cc.dopts.compressorV0 != nil { + callHdr.SendCompress = cc.dopts.compressorV0.Type() + compressorV0 = cc.dopts.compressorV0 } - if c.creds != nil { - callHdr.Creds = c.creds + if callInfo.creds != nil { + callHdr.Creds = callInfo.creds } cs := &clientStream{ - callHdr: callHdr, - ctx: ctx, - methodConfig: &mc, - opts: opts, - callInfo: c, - cc: cc, - desc: desc, - codec: c.codec, - cp: cp, - comp: comp, - cancel: cancel, - firstAttempt: true, - onCommit: onCommit, + callHdr: callHdr, + ctx: ctx, + methodConfig: &mc, + opts: opts, + callInfo: callInfo, + cc: cc, + desc: desc, + codec: callInfo.codec, + compressorV0: compressorV0, + compressorV1: compressorV1, + cancel: cancel, + firstAttempt: true, + onCommit: onCommit, + nameResolutionDelay: nameResolutionDelayed, } if !cc.dopts.disableRetry { cs.retryThrottler = cc.retryThrottler.Load().(*retryThrottler) @@ -359,7 +365,7 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client cs.attempt = a return nil } - if err := cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }); err != nil { + if err := cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op, nil) }); err != nil { return nil, err } @@ -409,12 +415,12 @@ func (cs *clientStream) newAttemptLocked(isTransparent bool) (*csAttempt, error) return nil, ErrClientConnClosing } - ctx := newContextWithRPCInfo(cs.ctx, cs.callInfo.failFast, cs.callInfo.codec, cs.cp, cs.comp) + ctx := newContextWithRPCInfo(cs.ctx, cs.callInfo.failFast, cs.callInfo.codec, cs.compressorV0, cs.compressorV1) method := cs.callHdr.Method var beginTime time.Time shs := cs.cc.dopts.copts.StatsHandlers for _, sh := range shs { - ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: cs.callInfo.failFast}) + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: cs.callInfo.failFast, NameResolutionDelay: cs.nameResolutionDelay}) beginTime = time.Now() begin := &stats.Begin{ Client: true, @@ -451,20 +457,21 @@ func (cs *clientStream) newAttemptLocked(isTransparent bool) (*csAttempt, error) } return &csAttempt{ - ctx: ctx, - beginTime: beginTime, - cs: cs, - dc: cs.cc.dopts.dc, - statsHandlers: shs, - trInfo: trInfo, + ctx: ctx, + beginTime: beginTime, + cs: cs, + decompressorV0: cs.cc.dopts.dc, + statsHandlers: shs, + trInfo: trInfo, }, nil } func (a *csAttempt) getTransport() error { cs := a.cs - var err error - a.t, a.pickResult, err = cs.cc.getTransport(a.ctx, cs.callInfo.failFast, cs.callHdr.Method) + pickInfo := balancer.PickInfo{Ctx: a.ctx, FullMethodName: cs.callHdr.Method} + pick, err := cs.cc.pickerWrapper.pick(a.ctx, cs.callInfo.failFast, pickInfo) + a.transport, a.pickResult = pick.transport, pick.result if err != nil { if de, ok := err.(dropError); ok { err = de.error @@ -473,7 +480,12 @@ func (a *csAttempt) getTransport() error { return err } if a.trInfo != nil { - a.trInfo.firstLine.SetRemoteAddr(a.t.RemoteAddr()) + a.trInfo.firstLine.SetRemoteAddr(a.transport.RemoteAddr()) + } + if pick.blocked { + for _, sh := range a.statsHandlers { + sh.HandleRPC(a.ctx, &stats.DelayedPickComplete{}) + } } return nil } @@ -500,7 +512,7 @@ func (a *csAttempt) newStream() error { a.ctx = metadata.NewOutgoingContext(a.ctx, md) } - s, err := a.t.NewStream(a.ctx, cs.callHdr) + s, err := a.transport.NewStream(a.ctx, cs.callHdr) if err != nil { nse, ok := err.(*transport.NewStreamError) if !ok { @@ -515,8 +527,9 @@ func (a *csAttempt) newStream() error { // Unwrap and convert error. return toRPCErr(nse.Err) } - a.s = s - a.p = &parser{r: s, recvBufferPool: a.cs.cc.dopts.recvBufferPool} + a.transportStream = s + a.ctx = s.Context() + a.parser = &parser{r: s, bufferPool: a.cs.cc.dopts.copts.BufferPool} return nil } @@ -528,14 +541,16 @@ type clientStream struct { cc *ClientConn desc *StreamDesc - codec baseCodec - cp Compressor - comp encoding.Compressor + codec baseCodec + compressorV0 Compressor + compressorV1 encoding.Compressor cancel context.CancelFunc // cancels all attempts sentLast bool // sent an end stream + receivedFirstMsg bool // set after the first message is received + methodConfig *MethodConfig ctx context.Context // the application's context, wrapped by stats/tracing @@ -565,26 +580,34 @@ type clientStream struct { // place where we need to check if the attempt is nil. attempt *csAttempt // TODO(hedging): hedging will have multiple attempts simultaneously. - committed bool // active attempt committed for retry? - onCommit func() - buffer []func(a *csAttempt) error // operations to replay on retry - bufferSize int // current size of buffer + committed bool // active attempt committed for retry? + onCommit func() + replayBuffer []replayOp // operations to replay on retry + replayBufferSize int // current size of replayBuffer + // nameResolutionDelay indicates if there was a delay in the name resolution. + // This field is only valid on client side, it's always false on server side. + nameResolutionDelay bool +} + +type replayOp struct { + op func(a *csAttempt) error + cleanup func() } // csAttempt implements a single transport stream attempt within a // clientStream. type csAttempt struct { - ctx context.Context - cs *clientStream - t transport.ClientTransport - s *transport.Stream - p *parser - pickResult balancer.PickResult - - finished bool - dc Decompressor - decomp encoding.Compressor - decompSet bool + ctx context.Context + cs *clientStream + transport transport.ClientTransport + transportStream *transport.ClientStream + parser *parser + pickResult balancer.PickResult + + finished bool + decompressorV0 Decompressor + decompressorV1 encoding.Compressor + decompressorSet bool mu sync.Mutex // guards trInfo.tr // trInfo may be nil (if EnableTracing is false). @@ -606,7 +629,12 @@ func (cs *clientStream) commitAttemptLocked() { cs.onCommit() } cs.committed = true - cs.buffer = nil + for _, op := range cs.replayBuffer { + if op.cleanup != nil { + op.cleanup() + } + } + cs.replayBuffer = nil } func (cs *clientStream) commitAttempt() { @@ -625,14 +653,14 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { // RPC is finished or committed or was dropped by the picker; cannot retry. return false, err } - if a.s == nil && a.allowTransparentRetry { + if a.transportStream == nil && a.allowTransparentRetry { return true, nil } // Wait for the trailers. unprocessed := false - if a.s != nil { - <-a.s.Done() - unprocessed = a.s.Unprocessed() + if a.transportStream != nil { + <-a.transportStream.Done() + unprocessed = a.transportStream.Unprocessed() } if cs.firstAttempt && unprocessed { // First attempt, stream unprocessed: transparently retry. @@ -644,14 +672,14 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { pushback := 0 hasPushback := false - if a.s != nil { - if !a.s.TrailersOnly() { + if a.transportStream != nil { + if !a.transportStream.TrailersOnly() { return false, err } // TODO(retry): Move down if the spec changes to not check server pushback // before considering this a failure for throttling. - sps := a.s.Trailer()["grpc-retry-pushback-ms"] + sps := a.transportStream.Trailer()["grpc-retry-pushback-ms"] if len(sps) == 1 { var e error if pushback, e = strconv.Atoi(sps[0]); e != nil || pushback < 0 { @@ -668,8 +696,8 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { } var code codes.Code - if a.s != nil { - code = a.s.Status().Code() + if a.transportStream != nil { + code = a.transportStream.Status().Code() } else { code = status.Code(err) } @@ -694,11 +722,10 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { cs.numRetriesSincePushback = 0 } else { fact := math.Pow(rp.BackoffMultiplier, float64(cs.numRetriesSincePushback)) - cur := float64(rp.InitialBackoff) * fact - if max := float64(rp.MaxBackoff); cur > max { - cur = max - } - dur = time.Duration(grpcrand.Int63n(int64(cur))) + cur := min(float64(rp.InitialBackoff)*fact, float64(rp.MaxBackoff)) + // Apply jitter by multiplying with a random factor between 0.8 and 1.2 + cur *= 0.8 + 0.4*rand.Float64() + dur = time.Duration(int64(cur)) cs.numRetriesSincePushback++ } @@ -731,7 +758,7 @@ func (cs *clientStream) retryLocked(attempt *csAttempt, lastErr error) error { // the stream is canceled. return err } - // Note that the first op in the replay buffer always sets cs.attempt + // Note that the first op in replayBuffer always sets cs.attempt // if it is able to pick a transport and create a stream. if lastErr = cs.replayBufferLocked(attempt); lastErr == nil { return nil @@ -743,8 +770,8 @@ func (cs *clientStream) Context() context.Context { cs.commitAttempt() // No need to lock before using attempt, since we know it is committed and // cannot change. - if cs.attempt.s != nil { - return cs.attempt.s.Context() + if cs.attempt.transportStream != nil { + return cs.attempt.transportStream.Context() } return cs.ctx } @@ -760,7 +787,7 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) // already be status errors. return toRPCErr(op(cs.attempt)) } - if len(cs.buffer) == 0 { + if len(cs.replayBuffer) == 0 { // For the first op, which controls creation of the stream and // assigns cs.attempt, we need to create a new attempt inline // before executing the first op. On subsequent ops, the attempt @@ -781,9 +808,9 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) continue } if err == io.EOF { - <-a.s.Done() + <-a.transportStream.Done() } - if err == nil || (err == io.EOF && a.s.Status().Code() == codes.OK) { + if err == nil || (err == io.EOF && a.transportStream.Status().Code() == codes.OK) { onSuccess() cs.mu.Unlock() return err @@ -799,7 +826,7 @@ func (cs *clientStream) Header() (metadata.MD, error) { var m metadata.MD err := cs.withRetry(func(a *csAttempt) error { var err error - m, err = a.s.Header() + m, err = a.transportStream.Header() return toRPCErr(err) }, cs.commitAttemptLocked) @@ -843,32 +870,33 @@ func (cs *clientStream) Trailer() metadata.MD { // directions -- it will prevent races and should not meaningfully impact // performance. cs.commitAttempt() - if cs.attempt.s == nil { + if cs.attempt.transportStream == nil { return nil } - return cs.attempt.s.Trailer() + return cs.attempt.transportStream.Trailer() } func (cs *clientStream) replayBufferLocked(attempt *csAttempt) error { - for _, f := range cs.buffer { - if err := f(attempt); err != nil { + for _, f := range cs.replayBuffer { + if err := f.op(attempt); err != nil { return err } } return nil } -func (cs *clientStream) bufferForRetryLocked(sz int, op func(a *csAttempt) error) { +func (cs *clientStream) bufferForRetryLocked(sz int, op func(a *csAttempt) error, cleanup func()) { // Note: we still will buffer if retry is disabled (for transparent retries). if cs.committed { return } - cs.bufferSize += sz - if cs.bufferSize > cs.callInfo.maxRetryRPCBufferSize { + cs.replayBufferSize += sz + if cs.replayBufferSize > cs.callInfo.maxRetryRPCBufferSize { cs.commitAttemptLocked() + cleanup() return } - cs.buffer = append(cs.buffer, op) + cs.replayBuffer = append(cs.replayBuffer, replayOp{op: op, cleanup: cleanup}) } func (cs *clientStream) SendMsg(m any) (err error) { @@ -890,23 +918,50 @@ func (cs *clientStream) SendMsg(m any) (err error) { } // load hdr, payload, data - hdr, payload, data, err := prepareMsg(m, cs.codec, cs.cp, cs.comp) + hdr, data, payload, pf, err := prepareMsg(m, cs.codec, cs.compressorV0, cs.compressorV1, cs.cc.dopts.copts.BufferPool) if err != nil { return err } + defer func() { + data.Free() + // only free payload if compression was made, and therefore it is a different set + // of buffers from data. + if pf.isCompressed() { + payload.Free() + } + }() + + dataLen := data.Len() + payloadLen := payload.Len() // TODO(dfawley): should we be checking len(data) instead? - if len(payload) > *cs.callInfo.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payload), *cs.callInfo.maxSendMessageSize) + if payloadLen > *cs.callInfo.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payloadLen, *cs.callInfo.maxSendMessageSize) } + + // always take an extra ref in case data == payload (i.e. when the data isn't + // compressed). The original ref will always be freed by the deferred free above. + payload.Ref() op := func(a *csAttempt) error { - return a.sendMsg(m, hdr, payload, data) + return a.sendMsg(m, hdr, payload, dataLen, payloadLen) + } + + // onSuccess is invoked when the op is captured for a subsequent retry. If the + // stream was established by a previous message and therefore retries are + // disabled, onSuccess will not be invoked, and payloadRef can be freed + // immediately. + onSuccessCalled := false + err = cs.withRetry(op, func() { + cs.bufferForRetryLocked(len(hdr)+payloadLen, op, payload.Free) + onSuccessCalled = true + }) + if !onSuccessCalled { + payload.Free() } - err = cs.withRetry(op, func() { cs.bufferForRetryLocked(len(hdr)+len(payload), op) }) if len(cs.binlogs) != 0 && err == nil { cm := &binarylog.ClientMessage{ OnClientSide: true, - Message: data, + Message: data.Materialize(), } for _, binlog := range cs.binlogs { binlog.Log(cs.ctx, cm) @@ -923,6 +978,7 @@ func (cs *clientStream) RecvMsg(m any) error { var recvInfo *payloadInfo if len(cs.binlogs) != 0 { recvInfo = &payloadInfo{} + defer recvInfo.free() } err := cs.withRetry(func(a *csAttempt) error { return a.recvMsg(m, recvInfo) @@ -930,7 +986,7 @@ func (cs *clientStream) RecvMsg(m any) error { if len(cs.binlogs) != 0 && err == nil { sm := &binarylog.ServerMessage{ OnClientSide: true, - Message: recvInfo.uncompressedBytes, + Message: recvInfo.uncompressedBytes.Materialize(), } for _, binlog := range cs.binlogs { binlog.Log(cs.ctx, sm) @@ -945,19 +1001,19 @@ func (cs *clientStream) RecvMsg(m any) error { func (cs *clientStream) CloseSend() error { if cs.sentLast { - // TODO: return an error and finish the stream instead, due to API misuse? + // Return a nil error on repeated calls to this method. return nil } cs.sentLast = true op := func(a *csAttempt) error { - a.t.Write(a.s, nil, nil, &transport.Options{Last: true}) + a.transportStream.Write(nil, nil, &transport.WriteOptions{Last: true}) // Always return nil; io.EOF is the only error that might make sense // instead, but there is no need to signal the client to call RecvMsg // as the only use left for the stream after CloseSend is to call // RecvMsg. This also matches historical behavior. return nil } - cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }) + cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op, nil) }) if len(cs.binlogs) != 0 { chc := &binarylog.ClientHalfClose{ OnClientSide: true, @@ -966,7 +1022,10 @@ func (cs *clientStream) CloseSend() error { binlog.Log(cs.ctx, chc) } } - // We never returned an error here for reasons. + // We don't return an error here as we expect users to read all messages + // from the stream and get the RPC status from RecvMsg(). Note that + // SendMsg() must return an error when one occurs so the application + // knows to stop sending messages, but that does not apply here. return nil } @@ -988,7 +1047,7 @@ func (cs *clientStream) finish(err error) { if cs.attempt != nil { cs.attempt.finish(err) // after functions all rely upon having a stream. - if cs.attempt.s != nil { + if cs.attempt.transportStream != nil { for _, o := range cs.opts { o.after(cs.callInfo, cs.attempt) } @@ -1033,7 +1092,7 @@ func (cs *clientStream) finish(err error) { cs.cancel() } -func (a *csAttempt) sendMsg(m any, hdr, payld, data []byte) error { +func (a *csAttempt) sendMsg(m any, hdr []byte, payld mem.BufferSlice, dataLength, payloadLength int) error { cs := a.cs if a.trInfo != nil { a.mu.Lock() @@ -1042,7 +1101,7 @@ func (a *csAttempt) sendMsg(m any, hdr, payld, data []byte) error { } a.mu.Unlock() } - if err := a.t.Write(a.s, hdr, payld, &transport.Options{Last: !cs.desc.ClientStreams}); err != nil { + if err := a.transportStream.Write(hdr, payld, &transport.WriteOptions{Last: !cs.desc.ClientStreams}); err != nil { if !cs.desc.ClientStreams { // For non-client-streaming RPCs, we return nil instead of EOF on error // because the generated code requires it. finish is not called; RecvMsg() @@ -1051,11 +1110,10 @@ func (a *csAttempt) sendMsg(m any, hdr, payld, data []byte) error { } return io.EOF } - for _, sh := range a.statsHandlers { - sh.HandleRPC(a.ctx, outPayload(true, m, data, payld, time.Now())) - } - if channelz.IsOn() { - a.t.IncrMsgSent() + if len(a.statsHandlers) != 0 { + for _, sh := range a.statsHandlers { + sh.HandleRPC(a.ctx, outPayload(true, m, dataLength, payloadLength, time.Now())) + } } return nil } @@ -1064,35 +1122,40 @@ func (a *csAttempt) recvMsg(m any, payInfo *payloadInfo) (err error) { cs := a.cs if len(a.statsHandlers) != 0 && payInfo == nil { payInfo = &payloadInfo{} + defer payInfo.free() } - if !a.decompSet { + if !a.decompressorSet { // Block until we receive headers containing received message encoding. - if ct := a.s.RecvCompress(); ct != "" && ct != encoding.Identity { - if a.dc == nil || a.dc.Type() != ct { + if ct := a.transportStream.RecvCompress(); ct != "" && ct != encoding.Identity { + if a.decompressorV0 == nil || a.decompressorV0.Type() != ct { // No configured decompressor, or it does not match the incoming // message encoding; attempt to find a registered compressor that does. - a.dc = nil - a.decomp = encoding.GetCompressor(ct) + a.decompressorV0 = nil + a.decompressorV1 = encoding.GetCompressor(ct) } } else { // No compression is used; disable our decompressor. - a.dc = nil + a.decompressorV0 = nil } // Only initialize this state once per stream. - a.decompSet = true + a.decompressorSet = true } - err = recv(a.p, cs.codec, a.s, a.dc, m, *cs.callInfo.maxReceiveMessageSize, payInfo, a.decomp) - if err != nil { + if err := recv(a.parser, cs.codec, a.transportStream, a.decompressorV0, m, *cs.callInfo.maxReceiveMessageSize, payInfo, a.decompressorV1, false); err != nil { if err == io.EOF { - if statusErr := a.s.Status().Err(); statusErr != nil { + if statusErr := a.transportStream.Status().Err(); statusErr != nil { return statusErr } + // Received no msg and status OK for non-server streaming rpcs. + if !cs.desc.ServerStreams && !cs.receivedFirstMsg { + return status.Error(codes.Internal, "cardinality violation: received no response message from non-server-streaming RPC") + } return io.EOF // indicates successful end of stream. } return toRPCErr(err) } + cs.receivedFirstMsg = true if a.trInfo != nil { a.mu.Lock() if a.trInfo.tr != nil { @@ -1102,33 +1165,26 @@ func (a *csAttempt) recvMsg(m any, payInfo *payloadInfo) (err error) { } for _, sh := range a.statsHandlers { sh.HandleRPC(a.ctx, &stats.InPayload{ - Client: true, - RecvTime: time.Now(), - Payload: m, - // TODO truncate large payload. - Data: payInfo.uncompressedBytes, + Client: true, + RecvTime: time.Now(), + Payload: m, WireLength: payInfo.compressedLength + headerLen, CompressedLength: payInfo.compressedLength, - Length: len(payInfo.uncompressedBytes), + Length: payInfo.uncompressedBytes.Len(), }) } - if channelz.IsOn() { - a.t.IncrMsgRecv() - } if cs.desc.ServerStreams { // Subsequent messages should be received by subsequent RecvMsg calls. return nil } // Special handling for non-server-stream rpcs. // This recv expects EOF or errors, so we don't collect inPayload. - err = recv(a.p, cs.codec, a.s, a.dc, m, *cs.callInfo.maxReceiveMessageSize, nil, a.decomp) - if err == nil { - return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) - } - if err == io.EOF { - return a.s.Status().Err() // non-server streaming Recv returns nil on success + if err := recv(a.parser, cs.codec, a.transportStream, a.decompressorV0, m, *cs.callInfo.maxReceiveMessageSize, nil, a.decompressorV1, false); err == io.EOF { + return a.transportStream.Status().Err() // non-server streaming Recv returns nil on success + } else if err != nil { + return toRPCErr(err) } - return toRPCErr(err) + return status.Error(codes.Internal, "cardinality violation: expected for non server-streaming RPCs, but received another message") } func (a *csAttempt) finish(err error) { @@ -1143,20 +1199,20 @@ func (a *csAttempt) finish(err error) { err = nil } var tr metadata.MD - if a.s != nil { - a.t.CloseStream(a.s, err) - tr = a.s.Trailer() + if a.transportStream != nil { + a.transportStream.Close(err) + tr = a.transportStream.Trailer() } if a.pickResult.Done != nil { br := false - if a.s != nil { - br = a.s.BytesReceived() + if a.transportStream != nil { + br = a.transportStream.BytesReceived() } a.pickResult.Done(balancer.DoneInfo{ Err: err, Trailer: tr, - BytesSent: a.s != nil, + BytesSent: a.transportStream != nil, BytesReceived: br, ServerLoad: balancerload.Parse(tr), }) @@ -1184,12 +1240,12 @@ func (a *csAttempt) finish(err error) { a.mu.Unlock() } -// newClientStream creates a ClientStream with the specified transport, on the +// newNonRetryClientStream creates a ClientStream with the specified transport, on the // given addrConn. // // It's expected that the given transport is either the same one in addrConn, or // is already closed. To avoid race, transport is specified separately, instead -// of using ac.transpot. +// of using ac.transport. // // Main difference between this and ClientConn.NewStream: // - no retry @@ -1238,7 +1294,7 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin // if set. var cp Compressor var comp encoding.Compressor - if ct := c.compressorType; ct != "" { + if ct := c.compressorName; ct != "" { callHdr.SendCompress = ct if ct != encoding.Identity { comp = encoding.GetCompressor(ct) @@ -1246,9 +1302,9 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin return nil, status.Errorf(codes.Internal, "grpc: Compressor is not installed for requested grpc-encoding %q", ct) } } - } else if ac.cc.dopts.cp != nil { - callHdr.SendCompress = ac.cc.dopts.cp.Type() - cp = ac.cc.dopts.cp + } else if ac.cc.dopts.compressorV0 != nil { + callHdr.SendCompress = ac.cc.dopts.compressorV0.Type() + cp = ac.cc.dopts.compressorV0 } if c.creds != nil { callHdr.Creds = c.creds @@ -1256,26 +1312,26 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin // Use a special addrConnStream to avoid retry. as := &addrConnStream{ - callHdr: callHdr, - ac: ac, - ctx: ctx, - cancel: cancel, - opts: opts, - callInfo: c, - desc: desc, - codec: c.codec, - cp: cp, - comp: comp, - t: t, - } - - s, err := as.t.NewStream(as.ctx, as.callHdr) + callHdr: callHdr, + ac: ac, + ctx: ctx, + cancel: cancel, + opts: opts, + callInfo: c, + desc: desc, + codec: c.codec, + sendCompressorV0: cp, + sendCompressorV1: comp, + transport: t, + } + + s, err := as.transport.NewStream(as.ctx, as.callHdr) if err != nil { err = toRPCErr(err) return nil, err } - as.s = s - as.p = &parser{r: s, recvBufferPool: ac.dopts.recvBufferPool} + as.transportStream = s + as.parser = &parser{r: s, bufferPool: ac.dopts.copts.BufferPool} ac.incrCallsStarted() if desc != unaryStreamDesc { // Listen on stream context to cleanup when the stream context is @@ -1301,29 +1357,32 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin } type addrConnStream struct { - s *transport.Stream - ac *addrConn - callHdr *transport.CallHdr - cancel context.CancelFunc - opts []CallOption - callInfo *callInfo - t transport.ClientTransport - ctx context.Context - sentLast bool - desc *StreamDesc - codec baseCodec - cp Compressor - comp encoding.Compressor - decompSet bool - dc Decompressor - decomp encoding.Compressor - p *parser - mu sync.Mutex - finished bool + transportStream *transport.ClientStream + ac *addrConn + callHdr *transport.CallHdr + cancel context.CancelFunc + opts []CallOption + callInfo *callInfo + transport transport.ClientTransport + ctx context.Context + sentLast bool + receivedFirstMsg bool + desc *StreamDesc + codec baseCodec + sendCompressorV0 Compressor + sendCompressorV1 encoding.Compressor + decompressorSet bool + decompressorV0 Decompressor + decompressorV1 encoding.Compressor + parser *parser + + // mu guards finished and is held for the entire finish method. + mu sync.Mutex + finished bool } func (as *addrConnStream) Header() (metadata.MD, error) { - m, err := as.s.Header() + m, err := as.transportStream.Header() if err != nil { as.finish(toRPCErr(err)) } @@ -1331,17 +1390,17 @@ func (as *addrConnStream) Header() (metadata.MD, error) { } func (as *addrConnStream) Trailer() metadata.MD { - return as.s.Trailer() + return as.transportStream.Trailer() } func (as *addrConnStream) CloseSend() error { if as.sentLast { - // TODO: return an error and finish the stream instead, due to API misuse? + // Return a nil error on repeated calls to this method. return nil } as.sentLast = true - as.t.Write(as.s, nil, nil, &transport.Options{Last: true}) + as.transportStream.Write(nil, nil, &transport.WriteOptions{Last: true}) // Always return nil; io.EOF is the only error that might make sense // instead, but there is no need to signal the client to call RecvMsg // as the only use left for the stream after CloseSend is to call @@ -1350,7 +1409,7 @@ func (as *addrConnStream) CloseSend() error { } func (as *addrConnStream) Context() context.Context { - return as.s.Context() + return as.transportStream.Context() } func (as *addrConnStream) SendMsg(m any) (err error) { @@ -1372,17 +1431,26 @@ func (as *addrConnStream) SendMsg(m any) (err error) { } // load hdr, payload, data - hdr, payld, _, err := prepareMsg(m, as.codec, as.cp, as.comp) + hdr, data, payload, pf, err := prepareMsg(m, as.codec, as.sendCompressorV0, as.sendCompressorV1, as.ac.dopts.copts.BufferPool) if err != nil { return err } + defer func() { + data.Free() + // only free payload if compression was made, and therefore it is a different set + // of buffers from data. + if pf.isCompressed() { + payload.Free() + } + }() + // TODO(dfawley): should we be checking len(data) instead? - if len(payld) > *as.callInfo.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payld), *as.callInfo.maxSendMessageSize) + if payload.Len() > *as.callInfo.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payload.Len(), *as.callInfo.maxSendMessageSize) } - if err := as.t.Write(as.s, hdr, payld, &transport.Options{Last: !as.desc.ClientStreams}); err != nil { + if err := as.transportStream.Write(hdr, payload, &transport.WriteOptions{Last: !as.desc.ClientStreams}); err != nil { if !as.desc.ClientStreams { // For non-client-streaming RPCs, we return nil instead of EOF on error // because the generated code requires it. finish is not called; RecvMsg() @@ -1392,9 +1460,6 @@ func (as *addrConnStream) SendMsg(m any) (err error) { return io.EOF } - if channelz.IsOn() { - as.t.IncrMsgSent() - } return nil } @@ -1406,36 +1471,37 @@ func (as *addrConnStream) RecvMsg(m any) (err error) { } }() - if !as.decompSet { + if !as.decompressorSet { // Block until we receive headers containing received message encoding. - if ct := as.s.RecvCompress(); ct != "" && ct != encoding.Identity { - if as.dc == nil || as.dc.Type() != ct { + if ct := as.transportStream.RecvCompress(); ct != "" && ct != encoding.Identity { + if as.decompressorV0 == nil || as.decompressorV0.Type() != ct { // No configured decompressor, or it does not match the incoming // message encoding; attempt to find a registered compressor that does. - as.dc = nil - as.decomp = encoding.GetCompressor(ct) + as.decompressorV0 = nil + as.decompressorV1 = encoding.GetCompressor(ct) } } else { // No compression is used; disable our decompressor. - as.dc = nil + as.decompressorV0 = nil } // Only initialize this state once per stream. - as.decompSet = true + as.decompressorSet = true } - err = recv(as.p, as.codec, as.s, as.dc, m, *as.callInfo.maxReceiveMessageSize, nil, as.decomp) - if err != nil { + if err := recv(as.parser, as.codec, as.transportStream, as.decompressorV0, m, *as.callInfo.maxReceiveMessageSize, nil, as.decompressorV1, false); err != nil { if err == io.EOF { - if statusErr := as.s.Status().Err(); statusErr != nil { + if statusErr := as.transportStream.Status().Err(); statusErr != nil { return statusErr } + // Received no msg and status OK for non-server streaming rpcs. + if !as.desc.ServerStreams && !as.receivedFirstMsg { + return status.Error(codes.Internal, "cardinality violation: received no response message from non-server-streaming RPC") + } return io.EOF // indicates successful end of stream. } return toRPCErr(err) } + as.receivedFirstMsg = true - if channelz.IsOn() { - as.t.IncrMsgRecv() - } if as.desc.ServerStreams { // Subsequent messages should be received by subsequent RecvMsg calls. return nil @@ -1443,14 +1509,12 @@ func (as *addrConnStream) RecvMsg(m any) (err error) { // Special handling for non-server-stream rpcs. // This recv expects EOF or errors, so we don't collect inPayload. - err = recv(as.p, as.codec, as.s, as.dc, m, *as.callInfo.maxReceiveMessageSize, nil, as.decomp) - if err == nil { - return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) - } - if err == io.EOF { - return as.s.Status().Err() // non-server streaming Recv returns nil on success + if err := recv(as.parser, as.codec, as.transportStream, as.decompressorV0, m, *as.callInfo.maxReceiveMessageSize, nil, as.decompressorV1, false); err == io.EOF { + return as.transportStream.Status().Err() // non-server streaming Recv returns nil on success + } else if err != nil { + return toRPCErr(err) } - return toRPCErr(err) + return status.Error(codes.Internal, "cardinality violation: expected for non server-streaming RPCs, but received another message") } func (as *addrConnStream) finish(err error) { @@ -1464,8 +1528,8 @@ func (as *addrConnStream) finish(err error) { // Ending a stream with EOF indicates a success. err = nil } - if as.s != nil { - as.t.CloseStream(as.s, err) + if as.transportStream != nil { + as.transportStream.Close(err) } if err != nil { @@ -1532,18 +1596,20 @@ type ServerStream interface { // serverStream implements a server side Stream. type serverStream struct { ctx context.Context - t transport.ServerTransport - s *transport.Stream + s *transport.ServerStream p *parser codec baseCodec + desc *StreamDesc - cp Compressor - dc Decompressor - comp encoding.Compressor - decomp encoding.Compressor + compressorV0 Compressor + compressorV1 encoding.Compressor + decompressorV0 Decompressor + decompressorV1 encoding.Compressor sendCompressorName string + recvFirstMsg bool // set after the first message is received + maxReceiveMessageSize int maxSendMessageSize int trInfo *traceInfo @@ -1583,7 +1649,7 @@ func (ss *serverStream) SendHeader(md metadata.MD) error { return status.Error(codes.Internal, err.Error()) } - err = ss.t.WriteHeader(ss.s, md) + err = ss.s.SendHeader(md) if len(ss.binlogs) != 0 && !ss.serverHeaderBinlogged { h, _ := ss.s.Header() sh := &binarylog.ServerHeader{ @@ -1623,7 +1689,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { } if err != nil && err != io.EOF { st, _ := status.FromError(toRPCErr(err)) - ss.t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) // Non-user specified status was sent out. This should be an error // case (as a server side Cancel maybe). // @@ -1631,31 +1697,41 @@ func (ss *serverStream) SendMsg(m any) (err error) { // status from the service handler, we will log that error instead. // This behavior is similar to an interceptor. } - if channelz.IsOn() && err == nil { - ss.t.IncrMsgSent() - } }() // Server handler could have set new compressor by calling SetSendCompressor. // In case it is set, we need to use it for compressing outbound message. if sendCompressorsName := ss.s.SendCompress(); sendCompressorsName != ss.sendCompressorName { - ss.comp = encoding.GetCompressor(sendCompressorsName) + ss.compressorV1 = encoding.GetCompressor(sendCompressorsName) ss.sendCompressorName = sendCompressorsName } // load hdr, payload, data - hdr, payload, data, err := prepareMsg(m, ss.codec, ss.cp, ss.comp) + hdr, data, payload, pf, err := prepareMsg(m, ss.codec, ss.compressorV0, ss.compressorV1, ss.p.bufferPool) if err != nil { return err } + defer func() { + data.Free() + // only free payload if compression was made, and therefore it is a different set + // of buffers from data. + if pf.isCompressed() { + payload.Free() + } + }() + + dataLen := data.Len() + payloadLen := payload.Len() + // TODO(dfawley): should we be checking len(data) instead? - if len(payload) > ss.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payload), ss.maxSendMessageSize) + if payloadLen > ss.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payloadLen, ss.maxSendMessageSize) } - if err := ss.t.Write(ss.s, hdr, payload, &transport.Options{Last: false}); err != nil { + if err := ss.s.Write(hdr, payload, &transport.WriteOptions{Last: false}); err != nil { return toRPCErr(err) } + if len(ss.binlogs) != 0 { if !ss.serverHeaderBinlogged { h, _ := ss.s.Header() @@ -1668,7 +1744,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { } } sm := &binarylog.ServerMessage{ - Message: data, + Message: data.Materialize(), } for _, binlog := range ss.binlogs { binlog.Log(ss.ctx, sm) @@ -1676,7 +1752,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { } if len(ss.statsHandler) != 0 { for _, sh := range ss.statsHandler { - sh.HandleRPC(ss.s.Context(), outPayload(false, m, data, payload, time.Now())) + sh.HandleRPC(ss.s.Context(), outPayload(false, m, dataLen, payloadLen, time.Now())) } } return nil @@ -1698,7 +1774,7 @@ func (ss *serverStream) RecvMsg(m any) (err error) { } if err != nil && err != io.EOF { st, _ := status.FromError(toRPCErr(err)) - ss.t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) // Non-user specified status was sent out. This should be an error // case (as a server side Cancel maybe). // @@ -1706,15 +1782,13 @@ func (ss *serverStream) RecvMsg(m any) (err error) { // status from the service handler, we will log that error instead. // This behavior is similar to an interceptor. } - if channelz.IsOn() && err == nil { - ss.t.IncrMsgRecv() - } }() var payInfo *payloadInfo if len(ss.statsHandler) != 0 || len(ss.binlogs) != 0 { payInfo = &payloadInfo{} + defer payInfo.free() } - if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, payInfo, ss.decomp); err != nil { + if err := recv(ss.p, ss.codec, ss.s, ss.decompressorV0, m, ss.maxReceiveMessageSize, payInfo, ss.decompressorV1, true); err != nil { if err == io.EOF { if len(ss.binlogs) != 0 { chc := &binarylog.ClientHalfClose{} @@ -1722,21 +1796,24 @@ func (ss *serverStream) RecvMsg(m any) (err error) { binlog.Log(ss.ctx, chc) } } + // Received no request msg for non-client streaming rpcs. + if !ss.desc.ClientStreams && !ss.recvFirstMsg { + return status.Error(codes.Internal, "cardinality violation: received no request message from non-client-streaming RPC") + } return err } if err == io.ErrUnexpectedEOF { - err = status.Errorf(codes.Internal, io.ErrUnexpectedEOF.Error()) + err = status.Error(codes.Internal, io.ErrUnexpectedEOF.Error()) } return toRPCErr(err) } + ss.recvFirstMsg = true if len(ss.statsHandler) != 0 { for _, sh := range ss.statsHandler { sh.HandleRPC(ss.s.Context(), &stats.InPayload{ - RecvTime: time.Now(), - Payload: m, - // TODO truncate large payload. - Data: payInfo.uncompressedBytes, - Length: len(payInfo.uncompressedBytes), + RecvTime: time.Now(), + Payload: m, + Length: payInfo.uncompressedBytes.Len(), WireLength: payInfo.compressedLength + headerLen, CompressedLength: payInfo.compressedLength, }) @@ -1744,13 +1821,25 @@ func (ss *serverStream) RecvMsg(m any) (err error) { } if len(ss.binlogs) != 0 { cm := &binarylog.ClientMessage{ - Message: payInfo.uncompressedBytes, + Message: payInfo.uncompressedBytes.Materialize(), } for _, binlog := range ss.binlogs { binlog.Log(ss.ctx, cm) } } - return nil + + if ss.desc.ClientStreams { + // Subsequent messages should be received by subsequent RecvMsg calls. + return nil + } + // Special handling for non-client-stream rpcs. + // This recv expects EOF or errors, so we don't collect inPayload. + if err := recv(ss.p, ss.codec, ss.s, ss.decompressorV0, m, ss.maxReceiveMessageSize, nil, ss.decompressorV1, true); err == io.EOF { + return nil + } else if err != nil { + return err + } + return status.Error(codes.Internal, "cardinality violation: received multiple request messages for non-client-streaming RPC") } // MethodFromServerStream returns the method string for the input stream. @@ -1759,23 +1848,26 @@ func MethodFromServerStream(stream ServerStream) (string, bool) { return Method(stream.Context()) } -// prepareMsg returns the hdr, payload and data -// using the compressors passed or using the -// passed preparedmsg -func prepareMsg(m any, codec baseCodec, cp Compressor, comp encoding.Compressor) (hdr, payload, data []byte, err error) { +// prepareMsg returns the hdr, payload and data using the compressors passed or +// using the passed preparedmsg. The returned boolean indicates whether +// compression was made and therefore whether the payload needs to be freed in +// addition to the returned data. Freeing the payload if the returned boolean is +// false can lead to undefined behavior. +func prepareMsg(m any, codec baseCodec, cp Compressor, comp encoding.Compressor, pool mem.BufferPool) (hdr []byte, data, payload mem.BufferSlice, pf payloadFormat, err error) { if preparedMsg, ok := m.(*PreparedMsg); ok { - return preparedMsg.hdr, preparedMsg.payload, preparedMsg.encodedData, nil + return preparedMsg.hdr, preparedMsg.encodedData, preparedMsg.payload, preparedMsg.pf, nil } // The input interface is not a prepared msg. // Marshal and Compress the data at this point data, err = encode(codec, m) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, 0, err } - compData, err := compress(data, cp, comp) + compData, pf, err := compress(data, cp, comp, pool) if err != nil { - return nil, nil, nil, err + data.Free() + return nil, nil, nil, 0, err } - hdr, payload = msgHeader(data, compData) - return hdr, payload, data, nil + hdr, payload = msgHeader(data, compData, pf) + return hdr, data, payload, pf, nil } diff --git a/vendor/google.golang.org/grpc/stream_interfaces.go b/vendor/google.golang.org/grpc/stream_interfaces.go new file mode 100644 index 0000000000..0037fee0bd --- /dev/null +++ b/vendor/google.golang.org/grpc/stream_interfaces.go @@ -0,0 +1,238 @@ +/* + * + * Copyright 2024 gRPC 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 grpc + +// ServerStreamingClient represents the client side of a server-streaming (one +// request, many responses) RPC. It is generic over the type of the response +// message. It is used in generated code. +type ServerStreamingClient[Res any] interface { + // Recv receives the next response message from the server. The client may + // repeatedly call Recv to read messages from the response stream. If + // io.EOF is returned, the stream has terminated with an OK status. Any + // other error is compatible with the status package and indicates the + // RPC's status code and message. + Recv() (*Res, error) + + // ClientStream is embedded to provide Context, Header, and Trailer + // functionality. No other methods in the ClientStream should be called + // directly. + ClientStream +} + +// ServerStreamingServer represents the server side of a server-streaming (one +// request, many responses) RPC. It is generic over the type of the response +// message. It is used in generated code. +// +// To terminate the response stream, return from the handler method and return +// an error from the status package, or use nil to indicate an OK status code. +type ServerStreamingServer[Res any] interface { + // Send sends a response message to the client. The server handler may + // call Send multiple times to send multiple messages to the client. An + // error is returned if the stream was terminated unexpectedly, and the + // handler method should return, as the stream is no longer usable. + Send(*Res) error + + // ServerStream is embedded to provide Context, SetHeader, SendHeader, and + // SetTrailer functionality. No other methods in the ServerStream should + // be called directly. + ServerStream +} + +// ClientStreamingClient represents the client side of a client-streaming (many +// requests, one response) RPC. It is generic over both the type of the request +// message stream and the type of the unary response message. It is used in +// generated code. +type ClientStreamingClient[Req any, Res any] interface { + // Send sends a request message to the server. The client may call Send + // multiple times to send multiple messages to the server. On error, Send + // aborts the stream. If the error was generated by the client, the status + // is returned directly. Otherwise, io.EOF is returned, and the status of + // the stream may be discovered using CloseAndRecv(). + Send(*Req) error + + // CloseAndRecv closes the request stream and waits for the server's + // response. This method must be called once and only once after sending + // all request messages. Any error returned is implemented by the status + // package. + CloseAndRecv() (*Res, error) + + // ClientStream is embedded to provide Context, Header, and Trailer + // functionality. No other methods in the ClientStream should be called + // directly. + ClientStream +} + +// ClientStreamingServer represents the server side of a client-streaming (many +// requests, one response) RPC. It is generic over both the type of the request +// message stream and the type of the unary response message. It is used in +// generated code. +// +// To terminate the RPC, call SendAndClose and return nil from the method +// handler or do not call SendAndClose and return an error from the status +// package. +type ClientStreamingServer[Req any, Res any] interface { + // Recv receives the next request message from the client. The server may + // repeatedly call Recv to read messages from the request stream. If + // io.EOF is returned, it indicates the client called CloseAndRecv on its + // ClientStreamingClient. Any other error indicates the stream was + // terminated unexpectedly, and the handler method should return, as the + // stream is no longer usable. + Recv() (*Req, error) + + // SendAndClose sends a single response message to the client and closes + // the stream. This method must be called once and only once after all + // request messages have been processed. Recv should not be called after + // calling SendAndClose. + SendAndClose(*Res) error + + // ServerStream is embedded to provide Context, SetHeader, SendHeader, and + // SetTrailer functionality. No other methods in the ServerStream should + // be called directly. + ServerStream +} + +// BidiStreamingClient represents the client side of a bidirectional-streaming +// (many requests, many responses) RPC. It is generic over both the type of the +// request message stream and the type of the response message stream. It is +// used in generated code. +type BidiStreamingClient[Req any, Res any] interface { + // Send sends a request message to the server. The client may call Send + // multiple times to send multiple messages to the server. On error, Send + // aborts the stream. If the error was generated by the client, the status + // is returned directly. Otherwise, io.EOF is returned, and the status of + // the stream may be discovered using Recv(). + Send(*Req) error + + // Recv receives the next response message from the server. The client may + // repeatedly call Recv to read messages from the response stream. If + // io.EOF is returned, the stream has terminated with an OK status. Any + // other error is compatible with the status package and indicates the + // RPC's status code and message. + Recv() (*Res, error) + + // ClientStream is embedded to provide Context, Header, Trailer, and + // CloseSend functionality. No other methods in the ClientStream should be + // called directly. + ClientStream +} + +// BidiStreamingServer represents the server side of a bidirectional-streaming +// (many requests, many responses) RPC. It is generic over both the type of the +// request message stream and the type of the response message stream. It is +// used in generated code. +// +// To terminate the stream, return from the handler method and return +// an error from the status package, or use nil to indicate an OK status code. +type BidiStreamingServer[Req any, Res any] interface { + // Recv receives the next request message from the client. The server may + // repeatedly call Recv to read messages from the request stream. If + // io.EOF is returned, it indicates the client called CloseSend on its + // BidiStreamingClient. Any other error indicates the stream was + // terminated unexpectedly, and the handler method should return, as the + // stream is no longer usable. + Recv() (*Req, error) + + // Send sends a response message to the client. The server handler may + // call Send multiple times to send multiple messages to the client. An + // error is returned if the stream was terminated unexpectedly, and the + // handler method should return, as the stream is no longer usable. + Send(*Res) error + + // ServerStream is embedded to provide Context, SetHeader, SendHeader, and + // SetTrailer functionality. No other methods in the ServerStream should + // be called directly. + ServerStream +} + +// GenericClientStream implements the ServerStreamingClient, ClientStreamingClient, +// and BidiStreamingClient interfaces. It is used in generated code. +type GenericClientStream[Req any, Res any] struct { + ClientStream +} + +var _ ServerStreamingClient[string] = (*GenericClientStream[int, string])(nil) +var _ ClientStreamingClient[int, string] = (*GenericClientStream[int, string])(nil) +var _ BidiStreamingClient[int, string] = (*GenericClientStream[int, string])(nil) + +// Send pushes one message into the stream of requests to be consumed by the +// server. The type of message which can be sent is determined by the Req type +// parameter of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) Send(m *Req) error { + return x.ClientStream.SendMsg(m) +} + +// Recv reads one message from the stream of responses generated by the server. +// The type of the message returned is determined by the Res type parameter +// of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) Recv() (*Res, error) { + m := new(Res) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// CloseAndRecv closes the sending side of the stream, then receives the unary +// response from the server. The type of message which it returns is determined +// by the Res type parameter of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) CloseAndRecv() (*Res, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(Res) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// GenericServerStream implements the ServerStreamingServer, ClientStreamingServer, +// and BidiStreamingServer interfaces. It is used in generated code. +type GenericServerStream[Req any, Res any] struct { + ServerStream +} + +var _ ServerStreamingServer[string] = (*GenericServerStream[int, string])(nil) +var _ ClientStreamingServer[int, string] = (*GenericServerStream[int, string])(nil) +var _ BidiStreamingServer[int, string] = (*GenericServerStream[int, string])(nil) + +// Send pushes one message into the stream of responses to be consumed by the +// client. The type of message which can be sent is determined by the Res +// type parameter of the serverStreamServer receiver. +func (x *GenericServerStream[Req, Res]) Send(m *Res) error { + return x.ServerStream.SendMsg(m) +} + +// SendAndClose pushes the unary response to the client. The type of message +// which can be sent is determined by the Res type parameter of the +// clientStreamServer receiver. +func (x *GenericServerStream[Req, Res]) SendAndClose(m *Res) error { + return x.ServerStream.SendMsg(m) +} + +// Recv reads one message from the stream of requests generated by the client. +// The type of the message returned is determined by the Req type parameter +// of the clientStreamServer receiver. +func (x *GenericServerStream[Req, Res]) Recv() (*Req, error) { + m := new(Req) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index 2556f75838..76f2e0d060 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.63.2" +const Version = "1.76.0" diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh deleted file mode 100644 index 7e6b92e491..0000000000 --- a/vendor/google.golang.org/grpc/vet.sh +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/bash - -set -ex # Exit on error; debugging enabled. -set -o pipefail # Fail a pipe if any sub-command fails. - -# not makes sure the command passed to it does not exit with a return code of 0. -not() { - # This is required instead of the earlier (! $COMMAND) because subshells and - # pipefail don't work the same on Darwin as in Linux. - ! "$@" -} - -die() { - echo "$@" >&2 - exit 1 -} - -fail_on_output() { - tee /dev/stderr | not read -} - -# Check to make sure it's safe to modify the user's git repo. -git status --porcelain | fail_on_output - -# Undo any edits made by this script. -cleanup() { - git reset --hard HEAD -} -trap cleanup EXIT - -PATH="${HOME}/go/bin:${GOROOT}/bin:${PATH}" -go version - -if [[ "$1" = "-install" ]]; then - # Install the pinned versions as defined in module tools. - pushd ./test/tools - go install \ - golang.org/x/tools/cmd/goimports \ - honnef.co/go/tools/cmd/staticcheck \ - github.com/client9/misspell/cmd/misspell - popd - if [[ -z "${VET_SKIP_PROTO}" ]]; then - if [[ "${GITHUB_ACTIONS}" = "true" ]]; then - PROTOBUF_VERSION=25.2 # a.k.a. v4.22.0 in pb.go files. - PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip - pushd /home/runner/go - wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} - unzip ${PROTOC_FILENAME} - bin/protoc --version - popd - elif not which protoc > /dev/null; then - die "Please install protoc into your path" - fi - fi - exit 0 -elif [[ "$#" -ne 0 ]]; then - die "Unknown argument(s): $*" -fi - -# - Check that generated proto files are up to date. -if [[ -z "${VET_SKIP_PROTO}" ]]; then - make proto && git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) -fi - -if [[ -n "${VET_ONLY_PROTO}" ]]; then - exit 0 -fi - -# - Ensure all source files contain a copyright message. -# (Done in two parts because Darwin "git grep" has broken support for compound -# exclusion matches.) -(grep -L "DO NOT EDIT" $(git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)" -- '*.go') || true) | fail_on_output - -# - Make sure all tests in grpc and grpc/test use leakcheck via Teardown. -not grep 'func Test[^(]' *_test.go -not grep 'func Test[^(]' test/*.go - -# - Check for typos in test function names -git grep 'func (s) ' -- "*_test.go" | not grep -v 'func (s) Test' -git grep 'func [A-Z]' -- "*_test.go" | not grep -v 'func Test\|Benchmark\|Example' - -# - Do not import x/net/context. -not git grep -l 'x/net/context' -- "*.go" - -# - Do not use time.After except in tests. It has the potential to leak the -# timer since there is no way to stop it early. -git grep -l 'time.After(' -- "*.go" | not grep -v '_test.go\|test_utils\|testutils' - -# - Do not import math/rand for real library code. Use internal/grpcrand for -# thread safety. -git grep -l '"math/rand"' -- "*.go" 2>&1 | not grep -v '^examples\|^interop/stress\|grpcrand\|^benchmark\|wrr_test' - -# - Do not use "interface{}"; use "any" instead. -git grep -l 'interface{}' -- "*.go" 2>&1 | not grep -v '\.pb\.go\|protoc-gen-go-grpc\|grpc_testing_not_regenerate' - -# - Do not call grpclog directly. Use grpclog.Component instead. -git grep -l -e 'grpclog.I' --or -e 'grpclog.W' --or -e 'grpclog.E' --or -e 'grpclog.F' --or -e 'grpclog.V' -- "*.go" | not grep -v '^grpclog/component.go\|^internal/grpctest/tlogger_test.go' - -# - Ensure all ptypes proto packages are renamed when importing. -not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go" - -# - Ensure all usages of grpc_testing package are renamed when importing. -not git grep "\(import \|^\s*\)\"google.golang.org/grpc/interop/grpc_testing" -- "*.go" - -# - Ensure all xds proto imports are renamed to *pb or *grpc. -git grep '"github.com/envoyproxy/go-control-plane/envoy' -- '*.go' ':(exclude)*.pb.go' | not grep -v 'pb "\|grpc "' - -misspell -error . - -# - gofmt, goimports, go vet, go mod tidy. -# Perform these checks on each module inside gRPC. -for MOD_FILE in $(find . -name 'go.mod'); do - MOD_DIR=$(dirname ${MOD_FILE}) - pushd ${MOD_DIR} - go vet -all ./... | fail_on_output - gofmt -s -d -l . 2>&1 | fail_on_output - goimports -l . 2>&1 | not grep -vE "\.pb\.go" - - go mod tidy -compat=1.19 - git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) - popd -done - -# - Collection of static analysis checks -SC_OUT="$(mktemp)" -staticcheck -go 1.19 -checks 'all' ./... > "${SC_OUT}" || true - -# Error for anything other than checks that need exclusions. -grep -v "(ST1000)" "${SC_OUT}" | grep -v "(SA1019)" | grep -v "(ST1003)" | not grep -v "(ST1019)\|\(other import of\)" - -# Exclude underscore checks for generated code. -grep "(ST1003)" "${SC_OUT}" | not grep -v '\(.pb.go:\)\|\(code_string_test.go:\)\|\(grpc_testing_not_regenerate\)' - -# Error for duplicate imports not including grpc protos. -grep "(ST1019)\|\(other import of\)" "${SC_OUT}" | not grep -Fv 'XXXXX PleaseIgnoreUnused -channelz/grpc_channelz_v1" -go-control-plane/envoy -grpclb/grpc_lb_v1" -health/grpc_health_v1" -interop/grpc_testing" -orca/v3" -proto/grpc_gcp" -proto/grpc_lookup_v1" -reflection/grpc_reflection_v1" -reflection/grpc_reflection_v1alpha" -XXXXX PleaseIgnoreUnused' - -# Error for any package comments not in generated code. -grep "(ST1000)" "${SC_OUT}" | not grep -v "\.pb\.go:" - -# Only ignore the following deprecated types/fields/functions and exclude -# generated code. -grep "(SA1019)" "${SC_OUT}" | not grep -Fv 'XXXXX PleaseIgnoreUnused -XXXXX Protobuf related deprecation errors: -"github.com/golang/protobuf -.pb.go: -grpc_testing_not_regenerate -: ptypes. -proto.RegisterType -XXXXX gRPC internal usage deprecation errors: -"google.golang.org/grpc -: grpc. -: v1alpha. -: v1alphareflectionpb. -BalancerAttributes is deprecated: -CredsBundle is deprecated: -Metadata is deprecated: use Attributes instead. -NewSubConn is deprecated: -OverrideServerName is deprecated: -RemoveSubConn is deprecated: -SecurityVersion is deprecated: -Target is deprecated: Use the Target field in the BuildOptions instead. -UpdateAddresses is deprecated: -UpdateSubConnState is deprecated: -balancer.ErrTransientFailure is deprecated: -grpc/reflection/v1alpha/reflection.proto -SwitchTo is deprecated: -XXXXX xDS deprecated fields we support -.ExactMatch -.PrefixMatch -.SafeRegexMatch -.SuffixMatch -GetContainsMatch -GetExactMatch -GetMatchSubjectAltNames -GetPrefixMatch -GetSafeRegexMatch -GetSuffixMatch -GetTlsCertificateCertificateProviderInstance -GetValidationContextCertificateProviderInstance -XXXXX PleaseIgnoreUnused' - -echo SUCCESS diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index 688aabe434..dbcf90b871 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -72,9 +72,10 @@ type ( EditionFeatures EditionFeatures } FileL2 struct { - Options func() protoreflect.ProtoMessage - Imports FileImports - Locations SourceLocations + Options func() protoreflect.ProtoMessage + Imports FileImports + OptionImports func() protoreflect.FileImports + Locations SourceLocations } // EditionFeatures is a frequently-instantiated struct, so please take care @@ -126,12 +127,9 @@ func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } func (fd *File) Parent() protoreflect.Descriptor { return nil } func (fd *File) Index() int { return 0 } func (fd *File) Syntax() protoreflect.Syntax { return fd.L1.Syntax } - -// Not exported and just used to reconstruct the original FileDescriptor proto -func (fd *File) Edition() int32 { return int32(fd.L1.Edition) } -func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() } -func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } -func (fd *File) IsPlaceholder() bool { return false } +func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() } +func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } +func (fd *File) IsPlaceholder() bool { return false } func (fd *File) Options() protoreflect.ProtoMessage { if f := fd.lazyInit().Options; f != nil { return f() @@ -150,6 +148,16 @@ func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatD func (fd *File) ProtoType(protoreflect.FileDescriptor) {} func (fd *File) ProtoInternal(pragma.DoNotImplement) {} +// The next two are not part of the FileDescriptor interface. They are just used to reconstruct +// the original FileDescriptor proto. +func (fd *File) Edition() int32 { return int32(fd.L1.Edition) } +func (fd *File) OptionImports() protoreflect.FileImports { + if f := fd.lazyInit().OptionImports; f != nil { + return f() + } + return emptyFiles +} + func (fd *File) lazyInit() *FileL2 { if atomic.LoadUint32(&fd.once) == 0 { fd.lazyInitOnce() @@ -182,9 +190,9 @@ type ( L2 *EnumL2 // protected by fileDesc.once } EnumL1 struct { - eagerValues bool // controls whether EnumL2.Values is already populated - EditionFeatures EditionFeatures + Visibility int32 + eagerValues bool // controls whether EnumL2.Values is already populated } EnumL2 struct { Options func() protoreflect.ProtoMessage @@ -219,6 +227,11 @@ func (ed *Enum) ReservedNames() protoreflect.Names { return &ed.lazyInit() func (ed *Enum) ReservedRanges() protoreflect.EnumRanges { return &ed.lazyInit().ReservedRanges } func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } func (ed *Enum) ProtoType(protoreflect.EnumDescriptor) {} + +// This is not part of the EnumDescriptor interface. It is just used to reconstruct +// the original FileDescriptor proto. +func (ed *Enum) Visibility() int32 { return ed.L1.Visibility } + func (ed *Enum) lazyInit() *EnumL2 { ed.L0.ParentFile.lazyInit() // implicitly initializes L2 return ed.L2 @@ -244,13 +257,13 @@ type ( L2 *MessageL2 // protected by fileDesc.once } MessageL1 struct { - Enums Enums - Messages Messages - Extensions Extensions - IsMapEntry bool // promoted from google.protobuf.MessageOptions - IsMessageSet bool // promoted from google.protobuf.MessageOptions - + Enums Enums + Messages Messages + Extensions Extensions EditionFeatures EditionFeatures + Visibility int32 + IsMapEntry bool // promoted from google.protobuf.MessageOptions + IsMessageSet bool // promoted from google.protobuf.MessageOptions } MessageL2 struct { Options func() protoreflect.ProtoMessage @@ -319,6 +332,11 @@ func (md *Message) Messages() protoreflect.MessageDescriptors { return &md.L func (md *Message) Extensions() protoreflect.ExtensionDescriptors { return &md.L1.Extensions } func (md *Message) ProtoType(protoreflect.MessageDescriptor) {} func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } + +// This is not part of the MessageDescriptor interface. It is just used to reconstruct +// the original FileDescriptor proto. +func (md *Message) Visibility() int32 { return md.L1.Visibility } + func (md *Message) lazyInit() *MessageL2 { md.L0.ParentFile.lazyInit() // implicitly initializes L2 return md.L2 diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go index d2f549497e..e91860f5a2 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go @@ -284,6 +284,13 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protorefl case genid.EnumDescriptorProto_Value_field_number: numValues++ } + case protowire.VarintType: + v, m := protowire.ConsumeVarint(b) + b = b[m:] + switch num { + case genid.EnumDescriptorProto_Visibility_field_number: + ed.L1.Visibility = int32(v) + } default: m := protowire.ConsumeFieldValue(num, typ, b) b = b[m:] @@ -365,6 +372,13 @@ func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protor md.unmarshalSeedOptions(v) } prevField = num + case protowire.VarintType: + v, m := protowire.ConsumeVarint(b) + b = b[m:] + switch num { + case genid.DescriptorProto_Visibility_field_number: + md.L1.Visibility = int32(v) + } default: m := protowire.ConsumeFieldValue(num, typ, b) b = b[m:] diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go index d4c94458bd..dd31faaeb0 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go @@ -134,6 +134,7 @@ func (fd *File) unmarshalFull(b []byte) { var enumIdx, messageIdx, extensionIdx, serviceIdx int var rawOptions []byte + var optionImports []string fd.L2 = new(FileL2) for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) @@ -157,6 +158,8 @@ func (fd *File) unmarshalFull(b []byte) { imp = PlaceholderFile(path) } fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp}) + case genid.FileDescriptorProto_OptionDependency_field_number: + optionImports = append(optionImports, sb.MakeString(v)) case genid.FileDescriptorProto_EnumType_field_number: fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) enumIdx++ @@ -178,6 +181,23 @@ func (fd *File) unmarshalFull(b []byte) { } } fd.L2.Options = fd.builder.optionsUnmarshaler(&descopts.File, rawOptions) + if len(optionImports) > 0 { + var imps FileImports + var once sync.Once + fd.L2.OptionImports = func() protoreflect.FileImports { + once.Do(func() { + imps = make(FileImports, len(optionImports)) + for i, path := range optionImports { + imp, _ := fd.builder.FileRegistry.FindFileByPath(path) + if imp == nil { + imp = PlaceholderFile(path) + } + imps[i] = protoreflect.FileImport{FileDescriptor: imp} + } + }) + return &imps + } + } } func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 31e79a6535..77de0f238c 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -52,7 +52,7 @@ import ( const ( Major = 1 Minor = 36 - Patch = 9 + Patch = 10 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go index 823dbf3ba6..9196288e4a 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go @@ -152,6 +152,28 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot imp := &f.L2.Imports[i] imps.importPublic(imp.Imports()) } + if len(fd.GetOptionDependency()) > 0 { + optionImports := make(filedesc.FileImports, len(fd.GetOptionDependency())) + for i, path := range fd.GetOptionDependency() { + imp := &optionImports[i] + f, err := r.FindFileByPath(path) + if err == protoregistry.NotFound { + // We always allow option imports to be unresolvable. + f = filedesc.PlaceholderFile(path) + } else if err != nil { + return nil, errors.New("could not resolve import %q: %v", path, err) + } + imp.FileDescriptor = f + + if imps[imp.Path()] { + return nil, errors.New("already imported %q", path) + } + imps[imp.Path()] = true + } + f.L2.OptionImports = func() protoreflect.FileImports { + return &optionImports + } + } // Handle source locations. f.L2.Locations.File = f diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go index 9da34998b1..c826ad0430 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go @@ -29,6 +29,7 @@ func (r descsByName) initEnumDeclarations(eds []*descriptorpb.EnumDescriptorProt e.L2.Options = func() protoreflect.ProtoMessage { return opts } } e.L1.EditionFeatures = mergeEditionFeatures(parent, ed.GetOptions().GetFeatures()) + e.L1.Visibility = int32(ed.GetVisibility()) for _, s := range ed.GetReservedName() { e.L2.ReservedNames.List = append(e.L2.ReservedNames.List, protoreflect.Name(s)) } @@ -70,6 +71,7 @@ func (r descsByName) initMessagesDeclarations(mds []*descriptorpb.DescriptorProt return nil, err } m.L1.EditionFeatures = mergeEditionFeatures(parent, md.GetOptions().GetFeatures()) + m.L1.Visibility = int32(md.GetVisibility()) if opts := md.GetOptions(); opts != nil { opts = proto.Clone(opts).(*descriptorpb.MessageOptions) m.L2.Options = func() protoreflect.ProtoMessage { return opts } diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go b/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go index 9b880aa8c9..6f91074e36 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go @@ -70,16 +70,27 @@ func ToFileDescriptorProto(file protoreflect.FileDescriptor) *descriptorpb.FileD if syntax := file.Syntax(); syntax != protoreflect.Proto2 && syntax.IsValid() { p.Syntax = proto.String(file.Syntax().String()) } + desc := file + if fileImportDesc, ok := file.(protoreflect.FileImport); ok { + desc = fileImportDesc.FileDescriptor + } if file.Syntax() == protoreflect.Editions { - desc := file - if fileImportDesc, ok := file.(protoreflect.FileImport); ok { - desc = fileImportDesc.FileDescriptor - } - if editionsInterface, ok := desc.(interface{ Edition() int32 }); ok { p.Edition = descriptorpb.Edition(editionsInterface.Edition()).Enum() } } + type hasOptionImports interface { + OptionImports() protoreflect.FileImports + } + if opts, ok := desc.(hasOptionImports); ok { + if optionImports := opts.OptionImports(); optionImports.Len() > 0 { + optionDeps := make([]string, optionImports.Len()) + for i := range optionImports.Len() { + optionDeps[i] = optionImports.Get(i).Path() + } + p.OptionDependency = optionDeps + } + } return p } @@ -123,6 +134,14 @@ func ToDescriptorProto(message protoreflect.MessageDescriptor) *descriptorpb.Des for i, names := 0, message.ReservedNames(); i < names.Len(); i++ { p.ReservedName = append(p.ReservedName, string(names.Get(i))) } + type hasVisibility interface { + Visibility() int32 + } + if vis, ok := message.(hasVisibility); ok { + if visibility := vis.Visibility(); visibility > 0 { + p.Visibility = descriptorpb.SymbolVisibility(visibility).Enum() + } + } return p } @@ -216,6 +235,14 @@ func ToEnumDescriptorProto(enum protoreflect.EnumDescriptor) *descriptorpb.EnumD for i, names := 0, enum.ReservedNames(); i < names.Len(); i++ { p.ReservedName = append(p.ReservedName, string(names.Get(i))) } + type hasVisibility interface { + Visibility() int32 + } + if vis, ok := enum.(hasVisibility); ok { + if visibility := vis.Visibility(); visibility > 0 { + p.Visibility = descriptorpb.SymbolVisibility(visibility).Enum() + } + } return p } diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go index 261ae41bd0..bf1ae59488 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go @@ -25,6 +25,7 @@ import ( io "io" proto "github.com/gogo/protobuf/proto" + k8s_io_api_admissionregistration_v1 "k8s.io/api/admissionregistration/v1" v11 "k8s.io/api/admissionregistration/v1" k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -46,10 +47,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *ApplyConfiguration) Reset() { *m = ApplyConfiguration{} } +func (*ApplyConfiguration) ProtoMessage() {} +func (*ApplyConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{0} +} +func (m *ApplyConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplyConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ApplyConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplyConfiguration.Merge(m, src) +} +func (m *ApplyConfiguration) XXX_Size() int { + return m.Size() +} +func (m *ApplyConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_ApplyConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplyConfiguration proto.InternalMessageInfo + func (m *AuditAnnotation) Reset() { *m = AuditAnnotation{} } func (*AuditAnnotation) ProtoMessage() {} func (*AuditAnnotation) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{0} + return fileDescriptor_7f7c65a4f012fb19, []int{1} } func (m *AuditAnnotation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -77,7 +106,7 @@ var xxx_messageInfo_AuditAnnotation proto.InternalMessageInfo func (m *ExpressionWarning) Reset() { *m = ExpressionWarning{} } func (*ExpressionWarning) ProtoMessage() {} func (*ExpressionWarning) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{1} + return fileDescriptor_7f7c65a4f012fb19, []int{2} } func (m *ExpressionWarning) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,10 +131,38 @@ func (m *ExpressionWarning) XXX_DiscardUnknown() { var xxx_messageInfo_ExpressionWarning proto.InternalMessageInfo +func (m *JSONPatch) Reset() { *m = JSONPatch{} } +func (*JSONPatch) ProtoMessage() {} +func (*JSONPatch) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{3} +} +func (m *JSONPatch) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *JSONPatch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *JSONPatch) XXX_Merge(src proto.Message) { + xxx_messageInfo_JSONPatch.Merge(m, src) +} +func (m *JSONPatch) XXX_Size() int { + return m.Size() +} +func (m *JSONPatch) XXX_DiscardUnknown() { + xxx_messageInfo_JSONPatch.DiscardUnknown(m) +} + +var xxx_messageInfo_JSONPatch proto.InternalMessageInfo + func (m *MatchCondition) Reset() { *m = MatchCondition{} } func (*MatchCondition) ProtoMessage() {} func (*MatchCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{2} + return fileDescriptor_7f7c65a4f012fb19, []int{4} } func (m *MatchCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -133,7 +190,7 @@ var xxx_messageInfo_MatchCondition proto.InternalMessageInfo func (m *MatchResources) Reset() { *m = MatchResources{} } func (*MatchResources) ProtoMessage() {} func (*MatchResources) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{3} + return fileDescriptor_7f7c65a4f012fb19, []int{5} } func (m *MatchResources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,10 +215,178 @@ func (m *MatchResources) XXX_DiscardUnknown() { var xxx_messageInfo_MatchResources proto.InternalMessageInfo +func (m *MutatingAdmissionPolicy) Reset() { *m = MutatingAdmissionPolicy{} } +func (*MutatingAdmissionPolicy) ProtoMessage() {} +func (*MutatingAdmissionPolicy) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{6} +} +func (m *MutatingAdmissionPolicy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicy) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicy.Merge(m, src) +} +func (m *MutatingAdmissionPolicy) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicy) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicy.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicy proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyBinding) Reset() { *m = MutatingAdmissionPolicyBinding{} } +func (*MutatingAdmissionPolicyBinding) ProtoMessage() {} +func (*MutatingAdmissionPolicyBinding) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{7} +} +func (m *MutatingAdmissionPolicyBinding) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyBinding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyBinding) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyBinding.Merge(m, src) +} +func (m *MutatingAdmissionPolicyBinding) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyBinding) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyBinding.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyBinding proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyBindingList) Reset() { *m = MutatingAdmissionPolicyBindingList{} } +func (*MutatingAdmissionPolicyBindingList) ProtoMessage() {} +func (*MutatingAdmissionPolicyBindingList) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{8} +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyBindingList.Merge(m, src) +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyBindingList) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyBindingList.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyBindingList proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyBindingSpec) Reset() { *m = MutatingAdmissionPolicyBindingSpec{} } +func (*MutatingAdmissionPolicyBindingSpec) ProtoMessage() {} +func (*MutatingAdmissionPolicyBindingSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{9} +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyBindingSpec.Merge(m, src) +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyBindingSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyBindingSpec proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyList) Reset() { *m = MutatingAdmissionPolicyList{} } +func (*MutatingAdmissionPolicyList) ProtoMessage() {} +func (*MutatingAdmissionPolicyList) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{10} +} +func (m *MutatingAdmissionPolicyList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyList) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyList.Merge(m, src) +} +func (m *MutatingAdmissionPolicyList) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyList) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyList.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyList proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicySpec) Reset() { *m = MutatingAdmissionPolicySpec{} } +func (*MutatingAdmissionPolicySpec) ProtoMessage() {} +func (*MutatingAdmissionPolicySpec) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{11} +} +func (m *MutatingAdmissionPolicySpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicySpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicySpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicySpec.Merge(m, src) +} +func (m *MutatingAdmissionPolicySpec) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicySpec) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicySpec.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicySpec proto.InternalMessageInfo + func (m *MutatingWebhook) Reset() { *m = MutatingWebhook{} } func (*MutatingWebhook) ProtoMessage() {} func (*MutatingWebhook) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{4} + return fileDescriptor_7f7c65a4f012fb19, []int{12} } func (m *MutatingWebhook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -189,7 +414,7 @@ var xxx_messageInfo_MutatingWebhook proto.InternalMessageInfo func (m *MutatingWebhookConfiguration) Reset() { *m = MutatingWebhookConfiguration{} } func (*MutatingWebhookConfiguration) ProtoMessage() {} func (*MutatingWebhookConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{5} + return fileDescriptor_7f7c65a4f012fb19, []int{13} } func (m *MutatingWebhookConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -217,7 +442,7 @@ var xxx_messageInfo_MutatingWebhookConfiguration proto.InternalMessageInfo func (m *MutatingWebhookConfigurationList) Reset() { *m = MutatingWebhookConfigurationList{} } func (*MutatingWebhookConfigurationList) ProtoMessage() {} func (*MutatingWebhookConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{6} + return fileDescriptor_7f7c65a4f012fb19, []int{14} } func (m *MutatingWebhookConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,10 +467,38 @@ func (m *MutatingWebhookConfigurationList) XXX_DiscardUnknown() { var xxx_messageInfo_MutatingWebhookConfigurationList proto.InternalMessageInfo +func (m *Mutation) Reset() { *m = Mutation{} } +func (*Mutation) ProtoMessage() {} +func (*Mutation) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{15} +} +func (m *Mutation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Mutation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Mutation) XXX_Merge(src proto.Message) { + xxx_messageInfo_Mutation.Merge(m, src) +} +func (m *Mutation) XXX_Size() int { + return m.Size() +} +func (m *Mutation) XXX_DiscardUnknown() { + xxx_messageInfo_Mutation.DiscardUnknown(m) +} + +var xxx_messageInfo_Mutation proto.InternalMessageInfo + func (m *NamedRuleWithOperations) Reset() { *m = NamedRuleWithOperations{} } func (*NamedRuleWithOperations) ProtoMessage() {} func (*NamedRuleWithOperations) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{7} + return fileDescriptor_7f7c65a4f012fb19, []int{16} } func (m *NamedRuleWithOperations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -273,7 +526,7 @@ var xxx_messageInfo_NamedRuleWithOperations proto.InternalMessageInfo func (m *ParamKind) Reset() { *m = ParamKind{} } func (*ParamKind) ProtoMessage() {} func (*ParamKind) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{8} + return fileDescriptor_7f7c65a4f012fb19, []int{17} } func (m *ParamKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -301,7 +554,7 @@ var xxx_messageInfo_ParamKind proto.InternalMessageInfo func (m *ParamRef) Reset() { *m = ParamRef{} } func (*ParamRef) ProtoMessage() {} func (*ParamRef) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{9} + return fileDescriptor_7f7c65a4f012fb19, []int{18} } func (m *ParamRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -329,7 +582,7 @@ var xxx_messageInfo_ParamRef proto.InternalMessageInfo func (m *ServiceReference) Reset() { *m = ServiceReference{} } func (*ServiceReference) ProtoMessage() {} func (*ServiceReference) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{10} + return fileDescriptor_7f7c65a4f012fb19, []int{19} } func (m *ServiceReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -357,7 +610,7 @@ var xxx_messageInfo_ServiceReference proto.InternalMessageInfo func (m *TypeChecking) Reset() { *m = TypeChecking{} } func (*TypeChecking) ProtoMessage() {} func (*TypeChecking) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{11} + return fileDescriptor_7f7c65a4f012fb19, []int{20} } func (m *TypeChecking) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -385,7 +638,7 @@ var xxx_messageInfo_TypeChecking proto.InternalMessageInfo func (m *ValidatingAdmissionPolicy) Reset() { *m = ValidatingAdmissionPolicy{} } func (*ValidatingAdmissionPolicy) ProtoMessage() {} func (*ValidatingAdmissionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{12} + return fileDescriptor_7f7c65a4f012fb19, []int{21} } func (m *ValidatingAdmissionPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +666,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicy proto.InternalMessageInfo func (m *ValidatingAdmissionPolicyBinding) Reset() { *m = ValidatingAdmissionPolicyBinding{} } func (*ValidatingAdmissionPolicyBinding) ProtoMessage() {} func (*ValidatingAdmissionPolicyBinding) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{13} + return fileDescriptor_7f7c65a4f012fb19, []int{22} } func (m *ValidatingAdmissionPolicyBinding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -441,7 +694,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyBinding proto.InternalMessageInfo func (m *ValidatingAdmissionPolicyBindingList) Reset() { *m = ValidatingAdmissionPolicyBindingList{} } func (*ValidatingAdmissionPolicyBindingList) ProtoMessage() {} func (*ValidatingAdmissionPolicyBindingList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{14} + return fileDescriptor_7f7c65a4f012fb19, []int{23} } func (m *ValidatingAdmissionPolicyBindingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -469,7 +722,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyBindingList proto.InternalMessageIn func (m *ValidatingAdmissionPolicyBindingSpec) Reset() { *m = ValidatingAdmissionPolicyBindingSpec{} } func (*ValidatingAdmissionPolicyBindingSpec) ProtoMessage() {} func (*ValidatingAdmissionPolicyBindingSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{15} + return fileDescriptor_7f7c65a4f012fb19, []int{24} } func (m *ValidatingAdmissionPolicyBindingSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -497,7 +750,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyBindingSpec proto.InternalMessageIn func (m *ValidatingAdmissionPolicyList) Reset() { *m = ValidatingAdmissionPolicyList{} } func (*ValidatingAdmissionPolicyList) ProtoMessage() {} func (*ValidatingAdmissionPolicyList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{16} + return fileDescriptor_7f7c65a4f012fb19, []int{25} } func (m *ValidatingAdmissionPolicyList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -525,7 +778,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyList proto.InternalMessageInfo func (m *ValidatingAdmissionPolicySpec) Reset() { *m = ValidatingAdmissionPolicySpec{} } func (*ValidatingAdmissionPolicySpec) ProtoMessage() {} func (*ValidatingAdmissionPolicySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{17} + return fileDescriptor_7f7c65a4f012fb19, []int{26} } func (m *ValidatingAdmissionPolicySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -553,7 +806,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicySpec proto.InternalMessageInfo func (m *ValidatingAdmissionPolicyStatus) Reset() { *m = ValidatingAdmissionPolicyStatus{} } func (*ValidatingAdmissionPolicyStatus) ProtoMessage() {} func (*ValidatingAdmissionPolicyStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{18} + return fileDescriptor_7f7c65a4f012fb19, []int{27} } func (m *ValidatingAdmissionPolicyStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -581,7 +834,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyStatus proto.InternalMessageInfo func (m *ValidatingWebhook) Reset() { *m = ValidatingWebhook{} } func (*ValidatingWebhook) ProtoMessage() {} func (*ValidatingWebhook) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{19} + return fileDescriptor_7f7c65a4f012fb19, []int{28} } func (m *ValidatingWebhook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -609,7 +862,7 @@ var xxx_messageInfo_ValidatingWebhook proto.InternalMessageInfo func (m *ValidatingWebhookConfiguration) Reset() { *m = ValidatingWebhookConfiguration{} } func (*ValidatingWebhookConfiguration) ProtoMessage() {} func (*ValidatingWebhookConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{20} + return fileDescriptor_7f7c65a4f012fb19, []int{29} } func (m *ValidatingWebhookConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -637,7 +890,7 @@ var xxx_messageInfo_ValidatingWebhookConfiguration proto.InternalMessageInfo func (m *ValidatingWebhookConfigurationList) Reset() { *m = ValidatingWebhookConfigurationList{} } func (*ValidatingWebhookConfigurationList) ProtoMessage() {} func (*ValidatingWebhookConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{21} + return fileDescriptor_7f7c65a4f012fb19, []int{30} } func (m *ValidatingWebhookConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -665,7 +918,7 @@ var xxx_messageInfo_ValidatingWebhookConfigurationList proto.InternalMessageInfo func (m *Validation) Reset() { *m = Validation{} } func (*Validation) ProtoMessage() {} func (*Validation) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{22} + return fileDescriptor_7f7c65a4f012fb19, []int{31} } func (m *Validation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -693,7 +946,7 @@ var xxx_messageInfo_Validation proto.InternalMessageInfo func (m *Variable) Reset() { *m = Variable{} } func (*Variable) ProtoMessage() {} func (*Variable) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{23} + return fileDescriptor_7f7c65a4f012fb19, []int{32} } func (m *Variable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -721,7 +974,7 @@ var xxx_messageInfo_Variable proto.InternalMessageInfo func (m *WebhookClientConfig) Reset() { *m = WebhookClientConfig{} } func (*WebhookClientConfig) ProtoMessage() {} func (*WebhookClientConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{24} + return fileDescriptor_7f7c65a4f012fb19, []int{33} } func (m *WebhookClientConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -747,13 +1000,22 @@ func (m *WebhookClientConfig) XXX_DiscardUnknown() { var xxx_messageInfo_WebhookClientConfig proto.InternalMessageInfo func init() { + proto.RegisterType((*ApplyConfiguration)(nil), "k8s.io.api.admissionregistration.v1beta1.ApplyConfiguration") proto.RegisterType((*AuditAnnotation)(nil), "k8s.io.api.admissionregistration.v1beta1.AuditAnnotation") proto.RegisterType((*ExpressionWarning)(nil), "k8s.io.api.admissionregistration.v1beta1.ExpressionWarning") + proto.RegisterType((*JSONPatch)(nil), "k8s.io.api.admissionregistration.v1beta1.JSONPatch") proto.RegisterType((*MatchCondition)(nil), "k8s.io.api.admissionregistration.v1beta1.MatchCondition") proto.RegisterType((*MatchResources)(nil), "k8s.io.api.admissionregistration.v1beta1.MatchResources") + proto.RegisterType((*MutatingAdmissionPolicy)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicy") + proto.RegisterType((*MutatingAdmissionPolicyBinding)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyBinding") + proto.RegisterType((*MutatingAdmissionPolicyBindingList)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyBindingList") + proto.RegisterType((*MutatingAdmissionPolicyBindingSpec)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyBindingSpec") + proto.RegisterType((*MutatingAdmissionPolicyList)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyList") + proto.RegisterType((*MutatingAdmissionPolicySpec)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicySpec") proto.RegisterType((*MutatingWebhook)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhook") proto.RegisterType((*MutatingWebhookConfiguration)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhookConfiguration") proto.RegisterType((*MutatingWebhookConfigurationList)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhookConfigurationList") + proto.RegisterType((*Mutation)(nil), "k8s.io.api.admissionregistration.v1beta1.Mutation") proto.RegisterType((*NamedRuleWithOperations)(nil), "k8s.io.api.admissionregistration.v1beta1.NamedRuleWithOperations") proto.RegisterType((*ParamKind)(nil), "k8s.io.api.admissionregistration.v1beta1.ParamKind") proto.RegisterType((*ParamRef)(nil), "k8s.io.api.admissionregistration.v1beta1.ParamRef") @@ -779,130 +1041,174 @@ func init() { } var fileDescriptor_7f7c65a4f012fb19 = []byte{ - // 1957 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x1a, 0x4d, 0x6f, 0x1b, 0xc7, - 0xd5, 0x2b, 0x52, 0x12, 0xf9, 0xa8, 0x2f, 0x4e, 0x9c, 0x8a, 0x76, 0x1c, 0x52, 0x58, 0x04, 0x85, - 0x0c, 0xb4, 0x64, 0xac, 0x04, 0x89, 0xeb, 0xa0, 0x28, 0x44, 0xc5, 0x76, 0xed, 0x58, 0xb2, 0x30, - 0x4a, 0x24, 0xa0, 0x4d, 0x00, 0x8f, 0x76, 0x87, 0xe4, 0x96, 0xe4, 0xee, 0x76, 0x67, 0x49, 0x5b, - 0x2d, 0xd0, 0x16, 0xe8, 0x21, 0xd7, 0x02, 0xbd, 0x14, 0xe8, 0xa9, 0x7f, 0xa1, 0xf7, 0x02, 0xed, - 0xcd, 0xc7, 0xdc, 0x6a, 0xa0, 0x28, 0x51, 0xb1, 0x87, 0x9e, 0x7a, 0xe8, 0xa1, 0x3d, 0xe8, 0xd2, - 0x62, 0x66, 0x67, 0x3f, 0xb9, 0xb4, 0x56, 0xaa, 0xac, 0x5c, 0x7c, 0xd3, 0xbe, 0xcf, 0x79, 0x6f, - 0xde, 0xd7, 0x3c, 0x0a, 0x6e, 0x77, 0x6f, 0xb3, 0xba, 0x61, 0x35, 0x88, 0x6d, 0x34, 0x88, 0xde, - 0x37, 0x18, 0x33, 0x2c, 0xd3, 0xa1, 0x6d, 0x83, 0xb9, 0x0e, 0x71, 0x0d, 0xcb, 0x6c, 0x0c, 0x6f, - 0x1d, 0x52, 0x97, 0xdc, 0x6a, 0xb4, 0xa9, 0x49, 0x1d, 0xe2, 0x52, 0xbd, 0x6e, 0x3b, 0x96, 0x6b, - 0xa1, 0x75, 0x8f, 0xb3, 0x4e, 0x6c, 0xa3, 0x9e, 0xca, 0x59, 0x97, 0x9c, 0xd7, 0xbf, 0xdd, 0x36, - 0xdc, 0xce, 0xe0, 0xb0, 0xae, 0x59, 0xfd, 0x46, 0xdb, 0x6a, 0x5b, 0x0d, 0x21, 0xe0, 0x70, 0xd0, - 0x12, 0x5f, 0xe2, 0x43, 0xfc, 0xe5, 0x09, 0xbe, 0xfe, 0x5e, 0x86, 0x23, 0x25, 0x4f, 0x73, 0xfd, - 0xfd, 0x90, 0xa9, 0x4f, 0xb4, 0x8e, 0x61, 0x52, 0xe7, 0xa8, 0x61, 0x77, 0xdb, 0x1c, 0xc0, 0x1a, - 0x7d, 0xea, 0x92, 0x34, 0xae, 0xc6, 0x34, 0x2e, 0x67, 0x60, 0xba, 0x46, 0x9f, 0x4e, 0x30, 0x7c, - 0x70, 0x1a, 0x03, 0xd3, 0x3a, 0xb4, 0x4f, 0x92, 0x7c, 0x2a, 0x83, 0xe5, 0xcd, 0x81, 0x6e, 0xb8, - 0x9b, 0xa6, 0x69, 0xb9, 0xc2, 0x08, 0xf4, 0x36, 0xe4, 0xba, 0xf4, 0xa8, 0xa2, 0xac, 0x29, 0xeb, - 0xc5, 0x66, 0xe9, 0xf9, 0xa8, 0x76, 0x65, 0x3c, 0xaa, 0xe5, 0x3e, 0xa1, 0x47, 0x98, 0xc3, 0xd1, - 0x26, 0x2c, 0x0f, 0x49, 0x6f, 0x40, 0xef, 0x3e, 0xb3, 0x1d, 0x2a, 0x5c, 0x50, 0x99, 0x11, 0xa4, - 0xab, 0x92, 0x74, 0x79, 0x3f, 0x8e, 0xc6, 0x49, 0x7a, 0xb5, 0x07, 0xe5, 0xf0, 0xeb, 0x80, 0x38, - 0xa6, 0x61, 0xb6, 0xd1, 0xb7, 0xa0, 0xd0, 0x32, 0x68, 0x4f, 0xc7, 0xb4, 0x25, 0x05, 0xae, 0x48, - 0x81, 0x85, 0x7b, 0x12, 0x8e, 0x03, 0x0a, 0x74, 0x13, 0xe6, 0x9f, 0x7a, 0x8c, 0x95, 0x9c, 0x20, - 0x5e, 0x96, 0xc4, 0xf3, 0x52, 0x1e, 0xf6, 0xf1, 0x6a, 0x0b, 0x96, 0xb6, 0x89, 0xab, 0x75, 0xb6, - 0x2c, 0x53, 0x37, 0x84, 0x85, 0x6b, 0x90, 0x37, 0x49, 0x9f, 0x4a, 0x13, 0x17, 0x24, 0x67, 0x7e, - 0x87, 0xf4, 0x29, 0x16, 0x18, 0xb4, 0x01, 0x40, 0x93, 0xf6, 0x21, 0x49, 0x07, 0x11, 0xd3, 0x22, - 0x54, 0xea, 0x9f, 0xf3, 0x52, 0x11, 0xa6, 0xcc, 0x1a, 0x38, 0x1a, 0x65, 0xe8, 0x19, 0x94, 0xb9, - 0x38, 0x66, 0x13, 0x8d, 0xee, 0xd1, 0x1e, 0xd5, 0x5c, 0xcb, 0x11, 0x5a, 0x4b, 0x1b, 0xef, 0xd5, - 0xc3, 0x30, 0x0d, 0x6e, 0xac, 0x6e, 0x77, 0xdb, 0x1c, 0xc0, 0xea, 0x3c, 0x30, 0xea, 0xc3, 0x5b, - 0xf5, 0x47, 0xe4, 0x90, 0xf6, 0x7c, 0xd6, 0xe6, 0x9b, 0xe3, 0x51, 0xad, 0xbc, 0x93, 0x94, 0x88, - 0x27, 0x95, 0x20, 0x0b, 0x96, 0xac, 0xc3, 0x1f, 0x51, 0xcd, 0x0d, 0xd4, 0xce, 0x9c, 0x5f, 0x2d, - 0x1a, 0x8f, 0x6a, 0x4b, 0x8f, 0x63, 0xe2, 0x70, 0x42, 0x3c, 0xfa, 0x19, 0x2c, 0x3a, 0xd2, 0x6e, - 0x3c, 0xe8, 0x51, 0x56, 0xc9, 0xad, 0xe5, 0xd6, 0x4b, 0x1b, 0x9b, 0xf5, 0xac, 0xd9, 0x58, 0xe7, - 0x76, 0xe9, 0x9c, 0xf7, 0xc0, 0x70, 0x3b, 0x8f, 0x6d, 0xea, 0xa1, 0x59, 0xf3, 0x4d, 0xe9, 0xf7, - 0x45, 0x1c, 0x95, 0x8f, 0xe3, 0xea, 0xd0, 0xaf, 0x15, 0xb8, 0x4a, 0x9f, 0x69, 0xbd, 0x81, 0x4e, - 0x63, 0x74, 0x95, 0xfc, 0x45, 0x9d, 0xe3, 0x86, 0x3c, 0xc7, 0xd5, 0xbb, 0x29, 0x6a, 0x70, 0xaa, - 0x72, 0xf4, 0x31, 0x94, 0xfa, 0x3c, 0x24, 0x76, 0xad, 0x9e, 0xa1, 0x1d, 0x55, 0xe6, 0x45, 0x20, - 0xa9, 0xe3, 0x51, 0xad, 0xb4, 0x1d, 0x82, 0x4f, 0x46, 0xb5, 0xe5, 0xc8, 0xe7, 0xa7, 0x47, 0x36, - 0xc5, 0x51, 0x36, 0xf5, 0x4f, 0x05, 0x58, 0xde, 0x1e, 0xf0, 0xf4, 0x34, 0xdb, 0x07, 0xf4, 0xb0, - 0x63, 0x59, 0xdd, 0x0c, 0x31, 0xfc, 0x14, 0x16, 0xb4, 0x9e, 0x41, 0x4d, 0x77, 0xcb, 0x32, 0x5b, - 0x46, 0x5b, 0x06, 0xc0, 0x77, 0xb3, 0x3b, 0x42, 0xaa, 0xda, 0x8a, 0x08, 0x69, 0x5e, 0x95, 0x8a, - 0x16, 0xa2, 0x50, 0x1c, 0x53, 0x84, 0x3e, 0x87, 0x59, 0x27, 0x12, 0x02, 0x1f, 0x66, 0xd1, 0x58, - 0x4f, 0x71, 0xf8, 0xa2, 0xd4, 0x35, 0xeb, 0x79, 0xd8, 0x13, 0x8a, 0x1e, 0xc1, 0x62, 0x8b, 0x18, - 0xbd, 0x81, 0x43, 0xa5, 0x53, 0xf3, 0xc2, 0x03, 0xdf, 0xe4, 0x11, 0x72, 0x2f, 0x8a, 0x38, 0x19, - 0xd5, 0xca, 0x31, 0x80, 0x70, 0x6c, 0x9c, 0x39, 0x79, 0x41, 0xc5, 0x73, 0x5d, 0x50, 0x7a, 0x9e, - 0xcf, 0x7e, 0x3d, 0x79, 0x5e, 0x7a, 0xb5, 0x79, 0xfe, 0x31, 0x94, 0x98, 0xa1, 0xd3, 0xbb, 0xad, - 0x16, 0xd5, 0x5c, 0x56, 0x99, 0x0b, 0x1d, 0xb6, 0x17, 0x82, 0xb9, 0xc3, 0xc2, 0xcf, 0xad, 0x1e, - 0x61, 0x0c, 0x47, 0xd9, 0xd0, 0x1d, 0x58, 0xe2, 0x5d, 0xc9, 0x1a, 0xb8, 0x7b, 0x54, 0xb3, 0x4c, - 0x9d, 0x89, 0xd4, 0x98, 0xf5, 0x4e, 0xf0, 0x69, 0x0c, 0x83, 0x13, 0x94, 0xe8, 0x33, 0x58, 0x0d, - 0xa2, 0x08, 0xd3, 0xa1, 0x41, 0x9f, 0xee, 0x53, 0x87, 0x7f, 0xb0, 0x4a, 0x61, 0x2d, 0xb7, 0x5e, - 0x6c, 0xbe, 0x35, 0x1e, 0xd5, 0x56, 0x37, 0xd3, 0x49, 0xf0, 0x34, 0x5e, 0xf4, 0x04, 0x90, 0x43, - 0x0d, 0x73, 0x68, 0x69, 0x22, 0xfc, 0x64, 0x40, 0x80, 0xb0, 0xef, 0xdd, 0xf1, 0xa8, 0x86, 0xf0, - 0x04, 0xf6, 0x64, 0x54, 0xfb, 0xc6, 0x24, 0x54, 0x84, 0x47, 0x8a, 0x2c, 0xf4, 0x53, 0x58, 0xee, - 0xc7, 0x1a, 0x11, 0xab, 0x2c, 0x88, 0x0c, 0xb9, 0x9d, 0x3d, 0x27, 0xe3, 0x9d, 0x2c, 0xec, 0xb9, - 0x71, 0x38, 0xc3, 0x49, 0x4d, 0xea, 0x5f, 0x15, 0xb8, 0x91, 0xa8, 0x21, 0x5e, 0xba, 0x0e, 0x3c, - 0x0d, 0xe8, 0x09, 0x14, 0x78, 0x54, 0xe8, 0xc4, 0x25, 0xb2, 0x45, 0xbd, 0x9b, 0x2d, 0x86, 0xbc, - 0x80, 0xd9, 0xa6, 0x2e, 0x09, 0x5b, 0x64, 0x08, 0xc3, 0x81, 0x54, 0xf4, 0x43, 0x28, 0x48, 0xcd, - 0xac, 0x32, 0x23, 0x0c, 0xff, 0xce, 0x19, 0x0c, 0x8f, 0x9f, 0xbd, 0x99, 0xe7, 0xaa, 0x70, 0x20, - 0x50, 0xfd, 0xa7, 0x02, 0x6b, 0x2f, 0xb3, 0xef, 0x91, 0xc1, 0x5c, 0xf4, 0xf9, 0x84, 0x8d, 0xf5, - 0x8c, 0x79, 0x62, 0x30, 0xcf, 0xc2, 0x60, 0x26, 0xf1, 0x21, 0x11, 0xfb, 0xba, 0x30, 0x6b, 0xb8, - 0xb4, 0xef, 0x1b, 0x77, 0xef, 0xdc, 0xc6, 0xc5, 0x0e, 0x1e, 0x96, 0xc1, 0x07, 0x5c, 0x38, 0xf6, - 0x74, 0xa8, 0x2f, 0x14, 0x58, 0x9d, 0xd2, 0xa9, 0xd0, 0x87, 0x61, 0x2f, 0x16, 0x45, 0xa4, 0xa2, - 0x88, 0xbc, 0x28, 0x47, 0x9b, 0xa8, 0x40, 0xe0, 0x38, 0x1d, 0xfa, 0xa5, 0x02, 0xc8, 0x99, 0x90, - 0x27, 0x3b, 0xc7, 0xb9, 0xeb, 0xf8, 0x75, 0x69, 0x00, 0x9a, 0xc4, 0xe1, 0x14, 0x75, 0x2a, 0x81, - 0xe2, 0x2e, 0x71, 0x48, 0xff, 0x13, 0xc3, 0xd4, 0xf9, 0x24, 0x46, 0x6c, 0x43, 0x66, 0xa9, 0xec, - 0x76, 0x41, 0x98, 0x6d, 0xee, 0x3e, 0x90, 0x18, 0x1c, 0xa1, 0xe2, 0xbd, 0xb1, 0x6b, 0x98, 0xba, - 0x9c, 0xdb, 0x82, 0xde, 0xc8, 0xe5, 0x61, 0x81, 0x51, 0x7f, 0x3f, 0x03, 0x05, 0xa1, 0x83, 0xcf, - 0x92, 0xa7, 0xb7, 0xd2, 0x06, 0x14, 0x83, 0xd2, 0x2b, 0xa5, 0x96, 0x25, 0x59, 0x31, 0x28, 0xd3, - 0x38, 0xa4, 0x41, 0x5f, 0x40, 0x81, 0xf9, 0x05, 0x39, 0x77, 0xfe, 0x82, 0xbc, 0xc0, 0x23, 0x2d, - 0x28, 0xc5, 0x81, 0x48, 0xe4, 0xc2, 0xaa, 0xcd, 0x4f, 0x4f, 0x5d, 0xea, 0xec, 0x58, 0xee, 0x3d, - 0x6b, 0x60, 0xea, 0x9b, 0x1a, 0xf7, 0x9e, 0xec, 0x86, 0x77, 0x78, 0x09, 0xdc, 0x4d, 0x27, 0x39, - 0x19, 0xd5, 0xde, 0x9a, 0x82, 0x12, 0xa5, 0x6b, 0x9a, 0x68, 0xf5, 0x77, 0x0a, 0xac, 0xec, 0x51, - 0x67, 0x68, 0x68, 0x14, 0xd3, 0x16, 0x75, 0xa8, 0xa9, 0x25, 0x5c, 0xa3, 0x64, 0x70, 0x8d, 0xef, - 0xed, 0x99, 0xa9, 0xde, 0xbe, 0x01, 0x79, 0x9b, 0xb8, 0x1d, 0x39, 0xd8, 0x17, 0x38, 0x76, 0x97, - 0xb8, 0x1d, 0x2c, 0xa0, 0x02, 0x6b, 0x39, 0xae, 0x30, 0x74, 0x56, 0x62, 0x2d, 0xc7, 0xc5, 0x02, - 0xaa, 0xfe, 0x46, 0x81, 0x05, 0x6e, 0xc5, 0x56, 0x87, 0x6a, 0x5d, 0xfe, 0xac, 0xf8, 0x52, 0x01, - 0x44, 0x93, 0x8f, 0x0d, 0x2f, 0x23, 0x4a, 0x1b, 0x1f, 0x65, 0x4f, 0xd1, 0x89, 0x07, 0x4b, 0x18, - 0xd6, 0x13, 0x28, 0x86, 0x53, 0x54, 0xaa, 0x7f, 0x99, 0x81, 0x6b, 0xfb, 0xa4, 0x67, 0xe8, 0x22, - 0xd5, 0x83, 0xfe, 0x24, 0x9b, 0xc3, 0xab, 0x2f, 0xbf, 0x06, 0xe4, 0x99, 0x4d, 0x35, 0x99, 0xcd, - 0xf7, 0xb3, 0x9b, 0x3e, 0xf5, 0xd0, 0x7b, 0x36, 0xd5, 0xc2, 0x1b, 0xe4, 0x5f, 0x58, 0xa8, 0x40, - 0x3f, 0x86, 0x39, 0xe6, 0x12, 0x77, 0xc0, 0x64, 0xf0, 0x3f, 0xb8, 0x08, 0x65, 0x42, 0x60, 0x73, - 0x49, 0xaa, 0x9b, 0xf3, 0xbe, 0xb1, 0x54, 0xa4, 0xfe, 0x47, 0x81, 0xb5, 0xa9, 0xbc, 0x4d, 0xc3, - 0xd4, 0x79, 0x30, 0xbc, 0x7a, 0x27, 0xdb, 0x31, 0x27, 0xef, 0x5c, 0x80, 0xdd, 0xf2, 0xec, 0xd3, - 0x7c, 0xad, 0xfe, 0x5b, 0x81, 0x77, 0x4e, 0x63, 0xbe, 0x84, 0xe6, 0x67, 0xc5, 0x9b, 0xdf, 0xc3, - 0x8b, 0xb3, 0x7c, 0x4a, 0x03, 0xfc, 0x32, 0x77, 0xba, 0xdd, 0xdc, 0x4d, 0xbc, 0x83, 0xd8, 0x02, - 0xb8, 0x13, 0x16, 0xf9, 0xe0, 0x12, 0x77, 0x03, 0x0c, 0x8e, 0x50, 0x71, 0x5f, 0xd9, 0xb2, 0x3d, - 0xc8, 0xab, 0xdc, 0xc8, 0x6e, 0x90, 0xdf, 0x58, 0xbc, 0xf2, 0xed, 0x7f, 0xe1, 0x40, 0x22, 0x72, - 0x61, 0xa9, 0x1f, 0x5b, 0x14, 0xc8, 0x34, 0x39, 0xeb, 0x1c, 0x18, 0xf0, 0x7b, 0x73, 0x73, 0x1c, - 0x86, 0x13, 0x3a, 0xd0, 0x01, 0x94, 0x87, 0xd2, 0x5f, 0x96, 0xe9, 0x95, 0x74, 0xef, 0x75, 0x5c, - 0x6c, 0xde, 0xe4, 0xef, 0x8d, 0xfd, 0x24, 0xf2, 0x64, 0x54, 0x5b, 0x49, 0x02, 0xf1, 0xa4, 0x0c, - 0xf5, 0x1f, 0x0a, 0xbc, 0x3d, 0xf5, 0x26, 0x2e, 0x21, 0xf4, 0x3a, 0xf1, 0xd0, 0xdb, 0xba, 0x88, - 0xd0, 0x4b, 0x8f, 0xb9, 0xdf, 0xce, 0xbd, 0xc4, 0x52, 0x11, 0x6c, 0x4f, 0xa0, 0x68, 0xfb, 0xb3, - 0x4b, 0xca, 0xa6, 0x27, 0x4b, 0xe4, 0x70, 0xd6, 0xe6, 0x22, 0xef, 0x9f, 0xc1, 0x27, 0x0e, 0x85, - 0xa2, 0x9f, 0xc0, 0x8a, 0x3f, 0xdb, 0x73, 0x7e, 0xc3, 0x74, 0xfd, 0x01, 0xed, 0xfc, 0xe1, 0x73, - 0x75, 0x3c, 0xaa, 0xad, 0x6c, 0x27, 0xa4, 0xe2, 0x09, 0x3d, 0xa8, 0x0b, 0xa5, 0xf0, 0xfa, 0xfd, - 0xf7, 0xfd, 0xfb, 0x67, 0xf7, 0xb7, 0x65, 0x36, 0xdf, 0x90, 0x0e, 0x2e, 0x85, 0x30, 0x86, 0xa3, - 0xd2, 0x2f, 0xf8, 0xa1, 0xff, 0x73, 0x58, 0x21, 0xf1, 0x45, 0x27, 0xab, 0xcc, 0x9e, 0xf5, 0x11, - 0x92, 0x58, 0x95, 0x36, 0x2b, 0xd2, 0x88, 0x95, 0x04, 0x82, 0xe1, 0x09, 0x65, 0x69, 0xaf, 0xbf, - 0xb9, 0xcb, 0x7a, 0xfd, 0x21, 0x0d, 0x8a, 0x43, 0xe2, 0x18, 0xe4, 0xb0, 0x47, 0xf9, 0x53, 0x3b, - 0x77, 0xb6, 0x82, 0xb6, 0x2f, 0x59, 0xc3, 0xc9, 0xce, 0x87, 0x30, 0x1c, 0xca, 0x55, 0xff, 0x38, - 0x03, 0xb5, 0x53, 0xda, 0x37, 0x7a, 0x08, 0xc8, 0x3a, 0x64, 0xd4, 0x19, 0x52, 0xfd, 0xbe, 0xb7, - 0x8a, 0xf6, 0xc7, 0xfa, 0x5c, 0x38, 0x50, 0x3d, 0x9e, 0xa0, 0xc0, 0x29, 0x5c, 0xa8, 0x07, 0x0b, - 0x6e, 0x64, 0xd4, 0x93, 0x59, 0xf0, 0x41, 0x76, 0xbb, 0xa2, 0x83, 0x62, 0x73, 0x65, 0x3c, 0xaa, - 0xc5, 0x46, 0x47, 0x1c, 0x93, 0x8e, 0x34, 0x00, 0x2d, 0xbc, 0x3a, 0x2f, 0xf4, 0x1b, 0xd9, 0xaa, - 0x58, 0x78, 0x63, 0x41, 0xdf, 0x89, 0x5c, 0x56, 0x44, 0xac, 0x7a, 0x3c, 0x0f, 0xe5, 0xd0, 0x85, - 0xaf, 0x77, 0x7d, 0xaf, 0x77, 0x7d, 0x2f, 0xdd, 0xf5, 0xc1, 0xeb, 0x5d, 0xdf, 0xb9, 0x76, 0x7d, - 0x29, 0xb5, 0xb8, 0x74, 0x69, 0x9b, 0xb8, 0x63, 0x05, 0xaa, 0x13, 0x39, 0x7e, 0xd9, 0xbb, 0xb8, - 0x2f, 0x26, 0x76, 0x71, 0x1f, 0x9d, 0x67, 0x6c, 0x9a, 0xb6, 0x8d, 0xfb, 0x97, 0x02, 0xea, 0xcb, - 0x6d, 0xbc, 0x84, 0xb9, 0xb0, 0x1f, 0x9f, 0x0b, 0xbf, 0xff, 0x7f, 0x18, 0x98, 0x65, 0x23, 0xf7, - 0x5f, 0x05, 0x20, 0x1c, 0x66, 0xd0, 0x3b, 0x10, 0xf9, 0xa1, 0x50, 0x96, 0x6e, 0xcf, 0x4d, 0x11, - 0x38, 0xba, 0x09, 0xf3, 0x7d, 0xca, 0x18, 0x69, 0xfb, 0x0b, 0x91, 0xe0, 0x77, 0xcc, 0x6d, 0x0f, - 0x8c, 0x7d, 0x3c, 0x3a, 0x80, 0x39, 0x87, 0x12, 0x66, 0x99, 0x72, 0x31, 0xf2, 0x3d, 0xfe, 0x0a, - 0xc6, 0x02, 0x72, 0x32, 0xaa, 0xdd, 0xca, 0xf2, 0x3b, 0x73, 0x5d, 0x3e, 0x9a, 0x05, 0x13, 0x96, - 0xe2, 0xd0, 0x7d, 0x28, 0x4b, 0x1d, 0x91, 0x03, 0x7b, 0x95, 0xf6, 0x9a, 0x3c, 0x4d, 0x79, 0x3b, - 0x49, 0x80, 0x27, 0x79, 0xd4, 0x87, 0x50, 0xf0, 0x07, 0x03, 0x54, 0x81, 0x7c, 0xe4, 0xbd, 0xe5, - 0x19, 0x2e, 0x20, 0x09, 0xc7, 0xcc, 0xa4, 0x3b, 0x46, 0xfd, 0x83, 0x02, 0x6f, 0xa4, 0x34, 0x25, - 0x74, 0x0d, 0x72, 0x03, 0xa7, 0x27, 0x5d, 0x30, 0x3f, 0x1e, 0xd5, 0x72, 0x9f, 0xe1, 0x47, 0x98, - 0xc3, 0x10, 0x81, 0x79, 0xe6, 0xad, 0xa7, 0x64, 0x30, 0xdd, 0xc9, 0x7e, 0xe3, 0xc9, 0xbd, 0x56, - 0xb3, 0xc4, 0xef, 0xc0, 0x87, 0xfa, 0x72, 0xd1, 0x3a, 0x14, 0x34, 0xd2, 0x1c, 0x98, 0x7a, 0xcf, - 0xbb, 0xaf, 0x05, 0xef, 0x8d, 0xb7, 0xb5, 0xe9, 0xc1, 0x70, 0x80, 0x6d, 0xee, 0x3c, 0x3f, 0xae, - 0x5e, 0xf9, 0xea, 0xb8, 0x7a, 0xe5, 0xc5, 0x71, 0xf5, 0xca, 0x2f, 0xc6, 0x55, 0xe5, 0xf9, 0xb8, - 0xaa, 0x7c, 0x35, 0xae, 0x2a, 0x2f, 0xc6, 0x55, 0xe5, 0x6f, 0xe3, 0xaa, 0xf2, 0xab, 0xbf, 0x57, - 0xaf, 0xfc, 0x60, 0x3d, 0xeb, 0x7f, 0x39, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x6f, 0xf2, 0xe8, - 0x4a, 0x10, 0x21, 0x00, 0x00, + // 2215 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4d, 0x6c, 0x1b, 0xc7, + 0x15, 0xf6, 0x92, 0x92, 0x45, 0x3e, 0xca, 0x92, 0x38, 0x71, 0x2a, 0xfa, 0x8f, 0x14, 0x16, 0x41, + 0x21, 0x03, 0x2d, 0x59, 0x2b, 0x41, 0xe2, 0x3a, 0x29, 0x02, 0xae, 0x62, 0x3b, 0x76, 0x24, 0x59, + 0x18, 0x39, 0x52, 0xd1, 0x26, 0x40, 0x56, 0xcb, 0x21, 0xb9, 0x11, 0xb9, 0xcb, 0xee, 0x2c, 0x65, + 0xab, 0x05, 0xda, 0x02, 0x2d, 0x90, 0x1e, 0x0b, 0xf4, 0x52, 0xa0, 0xa7, 0xde, 0x7b, 0x69, 0xef, + 0x05, 0x7a, 0xf4, 0x31, 0xb7, 0x1a, 0x28, 0x4a, 0x54, 0x4c, 0xd1, 0x9e, 0x7a, 0x48, 0x81, 0xf6, + 0xa0, 0x4b, 0x8b, 0x99, 0x9d, 0xfd, 0xdf, 0x95, 0x56, 0xb2, 0x2c, 0x17, 0x85, 0x6f, 0xda, 0xf7, + 0xe6, 0xbd, 0x37, 0xef, 0xcd, 0x9b, 0xf7, 0xbe, 0x79, 0x22, 0xdc, 0xdc, 0xb9, 0x49, 0xeb, 0xba, + 0xd9, 0x50, 0x07, 0x7a, 0x43, 0x6d, 0xf5, 0x75, 0x4a, 0x75, 0xd3, 0xb0, 0x48, 0x47, 0xa7, 0xb6, + 0xa5, 0xda, 0xba, 0x69, 0x34, 0x76, 0x6f, 0x6c, 0x13, 0x5b, 0xbd, 0xd1, 0xe8, 0x10, 0x83, 0x58, + 0xaa, 0x4d, 0x5a, 0xf5, 0x81, 0x65, 0xda, 0x26, 0x5a, 0x74, 0x24, 0xeb, 0xea, 0x40, 0xaf, 0x27, + 0x4a, 0xd6, 0x85, 0xe4, 0xe5, 0xaf, 0x77, 0x74, 0xbb, 0x3b, 0xdc, 0xae, 0x6b, 0x66, 0xbf, 0xd1, + 0x31, 0x3b, 0x66, 0x83, 0x2b, 0xd8, 0x1e, 0xb6, 0xf9, 0x17, 0xff, 0xe0, 0x7f, 0x39, 0x8a, 0x2f, + 0xbf, 0x9e, 0x61, 0x4b, 0xd1, 0xdd, 0x5c, 0x7e, 0xc3, 0x17, 0xea, 0xab, 0x5a, 0x57, 0x37, 0x88, + 0xb5, 0xd7, 0x18, 0xec, 0x74, 0x18, 0x81, 0x36, 0xfa, 0xc4, 0x56, 0x93, 0xa4, 0x1a, 0x69, 0x52, + 0xd6, 0xd0, 0xb0, 0xf5, 0x3e, 0x89, 0x09, 0xbc, 0x79, 0x94, 0x00, 0xd5, 0xba, 0xa4, 0xaf, 0x46, + 0xe5, 0xe4, 0xf7, 0x01, 0x35, 0x07, 0x83, 0xde, 0xde, 0xb2, 0x69, 0xb4, 0xf5, 0xce, 0xd0, 0xf1, + 0x03, 0x2d, 0x01, 0x90, 0xc7, 0x03, 0x8b, 0x70, 0x0f, 0x2b, 0xd2, 0x82, 0xb4, 0x58, 0x54, 0xd0, + 0x93, 0x51, 0xed, 0xdc, 0x78, 0x54, 0x83, 0xdb, 0x1e, 0x07, 0x07, 0x56, 0xc9, 0x14, 0x66, 0x9b, + 0xc3, 0x96, 0x6e, 0x37, 0x0d, 0xc3, 0xb4, 0x1d, 0x35, 0xd7, 0x20, 0xbf, 0x43, 0xf6, 0x84, 0x7c, + 0x49, 0xc8, 0xe7, 0x3f, 0x20, 0x7b, 0x98, 0xd1, 0x51, 0x13, 0x66, 0x77, 0xd5, 0xde, 0x90, 0xf8, + 0x0a, 0x2b, 0x39, 0xbe, 0x74, 0x5e, 0x2c, 0x9d, 0xdd, 0x0c, 0xb3, 0x71, 0x74, 0xbd, 0xdc, 0x83, + 0xb2, 0xff, 0xb5, 0xa5, 0x5a, 0x86, 0x6e, 0x74, 0xd0, 0xd7, 0xa0, 0xd0, 0xd6, 0x49, 0xaf, 0x85, + 0x49, 0x5b, 0x28, 0x9c, 0x13, 0x0a, 0x0b, 0x77, 0x04, 0x1d, 0x7b, 0x2b, 0xd0, 0x75, 0x98, 0x7a, + 0xe4, 0x08, 0x56, 0xf2, 0x7c, 0xf1, 0xac, 0x58, 0x3c, 0x25, 0xf4, 0x61, 0x97, 0x2f, 0xbf, 0x0b, + 0xc5, 0xfb, 0x1b, 0x0f, 0xd6, 0xd6, 0x55, 0x5b, 0xeb, 0x9e, 0x28, 0x46, 0x6d, 0x98, 0x59, 0x65, + 0xc2, 0xcb, 0xa6, 0xd1, 0xd2, 0x79, 0x88, 0x16, 0x60, 0xc2, 0x50, 0xfb, 0x44, 0xc8, 0x4f, 0x0b, + 0xf9, 0x89, 0x35, 0xb5, 0x4f, 0x30, 0xe7, 0x44, 0xec, 0xe4, 0x32, 0xd9, 0xf9, 0xe3, 0x84, 0x30, + 0x84, 0x09, 0x35, 0x87, 0x96, 0x46, 0x28, 0x7a, 0x0c, 0x65, 0xa6, 0x8e, 0x0e, 0x54, 0x8d, 0x6c, + 0x90, 0x1e, 0xd1, 0x6c, 0xd3, 0xe2, 0x56, 0x4b, 0x4b, 0xaf, 0xd7, 0xfd, 0x1b, 0xe3, 0x25, 0x4f, + 0x7d, 0xb0, 0xd3, 0x61, 0x04, 0x5a, 0x67, 0x39, 0x5a, 0xdf, 0xbd, 0x51, 0x5f, 0x51, 0xb7, 0x49, + 0xcf, 0x15, 0x55, 0x5e, 0x1d, 0x8f, 0x6a, 0xe5, 0xb5, 0xa8, 0x46, 0x1c, 0x37, 0x82, 0x4c, 0x98, + 0x31, 0xb7, 0x3f, 0x25, 0x9a, 0xed, 0x99, 0xcd, 0x9d, 0xdc, 0x2c, 0x1a, 0x8f, 0x6a, 0x33, 0x0f, + 0x42, 0xea, 0x70, 0x44, 0x3d, 0xfa, 0x21, 0x5c, 0xb0, 0x84, 0xdf, 0x78, 0xd8, 0x23, 0xb4, 0x92, + 0x5f, 0xc8, 0x2f, 0x96, 0x96, 0x9a, 0xf5, 0xac, 0x85, 0xa1, 0xce, 0xfc, 0x6a, 0x31, 0xd9, 0x2d, + 0xdd, 0xee, 0x3e, 0x18, 0x10, 0x87, 0x4d, 0x95, 0x57, 0x45, 0xdc, 0x2f, 0xe0, 0xa0, 0x7e, 0x1c, + 0x36, 0x87, 0x7e, 0x21, 0xc1, 0x45, 0xf2, 0x58, 0xeb, 0x0d, 0x5b, 0x24, 0xb4, 0xae, 0x32, 0x71, + 0x5a, 0xfb, 0xb8, 0x2a, 0xf6, 0x71, 0xf1, 0x76, 0x82, 0x19, 0x9c, 0x68, 0x1c, 0xbd, 0x07, 0xa5, + 0x3e, 0x4b, 0x89, 0x75, 0xb3, 0xa7, 0x6b, 0x7b, 0x95, 0x29, 0x9e, 0x48, 0xf2, 0x78, 0x54, 0x2b, + 0xad, 0xfa, 0xe4, 0x83, 0x51, 0x6d, 0x36, 0xf0, 0xf9, 0x70, 0x6f, 0x40, 0x70, 0x50, 0x4c, 0xfe, + 0xab, 0x04, 0xf3, 0xab, 0x43, 0x76, 0xbf, 0x8d, 0x4e, 0xd3, 0xdd, 0xbb, 0xc3, 0x43, 0x9f, 0x40, + 0x81, 0x1d, 0x5a, 0x4b, 0xb5, 0x55, 0x91, 0x59, 0xdf, 0xc8, 0x76, 0xc4, 0xce, 0x79, 0xae, 0x12, + 0x5b, 0xf5, 0x33, 0xdb, 0xa7, 0x61, 0x4f, 0x2b, 0xea, 0xc0, 0x04, 0x1d, 0x10, 0x4d, 0x24, 0xd0, + 0xed, 0xec, 0x81, 0x4c, 0xd9, 0xf2, 0xc6, 0x80, 0x68, 0xfe, 0xa5, 0x63, 0x5f, 0x98, 0x1b, 0x90, + 0xff, 0x29, 0x41, 0x35, 0x45, 0x46, 0xd1, 0x8d, 0x16, 0xab, 0x32, 0xcf, 0xdf, 0x5b, 0x23, 0xe4, + 0xed, 0xca, 0x33, 0x7b, 0x2b, 0x76, 0x9e, 0xea, 0xf4, 0x97, 0x12, 0xc8, 0x87, 0x8b, 0xae, 0xe8, + 0xd4, 0x46, 0x1f, 0xc5, 0x1c, 0xaf, 0x67, 0xbc, 0xc9, 0x3a, 0x75, 0xdc, 0xf6, 0xca, 0xb1, 0x4b, + 0x09, 0x38, 0xdd, 0x87, 0x49, 0xdd, 0x26, 0x7d, 0x5a, 0xc9, 0xf1, 0xcb, 0xf2, 0xfe, 0x69, 0x79, + 0xad, 0x5c, 0x10, 0x46, 0x27, 0xef, 0x31, 0xf5, 0xd8, 0xb1, 0x22, 0xff, 0x26, 0x77, 0x94, 0xcf, + 0x2c, 0x40, 0xac, 0x08, 0x0f, 0x38, 0x71, 0xcd, 0x2f, 0xd6, 0xde, 0xe1, 0xad, 0x7b, 0x1c, 0x1c, + 0x58, 0xc5, 0xe2, 0x34, 0x50, 0x2d, 0xb5, 0xef, 0xb6, 0xa1, 0xd2, 0xd2, 0x52, 0x76, 0x67, 0xd6, + 0x85, 0xa4, 0x32, 0xcd, 0xe2, 0xe4, 0x7e, 0x61, 0x4f, 0x23, 0xb2, 0x61, 0xa6, 0x1f, 0xaa, 0xf0, + 0xbc, 0x7b, 0x95, 0x96, 0x6e, 0x1e, 0x23, 0x60, 0x21, 0x79, 0xa7, 0xb4, 0x86, 0x69, 0x38, 0x62, + 0x43, 0xfe, 0x42, 0x82, 0x2b, 0x29, 0xe1, 0x3a, 0x83, 0xdc, 0x68, 0x87, 0x73, 0xa3, 0xf9, 0xec, + 0xb9, 0x91, 0x9c, 0x14, 0xbf, 0x3a, 0x9f, 0xea, 0x25, 0xcf, 0x86, 0x4f, 0xa0, 0xc8, 0xcf, 0xe1, + 0x03, 0xdd, 0x68, 0x25, 0xf4, 0xd0, 0x2c, 0x47, 0xcb, 0x44, 0x95, 0x0b, 0xe3, 0x51, 0xad, 0xe8, + 0x7d, 0x62, 0x5f, 0x29, 0xfa, 0x3e, 0xcc, 0xf5, 0x05, 0x50, 0x60, 0xf2, 0xba, 0x61, 0x53, 0x91, + 0x43, 0x27, 0x3f, 0xdf, 0x8b, 0xe3, 0x51, 0x6d, 0x6e, 0x35, 0xa2, 0x15, 0xc7, 0xec, 0x20, 0x0d, + 0x8a, 0xbb, 0xaa, 0xa5, 0xab, 0xdb, 0x7e, 0xeb, 0x3c, 0x46, 0xe2, 0x6e, 0x0a, 0x51, 0xa5, 0x2c, + 0x42, 0x5b, 0x74, 0x29, 0x14, 0xfb, 0x7a, 0x99, 0x91, 0xfe, 0xd0, 0x81, 0x89, 0x6e, 0x5f, 0x5c, + 0x3a, 0xee, 0x71, 0x9a, 0x86, 0x6f, 0xc4, 0xa5, 0x50, 0xec, 0xeb, 0x45, 0x2b, 0x70, 0xa1, 0xad, + 0xea, 0xbd, 0xa1, 0x45, 0x44, 0xd3, 0x9b, 0xe4, 0x17, 0xf7, 0xab, 0xac, 0x83, 0xdf, 0x09, 0x32, + 0x0e, 0x46, 0xb5, 0x72, 0x88, 0xc0, 0x1b, 0x5f, 0x58, 0x18, 0xfd, 0x00, 0x66, 0xfb, 0x21, 0xf0, + 0x46, 0x2b, 0xe7, 0xf9, 0xc6, 0x8f, 0x7b, 0x24, 0x9e, 0x02, 0x1f, 0xe8, 0x86, 0xe9, 0x14, 0x47, + 0x2d, 0xa1, 0x9f, 0x49, 0x80, 0x2c, 0xa2, 0x1b, 0xbb, 0xa6, 0xc6, 0x35, 0x86, 0xba, 0xf8, 0xb7, + 0x85, 0x1a, 0x84, 0x63, 0x2b, 0x0e, 0x46, 0xb5, 0x5b, 0x19, 0x9e, 0x2d, 0xf5, 0xb8, 0x24, 0x0f, + 0x41, 0x82, 0x4d, 0xf9, 0x6f, 0x05, 0x98, 0x75, 0x6f, 0xc7, 0x16, 0xd9, 0xee, 0x9a, 0xe6, 0x4e, + 0x06, 0x18, 0xfb, 0x08, 0xa6, 0xb5, 0x9e, 0x4e, 0x0c, 0xdb, 0x79, 0x69, 0x88, 0x6c, 0xfe, 0x56, + 0xf6, 0xd0, 0x09, 0x53, 0xcb, 0x01, 0x25, 0xca, 0x45, 0x61, 0x68, 0x3a, 0x48, 0xc5, 0x21, 0x43, + 0xe8, 0x23, 0x98, 0xb4, 0x02, 0x28, 0xf0, 0xad, 0x2c, 0x16, 0xeb, 0x09, 0x98, 0xcb, 0x2b, 0x15, + 0x0e, 0xc8, 0x72, 0x94, 0xc6, 0x53, 0x6c, 0xe2, 0x59, 0x52, 0x2c, 0x82, 0xd1, 0x8a, 0x27, 0xc2, + 0x68, 0xc9, 0x50, 0x7f, 0xf2, 0xc5, 0x40, 0xfd, 0xd2, 0xf3, 0x85, 0xfa, 0xef, 0x41, 0x89, 0xea, + 0x2d, 0x72, 0xbb, 0xdd, 0x26, 0x9a, 0xcd, 0xee, 0xa3, 0x17, 0xb0, 0x0d, 0x9f, 0xcc, 0x02, 0xe6, + 0x7f, 0x2e, 0xf7, 0x54, 0x4a, 0x71, 0x50, 0x0c, 0xdd, 0x82, 0x19, 0xf6, 0x46, 0x36, 0x87, 0xf6, + 0x06, 0xd1, 0x4c, 0xa3, 0x45, 0xf9, 0xbd, 0x9a, 0x74, 0x76, 0xf0, 0x30, 0xc4, 0xc1, 0x91, 0x95, + 0xe8, 0x43, 0x98, 0xf7, 0xb2, 0x08, 0x93, 0x5d, 0x9d, 0x3c, 0xda, 0x24, 0x16, 0xe5, 0xd5, 0xa1, + 0xb0, 0x90, 0x5f, 0x2c, 0x2a, 0x57, 0xc6, 0xa3, 0xda, 0x7c, 0x33, 0x79, 0x09, 0x4e, 0x93, 0x45, + 0x3f, 0x4d, 0xbe, 0xef, 0xc0, 0x1d, 0x7c, 0x78, 0x56, 0x77, 0x3d, 0xa9, 0xe6, 0x4d, 0x9f, 0x55, + 0xcd, 0x93, 0xff, 0x2c, 0xc1, 0xd5, 0x48, 0xa1, 0x09, 0x8f, 0x29, 0x9e, 0x3f, 0x04, 0xff, 0x2e, + 0x14, 0x84, 0x65, 0x17, 0x74, 0x7c, 0xf3, 0xf8, 0xa0, 0x43, 0x68, 0x50, 0x26, 0x98, 0x29, 0xec, + 0x29, 0x94, 0xff, 0x21, 0xc1, 0xc2, 0x61, 0xfe, 0x9d, 0x01, 0xa2, 0xda, 0x09, 0x23, 0xaa, 0x3b, + 0x27, 0x76, 0x2e, 0xb4, 0xf1, 0x14, 0x58, 0xf5, 0xdb, 0x1c, 0x14, 0xdc, 0x3e, 0x8d, 0xde, 0x61, + 0x18, 0xca, 0xd6, 0xba, 0x2c, 0xf5, 0xc4, 0x54, 0xa3, 0xea, 0x36, 0xf3, 0x75, 0x97, 0x71, 0x10, + 0xfc, 0xc0, 0xbe, 0x00, 0xbf, 0x1e, 0x6a, 0x6c, 0x6e, 0x25, 0x20, 0xf0, 0x3b, 0xd9, 0xbd, 0x88, + 0xcf, 0xbe, 0x94, 0xaf, 0xb0, 0xcb, 0x15, 0xa7, 0xe3, 0x04, 0x7b, 0x0c, 0x08, 0x7e, 0x4a, 0x4d, + 0x83, 0x6f, 0x91, 0x57, 0xfe, 0x63, 0x01, 0x41, 0x6f, 0x96, 0xe4, 0x00, 0x41, 0xef, 0x13, 0xfb, + 0x4a, 0xe5, 0xa7, 0x12, 0xcc, 0xa7, 0x4c, 0x01, 0xd0, 0x5b, 0xfe, 0x9c, 0x83, 0x57, 0xe7, 0x8a, + 0xc4, 0x0b, 0x4e, 0x39, 0x38, 0xa0, 0xe0, 0x0c, 0x1c, 0x5e, 0x87, 0x7e, 0xc2, 0x8a, 0x4b, 0x4c, + 0x9f, 0x68, 0xc9, 0x27, 0x6e, 0x90, 0x97, 0x3d, 0x14, 0x12, 0xe3, 0xe1, 0x04, 0x73, 0xb2, 0x0a, + 0x3e, 0xf6, 0x65, 0x0f, 0x2c, 0x75, 0xa0, 0x8b, 0xf2, 0x17, 0x7d, 0x60, 0x35, 0xd7, 0xef, 0x09, + 0x0e, 0x0e, 0xac, 0x62, 0xa0, 0x63, 0x87, 0x21, 0xf0, 0x5c, 0x18, 0x74, 0x70, 0x2c, 0xcd, 0x39, + 0xf2, 0xef, 0x72, 0xe0, 0xbd, 0x9d, 0x32, 0x60, 0x94, 0x06, 0x14, 0xbd, 0x9e, 0x26, 0xb4, 0x7a, + 0x00, 0xd3, 0xeb, 0x7f, 0xd8, 0x5f, 0x83, 0x3e, 0x86, 0x02, 0x75, 0x3b, 0x5d, 0xfe, 0xe4, 0x9d, + 0x8e, 0xbf, 0xf1, 0xbc, 0x1e, 0xe7, 0xa9, 0x44, 0x36, 0xcc, 0xf3, 0x27, 0x01, 0xb1, 0x89, 0xb5, + 0x66, 0xda, 0x77, 0xcc, 0xa1, 0xd1, 0x6a, 0x6a, 0x3c, 0xd3, 0x1d, 0x98, 0x71, 0x8b, 0xf5, 0x96, + 0xf5, 0xe4, 0x25, 0x07, 0xa3, 0xda, 0x95, 0x14, 0x16, 0xbf, 0x4d, 0x69, 0xaa, 0xe5, 0x5f, 0x4b, + 0x30, 0xb7, 0x41, 0xac, 0x5d, 0x5d, 0x23, 0x98, 0xb4, 0x89, 0x45, 0x0c, 0x2d, 0x12, 0x1a, 0x29, + 0x43, 0x68, 0xdc, 0x68, 0xe7, 0x52, 0xa3, 0x7d, 0x15, 0x26, 0x06, 0xaa, 0xdd, 0x15, 0x53, 0xd7, + 0x02, 0xe3, 0xae, 0xab, 0x76, 0x17, 0x73, 0x2a, 0xe7, 0x9a, 0x96, 0xcd, 0x1d, 0x9d, 0x14, 0x5c, + 0xd3, 0xb2, 0x31, 0xa7, 0xca, 0xbf, 0x94, 0x60, 0x9a, 0x79, 0xb1, 0xdc, 0x25, 0xda, 0x8e, 0x6e, + 0x74, 0xd0, 0x67, 0x12, 0x20, 0x12, 0x9d, 0x04, 0x3b, 0x37, 0xa2, 0xb4, 0xf4, 0x76, 0xf6, 0x3b, + 0x19, 0x9b, 0x26, 0xfb, 0x69, 0x1d, 0x63, 0x51, 0x9c, 0x60, 0x52, 0xfe, 0x53, 0x0e, 0x2e, 0x6d, + 0xaa, 0x3d, 0xbd, 0xf5, 0x82, 0x66, 0x64, 0x7a, 0x68, 0x6a, 0x74, 0xf7, 0x38, 0x2f, 0xb7, 0x94, + 0x4d, 0xa7, 0x0d, 0x8c, 0xd0, 0xf7, 0xe0, 0x3c, 0xb5, 0x55, 0x7b, 0xe8, 0xce, 0x1e, 0xee, 0x9d, + 0x86, 0x31, 0xae, 0x50, 0x99, 0x11, 0xe6, 0xce, 0x3b, 0xdf, 0x58, 0x18, 0x92, 0xff, 0x2d, 0xc1, + 0x42, 0xaa, 0xec, 0xd9, 0x8d, 0xe6, 0x06, 0xa1, 0x20, 0xaf, 0x9d, 0x82, 0xdf, 0x47, 0x0d, 0xe7, + 0xfe, 0x25, 0xc1, 0x6b, 0x47, 0x09, 0x9f, 0x01, 0x60, 0x30, 0xc3, 0x80, 0xe1, 0xfe, 0xe9, 0x79, + 0x9e, 0x02, 0x1a, 0x3e, 0xcb, 0x1f, 0xed, 0xf7, 0xcb, 0x11, 0x5d, 0xe0, 0x1f, 0x3d, 0x5b, 0x50, + 0xde, 0x15, 0xf1, 0x32, 0x0d, 0xa7, 0xa4, 0x3b, 0x13, 0x96, 0xa2, 0x72, 0x9d, 0x3d, 0xe4, 0x36, + 0xa3, 0xcc, 0x83, 0x51, 0x6d, 0x2e, 0x4a, 0xc4, 0x71, 0x1d, 0xf2, 0xdf, 0x25, 0xb8, 0x96, 0x7a, + 0x12, 0x67, 0x90, 0x7a, 0xdd, 0x70, 0xea, 0x2d, 0x9f, 0x46, 0xea, 0xa5, 0xce, 0xff, 0xae, 0x1d, + 0x5a, 0x0d, 0xff, 0xcf, 0x27, 0x80, 0x3b, 0x50, 0xf2, 0x8f, 0xdf, 0x1d, 0x9c, 0xbc, 0x71, 0xfc, + 0x78, 0x9b, 0x86, 0xf2, 0x8a, 0x08, 0x70, 0xc9, 0xa7, 0x51, 0x1c, 0xd4, 0x7e, 0xca, 0x13, 0x94, + 0x1f, 0xc1, 0x9c, 0x1a, 0xfe, 0x2f, 0x34, 0xad, 0x4c, 0x1e, 0xf7, 0xe1, 0x16, 0xf9, 0x3f, 0xb6, + 0x52, 0x11, 0x4e, 0xcc, 0x45, 0x18, 0x14, 0xc7, 0x8c, 0xbd, 0xd8, 0x29, 0x61, 0x68, 0x74, 0x3b, + 0xf5, 0x7c, 0x46, 0xb7, 0xf2, 0x1f, 0x72, 0x50, 0x3b, 0xa2, 0x7d, 0xa3, 0xfb, 0x80, 0xcc, 0x6d, + 0x4a, 0xac, 0x5d, 0xd2, 0xba, 0xeb, 0xfc, 0xe2, 0xc0, 0x85, 0xf5, 0x79, 0x1f, 0x50, 0x3d, 0x88, + 0xad, 0xc0, 0x09, 0x52, 0xa8, 0x07, 0xd3, 0x76, 0x00, 0xea, 0x89, 0x5b, 0xf0, 0x66, 0x76, 0xbf, + 0x82, 0x40, 0x51, 0x99, 0x1b, 0x8f, 0x6a, 0x21, 0xe8, 0x88, 0x43, 0xda, 0x91, 0x06, 0xa0, 0xf9, + 0x47, 0xe7, 0xa4, 0x7e, 0x23, 0x5b, 0x15, 0xf3, 0x4f, 0xcc, 0xeb, 0x3b, 0x81, 0xc3, 0x0a, 0xa8, + 0x95, 0xf7, 0xa7, 0xa0, 0xec, 0x87, 0xf0, 0xe5, 0x10, 0xf5, 0xe5, 0x10, 0xf5, 0xd0, 0x21, 0x2a, + 0xbc, 0x1c, 0xa2, 0x9e, 0x68, 0x88, 0x9a, 0x50, 0x8b, 0x4b, 0x67, 0x36, 0xbd, 0xdc, 0x97, 0xa0, + 0x1a, 0xbb, 0xe3, 0x67, 0x3d, 0xbf, 0xfc, 0x38, 0x36, 0xbf, 0x7c, 0xfb, 0x24, 0xb0, 0x29, 0x6d, + 0x82, 0xf9, 0xa5, 0x04, 0xf2, 0xe1, 0x3e, 0xfe, 0x4f, 0xff, 0x62, 0xe0, 0xf0, 0xad, 0xa7, 0x80, + 0xc3, 0xff, 0x48, 0x00, 0x3e, 0x98, 0x41, 0xaf, 0x41, 0xe0, 0x47, 0x58, 0xa2, 0x74, 0x3b, 0x61, + 0x0a, 0xd0, 0xd1, 0x75, 0x98, 0xea, 0x13, 0x4a, 0xd5, 0x8e, 0x3b, 0x10, 0xf1, 0x7e, 0x64, 0xb6, + 0xea, 0x90, 0xb1, 0xcb, 0x47, 0x5b, 0x70, 0xde, 0x22, 0x2a, 0x15, 0xd3, 0xcc, 0xa2, 0xf2, 0x2e, + 0x7b, 0x05, 0x63, 0x4e, 0x39, 0x18, 0xd5, 0x6e, 0x64, 0xf9, 0x39, 0x61, 0x5d, 0x3c, 0x9a, 0xb9, + 0x10, 0x16, 0xea, 0xd0, 0x5d, 0x28, 0x0b, 0x1b, 0x81, 0x0d, 0x3b, 0x95, 0xf6, 0x92, 0xd8, 0x4d, + 0x79, 0x35, 0xba, 0x00, 0xc7, 0x65, 0xe4, 0xfb, 0x50, 0x70, 0x81, 0x01, 0xaa, 0xc0, 0x44, 0xe0, + 0xbd, 0xe5, 0x38, 0xce, 0x29, 0x91, 0xc0, 0xe4, 0x92, 0x03, 0x23, 0xff, 0x5e, 0x82, 0x57, 0x12, + 0x9a, 0x12, 0xba, 0x04, 0xf9, 0xa1, 0xd5, 0x13, 0x21, 0x98, 0x1a, 0x8f, 0x6a, 0xf9, 0x0f, 0xf1, + 0x0a, 0x66, 0x34, 0xa4, 0xc2, 0x14, 0x75, 0xc6, 0x53, 0x22, 0x99, 0x6e, 0x65, 0x3f, 0xf1, 0xe8, + 0x5c, 0x4b, 0x29, 0xb1, 0x33, 0x70, 0xa9, 0xae, 0x5e, 0xb4, 0x08, 0x05, 0x4d, 0x55, 0x86, 0x46, + 0xab, 0xe7, 0x9c, 0xd7, 0xb4, 0xf3, 0xc6, 0x5b, 0x6e, 0x3a, 0x34, 0xec, 0x71, 0x95, 0xb5, 0x27, + 0xfb, 0xd5, 0x73, 0x9f, 0xef, 0x57, 0xcf, 0x3d, 0xdd, 0xaf, 0x9e, 0xfb, 0xf1, 0xb8, 0x2a, 0x3d, + 0x19, 0x57, 0xa5, 0xcf, 0xc7, 0x55, 0xe9, 0xe9, 0xb8, 0x2a, 0xfd, 0x65, 0x5c, 0x95, 0x7e, 0xfe, + 0x45, 0xf5, 0xdc, 0x77, 0x16, 0xb3, 0xfe, 0x98, 0xf5, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x13, + 0x7c, 0x49, 0xa4, 0xf7, 0x2a, 0x00, 0x00, +} + +func (m *ApplyConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplyConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplyConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } func (m *AuditAnnotation) Marshal() (dAtA []byte, err error) { @@ -971,6 +1277,34 @@ func (m *ExpressionWarning) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *JSONPatch) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *JSONPatch) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *JSONPatch) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *MatchCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1086,7 +1420,7 @@ func (m *MatchResources) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *MutatingWebhook) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1096,112 +1430,18 @@ func (m *MutatingWebhook) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MutatingWebhook) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicy) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MutatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.MatchConditions) > 0 { - for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 - } - } - if m.ObjectSelector != nil { - { - size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - } - if m.ReinvocationPolicy != nil { - i -= len(*m.ReinvocationPolicy) - copy(dAtA[i:], *m.ReinvocationPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ReinvocationPolicy))) - i-- - dAtA[i] = 0x52 - } - if m.MatchPolicy != nil { - i -= len(*m.MatchPolicy) - copy(dAtA[i:], *m.MatchPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) - i-- - dAtA[i] = 0x4a - } - if len(m.AdmissionReviewVersions) > 0 { - for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.AdmissionReviewVersions[iNdEx]) - copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) - i-- - dAtA[i] = 0x42 - } - } - if m.TimeoutSeconds != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) - i-- - dAtA[i] = 0x38 - } - if m.SideEffects != nil { - i -= len(*m.SideEffects) - copy(dAtA[i:], *m.SideEffects) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) - i-- - dAtA[i] = 0x32 - } - if m.NamespaceSelector != nil { - { - size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if m.FailurePolicy != nil { - i -= len(*m.FailurePolicy) - copy(dAtA[i:], *m.FailurePolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) - i-- - dAtA[i] = 0x22 - } - if len(m.Rules) > 0 { - for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } { - size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1210,15 +1450,20 @@ func (m *MutatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *MutatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1228,30 +1473,26 @@ func (m *MutatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MutatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBinding) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MutatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Webhooks) > 0 { - for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1265,7 +1506,7 @@ func (m *MutatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } -func (m *MutatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1275,12 +1516,12 @@ func (m *MutatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MutatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MutatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1312,7 +1553,7 @@ func (m *MutatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } -func (m *NamedRuleWithOperations) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1322,39 +1563,49 @@ func (m *NamedRuleWithOperations) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NamedRuleWithOperations) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NamedRuleWithOperations) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - { - size, err := m.RuleWithOperations.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.MatchResources != nil { + { + size, err := m.MatchResources.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a } - i-- - dAtA[i] = 0x12 - if len(m.ResourceNames) > 0 { - for iNdEx := len(m.ResourceNames) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ResourceNames[iNdEx]) - copy(dAtA[i:], m.ResourceNames[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceNames[iNdEx]))) - i-- - dAtA[i] = 0xa + if m.ParamRef != nil { + { + size, err := m.ParamRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } + i -= len(m.PolicyName) + copy(dAtA[i:], m.PolicyName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PolicyName))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ParamKind) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1364,30 +1615,44 @@ func (m *ParamKind) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ParamKind) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ParamKind) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.Kind) - copy(dAtA[i:], m.Kind) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) - i-- - dAtA[i] = 0x12 - i -= len(m.APIVersion) - copy(dAtA[i:], m.APIVersion) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion))) + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ParamRef) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1397,26 +1662,73 @@ func (m *ParamRef) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ParamRef) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicySpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.ParameterNotFoundAction != nil { - i -= len(*m.ParameterNotFoundAction) - copy(dAtA[i:], *m.ParameterNotFoundAction) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ParameterNotFoundAction))) + i -= len(m.ReinvocationPolicy) + copy(dAtA[i:], m.ReinvocationPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ReinvocationPolicy))) + i-- + dAtA[i] = 0x3a + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a } - if m.Selector != nil { + if len(m.Mutations) > 0 { + for iNdEx := len(m.Mutations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Mutations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.Variables) > 0 { + for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.MatchConstraints != nil { { - size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.MatchConstraints.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1424,67 +1736,24 @@ func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceReference) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceReference) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Port != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) - i-- - dAtA[i] = 0x20 + dAtA[i] = 0x12 } - if m.Path != nil { - i -= len(*m.Path) - copy(dAtA[i:], *m.Path) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Path))) + if m.ParamKind != nil { + { + size, err := m.ParamKind.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x1a + dAtA[i] = 0xa } - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0x12 - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *TypeChecking) Marshal() (dAtA []byte, err error) { +func (m *MutatingWebhook) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1494,20 +1763,20 @@ func (m *TypeChecking) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TypeChecking) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingWebhook) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TypeChecking) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ExpressionWarnings) > 0 { - for iNdEx := len(m.ExpressionWarnings) - 1; iNdEx >= 0; iNdEx-- { + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.ExpressionWarnings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1515,54 +1784,91 @@ func (m *TypeChecking) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x62 } } - return len(dAtA) - i, nil -} - -func (m *ValidatingAdmissionPolicy) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + if m.ObjectSelector != nil { + { + size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a } - return dAtA[:n], nil -} - -func (m *ValidatingAdmissionPolicy) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValidatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.ReinvocationPolicy != nil { + i -= len(*m.ReinvocationPolicy) + copy(dAtA[i:], *m.ReinvocationPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ReinvocationPolicy))) + i-- + dAtA[i] = 0x52 + } + if m.MatchPolicy != nil { + i -= len(*m.MatchPolicy) + copy(dAtA[i:], *m.MatchPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) + i-- + dAtA[i] = 0x4a + } + if len(m.AdmissionReviewVersions) > 0 { + for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AdmissionReviewVersions[iNdEx]) + copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) + i-- + dAtA[i] = 0x42 } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0x1a - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.TimeoutSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) + i-- + dAtA[i] = 0x38 + } + if m.SideEffects != nil { + i -= len(*m.SideEffects) + copy(dAtA[i:], *m.SideEffects) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) + i-- + dAtA[i] = 0x32 + } + if m.NamespaceSelector != nil { + { + size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 + } + if len(m.Rules) > 0 { + for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0x12 { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1570,11 +1876,16 @@ func (m *ValidatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, erro i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { +func (m *MutatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1584,26 +1895,30 @@ func (m *ValidatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBinding) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Webhooks) > 0 { + for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1617,7 +1932,7 @@ func (m *ValidatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error) { +func (m *MutatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1627,12 +1942,12 @@ func (m *ValidatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBindingList) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1664,7 +1979,7 @@ func (m *ValidatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error) { +func (m *Mutation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1674,28 +1989,19 @@ func (m *ValidatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBindingSpec) MarshalTo(dAtA []byte) (int, error) { +func (m *Mutation) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Mutation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ValidationActions) > 0 { - for iNdEx := len(m.ValidationActions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ValidationActions[iNdEx]) - copy(dAtA[i:], m.ValidationActions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ValidationActions[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if m.MatchResources != nil { + if m.JSONPatch != nil { { - size, err := m.MatchResources.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.JSONPatch.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1703,11 +2009,11 @@ func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } - if m.ParamRef != nil { + if m.ApplyConfiguration != nil { { - size, err := m.ParamRef.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ApplyConfiguration.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1715,17 +2021,17 @@ func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } - i -= len(m.PolicyName) - copy(dAtA[i:], m.PolicyName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.PolicyName))) + i -= len(m.PatchType) + copy(dAtA[i:], m.PatchType) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PatchType))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { +func (m *NamedRuleWithOperations) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1735,32 +2041,18 @@ func (m *ValidatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyList) MarshalTo(dAtA []byte) (int, error) { +func (m *NamedRuleWithOperations) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NamedRuleWithOperations) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.RuleWithOperations.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1768,11 +2060,20 @@ func (m *ValidatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + if len(m.ResourceNames) > 0 { + for iNdEx := len(m.ResourceNames) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ResourceNames[iNdEx]) + copy(dAtA[i:], m.ResourceNames[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceNames[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { +func (m *ParamKind) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1782,94 +2083,59 @@ func (m *ValidatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicySpec) MarshalTo(dAtA []byte) (int, error) { +func (m *ParamKind) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ParamKind) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Variables) > 0 { - for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if len(m.MatchConditions) > 0 { - for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.AuditAnnotations) > 0 { - for iNdEx := len(m.AuditAnnotations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AuditAnnotations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i-- + dAtA[i] = 0x12 + i -= len(m.APIVersion) + copy(dAtA[i:], m.APIVersion) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ParamRef) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if m.FailurePolicy != nil { - i -= len(*m.FailurePolicy) - copy(dAtA[i:], *m.FailurePolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + return dAtA[:n], nil +} + +func (m *ParamRef) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ParameterNotFoundAction != nil { + i -= len(*m.ParameterNotFoundAction) + copy(dAtA[i:], *m.ParameterNotFoundAction) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ParameterNotFoundAction))) i-- dAtA[i] = 0x22 } - if len(m.Validations) > 0 { - for iNdEx := len(m.Validations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Validations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.MatchConstraints != nil { - { - size, err := m.MatchConstraints.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.ParamKind != nil { + if m.Selector != nil { { - size, err := m.ParamKind.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1877,12 +2143,22 @@ func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x1a } + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyStatus) Marshal() (dAtA []byte, err error) { +func (m *ServiceReference) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1892,49 +2168,42 @@ func (m *ValidatingAdmissionPolicyStatus) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyStatus) MarshalTo(dAtA []byte) (int, error) { +func (m *ServiceReference) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ServiceReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Conditions) > 0 { - for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } + if m.Port != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) + i-- + dAtA[i] = 0x20 } - if m.TypeChecking != nil { - { - size, err := m.TypeChecking.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } + if m.Path != nil { + i -= len(*m.Path) + copy(dAtA[i:], *m.Path) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Path))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } - i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0x12 + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { +func (m *TypeChecking) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1944,20 +2213,20 @@ func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingWebhook) MarshalTo(dAtA []byte) (int, error) { +func (m *TypeChecking) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TypeChecking) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.MatchConditions) > 0 { - for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + if len(m.ExpressionWarnings) > 0 { + for iNdEx := len(m.ExpressionWarnings) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ExpressionWarnings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1965,84 +2234,44 @@ func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x5a - } - } - if m.ObjectSelector != nil { - { - size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + dAtA[i] = 0xa } - i-- - dAtA[i] = 0x52 } - if m.MatchPolicy != nil { - i -= len(*m.MatchPolicy) - copy(dAtA[i:], *m.MatchPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) - i-- - dAtA[i] = 0x4a + return len(dAtA) - i, nil +} + +func (m *ValidatingAdmissionPolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if len(m.AdmissionReviewVersions) > 0 { - for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.AdmissionReviewVersions[iNdEx]) - copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) - i-- - dAtA[i] = 0x42 - } - } - if m.TimeoutSeconds != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) - i-- - dAtA[i] = 0x38 - } - if m.SideEffects != nil { - i -= len(*m.SideEffects) - copy(dAtA[i:], *m.SideEffects) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) - i-- - dAtA[i] = 0x32 - } - if m.NamespaceSelector != nil { - { - size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if m.FailurePolicy != nil { - i -= len(*m.FailurePolicy) - copy(dAtA[i:], *m.FailurePolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) - i-- - dAtA[i] = 0x22 - } - if len(m.Rules) > 0 { - for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a + return dAtA[:n], nil +} + +func (m *ValidatingAdmissionPolicy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x1a { - size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2051,15 +2280,20 @@ func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2069,30 +2303,26 @@ func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBinding) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Webhooks) > 0 { - for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -2106,7 +2336,7 @@ func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2116,12 +2346,12 @@ func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *ValidatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2153,7 +2383,7 @@ func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) ( return len(dAtA) - i, nil } -func (m *Validation) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2163,42 +2393,58 @@ func (m *Validation) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Validation) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Validation) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.MessageExpression) - copy(dAtA[i:], m.MessageExpression) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.MessageExpression))) - i-- - dAtA[i] = 0x22 - if m.Reason != nil { - i -= len(*m.Reason) - copy(dAtA[i:], *m.Reason) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Reason))) + if len(m.ValidationActions) > 0 { + for iNdEx := len(m.ValidationActions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ValidationActions[iNdEx]) + copy(dAtA[i:], m.ValidationActions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ValidationActions[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if m.MatchResources != nil { + { + size, err := m.MatchResources.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x1a } - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x12 - i -= len(m.Expression) - copy(dAtA[i:], m.Expression) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + if m.ParamRef != nil { + { + size, err := m.ParamRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.PolicyName) + copy(dAtA[i:], m.PolicyName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PolicyName))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *Variable) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2208,30 +2454,44 @@ func (m *Variable) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Variable) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Variable) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.Expression) - copy(dAtA[i:], m.Expression) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) - i-- - dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2241,335 +2501,636 @@ func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *WebhookClientConfig) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicySpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *WebhookClientConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.URL != nil { - i -= len(*m.URL) - copy(dAtA[i:], *m.URL) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.URL))) - i-- - dAtA[i] = 0x1a - } - if m.CABundle != nil { - i -= len(m.CABundle) - copy(dAtA[i:], m.CABundle) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.CABundle))) - i-- - dAtA[i] = 0x12 - } - if m.Service != nil { - { - size, err := m.Service.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Variables) > 0 { + for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x3a } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ } - dAtA[offset] = uint8(v) - return base -} -func (m *AuditAnnotation) Size() (n int) { - if m == nil { - return 0 + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - var l int - _ = l - l = len(m.Key) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.ValueExpression) - n += 1 + l + sovGenerated(uint64(l)) - return n + if len(m.AuditAnnotations) > 0 { + for iNdEx := len(m.AuditAnnotations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AuditAnnotations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + } + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 + } + if len(m.Validations) > 0 { + for iNdEx := len(m.Validations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Validations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.MatchConstraints != nil { + { + size, err := m.MatchConstraints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.ParamKind != nil { + { + size, err := m.ParamKind.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *ExpressionWarning) Size() (n int) { - if m == nil { - return 0 +func (m *ValidatingAdmissionPolicyStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - l = len(m.FieldRef) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Warning) - n += 1 + l + sovGenerated(uint64(l)) - return n + return dAtA[:n], nil } -func (m *MatchCondition) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Expression) - n += 1 + l + sovGenerated(uint64(l)) - return n +func (m *ValidatingAdmissionPolicyStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MatchResources) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingAdmissionPolicyStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.NamespaceSelector != nil { - l = m.NamespaceSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.ObjectSelector != nil { - l = m.ObjectSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.ResourceRules) > 0 { - for _, e := range m.ResourceRules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - if len(m.ExcludeResourceRules) > 0 { - for _, e := range m.ExcludeResourceRules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.TypeChecking != nil { + { + size, err := m.TypeChecking.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.MatchPolicy != nil { - l = len(*m.MatchPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - return n + i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil } -func (m *MutatingWebhook) Size() (n int) { - if m == nil { - return 0 +func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ValidatingWebhook) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = m.ClientConfig.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Rules) > 0 { - for _, e := range m.Rules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a } } - if m.FailurePolicy != nil { - l = len(*m.FailurePolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.NamespaceSelector != nil { - l = m.NamespaceSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.SideEffects != nil { - l = len(*m.SideEffects) - n += 1 + l + sovGenerated(uint64(l)) + if m.ObjectSelector != nil { + { + size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 } - if m.TimeoutSeconds != nil { - n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) + if m.MatchPolicy != nil { + i -= len(*m.MatchPolicy) + copy(dAtA[i:], *m.MatchPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) + i-- + dAtA[i] = 0x4a } if len(m.AdmissionReviewVersions) > 0 { - for _, s := range m.AdmissionReviewVersions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) + for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AdmissionReviewVersions[iNdEx]) + copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) + i-- + dAtA[i] = 0x42 } } - if m.MatchPolicy != nil { - l = len(*m.MatchPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.ReinvocationPolicy != nil { - l = len(*m.ReinvocationPolicy) - n += 1 + l + sovGenerated(uint64(l)) + if m.TimeoutSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) + i-- + dAtA[i] = 0x38 } - if m.ObjectSelector != nil { - l = m.ObjectSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.SideEffects != nil { + i -= len(*m.SideEffects) + copy(dAtA[i:], *m.SideEffects) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) + i-- + dAtA[i] = 0x32 } - if len(m.MatchConditions) > 0 { - for _, e := range m.MatchConditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.NamespaceSelector != nil { + { + size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } - return n -} - -func (m *MutatingWebhookConfiguration) Size() (n int) { - if m == nil { - return 0 + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Webhooks) > 0 { - for _, e := range m.Webhooks { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - return n -} - -func (m *MutatingWebhookConfigurationList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + { + size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - return n + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *NamedRuleWithOperations) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ResourceNames) > 0 { - for _, s := range m.ResourceNames { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } +func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - l = m.RuleWithOperations.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n + return dAtA[:n], nil } -func (m *ParamKind) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.APIVersion) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Kind) - n += 1 + l + sovGenerated(uint64(l)) - return n +func (m *ValidatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ParamRef) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - if m.Selector != nil { - l = m.Selector.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Webhooks) > 0 { + for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if m.ParameterNotFoundAction != nil { - l = len(*m.ParameterNotFoundAction) - n += 1 + l + sovGenerated(uint64(l)) + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - return n + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *ServiceReference) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - if m.Path != nil { - l = len(*m.Path) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.Port != nil { - n += 1 + sovGenerated(uint64(*m.Port)) +func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *TypeChecking) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.ExpressionWarnings) > 0 { - for _, e := range m.ExpressionWarnings { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } } - return n + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicy) Size() (n int) { - if m == nil { - return 0 +func (m *Validation) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n + return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBinding) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() +func (m *Validation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Validation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.MessageExpression) + copy(dAtA[i:], m.MessageExpression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.MessageExpression))) + i-- + dAtA[i] = 0x22 + if m.Reason != nil { + i -= len(*m.Reason) + copy(dAtA[i:], *m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Reason))) + i-- + dAtA[i] = 0x1a + } + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x12 + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Variable) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Variable) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Variable) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WebhookClientConfig) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WebhookClientConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.URL != nil { + i -= len(*m.URL) + copy(dAtA[i:], *m.URL) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.URL))) + i-- + dAtA[i] = 0x1a + } + if m.CABundle != nil { + i -= len(m.CABundle) + copy(dAtA[i:], m.CABundle) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CABundle))) + i-- + dAtA[i] = 0x12 + } + if m.Service != nil { + { + size, err := m.Service.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ApplyConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *AuditAnnotation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ValueExpression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ExpressionWarning) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FieldRef) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Warning) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *JSONPatch) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MatchCondition) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MatchResources) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ObjectSelector != nil { + l = m.ObjectSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ResourceRules) > 0 { + for _, e := range m.ResourceRules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.ExcludeResourceRules) > 0 { + for _, e := range m.ExcludeResourceRules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchPolicy != nil { + l = len(*m.MatchPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *MutatingAdmissionPolicy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() n += 1 + l + sovGenerated(uint64(l)) l = m.Spec.Size() n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *ValidatingAdmissionPolicyBindingList) Size() (n int) { +func (m *MutatingAdmissionPolicyBinding) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MutatingAdmissionPolicyBindingList) Size() (n int) { if m == nil { return 0 } @@ -2586,7 +3147,7 @@ func (m *ValidatingAdmissionPolicyBindingList) Size() (n int) { return n } -func (m *ValidatingAdmissionPolicyBindingSpec) Size() (n int) { +func (m *MutatingAdmissionPolicyBindingSpec) Size() (n int) { if m == nil { return 0 } @@ -2602,16 +3163,10 @@ func (m *ValidatingAdmissionPolicyBindingSpec) Size() (n int) { l = m.MatchResources.Size() n += 1 + l + sovGenerated(uint64(l)) } - if len(m.ValidationActions) > 0 { - for _, s := range m.ValidationActions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } -func (m *ValidatingAdmissionPolicyList) Size() (n int) { +func (m *MutatingAdmissionPolicyList) Size() (n int) { if m == nil { return 0 } @@ -2628,7 +3183,7 @@ func (m *ValidatingAdmissionPolicyList) Size() (n int) { return n } -func (m *ValidatingAdmissionPolicySpec) Size() (n int) { +func (m *MutatingAdmissionPolicySpec) Size() (n int) { if m == nil { return 0 } @@ -2642,8 +3197,14 @@ func (m *ValidatingAdmissionPolicySpec) Size() (n int) { l = m.MatchConstraints.Size() n += 1 + l + sovGenerated(uint64(l)) } - if len(m.Validations) > 0 { - for _, e := range m.Validations { + if len(m.Variables) > 0 { + for _, e := range m.Variables { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Mutations) > 0 { + for _, e := range m.Mutations { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -2652,48 +3213,18 @@ func (m *ValidatingAdmissionPolicySpec) Size() (n int) { l = len(*m.FailurePolicy) n += 1 + l + sovGenerated(uint64(l)) } - if len(m.AuditAnnotations) > 0 { - for _, e := range m.AuditAnnotations { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } if len(m.MatchConditions) > 0 { for _, e := range m.MatchConditions { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } } - if len(m.Variables) > 0 { - for _, e := range m.Variables { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ValidatingAdmissionPolicyStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += 1 + sovGenerated(uint64(m.ObservedGeneration)) - if m.TypeChecking != nil { - l = m.TypeChecking.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.Conditions) > 0 { - for _, e := range m.Conditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } + l = len(m.ReinvocationPolicy) + n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *ValidatingWebhook) Size() (n int) { +func (m *MutatingWebhook) Size() (n int) { if m == nil { return 0 } @@ -2734,6 +3265,10 @@ func (m *ValidatingWebhook) Size() (n int) { l = len(*m.MatchPolicy) n += 1 + l + sovGenerated(uint64(l)) } + if m.ReinvocationPolicy != nil { + l = len(*m.ReinvocationPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } if m.ObjectSelector != nil { l = m.ObjectSelector.Size() n += 1 + l + sovGenerated(uint64(l)) @@ -2747,7 +3282,7 @@ func (m *ValidatingWebhook) Size() (n int) { return n } -func (m *ValidatingWebhookConfiguration) Size() (n int) { +func (m *MutatingWebhookConfiguration) Size() (n int) { if m == nil { return 0 } @@ -2764,7 +3299,7 @@ func (m *ValidatingWebhookConfiguration) Size() (n int) { return n } -func (m *ValidatingWebhookConfigurationList) Size() (n int) { +func (m *MutatingWebhookConfigurationList) Size() (n int) { if m == nil { return 0 } @@ -2781,476 +3316,1911 @@ func (m *ValidatingWebhookConfigurationList) Size() (n int) { return n } -func (m *Validation) Size() (n int) { +func (m *Mutation) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Expression) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Message) + l = len(m.PatchType) n += 1 + l + sovGenerated(uint64(l)) - if m.Reason != nil { - l = len(*m.Reason) + if m.ApplyConfiguration != nil { + l = m.ApplyConfiguration.Size() n += 1 + l + sovGenerated(uint64(l)) } - l = len(m.MessageExpression) + if m.JSONPatch != nil { + l = m.JSONPatch.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *NamedRuleWithOperations) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ResourceNames) > 0 { + for _, s := range m.ResourceNames { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.RuleWithOperations.Size() n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *Variable) Size() (n int) { +func (m *ParamKind) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) + l = len(m.APIVersion) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Expression) + l = len(m.Kind) n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *WebhookClientConfig) Size() (n int) { +func (m *ParamRef) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Service != nil { - l = m.Service.Size() + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() n += 1 + l + sovGenerated(uint64(l)) } - if m.CABundle != nil { - l = len(m.CABundle) + if m.ParameterNotFoundAction != nil { + l = len(*m.ParameterNotFoundAction) n += 1 + l + sovGenerated(uint64(l)) } - if m.URL != nil { - l = len(*m.URL) + return n +} + +func (m *ServiceReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Path != nil { + l = len(*m.Path) n += 1 + l + sovGenerated(uint64(l)) } + if m.Port != nil { + n += 1 + sovGenerated(uint64(*m.Port)) + } return n } -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +func (m *TypeChecking) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ExpressionWarnings) > 0 { + for _, e := range m.ExpressionWarnings { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n } -func (this *AuditAnnotation) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicy) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&AuditAnnotation{`, - `Key:` + fmt.Sprintf("%v", this.Key) + `,`, - `ValueExpression:` + fmt.Sprintf("%v", this.ValueExpression) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n } -func (this *ExpressionWarning) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyBinding) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&ExpressionWarning{`, - `FieldRef:` + fmt.Sprintf("%v", this.FieldRef) + `,`, - `Warning:` + fmt.Sprintf("%v", this.Warning) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n } -func (this *MatchCondition) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyBindingList) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&MatchCondition{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n } -func (this *MatchResources) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyBindingSpec) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForResourceRules := "[]NamedRuleWithOperations{" - for _, f := range this.ResourceRules { - repeatedStringForResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + var l int + _ = l + l = len(m.PolicyName) + n += 1 + l + sovGenerated(uint64(l)) + if m.ParamRef != nil { + l = m.ParamRef.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForResourceRules += "}" - repeatedStringForExcludeResourceRules := "[]NamedRuleWithOperations{" - for _, f := range this.ExcludeResourceRules { - repeatedStringForExcludeResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + if m.MatchResources != nil { + l = m.MatchResources.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForExcludeResourceRules += "}" - s := strings.Join([]string{`&MatchResources{`, - `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `ResourceRules:` + repeatedStringForResourceRules + `,`, - `ExcludeResourceRules:` + repeatedStringForExcludeResourceRules + `,`, - `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, - `}`, - }, "") - return s + if len(m.ValidationActions) > 0 { + for _, s := range m.ValidationActions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n } -func (this *MutatingWebhook) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyList) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForRules := "[]RuleWithOperations{" - for _, f := range this.Rules { - repeatedStringForRules += fmt.Sprintf("%v", f) + "," + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForRules += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," - } - repeatedStringForMatchConditions += "}" - s := strings.Join([]string{`&MutatingWebhook{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, - `Rules:` + repeatedStringForRules + `,`, - `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, - `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, - `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, - `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, - `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, - `ReinvocationPolicy:` + valueToStringGenerated(this.ReinvocationPolicy) + `,`, - `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `MatchConditions:` + repeatedStringForMatchConditions + `,`, - `}`, - }, "") - return s + return n } -func (this *MutatingWebhookConfiguration) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicySpec) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForWebhooks := "[]MutatingWebhook{" - for _, f := range this.Webhooks { - repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "MutatingWebhook", "MutatingWebhook", 1), `&`, ``, 1) + "," + var l int + _ = l + if m.ParamKind != nil { + l = m.ParamKind.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForWebhooks += "}" - s := strings.Join([]string{`&MutatingWebhookConfiguration{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Webhooks:` + repeatedStringForWebhooks + `,`, - `}`, - }, "") - return s -} -func (this *MutatingWebhookConfigurationList) String() string { - if this == nil { - return "nil" + if m.MatchConstraints != nil { + l = m.MatchConstraints.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForItems := "[]MutatingWebhookConfiguration{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingWebhookConfiguration", "MutatingWebhookConfiguration", 1), `&`, ``, 1) + "," + if len(m.Validations) > 0 { + for _, e := range m.Validations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForItems += "}" - s := strings.Join([]string{`&MutatingWebhookConfigurationList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *NamedRuleWithOperations) String() string { - if this == nil { - return "nil" + if m.FailurePolicy != nil { + l = len(*m.FailurePolicy) + n += 1 + l + sovGenerated(uint64(l)) } - s := strings.Join([]string{`&NamedRuleWithOperations{`, - `ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`, - `RuleWithOperations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuleWithOperations), "RuleWithOperations", "v11.RuleWithOperations", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ParamKind) String() string { - if this == nil { - return "nil" + if len(m.AuditAnnotations) > 0 { + for _, e := range m.AuditAnnotations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ParamKind{`, - `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, - `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, - `}`, - }, "") - return s -} -func (this *ParamRef) String() string { - if this == nil { - return "nil" + if len(m.MatchConditions) > 0 { + for _, e := range m.MatchConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ParamRef{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `ParameterNotFoundAction:` + valueToStringGenerated(this.ParameterNotFoundAction) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceReference) String() string { - if this == nil { - return "nil" + if len(m.Variables) > 0 { + for _, e := range m.Variables { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ServiceReference{`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Path:` + valueToStringGenerated(this.Path) + `,`, - `Port:` + valueToStringGenerated(this.Port) + `,`, - `}`, - }, "") - return s + return n } -func (this *TypeChecking) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyStatus) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForExpressionWarnings := "[]ExpressionWarning{" - for _, f := range this.ExpressionWarnings { - repeatedStringForExpressionWarnings += strings.Replace(strings.Replace(f.String(), "ExpressionWarning", "ExpressionWarning", 1), `&`, ``, 1) + "," + var l int + _ = l + n += 1 + sovGenerated(uint64(m.ObservedGeneration)) + if m.TypeChecking != nil { + l = m.TypeChecking.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForExpressionWarnings += "}" - s := strings.Join([]string{`&TypeChecking{`, - `ExpressionWarnings:` + repeatedStringForExpressionWarnings + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicy) String() string { - if this == nil { - return "nil" + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ValidatingAdmissionPolicy{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicySpec", "ValidatingAdmissionPolicySpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ValidatingAdmissionPolicyStatus", "ValidatingAdmissionPolicyStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s + return n } -func (this *ValidatingAdmissionPolicyBinding) String() string { - if this == nil { - return "nil" + +func (m *ValidatingWebhook) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&ValidatingAdmissionPolicyBinding{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicyBindingSpec", "ValidatingAdmissionPolicyBindingSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicyBindingList) String() string { - if this == nil { - return "nil" + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = m.ClientConfig.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForItems := "[]ValidatingAdmissionPolicyBinding{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicyBinding", "ValidatingAdmissionPolicyBinding", 1), `&`, ``, 1) + "," + if m.FailurePolicy != nil { + l = len(*m.FailurePolicy) + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicyBindingSpec) String() string { - if this == nil { - return "nil" + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) } - s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingSpec{`, - `PolicyName:` + fmt.Sprintf("%v", this.PolicyName) + `,`, - `ParamRef:` + strings.Replace(this.ParamRef.String(), "ParamRef", "ParamRef", 1) + `,`, - `MatchResources:` + strings.Replace(this.MatchResources.String(), "MatchResources", "MatchResources", 1) + `,`, - `ValidationActions:` + fmt.Sprintf("%v", this.ValidationActions) + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicyList) String() string { - if this == nil { - return "nil" + if m.SideEffects != nil { + l = len(*m.SideEffects) + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForItems := "[]ValidatingAdmissionPolicy{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicy", "ValidatingAdmissionPolicy", 1), `&`, ``, 1) + "," + if m.TimeoutSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicyList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicySpec) String() string { - if this == nil { - return "nil" + if len(m.AdmissionReviewVersions) > 0 { + for _, s := range m.AdmissionReviewVersions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForValidations := "[]Validation{" - for _, f := range this.Validations { - repeatedStringForValidations += strings.Replace(strings.Replace(f.String(), "Validation", "Validation", 1), `&`, ``, 1) + "," + if m.MatchPolicy != nil { + l = len(*m.MatchPolicy) + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForValidations += "}" - repeatedStringForAuditAnnotations := "[]AuditAnnotation{" - for _, f := range this.AuditAnnotations { - repeatedStringForAuditAnnotations += strings.Replace(strings.Replace(f.String(), "AuditAnnotation", "AuditAnnotation", 1), `&`, ``, 1) + "," + if m.ObjectSelector != nil { + l = m.ObjectSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForAuditAnnotations += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + if len(m.MatchConditions) > 0 { + for _, e := range m.MatchConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForMatchConditions += "}" - repeatedStringForVariables := "[]Variable{" - for _, f := range this.Variables { - repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + return n +} + +func (m *ValidatingWebhookConfiguration) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForVariables += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicySpec{`, - `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, - `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, - `Validations:` + repeatedStringForValidations + `,`, - `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, - `AuditAnnotations:` + repeatedStringForAuditAnnotations + `,`, - `MatchConditions:` + repeatedStringForMatchConditions + `,`, - `Variables:` + repeatedStringForVariables + `,`, + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Webhooks) > 0 { + for _, e := range m.Webhooks { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingWebhookConfigurationList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *Validation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + if m.Reason != nil { + l = len(*m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.MessageExpression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *Variable) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *WebhookClientConfig) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Service != nil { + l = m.Service.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.CABundle != nil { + l = len(m.CABundle) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.URL != nil { + l = len(*m.URL) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *ApplyConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ApplyConfiguration{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, `}`, }, "") return s } -func (this *ValidatingAdmissionPolicyStatus) String() string { +func (this *AuditAnnotation) String() string { if this == nil { return "nil" } - repeatedStringForConditions := "[]Condition{" - for _, f := range this.Conditions { - repeatedStringForConditions += fmt.Sprintf("%v", f) + "," - } - repeatedStringForConditions += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicyStatus{`, - `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, - `TypeChecking:` + strings.Replace(this.TypeChecking.String(), "TypeChecking", "TypeChecking", 1) + `,`, - `Conditions:` + repeatedStringForConditions + `,`, + s := strings.Join([]string{`&AuditAnnotation{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `ValueExpression:` + fmt.Sprintf("%v", this.ValueExpression) + `,`, `}`, }, "") return s } -func (this *ValidatingWebhook) String() string { +func (this *ExpressionWarning) String() string { if this == nil { return "nil" } - repeatedStringForRules := "[]RuleWithOperations{" - for _, f := range this.Rules { - repeatedStringForRules += fmt.Sprintf("%v", f) + "," + s := strings.Join([]string{`&ExpressionWarning{`, + `FieldRef:` + fmt.Sprintf("%v", this.FieldRef) + `,`, + `Warning:` + fmt.Sprintf("%v", this.Warning) + `,`, + `}`, + }, "") + return s +} +func (this *JSONPatch) String() string { + if this == nil { + return "nil" } - repeatedStringForRules += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + s := strings.Join([]string{`&JSONPatch{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *MatchCondition) String() string { + if this == nil { + return "nil" } - repeatedStringForMatchConditions += "}" - s := strings.Join([]string{`&ValidatingWebhook{`, + s := strings.Join([]string{`&MatchCondition{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, - `Rules:` + repeatedStringForRules + `,`, - `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *MatchResources) String() string { + if this == nil { + return "nil" + } + repeatedStringForResourceRules := "[]NamedRuleWithOperations{" + for _, f := range this.ResourceRules { + repeatedStringForResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + } + repeatedStringForResourceRules += "}" + repeatedStringForExcludeResourceRules := "[]NamedRuleWithOperations{" + for _, f := range this.ExcludeResourceRules { + repeatedStringForExcludeResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + } + repeatedStringForExcludeResourceRules += "}" + s := strings.Join([]string{`&MatchResources{`, `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, - `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, - `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, - `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `ResourceRules:` + repeatedStringForResourceRules + `,`, + `ExcludeResourceRules:` + repeatedStringForExcludeResourceRules + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, `}`, }, "") return s } -func (this *ValidatingWebhookConfiguration) String() string { +func (this *MutatingAdmissionPolicy) String() string { if this == nil { return "nil" } - repeatedStringForWebhooks := "[]ValidatingWebhook{" - for _, f := range this.Webhooks { - repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "ValidatingWebhook", "ValidatingWebhook", 1), `&`, ``, 1) + "," + s := strings.Join([]string{`&MutatingAdmissionPolicy{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "MutatingAdmissionPolicySpec", "MutatingAdmissionPolicySpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *MutatingAdmissionPolicyBinding) String() string { + if this == nil { + return "nil" } - repeatedStringForWebhooks += "}" - s := strings.Join([]string{`&ValidatingWebhookConfiguration{`, + s := strings.Join([]string{`&MutatingAdmissionPolicyBinding{`, `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Webhooks:` + repeatedStringForWebhooks + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "MutatingAdmissionPolicyBindingSpec", "MutatingAdmissionPolicyBindingSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") return s } -func (this *ValidatingWebhookConfigurationList) String() string { +func (this *MutatingAdmissionPolicyBindingList) String() string { if this == nil { return "nil" } - repeatedStringForItems := "[]ValidatingWebhookConfiguration{" + repeatedStringForItems := "[]MutatingAdmissionPolicyBinding{" for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingWebhookConfiguration", "ValidatingWebhookConfiguration", 1), `&`, ``, 1) + "," + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingAdmissionPolicyBinding", "MutatingAdmissionPolicyBinding", 1), `&`, ``, 1) + "," } repeatedStringForItems += "}" - s := strings.Join([]string{`&ValidatingWebhookConfigurationList{`, + s := strings.Join([]string{`&MutatingAdmissionPolicyBindingList{`, `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") return s } -func (this *Validation) String() string { +func (this *MutatingAdmissionPolicyBindingSpec) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&Validation{`, - `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, - `Message:` + fmt.Sprintf("%v", this.Message) + `,`, - `Reason:` + valueToStringGenerated(this.Reason) + `,`, - `MessageExpression:` + fmt.Sprintf("%v", this.MessageExpression) + `,`, + s := strings.Join([]string{`&MutatingAdmissionPolicyBindingSpec{`, + `PolicyName:` + fmt.Sprintf("%v", this.PolicyName) + `,`, + `ParamRef:` + strings.Replace(this.ParamRef.String(), "ParamRef", "ParamRef", 1) + `,`, + `MatchResources:` + strings.Replace(this.MatchResources.String(), "MatchResources", "MatchResources", 1) + `,`, `}`, }, "") return s } -func (this *Variable) String() string { +func (this *MutatingAdmissionPolicyList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]MutatingAdmissionPolicy{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingAdmissionPolicy", "MutatingAdmissionPolicy", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&MutatingAdmissionPolicyList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *MutatingAdmissionPolicySpec) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&Variable{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, - `}`, - }, "") - return s -} -func (this *WebhookClientConfig) String() string { - if this == nil { - return "nil" + repeatedStringForVariables := "[]Variable{" + for _, f := range this.Variables { + repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + } + repeatedStringForVariables += "}" + repeatedStringForMutations := "[]Mutation{" + for _, f := range this.Mutations { + repeatedStringForMutations += strings.Replace(strings.Replace(f.String(), "Mutation", "Mutation", 1), `&`, ``, 1) + "," + } + repeatedStringForMutations += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&MutatingAdmissionPolicySpec{`, + `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, + `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, + `Variables:` + repeatedStringForVariables + `,`, + `Mutations:` + repeatedStringForMutations + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `ReinvocationPolicy:` + fmt.Sprintf("%v", this.ReinvocationPolicy) + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhook) String() string { + if this == nil { + return "nil" + } + repeatedStringForRules := "[]RuleWithOperations{" + for _, f := range this.Rules { + repeatedStringForRules += fmt.Sprintf("%v", f) + "," + } + repeatedStringForRules += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&MutatingWebhook{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, + `Rules:` + repeatedStringForRules + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, + `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, + `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, + `ReinvocationPolicy:` + valueToStringGenerated(this.ReinvocationPolicy) + `,`, + `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhookConfiguration) String() string { + if this == nil { + return "nil" + } + repeatedStringForWebhooks := "[]MutatingWebhook{" + for _, f := range this.Webhooks { + repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "MutatingWebhook", "MutatingWebhook", 1), `&`, ``, 1) + "," + } + repeatedStringForWebhooks += "}" + s := strings.Join([]string{`&MutatingWebhookConfiguration{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Webhooks:` + repeatedStringForWebhooks + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhookConfigurationList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]MutatingWebhookConfiguration{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingWebhookConfiguration", "MutatingWebhookConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&MutatingWebhookConfigurationList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *Mutation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Mutation{`, + `PatchType:` + fmt.Sprintf("%v", this.PatchType) + `,`, + `ApplyConfiguration:` + strings.Replace(this.ApplyConfiguration.String(), "ApplyConfiguration", "ApplyConfiguration", 1) + `,`, + `JSONPatch:` + strings.Replace(this.JSONPatch.String(), "JSONPatch", "JSONPatch", 1) + `,`, + `}`, + }, "") + return s +} +func (this *NamedRuleWithOperations) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NamedRuleWithOperations{`, + `ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`, + `RuleWithOperations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuleWithOperations), "RuleWithOperations", "v11.RuleWithOperations", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ParamKind) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ParamKind{`, + `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `}`, + }, "") + return s +} +func (this *ParamRef) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ParamRef{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `ParameterNotFoundAction:` + valueToStringGenerated(this.ParameterNotFoundAction) + `,`, + `}`, + }, "") + return s +} +func (this *ServiceReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ServiceReference{`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Path:` + valueToStringGenerated(this.Path) + `,`, + `Port:` + valueToStringGenerated(this.Port) + `,`, + `}`, + }, "") + return s +} +func (this *TypeChecking) String() string { + if this == nil { + return "nil" + } + repeatedStringForExpressionWarnings := "[]ExpressionWarning{" + for _, f := range this.ExpressionWarnings { + repeatedStringForExpressionWarnings += strings.Replace(strings.Replace(f.String(), "ExpressionWarning", "ExpressionWarning", 1), `&`, ``, 1) + "," + } + repeatedStringForExpressionWarnings += "}" + s := strings.Join([]string{`&TypeChecking{`, + `ExpressionWarnings:` + repeatedStringForExpressionWarnings + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicy{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicySpec", "ValidatingAdmissionPolicySpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ValidatingAdmissionPolicyStatus", "ValidatingAdmissionPolicyStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBinding) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicyBinding{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicyBindingSpec", "ValidatingAdmissionPolicyBindingSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBindingList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingAdmissionPolicyBinding{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicyBinding", "ValidatingAdmissionPolicyBinding", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBindingSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingSpec{`, + `PolicyName:` + fmt.Sprintf("%v", this.PolicyName) + `,`, + `ParamRef:` + strings.Replace(this.ParamRef.String(), "ParamRef", "ParamRef", 1) + `,`, + `MatchResources:` + strings.Replace(this.MatchResources.String(), "MatchResources", "MatchResources", 1) + `,`, + `ValidationActions:` + fmt.Sprintf("%v", this.ValidationActions) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingAdmissionPolicy{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicy", "ValidatingAdmissionPolicy", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicySpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForValidations := "[]Validation{" + for _, f := range this.Validations { + repeatedStringForValidations += strings.Replace(strings.Replace(f.String(), "Validation", "Validation", 1), `&`, ``, 1) + "," + } + repeatedStringForValidations += "}" + repeatedStringForAuditAnnotations := "[]AuditAnnotation{" + for _, f := range this.AuditAnnotations { + repeatedStringForAuditAnnotations += strings.Replace(strings.Replace(f.String(), "AuditAnnotation", "AuditAnnotation", 1), `&`, ``, 1) + "," + } + repeatedStringForAuditAnnotations += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + repeatedStringForVariables := "[]Variable{" + for _, f := range this.Variables { + repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + } + repeatedStringForVariables += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicySpec{`, + `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, + `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, + `Validations:` + repeatedStringForValidations + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `AuditAnnotations:` + repeatedStringForAuditAnnotations + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `Variables:` + repeatedStringForVariables + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyStatus{`, + `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, + `TypeChecking:` + strings.Replace(this.TypeChecking.String(), "TypeChecking", "TypeChecking", 1) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhook) String() string { + if this == nil { + return "nil" + } + repeatedStringForRules := "[]RuleWithOperations{" + for _, f := range this.Rules { + repeatedStringForRules += fmt.Sprintf("%v", f) + "," + } + repeatedStringForRules += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&ValidatingWebhook{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, + `Rules:` + repeatedStringForRules + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, + `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, + `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, + `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhookConfiguration) String() string { + if this == nil { + return "nil" + } + repeatedStringForWebhooks := "[]ValidatingWebhook{" + for _, f := range this.Webhooks { + repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "ValidatingWebhook", "ValidatingWebhook", 1), `&`, ``, 1) + "," + } + repeatedStringForWebhooks += "}" + s := strings.Join([]string{`&ValidatingWebhookConfiguration{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Webhooks:` + repeatedStringForWebhooks + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhookConfigurationList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingWebhookConfiguration{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingWebhookConfiguration", "ValidatingWebhookConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingWebhookConfigurationList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *Validation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Validation{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `Reason:` + valueToStringGenerated(this.Reason) + `,`, + `MessageExpression:` + fmt.Sprintf("%v", this.MessageExpression) + `,`, + `}`, + }, "") + return s +} +func (this *Variable) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Variable{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *WebhookClientConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&WebhookClientConfig{`, + `Service:` + strings.Replace(this.Service.String(), "ServiceReference", "ServiceReference", 1) + `,`, + `CABundle:` + valueToStringGenerated(this.CABundle) + `,`, + `URL:` + valueToStringGenerated(this.URL) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *ApplyConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplyConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplyConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuditAnnotation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuditAnnotation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValueExpression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValueExpression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExpressionWarning: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExpressionWarning: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FieldRef = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Warning", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Warning = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *JSONPatch) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: JSONPatch: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: JSONPatch: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MatchCondition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MatchCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MatchCondition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MatchResources) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MatchResources: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MatchResources: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NamespaceSelector == nil { + m.NamespaceSelector = &v1.LabelSelector{} + } + if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ObjectSelector == nil { + m.ObjectSelector = &v1.LabelSelector{} + } + if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceRules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceRules = append(m.ResourceRules, NamedRuleWithOperations{}) + if err := m.ResourceRules[len(m.ResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExcludeResourceRules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExcludeResourceRules = append(m.ExcludeResourceRules, NamedRuleWithOperations{}) + if err := m.ExcludeResourceRules[len(m.ExcludeResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := MatchPolicyType(dAtA[iNdEx:postIndex]) + m.MatchPolicy = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MutatingAdmissionPolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MutatingAdmissionPolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MutatingAdmissionPolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF } - s := strings.Join([]string{`&WebhookClientConfig{`, - `Service:` + strings.Replace(this.Service.String(), "ServiceReference", "ServiceReference", 1) + `,`, - `CABundle:` + valueToStringGenerated(this.CABundle) + `,`, - `URL:` + valueToStringGenerated(this.URL) + `,`, - `}`, - }, "") - return s + return nil } -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" +func (m *MutatingAdmissionPolicyBinding) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MutatingAdmissionPolicyBinding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MutatingAdmissionPolicyBinding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil } -func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicyBindingList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3273,17 +5243,17 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AuditAnnotation: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AuditAnnotation: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3293,29 +5263,30 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = string(dAtA[iNdEx:postIndex]) + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValueExpression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3325,23 +5296,25 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.ValueExpression = string(dAtA[iNdEx:postIndex]) + m.Items = append(m.Items, MutatingAdmissionPolicyBinding{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -3364,7 +5337,7 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { } return nil } -func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicyBindingSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3387,15 +5360,15 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExpressionWarning: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingSpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExpressionWarning: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingSpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 2: + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PolicyName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3423,13 +5396,49 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.FieldRef = string(dAtA[iNdEx:postIndex]) + m.PolicyName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ParamRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ParamRef == nil { + m.ParamRef = &ParamRef{} + } + if err := m.ParamRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Warning", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MatchResources", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3439,23 +5448,27 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Warning = string(dAtA[iNdEx:postIndex]) + if m.MatchResources == nil { + m.MatchResources = &MatchResources{} + } + if err := m.MatchResources.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -3478,7 +5491,7 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { } return nil } -func (m *MatchCondition) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicyList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3501,17 +5514,17 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MatchCondition: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicyList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MatchCondition: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicyList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3521,29 +5534,30 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3553,23 +5567,25 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Expression = string(dAtA[iNdEx:postIndex]) + m.Items = append(m.Items, MutatingAdmissionPolicy{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -3592,7 +5608,7 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } return nil } -func (m *MatchResources) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicySpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3615,15 +5631,15 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MatchResources: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicySpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MatchResources: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicySpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ParamKind", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3650,16 +5666,16 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.NamespaceSelector == nil { - m.NamespaceSelector = &v1.LabelSelector{} + if m.ParamKind == nil { + m.ParamKind = &ParamKind{} } - if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ParamKind.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MatchConstraints", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3686,16 +5702,16 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ObjectSelector == nil { - m.ObjectSelector = &v1.LabelSelector{} + if m.MatchConstraints == nil { + m.MatchConstraints = &MatchResources{} } - if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.MatchConstraints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceRules", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Variables", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3722,14 +5738,14 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResourceRules = append(m.ResourceRules, NamedRuleWithOperations{}) - if err := m.ResourceRules[len(m.ResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Variables = append(m.Variables, Variable{}) + if err := m.Variables[len(m.Variables)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExcludeResourceRules", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Mutations", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3756,14 +5772,81 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExcludeResourceRules = append(m.ExcludeResourceRules, NamedRuleWithOperations{}) - if err := m.ExcludeResourceRules[len(m.ExcludeResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Mutations = append(m.Mutations, Mutation{}) + if err := m.Mutations[len(m.Mutations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FailurePolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FailurePolicyType(dAtA[iNdEx:postIndex]) + m.FailurePolicy = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchConditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchConditions = append(m.MatchConditions, MatchCondition{}) + if err := m.MatchConditions[len(m.MatchConditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ReinvocationPolicy", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3791,8 +5874,7 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := MatchPolicyType(dAtA[iNdEx:postIndex]) - m.MatchPolicy = &s + m.ReinvocationPolicy = k8s_io_api_admissionregistration_v1.ReinvocationPolicyType(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -4160,7 +6242,7 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := ReinvocationPolicyType(dAtA[iNdEx:postIndex]) + s := k8s_io_api_admissionregistration_v1.ReinvocationPolicyType(dAtA[iNdEx:postIndex]) m.ReinvocationPolicy = &s iNdEx = postIndex case 11: @@ -4488,6 +6570,160 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { } return nil } +func (m *Mutation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Mutation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Mutation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PatchType = PatchType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ApplyConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ApplyConfiguration == nil { + m.ApplyConfiguration = &ApplyConfiguration{} + } + if err := m.ApplyConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JSONPatch", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.JSONPatch == nil { + m.JSONPatch = &JSONPatch{} + } + if err := m.JSONPatch.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NamedRuleWithOperations) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto index 30f99f64d0..fb47a20056 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto @@ -29,6 +29,51 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/admissionregistration/v1beta1"; +// ApplyConfiguration defines the desired configuration values of an object. +message ApplyConfiguration { + // expression will be evaluated by CEL to create an apply configuration. + // ref: https://github.com/google/cel-spec + // + // Apply configurations are declared in CEL using object initialization. For example, this CEL expression + // returns an apply configuration to set a single field: + // + // Object{ + // spec: Object.spec{ + // serviceAccountName: "example" + // } + // } + // + // Apply configurations may not modify atomic structs, maps or arrays due to the risk of accidental deletion of + // values not included in the apply configuration. + // + // CEL expressions have access to the object types needed to create apply configurations: + // + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // The `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the + // object. No other metadata properties are accessible. + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + optional string expression = 1; +} + // AuditAnnotation describes how to produce an audit annotation for an API request. message AuditAnnotation { // key specifies the audit annotation key. The audit annotation keys of @@ -79,6 +124,75 @@ message ExpressionWarning { optional string warning = 3; } +// JSONPatch defines a JSON Patch. +message JSONPatch { + // expression will be evaluated by CEL to create a [JSON patch](https://jsonpatch.com/). + // ref: https://github.com/google/cel-spec + // + // expression must return an array of JSONPatch values. + // + // For example, this CEL expression returns a JSON patch to conditionally modify a value: + // + // [ + // JSONPatch{op: "test", path: "/spec/example", value: "Red"}, + // JSONPatch{op: "replace", path: "/spec/example", value: "Green"} + // ] + // + // To define an object for the patch value, use Object types. For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/spec/selector", + // value: Object.spec.selector{matchLabels: {"environment": "test"}} + // } + // ] + // + // To use strings containing '/' and '~' as JSONPatch path keys, use "jsonpatch.escapeKey". For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/metadata/labels/" + jsonpatch.escapeKey("example.com/environment"), + // value: "test" + // }, + // ] + // + // CEL expressions have access to the types needed to create JSON patches and objects: + // + // - 'JSONPatch' - CEL type of JSON Patch operations. JSONPatch has the fields 'op', 'from', 'path' and 'value'. + // See [JSON patch](https://jsonpatch.com/) for more details. The 'value' field may be set to any of: string, + // integer, array, map or object. If set, the 'path' and 'from' fields must be set to a + // [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901/) string, where the 'jsonpatch.escapeKey()' CEL + // function may be used to escape path keys containing '/' and '~'. + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // CEL expressions have access to [Kubernetes CEL function libraries](https://kubernetes.io/docs/reference/using-api/cel/#cel-options-language-features-and-libraries) + // as well as: + // + // - 'jsonpatch.escapeKey' - Performs JSONPatch key escaping. '~' and '/' are escaped as '~0' and `~1' respectively). + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + optional string expression = 1; +} + // MatchCondition represents a condition which must be fulfilled for a request to be sent to a webhook. message MatchCondition { // Name is an identifier for this match condition, used for strategic merging of MatchConditions, @@ -203,6 +317,173 @@ message MatchResources { optional string matchPolicy = 7; } +// MutatingAdmissionPolicy describes the definition of an admission mutation policy that mutates the object coming into admission chain. +message MutatingAdmissionPolicy { + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the MutatingAdmissionPolicy. + optional MutatingAdmissionPolicySpec spec = 2; +} + +// MutatingAdmissionPolicyBinding binds the MutatingAdmissionPolicy with parametrized resources. +// MutatingAdmissionPolicyBinding and the optional parameter resource together define how cluster administrators +// configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// Each evaluation is constrained by a [runtime cost budget](https://kubernetes.io/docs/reference/using-api/cel/#runtime-cost-budget). +// +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. +message MutatingAdmissionPolicyBinding { + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the MutatingAdmissionPolicyBinding. + optional MutatingAdmissionPolicyBindingSpec spec = 2; +} + +// MutatingAdmissionPolicyBindingList is a list of MutatingAdmissionPolicyBinding. +message MutatingAdmissionPolicyBindingList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // List of PolicyBinding. + repeated MutatingAdmissionPolicyBinding items = 2; +} + +// MutatingAdmissionPolicyBindingSpec is the specification of the MutatingAdmissionPolicyBinding. +message MutatingAdmissionPolicyBindingSpec { + // policyName references a MutatingAdmissionPolicy name which the MutatingAdmissionPolicyBinding binds to. + // If the referenced resource does not exist, this binding is considered invalid and will be ignored + // Required. + optional string policyName = 1; + + // paramRef specifies the parameter resource used to configure the admission control policy. + // It should point to a resource of the type specified in spec.ParamKind of the bound MutatingAdmissionPolicy. + // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the MutatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. + // +optional + optional ParamRef paramRef = 2; + + // matchResources limits what resources match this binding and may be mutated by it. + // Note that if matchResources matches a resource, the resource must also match a policy's matchConstraints and + // matchConditions before the resource may be mutated. + // When matchResources is unset, it does not constrain resource matching, and only the policy's matchConstraints + // and matchConditions must match for the resource to be mutated. + // Additionally, matchResources.resourceRules are optional and do not constraint matching when unset. + // Note that this is differs from MutatingAdmissionPolicy matchConstraints, where resourceRules are required. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // +optional + optional MatchResources matchResources = 3; +} + +// MutatingAdmissionPolicyList is a list of MutatingAdmissionPolicy. +message MutatingAdmissionPolicyList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // List of ValidatingAdmissionPolicy. + repeated MutatingAdmissionPolicy items = 2; +} + +// MutatingAdmissionPolicySpec is the specification of the desired behavior of the admission policy. +message MutatingAdmissionPolicySpec { + // paramKind specifies the kind of resources used to parameterize this policy. + // If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. + // If paramKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. + // If paramKind is specified but paramRef is unset in MutatingAdmissionPolicyBinding, the params variable will be null. + // +optional + optional ParamKind paramKind = 1; + + // matchConstraints specifies what resources this policy is designed to validate. + // The MutatingAdmissionPolicy cares about a request if it matches _all_ Constraints. + // However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API + // MutatingAdmissionPolicy cannot match MutatingAdmissionPolicy and MutatingAdmissionPolicyBinding. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // Required. + optional MatchResources matchConstraints = 2; + + // variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except matchConditions because matchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, variables must be sorted by the order of first appearance and acyclic. + // +listType=atomic + // +optional + repeated Variable variables = 3; + + // mutations contain operations to perform on matching objects. + // mutations may not be empty; a minimum of one mutation is required. + // mutations are evaluated in order, and are reinvoked according to + // the reinvocationPolicy. + // The mutations of a policy are invoked for each binding of this policy + // and reinvocation of mutations occurs on a per binding basis. + // + // +listType=atomic + // +optional + repeated Mutation mutations = 4; + + // failurePolicy defines how to handle failures for the admission policy. Failures can + // occur from CEL expression parse errors, type check errors, runtime errors and invalid + // or mis-configured policy definitions or bindings. + // + // A policy is invalid if paramKind refers to a non-existent Kind. + // A binding is invalid if paramRef.name refers to a non-existent resource. + // + // failurePolicy does not define how validations that evaluate to false are handled. + // + // Allowed values are Ignore or Fail. Defaults to Fail. + // +optional + optional string failurePolicy = 5; + + // matchConditions is a list of conditions that must be met for a request to be validated. + // Match conditions filter requests that have already been matched by the matchConstraints. + // An empty list of matchConditions matches all requests. + // There are a maximum of 64 match conditions allowed. + // + // If a parameter object is provided, it can be accessed via the `params` handle in the same + // manner as validation expressions. + // + // The exact matching logic is (in order): + // 1. If ANY matchCondition evaluates to FALSE, the policy is skipped. + // 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated. + // 3. If any matchCondition evaluates to an error (but none are FALSE): + // - If failurePolicy=Fail, reject the request + // - If failurePolicy=Ignore, the policy is skipped + // + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + repeated MatchCondition matchConditions = 6; + + // reinvocationPolicy indicates whether mutations may be called multiple times per MutatingAdmissionPolicyBinding + // as part of a single admission evaluation. + // Allowed values are "Never" and "IfNeeded". + // + // Never: These mutations will not be called more than once per binding in a single admission evaluation. + // + // IfNeeded: These mutations may be invoked more than once per binding for a single admission request and there is no guarantee of + // order with respect to other admission plugins, admission webhooks, bindings of this policy and admission policies. Mutations are only + // reinvoked when mutations change the object after this mutation is invoked. + // Required. + optional string reinvocationPolicy = 7; +} + // MutatingWebhook describes an admission webhook and the resources and operations it applies to. message MutatingWebhook { // The name of the admission webhook. @@ -401,6 +682,26 @@ message MutatingWebhookConfigurationList { repeated MutatingWebhookConfiguration items = 2; } +// Mutation specifies the CEL expression which is used to apply the Mutation. +message Mutation { + // patchType indicates the patch strategy used. + // Allowed values are "ApplyConfiguration" and "JSONPatch". + // Required. + // + // +unionDiscriminator + optional string patchType = 2; + + // applyConfiguration defines the desired configuration values of an object. + // The configuration is applied to the admission object using + // [structured merge diff](https://github.com/kubernetes-sigs/structured-merge-diff). + // A CEL expression is used to create apply configuration. + optional ApplyConfiguration applyConfiguration = 3; + + // jsonPatch defines a [JSON patch](https://jsonpatch.com/) operation to perform a mutation to the object. + // A CEL expression is used to create the JSON patch. + optional JSONPatch jsonPatch = 4; +} + // NamedRuleWithOperations is a tuple of Operations and Resources with ResourceNames. // +structType=atomic message NamedRuleWithOperations { diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/register.go b/vendor/k8s.io/api/admissionregistration/v1beta1/register.go index 363233a2f9..be64c4a5fa 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/register.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/register.go @@ -54,6 +54,10 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ValidatingAdmissionPolicyList{}, &ValidatingAdmissionPolicyBinding{}, &ValidatingAdmissionPolicyBindingList{}, + &MutatingAdmissionPolicy{}, + &MutatingAdmissionPolicyList{}, + &MutatingAdmissionPolicyBinding{}, + &MutatingAdmissionPolicyBindingList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go index 0f59031239..cffdda82c9 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go @@ -1073,7 +1073,7 @@ type MutatingWebhook struct { } // ReinvocationPolicyType specifies what type of policy the admission hook uses. -type ReinvocationPolicyType string +type ReinvocationPolicyType = v1.ReinvocationPolicyType const ( // NeverReinvocationPolicy indicates that the webhook must not be called more than once in a @@ -1197,3 +1197,332 @@ type MatchCondition struct { // Required. Expression string `json:"expression" protobuf:"bytes,2,opt,name=expression"` } + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicy describes the definition of an admission mutation policy that mutates the object coming into admission chain. +type MutatingAdmissionPolicy struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Specification of the desired behavior of the MutatingAdmissionPolicy. + Spec MutatingAdmissionPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicyList is a list of MutatingAdmissionPolicy. +type MutatingAdmissionPolicyList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // List of ValidatingAdmissionPolicy. + Items []MutatingAdmissionPolicy `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// MutatingAdmissionPolicySpec is the specification of the desired behavior of the admission policy. +type MutatingAdmissionPolicySpec struct { + // paramKind specifies the kind of resources used to parameterize this policy. + // If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. + // If paramKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. + // If paramKind is specified but paramRef is unset in MutatingAdmissionPolicyBinding, the params variable will be null. + // +optional + ParamKind *ParamKind `json:"paramKind,omitempty" protobuf:"bytes,1,rep,name=paramKind"` + + // matchConstraints specifies what resources this policy is designed to validate. + // The MutatingAdmissionPolicy cares about a request if it matches _all_ Constraints. + // However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API + // MutatingAdmissionPolicy cannot match MutatingAdmissionPolicy and MutatingAdmissionPolicyBinding. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // Required. + MatchConstraints *MatchResources `json:"matchConstraints,omitempty" protobuf:"bytes,2,rep,name=matchConstraints"` + + // variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except matchConditions because matchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, variables must be sorted by the order of first appearance and acyclic. + // +listType=atomic + // +optional + Variables []Variable `json:"variables,omitempty" protobuf:"bytes,3,rep,name=variables"` + + // mutations contain operations to perform on matching objects. + // mutations may not be empty; a minimum of one mutation is required. + // mutations are evaluated in order, and are reinvoked according to + // the reinvocationPolicy. + // The mutations of a policy are invoked for each binding of this policy + // and reinvocation of mutations occurs on a per binding basis. + // + // +listType=atomic + // +optional + Mutations []Mutation `json:"mutations,omitempty" protobuf:"bytes,4,rep,name=mutations"` + + // failurePolicy defines how to handle failures for the admission policy. Failures can + // occur from CEL expression parse errors, type check errors, runtime errors and invalid + // or mis-configured policy definitions or bindings. + // + // A policy is invalid if paramKind refers to a non-existent Kind. + // A binding is invalid if paramRef.name refers to a non-existent resource. + // + // failurePolicy does not define how validations that evaluate to false are handled. + // + // Allowed values are Ignore or Fail. Defaults to Fail. + // +optional + FailurePolicy *FailurePolicyType `json:"failurePolicy,omitempty" protobuf:"bytes,5,opt,name=failurePolicy,casttype=FailurePolicyType"` + + // matchConditions is a list of conditions that must be met for a request to be validated. + // Match conditions filter requests that have already been matched by the matchConstraints. + // An empty list of matchConditions matches all requests. + // There are a maximum of 64 match conditions allowed. + // + // If a parameter object is provided, it can be accessed via the `params` handle in the same + // manner as validation expressions. + // + // The exact matching logic is (in order): + // 1. If ANY matchCondition evaluates to FALSE, the policy is skipped. + // 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated. + // 3. If any matchCondition evaluates to an error (but none are FALSE): + // - If failurePolicy=Fail, reject the request + // - If failurePolicy=Ignore, the policy is skipped + // + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + MatchConditions []MatchCondition `json:"matchConditions,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,6,rep,name=matchConditions"` + + // reinvocationPolicy indicates whether mutations may be called multiple times per MutatingAdmissionPolicyBinding + // as part of a single admission evaluation. + // Allowed values are "Never" and "IfNeeded". + // + // Never: These mutations will not be called more than once per binding in a single admission evaluation. + // + // IfNeeded: These mutations may be invoked more than once per binding for a single admission request and there is no guarantee of + // order with respect to other admission plugins, admission webhooks, bindings of this policy and admission policies. Mutations are only + // reinvoked when mutations change the object after this mutation is invoked. + // Required. + ReinvocationPolicy ReinvocationPolicyType `json:"reinvocationPolicy,omitempty" protobuf:"bytes,7,opt,name=reinvocationPolicy,casttype=ReinvocationPolicyType"` +} + +// Mutation specifies the CEL expression which is used to apply the Mutation. +type Mutation struct { + // patchType indicates the patch strategy used. + // Allowed values are "ApplyConfiguration" and "JSONPatch". + // Required. + // + // +unionDiscriminator + PatchType PatchType `json:"patchType" protobuf:"bytes,2,opt,name=patchType,casttype=PatchType"` + + // applyConfiguration defines the desired configuration values of an object. + // The configuration is applied to the admission object using + // [structured merge diff](https://github.com/kubernetes-sigs/structured-merge-diff). + // A CEL expression is used to create apply configuration. + ApplyConfiguration *ApplyConfiguration `json:"applyConfiguration,omitempty" protobuf:"bytes,3,opt,name=applyConfiguration"` + + // jsonPatch defines a [JSON patch](https://jsonpatch.com/) operation to perform a mutation to the object. + // A CEL expression is used to create the JSON patch. + JSONPatch *JSONPatch `json:"jsonPatch,omitempty" protobuf:"bytes,4,opt,name=jsonPatch"` +} + +// PatchType specifies the type of patch operation for a mutation. +// +enum +type PatchType string + +const ( + // ApplyConfiguration indicates that the mutation is using apply configuration to mutate the object. + PatchTypeApplyConfiguration PatchType = "ApplyConfiguration" + // JSONPatch indicates that the object is mutated through JSON Patch. + PatchTypeJSONPatch PatchType = "JSONPatch" +) + +// ApplyConfiguration defines the desired configuration values of an object. +type ApplyConfiguration struct { + // expression will be evaluated by CEL to create an apply configuration. + // ref: https://github.com/google/cel-spec + // + // Apply configurations are declared in CEL using object initialization. For example, this CEL expression + // returns an apply configuration to set a single field: + // + // Object{ + // spec: Object.spec{ + // serviceAccountName: "example" + // } + // } + // + // Apply configurations may not modify atomic structs, maps or arrays due to the risk of accidental deletion of + // values not included in the apply configuration. + // + // CEL expressions have access to the object types needed to create apply configurations: + // + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // The `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the + // object. No other metadata properties are accessible. + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + Expression string `json:"expression,omitempty" protobuf:"bytes,1,opt,name=expression"` +} + +// JSONPatch defines a JSON Patch. +type JSONPatch struct { + // expression will be evaluated by CEL to create a [JSON patch](https://jsonpatch.com/). + // ref: https://github.com/google/cel-spec + // + // expression must return an array of JSONPatch values. + // + // For example, this CEL expression returns a JSON patch to conditionally modify a value: + // + // [ + // JSONPatch{op: "test", path: "/spec/example", value: "Red"}, + // JSONPatch{op: "replace", path: "/spec/example", value: "Green"} + // ] + // + // To define an object for the patch value, use Object types. For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/spec/selector", + // value: Object.spec.selector{matchLabels: {"environment": "test"}} + // } + // ] + // + // To use strings containing '/' and '~' as JSONPatch path keys, use "jsonpatch.escapeKey". For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/metadata/labels/" + jsonpatch.escapeKey("example.com/environment"), + // value: "test" + // }, + // ] + // + // CEL expressions have access to the types needed to create JSON patches and objects: + // + // - 'JSONPatch' - CEL type of JSON Patch operations. JSONPatch has the fields 'op', 'from', 'path' and 'value'. + // See [JSON patch](https://jsonpatch.com/) for more details. The 'value' field may be set to any of: string, + // integer, array, map or object. If set, the 'path' and 'from' fields must be set to a + // [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901/) string, where the 'jsonpatch.escapeKey()' CEL + // function may be used to escape path keys containing '/' and '~'. + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // CEL expressions have access to [Kubernetes CEL function libraries](https://kubernetes.io/docs/reference/using-api/cel/#cel-options-language-features-and-libraries) + // as well as: + // + // - 'jsonpatch.escapeKey' - Performs JSONPatch key escaping. '~' and '/' are escaped as '~0' and `~1' respectively). + // + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + Expression string `json:"expression,omitempty" protobuf:"bytes,1,opt,name=expression"` +} + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicyBinding binds the MutatingAdmissionPolicy with parametrized resources. +// MutatingAdmissionPolicyBinding and the optional parameter resource together define how cluster administrators +// configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// Each evaluation is constrained by a [runtime cost budget](https://kubernetes.io/docs/reference/using-api/cel/#runtime-cost-budget). +// +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. +type MutatingAdmissionPolicyBinding struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Specification of the desired behavior of the MutatingAdmissionPolicyBinding. + Spec MutatingAdmissionPolicyBindingSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicyBindingList is a list of MutatingAdmissionPolicyBinding. +type MutatingAdmissionPolicyBindingList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // List of PolicyBinding. + Items []MutatingAdmissionPolicyBinding `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// MutatingAdmissionPolicyBindingSpec is the specification of the MutatingAdmissionPolicyBinding. +type MutatingAdmissionPolicyBindingSpec struct { + // policyName references a MutatingAdmissionPolicy name which the MutatingAdmissionPolicyBinding binds to. + // If the referenced resource does not exist, this binding is considered invalid and will be ignored + // Required. + PolicyName string `json:"policyName,omitempty" protobuf:"bytes,1,rep,name=policyName"` + + // paramRef specifies the parameter resource used to configure the admission control policy. + // It should point to a resource of the type specified in spec.ParamKind of the bound MutatingAdmissionPolicy. + // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the MutatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. + // +optional + ParamRef *ParamRef `json:"paramRef,omitempty" protobuf:"bytes,2,rep,name=paramRef"` + + // matchResources limits what resources match this binding and may be mutated by it. + // Note that if matchResources matches a resource, the resource must also match a policy's matchConstraints and + // matchConditions before the resource may be mutated. + // When matchResources is unset, it does not constrain resource matching, and only the policy's matchConstraints + // and matchConditions must match for the resource to be mutated. + // Additionally, matchResources.resourceRules are optional and do not constraint matching when unset. + // Note that this is differs from MutatingAdmissionPolicy matchConstraints, where resourceRules are required. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // +optional + MatchResources *MatchResources `json:"matchResources,omitempty" protobuf:"bytes,3,rep,name=matchResources"` +} diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go index cc1509b539..1a97c94729 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go @@ -27,6 +27,15 @@ package v1beta1 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ApplyConfiguration = map[string]string{ + "": "ApplyConfiguration defines the desired configuration values of an object.", + "expression": "expression will be evaluated by CEL to create an apply configuration. ref: https://github.com/google/cel-spec\n\nApply configurations are declared in CEL using object initialization. For example, this CEL expression returns an apply configuration to set a single field:\n\n\tObject{\n\t spec: Object.spec{\n\t serviceAccountName: \"example\"\n\t }\n\t}\n\nApply configurations may not modify atomic structs, maps or arrays due to the risk of accidental deletion of values not included in the apply configuration.\n\nCEL expressions have access to the object types needed to create apply configurations:\n\n- 'Object' - CEL type of the resource object. - 'Object.' - CEL type of object field (such as 'Object.spec') - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers')\n\nCEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables:\n\n- 'object' - The object from the incoming request. The value is null for DELETE requests. - 'oldObject' - The existing object. The value is null for CREATE requests. - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. - 'variables' - Map of composited variables, from its name to its lazily evaluated value.\n For example, a variable named 'foo' can be accessed as 'variables.foo'.\n- 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request.\n See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz\n- 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the\n request resource.\n\nThe `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the object. No other metadata properties are accessible.\n\nOnly property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. Required.", +} + +func (ApplyConfiguration) SwaggerDoc() map[string]string { + return map_ApplyConfiguration +} + var map_AuditAnnotation = map[string]string{ "": "AuditAnnotation describes how to produce an audit annotation for an API request.", "key": "key specifies the audit annotation key. The audit annotation keys of a ValidatingAdmissionPolicy must be unique. The key must be a qualified name ([A-Za-z0-9][-A-Za-z0-9_.]*) no more than 63 bytes in length.\n\nThe key is combined with the resource name of the ValidatingAdmissionPolicy to construct an audit annotation key: \"{ValidatingAdmissionPolicy name}/{key}\".\n\nIf an admission webhook uses the same resource name as this ValidatingAdmissionPolicy and the same audit annotation key, the annotation key will be identical. In this case, the first annotation written with the key will be included in the audit event and all subsequent annotations with the same key will be discarded.\n\nRequired.", @@ -47,6 +56,15 @@ func (ExpressionWarning) SwaggerDoc() map[string]string { return map_ExpressionWarning } +var map_JSONPatch = map[string]string{ + "": "JSONPatch defines a JSON Patch.", + "expression": "expression will be evaluated by CEL to create a [JSON patch](https://jsonpatch.com/). ref: https://github.com/google/cel-spec\n\nexpression must return an array of JSONPatch values.\n\nFor example, this CEL expression returns a JSON patch to conditionally modify a value:\n\n\t [\n\t JSONPatch{op: \"test\", path: \"/spec/example\", value: \"Red\"},\n\t JSONPatch{op: \"replace\", path: \"/spec/example\", value: \"Green\"}\n\t ]\n\nTo define an object for the patch value, use Object types. For example:\n\n\t [\n\t JSONPatch{\n\t op: \"add\",\n\t path: \"/spec/selector\",\n\t value: Object.spec.selector{matchLabels: {\"environment\": \"test\"}}\n\t }\n\t ]\n\nTo use strings containing '/' and '~' as JSONPatch path keys, use \"jsonpatch.escapeKey\". For example:\n\n\t [\n\t JSONPatch{\n\t op: \"add\",\n\t path: \"/metadata/labels/\" + jsonpatch.escapeKey(\"example.com/environment\"),\n\t value: \"test\"\n\t },\n\t ]\n\nCEL expressions have access to the types needed to create JSON patches and objects:\n\n- 'JSONPatch' - CEL type of JSON Patch operations. JSONPatch has the fields 'op', 'from', 'path' and 'value'.\n See [JSON patch](https://jsonpatch.com/) for more details. The 'value' field may be set to any of: string,\n integer, array, map or object. If set, the 'path' and 'from' fields must be set to a\n [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901/) string, where the 'jsonpatch.escapeKey()' CEL\n function may be used to escape path keys containing '/' and '~'.\n- 'Object' - CEL type of the resource object. - 'Object.' - CEL type of object field (such as 'Object.spec') - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers')\n\nCEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables:\n\n- 'object' - The object from the incoming request. The value is null for DELETE requests. - 'oldObject' - The existing object. The value is null for CREATE requests. - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. - 'variables' - Map of composited variables, from its name to its lazily evaluated value.\n For example, a variable named 'foo' can be accessed as 'variables.foo'.\n- 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request.\n See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz\n- 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the\n request resource.\n\nCEL expressions have access to [Kubernetes CEL function libraries](https://kubernetes.io/docs/reference/using-api/cel/#cel-options-language-features-and-libraries) as well as:\n\n- 'jsonpatch.escapeKey' - Performs JSONPatch key escaping. '~' and '/' are escaped as '~0' and `~1' respectively).\n\nOnly property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. Required.", +} + +func (JSONPatch) SwaggerDoc() map[string]string { + return map_JSONPatch +} + var map_MatchCondition = map[string]string{ "": "MatchCondition represents a condition which must be fulfilled for a request to be sent to a webhook.", "name": "Name is an identifier for this match condition, used for strategic merging of MatchConditions, as well as providing an identifier for logging purposes. A good name should be descriptive of the associated expression. Name must be a qualified name consisting of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]') with an optional DNS subdomain prefix and '/' (e.g. 'example.com/MyName')\n\nRequired.", @@ -70,6 +88,72 @@ func (MatchResources) SwaggerDoc() map[string]string { return map_MatchResources } +var map_MutatingAdmissionPolicy = map[string]string{ + "": "MutatingAdmissionPolicy describes the definition of an admission mutation policy that mutates the object coming into admission chain.", + "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + "spec": "Specification of the desired behavior of the MutatingAdmissionPolicy.", +} + +func (MutatingAdmissionPolicy) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicy +} + +var map_MutatingAdmissionPolicyBinding = map[string]string{ + "": "MutatingAdmissionPolicyBinding binds the MutatingAdmissionPolicy with parametrized resources. MutatingAdmissionPolicyBinding and the optional parameter resource together define how cluster administrators configure policies for clusters.\n\nFor a given admission request, each binding will cause its policy to be evaluated N times, where N is 1 for policies/bindings that don't use params, otherwise N is the number of parameters selected by the binding. Each evaluation is constrained by a [runtime cost budget](https://kubernetes.io/docs/reference/using-api/cel/#runtime-cost-budget).\n\nAdding/removing policies, bindings, or params can not affect whether a given (policy, binding, param) combination is within its own CEL budget.", + "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + "spec": "Specification of the desired behavior of the MutatingAdmissionPolicyBinding.", +} + +func (MutatingAdmissionPolicyBinding) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyBinding +} + +var map_MutatingAdmissionPolicyBindingList = map[string]string{ + "": "MutatingAdmissionPolicyBindingList is a list of MutatingAdmissionPolicyBinding.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "items": "List of PolicyBinding.", +} + +func (MutatingAdmissionPolicyBindingList) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyBindingList +} + +var map_MutatingAdmissionPolicyBindingSpec = map[string]string{ + "": "MutatingAdmissionPolicyBindingSpec is the specification of the MutatingAdmissionPolicyBinding.", + "policyName": "policyName references a MutatingAdmissionPolicy name which the MutatingAdmissionPolicyBinding binds to. If the referenced resource does not exist, this binding is considered invalid and will be ignored Required.", + "paramRef": "paramRef specifies the parameter resource used to configure the admission control policy. It should point to a resource of the type specified in spec.ParamKind of the bound MutatingAdmissionPolicy. If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the MutatingAdmissionPolicy applied. If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param.", + "matchResources": "matchResources limits what resources match this binding and may be mutated by it. Note that if matchResources matches a resource, the resource must also match a policy's matchConstraints and matchConditions before the resource may be mutated. When matchResources is unset, it does not constrain resource matching, and only the policy's matchConstraints and matchConditions must match for the resource to be mutated. Additionally, matchResources.resourceRules are optional and do not constraint matching when unset. Note that this is differs from MutatingAdmissionPolicy matchConstraints, where resourceRules are required. The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. '*' matches CREATE, UPDATE and CONNECT.", +} + +func (MutatingAdmissionPolicyBindingSpec) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyBindingSpec +} + +var map_MutatingAdmissionPolicyList = map[string]string{ + "": "MutatingAdmissionPolicyList is a list of MutatingAdmissionPolicy.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "items": "List of ValidatingAdmissionPolicy.", +} + +func (MutatingAdmissionPolicyList) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyList +} + +var map_MutatingAdmissionPolicySpec = map[string]string{ + "": "MutatingAdmissionPolicySpec is the specification of the desired behavior of the admission policy.", + "paramKind": "paramKind specifies the kind of resources used to parameterize this policy. If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. If paramKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. If paramKind is specified but paramRef is unset in MutatingAdmissionPolicyBinding, the params variable will be null.", + "matchConstraints": "matchConstraints specifies what resources this policy is designed to validate. The MutatingAdmissionPolicy cares about a request if it matches _all_ Constraints. However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API MutatingAdmissionPolicy cannot match MutatingAdmissionPolicy and MutatingAdmissionPolicyBinding. The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. '*' matches CREATE, UPDATE and CONNECT. Required.", + "variables": "variables contain definitions of variables that can be used in composition of other expressions. Each variable is defined as a named CEL expression. The variables defined here will be available under `variables` in other expressions of the policy except matchConditions because matchConditions are evaluated before the rest of the policy.\n\nThe expression of a variable can refer to other variables defined earlier in the list but not those after. Thus, variables must be sorted by the order of first appearance and acyclic.", + "mutations": "mutations contain operations to perform on matching objects. mutations may not be empty; a minimum of one mutation is required. mutations are evaluated in order, and are reinvoked according to the reinvocationPolicy. The mutations of a policy are invoked for each binding of this policy and reinvocation of mutations occurs on a per binding basis.", + "failurePolicy": "failurePolicy defines how to handle failures for the admission policy. Failures can occur from CEL expression parse errors, type check errors, runtime errors and invalid or mis-configured policy definitions or bindings.\n\nA policy is invalid if paramKind refers to a non-existent Kind. A binding is invalid if paramRef.name refers to a non-existent resource.\n\nfailurePolicy does not define how validations that evaluate to false are handled.\n\nAllowed values are Ignore or Fail. Defaults to Fail.", + "matchConditions": "matchConditions is a list of conditions that must be met for a request to be validated. Match conditions filter requests that have already been matched by the matchConstraints. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nIf a parameter object is provided, it can be accessed via the `params` handle in the same manner as validation expressions.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the policy is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the policy is skipped", + "reinvocationPolicy": "reinvocationPolicy indicates whether mutations may be called multiple times per MutatingAdmissionPolicyBinding as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: These mutations will not be called more than once per binding in a single admission evaluation.\n\nIfNeeded: These mutations may be invoked more than once per binding for a single admission request and there is no guarantee of order with respect to other admission plugins, admission webhooks, bindings of this policy and admission policies. Mutations are only reinvoked when mutations change the object after this mutation is invoked. Required.", +} + +func (MutatingAdmissionPolicySpec) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicySpec +} + var map_MutatingWebhook = map[string]string{ "": "MutatingWebhook describes an admission webhook and the resources and operations it applies to.", "name": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", @@ -110,6 +194,17 @@ func (MutatingWebhookConfigurationList) SwaggerDoc() map[string]string { return map_MutatingWebhookConfigurationList } +var map_Mutation = map[string]string{ + "": "Mutation specifies the CEL expression which is used to apply the Mutation.", + "patchType": "patchType indicates the patch strategy used. Allowed values are \"ApplyConfiguration\" and \"JSONPatch\". Required.", + "applyConfiguration": "applyConfiguration defines the desired configuration values of an object. The configuration is applied to the admission object using [structured merge diff](https://github.com/kubernetes-sigs/structured-merge-diff). A CEL expression is used to create apply configuration.", + "jsonPatch": "jsonPatch defines a [JSON patch](https://jsonpatch.com/) operation to perform a mutation to the object. A CEL expression is used to create the JSON patch.", +} + +func (Mutation) SwaggerDoc() map[string]string { + return map_Mutation +} + var map_NamedRuleWithOperations = map[string]string{ "": "NamedRuleWithOperations is a tuple of Operations and Resources with ResourceNames.", "resourceNames": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go index 4c10b1d113..3749a3d141 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go @@ -27,6 +27,22 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ApplyConfiguration) DeepCopyInto(out *ApplyConfiguration) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplyConfiguration. +func (in *ApplyConfiguration) DeepCopy() *ApplyConfiguration { + if in == nil { + return nil + } + out := new(ApplyConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AuditAnnotation) DeepCopyInto(out *AuditAnnotation) { *out = *in @@ -59,6 +75,22 @@ func (in *ExpressionWarning) DeepCopy() *ExpressionWarning { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *JSONPatch) DeepCopyInto(out *JSONPatch) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JSONPatch. +func (in *JSONPatch) DeepCopy() *JSONPatch { + if in == nil { + return nil + } + out := new(JSONPatch) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MatchCondition) DeepCopyInto(out *MatchCondition) { *out = *in @@ -120,6 +152,200 @@ func (in *MatchResources) DeepCopy() *MatchResources { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicy) DeepCopyInto(out *MutatingAdmissionPolicy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicy. +func (in *MutatingAdmissionPolicy) DeepCopy() *MutatingAdmissionPolicy { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyBinding) DeepCopyInto(out *MutatingAdmissionPolicyBinding) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyBinding. +func (in *MutatingAdmissionPolicyBinding) DeepCopy() *MutatingAdmissionPolicyBinding { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyBinding) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicyBinding) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyBindingList) DeepCopyInto(out *MutatingAdmissionPolicyBindingList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]MutatingAdmissionPolicyBinding, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyBindingList. +func (in *MutatingAdmissionPolicyBindingList) DeepCopy() *MutatingAdmissionPolicyBindingList { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyBindingList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicyBindingList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyBindingSpec) DeepCopyInto(out *MutatingAdmissionPolicyBindingSpec) { + *out = *in + if in.ParamRef != nil { + in, out := &in.ParamRef, &out.ParamRef + *out = new(ParamRef) + (*in).DeepCopyInto(*out) + } + if in.MatchResources != nil { + in, out := &in.MatchResources, &out.MatchResources + *out = new(MatchResources) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyBindingSpec. +func (in *MutatingAdmissionPolicyBindingSpec) DeepCopy() *MutatingAdmissionPolicyBindingSpec { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyBindingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyList) DeepCopyInto(out *MutatingAdmissionPolicyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]MutatingAdmissionPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyList. +func (in *MutatingAdmissionPolicyList) DeepCopy() *MutatingAdmissionPolicyList { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicySpec) DeepCopyInto(out *MutatingAdmissionPolicySpec) { + *out = *in + if in.ParamKind != nil { + in, out := &in.ParamKind, &out.ParamKind + *out = new(ParamKind) + **out = **in + } + if in.MatchConstraints != nil { + in, out := &in.MatchConstraints, &out.MatchConstraints + *out = new(MatchResources) + (*in).DeepCopyInto(*out) + } + if in.Variables != nil { + in, out := &in.Variables, &out.Variables + *out = make([]Variable, len(*in)) + copy(*out, *in) + } + if in.Mutations != nil { + in, out := &in.Mutations, &out.Mutations + *out = make([]Mutation, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FailurePolicy != nil { + in, out := &in.FailurePolicy, &out.FailurePolicy + *out = new(FailurePolicyType) + **out = **in + } + if in.MatchConditions != nil { + in, out := &in.MatchConditions, &out.MatchConditions + *out = make([]MatchCondition, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicySpec. +func (in *MutatingAdmissionPolicySpec) DeepCopy() *MutatingAdmissionPolicySpec { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicySpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MutatingWebhook) DeepCopyInto(out *MutatingWebhook) { *out = *in @@ -168,7 +394,7 @@ func (in *MutatingWebhook) DeepCopyInto(out *MutatingWebhook) { } if in.ReinvocationPolicy != nil { in, out := &in.ReinvocationPolicy, &out.ReinvocationPolicy - *out = new(ReinvocationPolicyType) + *out = new(admissionregistrationv1.ReinvocationPolicyType) **out = **in } if in.MatchConditions != nil { @@ -255,6 +481,32 @@ func (in *MutatingWebhookConfigurationList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Mutation) DeepCopyInto(out *Mutation) { + *out = *in + if in.ApplyConfiguration != nil { + in, out := &in.ApplyConfiguration, &out.ApplyConfiguration + *out = new(ApplyConfiguration) + **out = **in + } + if in.JSONPatch != nil { + in, out := &in.JSONPatch, &out.JSONPatch + *out = new(JSONPatch) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Mutation. +func (in *Mutation) DeepCopy() *Mutation { + if in == nil { + return nil + } + out := new(Mutation) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NamedRuleWithOperations) DeepCopyInto(out *NamedRuleWithOperations) { *out = *in diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go index c1be5122a8..4fc0596b34 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go @@ -25,6 +25,78 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" ) +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicy) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicy) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicy) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicyBinding) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicyBinding) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicyBinding) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicyBindingList) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicyBindingList) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicyBindingList) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicyList) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicyList) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicyList) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + // APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. func (in *MutatingWebhookConfiguration) APILifecycleIntroduced() (major, minor int) { diff --git a/vendor/k8s.io/api/apps/v1/generated.proto b/vendor/k8s.io/api/apps/v1/generated.proto index 38c8997e99..5885a62225 100644 --- a/vendor/k8s.io/api/apps/v1/generated.proto +++ b/vendor/k8s.io/api/apps/v1/generated.proto @@ -530,7 +530,7 @@ message RollingUpdateDaemonSet { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/apps/v1/types.go b/vendor/k8s.io/api/apps/v1/types.go index 1362d875d8..4cf54cc99b 100644 --- a/vendor/k8s.io/api/apps/v1/types.go +++ b/vendor/k8s.io/api/apps/v1/types.go @@ -635,7 +635,7 @@ type RollingUpdateDaemonSet struct { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go index f44ba7bc33..ac54033fd6 100644 --- a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go @@ -265,7 +265,7 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediately created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.proto b/vendor/k8s.io/api/apps/v1beta1/generated.proto index 0601efc3c4..b61dc490db 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta1/generated.proto @@ -316,6 +316,9 @@ message Scale { message ScaleSpec { // replicas is the number of observed instances of the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/apps/v1beta1/types.go b/vendor/k8s.io/api/apps/v1beta1/types.go index 5530c990da..cd140be12f 100644 --- a/vendor/k8s.io/api/apps/v1beta1/types.go +++ b/vendor/k8s.io/api/apps/v1beta1/types.go @@ -33,6 +33,9 @@ const ( type ScaleSpec struct { // replicas is the number of observed instances of the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } @@ -60,6 +63,7 @@ type ScaleStatus struct { // +k8s:prerelease-lifecycle-gen:deprecated=1.8 // +k8s:prerelease-lifecycle-gen:removed=1.16 // +k8s:prerelease-lifecycle-gen:replacement=autoscaling,v1,Scale +// +k8s:isSubresource=/scale // Scale represents a scaling request for a resource. type Scale struct { diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.proto b/vendor/k8s.io/api/apps/v1beta2/generated.proto index 68c463e257..37c6d5ae1b 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta2/generated.proto @@ -536,7 +536,7 @@ message RollingUpdateDaemonSet { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may @@ -614,6 +614,9 @@ message Scale { message ScaleSpec { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/apps/v1beta2/types.go b/vendor/k8s.io/api/apps/v1beta2/types.go index 491afc59f5..e9dc85df05 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types.go +++ b/vendor/k8s.io/api/apps/v1beta2/types.go @@ -35,6 +35,9 @@ const ( type ScaleSpec struct { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } @@ -63,6 +66,7 @@ type ScaleStatus struct { // +k8s:prerelease-lifecycle-gen:deprecated=1.9 // +k8s:prerelease-lifecycle-gen:removed=1.16 // +k8s:prerelease-lifecycle-gen:replacement=autoscaling,v1,Scale +// +k8s:isSubresource=/scale // Scale represents a scaling request for a resource. type Scale struct { @@ -681,7 +685,7 @@ type RollingUpdateDaemonSet struct { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go index 4089434151..34d80af58d 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go @@ -265,7 +265,7 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediately created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/authorization/v1/generated.proto b/vendor/k8s.io/api/authorization/v1/generated.proto index 37b05b8552..ff529c969e 100644 --- a/vendor/k8s.io/api/authorization/v1/generated.proto +++ b/vendor/k8s.io/api/authorization/v1/generated.proto @@ -167,16 +167,10 @@ message ResourceAttributes { optional string name = 7; // fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional optional FieldSelectorAttributes fieldSelector = 8; // labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional optional LabelSelectorAttributes labelSelector = 9; } diff --git a/vendor/k8s.io/api/authorization/v1/types.go b/vendor/k8s.io/api/authorization/v1/types.go index 36f5fa4107..251e776b02 100644 --- a/vendor/k8s.io/api/authorization/v1/types.go +++ b/vendor/k8s.io/api/authorization/v1/types.go @@ -119,15 +119,9 @@ type ResourceAttributes struct { // +optional Name string `json:"name,omitempty" protobuf:"bytes,7,opt,name=name"` // fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional FieldSelector *FieldSelectorAttributes `json:"fieldSelector,omitempty" protobuf:"bytes,8,opt,name=fieldSelector"` // labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional LabelSelector *LabelSelectorAttributes `json:"labelSelector,omitempty" protobuf:"bytes,9,opt,name=labelSelector"` } diff --git a/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go index dc6b8a89ec..29d0aa8463 100644 --- a/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go @@ -87,8 +87,8 @@ var map_ResourceAttributes = map[string]string{ "resource": "Resource is one of the existing resource types. \"*\" means all.", "subresource": "Subresource is one of the existing resource types. \"\" means none.", "name": "Name is the name of the resource being requested for a \"get\" or deleted for a \"delete\". \"\" (empty) means all.", - "fieldSelector": "fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it.\n\nThis field is alpha-level. To use this field, you must enable the `AuthorizeWithSelectors` feature gate (disabled by default).", - "labelSelector": "labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it.\n\nThis field is alpha-level. To use this field, you must enable the `AuthorizeWithSelectors` feature gate (disabled by default).", + "fieldSelector": "fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it.", + "labelSelector": "labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it.", } func (ResourceAttributes) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/autoscaling/v1/generated.proto b/vendor/k8s.io/api/autoscaling/v1/generated.proto index 68c35b6b22..a17d7989db 100644 --- a/vendor/k8s.io/api/autoscaling/v1/generated.proto +++ b/vendor/k8s.io/api/autoscaling/v1/generated.proto @@ -472,6 +472,9 @@ message Scale { message ScaleSpec { // replicas is the desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/autoscaling/v1/types.go b/vendor/k8s.io/api/autoscaling/v1/types.go index 85c609e5c7..e1e8809fe9 100644 --- a/vendor/k8s.io/api/autoscaling/v1/types.go +++ b/vendor/k8s.io/api/autoscaling/v1/types.go @@ -117,6 +117,7 @@ type HorizontalPodAutoscalerList struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.2 +// +k8s:isSubresource=/scale // Scale represents a scaling request for a resource. type Scale struct { @@ -138,6 +139,9 @@ type Scale struct { type ScaleSpec struct { // replicas is the desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } diff --git a/vendor/k8s.io/api/batch/v1/generated.proto b/vendor/k8s.io/api/batch/v1/generated.proto index d3aeae0adb..c0ce8cef26 100644 --- a/vendor/k8s.io/api/batch/v1/generated.proto +++ b/vendor/k8s.io/api/batch/v1/generated.proto @@ -226,7 +226,8 @@ message JobSpec { optional SuccessPolicy successPolicy = 16; // Specifies the number of retries before marking this job failed. - // Defaults to 6 + // Defaults to 6, unless backoffLimitPerIndex (only Indexed Job) is specified. + // When backoffLimitPerIndex is specified, backoffLimit defaults to 2147483647. // +optional optional int32 backoffLimit = 7; @@ -329,8 +330,6 @@ message JobSpec { // // When using podFailurePolicy, Failed is the the only allowed value. // TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. - // This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. - // This is on by default. // +optional optional string podReplacementPolicy = 14; @@ -570,7 +569,7 @@ message PodFailurePolicyRule { message SuccessPolicy { // rules represents the list of alternative rules for the declaring the Jobs // as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, - // the "SucceededCriteriaMet" condition is added, and the lingering pods are removed. + // the "SuccessCriteriaMet" condition is added, and the lingering pods are removed. // The terminal state for such a Job has the "Complete" condition. // Additionally, these rules are evaluated in order; Once the Job meets one of the rules, // other rules are ignored. At most 20 elements are allowed. diff --git a/vendor/k8s.io/api/batch/v1/types.go b/vendor/k8s.io/api/batch/v1/types.go index 6c0007c21e..9183c073d2 100644 --- a/vendor/k8s.io/api/batch/v1/types.go +++ b/vendor/k8s.io/api/batch/v1/types.go @@ -257,7 +257,7 @@ type PodFailurePolicy struct { type SuccessPolicy struct { // rules represents the list of alternative rules for the declaring the Jobs // as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, - // the "SucceededCriteriaMet" condition is added, and the lingering pods are removed. + // the "SuccessCriteriaMet" condition is added, and the lingering pods are removed. // The terminal state for such a Job has the "Complete" condition. // Additionally, these rules are evaluated in order; Once the Job meets one of the rules, // other rules are ignored. At most 20 elements are allowed. @@ -347,7 +347,8 @@ type JobSpec struct { SuccessPolicy *SuccessPolicy `json:"successPolicy,omitempty" protobuf:"bytes,16,opt,name=successPolicy"` // Specifies the number of retries before marking this job failed. - // Defaults to 6 + // Defaults to 6, unless backoffLimitPerIndex (only Indexed Job) is specified. + // When backoffLimitPerIndex is specified, backoffLimit defaults to 2147483647. // +optional BackoffLimit *int32 `json:"backoffLimit,omitempty" protobuf:"varint,7,opt,name=backoffLimit"` @@ -455,8 +456,6 @@ type JobSpec struct { // // When using podFailurePolicy, Failed is the the only allowed value. // TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. - // This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. - // This is on by default. // +optional PodReplacementPolicy *PodReplacementPolicy `json:"podReplacementPolicy,omitempty" protobuf:"bytes,14,opt,name=podReplacementPolicy,casttype=podReplacementPolicy"` diff --git a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go index ffd4e4f5fe..451f4609f2 100644 --- a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -117,7 +117,7 @@ var map_JobSpec = map[string]string{ "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.", "podFailurePolicy": "Specifies the policy of handling failed pods. In particular, it allows to specify the set of actions and conditions which need to be satisfied to take the associated action. If empty, the default behaviour applies - the counter of failed pods, represented by the jobs's .status.failed field, is incremented and it is checked against the backoffLimit. This field cannot be used in combination with restartPolicy=OnFailure.", "successPolicy": "successPolicy specifies the policy when the Job can be declared as succeeded. If empty, the default behavior applies - the Job is declared as succeeded only when the number of succeeded pods equals to the completions. When the field is specified, it must be immutable and works only for the Indexed Jobs. Once the Job meets the SuccessPolicy, the lingering pods are terminated.", - "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", + "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6, unless backoffLimitPerIndex (only Indexed Job) is specified. When backoffLimitPerIndex is specified, backoffLimit defaults to 2147483647.", "backoffLimitPerIndex": "Specifies the limit for the number of retries within an index before marking this index as failed. When enabled the number of failures per index is kept in the pod's batch.kubernetes.io/job-index-failure-count annotation. It can only be set when Job's completionMode=Indexed, and the Pod's restart policy is Never. The field is immutable.", "maxFailedIndexes": "Specifies the maximal number of failed indexes before marking the Job as failed, when backoffLimitPerIndex is set. Once the number of failed indexes exceeds this number the entire Job is marked as Failed and its execution is terminated. When left as null the job continues execution of all of its indexes and is marked with the `Complete` Job condition. It can only be specified when backoffLimitPerIndex is set. It can be null or up to completions. It is required and must be less than or equal to 10^4 when is completions greater than 10^5.", "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", @@ -126,7 +126,7 @@ var map_JobSpec = map[string]string{ "ttlSecondsAfterFinished": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes.", "completionMode": "completionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other.\n\n`Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. In addition, The Pod name takes the form `$(job-name)-$(index)-$(random-string)`, the Pod hostname takes the form `$(job-name)-$(index)`.\n\nMore completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, which is possible during upgrades due to version skew, the controller skips updates for the Job.", "suspend": "suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. Defaults to false.", - "podReplacementPolicy": "podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods\n when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. This is on by default.", + "podReplacementPolicy": "podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods\n when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use.", "managedBy": "ManagedBy field indicates the controller that manages a Job. The k8s Job controller reconciles jobs which don't have this field at all or the field value is the reserved string `kubernetes.io/job-controller`, but skips reconciling Jobs with a custom value for this field. The value must be a valid domain-prefixed path (e.g. acme.io/foo) - all characters before the first \"/\" must be a valid subdomain as defined by RFC 1123. All characters trailing the first \"/\" must be valid HTTP Path characters as defined by RFC 3986. The value cannot exceed 63 characters. This field is immutable.\n\nThis field is beta-level. The job controller accepts setting the field when the feature gate JobManagedBy is enabled (enabled by default).", } @@ -206,7 +206,7 @@ func (PodFailurePolicyRule) SwaggerDoc() map[string]string { var map_SuccessPolicy = map[string]string{ "": "SuccessPolicy describes when a Job can be declared as succeeded based on the success of some indexes.", - "rules": "rules represents the list of alternative rules for the declaring the Jobs as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, the \"SucceededCriteriaMet\" condition is added, and the lingering pods are removed. The terminal state for such a Job has the \"Complete\" condition. Additionally, these rules are evaluated in order; Once the Job meets one of the rules, other rules are ignored. At most 20 elements are allowed.", + "rules": "rules represents the list of alternative rules for the declaring the Jobs as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, the \"SuccessCriteriaMet\" condition is added, and the lingering pods are removed. The terminal state for such a Job has the \"Complete\" condition. Additionally, these rules are evaluated in order; Once the Job meets one of the rules, other rules are ignored. At most 20 elements are allowed.", } func (SuccessPolicy) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/certificates/v1/generated.proto b/vendor/k8s.io/api/certificates/v1/generated.proto index dac7c7f5f2..24528fc8bc 100644 --- a/vendor/k8s.io/api/certificates/v1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1/generated.proto @@ -39,6 +39,8 @@ option go_package = "k8s.io/api/certificates/v1"; // This API can be used to request client certificates to authenticate to kube-apiserver // (with the "kubernetes.io/kube-apiserver-client" signerName), // or to obtain certificates from custom non-Kubernetes signers. +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval message CertificateSigningRequest { // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; @@ -203,6 +205,11 @@ message CertificateSigningRequestStatus { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember repeated CertificateSigningRequestCondition conditions = 1; // certificate is populated with an issued certificate by the signer after an Approved condition is present. diff --git a/vendor/k8s.io/api/certificates/v1/types.go b/vendor/k8s.io/api/certificates/v1/types.go index ba8009840d..71203e80d5 100644 --- a/vendor/k8s.io/api/certificates/v1/types.go +++ b/vendor/k8s.io/api/certificates/v1/types.go @@ -39,6 +39,8 @@ import ( // This API can be used to request client certificates to authenticate to kube-apiserver // (with the "kubernetes.io/kube-apiserver-client" signerName), // or to obtain certificates from custom non-Kubernetes signers. +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval type CertificateSigningRequest struct { metav1.TypeMeta `json:",inline"` // +optional @@ -178,6 +180,11 @@ type CertificateSigningRequestStatus struct { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember Conditions []CertificateSigningRequestCondition `json:"conditions,omitempty" protobuf:"bytes,1,rep,name=conditions"` // certificate is populated with an issued certificate by the signer after an Approved condition is present. diff --git a/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go b/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go index a62a400596..c260f0436d 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go @@ -25,11 +25,14 @@ import ( io "io" proto "github.com/gogo/protobuf/proto" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" reflect "reflect" strings "strings" + + k8s_io_apimachinery_pkg_types "k8s.io/apimachinery/pkg/types" ) // Reference imports to suppress errors if they are not otherwise used. @@ -127,10 +130,126 @@ func (m *ClusterTrustBundleSpec) XXX_DiscardUnknown() { var xxx_messageInfo_ClusterTrustBundleSpec proto.InternalMessageInfo +func (m *PodCertificateRequest) Reset() { *m = PodCertificateRequest{} } +func (*PodCertificateRequest) ProtoMessage() {} +func (*PodCertificateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{3} +} +func (m *PodCertificateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequest.Merge(m, src) +} +func (m *PodCertificateRequest) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequest proto.InternalMessageInfo + +func (m *PodCertificateRequestList) Reset() { *m = PodCertificateRequestList{} } +func (*PodCertificateRequestList) ProtoMessage() {} +func (*PodCertificateRequestList) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{4} +} +func (m *PodCertificateRequestList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequestList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequestList) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequestList.Merge(m, src) +} +func (m *PodCertificateRequestList) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequestList) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequestList.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequestList proto.InternalMessageInfo + +func (m *PodCertificateRequestSpec) Reset() { *m = PodCertificateRequestSpec{} } +func (*PodCertificateRequestSpec) ProtoMessage() {} +func (*PodCertificateRequestSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{5} +} +func (m *PodCertificateRequestSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequestSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequestSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequestSpec.Merge(m, src) +} +func (m *PodCertificateRequestSpec) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequestSpec) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequestSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequestSpec proto.InternalMessageInfo + +func (m *PodCertificateRequestStatus) Reset() { *m = PodCertificateRequestStatus{} } +func (*PodCertificateRequestStatus) ProtoMessage() {} +func (*PodCertificateRequestStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{6} +} +func (m *PodCertificateRequestStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequestStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequestStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequestStatus.Merge(m, src) +} +func (m *PodCertificateRequestStatus) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequestStatus) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequestStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequestStatus proto.InternalMessageInfo + func init() { proto.RegisterType((*ClusterTrustBundle)(nil), "k8s.io.api.certificates.v1alpha1.ClusterTrustBundle") proto.RegisterType((*ClusterTrustBundleList)(nil), "k8s.io.api.certificates.v1alpha1.ClusterTrustBundleList") proto.RegisterType((*ClusterTrustBundleSpec)(nil), "k8s.io.api.certificates.v1alpha1.ClusterTrustBundleSpec") + proto.RegisterType((*PodCertificateRequest)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequest") + proto.RegisterType((*PodCertificateRequestList)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequestList") + proto.RegisterType((*PodCertificateRequestSpec)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequestSpec") + proto.RegisterType((*PodCertificateRequestStatus)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequestStatus") } func init() { @@ -138,35 +257,65 @@ func init() { } var fileDescriptor_f73d5fe56c015bb8 = []byte{ - // 437 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0xcf, 0x6a, 0xdb, 0x40, - 0x10, 0xc6, 0xb5, 0x69, 0x02, 0xc9, 0xba, 0x85, 0xa2, 0x42, 0x31, 0x3e, 0x6c, 0x8c, 0x4f, 0xb9, - 0x74, 0x37, 0x36, 0x69, 0xc9, 0x59, 0x85, 0x42, 0xa1, 0x7f, 0x40, 0xe9, 0xa5, 0xa1, 0x87, 0xae, - 0xd7, 0x13, 0x79, 0x6b, 0x4b, 0x5a, 0x76, 0x57, 0x86, 0xde, 0x0a, 0x7d, 0x81, 0x3e, 0x96, 0x8f, - 0x69, 0x4f, 0x39, 0x85, 0x5a, 0x7d, 0x91, 0xb2, 0x6b, 0xd9, 0x12, 0x55, 0x8b, 0x4b, 0x6e, 0x9a, - 0xd1, 0xfc, 0xbe, 0x6f, 0xbe, 0x11, 0xc2, 0xa7, 0xb3, 0x73, 0x43, 0x65, 0xce, 0xb8, 0x92, 0x4c, - 0x80, 0xb6, 0xf2, 0x4a, 0x0a, 0x6e, 0xc1, 0xb0, 0xc5, 0x90, 0xcf, 0xd5, 0x94, 0x0f, 0x59, 0x02, - 0x19, 0x68, 0x6e, 0x61, 0x42, 0x95, 0xce, 0x6d, 0x1e, 0xf6, 0xd7, 0x04, 0xe5, 0x4a, 0xd2, 0x26, - 0x41, 0x37, 0x44, 0xef, 0x49, 0x22, 0xed, 0xb4, 0x18, 0x53, 0x91, 0xa7, 0x2c, 0xc9, 0x93, 0x9c, - 0x79, 0x70, 0x5c, 0x5c, 0xf9, 0xca, 0x17, 0xfe, 0x69, 0x2d, 0xd8, 0x3b, 0xab, 0x57, 0x48, 0xb9, - 0x98, 0xca, 0x0c, 0xf4, 0x67, 0xa6, 0x66, 0x89, 0x6b, 0x18, 0x96, 0x82, 0xe5, 0x6c, 0xd1, 0x5a, - 0xa3, 0xc7, 0xfe, 0x45, 0xe9, 0x22, 0xb3, 0x32, 0x85, 0x16, 0xf0, 0x6c, 0x17, 0x60, 0xc4, 0x14, - 0x52, 0xfe, 0x27, 0x37, 0xf8, 0x81, 0x70, 0xf8, 0x7c, 0x5e, 0x18, 0x0b, 0xfa, 0x9d, 0x2e, 0x8c, - 0x8d, 0x8a, 0x6c, 0x32, 0x87, 0xf0, 0x23, 0x3e, 0x74, 0xab, 0x4d, 0xb8, 0xe5, 0x5d, 0xd4, 0x47, - 0x27, 0x9d, 0xd1, 0x29, 0xad, 0x2f, 0xb3, 0x75, 0xa0, 0x6a, 0x96, 0xb8, 0x86, 0xa1, 0x6e, 0x9a, - 0x2e, 0x86, 0xf4, 0xed, 0xf8, 0x13, 0x08, 0xfb, 0x1a, 0x2c, 0x8f, 0xc2, 0xe5, 0xed, 0x71, 0x50, - 0xde, 0x1e, 0xe3, 0xba, 0x17, 0x6f, 0x55, 0xc3, 0x4b, 0xbc, 0x6f, 0x14, 0x88, 0xee, 0x9e, 0x57, - 0x3f, 0xa7, 0xbb, 0xee, 0x4e, 0xdb, 0x5b, 0x5e, 0x28, 0x10, 0xd1, 0xfd, 0xca, 0x65, 0xdf, 0x55, - 0xb1, 0xd7, 0x1c, 0x7c, 0x47, 0xf8, 0x71, 0x7b, 0xfc, 0x95, 0x34, 0x36, 0xfc, 0xd0, 0x0a, 0x46, - 0xff, 0x2f, 0x98, 0xa3, 0x7d, 0xac, 0x87, 0x95, 0xe1, 0xe1, 0xa6, 0xd3, 0x08, 0xf5, 0x1e, 0x1f, - 0x48, 0x0b, 0xa9, 0xe9, 0xee, 0xf5, 0xef, 0x9d, 0x74, 0x46, 0x67, 0x77, 0x49, 0x15, 0x3d, 0xa8, - 0x0c, 0x0e, 0x5e, 0x3a, 0xa9, 0x78, 0xad, 0x38, 0xf8, 0xfa, 0xd7, 0x4c, 0x2e, 0x74, 0x38, 0xc2, - 0xd8, 0xc8, 0x24, 0x03, 0xfd, 0x86, 0xa7, 0xe0, 0x53, 0x1d, 0xd5, 0xc7, 0xbf, 0xd8, 0xbe, 0x89, - 0x1b, 0x53, 0xe1, 0x53, 0xdc, 0xb1, 0xb5, 0x8c, 0xff, 0x0a, 0x47, 0xd1, 0xa3, 0x0a, 0xea, 0x34, - 0x1c, 0xe2, 0xe6, 0x5c, 0xf4, 0x62, 0xb9, 0x22, 0xc1, 0xf5, 0x8a, 0x04, 0x37, 0x2b, 0x12, 0x7c, - 0x29, 0x09, 0x5a, 0x96, 0x04, 0x5d, 0x97, 0x04, 0xdd, 0x94, 0x04, 0xfd, 0x2c, 0x09, 0xfa, 0xf6, - 0x8b, 0x04, 0x97, 0xfd, 0x5d, 0xbf, 0xdd, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd4, 0x1c, 0xcb, - 0xdd, 0x99, 0x03, 0x00, 0x00, + // 918 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0xc7, 0xe3, 0xb6, 0x69, 0x9b, 0x49, 0x5b, 0xda, 0x61, 0x17, 0x99, 0x22, 0x39, 0x21, 0x07, + 0x54, 0x90, 0xb0, 0xb7, 0xa5, 0xb0, 0x2b, 0x10, 0x48, 0x75, 0x0a, 0x52, 0xe9, 0x6e, 0x36, 0x9a, + 0x74, 0xf9, 0xb1, 0x5a, 0x24, 0x1c, 0xe7, 0x25, 0x19, 0x1a, 0x7b, 0x8c, 0x67, 0x5c, 0xb5, 0x37, + 0x24, 0xfe, 0x01, 0xfe, 0x23, 0xae, 0x3d, 0x2e, 0x5c, 0xd8, 0x53, 0xa0, 0xe6, 0x6f, 0xe0, 0xb2, + 0x27, 0xe4, 0xb1, 0x9d, 0x5f, 0x4e, 0xb6, 0xd9, 0x1e, 0x7a, 0xcb, 0xbc, 0x79, 0xdf, 0xcf, 0xfb, + 0xbe, 0x99, 0x37, 0x56, 0xd0, 0xbd, 0xd3, 0x07, 0x5c, 0xa7, 0xcc, 0xb0, 0x3c, 0x6a, 0xd8, 0xe0, + 0x0b, 0xda, 0xa6, 0xb6, 0x25, 0x80, 0x1b, 0x67, 0xbb, 0x56, 0xcf, 0xeb, 0x5a, 0xbb, 0x46, 0x07, + 0x5c, 0xf0, 0x2d, 0x01, 0x2d, 0xdd, 0xf3, 0x99, 0x60, 0xb8, 0x1c, 0x2b, 0x74, 0xcb, 0xa3, 0xfa, + 0xa8, 0x42, 0x4f, 0x15, 0xdb, 0x1f, 0x76, 0xa8, 0xe8, 0x06, 0x4d, 0xdd, 0x66, 0x8e, 0xd1, 0x61, + 0x1d, 0x66, 0x48, 0x61, 0x33, 0x68, 0xcb, 0x95, 0x5c, 0xc8, 0x5f, 0x31, 0x70, 0x7b, 0x7f, 0x68, + 0xc1, 0xb1, 0xec, 0x2e, 0x75, 0xc1, 0xbf, 0x30, 0xbc, 0xd3, 0x4e, 0x14, 0xe0, 0x86, 0x03, 0xc2, + 0x32, 0xce, 0x32, 0x36, 0xb6, 0x8d, 0x59, 0x2a, 0x3f, 0x70, 0x05, 0x75, 0x20, 0x23, 0xf8, 0xe4, + 0x3a, 0x01, 0xb7, 0xbb, 0xe0, 0x58, 0x93, 0xba, 0xca, 0x9f, 0x0a, 0xc2, 0xd5, 0x5e, 0xc0, 0x05, + 0xf8, 0x27, 0x7e, 0xc0, 0x85, 0x19, 0xb8, 0xad, 0x1e, 0xe0, 0x1f, 0xd1, 0x6a, 0x64, 0xad, 0x65, + 0x09, 0x4b, 0x55, 0xca, 0xca, 0x4e, 0x71, 0xef, 0x9e, 0x3e, 0x3c, 0x99, 0x41, 0x05, 0xdd, 0x3b, + 0xed, 0x44, 0x01, 0xae, 0x47, 0xd9, 0xfa, 0xd9, 0xae, 0xfe, 0xb8, 0xf9, 0x13, 0xd8, 0xe2, 0x11, + 0x08, 0xcb, 0xc4, 0x97, 0xfd, 0x52, 0x2e, 0xec, 0x97, 0xd0, 0x30, 0x46, 0x06, 0x54, 0xfc, 0x14, + 0x2d, 0x71, 0x0f, 0x6c, 0x75, 0x41, 0xd2, 0x1f, 0xe8, 0xd7, 0x9d, 0xbb, 0x9e, 0x75, 0xd9, 0xf0, + 0xc0, 0x36, 0xd7, 0x92, 0x2a, 0x4b, 0xd1, 0x8a, 0x48, 0x66, 0xe5, 0x0f, 0x05, 0xbd, 0x95, 0x4d, + 0x7f, 0x48, 0xb9, 0xc0, 0xcf, 0x32, 0x8d, 0xe9, 0xf3, 0x35, 0x16, 0xa9, 0x65, 0x5b, 0x9b, 0x49, + 0xc1, 0xd5, 0x34, 0x32, 0xd2, 0xd4, 0xf7, 0x28, 0x4f, 0x05, 0x38, 0x5c, 0x5d, 0x28, 0x2f, 0xee, + 0x14, 0xf7, 0xf6, 0x6f, 0xd2, 0x95, 0xb9, 0x9e, 0x14, 0xc8, 0x1f, 0x45, 0x28, 0x12, 0x13, 0x2b, + 0xbf, 0x4e, 0xed, 0x29, 0x6a, 0x1a, 0xef, 0x21, 0xc4, 0x69, 0xc7, 0x05, 0xbf, 0x66, 0x39, 0x20, + 0xbb, 0x2a, 0x0c, 0x0f, 0xbf, 0x31, 0xd8, 0x21, 0x23, 0x59, 0xf8, 0x63, 0x54, 0x14, 0x43, 0x8c, + 0xbc, 0x85, 0x82, 0xf9, 0x66, 0x22, 0x2a, 0x8e, 0x54, 0x20, 0xa3, 0x79, 0x95, 0xdf, 0x17, 0xd0, + 0xdd, 0x3a, 0x6b, 0x55, 0x87, 0xbd, 0x10, 0xf8, 0x39, 0x00, 0x2e, 0x6e, 0x61, 0x62, 0x7e, 0x18, + 0x9b, 0x98, 0xcf, 0xae, 0x3f, 0xdb, 0xa9, 0x46, 0x67, 0x0d, 0x0d, 0x06, 0xb4, 0xcc, 0x85, 0x25, + 0x02, 0xae, 0x2e, 0xca, 0x02, 0x9f, 0xdf, 0xb4, 0x80, 0x84, 0x98, 0x1b, 0x49, 0x89, 0xe5, 0x78, + 0x4d, 0x12, 0x78, 0xe5, 0x2f, 0x05, 0xbd, 0x3d, 0x55, 0x77, 0x0b, 0xe3, 0xf9, 0x6c, 0x7c, 0x3c, + 0xef, 0xdf, 0xb0, 0xc3, 0x19, 0x13, 0xfa, 0x5f, 0x7e, 0x46, 0x67, 0x37, 0x1e, 0xd2, 0xf7, 0xd1, + 0x8a, 0xc7, 0x5a, 0x52, 0x10, 0x0f, 0xe8, 0x1b, 0x89, 0x60, 0xa5, 0x1e, 0x87, 0x49, 0xba, 0x8f, + 0x8f, 0xd1, 0xb2, 0xc7, 0x5a, 0x4f, 0x8e, 0x0e, 0xe5, 0xed, 0x15, 0xcc, 0x8f, 0xd2, 0xe3, 0xaf, + 0xcb, 0xe8, 0xcb, 0x7e, 0xe9, 0xdd, 0x59, 0x5f, 0x48, 0x71, 0xe1, 0x01, 0xd7, 0x9f, 0x1c, 0x1d, + 0x92, 0x04, 0x81, 0xbf, 0x46, 0x98, 0x83, 0x7f, 0x46, 0x6d, 0x38, 0xb0, 0x6d, 0x16, 0xb8, 0x42, + 0x5a, 0x58, 0x92, 0xe0, 0xed, 0x04, 0x8c, 0x1b, 0x99, 0x0c, 0x32, 0x45, 0x85, 0x7b, 0x68, 0x6b, + 0x3c, 0x1a, 0x79, 0xcc, 0x4b, 0xd4, 0x17, 0x09, 0x6a, 0xab, 0x31, 0x99, 0x30, 0x9f, 0xdd, 0x2c, + 0x18, 0x7f, 0x83, 0x56, 0x5d, 0xd6, 0x02, 0xe9, 0x77, 0x59, 0x16, 0xf9, 0x34, 0x9d, 0x87, 0x5a, + 0x12, 0x7f, 0xd9, 0x2f, 0xbd, 0xf7, 0x6a, 0x76, 0x9a, 0x49, 0x06, 0x2c, 0x5c, 0x43, 0x2b, 0xd1, + 0xef, 0xc8, 0xfb, 0x8a, 0xc4, 0xee, 0xa7, 0x37, 0x51, 0x8b, 0xc3, 0xf3, 0x39, 0x4e, 0x21, 0xf8, + 0x21, 0xba, 0xe3, 0x58, 0xe7, 0x5f, 0x9e, 0x7b, 0xd4, 0xb7, 0x04, 0x65, 0x6e, 0x03, 0x6c, 0xe6, + 0xb6, 0xb8, 0xba, 0x5a, 0x56, 0x76, 0xf2, 0xa6, 0x1a, 0xf6, 0x4b, 0x77, 0x1e, 0x4d, 0xd9, 0x27, + 0x53, 0x55, 0xf8, 0x3e, 0x5a, 0xf7, 0x4e, 0xe9, 0x79, 0x3d, 0x68, 0xf6, 0xa8, 0x7d, 0x0c, 0x17, + 0x6a, 0xa1, 0xac, 0xec, 0xac, 0x99, 0x5b, 0x61, 0xbf, 0xb4, 0x5e, 0x3f, 0x3e, 0xfa, 0x6e, 0xb0, + 0x41, 0xc6, 0xf3, 0x70, 0x15, 0x6d, 0x79, 0x3e, 0x63, 0xed, 0xc7, 0xed, 0x3a, 0xe3, 0x1c, 0x38, + 0xa7, 0xcc, 0x55, 0x91, 0x14, 0xdf, 0x8d, 0x2e, 0xa6, 0x3e, 0xb9, 0x49, 0xb2, 0xf9, 0x95, 0xbf, + 0x17, 0xd1, 0x3b, 0xaf, 0xf8, 0x12, 0x60, 0x1b, 0xa1, 0xc8, 0x26, 0x8d, 0x1c, 0x73, 0x55, 0x91, + 0x4f, 0xcf, 0x98, 0xef, 0x55, 0x57, 0x53, 0xdd, 0xf0, 0xa9, 0x0c, 0x42, 0x9c, 0x8c, 0x60, 0xf1, + 0x21, 0xda, 0x1c, 0x79, 0xc1, 0xd5, 0xae, 0x45, 0xdd, 0xe4, 0xcd, 0xa8, 0x89, 0x72, 0xb3, 0x3a, + 0xb1, 0x4f, 0x32, 0x0a, 0xfc, 0x2d, 0x2a, 0xb8, 0x4c, 0x98, 0xd0, 0x66, 0x7e, 0x3c, 0xef, 0xc5, + 0xbd, 0x0f, 0xe6, 0x73, 0x7a, 0x42, 0x1d, 0x30, 0xd7, 0xc3, 0x7e, 0xa9, 0x50, 0x4b, 0x01, 0x64, + 0xc8, 0xc2, 0x6d, 0xb4, 0xd1, 0x84, 0x0e, 0x75, 0x09, 0xb4, 0x7d, 0xe0, 0xdd, 0x03, 0x21, 0x9f, + 0xc0, 0xeb, 0xd1, 0x71, 0xd8, 0x2f, 0x6d, 0x98, 0x63, 0x14, 0x32, 0x41, 0xc5, 0x27, 0xd1, 0xfc, + 0x8b, 0x83, 0xb6, 0x00, 0x5f, 0xce, 0xff, 0xeb, 0x55, 0x58, 0x8b, 0xdf, 0x49, 0xac, 0x27, 0x03, + 0x92, 0xf9, 0xd5, 0xe5, 0x95, 0x96, 0x7b, 0x7e, 0xa5, 0xe5, 0x5e, 0x5c, 0x69, 0xb9, 0x5f, 0x42, + 0x4d, 0xb9, 0x0c, 0x35, 0xe5, 0x79, 0xa8, 0x29, 0x2f, 0x42, 0x4d, 0xf9, 0x27, 0xd4, 0x94, 0xdf, + 0xfe, 0xd5, 0x72, 0x4f, 0xcb, 0xd7, 0xfd, 0xd9, 0xfc, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x6c, + 0x5a, 0xc4, 0x8f, 0x0a, 0x00, 0x00, } func (m *ClusterTrustBundle) Marshal() (dAtA []byte, err error) { @@ -292,6 +441,261 @@ func (m *ClusterTrustBundleSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *PodCertificateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodCertificateRequestList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequestList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequestList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodCertificateRequestSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequestSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequestSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ProofOfPossession != nil { + i -= len(m.ProofOfPossession) + copy(dAtA[i:], m.ProofOfPossession) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ProofOfPossession))) + i-- + dAtA[i] = 0x52 + } + if m.PKIXPublicKey != nil { + i -= len(m.PKIXPublicKey) + copy(dAtA[i:], m.PKIXPublicKey) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PKIXPublicKey))) + i-- + dAtA[i] = 0x4a + } + if m.MaxExpirationSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxExpirationSeconds)) + i-- + dAtA[i] = 0x40 + } + i -= len(m.NodeUID) + copy(dAtA[i:], m.NodeUID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeUID))) + i-- + dAtA[i] = 0x3a + i -= len(m.NodeName) + copy(dAtA[i:], m.NodeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName))) + i-- + dAtA[i] = 0x32 + i -= len(m.ServiceAccountUID) + copy(dAtA[i:], m.ServiceAccountUID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ServiceAccountUID))) + i-- + dAtA[i] = 0x2a + i -= len(m.ServiceAccountName) + copy(dAtA[i:], m.ServiceAccountName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ServiceAccountName))) + i-- + dAtA[i] = 0x22 + i -= len(m.PodUID) + copy(dAtA[i:], m.PodUID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PodUID))) + i-- + dAtA[i] = 0x1a + i -= len(m.PodName) + copy(dAtA[i:], m.PodName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PodName))) + i-- + dAtA[i] = 0x12 + i -= len(m.SignerName) + copy(dAtA[i:], m.SignerName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.SignerName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodCertificateRequestStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequestStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequestStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.NotAfter != nil { + { + size, err := m.NotAfter.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.BeginRefreshAt != nil { + { + size, err := m.BeginRefreshAt.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.NotBefore != nil { + { + size, err := m.NotBefore.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + i -= len(m.CertificateChain) + copy(dAtA[i:], m.CertificateChain) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CertificateChain))) + i-- + dAtA[i] = 0x12 + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { offset -= sovGenerated(v) base := offset @@ -346,25 +750,120 @@ func (m *ClusterTrustBundleSpec) Size() (n int) { return n } -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *ClusterTrustBundle) String() string { - if this == nil { - return "nil" +func (m *PodCertificateRequest) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&ClusterTrustBundle{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ClusterTrustBundleSpec", "ClusterTrustBundleSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ClusterTrustBundleList) String() string { - if this == nil { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PodCertificateRequestList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *PodCertificateRequestSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SignerName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.PodName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.PodUID) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ServiceAccountName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ServiceAccountUID) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.NodeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.NodeUID) + n += 1 + l + sovGenerated(uint64(l)) + if m.MaxExpirationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.MaxExpirationSeconds)) + } + if m.PKIXPublicKey != nil { + l = len(m.PKIXPublicKey) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ProofOfPossession != nil { + l = len(m.ProofOfPossession) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *PodCertificateRequestStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.CertificateChain) + n += 1 + l + sovGenerated(uint64(l)) + if m.NotBefore != nil { + l = m.NotBefore.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.BeginRefreshAt != nil { + l = m.BeginRefreshAt.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NotAfter != nil { + l = m.NotAfter.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *ClusterTrustBundle) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterTrustBundle{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ClusterTrustBundleSpec", "ClusterTrustBundleSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ClusterTrustBundleList) String() string { + if this == nil { return "nil" } repeatedStringForItems := "[]ClusterTrustBundle{" @@ -390,6 +889,72 @@ func (this *ClusterTrustBundleSpec) String() string { }, "") return s } +func (this *PodCertificateRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodCertificateRequest{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "PodCertificateRequestSpec", "PodCertificateRequestSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "PodCertificateRequestStatus", "PodCertificateRequestStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PodCertificateRequestList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]PodCertificateRequest{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "PodCertificateRequest", "PodCertificateRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&PodCertificateRequestList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *PodCertificateRequestSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodCertificateRequestSpec{`, + `SignerName:` + fmt.Sprintf("%v", this.SignerName) + `,`, + `PodName:` + fmt.Sprintf("%v", this.PodName) + `,`, + `PodUID:` + fmt.Sprintf("%v", this.PodUID) + `,`, + `ServiceAccountName:` + fmt.Sprintf("%v", this.ServiceAccountName) + `,`, + `ServiceAccountUID:` + fmt.Sprintf("%v", this.ServiceAccountUID) + `,`, + `NodeName:` + fmt.Sprintf("%v", this.NodeName) + `,`, + `NodeUID:` + fmt.Sprintf("%v", this.NodeUID) + `,`, + `MaxExpirationSeconds:` + valueToStringGenerated(this.MaxExpirationSeconds) + `,`, + `PKIXPublicKey:` + valueToStringGenerated(this.PKIXPublicKey) + `,`, + `ProofOfPossession:` + valueToStringGenerated(this.ProofOfPossession) + `,`, + `}`, + }, "") + return s +} +func (this *PodCertificateRequestStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&PodCertificateRequestStatus{`, + `Conditions:` + repeatedStringForConditions + `,`, + `CertificateChain:` + fmt.Sprintf("%v", this.CertificateChain) + `,`, + `NotBefore:` + strings.Replace(fmt.Sprintf("%v", this.NotBefore), "Time", "v1.Time", 1) + `,`, + `BeginRefreshAt:` + strings.Replace(fmt.Sprintf("%v", this.BeginRefreshAt), "Time", "v1.Time", 1) + `,`, + `NotAfter:` + strings.Replace(fmt.Sprintf("%v", this.NotAfter), "Time", "v1.Time", 1) + `,`, + `}`, + }, "") + return s +} func valueToStringGenerated(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -745,6 +1310,858 @@ func (m *ClusterTrustBundleSpec) Unmarshal(dAtA []byte) error { } return nil } +func (m *PodCertificateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateRequestList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequestList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequestList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, PodCertificateRequest{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateRequestSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequestSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequestSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignerName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignerName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PodName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PodUID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceAccountName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceAccountUID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeName = k8s_io_apimachinery_pkg_types.NodeName(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeUID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxExpirationSeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.MaxExpirationSeconds = &v + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PKIXPublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PKIXPublicKey = append(m.PKIXPublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PKIXPublicKey == nil { + m.PKIXPublicKey = []byte{} + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProofOfPossession", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProofOfPossession = append(m.ProofOfPossession[:0], dAtA[iNdEx:postIndex]...) + if m.ProofOfPossession == nil { + m.ProofOfPossession = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateRequestStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequestStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequestStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CertificateChain", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CertificateChain = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NotBefore", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NotBefore == nil { + m.NotBefore = &v1.Time{} + } + if err := m.NotBefore.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeginRefreshAt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BeginRefreshAt == nil { + m.BeginRefreshAt = &v1.Time{} + } + if err := m.BeginRefreshAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NotAfter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NotAfter == nil { + m.NotAfter = &v1.Time{} + } + if err := m.NotAfter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipGenerated(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/vendor/k8s.io/api/certificates/v1alpha1/generated.proto b/vendor/k8s.io/api/certificates/v1alpha1/generated.proto index 7155f778cf..194bdbc14f 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1alpha1/generated.proto @@ -101,3 +101,208 @@ message ClusterTrustBundleSpec { optional string trustBundle = 2; } +// PodCertificateRequest encodes a pod requesting a certificate from a given +// signer. +// +// Kubelets use this API to implement podCertificate projected volumes +message PodCertificateRequest { + // metadata contains the object metadata. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // spec contains the details about the certificate being requested. + optional PodCertificateRequestSpec spec = 2; + + // status contains the issued certificate, and a standard set of conditions. + // +optional + optional PodCertificateRequestStatus status = 3; +} + +// PodCertificateRequestList is a collection of PodCertificateRequest objects +message PodCertificateRequestList { + // metadata contains the list metadata. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is a collection of PodCertificateRequest objects + repeated PodCertificateRequest items = 2; +} + +// PodCertificateRequestSpec describes the certificate request. All fields are +// immutable after creation. +message PodCertificateRequestSpec { + // signerName indicates the requested signer. + // + // All signer names beginning with `kubernetes.io` are reserved for use by + // the Kubernetes project. There is currently one well-known signer + // documented by the Kubernetes project, + // `kubernetes.io/kube-apiserver-client-pod`, which will issue client + // certificates understood by kube-apiserver. It is currently + // unimplemented. + // + // +required + optional string signerName = 1; + + // podName is the name of the pod into which the certificate will be mounted. + // + // +required + optional string podName = 2; + + // podUID is the UID of the pod into which the certificate will be mounted. + // + // +required + optional string podUID = 3; + + // serviceAccountName is the name of the service account the pod is running as. + // + // +required + optional string serviceAccountName = 4; + + // serviceAccountUID is the UID of the service account the pod is running as. + // + // +required + optional string serviceAccountUID = 5; + + // nodeName is the name of the node the pod is assigned to. + // + // +required + optional string nodeName = 6; + + // nodeUID is the UID of the node the pod is assigned to. + // + // +required + optional string nodeUID = 7; + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + // +default=86400 + optional int32 maxExpirationSeconds = 8; + + // pkixPublicKey is the PKIX-serialized public key the signer will issue the + // certificate to. + // + // The key must be one of RSA3072, RSA4096, ECDSAP256, ECDSAP384, ECDSAP521, + // or ED25519. Note that this list may be expanded in the future. + // + // Signer implementations do not need to support all key types supported by + // kube-apiserver and kubelet. If a signer does not support the key type + // used for a given PodCertificateRequest, it must deny the request by + // setting a status.conditions entry with a type of "Denied" and a reason of + // "UnsupportedKeyType". It may also suggest a key type that it does support + // in the message field. + // + // +required + optional bytes pkixPublicKey = 9; + + // proofOfPossession proves that the requesting kubelet holds the private + // key corresponding to pkixPublicKey. + // + // It is contructed by signing the ASCII bytes of the pod's UID using + // `pkixPublicKey`. + // + // kube-apiserver validates the proof of possession during creation of the + // PodCertificateRequest. + // + // If the key is an RSA key, then the signature is over the ASCII bytes of + // the pod UID, using RSASSA-PSS from RFC 8017 (as implemented by the golang + // function crypto/rsa.SignPSS with nil options). + // + // If the key is an ECDSA key, then the signature is as described by [SEC 1, + // Version 2.0](https://www.secg.org/sec1-v2.pdf) (as implemented by the + // golang library function crypto/ecdsa.SignASN1) + // + // If the key is an ED25519 key, the the signature is as described by the + // [ED25519 Specification](https://ed25519.cr.yp.to/) (as implemented by + // the golang library crypto/ed25519.Sign). + // + // +required + optional bytes proofOfPossession = 10; +} + +// PodCertificateRequestStatus describes the status of the request, and holds +// the certificate data if the request is issued. +message PodCertificateRequestStatus { + // conditions applied to the request. + // + // The types "Issued", "Denied", and "Failed" have special handling. At + // most one of these conditions may be present, and they must have status + // "True". + // + // If the request is denied with `Reason=UnsupportedKeyType`, the signer may + // suggest a key type that will work in the message field. + // + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + // +optional + repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 1; + + // certificateChain is populated with an issued certificate by the signer. + // This field is set via the /status subresource. Once populated, this field + // is immutable. + // + // If the certificate signing request is denied, a condition of type + // "Denied" is added and this field remains empty. If the signer cannot + // issue the certificate, a condition of type "Failed" is added and this + // field remains empty. + // + // Validation requirements: + // 1. certificateChain must consist of one or more PEM-formatted certificates. + // 2. Each entry must be a valid PEM-wrapped, DER-encoded ASN.1 Certificate as + // described in section 4 of RFC5280. + // + // If more than one block is present, and the definition of the requested + // spec.signerName does not indicate otherwise, the first block is the + // issued certificate, and subsequent blocks should be treated as + // intermediate certificates and presented in TLS handshakes. When + // projecting the chain into a pod volume, kubelet will drop any data + // in-between the PEM blocks, as well as any PEM block headers. + // + // +optional + optional string certificateChain = 2; + + // notBefore is the time at which the certificate becomes valid. The value + // must be the same as the notBefore value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time notBefore = 4; + + // beginRefreshAt is the time at which the kubelet should begin trying to + // refresh the certificate. This field is set via the /status subresource, + // and must be set at the same time as certificateChain. Once populated, + // this field is immutable. + // + // This field is only a hint. Kubelet may start refreshing before or after + // this time if necessary. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time beginRefreshAt = 5; + + // notAfter is the time at which the certificate expires. The value must be + // the same as the notAfter value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time notAfter = 6; +} + diff --git a/vendor/k8s.io/api/certificates/v1alpha1/register.go b/vendor/k8s.io/api/certificates/v1alpha1/register.go index 7288ed9a3e..ae541e15c1 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/register.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/register.go @@ -53,6 +53,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &ClusterTrustBundle{}, &ClusterTrustBundleList{}, + &PodCertificateRequest{}, + &PodCertificateRequestList{}, ) // Add the watch version that applies diff --git a/vendor/k8s.io/api/certificates/v1alpha1/types.go b/vendor/k8s.io/api/certificates/v1alpha1/types.go index beef02599d..a5cb3809e7 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/types.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/types.go @@ -18,6 +18,7 @@ package v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" ) // +genclient @@ -106,3 +107,233 @@ type ClusterTrustBundleList struct { // items is a collection of ClusterTrustBundle objects Items []ClusterTrustBundle `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// +genclient +// +k8s:prerelease-lifecycle-gen:introduced=1.34 +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// PodCertificateRequest encodes a pod requesting a certificate from a given +// signer. +// +// Kubelets use this API to implement podCertificate projected volumes +type PodCertificateRequest struct { + metav1.TypeMeta `json:",inline"` + + // metadata contains the object metadata. + // + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // spec contains the details about the certificate being requested. + Spec PodCertificateRequestSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` + + // status contains the issued certificate, and a standard set of conditions. + // +optional + Status PodCertificateRequestStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// PodCertificateRequestSpec describes the certificate request. All fields are +// immutable after creation. +type PodCertificateRequestSpec struct { + // signerName indicates the requested signer. + // + // All signer names beginning with `kubernetes.io` are reserved for use by + // the Kubernetes project. There is currently one well-known signer + // documented by the Kubernetes project, + // `kubernetes.io/kube-apiserver-client-pod`, which will issue client + // certificates understood by kube-apiserver. It is currently + // unimplemented. + // + // +required + SignerName string `json:"signerName" protobuf:"bytes,1,opt,name=signerName"` + + // podName is the name of the pod into which the certificate will be mounted. + // + // +required + PodName string `json:"podName" protobuf:"bytes,2,opt,name=podName"` + // podUID is the UID of the pod into which the certificate will be mounted. + // + // +required + PodUID types.UID `json:"podUID" protobuf:"bytes,3,opt,name=podUID"` + + // serviceAccountName is the name of the service account the pod is running as. + // + // +required + ServiceAccountName string `json:"serviceAccountName" protobuf:"bytes,4,opt,name=serviceAccountName"` + // serviceAccountUID is the UID of the service account the pod is running as. + // + // +required + ServiceAccountUID types.UID `json:"serviceAccountUID" protobuf:"bytes,5,opt,name=serviceAccountUID"` + + // nodeName is the name of the node the pod is assigned to. + // + // +required + NodeName types.NodeName `json:"nodeName" protobuf:"bytes,6,opt,name=nodeName"` + // nodeUID is the UID of the node the pod is assigned to. + // + // +required + NodeUID types.UID `json:"nodeUID" protobuf:"bytes,7,opt,name=nodeUID"` + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + // +default=86400 + MaxExpirationSeconds *int32 `json:"maxExpirationSeconds,omitempty" protobuf:"varint,8,opt,name=maxExpirationSeconds"` + + // pkixPublicKey is the PKIX-serialized public key the signer will issue the + // certificate to. + // + // The key must be one of RSA3072, RSA4096, ECDSAP256, ECDSAP384, ECDSAP521, + // or ED25519. Note that this list may be expanded in the future. + // + // Signer implementations do not need to support all key types supported by + // kube-apiserver and kubelet. If a signer does not support the key type + // used for a given PodCertificateRequest, it must deny the request by + // setting a status.conditions entry with a type of "Denied" and a reason of + // "UnsupportedKeyType". It may also suggest a key type that it does support + // in the message field. + // + // +required + PKIXPublicKey []byte `json:"pkixPublicKey" protobuf:"bytes,9,opt,name=pkixPublicKey"` + + // proofOfPossession proves that the requesting kubelet holds the private + // key corresponding to pkixPublicKey. + // + // It is contructed by signing the ASCII bytes of the pod's UID using + // `pkixPublicKey`. + // + // kube-apiserver validates the proof of possession during creation of the + // PodCertificateRequest. + // + // If the key is an RSA key, then the signature is over the ASCII bytes of + // the pod UID, using RSASSA-PSS from RFC 8017 (as implemented by the golang + // function crypto/rsa.SignPSS with nil options). + // + // If the key is an ECDSA key, then the signature is as described by [SEC 1, + // Version 2.0](https://www.secg.org/sec1-v2.pdf) (as implemented by the + // golang library function crypto/ecdsa.SignASN1) + // + // If the key is an ED25519 key, the the signature is as described by the + // [ED25519 Specification](https://ed25519.cr.yp.to/) (as implemented by + // the golang library crypto/ed25519.Sign). + // + // +required + ProofOfPossession []byte `json:"proofOfPossession" protobuf:"bytes,10,opt,name=proofOfPossession"` +} + +// PodCertificateRequestStatus describes the status of the request, and holds +// the certificate data if the request is issued. +type PodCertificateRequestStatus struct { + // conditions applied to the request. + // + // The types "Issued", "Denied", and "Failed" have special handling. At + // most one of these conditions may be present, and they must have status + // "True". + // + // If the request is denied with `Reason=UnsupportedKeyType`, the signer may + // suggest a key type that will work in the message field. + // + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` + + // certificateChain is populated with an issued certificate by the signer. + // This field is set via the /status subresource. Once populated, this field + // is immutable. + // + // If the certificate signing request is denied, a condition of type + // "Denied" is added and this field remains empty. If the signer cannot + // issue the certificate, a condition of type "Failed" is added and this + // field remains empty. + // + // Validation requirements: + // 1. certificateChain must consist of one or more PEM-formatted certificates. + // 2. Each entry must be a valid PEM-wrapped, DER-encoded ASN.1 Certificate as + // described in section 4 of RFC5280. + // + // If more than one block is present, and the definition of the requested + // spec.signerName does not indicate otherwise, the first block is the + // issued certificate, and subsequent blocks should be treated as + // intermediate certificates and presented in TLS handshakes. When + // projecting the chain into a pod volume, kubelet will drop any data + // in-between the PEM blocks, as well as any PEM block headers. + // + // +optional + CertificateChain string `json:"certificateChain,omitempty" protobuf:"bytes,2,opt,name=certificateChain"` + + // notBefore is the time at which the certificate becomes valid. The value + // must be the same as the notBefore value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + NotBefore *metav1.Time `json:"notBefore,omitempty" protobuf:"bytes,4,opt,name=notBefore"` + + // beginRefreshAt is the time at which the kubelet should begin trying to + // refresh the certificate. This field is set via the /status subresource, + // and must be set at the same time as certificateChain. Once populated, + // this field is immutable. + // + // This field is only a hint. Kubelet may start refreshing before or after + // this time if necessary. + // + // +optional + BeginRefreshAt *metav1.Time `json:"beginRefreshAt,omitempty" protobuf:"bytes,5,opt,name=beginRefreshAt"` + + // notAfter is the time at which the certificate expires. The value must be + // the same as the notAfter value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + NotAfter *metav1.Time `json:"notAfter,omitempty" protobuf:"bytes,6,opt,name=notAfter"` +} + +// Well-known condition types for PodCertificateRequests +const ( + // Denied indicates the request was denied by the signer. + PodCertificateRequestConditionTypeDenied string = "Denied" + // Failed indicates the signer failed to issue the certificate. + PodCertificateRequestConditionTypeFailed string = "Failed" + // Issued indicates the certificate has been issued. + PodCertificateRequestConditionTypeIssued string = "Issued" +) + +// Well-known condition reasons for PodCertificateRequests +const ( + // UnsupportedKeyType should be set on "Denied" conditions when the signer + // doesn't support the key type of publicKey. + PodCertificateRequestConditionUnsupportedKeyType string = "UnsupportedKeyType" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// PodCertificateRequestList is a collection of PodCertificateRequest objects +type PodCertificateRequestList struct { + metav1.TypeMeta `json:",inline"` + + // metadata contains the list metadata. + // + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // items is a collection of PodCertificateRequest objects + Items []PodCertificateRequest `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go index bff649e3cb..d29f2d8505 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go @@ -57,4 +57,56 @@ func (ClusterTrustBundleSpec) SwaggerDoc() map[string]string { return map_ClusterTrustBundleSpec } +var map_PodCertificateRequest = map[string]string{ + "": "PodCertificateRequest encodes a pod requesting a certificate from a given signer.\n\nKubelets use this API to implement podCertificate projected volumes", + "metadata": "metadata contains the object metadata.", + "spec": "spec contains the details about the certificate being requested.", + "status": "status contains the issued certificate, and a standard set of conditions.", +} + +func (PodCertificateRequest) SwaggerDoc() map[string]string { + return map_PodCertificateRequest +} + +var map_PodCertificateRequestList = map[string]string{ + "": "PodCertificateRequestList is a collection of PodCertificateRequest objects", + "metadata": "metadata contains the list metadata.", + "items": "items is a collection of PodCertificateRequest objects", +} + +func (PodCertificateRequestList) SwaggerDoc() map[string]string { + return map_PodCertificateRequestList +} + +var map_PodCertificateRequestSpec = map[string]string{ + "": "PodCertificateRequestSpec describes the certificate request. All fields are immutable after creation.", + "signerName": "signerName indicates the requested signer.\n\nAll signer names beginning with `kubernetes.io` are reserved for use by the Kubernetes project. There is currently one well-known signer documented by the Kubernetes project, `kubernetes.io/kube-apiserver-client-pod`, which will issue client certificates understood by kube-apiserver. It is currently unimplemented.", + "podName": "podName is the name of the pod into which the certificate will be mounted.", + "podUID": "podUID is the UID of the pod into which the certificate will be mounted.", + "serviceAccountName": "serviceAccountName is the name of the service account the pod is running as.", + "serviceAccountUID": "serviceAccountUID is the UID of the service account the pod is running as.", + "nodeName": "nodeName is the name of the node the pod is assigned to.", + "nodeUID": "nodeUID is the UID of the node the pod is assigned to.", + "maxExpirationSeconds": "maxExpirationSeconds is the maximum lifetime permitted for the certificate.\n\nIf omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver will reject values shorter than 3600 (1 hour). The maximum allowable value is 7862400 (91 days).\n\nThe signer implementation is then free to issue a certificate with any lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 seconds (1 hour). This constraint is enforced by kube-apiserver. `kubernetes.io` signers will never issue certificates with a lifetime longer than 24 hours.", + "pkixPublicKey": "pkixPublicKey is the PKIX-serialized public key the signer will issue the certificate to.\n\nThe key must be one of RSA3072, RSA4096, ECDSAP256, ECDSAP384, ECDSAP521, or ED25519. Note that this list may be expanded in the future.\n\nSigner implementations do not need to support all key types supported by kube-apiserver and kubelet. If a signer does not support the key type used for a given PodCertificateRequest, it must deny the request by setting a status.conditions entry with a type of \"Denied\" and a reason of \"UnsupportedKeyType\". It may also suggest a key type that it does support in the message field.", + "proofOfPossession": "proofOfPossession proves that the requesting kubelet holds the private key corresponding to pkixPublicKey.\n\nIt is contructed by signing the ASCII bytes of the pod's UID using `pkixPublicKey`.\n\nkube-apiserver validates the proof of possession during creation of the PodCertificateRequest.\n\nIf the key is an RSA key, then the signature is over the ASCII bytes of the pod UID, using RSASSA-PSS from RFC 8017 (as implemented by the golang function crypto/rsa.SignPSS with nil options).\n\nIf the key is an ECDSA key, then the signature is as described by [SEC 1, Version 2.0](https://www.secg.org/sec1-v2.pdf) (as implemented by the golang library function crypto/ecdsa.SignASN1)\n\nIf the key is an ED25519 key, the the signature is as described by the [ED25519 Specification](https://ed25519.cr.yp.to/) (as implemented by the golang library crypto/ed25519.Sign).", +} + +func (PodCertificateRequestSpec) SwaggerDoc() map[string]string { + return map_PodCertificateRequestSpec +} + +var map_PodCertificateRequestStatus = map[string]string{ + "": "PodCertificateRequestStatus describes the status of the request, and holds the certificate data if the request is issued.", + "conditions": "conditions applied to the request.\n\nThe types \"Issued\", \"Denied\", and \"Failed\" have special handling. At most one of these conditions may be present, and they must have status \"True\".\n\nIf the request is denied with `Reason=UnsupportedKeyType`, the signer may suggest a key type that will work in the message field.", + "certificateChain": "certificateChain is populated with an issued certificate by the signer. This field is set via the /status subresource. Once populated, this field is immutable.\n\nIf the certificate signing request is denied, a condition of type \"Denied\" is added and this field remains empty. If the signer cannot issue the certificate, a condition of type \"Failed\" is added and this field remains empty.\n\nValidation requirements:\n 1. certificateChain must consist of one or more PEM-formatted certificates.\n 2. Each entry must be a valid PEM-wrapped, DER-encoded ASN.1 Certificate as\n described in section 4 of RFC5280.\n\nIf more than one block is present, and the definition of the requested spec.signerName does not indicate otherwise, the first block is the issued certificate, and subsequent blocks should be treated as intermediate certificates and presented in TLS handshakes. When projecting the chain into a pod volume, kubelet will drop any data in-between the PEM blocks, as well as any PEM block headers.", + "notBefore": "notBefore is the time at which the certificate becomes valid. The value must be the same as the notBefore value in the leaf certificate in certificateChain. This field is set via the /status subresource. Once populated, it is immutable. The signer must set this field at the same time it sets certificateChain.", + "beginRefreshAt": "beginRefreshAt is the time at which the kubelet should begin trying to refresh the certificate. This field is set via the /status subresource, and must be set at the same time as certificateChain. Once populated, this field is immutable.\n\nThis field is only a hint. Kubelet may start refreshing before or after this time if necessary.", + "notAfter": "notAfter is the time at which the certificate expires. The value must be the same as the notAfter value in the leaf certificate in certificateChain. This field is set via the /status subresource. Once populated, it is immutable. The signer must set this field at the same time it sets certificateChain.", +} + +func (PodCertificateRequestStatus) SwaggerDoc() map[string]string { + return map_PodCertificateRequestStatus +} + // AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go index 30a4dc1e80..25bc0ed6cb 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go @@ -22,6 +22,7 @@ limitations under the License. package v1alpha1 import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -100,3 +101,130 @@ func (in *ClusterTrustBundleSpec) DeepCopy() *ClusterTrustBundleSpec { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequest) DeepCopyInto(out *PodCertificateRequest) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequest. +func (in *PodCertificateRequest) DeepCopy() *PodCertificateRequest { + if in == nil { + return nil + } + out := new(PodCertificateRequest) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodCertificateRequest) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequestList) DeepCopyInto(out *PodCertificateRequestList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]PodCertificateRequest, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequestList. +func (in *PodCertificateRequestList) DeepCopy() *PodCertificateRequestList { + if in == nil { + return nil + } + out := new(PodCertificateRequestList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodCertificateRequestList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequestSpec) DeepCopyInto(out *PodCertificateRequestSpec) { + *out = *in + if in.MaxExpirationSeconds != nil { + in, out := &in.MaxExpirationSeconds, &out.MaxExpirationSeconds + *out = new(int32) + **out = **in + } + if in.PKIXPublicKey != nil { + in, out := &in.PKIXPublicKey, &out.PKIXPublicKey + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.ProofOfPossession != nil { + in, out := &in.ProofOfPossession, &out.ProofOfPossession + *out = make([]byte, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequestSpec. +func (in *PodCertificateRequestSpec) DeepCopy() *PodCertificateRequestSpec { + if in == nil { + return nil + } + out := new(PodCertificateRequestSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequestStatus) DeepCopyInto(out *PodCertificateRequestStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.NotBefore != nil { + in, out := &in.NotBefore, &out.NotBefore + *out = (*in).DeepCopy() + } + if in.BeginRefreshAt != nil { + in, out := &in.BeginRefreshAt, &out.BeginRefreshAt + *out = (*in).DeepCopy() + } + if in.NotAfter != nil { + in, out := &in.NotAfter, &out.NotAfter + *out = (*in).DeepCopy() + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequestStatus. +func (in *PodCertificateRequestStatus) DeepCopy() *PodCertificateRequestStatus { + if in == nil { + return nil + } + out := new(PodCertificateRequestStatus) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go index 3121a87d08..edbfce79bc 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go @@ -56,3 +56,39 @@ func (in *ClusterTrustBundleList) APILifecycleDeprecated() (major, minor int) { func (in *ClusterTrustBundleList) APILifecycleRemoved() (major, minor int) { return 1, 37 } + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *PodCertificateRequest) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *PodCertificateRequest) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *PodCertificateRequest) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *PodCertificateRequestList) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *PodCertificateRequestList) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *PodCertificateRequestList) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} diff --git a/vendor/k8s.io/api/certificates/v1beta1/generated.proto b/vendor/k8s.io/api/certificates/v1beta1/generated.proto index 7c48270f65..4c9385c196 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1beta1/generated.proto @@ -30,6 +30,8 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; option go_package = "k8s.io/api/certificates/v1beta1"; // Describes a certificate signing request +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval message CertificateSigningRequest { // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; @@ -182,6 +184,11 @@ message CertificateSigningRequestStatus { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember repeated CertificateSigningRequestCondition conditions = 1; // If request was approved, the controller will place the issued certificate here. diff --git a/vendor/k8s.io/api/certificates/v1beta1/types.go b/vendor/k8s.io/api/certificates/v1beta1/types.go index 1ce104807d..fadb7e082e 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/types.go +++ b/vendor/k8s.io/api/certificates/v1beta1/types.go @@ -31,6 +31,8 @@ import ( // +k8s:prerelease-lifecycle-gen:replacement=certificates.k8s.io,v1,CertificateSigningRequest // Describes a certificate signing request +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval type CertificateSigningRequest struct { metav1.TypeMeta `json:",inline"` // +optional @@ -175,6 +177,11 @@ type CertificateSigningRequestStatus struct { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember Conditions []CertificateSigningRequestCondition `json:"conditions,omitempty" protobuf:"bytes,1,rep,name=conditions"` // If request was approved, the controller will place the issued certificate here. diff --git a/vendor/k8s.io/api/core/v1/generated.pb.go b/vendor/k8s.io/api/core/v1/generated.pb.go index a4b8f58429..e1a297b985 100644 --- a/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/vendor/k8s.io/api/core/v1/generated.pb.go @@ -861,10 +861,38 @@ func (m *Container) XXX_DiscardUnknown() { var xxx_messageInfo_Container proto.InternalMessageInfo +func (m *ContainerExtendedResourceRequest) Reset() { *m = ContainerExtendedResourceRequest{} } +func (*ContainerExtendedResourceRequest) ProtoMessage() {} +func (*ContainerExtendedResourceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{29} +} +func (m *ContainerExtendedResourceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerExtendedResourceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ContainerExtendedResourceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerExtendedResourceRequest.Merge(m, src) +} +func (m *ContainerExtendedResourceRequest) XXX_Size() int { + return m.Size() +} +func (m *ContainerExtendedResourceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerExtendedResourceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerExtendedResourceRequest proto.InternalMessageInfo + func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} func (*ContainerImage) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{29} + return fileDescriptor_6c07b07c062484ab, []int{30} } func (m *ContainerImage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -892,7 +920,7 @@ var xxx_messageInfo_ContainerImage proto.InternalMessageInfo func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} func (*ContainerPort) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{30} + return fileDescriptor_6c07b07c062484ab, []int{31} } func (m *ContainerPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -920,7 +948,7 @@ var xxx_messageInfo_ContainerPort proto.InternalMessageInfo func (m *ContainerResizePolicy) Reset() { *m = ContainerResizePolicy{} } func (*ContainerResizePolicy) ProtoMessage() {} func (*ContainerResizePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{31} + return fileDescriptor_6c07b07c062484ab, []int{32} } func (m *ContainerResizePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,10 +973,66 @@ func (m *ContainerResizePolicy) XXX_DiscardUnknown() { var xxx_messageInfo_ContainerResizePolicy proto.InternalMessageInfo +func (m *ContainerRestartRule) Reset() { *m = ContainerRestartRule{} } +func (*ContainerRestartRule) ProtoMessage() {} +func (*ContainerRestartRule) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{33} +} +func (m *ContainerRestartRule) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerRestartRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ContainerRestartRule) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerRestartRule.Merge(m, src) +} +func (m *ContainerRestartRule) XXX_Size() int { + return m.Size() +} +func (m *ContainerRestartRule) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerRestartRule.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerRestartRule proto.InternalMessageInfo + +func (m *ContainerRestartRuleOnExitCodes) Reset() { *m = ContainerRestartRuleOnExitCodes{} } +func (*ContainerRestartRuleOnExitCodes) ProtoMessage() {} +func (*ContainerRestartRuleOnExitCodes) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{34} +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerRestartRuleOnExitCodes.Merge(m, src) +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Size() int { + return m.Size() +} +func (m *ContainerRestartRuleOnExitCodes) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerRestartRuleOnExitCodes.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerRestartRuleOnExitCodes proto.InternalMessageInfo + func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} func (*ContainerState) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{32} + return fileDescriptor_6c07b07c062484ab, []int{35} } func (m *ContainerState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -976,7 +1060,7 @@ var xxx_messageInfo_ContainerState proto.InternalMessageInfo func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} func (*ContainerStateRunning) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{33} + return fileDescriptor_6c07b07c062484ab, []int{36} } func (m *ContainerStateRunning) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1004,7 +1088,7 @@ var xxx_messageInfo_ContainerStateRunning proto.InternalMessageInfo func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{34} + return fileDescriptor_6c07b07c062484ab, []int{37} } func (m *ContainerStateTerminated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1032,7 +1116,7 @@ var xxx_messageInfo_ContainerStateTerminated proto.InternalMessageInfo func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{35} + return fileDescriptor_6c07b07c062484ab, []int{38} } func (m *ContainerStateWaiting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1060,7 +1144,7 @@ var xxx_messageInfo_ContainerStateWaiting proto.InternalMessageInfo func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} func (*ContainerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{36} + return fileDescriptor_6c07b07c062484ab, []int{39} } func (m *ContainerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1088,7 +1172,7 @@ var xxx_messageInfo_ContainerStatus proto.InternalMessageInfo func (m *ContainerUser) Reset() { *m = ContainerUser{} } func (*ContainerUser) ProtoMessage() {} func (*ContainerUser) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{37} + return fileDescriptor_6c07b07c062484ab, []int{40} } func (m *ContainerUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1116,7 +1200,7 @@ var xxx_messageInfo_ContainerUser proto.InternalMessageInfo func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} func (*DaemonEndpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{38} + return fileDescriptor_6c07b07c062484ab, []int{41} } func (m *DaemonEndpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1144,7 +1228,7 @@ var xxx_messageInfo_DaemonEndpoint proto.InternalMessageInfo func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } func (*DownwardAPIProjection) ProtoMessage() {} func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{39} + return fileDescriptor_6c07b07c062484ab, []int{42} } func (m *DownwardAPIProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1172,7 +1256,7 @@ var xxx_messageInfo_DownwardAPIProjection proto.InternalMessageInfo func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{40} + return fileDescriptor_6c07b07c062484ab, []int{43} } func (m *DownwardAPIVolumeFile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1200,7 +1284,7 @@ var xxx_messageInfo_DownwardAPIVolumeFile proto.InternalMessageInfo func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{41} + return fileDescriptor_6c07b07c062484ab, []int{44} } func (m *DownwardAPIVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1228,7 +1312,7 @@ var xxx_messageInfo_DownwardAPIVolumeSource proto.InternalMessageInfo func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{42} + return fileDescriptor_6c07b07c062484ab, []int{45} } func (m *EmptyDirVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1256,7 +1340,7 @@ var xxx_messageInfo_EmptyDirVolumeSource proto.InternalMessageInfo func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} func (*EndpointAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{43} + return fileDescriptor_6c07b07c062484ab, []int{46} } func (m *EndpointAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1284,7 +1368,7 @@ var xxx_messageInfo_EndpointAddress proto.InternalMessageInfo func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} func (*EndpointPort) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{44} + return fileDescriptor_6c07b07c062484ab, []int{47} } func (m *EndpointPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1312,7 +1396,7 @@ var xxx_messageInfo_EndpointPort proto.InternalMessageInfo func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} func (*EndpointSubset) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{45} + return fileDescriptor_6c07b07c062484ab, []int{48} } func (m *EndpointSubset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1340,7 +1424,7 @@ var xxx_messageInfo_EndpointSubset proto.InternalMessageInfo func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} func (*Endpoints) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{46} + return fileDescriptor_6c07b07c062484ab, []int{49} } func (m *Endpoints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1368,7 +1452,7 @@ var xxx_messageInfo_Endpoints proto.InternalMessageInfo func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} func (*EndpointsList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{47} + return fileDescriptor_6c07b07c062484ab, []int{50} } func (m *EndpointsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1396,7 +1480,7 @@ var xxx_messageInfo_EndpointsList proto.InternalMessageInfo func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} func (*EnvFromSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{48} + return fileDescriptor_6c07b07c062484ab, []int{51} } func (m *EnvFromSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1424,7 +1508,7 @@ var xxx_messageInfo_EnvFromSource proto.InternalMessageInfo func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} func (*EnvVar) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{49} + return fileDescriptor_6c07b07c062484ab, []int{52} } func (m *EnvVar) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1452,7 +1536,7 @@ var xxx_messageInfo_EnvVar proto.InternalMessageInfo func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} func (*EnvVarSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{50} + return fileDescriptor_6c07b07c062484ab, []int{53} } func (m *EnvVarSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1480,7 +1564,7 @@ var xxx_messageInfo_EnvVarSource proto.InternalMessageInfo func (m *EphemeralContainer) Reset() { *m = EphemeralContainer{} } func (*EphemeralContainer) ProtoMessage() {} func (*EphemeralContainer) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{51} + return fileDescriptor_6c07b07c062484ab, []int{54} } func (m *EphemeralContainer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1508,7 +1592,7 @@ var xxx_messageInfo_EphemeralContainer proto.InternalMessageInfo func (m *EphemeralContainerCommon) Reset() { *m = EphemeralContainerCommon{} } func (*EphemeralContainerCommon) ProtoMessage() {} func (*EphemeralContainerCommon) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{52} + return fileDescriptor_6c07b07c062484ab, []int{55} } func (m *EphemeralContainerCommon) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1536,7 +1620,7 @@ var xxx_messageInfo_EphemeralContainerCommon proto.InternalMessageInfo func (m *EphemeralVolumeSource) Reset() { *m = EphemeralVolumeSource{} } func (*EphemeralVolumeSource) ProtoMessage() {} func (*EphemeralVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{53} + return fileDescriptor_6c07b07c062484ab, []int{56} } func (m *EphemeralVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1648,7 @@ var xxx_messageInfo_EphemeralVolumeSource proto.InternalMessageInfo func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{54} + return fileDescriptor_6c07b07c062484ab, []int{57} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1592,7 +1676,7 @@ var xxx_messageInfo_Event proto.InternalMessageInfo func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} func (*EventList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{55} + return fileDescriptor_6c07b07c062484ab, []int{58} } func (m *EventList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1620,7 +1704,7 @@ var xxx_messageInfo_EventList proto.InternalMessageInfo func (m *EventSeries) Reset() { *m = EventSeries{} } func (*EventSeries) ProtoMessage() {} func (*EventSeries) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{56} + return fileDescriptor_6c07b07c062484ab, []int{59} } func (m *EventSeries) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1648,7 +1732,7 @@ var xxx_messageInfo_EventSeries proto.InternalMessageInfo func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} func (*EventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{57} + return fileDescriptor_6c07b07c062484ab, []int{60} } func (m *EventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1676,7 +1760,7 @@ var xxx_messageInfo_EventSource proto.InternalMessageInfo func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} func (*ExecAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{58} + return fileDescriptor_6c07b07c062484ab, []int{61} } func (m *ExecAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1704,7 +1788,7 @@ var xxx_messageInfo_ExecAction proto.InternalMessageInfo func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} func (*FCVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{59} + return fileDescriptor_6c07b07c062484ab, []int{62} } func (m *FCVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1729,10 +1813,38 @@ func (m *FCVolumeSource) XXX_DiscardUnknown() { var xxx_messageInfo_FCVolumeSource proto.InternalMessageInfo +func (m *FileKeySelector) Reset() { *m = FileKeySelector{} } +func (*FileKeySelector) ProtoMessage() {} +func (*FileKeySelector) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{63} +} +func (m *FileKeySelector) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FileKeySelector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *FileKeySelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileKeySelector.Merge(m, src) +} +func (m *FileKeySelector) XXX_Size() int { + return m.Size() +} +func (m *FileKeySelector) XXX_DiscardUnknown() { + xxx_messageInfo_FileKeySelector.DiscardUnknown(m) +} + +var xxx_messageInfo_FileKeySelector proto.InternalMessageInfo + func (m *FlexPersistentVolumeSource) Reset() { *m = FlexPersistentVolumeSource{} } func (*FlexPersistentVolumeSource) ProtoMessage() {} func (*FlexPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{60} + return fileDescriptor_6c07b07c062484ab, []int{64} } func (m *FlexPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1760,7 +1872,7 @@ var xxx_messageInfo_FlexPersistentVolumeSource proto.InternalMessageInfo func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} func (*FlexVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{61} + return fileDescriptor_6c07b07c062484ab, []int{65} } func (m *FlexVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1788,7 +1900,7 @@ var xxx_messageInfo_FlexVolumeSource proto.InternalMessageInfo func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{62} + return fileDescriptor_6c07b07c062484ab, []int{66} } func (m *FlockerVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1816,7 +1928,7 @@ var xxx_messageInfo_FlockerVolumeSource proto.InternalMessageInfo func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{63} + return fileDescriptor_6c07b07c062484ab, []int{67} } func (m *GCEPersistentDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1844,7 +1956,7 @@ var xxx_messageInfo_GCEPersistentDiskVolumeSource proto.InternalMessageInfo func (m *GRPCAction) Reset() { *m = GRPCAction{} } func (*GRPCAction) ProtoMessage() {} func (*GRPCAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{64} + return fileDescriptor_6c07b07c062484ab, []int{68} } func (m *GRPCAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1872,7 +1984,7 @@ var xxx_messageInfo_GRPCAction proto.InternalMessageInfo func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{65} + return fileDescriptor_6c07b07c062484ab, []int{69} } func (m *GitRepoVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1900,7 +2012,7 @@ var xxx_messageInfo_GitRepoVolumeSource proto.InternalMessageInfo func (m *GlusterfsPersistentVolumeSource) Reset() { *m = GlusterfsPersistentVolumeSource{} } func (*GlusterfsPersistentVolumeSource) ProtoMessage() {} func (*GlusterfsPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{66} + return fileDescriptor_6c07b07c062484ab, []int{70} } func (m *GlusterfsPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1928,7 +2040,7 @@ var xxx_messageInfo_GlusterfsPersistentVolumeSource proto.InternalMessageInfo func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{67} + return fileDescriptor_6c07b07c062484ab, []int{71} } func (m *GlusterfsVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1956,7 +2068,7 @@ var xxx_messageInfo_GlusterfsVolumeSource proto.InternalMessageInfo func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} func (*HTTPGetAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{68} + return fileDescriptor_6c07b07c062484ab, []int{72} } func (m *HTTPGetAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1984,7 +2096,7 @@ var xxx_messageInfo_HTTPGetAction proto.InternalMessageInfo func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} func (*HTTPHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{69} + return fileDescriptor_6c07b07c062484ab, []int{73} } func (m *HTTPHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2012,7 +2124,7 @@ var xxx_messageInfo_HTTPHeader proto.InternalMessageInfo func (m *HostAlias) Reset() { *m = HostAlias{} } func (*HostAlias) ProtoMessage() {} func (*HostAlias) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{70} + return fileDescriptor_6c07b07c062484ab, []int{74} } func (m *HostAlias) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2040,7 +2152,7 @@ var xxx_messageInfo_HostAlias proto.InternalMessageInfo func (m *HostIP) Reset() { *m = HostIP{} } func (*HostIP) ProtoMessage() {} func (*HostIP) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{71} + return fileDescriptor_6c07b07c062484ab, []int{75} } func (m *HostIP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2068,7 +2180,7 @@ var xxx_messageInfo_HostIP proto.InternalMessageInfo func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{72} + return fileDescriptor_6c07b07c062484ab, []int{76} } func (m *HostPathVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2096,7 +2208,7 @@ var xxx_messageInfo_HostPathVolumeSource proto.InternalMessageInfo func (m *ISCSIPersistentVolumeSource) Reset() { *m = ISCSIPersistentVolumeSource{} } func (*ISCSIPersistentVolumeSource) ProtoMessage() {} func (*ISCSIPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{73} + return fileDescriptor_6c07b07c062484ab, []int{77} } func (m *ISCSIPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2124,7 +2236,7 @@ var xxx_messageInfo_ISCSIPersistentVolumeSource proto.InternalMessageInfo func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{74} + return fileDescriptor_6c07b07c062484ab, []int{78} } func (m *ISCSIVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2152,7 +2264,7 @@ var xxx_messageInfo_ISCSIVolumeSource proto.InternalMessageInfo func (m *ImageVolumeSource) Reset() { *m = ImageVolumeSource{} } func (*ImageVolumeSource) ProtoMessage() {} func (*ImageVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{75} + return fileDescriptor_6c07b07c062484ab, []int{79} } func (m *ImageVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2180,7 +2292,7 @@ var xxx_messageInfo_ImageVolumeSource proto.InternalMessageInfo func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} func (*KeyToPath) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{76} + return fileDescriptor_6c07b07c062484ab, []int{80} } func (m *KeyToPath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2208,7 +2320,7 @@ var xxx_messageInfo_KeyToPath proto.InternalMessageInfo func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} func (*Lifecycle) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{77} + return fileDescriptor_6c07b07c062484ab, []int{81} } func (m *Lifecycle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2236,7 +2348,7 @@ var xxx_messageInfo_Lifecycle proto.InternalMessageInfo func (m *LifecycleHandler) Reset() { *m = LifecycleHandler{} } func (*LifecycleHandler) ProtoMessage() {} func (*LifecycleHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{78} + return fileDescriptor_6c07b07c062484ab, []int{82} } func (m *LifecycleHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2264,7 +2376,7 @@ var xxx_messageInfo_LifecycleHandler proto.InternalMessageInfo func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} func (*LimitRange) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{79} + return fileDescriptor_6c07b07c062484ab, []int{83} } func (m *LimitRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2292,7 +2404,7 @@ var xxx_messageInfo_LimitRange proto.InternalMessageInfo func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} func (*LimitRangeItem) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{80} + return fileDescriptor_6c07b07c062484ab, []int{84} } func (m *LimitRangeItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2320,7 +2432,7 @@ var xxx_messageInfo_LimitRangeItem proto.InternalMessageInfo func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} func (*LimitRangeList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{81} + return fileDescriptor_6c07b07c062484ab, []int{85} } func (m *LimitRangeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2348,7 +2460,7 @@ var xxx_messageInfo_LimitRangeList proto.InternalMessageInfo func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} func (*LimitRangeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{82} + return fileDescriptor_6c07b07c062484ab, []int{86} } func (m *LimitRangeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2376,7 +2488,7 @@ var xxx_messageInfo_LimitRangeSpec proto.InternalMessageInfo func (m *LinuxContainerUser) Reset() { *m = LinuxContainerUser{} } func (*LinuxContainerUser) ProtoMessage() {} func (*LinuxContainerUser) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{83} + return fileDescriptor_6c07b07c062484ab, []int{87} } func (m *LinuxContainerUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2404,7 +2516,7 @@ var xxx_messageInfo_LinuxContainerUser proto.InternalMessageInfo func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{84} + return fileDescriptor_6c07b07c062484ab, []int{88} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2432,7 +2544,7 @@ var xxx_messageInfo_List proto.InternalMessageInfo func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{85} + return fileDescriptor_6c07b07c062484ab, []int{89} } func (m *LoadBalancerIngress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2460,7 +2572,7 @@ var xxx_messageInfo_LoadBalancerIngress proto.InternalMessageInfo func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{86} + return fileDescriptor_6c07b07c062484ab, []int{90} } func (m *LoadBalancerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2488,7 +2600,7 @@ var xxx_messageInfo_LoadBalancerStatus proto.InternalMessageInfo func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} func (*LocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{87} + return fileDescriptor_6c07b07c062484ab, []int{91} } func (m *LocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2516,7 +2628,7 @@ var xxx_messageInfo_LocalObjectReference proto.InternalMessageInfo func (m *LocalVolumeSource) Reset() { *m = LocalVolumeSource{} } func (*LocalVolumeSource) ProtoMessage() {} func (*LocalVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{88} + return fileDescriptor_6c07b07c062484ab, []int{92} } func (m *LocalVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2544,7 +2656,7 @@ var xxx_messageInfo_LocalVolumeSource proto.InternalMessageInfo func (m *ModifyVolumeStatus) Reset() { *m = ModifyVolumeStatus{} } func (*ModifyVolumeStatus) ProtoMessage() {} func (*ModifyVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{89} + return fileDescriptor_6c07b07c062484ab, []int{93} } func (m *ModifyVolumeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2572,7 +2684,7 @@ var xxx_messageInfo_ModifyVolumeStatus proto.InternalMessageInfo func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} func (*NFSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{90} + return fileDescriptor_6c07b07c062484ab, []int{94} } func (m *NFSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2600,7 +2712,7 @@ var xxx_messageInfo_NFSVolumeSource proto.InternalMessageInfo func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{91} + return fileDescriptor_6c07b07c062484ab, []int{95} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2628,7 +2740,7 @@ var xxx_messageInfo_Namespace proto.InternalMessageInfo func (m *NamespaceCondition) Reset() { *m = NamespaceCondition{} } func (*NamespaceCondition) ProtoMessage() {} func (*NamespaceCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{92} + return fileDescriptor_6c07b07c062484ab, []int{96} } func (m *NamespaceCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2768,7 @@ var xxx_messageInfo_NamespaceCondition proto.InternalMessageInfo func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} func (*NamespaceList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{93} + return fileDescriptor_6c07b07c062484ab, []int{97} } func (m *NamespaceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2684,7 +2796,7 @@ var xxx_messageInfo_NamespaceList proto.InternalMessageInfo func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{94} + return fileDescriptor_6c07b07c062484ab, []int{98} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2712,7 +2824,7 @@ var xxx_messageInfo_NamespaceSpec proto.InternalMessageInfo func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} func (*NamespaceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{95} + return fileDescriptor_6c07b07c062484ab, []int{99} } func (m *NamespaceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2740,7 +2852,7 @@ var xxx_messageInfo_NamespaceStatus proto.InternalMessageInfo func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} func (*Node) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{96} + return fileDescriptor_6c07b07c062484ab, []int{100} } func (m *Node) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +2880,7 @@ var xxx_messageInfo_Node proto.InternalMessageInfo func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} func (*NodeAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{97} + return fileDescriptor_6c07b07c062484ab, []int{101} } func (m *NodeAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2796,7 +2908,7 @@ var xxx_messageInfo_NodeAddress proto.InternalMessageInfo func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} func (*NodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{98} + return fileDescriptor_6c07b07c062484ab, []int{102} } func (m *NodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2824,7 +2936,7 @@ var xxx_messageInfo_NodeAffinity proto.InternalMessageInfo func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} func (*NodeCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{99} + return fileDescriptor_6c07b07c062484ab, []int{103} } func (m *NodeCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2852,7 +2964,7 @@ var xxx_messageInfo_NodeCondition proto.InternalMessageInfo func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} func (*NodeConfigSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{100} + return fileDescriptor_6c07b07c062484ab, []int{104} } func (m *NodeConfigSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2880,7 +2992,7 @@ var xxx_messageInfo_NodeConfigSource proto.InternalMessageInfo func (m *NodeConfigStatus) Reset() { *m = NodeConfigStatus{} } func (*NodeConfigStatus) ProtoMessage() {} func (*NodeConfigStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{101} + return fileDescriptor_6c07b07c062484ab, []int{105} } func (m *NodeConfigStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2908,7 +3020,7 @@ var xxx_messageInfo_NodeConfigStatus proto.InternalMessageInfo func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{102} + return fileDescriptor_6c07b07c062484ab, []int{106} } func (m *NodeDaemonEndpoints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2936,7 +3048,7 @@ var xxx_messageInfo_NodeDaemonEndpoints proto.InternalMessageInfo func (m *NodeFeatures) Reset() { *m = NodeFeatures{} } func (*NodeFeatures) ProtoMessage() {} func (*NodeFeatures) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{103} + return fileDescriptor_6c07b07c062484ab, []int{107} } func (m *NodeFeatures) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2964,7 +3076,7 @@ var xxx_messageInfo_NodeFeatures proto.InternalMessageInfo func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} func (*NodeList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{104} + return fileDescriptor_6c07b07c062484ab, []int{108} } func (m *NodeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2992,7 +3104,7 @@ var xxx_messageInfo_NodeList proto.InternalMessageInfo func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} func (*NodeProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{105} + return fileDescriptor_6c07b07c062484ab, []int{109} } func (m *NodeProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3020,7 +3132,7 @@ var xxx_messageInfo_NodeProxyOptions proto.InternalMessageInfo func (m *NodeRuntimeHandler) Reset() { *m = NodeRuntimeHandler{} } func (*NodeRuntimeHandler) ProtoMessage() {} func (*NodeRuntimeHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{106} + return fileDescriptor_6c07b07c062484ab, []int{110} } func (m *NodeRuntimeHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3048,7 +3160,7 @@ var xxx_messageInfo_NodeRuntimeHandler proto.InternalMessageInfo func (m *NodeRuntimeHandlerFeatures) Reset() { *m = NodeRuntimeHandlerFeatures{} } func (*NodeRuntimeHandlerFeatures) ProtoMessage() {} func (*NodeRuntimeHandlerFeatures) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{107} + return fileDescriptor_6c07b07c062484ab, []int{111} } func (m *NodeRuntimeHandlerFeatures) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3076,7 +3188,7 @@ var xxx_messageInfo_NodeRuntimeHandlerFeatures proto.InternalMessageInfo func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} func (*NodeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{108} + return fileDescriptor_6c07b07c062484ab, []int{112} } func (m *NodeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3104,7 +3216,7 @@ var xxx_messageInfo_NodeSelector proto.InternalMessageInfo func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{109} + return fileDescriptor_6c07b07c062484ab, []int{113} } func (m *NodeSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3132,7 +3244,7 @@ var xxx_messageInfo_NodeSelectorRequirement proto.InternalMessageInfo func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{110} + return fileDescriptor_6c07b07c062484ab, []int{114} } func (m *NodeSelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3160,7 +3272,7 @@ var xxx_messageInfo_NodeSelectorTerm proto.InternalMessageInfo func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} func (*NodeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{111} + return fileDescriptor_6c07b07c062484ab, []int{115} } func (m *NodeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3188,7 +3300,7 @@ var xxx_messageInfo_NodeSpec proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{112} + return fileDescriptor_6c07b07c062484ab, []int{116} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3216,7 +3328,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NodeSwapStatus) Reset() { *m = NodeSwapStatus{} } func (*NodeSwapStatus) ProtoMessage() {} func (*NodeSwapStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{113} + return fileDescriptor_6c07b07c062484ab, []int{117} } func (m *NodeSwapStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3244,7 +3356,7 @@ var xxx_messageInfo_NodeSwapStatus proto.InternalMessageInfo func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} func (*NodeSystemInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{114} + return fileDescriptor_6c07b07c062484ab, []int{118} } func (m *NodeSystemInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3272,7 +3384,7 @@ var xxx_messageInfo_NodeSystemInfo proto.InternalMessageInfo func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{115} + return fileDescriptor_6c07b07c062484ab, []int{119} } func (m *ObjectFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3412,7 @@ var xxx_messageInfo_ObjectFieldSelector proto.InternalMessageInfo func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} func (*ObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{116} + return fileDescriptor_6c07b07c062484ab, []int{120} } func (m *ObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3328,7 +3440,7 @@ var xxx_messageInfo_ObjectReference proto.InternalMessageInfo func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} func (*PersistentVolume) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{117} + return fileDescriptor_6c07b07c062484ab, []int{121} } func (m *PersistentVolume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3356,7 +3468,7 @@ var xxx_messageInfo_PersistentVolume proto.InternalMessageInfo func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{118} + return fileDescriptor_6c07b07c062484ab, []int{122} } func (m *PersistentVolumeClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3496,7 @@ var xxx_messageInfo_PersistentVolumeClaim proto.InternalMessageInfo func (m *PersistentVolumeClaimCondition) Reset() { *m = PersistentVolumeClaimCondition{} } func (*PersistentVolumeClaimCondition) ProtoMessage() {} func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{119} + return fileDescriptor_6c07b07c062484ab, []int{123} } func (m *PersistentVolumeClaimCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3412,7 +3524,7 @@ var xxx_messageInfo_PersistentVolumeClaimCondition proto.InternalMessageInfo func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{120} + return fileDescriptor_6c07b07c062484ab, []int{124} } func (m *PersistentVolumeClaimList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3440,7 +3552,7 @@ var xxx_messageInfo_PersistentVolumeClaimList proto.InternalMessageInfo func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{121} + return fileDescriptor_6c07b07c062484ab, []int{125} } func (m *PersistentVolumeClaimSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3468,7 +3580,7 @@ var xxx_messageInfo_PersistentVolumeClaimSpec proto.InternalMessageInfo func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{122} + return fileDescriptor_6c07b07c062484ab, []int{126} } func (m *PersistentVolumeClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3496,7 +3608,7 @@ var xxx_messageInfo_PersistentVolumeClaimStatus proto.InternalMessageInfo func (m *PersistentVolumeClaimTemplate) Reset() { *m = PersistentVolumeClaimTemplate{} } func (*PersistentVolumeClaimTemplate) ProtoMessage() {} func (*PersistentVolumeClaimTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{123} + return fileDescriptor_6c07b07c062484ab, []int{127} } func (m *PersistentVolumeClaimTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3524,7 +3636,7 @@ var xxx_messageInfo_PersistentVolumeClaimTemplate proto.InternalMessageInfo func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{124} + return fileDescriptor_6c07b07c062484ab, []int{128} } func (m *PersistentVolumeClaimVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3552,7 +3664,7 @@ var xxx_messageInfo_PersistentVolumeClaimVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} func (*PersistentVolumeList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{125} + return fileDescriptor_6c07b07c062484ab, []int{129} } func (m *PersistentVolumeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3580,7 +3692,7 @@ var xxx_messageInfo_PersistentVolumeList proto.InternalMessageInfo func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{126} + return fileDescriptor_6c07b07c062484ab, []int{130} } func (m *PersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3608,7 +3720,7 @@ var xxx_messageInfo_PersistentVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{127} + return fileDescriptor_6c07b07c062484ab, []int{131} } func (m *PersistentVolumeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3636,7 +3748,7 @@ var xxx_messageInfo_PersistentVolumeSpec proto.InternalMessageInfo func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{128} + return fileDescriptor_6c07b07c062484ab, []int{132} } func (m *PersistentVolumeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3664,7 +3776,7 @@ var xxx_messageInfo_PersistentVolumeStatus proto.InternalMessageInfo func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{129} + return fileDescriptor_6c07b07c062484ab, []int{133} } func (m *PhotonPersistentDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3692,7 +3804,7 @@ var xxx_messageInfo_PhotonPersistentDiskVolumeSource proto.InternalMessageInfo func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} func (*Pod) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{130} + return fileDescriptor_6c07b07c062484ab, []int{134} } func (m *Pod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3720,7 +3832,7 @@ var xxx_messageInfo_Pod proto.InternalMessageInfo func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} func (*PodAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{131} + return fileDescriptor_6c07b07c062484ab, []int{135} } func (m *PodAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3748,7 +3860,7 @@ var xxx_messageInfo_PodAffinity proto.InternalMessageInfo func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} func (*PodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{132} + return fileDescriptor_6c07b07c062484ab, []int{136} } func (m *PodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3776,7 +3888,7 @@ var xxx_messageInfo_PodAffinityTerm proto.InternalMessageInfo func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} func (*PodAntiAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{133} + return fileDescriptor_6c07b07c062484ab, []int{137} } func (m *PodAntiAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3804,7 +3916,7 @@ var xxx_messageInfo_PodAntiAffinity proto.InternalMessageInfo func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} func (*PodAttachOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{134} + return fileDescriptor_6c07b07c062484ab, []int{138} } func (m *PodAttachOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3829,10 +3941,38 @@ func (m *PodAttachOptions) XXX_DiscardUnknown() { var xxx_messageInfo_PodAttachOptions proto.InternalMessageInfo +func (m *PodCertificateProjection) Reset() { *m = PodCertificateProjection{} } +func (*PodCertificateProjection) ProtoMessage() {} +func (*PodCertificateProjection) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{139} +} +func (m *PodCertificateProjection) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateProjection) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateProjection) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateProjection.Merge(m, src) +} +func (m *PodCertificateProjection) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateProjection) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateProjection.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateProjection proto.InternalMessageInfo + func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} func (*PodCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{135} + return fileDescriptor_6c07b07c062484ab, []int{140} } func (m *PodCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3860,7 +4000,7 @@ var xxx_messageInfo_PodCondition proto.InternalMessageInfo func (m *PodDNSConfig) Reset() { *m = PodDNSConfig{} } func (*PodDNSConfig) ProtoMessage() {} func (*PodDNSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{136} + return fileDescriptor_6c07b07c062484ab, []int{141} } func (m *PodDNSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3888,7 +4028,7 @@ var xxx_messageInfo_PodDNSConfig proto.InternalMessageInfo func (m *PodDNSConfigOption) Reset() { *m = PodDNSConfigOption{} } func (*PodDNSConfigOption) ProtoMessage() {} func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{137} + return fileDescriptor_6c07b07c062484ab, []int{142} } func (m *PodDNSConfigOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3916,7 +4056,7 @@ var xxx_messageInfo_PodDNSConfigOption proto.InternalMessageInfo func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} func (*PodExecOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{138} + return fileDescriptor_6c07b07c062484ab, []int{143} } func (m *PodExecOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3941,10 +4081,38 @@ func (m *PodExecOptions) XXX_DiscardUnknown() { var xxx_messageInfo_PodExecOptions proto.InternalMessageInfo +func (m *PodExtendedResourceClaimStatus) Reset() { *m = PodExtendedResourceClaimStatus{} } +func (*PodExtendedResourceClaimStatus) ProtoMessage() {} +func (*PodExtendedResourceClaimStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{144} +} +func (m *PodExtendedResourceClaimStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodExtendedResourceClaimStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodExtendedResourceClaimStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodExtendedResourceClaimStatus.Merge(m, src) +} +func (m *PodExtendedResourceClaimStatus) XXX_Size() int { + return m.Size() +} +func (m *PodExtendedResourceClaimStatus) XXX_DiscardUnknown() { + xxx_messageInfo_PodExtendedResourceClaimStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_PodExtendedResourceClaimStatus proto.InternalMessageInfo + func (m *PodIP) Reset() { *m = PodIP{} } func (*PodIP) ProtoMessage() {} func (*PodIP) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{139} + return fileDescriptor_6c07b07c062484ab, []int{145} } func (m *PodIP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3972,7 +4140,7 @@ var xxx_messageInfo_PodIP proto.InternalMessageInfo func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} func (*PodList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{140} + return fileDescriptor_6c07b07c062484ab, []int{146} } func (m *PodList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4000,7 +4168,7 @@ var xxx_messageInfo_PodList proto.InternalMessageInfo func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} func (*PodLogOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{141} + return fileDescriptor_6c07b07c062484ab, []int{147} } func (m *PodLogOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4028,7 +4196,7 @@ var xxx_messageInfo_PodLogOptions proto.InternalMessageInfo func (m *PodOS) Reset() { *m = PodOS{} } func (*PodOS) ProtoMessage() {} func (*PodOS) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{142} + return fileDescriptor_6c07b07c062484ab, []int{148} } func (m *PodOS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4056,7 +4224,7 @@ var xxx_messageInfo_PodOS proto.InternalMessageInfo func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{143} + return fileDescriptor_6c07b07c062484ab, []int{149} } func (m *PodPortForwardOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4084,7 +4252,7 @@ var xxx_messageInfo_PodPortForwardOptions proto.InternalMessageInfo func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} func (*PodProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{144} + return fileDescriptor_6c07b07c062484ab, []int{150} } func (m *PodProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4112,7 +4280,7 @@ var xxx_messageInfo_PodProxyOptions proto.InternalMessageInfo func (m *PodReadinessGate) Reset() { *m = PodReadinessGate{} } func (*PodReadinessGate) ProtoMessage() {} func (*PodReadinessGate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{145} + return fileDescriptor_6c07b07c062484ab, []int{151} } func (m *PodReadinessGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4140,7 +4308,7 @@ var xxx_messageInfo_PodReadinessGate proto.InternalMessageInfo func (m *PodResourceClaim) Reset() { *m = PodResourceClaim{} } func (*PodResourceClaim) ProtoMessage() {} func (*PodResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{146} + return fileDescriptor_6c07b07c062484ab, []int{152} } func (m *PodResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4168,7 +4336,7 @@ var xxx_messageInfo_PodResourceClaim proto.InternalMessageInfo func (m *PodResourceClaimStatus) Reset() { *m = PodResourceClaimStatus{} } func (*PodResourceClaimStatus) ProtoMessage() {} func (*PodResourceClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{147} + return fileDescriptor_6c07b07c062484ab, []int{153} } func (m *PodResourceClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4196,7 +4364,7 @@ var xxx_messageInfo_PodResourceClaimStatus proto.InternalMessageInfo func (m *PodSchedulingGate) Reset() { *m = PodSchedulingGate{} } func (*PodSchedulingGate) ProtoMessage() {} func (*PodSchedulingGate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{148} + return fileDescriptor_6c07b07c062484ab, []int{154} } func (m *PodSchedulingGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4224,7 +4392,7 @@ var xxx_messageInfo_PodSchedulingGate proto.InternalMessageInfo func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} func (*PodSecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{149} + return fileDescriptor_6c07b07c062484ab, []int{155} } func (m *PodSecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4252,7 +4420,7 @@ var xxx_messageInfo_PodSecurityContext proto.InternalMessageInfo func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} func (*PodSignature) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{150} + return fileDescriptor_6c07b07c062484ab, []int{156} } func (m *PodSignature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4280,7 +4448,7 @@ var xxx_messageInfo_PodSignature proto.InternalMessageInfo func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} func (*PodSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{151} + return fileDescriptor_6c07b07c062484ab, []int{157} } func (m *PodSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4308,7 +4476,7 @@ var xxx_messageInfo_PodSpec proto.InternalMessageInfo func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} func (*PodStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{152} + return fileDescriptor_6c07b07c062484ab, []int{158} } func (m *PodStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4336,7 +4504,7 @@ var xxx_messageInfo_PodStatus proto.InternalMessageInfo func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} func (*PodStatusResult) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{153} + return fileDescriptor_6c07b07c062484ab, []int{159} } func (m *PodStatusResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4364,7 +4532,7 @@ var xxx_messageInfo_PodStatusResult proto.InternalMessageInfo func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} func (*PodTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{154} + return fileDescriptor_6c07b07c062484ab, []int{160} } func (m *PodTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4392,7 +4560,7 @@ var xxx_messageInfo_PodTemplate proto.InternalMessageInfo func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} func (*PodTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{155} + return fileDescriptor_6c07b07c062484ab, []int{161} } func (m *PodTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4420,7 +4588,7 @@ var xxx_messageInfo_PodTemplateList proto.InternalMessageInfo func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} func (*PodTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{156} + return fileDescriptor_6c07b07c062484ab, []int{162} } func (m *PodTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4448,7 +4616,7 @@ var xxx_messageInfo_PodTemplateSpec proto.InternalMessageInfo func (m *PortStatus) Reset() { *m = PortStatus{} } func (*PortStatus) ProtoMessage() {} func (*PortStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{157} + return fileDescriptor_6c07b07c062484ab, []int{163} } func (m *PortStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4476,7 +4644,7 @@ var xxx_messageInfo_PortStatus proto.InternalMessageInfo func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{158} + return fileDescriptor_6c07b07c062484ab, []int{164} } func (m *PortworxVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4504,7 +4672,7 @@ var xxx_messageInfo_PortworxVolumeSource proto.InternalMessageInfo func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} func (*Preconditions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{159} + return fileDescriptor_6c07b07c062484ab, []int{165} } func (m *Preconditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4532,7 +4700,7 @@ var xxx_messageInfo_Preconditions proto.InternalMessageInfo func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{160} + return fileDescriptor_6c07b07c062484ab, []int{166} } func (m *PreferAvoidPodsEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4560,7 +4728,7 @@ var xxx_messageInfo_PreferAvoidPodsEntry proto.InternalMessageInfo func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{161} + return fileDescriptor_6c07b07c062484ab, []int{167} } func (m *PreferredSchedulingTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4588,7 +4756,7 @@ var xxx_messageInfo_PreferredSchedulingTerm proto.InternalMessageInfo func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} func (*Probe) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{162} + return fileDescriptor_6c07b07c062484ab, []int{168} } func (m *Probe) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4616,7 +4784,7 @@ var xxx_messageInfo_Probe proto.InternalMessageInfo func (m *ProbeHandler) Reset() { *m = ProbeHandler{} } func (*ProbeHandler) ProtoMessage() {} func (*ProbeHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{163} + return fileDescriptor_6c07b07c062484ab, []int{169} } func (m *ProbeHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4644,7 +4812,7 @@ var xxx_messageInfo_ProbeHandler proto.InternalMessageInfo func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{164} + return fileDescriptor_6c07b07c062484ab, []int{170} } func (m *ProjectedVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4672,7 +4840,7 @@ var xxx_messageInfo_ProjectedVolumeSource proto.InternalMessageInfo func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{165} + return fileDescriptor_6c07b07c062484ab, []int{171} } func (m *QuobyteVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4700,7 +4868,7 @@ var xxx_messageInfo_QuobyteVolumeSource proto.InternalMessageInfo func (m *RBDPersistentVolumeSource) Reset() { *m = RBDPersistentVolumeSource{} } func (*RBDPersistentVolumeSource) ProtoMessage() {} func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{166} + return fileDescriptor_6c07b07c062484ab, []int{172} } func (m *RBDPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4728,7 +4896,7 @@ var xxx_messageInfo_RBDPersistentVolumeSource proto.InternalMessageInfo func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} func (*RBDVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{167} + return fileDescriptor_6c07b07c062484ab, []int{173} } func (m *RBDVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4756,7 +4924,7 @@ var xxx_messageInfo_RBDVolumeSource proto.InternalMessageInfo func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} func (*RangeAllocation) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{168} + return fileDescriptor_6c07b07c062484ab, []int{174} } func (m *RangeAllocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4784,7 +4952,7 @@ var xxx_messageInfo_RangeAllocation proto.InternalMessageInfo func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} func (*ReplicationController) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{169} + return fileDescriptor_6c07b07c062484ab, []int{175} } func (m *ReplicationController) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4812,7 +4980,7 @@ var xxx_messageInfo_ReplicationController proto.InternalMessageInfo func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{170} + return fileDescriptor_6c07b07c062484ab, []int{176} } func (m *ReplicationControllerCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4840,7 +5008,7 @@ var xxx_messageInfo_ReplicationControllerCondition proto.InternalMessageInfo func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{171} + return fileDescriptor_6c07b07c062484ab, []int{177} } func (m *ReplicationControllerList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4868,7 +5036,7 @@ var xxx_messageInfo_ReplicationControllerList proto.InternalMessageInfo func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{172} + return fileDescriptor_6c07b07c062484ab, []int{178} } func (m *ReplicationControllerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4896,7 +5064,7 @@ var xxx_messageInfo_ReplicationControllerSpec proto.InternalMessageInfo func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{173} + return fileDescriptor_6c07b07c062484ab, []int{179} } func (m *ReplicationControllerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4924,7 +5092,7 @@ var xxx_messageInfo_ReplicationControllerStatus proto.InternalMessageInfo func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } func (*ResourceClaim) ProtoMessage() {} func (*ResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{174} + return fileDescriptor_6c07b07c062484ab, []int{180} } func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4952,7 +5120,7 @@ var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{175} + return fileDescriptor_6c07b07c062484ab, []int{181} } func (m *ResourceFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4980,7 +5148,7 @@ var xxx_messageInfo_ResourceFieldSelector proto.InternalMessageInfo func (m *ResourceHealth) Reset() { *m = ResourceHealth{} } func (*ResourceHealth) ProtoMessage() {} func (*ResourceHealth) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{176} + return fileDescriptor_6c07b07c062484ab, []int{182} } func (m *ResourceHealth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5008,7 +5176,7 @@ var xxx_messageInfo_ResourceHealth proto.InternalMessageInfo func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} func (*ResourceQuota) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{177} + return fileDescriptor_6c07b07c062484ab, []int{183} } func (m *ResourceQuota) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5036,7 +5204,7 @@ var xxx_messageInfo_ResourceQuota proto.InternalMessageInfo func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} func (*ResourceQuotaList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{178} + return fileDescriptor_6c07b07c062484ab, []int{184} } func (m *ResourceQuotaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5064,7 +5232,7 @@ var xxx_messageInfo_ResourceQuotaList proto.InternalMessageInfo func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{179} + return fileDescriptor_6c07b07c062484ab, []int{185} } func (m *ResourceQuotaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5092,7 +5260,7 @@ var xxx_messageInfo_ResourceQuotaSpec proto.InternalMessageInfo func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{180} + return fileDescriptor_6c07b07c062484ab, []int{186} } func (m *ResourceQuotaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5120,7 +5288,7 @@ var xxx_messageInfo_ResourceQuotaStatus proto.InternalMessageInfo func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} func (*ResourceRequirements) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{181} + return fileDescriptor_6c07b07c062484ab, []int{187} } func (m *ResourceRequirements) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5148,7 +5316,7 @@ var xxx_messageInfo_ResourceRequirements proto.InternalMessageInfo func (m *ResourceStatus) Reset() { *m = ResourceStatus{} } func (*ResourceStatus) ProtoMessage() {} func (*ResourceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{182} + return fileDescriptor_6c07b07c062484ab, []int{188} } func (m *ResourceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5176,7 +5344,7 @@ var xxx_messageInfo_ResourceStatus proto.InternalMessageInfo func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} func (*SELinuxOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{183} + return fileDescriptor_6c07b07c062484ab, []int{189} } func (m *SELinuxOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5204,7 +5372,7 @@ var xxx_messageInfo_SELinuxOptions proto.InternalMessageInfo func (m *ScaleIOPersistentVolumeSource) Reset() { *m = ScaleIOPersistentVolumeSource{} } func (*ScaleIOPersistentVolumeSource) ProtoMessage() {} func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{184} + return fileDescriptor_6c07b07c062484ab, []int{190} } func (m *ScaleIOPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5232,7 +5400,7 @@ var xxx_messageInfo_ScaleIOPersistentVolumeSource proto.InternalMessageInfo func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{185} + return fileDescriptor_6c07b07c062484ab, []int{191} } func (m *ScaleIOVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5260,7 +5428,7 @@ var xxx_messageInfo_ScaleIOVolumeSource proto.InternalMessageInfo func (m *ScopeSelector) Reset() { *m = ScopeSelector{} } func (*ScopeSelector) ProtoMessage() {} func (*ScopeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{186} + return fileDescriptor_6c07b07c062484ab, []int{192} } func (m *ScopeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5288,7 +5456,7 @@ var xxx_messageInfo_ScopeSelector proto.InternalMessageInfo func (m *ScopedResourceSelectorRequirement) Reset() { *m = ScopedResourceSelectorRequirement{} } func (*ScopedResourceSelectorRequirement) ProtoMessage() {} func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{187} + return fileDescriptor_6c07b07c062484ab, []int{193} } func (m *ScopedResourceSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5316,7 +5484,7 @@ var xxx_messageInfo_ScopedResourceSelectorRequirement proto.InternalMessageInfo func (m *SeccompProfile) Reset() { *m = SeccompProfile{} } func (*SeccompProfile) ProtoMessage() {} func (*SeccompProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{188} + return fileDescriptor_6c07b07c062484ab, []int{194} } func (m *SeccompProfile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5344,7 +5512,7 @@ var xxx_messageInfo_SeccompProfile proto.InternalMessageInfo func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} func (*Secret) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{189} + return fileDescriptor_6c07b07c062484ab, []int{195} } func (m *Secret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5372,7 +5540,7 @@ var xxx_messageInfo_Secret proto.InternalMessageInfo func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} func (*SecretEnvSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{190} + return fileDescriptor_6c07b07c062484ab, []int{196} } func (m *SecretEnvSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5400,7 +5568,7 @@ var xxx_messageInfo_SecretEnvSource proto.InternalMessageInfo func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} func (*SecretKeySelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{191} + return fileDescriptor_6c07b07c062484ab, []int{197} } func (m *SecretKeySelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5428,7 +5596,7 @@ var xxx_messageInfo_SecretKeySelector proto.InternalMessageInfo func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} func (*SecretList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{192} + return fileDescriptor_6c07b07c062484ab, []int{198} } func (m *SecretList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5456,7 +5624,7 @@ var xxx_messageInfo_SecretList proto.InternalMessageInfo func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} func (*SecretProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{193} + return fileDescriptor_6c07b07c062484ab, []int{199} } func (m *SecretProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5484,7 +5652,7 @@ var xxx_messageInfo_SecretProjection proto.InternalMessageInfo func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} func (*SecretReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{194} + return fileDescriptor_6c07b07c062484ab, []int{200} } func (m *SecretReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5512,7 +5680,7 @@ var xxx_messageInfo_SecretReference proto.InternalMessageInfo func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} func (*SecretVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{195} + return fileDescriptor_6c07b07c062484ab, []int{201} } func (m *SecretVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5540,7 +5708,7 @@ var xxx_messageInfo_SecretVolumeSource proto.InternalMessageInfo func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} func (*SecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{196} + return fileDescriptor_6c07b07c062484ab, []int{202} } func (m *SecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5568,7 +5736,7 @@ var xxx_messageInfo_SecurityContext proto.InternalMessageInfo func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} func (*SerializedReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{197} + return fileDescriptor_6c07b07c062484ab, []int{203} } func (m *SerializedReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5596,7 +5764,7 @@ var xxx_messageInfo_SerializedReference proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{198} + return fileDescriptor_6c07b07c062484ab, []int{204} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5624,7 +5792,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} func (*ServiceAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{199} + return fileDescriptor_6c07b07c062484ab, []int{205} } func (m *ServiceAccount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5652,7 +5820,7 @@ var xxx_messageInfo_ServiceAccount proto.InternalMessageInfo func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} func (*ServiceAccountList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{200} + return fileDescriptor_6c07b07c062484ab, []int{206} } func (m *ServiceAccountList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5680,7 +5848,7 @@ var xxx_messageInfo_ServiceAccountList proto.InternalMessageInfo func (m *ServiceAccountTokenProjection) Reset() { *m = ServiceAccountTokenProjection{} } func (*ServiceAccountTokenProjection) ProtoMessage() {} func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{201} + return fileDescriptor_6c07b07c062484ab, []int{207} } func (m *ServiceAccountTokenProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5708,7 +5876,7 @@ var xxx_messageInfo_ServiceAccountTokenProjection proto.InternalMessageInfo func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} func (*ServiceList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{202} + return fileDescriptor_6c07b07c062484ab, []int{208} } func (m *ServiceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5736,7 +5904,7 @@ var xxx_messageInfo_ServiceList proto.InternalMessageInfo func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} func (*ServicePort) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{203} + return fileDescriptor_6c07b07c062484ab, []int{209} } func (m *ServicePort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5764,7 +5932,7 @@ var xxx_messageInfo_ServicePort proto.InternalMessageInfo func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{204} + return fileDescriptor_6c07b07c062484ab, []int{210} } func (m *ServiceProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5792,7 +5960,7 @@ var xxx_messageInfo_ServiceProxyOptions proto.InternalMessageInfo func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} func (*ServiceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{205} + return fileDescriptor_6c07b07c062484ab, []int{211} } func (m *ServiceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5820,7 +5988,7 @@ var xxx_messageInfo_ServiceSpec proto.InternalMessageInfo func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} func (*ServiceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{206} + return fileDescriptor_6c07b07c062484ab, []int{212} } func (m *ServiceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5848,7 +6016,7 @@ var xxx_messageInfo_ServiceStatus proto.InternalMessageInfo func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{207} + return fileDescriptor_6c07b07c062484ab, []int{213} } func (m *SessionAffinityConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5876,7 +6044,7 @@ var xxx_messageInfo_SessionAffinityConfig proto.InternalMessageInfo func (m *SleepAction) Reset() { *m = SleepAction{} } func (*SleepAction) ProtoMessage() {} func (*SleepAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{208} + return fileDescriptor_6c07b07c062484ab, []int{214} } func (m *SleepAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5904,7 +6072,7 @@ var xxx_messageInfo_SleepAction proto.InternalMessageInfo func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{209} + return fileDescriptor_6c07b07c062484ab, []int{215} } func (m *StorageOSPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5932,7 +6100,7 @@ var xxx_messageInfo_StorageOSPersistentVolumeSource proto.InternalMessageInfo func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{210} + return fileDescriptor_6c07b07c062484ab, []int{216} } func (m *StorageOSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5960,7 +6128,7 @@ var xxx_messageInfo_StorageOSVolumeSource proto.InternalMessageInfo func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} func (*Sysctl) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{211} + return fileDescriptor_6c07b07c062484ab, []int{217} } func (m *Sysctl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5988,7 +6156,7 @@ var xxx_messageInfo_Sysctl proto.InternalMessageInfo func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} func (*TCPSocketAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{212} + return fileDescriptor_6c07b07c062484ab, []int{218} } func (m *TCPSocketAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6016,7 +6184,7 @@ var xxx_messageInfo_TCPSocketAction proto.InternalMessageInfo func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} func (*Taint) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{213} + return fileDescriptor_6c07b07c062484ab, []int{219} } func (m *Taint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6044,7 +6212,7 @@ var xxx_messageInfo_Taint proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{214} + return fileDescriptor_6c07b07c062484ab, []int{220} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6072,7 +6240,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *TopologySelectorLabelRequirement) Reset() { *m = TopologySelectorLabelRequirement{} } func (*TopologySelectorLabelRequirement) ProtoMessage() {} func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{215} + return fileDescriptor_6c07b07c062484ab, []int{221} } func (m *TopologySelectorLabelRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6100,7 +6268,7 @@ var xxx_messageInfo_TopologySelectorLabelRequirement proto.InternalMessageInfo func (m *TopologySelectorTerm) Reset() { *m = TopologySelectorTerm{} } func (*TopologySelectorTerm) ProtoMessage() {} func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{216} + return fileDescriptor_6c07b07c062484ab, []int{222} } func (m *TopologySelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6128,7 +6296,7 @@ var xxx_messageInfo_TopologySelectorTerm proto.InternalMessageInfo func (m *TopologySpreadConstraint) Reset() { *m = TopologySpreadConstraint{} } func (*TopologySpreadConstraint) ProtoMessage() {} func (*TopologySpreadConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{217} + return fileDescriptor_6c07b07c062484ab, []int{223} } func (m *TopologySpreadConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6156,7 +6324,7 @@ var xxx_messageInfo_TopologySpreadConstraint proto.InternalMessageInfo func (m *TypedLocalObjectReference) Reset() { *m = TypedLocalObjectReference{} } func (*TypedLocalObjectReference) ProtoMessage() {} func (*TypedLocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{218} + return fileDescriptor_6c07b07c062484ab, []int{224} } func (m *TypedLocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6184,7 +6352,7 @@ var xxx_messageInfo_TypedLocalObjectReference proto.InternalMessageInfo func (m *TypedObjectReference) Reset() { *m = TypedObjectReference{} } func (*TypedObjectReference) ProtoMessage() {} func (*TypedObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{219} + return fileDescriptor_6c07b07c062484ab, []int{225} } func (m *TypedObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6212,7 +6380,7 @@ var xxx_messageInfo_TypedObjectReference proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{220} + return fileDescriptor_6c07b07c062484ab, []int{226} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6240,7 +6408,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} func (*VolumeDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{221} + return fileDescriptor_6c07b07c062484ab, []int{227} } func (m *VolumeDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6268,7 +6436,7 @@ var xxx_messageInfo_VolumeDevice proto.InternalMessageInfo func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} func (*VolumeMount) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{222} + return fileDescriptor_6c07b07c062484ab, []int{228} } func (m *VolumeMount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6296,7 +6464,7 @@ var xxx_messageInfo_VolumeMount proto.InternalMessageInfo func (m *VolumeMountStatus) Reset() { *m = VolumeMountStatus{} } func (*VolumeMountStatus) ProtoMessage() {} func (*VolumeMountStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{223} + return fileDescriptor_6c07b07c062484ab, []int{229} } func (m *VolumeMountStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6324,7 +6492,7 @@ var xxx_messageInfo_VolumeMountStatus proto.InternalMessageInfo func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{224} + return fileDescriptor_6c07b07c062484ab, []int{230} } func (m *VolumeNodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6352,7 +6520,7 @@ var xxx_messageInfo_VolumeNodeAffinity proto.InternalMessageInfo func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} func (*VolumeProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{225} + return fileDescriptor_6c07b07c062484ab, []int{231} } func (m *VolumeProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6380,7 +6548,7 @@ var xxx_messageInfo_VolumeProjection proto.InternalMessageInfo func (m *VolumeResourceRequirements) Reset() { *m = VolumeResourceRequirements{} } func (*VolumeResourceRequirements) ProtoMessage() {} func (*VolumeResourceRequirements) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{226} + return fileDescriptor_6c07b07c062484ab, []int{232} } func (m *VolumeResourceRequirements) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6408,7 +6576,7 @@ var xxx_messageInfo_VolumeResourceRequirements proto.InternalMessageInfo func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} func (*VolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{227} + return fileDescriptor_6c07b07c062484ab, []int{233} } func (m *VolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6436,7 +6604,7 @@ var xxx_messageInfo_VolumeSource proto.InternalMessageInfo func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{228} + return fileDescriptor_6c07b07c062484ab, []int{234} } func (m *VsphereVirtualDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6464,7 +6632,7 @@ var xxx_messageInfo_VsphereVirtualDiskVolumeSource proto.InternalMessageInfo func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{229} + return fileDescriptor_6c07b07c062484ab, []int{235} } func (m *WeightedPodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6492,7 +6660,7 @@ var xxx_messageInfo_WeightedPodAffinityTerm proto.InternalMessageInfo func (m *WindowsSecurityContextOptions) Reset() { *m = WindowsSecurityContextOptions{} } func (*WindowsSecurityContextOptions) ProtoMessage() {} func (*WindowsSecurityContextOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{230} + return fileDescriptor_6c07b07c062484ab, []int{236} } func (m *WindowsSecurityContextOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6551,9 +6719,12 @@ func init() { proto.RegisterType((*ConfigMapProjection)(nil), "k8s.io.api.core.v1.ConfigMapProjection") proto.RegisterType((*ConfigMapVolumeSource)(nil), "k8s.io.api.core.v1.ConfigMapVolumeSource") proto.RegisterType((*Container)(nil), "k8s.io.api.core.v1.Container") + proto.RegisterType((*ContainerExtendedResourceRequest)(nil), "k8s.io.api.core.v1.ContainerExtendedResourceRequest") proto.RegisterType((*ContainerImage)(nil), "k8s.io.api.core.v1.ContainerImage") proto.RegisterType((*ContainerPort)(nil), "k8s.io.api.core.v1.ContainerPort") proto.RegisterType((*ContainerResizePolicy)(nil), "k8s.io.api.core.v1.ContainerResizePolicy") + proto.RegisterType((*ContainerRestartRule)(nil), "k8s.io.api.core.v1.ContainerRestartRule") + proto.RegisterType((*ContainerRestartRuleOnExitCodes)(nil), "k8s.io.api.core.v1.ContainerRestartRuleOnExitCodes") proto.RegisterType((*ContainerState)(nil), "k8s.io.api.core.v1.ContainerState") proto.RegisterType((*ContainerStateRunning)(nil), "k8s.io.api.core.v1.ContainerStateRunning") proto.RegisterType((*ContainerStateTerminated)(nil), "k8s.io.api.core.v1.ContainerStateTerminated") @@ -6583,6 +6754,7 @@ func init() { proto.RegisterType((*EventSource)(nil), "k8s.io.api.core.v1.EventSource") proto.RegisterType((*ExecAction)(nil), "k8s.io.api.core.v1.ExecAction") proto.RegisterType((*FCVolumeSource)(nil), "k8s.io.api.core.v1.FCVolumeSource") + proto.RegisterType((*FileKeySelector)(nil), "k8s.io.api.core.v1.FileKeySelector") proto.RegisterType((*FlexPersistentVolumeSource)(nil), "k8s.io.api.core.v1.FlexPersistentVolumeSource") proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.core.v1.FlexPersistentVolumeSource.OptionsEntry") proto.RegisterType((*FlexVolumeSource)(nil), "k8s.io.api.core.v1.FlexVolumeSource") @@ -6671,10 +6843,12 @@ func init() { proto.RegisterType((*PodAffinityTerm)(nil), "k8s.io.api.core.v1.PodAffinityTerm") proto.RegisterType((*PodAntiAffinity)(nil), "k8s.io.api.core.v1.PodAntiAffinity") proto.RegisterType((*PodAttachOptions)(nil), "k8s.io.api.core.v1.PodAttachOptions") + proto.RegisterType((*PodCertificateProjection)(nil), "k8s.io.api.core.v1.PodCertificateProjection") proto.RegisterType((*PodCondition)(nil), "k8s.io.api.core.v1.PodCondition") proto.RegisterType((*PodDNSConfig)(nil), "k8s.io.api.core.v1.PodDNSConfig") proto.RegisterType((*PodDNSConfigOption)(nil), "k8s.io.api.core.v1.PodDNSConfigOption") proto.RegisterType((*PodExecOptions)(nil), "k8s.io.api.core.v1.PodExecOptions") + proto.RegisterType((*PodExtendedResourceClaimStatus)(nil), "k8s.io.api.core.v1.PodExtendedResourceClaimStatus") proto.RegisterType((*PodIP)(nil), "k8s.io.api.core.v1.PodIP") proto.RegisterType((*PodList)(nil), "k8s.io.api.core.v1.PodList") proto.RegisterType((*PodLogOptions)(nil), "k8s.io.api.core.v1.PodLogOptions") @@ -6787,1020 +6961,1049 @@ func init() { } var fileDescriptor_6c07b07c062484ab = []byte{ - // 16206 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x1c, 0xc9, - 0x75, 0x30, 0xc6, 0xea, 0x9e, 0xf3, 0xcd, 0x9d, 0xb8, 0x06, 0xb3, 0x00, 0x1a, 0x5b, 0xbb, 0x8b, - 0xc5, 0x5e, 0x03, 0x62, 0x0f, 0x2e, 0xb8, 0xbb, 0x5c, 0xed, 0x9c, 0x40, 0x2f, 0x30, 0x83, 0xde, - 0xec, 0x01, 0x40, 0x2e, 0x97, 0x14, 0x0b, 0xdd, 0x39, 0x33, 0xc5, 0xe9, 0xae, 0xea, 0xad, 0xaa, - 0x1e, 0x60, 0x60, 0x2a, 0x24, 0x51, 0x16, 0x25, 0x52, 0x72, 0x04, 0x43, 0x21, 0x59, 0x0e, 0x4a, - 0xa1, 0x1f, 0xba, 0x65, 0x5a, 0xb2, 0x68, 0xc9, 0x92, 0x2c, 0xea, 0xb2, 0x2d, 0x47, 0xc8, 0xfe, - 0x21, 0x4b, 0x8a, 0x30, 0xa9, 0xb0, 0xc2, 0x23, 0x73, 0x6c, 0x87, 0x42, 0x3f, 0x2c, 0x29, 0x64, - 0xff, 0xb0, 0x27, 0xf4, 0x7d, 0xfc, 0x22, 0xcf, 0xca, 0xac, 0xa3, 0xbb, 0x07, 0x0b, 0x0c, 0x97, - 0x8c, 0xfd, 0xd7, 0x9d, 0xef, 0xe5, 0xcb, 0xac, 0x3c, 0x5f, 0xbe, 0x13, 0xec, 0xad, 0x4b, 0xe1, - 0xac, 0xeb, 0x5f, 0x70, 0x5a, 0xee, 0x85, 0x9a, 0x1f, 0x90, 0x0b, 0xdb, 0x17, 0x2f, 0x6c, 0x10, - 0x8f, 0x04, 0x4e, 0x44, 0xea, 0xb3, 0xad, 0xc0, 0x8f, 0x7c, 0x84, 0x38, 0xce, 0xac, 0xd3, 0x72, - 0x67, 0x29, 0xce, 0xec, 0xf6, 0xc5, 0x99, 0xe7, 0x36, 0xdc, 0x68, 0xb3, 0x7d, 0x7b, 0xb6, 0xe6, - 0x37, 0x2f, 0x6c, 0xf8, 0x1b, 0xfe, 0x05, 0x86, 0x7a, 0xbb, 0xbd, 0xce, 0xfe, 0xb1, 0x3f, 0xec, - 0x17, 0x27, 0x31, 0xf3, 0x62, 0xdc, 0x4c, 0xd3, 0xa9, 0x6d, 0xba, 0x1e, 0x09, 0x76, 0x2e, 0xb4, - 0xb6, 0x36, 0x58, 0xbb, 0x01, 0x09, 0xfd, 0x76, 0x50, 0x23, 0xc9, 0x86, 0x3b, 0xd6, 0x0a, 0x2f, - 0x34, 0x49, 0xe4, 0x64, 0x74, 0x77, 0xe6, 0x42, 0x5e, 0xad, 0xa0, 0xed, 0x45, 0x6e, 0x33, 0xdd, - 0xcc, 0x47, 0xba, 0x55, 0x08, 0x6b, 0x9b, 0xa4, 0xe9, 0xa4, 0xea, 0xbd, 0x90, 0x57, 0xaf, 0x1d, - 0xb9, 0x8d, 0x0b, 0xae, 0x17, 0x85, 0x51, 0x90, 0xac, 0x64, 0x7f, 0xd3, 0x82, 0xb3, 0x73, 0xb7, - 0xaa, 0x4b, 0x0d, 0x27, 0x8c, 0xdc, 0xda, 0x7c, 0xc3, 0xaf, 0x6d, 0x55, 0x23, 0x3f, 0x20, 0x37, - 0xfd, 0x46, 0xbb, 0x49, 0xaa, 0x6c, 0x20, 0xd0, 0xb3, 0x30, 0xb4, 0xcd, 0xfe, 0x97, 0x17, 0xa7, - 0xad, 0xb3, 0xd6, 0xf9, 0xe1, 0xf9, 0xc9, 0xbf, 0xd8, 0x2d, 0x7d, 0x68, 0x6f, 0xb7, 0x34, 0x74, - 0x53, 0x94, 0x63, 0x85, 0x81, 0xce, 0xc1, 0xc0, 0x7a, 0xb8, 0xb6, 0xd3, 0x22, 0xd3, 0x05, 0x86, - 0x3b, 0x2e, 0x70, 0x07, 0x96, 0xab, 0xb4, 0x14, 0x0b, 0x28, 0xba, 0x00, 0xc3, 0x2d, 0x27, 0x88, - 0xdc, 0xc8, 0xf5, 0xbd, 0xe9, 0xe2, 0x59, 0xeb, 0x7c, 0xff, 0xfc, 0x94, 0x40, 0x1d, 0xae, 0x48, - 0x00, 0x8e, 0x71, 0x68, 0x37, 0x02, 0xe2, 0xd4, 0xaf, 0x7b, 0x8d, 0x9d, 0xe9, 0xbe, 0xb3, 0xd6, - 0xf9, 0xa1, 0xb8, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0x7f, 0xa5, 0x00, 0x43, 0x73, 0xeb, 0xeb, - 0xae, 0xe7, 0x46, 0x3b, 0xe8, 0x26, 0x8c, 0x7a, 0x7e, 0x9d, 0xc8, 0xff, 0xec, 0x2b, 0x46, 0x9e, - 0x3f, 0x3b, 0x9b, 0x5e, 0x4a, 0xb3, 0xab, 0x1a, 0xde, 0xfc, 0xe4, 0xde, 0x6e, 0x69, 0x54, 0x2f, - 0xc1, 0x06, 0x1d, 0x84, 0x61, 0xa4, 0xe5, 0xd7, 0x15, 0xd9, 0x02, 0x23, 0x5b, 0xca, 0x22, 0x5b, - 0x89, 0xd1, 0xe6, 0x27, 0xf6, 0x76, 0x4b, 0x23, 0x5a, 0x01, 0xd6, 0x89, 0xa0, 0xdb, 0x30, 0x41, - 0xff, 0x7a, 0x91, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0xc7, 0xf2, 0xe8, 0x6a, 0xa8, 0xf3, 0x47, 0xf6, - 0x76, 0x4b, 0x13, 0x89, 0x42, 0x9c, 0x24, 0x68, 0xff, 0xa4, 0x05, 0x13, 0x73, 0xad, 0xd6, 0x5c, - 0xd0, 0xf4, 0x83, 0x4a, 0xe0, 0xaf, 0xbb, 0x0d, 0x82, 0x5e, 0x86, 0xbe, 0x88, 0xce, 0x1a, 0x9f, - 0xe1, 0xc7, 0xc4, 0xd0, 0xf6, 0xd1, 0xb9, 0xda, 0xdf, 0x2d, 0x1d, 0x49, 0xa0, 0xb3, 0xa9, 0x64, - 0x15, 0xd0, 0x1b, 0x30, 0xd9, 0xf0, 0x6b, 0x4e, 0x63, 0xd3, 0x0f, 0x23, 0x01, 0x15, 0x53, 0x7f, - 0x74, 0x6f, 0xb7, 0x34, 0x79, 0x2d, 0x01, 0xc3, 0x29, 0x6c, 0xfb, 0x1e, 0x8c, 0xcf, 0x45, 0x91, - 0x53, 0xdb, 0x24, 0x75, 0xbe, 0xa0, 0xd0, 0x8b, 0xd0, 0xe7, 0x39, 0x4d, 0xd9, 0x99, 0xb3, 0xb2, - 0x33, 0xab, 0x4e, 0x93, 0x76, 0x66, 0xf2, 0x86, 0xe7, 0xbe, 0xdb, 0x16, 0x8b, 0x94, 0x96, 0x61, - 0x86, 0x8d, 0x9e, 0x07, 0xa8, 0x93, 0x6d, 0xb7, 0x46, 0x2a, 0x4e, 0xb4, 0x29, 0xfa, 0x80, 0x44, - 0x5d, 0x58, 0x54, 0x10, 0xac, 0x61, 0xd9, 0x77, 0x61, 0x78, 0x6e, 0xdb, 0x77, 0xeb, 0x15, 0xbf, - 0x1e, 0xa2, 0x2d, 0x98, 0x68, 0x05, 0x64, 0x9d, 0x04, 0xaa, 0x68, 0xda, 0x3a, 0x5b, 0x3c, 0x3f, - 0xf2, 0xfc, 0xf9, 0xcc, 0xb1, 0x37, 0x51, 0x97, 0xbc, 0x28, 0xd8, 0x99, 0x3f, 0x21, 0xda, 0x9b, - 0x48, 0x40, 0x71, 0x92, 0xb2, 0xfd, 0xe7, 0x05, 0x38, 0x36, 0x77, 0xaf, 0x1d, 0x90, 0x45, 0x37, - 0xdc, 0x4a, 0x6e, 0xb8, 0xba, 0x1b, 0x6e, 0xad, 0xc6, 0x23, 0xa0, 0x56, 0xfa, 0xa2, 0x28, 0xc7, - 0x0a, 0x03, 0x3d, 0x07, 0x83, 0xf4, 0xf7, 0x0d, 0x5c, 0x16, 0x9f, 0x7c, 0x44, 0x20, 0x8f, 0x2c, - 0x3a, 0x91, 0xb3, 0xc8, 0x41, 0x58, 0xe2, 0xa0, 0x15, 0x18, 0xa9, 0xb1, 0xf3, 0x61, 0x63, 0xc5, - 0xaf, 0x13, 0xb6, 0xb6, 0x86, 0xe7, 0x9f, 0xa1, 0xe8, 0x0b, 0x71, 0xf1, 0xfe, 0x6e, 0x69, 0x9a, - 0xf7, 0x4d, 0x90, 0xd0, 0x60, 0x58, 0xaf, 0x8f, 0x6c, 0xb5, 0xdd, 0xfb, 0x18, 0x25, 0xc8, 0xd8, - 0xea, 0xe7, 0xb5, 0x9d, 0xdb, 0xcf, 0x76, 0xee, 0x68, 0xf6, 0xae, 0x45, 0x17, 0xa1, 0x6f, 0xcb, - 0xf5, 0xea, 0xd3, 0x03, 0x8c, 0xd6, 0x69, 0x3a, 0xe7, 0x57, 0x5d, 0xaf, 0xbe, 0xbf, 0x5b, 0x9a, - 0x32, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0x1f, 0x0b, 0x4a, 0x0c, 0xb6, 0xec, 0x36, 0x48, - 0x85, 0x04, 0xa1, 0x1b, 0x46, 0xc4, 0x8b, 0x8c, 0x01, 0x7d, 0x1e, 0x20, 0x24, 0xb5, 0x80, 0x44, - 0xda, 0x90, 0xaa, 0x85, 0x51, 0x55, 0x10, 0xac, 0x61, 0xd1, 0xf3, 0x29, 0xdc, 0x74, 0x02, 0xb6, - 0xbe, 0xc4, 0xc0, 0xaa, 0xf3, 0xa9, 0x2a, 0x01, 0x38, 0xc6, 0x31, 0xce, 0xa7, 0x62, 0xb7, 0xf3, - 0x09, 0x7d, 0x0c, 0x26, 0xe2, 0xc6, 0xc2, 0x96, 0x53, 0x93, 0x03, 0xc8, 0x76, 0x70, 0xd5, 0x04, - 0xe1, 0x24, 0xae, 0xfd, 0x9f, 0x5b, 0x62, 0xf1, 0xd0, 0xaf, 0x7e, 0x9f, 0x7f, 0xab, 0xfd, 0x07, - 0x16, 0x0c, 0xce, 0xbb, 0x5e, 0xdd, 0xf5, 0x36, 0xd0, 0x67, 0x60, 0x88, 0x5e, 0x95, 0x75, 0x27, - 0x72, 0xc4, 0x31, 0xfc, 0x61, 0x6d, 0x6f, 0xa9, 0x9b, 0x6b, 0xb6, 0xb5, 0xb5, 0x41, 0x0b, 0xc2, - 0x59, 0x8a, 0x4d, 0x77, 0xdb, 0xf5, 0xdb, 0x9f, 0x25, 0xb5, 0x68, 0x85, 0x44, 0x4e, 0xfc, 0x39, - 0x71, 0x19, 0x56, 0x54, 0xd1, 0x55, 0x18, 0x88, 0x9c, 0x60, 0x83, 0x44, 0xe2, 0x3c, 0xce, 0x3c, - 0x37, 0x79, 0x4d, 0x4c, 0x77, 0x24, 0xf1, 0x6a, 0x24, 0xbe, 0xa5, 0xd6, 0x58, 0x55, 0x2c, 0x48, - 0xd8, 0xff, 0x6e, 0x10, 0x4e, 0x2e, 0x54, 0xcb, 0x39, 0xeb, 0xea, 0x1c, 0x0c, 0xd4, 0x03, 0x77, - 0x9b, 0x04, 0x62, 0x9c, 0x15, 0x95, 0x45, 0x56, 0x8a, 0x05, 0x14, 0x5d, 0x82, 0x51, 0x7e, 0x3f, - 0x5e, 0x71, 0xbc, 0x7a, 0x7c, 0x3c, 0x0a, 0xec, 0xd1, 0x9b, 0x1a, 0x0c, 0x1b, 0x98, 0x07, 0x5c, - 0x54, 0xe7, 0x12, 0x9b, 0x31, 0xef, 0xee, 0xfd, 0xa2, 0x05, 0x93, 0xbc, 0x99, 0xb9, 0x28, 0x0a, - 0xdc, 0xdb, 0xed, 0x88, 0x84, 0xd3, 0xfd, 0xec, 0xa4, 0x5b, 0xc8, 0x1a, 0xad, 0xdc, 0x11, 0x98, - 0xbd, 0x99, 0xa0, 0xc2, 0x0f, 0xc1, 0x69, 0xd1, 0xee, 0x64, 0x12, 0x8c, 0x53, 0xcd, 0xa2, 0x1f, - 0xb1, 0x60, 0xa6, 0xe6, 0x7b, 0x51, 0xe0, 0x37, 0x1a, 0x24, 0xa8, 0xb4, 0x6f, 0x37, 0xdc, 0x70, - 0x93, 0xaf, 0x53, 0x4c, 0xd6, 0xd9, 0x49, 0x90, 0x33, 0x87, 0x0a, 0x49, 0xcc, 0xe1, 0x99, 0xbd, - 0xdd, 0xd2, 0xcc, 0x42, 0x2e, 0x29, 0xdc, 0xa1, 0x19, 0xb4, 0x05, 0x88, 0xde, 0xec, 0xd5, 0xc8, - 0xd9, 0x20, 0x71, 0xe3, 0x83, 0xbd, 0x37, 0x7e, 0x7c, 0x6f, 0xb7, 0x84, 0x56, 0x53, 0x24, 0x70, - 0x06, 0x59, 0xf4, 0x2e, 0x1c, 0xa5, 0xa5, 0xa9, 0x6f, 0x1d, 0xea, 0xbd, 0xb9, 0xe9, 0xbd, 0xdd, - 0xd2, 0xd1, 0xd5, 0x0c, 0x22, 0x38, 0x93, 0x34, 0xfa, 0x21, 0x0b, 0x4e, 0xc6, 0x9f, 0xbf, 0x74, - 0xb7, 0xe5, 0x78, 0xf5, 0xb8, 0xe1, 0xe1, 0xde, 0x1b, 0xa6, 0x67, 0xf2, 0xc9, 0x85, 0x3c, 0x4a, - 0x38, 0xbf, 0x11, 0xe4, 0xc1, 0x11, 0xda, 0xb5, 0x64, 0xdb, 0xd0, 0x7b, 0xdb, 0x27, 0xf6, 0x76, - 0x4b, 0x47, 0x56, 0xd3, 0x34, 0x70, 0x16, 0xe1, 0x99, 0x05, 0x38, 0x96, 0xb9, 0x3a, 0xd1, 0x24, - 0x14, 0xb7, 0x08, 0x67, 0x02, 0x87, 0x31, 0xfd, 0x89, 0x8e, 0x42, 0xff, 0xb6, 0xd3, 0x68, 0x8b, - 0x8d, 0x89, 0xf9, 0x9f, 0x57, 0x0a, 0x97, 0x2c, 0xfb, 0x7f, 0x28, 0xc2, 0xc4, 0x42, 0xb5, 0x7c, - 0x5f, 0xbb, 0x5e, 0xbf, 0xf6, 0x0a, 0x1d, 0xaf, 0xbd, 0xf8, 0x12, 0x2d, 0xe6, 0x5e, 0xa2, 0x3f, - 0x98, 0xb1, 0x65, 0xfb, 0xd8, 0x96, 0xfd, 0x68, 0xce, 0x96, 0x7d, 0xc0, 0x1b, 0x75, 0x3b, 0x67, - 0xd5, 0xf6, 0xb3, 0x09, 0xcc, 0xe4, 0x90, 0x18, 0xef, 0x97, 0x3c, 0x6a, 0x0f, 0xb8, 0x74, 0x1f, - 0xcc, 0x3c, 0xd6, 0x60, 0x74, 0xc1, 0x69, 0x39, 0xb7, 0xdd, 0x86, 0x1b, 0xb9, 0x24, 0x44, 0x4f, - 0x42, 0xd1, 0xa9, 0xd7, 0x19, 0x77, 0x37, 0x3c, 0x7f, 0x6c, 0x6f, 0xb7, 0x54, 0x9c, 0xab, 0x53, - 0x36, 0x03, 0x14, 0xd6, 0x0e, 0xa6, 0x18, 0xe8, 0x69, 0xe8, 0xab, 0x07, 0x7e, 0x6b, 0xba, 0xc0, - 0x30, 0xe9, 0x2e, 0xef, 0x5b, 0x0c, 0xfc, 0x56, 0x02, 0x95, 0xe1, 0xd8, 0x7f, 0x56, 0x80, 0x53, - 0x0b, 0xa4, 0xb5, 0xb9, 0x5c, 0xcd, 0xb9, 0x2f, 0xce, 0xc3, 0x50, 0xd3, 0xf7, 0xdc, 0xc8, 0x0f, - 0x42, 0xd1, 0x34, 0x5b, 0x11, 0x2b, 0xa2, 0x0c, 0x2b, 0x28, 0x3a, 0x0b, 0x7d, 0xad, 0x98, 0x89, - 0x1d, 0x95, 0x0c, 0x30, 0x63, 0x5f, 0x19, 0x84, 0x62, 0xb4, 0x43, 0x12, 0x88, 0x15, 0xa3, 0x30, - 0x6e, 0x84, 0x24, 0xc0, 0x0c, 0x12, 0x73, 0x02, 0x94, 0x47, 0x10, 0x37, 0x42, 0x82, 0x13, 0xa0, - 0x10, 0xac, 0x61, 0xa1, 0x0a, 0x0c, 0x87, 0x89, 0x99, 0xed, 0x69, 0x6b, 0x8e, 0x31, 0x56, 0x41, - 0xcd, 0x64, 0x4c, 0xc4, 0xb8, 0xc1, 0x06, 0xba, 0xb2, 0x0a, 0x5f, 0x2f, 0x00, 0xe2, 0x43, 0xf8, - 0x5d, 0x36, 0x70, 0x37, 0xd2, 0x03, 0xd7, 0xfb, 0x96, 0x78, 0x50, 0xa3, 0xf7, 0xff, 0x5a, 0x70, - 0x6a, 0xc1, 0xf5, 0xea, 0x24, 0xc8, 0x59, 0x80, 0x0f, 0xe7, 0x29, 0x7f, 0x30, 0x26, 0xc5, 0x58, - 0x62, 0x7d, 0x0f, 0x60, 0x89, 0xd9, 0xff, 0x6c, 0x01, 0xe2, 0x9f, 0xfd, 0xbe, 0xfb, 0xd8, 0x1b, - 0xe9, 0x8f, 0x7d, 0x00, 0xcb, 0xc2, 0xbe, 0x06, 0xe3, 0x0b, 0x0d, 0x97, 0x78, 0x51, 0xb9, 0xb2, - 0xe0, 0x7b, 0xeb, 0xee, 0x06, 0x7a, 0x05, 0xc6, 0x23, 0xb7, 0x49, 0xfc, 0x76, 0x54, 0x25, 0x35, - 0xdf, 0x63, 0x2f, 0x57, 0xeb, 0x7c, 0xff, 0x3c, 0xda, 0xdb, 0x2d, 0x8d, 0xaf, 0x19, 0x10, 0x9c, - 0xc0, 0xb4, 0x7f, 0x95, 0x9e, 0x5b, 0x8d, 0x76, 0x18, 0x91, 0x60, 0x2d, 0x68, 0x87, 0xd1, 0x7c, - 0x9b, 0xf2, 0x9e, 0x95, 0xc0, 0xa7, 0xdd, 0x71, 0x7d, 0x0f, 0x9d, 0x32, 0x9e, 0xe3, 0x43, 0xf2, - 0x29, 0x2e, 0x9e, 0xdd, 0xb3, 0x00, 0xa1, 0xbb, 0xe1, 0x91, 0x40, 0x7b, 0x3e, 0x8c, 0xb3, 0xad, - 0xa2, 0x4a, 0xb1, 0x86, 0x81, 0x1a, 0x30, 0xd6, 0x70, 0x6e, 0x93, 0x46, 0x95, 0x34, 0x48, 0x2d, - 0xf2, 0x03, 0x21, 0xdf, 0x78, 0xa1, 0xb7, 0x77, 0xc0, 0x35, 0xbd, 0xea, 0xfc, 0xd4, 0xde, 0x6e, - 0x69, 0xcc, 0x28, 0xc2, 0x26, 0x71, 0x7a, 0x74, 0xf8, 0x2d, 0xfa, 0x15, 0x4e, 0x43, 0x7f, 0x7c, - 0x5e, 0x17, 0x65, 0x58, 0x41, 0xd5, 0xd1, 0xd1, 0x97, 0x77, 0x74, 0xd8, 0x7f, 0x47, 0x17, 0x9a, - 0xdf, 0x6c, 0xf9, 0x1e, 0xf1, 0xa2, 0x05, 0xdf, 0xab, 0x73, 0xc9, 0xd4, 0x2b, 0x86, 0xe8, 0xe4, - 0x5c, 0x42, 0x74, 0x72, 0x3c, 0x5d, 0x43, 0x93, 0x9e, 0x7c, 0x14, 0x06, 0xc2, 0xc8, 0x89, 0xda, - 0xa1, 0x18, 0xb8, 0x47, 0xe5, 0xb2, 0xab, 0xb2, 0xd2, 0xfd, 0xdd, 0xd2, 0x84, 0xaa, 0xc6, 0x8b, - 0xb0, 0xa8, 0x80, 0x9e, 0x82, 0xc1, 0x26, 0x09, 0x43, 0x67, 0x43, 0xb2, 0x0d, 0x13, 0xa2, 0xee, - 0xe0, 0x0a, 0x2f, 0xc6, 0x12, 0x8e, 0x1e, 0x83, 0x7e, 0x12, 0x04, 0x7e, 0x20, 0xbe, 0x6d, 0x4c, - 0x20, 0xf6, 0x2f, 0xd1, 0x42, 0xcc, 0x61, 0xf6, 0xff, 0x6c, 0xc1, 0x84, 0xea, 0x2b, 0x6f, 0xeb, - 0x10, 0x9e, 0x6b, 0x6f, 0x03, 0xd4, 0xe4, 0x07, 0x86, 0xec, 0x9a, 0x1d, 0x79, 0xfe, 0x5c, 0x26, - 0x47, 0x93, 0x1a, 0xc6, 0x98, 0xb2, 0x2a, 0x0a, 0xb1, 0x46, 0xcd, 0xfe, 0x63, 0x0b, 0x8e, 0x24, - 0xbe, 0xe8, 0x9a, 0x1b, 0x46, 0xe8, 0x9d, 0xd4, 0x57, 0xcd, 0xf6, 0xb8, 0xf8, 0xdc, 0x90, 0x7f, - 0x93, 0xda, 0xf3, 0xb2, 0x44, 0xfb, 0xa2, 0x2b, 0xd0, 0xef, 0x46, 0xa4, 0x29, 0x3f, 0xe6, 0xb1, - 0x8e, 0x1f, 0xc3, 0x7b, 0x15, 0xcf, 0x48, 0x99, 0xd6, 0xc4, 0x9c, 0x80, 0xfd, 0x67, 0x45, 0x18, - 0xe6, 0xfb, 0x7b, 0xc5, 0x69, 0x1d, 0xc2, 0x5c, 0x3c, 0x03, 0xc3, 0x6e, 0xb3, 0xd9, 0x8e, 0x9c, - 0xdb, 0xe2, 0xde, 0x1b, 0xe2, 0x67, 0x50, 0x59, 0x16, 0xe2, 0x18, 0x8e, 0xca, 0xd0, 0xc7, 0xba, - 0xc2, 0xbf, 0xf2, 0xc9, 0xec, 0xaf, 0x14, 0x7d, 0x9f, 0x5d, 0x74, 0x22, 0x87, 0xb3, 0x9c, 0x6a, - 0x5f, 0xd1, 0x22, 0xcc, 0x48, 0x20, 0x07, 0xe0, 0xb6, 0xeb, 0x39, 0xc1, 0x0e, 0x2d, 0x9b, 0x2e, - 0x32, 0x82, 0xcf, 0x75, 0x26, 0x38, 0xaf, 0xf0, 0x39, 0x59, 0xf5, 0x61, 0x31, 0x00, 0x6b, 0x44, - 0x67, 0x5e, 0x86, 0x61, 0x85, 0x7c, 0x10, 0xce, 0x71, 0xe6, 0x63, 0x30, 0x91, 0x68, 0xab, 0x5b, - 0xf5, 0x51, 0x9d, 0xf1, 0xfc, 0x43, 0x76, 0x64, 0x88, 0x5e, 0x2f, 0x79, 0xdb, 0xe2, 0x6e, 0xba, - 0x07, 0x47, 0x1b, 0x19, 0x47, 0xbe, 0x98, 0xd7, 0xde, 0xaf, 0x88, 0x53, 0xe2, 0xb3, 0x8f, 0x66, - 0x41, 0x71, 0x66, 0x1b, 0xc6, 0x89, 0x58, 0xe8, 0x74, 0x22, 0xd2, 0xf3, 0xee, 0xa8, 0xea, 0xfc, - 0x55, 0xb2, 0xa3, 0x0e, 0xd5, 0xef, 0x64, 0xf7, 0x4f, 0xf3, 0xd1, 0xe7, 0xc7, 0xe5, 0x88, 0x20, - 0x50, 0xbc, 0x4a, 0x76, 0xf8, 0x54, 0xe8, 0x5f, 0x57, 0xec, 0xf8, 0x75, 0x5f, 0xb3, 0x60, 0x4c, - 0x7d, 0xdd, 0x21, 0x9c, 0x0b, 0xf3, 0xe6, 0xb9, 0x70, 0xba, 0xe3, 0x02, 0xcf, 0x39, 0x11, 0xbe, - 0x5e, 0x80, 0x93, 0x0a, 0x87, 0x3e, 0xa2, 0xf8, 0x1f, 0xb1, 0xaa, 0x2e, 0xc0, 0xb0, 0xa7, 0xc4, - 0x89, 0x96, 0x29, 0xc7, 0x8b, 0x85, 0x89, 0x31, 0x0e, 0xbd, 0xf2, 0xbc, 0xf8, 0xd2, 0x1e, 0xd5, - 0xe5, 0xec, 0xe2, 0x72, 0x9f, 0x87, 0x62, 0xdb, 0xad, 0x8b, 0x0b, 0xe6, 0xc3, 0x72, 0xb4, 0x6f, - 0x94, 0x17, 0xf7, 0x77, 0x4b, 0x8f, 0xe6, 0xa9, 0x9c, 0xe8, 0xcd, 0x16, 0xce, 0xde, 0x28, 0x2f, - 0x62, 0x5a, 0x19, 0xcd, 0xc1, 0x84, 0xd4, 0xaa, 0xdd, 0xa4, 0x7c, 0xa9, 0xef, 0x89, 0x7b, 0x48, - 0x09, 0xcb, 0xb1, 0x09, 0xc6, 0x49, 0x7c, 0xb4, 0x08, 0x93, 0x5b, 0xed, 0xdb, 0xa4, 0x41, 0x22, - 0xfe, 0xc1, 0x57, 0x09, 0x17, 0x25, 0x0f, 0xc7, 0x4f, 0xd8, 0xab, 0x09, 0x38, 0x4e, 0xd5, 0xb0, - 0xbf, 0xcd, 0xee, 0x03, 0x31, 0x7a, 0x1a, 0x7f, 0xf3, 0x9d, 0x5c, 0xce, 0xbd, 0xac, 0x8a, 0xab, - 0x64, 0x67, 0xcd, 0xa7, 0x7c, 0x48, 0xf6, 0xaa, 0x30, 0xd6, 0x7c, 0x5f, 0xc7, 0x35, 0xff, 0xbb, - 0x05, 0x38, 0xa6, 0x46, 0xc0, 0xe0, 0x96, 0xbf, 0xdb, 0xc7, 0xe0, 0x22, 0x8c, 0xd4, 0xc9, 0xba, - 0xd3, 0x6e, 0x44, 0x4a, 0xaf, 0xd1, 0xcf, 0x55, 0x6d, 0x8b, 0x71, 0x31, 0xd6, 0x71, 0x0e, 0x30, - 0x6c, 0xbf, 0x39, 0xc6, 0x2e, 0xe2, 0xc8, 0xa1, 0x6b, 0x5c, 0xed, 0x1a, 0x2b, 0x77, 0xd7, 0x3c, - 0x06, 0xfd, 0x6e, 0x93, 0x32, 0x66, 0x05, 0x93, 0xdf, 0x2a, 0xd3, 0x42, 0xcc, 0x61, 0xe8, 0x09, - 0x18, 0xac, 0xf9, 0xcd, 0xa6, 0xe3, 0xd5, 0xd9, 0x95, 0x37, 0x3c, 0x3f, 0x42, 0x79, 0xb7, 0x05, - 0x5e, 0x84, 0x25, 0x8c, 0x32, 0xdf, 0x4e, 0xb0, 0xc1, 0x85, 0x3d, 0x82, 0xf9, 0x9e, 0x0b, 0x36, - 0x42, 0xcc, 0x4a, 0xe9, 0x5b, 0xf5, 0x8e, 0x1f, 0x6c, 0xb9, 0xde, 0xc6, 0xa2, 0x1b, 0x88, 0x2d, - 0xa1, 0xee, 0xc2, 0x5b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x0c, 0xfd, 0x2d, 0x3f, 0x88, 0xc2, 0xe9, - 0x01, 0x36, 0xdc, 0x8f, 0xe6, 0x1c, 0x44, 0xfc, 0x6b, 0x2b, 0x7e, 0x10, 0xc5, 0x1f, 0x40, 0xff, - 0x85, 0x98, 0x57, 0x47, 0xd7, 0x60, 0x90, 0x78, 0xdb, 0xcb, 0x81, 0xdf, 0x9c, 0x3e, 0x92, 0x4f, - 0x69, 0x89, 0xa3, 0xf0, 0x65, 0x16, 0xf3, 0xa8, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0xa3, 0x50, 0x24, - 0xde, 0xf6, 0xf4, 0x20, 0xa3, 0x34, 0x93, 0x43, 0xe9, 0xa6, 0x13, 0xc4, 0x67, 0xfe, 0x92, 0xb7, - 0x8d, 0x69, 0x1d, 0xf4, 0x09, 0x18, 0x96, 0x07, 0x46, 0x28, 0xa4, 0xa8, 0x99, 0x0b, 0x56, 0x1e, - 0x33, 0x98, 0xbc, 0xdb, 0x76, 0x03, 0xd2, 0x24, 0x5e, 0x14, 0xc6, 0x27, 0xa4, 0x84, 0x86, 0x38, - 0xa6, 0x86, 0x6a, 0x30, 0x1a, 0x90, 0xd0, 0xbd, 0x47, 0x2a, 0x7e, 0xc3, 0xad, 0xed, 0x4c, 0x9f, - 0x60, 0xdd, 0x7b, 0xaa, 0xe3, 0x90, 0x61, 0xad, 0x42, 0x2c, 0xe5, 0xd7, 0x4b, 0xb1, 0x41, 0x14, - 0xbd, 0x05, 0x63, 0x01, 0x09, 0x23, 0x27, 0x88, 0x44, 0x2b, 0xd3, 0x4a, 0x2b, 0x37, 0x86, 0x75, - 0x00, 0x7f, 0x4e, 0xc4, 0xcd, 0xc4, 0x10, 0x6c, 0x52, 0x40, 0x9f, 0x90, 0x2a, 0x87, 0x15, 0xbf, - 0xed, 0x45, 0xe1, 0xf4, 0x30, 0xeb, 0x77, 0xa6, 0x6e, 0xfa, 0x66, 0x8c, 0x97, 0xd4, 0x49, 0xf0, - 0xca, 0xd8, 0x20, 0x85, 0x3e, 0x05, 0x63, 0xfc, 0x3f, 0x57, 0xa9, 0x86, 0xd3, 0xc7, 0x18, 0xed, - 0xb3, 0xf9, 0xb4, 0x39, 0xe2, 0xfc, 0x31, 0x41, 0x7c, 0x4c, 0x2f, 0x0d, 0xb1, 0x49, 0x0d, 0x61, - 0x18, 0x6b, 0xb8, 0xdb, 0xc4, 0x23, 0x61, 0x58, 0x09, 0xfc, 0xdb, 0x44, 0x48, 0x88, 0x4f, 0x66, - 0xab, 0x60, 0xfd, 0xdb, 0x44, 0x3c, 0x02, 0xf5, 0x3a, 0xd8, 0x24, 0x81, 0x6e, 0xc0, 0x38, 0x7d, - 0x92, 0xbb, 0x31, 0xd1, 0x91, 0x6e, 0x44, 0xd9, 0xc3, 0x19, 0x1b, 0x95, 0x70, 0x82, 0x08, 0xba, - 0x0e, 0xa3, 0x6c, 0xcc, 0xdb, 0x2d, 0x4e, 0xf4, 0x78, 0x37, 0xa2, 0xcc, 0xa0, 0xa0, 0xaa, 0x55, - 0xc1, 0x06, 0x01, 0xf4, 0x26, 0x0c, 0x37, 0xdc, 0x75, 0x52, 0xdb, 0xa9, 0x35, 0xc8, 0xf4, 0x28, - 0xa3, 0x96, 0x79, 0x18, 0x5e, 0x93, 0x48, 0x9c, 0x3f, 0x57, 0x7f, 0x71, 0x5c, 0x1d, 0xdd, 0x84, - 0xe3, 0x11, 0x09, 0x9a, 0xae, 0xe7, 0xd0, 0x43, 0x4c, 0x3c, 0x09, 0x99, 0x66, 0x7c, 0x8c, 0xad, - 0xae, 0x33, 0x62, 0x36, 0x8e, 0xaf, 0x65, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x2e, 0x4c, 0x67, 0x40, - 0xf8, 0xba, 0x3d, 0xca, 0x28, 0xbf, 0x26, 0x28, 0x4f, 0xaf, 0xe5, 0xe0, 0xed, 0x77, 0x80, 0xe1, - 0x5c, 0xea, 0xe8, 0x3a, 0x4c, 0xb0, 0x93, 0xb3, 0xd2, 0x6e, 0x34, 0x44, 0x83, 0xe3, 0xac, 0xc1, - 0x27, 0x24, 0x1f, 0x51, 0x36, 0xc1, 0xfb, 0xbb, 0x25, 0x88, 0xff, 0xe1, 0x64, 0x6d, 0x74, 0x9b, - 0x29, 0x61, 0xdb, 0x81, 0x1b, 0xed, 0xd0, 0x5d, 0x45, 0xee, 0x46, 0xd3, 0x13, 0x1d, 0x05, 0x52, - 0x3a, 0xaa, 0xd2, 0xd4, 0xea, 0x85, 0x38, 0x49, 0x90, 0x5e, 0x05, 0x61, 0x54, 0x77, 0xbd, 0xe9, - 0x49, 0xfe, 0x9e, 0x92, 0x27, 0x69, 0x95, 0x16, 0x62, 0x0e, 0x63, 0x0a, 0x58, 0xfa, 0xe3, 0x3a, - 0xbd, 0x71, 0xa7, 0x18, 0x62, 0xac, 0x80, 0x95, 0x00, 0x1c, 0xe3, 0x50, 0x26, 0x38, 0x8a, 0x76, - 0xa6, 0x11, 0x43, 0x55, 0x07, 0xe2, 0xda, 0xda, 0x27, 0x30, 0x2d, 0xb7, 0x6f, 0xc3, 0xb8, 0x3a, - 0x26, 0xd8, 0x98, 0xa0, 0x12, 0xf4, 0x33, 0xb6, 0x4f, 0x88, 0x4f, 0x87, 0x69, 0x17, 0x18, 0x4b, - 0x88, 0x79, 0x39, 0xeb, 0x82, 0x7b, 0x8f, 0xcc, 0xef, 0x44, 0x84, 0xcb, 0x22, 0x8a, 0x5a, 0x17, - 0x24, 0x00, 0xc7, 0x38, 0xf6, 0xbf, 0xe7, 0xec, 0x73, 0x7c, 0x4b, 0xf4, 0x70, 0x2f, 0x3e, 0x0b, - 0x43, 0xcc, 0xf0, 0xc3, 0x0f, 0xb8, 0x76, 0xb6, 0x3f, 0x66, 0x98, 0xaf, 0x88, 0x72, 0xac, 0x30, - 0xd0, 0xab, 0x30, 0x56, 0xd3, 0x1b, 0x10, 0x97, 0xba, 0x3a, 0x46, 0x8c, 0xd6, 0xb1, 0x89, 0x8b, - 0x2e, 0xc1, 0x10, 0xb3, 0x71, 0xaa, 0xf9, 0x0d, 0xc1, 0x6d, 0x4a, 0xce, 0x64, 0xa8, 0x22, 0xca, - 0xf7, 0xb5, 0xdf, 0x58, 0x61, 0xa3, 0x73, 0x30, 0x40, 0xbb, 0x50, 0xae, 0x88, 0xeb, 0x54, 0x49, - 0x02, 0xaf, 0xb0, 0x52, 0x2c, 0xa0, 0xf6, 0x1f, 0x5b, 0x8c, 0x97, 0x4a, 0x9f, 0xf9, 0xe8, 0x0a, - 0xbb, 0x34, 0xd8, 0x0d, 0xa2, 0x69, 0xe1, 0x1f, 0xd7, 0x6e, 0x02, 0x05, 0xdb, 0x4f, 0xfc, 0xc7, - 0x46, 0x4d, 0xf4, 0x76, 0xf2, 0x66, 0xe0, 0x0c, 0xc5, 0x8b, 0x72, 0x08, 0x92, 0xb7, 0xc3, 0x23, - 0xf1, 0x15, 0x47, 0xfb, 0xd3, 0xe9, 0x8a, 0xb0, 0x7f, 0xaa, 0xa0, 0xad, 0x92, 0x6a, 0xe4, 0x44, - 0x04, 0x55, 0x60, 0xf0, 0x8e, 0xe3, 0x46, 0xae, 0xb7, 0x21, 0xf8, 0xbe, 0xce, 0x17, 0x1d, 0xab, - 0x74, 0x8b, 0x57, 0xe0, 0xdc, 0x8b, 0xf8, 0x83, 0x25, 0x19, 0x4a, 0x31, 0x68, 0x7b, 0x1e, 0xa5, - 0x58, 0xe8, 0x95, 0x22, 0xe6, 0x15, 0x38, 0x45, 0xf1, 0x07, 0x4b, 0x32, 0xe8, 0x1d, 0x00, 0x79, - 0x42, 0x90, 0xba, 0x90, 0x1d, 0x3e, 0xdb, 0x9d, 0xe8, 0x9a, 0xaa, 0xc3, 0x85, 0x93, 0xf1, 0x7f, - 0xac, 0xd1, 0xb3, 0x23, 0x6d, 0x4e, 0xf5, 0xce, 0xa0, 0x4f, 0xd2, 0x2d, 0xea, 0x04, 0x11, 0xa9, - 0xcf, 0x45, 0x62, 0x70, 0x9e, 0xee, 0xed, 0x71, 0xb8, 0xe6, 0x36, 0x89, 0xbe, 0x9d, 0x05, 0x11, - 0x1c, 0xd3, 0xb3, 0x7f, 0xbf, 0x08, 0xd3, 0x79, 0xdd, 0xa5, 0x9b, 0x86, 0xdc, 0x75, 0xa3, 0x05, - 0xca, 0xd6, 0x5a, 0xe6, 0xa6, 0x59, 0x12, 0xe5, 0x58, 0x61, 0xd0, 0xd5, 0x1b, 0xba, 0x1b, 0xf2, - 0x6d, 0xdf, 0x1f, 0xaf, 0xde, 0x2a, 0x2b, 0xc5, 0x02, 0x4a, 0xf1, 0x02, 0xe2, 0x84, 0xc2, 0xf8, - 0x4e, 0x5b, 0xe5, 0x98, 0x95, 0x62, 0x01, 0xd5, 0xa5, 0x8c, 0x7d, 0x5d, 0xa4, 0x8c, 0xc6, 0x10, - 0xf5, 0x3f, 0xd8, 0x21, 0x42, 0x9f, 0x06, 0x58, 0x77, 0x3d, 0x37, 0xdc, 0x64, 0xd4, 0x07, 0x0e, - 0x4c, 0x5d, 0x31, 0xc5, 0xcb, 0x8a, 0x0a, 0xd6, 0x28, 0xa2, 0x97, 0x60, 0x44, 0x1d, 0x20, 0xe5, - 0x45, 0xa6, 0xfa, 0xd7, 0x4c, 0xa9, 0xe2, 0xd3, 0x74, 0x11, 0xeb, 0x78, 0xf6, 0x67, 0x93, 0xeb, - 0x45, 0xec, 0x00, 0x6d, 0x7c, 0xad, 0x5e, 0xc7, 0xb7, 0xd0, 0x79, 0x7c, 0xed, 0xbf, 0x1e, 0x86, - 0x09, 0xa3, 0xb1, 0x76, 0xd8, 0xc3, 0x99, 0x7b, 0x99, 0x5e, 0x40, 0x4e, 0x44, 0xc4, 0xfe, 0xb3, - 0xbb, 0x6f, 0x15, 0xfd, 0x92, 0xa2, 0x3b, 0x80, 0xd7, 0x47, 0x9f, 0x86, 0xe1, 0x86, 0x13, 0x32, - 0x89, 0x25, 0x11, 0xfb, 0xae, 0x17, 0x62, 0xf1, 0x83, 0xd0, 0x09, 0x23, 0xed, 0xd6, 0xe7, 0xb4, - 0x63, 0x92, 0xf4, 0xa6, 0xa4, 0xfc, 0x95, 0xb4, 0xee, 0x54, 0x9d, 0xa0, 0x4c, 0xd8, 0x0e, 0xe6, - 0x30, 0x74, 0x89, 0x1d, 0xad, 0x74, 0x55, 0x2c, 0x50, 0x6e, 0x94, 0x2d, 0xb3, 0x7e, 0x83, 0xc9, - 0x56, 0x30, 0x6c, 0x60, 0xc6, 0x6f, 0xb2, 0x81, 0x0e, 0x6f, 0xb2, 0xa7, 0x60, 0x90, 0xfd, 0x50, - 0x2b, 0x40, 0xcd, 0x46, 0x99, 0x17, 0x63, 0x09, 0x4f, 0x2e, 0x98, 0xa1, 0xde, 0x16, 0x0c, 0x7d, - 0xf5, 0x89, 0x45, 0xcd, 0xcc, 0x2e, 0x86, 0xf8, 0x29, 0x27, 0x96, 0x3c, 0x96, 0x30, 0xf4, 0x6b, - 0x16, 0x20, 0xa7, 0x41, 0x5f, 0xcb, 0xb4, 0x58, 0x3d, 0x6e, 0x80, 0xb1, 0xda, 0xaf, 0x76, 0x1d, - 0xf6, 0x76, 0x38, 0x3b, 0x97, 0xaa, 0xcd, 0x25, 0xa5, 0xaf, 0x88, 0x2e, 0xa2, 0x34, 0x82, 0x7e, - 0x19, 0x5d, 0x73, 0xc3, 0xe8, 0xf3, 0x7f, 0x9f, 0xb8, 0x9c, 0x32, 0xba, 0x84, 0x6e, 0xe8, 0x8f, - 0xaf, 0x91, 0x03, 0x3e, 0xbe, 0xc6, 0x72, 0x1f, 0x5e, 0xdf, 0x9f, 0x78, 0xc0, 0x8c, 0xb2, 0x2f, - 0x7f, 0xa2, 0xcb, 0x03, 0x46, 0x88, 0xd3, 0x7b, 0x79, 0xc6, 0x54, 0x84, 0x1e, 0x78, 0x8c, 0x75, - 0xb9, 0xf3, 0x23, 0xf8, 0x46, 0x48, 0x82, 0xf9, 0x93, 0x52, 0x4d, 0xbc, 0xaf, 0xf3, 0x1e, 0x9a, - 0xde, 0xf8, 0x87, 0x2c, 0x98, 0x4e, 0x0f, 0x10, 0xef, 0xd2, 0xf4, 0x38, 0xeb, 0xbf, 0xdd, 0x69, - 0x64, 0x44, 0xe7, 0xa5, 0xb9, 0xeb, 0xf4, 0x5c, 0x0e, 0x2d, 0x9c, 0xdb, 0x0a, 0xba, 0x04, 0x10, - 0x46, 0x7e, 0x8b, 0x9f, 0xf5, 0x8c, 0x99, 0x1d, 0x66, 0x06, 0x17, 0x50, 0x55, 0xa5, 0xfb, 0xf1, - 0x5d, 0xa0, 0xe1, 0xce, 0xb4, 0xe1, 0x44, 0xce, 0x8a, 0xc9, 0x90, 0x77, 0x2f, 0xea, 0xf2, 0xee, - 0x2e, 0x52, 0xd2, 0x59, 0x39, 0xa7, 0xb3, 0x6f, 0xb5, 0x1d, 0x2f, 0x72, 0xa3, 0x1d, 0x5d, 0x3e, - 0xee, 0x81, 0x39, 0x94, 0xe8, 0x53, 0xd0, 0xdf, 0x70, 0xbd, 0xf6, 0x5d, 0x71, 0xc7, 0x9e, 0xcb, - 0x7e, 0xfe, 0x78, 0xed, 0xbb, 0xe6, 0xe4, 0x94, 0xe8, 0x56, 0x66, 0xe5, 0xfb, 0xbb, 0x25, 0x94, - 0x46, 0xc0, 0x9c, 0xaa, 0xfd, 0x34, 0x8c, 0x2f, 0x3a, 0xa4, 0xe9, 0x7b, 0x4b, 0x5e, 0xbd, 0xe5, - 0xbb, 0x5e, 0x84, 0xa6, 0xa1, 0x8f, 0x31, 0x97, 0xfc, 0x6a, 0xed, 0xa3, 0x83, 0x8f, 0x59, 0x89, - 0xbd, 0x01, 0xc7, 0x16, 0xfd, 0x3b, 0xde, 0x1d, 0x27, 0xa8, 0xcf, 0x55, 0xca, 0x9a, 0xbc, 0x70, - 0x55, 0xca, 0xab, 0xac, 0x7c, 0x69, 0x80, 0x56, 0x93, 0x2f, 0xc2, 0x65, 0xb7, 0x41, 0x72, 0xa4, - 0xba, 0x3f, 0x5b, 0x30, 0x5a, 0x8a, 0xf1, 0x95, 0x4e, 0xd2, 0xca, 0x35, 0x67, 0x78, 0x0b, 0x86, - 0xd6, 0x5d, 0xd2, 0xa8, 0x63, 0xb2, 0x2e, 0x66, 0xe3, 0xc9, 0x7c, 0x83, 0xc7, 0x65, 0x8a, 0xa9, - 0x94, 0xa7, 0x4c, 0xda, 0xb5, 0x2c, 0x2a, 0x63, 0x45, 0x06, 0x6d, 0xc1, 0xa4, 0x9c, 0x33, 0x09, - 0x15, 0xe7, 0xfd, 0x53, 0x9d, 0x96, 0xaf, 0x49, 0x9c, 0x19, 0x7f, 0xe3, 0x04, 0x19, 0x9c, 0x22, - 0x8c, 0x4e, 0x41, 0x5f, 0x93, 0x72, 0x36, 0x7d, 0x6c, 0xf8, 0x99, 0x78, 0x8b, 0x49, 0xea, 0x58, - 0xa9, 0xfd, 0xf3, 0x16, 0x9c, 0x48, 0x8d, 0x8c, 0x90, 0x58, 0x3e, 0xe0, 0x59, 0x48, 0x4a, 0x10, - 0x0b, 0xdd, 0x25, 0x88, 0xf6, 0x7f, 0x61, 0xc1, 0xd1, 0xa5, 0x66, 0x2b, 0xda, 0x59, 0x74, 0x4d, - 0xdb, 0x83, 0x97, 0x61, 0xa0, 0x49, 0xea, 0x6e, 0xbb, 0x29, 0x66, 0xae, 0x24, 0x6f, 0xff, 0x15, - 0x56, 0x4a, 0x4f, 0x90, 0x6a, 0xe4, 0x07, 0xce, 0x06, 0xe1, 0x05, 0x58, 0xa0, 0x33, 0x1e, 0xca, - 0xbd, 0x47, 0xae, 0xb9, 0x4d, 0x37, 0xba, 0xbf, 0xdd, 0x25, 0xcc, 0x06, 0x24, 0x11, 0x1c, 0xd3, - 0xb3, 0xbf, 0x69, 0xc1, 0x84, 0x5c, 0xf7, 0x73, 0xf5, 0x7a, 0x40, 0xc2, 0x10, 0xcd, 0x40, 0xc1, - 0x6d, 0x89, 0x5e, 0x82, 0xe8, 0x65, 0xa1, 0x5c, 0xc1, 0x05, 0xb7, 0x25, 0x9f, 0x6b, 0x8c, 0xc1, - 0x28, 0x9a, 0x16, 0x14, 0x57, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x3c, 0x0c, 0x79, 0x7e, 0x9d, 0xbf, - 0x78, 0x84, 0x0e, 0x9d, 0x62, 0xae, 0x8a, 0x32, 0xac, 0xa0, 0xa8, 0x02, 0xc3, 0xdc, 0xbe, 0x36, - 0x5e, 0xb4, 0x3d, 0x59, 0xe9, 0xb2, 0x2f, 0x5b, 0x93, 0x35, 0x71, 0x4c, 0xc4, 0xfe, 0x53, 0x0b, - 0x46, 0xe5, 0x97, 0xf5, 0xf8, 0x16, 0xa5, 0x5b, 0x2b, 0x7e, 0x87, 0xc6, 0x5b, 0x8b, 0xbe, 0x25, - 0x19, 0xc4, 0x78, 0x42, 0x16, 0x0f, 0xf4, 0x84, 0xbc, 0x08, 0x23, 0x4e, 0xab, 0x55, 0x31, 0xdf, - 0x9f, 0x6c, 0x29, 0xcd, 0xc5, 0xc5, 0x58, 0xc7, 0xb1, 0x7f, 0xae, 0x00, 0xe3, 0xf2, 0x0b, 0xaa, - 0xed, 0xdb, 0x21, 0x89, 0xd0, 0x1a, 0x0c, 0x3b, 0x7c, 0x96, 0x88, 0x5c, 0xe4, 0x8f, 0x65, 0xcb, - 0x45, 0x8d, 0x29, 0x8d, 0x19, 0xe9, 0x39, 0x59, 0x1b, 0xc7, 0x84, 0x50, 0x03, 0xa6, 0x3c, 0x3f, - 0x62, 0x4c, 0x95, 0x82, 0x77, 0x52, 0x55, 0x27, 0xa9, 0x9f, 0x14, 0xd4, 0xa7, 0x56, 0x93, 0x54, - 0x70, 0x9a, 0x30, 0x5a, 0x92, 0xb2, 0xe6, 0x62, 0xbe, 0x90, 0x50, 0x9f, 0xb8, 0x6c, 0x51, 0xb3, - 0xfd, 0x47, 0x16, 0x0c, 0x4b, 0xb4, 0xc3, 0xb0, 0x4a, 0x58, 0x81, 0xc1, 0x90, 0x4d, 0x82, 0x1c, - 0x1a, 0xbb, 0x53, 0xc7, 0xf9, 0x7c, 0xc5, 0xbc, 0x22, 0xff, 0x1f, 0x62, 0x49, 0x83, 0xa9, 0x1a, - 0x55, 0xf7, 0xdf, 0x27, 0xaa, 0x46, 0xd5, 0x9f, 0x9c, 0x4b, 0xe9, 0x1f, 0x58, 0x9f, 0x35, 0xd9, - 0x3d, 0x7d, 0xd2, 0xb4, 0x02, 0xb2, 0xee, 0xde, 0x4d, 0x3e, 0x69, 0x2a, 0xac, 0x14, 0x0b, 0x28, - 0x7a, 0x07, 0x46, 0x6b, 0x52, 0xc7, 0x14, 0xef, 0xf0, 0x73, 0x1d, 0xf5, 0x9d, 0x4a, 0x35, 0xce, - 0x65, 0xa4, 0x0b, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0xed, 0xc7, 0x8a, 0xdd, 0xec, 0xc7, 0x62, 0xba, - 0xf9, 0xd6, 0x54, 0xbf, 0x60, 0xc1, 0x00, 0xd7, 0x2d, 0xf4, 0xa6, 0xda, 0xd1, 0x2c, 0x05, 0xe2, - 0xb1, 0xbb, 0x49, 0x0b, 0x05, 0x67, 0x83, 0x56, 0x60, 0x98, 0xfd, 0x60, 0xba, 0x91, 0x62, 0xbe, - 0xb7, 0x19, 0x6f, 0x55, 0xef, 0xe0, 0x4d, 0x59, 0x0d, 0xc7, 0x14, 0xec, 0x9f, 0x2e, 0xd2, 0xd3, - 0x2d, 0x46, 0x35, 0x2e, 0x7d, 0xeb, 0xe1, 0x5d, 0xfa, 0x85, 0x87, 0x75, 0xe9, 0x6f, 0xc0, 0x44, - 0x4d, 0xb3, 0x2b, 0x88, 0x67, 0xf2, 0x7c, 0xc7, 0x45, 0xa2, 0x99, 0x20, 0x70, 0xe9, 0xeb, 0x82, - 0x49, 0x04, 0x27, 0xa9, 0xa2, 0x4f, 0xc2, 0x28, 0x9f, 0x67, 0xd1, 0x0a, 0x37, 0xc1, 0x7b, 0x22, - 0x7f, 0xbd, 0xe8, 0x4d, 0x70, 0x69, 0xbd, 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x7f, 0xb1, 0x00, 0x2d, - 0xb5, 0x36, 0x49, 0x93, 0x04, 0x4e, 0x23, 0x56, 0x0f, 0x7e, 0xc9, 0x82, 0x69, 0x92, 0x2a, 0x5e, - 0xf0, 0x9b, 0x4d, 0x21, 0x0c, 0xc8, 0x91, 0x57, 0x2d, 0xe5, 0xd4, 0x89, 0x1f, 0x04, 0x79, 0x18, - 0x38, 0xb7, 0x3d, 0xb4, 0x02, 0x47, 0xf8, 0x2d, 0xa9, 0x00, 0x9a, 0x95, 0xde, 0x23, 0x82, 0xf0, - 0x91, 0xb5, 0x34, 0x0a, 0xce, 0xaa, 0x67, 0xff, 0xd1, 0x18, 0xe4, 0xf6, 0xe2, 0x03, 0xbd, 0xe8, - 0x07, 0x7a, 0xd1, 0x0f, 0xf4, 0xa2, 0x1f, 0xe8, 0x45, 0x3f, 0xd0, 0x8b, 0x7e, 0xa0, 0x17, 0x7d, - 0x9f, 0xea, 0x45, 0x7f, 0xc6, 0x82, 0x63, 0xea, 0xfa, 0x32, 0x1e, 0xec, 0x9f, 0x83, 0x23, 0x7c, - 0xbb, 0x2d, 0x34, 0x1c, 0xb7, 0xb9, 0x46, 0x9a, 0xad, 0x86, 0x13, 0x49, 0xeb, 0xa7, 0x8b, 0x99, - 0x2b, 0x37, 0xe1, 0x62, 0x61, 0x54, 0xe4, 0xbe, 0x6a, 0x19, 0x00, 0x9c, 0xd5, 0x8c, 0xfd, 0xfb, - 0x43, 0xd0, 0xbf, 0xb4, 0x4d, 0xbc, 0xe8, 0x10, 0x9e, 0x36, 0x35, 0x18, 0x77, 0xbd, 0x6d, 0xbf, - 0xb1, 0x4d, 0xea, 0x1c, 0x7e, 0x90, 0x17, 0xf8, 0x71, 0x41, 0x7a, 0xbc, 0x6c, 0x90, 0xc0, 0x09, - 0x92, 0x0f, 0x43, 0xbb, 0x74, 0x19, 0x06, 0xf8, 0xe5, 0x23, 0x54, 0x4b, 0x99, 0x67, 0x36, 0x1b, - 0x44, 0x71, 0xa5, 0xc6, 0x9a, 0x2f, 0x7e, 0xb9, 0x89, 0xea, 0xe8, 0xb3, 0x30, 0xbe, 0xee, 0x06, - 0x61, 0xb4, 0xe6, 0x36, 0xe9, 0xd5, 0xd0, 0x6c, 0xdd, 0x87, 0x36, 0x49, 0x8d, 0xc3, 0xb2, 0x41, - 0x09, 0x27, 0x28, 0xa3, 0x0d, 0x18, 0x6b, 0x38, 0x7a, 0x53, 0x83, 0x07, 0x6e, 0x4a, 0xdd, 0x0e, - 0xd7, 0x74, 0x42, 0xd8, 0xa4, 0x4b, 0xb7, 0x53, 0x8d, 0x29, 0x44, 0x86, 0x98, 0x38, 0x43, 0x6d, - 0x27, 0xae, 0x09, 0xe1, 0x30, 0xca, 0xa0, 0x31, 0x47, 0x85, 0x61, 0x93, 0x41, 0xd3, 0xdc, 0x11, - 0x3e, 0x03, 0xc3, 0x84, 0x0e, 0x21, 0x25, 0x2c, 0x2e, 0x98, 0x0b, 0xbd, 0xf5, 0x75, 0xc5, 0xad, - 0x05, 0xbe, 0xa9, 0xc7, 0x5b, 0x92, 0x94, 0x70, 0x4c, 0x14, 0x2d, 0xc0, 0x40, 0x48, 0x02, 0x57, - 0xe9, 0x0a, 0x3a, 0x4c, 0x23, 0x43, 0xe3, 0xce, 0x90, 0xfc, 0x37, 0x16, 0x55, 0xe9, 0xf2, 0x72, - 0x98, 0x28, 0x96, 0x5d, 0x06, 0xda, 0xf2, 0x9a, 0x63, 0xa5, 0x58, 0x40, 0xd1, 0x9b, 0x30, 0x18, - 0x90, 0x06, 0x53, 0x14, 0x8f, 0xf5, 0xbe, 0xc8, 0xb9, 0xde, 0x99, 0xd7, 0xc3, 0x92, 0x00, 0xba, - 0x0a, 0x28, 0x20, 0x94, 0xc1, 0x73, 0xbd, 0x0d, 0x65, 0xbe, 0x2f, 0x0e, 0x5a, 0xc5, 0x48, 0xe3, - 0x18, 0x43, 0xfa, 0xc1, 0xe2, 0x8c, 0x6a, 0xe8, 0x32, 0x4c, 0xa9, 0xd2, 0xb2, 0x17, 0x46, 0x0e, - 0x3d, 0xe0, 0xb8, 0xb8, 0x5e, 0xc9, 0x57, 0x70, 0x12, 0x01, 0xa7, 0xeb, 0xd8, 0xbf, 0x61, 0x01, - 0x1f, 0xe7, 0x43, 0x90, 0x2a, 0xbc, 0x6e, 0x4a, 0x15, 0x4e, 0xe6, 0xce, 0x5c, 0x8e, 0x44, 0xe1, - 0x37, 0x2c, 0x18, 0xd1, 0x66, 0x36, 0x5e, 0xb3, 0x56, 0x87, 0x35, 0xdb, 0x86, 0x49, 0xba, 0xd2, - 0xaf, 0xdf, 0x0e, 0x49, 0xb0, 0x4d, 0xea, 0x6c, 0x61, 0x16, 0xee, 0x6f, 0x61, 0x2a, 0x53, 0xe1, - 0x6b, 0x09, 0x82, 0x38, 0xd5, 0x84, 0xfd, 0x19, 0xd9, 0x55, 0x65, 0x59, 0x5d, 0x53, 0x73, 0x9e, - 0xb0, 0xac, 0x56, 0xb3, 0x8a, 0x63, 0x1c, 0xba, 0xd5, 0x36, 0xfd, 0x30, 0x4a, 0x5a, 0x56, 0x5f, - 0xf1, 0xc3, 0x08, 0x33, 0x88, 0xfd, 0x02, 0xc0, 0xd2, 0x5d, 0x52, 0xe3, 0x2b, 0x56, 0x7f, 0xf4, - 0x58, 0xf9, 0x8f, 0x1e, 0xfb, 0x6f, 0x2c, 0x18, 0x5f, 0x5e, 0x30, 0x6e, 0xae, 0x59, 0x00, 0xfe, - 0x52, 0xbb, 0x75, 0x6b, 0x55, 0x9a, 0xf7, 0x70, 0x0b, 0x07, 0x55, 0x8a, 0x35, 0x0c, 0x74, 0x12, - 0x8a, 0x8d, 0xb6, 0x27, 0xc4, 0x9e, 0x83, 0xf4, 0x7a, 0xbc, 0xd6, 0xf6, 0x30, 0x2d, 0xd3, 0x7c, - 0xe0, 0x8a, 0x3d, 0xfb, 0xc0, 0x75, 0x0d, 0xc5, 0x83, 0x4a, 0xd0, 0x7f, 0xe7, 0x8e, 0x5b, 0xe7, - 0x11, 0x06, 0x84, 0xe9, 0xd1, 0xad, 0x5b, 0xe5, 0xc5, 0x10, 0xf3, 0x72, 0xfb, 0xcb, 0x45, 0x98, - 0x59, 0x6e, 0x90, 0xbb, 0xef, 0x31, 0xca, 0x42, 0xaf, 0x1e, 0x7c, 0x07, 0x13, 0x20, 0x1d, 0xd4, - 0x4b, 0xb3, 0xfb, 0x78, 0xac, 0xc3, 0x20, 0x37, 0x2c, 0x96, 0x31, 0x17, 0x32, 0xd5, 0xb9, 0xf9, - 0x03, 0x32, 0xcb, 0x0d, 0x94, 0x85, 0x3a, 0x57, 0x5d, 0x98, 0xa2, 0x14, 0x4b, 0xe2, 0x33, 0xaf, - 0xc0, 0xa8, 0x8e, 0x79, 0x20, 0x7f, 0xe9, 0x1f, 0x2e, 0xc2, 0x24, 0xed, 0xc1, 0x43, 0x9d, 0x88, - 0x1b, 0xe9, 0x89, 0x78, 0xd0, 0x3e, 0xb3, 0xdd, 0x67, 0xe3, 0x9d, 0xe4, 0x6c, 0x5c, 0xcc, 0x9b, - 0x8d, 0xc3, 0x9e, 0x83, 0x1f, 0xb1, 0xe0, 0xc8, 0x72, 0xc3, 0xaf, 0x6d, 0x25, 0xfc, 0x5a, 0x5f, - 0x82, 0x11, 0x7a, 0x1c, 0x87, 0x46, 0x88, 0x17, 0x23, 0xe8, 0x8f, 0x00, 0x61, 0x1d, 0x4f, 0xab, - 0x76, 0xe3, 0x46, 0x79, 0x31, 0x2b, 0x56, 0x90, 0x00, 0x61, 0x1d, 0xcf, 0xfe, 0x4b, 0x0b, 0x4e, - 0x5f, 0x5e, 0x58, 0x8a, 0x97, 0x62, 0x2a, 0x5c, 0xd1, 0x39, 0x18, 0x68, 0xd5, 0xb5, 0xae, 0xc4, - 0x62, 0xe1, 0x45, 0xd6, 0x0b, 0x01, 0x7d, 0xbf, 0x44, 0x06, 0xbb, 0x01, 0x70, 0x19, 0x57, 0x16, - 0xc4, 0xb9, 0x2b, 0xb5, 0x40, 0x56, 0xae, 0x16, 0xe8, 0x09, 0x18, 0xa4, 0xf7, 0x82, 0x5b, 0x93, - 0xfd, 0xe6, 0x06, 0x1b, 0xbc, 0x08, 0x4b, 0x98, 0xfd, 0xeb, 0x16, 0x1c, 0xb9, 0xec, 0x46, 0xf4, - 0xd2, 0x4e, 0xc6, 0xe3, 0xa1, 0xb7, 0x76, 0xe8, 0x46, 0x7e, 0xb0, 0x93, 0x8c, 0xc7, 0x83, 0x15, - 0x04, 0x6b, 0x58, 0xfc, 0x83, 0xb6, 0x5d, 0xe6, 0x29, 0x53, 0x30, 0xf5, 0x6e, 0x58, 0x94, 0x63, - 0x85, 0x41, 0xc7, 0xab, 0xee, 0x06, 0x4c, 0x64, 0xb9, 0x23, 0x0e, 0x6e, 0x35, 0x5e, 0x8b, 0x12, - 0x80, 0x63, 0x1c, 0xfb, 0x9f, 0x2c, 0x28, 0x5d, 0xe6, 0xfe, 0xbe, 0xeb, 0x61, 0xce, 0xa1, 0xfb, - 0x02, 0x0c, 0x13, 0xa9, 0x20, 0x10, 0xbd, 0x56, 0x8c, 0xa8, 0xd2, 0x1c, 0xf0, 0xb0, 0x40, 0x0a, - 0xaf, 0x07, 0xe7, 0xfb, 0x83, 0x79, 0x4f, 0x2f, 0x03, 0x22, 0x7a, 0x5b, 0x7a, 0x9c, 0x24, 0x16, - 0x70, 0x65, 0x29, 0x05, 0xc5, 0x19, 0x35, 0xec, 0x9f, 0xb7, 0xe0, 0x98, 0xfa, 0xe0, 0xf7, 0xdd, - 0x67, 0xda, 0xbf, 0x53, 0x80, 0xb1, 0x2b, 0x6b, 0x6b, 0x95, 0xcb, 0x24, 0xd2, 0x56, 0x65, 0x67, - 0xb5, 0x3f, 0xd6, 0xb4, 0x97, 0x9d, 0xde, 0x88, 0xed, 0xc8, 0x6d, 0xcc, 0xf2, 0xe8, 0x7f, 0xb3, - 0x65, 0x2f, 0xba, 0x1e, 0x54, 0xa3, 0xc0, 0xf5, 0x36, 0x32, 0x57, 0xba, 0xe4, 0x59, 0x8a, 0x79, - 0x3c, 0x0b, 0x7a, 0x01, 0x06, 0x58, 0xf8, 0x41, 0x39, 0x09, 0x8f, 0xa8, 0x27, 0x16, 0x2b, 0xdd, - 0xdf, 0x2d, 0x0d, 0xdf, 0xc0, 0x65, 0xfe, 0x07, 0x0b, 0x54, 0x74, 0x03, 0x46, 0x36, 0xa3, 0xa8, - 0x75, 0x85, 0x38, 0x75, 0x12, 0xc8, 0x53, 0xf6, 0x4c, 0xd6, 0x29, 0x4b, 0x07, 0x81, 0xa3, 0xc5, - 0x07, 0x53, 0x5c, 0x16, 0x62, 0x9d, 0x8e, 0x5d, 0x05, 0x88, 0x61, 0x0f, 0x48, 0x71, 0x63, 0xaf, - 0xc1, 0x30, 0xfd, 0xdc, 0xb9, 0x86, 0xeb, 0x74, 0x56, 0x8d, 0x3f, 0x03, 0xc3, 0x52, 0xf1, 0x1d, - 0x8a, 0xe0, 0x20, 0xec, 0x46, 0x92, 0x7a, 0xf1, 0x10, 0xc7, 0x70, 0xfb, 0x71, 0x10, 0xb6, 0xc3, - 0x9d, 0x48, 0xda, 0xeb, 0x70, 0x94, 0x19, 0x41, 0x3b, 0xd1, 0xa6, 0xb1, 0x46, 0xbb, 0x2f, 0x86, - 0x67, 0xc5, 0xbb, 0xae, 0xa0, 0xec, 0x7d, 0xa4, 0xf3, 0xf9, 0xa8, 0xa4, 0x18, 0xbf, 0xf1, 0xec, - 0x7f, 0xec, 0x83, 0x47, 0xca, 0xd5, 0xfc, 0xa8, 0x56, 0x97, 0x60, 0x94, 0xb3, 0x8b, 0x74, 0x69, - 0x38, 0x0d, 0xd1, 0xae, 0x92, 0x80, 0xae, 0x69, 0x30, 0x6c, 0x60, 0xa2, 0xd3, 0x50, 0x74, 0xdf, - 0xf5, 0x92, 0xae, 0x99, 0xe5, 0xb7, 0x56, 0x31, 0x2d, 0xa7, 0x60, 0xca, 0x79, 0xf2, 0x23, 0x5d, - 0x81, 0x15, 0xf7, 0xf9, 0x3a, 0x8c, 0xbb, 0x61, 0x2d, 0x74, 0xcb, 0x1e, 0xdd, 0xa7, 0xda, 0x4e, - 0x57, 0x32, 0x07, 0xda, 0x69, 0x05, 0xc5, 0x09, 0x6c, 0xed, 0x7e, 0xe9, 0xef, 0x99, 0x7b, 0xed, - 0x1a, 0x53, 0x83, 0x1e, 0xff, 0x2d, 0xf6, 0x75, 0x21, 0x13, 0xc1, 0x8b, 0xe3, 0x9f, 0x7f, 0x70, - 0x88, 0x25, 0x8c, 0x3e, 0xe8, 0x6a, 0x9b, 0x4e, 0x6b, 0xae, 0x1d, 0x6d, 0x2e, 0xba, 0x61, 0xcd, - 0xdf, 0x26, 0xc1, 0x0e, 0x7b, 0x8b, 0x0f, 0xc5, 0x0f, 0x3a, 0x05, 0x58, 0xb8, 0x32, 0x57, 0xa1, - 0x98, 0x38, 0x5d, 0x07, 0xcd, 0xc1, 0x84, 0x2c, 0xac, 0x92, 0x90, 0x5d, 0x01, 0x23, 0x8c, 0x8c, - 0x72, 0x96, 0x14, 0xc5, 0x8a, 0x48, 0x12, 0xdf, 0x64, 0x70, 0xe1, 0x41, 0x30, 0xb8, 0x2f, 0xc3, - 0x98, 0xeb, 0xb9, 0x91, 0xeb, 0x44, 0x3e, 0xd7, 0x1f, 0xf1, 0x67, 0x37, 0x13, 0x30, 0x97, 0x75, - 0x00, 0x36, 0xf1, 0xec, 0xff, 0xb3, 0x0f, 0xa6, 0xd8, 0xb4, 0x7d, 0xb0, 0xc2, 0xbe, 0x97, 0x56, - 0xd8, 0x8d, 0xf4, 0x0a, 0x7b, 0x10, 0x9c, 0xfb, 0x7d, 0x2f, 0xb3, 0x2f, 0x58, 0x30, 0xc5, 0x64, - 0xdc, 0xc6, 0x32, 0xbb, 0x00, 0xc3, 0x81, 0xe1, 0xc7, 0x3a, 0xac, 0x2b, 0xb5, 0xa4, 0x4b, 0x6a, - 0x8c, 0x83, 0xde, 0x00, 0x68, 0xc5, 0x32, 0xf4, 0x82, 0x11, 0x7c, 0x14, 0x72, 0xc5, 0xe7, 0x5a, - 0x1d, 0xfb, 0xb3, 0x30, 0xac, 0x1c, 0x55, 0xa5, 0xa7, 0xba, 0x95, 0xe3, 0xa9, 0xde, 0x9d, 0x8d, - 0x90, 0xb6, 0x71, 0xc5, 0x4c, 0xdb, 0xb8, 0xff, 0xcb, 0x82, 0x58, 0xc3, 0x81, 0xde, 0x82, 0xe1, - 0x96, 0xcf, 0x4c, 0xa9, 0x03, 0xe9, 0x9f, 0xf0, 0x78, 0x47, 0x15, 0x09, 0x8f, 0x30, 0x18, 0xf0, - 0xe9, 0xa8, 0xc8, 0xaa, 0x38, 0xa6, 0x82, 0xae, 0xc2, 0x60, 0x2b, 0x20, 0xd5, 0x88, 0x85, 0xbf, - 0xea, 0x9d, 0x20, 0x5f, 0xbe, 0xbc, 0x22, 0x96, 0x14, 0x12, 0x96, 0xa9, 0xc5, 0xde, 0x2d, 0x53, - 0xed, 0xdf, 0x2a, 0xc0, 0x64, 0xb2, 0x11, 0xf4, 0x1a, 0xf4, 0x91, 0xbb, 0xa4, 0x26, 0xbe, 0x34, - 0x93, 0x9b, 0x88, 0xa5, 0x2b, 0x7c, 0xe8, 0xe8, 0x7f, 0xcc, 0x6a, 0xa1, 0x2b, 0x30, 0x48, 0x59, - 0x89, 0xcb, 0x2a, 0x48, 0xe4, 0xa3, 0x79, 0xec, 0x88, 0xe2, 0xc9, 0xf8, 0x67, 0x89, 0x22, 0x2c, - 0xab, 0x33, 0x53, 0xb6, 0x5a, 0xab, 0x4a, 0x5f, 0x69, 0x51, 0x27, 0x61, 0xc2, 0xda, 0x42, 0x85, - 0x23, 0x09, 0x6a, 0xdc, 0x94, 0x4d, 0x16, 0xe2, 0x98, 0x08, 0x7a, 0x03, 0xfa, 0xc3, 0x06, 0x21, - 0x2d, 0x61, 0xab, 0x90, 0x29, 0x1f, 0xad, 0x52, 0x04, 0x41, 0x89, 0xc9, 0x53, 0x58, 0x01, 0xe6, - 0x15, 0xed, 0xdf, 0xb5, 0x00, 0xb8, 0xed, 0x9f, 0xe3, 0x6d, 0x90, 0x43, 0x50, 0x29, 0x2c, 0x42, - 0x5f, 0xd8, 0x22, 0xb5, 0x4e, 0x1e, 0x06, 0x71, 0x7f, 0xaa, 0x2d, 0x52, 0x8b, 0x57, 0x3b, 0xfd, - 0x87, 0x59, 0x6d, 0xfb, 0x47, 0x01, 0xc6, 0x63, 0xb4, 0x72, 0x44, 0x9a, 0xe8, 0x39, 0x23, 0xb2, - 0xce, 0xc9, 0x44, 0x64, 0x9d, 0x61, 0x86, 0xad, 0x49, 0xaf, 0x3f, 0x0b, 0xc5, 0xa6, 0x73, 0x57, - 0x88, 0x27, 0x9f, 0xe9, 0xdc, 0x0d, 0x4a, 0x7f, 0x76, 0xc5, 0xb9, 0xcb, 0x5f, 0xf0, 0xcf, 0xc8, - 0xdd, 0xb9, 0xe2, 0xdc, 0xed, 0x6a, 0x05, 0x4f, 0x1b, 0x61, 0x6d, 0xb9, 0x9e, 0x30, 0x6b, 0xeb, - 0xa9, 0x2d, 0xd7, 0x4b, 0xb6, 0xe5, 0x7a, 0x3d, 0xb4, 0xe5, 0x7a, 0xe8, 0x1e, 0x0c, 0x0a, 0xab, - 0x53, 0x11, 0xf2, 0xef, 0x42, 0x0f, 0xed, 0x09, 0xa3, 0x55, 0xde, 0xe6, 0x05, 0x29, 0xa1, 0x10, - 0xa5, 0x5d, 0xdb, 0x95, 0x0d, 0xa2, 0xff, 0xd4, 0x82, 0x71, 0xf1, 0x1b, 0x93, 0x77, 0xdb, 0x24, - 0x8c, 0x04, 0x07, 0xff, 0x91, 0xde, 0xfb, 0x20, 0x2a, 0xf2, 0xae, 0x7c, 0x44, 0x5e, 0xb6, 0x26, - 0xb0, 0x6b, 0x8f, 0x12, 0xbd, 0x40, 0xbf, 0x65, 0xc1, 0xd1, 0xa6, 0x73, 0x97, 0xb7, 0xc8, 0xcb, - 0xb0, 0x13, 0xb9, 0xbe, 0xb0, 0xde, 0x78, 0xad, 0xb7, 0xe9, 0x4f, 0x55, 0xe7, 0x9d, 0x94, 0xaa, - 0xda, 0xa3, 0x59, 0x28, 0x5d, 0xbb, 0x9a, 0xd9, 0xaf, 0x99, 0x75, 0x18, 0x92, 0xeb, 0xed, 0x61, - 0x9a, 0xd4, 0xb3, 0x76, 0xc4, 0x5a, 0x7b, 0xa8, 0xed, 0x7c, 0x16, 0x46, 0xf5, 0x35, 0xf6, 0x50, - 0xdb, 0x7a, 0x17, 0x8e, 0x64, 0xac, 0xa5, 0x87, 0xda, 0xe4, 0x1d, 0x38, 0x99, 0xbb, 0x3e, 0x1e, - 0xaa, 0x4b, 0xc4, 0xef, 0x58, 0xfa, 0x39, 0x78, 0x08, 0x7a, 0x9d, 0x05, 0x53, 0xaf, 0x73, 0xa6, - 0xf3, 0xce, 0xc9, 0x51, 0xee, 0xbc, 0xa3, 0x77, 0x9a, 0x9e, 0xea, 0xe8, 0x4d, 0x18, 0x68, 0xd0, - 0x12, 0x69, 0xbb, 0x6c, 0x77, 0xdf, 0x91, 0x31, 0x47, 0xcd, 0xca, 0x43, 0x2c, 0x28, 0xd8, 0x5f, - 0xb1, 0x20, 0xc3, 0xa9, 0x83, 0x72, 0x58, 0x6d, 0xb7, 0xce, 0x86, 0xa4, 0x18, 0x73, 0x58, 0x2a, - 0xf0, 0xcc, 0x69, 0x28, 0x6e, 0xb8, 0x75, 0xe1, 0xcd, 0xac, 0xc0, 0x97, 0x29, 0x78, 0xc3, 0xad, - 0xa3, 0x65, 0x40, 0x61, 0xbb, 0xd5, 0x6a, 0x30, 0x83, 0x27, 0xa7, 0x71, 0x39, 0xf0, 0xdb, 0x2d, - 0x6e, 0xa8, 0x5c, 0xe4, 0xe2, 0xa5, 0x6a, 0x0a, 0x8a, 0x33, 0x6a, 0xd8, 0x7f, 0x60, 0x41, 0xdf, - 0x21, 0x4c, 0x13, 0x36, 0xa7, 0xe9, 0xb9, 0x5c, 0xd2, 0x22, 0x53, 0xc4, 0x2c, 0x76, 0xee, 0x2c, - 0xdd, 0x8d, 0x88, 0x17, 0x32, 0x86, 0x23, 0x73, 0xd6, 0x76, 0x2d, 0x38, 0x72, 0xcd, 0x77, 0xea, - 0xf3, 0x4e, 0xc3, 0xf1, 0x6a, 0x24, 0x28, 0x7b, 0x1b, 0x07, 0xf2, 0x0a, 0x28, 0x74, 0xf5, 0x0a, - 0xb8, 0x04, 0x03, 0x6e, 0x4b, 0x0b, 0x35, 0x7f, 0x96, 0xce, 0x6e, 0xb9, 0x22, 0xa2, 0xcc, 0x23, - 0xa3, 0x71, 0x56, 0x8a, 0x05, 0x3e, 0x5d, 0x96, 0xdc, 0x1c, 0xaf, 0x2f, 0x7f, 0x59, 0xd2, 0x57, - 0x52, 0x32, 0x84, 0x9a, 0x61, 0x38, 0xbe, 0x09, 0x46, 0x13, 0xc2, 0x4d, 0x0a, 0xc3, 0xa0, 0xcb, - 0xbf, 0x54, 0xac, 0xcd, 0x27, 0xb3, 0x5f, 0x2f, 0xa9, 0x81, 0xd1, 0xfc, 0x01, 0x79, 0x01, 0x96, - 0x84, 0xec, 0x4b, 0x90, 0x19, 0xf2, 0xa6, 0xbb, 0x64, 0xca, 0xfe, 0x04, 0x4c, 0xb1, 0x9a, 0x07, - 0x94, 0xfa, 0xd8, 0x09, 0x79, 0x7a, 0x46, 0xd4, 0x60, 0xfb, 0x7f, 0xb5, 0x00, 0xad, 0xf8, 0x75, - 0x77, 0x7d, 0x47, 0x10, 0xe7, 0xdf, 0xff, 0x2e, 0x94, 0xf8, 0xb3, 0x3a, 0x19, 0x59, 0x77, 0xa1, - 0xe1, 0x84, 0xa1, 0x26, 0xcb, 0x7f, 0x52, 0xb4, 0x5b, 0x5a, 0xeb, 0x8c, 0x8e, 0xbb, 0xd1, 0x43, - 0x6f, 0x25, 0x02, 0x1d, 0x7e, 0x34, 0x15, 0xe8, 0xf0, 0xc9, 0x4c, 0x8b, 0x9a, 0x74, 0xef, 0x65, - 0x00, 0x44, 0xfb, 0x8b, 0x16, 0x4c, 0xac, 0x26, 0x22, 0xc5, 0x9e, 0x63, 0xe6, 0x05, 0x19, 0x3a, - 0xaa, 0x2a, 0x2b, 0xc5, 0x02, 0xfa, 0xc0, 0x65, 0xb8, 0xdf, 0xb6, 0x20, 0x0e, 0xb1, 0x75, 0x08, - 0x2c, 0xf7, 0x82, 0xc1, 0x72, 0x67, 0x3e, 0x5f, 0x54, 0x77, 0xf2, 0x38, 0x6e, 0x74, 0x55, 0xcd, - 0x49, 0x87, 0x97, 0x4b, 0x4c, 0x86, 0xef, 0xb3, 0x71, 0x73, 0xe2, 0xd4, 0x6c, 0x7c, 0xa3, 0x00, - 0x48, 0xe1, 0xf6, 0x1c, 0x1c, 0x33, 0x5d, 0xe3, 0xc1, 0x04, 0xc7, 0xdc, 0x06, 0xc4, 0x0c, 0x64, - 0x02, 0xc7, 0x0b, 0x39, 0x59, 0x57, 0x48, 0xad, 0x0f, 0x66, 0x7d, 0x33, 0x23, 0xbd, 0x65, 0xaf, - 0xa5, 0xa8, 0xe1, 0x8c, 0x16, 0x34, 0xc3, 0xa7, 0xfe, 0x5e, 0x0d, 0x9f, 0x06, 0xba, 0xb8, 0x7d, - 0x7f, 0xcd, 0x82, 0x31, 0x35, 0x4c, 0xef, 0x13, 0xe7, 0x11, 0xd5, 0x9f, 0x9c, 0x7b, 0xa5, 0xa2, - 0x75, 0x99, 0x31, 0x03, 0xdf, 0xc7, 0xdc, 0xf7, 0x9d, 0x86, 0x7b, 0x8f, 0xa8, 0x18, 0xce, 0x25, - 0xe1, 0x8e, 0x2f, 0x4a, 0xf7, 0x77, 0x4b, 0x63, 0xea, 0x1f, 0x8f, 0x1a, 0x1b, 0x57, 0xb1, 0x7f, - 0x99, 0x6e, 0x76, 0x73, 0x29, 0xa2, 0x97, 0xa0, 0xbf, 0xb5, 0xe9, 0x84, 0x24, 0xe1, 0x64, 0xd7, - 0x5f, 0xa1, 0x85, 0xfb, 0xbb, 0xa5, 0x71, 0x55, 0x81, 0x95, 0x60, 0x8e, 0xdd, 0x7b, 0xc8, 0xd1, - 0xf4, 0xe2, 0xec, 0x1a, 0x72, 0xf4, 0x5f, 0x2c, 0xe8, 0x5b, 0xa5, 0xb7, 0xd7, 0xc3, 0x3f, 0x02, - 0x5e, 0x37, 0x8e, 0x80, 0x53, 0x79, 0xd9, 0x8c, 0x72, 0x77, 0xff, 0x72, 0x62, 0xf7, 0x9f, 0xc9, - 0xa5, 0xd0, 0x79, 0xe3, 0x37, 0x61, 0x84, 0xe5, 0x48, 0x12, 0x0e, 0x85, 0x2f, 0x18, 0x1b, 0xbe, - 0x94, 0xd8, 0xf0, 0x13, 0x1a, 0xaa, 0xb6, 0xd3, 0x9f, 0x82, 0x41, 0xe1, 0xa1, 0x96, 0x8c, 0x82, - 0x20, 0x70, 0xb1, 0x84, 0xdb, 0xbf, 0x50, 0x04, 0x23, 0x27, 0x13, 0xfa, 0x23, 0x0b, 0x66, 0x03, - 0x6e, 0xb9, 0x5e, 0x5f, 0x6c, 0x07, 0xae, 0xb7, 0x51, 0xad, 0x6d, 0x92, 0x7a, 0xbb, 0xe1, 0x7a, - 0x1b, 0xe5, 0x0d, 0xcf, 0x57, 0xc5, 0x4b, 0x77, 0x49, 0xad, 0xcd, 0xb4, 0xca, 0x5d, 0x12, 0x40, - 0x29, 0x0f, 0x90, 0xe7, 0xf7, 0x76, 0x4b, 0xb3, 0xf8, 0x40, 0xb4, 0xf1, 0x01, 0xfb, 0x82, 0xfe, - 0xd2, 0x82, 0x0b, 0x3c, 0x37, 0x50, 0xef, 0xfd, 0xef, 0x20, 0xe1, 0xa8, 0x48, 0x52, 0x31, 0x91, - 0x35, 0x12, 0x34, 0xe7, 0x5f, 0x16, 0x03, 0x7a, 0xa1, 0x72, 0xb0, 0xb6, 0xf0, 0x41, 0x3b, 0x67, - 0xff, 0xb7, 0x45, 0x18, 0x13, 0xa1, 0x29, 0xc5, 0x1d, 0xf0, 0x92, 0xb1, 0x24, 0x1e, 0x4d, 0x2c, - 0x89, 0x29, 0x03, 0xf9, 0xc1, 0x1c, 0xff, 0x21, 0x4c, 0xd1, 0xc3, 0xf9, 0x0a, 0x71, 0x82, 0xe8, - 0x36, 0x71, 0xb8, 0x3d, 0x63, 0xf1, 0xc0, 0xa7, 0xbf, 0x12, 0xac, 0x5f, 0x4b, 0x12, 0xc3, 0x69, - 0xfa, 0xdf, 0x4b, 0x77, 0x8e, 0x07, 0x93, 0xa9, 0xe8, 0xa2, 0x6f, 0xc3, 0xb0, 0x72, 0xaf, 0x12, - 0x87, 0x4e, 0xe7, 0x20, 0xbd, 0x49, 0x0a, 0x5c, 0xe8, 0x19, 0xbb, 0xf6, 0xc5, 0xe4, 0xec, 0xdf, - 0x2e, 0x18, 0x0d, 0xf2, 0x49, 0x5c, 0x85, 0x21, 0x27, 0x64, 0x81, 0xc3, 0xeb, 0x9d, 0x24, 0xda, - 0xa9, 0x66, 0x98, 0x8b, 0xdb, 0x9c, 0xa8, 0x89, 0x15, 0x0d, 0x74, 0x85, 0x5b, 0x8d, 0x6e, 0x93, - 0x4e, 0xe2, 0xec, 0x14, 0x35, 0x90, 0x76, 0xa5, 0xdb, 0x04, 0x8b, 0xfa, 0xe8, 0x53, 0xdc, 0xac, - 0xf7, 0xaa, 0xe7, 0xdf, 0xf1, 0x2e, 0xfb, 0xbe, 0x0c, 0x43, 0xd4, 0x1b, 0xc1, 0x29, 0x69, 0xcc, - 0xab, 0xaa, 0x63, 0x93, 0x5a, 0x6f, 0xe1, 0xba, 0x3f, 0x07, 0x2c, 0x17, 0x8a, 0x19, 0xcd, 0x20, - 0x44, 0x04, 0x26, 0x44, 0xdc, 0x53, 0x59, 0x26, 0xc6, 0x2e, 0xf3, 0xf9, 0x6d, 0xd6, 0x8e, 0x35, - 0x40, 0x57, 0x4d, 0x12, 0x38, 0x49, 0xd3, 0xde, 0xe4, 0x87, 0xf0, 0x32, 0x71, 0xa2, 0x76, 0x40, - 0x42, 0xf4, 0x71, 0x98, 0x4e, 0xbf, 0x8c, 0x85, 0x22, 0xc5, 0x62, 0xdc, 0xf3, 0xa9, 0xbd, 0xdd, - 0xd2, 0x74, 0x35, 0x07, 0x07, 0xe7, 0xd6, 0xb6, 0x7f, 0xcd, 0x02, 0xe6, 0x43, 0x7e, 0x08, 0x9c, - 0xcf, 0xc7, 0x4c, 0xce, 0x67, 0x3a, 0x6f, 0x3a, 0x73, 0x98, 0x9e, 0x17, 0xf9, 0x1a, 0xae, 0x04, - 0xfe, 0xdd, 0x1d, 0x61, 0xf5, 0xd5, 0xfd, 0x19, 0x67, 0x7f, 0xd9, 0x02, 0x96, 0x38, 0x08, 0xf3, - 0x57, 0xbb, 0x54, 0x70, 0x74, 0x37, 0x68, 0xf8, 0x38, 0x0c, 0xad, 0x8b, 0xe1, 0xcf, 0x10, 0x3a, - 0x19, 0x1d, 0x36, 0x69, 0xcb, 0x49, 0x13, 0xbe, 0xa0, 0xe2, 0x1f, 0x56, 0xd4, 0xec, 0xff, 0xd2, - 0x82, 0x99, 0xfc, 0x6a, 0xe8, 0x06, 0x9c, 0x08, 0x48, 0xad, 0x1d, 0x84, 0x74, 0x4b, 0x88, 0x07, - 0x90, 0x70, 0xa7, 0xe2, 0x53, 0xfd, 0xc8, 0xde, 0x6e, 0xe9, 0x04, 0xce, 0x46, 0xc1, 0x79, 0x75, - 0xd1, 0x2b, 0x30, 0xde, 0x0e, 0x39, 0xe7, 0xc7, 0x98, 0xae, 0x50, 0x44, 0xa7, 0x66, 0x1e, 0x47, - 0x37, 0x0c, 0x08, 0x4e, 0x60, 0xda, 0x3f, 0xc0, 0x97, 0xa3, 0x0a, 0x50, 0xdd, 0x84, 0x29, 0x4f, - 0xfb, 0x4f, 0x6f, 0x40, 0xf9, 0xd4, 0x7f, 0xbc, 0xdb, 0xad, 0xcf, 0xae, 0x4b, 0xcd, 0xcb, 0x3d, - 0x41, 0x06, 0xa7, 0x29, 0xdb, 0xbf, 0x68, 0xc1, 0x09, 0x1d, 0x51, 0x73, 0xa4, 0xeb, 0xa6, 0x05, - 0x5c, 0x84, 0x21, 0xbf, 0x45, 0x02, 0x27, 0xf2, 0x03, 0x71, 0xcd, 0x9d, 0x97, 0x2b, 0xf4, 0xba, - 0x28, 0xdf, 0x17, 0x09, 0x73, 0x24, 0x75, 0x59, 0x8e, 0x55, 0x4d, 0x64, 0xc3, 0x00, 0x13, 0x20, - 0x86, 0xc2, 0x65, 0x92, 0x1d, 0x5a, 0xcc, 0xb2, 0x25, 0xc4, 0x02, 0x62, 0xff, 0xa3, 0xc5, 0xd7, - 0xa7, 0xde, 0x75, 0xf4, 0x2e, 0x4c, 0x36, 0x9d, 0xa8, 0xb6, 0xb9, 0x74, 0xb7, 0x15, 0x70, 0xe5, - 0xae, 0x1c, 0xa7, 0x67, 0xba, 0x8d, 0x93, 0xf6, 0x91, 0xb1, 0x69, 0xf5, 0x4a, 0x82, 0x18, 0x4e, - 0x91, 0x47, 0xb7, 0x61, 0x84, 0x95, 0x31, 0x6f, 0xe0, 0xb0, 0x13, 0x2f, 0x93, 0xd7, 0x9a, 0x32, - 0x0e, 0x5a, 0x89, 0xe9, 0x60, 0x9d, 0xa8, 0xfd, 0xd5, 0x22, 0x3f, 0x34, 0xd8, 0xdb, 0xe3, 0x29, - 0x18, 0x6c, 0xf9, 0xf5, 0x85, 0xf2, 0x22, 0x16, 0xb3, 0xa0, 0xee, 0xbd, 0x0a, 0x2f, 0xc6, 0x12, - 0x8e, 0xce, 0xc3, 0x90, 0xf8, 0x29, 0x95, 0xf1, 0x6c, 0x8f, 0x08, 0xbc, 0x10, 0x2b, 0x28, 0x7a, - 0x1e, 0xa0, 0x15, 0xf8, 0xdb, 0x6e, 0x9d, 0x45, 0x7f, 0x2a, 0x9a, 0x76, 0x7d, 0x15, 0x05, 0xc1, - 0x1a, 0x16, 0x7a, 0x15, 0xc6, 0xda, 0x5e, 0xc8, 0xf9, 0x27, 0x2d, 0xc6, 0xbe, 0xb2, 0x38, 0xbb, - 0xa1, 0x03, 0xb1, 0x89, 0x8b, 0xe6, 0x60, 0x20, 0x72, 0x98, 0x9d, 0x5a, 0x7f, 0xbe, 0xf9, 0xfd, - 0x1a, 0xc5, 0xd0, 0xb3, 0xd9, 0xd1, 0x0a, 0x58, 0x54, 0x44, 0x6f, 0x4b, 0xc7, 0x7c, 0x7e, 0x13, - 0x09, 0xbf, 0x97, 0xde, 0x6e, 0x2d, 0xcd, 0x2d, 0x5f, 0xf8, 0xd3, 0x18, 0xb4, 0xd0, 0x2b, 0x00, - 0xe4, 0x6e, 0x44, 0x02, 0xcf, 0x69, 0x28, 0xeb, 0x52, 0xc5, 0xc8, 0x2c, 0xfa, 0xab, 0x7e, 0x74, - 0x23, 0x24, 0x4b, 0x0a, 0x03, 0x6b, 0xd8, 0xf6, 0x8f, 0x8e, 0x00, 0xc4, 0x0f, 0x0d, 0x74, 0x0f, - 0x86, 0x6a, 0x4e, 0xcb, 0xa9, 0xf1, 0x54, 0xad, 0xc5, 0x3c, 0x7f, 0xe9, 0xb8, 0xc6, 0xec, 0x82, - 0x40, 0xe7, 0xca, 0x1b, 0x19, 0xa6, 0x7c, 0x48, 0x16, 0x77, 0x55, 0xd8, 0xa8, 0xf6, 0xd0, 0x17, - 0x2c, 0x18, 0x11, 0xd1, 0x95, 0xd8, 0x0c, 0x15, 0xf2, 0xf5, 0x6d, 0x5a, 0xfb, 0x73, 0x71, 0x0d, - 0xde, 0x85, 0x17, 0xe4, 0x0a, 0xd5, 0x20, 0x5d, 0x7b, 0xa1, 0x37, 0x8c, 0x3e, 0x2c, 0xdf, 0xb6, - 0x45, 0x63, 0x28, 0xd5, 0xdb, 0x76, 0x98, 0x5d, 0x35, 0xfa, 0xb3, 0xf6, 0x86, 0xf1, 0xac, 0xed, - 0xcb, 0xf7, 0x3c, 0x36, 0xf8, 0xed, 0x6e, 0x2f, 0x5a, 0x54, 0xd1, 0xa3, 0x90, 0xf4, 0xe7, 0xbb, - 0xcb, 0x6a, 0x0f, 0xbb, 0x2e, 0x11, 0x48, 0x3e, 0x0b, 0x13, 0x75, 0x93, 0x6b, 0x11, 0x2b, 0xf1, - 0xc9, 0x3c, 0xba, 0x09, 0x26, 0x27, 0xe6, 0x53, 0x12, 0x00, 0x9c, 0x24, 0x8c, 0x2a, 0x3c, 0x28, - 0x4d, 0xd9, 0x5b, 0xf7, 0x85, 0xef, 0x95, 0x9d, 0x3b, 0x97, 0x3b, 0x61, 0x44, 0x9a, 0x14, 0x33, - 0x66, 0x12, 0x56, 0x45, 0x5d, 0xac, 0xa8, 0xa0, 0x37, 0x61, 0x80, 0xf9, 0x4b, 0x86, 0xd3, 0x43, - 0xf9, 0x6a, 0x0d, 0x33, 0xfa, 0x6a, 0xbc, 0x21, 0xd9, 0xdf, 0x10, 0x0b, 0x0a, 0xe8, 0x8a, 0xf4, - 0x46, 0x0e, 0xcb, 0xde, 0x8d, 0x90, 0x30, 0x6f, 0xe4, 0xe1, 0xf9, 0xc7, 0x63, 0x47, 0x63, 0x5e, - 0x9e, 0x99, 0xf3, 0xd6, 0xa8, 0x49, 0xd9, 0x3e, 0xf1, 0x5f, 0xa6, 0xd2, 0x15, 0xb1, 0xe2, 0x32, - 0xbb, 0x67, 0xa6, 0xdb, 0x8d, 0x87, 0xf3, 0xa6, 0x49, 0x02, 0x27, 0x69, 0x52, 0x16, 0x9a, 0xef, - 0x7a, 0xe1, 0xbd, 0xd5, 0xed, 0xec, 0xe0, 0x92, 0x03, 0x76, 0x1b, 0xf1, 0x12, 0x2c, 0xea, 0x23, - 0x17, 0x26, 0x02, 0x83, 0xbd, 0x90, 0x21, 0xde, 0xce, 0xf5, 0xc6, 0xc4, 0x68, 0xc9, 0x03, 0x4c, - 0x32, 0x38, 0x49, 0x17, 0xbd, 0xa9, 0x31, 0x4a, 0x63, 0x9d, 0x5f, 0xfe, 0xdd, 0x58, 0xa3, 0x99, - 0x2d, 0x18, 0x33, 0x0e, 0x9b, 0x87, 0xaa, 0x82, 0xf4, 0x60, 0x32, 0x79, 0xb2, 0x3c, 0x54, 0xcd, - 0xe3, 0x2b, 0x30, 0xce, 0x36, 0xc2, 0x1d, 0xa7, 0x25, 0x8e, 0xe2, 0xf3, 0xc6, 0x51, 0x6c, 0x9d, - 0x2f, 0xf2, 0x81, 0x91, 0x43, 0x10, 0x1f, 0x9c, 0xf6, 0xaf, 0xf4, 0x8b, 0xca, 0x6a, 0x17, 0xa1, - 0x0b, 0x30, 0x2c, 0x3a, 0xa0, 0x32, 0x70, 0xa9, 0x83, 0x61, 0x45, 0x02, 0x70, 0x8c, 0xc3, 0x12, - 0xaf, 0xb1, 0xea, 0x9a, 0x87, 0x42, 0x9c, 0x78, 0x4d, 0x41, 0xb0, 0x86, 0x45, 0x1f, 0xbf, 0xb7, - 0x7d, 0x3f, 0x52, 0x77, 0xb0, 0xda, 0x6a, 0xf3, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x7b, 0xb7, 0x48, - 0xe0, 0x91, 0x86, 0x99, 0x82, 0x42, 0xdd, 0xbd, 0x57, 0x75, 0x20, 0x36, 0x71, 0x29, 0x07, 0xe1, - 0x87, 0x6c, 0xef, 0x8a, 0x27, 0x76, 0xec, 0xf1, 0x51, 0xe5, 0xb1, 0x2b, 0x24, 0x1c, 0x7d, 0x02, - 0x4e, 0xa8, 0x70, 0x8f, 0x62, 0x65, 0xca, 0x16, 0x07, 0x0c, 0x89, 0xd8, 0x89, 0x85, 0x6c, 0x34, - 0x9c, 0x57, 0x1f, 0xbd, 0x0e, 0xe3, 0xe2, 0x19, 0x26, 0x29, 0x0e, 0x9a, 0xe6, 0x8b, 0x57, 0x0d, - 0x28, 0x4e, 0x60, 0xcb, 0x24, 0x1a, 0xec, 0x7d, 0x22, 0x29, 0x0c, 0xa5, 0x93, 0x68, 0xe8, 0x70, - 0x9c, 0xaa, 0x81, 0xe6, 0x60, 0x82, 0xb3, 0x9d, 0xae, 0xb7, 0xc1, 0xe7, 0x44, 0xf8, 0x93, 0xaa, - 0x0d, 0x79, 0xdd, 0x04, 0xe3, 0x24, 0x3e, 0xba, 0x04, 0xa3, 0x4e, 0x50, 0xdb, 0x74, 0x23, 0x52, - 0xa3, 0xbb, 0x8a, 0x59, 0x10, 0x6a, 0xf6, 0x9f, 0x73, 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x0d, 0xe8, - 0x0b, 0xef, 0x38, 0x2d, 0x71, 0xfa, 0xe4, 0x1f, 0xe5, 0x6a, 0x05, 0x73, 0xd3, 0x2f, 0xfa, 0x1f, - 0xb3, 0x9a, 0xf6, 0x3d, 0x38, 0x92, 0x11, 0x16, 0x87, 0x2e, 0x3d, 0xa7, 0xe5, 0xca, 0x51, 0x49, - 0xb8, 0x69, 0xcc, 0x55, 0xca, 0x72, 0x3c, 0x34, 0x2c, 0xba, 0xbe, 0x59, 0xf8, 0x1c, 0x2d, 0xdd, - 0xb8, 0x5a, 0xdf, 0xcb, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x5f, 0x0b, 0x30, 0x91, 0xa1, 0x1e, 0x64, - 0x29, 0xaf, 0x13, 0xef, 0xbc, 0x38, 0xc3, 0xb5, 0x99, 0xd5, 0xa5, 0x70, 0x80, 0xac, 0x2e, 0xc5, - 0x6e, 0x59, 0x5d, 0xfa, 0xde, 0x4b, 0x56, 0x17, 0x73, 0xc4, 0xfa, 0x7b, 0x1a, 0xb1, 0x8c, 0x4c, - 0x30, 0x03, 0x07, 0xcc, 0x04, 0x63, 0x0c, 0xfa, 0x60, 0x0f, 0x83, 0xfe, 0xd3, 0x05, 0x98, 0x4c, - 0x6a, 0x16, 0x0f, 0x41, 0x3a, 0xff, 0xa6, 0x21, 0x9d, 0x3f, 0xdf, 0x4b, 0x04, 0x81, 0x5c, 0x49, - 0x3d, 0x4e, 0x48, 0xea, 0x9f, 0xee, 0x89, 0x5a, 0x67, 0xa9, 0xfd, 0x2f, 0x15, 0xe0, 0x58, 0xa6, - 0xc2, 0xf5, 0x10, 0xc6, 0xe6, 0xba, 0x31, 0x36, 0xcf, 0xf5, 0x1c, 0x5d, 0x21, 0x77, 0x80, 0x6e, - 0x25, 0x06, 0xe8, 0x42, 0xef, 0x24, 0x3b, 0x8f, 0xd2, 0x37, 0x8b, 0x70, 0x26, 0xb3, 0x5e, 0x2c, - 0xdc, 0x5e, 0x36, 0x84, 0xdb, 0xcf, 0x27, 0x84, 0xdb, 0x76, 0xe7, 0xda, 0x0f, 0x46, 0xda, 0x2d, - 0xa2, 0x0c, 0xb0, 0x58, 0x29, 0xf7, 0x29, 0xe9, 0x36, 0xa2, 0x0c, 0x28, 0x42, 0xd8, 0xa4, 0xfb, - 0xbd, 0x24, 0xe1, 0xfe, 0x1f, 0x2d, 0x38, 0x99, 0x39, 0x37, 0x87, 0x20, 0x67, 0x5c, 0x35, 0xe5, - 0x8c, 0x4f, 0xf5, 0xbc, 0x5a, 0x73, 0x04, 0x8f, 0x5f, 0x1c, 0xc8, 0xf9, 0x16, 0x26, 0xfe, 0xb8, - 0x0e, 0x23, 0x4e, 0xad, 0x46, 0xc2, 0x70, 0xc5, 0xaf, 0xab, 0x04, 0x10, 0xcf, 0xb1, 0xc7, 0x69, - 0x5c, 0xbc, 0xbf, 0x5b, 0x9a, 0x49, 0x92, 0x88, 0xc1, 0x58, 0xa7, 0x80, 0x3e, 0x05, 0x43, 0xa1, - 0xcc, 0xdd, 0xd9, 0x77, 0xff, 0xb9, 0x3b, 0x19, 0x27, 0xa9, 0xc4, 0x3b, 0x8a, 0x24, 0xfa, 0x7e, - 0x3d, 0x6a, 0x55, 0x07, 0xc1, 0x26, 0xef, 0xe4, 0x7d, 0xc4, 0xae, 0x7a, 0x1e, 0x60, 0x5b, 0xbd, - 0xa3, 0x92, 0xa2, 0x1b, 0xed, 0x85, 0xa5, 0x61, 0xa1, 0x37, 0x60, 0x32, 0xe4, 0x01, 0x5b, 0x63, - 0x13, 0x19, 0xbe, 0x16, 0x59, 0xcc, 0xbb, 0x6a, 0x02, 0x86, 0x53, 0xd8, 0x68, 0x59, 0xb6, 0xca, - 0x8c, 0xa1, 0xf8, 0xf2, 0x3c, 0x17, 0xb7, 0x28, 0x0c, 0xa2, 0x8e, 0x26, 0x27, 0x81, 0x0d, 0xbf, - 0x56, 0x13, 0x7d, 0x0a, 0x80, 0x2e, 0x22, 0x21, 0xc2, 0x19, 0xcc, 0x3f, 0x42, 0xe9, 0xd9, 0x52, - 0xcf, 0xf4, 0xc0, 0x60, 0xe1, 0x01, 0x16, 0x15, 0x11, 0xac, 0x11, 0x44, 0x0e, 0x8c, 0xc5, 0xff, - 0xe2, 0xac, 0xf4, 0xe7, 0x73, 0x5b, 0x48, 0x12, 0x67, 0xea, 0x8d, 0x45, 0x9d, 0x04, 0x36, 0x29, - 0xa2, 0x4f, 0xc2, 0xc9, 0xed, 0x5c, 0xbb, 0x23, 0xce, 0x4b, 0xb2, 0x34, 0xf3, 0xf9, 0xd6, 0x46, - 0xf9, 0xf5, 0xed, 0xff, 0x09, 0xe0, 0x91, 0x0e, 0x27, 0x3d, 0x9a, 0x33, 0x6d, 0x06, 0x9e, 0x49, - 0xca, 0x55, 0x66, 0x32, 0x2b, 0x1b, 0x82, 0x96, 0xc4, 0x86, 0x2a, 0xbc, 0xe7, 0x0d, 0xf5, 0x13, - 0x96, 0xf6, 0xcc, 0xe2, 0x16, 0xe5, 0x1f, 0x3b, 0xe0, 0x0d, 0xf6, 0x00, 0x45, 0x60, 0xeb, 0x19, - 0x72, 0xa4, 0xe7, 0x7b, 0xee, 0x4e, 0xef, 0x82, 0xa5, 0xdf, 0xc9, 0x0e, 0x71, 0xcf, 0x45, 0x4c, - 0x97, 0x0f, 0xfa, 0xfd, 0x87, 0x15, 0xee, 0xfe, 0x1b, 0x16, 0x9c, 0x4c, 0x15, 0xf3, 0x3e, 0x90, - 0x50, 0x44, 0xe9, 0x5b, 0x7d, 0xcf, 0x9d, 0x97, 0x04, 0xf9, 0x37, 0x5c, 0x11, 0xdf, 0x70, 0x32, - 0x17, 0x2f, 0xd9, 0xf5, 0x2f, 0xfd, 0x7d, 0xe9, 0x08, 0x6b, 0xc0, 0x44, 0xc4, 0xf9, 0x5d, 0x47, - 0x2d, 0x38, 0x5b, 0x6b, 0x07, 0x41, 0xbc, 0x58, 0x33, 0x36, 0x27, 0x7f, 0x2d, 0x3e, 0xbe, 0xb7, - 0x5b, 0x3a, 0xbb, 0xd0, 0x05, 0x17, 0x77, 0xa5, 0x86, 0x3c, 0x40, 0xcd, 0x94, 0x75, 0x1f, 0x3b, - 0x00, 0x72, 0xa4, 0x40, 0x69, 0x5b, 0x40, 0x6e, 0xa7, 0x9b, 0x61, 0x23, 0x98, 0x41, 0xf9, 0x70, - 0x65, 0x37, 0xdf, 0x99, 0x78, 0xfa, 0x33, 0xd7, 0xe0, 0x4c, 0xe7, 0xc5, 0x74, 0xa0, 0x10, 0x14, - 0x7f, 0x63, 0xc1, 0xe9, 0x8e, 0x71, 0xce, 0xbe, 0x0b, 0x1f, 0x0b, 0xf6, 0xe7, 0x2d, 0x78, 0x34, - 0xb3, 0x46, 0xd2, 0x79, 0xb0, 0x46, 0x0b, 0x35, 0x63, 0xd8, 0x38, 0xe2, 0x8f, 0x04, 0xe0, 0x18, - 0xc7, 0xb0, 0x17, 0x2d, 0x74, 0xb5, 0x17, 0xfd, 0x53, 0x0b, 0x52, 0x57, 0xfd, 0x21, 0x70, 0x9e, - 0x65, 0x93, 0xf3, 0x7c, 0xbc, 0x97, 0xd1, 0xcc, 0x61, 0x3a, 0xff, 0x79, 0x02, 0x8e, 0xe7, 0x78, - 0x90, 0x6f, 0xc3, 0xd4, 0x46, 0x8d, 0x98, 0x21, 0x43, 0x3a, 0x85, 0xd2, 0xeb, 0x18, 0x5f, 0x64, - 0xfe, 0xd8, 0xde, 0x6e, 0x69, 0x2a, 0x85, 0x82, 0xd3, 0x4d, 0xa0, 0xcf, 0x5b, 0x70, 0xd4, 0xb9, - 0x13, 0x2e, 0xd1, 0x17, 0x84, 0x5b, 0x9b, 0x6f, 0xf8, 0xb5, 0x2d, 0xca, 0x98, 0xc9, 0x6d, 0xf5, - 0x62, 0xa6, 0x28, 0xfc, 0x56, 0x35, 0x85, 0x6f, 0x34, 0x3f, 0xbd, 0xb7, 0x5b, 0x3a, 0x9a, 0x85, - 0x85, 0x33, 0xdb, 0x42, 0x58, 0xe4, 0x38, 0x73, 0xa2, 0xcd, 0x4e, 0x41, 0x6d, 0xb2, 0x5c, 0xfd, - 0x39, 0x4b, 0x2c, 0x21, 0x58, 0xd1, 0x41, 0x9f, 0x81, 0xe1, 0x0d, 0x19, 0xbf, 0x22, 0x83, 0xe5, - 0x8e, 0x07, 0xb2, 0x73, 0x54, 0x0f, 0x6e, 0x80, 0xa3, 0x90, 0x70, 0x4c, 0x14, 0xbd, 0x0e, 0x45, - 0x6f, 0x3d, 0x14, 0xa1, 0xf5, 0xb2, 0xed, 0x80, 0x4d, 0x4b, 0x6b, 0x1e, 0x3a, 0x6a, 0x75, 0xb9, - 0x8a, 0x69, 0x45, 0x74, 0x05, 0x8a, 0xc1, 0xed, 0xba, 0xd0, 0xe3, 0x64, 0x6e, 0x52, 0x3c, 0xbf, - 0x98, 0xd3, 0x2b, 0x46, 0x09, 0xcf, 0x2f, 0x62, 0x4a, 0x02, 0x55, 0xa0, 0x9f, 0xb9, 0x5d, 0x0b, - 0xd6, 0x36, 0xf3, 0x29, 0xdf, 0x21, 0x7c, 0x01, 0xf7, 0x87, 0x64, 0x08, 0x98, 0x13, 0x42, 0x6b, - 0x30, 0x50, 0x73, 0xbd, 0x3a, 0x09, 0x04, 0x2f, 0xfb, 0xe1, 0x4c, 0x8d, 0x0d, 0xc3, 0xc8, 0xa1, - 0xc9, 0x15, 0x18, 0x0c, 0x03, 0x0b, 0x5a, 0x8c, 0x2a, 0x69, 0x6d, 0xae, 0xcb, 0x1b, 0x2b, 0x9b, - 0x2a, 0x69, 0x6d, 0x2e, 0x57, 0x3b, 0x52, 0x65, 0x18, 0x58, 0xd0, 0x42, 0xaf, 0x40, 0x61, 0xbd, - 0x26, 0x5c, 0xaa, 0x33, 0xc5, 0x9b, 0x66, 0xf4, 0xaf, 0xf9, 0x81, 0xbd, 0xdd, 0x52, 0x61, 0x79, - 0x01, 0x17, 0xd6, 0x6b, 0x68, 0x15, 0x06, 0xd7, 0x79, 0xbc, 0x20, 0x21, 0x1f, 0x7d, 0x32, 0x3b, - 0x94, 0x51, 0x2a, 0xa4, 0x10, 0xf7, 0x6d, 0x15, 0x00, 0x2c, 0x89, 0xb0, 0x94, 0x5b, 0x2a, 0xee, - 0x91, 0x08, 0xbb, 0x3a, 0x7b, 0xb0, 0x58, 0x55, 0xfc, 0xa9, 0x11, 0x47, 0x4f, 0xc2, 0x1a, 0x45, - 0xba, 0xaa, 0x9d, 0x7b, 0xed, 0x80, 0xe5, 0xe4, 0x10, 0x8a, 0x99, 0xcc, 0x55, 0x3d, 0x27, 0x91, - 0x3a, 0xad, 0x6a, 0x85, 0x84, 0x63, 0xa2, 0x68, 0x0b, 0xc6, 0xb6, 0xc3, 0xd6, 0x26, 0x91, 0x5b, - 0x9a, 0x85, 0xeb, 0xcb, 0xe1, 0x66, 0x6f, 0x0a, 0x44, 0x37, 0x88, 0xda, 0x4e, 0x23, 0x75, 0x0a, - 0xb1, 0x67, 0xcd, 0x4d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0xe1, 0x7f, 0xb7, 0xed, 0xdf, 0xde, 0x89, - 0x88, 0x88, 0x96, 0x9a, 0x39, 0xfc, 0x6f, 0x71, 0x94, 0xf4, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xd0, - 0x4d, 0x31, 0x3c, 0xec, 0xf4, 0x9c, 0xcc, 0x0f, 0xc5, 0x3e, 0x27, 0x91, 0x72, 0x06, 0x85, 0x9d, - 0x96, 0x31, 0x29, 0x76, 0x4a, 0xb6, 0x36, 0xfd, 0xc8, 0xf7, 0x12, 0x27, 0xf4, 0x54, 0xfe, 0x29, - 0x59, 0xc9, 0xc0, 0x4f, 0x9f, 0x92, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x54, 0x87, 0xf1, 0x96, 0x1f, - 0x44, 0x77, 0xfc, 0x40, 0xae, 0x2f, 0xd4, 0x41, 0x50, 0x6a, 0x60, 0x8a, 0x16, 0x99, 0x59, 0x90, - 0x09, 0xc1, 0x09, 0x9a, 0xe8, 0xe3, 0x30, 0x18, 0xd6, 0x9c, 0x06, 0x29, 0x5f, 0x9f, 0x3e, 0x92, - 0x7f, 0xfd, 0x54, 0x39, 0x4a, 0xce, 0xea, 0xe2, 0xe1, 0x9e, 0x38, 0x0a, 0x96, 0xe4, 0xd0, 0x32, - 0xf4, 0xb3, 0x54, 0xd6, 0x2c, 0xb4, 0x6f, 0x4e, 0x44, 0xf9, 0x94, 0x53, 0x0f, 0x3f, 0x9b, 0x58, - 0x31, 0xe6, 0xd5, 0xe9, 0x1e, 0x10, 0x92, 0x02, 0x3f, 0x9c, 0x3e, 0x96, 0xbf, 0x07, 0x84, 0x80, - 0xe1, 0x7a, 0xb5, 0xd3, 0x1e, 0x50, 0x48, 0x38, 0x26, 0x4a, 0x4f, 0x66, 0x7a, 0x9a, 0x1e, 0xef, - 0x60, 0xb0, 0x99, 0x7b, 0x96, 0xb2, 0x93, 0x99, 0x9e, 0xa4, 0x94, 0x84, 0xfd, 0xc7, 0x43, 0x69, - 0x9e, 0x85, 0x49, 0x98, 0xfe, 0x63, 0x2b, 0x65, 0xb1, 0xf1, 0x91, 0x5e, 0x05, 0xde, 0x0f, 0xf0, - 0xe1, 0xfa, 0x79, 0x0b, 0x8e, 0xb7, 0x32, 0x3f, 0x44, 0x30, 0x00, 0xbd, 0xc9, 0xcd, 0xf9, 0xa7, - 0xab, 0x30, 0xd0, 0xd9, 0x70, 0x9c, 0xd3, 0x52, 0x52, 0x38, 0x50, 0x7c, 0xcf, 0xc2, 0x81, 0x15, - 0x18, 0xaa, 0xf1, 0x97, 0x9c, 0x4c, 0x5f, 0xd0, 0x53, 0x10, 0x53, 0xae, 0xa7, 0x15, 0x15, 0xb1, - 0x22, 0x81, 0x7e, 0xd2, 0x82, 0xd3, 0xc9, 0xae, 0x63, 0xc2, 0xc0, 0xc2, 0x5c, 0x93, 0x8b, 0xb5, - 0x96, 0xc5, 0xf7, 0xa7, 0xf8, 0x7f, 0x03, 0x79, 0xbf, 0x1b, 0x02, 0xee, 0xdc, 0x18, 0x5a, 0xcc, - 0x90, 0xab, 0x0d, 0x98, 0x3a, 0xc9, 0x1e, 0x64, 0x6b, 0x2f, 0xc2, 0x68, 0xd3, 0x6f, 0x7b, 0x91, - 0xb0, 0xba, 0x14, 0xa6, 0x5b, 0xcc, 0x64, 0x69, 0x45, 0x2b, 0xc7, 0x06, 0x56, 0x42, 0x22, 0x37, - 0x74, 0xdf, 0x12, 0xb9, 0x77, 0x60, 0xd4, 0xd3, 0x1c, 0x12, 0x3a, 0xbd, 0x60, 0x85, 0x74, 0x51, - 0xc3, 0xe6, 0xbd, 0xd4, 0x4b, 0xb0, 0x41, 0xad, 0xb3, 0xb4, 0x0c, 0xde, 0x9b, 0xb4, 0xec, 0x50, - 0x9f, 0xc4, 0xf6, 0x6f, 0x16, 0x32, 0x5e, 0x0c, 0x5c, 0x2a, 0xf7, 0x9a, 0x29, 0x95, 0x3b, 0x97, - 0x94, 0xca, 0xa5, 0x54, 0x55, 0x86, 0x40, 0xae, 0xf7, 0x1c, 0x9a, 0x3d, 0x07, 0xa6, 0xfe, 0x61, - 0x0b, 0x4e, 0x30, 0xdd, 0x07, 0x6d, 0xe0, 0x3d, 0xeb, 0x3b, 0x98, 0x41, 0xec, 0xb5, 0x6c, 0x72, - 0x38, 0xaf, 0x1d, 0xbb, 0x01, 0x67, 0xbb, 0xdd, 0xbb, 0xcc, 0xbe, 0xb8, 0xae, 0xcc, 0x2b, 0x62, - 0xfb, 0xe2, 0x7a, 0x79, 0x11, 0x33, 0x48, 0xaf, 0x61, 0x17, 0xed, 0xff, 0xdb, 0x82, 0x62, 0xc5, - 0xaf, 0x1f, 0xc2, 0x8b, 0xfe, 0x63, 0xc6, 0x8b, 0xfe, 0x91, 0xec, 0x1b, 0xbf, 0x9e, 0xab, 0xec, - 0x5b, 0x4a, 0x28, 0xfb, 0x4e, 0xe7, 0x11, 0xe8, 0xac, 0xda, 0xfb, 0xe5, 0x22, 0x8c, 0x54, 0xfc, - 0xba, 0xda, 0x67, 0xff, 0xfd, 0xfd, 0xb8, 0x11, 0xe5, 0x66, 0xcd, 0xd2, 0x28, 0x33, 0x7b, 0x62, - 0x19, 0xf5, 0xe2, 0xbb, 0xcc, 0x9b, 0xe8, 0x16, 0x71, 0x37, 0x36, 0x23, 0x52, 0x4f, 0x7e, 0xce, - 0xe1, 0x79, 0x13, 0x7d, 0xab, 0x08, 0x13, 0x89, 0xd6, 0x51, 0x03, 0xc6, 0x1a, 0xba, 0x2a, 0x49, - 0xac, 0xd3, 0xfb, 0xd2, 0x42, 0x09, 0x6f, 0x0c, 0xad, 0x08, 0x9b, 0xc4, 0xd1, 0x2c, 0x80, 0xa7, - 0xdb, 0xa4, 0xab, 0x00, 0xcb, 0x9a, 0x3d, 0xba, 0x86, 0x81, 0x5e, 0x82, 0x91, 0xc8, 0x6f, 0xf9, - 0x0d, 0x7f, 0x63, 0xe7, 0x2a, 0x91, 0x11, 0x39, 0x95, 0xc9, 0xf2, 0x5a, 0x0c, 0xc2, 0x3a, 0x1e, - 0xba, 0x0b, 0x53, 0x8a, 0x48, 0xf5, 0x01, 0xa8, 0xd7, 0x98, 0xd8, 0x64, 0x35, 0x49, 0x11, 0xa7, - 0x1b, 0x41, 0xaf, 0xc0, 0x38, 0xb3, 0x9d, 0x66, 0xf5, 0xaf, 0x92, 0x1d, 0x19, 0xa9, 0x99, 0x71, - 0xd8, 0x2b, 0x06, 0x04, 0x27, 0x30, 0xd1, 0x02, 0x4c, 0x35, 0xdd, 0x30, 0x51, 0x7d, 0x80, 0x55, - 0x67, 0x1d, 0x58, 0x49, 0x02, 0x71, 0x1a, 0xdf, 0xfe, 0x75, 0x31, 0xc7, 0x5e, 0xe4, 0x7e, 0xb0, - 0x1d, 0xdf, 0xdf, 0xdb, 0xf1, 0x9b, 0x16, 0x4c, 0xd2, 0xd6, 0x99, 0x41, 0xa8, 0x64, 0xa4, 0x54, - 0x2e, 0x0f, 0xab, 0x43, 0x2e, 0x8f, 0x73, 0xf4, 0xd8, 0xae, 0xfb, 0xed, 0x48, 0x48, 0x47, 0xb5, - 0x73, 0x99, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x08, 0x84, 0xd7, 0xbd, 0x8e, 0x47, 0x82, 0x00, - 0x0b, 0xa8, 0x4c, 0xf5, 0xd1, 0x97, 0x9d, 0xea, 0x83, 0x47, 0x6c, 0x17, 0x76, 0x74, 0x82, 0xa5, - 0xd5, 0x22, 0xb6, 0x4b, 0x03, 0xbb, 0x18, 0xc7, 0xfe, 0x76, 0x11, 0x46, 0x2b, 0x7e, 0x3d, 0x36, - 0xec, 0x78, 0xd1, 0x30, 0xec, 0x38, 0x9b, 0x30, 0xec, 0x98, 0xd4, 0x71, 0x35, 0x33, 0x8e, 0x37, - 0x01, 0xf9, 0x22, 0x90, 0xfc, 0x65, 0xe2, 0x31, 0xbb, 0x37, 0x61, 0xa8, 0x57, 0x8c, 0xcd, 0x1e, - 0xae, 0xa7, 0x30, 0x70, 0x46, 0xad, 0x0f, 0x4c, 0x42, 0x0e, 0xd7, 0x24, 0xe4, 0x4f, 0x2c, 0xb6, - 0x02, 0x16, 0x57, 0xab, 0xdc, 0x56, 0x19, 0x5d, 0x84, 0x11, 0x76, 0x5a, 0xb2, 0x90, 0x11, 0xd2, - 0x72, 0x82, 0xa5, 0xf1, 0x5c, 0x8d, 0x8b, 0xb1, 0x8e, 0x83, 0xce, 0xc3, 0x50, 0x48, 0x9c, 0xa0, - 0xb6, 0xa9, 0xae, 0x0a, 0x61, 0xe6, 0xc0, 0xcb, 0xb0, 0x82, 0xa2, 0xb7, 0xe2, 0xc0, 0xe3, 0xc5, - 0x7c, 0xc3, 0x67, 0xbd, 0x3f, 0x7c, 0xbb, 0xe5, 0x47, 0x1b, 0xb7, 0x6f, 0x01, 0x4a, 0xe3, 0xf7, - 0xe0, 0x49, 0x56, 0x32, 0x43, 0xe3, 0x0e, 0xa7, 0xc2, 0xe2, 0xfe, 0x9b, 0x05, 0xe3, 0x15, 0xbf, - 0x4e, 0x8f, 0x81, 0xef, 0xa5, 0x3d, 0xaf, 0x67, 0x5d, 0x18, 0xe8, 0x90, 0x75, 0xe1, 0x31, 0xe8, - 0xaf, 0xf8, 0xf5, 0x2e, 0xe1, 0x7b, 0x7f, 0xc5, 0x82, 0xc1, 0x8a, 0x5f, 0x3f, 0x04, 0x25, 0xce, - 0x6b, 0xa6, 0x12, 0xe7, 0x44, 0xce, 0xba, 0xc9, 0xd1, 0xdb, 0xfc, 0x79, 0x1f, 0x8c, 0xd1, 0x7e, - 0xfa, 0x1b, 0x72, 0x2a, 0x8d, 0x61, 0xb3, 0x7a, 0x18, 0x36, 0xfa, 0xa4, 0xf0, 0x1b, 0x0d, 0xff, - 0x4e, 0x72, 0x5a, 0x97, 0x59, 0x29, 0x16, 0x50, 0xf4, 0x2c, 0x0c, 0xb5, 0x02, 0xb2, 0xed, 0xfa, - 0x82, 0x57, 0xd7, 0x54, 0x62, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x7d, 0xc4, 0x87, 0xae, 0x47, 0xf9, - 0x92, 0x9a, 0xef, 0xd5, 0xb9, 0x9e, 0xa3, 0x28, 0x52, 0x83, 0x69, 0xe5, 0xd8, 0xc0, 0x42, 0xb7, - 0x60, 0x98, 0xfd, 0x67, 0xc7, 0x4e, 0xff, 0x81, 0x8f, 0x1d, 0x91, 0x2c, 0x59, 0x10, 0xc0, 0x31, - 0x2d, 0xf4, 0x3c, 0x40, 0x24, 0xd3, 0xeb, 0x84, 0x22, 0x8c, 0xab, 0x7a, 0xd7, 0xa8, 0xc4, 0x3b, - 0x21, 0xd6, 0xb0, 0xd0, 0x33, 0x30, 0x1c, 0x39, 0x6e, 0xe3, 0x9a, 0xeb, 0x31, 0x5b, 0x00, 0xda, - 0x7f, 0x91, 0xb3, 0x58, 0x14, 0xe2, 0x18, 0x4e, 0xf9, 0x4a, 0x16, 0xdd, 0x6a, 0x7e, 0x27, 0x12, - 0xe9, 0xf9, 0x8a, 0x9c, 0xaf, 0xbc, 0xa6, 0x4a, 0xb1, 0x86, 0x81, 0x36, 0xe1, 0x94, 0xeb, 0xb1, - 0x34, 0x5a, 0xa4, 0xba, 0xe5, 0xb6, 0xd6, 0xae, 0x55, 0x6f, 0x92, 0xc0, 0x5d, 0xdf, 0x99, 0x77, - 0x6a, 0x5b, 0xc4, 0xab, 0x33, 0xb1, 0xc3, 0xd0, 0xfc, 0xe3, 0xa2, 0x8b, 0xa7, 0xca, 0x1d, 0x70, - 0x71, 0x47, 0x4a, 0xc8, 0xa6, 0xdb, 0x31, 0x20, 0x4e, 0x53, 0xc8, 0x17, 0x78, 0x0a, 0x1e, 0x56, - 0x82, 0x05, 0xc4, 0x7e, 0x81, 0xed, 0x89, 0xeb, 0x55, 0xf4, 0xb4, 0x71, 0xbc, 0x1c, 0xd7, 0x8f, - 0x97, 0xfd, 0xdd, 0xd2, 0xc0, 0xf5, 0xaa, 0x16, 0xe9, 0xe8, 0x12, 0x1c, 0xab, 0xf8, 0xf5, 0x8a, - 0x1f, 0x44, 0xcb, 0x7e, 0x70, 0xc7, 0x09, 0xea, 0x72, 0x09, 0x96, 0x64, 0xac, 0x27, 0x7a, 0xc6, - 0xf6, 0xf3, 0x13, 0xc8, 0x88, 0xe3, 0xf4, 0x02, 0xe3, 0x10, 0x0f, 0xe8, 0x5a, 0x5b, 0x63, 0xbc, - 0x8a, 0x4a, 0x56, 0x77, 0xd9, 0x89, 0x08, 0xba, 0x0e, 0x63, 0x35, 0xfd, 0xda, 0x16, 0xd5, 0x9f, - 0x92, 0x97, 0x9d, 0x71, 0xa7, 0x67, 0xde, 0xf3, 0x66, 0x7d, 0xfb, 0x1b, 0x96, 0x68, 0x85, 0x4b, - 0x3e, 0xb8, 0x0d, 0x6d, 0xf7, 0x33, 0x77, 0x01, 0xa6, 0x02, 0xbd, 0x8a, 0x66, 0x8b, 0x76, 0x8c, - 0x67, 0xff, 0x49, 0x00, 0x71, 0x1a, 0x1f, 0x7d, 0x12, 0x4e, 0x1a, 0x85, 0x52, 0x2d, 0xaf, 0xe5, - 0xe0, 0x66, 0xb2, 0x21, 0x9c, 0x87, 0x84, 0xf3, 0xeb, 0xdb, 0x3f, 0x08, 0xc7, 0x93, 0xdf, 0x25, - 0xa4, 0x35, 0xf7, 0xf9, 0x75, 0x85, 0x83, 0x7d, 0x9d, 0xfd, 0x12, 0x4c, 0xd1, 0x67, 0xbc, 0x62, - 0x49, 0xd9, 0xfc, 0x75, 0x0f, 0xa7, 0xf5, 0xdb, 0x43, 0xec, 0x1a, 0x4c, 0x64, 0xa0, 0x43, 0x9f, - 0x86, 0xf1, 0x90, 0xb0, 0x18, 0x72, 0x52, 0x4a, 0xd8, 0xc1, 0x2f, 0xbe, 0xba, 0xa4, 0x63, 0xf2, - 0x97, 0x90, 0x59, 0x86, 0x13, 0xd4, 0x50, 0x13, 0xc6, 0xef, 0xb8, 0x5e, 0xdd, 0xbf, 0x13, 0x4a, - 0xfa, 0x43, 0xf9, 0x2a, 0x87, 0x5b, 0x1c, 0x33, 0xd1, 0x47, 0xa3, 0xb9, 0x5b, 0x06, 0x31, 0x9c, - 0x20, 0x4e, 0x8f, 0x9a, 0xa0, 0xed, 0xcd, 0x85, 0x37, 0x42, 0x12, 0x88, 0x08, 0x77, 0xec, 0xa8, - 0xc1, 0xb2, 0x10, 0xc7, 0x70, 0x7a, 0xd4, 0xb0, 0x3f, 0xcc, 0xb1, 0x9e, 0x9d, 0x65, 0xe2, 0xa8, - 0xc1, 0xaa, 0x14, 0x6b, 0x18, 0xf4, 0x28, 0x66, 0xff, 0x56, 0x7d, 0x0f, 0xfb, 0x7e, 0x24, 0x0f, - 0x6f, 0x96, 0xae, 0x53, 0x2b, 0xc7, 0x06, 0x56, 0x4e, 0x3c, 0xbd, 0xbe, 0x83, 0xc6, 0xd3, 0x43, - 0x51, 0x87, 0x58, 0x02, 0x3c, 0x22, 0xf4, 0xa5, 0x4e, 0xb1, 0x04, 0xf6, 0xef, 0x2b, 0xce, 0x00, - 0xe5, 0x05, 0xd6, 0xc5, 0x00, 0xf5, 0xf3, 0x80, 0x81, 0x4c, 0x29, 0x5a, 0xe5, 0xa3, 0x23, 0x61, - 0x68, 0x09, 0x06, 0xc3, 0x9d, 0xb0, 0x16, 0x35, 0xc2, 0x4e, 0x29, 0x59, 0xab, 0x0c, 0x45, 0xcb, - 0x08, 0xce, 0xab, 0x60, 0x59, 0x17, 0xd5, 0xe0, 0x88, 0xa0, 0xb8, 0xb0, 0xe9, 0x78, 0x2a, 0x51, - 0x24, 0xb7, 0x7e, 0xbc, 0xb8, 0xb7, 0x5b, 0x3a, 0x22, 0x5a, 0xd6, 0xc1, 0xfb, 0xbb, 0x25, 0xba, - 0x25, 0x33, 0x20, 0x38, 0x8b, 0x1a, 0x5f, 0xf2, 0xb5, 0x9a, 0xdf, 0x6c, 0x55, 0x02, 0x7f, 0xdd, - 0x6d, 0x90, 0x4e, 0x8a, 0xe5, 0xaa, 0x81, 0x29, 0x96, 0xbc, 0x51, 0x86, 0x13, 0xd4, 0xd0, 0x6d, - 0x98, 0x70, 0x5a, 0xad, 0xb9, 0xa0, 0xe9, 0x07, 0xb2, 0x81, 0x91, 0x7c, 0x0d, 0xc5, 0x9c, 0x89, - 0xca, 0xf3, 0x44, 0x26, 0x0a, 0x71, 0x92, 0x20, 0x1d, 0x28, 0xb1, 0xd1, 0x8c, 0x81, 0x1a, 0x8b, - 0x07, 0x4a, 0xec, 0xcb, 0x8c, 0x81, 0xca, 0x80, 0xe0, 0x2c, 0x6a, 0xf6, 0x0f, 0x30, 0xc6, 0x9f, - 0xc5, 0x9b, 0x66, 0x6e, 0x46, 0x4d, 0x18, 0x6b, 0xb1, 0x63, 0x5f, 0xe4, 0x70, 0x13, 0x47, 0xc5, - 0x8b, 0x3d, 0x0a, 0x42, 0xef, 0xb0, 0x2c, 0xb4, 0x86, 0x41, 0x6c, 0x45, 0x27, 0x87, 0x4d, 0xea, - 0xf6, 0x2f, 0xcd, 0x30, 0xd6, 0xb1, 0xca, 0xa5, 0x9b, 0x83, 0xc2, 0xe9, 0x52, 0xc8, 0x33, 0x66, - 0xf2, 0xf5, 0x08, 0xf1, 0xfa, 0x12, 0x8e, 0x9b, 0x58, 0xd6, 0x45, 0x9f, 0x82, 0x71, 0xd7, 0x73, - 0xe3, 0xec, 0xcd, 0xe1, 0xf4, 0xd1, 0xfc, 0x68, 0x5e, 0x0a, 0x4b, 0xcf, 0xef, 0xa8, 0x57, 0xc6, - 0x09, 0x62, 0xe8, 0x2d, 0x66, 0x23, 0x2a, 0x49, 0x17, 0x7a, 0x21, 0xad, 0x9b, 0x83, 0x4a, 0xb2, - 0x1a, 0x11, 0xd4, 0x86, 0x23, 0xe9, 0x2c, 0xd6, 0xe1, 0xb4, 0x9d, 0xff, 0x36, 0x4a, 0x27, 0xa2, - 0x8e, 0x13, 0xf1, 0xa5, 0x61, 0x21, 0xce, 0xa2, 0x8f, 0xae, 0x25, 0x73, 0x0c, 0x17, 0x0d, 0x0d, - 0x44, 0x2a, 0xcf, 0xf0, 0x58, 0xc7, 0xf4, 0xc2, 0x1b, 0x70, 0x5a, 0x4b, 0xd3, 0x7a, 0x39, 0x70, - 0x98, 0x8d, 0x92, 0xcb, 0x6e, 0x23, 0x8d, 0xa9, 0x7d, 0x74, 0x6f, 0xb7, 0x74, 0x7a, 0xad, 0x13, - 0x22, 0xee, 0x4c, 0x07, 0x5d, 0x87, 0x63, 0x3c, 0x16, 0xcd, 0x22, 0x71, 0xea, 0x0d, 0xd7, 0x53, - 0x5c, 0x33, 0x3f, 0xbb, 0x4e, 0xee, 0xed, 0x96, 0x8e, 0xcd, 0x65, 0x21, 0xe0, 0xec, 0x7a, 0xe8, - 0x35, 0x18, 0xae, 0x7b, 0xf2, 0x94, 0x1d, 0x30, 0x32, 0xe1, 0x0e, 0x2f, 0xae, 0x56, 0xd5, 0xf7, - 0xc7, 0x7f, 0x70, 0x5c, 0x01, 0x6d, 0x70, 0x15, 0x98, 0x92, 0x5b, 0x0e, 0xa6, 0x42, 0x94, 0x26, - 0x45, 0xfb, 0x46, 0x70, 0x07, 0xae, 0xfb, 0x55, 0x0e, 0x80, 0x46, 0xdc, 0x07, 0x83, 0x30, 0x7a, - 0x13, 0x90, 0xc8, 0xb8, 0x34, 0x57, 0x63, 0x09, 0x02, 0x35, 0xbb, 0x54, 0x25, 0x42, 0xa8, 0xa6, - 0x30, 0x70, 0x46, 0x2d, 0x74, 0x85, 0x1e, 0x8f, 0x7a, 0xa9, 0x38, 0x7e, 0x55, 0xbe, 0xf5, 0x45, - 0xd2, 0x0a, 0x08, 0x33, 0xa5, 0x34, 0x29, 0xe2, 0x44, 0x3d, 0x54, 0x87, 0x53, 0x4e, 0x3b, 0xf2, - 0x99, 0x76, 0xd1, 0x44, 0x5d, 0xf3, 0xb7, 0x88, 0xc7, 0x14, 0xfb, 0x43, 0x2c, 0xf4, 0xe9, 0xa9, - 0xb9, 0x0e, 0x78, 0xb8, 0x23, 0x15, 0xfa, 0x9c, 0xa2, 0x63, 0xa1, 0x29, 0xfe, 0x0c, 0x3f, 0x75, - 0xae, 0x0d, 0x97, 0x18, 0xe8, 0x25, 0x18, 0xd9, 0xf4, 0xc3, 0x68, 0x95, 0x44, 0x77, 0xfc, 0x60, - 0x4b, 0xa4, 0x78, 0x88, 0xd3, 0xea, 0xc4, 0x20, 0xac, 0xe3, 0xa1, 0xa7, 0x60, 0x90, 0x99, 0x9d, - 0x95, 0x17, 0xd9, 0x5d, 0x3b, 0x14, 0x9f, 0x31, 0x57, 0x78, 0x31, 0x96, 0x70, 0x89, 0x5a, 0xae, - 0x2c, 0xb0, 0xe3, 0x38, 0x81, 0x5a, 0xae, 0x2c, 0x60, 0x09, 0xa7, 0xcb, 0x35, 0xdc, 0x74, 0x02, - 0x52, 0x09, 0xfc, 0x1a, 0x09, 0xb5, 0x64, 0x4e, 0x8f, 0xf0, 0x04, 0x16, 0x74, 0xb9, 0x56, 0xb3, - 0x10, 0x70, 0x76, 0x3d, 0x44, 0xd2, 0x29, 0x8a, 0xc7, 0xf3, 0xd5, 0xae, 0x69, 0x76, 0xb0, 0xc7, - 0x2c, 0xc5, 0x1e, 0x4c, 0xaa, 0xe4, 0xc8, 0x3c, 0x65, 0x45, 0x38, 0x3d, 0xc1, 0xd6, 0x76, 0xef, - 0xf9, 0x2e, 0x94, 0x22, 0xbb, 0x9c, 0xa0, 0x84, 0x53, 0xb4, 0x8d, 0xd8, 0xba, 0x93, 0x5d, 0x63, - 0xeb, 0x5e, 0x80, 0xe1, 0xb0, 0x7d, 0xbb, 0xee, 0x37, 0x1d, 0xd7, 0x63, 0xd6, 0x3b, 0xda, 0xc3, - 0xbd, 0x2a, 0x01, 0x38, 0xc6, 0x41, 0xcb, 0x30, 0xe4, 0x48, 0x2d, 0x35, 0xca, 0x0f, 0x1b, 0xa8, - 0x74, 0xd3, 0x3c, 0x92, 0x96, 0xd4, 0x4b, 0xab, 0xba, 0xe8, 0x55, 0x18, 0x13, 0xa1, 0x49, 0x78, - 0x14, 0x1e, 0x66, 0x5d, 0xa3, 0x39, 0x53, 0x57, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x0d, 0x18, 0x89, - 0xfc, 0x86, 0x90, 0x71, 0x86, 0xd3, 0xc7, 0xf3, 0xa3, 0xfb, 0xae, 0x29, 0x34, 0x5d, 0x7f, 0xa2, - 0xaa, 0x62, 0x9d, 0x0e, 0x5a, 0xe3, 0xeb, 0x9d, 0xa5, 0x6e, 0x22, 0xa1, 0x48, 0x48, 0x7f, 0x3a, - 0xcf, 0xf4, 0x92, 0xa1, 0x99, 0xdb, 0x41, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x19, 0xa6, 0x5a, 0x81, - 0xeb, 0xb3, 0x35, 0xa1, 0xb4, 0xee, 0xd3, 0x66, 0xa2, 0xd6, 0x4a, 0x12, 0x01, 0xa7, 0xeb, 0xb0, - 0xc8, 0x32, 0xa2, 0x70, 0xfa, 0x24, 0x4f, 0x36, 0xc7, 0xe5, 0x20, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, - 0x61, 0x27, 0x31, 0x17, 0xe1, 0x4d, 0xcf, 0xe4, 0xc7, 0x2b, 0xd0, 0x45, 0x7d, 0x9c, 0xf7, 0x57, - 0x7f, 0x71, 0x4c, 0x01, 0xd5, 0xb5, 0x1c, 0xef, 0xf4, 0x05, 0x15, 0x4e, 0x9f, 0xea, 0x60, 0xfb, - 0x9b, 0x78, 0x2e, 0xc7, 0x0c, 0x81, 0x51, 0x1c, 0xe2, 0x04, 0x4d, 0xf4, 0x06, 0x4c, 0x8a, 0xb0, - 0x0b, 0xf1, 0x30, 0x9d, 0x8e, 0xfd, 0xa3, 0x70, 0x02, 0x86, 0x53, 0xd8, 0x3c, 0xd9, 0x9b, 0x73, - 0xbb, 0x41, 0xc4, 0xd1, 0x77, 0xcd, 0xf5, 0xb6, 0xc2, 0xe9, 0x33, 0xec, 0x7c, 0x10, 0xc9, 0xde, - 0x92, 0x50, 0x9c, 0x51, 0x03, 0xad, 0xc1, 0x64, 0x2b, 0x20, 0xa4, 0xc9, 0xde, 0x49, 0xe2, 0x3e, - 0x2b, 0xf1, 0xc0, 0x4a, 0xb4, 0x27, 0x95, 0x04, 0x6c, 0x3f, 0xa3, 0x0c, 0xa7, 0x28, 0xa0, 0x3b, - 0x30, 0xe4, 0x6f, 0x93, 0x60, 0x93, 0x38, 0xf5, 0xe9, 0xb3, 0x1d, 0xbc, 0xf6, 0xc4, 0xe5, 0x76, - 0x5d, 0xe0, 0x26, 0x8c, 0x9a, 0x64, 0x71, 0x77, 0xa3, 0x26, 0xd9, 0x18, 0xfa, 0x4f, 0x2c, 0x38, - 0x29, 0xd5, 0x84, 0xd5, 0x16, 0x1d, 0xf5, 0x05, 0xdf, 0x0b, 0xa3, 0x80, 0x87, 0x02, 0x7a, 0x34, - 0x3f, 0x3c, 0xce, 0x5a, 0x4e, 0x25, 0xa5, 0x45, 0x38, 0x99, 0x87, 0x11, 0xe2, 0xfc, 0x16, 0xe9, - 0xcb, 0x3e, 0x24, 0x91, 0x3c, 0x8c, 0xe6, 0xc2, 0xe5, 0xb7, 0x16, 0x57, 0xa7, 0x1f, 0xe3, 0x71, - 0x8c, 0xe8, 0x66, 0xa8, 0x26, 0x81, 0x38, 0x8d, 0x8f, 0x2e, 0x42, 0xc1, 0x0f, 0xa7, 0x1f, 0x67, - 0x6b, 0xfb, 0x64, 0xce, 0x38, 0x5e, 0xaf, 0x72, 0xe3, 0xd6, 0xeb, 0x55, 0x5c, 0xf0, 0x43, 0x99, - 0x70, 0x8d, 0x3e, 0x67, 0xc3, 0xe9, 0x27, 0xb8, 0xcc, 0x59, 0x26, 0x5c, 0x63, 0x85, 0x38, 0x86, - 0xa3, 0x4d, 0x98, 0x08, 0x0d, 0xb1, 0x41, 0x38, 0x7d, 0x8e, 0x8d, 0xd4, 0x13, 0x79, 0x93, 0x66, - 0x60, 0x6b, 0x99, 0x90, 0x4c, 0x2a, 0x38, 0x49, 0x96, 0xef, 0x2e, 0x4d, 0x70, 0x11, 0x4e, 0x3f, - 0xd9, 0x65, 0x77, 0x69, 0xc8, 0xfa, 0xee, 0xd2, 0x69, 0xe0, 0x04, 0x4d, 0x74, 0x43, 0x77, 0x89, - 0x3c, 0x9f, 0x6f, 0x28, 0x99, 0xe9, 0x0c, 0x39, 0x96, 0xe7, 0x08, 0x39, 0xf3, 0x7d, 0x30, 0x95, - 0xe2, 0xc2, 0x0e, 0xe2, 0x1f, 0x32, 0xb3, 0x05, 0x63, 0xc6, 0x4a, 0x7f, 0xa8, 0xe6, 0x43, 0x3f, - 0x03, 0x30, 0xac, 0xcc, 0x3a, 0x72, 0xf4, 0x6c, 0x53, 0xf7, 0xa5, 0x67, 0xbb, 0x60, 0x5a, 0x1f, - 0x9d, 0x4c, 0x5a, 0x1f, 0x0d, 0x55, 0xfc, 0xba, 0x61, 0x70, 0xb4, 0x96, 0x11, 0x41, 0x38, 0xef, - 0x8c, 0xee, 0xdd, 0x21, 0x4e, 0x53, 0x55, 0x15, 0x7b, 0x36, 0x63, 0xea, 0xeb, 0xa8, 0xfd, 0xba, - 0x0c, 0x53, 0x9e, 0xcf, 0x9e, 0x11, 0xa4, 0x2e, 0x79, 0x44, 0xc6, 0x0a, 0x0e, 0xeb, 0x11, 0xee, - 0x12, 0x08, 0x38, 0x5d, 0x87, 0x36, 0xc8, 0x79, 0xb9, 0xa4, 0xba, 0x8d, 0xb3, 0x7a, 0x58, 0x40, - 0xe9, 0xf3, 0x95, 0xff, 0x0a, 0xa7, 0x27, 0xf3, 0x9f, 0xaf, 0xbc, 0x52, 0x92, 0x5f, 0x0c, 0x25, - 0xbf, 0xc8, 0xb4, 0x4b, 0x2d, 0xbf, 0x5e, 0xae, 0x88, 0x97, 0x88, 0x16, 0xdb, 0xbf, 0x5e, 0xae, - 0x60, 0x0e, 0x43, 0x73, 0x30, 0xc0, 0x7e, 0xc8, 0xc8, 0x41, 0x79, 0x27, 0x49, 0xb9, 0xa2, 0xe5, - 0xa4, 0x65, 0x15, 0xb0, 0xa8, 0xc8, 0xb4, 0x07, 0xf4, 0xf9, 0xc6, 0xb4, 0x07, 0x83, 0xf7, 0xa9, - 0x3d, 0x90, 0x04, 0x70, 0x4c, 0x0b, 0xdd, 0x85, 0x63, 0xc6, 0x93, 0x59, 0x79, 0x08, 0x42, 0xbe, - 0x91, 0x42, 0x02, 0x79, 0xfe, 0xb4, 0xe8, 0xf4, 0xb1, 0x72, 0x16, 0x25, 0x9c, 0xdd, 0x00, 0x6a, - 0xc0, 0x54, 0x2d, 0xd5, 0xea, 0x50, 0xef, 0xad, 0xaa, 0x75, 0x91, 0x6e, 0x31, 0x4d, 0x18, 0xbd, - 0x0a, 0x43, 0xef, 0xfa, 0xdc, 0xa0, 0x50, 0xbc, 0x9e, 0x64, 0x7c, 0x9b, 0xa1, 0xb7, 0xae, 0x57, - 0x59, 0xf9, 0xfe, 0x6e, 0x69, 0xa4, 0xe2, 0xd7, 0xe5, 0x5f, 0xac, 0x2a, 0xa0, 0x1f, 0xb3, 0x60, - 0x26, 0xfd, 0x26, 0x57, 0x9d, 0x1e, 0xeb, 0xbd, 0xd3, 0xb6, 0x68, 0x74, 0x66, 0x29, 0x97, 0x1c, - 0xee, 0xd0, 0x14, 0xfa, 0x28, 0xdd, 0x4f, 0xa1, 0x7b, 0x8f, 0x88, 0x84, 0xfe, 0x8f, 0xc6, 0xfb, - 0x89, 0x96, 0xee, 0xef, 0x96, 0x26, 0xf8, 0xe1, 0xed, 0xde, 0x53, 0x59, 0x08, 0x78, 0x05, 0xf4, - 0x83, 0x70, 0x2c, 0x48, 0xcb, 0xc8, 0x89, 0x7c, 0x27, 0x3c, 0xdd, 0xcb, 0x45, 0x90, 0x9c, 0x70, - 0x9c, 0x45, 0x10, 0x67, 0xb7, 0x63, 0xff, 0xa1, 0xc5, 0x74, 0x23, 0xa2, 0x5b, 0x24, 0x6c, 0x37, - 0xa2, 0x43, 0x30, 0xe2, 0x5b, 0x32, 0x6c, 0x13, 0xee, 0xdb, 0x0a, 0xef, 0xbf, 0xb3, 0x98, 0x15, - 0xde, 0x21, 0xfa, 0x13, 0xbe, 0x05, 0x43, 0x91, 0x68, 0x4d, 0x74, 0x3d, 0xcf, 0x62, 0x48, 0x76, - 0x8a, 0x59, 0x22, 0xaa, 0x77, 0x98, 0x2c, 0xc5, 0x8a, 0x8c, 0xfd, 0x5f, 0xf3, 0x19, 0x90, 0x90, - 0x43, 0x50, 0x01, 0x2f, 0x9a, 0x2a, 0xe0, 0x52, 0x97, 0x2f, 0xc8, 0x51, 0x05, 0xff, 0x57, 0x66, - 0xbf, 0x99, 0xfc, 0xf1, 0xfd, 0x6e, 0xfe, 0x69, 0x7f, 0xd1, 0x02, 0x88, 0xd3, 0xbe, 0xf4, 0x90, - 0xc0, 0xfb, 0x12, 0x7d, 0x79, 0xf9, 0x91, 0x5f, 0xf3, 0x1b, 0x42, 0x05, 0x75, 0x2a, 0xd6, 0x42, - 0xf3, 0xf2, 0x7d, 0xed, 0x37, 0x56, 0xd8, 0xa8, 0x24, 0xe3, 0x30, 0x17, 0x63, 0xbb, 0x08, 0x23, - 0x06, 0xf3, 0x57, 0x2c, 0x38, 0x9a, 0xe5, 0x9c, 0x42, 0xdf, 0xf1, 0x5c, 0x12, 0xab, 0x4c, 0x73, - 0xd5, 0x6c, 0xde, 0x14, 0xe5, 0x58, 0x61, 0xf4, 0x9c, 0x19, 0xfd, 0x60, 0x29, 0x49, 0xae, 0xc3, - 0x58, 0x25, 0x20, 0x1a, 0x7f, 0xf1, 0x7a, 0x9c, 0x2d, 0x69, 0x78, 0xfe, 0xd9, 0x03, 0x47, 0x7c, - 0xb2, 0xbf, 0x5a, 0x80, 0xa3, 0xdc, 0xc0, 0x6c, 0x6e, 0xdb, 0x77, 0xeb, 0x15, 0xbf, 0x2e, 0x5c, - 0x8a, 0xdf, 0x86, 0xd1, 0x96, 0x26, 0x3e, 0xef, 0x14, 0x5e, 0x5f, 0x17, 0xb3, 0xc7, 0x02, 0x3f, - 0xbd, 0x14, 0x1b, 0xb4, 0x50, 0x1d, 0x46, 0xc9, 0xb6, 0x5b, 0x53, 0x96, 0x45, 0x85, 0x03, 0x5f, - 0xd2, 0xaa, 0x95, 0x25, 0x8d, 0x0e, 0x36, 0xa8, 0xf6, 0x6c, 0x16, 0xae, 0xb1, 0x68, 0x7d, 0x5d, - 0xac, 0x89, 0x7e, 0xce, 0x82, 0x13, 0x39, 0xc1, 0xf8, 0x69, 0x73, 0x77, 0x98, 0x29, 0x9f, 0x58, - 0xb6, 0xaa, 0x39, 0x6e, 0xe0, 0x87, 0x05, 0x14, 0x7d, 0x1c, 0xa0, 0x15, 0xa7, 0x30, 0xed, 0x12, - 0xb5, 0xdc, 0x88, 0x5f, 0xac, 0x85, 0xa2, 0x55, 0x99, 0x4e, 0x35, 0x5a, 0xf6, 0x57, 0xfa, 0xa0, - 0x9f, 0x19, 0x71, 0xa1, 0x0a, 0x0c, 0x6e, 0xf2, 0x48, 0x89, 0x1d, 0xe7, 0x8d, 0xe2, 0xca, 0xd0, - 0x8b, 0xf1, 0xbc, 0x69, 0xa5, 0x58, 0x92, 0x41, 0x2b, 0x70, 0x84, 0xa7, 0x67, 0x6d, 0x2c, 0x92, - 0x86, 0xb3, 0x23, 0x25, 0xd3, 0x05, 0xf6, 0xa9, 0x4a, 0x42, 0x5f, 0x4e, 0xa3, 0xe0, 0xac, 0x7a, - 0xe8, 0x75, 0x18, 0x8f, 0xdc, 0x26, 0xf1, 0xdb, 0x91, 0xa4, 0xc4, 0xf3, 0xa1, 0xaa, 0xc7, 0xd3, - 0x9a, 0x01, 0xc5, 0x09, 0x6c, 0xf4, 0x2a, 0x8c, 0xb5, 0x52, 0x32, 0xf8, 0xfe, 0x58, 0x58, 0x65, - 0xca, 0xdd, 0x4d, 0x5c, 0xe6, 0x9f, 0xd2, 0x66, 0xde, 0x38, 0x6b, 0x9b, 0x01, 0x09, 0x37, 0xfd, - 0x46, 0x9d, 0x71, 0xc0, 0xfd, 0x9a, 0x7f, 0x4a, 0x02, 0x8e, 0x53, 0x35, 0x28, 0x95, 0x75, 0xc7, - 0x6d, 0xb4, 0x03, 0x12, 0x53, 0x19, 0x30, 0xa9, 0x2c, 0x27, 0xe0, 0x38, 0x55, 0xa3, 0xbb, 0x72, - 0x61, 0xf0, 0xc1, 0x28, 0x17, 0xec, 0x5f, 0x2d, 0x80, 0x31, 0xb5, 0xdf, 0xc3, 0xd9, 0x56, 0x5f, - 0x83, 0xbe, 0x8d, 0xa0, 0x55, 0x13, 0x06, 0x8b, 0x99, 0x5f, 0x76, 0x19, 0x57, 0x16, 0xf4, 0x2f, - 0xa3, 0xff, 0x31, 0xab, 0x45, 0xf7, 0xf8, 0xb1, 0x4a, 0xe0, 0xd3, 0x4b, 0x4e, 0x06, 0x53, 0x55, - 0x6e, 0x60, 0x83, 0xf2, 0xbd, 0xde, 0x21, 0xec, 0xb8, 0xf0, 0x65, 0xe1, 0x14, 0x0c, 0xdb, 0xbe, - 0xaa, 0x78, 0xad, 0x4b, 0x2a, 0xe8, 0x22, 0x8c, 0x88, 0x04, 0x98, 0xcc, 0x5b, 0x89, 0x6f, 0x26, - 0x66, 0x8b, 0xb8, 0x18, 0x17, 0x63, 0x1d, 0xc7, 0xfe, 0xf1, 0x02, 0x1c, 0xc9, 0x70, 0x37, 0xe5, - 0xd7, 0xc8, 0x86, 0x1b, 0x46, 0xc1, 0x4e, 0xf2, 0x72, 0xc2, 0xa2, 0x1c, 0x2b, 0x0c, 0x7a, 0x56, - 0xf1, 0x8b, 0x2a, 0x79, 0x39, 0x09, 0x77, 0x2e, 0x01, 0x3d, 0xd8, 0xe5, 0x44, 0xaf, 0xed, 0x76, - 0x48, 0x64, 0x86, 0x03, 0x75, 0x6d, 0x33, 0xc3, 0x05, 0x06, 0xa1, 0x4f, 0xc0, 0x0d, 0xa5, 0x8d, - 0xd7, 0x9e, 0x80, 0x5c, 0x1f, 0xcf, 0x61, 0xb4, 0x73, 0x11, 0xf1, 0x1c, 0x2f, 0x12, 0x0f, 0xc5, - 0x38, 0xf2, 0x35, 0x2b, 0xc5, 0x02, 0x6a, 0x7f, 0xb9, 0x08, 0x27, 0x73, 0x1d, 0xd0, 0x69, 0xd7, - 0x9b, 0xbe, 0xe7, 0x46, 0xbe, 0x32, 0xf2, 0xe4, 0xd1, 0xae, 0x49, 0x6b, 0x73, 0x45, 0x94, 0x63, - 0x85, 0x81, 0xce, 0x41, 0x3f, 0x93, 0xdb, 0x27, 0x93, 0xdf, 0xe1, 0xf9, 0x45, 0x1e, 0x0b, 0x94, - 0x83, 0xb5, 0x5b, 0xbd, 0xd8, 0xf1, 0x56, 0x7f, 0x8c, 0x72, 0x30, 0x7e, 0x23, 0x79, 0xa1, 0xd0, - 0xee, 0xfa, 0x7e, 0x03, 0x33, 0x20, 0x7a, 0x42, 0x8c, 0x57, 0xc2, 0xaa, 0x11, 0x3b, 0x75, 0x3f, - 0xd4, 0x06, 0xed, 0x29, 0x18, 0xdc, 0x22, 0x3b, 0x81, 0xeb, 0x6d, 0x24, 0xad, 0x5d, 0xaf, 0xf2, - 0x62, 0x2c, 0xe1, 0x66, 0x96, 0xf8, 0xc1, 0x07, 0x91, 0x25, 0x5e, 0x5f, 0x01, 0x43, 0x5d, 0xd9, - 0x93, 0x9f, 0x28, 0xc2, 0x04, 0x9e, 0x5f, 0xfc, 0x60, 0x22, 0x6e, 0xa4, 0x27, 0xe2, 0x41, 0x24, - 0x53, 0x3f, 0xd8, 0x6c, 0xfc, 0x9e, 0x05, 0x13, 0x2c, 0x0d, 0xa7, 0x88, 0x1e, 0xe3, 0xfa, 0xde, - 0x21, 0x3c, 0x05, 0x1e, 0x83, 0xfe, 0x80, 0x36, 0x2a, 0x66, 0x50, 0xed, 0x71, 0xd6, 0x13, 0xcc, - 0x61, 0xe8, 0x14, 0xf4, 0xb1, 0x2e, 0xd0, 0xc9, 0x1b, 0xe5, 0x47, 0xf0, 0xa2, 0x13, 0x39, 0x98, - 0x95, 0xb2, 0x38, 0x96, 0x98, 0xb4, 0x1a, 0x2e, 0xef, 0x74, 0x6c, 0x55, 0xf1, 0xfe, 0x08, 0x4d, - 0x93, 0xd9, 0xb5, 0xf7, 0x16, 0xc7, 0x32, 0x9b, 0x64, 0xe7, 0x67, 0xf6, 0x3f, 0x15, 0xe0, 0x4c, - 0x66, 0xbd, 0x9e, 0xe3, 0x58, 0x76, 0xae, 0xfd, 0x30, 0x93, 0xf6, 0x15, 0x0f, 0xd1, 0x97, 0xa0, - 0xaf, 0x57, 0xee, 0xbf, 0xbf, 0x87, 0xf0, 0x92, 0x99, 0x43, 0xf6, 0x3e, 0x09, 0x2f, 0x99, 0xd9, - 0xb7, 0x1c, 0x31, 0xc1, 0xb7, 0x0b, 0x39, 0xdf, 0xc2, 0x04, 0x06, 0xe7, 0xe9, 0x39, 0xc3, 0x80, - 0xa1, 0x7c, 0x84, 0xf3, 0x33, 0x86, 0x97, 0x61, 0x05, 0x45, 0x73, 0x30, 0xd1, 0x74, 0x3d, 0x7a, - 0xf8, 0xec, 0x98, 0xac, 0xb8, 0x52, 0xb7, 0xac, 0x98, 0x60, 0x9c, 0xc4, 0x47, 0xae, 0x16, 0x7a, - 0x92, 0x7f, 0xdd, 0xab, 0x07, 0xda, 0x75, 0xb3, 0xa6, 0xc5, 0x89, 0x1a, 0xc5, 0x8c, 0x30, 0x94, - 0x2b, 0x9a, 0x9c, 0xa8, 0xd8, 0xbb, 0x9c, 0x68, 0x34, 0x5b, 0x46, 0x34, 0xf3, 0x2a, 0x8c, 0xdd, - 0xb7, 0x9e, 0xc5, 0xfe, 0x66, 0x11, 0x1e, 0xe9, 0xb0, 0xed, 0xf9, 0x59, 0x6f, 0xcc, 0x81, 0x76, - 0xd6, 0xa7, 0xe6, 0xa1, 0x02, 0x47, 0xd7, 0xdb, 0x8d, 0xc6, 0x0e, 0x73, 0xc0, 0x23, 0x75, 0x89, - 0x21, 0x78, 0x4a, 0x29, 0x1c, 0x39, 0xba, 0x9c, 0x81, 0x83, 0x33, 0x6b, 0xd2, 0x27, 0x16, 0xbd, - 0x49, 0x76, 0x14, 0xa9, 0xc4, 0x13, 0x0b, 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0xcb, 0x30, 0xe5, 0x6c, - 0x3b, 0x2e, 0x4f, 0x7a, 0x22, 0x09, 0xf0, 0x37, 0x96, 0x92, 0x45, 0xcf, 0x25, 0x11, 0x70, 0xba, - 0x4e, 0x8e, 0x4a, 0xa8, 0x78, 0x5f, 0x2a, 0x21, 0x33, 0x08, 0xe2, 0x40, 0x7e, 0x10, 0xc4, 0xce, - 0xe7, 0x62, 0xd7, 0x7c, 0x91, 0xef, 0xc0, 0xd8, 0x41, 0x2d, 0xc7, 0x9f, 0x82, 0xc1, 0x40, 0x64, - 0xe2, 0x4f, 0x78, 0xbb, 0xcb, 0x3c, 0xe5, 0x12, 0x6e, 0xff, 0x6f, 0x16, 0x28, 0x59, 0xb2, 0x19, - 0xef, 0xfc, 0x55, 0x66, 0x06, 0xcf, 0xa5, 0xe0, 0x5a, 0x88, 0xb3, 0x63, 0x9a, 0x19, 0x7c, 0x0c, - 0xc4, 0x26, 0x2e, 0x5f, 0x6e, 0x61, 0x1c, 0x59, 0xc3, 0x78, 0x40, 0x08, 0x0d, 0xa4, 0xc2, 0x40, - 0x9f, 0x80, 0xc1, 0xba, 0xbb, 0xed, 0x86, 0x42, 0x8e, 0x76, 0x60, 0x1d, 0x60, 0xfc, 0x7d, 0x8b, - 0x9c, 0x0c, 0x96, 0xf4, 0xec, 0x9f, 0xb2, 0x40, 0xa9, 0x4e, 0xaf, 0x10, 0xa7, 0x11, 0x6d, 0xa2, - 0x37, 0x00, 0x24, 0x05, 0x25, 0x7b, 0x93, 0x06, 0x5d, 0x80, 0x15, 0x64, 0xdf, 0xf8, 0x87, 0xb5, - 0x3a, 0xe8, 0x75, 0x18, 0xd8, 0x64, 0xb4, 0xc4, 0xb7, 0x9d, 0x53, 0xaa, 0x2e, 0x56, 0xba, 0xbf, - 0x5b, 0x3a, 0x6a, 0xb6, 0x29, 0x6f, 0x31, 0x5e, 0xcb, 0xfe, 0x89, 0x42, 0x3c, 0xa7, 0x6f, 0xb5, - 0xfd, 0xc8, 0x39, 0x04, 0x4e, 0xe4, 0xb2, 0xc1, 0x89, 0x3c, 0xd1, 0x49, 0x37, 0xcc, 0xba, 0x94, - 0xcb, 0x81, 0x5c, 0x4f, 0x70, 0x20, 0x4f, 0x76, 0x27, 0xd5, 0x99, 0xf3, 0xf8, 0x6f, 0x2c, 0x98, - 0x32, 0xf0, 0x0f, 0xe1, 0x02, 0x5c, 0x36, 0x2f, 0xc0, 0x47, 0xbb, 0x7e, 0x43, 0xce, 0xc5, 0xf7, - 0xa3, 0xc5, 0x44, 0xdf, 0xd9, 0x85, 0xf7, 0x2e, 0xf4, 0x6d, 0x3a, 0x41, 0x5d, 0xbc, 0xeb, 0x2f, - 0xf4, 0x34, 0xd6, 0xb3, 0x57, 0x9c, 0x40, 0x18, 0x83, 0x3c, 0x2b, 0x47, 0x9d, 0x16, 0x75, 0x35, - 0x04, 0x61, 0x4d, 0xa1, 0x4b, 0x30, 0x10, 0xd6, 0xfc, 0x96, 0xf2, 0x29, 0x64, 0x49, 0xd4, 0xab, - 0xac, 0x64, 0x7f, 0xb7, 0x84, 0xcc, 0xe6, 0x68, 0x31, 0x16, 0xf8, 0xe8, 0x6d, 0x18, 0x63, 0xbf, - 0x94, 0x65, 0x66, 0x31, 0x5f, 0x02, 0x53, 0xd5, 0x11, 0xb9, 0xd9, 0xb2, 0x51, 0x84, 0x4d, 0x52, - 0x33, 0x1b, 0x30, 0xac, 0x3e, 0xeb, 0xa1, 0x6a, 0xfe, 0xff, 0xba, 0x08, 0x47, 0x32, 0xd6, 0x1c, - 0x0a, 0x8d, 0x99, 0xb8, 0xd8, 0xe3, 0x52, 0x7d, 0x8f, 0x73, 0x11, 0xb2, 0x07, 0x60, 0x5d, 0xac, - 0xad, 0x9e, 0x1b, 0xbd, 0x11, 0x92, 0x64, 0xa3, 0xb4, 0xa8, 0x7b, 0xa3, 0xb4, 0xb1, 0x43, 0x1b, - 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x43, 0x9d, 0xd3, 0x3f, 0xe9, 0x83, 0xa3, 0x59, 0xe6, 0x2a, 0xe8, - 0x73, 0x30, 0xc0, 0x9c, 0xde, 0xa4, 0xe0, 0xec, 0xc5, 0x5e, 0x0d, 0x5d, 0x66, 0x99, 0xdf, 0x9c, - 0x08, 0x99, 0x3b, 0x2b, 0x8f, 0x23, 0x5e, 0xd8, 0x75, 0x98, 0x45, 0x9b, 0x2c, 0x94, 0x95, 0xb8, - 0x3d, 0xe5, 0xf1, 0xf1, 0x91, 0x9e, 0x3b, 0x20, 0xee, 0xdf, 0x30, 0x61, 0xf5, 0x25, 0x8b, 0xbb, - 0x5b, 0x7d, 0xc9, 0x96, 0x51, 0x19, 0x06, 0x6a, 0xdc, 0x9c, 0xa8, 0xd8, 0xfd, 0x08, 0xe3, 0xb6, - 0x44, 0xea, 0x00, 0x16, 0x36, 0x44, 0x82, 0xc0, 0x8c, 0x0b, 0x23, 0xda, 0xc0, 0x3c, 0xd4, 0xc5, - 0xb3, 0x45, 0x2f, 0x3e, 0x6d, 0x08, 0x1e, 0xea, 0x02, 0xfa, 0x59, 0xed, 0xee, 0x17, 0xe7, 0xc1, - 0x87, 0x0d, 0xde, 0xe9, 0x54, 0xc2, 0x15, 0x31, 0xb1, 0xaf, 0x18, 0x2f, 0x55, 0x35, 0x63, 0xcd, - 0xe7, 0x26, 0xcc, 0x32, 0x2f, 0xfc, 0xce, 0xf1, 0xe5, 0xed, 0x9f, 0xb3, 0x20, 0xe1, 0x2c, 0xa6, - 0xc4, 0x9d, 0x56, 0xae, 0xb8, 0xf3, 0x2c, 0xf4, 0x05, 0x7e, 0x43, 0xf2, 0x53, 0x0a, 0x03, 0xfb, - 0x0d, 0x82, 0x19, 0x84, 0x62, 0x44, 0xb1, 0x10, 0x6b, 0x54, 0x7f, 0xa0, 0x8b, 0xa7, 0xf7, 0x63, - 0xd0, 0xdf, 0x20, 0xdb, 0xa4, 0x91, 0xcc, 0x1b, 0x7b, 0x8d, 0x16, 0x62, 0x0e, 0xb3, 0x7f, 0xaf, - 0x0f, 0x4e, 0x77, 0x8c, 0x78, 0x47, 0x19, 0xcc, 0x0d, 0x27, 0x22, 0x77, 0x9c, 0x9d, 0x64, 0xbe, - 0xc4, 0xcb, 0xbc, 0x18, 0x4b, 0x38, 0x73, 0xdc, 0xe6, 0x39, 0x80, 0x12, 0xc2, 0x61, 0x91, 0xfa, - 0x47, 0x40, 0x4d, 0x61, 0x63, 0xf1, 0x41, 0x08, 0x1b, 0x9f, 0x07, 0x08, 0xc3, 0x06, 0xb7, 0x09, - 0xad, 0x0b, 0x8f, 0xf0, 0x38, 0x57, 0x54, 0xf5, 0x9a, 0x80, 0x60, 0x0d, 0x0b, 0x2d, 0xc2, 0x64, - 0x2b, 0xf0, 0x23, 0x2e, 0x6b, 0x5f, 0xe4, 0x66, 0xd3, 0xfd, 0x66, 0xb0, 0xb1, 0x4a, 0x02, 0x8e, - 0x53, 0x35, 0xd0, 0x4b, 0x30, 0x22, 0x02, 0x90, 0x55, 0x7c, 0xbf, 0x21, 0xc4, 0x7b, 0xca, 0x92, - 0xb8, 0x1a, 0x83, 0xb0, 0x8e, 0xa7, 0x55, 0x63, 0x02, 0xfc, 0xc1, 0xcc, 0x6a, 0x5c, 0x88, 0xaf, - 0xe1, 0x25, 0x92, 0x15, 0x0c, 0xf5, 0x94, 0xac, 0x20, 0x16, 0x78, 0x0e, 0xf7, 0xac, 0x4f, 0x86, - 0xae, 0x22, 0xc2, 0xaf, 0xf5, 0xc1, 0x11, 0xb1, 0x70, 0x1e, 0xf6, 0x72, 0xb9, 0x91, 0x5e, 0x2e, - 0x0f, 0x42, 0x24, 0xfa, 0xc1, 0x9a, 0x39, 0xec, 0x35, 0xf3, 0x93, 0x16, 0x98, 0x3c, 0x24, 0xfa, - 0x8f, 0x72, 0x13, 0xce, 0xbe, 0x94, 0xcb, 0x93, 0xc6, 0x91, 0xcc, 0xdf, 0x5b, 0xea, 0x59, 0xfb, - 0x7f, 0xb1, 0xe0, 0xd1, 0xae, 0x14, 0xd1, 0x12, 0x0c, 0x33, 0x46, 0x57, 0x7b, 0x17, 0x3f, 0xa9, - 0xdc, 0x2a, 0x24, 0x20, 0x87, 0xef, 0x8e, 0x6b, 0xa2, 0xa5, 0x54, 0x66, 0xdf, 0xa7, 0x32, 0x32, - 0xfb, 0x1e, 0x33, 0x86, 0xe7, 0x3e, 0x53, 0xfb, 0x7e, 0x89, 0xde, 0x38, 0xa6, 0x6f, 0xe6, 0x47, - 0x0c, 0x71, 0xae, 0x9d, 0x10, 0xe7, 0x22, 0x13, 0x5b, 0xbb, 0x43, 0xde, 0x80, 0x49, 0x16, 0x99, - 0x94, 0x39, 0xf9, 0x08, 0xa7, 0xce, 0x42, 0x6c, 0xc8, 0x7f, 0x2d, 0x01, 0xc3, 0x29, 0x6c, 0xfb, - 0x1f, 0x8a, 0x30, 0xc0, 0xb7, 0xdf, 0x21, 0x3c, 0x7c, 0x9f, 0x81, 0x61, 0xb7, 0xd9, 0x6c, 0xf3, - 0x64, 0xad, 0xfd, 0xb1, 0x59, 0x78, 0x59, 0x16, 0xe2, 0x18, 0x8e, 0x96, 0x85, 0x26, 0xa1, 0x43, - 0xf0, 0x73, 0xde, 0xf1, 0xd9, 0x45, 0x27, 0x72, 0x38, 0x17, 0xa7, 0xee, 0xd9, 0x58, 0xe7, 0x80, - 0x3e, 0x0d, 0x10, 0x46, 0x81, 0xeb, 0x6d, 0xd0, 0x32, 0x91, 0x21, 0xe3, 0xe9, 0x0e, 0xd4, 0xaa, - 0x0a, 0x99, 0xd3, 0x8c, 0xcf, 0x1c, 0x05, 0xc0, 0x1a, 0x45, 0x34, 0x6b, 0xdc, 0xf4, 0x33, 0x89, - 0xb9, 0x03, 0x4e, 0x35, 0x9e, 0xb3, 0x99, 0x97, 0x61, 0x58, 0x11, 0xef, 0x26, 0x57, 0x1c, 0xd5, - 0x19, 0xb6, 0x8f, 0xc1, 0x44, 0xa2, 0x6f, 0x07, 0x12, 0x4b, 0xfe, 0xbe, 0x05, 0x13, 0xbc, 0x33, - 0x4b, 0xde, 0xb6, 0xb8, 0x0d, 0xee, 0xc1, 0xd1, 0x46, 0xc6, 0xa9, 0x2c, 0xa6, 0xbf, 0xf7, 0x53, - 0x5c, 0x89, 0x21, 0xb3, 0xa0, 0x38, 0xb3, 0x0d, 0x74, 0x9e, 0xee, 0x38, 0x7a, 0xea, 0x3a, 0x0d, - 0x11, 0x99, 0x64, 0x94, 0xef, 0x36, 0x5e, 0x86, 0x15, 0xd4, 0xfe, 0x5b, 0x0b, 0xa6, 0x78, 0xcf, - 0xaf, 0x92, 0x1d, 0x75, 0x36, 0x7d, 0x27, 0xfb, 0x2e, 0xd2, 0x84, 0x17, 0x72, 0xd2, 0x84, 0xeb, - 0x9f, 0x56, 0xec, 0xf8, 0x69, 0x5f, 0xb5, 0x40, 0xac, 0x90, 0x43, 0x90, 0xb4, 0x7c, 0x9f, 0x29, - 0x69, 0x99, 0xc9, 0xdf, 0x04, 0x39, 0x22, 0x96, 0x7f, 0xb3, 0x60, 0x92, 0x23, 0xc4, 0x56, 0x10, - 0xdf, 0xd1, 0x79, 0x98, 0x37, 0xbf, 0x28, 0xd3, 0xac, 0xf5, 0x2a, 0xd9, 0x59, 0xf3, 0x2b, 0x4e, - 0xb4, 0x99, 0xfd, 0x51, 0xc6, 0x64, 0xf5, 0x75, 0x9c, 0xac, 0xba, 0xdc, 0x40, 0x46, 0x42, 0xc8, - 0x2e, 0x02, 0xe0, 0x83, 0x26, 0x84, 0xb4, 0xff, 0xd1, 0x02, 0xc4, 0x9b, 0x31, 0x18, 0x37, 0xca, - 0x0e, 0xb1, 0x52, 0xed, 0xa2, 0x8b, 0x8f, 0x26, 0x05, 0xc1, 0x1a, 0xd6, 0x03, 0x19, 0x9e, 0x84, - 0x29, 0x4b, 0xb1, 0xbb, 0x29, 0xcb, 0x01, 0x46, 0xf4, 0xab, 0x83, 0x90, 0x74, 0xeb, 0x44, 0x37, - 0x61, 0xb4, 0xe6, 0xb4, 0x9c, 0xdb, 0x6e, 0xc3, 0x8d, 0x5c, 0x12, 0x76, 0xb2, 0x73, 0x5b, 0xd0, - 0xf0, 0x84, 0xf1, 0x81, 0x56, 0x82, 0x0d, 0x3a, 0x68, 0x16, 0xa0, 0x15, 0xb8, 0xdb, 0x6e, 0x83, - 0x6c, 0x30, 0x81, 0x10, 0x8b, 0x85, 0xc4, 0x8d, 0xee, 0x64, 0x29, 0xd6, 0x30, 0x32, 0x42, 0x90, - 0x14, 0x1f, 0x72, 0x08, 0x12, 0x38, 0xb4, 0x10, 0x24, 0x7d, 0x07, 0x0a, 0x41, 0x32, 0x74, 0xe0, - 0x10, 0x24, 0xfd, 0x3d, 0x85, 0x20, 0xc1, 0x70, 0x5c, 0xf2, 0x9e, 0xf4, 0xff, 0xb2, 0xdb, 0x20, - 0xe2, 0xc1, 0xc1, 0x03, 0x38, 0xcd, 0xec, 0xed, 0x96, 0x8e, 0xe3, 0x4c, 0x0c, 0x9c, 0x53, 0x13, - 0x7d, 0x1c, 0xa6, 0x9d, 0x46, 0xc3, 0xbf, 0xa3, 0x26, 0x75, 0x29, 0xac, 0x39, 0x8d, 0x38, 0xae, - 0xdf, 0xd0, 0xfc, 0xa9, 0xbd, 0xdd, 0xd2, 0xf4, 0x5c, 0x0e, 0x0e, 0xce, 0xad, 0x8d, 0x5e, 0x83, - 0xe1, 0x56, 0xe0, 0xd7, 0x56, 0x34, 0xdf, 0xf3, 0x33, 0x74, 0x00, 0x2b, 0xb2, 0x70, 0x7f, 0xb7, - 0x34, 0xa6, 0xfe, 0xb0, 0x0b, 0x3f, 0xae, 0x90, 0x11, 0xdd, 0x63, 0xe4, 0x61, 0x47, 0xf7, 0x18, - 0x7d, 0xc0, 0xd1, 0x3d, 0xec, 0x2d, 0x38, 0x52, 0x25, 0x81, 0xeb, 0x34, 0xdc, 0x7b, 0x94, 0x27, - 0x97, 0x67, 0xe0, 0x1a, 0x0c, 0x07, 0x89, 0x53, 0xbf, 0xa7, 0xa0, 0xe7, 0x9a, 0x5c, 0x46, 0x9e, - 0xf2, 0x31, 0x21, 0xfb, 0xff, 0xb7, 0x60, 0x50, 0xb8, 0x8a, 0x1e, 0x02, 0x67, 0x3a, 0x67, 0xa8, - 0x64, 0x4a, 0xd9, 0x93, 0xc2, 0x3a, 0x93, 0xab, 0x8c, 0x29, 0x27, 0x94, 0x31, 0x8f, 0x76, 0x22, - 0xd2, 0x59, 0x0d, 0xf3, 0x9f, 0x15, 0xe9, 0x0b, 0xc1, 0x08, 0x5a, 0xf0, 0xf0, 0x87, 0x60, 0x15, - 0x06, 0x43, 0xe1, 0x34, 0x5f, 0xc8, 0xf7, 0xe5, 0x49, 0x4e, 0x62, 0x6c, 0x03, 0x29, 0xdc, 0xe4, - 0x25, 0x91, 0x4c, 0x6f, 0xfc, 0xe2, 0x43, 0xf4, 0xc6, 0xef, 0x16, 0xd6, 0xa1, 0xef, 0x41, 0x84, - 0x75, 0xb0, 0xbf, 0xce, 0x6e, 0x67, 0xbd, 0xfc, 0x10, 0x18, 0xb7, 0xcb, 0xe6, 0x3d, 0x6e, 0x77, - 0x58, 0x59, 0xa2, 0x53, 0x39, 0x0c, 0xdc, 0xef, 0x5a, 0x70, 0x3a, 0xe3, 0xab, 0x34, 0x6e, 0xee, - 0x59, 0x18, 0x72, 0xda, 0x75, 0x57, 0xed, 0x65, 0x4d, 0x5b, 0x3c, 0x27, 0xca, 0xb1, 0xc2, 0x40, - 0x0b, 0x30, 0x45, 0xee, 0xb6, 0x5c, 0xae, 0x86, 0xd7, 0x4d, 0xc7, 0x8b, 0xdc, 0xbf, 0x78, 0x29, - 0x09, 0xc4, 0x69, 0x7c, 0x15, 0x1a, 0xae, 0x98, 0x1b, 0x1a, 0xee, 0x37, 0x2d, 0x18, 0x51, 0x6e, - 0xe3, 0x0f, 0x7d, 0xb4, 0xdf, 0x30, 0x47, 0xfb, 0x91, 0x0e, 0xa3, 0x9d, 0x33, 0xcc, 0x7f, 0x53, - 0x50, 0xfd, 0xad, 0xf8, 0x41, 0xd4, 0x03, 0x97, 0x78, 0xff, 0x6e, 0x2f, 0x17, 0x61, 0xc4, 0x69, - 0xb5, 0x24, 0x40, 0xda, 0x2f, 0xb2, 0x14, 0x16, 0x71, 0x31, 0xd6, 0x71, 0x94, 0x17, 0x4e, 0x31, - 0xd7, 0x0b, 0xa7, 0x0e, 0x10, 0x39, 0xc1, 0x06, 0x89, 0x68, 0x99, 0x30, 0xb7, 0xce, 0x3f, 0x6f, - 0xda, 0x91, 0xdb, 0x98, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0xd9, 0xb2, 0x17, 0x5d, 0x0f, 0xf8, 0x33, - 0x55, 0x0b, 0xc0, 0xa8, 0x68, 0x61, 0x8d, 0xae, 0x0c, 0x91, 0xc2, 0xda, 0xe8, 0x37, 0x0d, 0x61, - 0x56, 0x45, 0x39, 0x56, 0x18, 0xf6, 0xcb, 0xec, 0xf6, 0x61, 0x63, 0x7a, 0xb0, 0xc0, 0x82, 0xff, - 0x34, 0xaa, 0x66, 0x83, 0xa9, 0x84, 0x17, 0xf5, 0xf0, 0x85, 0x9d, 0x0f, 0x7b, 0xda, 0xb0, 0xee, - 0xcf, 0x1a, 0xc7, 0x38, 0x44, 0x9f, 0x4c, 0x19, 0x37, 0x3d, 0xd7, 0xe5, 0xd6, 0x38, 0x80, 0x39, - 0x13, 0xcb, 0x67, 0xc7, 0xb2, 0x7d, 0x95, 0x2b, 0x62, 0x5f, 0x68, 0xf9, 0xec, 0x04, 0x00, 0xc7, - 0x38, 0x94, 0x61, 0x53, 0x7f, 0xc2, 0x69, 0x14, 0x87, 0x3d, 0x57, 0xd8, 0x21, 0xd6, 0x30, 0xd0, - 0x05, 0x21, 0xb4, 0xe0, 0xba, 0x87, 0x47, 0x12, 0x42, 0x0b, 0x39, 0x5c, 0x9a, 0xa4, 0xe9, 0x22, - 0x8c, 0x90, 0xbb, 0x11, 0x09, 0x3c, 0xa7, 0x41, 0x5b, 0xe8, 0x8f, 0xa3, 0xeb, 0x2e, 0xc5, 0xc5, - 0x58, 0xc7, 0x41, 0x6b, 0x30, 0x11, 0x72, 0x59, 0x9e, 0x4a, 0xb6, 0xc1, 0x65, 0xa2, 0x4f, 0x2b, - 0x87, 0x7d, 0x13, 0xbc, 0xcf, 0x8a, 0xf8, 0xe9, 0x24, 0xc3, 0x98, 0x24, 0x49, 0xa0, 0xd7, 0x61, - 0xbc, 0xe1, 0x3b, 0xf5, 0x79, 0xa7, 0xe1, 0x78, 0x35, 0x36, 0x3e, 0x43, 0x46, 0x2c, 0xcb, 0xf1, - 0x6b, 0x06, 0x14, 0x27, 0xb0, 0x29, 0x83, 0xa8, 0x97, 0x88, 0x04, 0x31, 0x8e, 0xb7, 0x41, 0xc2, - 0xe9, 0x61, 0xf6, 0x55, 0x8c, 0x41, 0xbc, 0x96, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x4b, 0x30, 0x2a, - 0x3f, 0x5f, 0x8b, 0xfa, 0x13, 0x3b, 0x34, 0x69, 0x30, 0x6c, 0x60, 0xa2, 0x10, 0x8e, 0xc9, 0xff, - 0x6b, 0x81, 0xb3, 0xbe, 0xee, 0xd6, 0x44, 0x28, 0x0c, 0xee, 0xfc, 0xfd, 0x31, 0xe9, 0x69, 0xba, - 0x94, 0x85, 0xb4, 0xbf, 0x5b, 0x3a, 0x25, 0x46, 0x2d, 0x13, 0x8e, 0xb3, 0x69, 0xa3, 0x15, 0x38, - 0xc2, 0x6d, 0x60, 0x16, 0x36, 0x49, 0x6d, 0x4b, 0x6e, 0x38, 0xc6, 0x35, 0x6a, 0x8e, 0x3f, 0x57, - 0xd2, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x07, 0xa6, 0x5b, 0xed, 0xdb, 0x0d, 0x37, 0xdc, 0x5c, 0xf5, - 0x23, 0x66, 0x42, 0x36, 0x57, 0xaf, 0x07, 0x24, 0xe4, 0xbe, 0xc1, 0xec, 0xea, 0x95, 0x91, 0x9a, - 0x2a, 0x39, 0x78, 0x38, 0x97, 0x02, 0xba, 0x07, 0xc7, 0x12, 0x0b, 0x41, 0x84, 0x5c, 0x19, 0xcf, - 0x4f, 0xb5, 0x55, 0xcd, 0xaa, 0x20, 0xa2, 0x17, 0x65, 0x81, 0x70, 0x76, 0x13, 0xe8, 0x15, 0x00, - 0xb7, 0xb5, 0xec, 0x34, 0xdd, 0x06, 0x7d, 0x8e, 0x1e, 0x61, 0x6b, 0x84, 0x3e, 0x4d, 0xa0, 0x5c, - 0x91, 0xa5, 0xf4, 0x6c, 0x16, 0xff, 0x76, 0xb0, 0x86, 0x8d, 0xae, 0xc1, 0xb8, 0xf8, 0xb7, 0x23, - 0xa6, 0x74, 0x4a, 0x65, 0x65, 0x1d, 0x97, 0x35, 0xd4, 0x3c, 0x26, 0x4a, 0x70, 0xa2, 0x2e, 0xda, - 0x80, 0xd3, 0x32, 0x25, 0xac, 0xbe, 0x3e, 0xe5, 0x1c, 0x84, 0x2c, 0xbf, 0xd5, 0x10, 0xf7, 0x29, - 0x9a, 0xeb, 0x84, 0x88, 0x3b, 0xd3, 0xa1, 0xf7, 0xba, 0xbe, 0xcc, 0xb9, 0xc7, 0xf8, 0xb1, 0x38, - 0x22, 0xe8, 0xb5, 0x24, 0x10, 0xa7, 0xf1, 0x91, 0x0f, 0xc7, 0x5c, 0x2f, 0x6b, 0x55, 0x1f, 0x67, - 0x84, 0x3e, 0xca, 0x9d, 0xe5, 0x3b, 0xaf, 0xe8, 0x4c, 0x38, 0xce, 0xa6, 0x8b, 0xca, 0x70, 0x24, - 0xe2, 0x05, 0x8b, 0x6e, 0xc8, 0xd3, 0xe7, 0xd0, 0x67, 0xdf, 0x09, 0xd6, 0xdc, 0x09, 0xba, 0x9a, - 0xd7, 0xd2, 0x60, 0x9c, 0x55, 0xe7, 0xbd, 0x19, 0x80, 0x7e, 0xc3, 0xa2, 0xb5, 0x35, 0x46, 0x1f, - 0x7d, 0x06, 0x46, 0xf5, 0xf1, 0x11, 0x4c, 0xcb, 0xb9, 0x6c, 0x3e, 0x58, 0x3b, 0x5e, 0xf8, 0x33, - 0x41, 0x1d, 0x21, 0x3a, 0x0c, 0x1b, 0x14, 0x51, 0x2d, 0x23, 0xc8, 0xc5, 0x85, 0xde, 0x98, 0xa2, - 0xde, 0xed, 0x1f, 0x09, 0x64, 0xef, 0x1c, 0x74, 0x0d, 0x86, 0x6a, 0x0d, 0x97, 0x78, 0x51, 0xb9, - 0xd2, 0x29, 0x50, 0xeb, 0x82, 0xc0, 0x11, 0x5b, 0x51, 0x64, 0xbd, 0xe2, 0x65, 0x58, 0x51, 0xb0, - 0x2f, 0xc1, 0x48, 0xb5, 0x41, 0x48, 0x8b, 0xfb, 0x71, 0xa1, 0xa7, 0xd8, 0xc3, 0x84, 0xb1, 0x96, - 0x16, 0x63, 0x2d, 0xf5, 0x37, 0x07, 0x63, 0x2a, 0x25, 0xdc, 0xfe, 0xb3, 0x02, 0x94, 0xba, 0x24, - 0x5f, 0x4b, 0xe8, 0xdb, 0xac, 0x9e, 0xf4, 0x6d, 0x73, 0x30, 0x11, 0xff, 0xd3, 0x45, 0x79, 0xca, - 0x18, 0xfa, 0xa6, 0x09, 0xc6, 0x49, 0xfc, 0x9e, 0xfd, 0x5a, 0x74, 0x95, 0x5d, 0x5f, 0x57, 0xcf, - 0x2c, 0x43, 0x55, 0xdf, 0xdf, 0xfb, 0xdb, 0x3b, 0x57, 0xed, 0x6a, 0x7f, 0xbd, 0x00, 0xc7, 0xd4, - 0x10, 0x7e, 0xef, 0x0e, 0xdc, 0x8d, 0xf4, 0xc0, 0x3d, 0x00, 0xa5, 0xb5, 0x7d, 0x1d, 0x06, 0x78, - 0xf4, 0xd8, 0x1e, 0x78, 0xfe, 0xc7, 0xcc, 0x40, 0xfe, 0x8a, 0xcd, 0x34, 0x82, 0xf9, 0xff, 0x98, - 0x05, 0x13, 0x09, 0x07, 0x49, 0x84, 0x35, 0x2f, 0xfa, 0xfb, 0xe1, 0xcb, 0xb3, 0x38, 0xfe, 0xb3, - 0xd0, 0xb7, 0xe9, 0x2b, 0x23, 0x65, 0x85, 0x71, 0xc5, 0x0f, 0x23, 0xcc, 0x20, 0xf6, 0xdf, 0x59, - 0xd0, 0xbf, 0xe6, 0xb8, 0x5e, 0x24, 0xb5, 0x1f, 0x56, 0x8e, 0xf6, 0xa3, 0x97, 0xef, 0x42, 0x2f, - 0xc1, 0x00, 0x59, 0x5f, 0x27, 0xb5, 0x48, 0xcc, 0xaa, 0x8c, 0xa6, 0x31, 0xb0, 0xc4, 0x4a, 0x29, - 0x13, 0xca, 0x1a, 0xe3, 0x7f, 0xb1, 0x40, 0x46, 0xb7, 0x60, 0x38, 0x72, 0x9b, 0x64, 0xae, 0x5e, - 0x17, 0x36, 0x01, 0xf7, 0x11, 0x02, 0x66, 0x4d, 0x12, 0xc0, 0x31, 0x2d, 0xfb, 0xcb, 0x05, 0x80, - 0x38, 0x5a, 0x5d, 0xb7, 0x4f, 0x9c, 0x4f, 0x69, 0x8b, 0xcf, 0x65, 0x68, 0x8b, 0x51, 0x4c, 0x30, - 0x43, 0x55, 0xac, 0x86, 0xa9, 0xd8, 0xd3, 0x30, 0xf5, 0x1d, 0x64, 0x98, 0x16, 0x60, 0x2a, 0x8e, - 0xb6, 0x67, 0x06, 0x1b, 0x65, 0xf7, 0xf7, 0x5a, 0x12, 0x88, 0xd3, 0xf8, 0x36, 0x81, 0xb3, 0x2a, - 0xe8, 0x98, 0xb8, 0x0b, 0x99, 0x2b, 0x81, 0xae, 0x7d, 0xef, 0x32, 0x4e, 0xb1, 0x3a, 0xbc, 0x90, - 0xab, 0x0e, 0xff, 0x45, 0x0b, 0x8e, 0x26, 0xdb, 0x61, 0x7e, 0xf7, 0x5f, 0xb4, 0xe0, 0x58, 0x9c, - 0x7b, 0x28, 0x6d, 0x82, 0xf0, 0x62, 0xc7, 0x40, 0x6a, 0x39, 0x3d, 0x8e, 0xc3, 0xb6, 0xac, 0x64, - 0x91, 0xc6, 0xd9, 0x2d, 0xda, 0xff, 0x5f, 0x1f, 0x4c, 0xe7, 0x45, 0x60, 0x63, 0x9e, 0x46, 0xce, - 0xdd, 0xea, 0x16, 0xb9, 0x23, 0xfc, 0x39, 0x62, 0x4f, 0x23, 0x5e, 0x8c, 0x25, 0x3c, 0x99, 0x6e, - 0xaa, 0xd0, 0x63, 0xba, 0xa9, 0x4d, 0x98, 0xba, 0xb3, 0x49, 0xbc, 0x1b, 0x5e, 0xe8, 0x44, 0x6e, - 0xb8, 0xee, 0x32, 0x05, 0x3a, 0x5f, 0x37, 0xaf, 0x48, 0xaf, 0x8b, 0x5b, 0x49, 0x84, 0xfd, 0xdd, - 0xd2, 0x69, 0xa3, 0x20, 0xee, 0x32, 0x3f, 0x48, 0x70, 0x9a, 0x68, 0x3a, 0x5b, 0x57, 0xdf, 0x43, - 0xce, 0xd6, 0xd5, 0x74, 0x85, 0xd9, 0x8d, 0x74, 0x23, 0x61, 0xcf, 0xd6, 0x15, 0x55, 0x8a, 0x35, - 0x0c, 0xf4, 0x29, 0x40, 0x7a, 0xba, 0x45, 0x23, 0x00, 0xee, 0x73, 0x7b, 0xbb, 0x25, 0xb4, 0x9a, - 0x82, 0xee, 0xef, 0x96, 0x8e, 0xd0, 0xd2, 0xb2, 0x47, 0x9f, 0xbf, 0x71, 0xd4, 0xc0, 0x0c, 0x42, - 0xe8, 0x16, 0x4c, 0xd2, 0x52, 0xb6, 0xa3, 0x64, 0x74, 0x5d, 0xfe, 0x64, 0x7d, 0x66, 0x6f, 0xb7, - 0x34, 0xb9, 0x9a, 0x80, 0xe5, 0x91, 0x4e, 0x11, 0xc9, 0x48, 0xda, 0x35, 0xd4, 0x6b, 0xd2, 0x2e, - 0xfb, 0x8b, 0x16, 0x9c, 0xa4, 0x17, 0x5c, 0xfd, 0x5a, 0x8e, 0x16, 0xdd, 0x69, 0xb9, 0x5c, 0x4f, - 0x23, 0xae, 0x1a, 0x26, 0xab, 0xab, 0x94, 0xb9, 0x96, 0x46, 0x41, 0xe9, 0x09, 0xbf, 0xe5, 0x7a, - 0xf5, 0xe4, 0x09, 0x7f, 0xd5, 0xf5, 0xea, 0x98, 0x41, 0xd4, 0x95, 0x55, 0xcc, 0x8d, 0xd6, 0xff, - 0x35, 0xba, 0x57, 0x69, 0x5f, 0xbe, 0xa3, 0xdd, 0x40, 0xcf, 0xe8, 0x3a, 0x55, 0x61, 0x3e, 0x99, - 0xab, 0x4f, 0xfd, 0x82, 0x05, 0xc2, 0xfb, 0xbd, 0x87, 0x3b, 0xf9, 0x6d, 0x18, 0xdd, 0x4e, 0xa7, - 0xa2, 0x3d, 0x9b, 0x1f, 0x0e, 0x40, 0x24, 0xa0, 0x55, 0x2c, 0xba, 0x91, 0x76, 0xd6, 0xa0, 0x65, - 0xd7, 0x41, 0x40, 0x17, 0x09, 0xd3, 0x6a, 0x74, 0xef, 0xcd, 0xf3, 0x00, 0x75, 0x86, 0xcb, 0xf2, - 0xd3, 0x17, 0x4c, 0x8e, 0x6b, 0x51, 0x41, 0xb0, 0x86, 0x65, 0xff, 0x7a, 0x11, 0x46, 0x64, 0xea, - 0xd3, 0xb6, 0xd7, 0x8b, 0xec, 0x51, 0x67, 0x9c, 0x0a, 0x5d, 0x19, 0xa7, 0x77, 0x60, 0x2a, 0x20, - 0xb5, 0x76, 0x10, 0xba, 0xdb, 0x44, 0x82, 0xc5, 0x26, 0x99, 0xe5, 0xc9, 0x22, 0x12, 0xc0, 0x7d, - 0x16, 0x22, 0x2b, 0x51, 0xc8, 0x94, 0xc6, 0x69, 0x42, 0xe8, 0x02, 0x0c, 0x33, 0xd1, 0x7b, 0x25, - 0x16, 0x08, 0x2b, 0xc1, 0xd7, 0x8a, 0x04, 0xe0, 0x18, 0x87, 0x3d, 0x0e, 0xda, 0xb7, 0x19, 0x7a, - 0xc2, 0x13, 0xbc, 0xca, 0x8b, 0xb1, 0x84, 0xa3, 0x8f, 0xc3, 0x24, 0xaf, 0x17, 0xf8, 0x2d, 0x67, - 0x83, 0xab, 0x04, 0xfb, 0x55, 0x78, 0x9d, 0xc9, 0x95, 0x04, 0x6c, 0x7f, 0xb7, 0x74, 0x34, 0x59, - 0xc6, 0xba, 0x9d, 0xa2, 0xc2, 0x2c, 0xff, 0x78, 0x23, 0xf4, 0xce, 0x48, 0x19, 0x0c, 0xc6, 0x20, - 0xac, 0xe3, 0xd9, 0xff, 0x6a, 0xc1, 0x94, 0x36, 0x55, 0x3d, 0xe7, 0xeb, 0x30, 0x06, 0xa9, 0xd0, - 0xc3, 0x20, 0x1d, 0x2c, 0xda, 0x43, 0xe6, 0x0c, 0xf7, 0x3d, 0xa0, 0x19, 0xb6, 0x3f, 0x03, 0x28, - 0x9d, 0x57, 0x17, 0xbd, 0xc9, 0x0d, 0xf9, 0xdd, 0x80, 0xd4, 0x3b, 0x29, 0xfc, 0xf5, 0xc8, 0x39, - 0xd2, 0x73, 0x95, 0xd7, 0xc2, 0xaa, 0xbe, 0xfd, 0xe3, 0x7d, 0x30, 0x99, 0x8c, 0xd5, 0x81, 0xae, - 0xc0, 0x00, 0xe7, 0xd2, 0x05, 0xf9, 0x0e, 0xf6, 0x64, 0x5a, 0x84, 0x0f, 0x9e, 0x4b, 0x87, 0x73, - 0xf7, 0xa2, 0x3e, 0x7a, 0x07, 0x46, 0xea, 0xfe, 0x1d, 0xef, 0x8e, 0x13, 0xd4, 0xe7, 0x2a, 0x65, - 0x71, 0x42, 0x64, 0x0a, 0xa0, 0x16, 0x63, 0x34, 0x3d, 0x6a, 0x08, 0xb3, 0x9d, 0x88, 0x41, 0x58, - 0x27, 0x87, 0xd6, 0x58, 0x7a, 0xa7, 0x75, 0x77, 0x63, 0xc5, 0x69, 0x75, 0xf2, 0xea, 0x5a, 0x90, - 0x48, 0x1a, 0xe5, 0x31, 0x91, 0x03, 0x8a, 0x03, 0x70, 0x4c, 0x08, 0x7d, 0x0e, 0x8e, 0x84, 0x39, - 0x2a, 0xb1, 0xbc, 0x34, 0xeb, 0x9d, 0xb4, 0x44, 0x5c, 0x98, 0x92, 0xa5, 0x3c, 0xcb, 0x6a, 0x06, - 0xdd, 0x05, 0x24, 0x44, 0xcf, 0x6b, 0x41, 0x3b, 0x8c, 0xe6, 0xdb, 0x5e, 0xbd, 0x21, 0xd3, 0x3f, - 0x7d, 0x38, 0x5b, 0x4e, 0x90, 0xc4, 0xd6, 0xda, 0x66, 0xe1, 0x85, 0xd3, 0x18, 0x38, 0xa3, 0x0d, - 0xfb, 0x0b, 0x7d, 0x30, 0x23, 0x13, 0x59, 0x67, 0x78, 0xaf, 0x7c, 0xde, 0x4a, 0xb8, 0xaf, 0xbc, - 0x92, 0x7f, 0xd0, 0x3f, 0x34, 0x27, 0x96, 0x2f, 0xa5, 0x9d, 0x58, 0x5e, 0x3b, 0x60, 0x37, 0x1e, - 0x98, 0x2b, 0xcb, 0xf7, 0xac, 0xff, 0xc9, 0xde, 0x51, 0x30, 0xae, 0x66, 0x84, 0x79, 0xec, 0xf6, - 0x8a, 0x54, 0x1d, 0xe5, 0x3c, 0xff, 0xaf, 0x08, 0x1c, 0xe3, 0xb2, 0x1f, 0x95, 0x11, 0xde, 0xd9, - 0x39, 0xab, 0xe8, 0x50, 0x9a, 0xa4, 0xd9, 0x8a, 0x76, 0x16, 0xdd, 0x40, 0xf4, 0x38, 0x93, 0xe6, - 0x92, 0xc0, 0x49, 0xd3, 0x94, 0x10, 0xac, 0xe8, 0xa0, 0x6d, 0x98, 0xda, 0x60, 0x11, 0x9f, 0xb4, - 0x9c, 0xd2, 0xe2, 0x5c, 0xc8, 0xdc, 0xb7, 0x97, 0x17, 0x96, 0xf2, 0x13, 0x50, 0xf3, 0xc7, 0x5f, - 0x0a, 0x05, 0xa7, 0x9b, 0xa0, 0x5b, 0xe3, 0xa8, 0x73, 0x27, 0x5c, 0x6a, 0x38, 0x61, 0xe4, 0xd6, - 0xe6, 0x1b, 0x7e, 0x6d, 0xab, 0x1a, 0xf9, 0x81, 0x4c, 0x16, 0x99, 0xf9, 0xf6, 0x9a, 0xbb, 0x55, - 0x4d, 0xe1, 0x1b, 0xcd, 0x4f, 0xef, 0xed, 0x96, 0x8e, 0x66, 0x61, 0xe1, 0xcc, 0xb6, 0xd0, 0x2a, - 0x0c, 0x6e, 0xb8, 0x11, 0x26, 0x2d, 0x5f, 0x9c, 0x16, 0x99, 0x47, 0xe1, 0x65, 0x8e, 0x62, 0xb4, - 0xc4, 0x22, 0x52, 0x09, 0x00, 0x96, 0x44, 0xd0, 0x9b, 0xea, 0x12, 0x18, 0xc8, 0x17, 0xc0, 0xa6, - 0x6d, 0xef, 0x32, 0xaf, 0x81, 0xd7, 0xa1, 0xe8, 0xad, 0x87, 0x9d, 0x62, 0xf1, 0xac, 0x2e, 0x1b, - 0xf2, 0xb3, 0xf9, 0x41, 0xfa, 0x34, 0x5e, 0x5d, 0xae, 0x62, 0x5a, 0x91, 0xb9, 0xbd, 0x86, 0xb5, - 0xd0, 0x15, 0x89, 0xa7, 0x32, 0xbd, 0x80, 0xcb, 0xd5, 0x85, 0x6a, 0xd9, 0xa0, 0xc1, 0xa2, 0x1a, - 0xb2, 0x62, 0xcc, 0xab, 0xa3, 0x9b, 0x30, 0xbc, 0xc1, 0x0f, 0xbe, 0xf5, 0x50, 0x24, 0xb3, 0xcf, - 0xbc, 0x8c, 0x2e, 0x4b, 0x24, 0x83, 0x1e, 0xbb, 0x32, 0x14, 0x08, 0xc7, 0xa4, 0xd0, 0x17, 0x2c, - 0x38, 0xd6, 0x4a, 0x48, 0x50, 0x99, 0xb3, 0x9a, 0x30, 0x53, 0xcb, 0x74, 0x00, 0xa8, 0x64, 0x55, - 0x30, 0x1a, 0x64, 0xea, 0x97, 0x4c, 0x34, 0x9c, 0xdd, 0x1c, 0x1d, 0xe8, 0xe0, 0x76, 0xbd, 0x53, - 0xae, 0xa2, 0x44, 0x60, 0x22, 0x3e, 0xd0, 0x78, 0x7e, 0x11, 0xd3, 0x8a, 0x68, 0x0d, 0x60, 0xbd, - 0x41, 0x44, 0xc4, 0x47, 0x61, 0x14, 0x95, 0x79, 0xfb, 0x2f, 0x2b, 0x2c, 0x41, 0x87, 0xbd, 0x44, - 0xe3, 0x52, 0xac, 0xd1, 0xa1, 0x4b, 0xa9, 0xe6, 0x7a, 0x75, 0x12, 0x30, 0xe5, 0x56, 0xce, 0x52, - 0x5a, 0x60, 0x18, 0xe9, 0xa5, 0xc4, 0xcb, 0xb1, 0xa0, 0xc0, 0x68, 0x91, 0xd6, 0xe6, 0x7a, 0xd8, - 0x29, 0x2b, 0xc6, 0x02, 0x69, 0x6d, 0x26, 0x16, 0x14, 0xa7, 0xc5, 0xca, 0xb1, 0xa0, 0x40, 0xb7, - 0xcc, 0x3a, 0xdd, 0x40, 0x24, 0x98, 0x9e, 0xc8, 0xdf, 0x32, 0xcb, 0x1c, 0x25, 0xbd, 0x65, 0x04, - 0x00, 0x4b, 0x22, 0xe8, 0xd3, 0x26, 0xb7, 0x33, 0xc9, 0x68, 0x3e, 0xd3, 0x85, 0xdb, 0x31, 0xe8, - 0x76, 0xe6, 0x77, 0x5e, 0x81, 0xc2, 0x7a, 0x8d, 0x29, 0xc5, 0x72, 0x74, 0x06, 0xcb, 0x0b, 0x06, - 0x35, 0x16, 0x65, 0x7e, 0x79, 0x01, 0x17, 0xd6, 0x6b, 0x74, 0xe9, 0x3b, 0xf7, 0xda, 0x01, 0x59, - 0x76, 0x1b, 0x44, 0x64, 0xc8, 0xc8, 0x5c, 0xfa, 0x73, 0x12, 0x29, 0xbd, 0xf4, 0x15, 0x08, 0xc7, - 0xa4, 0x28, 0xdd, 0x98, 0x07, 0x3b, 0x92, 0x4f, 0x57, 0xb1, 0x5a, 0x69, 0xba, 0x99, 0x5c, 0xd8, - 0x16, 0x8c, 0x6d, 0x87, 0xad, 0x4d, 0x22, 0x4f, 0x45, 0xa6, 0xae, 0xcb, 0x89, 0x54, 0x71, 0x53, - 0x20, 0xba, 0x41, 0xd4, 0x76, 0x1a, 0xa9, 0x83, 0x9c, 0x89, 0x56, 0x6e, 0xea, 0xc4, 0xb0, 0x49, - 0x9b, 0x2e, 0x84, 0x77, 0x79, 0x38, 0x39, 0xa6, 0xb8, 0xcb, 0x59, 0x08, 0x19, 0x11, 0xe7, 0xf8, - 0x42, 0x10, 0x00, 0x2c, 0x89, 0xa8, 0xc1, 0x66, 0x17, 0xd0, 0xf1, 0x2e, 0x83, 0x9d, 0xea, 0x6f, - 0x3c, 0xd8, 0xec, 0xc2, 0x89, 0x49, 0xb1, 0x8b, 0xa6, 0xb5, 0xe9, 0x47, 0xbe, 0x97, 0xb8, 0xe4, - 0x4e, 0xe4, 0x5f, 0x34, 0x95, 0x0c, 0xfc, 0xf4, 0x45, 0x93, 0x85, 0x85, 0x33, 0xdb, 0xa2, 0x1f, - 0xd7, 0x92, 0x91, 0x01, 0x45, 0x16, 0x8f, 0xa7, 0x72, 0x02, 0x6b, 0xa6, 0xc3, 0x07, 0xf2, 0x8f, - 0x53, 0x20, 0x1c, 0x93, 0x42, 0x75, 0x18, 0x6f, 0x19, 0x11, 0x67, 0x59, 0x36, 0x92, 0x1c, 0xbe, - 0x20, 0x2b, 0x36, 0x2d, 0x97, 0x10, 0x99, 0x10, 0x9c, 0xa0, 0xc9, 0x2c, 0xf7, 0xb8, 0xab, 0x1f, - 0x4b, 0x56, 0x92, 0x33, 0xd5, 0x19, 0xde, 0x80, 0x7c, 0xaa, 0x05, 0x00, 0x4b, 0x22, 0x74, 0x34, - 0x84, 0x83, 0x9a, 0x1f, 0xb2, 0x9c, 0x3f, 0x79, 0x0a, 0xf6, 0x2c, 0x35, 0x91, 0x0c, 0xb3, 0x2e, - 0x40, 0x38, 0x26, 0x45, 0x4f, 0x72, 0x7a, 0xe1, 0x9d, 0xca, 0x3f, 0xc9, 0x93, 0xd7, 0x1d, 0x3b, - 0xc9, 0xe9, 0x65, 0x57, 0x14, 0x57, 0x9d, 0x8a, 0x0a, 0xce, 0xf2, 0x95, 0xe4, 0xf4, 0x4b, 0x85, - 0x15, 0x4f, 0xf7, 0x4b, 0x81, 0x70, 0x4c, 0x8a, 0x5d, 0xc5, 0x2c, 0x34, 0xdd, 0x99, 0x0e, 0x57, - 0x31, 0x45, 0xc8, 0xb8, 0x8a, 0xb5, 0xd0, 0x75, 0xf6, 0x8f, 0x17, 0xe0, 0x4c, 0xe7, 0x7d, 0x1b, - 0xeb, 0xd0, 0x2a, 0xb1, 0xcd, 0x52, 0x42, 0x87, 0xc6, 0x25, 0x3a, 0x31, 0x56, 0xcf, 0x01, 0x87, - 0x2f, 0xc3, 0x94, 0x72, 0x47, 0x6c, 0xb8, 0xb5, 0x1d, 0x2d, 0x49, 0xa9, 0x0a, 0xcd, 0x53, 0x4d, - 0x22, 0xe0, 0x74, 0x1d, 0x34, 0x07, 0x13, 0x46, 0x61, 0x79, 0x51, 0x3c, 0xff, 0xe3, 0x4c, 0x1b, - 0x26, 0x18, 0x27, 0xf1, 0xed, 0xdf, 0xb0, 0xe0, 0x44, 0x4e, 0xfe, 0xfb, 0x9e, 0xe3, 0xe9, 0xae, - 0xc3, 0x44, 0xcb, 0xac, 0xda, 0x25, 0x04, 0xb8, 0x91, 0x65, 0x5f, 0xf5, 0x35, 0x01, 0xc0, 0x49, - 0xa2, 0xf6, 0xaf, 0x15, 0xe0, 0x74, 0x47, 0xfb, 0x7a, 0x84, 0xe1, 0xf8, 0x46, 0x33, 0x74, 0x16, - 0x02, 0x52, 0x27, 0x5e, 0xe4, 0x3a, 0x8d, 0x6a, 0x8b, 0xd4, 0x34, 0x2d, 0x28, 0x33, 0x54, 0xbf, - 0xbc, 0x52, 0x9d, 0x4b, 0x63, 0xe0, 0x9c, 0x9a, 0x68, 0x19, 0x50, 0x1a, 0x22, 0x66, 0x98, 0x3d, - 0x71, 0xd3, 0xf4, 0x70, 0x46, 0x0d, 0xf4, 0x32, 0x8c, 0x29, 0xbb, 0x7d, 0x6d, 0xc6, 0xd9, 0x05, - 0x81, 0x75, 0x00, 0x36, 0xf1, 0xd0, 0x45, 0x9e, 0x82, 0x49, 0x24, 0xeb, 0x12, 0x2a, 0xd3, 0x09, - 0x99, 0x5f, 0x49, 0x14, 0x63, 0x1d, 0x67, 0xfe, 0xd2, 0x5f, 0x7c, 0xeb, 0xcc, 0x87, 0xfe, 0xea, - 0x5b, 0x67, 0x3e, 0xf4, 0xb7, 0xdf, 0x3a, 0xf3, 0xa1, 0x1f, 0xda, 0x3b, 0x63, 0xfd, 0xc5, 0xde, - 0x19, 0xeb, 0xaf, 0xf6, 0xce, 0x58, 0x7f, 0xbb, 0x77, 0xc6, 0xfa, 0xdf, 0xf7, 0xce, 0x58, 0x5f, - 0xfe, 0x3f, 0xce, 0x7c, 0xe8, 0x6d, 0x14, 0x47, 0xa8, 0xbe, 0x40, 0x67, 0xe7, 0xc2, 0xf6, 0xc5, - 0xff, 0x10, 0x00, 0x00, 0xff, 0xff, 0xf5, 0xf1, 0x8c, 0x4c, 0x2d, 0x26, 0x01, 0x00, + // 16665 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x5b, 0x90, 0x5c, 0x49, + 0x76, 0x18, 0xb6, 0xb7, 0xaa, 0x9f, 0xa7, 0xdf, 0x89, 0x57, 0xa1, 0x07, 0x40, 0x61, 0xee, 0xcc, + 0x60, 0x30, 0x3b, 0x33, 0x8d, 0xc5, 0x3c, 0x76, 0xb1, 0x33, 0xb3, 0xc3, 0xe9, 0x27, 0xd0, 0x03, + 0x74, 0xa3, 0x26, 0xab, 0x01, 0xec, 0x63, 0x76, 0xb5, 0x17, 0x55, 0xd9, 0xdd, 0x77, 0xbb, 0xea, + 0xde, 0x9a, 0x7b, 0x6f, 0x35, 0xd0, 0x30, 0x15, 0xa4, 0x56, 0xe6, 0x4a, 0x4b, 0xd2, 0x11, 0x1b, + 0x0a, 0x4b, 0x72, 0x90, 0x0a, 0x7e, 0xe8, 0x45, 0xd2, 0xb4, 0x64, 0x52, 0xa4, 0x45, 0x59, 0x14, + 0x29, 0xda, 0x96, 0x23, 0x68, 0x7f, 0xc8, 0x14, 0x23, 0xcc, 0x65, 0x58, 0xe1, 0x96, 0xd9, 0xb6, + 0x42, 0xc1, 0x0f, 0x53, 0x0a, 0xda, 0x1f, 0x76, 0x87, 0x6c, 0x2a, 0xf2, 0x79, 0x33, 0xef, 0xab, + 0xaa, 0x31, 0x40, 0xef, 0x70, 0x63, 0xfe, 0xaa, 0xf2, 0x9c, 0x3c, 0x99, 0x37, 0x1f, 0x27, 0x4f, + 0x9e, 0x73, 0xf2, 0x1c, 0xb0, 0x77, 0xae, 0x85, 0x73, 0xae, 0x7f, 0xc5, 0xe9, 0xb8, 0x57, 0x1a, + 0x7e, 0x40, 0xae, 0xec, 0x5e, 0xbd, 0xb2, 0x45, 0x3c, 0x12, 0x38, 0x11, 0x69, 0xce, 0x75, 0x02, + 0x3f, 0xf2, 0x11, 0xe2, 0x38, 0x73, 0x4e, 0xc7, 0x9d, 0xa3, 0x38, 0x73, 0xbb, 0x57, 0x67, 0x5f, + 0xdd, 0x72, 0xa3, 0xed, 0xee, 0xfd, 0xb9, 0x86, 0xdf, 0xbe, 0xb2, 0xe5, 0x6f, 0xf9, 0x57, 0x18, + 0xea, 0xfd, 0xee, 0x26, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc4, 0xec, 0x1b, 0x71, 0x33, 0x6d, + 0xa7, 0xb1, 0xed, 0x7a, 0x24, 0xd8, 0xbb, 0xd2, 0xd9, 0xd9, 0x62, 0xed, 0x06, 0x24, 0xf4, 0xbb, + 0x41, 0x83, 0x24, 0x1b, 0x2e, 0xac, 0x15, 0x5e, 0x69, 0x93, 0xc8, 0xc9, 0xe8, 0xee, 0xec, 0x95, + 0xbc, 0x5a, 0x41, 0xd7, 0x8b, 0xdc, 0x76, 0xba, 0x99, 0xcf, 0xf7, 0xaa, 0x10, 0x36, 0xb6, 0x49, + 0xdb, 0x49, 0xd5, 0x7b, 0x3d, 0xaf, 0x5e, 0x37, 0x72, 0x5b, 0x57, 0x5c, 0x2f, 0x0a, 0xa3, 0x20, + 0x59, 0xc9, 0xfe, 0xbe, 0x05, 0x17, 0xe7, 0xef, 0xd5, 0x97, 0x5b, 0x4e, 0x18, 0xb9, 0x8d, 0x85, + 0x96, 0xdf, 0xd8, 0xa9, 0x47, 0x7e, 0x40, 0xee, 0xfa, 0xad, 0x6e, 0x9b, 0xd4, 0xd9, 0x40, 0xa0, + 0x57, 0x60, 0x64, 0x97, 0xfd, 0x5f, 0x5d, 0xaa, 0x58, 0x17, 0xad, 0xcb, 0xa3, 0x0b, 0xd3, 0xbf, + 0xb3, 0x5f, 0xfd, 0xcc, 0xc1, 0x7e, 0x75, 0xe4, 0xae, 0x28, 0xc7, 0x0a, 0x03, 0x5d, 0x82, 0xa1, + 0xcd, 0x70, 0x63, 0xaf, 0x43, 0x2a, 0x25, 0x86, 0x3b, 0x29, 0x70, 0x87, 0x56, 0xea, 0xb4, 0x14, + 0x0b, 0x28, 0xba, 0x02, 0xa3, 0x1d, 0x27, 0x88, 0xdc, 0xc8, 0xf5, 0xbd, 0x4a, 0xf9, 0xa2, 0x75, + 0x79, 0x70, 0x61, 0x46, 0xa0, 0x8e, 0xd6, 0x24, 0x00, 0xc7, 0x38, 0xb4, 0x1b, 0x01, 0x71, 0x9a, + 0xb7, 0xbd, 0xd6, 0x5e, 0x65, 0xe0, 0xa2, 0x75, 0x79, 0x24, 0xee, 0x06, 0x16, 0xe5, 0x58, 0x61, + 0xd8, 0x3f, 0x53, 0x82, 0x91, 0xf9, 0xcd, 0x4d, 0xd7, 0x73, 0xa3, 0x3d, 0x74, 0x17, 0xc6, 0x3d, + 0xbf, 0x49, 0xe4, 0x7f, 0xf6, 0x15, 0x63, 0xaf, 0x5d, 0x9c, 0x4b, 0x2f, 0xa5, 0xb9, 0x75, 0x0d, + 0x6f, 0x61, 0xfa, 0x60, 0xbf, 0x3a, 0xae, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xd6, 0xf1, 0x9b, + 0x8a, 0x6c, 0x89, 0x91, 0xad, 0x66, 0x91, 0xad, 0xc5, 0x68, 0x0b, 0x53, 0x07, 0xfb, 0xd5, 0x31, + 0xad, 0x00, 0xeb, 0x44, 0xd0, 0x7d, 0x98, 0xa2, 0x7f, 0xbd, 0xc8, 0x55, 0x74, 0xcb, 0x8c, 0xee, + 0x73, 0x79, 0x74, 0x35, 0xd4, 0x85, 0x13, 0x07, 0xfb, 0xd5, 0xa9, 0x44, 0x21, 0x4e, 0x12, 0xb4, + 0x7f, 0xda, 0x82, 0xa9, 0xf9, 0x4e, 0x67, 0x3e, 0x68, 0xfb, 0x41, 0x2d, 0xf0, 0x37, 0xdd, 0x16, + 0x41, 0x5f, 0x80, 0x81, 0x88, 0xce, 0x1a, 0x9f, 0xe1, 0xe7, 0xc4, 0xd0, 0x0e, 0xd0, 0xb9, 0x3a, + 0xdc, 0xaf, 0x9e, 0x48, 0xa0, 0xb3, 0xa9, 0x64, 0x15, 0xd0, 0x7b, 0x30, 0xdd, 0xf2, 0x1b, 0x4e, + 0x6b, 0xdb, 0x0f, 0x23, 0x01, 0x15, 0x53, 0x7f, 0xf2, 0x60, 0xbf, 0x3a, 0x7d, 0x2b, 0x01, 0xc3, + 0x29, 0x6c, 0xfb, 0x11, 0x4c, 0xce, 0x47, 0x91, 0xd3, 0xd8, 0x26, 0x4d, 0xbe, 0xa0, 0xd0, 0x1b, + 0x30, 0xe0, 0x39, 0x6d, 0xd9, 0x99, 0x8b, 0xb2, 0x33, 0xeb, 0x4e, 0x9b, 0x76, 0x66, 0xfa, 0x8e, + 0xe7, 0x7e, 0xd4, 0x15, 0x8b, 0x94, 0x96, 0x61, 0x86, 0x8d, 0x5e, 0x03, 0x68, 0x92, 0x5d, 0xb7, + 0x41, 0x6a, 0x4e, 0xb4, 0x2d, 0xfa, 0x80, 0x44, 0x5d, 0x58, 0x52, 0x10, 0xac, 0x61, 0xd9, 0x0f, + 0x61, 0x74, 0x7e, 0xd7, 0x77, 0x9b, 0x35, 0xbf, 0x19, 0xa2, 0x1d, 0x98, 0xea, 0x04, 0x64, 0x93, + 0x04, 0xaa, 0xa8, 0x62, 0x5d, 0x2c, 0x5f, 0x1e, 0x7b, 0xed, 0x72, 0xe6, 0xd8, 0x9b, 0xa8, 0xcb, + 0x5e, 0x14, 0xec, 0x2d, 0x9c, 0x11, 0xed, 0x4d, 0x25, 0xa0, 0x38, 0x49, 0xd9, 0xfe, 0x67, 0x25, + 0x38, 0x35, 0xff, 0xa8, 0x1b, 0x90, 0x25, 0x37, 0xdc, 0x49, 0x6e, 0xb8, 0xa6, 0x1b, 0xee, 0xac, + 0xc7, 0x23, 0xa0, 0x56, 0xfa, 0x92, 0x28, 0xc7, 0x0a, 0x03, 0xbd, 0x0a, 0xc3, 0xf4, 0xf7, 0x1d, + 0xbc, 0x2a, 0x3e, 0xf9, 0x84, 0x40, 0x1e, 0x5b, 0x72, 0x22, 0x67, 0x89, 0x83, 0xb0, 0xc4, 0x41, + 0x6b, 0x30, 0xd6, 0x60, 0xfc, 0x61, 0x6b, 0xcd, 0x6f, 0x12, 0xb6, 0xb6, 0x46, 0x17, 0x5e, 0xa6, + 0xe8, 0x8b, 0x71, 0xf1, 0xe1, 0x7e, 0xb5, 0xc2, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, + 0xb6, 0xda, 0xee, 0x03, 0x8c, 0x12, 0x64, 0x6c, 0xf5, 0xcb, 0xda, 0xce, 0x1d, 0x64, 0x3b, 0x77, + 0x3c, 0x7b, 0xd7, 0xa2, 0xab, 0x30, 0xb0, 0xe3, 0x7a, 0xcd, 0xca, 0x10, 0xa3, 0x75, 0x9e, 0xce, + 0xf9, 0x4d, 0xd7, 0x6b, 0x1e, 0xee, 0x57, 0x67, 0x8c, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0xff, + 0xcb, 0x82, 0x2a, 0x83, 0xad, 0xb8, 0x2d, 0x52, 0x23, 0x41, 0xe8, 0x86, 0x11, 0xf1, 0x22, 0x63, + 0x40, 0x5f, 0x03, 0x08, 0x49, 0x23, 0x20, 0x91, 0x36, 0xa4, 0x6a, 0x61, 0xd4, 0x15, 0x04, 0x6b, + 0x58, 0x94, 0x3f, 0x85, 0xdb, 0x4e, 0xc0, 0xd6, 0x97, 0x18, 0x58, 0xc5, 0x9f, 0xea, 0x12, 0x80, + 0x63, 0x1c, 0x83, 0x3f, 0x95, 0x7b, 0xf1, 0x27, 0xf4, 0x25, 0x98, 0x8a, 0x1b, 0x0b, 0x3b, 0x4e, + 0x43, 0x0e, 0x20, 0xdb, 0xc1, 0x75, 0x13, 0x84, 0x93, 0xb8, 0xf6, 0x7f, 0x6e, 0x89, 0xc5, 0x43, + 0xbf, 0xfa, 0x13, 0xfe, 0xad, 0xf6, 0x3f, 0xb2, 0x60, 0x78, 0xc1, 0xf5, 0x9a, 0xae, 0xb7, 0x85, + 0xbe, 0x09, 0x23, 0xf4, 0xa8, 0x6c, 0x3a, 0x91, 0x23, 0xd8, 0xf0, 0xe7, 0xb4, 0xbd, 0xa5, 0x4e, + 0xae, 0xb9, 0xce, 0xce, 0x16, 0x2d, 0x08, 0xe7, 0x28, 0x36, 0xdd, 0x6d, 0xb7, 0xef, 0x7f, 0x8b, + 0x34, 0xa2, 0x35, 0x12, 0x39, 0xf1, 0xe7, 0xc4, 0x65, 0x58, 0x51, 0x45, 0x37, 0x61, 0x28, 0x72, + 0x82, 0x2d, 0x12, 0x09, 0x7e, 0x9c, 0xc9, 0x37, 0x79, 0x4d, 0x4c, 0x77, 0x24, 0xf1, 0x1a, 0x24, + 0x3e, 0xa5, 0x36, 0x58, 0x55, 0x2c, 0x48, 0xd8, 0xff, 0xdf, 0x30, 0x9c, 0x5d, 0xac, 0xaf, 0xe6, + 0xac, 0xab, 0x4b, 0x30, 0xd4, 0x0c, 0xdc, 0x5d, 0x12, 0x88, 0x71, 0x56, 0x54, 0x96, 0x58, 0x29, + 0x16, 0x50, 0x74, 0x0d, 0xc6, 0xf9, 0xf9, 0x78, 0xc3, 0xf1, 0x9a, 0x31, 0x7b, 0x14, 0xd8, 0xe3, + 0x77, 0x35, 0x18, 0x36, 0x30, 0x8f, 0xb8, 0xa8, 0x2e, 0x25, 0x36, 0x63, 0xde, 0xd9, 0xfb, 0x5d, + 0x0b, 0xa6, 0x79, 0x33, 0xf3, 0x51, 0x14, 0xb8, 0xf7, 0xbb, 0x11, 0x09, 0x2b, 0x83, 0x8c, 0xd3, + 0x2d, 0x66, 0x8d, 0x56, 0xee, 0x08, 0xcc, 0xdd, 0x4d, 0x50, 0xe1, 0x4c, 0xb0, 0x22, 0xda, 0x9d, + 0x4e, 0x82, 0x71, 0xaa, 0x59, 0xf4, 0x17, 0x2d, 0x98, 0x6d, 0xf8, 0x5e, 0x14, 0xf8, 0xad, 0x16, + 0x09, 0x6a, 0xdd, 0xfb, 0x2d, 0x37, 0xdc, 0xe6, 0xeb, 0x14, 0x93, 0x4d, 0xc6, 0x09, 0x72, 0xe6, + 0x50, 0x21, 0x89, 0x39, 0xbc, 0x70, 0xb0, 0x5f, 0x9d, 0x5d, 0xcc, 0x25, 0x85, 0x0b, 0x9a, 0x41, + 0x3b, 0x80, 0xe8, 0xc9, 0x5e, 0x8f, 0x9c, 0x2d, 0x12, 0x37, 0x3e, 0xdc, 0x7f, 0xe3, 0xa7, 0x0f, + 0xf6, 0xab, 0x68, 0x3d, 0x45, 0x02, 0x67, 0x90, 0x45, 0x1f, 0xc1, 0x49, 0x5a, 0x9a, 0xfa, 0xd6, + 0x91, 0xfe, 0x9b, 0xab, 0x1c, 0xec, 0x57, 0x4f, 0xae, 0x67, 0x10, 0xc1, 0x99, 0xa4, 0xd1, 0x8f, + 0x5b, 0x70, 0x36, 0xfe, 0xfc, 0xe5, 0x87, 0x1d, 0xc7, 0x6b, 0xc6, 0x0d, 0x8f, 0xf6, 0xdf, 0x30, + 0xe5, 0xc9, 0x67, 0x17, 0xf3, 0x28, 0xe1, 0xfc, 0x46, 0x90, 0x07, 0x27, 0x68, 0xd7, 0x92, 0x6d, + 0x43, 0xff, 0x6d, 0x9f, 0x39, 0xd8, 0xaf, 0x9e, 0x58, 0x4f, 0xd3, 0xc0, 0x59, 0x84, 0x67, 0x17, + 0xe1, 0x54, 0xe6, 0xea, 0x44, 0xd3, 0x50, 0xde, 0x21, 0x5c, 0x08, 0x1c, 0xc5, 0xf4, 0x27, 0x3a, + 0x09, 0x83, 0xbb, 0x4e, 0xab, 0x2b, 0x36, 0x26, 0xe6, 0x7f, 0xde, 0x2a, 0x5d, 0xb3, 0xec, 0xff, + 0xbe, 0x0c, 0x53, 0x8b, 0xf5, 0xd5, 0xc7, 0xda, 0xf5, 0xfa, 0xb1, 0x57, 0x2a, 0x3c, 0xf6, 0xe2, + 0x43, 0xb4, 0x9c, 0x7b, 0x88, 0xfe, 0x58, 0xc6, 0x96, 0x1d, 0x60, 0x5b, 0xf6, 0x8b, 0x39, 0x5b, + 0xf6, 0x09, 0x6f, 0xd4, 0xdd, 0x9c, 0x55, 0x3b, 0xc8, 0x26, 0x30, 0x53, 0x42, 0x62, 0xb2, 0x5f, + 0x92, 0xd5, 0x1e, 0x71, 0xe9, 0x3e, 0x99, 0x79, 0x6c, 0xc0, 0xf8, 0xa2, 0xd3, 0x71, 0xee, 0xbb, + 0x2d, 0x37, 0x72, 0x49, 0x88, 0x5e, 0x84, 0xb2, 0xd3, 0x6c, 0x32, 0xe9, 0x6e, 0x74, 0xe1, 0xd4, + 0xc1, 0x7e, 0xb5, 0x3c, 0xdf, 0xa4, 0x62, 0x06, 0x28, 0xac, 0x3d, 0x4c, 0x31, 0xd0, 0x67, 0x61, + 0xa0, 0x19, 0xf8, 0x9d, 0x4a, 0x89, 0x61, 0xd2, 0x5d, 0x3e, 0xb0, 0x14, 0xf8, 0x9d, 0x04, 0x2a, + 0xc3, 0xb1, 0x7f, 0xbb, 0x04, 0xe7, 0x16, 0x49, 0x67, 0x7b, 0xa5, 0x9e, 0x73, 0x5e, 0x5c, 0x86, + 0x91, 0xb6, 0xef, 0xb9, 0x91, 0x1f, 0x84, 0xa2, 0x69, 0xb6, 0x22, 0xd6, 0x44, 0x19, 0x56, 0x50, + 0x74, 0x11, 0x06, 0x3a, 0xb1, 0x10, 0x3b, 0x2e, 0x05, 0x60, 0x26, 0xbe, 0x32, 0x08, 0xc5, 0xe8, + 0x86, 0x24, 0x10, 0x2b, 0x46, 0x61, 0xdc, 0x09, 0x49, 0x80, 0x19, 0x24, 0x96, 0x04, 0xa8, 0x8c, + 0x20, 0x4e, 0x84, 0x84, 0x24, 0x40, 0x21, 0x58, 0xc3, 0x42, 0x35, 0x18, 0x0d, 0x13, 0x33, 0xdb, + 0xd7, 0xd6, 0x9c, 0x60, 0xa2, 0x82, 0x9a, 0xc9, 0x98, 0x88, 0x71, 0x82, 0x0d, 0xf5, 0x14, 0x15, + 0x7e, 0xa3, 0x04, 0x88, 0x0f, 0xe1, 0x9f, 0xb1, 0x81, 0xbb, 0x93, 0x1e, 0xb8, 0xfe, 0xb7, 0xc4, + 0x93, 0x1a, 0xbd, 0xff, 0xdb, 0x82, 0x73, 0x8b, 0xae, 0xd7, 0x24, 0x41, 0xce, 0x02, 0x7c, 0x3a, + 0x57, 0xf9, 0xa3, 0x09, 0x29, 0xc6, 0x12, 0x1b, 0x78, 0x02, 0x4b, 0xcc, 0xfe, 0xb7, 0x16, 0x20, + 0xfe, 0xd9, 0x9f, 0xb8, 0x8f, 0xbd, 0x93, 0xfe, 0xd8, 0x27, 0xb0, 0x2c, 0xec, 0x5b, 0x30, 0xb9, + 0xd8, 0x72, 0x89, 0x17, 0xad, 0xd6, 0x16, 0x7d, 0x6f, 0xd3, 0xdd, 0x42, 0x6f, 0xc1, 0x64, 0xe4, + 0xb6, 0x89, 0xdf, 0x8d, 0xea, 0xa4, 0xe1, 0x7b, 0xec, 0xe6, 0x6a, 0x5d, 0x1e, 0x5c, 0x40, 0x07, + 0xfb, 0xd5, 0xc9, 0x0d, 0x03, 0x82, 0x13, 0x98, 0xf6, 0xdf, 0xa5, 0x7c, 0xab, 0xd5, 0x0d, 0x23, + 0x12, 0x6c, 0x04, 0xdd, 0x30, 0x5a, 0xe8, 0x52, 0xd9, 0xb3, 0x16, 0xf8, 0xb4, 0x3b, 0xae, 0xef, + 0xa1, 0x73, 0xc6, 0x75, 0x7c, 0x44, 0x5e, 0xc5, 0xc5, 0xb5, 0x7b, 0x0e, 0x20, 0x74, 0xb7, 0x3c, + 0x12, 0x68, 0xd7, 0x87, 0x49, 0xb6, 0x55, 0x54, 0x29, 0xd6, 0x30, 0x50, 0x0b, 0x26, 0x5a, 0xce, + 0x7d, 0xd2, 0xaa, 0x93, 0x16, 0x69, 0x44, 0x7e, 0x20, 0xf4, 0x1b, 0xaf, 0xf7, 0x77, 0x0f, 0xb8, + 0xa5, 0x57, 0x5d, 0x98, 0x39, 0xd8, 0xaf, 0x4e, 0x18, 0x45, 0xd8, 0x24, 0x4e, 0x59, 0x87, 0xdf, + 0xa1, 0x5f, 0xe1, 0xb4, 0xf4, 0xcb, 0xe7, 0x6d, 0x51, 0x86, 0x15, 0x54, 0xb1, 0x8e, 0x81, 0x3c, + 0xd6, 0x61, 0xff, 0x4b, 0xba, 0xd0, 0xfc, 0x76, 0xc7, 0xf7, 0x88, 0x17, 0x2d, 0xfa, 0x5e, 0x93, + 0x6b, 0xa6, 0xde, 0x32, 0x54, 0x27, 0x97, 0x12, 0xaa, 0x93, 0xd3, 0xe9, 0x1a, 0x9a, 0xf6, 0xe4, + 0x8b, 0x30, 0x14, 0x46, 0x4e, 0xd4, 0x0d, 0xc5, 0xc0, 0x3d, 0x2b, 0x97, 0x5d, 0x9d, 0x95, 0x1e, + 0xee, 0x57, 0xa7, 0x54, 0x35, 0x5e, 0x84, 0x45, 0x05, 0xf4, 0x12, 0x0c, 0xb7, 0x49, 0x18, 0x3a, + 0x5b, 0x52, 0x6c, 0x98, 0x12, 0x75, 0x87, 0xd7, 0x78, 0x31, 0x96, 0x70, 0xf4, 0x1c, 0x0c, 0x92, + 0x20, 0xf0, 0x03, 0xf1, 0x6d, 0x13, 0x02, 0x71, 0x70, 0x99, 0x16, 0x62, 0x0e, 0xb3, 0xff, 0x27, + 0x0b, 0xa6, 0x54, 0x5f, 0x79, 0x5b, 0xc7, 0x70, 0x5d, 0xfb, 0x2a, 0x40, 0x43, 0x7e, 0x60, 0xc8, + 0x8e, 0xd9, 0xb1, 0xd7, 0x2e, 0x65, 0x4a, 0x34, 0xa9, 0x61, 0x8c, 0x29, 0xab, 0xa2, 0x10, 0x6b, + 0xd4, 0xec, 0xdf, 0xb4, 0xe0, 0x44, 0xe2, 0x8b, 0x6e, 0xb9, 0x61, 0x84, 0x3e, 0x4c, 0x7d, 0xd5, + 0x5c, 0x9f, 0x8b, 0xcf, 0x0d, 0xf9, 0x37, 0xa9, 0x3d, 0x2f, 0x4b, 0xb4, 0x2f, 0xba, 0x01, 0x83, + 0x6e, 0x44, 0xda, 0xf2, 0x63, 0x9e, 0x2b, 0xfc, 0x18, 0xde, 0xab, 0x78, 0x46, 0x56, 0x69, 0x4d, + 0xcc, 0x09, 0xd8, 0xbf, 0x5d, 0x86, 0x51, 0xbe, 0xbf, 0xd7, 0x9c, 0xce, 0x31, 0xcc, 0xc5, 0xcb, + 0x30, 0xea, 0xb6, 0xdb, 0xdd, 0xc8, 0xb9, 0x2f, 0xce, 0xbd, 0x11, 0xce, 0x83, 0x56, 0x65, 0x21, + 0x8e, 0xe1, 0x68, 0x15, 0x06, 0x58, 0x57, 0xf8, 0x57, 0xbe, 0x98, 0xfd, 0x95, 0xa2, 0xef, 0x73, + 0x4b, 0x4e, 0xe4, 0x70, 0x91, 0x53, 0xed, 0x2b, 0x5a, 0x84, 0x19, 0x09, 0xe4, 0x00, 0xdc, 0x77, + 0x3d, 0x27, 0xd8, 0xa3, 0x65, 0x95, 0x32, 0x23, 0xf8, 0x6a, 0x31, 0xc1, 0x05, 0x85, 0xcf, 0xc9, + 0xaa, 0x0f, 0x8b, 0x01, 0x58, 0x23, 0x3a, 0xfb, 0x05, 0x18, 0x55, 0xc8, 0x47, 0x91, 0x1c, 0x67, + 0xbf, 0x04, 0x53, 0x89, 0xb6, 0x7a, 0x55, 0x1f, 0xd7, 0x05, 0xcf, 0x7f, 0xcc, 0x58, 0x86, 0xe8, + 0xf5, 0xb2, 0xb7, 0x2b, 0xce, 0xa6, 0x47, 0x70, 0xb2, 0x95, 0xc1, 0xf2, 0xc5, 0xbc, 0xf6, 0x7f, + 0x44, 0x9c, 0x13, 0x9f, 0x7d, 0x32, 0x0b, 0x8a, 0x33, 0xdb, 0x30, 0x38, 0x62, 0xa9, 0x88, 0x23, + 0x52, 0x7e, 0x77, 0x52, 0x75, 0xfe, 0x26, 0xd9, 0x53, 0x4c, 0xf5, 0x07, 0xd9, 0xfd, 0xf3, 0x7c, + 0xf4, 0x39, 0xbb, 0x1c, 0x13, 0x04, 0xca, 0x37, 0xc9, 0x1e, 0x9f, 0x0a, 0xfd, 0xeb, 0xca, 0x85, + 0x5f, 0xf7, 0x2b, 0x16, 0x4c, 0xa8, 0xaf, 0x3b, 0x06, 0xbe, 0xb0, 0x60, 0xf2, 0x85, 0xf3, 0x85, + 0x0b, 0x3c, 0x87, 0x23, 0xfc, 0x46, 0x09, 0xce, 0x2a, 0x1c, 0x7a, 0x89, 0xe2, 0x7f, 0xc4, 0xaa, + 0xba, 0x02, 0xa3, 0x9e, 0x52, 0x27, 0x5a, 0xa6, 0x1e, 0x2f, 0x56, 0x26, 0xc6, 0x38, 0xf4, 0xc8, + 0xf3, 0xe2, 0x43, 0x7b, 0x5c, 0xd7, 0xb3, 0x8b, 0xc3, 0x7d, 0x01, 0xca, 0x5d, 0xb7, 0x29, 0x0e, + 0x98, 0xcf, 0xc9, 0xd1, 0xbe, 0xb3, 0xba, 0x74, 0xb8, 0x5f, 0x7d, 0x36, 0xcf, 0xe4, 0x44, 0x4f, + 0xb6, 0x70, 0xee, 0xce, 0xea, 0x12, 0xa6, 0x95, 0xd1, 0x3c, 0x4c, 0x49, 0xab, 0xda, 0x5d, 0x2a, + 0x97, 0xfa, 0x9e, 0x38, 0x87, 0x94, 0xb2, 0x1c, 0x9b, 0x60, 0x9c, 0xc4, 0x47, 0x4b, 0x30, 0xbd, + 0xd3, 0xbd, 0x4f, 0x5a, 0x24, 0xe2, 0x1f, 0x7c, 0x93, 0x70, 0x55, 0xf2, 0x68, 0x7c, 0x85, 0xbd, + 0x99, 0x80, 0xe3, 0x54, 0x0d, 0xfb, 0x4f, 0xd9, 0x79, 0x20, 0x46, 0x4f, 0x93, 0x6f, 0x7e, 0x90, + 0xcb, 0xb9, 0x9f, 0x55, 0x71, 0x93, 0xec, 0x6d, 0xf8, 0x54, 0x0e, 0xc9, 0x5e, 0x15, 0xc6, 0x9a, + 0x1f, 0x28, 0x5c, 0xf3, 0xbf, 0x56, 0x82, 0x53, 0x6a, 0x04, 0x0c, 0x69, 0xf9, 0xcf, 0xfa, 0x18, + 0x5c, 0x85, 0xb1, 0x26, 0xd9, 0x74, 0xba, 0xad, 0x48, 0xd9, 0x35, 0x06, 0xb9, 0xa9, 0x6d, 0x29, + 0x2e, 0xc6, 0x3a, 0xce, 0x11, 0x86, 0xed, 0x6f, 0x4d, 0xb2, 0x83, 0x38, 0x72, 0xe8, 0x1a, 0x57, + 0xbb, 0xc6, 0xca, 0xdd, 0x35, 0xcf, 0xc1, 0xa0, 0xdb, 0xa6, 0x82, 0x59, 0xc9, 0x94, 0xb7, 0x56, + 0x69, 0x21, 0xe6, 0x30, 0xf4, 0x02, 0x0c, 0x37, 0xfc, 0x76, 0xdb, 0xf1, 0x9a, 0xec, 0xc8, 0x1b, + 0x5d, 0x18, 0xa3, 0xb2, 0xdb, 0x22, 0x2f, 0xc2, 0x12, 0x46, 0x85, 0x6f, 0x27, 0xd8, 0xe2, 0xca, + 0x1e, 0x21, 0x7c, 0xcf, 0x07, 0x5b, 0x21, 0x66, 0xa5, 0xf4, 0xae, 0xfa, 0xc0, 0x0f, 0x76, 0x5c, + 0x6f, 0x6b, 0xc9, 0x0d, 0xc4, 0x96, 0x50, 0x67, 0xe1, 0x3d, 0x05, 0xc1, 0x1a, 0x16, 0x5a, 0x81, + 0xc1, 0x8e, 0x1f, 0x44, 0x61, 0x65, 0x88, 0x0d, 0xf7, 0xb3, 0x39, 0x8c, 0x88, 0x7f, 0x6d, 0xcd, + 0x0f, 0xa2, 0xf8, 0x03, 0xe8, 0xbf, 0x10, 0xf3, 0xea, 0xe8, 0x16, 0x0c, 0x13, 0x6f, 0x77, 0x25, + 0xf0, 0xdb, 0x95, 0x13, 0xf9, 0x94, 0x96, 0x39, 0x0a, 0x5f, 0x66, 0xb1, 0x8c, 0x2a, 0x8a, 0xb1, + 0x24, 0x81, 0xbe, 0x08, 0x65, 0xe2, 0xed, 0x56, 0x86, 0x19, 0xa5, 0xd9, 0x1c, 0x4a, 0x77, 0x9d, + 0x20, 0xe6, 0xf9, 0xcb, 0xde, 0x2e, 0xa6, 0x75, 0xd0, 0x57, 0x60, 0x54, 0x32, 0x8c, 0x50, 0x68, + 0x51, 0x33, 0x17, 0xac, 0x64, 0x33, 0x98, 0x7c, 0xd4, 0x75, 0x03, 0xd2, 0x26, 0x5e, 0x14, 0xc6, + 0x1c, 0x52, 0x42, 0x43, 0x1c, 0x53, 0x43, 0x0d, 0x18, 0x0f, 0x48, 0xe8, 0x3e, 0x22, 0x35, 0xbf, + 0xe5, 0x36, 0xf6, 0x2a, 0x67, 0x58, 0xf7, 0x5e, 0x2a, 0x1c, 0x32, 0xac, 0x55, 0x88, 0xb5, 0xfc, + 0x7a, 0x29, 0x36, 0x88, 0xa2, 0x0f, 0x60, 0x22, 0x20, 0x61, 0xe4, 0x04, 0x91, 0x68, 0xa5, 0xa2, + 0xac, 0x72, 0x13, 0x58, 0x07, 0xf0, 0xeb, 0x44, 0xdc, 0x4c, 0x0c, 0xc1, 0x26, 0x05, 0x14, 0x01, + 0x32, 0x0a, 0x70, 0xb7, 0x45, 0xc2, 0xca, 0xd9, 0x7c, 0x6b, 0x66, 0x92, 0x2c, 0xad, 0xb0, 0x30, + 0x2b, 0x3a, 0x8f, 0x70, 0x8a, 0x16, 0xce, 0xa0, 0x8f, 0xbe, 0x22, 0x0d, 0x1d, 0x6b, 0x7e, 0xd7, + 0x8b, 0xc2, 0xca, 0x28, 0x6b, 0x2f, 0xd3, 0x22, 0x7e, 0x37, 0xc6, 0x4b, 0x5a, 0x42, 0x78, 0x65, + 0x6c, 0x90, 0x42, 0x5f, 0x87, 0x09, 0xfe, 0x9f, 0x1b, 0x72, 0xc3, 0xca, 0x29, 0x46, 0xfb, 0x62, + 0x3e, 0x6d, 0x8e, 0xb8, 0x70, 0x4a, 0x10, 0x9f, 0xd0, 0x4b, 0x43, 0x6c, 0x52, 0x43, 0x18, 0x26, + 0x5a, 0xee, 0x2e, 0xf1, 0x48, 0x18, 0xd6, 0x02, 0xff, 0x3e, 0x11, 0x7a, 0xe9, 0xb3, 0xd9, 0x86, + 0x5f, 0xff, 0x3e, 0x11, 0x57, 0x4f, 0xbd, 0x0e, 0x36, 0x49, 0xa0, 0x3b, 0x30, 0x19, 0x10, 0xa7, + 0xe9, 0xc6, 0x44, 0xc7, 0x7a, 0x11, 0x65, 0xd7, 0x75, 0x6c, 0x54, 0xc2, 0x09, 0x22, 0xe8, 0x36, + 0x8c, 0xb3, 0x81, 0xef, 0x76, 0x38, 0xd1, 0xd3, 0xbd, 0x88, 0x32, 0x37, 0x86, 0xba, 0x56, 0x05, + 0x1b, 0x04, 0xd0, 0xfb, 0x30, 0xda, 0x72, 0x37, 0x49, 0x63, 0xaf, 0xd1, 0x22, 0x95, 0x71, 0x46, + 0x2d, 0x93, 0x05, 0xdf, 0x92, 0x48, 0xfc, 0x56, 0xa0, 0xfe, 0xe2, 0xb8, 0x3a, 0xba, 0x0b, 0xa7, + 0x23, 0x12, 0xb4, 0x5d, 0xcf, 0xa1, 0xac, 0x53, 0x5c, 0x44, 0x99, 0x3d, 0x7e, 0x82, 0xad, 0xe9, + 0x0b, 0x62, 0x36, 0x4e, 0x6f, 0x64, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x21, 0x54, 0x32, 0x20, 0x7c, + 0xb7, 0x9c, 0x64, 0x94, 0xdf, 0x11, 0x94, 0x2b, 0x1b, 0x39, 0x78, 0x87, 0x05, 0x30, 0x9c, 0x4b, + 0x1d, 0xdd, 0x86, 0x29, 0xc6, 0xaf, 0x6b, 0xdd, 0x56, 0x4b, 0x34, 0x38, 0xc9, 0x1a, 0x7c, 0x41, + 0x4a, 0x2f, 0xab, 0x26, 0xf8, 0x70, 0xbf, 0x0a, 0xf1, 0x3f, 0x9c, 0xac, 0x8d, 0xee, 0x33, 0xd3, + 0x6f, 0x37, 0x70, 0xa3, 0x3d, 0xba, 0xe9, 0xc8, 0xc3, 0xa8, 0x32, 0x55, 0xa8, 0x06, 0xd3, 0x51, + 0x95, 0x7d, 0x58, 0x2f, 0xc4, 0x49, 0x82, 0xf4, 0x00, 0x0a, 0xa3, 0xa6, 0xeb, 0x55, 0xa6, 0xf9, + 0x2d, 0x4e, 0xf2, 0xef, 0x3a, 0x2d, 0xc4, 0x1c, 0xc6, 0xcc, 0xbe, 0xf4, 0xc7, 0x6d, 0x7a, 0xce, + 0xcf, 0x30, 0xc4, 0xd8, 0xec, 0x2b, 0x01, 0x38, 0xc6, 0xa1, 0xa2, 0x77, 0x14, 0xed, 0x55, 0x10, + 0x43, 0x55, 0x6c, 0x78, 0x63, 0xe3, 0x2b, 0x98, 0x96, 0xdb, 0xbf, 0x6b, 0xc1, 0x45, 0xc5, 0x46, + 0x96, 0x1f, 0x46, 0xc4, 0x6b, 0x92, 0xa6, 0xce, 0x73, 0x49, 0x18, 0xa1, 0xb7, 0x61, 0xa2, 0x21, + 0x71, 0x34, 0x13, 0xb5, 0xda, 0xa5, 0x8b, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x1a, 0xe3, 0xc6, 0x8c, + 0x9e, 0xa6, 0x6c, 0xd2, 0x59, 0xac, 0x82, 0x61, 0x03, 0x13, 0xbd, 0x09, 0x63, 0x01, 0xef, 0x01, + 0xab, 0x58, 0x36, 0x3d, 0x25, 0x70, 0x0c, 0xc2, 0x3a, 0x9e, 0x7d, 0x1f, 0x26, 0x55, 0x87, 0xd8, + 0x34, 0xa3, 0x2a, 0x0c, 0x32, 0xf9, 0x59, 0xe8, 0xa1, 0x47, 0xe9, 0xa8, 0x32, 0xd9, 0x1a, 0xf3, + 0x72, 0x36, 0xaa, 0xee, 0x23, 0xb2, 0xb0, 0x17, 0x11, 0xae, 0xd4, 0x29, 0x6b, 0xa3, 0x2a, 0x01, + 0x38, 0xc6, 0xb1, 0xff, 0x7f, 0x7e, 0x0f, 0x89, 0x8f, 0xdb, 0x3e, 0x04, 0x8c, 0x57, 0x60, 0x84, + 0x79, 0xd0, 0xf8, 0x01, 0x37, 0x73, 0x0f, 0xc6, 0x37, 0x8f, 0x1b, 0xa2, 0x1c, 0x2b, 0x0c, 0x63, + 0xcc, 0x59, 0x15, 0x2e, 0x1d, 0xa5, 0xc7, 0x9c, 0xd5, 0x33, 0x71, 0xd1, 0x35, 0x18, 0x61, 0xce, + 0x62, 0x0d, 0xbf, 0x25, 0xc4, 0x76, 0x29, 0xe2, 0x8d, 0xd4, 0x44, 0xf9, 0xa1, 0xf6, 0x1b, 0x2b, + 0x6c, 0x74, 0x09, 0x86, 0x68, 0x17, 0x56, 0x6b, 0x42, 0x2e, 0x51, 0x2a, 0xd5, 0x1b, 0xac, 0x14, + 0x0b, 0xa8, 0xfd, 0x9b, 0x16, 0x13, 0x4a, 0xd3, 0x87, 0x27, 0xba, 0x91, 0x98, 0x6f, 0x3e, 0x20, + 0xcf, 0x67, 0xcd, 0xf7, 0x61, 0xf1, 0xfc, 0x7f, 0x35, 0x79, 0xc4, 0xf2, 0xa5, 0xf3, 0x86, 0x1c, + 0x82, 0xe4, 0x31, 0xfb, 0x4c, 0xbc, 0x6e, 0x69, 0x7f, 0x8a, 0xce, 0x5a, 0xfb, 0xb7, 0xf8, 0x35, + 0x39, 0x75, 0x7c, 0xa2, 0x25, 0x18, 0x72, 0xd8, 0x0d, 0x43, 0x74, 0xfc, 0x15, 0x39, 0x00, 0xf3, + 0xac, 0xf4, 0x50, 0xd8, 0xab, 0x93, 0xf5, 0x38, 0x14, 0x8b, 0xba, 0xe8, 0x9b, 0x30, 0x4a, 0x1e, + 0xba, 0xd1, 0xa2, 0xdf, 0x14, 0x0b, 0xca, 0xd4, 0x95, 0x16, 0x9e, 0xe0, 0xb7, 0xbd, 0x65, 0x59, + 0x95, 0x33, 0x6d, 0xf5, 0x17, 0xc7, 0x44, 0xed, 0x9f, 0xb3, 0xa0, 0xda, 0xa3, 0x36, 0xba, 0x47, + 0x85, 0x65, 0x12, 0x38, 0x91, 0x2f, 0xed, 0x9e, 0x6f, 0xcb, 0x65, 0x70, 0x5b, 0x94, 0x1f, 0xee, + 0x57, 0x5f, 0xec, 0x41, 0x46, 0xa2, 0x62, 0x45, 0x0c, 0xd9, 0x30, 0xc4, 0xd4, 0x25, 0x5c, 0xfa, + 0x1f, 0xe4, 0xc6, 0xcf, 0xbb, 0xac, 0x04, 0x0b, 0x88, 0xfd, 0x57, 0x4a, 0xda, 0x3e, 0xac, 0x47, + 0x4e, 0x44, 0x50, 0x0d, 0x86, 0x1f, 0x38, 0x6e, 0xe4, 0x7a, 0x5b, 0xe2, 0x8a, 0x52, 0x2c, 0x93, + 0xb1, 0x4a, 0xf7, 0x78, 0x05, 0x2e, 0x68, 0x8b, 0x3f, 0x58, 0x92, 0xa1, 0x14, 0x83, 0xae, 0xe7, + 0x51, 0x8a, 0xa5, 0x7e, 0x29, 0x62, 0x5e, 0x81, 0x53, 0x14, 0x7f, 0xb0, 0x24, 0x83, 0x3e, 0x04, + 0x90, 0xc7, 0x0a, 0x69, 0x0a, 0x35, 0xf7, 0x2b, 0xbd, 0x89, 0x6e, 0xa8, 0x3a, 0x5c, 0x8f, 0x1e, + 0xff, 0xc7, 0x1a, 0x3d, 0x3b, 0xd2, 0x76, 0x8d, 0xde, 0x19, 0xf4, 0x35, 0xca, 0xd7, 0x9d, 0x20, + 0x22, 0xcd, 0xf9, 0x48, 0x0c, 0xce, 0x67, 0xfb, 0xd3, 0x63, 0x6c, 0xb8, 0x6d, 0xa2, 0x9f, 0x01, + 0x82, 0x08, 0x8e, 0xe9, 0xd9, 0xbf, 0x5e, 0x86, 0x4a, 0x5e, 0x77, 0x29, 0x5b, 0x92, 0xab, 0x4a, + 0xd8, 0x1f, 0x14, 0x5b, 0x92, 0x4b, 0x00, 0x2b, 0x0c, 0xca, 0x1f, 0x42, 0x77, 0x4b, 0xaa, 0xa1, + 0x06, 0x63, 0xfe, 0x50, 0x67, 0xa5, 0x58, 0x40, 0x29, 0x5e, 0x40, 0x9c, 0x50, 0xf8, 0x89, 0x6a, + 0x7c, 0x04, 0xb3, 0x52, 0x2c, 0xa0, 0xba, 0x42, 0x7c, 0xa0, 0x87, 0x42, 0xdc, 0x18, 0xa2, 0xc1, + 0x27, 0x3b, 0x44, 0xe8, 0x1b, 0x00, 0x9b, 0xae, 0xe7, 0x86, 0xdb, 0x8c, 0xfa, 0xd0, 0x91, 0xa9, + 0xab, 0xfb, 0xdb, 0x8a, 0xa2, 0x82, 0x35, 0x8a, 0xf4, 0x2c, 0x53, 0x2c, 0x7a, 0x75, 0x89, 0x79, + 0xa9, 0x68, 0x67, 0x59, 0x7c, 0x5e, 0x2d, 0x61, 0x1d, 0xcf, 0xfe, 0x56, 0x72, 0xbd, 0x88, 0x1d, + 0xa0, 0x8d, 0xaf, 0xd5, 0xef, 0xf8, 0x96, 0x8a, 0xc7, 0xd7, 0xfe, 0x17, 0xa3, 0x30, 0x65, 0x34, + 0xd6, 0x0d, 0xfb, 0x38, 0xd5, 0xae, 0x53, 0xa9, 0xc5, 0x89, 0x88, 0xd8, 0x7f, 0x76, 0xef, 0xad, + 0xa2, 0x4b, 0x36, 0x74, 0x07, 0xf0, 0xfa, 0xe8, 0x1b, 0x30, 0xda, 0x72, 0x42, 0xa6, 0x5c, 0x27, + 0x62, 0xdf, 0xf5, 0x43, 0x2c, 0xd6, 0x5d, 0x38, 0x61, 0xa4, 0x89, 0x8a, 0x9c, 0x76, 0x4c, 0x92, + 0x8a, 0x57, 0x54, 0x28, 0x97, 0x8e, 0xc8, 0xaa, 0x13, 0x54, 0x72, 0xdf, 0xc3, 0x1c, 0x26, 0x84, + 0x15, 0xba, 0x2a, 0x16, 0xe9, 0x15, 0x86, 0x2d, 0xb3, 0x41, 0x43, 0x58, 0x51, 0x30, 0x6c, 0x60, + 0xc6, 0xea, 0x83, 0xa1, 0x02, 0xf5, 0xc1, 0x4b, 0x30, 0xcc, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0x63, + 0x95, 0x17, 0x63, 0x09, 0x4f, 0x2e, 0x98, 0x91, 0xfe, 0x16, 0x0c, 0x7a, 0x01, 0x86, 0xc5, 0xa2, + 0x66, 0x1e, 0x42, 0x23, 0x9c, 0xcb, 0x89, 0x25, 0x8f, 0x25, 0x0c, 0xfd, 0xbc, 0x05, 0xc8, 0x69, + 0xb5, 0xfc, 0x06, 0xe3, 0x50, 0xea, 0x1e, 0x0e, 0xec, 0x7e, 0xf6, 0x76, 0xcf, 0x61, 0xef, 0x86, + 0x73, 0xf3, 0xa9, 0xda, 0x5c, 0xa9, 0xff, 0x96, 0xbc, 0x7e, 0xa6, 0x11, 0xf4, 0xe3, 0xfe, 0x96, + 0x1b, 0x46, 0xdf, 0xfe, 0x57, 0x89, 0xe3, 0x3f, 0xa3, 0x4b, 0xe8, 0x8e, 0xae, 0x27, 0x18, 0x3b, + 0xa2, 0x9e, 0x60, 0x22, 0x57, 0x47, 0xf0, 0xe7, 0x12, 0xb7, 0xde, 0x71, 0xf6, 0xe5, 0x2f, 0xf4, + 0xb8, 0xf5, 0x0a, 0xcb, 0x4f, 0x3f, 0x77, 0xdf, 0x9a, 0x70, 0x59, 0x98, 0x60, 0x5d, 0x2e, 0xd6, + 0xd7, 0xdc, 0x09, 0x49, 0xb0, 0x70, 0x56, 0x7a, 0x34, 0x1c, 0xea, 0xd2, 0x9d, 0xe6, 0xe2, 0xf0, + 0xe3, 0x16, 0x54, 0xd2, 0x03, 0xc4, 0xbb, 0x54, 0x99, 0x64, 0xfd, 0xb7, 0x8b, 0x46, 0x46, 0x74, + 0x5e, 0x7a, 0x66, 0x57, 0xe6, 0x73, 0x68, 0xe1, 0xdc, 0x56, 0xd0, 0x35, 0x80, 0x30, 0xf2, 0x3b, + 0x9c, 0xd7, 0xb3, 0x1b, 0xd0, 0x28, 0xf3, 0x0d, 0x82, 0xba, 0x2a, 0x3d, 0x8c, 0xcf, 0x02, 0x0d, + 0x77, 0xb6, 0x0b, 0x67, 0x72, 0x56, 0x4c, 0x86, 0x69, 0x66, 0x49, 0x37, 0xcd, 0xf4, 0x50, 0xe8, + 0xcf, 0xc9, 0x39, 0x9d, 0xfb, 0xa0, 0xeb, 0x78, 0x91, 0x1b, 0xed, 0xe9, 0xa6, 0x1c, 0x0f, 0xcc, + 0xa1, 0x44, 0x5f, 0x87, 0xc1, 0x96, 0xeb, 0x75, 0x1f, 0x8a, 0x33, 0xf6, 0x52, 0xf6, 0x9d, 0xd9, + 0xeb, 0x3e, 0x34, 0x27, 0xa7, 0x4a, 0xb7, 0x32, 0x2b, 0x3f, 0xdc, 0xaf, 0xa2, 0x34, 0x02, 0xe6, + 0x54, 0xed, 0xcf, 0xc2, 0xe4, 0x92, 0x43, 0xda, 0xbe, 0xb7, 0xec, 0x35, 0x3b, 0xbe, 0xeb, 0x45, + 0xa8, 0x02, 0x03, 0x4c, 0x7c, 0xe7, 0x47, 0xeb, 0x00, 0x1d, 0x7c, 0xcc, 0x4a, 0xec, 0x2d, 0x38, + 0xb5, 0xe4, 0x3f, 0xf0, 0x1e, 0x38, 0x41, 0x73, 0xbe, 0xb6, 0xaa, 0xa9, 0xb6, 0xd7, 0xa5, 0x6a, + 0xd5, 0xca, 0x57, 0x5c, 0x69, 0x35, 0xf9, 0x22, 0x5c, 0x71, 0x5b, 0x24, 0xc7, 0x00, 0xf1, 0xd7, + 0x4b, 0x46, 0x4b, 0x31, 0xbe, 0x32, 0x9f, 0x5b, 0xb9, 0x9e, 0x37, 0x1f, 0xc0, 0xc8, 0xa6, 0x4b, + 0x5a, 0x4d, 0x4c, 0x36, 0xc5, 0x6c, 0xbc, 0x98, 0xef, 0x9b, 0xbb, 0x42, 0x31, 0x95, 0x9d, 0x9f, + 0x29, 0x66, 0x57, 0x44, 0x65, 0xac, 0xc8, 0xa0, 0x1d, 0x98, 0x96, 0x73, 0x26, 0xa1, 0x82, 0xdf, + 0xbf, 0x54, 0xb4, 0x7c, 0x4d, 0xe2, 0xec, 0x9d, 0x02, 0x4e, 0x90, 0xc1, 0x29, 0xc2, 0xe8, 0x1c, + 0x0c, 0xb4, 0xa9, 0x64, 0x33, 0xc0, 0x86, 0x9f, 0x69, 0x62, 0x99, 0x52, 0x99, 0x95, 0xda, 0x7f, + 0xc3, 0x82, 0x33, 0xa9, 0x91, 0x11, 0xca, 0xf5, 0x27, 0x3c, 0x0b, 0x49, 0x65, 0x77, 0xa9, 0xb7, + 0xb2, 0xdb, 0xfe, 0x2f, 0x2c, 0x38, 0xb9, 0xdc, 0xee, 0x44, 0x7b, 0x4b, 0xae, 0xe9, 0x26, 0xf3, + 0x05, 0x18, 0x6a, 0x93, 0xa6, 0xdb, 0x6d, 0x8b, 0x99, 0xab, 0xca, 0xd3, 0x7f, 0x8d, 0x95, 0x52, + 0x0e, 0x52, 0x8f, 0xfc, 0xc0, 0xd9, 0x22, 0xbc, 0x00, 0x0b, 0x74, 0x26, 0x43, 0xb9, 0x8f, 0xc8, + 0x2d, 0xb7, 0xed, 0x46, 0x8f, 0xb7, 0xbb, 0x84, 0x87, 0x8b, 0x24, 0x82, 0x63, 0x7a, 0xf6, 0xf7, + 0x2d, 0x98, 0x92, 0xeb, 0x7e, 0xbe, 0xd9, 0x0c, 0x48, 0x18, 0xa2, 0x59, 0x28, 0xb9, 0x1d, 0xd1, + 0x4b, 0x10, 0xbd, 0x2c, 0xad, 0xd6, 0x70, 0xc9, 0xed, 0xc8, 0x0b, 0xb1, 0x17, 0x5f, 0xee, 0x8d, + 0x0b, 0xb1, 0xc7, 0xde, 0x4c, 0x48, 0x0c, 0x74, 0x19, 0x46, 0x3c, 0xbf, 0xc9, 0xef, 0x94, 0xc2, + 0xdd, 0x83, 0x62, 0xae, 0x8b, 0x32, 0xac, 0xa0, 0xa8, 0x06, 0xa3, 0xdc, 0x15, 0x3c, 0x5e, 0xb4, + 0x7d, 0x39, 0x94, 0xb3, 0x2f, 0xdb, 0x90, 0x35, 0x71, 0x4c, 0xc4, 0xfe, 0xa7, 0x16, 0x8c, 0xcb, + 0x2f, 0xeb, 0xf3, 0xb6, 0x4f, 0xb7, 0x56, 0x7c, 0xd3, 0x8f, 0xb7, 0x16, 0xbd, 0xad, 0x33, 0x88, + 0x71, 0x49, 0x2f, 0x1f, 0xe9, 0x92, 0x7e, 0x15, 0xc6, 0x9c, 0x4e, 0xa7, 0x66, 0xde, 0xf0, 0xd9, + 0x52, 0x9a, 0x8f, 0x8b, 0xb1, 0x8e, 0x63, 0xff, 0x6c, 0x09, 0x26, 0xe5, 0x17, 0xd4, 0xbb, 0xf7, + 0x43, 0x12, 0xa1, 0x0d, 0x18, 0x75, 0xf8, 0x2c, 0x11, 0xb9, 0xc8, 0x9f, 0xcb, 0x56, 0xe1, 0x1b, + 0x53, 0x1a, 0x0b, 0xd2, 0xf3, 0xb2, 0x36, 0x8e, 0x09, 0xa1, 0x16, 0xcc, 0x78, 0x7e, 0xc4, 0x84, + 0x2a, 0x05, 0x2f, 0xf2, 0xaa, 0x48, 0x52, 0x3f, 0x2b, 0xa8, 0xcf, 0xac, 0x27, 0xa9, 0xe0, 0x34, + 0x61, 0xb4, 0x2c, 0xcd, 0x22, 0xe5, 0x7c, 0xcd, 0xb2, 0x3e, 0x71, 0xd9, 0x56, 0x11, 0xfb, 0x9f, + 0x58, 0x30, 0x2a, 0xd1, 0x8e, 0xc3, 0x81, 0x66, 0x0d, 0x86, 0x43, 0x36, 0x09, 0x72, 0x68, 0xec, + 0xa2, 0x8e, 0xf3, 0xf9, 0x8a, 0x65, 0x45, 0xfe, 0x3f, 0xc4, 0x92, 0x06, 0xb3, 0x8a, 0xab, 0xee, + 0x7f, 0x42, 0xac, 0xe2, 0xaa, 0x3f, 0x39, 0x87, 0xd2, 0xbf, 0x61, 0x7d, 0xd6, 0xcc, 0x4c, 0xf4, + 0x4a, 0xd3, 0x09, 0xc8, 0xa6, 0xfb, 0x30, 0x79, 0xa5, 0xa9, 0xb1, 0x52, 0x2c, 0xa0, 0xe8, 0x43, + 0x18, 0x6f, 0x48, 0x73, 0x68, 0xbc, 0xc3, 0x2f, 0x15, 0x9a, 0xe6, 0x95, 0x17, 0x07, 0x57, 0xac, + 0x2f, 0x6a, 0xf5, 0xb1, 0x41, 0xcd, 0x74, 0x75, 0x2c, 0xf7, 0x72, 0x75, 0x8c, 0xe9, 0xe6, 0x3b, + 0xfe, 0xfd, 0x9c, 0x05, 0x43, 0xdc, 0x0c, 0xd6, 0x9f, 0x15, 0x52, 0x73, 0x6a, 0x89, 0xc7, 0x8e, + 0x29, 0x57, 0x84, 0x64, 0x83, 0xd6, 0x60, 0x94, 0xfd, 0x60, 0x66, 0xbc, 0x72, 0xfe, 0xc3, 0x48, + 0xde, 0xaa, 0xde, 0xc1, 0xbb, 0xb2, 0x1a, 0x8e, 0x29, 0xd8, 0x7f, 0x54, 0xa6, 0xdc, 0x2d, 0x46, + 0x35, 0x0e, 0x7d, 0xeb, 0xe9, 0x1d, 0xfa, 0xa5, 0xa7, 0x75, 0xe8, 0x6f, 0xc1, 0x54, 0x43, 0x73, + 0x81, 0x89, 0x67, 0xf2, 0x72, 0xe1, 0x22, 0xd1, 0xbc, 0x65, 0xb8, 0xca, 0x7e, 0xd1, 0x24, 0x82, + 0x93, 0x54, 0xd1, 0xd7, 0x60, 0x9c, 0xcf, 0xb3, 0x68, 0x85, 0x7b, 0x8b, 0xbe, 0x90, 0xbf, 0x5e, + 0xf4, 0x26, 0xb8, 0x89, 0x47, 0xab, 0x8e, 0x0d, 0x62, 0xa8, 0x0e, 0xb0, 0xe9, 0xb6, 0x88, 0x20, + 0x5d, 0xe0, 0xd8, 0xbd, 0xc2, 0xb1, 0x14, 0xe1, 0x49, 0xae, 0x87, 0x90, 0x55, 0xb1, 0x46, 0xc6, + 0xfe, 0x77, 0x16, 0xa0, 0xe5, 0xce, 0x36, 0x69, 0x93, 0xc0, 0x69, 0xc5, 0xe6, 0xf1, 0x9f, 0xb4, + 0xa0, 0x42, 0x52, 0xc5, 0x8b, 0x7e, 0xbb, 0x2d, 0x34, 0x0c, 0x39, 0x4a, 0xb0, 0xe5, 0x9c, 0x3a, + 0xf1, 0x2d, 0x23, 0x0f, 0x03, 0xe7, 0xb6, 0x87, 0xd6, 0xe0, 0x04, 0x3f, 0x7a, 0x0d, 0xbb, 0x82, + 0xd8, 0x11, 0xcf, 0x08, 0xc2, 0x27, 0x36, 0xd2, 0x28, 0x38, 0xab, 0x9e, 0xfd, 0x0f, 0x26, 0x21, + 0xb7, 0x17, 0x9f, 0xfa, 0x05, 0x7c, 0xea, 0x17, 0xf0, 0xa9, 0x5f, 0xc0, 0xa7, 0x7e, 0x01, 0x9f, + 0xfa, 0x05, 0x7c, 0xea, 0x17, 0xf0, 0xa9, 0x5f, 0x80, 0xe6, 0x17, 0xf0, 0x57, 0x2d, 0x38, 0xa5, + 0x0e, 0x4d, 0x43, 0xf7, 0xf0, 0xa3, 0x70, 0x82, 0x6f, 0xb7, 0xc5, 0x96, 0xe3, 0xb6, 0x37, 0x48, + 0xbb, 0xd3, 0x72, 0x22, 0xe9, 0x73, 0x78, 0x35, 0x73, 0xe5, 0x26, 0x1e, 0x36, 0x19, 0x15, 0xf9, + 0x0b, 0xd1, 0x0c, 0x00, 0xce, 0x6a, 0xc6, 0xfe, 0xf5, 0x11, 0x18, 0x5c, 0xde, 0x25, 0x5e, 0x74, + 0x0c, 0xb7, 0xb4, 0x06, 0x4c, 0xba, 0xde, 0xae, 0xdf, 0xda, 0x25, 0x4d, 0x0e, 0x3f, 0x8a, 0x32, + 0xe1, 0xb4, 0x20, 0x3d, 0xb9, 0x6a, 0x90, 0xc0, 0x09, 0x92, 0x4f, 0xc3, 0x50, 0x76, 0x1d, 0x86, + 0xf8, 0x91, 0x27, 0x84, 0xc6, 0x4c, 0x9e, 0xcd, 0x06, 0x51, 0x1c, 0xe4, 0xb1, 0x11, 0x8f, 0x1f, + 0xa9, 0xa2, 0x3a, 0xfa, 0x16, 0x4c, 0x6e, 0xba, 0x41, 0x18, 0x6d, 0xb8, 0x6d, 0x7a, 0x3e, 0xb4, + 0x3b, 0x8f, 0x61, 0x18, 0x53, 0xe3, 0xb0, 0x62, 0x50, 0xc2, 0x09, 0xca, 0x68, 0x0b, 0x26, 0x5a, + 0x8e, 0xde, 0xd4, 0xf0, 0x91, 0x9b, 0x52, 0xa7, 0xc3, 0x2d, 0x9d, 0x10, 0x36, 0xe9, 0xd2, 0xed, + 0xd4, 0x60, 0xb6, 0x9d, 0x11, 0xa6, 0x99, 0x51, 0xdb, 0x89, 0x1b, 0x75, 0x38, 0x8c, 0x8a, 0x85, + 0xec, 0x79, 0xd0, 0xa8, 0x29, 0x16, 0x6a, 0x8f, 0x80, 0xbe, 0x09, 0xa3, 0x84, 0x0e, 0x21, 0x25, + 0x2c, 0x0e, 0x98, 0x2b, 0xfd, 0xf5, 0x75, 0xcd, 0x6d, 0x04, 0xbe, 0x69, 0x92, 0x5c, 0x96, 0x94, + 0x70, 0x4c, 0x14, 0x2d, 0xc2, 0x50, 0x48, 0x02, 0x57, 0x99, 0x3d, 0x0a, 0xa6, 0x91, 0xa1, 0x71, + 0x2b, 0x3c, 0xff, 0x8d, 0x45, 0x55, 0xba, 0xbc, 0x84, 0x3b, 0xc3, 0xb8, 0xb9, 0xbc, 0x12, 0x0e, + 0x0b, 0xef, 0xc3, 0x70, 0x40, 0x5a, 0xcc, 0xe6, 0x3d, 0xd1, 0xff, 0x22, 0xe7, 0x26, 0x74, 0x5e, + 0x0f, 0x4b, 0x02, 0xe8, 0x26, 0x95, 0x57, 0xa8, 0x58, 0xe9, 0x7a, 0x5b, 0xea, 0xd1, 0x8c, 0x60, + 0xb4, 0x4a, 0x7c, 0xc7, 0x31, 0x86, 0x7c, 0x7d, 0x8e, 0x33, 0xaa, 0xa1, 0xeb, 0x30, 0xa3, 0x4a, + 0x57, 0xbd, 0x30, 0x72, 0x28, 0x83, 0xe3, 0x96, 0x07, 0xa5, 0x2a, 0xc2, 0x49, 0x04, 0x9c, 0xae, + 0x63, 0xff, 0xa2, 0x05, 0x7c, 0x9c, 0x8f, 0x41, 0x41, 0xf2, 0xae, 0xa9, 0x20, 0x39, 0x9b, 0x3b, + 0x73, 0x39, 0xca, 0x91, 0x5f, 0xb4, 0x60, 0x4c, 0x9b, 0xd9, 0x78, 0xcd, 0x5a, 0x05, 0x6b, 0xb6, + 0x0b, 0xd3, 0x74, 0xa5, 0xdf, 0xbe, 0x1f, 0x92, 0x60, 0x97, 0x34, 0xd9, 0xc2, 0x2c, 0x3d, 0xde, + 0xc2, 0x54, 0x0e, 0xfa, 0xb7, 0x12, 0x04, 0x71, 0xaa, 0x09, 0xfb, 0x9b, 0xb2, 0xab, 0xea, 0x3d, + 0x43, 0x43, 0xcd, 0x79, 0xe2, 0x3d, 0x83, 0x9a, 0x55, 0x1c, 0xe3, 0xd0, 0xad, 0xb6, 0xed, 0x87, + 0x51, 0xf2, 0x3d, 0xc3, 0x0d, 0x3f, 0x8c, 0x30, 0x83, 0xd8, 0xaf, 0x03, 0x2c, 0x3f, 0x24, 0x0d, + 0xbe, 0x62, 0xf5, 0xab, 0x96, 0x95, 0x7f, 0xd5, 0xb2, 0x7f, 0xcf, 0x82, 0xc9, 0x95, 0x45, 0xe3, + 0xe4, 0x9a, 0x03, 0xe0, 0xf7, 0xc3, 0x7b, 0xf7, 0xd6, 0xa5, 0x2f, 0x18, 0x77, 0xd6, 0x50, 0xa5, + 0x58, 0xc3, 0x40, 0x67, 0xa1, 0xdc, 0xea, 0x7a, 0x42, 0x83, 0x3b, 0x4c, 0x8f, 0xc7, 0x5b, 0x5d, + 0x0f, 0xd3, 0x32, 0xed, 0xe5, 0x69, 0xb9, 0xef, 0x97, 0xa7, 0x3d, 0x03, 0x60, 0xa1, 0x2a, 0x0c, + 0x3e, 0x78, 0xe0, 0x36, 0x79, 0x5c, 0x0f, 0xe1, 0xa7, 0x76, 0xef, 0xde, 0xea, 0x52, 0x88, 0x79, + 0xb9, 0xfd, 0xcb, 0x16, 0x4c, 0x25, 0x6e, 0xfb, 0xf4, 0xd6, 0xb8, 0xab, 0xa2, 0x2a, 0x25, 0x83, + 0xc7, 0x68, 0xf1, 0x96, 0x34, 0xac, 0x3e, 0x5e, 0x5c, 0x8b, 0x17, 0x3b, 0xe5, 0x3e, 0x5e, 0xec, + 0x14, 0xbb, 0xe1, 0x7f, 0xaf, 0x0c, 0xb3, 0x2b, 0x2d, 0xf2, 0xf0, 0x63, 0x86, 0x63, 0xe9, 0xf7, + 0xa9, 0xef, 0xd1, 0xd4, 0x77, 0x47, 0x7d, 0xce, 0xdd, 0x7b, 0x0a, 0x37, 0x61, 0x98, 0x7f, 0xba, + 0x0c, 0xce, 0x92, 0x69, 0x4c, 0xcf, 0x1f, 0x90, 0x39, 0x3e, 0x84, 0xc2, 0x98, 0xae, 0xce, 0x78, + 0x51, 0x8a, 0x25, 0xf1, 0xd9, 0xb7, 0x60, 0x5c, 0xc7, 0x3c, 0x52, 0x60, 0x85, 0xbf, 0x50, 0x86, + 0x69, 0xda, 0x83, 0xa7, 0x3a, 0x11, 0x77, 0xd2, 0x13, 0xf1, 0xa4, 0x1f, 0xd7, 0xf7, 0x9e, 0x8d, + 0x0f, 0x93, 0xb3, 0x71, 0x35, 0x6f, 0x36, 0x8e, 0x7b, 0x0e, 0xfe, 0xa2, 0x05, 0x27, 0x56, 0x5a, + 0x7e, 0x63, 0x27, 0xf1, 0x00, 0xfe, 0x4d, 0x18, 0xa3, 0x27, 0x48, 0x68, 0xc4, 0x82, 0x32, 0xa2, + 0x83, 0x09, 0x10, 0xd6, 0xf1, 0xb4, 0x6a, 0x77, 0xee, 0xac, 0x2e, 0x65, 0x05, 0x15, 0x13, 0x20, + 0xac, 0xe3, 0xd9, 0xff, 0xdc, 0x82, 0xf3, 0xd7, 0x17, 0x97, 0xe3, 0xa5, 0x98, 0x8a, 0x6b, 0x76, + 0x09, 0x86, 0x3a, 0x4d, 0xad, 0x2b, 0xb1, 0x52, 0x7e, 0x89, 0xf5, 0x42, 0x40, 0x3f, 0x29, 0x21, + 0x04, 0xef, 0x00, 0x5c, 0xc7, 0xb5, 0x45, 0x71, 0x54, 0x48, 0x1b, 0x9c, 0x95, 0x6b, 0x83, 0x7b, + 0x01, 0x86, 0xe9, 0x51, 0xe6, 0x36, 0x64, 0xbf, 0xb9, 0xbb, 0x0c, 0x2f, 0xc2, 0x12, 0x66, 0xff, + 0x82, 0x05, 0x27, 0xae, 0xbb, 0x11, 0x95, 0x33, 0x92, 0x81, 0xbb, 0xa8, 0xa0, 0x11, 0xba, 0x91, + 0x1f, 0xec, 0x25, 0x79, 0x2f, 0x56, 0x10, 0xac, 0x61, 0xf1, 0x0f, 0xda, 0x75, 0xd9, 0x93, 0xba, + 0x92, 0x69, 0xf5, 0xc4, 0xa2, 0x1c, 0x2b, 0x0c, 0x3a, 0x5e, 0x4d, 0x37, 0x60, 0x9c, 0x5e, 0x72, + 0x63, 0x35, 0x5e, 0x4b, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x8f, 0x2d, 0xa8, 0x5e, 0xe7, 0x81, 0x01, + 0x36, 0xc3, 0x1c, 0xa6, 0xfb, 0x3a, 0x8c, 0x12, 0x69, 0x9e, 0x49, 0xfa, 0x72, 0x2b, 0xbb, 0x0d, + 0x8f, 0x1f, 0xa6, 0xf0, 0xfa, 0x38, 0x33, 0x8e, 0x16, 0x66, 0x61, 0x05, 0x10, 0xd1, 0xdb, 0xd2, + 0x03, 0xaa, 0xb1, 0xc8, 0x4c, 0xcb, 0x29, 0x28, 0xce, 0xa8, 0x61, 0xff, 0x0d, 0x0b, 0x4e, 0xa9, + 0x0f, 0xfe, 0xc4, 0x7d, 0xa6, 0xfd, 0xab, 0x25, 0x98, 0xb8, 0xb1, 0xb1, 0x51, 0xbb, 0x4e, 0x22, + 0x6d, 0x55, 0x16, 0x3b, 0x5d, 0x60, 0xcd, 0x76, 0x5c, 0x74, 0xad, 0xed, 0x46, 0x6e, 0x6b, 0x8e, + 0x87, 0x09, 0x9d, 0x5b, 0xf5, 0xa2, 0xdb, 0x41, 0x3d, 0x0a, 0x5c, 0x6f, 0x2b, 0x73, 0xa5, 0x4b, + 0x31, 0xab, 0x9c, 0x27, 0x66, 0xa1, 0xd7, 0x61, 0x88, 0xc5, 0x29, 0x95, 0x93, 0xf0, 0x8c, 0xba, + 0x15, 0xb2, 0xd2, 0xc3, 0xfd, 0xea, 0xe8, 0x1d, 0xbc, 0xca, 0xff, 0x60, 0x81, 0x8a, 0xee, 0xc0, + 0xd8, 0x76, 0x14, 0x75, 0x6e, 0x10, 0xa7, 0x49, 0x02, 0xc9, 0x65, 0x2f, 0x64, 0x71, 0x59, 0x3a, + 0x08, 0x1c, 0x2d, 0x66, 0x4c, 0x71, 0x59, 0x88, 0x75, 0x3a, 0x76, 0x1d, 0x20, 0x86, 0x3d, 0x21, + 0xb3, 0x99, 0xbd, 0x01, 0xa3, 0xf4, 0x73, 0xe7, 0x5b, 0xae, 0x53, 0xec, 0x98, 0xf0, 0x32, 0x8c, + 0x4a, 0xb7, 0x83, 0x50, 0x44, 0x11, 0x62, 0x27, 0x92, 0xf4, 0x4a, 0x08, 0x71, 0x0c, 0xb7, 0x9f, + 0x07, 0xe1, 0x1b, 0x5f, 0x44, 0xd2, 0xde, 0x84, 0x93, 0xcc, 0xc9, 0xdf, 0x89, 0xb6, 0x8d, 0x35, + 0xda, 0x7b, 0x31, 0xbc, 0x22, 0xae, 0xa2, 0x25, 0xe5, 0x6d, 0x25, 0xa3, 0x54, 0x8c, 0x4b, 0x8a, + 0xf1, 0xb5, 0xd4, 0xfe, 0xa3, 0x01, 0x78, 0x66, 0xb5, 0x9e, 0x1f, 0xfe, 0xee, 0x1a, 0x8c, 0x73, + 0x09, 0x97, 0x2e, 0x0d, 0xa7, 0x25, 0xda, 0x55, 0x4a, 0xdb, 0x0d, 0x0d, 0x86, 0x0d, 0x4c, 0x2a, + 0x11, 0xba, 0x1f, 0x79, 0xc9, 0x37, 0xdc, 0xab, 0x1f, 0xac, 0x63, 0x5a, 0x4e, 0xc1, 0x54, 0x58, + 0xe6, 0x2c, 0x5d, 0x81, 0x95, 0xc0, 0xfc, 0x2e, 0x4c, 0xba, 0x61, 0x23, 0x74, 0x57, 0x3d, 0xba, + 0x4f, 0xb5, 0x9d, 0xae, 0xd4, 0x24, 0xb4, 0xd3, 0x0a, 0x8a, 0x13, 0xd8, 0xda, 0xf9, 0x32, 0xd8, + 0xb7, 0xc0, 0xdd, 0x33, 0xf8, 0x0e, 0x65, 0xff, 0x1d, 0xf6, 0x75, 0x21, 0xb3, 0x55, 0x08, 0xf6, + 0xcf, 0x3f, 0x38, 0xc4, 0x12, 0x46, 0xef, 0xa0, 0x8d, 0x6d, 0xa7, 0x33, 0xdf, 0x8d, 0xb6, 0x97, + 0xdc, 0xb0, 0xe1, 0xef, 0x92, 0x60, 0x8f, 0xa9, 0x0f, 0x46, 0xe2, 0x3b, 0xa8, 0x02, 0x2c, 0xde, + 0x98, 0xaf, 0x51, 0x4c, 0x9c, 0xae, 0x83, 0xe6, 0x61, 0x4a, 0x16, 0xd6, 0x49, 0xc8, 0x8e, 0x80, + 0x31, 0x46, 0x46, 0xbd, 0xaa, 0x16, 0xc5, 0x8a, 0x48, 0x12, 0xdf, 0x14, 0x70, 0xe1, 0x49, 0x08, + 0xb8, 0x5f, 0x80, 0x09, 0xd7, 0x73, 0x23, 0xd7, 0x89, 0x7c, 0x6e, 0x68, 0xe3, 0x9a, 0x02, 0xa6, + 0x13, 0x5f, 0xd5, 0x01, 0xd8, 0xc4, 0xb3, 0xff, 0x8f, 0x01, 0x98, 0x61, 0xd3, 0xf6, 0xe9, 0x0a, + 0xfb, 0x61, 0x5a, 0x61, 0x77, 0xd2, 0x2b, 0xec, 0x49, 0x48, 0xee, 0x8f, 0xbd, 0xcc, 0xbe, 0x63, + 0xc1, 0x0c, 0x53, 0xcb, 0x1b, 0xcb, 0xec, 0x0a, 0x8c, 0x06, 0xc6, 0x83, 0xf7, 0x51, 0xdd, 0xfa, + 0x27, 0xdf, 0xae, 0xc7, 0x38, 0xe8, 0x3d, 0x80, 0x4e, 0xac, 0xf6, 0x2f, 0x19, 0x51, 0x8a, 0x21, + 0x57, 0xe3, 0xaf, 0xd5, 0xb1, 0xbf, 0x05, 0xa3, 0xea, 0x45, 0xbb, 0xbc, 0x20, 0x5b, 0x39, 0x17, + 0xe4, 0xde, 0x62, 0x84, 0xf4, 0x4c, 0x2c, 0x67, 0x7a, 0x26, 0xfe, 0x6b, 0x0b, 0x62, 0xa3, 0x0c, + 0xfa, 0x00, 0x46, 0x3b, 0x3e, 0x73, 0x64, 0x0f, 0xe4, 0xeb, 0x90, 0xe7, 0x0b, 0xad, 0x3a, 0x3c, + 0x14, 0x69, 0xc0, 0xa7, 0xa3, 0x26, 0xab, 0xe2, 0x98, 0x0a, 0xba, 0x09, 0xc3, 0x9d, 0x80, 0xd4, + 0x23, 0x16, 0x27, 0xaf, 0x7f, 0x82, 0x7c, 0xf9, 0xf2, 0x8a, 0x58, 0x52, 0x48, 0xf8, 0x05, 0x97, + 0xfb, 0xf7, 0x0b, 0xb6, 0xff, 0x7e, 0x09, 0xa6, 0x93, 0x8d, 0xa0, 0x77, 0x60, 0x80, 0x3c, 0x24, + 0x0d, 0xf1, 0xa5, 0x99, 0xd2, 0x44, 0xac, 0x10, 0xe2, 0x43, 0x47, 0xff, 0x63, 0x56, 0x0b, 0xdd, + 0x80, 0x61, 0x2a, 0x4a, 0x5c, 0x57, 0xd1, 0x64, 0x9f, 0xcd, 0x13, 0x47, 0x94, 0x4c, 0xc6, 0x3f, + 0x4b, 0x14, 0x61, 0x59, 0x9d, 0x39, 0x12, 0x36, 0x3a, 0x75, 0x7a, 0x4b, 0x8b, 0x8a, 0x94, 0x09, + 0x1b, 0x8b, 0x35, 0x8e, 0x24, 0xa8, 0x71, 0x47, 0x42, 0x59, 0x88, 0x63, 0x22, 0xe8, 0x3d, 0x18, + 0x0c, 0x5b, 0x84, 0x74, 0x84, 0xa7, 0x48, 0xa6, 0x4a, 0xb7, 0x4e, 0x11, 0x04, 0x25, 0xa6, 0x02, + 0x62, 0x05, 0x98, 0x57, 0xb4, 0x7f, 0xcd, 0x02, 0xe0, 0x9e, 0x97, 0x8e, 0xb7, 0x45, 0x8e, 0xc1, + 0x0a, 0xb2, 0x04, 0x03, 0x61, 0x87, 0x34, 0x8a, 0xde, 0x77, 0xc4, 0xfd, 0xa9, 0x77, 0x48, 0x23, + 0x5e, 0xed, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0x9f, 0x00, 0x98, 0x8c, 0xd1, 0x56, 0x23, 0xd2, 0x46, + 0xaf, 0x1a, 0x21, 0xb8, 0xce, 0x26, 0x42, 0x70, 0x8d, 0x32, 0x6c, 0x4d, 0xe1, 0xfe, 0x2d, 0x28, + 0xb7, 0x9d, 0x87, 0x42, 0xa3, 0xfa, 0x72, 0x71, 0x37, 0x28, 0xfd, 0xb9, 0x35, 0xe7, 0x21, 0xbf, + 0xc1, 0xbf, 0x2c, 0x77, 0xe7, 0x9a, 0xf3, 0xb0, 0xe7, 0x1b, 0x04, 0xda, 0x08, 0x6b, 0xcb, 0xf5, + 0x84, 0x53, 0x61, 0x5f, 0x6d, 0xb9, 0x5e, 0xb2, 0x2d, 0xd7, 0xeb, 0xa3, 0x2d, 0xd7, 0x43, 0x8f, + 0x60, 0x58, 0xf8, 0xfc, 0x8a, 0xd8, 0xa0, 0x57, 0xfa, 0x68, 0x4f, 0xb8, 0x0c, 0xf3, 0x36, 0xaf, + 0x48, 0x0d, 0x85, 0x28, 0xed, 0xd9, 0xae, 0x6c, 0x10, 0xfd, 0x35, 0x0b, 0x26, 0xc5, 0x6f, 0xf1, + 0x9c, 0x56, 0x48, 0xf0, 0x9f, 0xef, 0xbf, 0x0f, 0xa2, 0x22, 0xef, 0xca, 0xe7, 0xe5, 0x61, 0x6b, + 0x02, 0x7b, 0xf6, 0x28, 0xd1, 0x0b, 0xf4, 0xf7, 0x2d, 0x38, 0xd9, 0x76, 0x1e, 0xf2, 0x16, 0x79, + 0x19, 0x76, 0x22, 0xd7, 0x17, 0x6e, 0x2e, 0xef, 0xf4, 0x37, 0xfd, 0xa9, 0xea, 0xbc, 0x93, 0xd2, + 0xba, 0x7c, 0x32, 0x0b, 0xa5, 0x67, 0x57, 0x33, 0xfb, 0x35, 0xbb, 0x09, 0x23, 0x72, 0xbd, 0x3d, + 0xcd, 0x07, 0x0d, 0xac, 0x1d, 0xb1, 0xd6, 0x9e, 0x6a, 0x3b, 0xdf, 0x82, 0x71, 0x7d, 0x8d, 0x3d, + 0xd5, 0xb6, 0x3e, 0x82, 0x13, 0x19, 0x6b, 0xe9, 0xa9, 0x36, 0xf9, 0x00, 0xce, 0xe6, 0xae, 0x8f, + 0xa7, 0xfa, 0x20, 0xe5, 0x57, 0x2d, 0x9d, 0x0f, 0x1e, 0x83, 0x29, 0x6a, 0xd1, 0x34, 0x45, 0x5d, + 0x28, 0xde, 0x39, 0x39, 0xf6, 0xa8, 0x0f, 0xf5, 0x4e, 0x53, 0xae, 0x8e, 0xde, 0x87, 0xa1, 0x16, + 0x2d, 0x91, 0x9e, 0xe3, 0x76, 0xef, 0x1d, 0x19, 0x4b, 0xd4, 0xac, 0x3c, 0xc4, 0x82, 0x82, 0xfd, + 0x33, 0x16, 0x64, 0x3c, 0xa9, 0xa1, 0x12, 0x56, 0xd7, 0x6d, 0xb2, 0x21, 0x29, 0xc7, 0x12, 0x96, + 0x8a, 0x50, 0x75, 0x1e, 0xca, 0x5b, 0x6e, 0x53, 0xbc, 0xd6, 0x57, 0xe0, 0xeb, 0x14, 0xbc, 0xe5, + 0x36, 0xd1, 0x0a, 0xa0, 0xb0, 0xdb, 0xe9, 0xb4, 0x98, 0x67, 0x98, 0xd3, 0xba, 0x1e, 0xf8, 0xdd, + 0x0e, 0x77, 0x13, 0x2f, 0x73, 0xf5, 0x52, 0x3d, 0x05, 0xc5, 0x19, 0x35, 0xec, 0x7f, 0x64, 0xc1, + 0xc0, 0x31, 0x4c, 0x13, 0x36, 0xa7, 0xe9, 0xd5, 0x5c, 0xd2, 0x22, 0xa5, 0xcc, 0x1c, 0x76, 0x1e, + 0xb0, 0x70, 0x0d, 0x21, 0x13, 0x38, 0x32, 0x67, 0x6d, 0xdf, 0x82, 0x13, 0xb7, 0x7c, 0xa7, 0xb9, + 0xe0, 0xb4, 0x1c, 0xaf, 0x41, 0x82, 0x55, 0x6f, 0xeb, 0x48, 0x6f, 0x32, 0x4a, 0x3d, 0xdf, 0x64, + 0x5c, 0x83, 0x21, 0xb7, 0xa3, 0xe5, 0xa4, 0xb8, 0x48, 0x67, 0x77, 0xb5, 0x26, 0xd2, 0x51, 0x20, + 0xa3, 0x71, 0x56, 0x8a, 0x05, 0x3e, 0x5d, 0x96, 0xdc, 0x6f, 0x71, 0x20, 0x7f, 0x59, 0xd2, 0x5b, + 0x52, 0x32, 0xd6, 0xa2, 0xe1, 0xb6, 0xbf, 0x0d, 0x46, 0x13, 0xe2, 0x91, 0x1a, 0x86, 0x61, 0x97, + 0x7f, 0xa9, 0x58, 0x9b, 0x2f, 0x66, 0xdf, 0x5e, 0x52, 0x03, 0xa3, 0xbd, 0xc6, 0xe4, 0x05, 0x58, + 0x12, 0xb2, 0xaf, 0x41, 0x66, 0x6c, 0xac, 0xde, 0x9a, 0x29, 0xfb, 0x2b, 0x30, 0xc3, 0x6a, 0x1e, + 0x51, 0xeb, 0x63, 0x27, 0xf4, 0xe9, 0x19, 0xe1, 0xc5, 0xed, 0xff, 0xc5, 0x02, 0xb4, 0xe6, 0x37, + 0xdd, 0xcd, 0x3d, 0x41, 0x9c, 0x7f, 0xff, 0x47, 0x50, 0xe5, 0xd7, 0xea, 0x64, 0x08, 0xee, 0xc5, + 0x96, 0x13, 0x86, 0x9a, 0x2e, 0xff, 0x45, 0xd1, 0x6e, 0x75, 0xa3, 0x18, 0x1d, 0xf7, 0xa2, 0x87, + 0x3e, 0x48, 0x44, 0x44, 0xfd, 0x62, 0x2a, 0x22, 0xea, 0x8b, 0x99, 0x4e, 0x40, 0xe9, 0xde, 0xcb, + 0x48, 0xa9, 0xf6, 0x77, 0x2d, 0x98, 0x5a, 0x4f, 0x84, 0x94, 0xbe, 0xc4, 0x3c, 0x22, 0x32, 0x6c, + 0x54, 0x75, 0x56, 0x8a, 0x05, 0xf4, 0x89, 0xeb, 0x70, 0xff, 0xd4, 0x82, 0x38, 0x16, 0xdf, 0x31, + 0x88, 0xdc, 0x8b, 0x86, 0xc8, 0x9d, 0x79, 0x7d, 0x51, 0xdd, 0xc9, 0x93, 0xb8, 0xd1, 0x4d, 0x35, + 0x27, 0x05, 0x37, 0x97, 0x98, 0x0c, 0xdf, 0x67, 0x93, 0xe6, 0xc4, 0xa9, 0xd9, 0xf8, 0xfd, 0x12, + 0x20, 0x85, 0xdb, 0x77, 0x14, 0xdd, 0x74, 0x8d, 0x27, 0x13, 0x45, 0x77, 0x17, 0x10, 0xf3, 0xe9, + 0x09, 0x1c, 0x2f, 0xe4, 0x64, 0x5d, 0xa1, 0xb5, 0x3e, 0x9a, 0xc3, 0x90, 0x72, 0x89, 0xbd, 0x95, + 0xa2, 0x86, 0x33, 0x5a, 0xd0, 0x7c, 0xb5, 0x06, 0xfb, 0xf5, 0xd5, 0x1a, 0xea, 0xf1, 0xe8, 0xfe, + 0x57, 0x2c, 0x98, 0x50, 0xc3, 0xf4, 0x09, 0x79, 0xba, 0xa3, 0xfa, 0x93, 0x73, 0xae, 0xd4, 0xb4, + 0x2e, 0x33, 0x61, 0xe0, 0x47, 0x58, 0xf0, 0x04, 0xa7, 0xe5, 0x3e, 0x22, 0x2a, 0xd8, 0x7b, 0x55, + 0x04, 0x43, 0x10, 0xa5, 0x87, 0xfb, 0xd5, 0x09, 0xf5, 0x8f, 0xfb, 0x23, 0xc4, 0x55, 0xec, 0xbf, + 0x4d, 0x37, 0xbb, 0xb9, 0x14, 0xd1, 0x9b, 0x30, 0xd8, 0xd9, 0x76, 0x42, 0x92, 0x78, 0xe2, 0x38, + 0x58, 0xa3, 0x85, 0x87, 0xfb, 0xd5, 0x49, 0x55, 0x81, 0x95, 0x60, 0x8e, 0xdd, 0x7f, 0x6c, 0xe2, + 0xf4, 0xe2, 0xec, 0x19, 0x9b, 0xf8, 0xdf, 0x59, 0x30, 0xb0, 0x4e, 0x4f, 0xaf, 0xa7, 0xcf, 0x02, + 0xde, 0x35, 0x58, 0xc0, 0xb9, 0xbc, 0xb4, 0x67, 0xb9, 0xbb, 0x7f, 0x25, 0xb1, 0xfb, 0x2f, 0xe4, + 0x52, 0x28, 0xde, 0xf8, 0x6d, 0x18, 0x63, 0xc9, 0xd4, 0xc4, 0x73, 0xce, 0xd7, 0x8d, 0x0d, 0x5f, + 0x4d, 0x6c, 0xf8, 0x29, 0x0d, 0x55, 0xdb, 0xe9, 0x2f, 0xc1, 0xb0, 0x78, 0x1f, 0x98, 0x8c, 0x41, + 0x21, 0x70, 0xb1, 0x84, 0xdb, 0x3f, 0x57, 0x06, 0x23, 0x79, 0x1b, 0xfa, 0x27, 0x16, 0xcc, 0x05, + 0xdc, 0xc5, 0xbf, 0xb9, 0xd4, 0x0d, 0x5c, 0x6f, 0xab, 0xde, 0xd8, 0x26, 0xcd, 0x6e, 0xcb, 0xf5, + 0xb6, 0x56, 0xb7, 0x3c, 0x5f, 0x15, 0x2f, 0x3f, 0x24, 0x8d, 0xae, 0x8a, 0xdb, 0x53, 0x90, 0x29, + 0x4e, 0x3d, 0x93, 0x79, 0xed, 0x60, 0xbf, 0x3a, 0x87, 0x8f, 0x44, 0x1b, 0x1f, 0xb1, 0x2f, 0xe8, + 0x9f, 0x5b, 0x70, 0x85, 0x27, 0x11, 0xeb, 0xbf, 0xff, 0x05, 0x1a, 0x8e, 0x9a, 0x24, 0x15, 0x13, + 0xd9, 0x20, 0x41, 0x7b, 0xe1, 0x0b, 0x62, 0x40, 0xaf, 0xd4, 0x8e, 0xd6, 0x16, 0x3e, 0x6a, 0xe7, + 0xec, 0xff, 0xa6, 0x0c, 0x13, 0x22, 0x86, 0xad, 0x38, 0x03, 0xde, 0x34, 0x96, 0xc4, 0xb3, 0x89, + 0x25, 0x31, 0x63, 0x20, 0x3f, 0x19, 0xf6, 0x1f, 0xc2, 0x0c, 0x65, 0xce, 0x37, 0x88, 0x13, 0x44, + 0xf7, 0x89, 0xc3, 0x5d, 0x30, 0xcb, 0x47, 0xe6, 0xfe, 0x4a, 0xb1, 0x7e, 0x2b, 0x49, 0x0c, 0xa7, + 0xe9, 0xff, 0x30, 0x9d, 0x39, 0x1e, 0x4c, 0xa7, 0xc2, 0x10, 0x7f, 0x15, 0x46, 0xd5, 0xe3, 0x36, + 0xc1, 0x74, 0x8a, 0xa3, 0x79, 0x27, 0x29, 0x70, 0xa5, 0x67, 0xfc, 0xb0, 0x32, 0x26, 0x67, 0xff, + 0x72, 0xc9, 0x68, 0x90, 0x4f, 0xe2, 0x3a, 0x8c, 0x38, 0x21, 0xcb, 0x30, 0xd0, 0x2c, 0xd2, 0x68, + 0xa7, 0x9a, 0x61, 0x7e, 0x66, 0xf3, 0xa2, 0x26, 0x56, 0x34, 0xd0, 0x0d, 0xee, 0xe8, 0xba, 0x4b, + 0x8a, 0xd4, 0xd9, 0x29, 0x6a, 0x20, 0x5d, 0x61, 0x77, 0x09, 0x16, 0xf5, 0xd1, 0xd7, 0xb9, 0x27, + 0xf2, 0x4d, 0xcf, 0x7f, 0xe0, 0x5d, 0xf7, 0x7d, 0x19, 0x04, 0xaa, 0x3f, 0x82, 0x33, 0xd2, 0xff, + 0x58, 0x55, 0xc7, 0x26, 0xb5, 0xfe, 0xe2, 0xfa, 0xff, 0x28, 0xb0, 0xa4, 0x49, 0x66, 0x2c, 0x89, + 0x10, 0x11, 0x98, 0x12, 0x01, 0x92, 0x65, 0x99, 0x18, 0xbb, 0xcc, 0xeb, 0xb7, 0x59, 0x3b, 0xb6, + 0x00, 0xdd, 0x34, 0x49, 0xe0, 0x24, 0x4d, 0x7b, 0x9b, 0x33, 0xe1, 0x15, 0xe2, 0x44, 0xdd, 0x80, + 0x84, 0xe8, 0xcb, 0x50, 0x49, 0xdf, 0x8c, 0x85, 0x21, 0xc5, 0x62, 0xd2, 0xf3, 0xb9, 0x83, 0xfd, + 0x6a, 0xa5, 0x9e, 0x83, 0x83, 0x73, 0x6b, 0xdb, 0x3f, 0x6f, 0x01, 0x7b, 0xc1, 0x7f, 0x0c, 0x92, + 0xcf, 0x97, 0x4c, 0xc9, 0xa7, 0x92, 0x37, 0x9d, 0x39, 0x42, 0xcf, 0x1b, 0x7c, 0x0d, 0xd7, 0x02, + 0xff, 0xe1, 0x9e, 0xf0, 0xfa, 0xea, 0x7d, 0x8d, 0xb3, 0xbf, 0x67, 0x01, 0xcb, 0x30, 0x86, 0xf9, + 0xad, 0x5d, 0x1a, 0x38, 0x7a, 0x3b, 0x34, 0x7c, 0x19, 0x46, 0x36, 0xc5, 0xf0, 0x67, 0x28, 0x9d, + 0x8c, 0x0e, 0x9b, 0xb4, 0xe5, 0xa4, 0x89, 0x97, 0xb8, 0xe2, 0x1f, 0x56, 0xd4, 0xec, 0xff, 0xd2, + 0x82, 0xd9, 0xfc, 0x6a, 0xe8, 0x0e, 0x9c, 0x09, 0x48, 0xa3, 0x1b, 0x84, 0x74, 0x4b, 0x88, 0x0b, + 0x90, 0x78, 0x01, 0xc6, 0xa7, 0xfa, 0x99, 0x83, 0xfd, 0xea, 0x19, 0x9c, 0x8d, 0x82, 0xf3, 0xea, + 0xa2, 0xb7, 0x60, 0xb2, 0x1b, 0x72, 0xc9, 0x8f, 0x09, 0x5d, 0xa1, 0x08, 0x63, 0xcf, 0x1e, 0x49, + 0xdd, 0x31, 0x20, 0x38, 0x81, 0x69, 0xff, 0x79, 0xbe, 0x1c, 0x95, 0xc7, 0x6b, 0x1b, 0x66, 0x3c, + 0xed, 0x3f, 0x3d, 0x01, 0xe5, 0x55, 0xff, 0xf9, 0x5e, 0xa7, 0x3e, 0x3b, 0x2e, 0xb5, 0x18, 0x03, + 0x09, 0x32, 0x38, 0x4d, 0xd9, 0xfe, 0x9b, 0x16, 0x9c, 0xd1, 0x11, 0xb5, 0x17, 0x87, 0xbd, 0xac, + 0x80, 0x4b, 0x5a, 0x00, 0x3e, 0x7e, 0xcc, 0x5d, 0xce, 0x08, 0xc0, 0x77, 0x52, 0xa7, 0x5e, 0x18, + 0x6d, 0x8f, 0xbf, 0x2d, 0xcd, 0x8a, 0xb6, 0xf7, 0x47, 0x16, 0x5f, 0x9f, 0x7a, 0xd7, 0xd1, 0x47, + 0x30, 0xdd, 0x76, 0xa2, 0xc6, 0xf6, 0xf2, 0xc3, 0x4e, 0xc0, 0x8d, 0xbb, 0x72, 0x9c, 0x5e, 0xee, + 0x35, 0x4e, 0xda, 0x47, 0xc6, 0xde, 0xe0, 0x6b, 0x09, 0x62, 0x38, 0x45, 0x1e, 0xdd, 0x87, 0x31, + 0x56, 0xc6, 0xde, 0x62, 0x87, 0x45, 0xb2, 0x4c, 0x5e, 0x6b, 0xca, 0x39, 0x68, 0x2d, 0xa6, 0x83, + 0x75, 0xa2, 0xf6, 0x2f, 0x95, 0x39, 0xd3, 0x60, 0x77, 0x8f, 0x97, 0x60, 0xb8, 0xe3, 0x37, 0x17, + 0x57, 0x97, 0xb0, 0x98, 0x05, 0x75, 0xee, 0xd5, 0x78, 0x31, 0x96, 0x70, 0x74, 0x19, 0x46, 0xc4, + 0x4f, 0x69, 0x8c, 0x67, 0x7b, 0x44, 0xe0, 0x85, 0x58, 0x41, 0xd1, 0x6b, 0x00, 0x9d, 0xc0, 0xdf, + 0x75, 0x9b, 0x2c, 0xf6, 0x56, 0xd9, 0xf4, 0xeb, 0xab, 0x29, 0x08, 0xd6, 0xb0, 0xd0, 0xdb, 0x30, + 0xd1, 0xf5, 0x42, 0x2e, 0x3f, 0x69, 0xc9, 0x38, 0x94, 0xc7, 0xd9, 0x1d, 0x1d, 0x88, 0x4d, 0x5c, + 0x34, 0x0f, 0x43, 0x91, 0xc3, 0xfc, 0xd4, 0x06, 0xf3, 0x5f, 0x0c, 0x6c, 0x50, 0x0c, 0x3d, 0xed, + 0x25, 0xad, 0x80, 0x45, 0x45, 0xf4, 0x55, 0x19, 0x16, 0x81, 0x9f, 0x44, 0xe2, 0xa9, 0x4e, 0x7f, + 0xa7, 0x96, 0x16, 0x14, 0x41, 0x3c, 0x01, 0x32, 0x68, 0xa1, 0xb7, 0x00, 0xc8, 0xc3, 0x88, 0x04, + 0x9e, 0xd3, 0x52, 0xde, 0xa5, 0x4a, 0x90, 0x59, 0xf2, 0xd7, 0xfd, 0xe8, 0x4e, 0x48, 0x96, 0x15, + 0x06, 0xd6, 0xb0, 0xed, 0x9f, 0x18, 0x03, 0x88, 0x2f, 0x1a, 0xe8, 0x11, 0x8c, 0x34, 0x9c, 0x8e, + 0xd3, 0xe0, 0x39, 0x9d, 0xcb, 0x79, 0x0f, 0xcb, 0xe3, 0x1a, 0x73, 0x8b, 0x02, 0x9d, 0x1b, 0x6f, + 0x64, 0x3e, 0x83, 0x11, 0x59, 0xdc, 0xd3, 0x60, 0xa3, 0xda, 0x43, 0xdf, 0xb1, 0x60, 0x4c, 0xc4, + 0xb6, 0x62, 0x33, 0x54, 0xca, 0xb7, 0xb7, 0x69, 0xed, 0xcf, 0xc7, 0x35, 0x78, 0x17, 0x5e, 0x97, + 0x2b, 0x54, 0x83, 0xf4, 0xec, 0x85, 0xde, 0x30, 0xfa, 0x9c, 0xbc, 0xdb, 0x96, 0x8d, 0xa1, 0x54, + 0x77, 0xdb, 0x51, 0x76, 0xd4, 0xe8, 0xd7, 0xda, 0x3b, 0xc6, 0xb5, 0x76, 0x20, 0xff, 0x89, 0xb6, + 0x21, 0x6f, 0xf7, 0xba, 0xd1, 0xa2, 0x9a, 0x1e, 0x03, 0x66, 0x30, 0xff, 0x85, 0xaf, 0x76, 0xb1, + 0xeb, 0x11, 0xff, 0xe5, 0x5b, 0x30, 0xd5, 0x34, 0xa5, 0x16, 0xb1, 0x12, 0x5f, 0xcc, 0xa3, 0x9b, + 0x10, 0x72, 0x62, 0x39, 0x25, 0x01, 0xc0, 0x49, 0xc2, 0xa8, 0xc6, 0x43, 0x02, 0xad, 0x7a, 0x9b, + 0xbe, 0x78, 0x2e, 0x66, 0xe7, 0xce, 0xe5, 0x5e, 0x18, 0x91, 0x36, 0xc5, 0x8c, 0x85, 0x84, 0x75, + 0x51, 0x17, 0x2b, 0x2a, 0xe8, 0x7d, 0x18, 0x62, 0x4f, 0x3c, 0xc3, 0xca, 0x48, 0xbe, 0x59, 0xc3, + 0x8c, 0x2e, 0x1c, 0x6f, 0x48, 0xf6, 0x37, 0xc4, 0x82, 0x02, 0xba, 0x21, 0x1f, 0x50, 0x87, 0xab, + 0xde, 0x9d, 0x90, 0xb0, 0x07, 0xd4, 0xa3, 0x0b, 0xcf, 0xc7, 0x6f, 0xa3, 0x79, 0x79, 0x66, 0x72, + 0x6c, 0xa3, 0x26, 0x15, 0xfb, 0xc4, 0x7f, 0x99, 0x73, 0x5b, 0x44, 0xea, 0xcb, 0xec, 0x9e, 0x99, + 0x97, 0x3b, 0x1e, 0xce, 0xbb, 0x26, 0x09, 0x9c, 0xa4, 0x49, 0x45, 0x68, 0xbe, 0xeb, 0xc5, 0x83, + 0xb3, 0x5e, 0xbc, 0x83, 0x6b, 0x0e, 0xd8, 0x69, 0xc4, 0x4b, 0xb0, 0xa8, 0x8f, 0x5c, 0x98, 0x0a, + 0x0c, 0xf1, 0x42, 0x06, 0xd8, 0xbb, 0xd4, 0x9f, 0x10, 0xa3, 0x65, 0x19, 0x31, 0xc9, 0xe0, 0x24, + 0x5d, 0xf4, 0xbe, 0x26, 0x28, 0x4d, 0x14, 0xdf, 0xfc, 0x7b, 0x89, 0x46, 0xb3, 0x3b, 0x30, 0x61, + 0x30, 0x9b, 0xa7, 0x6a, 0x82, 0xf4, 0x60, 0x3a, 0xc9, 0x59, 0x9e, 0xaa, 0xe5, 0xf1, 0x2d, 0x98, + 0x64, 0x1b, 0xe1, 0x81, 0xd3, 0x11, 0xac, 0xf8, 0xb2, 0xc1, 0x8a, 0xad, 0xcb, 0x65, 0x3e, 0x30, + 0x72, 0x08, 0x62, 0xc6, 0x69, 0xff, 0x9d, 0x41, 0x51, 0x59, 0xed, 0x22, 0x74, 0x05, 0x46, 0x45, + 0x07, 0x54, 0xaa, 0x3e, 0xc5, 0x18, 0xd6, 0x24, 0x00, 0xc7, 0x38, 0x2c, 0x43, 0x23, 0xab, 0xae, + 0xbd, 0x50, 0x88, 0x33, 0x34, 0x2a, 0x08, 0xd6, 0xb0, 0xe8, 0xe5, 0xf7, 0xbe, 0xef, 0x47, 0xea, + 0x0c, 0x56, 0x5b, 0x6d, 0x81, 0x95, 0x62, 0x01, 0xa5, 0x67, 0xef, 0x0e, 0x09, 0x3c, 0xd2, 0x32, + 0x73, 0xd5, 0xa8, 0xb3, 0xf7, 0xa6, 0x0e, 0xc4, 0x26, 0x2e, 0x95, 0x20, 0xfc, 0x90, 0xed, 0x5d, + 0x71, 0xc5, 0x8e, 0x5f, 0x7c, 0xd4, 0x79, 0x90, 0x0f, 0x09, 0x47, 0x5f, 0x81, 0x33, 0x2a, 0xd8, + 0xa6, 0x58, 0x99, 0xb2, 0xc5, 0x21, 0x43, 0x23, 0x76, 0x66, 0x31, 0x1b, 0x0d, 0xe7, 0xd5, 0x47, + 0xef, 0xc2, 0xa4, 0xb8, 0x86, 0x49, 0x8a, 0xc3, 0xa6, 0xfb, 0xe2, 0x4d, 0x03, 0x8a, 0x13, 0xd8, + 0x32, 0xdb, 0x0e, 0xbb, 0x9f, 0x48, 0x0a, 0x23, 0xe9, 0x6c, 0x3b, 0x3a, 0x1c, 0xa7, 0x6a, 0xa0, + 0x79, 0x98, 0xe2, 0x62, 0xa7, 0xeb, 0x6d, 0xf1, 0x39, 0x11, 0x4f, 0x60, 0xd5, 0x86, 0xbc, 0x6d, + 0x82, 0x71, 0x12, 0x1f, 0x5d, 0x83, 0x71, 0x27, 0x68, 0x6c, 0xbb, 0x11, 0x69, 0xd0, 0x5d, 0xc5, + 0x3c, 0x08, 0x35, 0xff, 0xcf, 0x79, 0x0d, 0x86, 0x0d, 0x4c, 0xf4, 0x1e, 0x0c, 0x84, 0x0f, 0x9c, + 0x8e, 0xe0, 0x3e, 0xf9, 0xac, 0x5c, 0xad, 0x60, 0xee, 0xfa, 0x45, 0xff, 0x63, 0x56, 0xd3, 0x7e, + 0x04, 0x27, 0x32, 0x82, 0x12, 0xd1, 0xa5, 0xe7, 0x74, 0x5c, 0x39, 0x2a, 0x89, 0x67, 0x1a, 0xf3, + 0xb5, 0x55, 0x39, 0x1e, 0x1a, 0x16, 0x5d, 0xdf, 0x2c, 0x78, 0x51, 0x2d, 0x36, 0x24, 0xa9, 0xf5, + 0xbd, 0x22, 0x01, 0x38, 0xc6, 0xb1, 0xff, 0xa4, 0x04, 0x53, 0x19, 0xe6, 0x41, 0x96, 0x1b, 0x3f, + 0x71, 0xcf, 0x8b, 0x53, 0xe1, 0x9b, 0xe9, 0x9f, 0x4a, 0x47, 0x48, 0xff, 0x54, 0xee, 0x95, 0xfe, + 0x69, 0xe0, 0xe3, 0xa4, 0x7f, 0x32, 0x47, 0x6c, 0xb0, 0xaf, 0x11, 0xcb, 0x48, 0x19, 0x35, 0x74, + 0xc4, 0x94, 0x51, 0xc6, 0xa0, 0x0f, 0xf7, 0x31, 0xe8, 0xff, 0x69, 0x09, 0xa6, 0x93, 0x96, 0xc5, + 0x63, 0xd0, 0xce, 0xbf, 0x6f, 0x68, 0xe7, 0x2f, 0xf7, 0x13, 0xf4, 0x20, 0x57, 0x53, 0x8f, 0x13, + 0x9a, 0xfa, 0xcf, 0xf6, 0x45, 0xad, 0x58, 0x6b, 0xff, 0xb7, 0x4a, 0x70, 0x2a, 0xd3, 0xe0, 0x7a, + 0x0c, 0x63, 0x73, 0xdb, 0x18, 0x9b, 0x57, 0xfb, 0x0e, 0x08, 0x91, 0x3b, 0x40, 0xf7, 0x12, 0x03, + 0x74, 0xa5, 0x7f, 0x92, 0xc5, 0xa3, 0xf4, 0xfd, 0x32, 0x5c, 0xc8, 0xac, 0x17, 0x2b, 0xb7, 0x57, + 0x0c, 0xe5, 0xf6, 0x6b, 0x09, 0xe5, 0xb6, 0x5d, 0x5c, 0xfb, 0xc9, 0x68, 0xbb, 0x45, 0x60, 0x04, + 0x16, 0xde, 0xe5, 0x31, 0x35, 0xdd, 0x46, 0x60, 0x04, 0x45, 0x08, 0x9b, 0x74, 0x7f, 0x98, 0x34, + 0xdc, 0xff, 0x83, 0x05, 0x67, 0x33, 0xe7, 0xe6, 0x18, 0xf4, 0x8c, 0xeb, 0xa6, 0x9e, 0xf1, 0xa5, + 0xbe, 0x57, 0x6b, 0x8e, 0xe2, 0xf1, 0xbb, 0x43, 0x39, 0xdf, 0xc2, 0xd4, 0x1f, 0xb7, 0x61, 0xcc, + 0x69, 0x34, 0x48, 0x18, 0xae, 0xb1, 0x54, 0x13, 0xdc, 0xf6, 0xfa, 0x2a, 0xbb, 0x9c, 0xc6, 0xc5, + 0x87, 0xfb, 0xd5, 0xd9, 0x24, 0x89, 0x18, 0x8c, 0x75, 0x0a, 0xe8, 0xeb, 0x30, 0x12, 0xca, 0x24, + 0xbf, 0x03, 0x8f, 0x9f, 0xe4, 0x97, 0x49, 0x92, 0x4a, 0xbd, 0xa3, 0x48, 0xa2, 0x3f, 0xa7, 0x87, + 0xf7, 0x2a, 0x50, 0x6c, 0xf2, 0x4e, 0x3e, 0x46, 0x90, 0x2f, 0xf3, 0x39, 0x7c, 0xb9, 0xaf, 0xe7, + 0xf0, 0xef, 0xc1, 0x74, 0xc8, 0xc3, 0xe5, 0xc6, 0x2e, 0x32, 0x7c, 0x2d, 0xb2, 0x88, 0x83, 0xf5, + 0x04, 0x0c, 0xa7, 0xb0, 0xd1, 0x8a, 0x6c, 0x95, 0x39, 0x43, 0xf1, 0xe5, 0x79, 0x29, 0x6e, 0x51, + 0x38, 0x44, 0x9d, 0x4c, 0x4e, 0x02, 0x1b, 0x7e, 0xad, 0x26, 0xfa, 0x3a, 0x00, 0x5d, 0x44, 0x42, + 0x85, 0x33, 0x9c, 0xcf, 0x42, 0x29, 0x6f, 0x69, 0x66, 0xbe, 0xc0, 0x60, 0x11, 0x0d, 0x96, 0x14, + 0x11, 0xac, 0x11, 0x44, 0x0e, 0x4c, 0xc4, 0xff, 0x30, 0xd9, 0x2c, 0x0a, 0xb0, 0xc6, 0x5a, 0x48, + 0x12, 0x67, 0xe6, 0x8d, 0x25, 0x9d, 0x04, 0x36, 0x29, 0xa2, 0xaf, 0xc1, 0xd9, 0xdd, 0x5c, 0xbf, + 0x23, 0x2e, 0x4b, 0x9e, 0x3f, 0xd8, 0xaf, 0x9e, 0xcd, 0xf7, 0x36, 0xca, 0xaf, 0x6f, 0xff, 0x8f, + 0x00, 0xcf, 0x14, 0x70, 0x7a, 0x34, 0x6f, 0xfa, 0x0c, 0xbc, 0x9c, 0xd4, 0xab, 0xcc, 0x66, 0x56, + 0x36, 0x14, 0x2d, 0x89, 0x0d, 0x55, 0xfa, 0xd8, 0x1b, 0xea, 0xa7, 0x2c, 0xed, 0x9a, 0xc5, 0x3d, + 0xca, 0xbf, 0x74, 0xc4, 0x13, 0xec, 0x09, 0xaa, 0xc0, 0x36, 0x33, 0xf4, 0x48, 0xaf, 0xf5, 0xdd, + 0x9d, 0xfe, 0x15, 0x4b, 0xbf, 0x9a, 0x9d, 0x60, 0x80, 0xab, 0x98, 0xae, 0x1f, 0xf5, 0xfb, 0x8f, + 0x2b, 0xd9, 0xc0, 0xef, 0x5b, 0x70, 0x36, 0x55, 0xcc, 0xfb, 0x40, 0x42, 0x11, 0xce, 0x70, 0xfd, + 0x63, 0x77, 0x5e, 0x12, 0xe4, 0xdf, 0x70, 0x43, 0x7c, 0xc3, 0xd9, 0x5c, 0xbc, 0x64, 0xd7, 0x7f, + 0xf2, 0x5f, 0x55, 0x4f, 0xb0, 0x06, 0x4c, 0x44, 0x9c, 0xdf, 0x75, 0xd4, 0x81, 0x8b, 0x8d, 0x6e, + 0x10, 0xc4, 0x8b, 0x35, 0x63, 0x73, 0xf2, 0xdb, 0xe2, 0xf3, 0x07, 0xfb, 0xd5, 0x8b, 0x8b, 0x3d, + 0x70, 0x71, 0x4f, 0x6a, 0xc8, 0x03, 0xd4, 0x4e, 0x79, 0xf7, 0x31, 0x06, 0x90, 0xa3, 0x05, 0x4a, + 0xfb, 0x02, 0x72, 0x3f, 0xdd, 0x0c, 0x1f, 0xc1, 0x0c, 0xca, 0xc7, 0xab, 0xbb, 0xf9, 0xc1, 0x64, + 0x33, 0x98, 0xbd, 0x05, 0x17, 0x8a, 0x17, 0xd3, 0x91, 0x42, 0x50, 0xfc, 0x9e, 0x05, 0xe7, 0x0b, + 0x43, 0xb3, 0xfd, 0x19, 0xbc, 0x2c, 0xd8, 0xdf, 0xb6, 0xe0, 0xd9, 0xcc, 0x1a, 0xc9, 0xc7, 0x83, + 0x0d, 0x5a, 0xa8, 0x39, 0xc3, 0xc6, 0x41, 0x8a, 0x24, 0x00, 0xc7, 0x38, 0x86, 0xbf, 0x68, 0xa9, + 0xa7, 0xbf, 0xe8, 0x3f, 0xb5, 0x20, 0x75, 0xd4, 0x1f, 0x83, 0xe4, 0xb9, 0x6a, 0x4a, 0x9e, 0xcf, + 0xf7, 0x33, 0x9a, 0x39, 0x42, 0xe7, 0xbf, 0x9d, 0x82, 0xd3, 0x39, 0x2f, 0xc8, 0x77, 0x61, 0x66, + 0xab, 0x41, 0xcc, 0x90, 0x21, 0x45, 0xd1, 0xff, 0x0a, 0xe3, 0x8b, 0x2c, 0x9c, 0x3a, 0xd8, 0xaf, + 0xce, 0xa4, 0x50, 0x70, 0xba, 0x09, 0xf4, 0x6d, 0x0b, 0x4e, 0x3a, 0x0f, 0xc2, 0x65, 0x7a, 0x83, + 0x70, 0x1b, 0x0b, 0x2d, 0xbf, 0xb1, 0x43, 0x05, 0x33, 0xb9, 0xad, 0xde, 0xc8, 0x54, 0x85, 0xdf, + 0xab, 0xa7, 0xf0, 0x8d, 0xe6, 0x2b, 0x07, 0xfb, 0xd5, 0x93, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x84, + 0x45, 0x0e, 0x3f, 0x27, 0xda, 0x2e, 0x0a, 0x6a, 0x93, 0xf5, 0xd4, 0x9f, 0x8b, 0xc4, 0x12, 0x82, + 0x15, 0x1d, 0xf4, 0x4d, 0x18, 0xdd, 0x92, 0xf1, 0x2b, 0x32, 0x44, 0xee, 0x78, 0x20, 0x8b, 0xa3, + 0x7a, 0x70, 0x07, 0x1c, 0x85, 0x84, 0x63, 0xa2, 0xe8, 0x5d, 0x28, 0x7b, 0x9b, 0x61, 0x51, 0x08, + 0xe9, 0x84, 0xa7, 0x35, 0x8f, 0x76, 0xb5, 0xbe, 0x52, 0xc7, 0xb4, 0x22, 0xba, 0x01, 0xe5, 0xe0, + 0x7e, 0x53, 0xd8, 0x71, 0x32, 0x37, 0x29, 0x5e, 0x58, 0xca, 0xe9, 0x15, 0xa3, 0x84, 0x17, 0x96, + 0x30, 0x25, 0x81, 0x6a, 0x30, 0xc8, 0x9e, 0x5d, 0x0b, 0xd1, 0x36, 0xf3, 0x2a, 0x5f, 0x10, 0xbe, + 0x80, 0xbf, 0x87, 0x64, 0x08, 0x98, 0x13, 0x42, 0x1b, 0x30, 0xd4, 0x70, 0xbd, 0x26, 0x09, 0x84, + 0x2c, 0xfb, 0xb9, 0x4c, 0x8b, 0x0d, 0xc3, 0xc8, 0xa1, 0xc9, 0x0d, 0x18, 0x0c, 0x03, 0x0b, 0x5a, + 0x8c, 0x2a, 0xe9, 0x6c, 0x6f, 0xca, 0x13, 0x2b, 0x9b, 0x2a, 0xe9, 0x6c, 0xaf, 0xd4, 0x0b, 0xa9, + 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xb7, 0xa0, 0xb4, 0xd9, 0x10, 0x4f, 0xaa, 0x33, 0xd5, 0x9b, 0x66, + 0xc0, 0xb2, 0x85, 0xa1, 0x83, 0xfd, 0x6a, 0x69, 0x65, 0x11, 0x97, 0x36, 0x1b, 0x68, 0x1d, 0x86, + 0x37, 0x79, 0xbc, 0x20, 0xa1, 0x1f, 0x7d, 0x31, 0x3b, 0x94, 0x51, 0x2a, 0xa4, 0x10, 0x7f, 0xdb, + 0x2a, 0x00, 0x58, 0x12, 0x61, 0x09, 0xcf, 0x54, 0xdc, 0x23, 0x11, 0x29, 0x76, 0xee, 0x68, 0xb1, + 0xaa, 0x44, 0xa0, 0x71, 0x45, 0x05, 0x6b, 0x14, 0xe9, 0xaa, 0x76, 0x1e, 0x75, 0x03, 0x96, 0x11, + 0x45, 0x18, 0x66, 0x32, 0x57, 0xf5, 0xbc, 0x44, 0x2a, 0x5a, 0xd5, 0x0a, 0x09, 0xc7, 0x44, 0xd1, + 0x0e, 0x4c, 0xec, 0x86, 0x9d, 0x6d, 0x22, 0xb7, 0x34, 0x8b, 0x30, 0x98, 0x23, 0xcd, 0xde, 0x15, + 0x88, 0x6e, 0x10, 0x75, 0x9d, 0x56, 0x8a, 0x0b, 0xb1, 0x6b, 0xcd, 0x5d, 0x9d, 0x18, 0x36, 0x69, + 0xd3, 0xe1, 0xff, 0xa8, 0xeb, 0xdf, 0xdf, 0x8b, 0x88, 0x08, 0xf0, 0x9a, 0x39, 0xfc, 0x1f, 0x70, + 0x94, 0xf4, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xd0, 0x5d, 0x31, 0x3c, 0x8c, 0x7b, 0x4e, 0xe7, 0x07, + 0xc2, 0x9f, 0x97, 0x48, 0x39, 0x83, 0xc2, 0xb8, 0x65, 0x4c, 0x8a, 0x71, 0xc9, 0xce, 0xb6, 0x1f, + 0xf9, 0x5e, 0x82, 0x43, 0xcf, 0xe4, 0x73, 0xc9, 0x5a, 0x06, 0x7e, 0x9a, 0x4b, 0x66, 0x61, 0xe1, + 0xcc, 0xb6, 0x50, 0x13, 0x26, 0x3b, 0x7e, 0x10, 0x3d, 0xf0, 0x03, 0xb9, 0xbe, 0x50, 0x81, 0xa2, + 0xd4, 0xc0, 0x14, 0x2d, 0x32, 0xb7, 0x20, 0x13, 0x82, 0x13, 0x34, 0xd1, 0x97, 0x61, 0x38, 0x6c, + 0x38, 0x2d, 0xb2, 0x7a, 0xbb, 0x72, 0x22, 0xff, 0xf8, 0xa9, 0x73, 0x94, 0x9c, 0xd5, 0xc5, 0xc3, + 0x3d, 0x71, 0x14, 0x2c, 0xc9, 0xa1, 0x15, 0x18, 0x64, 0x39, 0xef, 0x59, 0x34, 0xe2, 0x9c, 0x78, + 0xfe, 0xa9, 0x47, 0x3d, 0x9c, 0x37, 0xb1, 0x62, 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0x34, 0x05, 0x7e, + 0x58, 0x39, 0x95, 0xbf, 0x07, 0x84, 0x82, 0xe1, 0x76, 0xbd, 0x68, 0x0f, 0x28, 0x24, 0x1c, 0x13, + 0xa5, 0x9c, 0x99, 0x72, 0xd3, 0xd3, 0x05, 0x0e, 0x9b, 0xb9, 0xbc, 0x94, 0x71, 0x66, 0xca, 0x49, + 0x29, 0x09, 0xfb, 0x37, 0x47, 0xd2, 0x32, 0x0b, 0xd3, 0x30, 0xfd, 0xc7, 0x56, 0xca, 0x63, 0xe3, + 0xf3, 0xfd, 0x2a, 0xbc, 0x9f, 0xe0, 0xc5, 0xf5, 0xdb, 0x16, 0x9c, 0xee, 0x64, 0x7e, 0x88, 0x10, + 0x00, 0xfa, 0xd3, 0x9b, 0xf3, 0x4f, 0x57, 0x91, 0xab, 0xb3, 0xe1, 0x38, 0xa7, 0xa5, 0xa4, 0x72, + 0xa0, 0xfc, 0xb1, 0x95, 0x03, 0x6b, 0x30, 0xd2, 0xe0, 0x37, 0x39, 0x99, 0x3c, 0xa2, 0xaf, 0xb8, + 0xab, 0xdc, 0x4e, 0x2b, 0x2a, 0x62, 0x45, 0x02, 0xfd, 0xb4, 0x05, 0xe7, 0x93, 0x5d, 0xc7, 0x84, + 0x81, 0x85, 0xbb, 0x26, 0x57, 0x6b, 0xad, 0x88, 0xef, 0x4f, 0xc9, 0xff, 0x06, 0xf2, 0x61, 0x2f, + 0x04, 0x5c, 0xdc, 0x18, 0x5a, 0xca, 0xd0, 0xab, 0x0d, 0x99, 0x36, 0xc9, 0x3e, 0x74, 0x6b, 0x6f, + 0xc0, 0x78, 0xdb, 0xef, 0x7a, 0x91, 0xf0, 0xba, 0x14, 0xae, 0x5b, 0xcc, 0x65, 0x69, 0x4d, 0x2b, + 0xc7, 0x06, 0x56, 0x42, 0x23, 0x37, 0xf2, 0xd8, 0x1a, 0xb9, 0x0f, 0x61, 0xdc, 0xd3, 0x1e, 0x24, + 0x14, 0xdd, 0x60, 0x85, 0x76, 0x51, 0xc3, 0xe6, 0xbd, 0xd4, 0x4b, 0xb0, 0x41, 0xad, 0x58, 0x5b, + 0x06, 0x1f, 0x4f, 0x5b, 0x76, 0xac, 0x57, 0x62, 0xfb, 0xef, 0x95, 0x32, 0x6e, 0x0c, 0x5c, 0x2b, + 0xf7, 0x8e, 0xa9, 0x95, 0xbb, 0x94, 0xd4, 0xca, 0xa5, 0x4c, 0x55, 0x86, 0x42, 0xae, 0xff, 0x0c, + 0xa6, 0x7d, 0xc7, 0xd2, 0xfe, 0x0b, 0x16, 0x9c, 0x61, 0xb6, 0x0f, 0xda, 0xc0, 0xc7, 0xb6, 0x77, + 0x30, 0x87, 0xd8, 0x5b, 0xd9, 0xe4, 0x70, 0x5e, 0x3b, 0x76, 0x0b, 0x2e, 0xf6, 0x3a, 0x77, 0x99, + 0x7f, 0x71, 0x53, 0xb9, 0x57, 0xc4, 0xfe, 0xc5, 0xcd, 0xd5, 0x25, 0xcc, 0x20, 0xfd, 0x86, 0x5d, + 0xb4, 0xff, 0x4f, 0x0b, 0xca, 0x35, 0xbf, 0x79, 0x0c, 0x37, 0xfa, 0x2f, 0x19, 0x37, 0xfa, 0x67, + 0xb2, 0x4f, 0xfc, 0x66, 0xae, 0xb1, 0x6f, 0x39, 0x61, 0xec, 0x3b, 0x9f, 0x47, 0xa0, 0xd8, 0xb4, + 0xf7, 0xb7, 0xcb, 0x30, 0x56, 0xf3, 0x9b, 0x6a, 0x9f, 0xfd, 0x77, 0x8f, 0xf3, 0x8c, 0x28, 0x37, + 0x67, 0x99, 0x46, 0x99, 0xf9, 0x13, 0xcb, 0xa8, 0x17, 0x7f, 0xc6, 0x5e, 0x13, 0xdd, 0x23, 0xee, + 0xd6, 0x76, 0x44, 0x9a, 0xc9, 0xcf, 0x39, 0xbe, 0xd7, 0x44, 0x7f, 0x58, 0x86, 0xa9, 0x44, 0xeb, + 0xa8, 0x05, 0x13, 0x2d, 0xdd, 0x94, 0x24, 0xd6, 0xe9, 0x63, 0x59, 0xa1, 0xc4, 0x6b, 0x0c, 0xad, + 0x08, 0x9b, 0xc4, 0xd1, 0x1c, 0x80, 0xa7, 0xfb, 0xa4, 0xab, 0x98, 0xd0, 0x9a, 0x3f, 0xba, 0x86, + 0x81, 0xde, 0x84, 0xb1, 0xc8, 0xef, 0xf8, 0x2d, 0x7f, 0x6b, 0xef, 0xa6, 0x8a, 0x8f, 0xac, 0x5c, + 0x96, 0x37, 0x62, 0x10, 0xd6, 0xf1, 0xd0, 0x43, 0x98, 0x51, 0x44, 0xea, 0x4f, 0xc0, 0xbc, 0xc6, + 0xd4, 0x26, 0xeb, 0x49, 0x8a, 0x38, 0xdd, 0x08, 0x7a, 0x0b, 0x26, 0x99, 0xef, 0x34, 0xab, 0x7f, + 0x93, 0xec, 0xc9, 0xe0, 0xd2, 0x4c, 0xc2, 0x5e, 0x33, 0x20, 0x38, 0x81, 0x89, 0x16, 0x61, 0xa6, + 0xed, 0x86, 0x89, 0xea, 0x43, 0xac, 0x3a, 0xeb, 0xc0, 0x5a, 0x12, 0x88, 0xd3, 0xf8, 0xf6, 0x2f, + 0x88, 0x39, 0xf6, 0x22, 0xf7, 0xd3, 0xed, 0xf8, 0xc9, 0xde, 0x8e, 0xdf, 0xb7, 0x60, 0x9a, 0xb6, + 0xce, 0x1c, 0x42, 0xa5, 0x20, 0xa5, 0xd2, 0x8f, 0x58, 0x05, 0xe9, 0x47, 0x2e, 0x51, 0xb6, 0xdd, + 0xf4, 0xbb, 0x91, 0xd0, 0x8e, 0x6a, 0x7c, 0x99, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x08, 0xc4, + 0xab, 0x7b, 0x1d, 0x8f, 0x04, 0x01, 0x16, 0x50, 0x99, 0x9d, 0x64, 0x20, 0x3b, 0x3b, 0x09, 0x0f, + 0x32, 0x2f, 0xfc, 0xe8, 0x84, 0x48, 0xab, 0x05, 0x99, 0x97, 0x0e, 0x76, 0x31, 0x8e, 0xfd, 0xd7, + 0xca, 0x50, 0xa9, 0xf9, 0xcd, 0x45, 0x12, 0x44, 0xee, 0xa6, 0xdb, 0x70, 0x22, 0xa2, 0xe5, 0xdb, + 0x7d, 0x0d, 0x80, 0x3d, 0x22, 0x0b, 0xb2, 0x22, 0xa8, 0xd7, 0x15, 0x04, 0x6b, 0x58, 0x54, 0x2a, + 0xd9, 0x21, 0x7b, 0xda, 0xc9, 0xab, 0xa4, 0x92, 0x9b, 0xbc, 0x18, 0x4b, 0x38, 0xba, 0xc5, 0x42, + 0x19, 0x2d, 0x3f, 0xec, 0xb8, 0x01, 0xcf, 0x4c, 0x4e, 0x1a, 0xbe, 0xd7, 0x0c, 0x45, 0xe0, 0xb7, + 0x8a, 0x08, 0x44, 0x94, 0x82, 0xe3, 0xcc, 0x5a, 0xa8, 0x06, 0x27, 0x1b, 0x01, 0x69, 0x12, 0x2f, + 0x72, 0x9d, 0xd6, 0x42, 0xd7, 0x6b, 0xb6, 0x78, 0x4a, 0x9e, 0x01, 0x23, 0x83, 0xe8, 0xc9, 0xc5, + 0x0c, 0x1c, 0x9c, 0x59, 0x53, 0x7c, 0x0a, 0x23, 0x32, 0x98, 0xfa, 0x14, 0x56, 0x4f, 0xc2, 0x59, + 0xe3, 0xf1, 0x10, 0x2e, 0x6e, 0x3b, 0xae, 0xc7, 0xea, 0x0d, 0x25, 0x1a, 0xcf, 0xc0, 0xc1, 0x99, + 0x35, 0xed, 0x3f, 0x2d, 0xc3, 0x38, 0x9d, 0x18, 0xe5, 0x71, 0xf3, 0x86, 0xe1, 0x71, 0x73, 0x31, + 0xe1, 0x71, 0x33, 0xad, 0xe3, 0x6a, 0xfe, 0x35, 0xef, 0x03, 0xf2, 0x45, 0x52, 0x82, 0xeb, 0xc4, + 0x23, 0x7c, 0xc8, 0x98, 0x92, 0xb1, 0x1c, 0xfb, 0xa3, 0xdc, 0x4e, 0x61, 0xe0, 0x8c, 0x5a, 0x9f, + 0xfa, 0xea, 0x1c, 0xaf, 0xaf, 0xce, 0x6f, 0x59, 0x6c, 0x05, 0x2c, 0xad, 0xd7, 0xb9, 0x13, 0x39, + 0xba, 0x0a, 0x63, 0xec, 0x18, 0x63, 0xb1, 0x3c, 0xa4, 0x4b, 0x0b, 0xcb, 0x6e, 0xbb, 0x1e, 0x17, + 0x63, 0x1d, 0x07, 0x5d, 0x86, 0x91, 0x90, 0x38, 0x41, 0x63, 0x5b, 0x9d, 0xe1, 0xc2, 0xff, 0x84, + 0x97, 0x61, 0x05, 0x45, 0x1f, 0xc4, 0x11, 0xe1, 0xcb, 0xf9, 0x1e, 0xe9, 0x7a, 0x7f, 0x38, 0x1f, + 0xcc, 0x0f, 0x03, 0x6f, 0xdf, 0x03, 0x94, 0xc6, 0xef, 0xe3, 0x89, 0x5f, 0xd5, 0x8c, 0x59, 0x3c, + 0x9a, 0x8a, 0x57, 0xfc, 0xef, 0x2d, 0x98, 0xac, 0xf9, 0x4d, 0xca, 0x9f, 0x7f, 0x98, 0x98, 0xb1, + 0x9e, 0xc1, 0x63, 0xa8, 0x20, 0x83, 0xc7, 0x81, 0x05, 0x17, 0xd8, 0xe7, 0x47, 0xc4, 0x6b, 0xc6, + 0x06, 0x4f, 0xdd, 0xdf, 0xe3, 0x01, 0x4c, 0x05, 0x3c, 0x7c, 0xd7, 0x9a, 0xd3, 0xe9, 0xb8, 0xde, + 0x96, 0x7c, 0xdf, 0xf6, 0x46, 0xe1, 0xbb, 0x8d, 0x24, 0x49, 0x11, 0x02, 0x4c, 0x77, 0x54, 0x35, + 0x88, 0xe2, 0x64, 0x2b, 0x3c, 0x2b, 0x8d, 0xd6, 0x1f, 0x2d, 0x41, 0xa5, 0x96, 0x95, 0x26, 0x81, + 0x80, 0xd3, 0x75, 0xec, 0xe7, 0x60, 0xb0, 0xe6, 0x37, 0x7b, 0x04, 0x8f, 0xfe, 0x3b, 0x16, 0x0c, + 0xd7, 0xfc, 0xe6, 0x31, 0x98, 0x10, 0xdf, 0x31, 0x4d, 0x88, 0x67, 0x72, 0x36, 0x47, 0x8e, 0xd5, + 0xf0, 0x9f, 0x0d, 0xc0, 0x04, 0xed, 0xa7, 0xbf, 0x25, 0xd7, 0xab, 0xb1, 0x36, 0xac, 0x3e, 0xd6, + 0x06, 0xbd, 0xd0, 0xfa, 0xad, 0x96, 0xff, 0x20, 0xb9, 0x76, 0x57, 0x58, 0x29, 0x16, 0x50, 0xf4, + 0x0a, 0x8c, 0x74, 0x02, 0xb2, 0xeb, 0xfa, 0xe2, 0xa6, 0xa8, 0x19, 0x64, 0x6b, 0xa2, 0x1c, 0x2b, + 0x0c, 0xf4, 0x06, 0x8c, 0x87, 0xae, 0x47, 0xa5, 0x62, 0x7e, 0xf4, 0x0e, 0xb0, 0x83, 0x81, 0xe7, + 0xd2, 0xd3, 0xca, 0xb1, 0x81, 0x85, 0xee, 0xc1, 0x28, 0xfb, 0xcf, 0x78, 0xeb, 0xe0, 0x91, 0x79, + 0xab, 0x48, 0x94, 0x2e, 0x08, 0xe0, 0x98, 0x16, 0x15, 0x38, 0x22, 0x99, 0x8f, 0x2a, 0x14, 0x41, + 0x84, 0x95, 0xc0, 0xa1, 0x32, 0x55, 0x85, 0x58, 0xc3, 0x42, 0x2f, 0xc3, 0x68, 0xe4, 0xb8, 0xad, + 0x5b, 0xae, 0xc7, 0x3c, 0x51, 0x68, 0xff, 0x45, 0xbe, 0x72, 0x51, 0x88, 0x63, 0x38, 0xbd, 0xd5, + 0xb0, 0xd8, 0x6a, 0x0b, 0x7b, 0x91, 0xc8, 0xa2, 0x59, 0xe6, 0xb7, 0x9a, 0x5b, 0xaa, 0x14, 0x6b, + 0x18, 0x68, 0x1b, 0xce, 0xb9, 0x1e, 0xcb, 0x3b, 0x47, 0xea, 0x3b, 0x6e, 0x67, 0xe3, 0x56, 0xfd, + 0x2e, 0x09, 0xdc, 0xcd, 0xbd, 0x05, 0xa7, 0xb1, 0x43, 0xbc, 0x26, 0x53, 0x7a, 0x8d, 0x2c, 0x3c, + 0x2f, 0xba, 0x78, 0x6e, 0xb5, 0x00, 0x17, 0x17, 0x52, 0x42, 0x36, 0xe5, 0x39, 0x01, 0x71, 0xda, + 0x42, 0xbb, 0xc5, 0x73, 0x56, 0xb1, 0x12, 0x2c, 0x20, 0xf6, 0xeb, 0x6c, 0x4f, 0xdc, 0xae, 0xa3, + 0xcf, 0x1a, 0x3c, 0xf4, 0xb4, 0xce, 0x43, 0x0f, 0xf7, 0xab, 0x43, 0xb7, 0xeb, 0x5a, 0x9c, 0xad, + 0x6b, 0x70, 0xaa, 0xe6, 0x37, 0x6b, 0x7e, 0x10, 0xad, 0xf8, 0xc1, 0x03, 0x27, 0x68, 0xca, 0x25, + 0x58, 0x95, 0x91, 0xc6, 0x28, 0x67, 0x18, 0xe4, 0x6c, 0xd6, 0x88, 0x22, 0xf6, 0x3a, 0xbb, 0x9f, + 0x1c, 0xf1, 0x61, 0x77, 0x83, 0x49, 0xca, 0x2a, 0xbb, 0xe3, 0x75, 0x27, 0x22, 0xe8, 0x36, 0x4c, + 0x34, 0x74, 0xd9, 0x44, 0x54, 0x7f, 0x49, 0x9e, 0xe8, 0x86, 0xe0, 0x92, 0x29, 0xcc, 0x98, 0xf5, + 0xed, 0xdf, 0xb7, 0x44, 0x2b, 0x1a, 0xd7, 0xe8, 0xe3, 0x60, 0x59, 0xcc, 0x62, 0x4e, 0xfc, 0xa6, + 0x7a, 0xaa, 0x5f, 0xc6, 0x84, 0xbe, 0x06, 0x67, 0x8d, 0x42, 0xe9, 0x14, 0xa2, 0xe5, 0xdf, 0x67, + 0x9a, 0x49, 0x9c, 0x87, 0x84, 0xf3, 0xeb, 0xdb, 0x3f, 0x06, 0xa7, 0x93, 0xdf, 0x25, 0x38, 0xfa, + 0x63, 0x7e, 0x5d, 0xe9, 0x68, 0x5f, 0x67, 0xbf, 0x09, 0x33, 0x35, 0x5f, 0x8b, 0xa2, 0xc2, 0xe6, + 0xaf, 0x77, 0x30, 0xb7, 0x5f, 0x1e, 0x61, 0x67, 0x7d, 0x22, 0x65, 0x23, 0xfa, 0x06, 0x4c, 0x86, + 0x84, 0x45, 0x30, 0x94, 0x3a, 0xea, 0x82, 0xa8, 0x0c, 0xf5, 0x65, 0x1d, 0x93, 0xdf, 0xc3, 0xcd, + 0x32, 0x9c, 0xa0, 0x86, 0xda, 0x30, 0xf9, 0xc0, 0xf5, 0x9a, 0xfe, 0x83, 0x50, 0xd2, 0x1f, 0xc9, + 0x37, 0x78, 0xdd, 0xe3, 0x98, 0x89, 0x3e, 0x1a, 0xcd, 0xdd, 0x33, 0x88, 0xe1, 0x04, 0x71, 0xca, + 0x6a, 0x82, 0xae, 0x37, 0x1f, 0xde, 0x09, 0x49, 0x20, 0xe2, 0x2b, 0x32, 0x56, 0x83, 0x65, 0x21, + 0x8e, 0xe1, 0x94, 0xd5, 0xb0, 0x3f, 0x2c, 0xac, 0x03, 0xe3, 0x65, 0x82, 0xd5, 0x60, 0x55, 0x8a, + 0x35, 0x0c, 0xca, 0x8a, 0xd9, 0xbf, 0x75, 0xdf, 0xc3, 0xbe, 0x1f, 0x49, 0xe6, 0xcd, 0xb2, 0xea, + 0x6a, 0xe5, 0xd8, 0xc0, 0xca, 0x89, 0xe6, 0x38, 0x70, 0xd4, 0x68, 0x8e, 0x28, 0x2a, 0x88, 0x64, + 0xc1, 0xe3, 0x91, 0x5f, 0x2b, 0x8a, 0x64, 0x71, 0xf8, 0x58, 0x51, 0x2e, 0xa8, 0xc0, 0xb3, 0x29, + 0x06, 0x68, 0x90, 0x87, 0xab, 0x64, 0x26, 0xf9, 0x3a, 0x1f, 0x1d, 0x09, 0x43, 0xcb, 0x30, 0x1c, + 0xee, 0x85, 0x8d, 0xa8, 0x15, 0x16, 0x65, 0x4e, 0xae, 0x33, 0x94, 0x58, 0x1e, 0xe5, 0xff, 0x43, + 0x2c, 0xeb, 0xa2, 0x06, 0x9c, 0x10, 0x14, 0x17, 0xb7, 0x1d, 0x4f, 0x65, 0x56, 0xe5, 0xbe, 0xb7, + 0x57, 0x0f, 0xf6, 0xab, 0x27, 0x44, 0xcb, 0x3a, 0xf8, 0x70, 0xbf, 0x4a, 0xb7, 0x64, 0x06, 0x04, + 0x67, 0x51, 0xe3, 0x4b, 0xbe, 0xd1, 0xf0, 0xdb, 0x9d, 0x5a, 0xe0, 0x6f, 0xba, 0x2d, 0x52, 0xe4, + 0xd6, 0x50, 0x37, 0x30, 0xc5, 0x92, 0x37, 0xca, 0x70, 0x82, 0x1a, 0xba, 0x0f, 0x53, 0x4e, 0xa7, + 0x33, 0x1f, 0xb4, 0xfd, 0x40, 0x36, 0x30, 0x96, 0x6f, 0x1f, 0x9b, 0x37, 0x51, 0x79, 0x62, 0xd5, + 0x44, 0x21, 0x4e, 0x12, 0xa4, 0x03, 0x25, 0x36, 0x9a, 0x31, 0x50, 0x13, 0xf1, 0x40, 0x89, 0x7d, + 0x99, 0x31, 0x50, 0x19, 0x10, 0x9c, 0x45, 0xcd, 0xfe, 0xf3, 0xec, 0x76, 0xc3, 0xa2, 0x9d, 0xb3, + 0x47, 0x6e, 0x6d, 0x98, 0xe8, 0x30, 0xb6, 0x2f, 0x92, 0x1e, 0x0a, 0x56, 0xf1, 0x46, 0x9f, 0x6a, + 0xf8, 0x07, 0x2c, 0xab, 0xb3, 0xe1, 0x8e, 0x5d, 0xd3, 0xc9, 0x61, 0x93, 0xba, 0xfd, 0xaf, 0x67, + 0x99, 0xe8, 0x58, 0xe7, 0xba, 0xf5, 0x61, 0xf1, 0xe4, 0x57, 0x48, 0xc9, 0xb3, 0xf9, 0x56, 0xac, + 0x78, 0x7d, 0x89, 0x67, 0xc3, 0x58, 0xd6, 0x45, 0x5f, 0x87, 0x49, 0xd7, 0x73, 0xe3, 0x24, 0xeb, + 0x61, 0xe5, 0x64, 0x7e, 0x2c, 0x39, 0x85, 0xa5, 0x27, 0x44, 0xd5, 0x2b, 0xe3, 0x04, 0x31, 0xf4, + 0x01, 0xf3, 0x50, 0x96, 0xa4, 0x4b, 0xfd, 0x90, 0xd6, 0x9d, 0x91, 0x25, 0x59, 0x8d, 0x08, 0xea, + 0xc2, 0x89, 0x74, 0xb2, 0xf9, 0xb0, 0x62, 0xe7, 0x5f, 0x00, 0xd3, 0xf9, 0xe2, 0xe3, 0xcc, 0x95, + 0x69, 0x58, 0x88, 0xb3, 0xe8, 0xa3, 0x5b, 0xc9, 0x54, 0xe0, 0x65, 0xc3, 0xfe, 0x95, 0x4a, 0x07, + 0x3e, 0x51, 0x98, 0x05, 0x7c, 0x0b, 0xce, 0x6b, 0x79, 0x8d, 0xaf, 0x07, 0x0e, 0xf3, 0x90, 0x73, + 0xd9, 0x69, 0xa4, 0x09, 0xb5, 0xcf, 0x1e, 0xec, 0x57, 0xcf, 0x6f, 0x14, 0x21, 0xe2, 0x62, 0x3a, + 0xe8, 0x36, 0x9c, 0xe2, 0x91, 0x90, 0x96, 0x88, 0xd3, 0x6c, 0xb9, 0x9e, 0x92, 0x9a, 0x39, 0xef, + 0x3a, 0x7b, 0xb0, 0x5f, 0x3d, 0x35, 0x9f, 0x85, 0x80, 0xb3, 0xeb, 0xa1, 0x77, 0x60, 0xb4, 0xe9, + 0x49, 0x2e, 0x3b, 0x64, 0xa4, 0x8e, 0x1e, 0x5d, 0x5a, 0xaf, 0xab, 0xef, 0x8f, 0xff, 0xe0, 0xb8, + 0x02, 0xda, 0xe2, 0x06, 0x58, 0xa5, 0x35, 0x1f, 0x4e, 0x05, 0xc8, 0x4d, 0x1a, 0x96, 0x8c, 0xd0, + 0x22, 0xdc, 0xf3, 0x40, 0x3d, 0x3f, 0x35, 0xa2, 0x8e, 0x18, 0x84, 0xd1, 0xfb, 0x80, 0x44, 0xbe, + 0xaf, 0xf9, 0x06, 0xcb, 0xa8, 0xa9, 0x79, 0x45, 0x2b, 0x3d, 0x49, 0x3d, 0x85, 0x81, 0x33, 0x6a, + 0xa1, 0x1b, 0x94, 0x3d, 0xea, 0xa5, 0x82, 0xfd, 0x4a, 0x7d, 0x56, 0x65, 0x89, 0x74, 0x02, 0xc2, + 0x1c, 0x79, 0x4d, 0x8a, 0x38, 0x51, 0x0f, 0x35, 0xe1, 0x9c, 0xd3, 0x8d, 0x7c, 0x66, 0xdb, 0x36, + 0x51, 0x37, 0xfc, 0x1d, 0xe2, 0x31, 0xb7, 0x92, 0x11, 0x16, 0x78, 0xf7, 0xdc, 0x7c, 0x01, 0x1e, + 0x2e, 0xa4, 0x42, 0xaf, 0x53, 0x74, 0x2c, 0x34, 0xb3, 0xb3, 0x11, 0x25, 0x81, 0xfb, 0x62, 0x48, + 0x0c, 0xf4, 0x26, 0x8c, 0x6d, 0xfb, 0x61, 0xb4, 0x4e, 0xa2, 0x07, 0x7e, 0xb0, 0x23, 0x12, 0x8c, + 0xc4, 0x49, 0x9d, 0x62, 0x10, 0xd6, 0xf1, 0xd0, 0x4b, 0x30, 0xcc, 0x9c, 0x1e, 0x57, 0x97, 0xd8, + 0x59, 0x3b, 0x12, 0xf3, 0x98, 0x1b, 0xbc, 0x18, 0x4b, 0xb8, 0x44, 0x5d, 0xad, 0x2d, 0x32, 0x76, + 0x9c, 0x40, 0x5d, 0xad, 0x2d, 0x62, 0x09, 0xa7, 0xcb, 0x35, 0xdc, 0x76, 0x02, 0x52, 0x0b, 0xfc, + 0x06, 0x09, 0xb5, 0x54, 0x62, 0xcf, 0xf0, 0xf4, 0x29, 0x74, 0xb9, 0xd6, 0xb3, 0x10, 0x70, 0x76, + 0x3d, 0x44, 0xd2, 0x39, 0xbd, 0x27, 0xf3, 0x8d, 0xfe, 0x69, 0x71, 0xb0, 0xcf, 0xb4, 0xde, 0x1e, + 0x4c, 0xab, 0x6c, 0xe2, 0x3c, 0x61, 0x4a, 0x58, 0x99, 0xca, 0xcf, 0xe9, 0x9f, 0xf9, 0xd6, 0x47, + 0xb9, 0x51, 0xac, 0x26, 0x28, 0xe1, 0x14, 0x6d, 0x23, 0xb2, 0xf3, 0x74, 0xcf, 0xc8, 0xce, 0x57, + 0x60, 0x34, 0xec, 0xde, 0x6f, 0xfa, 0x6d, 0xc7, 0xf5, 0x98, 0xef, 0x98, 0x76, 0x71, 0xaf, 0x4b, + 0x00, 0x8e, 0x71, 0xd0, 0x0a, 0x8c, 0x38, 0xd2, 0x47, 0x02, 0xe5, 0x07, 0xad, 0x54, 0x9e, 0x11, + 0x3c, 0x8e, 0x9b, 0xf4, 0x8a, 0x50, 0x75, 0xd1, 0xdb, 0x30, 0x21, 0x02, 0xe3, 0x08, 0x7d, 0xfc, + 0x09, 0xf3, 0x29, 0x7f, 0x5d, 0x07, 0x62, 0x13, 0x17, 0xdd, 0x81, 0xb1, 0xc8, 0x6f, 0x09, 0x45, + 0x6e, 0x58, 0x39, 0x9d, 0x1f, 0x5b, 0x7a, 0x43, 0xa1, 0xe9, 0xd6, 0x3b, 0x55, 0x15, 0xeb, 0x74, + 0xd0, 0x06, 0x5f, 0xef, 0x2c, 0x71, 0x18, 0x09, 0x2b, 0x67, 0xf2, 0xcf, 0x24, 0x95, 0x5f, 0xcc, + 0xdc, 0x0e, 0xa2, 0x26, 0xd6, 0xc9, 0xa0, 0xeb, 0x30, 0xd3, 0x09, 0x5c, 0x9f, 0xad, 0x09, 0xe5, + 0xf3, 0x51, 0x31, 0x75, 0x48, 0xb5, 0x24, 0x02, 0x4e, 0xd7, 0x61, 0x71, 0x8d, 0x44, 0x61, 0xe5, + 0x2c, 0x4f, 0x75, 0xc8, 0xf5, 0x20, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, 0x63, 0x9c, 0x98, 0xeb, 0x29, + 0x2b, 0xb3, 0xf9, 0xd1, 0x32, 0x74, 0x7d, 0x26, 0x97, 0xfd, 0xd5, 0x5f, 0x1c, 0x53, 0x40, 0x4d, + 0x98, 0x0c, 0xf4, 0x1b, 0x70, 0x58, 0x39, 0x57, 0xe0, 0x79, 0x9e, 0xb8, 0x2e, 0xc7, 0x02, 0x81, + 0x51, 0x1c, 0xe2, 0x04, 0x4d, 0xf4, 0x1e, 0x4c, 0x8b, 0xa0, 0x1f, 0xf1, 0x30, 0x9d, 0x8f, 0x5f, + 0xe7, 0xe1, 0x04, 0x0c, 0xa7, 0xb0, 0x79, 0xaa, 0x41, 0xe7, 0x7e, 0x8b, 0x08, 0xd6, 0x77, 0xcb, + 0xf5, 0x76, 0xc2, 0xca, 0x05, 0xc6, 0x1f, 0x44, 0xaa, 0xc1, 0x24, 0x14, 0x67, 0xd4, 0x40, 0x1b, + 0x30, 0xdd, 0x09, 0x08, 0x69, 0xb3, 0x7b, 0x92, 0x38, 0xcf, 0xaa, 0x3c, 0xac, 0x17, 0xed, 0x49, + 0x2d, 0x01, 0x3b, 0xcc, 0x28, 0xc3, 0x29, 0x0a, 0xe8, 0x01, 0x8c, 0xf8, 0xbb, 0x24, 0xd8, 0x26, + 0x4e, 0xb3, 0x72, 0xb1, 0xe0, 0xcd, 0xa8, 0x38, 0xdc, 0x6e, 0x0b, 0xdc, 0x84, 0x4b, 0x9d, 0x2c, + 0xee, 0xed, 0x52, 0x27, 0x1b, 0x43, 0xff, 0x89, 0x05, 0x67, 0xa5, 0x91, 0xba, 0xde, 0xa1, 0xa3, + 0xbe, 0xe8, 0x7b, 0x61, 0x14, 0xf0, 0x40, 0x54, 0xcf, 0xe6, 0x07, 0x67, 0xda, 0xc8, 0xa9, 0xa4, + 0x4c, 0x25, 0x67, 0xf3, 0x30, 0x42, 0x9c, 0xdf, 0x22, 0xbd, 0xd9, 0x87, 0x24, 0x92, 0xcc, 0x68, + 0x3e, 0x5c, 0xf9, 0x60, 0x69, 0xbd, 0xf2, 0x1c, 0x8f, 0xa2, 0x45, 0x37, 0x43, 0x3d, 0x09, 0xc4, + 0x69, 0x7c, 0x74, 0x15, 0x4a, 0x7e, 0x58, 0x79, 0x9e, 0xad, 0xed, 0xb3, 0x39, 0xe3, 0x78, 0xbb, + 0xce, 0x5d, 0xab, 0x6f, 0xd7, 0x71, 0xc9, 0x0f, 0x65, 0xba, 0x3f, 0x7a, 0x9d, 0x0d, 0x2b, 0x2f, + 0x70, 0xc5, 0xba, 0x4c, 0xf7, 0xc7, 0x0a, 0x71, 0x0c, 0x47, 0xdb, 0x30, 0x15, 0x1a, 0x6a, 0x83, + 0xb0, 0x72, 0x89, 0x8d, 0xd4, 0x0b, 0x79, 0x93, 0x66, 0x60, 0x6b, 0x79, 0xb8, 0x4c, 0x2a, 0x38, + 0x49, 0x96, 0xef, 0x2e, 0x4d, 0x71, 0x11, 0x56, 0x5e, 0xec, 0xb1, 0xbb, 0x34, 0x64, 0x7d, 0x77, + 0xe9, 0x34, 0x70, 0x82, 0x26, 0xba, 0xa3, 0x3f, 0xc8, 0xbd, 0x9c, 0xef, 0xa6, 0x9b, 0xf9, 0x14, + 0x77, 0x22, 0xf7, 0x19, 0xee, 0x7b, 0x30, 0x2d, 0xcf, 0x12, 0xba, 0x32, 0x03, 0xb7, 0x49, 0x2a, + 0x2f, 0xc5, 0x9b, 0xf6, 0x46, 0x02, 0x86, 0x53, 0xd8, 0xb3, 0x3f, 0x02, 0x33, 0x29, 0x39, 0xee, + 0x28, 0xef, 0x9b, 0x66, 0x77, 0x60, 0xc2, 0xd8, 0x2b, 0x4f, 0xd7, 0xfd, 0x6d, 0x0c, 0x46, 0x95, + 0x5b, 0x52, 0x8e, 0x39, 0x72, 0xe6, 0xb1, 0xcc, 0x91, 0x57, 0x4c, 0xef, 0xb9, 0xb3, 0x49, 0xef, + 0xb9, 0x91, 0x9a, 0xdf, 0x34, 0x1c, 0xe6, 0x36, 0x32, 0x22, 0x60, 0xe7, 0x71, 0xf9, 0xfe, 0x1f, + 0x74, 0x6a, 0x16, 0xbd, 0x72, 0xdf, 0x6e, 0x78, 0x03, 0x85, 0x46, 0xc2, 0xeb, 0x30, 0xe3, 0xf9, + 0xec, 0x22, 0x42, 0x9a, 0x52, 0xca, 0x64, 0xc2, 0xe4, 0xa8, 0x1e, 0xa1, 0x31, 0x81, 0x80, 0xd3, + 0x75, 0x68, 0x83, 0x5c, 0x1a, 0x4c, 0x5a, 0x25, 0xb9, 0xb0, 0x88, 0x05, 0x94, 0x5e, 0x80, 0xf9, + 0xaf, 0xb0, 0x32, 0x9d, 0x7f, 0x01, 0xe6, 0x95, 0x92, 0x12, 0x67, 0x28, 0x25, 0x4e, 0x66, 0x84, + 0xeb, 0xf8, 0xcd, 0xd5, 0x9a, 0xb8, 0xcb, 0x68, 0xb9, 0x29, 0x9a, 0xab, 0x35, 0xcc, 0x61, 0x68, + 0x1e, 0x86, 0xd8, 0x0f, 0x19, 0xf9, 0x2a, 0x8f, 0x17, 0xad, 0xd6, 0xb4, 0x9c, 0xca, 0xac, 0x02, + 0x16, 0x15, 0x99, 0xfd, 0x81, 0x5e, 0x00, 0x99, 0xfd, 0x61, 0xf8, 0x31, 0xed, 0x0f, 0x92, 0x00, + 0x8e, 0x69, 0xa1, 0x87, 0x70, 0xca, 0xb8, 0x74, 0xab, 0x17, 0xae, 0x90, 0xef, 0x64, 0x93, 0x40, + 0x5e, 0x38, 0x2f, 0x3a, 0x7d, 0x6a, 0x35, 0x8b, 0x12, 0xce, 0x6e, 0x00, 0xb5, 0x60, 0xa6, 0x91, + 0x6a, 0x75, 0xa4, 0xff, 0x56, 0xd5, 0xba, 0x48, 0xb7, 0x98, 0x26, 0x8c, 0xde, 0x86, 0x91, 0x8f, + 0x7c, 0xee, 0x10, 0x2b, 0xee, 0x5f, 0x32, 0x3e, 0xd3, 0xc8, 0x07, 0xb7, 0xeb, 0xac, 0xfc, 0x70, + 0xbf, 0x3a, 0x56, 0xf3, 0x9b, 0xf2, 0x2f, 0x56, 0x15, 0xd0, 0x5f, 0xb2, 0x60, 0x36, 0x7d, 0xab, + 0x57, 0x9d, 0x9e, 0xe8, 0xbf, 0xd3, 0xb6, 0x68, 0x74, 0x76, 0x39, 0x97, 0x1c, 0x2e, 0x68, 0x0a, + 0x7d, 0x91, 0xee, 0xa7, 0xd0, 0x7d, 0xc4, 0x5f, 0xb8, 0x68, 0x0e, 0x09, 0x98, 0x95, 0x1e, 0xee, + 0x57, 0xa7, 0x38, 0xfb, 0x77, 0x1f, 0xa9, 0x2c, 0x1a, 0xbc, 0x02, 0xfa, 0x31, 0x38, 0x15, 0xa4, + 0xb5, 0xec, 0x44, 0xde, 0x34, 0x3e, 0xdb, 0xcf, 0x51, 0x92, 0x9c, 0x70, 0x9c, 0x45, 0x10, 0x67, + 0xb7, 0x83, 0xfe, 0xaa, 0x05, 0xcf, 0x90, 0x7c, 0x0b, 0xae, 0xb8, 0x2a, 0xbc, 0x96, 0xd3, 0x8f, + 0x02, 0xdb, 0x2f, 0x4b, 0x30, 0xf0, 0x4c, 0x01, 0x02, 0x2e, 0x6a, 0xd7, 0xfe, 0xc7, 0x16, 0xb3, + 0xfa, 0x08, 0x54, 0x12, 0x76, 0x5b, 0xd1, 0x31, 0x38, 0xc7, 0x2e, 0x1b, 0xae, 0x25, 0x8f, 0xed, + 0xdd, 0xfa, 0xdf, 0x5a, 0xcc, 0xbb, 0xf5, 0x18, 0xdf, 0xe9, 0x7e, 0x00, 0x23, 0x91, 0x68, 0x4d, + 0x74, 0x3d, 0xcf, 0x13, 0x4f, 0x76, 0x8a, 0x79, 0xf8, 0xaa, 0x1b, 0xa6, 0x2c, 0xc5, 0x8a, 0x8c, + 0xfd, 0x5f, 0xf1, 0x19, 0x90, 0x90, 0x63, 0x30, 0x6e, 0x2f, 0x99, 0xc6, 0xed, 0x6a, 0x8f, 0x2f, + 0xc8, 0x31, 0x72, 0xff, 0x03, 0xb3, 0xdf, 0x4c, 0xb3, 0xfa, 0x49, 0x77, 0xab, 0xb6, 0xbf, 0x6b, + 0x01, 0xc4, 0xe9, 0x94, 0xfa, 0x48, 0x8c, 0x7f, 0x8d, 0xde, 0x29, 0xfd, 0xc8, 0x6f, 0xf8, 0x2d, + 0x61, 0x5c, 0x3b, 0x17, 0xdb, 0xd7, 0x79, 0xf9, 0xa1, 0xf6, 0x1b, 0x2b, 0x6c, 0x54, 0x95, 0xf1, + 0xcd, 0xcb, 0xb1, 0x5b, 0x8b, 0x11, 0xdb, 0xfc, 0x67, 0x2c, 0x38, 0x99, 0xf5, 0xe8, 0x0b, 0xbd, + 0x02, 0x23, 0x5c, 0xc7, 0xac, 0x5c, 0xde, 0xd5, 0x6c, 0xde, 0x15, 0xe5, 0x58, 0x61, 0xf4, 0xeb, + 0xfa, 0x7e, 0xc4, 0x54, 0x3f, 0xb7, 0x61, 0xa2, 0x16, 0x10, 0x4d, 0xee, 0x79, 0x37, 0xce, 0x42, + 0x36, 0xba, 0xf0, 0xca, 0x91, 0x23, 0xa9, 0xd9, 0xbf, 0x54, 0x82, 0x93, 0xdc, 0x71, 0x73, 0x7e, + 0xd7, 0x77, 0x9b, 0x35, 0xbf, 0x29, 0x9e, 0xea, 0x7f, 0x15, 0xc6, 0x3b, 0x9a, 0x61, 0xa0, 0x28, + 0x6d, 0x85, 0x6e, 0x40, 0x88, 0x55, 0x99, 0x7a, 0x29, 0x36, 0x68, 0xa1, 0x26, 0x8c, 0x93, 0x5d, + 0xb7, 0xa1, 0x1c, 0xc3, 0x4a, 0x47, 0x16, 0x1e, 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0xed, + 0xfb, 0xb9, 0x85, 0x26, 0x3a, 0x0e, 0xf4, 0x70, 0x06, 0xfb, 0x59, 0x0b, 0xce, 0xe4, 0x24, 0xb9, + 0xa0, 0xcd, 0x3d, 0x60, 0x2e, 0xb2, 0x62, 0xd9, 0xaa, 0xe6, 0xb8, 0xe3, 0x2c, 0x16, 0x50, 0xf4, + 0x65, 0x80, 0x4e, 0x9c, 0x1a, 0xb8, 0x47, 0x36, 0x00, 0x23, 0x2e, 0xb8, 0x16, 0xe2, 0x59, 0x65, + 0x10, 0xd6, 0x68, 0xd9, 0x3f, 0x33, 0x00, 0x83, 0xcc, 0x07, 0x0f, 0xd5, 0x60, 0x78, 0x9b, 0x47, + 0x20, 0x2d, 0x9c, 0x37, 0x8a, 0x2b, 0x43, 0x9a, 0xc6, 0xf3, 0xa6, 0x95, 0x62, 0x49, 0x06, 0xad, + 0xc1, 0x09, 0x9e, 0xf6, 0xb8, 0xb5, 0x44, 0x5a, 0xce, 0x9e, 0xd4, 0xb9, 0x97, 0xd8, 0xa7, 0x2a, + 0xdb, 0xc3, 0x6a, 0x1a, 0x05, 0x67, 0xd5, 0x43, 0xef, 0xc2, 0x64, 0xe4, 0xb6, 0x89, 0xdf, 0x8d, + 0x4c, 0x77, 0x53, 0x75, 0x2d, 0xdc, 0x30, 0xa0, 0x38, 0x81, 0x8d, 0xde, 0x86, 0x89, 0x4e, 0xca, + 0xba, 0x30, 0x18, 0xab, 0xe1, 0x4c, 0x8b, 0x82, 0x89, 0xcb, 0xde, 0x7d, 0x75, 0xd9, 0x2b, 0xb7, + 0x8d, 0xed, 0x80, 0x84, 0xdb, 0x7e, 0xab, 0xc9, 0x24, 0xf3, 0x41, 0xed, 0xdd, 0x57, 0x02, 0x8e, + 0x53, 0x35, 0x28, 0x95, 0x4d, 0xc7, 0x6d, 0x75, 0x03, 0x12, 0x53, 0x19, 0x32, 0xa9, 0xac, 0x24, + 0xe0, 0x38, 0x55, 0xa3, 0xb7, 0xd9, 0x64, 0xf8, 0xc9, 0x98, 0x4d, 0xec, 0xbf, 0x5b, 0x02, 0x63, + 0x6a, 0x7f, 0x88, 0xb3, 0x18, 0xbf, 0x03, 0x03, 0x5b, 0x41, 0xa7, 0x21, 0xfc, 0x4d, 0x33, 0xbf, + 0xec, 0x3a, 0xae, 0x2d, 0xea, 0x5f, 0x46, 0xff, 0x63, 0x56, 0x8b, 0xee, 0xf1, 0x53, 0xc2, 0xfb, + 0x5a, 0x06, 0x29, 0x56, 0xcf, 0x2b, 0x87, 0xa5, 0x26, 0xa2, 0x20, 0x9c, 0xbf, 0x78, 0x23, 0xa6, + 0xfc, 0xb7, 0x35, 0x53, 0xb8, 0xd0, 0x43, 0x48, 0x2a, 0xe8, 0x2a, 0x8c, 0x89, 0xc4, 0xb2, 0xec, + 0x15, 0x20, 0xdf, 0x4c, 0xcc, 0x95, 0x74, 0x29, 0x2e, 0xc6, 0x3a, 0x8e, 0xfd, 0x97, 0x4b, 0x70, + 0x22, 0xe3, 0x19, 0x37, 0x3f, 0x46, 0xb6, 0xdc, 0x30, 0x0a, 0xf6, 0x92, 0x87, 0x13, 0x16, 0xe5, + 0x58, 0x61, 0x50, 0x5e, 0xc5, 0x0f, 0xaa, 0xe4, 0xe1, 0x24, 0x9e, 0x49, 0x0a, 0xe8, 0xd1, 0x0e, + 0x27, 0x7a, 0x6c, 0x77, 0x43, 0x22, 0x33, 0x87, 0xa8, 0x63, 0x9b, 0xb9, 0x64, 0x30, 0x08, 0xbd, + 0x9a, 0x6e, 0x29, 0x3f, 0x03, 0xed, 0x6a, 0xca, 0x3d, 0x0d, 0x38, 0x8c, 0x76, 0x2e, 0x22, 0x9e, + 0xe3, 0x45, 0xe2, 0x02, 0x1b, 0x47, 0x94, 0x67, 0xa5, 0x58, 0x40, 0xed, 0xef, 0x95, 0xe1, 0x6c, + 0x6e, 0x60, 0x07, 0xda, 0xf5, 0xb6, 0xef, 0xb9, 0x91, 0xaf, 0x7c, 0x74, 0x79, 0x14, 0x79, 0xd2, + 0xd9, 0x5e, 0x13, 0xe5, 0x58, 0x61, 0xa0, 0x4b, 0x30, 0xc8, 0x2c, 0x12, 0xc9, 0xa4, 0x92, 0x78, + 0x61, 0x89, 0xc7, 0xd8, 0xe5, 0x60, 0xed, 0x54, 0x2f, 0x17, 0x9e, 0xea, 0xcf, 0x51, 0x09, 0xc6, + 0x6f, 0x25, 0x0f, 0x14, 0xda, 0x5d, 0xdf, 0x6f, 0x61, 0x06, 0x44, 0x2f, 0x88, 0xf1, 0x4a, 0x38, + 0xa5, 0x62, 0xa7, 0xe9, 0x87, 0xda, 0xa0, 0x71, 0x07, 0xf8, 0xc0, 0xf5, 0xb6, 0x92, 0xce, 0xca, + 0x37, 0x79, 0x31, 0x96, 0x70, 0xba, 0x97, 0xe2, 0xdc, 0xf8, 0xc3, 0xf9, 0x7b, 0x49, 0x65, 0xc0, + 0xef, 0x99, 0x16, 0x5f, 0x5f, 0x01, 0x23, 0x3d, 0xc5, 0x93, 0x9f, 0x2a, 0xc3, 0x14, 0x5e, 0x58, + 0xfa, 0x74, 0x22, 0xee, 0xa4, 0x27, 0xa2, 0x7f, 0xb3, 0xd9, 0x93, 0x9a, 0x8d, 0x7f, 0x68, 0xc1, + 0x14, 0x4b, 0x6f, 0x2b, 0xa2, 0x32, 0xb9, 0xbe, 0x77, 0x0c, 0x57, 0x81, 0xe7, 0x60, 0x30, 0xa0, + 0x8d, 0x8a, 0x19, 0x54, 0x7b, 0x9c, 0xf5, 0x04, 0x73, 0x18, 0x3a, 0x07, 0x03, 0xac, 0x0b, 0x74, + 0xf2, 0xc6, 0x39, 0x0b, 0x5e, 0x72, 0x22, 0x07, 0xb3, 0x52, 0x16, 0x1f, 0x16, 0x93, 0x4e, 0xcb, + 0xe5, 0x9d, 0x8e, 0xfd, 0x45, 0x3e, 0x19, 0x21, 0x9f, 0x32, 0xbb, 0xf6, 0xf1, 0xe2, 0xc3, 0x66, + 0x93, 0x2c, 0xbe, 0x66, 0xff, 0x71, 0x09, 0x2e, 0x64, 0xd6, 0xeb, 0x3b, 0x3e, 0x6c, 0x71, 0xed, + 0xa7, 0x99, 0x0c, 0xb3, 0x7c, 0x8c, 0x4f, 0x41, 0x06, 0xfa, 0x95, 0xfe, 0x07, 0xfb, 0x08, 0xdb, + 0x9a, 0x39, 0x64, 0x9f, 0x90, 0xb0, 0xad, 0x99, 0x7d, 0xcb, 0x51, 0x13, 0xfc, 0x69, 0x29, 0xe7, + 0x5b, 0x98, 0xc2, 0xe0, 0x32, 0xe5, 0x33, 0x0c, 0x18, 0xca, 0x4b, 0x38, 0xe7, 0x31, 0xbc, 0x0c, + 0x2b, 0x28, 0x9a, 0x87, 0xa9, 0xb6, 0xeb, 0x51, 0xe6, 0xb3, 0x67, 0x8a, 0xe2, 0xca, 0x90, 0xb4, + 0x66, 0x82, 0x71, 0x12, 0x1f, 0xb9, 0x5a, 0x48, 0x57, 0xfe, 0x75, 0x6f, 0x1f, 0x69, 0xd7, 0xcd, + 0x99, 0xbe, 0x34, 0x6a, 0x14, 0x33, 0xc2, 0xbb, 0xae, 0x69, 0x7a, 0xa2, 0x72, 0xff, 0x7a, 0xa2, + 0xf1, 0x6c, 0x1d, 0xd1, 0xec, 0xdb, 0x30, 0xf1, 0xd8, 0xf6, 0x1f, 0xfb, 0xfb, 0x65, 0x78, 0xa6, + 0x60, 0xdb, 0x73, 0x5e, 0x6f, 0xcc, 0x81, 0xc6, 0xeb, 0x53, 0xf3, 0x50, 0x83, 0x93, 0x9b, 0xdd, + 0x56, 0x6b, 0x8f, 0x3d, 0x6c, 0x25, 0x4d, 0x89, 0x21, 0x64, 0x4a, 0xf5, 0xf4, 0x6d, 0x25, 0x03, + 0x07, 0x67, 0xd6, 0xa4, 0x57, 0x2c, 0x7a, 0x92, 0xec, 0x29, 0x52, 0x89, 0x2b, 0x16, 0xd6, 0x81, + 0xd8, 0xc4, 0x45, 0xd7, 0x61, 0xc6, 0xd9, 0x75, 0x5c, 0x9e, 0x4c, 0x48, 0x12, 0xe0, 0x77, 0x2c, + 0xa5, 0x23, 0x9f, 0x4f, 0x22, 0xe0, 0x74, 0x9d, 0x1c, 0x53, 0x55, 0xf9, 0xb1, 0x4c, 0x55, 0x66, + 0x70, 0xd1, 0xa1, 0xfc, 0xe0, 0xa2, 0xc5, 0x7c, 0xb1, 0x67, 0x1e, 0xd6, 0x0f, 0x61, 0xe2, 0xa8, + 0x3e, 0xf1, 0x2f, 0xc1, 0xb0, 0x78, 0xc3, 0x93, 0x7c, 0xaf, 0x29, 0xf3, 0xff, 0x4b, 0xb8, 0xfd, + 0xbf, 0x5a, 0xa0, 0x74, 0xdc, 0x66, 0x1e, 0x81, 0xb7, 0x99, 0x83, 0x3f, 0xd7, 0xce, 0x6b, 0x6f, + 0x45, 0x4f, 0x69, 0x0e, 0xfe, 0x31, 0x10, 0x9b, 0xb8, 0x7c, 0xb9, 0x85, 0x71, 0xc4, 0x1a, 0xe3, + 0x02, 0x21, 0x6c, 0xab, 0x0a, 0x03, 0x7d, 0x05, 0x86, 0x9b, 0xee, 0xae, 0x1b, 0x0a, 0x3d, 0xda, + 0x91, 0x6d, 0x93, 0xf1, 0xf7, 0x2d, 0x71, 0x32, 0x58, 0xd2, 0xb3, 0xff, 0x8a, 0x05, 0xca, 0x28, + 0x7c, 0x83, 0x38, 0xad, 0x68, 0x1b, 0xbd, 0x07, 0x20, 0x29, 0x28, 0xdd, 0x9b, 0x74, 0x55, 0x03, + 0xac, 0x20, 0x87, 0xc6, 0x3f, 0xac, 0xd5, 0x41, 0xef, 0xc2, 0xd0, 0x36, 0xa3, 0x25, 0xbe, 0xed, + 0x92, 0x32, 0xc1, 0xb1, 0xd2, 0xc3, 0xfd, 0xea, 0x49, 0xb3, 0x4d, 0x79, 0x8a, 0xf1, 0x5a, 0xf6, + 0x4f, 0x95, 0xe2, 0x39, 0xfd, 0xa0, 0xeb, 0x47, 0xce, 0x31, 0x48, 0x22, 0xd7, 0x0d, 0x49, 0xe4, + 0x85, 0x22, 0xab, 0x37, 0xeb, 0x52, 0xae, 0x04, 0x72, 0x3b, 0x21, 0x81, 0xbc, 0xd8, 0x9b, 0x54, + 0xb1, 0xe4, 0xf1, 0x5f, 0x5b, 0x30, 0x63, 0xe0, 0x1f, 0xc3, 0x01, 0xb8, 0x62, 0x1e, 0x80, 0xcf, + 0xf6, 0xfc, 0x86, 0x9c, 0x83, 0xef, 0x27, 0xca, 0x89, 0xbe, 0xb3, 0x03, 0xef, 0x23, 0x18, 0xd8, + 0x76, 0x82, 0xa6, 0xb8, 0xd7, 0x5f, 0xe9, 0x6b, 0xac, 0xe7, 0x6e, 0x38, 0x81, 0x70, 0x73, 0x79, + 0x45, 0x8e, 0x3a, 0x2d, 0xea, 0xe9, 0xe2, 0xc2, 0x9a, 0x42, 0xd7, 0x60, 0x28, 0x6c, 0xf8, 0x1d, + 0xf5, 0x24, 0xf4, 0x22, 0x1b, 0x68, 0x56, 0x72, 0xb8, 0x5f, 0x45, 0x66, 0x73, 0xb4, 0x18, 0x0b, + 0x7c, 0xf4, 0x55, 0x98, 0x60, 0xbf, 0x94, 0xcf, 0x69, 0x39, 0x5f, 0x03, 0x53, 0xd7, 0x11, 0xb9, + 0x43, 0xb6, 0x51, 0x84, 0x4d, 0x52, 0xb3, 0x5b, 0x30, 0xaa, 0x3e, 0xeb, 0xa9, 0x7a, 0x24, 0xfc, + 0x8b, 0x32, 0x9c, 0xc8, 0x58, 0x73, 0x28, 0x34, 0x66, 0xe2, 0x6a, 0x9f, 0x4b, 0xf5, 0x63, 0xce, + 0x45, 0xc8, 0x2e, 0x80, 0x4d, 0xb1, 0xb6, 0xfa, 0x6e, 0xf4, 0x4e, 0x48, 0x92, 0x8d, 0xd2, 0xa2, + 0xde, 0x8d, 0xd2, 0xc6, 0x8e, 0x6d, 0xa8, 0x69, 0x43, 0xaa, 0xa7, 0x4f, 0x75, 0x4e, 0x7f, 0x6b, + 0x00, 0x4e, 0x66, 0x39, 0xe2, 0xa0, 0x1f, 0x85, 0x21, 0xf6, 0x9c, 0xaf, 0xf0, 0xfd, 0x6b, 0x56, + 0xcd, 0x39, 0xf6, 0x22, 0x50, 0x84, 0xa2, 0x9e, 0x93, 0xec, 0x88, 0x17, 0xf6, 0x1c, 0x66, 0xd1, + 0x26, 0x0b, 0x11, 0x27, 0x4e, 0x4f, 0xc9, 0x3e, 0x3e, 0xdf, 0x77, 0x07, 0xc4, 0xf9, 0x1b, 0x26, + 0xfc, 0xd9, 0x64, 0x71, 0x6f, 0x7f, 0x36, 0xd9, 0x32, 0x5a, 0x85, 0xa1, 0x06, 0x77, 0x94, 0x2a, + 0xf7, 0x66, 0x61, 0xdc, 0x4b, 0x4a, 0x31, 0x60, 0xe1, 0x1d, 0x25, 0x08, 0xcc, 0xba, 0x30, 0xa6, + 0x0d, 0xcc, 0x53, 0x5d, 0x3c, 0x3b, 0xf4, 0xe0, 0xd3, 0x86, 0xe0, 0xa9, 0x2e, 0xa0, 0xbf, 0xae, + 0x9d, 0xfd, 0x82, 0x1f, 0x7c, 0xce, 0x90, 0x9d, 0xce, 0x25, 0x1e, 0x59, 0x26, 0xf6, 0x15, 0x93, + 0xa5, 0xea, 0x66, 0x0e, 0x87, 0xdc, 0x44, 0x74, 0xe6, 0x81, 0x5f, 0x9c, 0xb7, 0xc1, 0xfe, 0x59, + 0x0b, 0x12, 0xcf, 0xe0, 0x94, 0xba, 0xd3, 0xca, 0x55, 0x77, 0x5e, 0x84, 0x81, 0xc0, 0x6f, 0x49, + 0x79, 0x4a, 0x61, 0x60, 0xbf, 0x45, 0x30, 0x83, 0x50, 0x8c, 0x28, 0x56, 0x62, 0x8d, 0xeb, 0x17, + 0x74, 0x71, 0xf5, 0x7e, 0x0e, 0x06, 0x5b, 0x64, 0x97, 0xb4, 0x92, 0xf9, 0x98, 0x6f, 0xd1, 0x42, + 0xcc, 0x61, 0xf6, 0x3f, 0x1c, 0x80, 0xf3, 0x85, 0x91, 0x24, 0xa9, 0x80, 0xb9, 0xe5, 0x44, 0xe4, + 0x81, 0xb3, 0x97, 0xcc, 0x43, 0x7a, 0x9d, 0x17, 0x63, 0x09, 0x67, 0xef, 0xee, 0x79, 0x6e, 0xad, + 0x84, 0x72, 0x58, 0xa4, 0xd4, 0x12, 0x50, 0x53, 0xd9, 0x58, 0x7e, 0x12, 0xca, 0xc6, 0xd7, 0x00, + 0xc2, 0xb0, 0xc5, 0xbd, 0x5d, 0x9b, 0xe2, 0x41, 0x7f, 0x1c, 0xe9, 0xa4, 0x7e, 0x4b, 0x40, 0xb0, + 0x86, 0x85, 0x96, 0x60, 0xba, 0x13, 0xf8, 0x11, 0xd7, 0xb5, 0x2f, 0x71, 0x87, 0xf0, 0x41, 0x33, + 0x88, 0x5f, 0x2d, 0x01, 0xc7, 0xa9, 0x1a, 0xe8, 0x4d, 0x18, 0x13, 0x81, 0xfd, 0x6a, 0xbe, 0xdf, + 0x12, 0xea, 0x3d, 0xe5, 0x23, 0x5d, 0x8f, 0x41, 0x58, 0xc7, 0xd3, 0xaa, 0x31, 0x05, 0xfe, 0x70, + 0x66, 0x35, 0xae, 0xc4, 0xd7, 0xf0, 0x12, 0x49, 0x40, 0x46, 0xfa, 0x4a, 0x02, 0x12, 0x2b, 0x3c, + 0x47, 0xfb, 0xb6, 0x27, 0x43, 0x4f, 0x15, 0xe1, 0xaf, 0x0c, 0xc0, 0x09, 0xb1, 0x70, 0x9e, 0xf6, + 0x72, 0xb9, 0x93, 0x5e, 0x2e, 0x4f, 0x42, 0x25, 0xfa, 0xe9, 0x9a, 0x39, 0xee, 0x35, 0xf3, 0xd3, + 0x16, 0x98, 0x32, 0x24, 0xfa, 0x8f, 0x72, 0x13, 0x39, 0xbf, 0x99, 0x2b, 0x93, 0xc6, 0x19, 0x02, + 0x3e, 0x5e, 0x4a, 0x67, 0xfb, 0x7f, 0xb6, 0xe0, 0xd9, 0x9e, 0x14, 0xd1, 0x32, 0x8c, 0x32, 0x41, + 0x57, 0xbb, 0x17, 0xbf, 0xa8, 0x1e, 0x8c, 0x48, 0x40, 0x8e, 0xdc, 0x1d, 0xd7, 0x44, 0xcb, 0xa9, + 0x8c, 0xd9, 0x2f, 0x65, 0x64, 0xcc, 0x3e, 0x65, 0x0c, 0xcf, 0x63, 0xa6, 0xcc, 0xfe, 0x49, 0x7a, + 0xe2, 0x98, 0xaf, 0x4e, 0x3f, 0x6f, 0xa8, 0x73, 0xed, 0x84, 0x3a, 0x17, 0x99, 0xd8, 0xda, 0x19, + 0xf2, 0x1e, 0x4c, 0xb3, 0x88, 0xbf, 0xec, 0xf9, 0x92, 0x78, 0xae, 0x5a, 0x8a, 0xbd, 0x9d, 0x6f, + 0x25, 0x60, 0x38, 0x85, 0x6d, 0xff, 0x9b, 0x32, 0x0c, 0xf1, 0xed, 0x77, 0x0c, 0x17, 0xdf, 0x97, + 0x61, 0xd4, 0x6d, 0xb7, 0xbb, 0x3c, 0x09, 0xf2, 0x60, 0xec, 0xf0, 0xbe, 0x2a, 0x0b, 0x71, 0x0c, + 0x47, 0x2b, 0xc2, 0x92, 0x50, 0x90, 0x54, 0x80, 0x77, 0x7c, 0x6e, 0xc9, 0x89, 0x1c, 0x2e, 0xc5, + 0xa9, 0x73, 0x36, 0xb6, 0x39, 0xa0, 0x6f, 0x00, 0x84, 0x51, 0xe0, 0x7a, 0x5b, 0xb4, 0x4c, 0x64, + 0x9e, 0xf9, 0x6c, 0x01, 0xb5, 0xba, 0x42, 0xe6, 0x34, 0x63, 0x9e, 0xa3, 0x00, 0x58, 0xa3, 0x88, + 0xe6, 0x8c, 0x93, 0x7e, 0x36, 0x31, 0x77, 0xc0, 0xa9, 0xc6, 0x73, 0x36, 0xfb, 0x05, 0x18, 0x55, + 0xc4, 0x7b, 0xe9, 0x15, 0xc7, 0x75, 0x81, 0xed, 0x4b, 0x30, 0x95, 0xe8, 0xdb, 0x91, 0xd4, 0x92, + 0xbf, 0x6e, 0xc1, 0x14, 0xef, 0xcc, 0xb2, 0xb7, 0x2b, 0x4e, 0x83, 0x47, 0x70, 0xb2, 0x95, 0xc1, + 0x95, 0xc5, 0xf4, 0xf7, 0xcf, 0xc5, 0x95, 0x1a, 0x32, 0x0b, 0x8a, 0x33, 0xdb, 0x40, 0x97, 0xe9, + 0x8e, 0xa3, 0x5c, 0xd7, 0x69, 0x89, 0x98, 0x2b, 0xe3, 0x7c, 0xb7, 0xf1, 0x32, 0xac, 0xa0, 0xf6, + 0x1f, 0x58, 0x30, 0xc3, 0x7b, 0x7e, 0x93, 0xec, 0x29, 0xde, 0xf4, 0x83, 0xec, 0xbb, 0x48, 0xbf, + 0x5f, 0xca, 0x49, 0xbf, 0xaf, 0x7f, 0x5a, 0xb9, 0xf0, 0xd3, 0x7e, 0xc9, 0x02, 0xb1, 0x42, 0x8e, + 0x41, 0xd3, 0xf2, 0x23, 0xa6, 0xa6, 0x65, 0x36, 0x7f, 0x13, 0xe4, 0xa8, 0x58, 0xfe, 0xbd, 0x05, + 0xd3, 0x1c, 0x41, 0x8b, 0x62, 0xf7, 0x83, 0x9c, 0x87, 0x05, 0xf3, 0x8b, 0x32, 0xdd, 0x5a, 0x6f, + 0x92, 0xbd, 0x0d, 0xbf, 0xe6, 0x44, 0xdb, 0xd9, 0x1f, 0x65, 0x4c, 0xd6, 0x40, 0xe1, 0x64, 0x35, + 0xe5, 0x06, 0x32, 0x12, 0xad, 0xf6, 0x50, 0x00, 0x1f, 0x35, 0xd1, 0xaa, 0xfd, 0x47, 0x16, 0x20, + 0xde, 0x8c, 0x21, 0xb8, 0x51, 0x71, 0x88, 0x95, 0x66, 0x06, 0x0b, 0x54, 0x10, 0xac, 0x61, 0x3d, + 0x91, 0xe1, 0x49, 0xb8, 0xb2, 0x94, 0x7b, 0xbb, 0xb2, 0x1c, 0x61, 0x44, 0x7f, 0x69, 0x18, 0x92, + 0x0f, 0x56, 0xd1, 0x5d, 0x18, 0x6f, 0x38, 0x1d, 0xe7, 0xbe, 0xdb, 0x72, 0x23, 0x97, 0x84, 0x45, + 0x7e, 0x6e, 0x8b, 0x1a, 0x9e, 0x70, 0x3e, 0xd0, 0x4a, 0xb0, 0x41, 0x07, 0xcd, 0x01, 0x74, 0x02, + 0x77, 0xd7, 0x6d, 0x91, 0x2d, 0xa6, 0x10, 0x62, 0x51, 0x9e, 0xb8, 0xd3, 0x9d, 0x2c, 0xc5, 0x1a, + 0x46, 0x46, 0x70, 0x95, 0xf2, 0x53, 0x0e, 0xae, 0x02, 0xc7, 0x16, 0x5c, 0x65, 0xe0, 0x48, 0xc1, + 0x55, 0x46, 0x8e, 0x1c, 0x5c, 0x65, 0xb0, 0xaf, 0xe0, 0x2a, 0x18, 0x4e, 0x4b, 0xd9, 0x93, 0xfe, + 0x5f, 0x71, 0x5b, 0x44, 0x5c, 0x38, 0x78, 0x68, 0xaa, 0xd9, 0x83, 0xfd, 0xea, 0x69, 0x9c, 0x89, + 0x81, 0x73, 0x6a, 0xa2, 0x2f, 0x43, 0xc5, 0x69, 0xb5, 0xfc, 0x07, 0x6a, 0x52, 0x97, 0xc3, 0x86, + 0xd3, 0x8a, 0xc3, 0x32, 0x8e, 0x2c, 0x9c, 0x3b, 0xd8, 0xaf, 0x56, 0xe6, 0x73, 0x70, 0x70, 0x6e, + 0x6d, 0xf4, 0x0e, 0x8c, 0x76, 0x02, 0xbf, 0xb1, 0xa6, 0xbd, 0xaa, 0xbf, 0x40, 0x07, 0xb0, 0x26, + 0x0b, 0x0f, 0xf7, 0xab, 0x13, 0xea, 0x0f, 0x3b, 0xf0, 0xe3, 0x0a, 0x19, 0x71, 0x4b, 0xc6, 0x9e, + 0x76, 0xdc, 0x92, 0xf1, 0x27, 0x1c, 0xb7, 0xc4, 0xde, 0x81, 0x13, 0x75, 0x12, 0xb8, 0x4e, 0xcb, + 0x7d, 0x44, 0x65, 0x72, 0xc9, 0x03, 0x37, 0x60, 0x34, 0x48, 0x70, 0xfd, 0xbe, 0x92, 0x09, 0x68, + 0x7a, 0x19, 0xc9, 0xe5, 0x63, 0x42, 0xf6, 0xff, 0x6b, 0xc1, 0xb0, 0x78, 0x04, 0x7b, 0x0c, 0x92, + 0xe9, 0xbc, 0x61, 0x92, 0xa9, 0x66, 0x4f, 0x0a, 0xeb, 0x4c, 0xae, 0x31, 0x66, 0x35, 0x61, 0x8c, + 0x79, 0xb6, 0x88, 0x48, 0xb1, 0x19, 0xe6, 0x3f, 0x2b, 0xd3, 0x1b, 0x82, 0x11, 0x8e, 0xe1, 0xe9, + 0x0f, 0xc1, 0x3a, 0x0c, 0x87, 0x22, 0x1c, 0x40, 0x29, 0xff, 0x8d, 0x51, 0x72, 0x12, 0x63, 0x1f, + 0x48, 0x11, 0x00, 0x40, 0x12, 0xc9, 0x8c, 0x33, 0x50, 0x7e, 0x8a, 0x71, 0x06, 0x7a, 0x05, 0xac, + 0x18, 0x78, 0x12, 0x01, 0x2b, 0xec, 0xdf, 0x60, 0xa7, 0xb3, 0x5e, 0x7e, 0x0c, 0x82, 0xdb, 0x75, + 0xf3, 0x1c, 0xb7, 0x0b, 0x56, 0x96, 0xe8, 0x54, 0x8e, 0x00, 0xf7, 0x6b, 0x16, 0x9c, 0xcf, 0xf8, + 0x2a, 0x4d, 0x9a, 0x7b, 0x05, 0x46, 0x9c, 0x6e, 0xd3, 0x55, 0x7b, 0x59, 0xb3, 0x16, 0xcf, 0x8b, + 0x72, 0xac, 0x30, 0xd0, 0x22, 0xcc, 0x90, 0x54, 0x7c, 0x61, 0x1e, 0xb9, 0x8b, 0xbd, 0x9c, 0x4e, + 0x07, 0x17, 0x4e, 0xe3, 0xab, 0xa0, 0x77, 0xe5, 0xdc, 0xa0, 0x77, 0x7f, 0xcf, 0x82, 0x31, 0xf5, + 0x20, 0xfe, 0xa9, 0x8f, 0xf6, 0x7b, 0xe6, 0x68, 0x3f, 0x53, 0x30, 0xda, 0x39, 0xc3, 0xfc, 0x7b, + 0x25, 0xd5, 0xdf, 0x9a, 0x1f, 0x44, 0x7d, 0x48, 0x89, 0x8f, 0xff, 0xec, 0xe5, 0x2a, 0x8c, 0x39, + 0x9d, 0x8e, 0x04, 0x48, 0xff, 0x45, 0x96, 0x1a, 0x26, 0x2e, 0xc6, 0x3a, 0x8e, 0x7a, 0x85, 0x53, + 0xce, 0x7d, 0x85, 0xd3, 0x04, 0x88, 0x9c, 0x60, 0x8b, 0x44, 0xb4, 0x4c, 0xb8, 0x5b, 0xe7, 0xf3, + 0x9b, 0x6e, 0xe4, 0xb6, 0xe6, 0x5c, 0x2f, 0x0a, 0xa3, 0x60, 0x6e, 0xd5, 0x8b, 0x6e, 0x07, 0xfc, + 0x9a, 0xaa, 0x85, 0x96, 0x54, 0xb4, 0xb0, 0x46, 0x57, 0x06, 0x7f, 0x61, 0x6d, 0x0c, 0x9a, 0x8e, + 0x30, 0xeb, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x0b, 0xec, 0xf4, 0x61, 0x63, 0x7a, 0xb4, 0x90, 0x89, + 0x7f, 0x3c, 0xae, 0x66, 0x83, 0x99, 0x84, 0x97, 0xf4, 0xc0, 0x8c, 0xc5, 0xcc, 0x9e, 0x36, 0xac, + 0xbf, 0xb3, 0x8d, 0xa3, 0x37, 0xa2, 0xaf, 0xa5, 0x9c, 0x9b, 0x5e, 0xed, 0x71, 0x6a, 0x1c, 0xc1, + 0x9d, 0x89, 0xe5, 0x89, 0x64, 0x59, 0xf4, 0x56, 0x6b, 0x62, 0x5f, 0x68, 0x79, 0x22, 0x05, 0x00, + 0xc7, 0x38, 0x54, 0x60, 0x53, 0x7f, 0xc2, 0x0a, 0x8a, 0xd3, 0x09, 0x28, 0xec, 0x10, 0x6b, 0x18, + 0xe8, 0x8a, 0x50, 0x5a, 0x70, 0xdb, 0xc3, 0x33, 0x09, 0xa5, 0x85, 0x1c, 0x2e, 0x4d, 0xd3, 0x74, + 0x15, 0xc6, 0xc8, 0xc3, 0x88, 0x04, 0x9e, 0xd3, 0xa2, 0x2d, 0x0c, 0xc6, 0xc1, 0x91, 0x97, 0xe3, + 0x62, 0xac, 0xe3, 0xa0, 0x0d, 0x98, 0x0a, 0xb9, 0x2e, 0x4f, 0x25, 0xb1, 0xe1, 0x3a, 0xd1, 0xcf, + 0xaa, 0x50, 0x04, 0x26, 0xf8, 0x90, 0x15, 0x71, 0xee, 0x24, 0x03, 0xb4, 0x24, 0x49, 0xa0, 0x77, + 0x61, 0xb2, 0xe5, 0x3b, 0xcd, 0x05, 0xa7, 0xe5, 0x78, 0x0d, 0x36, 0x3e, 0x23, 0x46, 0x94, 0xce, + 0xc9, 0x5b, 0x06, 0x14, 0x27, 0xb0, 0xa9, 0x80, 0xa8, 0x97, 0x88, 0xc4, 0x4b, 0x8e, 0xb7, 0x45, + 0xc2, 0xca, 0x28, 0xfb, 0x2a, 0x26, 0x20, 0xde, 0xca, 0xc1, 0xc1, 0xb9, 0xb5, 0xd1, 0x35, 0x18, + 0x97, 0x9f, 0xaf, 0xc5, 0x33, 0x8a, 0x1f, 0x34, 0x69, 0x30, 0x6c, 0x60, 0xa2, 0x10, 0x4e, 0xc9, + 0xff, 0x1b, 0x81, 0xb3, 0xb9, 0xe9, 0x36, 0x44, 0x90, 0x0f, 0xfe, 0x28, 0xfd, 0x4b, 0xf2, 0x05, + 0xec, 0x72, 0x16, 0xd2, 0xe1, 0x7e, 0xf5, 0x9c, 0x18, 0xb5, 0x4c, 0x38, 0xce, 0xa6, 0x8d, 0xd6, + 0xe0, 0x04, 0xf7, 0x81, 0x59, 0xdc, 0x26, 0x8d, 0x1d, 0xb9, 0xe1, 0x98, 0xd4, 0xa8, 0x3d, 0xfc, + 0xb9, 0x91, 0x46, 0xc1, 0x59, 0xf5, 0xd0, 0x87, 0x50, 0xe9, 0x74, 0xef, 0xb7, 0xdc, 0x70, 0x7b, + 0xdd, 0x8f, 0x98, 0x0b, 0xd9, 0x7c, 0xb3, 0x19, 0x90, 0x90, 0xbf, 0x59, 0x66, 0x47, 0xaf, 0x8c, + 0x41, 0x55, 0xcb, 0xc1, 0xc3, 0xb9, 0x14, 0xd0, 0x23, 0x38, 0x95, 0x58, 0x08, 0x22, 0x98, 0xcc, + 0x64, 0x7e, 0x0a, 0xbb, 0x7a, 0x56, 0x05, 0x11, 0x97, 0x29, 0x0b, 0x84, 0xb3, 0x9b, 0x40, 0x6f, + 0x01, 0xb8, 0x9d, 0x15, 0xa7, 0xed, 0xb6, 0xe8, 0x75, 0xf4, 0x04, 0x5b, 0x23, 0xf4, 0x6a, 0x02, + 0xab, 0x35, 0x59, 0x4a, 0x79, 0xb3, 0xf8, 0xb7, 0x87, 0x35, 0x6c, 0x74, 0x0b, 0x26, 0xc5, 0xbf, + 0x3d, 0x31, 0xa5, 0x33, 0x2a, 0xdb, 0xf1, 0xa4, 0xac, 0xa1, 0xe6, 0x31, 0x51, 0x82, 0x13, 0x75, + 0xd1, 0x16, 0x9c, 0x97, 0xa9, 0x96, 0xf5, 0xf5, 0x29, 0xe7, 0x20, 0x64, 0x79, 0xe3, 0x46, 0xf8, + 0x9b, 0xa2, 0xf9, 0x22, 0x44, 0x5c, 0x4c, 0x87, 0x9e, 0xeb, 0xfa, 0x32, 0xe7, 0x2f, 0xd9, 0x4f, + 0xc5, 0xb1, 0x4e, 0x6f, 0x25, 0x81, 0x38, 0x8d, 0x8f, 0x7c, 0x38, 0xe5, 0x7a, 0x59, 0xab, 0xfa, + 0x34, 0x23, 0xf4, 0x45, 0xfe, 0x88, 0xbf, 0x78, 0x45, 0x67, 0xc2, 0x71, 0x36, 0x5d, 0xb4, 0x0a, + 0x27, 0x22, 0x5e, 0xb0, 0xe4, 0x86, 0x3c, 0x2d, 0x15, 0xbd, 0xf6, 0x9d, 0x61, 0xcd, 0x9d, 0xa1, + 0xab, 0x79, 0x23, 0x0d, 0xc6, 0x59, 0x75, 0x3e, 0x9e, 0x03, 0xe8, 0xef, 0x5b, 0xb4, 0xb6, 0x26, + 0xe8, 0xa3, 0x6f, 0xc2, 0xb8, 0x3e, 0x3e, 0x42, 0x68, 0xb9, 0x94, 0x2d, 0x07, 0x6b, 0xec, 0x85, + 0x5f, 0x13, 0x14, 0x0b, 0xd1, 0x61, 0xd8, 0xa0, 0x88, 0x1a, 0x19, 0xc1, 0x37, 0xae, 0xf4, 0x27, + 0x14, 0xf5, 0xef, 0xff, 0x48, 0x20, 0x7b, 0xe7, 0xa0, 0x5b, 0x30, 0xd2, 0x68, 0xb9, 0xc4, 0x8b, + 0x56, 0x6b, 0x45, 0x21, 0x68, 0x17, 0x05, 0x8e, 0xd8, 0x8a, 0x22, 0x9b, 0x1c, 0x2f, 0xc3, 0x8a, + 0x82, 0x7d, 0x0d, 0xc6, 0xea, 0x2d, 0x42, 0x3a, 0xfc, 0x1d, 0x17, 0x7a, 0x89, 0x5d, 0x4c, 0x98, + 0x68, 0x69, 0x31, 0xd1, 0x52, 0xbf, 0x73, 0x30, 0xa1, 0x52, 0xc2, 0xed, 0xdf, 0x2e, 0x41, 0xb5, + 0x47, 0x52, 0xc3, 0x84, 0xbd, 0xcd, 0xea, 0xcb, 0xde, 0x36, 0x0f, 0x53, 0xf1, 0x3f, 0x5d, 0x95, + 0xa7, 0x9c, 0xa1, 0xef, 0x9a, 0x60, 0x9c, 0xc4, 0xef, 0xfb, 0x5d, 0x8b, 0x6e, 0xb2, 0x1b, 0xe8, + 0xf9, 0x32, 0xcb, 0x30, 0xd5, 0x0f, 0xf6, 0x7f, 0xf7, 0xce, 0x35, 0xbb, 0xda, 0xbf, 0x51, 0x82, + 0x53, 0x6a, 0x08, 0x7f, 0x78, 0x07, 0xee, 0x4e, 0x7a, 0xe0, 0x9e, 0x80, 0xd1, 0xda, 0xbe, 0x0d, + 0x43, 0x3c, 0x2e, 0x6e, 0x1f, 0x32, 0xff, 0x73, 0x66, 0x1e, 0x06, 0x25, 0x66, 0x1a, 0xb9, 0x18, + 0xfe, 0x92, 0x05, 0x53, 0x89, 0x07, 0x92, 0x08, 0x6b, 0xaf, 0xe8, 0x1f, 0x47, 0x2e, 0xcf, 0x92, + 0xf8, 0x2f, 0xc2, 0xc0, 0xb6, 0xaf, 0x9c, 0x94, 0x15, 0xc6, 0x0d, 0x3f, 0x8c, 0x30, 0x83, 0xd8, + 0xff, 0xd2, 0x82, 0xc1, 0x0d, 0xc7, 0xf5, 0x22, 0x69, 0xfd, 0xb0, 0x72, 0xac, 0x1f, 0xfd, 0x7c, + 0x17, 0x7a, 0x13, 0x86, 0xc8, 0xe6, 0x26, 0x69, 0x44, 0x62, 0x56, 0x65, 0x94, 0x8f, 0xa1, 0x65, + 0x56, 0x4a, 0x85, 0x50, 0xd6, 0x18, 0xff, 0x8b, 0x05, 0x32, 0xba, 0x07, 0xa3, 0x91, 0xdb, 0x26, + 0xf3, 0xcd, 0xa6, 0xf0, 0x09, 0x78, 0x8c, 0xd0, 0x34, 0x1b, 0x92, 0x00, 0x8e, 0x69, 0xd9, 0xdf, + 0x2b, 0x01, 0xc4, 0x71, 0xf8, 0x7a, 0x7d, 0xe2, 0x42, 0xca, 0x5a, 0x7c, 0x29, 0xc3, 0x5a, 0x8c, + 0x62, 0x82, 0x19, 0xa6, 0x62, 0x35, 0x4c, 0xe5, 0xbe, 0x86, 0x69, 0xe0, 0x28, 0xc3, 0xb4, 0x08, + 0x33, 0x71, 0x1c, 0x41, 0x33, 0x8c, 0x2a, 0x3b, 0xbf, 0x37, 0x92, 0x40, 0x9c, 0xc6, 0xb7, 0x09, + 0x5c, 0x54, 0xe1, 0xd4, 0xc4, 0x59, 0xc8, 0x9e, 0x12, 0xe8, 0xd6, 0xf7, 0x1e, 0xe3, 0x14, 0x9b, + 0xc3, 0x4b, 0xb9, 0xe6, 0xf0, 0xbf, 0x69, 0xc1, 0xc9, 0x64, 0x3b, 0xec, 0xdd, 0xfd, 0x77, 0x2d, + 0x38, 0x15, 0xe7, 0xf4, 0x4a, 0xbb, 0x20, 0xbc, 0x51, 0x18, 0x22, 0x2e, 0xa7, 0xc7, 0x71, 0x38, + 0x99, 0xb5, 0x2c, 0xd2, 0x38, 0xbb, 0x45, 0xfb, 0xff, 0x19, 0x80, 0x4a, 0x5e, 0x6c, 0x39, 0xf6, + 0xd2, 0xc8, 0x79, 0x58, 0xdf, 0x21, 0x0f, 0xc4, 0x7b, 0x8e, 0xf8, 0xa5, 0x11, 0x2f, 0xc6, 0x12, + 0x9e, 0x4c, 0xe3, 0x56, 0xea, 0x33, 0x8d, 0xdb, 0x36, 0xcc, 0x3c, 0xd8, 0x26, 0xde, 0x1d, 0x2f, + 0x74, 0x22, 0x37, 0xdc, 0x74, 0x99, 0x01, 0x9d, 0xaf, 0x9b, 0xb7, 0xe4, 0xab, 0x8b, 0x7b, 0x49, + 0x84, 0xc3, 0xfd, 0xea, 0x79, 0xa3, 0x20, 0xee, 0x32, 0x67, 0x24, 0x38, 0x4d, 0x34, 0x9d, 0x05, + 0x6f, 0xe0, 0x29, 0x67, 0xc1, 0x6b, 0xbb, 0xc2, 0xed, 0x46, 0x3e, 0x23, 0x61, 0xd7, 0xd6, 0x35, + 0x55, 0x8a, 0x35, 0x0c, 0xf4, 0x75, 0x40, 0x7a, 0x1a, 0x53, 0x23, 0xb4, 0xef, 0xab, 0x07, 0xfb, + 0x55, 0xb4, 0x9e, 0x82, 0x1e, 0xee, 0x57, 0x4f, 0xd0, 0xd2, 0x55, 0x8f, 0x5e, 0x7f, 0xe3, 0x78, + 0x88, 0x19, 0x84, 0xd0, 0x3d, 0x98, 0xa6, 0xa5, 0x6c, 0x47, 0xc9, 0xb8, 0xc1, 0xfc, 0xca, 0xfa, + 0xf2, 0xc1, 0x7e, 0x75, 0x7a, 0x3d, 0x01, 0xcb, 0x23, 0x9d, 0x22, 0x92, 0x91, 0x0c, 0x6f, 0xa4, + 0xdf, 0x64, 0x78, 0xf6, 0x77, 0x2d, 0x38, 0x4b, 0x0f, 0xb8, 0xe6, 0xad, 0x1c, 0x2b, 0xba, 0xd3, + 0x71, 0xb9, 0x9d, 0x46, 0x1c, 0x35, 0x4c, 0x57, 0x57, 0x5b, 0xe5, 0x56, 0x1a, 0x05, 0xa5, 0x1c, + 0x7e, 0xc7, 0xf5, 0x9a, 0x49, 0x0e, 0x7f, 0xd3, 0xf5, 0x9a, 0x98, 0x41, 0xd4, 0x91, 0x55, 0xce, + 0xcd, 0x43, 0xf0, 0x2b, 0x74, 0xaf, 0xd2, 0xbe, 0xfc, 0x40, 0xbb, 0x81, 0x5e, 0xd6, 0x6d, 0xaa, + 0xc2, 0x7d, 0x32, 0xd7, 0x9e, 0xfa, 0x1d, 0x0b, 0xc4, 0xeb, 0xf7, 0x3e, 0xce, 0xe4, 0xaf, 0xc2, + 0xf8, 0x6e, 0x3a, 0xc5, 0xf3, 0xc5, 0xfc, 0x70, 0x00, 0x22, 0xb1, 0xb3, 0x12, 0xd1, 0x8d, 0x74, + 0xce, 0x06, 0x2d, 0xbb, 0x09, 0x02, 0xba, 0x44, 0x98, 0x55, 0xa3, 0x77, 0x6f, 0x5e, 0x03, 0x68, + 0x32, 0x5c, 0x96, 0xec, 0xac, 0x64, 0x4a, 0x5c, 0x4b, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x17, 0xca, + 0x30, 0x26, 0x53, 0x0a, 0x77, 0xbd, 0x7e, 0x74, 0x8f, 0xba, 0xe0, 0x54, 0xea, 0x29, 0x38, 0x7d, + 0x08, 0x33, 0x01, 0x69, 0x74, 0x83, 0xd0, 0xdd, 0x25, 0x12, 0x2c, 0x36, 0xc9, 0x1c, 0x4f, 0x83, + 0x91, 0x00, 0x1e, 0xb2, 0xd0, 0x5d, 0x89, 0x42, 0x66, 0x34, 0x4e, 0x13, 0x42, 0x57, 0x60, 0x94, + 0xa9, 0xde, 0x6b, 0xb1, 0x42, 0x58, 0x29, 0xbe, 0xd6, 0x24, 0x00, 0xc7, 0x38, 0xec, 0x72, 0xd0, + 0xbd, 0xaf, 0x65, 0xa2, 0x8b, 0x2f, 0x07, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x32, 0x4c, 0xf3, 0x7a, + 0x81, 0xdf, 0x71, 0xb6, 0xb8, 0x49, 0x70, 0x50, 0x85, 0xd7, 0x99, 0x5e, 0x4b, 0xc0, 0x0e, 0xf7, + 0xab, 0x27, 0x93, 0x65, 0xac, 0xdb, 0x29, 0x2a, 0xcc, 0xf3, 0x8f, 0x37, 0x42, 0xcf, 0x8c, 0x94, + 0xc3, 0x60, 0x0c, 0xc2, 0x3a, 0x9e, 0xfd, 0x27, 0x16, 0xcc, 0x68, 0x53, 0xd5, 0x77, 0x26, 0x12, + 0x63, 0x90, 0x4a, 0x7d, 0x0c, 0xd2, 0xd1, 0xa2, 0x3d, 0x64, 0xce, 0xf0, 0xc0, 0x13, 0x9a, 0x61, + 0xfb, 0x9b, 0x80, 0xd2, 0xf9, 0xaa, 0xd1, 0xfb, 0xdc, 0x91, 0xdf, 0x0d, 0x48, 0xb3, 0xc8, 0xe0, + 0xaf, 0x47, 0xce, 0x91, 0x2f, 0x57, 0x79, 0x2d, 0xac, 0xea, 0xdb, 0x7f, 0x32, 0x00, 0xd3, 0xc9, + 0x58, 0x1d, 0xe8, 0x06, 0x0c, 0x71, 0x29, 0x5d, 0x90, 0x2f, 0xf0, 0x27, 0xd3, 0x22, 0x7c, 0xf0, + 0x2c, 0x41, 0x5c, 0xba, 0x17, 0xf5, 0xd1, 0x87, 0x30, 0xd6, 0xf4, 0x1f, 0x78, 0x0f, 0x9c, 0xa0, + 0x39, 0x5f, 0x5b, 0x15, 0x1c, 0x22, 0x53, 0x01, 0xb5, 0x14, 0xa3, 0xe9, 0x51, 0x43, 0x98, 0xef, + 0x44, 0x0c, 0xc2, 0x3a, 0x39, 0xb4, 0xc1, 0x12, 0x57, 0x6d, 0xba, 0x5b, 0x6b, 0x4e, 0xa7, 0xe8, + 0x55, 0xd7, 0xa2, 0x44, 0xd2, 0x28, 0x4f, 0x88, 0xec, 0x56, 0x1c, 0x80, 0x63, 0x42, 0xe8, 0x47, + 0xe1, 0x44, 0x98, 0x63, 0x12, 0xcb, 0x71, 0x38, 0x28, 0xb4, 0x12, 0x71, 0x65, 0x4a, 0x96, 0xf1, + 0x2c, 0xab, 0x19, 0xf4, 0x10, 0x90, 0x50, 0x3d, 0x6f, 0x04, 0xdd, 0x30, 0xe2, 0x29, 0x20, 0xc5, + 0xa5, 0xeb, 0x73, 0xd9, 0x7a, 0x82, 0x24, 0xb6, 0xd6, 0x36, 0x0b, 0x9c, 0x9c, 0xc6, 0xc0, 0x19, + 0x6d, 0xa0, 0x6d, 0x98, 0xec, 0x18, 0xd9, 0x37, 0xd9, 0xde, 0xcc, 0x89, 0x2e, 0x9c, 0x97, 0xa7, + 0x93, 0x9f, 0xd2, 0x26, 0x14, 0x27, 0xe8, 0xda, 0xdf, 0x19, 0x80, 0x59, 0x99, 0x8a, 0x3e, 0xe3, + 0x9d, 0xcc, 0xb7, 0xad, 0xc4, 0x43, 0x99, 0xb7, 0xf2, 0x8f, 0x94, 0xa7, 0xf6, 0x5c, 0xe6, 0x27, + 0xd3, 0xcf, 0x65, 0xde, 0x39, 0x62, 0x37, 0x9e, 0xd8, 0xa3, 0x99, 0x1f, 0xda, 0x97, 0x2e, 0x07, + 0x27, 0xc1, 0x10, 0x02, 0x10, 0xe6, 0xf1, 0xef, 0x6b, 0xd2, 0x48, 0x95, 0xa3, 0x68, 0xb8, 0x21, + 0x70, 0x0c, 0xb1, 0x62, 0x5c, 0x46, 0xc9, 0x67, 0x1c, 0x5d, 0xd1, 0xa1, 0x34, 0x49, 0xbb, 0x13, + 0xed, 0x2d, 0xb9, 0x81, 0xe8, 0x71, 0x26, 0xcd, 0x65, 0x81, 0x93, 0xa6, 0x29, 0x21, 0x58, 0xd1, + 0x41, 0xbb, 0x30, 0xb3, 0xc5, 0x62, 0x4b, 0x69, 0x59, 0xe1, 0x05, 0x07, 0xca, 0xe4, 0x10, 0xd7, + 0x17, 0x97, 0xf3, 0x53, 0xc8, 0xf3, 0x6b, 0x66, 0x0a, 0x05, 0xa7, 0x9b, 0xa0, 0x5b, 0xe3, 0xa4, + 0xf3, 0x20, 0x5c, 0x6e, 0x39, 0x61, 0xe4, 0x36, 0x16, 0x5a, 0x7e, 0x63, 0xa7, 0x1e, 0xf9, 0x81, + 0xcc, 0x2a, 0x9a, 0x79, 0xcb, 0x9b, 0xbf, 0x57, 0x4f, 0xe1, 0x1b, 0xcd, 0xb3, 0xec, 0xb6, 0x59, + 0x58, 0x38, 0xb3, 0x2d, 0xb4, 0x0e, 0xc3, 0x5b, 0x6e, 0x84, 0x49, 0xc7, 0x17, 0x7c, 0x29, 0x93, + 0xe9, 0x5e, 0xe7, 0x28, 0x46, 0x4b, 0x2c, 0xf6, 0x95, 0x00, 0x60, 0x49, 0x04, 0xbd, 0xaf, 0x8e, + 0x9b, 0xa1, 0x7c, 0x55, 0x6f, 0xda, 0xcb, 0x2f, 0xf3, 0xc0, 0x79, 0x17, 0xca, 0xde, 0x66, 0x58, + 0x14, 0xf5, 0x67, 0x7d, 0xc5, 0xd0, 0xd4, 0x2d, 0x0c, 0xd3, 0x4b, 0xf8, 0xfa, 0x4a, 0x1d, 0xd3, + 0x8a, 0xec, 0x81, 0x6d, 0xd8, 0x08, 0x5d, 0x91, 0xbc, 0x2b, 0xf3, 0xbd, 0xf1, 0x6a, 0x7d, 0xb1, + 0xbe, 0x6a, 0xd0, 0x60, 0xf1, 0x13, 0x59, 0x31, 0xe6, 0xd5, 0xd1, 0x5d, 0x18, 0xdd, 0xe2, 0x2c, + 0x76, 0x93, 0x87, 0xb5, 0xcd, 0x39, 0xf6, 0xae, 0x4b, 0x24, 0x83, 0x1e, 0x3b, 0x9c, 0x14, 0x08, + 0xc7, 0xa4, 0xd0, 0x77, 0x2c, 0x38, 0xd5, 0x49, 0xe8, 0x6a, 0xd9, 0xb3, 0x38, 0xe1, 0x10, 0x97, + 0xf9, 0xd4, 0xa0, 0x96, 0x55, 0xc1, 0x68, 0x90, 0x19, 0x7a, 0x32, 0xd1, 0x70, 0x76, 0x73, 0x74, + 0xa0, 0x83, 0xfb, 0xcd, 0xa2, 0x7c, 0x4f, 0x89, 0x10, 0x48, 0x7c, 0xa0, 0xf1, 0xc2, 0x12, 0xa6, + 0x15, 0xd1, 0x06, 0xc0, 0x66, 0x8b, 0x88, 0xd8, 0x92, 0xc2, 0xfd, 0x2a, 0x53, 0xce, 0x58, 0x51, + 0x58, 0x82, 0x0e, 0xbb, 0xf3, 0xc6, 0xa5, 0x58, 0xa3, 0x43, 0x97, 0x52, 0xc3, 0xf5, 0x9a, 0x24, + 0x60, 0x66, 0xb4, 0x9c, 0xa5, 0xb4, 0xc8, 0x30, 0xd2, 0x4b, 0x89, 0x97, 0x63, 0x41, 0x81, 0xd1, + 0x22, 0x9d, 0xed, 0xcd, 0xb0, 0x28, 0xb3, 0xc8, 0x22, 0xe9, 0x6c, 0x27, 0x16, 0x14, 0xa7, 0xc5, + 0xca, 0xb1, 0xa0, 0x40, 0xb7, 0xcc, 0x26, 0xdd, 0x40, 0x24, 0xa8, 0x4c, 0xe5, 0x6f, 0x99, 0x15, + 0x8e, 0x92, 0xde, 0x32, 0x02, 0x80, 0x25, 0x11, 0xf4, 0x0d, 0x53, 0xae, 0x9a, 0x66, 0x34, 0x5f, + 0xee, 0x21, 0x57, 0x19, 0x74, 0x8b, 0x25, 0xab, 0xb7, 0xa0, 0xb4, 0xd9, 0x60, 0xe6, 0xb7, 0x1c, + 0xeb, 0xc4, 0xca, 0xa2, 0x41, 0x8d, 0x45, 0xea, 0x5f, 0x59, 0xc4, 0xa5, 0xcd, 0x06, 0x5d, 0xfa, + 0xce, 0xa3, 0x6e, 0x40, 0x56, 0xdc, 0x16, 0x11, 0xa1, 0x83, 0x33, 0x97, 0xfe, 0xbc, 0x44, 0x4a, + 0x2f, 0x7d, 0x05, 0xc2, 0x31, 0x29, 0x4a, 0x37, 0x96, 0xf6, 0x4e, 0xe4, 0xd3, 0x55, 0x42, 0x5d, + 0x9a, 0x6e, 0xa6, 0xbc, 0xb7, 0x03, 0x13, 0xbb, 0x61, 0x67, 0x9b, 0x48, 0xae, 0xc8, 0x0c, 0x83, + 0x39, 0x31, 0x31, 0xee, 0x0a, 0x44, 0x37, 0x88, 0xba, 0x4e, 0x2b, 0xc5, 0xc8, 0x99, 0x12, 0xe7, + 0xae, 0x4e, 0x0c, 0x9b, 0xb4, 0xe9, 0x42, 0xf8, 0x88, 0x07, 0xae, 0x63, 0x26, 0xc2, 0x9c, 0x85, + 0x90, 0x11, 0xdb, 0x8e, 0x2f, 0x04, 0x01, 0xc0, 0x92, 0x88, 0x1a, 0x6c, 0x76, 0x00, 0x9d, 0xee, + 0x31, 0xd8, 0xa9, 0xfe, 0xc6, 0x83, 0xcd, 0x0e, 0x9c, 0x98, 0x14, 0x3b, 0x68, 0x3a, 0xdb, 0x7e, + 0xe4, 0x7b, 0x89, 0x43, 0xee, 0x4c, 0xfe, 0x41, 0x53, 0xcb, 0xc0, 0x4f, 0x1f, 0x34, 0x59, 0x58, + 0x38, 0xb3, 0x2d, 0xfa, 0x71, 0x1d, 0x19, 0x83, 0x50, 0x64, 0x42, 0x79, 0x29, 0x27, 0x84, 0x67, + 0x3a, 0x50, 0x21, 0xff, 0x38, 0x05, 0xc2, 0x31, 0x29, 0xd4, 0xa4, 0x92, 0xae, 0x1e, 0xdb, 0x96, + 0x65, 0x74, 0xc9, 0x91, 0x0b, 0xb2, 0xa2, 0xe0, 0x4a, 0x29, 0x57, 0x87, 0xe0, 0x04, 0x4d, 0xe6, + 0x23, 0xc8, 0x1f, 0x15, 0xb2, 0x84, 0x2f, 0x39, 0x53, 0x9d, 0xf1, 0xee, 0x90, 0x4f, 0xb5, 0x00, + 0x60, 0x49, 0x84, 0x8e, 0x86, 0x78, 0x0a, 0xe7, 0x87, 0x2c, 0x6f, 0x52, 0x9e, 0x29, 0x3f, 0xcb, + 0x20, 0x25, 0x03, 0xcd, 0x0b, 0x10, 0x8e, 0x49, 0x51, 0x4e, 0x4e, 0x0f, 0xbc, 0x73, 0xf9, 0x9c, + 0x3c, 0x79, 0xdc, 0x31, 0x4e, 0x4e, 0x0f, 0xbb, 0xb2, 0x38, 0xea, 0x54, 0x5c, 0x74, 0x96, 0xf3, + 0x25, 0xa7, 0x5f, 0x2a, 0xb0, 0x7a, 0xba, 0x5f, 0x0a, 0x84, 0x63, 0x52, 0xec, 0x28, 0x66, 0x41, + 0xf0, 0x2e, 0x14, 0x1c, 0xc5, 0x14, 0x21, 0xe3, 0x28, 0xd6, 0x82, 0xe4, 0xd9, 0x7f, 0xb9, 0x04, + 0x17, 0x8a, 0xf7, 0x6d, 0x6c, 0xad, 0xab, 0xc5, 0xde, 0x51, 0x09, 0x6b, 0x1d, 0xd7, 0x1d, 0xc5, + 0x58, 0x7d, 0x87, 0x36, 0xbe, 0x0e, 0x33, 0xea, 0xe1, 0x63, 0xcb, 0x6d, 0xec, 0x69, 0x89, 0x5e, + 0x55, 0x10, 0xa0, 0x7a, 0x12, 0x01, 0xa7, 0xeb, 0xa0, 0x79, 0x98, 0x32, 0x0a, 0x57, 0x97, 0x84, + 0xa2, 0x21, 0xce, 0x56, 0x62, 0x82, 0x71, 0x12, 0xdf, 0xfe, 0x45, 0x0b, 0xce, 0xf0, 0x40, 0xbc, + 0xa4, 0x59, 0xf3, 0x9b, 0x52, 0xa3, 0x70, 0xa4, 0xc8, 0xbd, 0x9b, 0x30, 0xd5, 0x31, 0xab, 0xf6, + 0x08, 0x36, 0xae, 0xa3, 0xc6, 0x7d, 0x4d, 0x00, 0x70, 0x92, 0xa8, 0xfd, 0xf3, 0x25, 0x38, 0x5f, + 0xe8, 0xc9, 0x8f, 0x30, 0x9c, 0xde, 0x6a, 0x87, 0xce, 0x62, 0x40, 0x9a, 0xc4, 0x8b, 0x5c, 0xa7, + 0x55, 0xef, 0x90, 0x86, 0x66, 0x6f, 0x65, 0x2e, 0xf1, 0xd7, 0xd7, 0xea, 0xf3, 0x69, 0x0c, 0x9c, + 0x53, 0x13, 0xad, 0x00, 0x4a, 0x43, 0xc4, 0x0c, 0xb3, 0xcb, 0x74, 0x9a, 0x1e, 0xce, 0xa8, 0x81, + 0xbe, 0x00, 0x13, 0xea, 0x85, 0x80, 0x36, 0xe3, 0xec, 0x80, 0xc0, 0x3a, 0x00, 0x9b, 0x78, 0xe8, + 0x2a, 0x4f, 0x63, 0x25, 0x12, 0x9e, 0x09, 0xe3, 0xec, 0x94, 0xcc, 0x51, 0x25, 0x8a, 0xb1, 0x8e, + 0xb3, 0x70, 0xed, 0x77, 0xfe, 0xf0, 0xc2, 0x67, 0x7e, 0xf7, 0x0f, 0x2f, 0x7c, 0xe6, 0x0f, 0xfe, + 0xf0, 0xc2, 0x67, 0x7e, 0xfc, 0xe0, 0x82, 0xf5, 0x3b, 0x07, 0x17, 0xac, 0xdf, 0x3d, 0xb8, 0x60, + 0xfd, 0xc1, 0xc1, 0x05, 0xeb, 0x7f, 0x3b, 0xb8, 0x60, 0x7d, 0xef, 0x7f, 0xbf, 0xf0, 0x99, 0xaf, + 0xa2, 0x38, 0x16, 0xf6, 0x15, 0x3a, 0x3b, 0x57, 0x76, 0xaf, 0xfe, 0x87, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xba, 0xfb, 0xfc, 0xdd, 0x18, 0x2e, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -9346,6 +9549,22 @@ func (m *Container) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.RestartPolicyRules) > 0 { + for iNdEx := len(m.RestartPolicyRules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RestartPolicyRules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } + } if m.RestartPolicy != nil { i -= len(*m.RestartPolicy) copy(dAtA[i:], *m.RestartPolicy) @@ -9600,6 +9819,44 @@ func (m *Container) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ContainerExtendedResourceRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerExtendedResourceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerExtendedResourceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.RequestName) + copy(dAtA[i:], m.RequestName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.RequestName))) + i-- + dAtA[i] = 0x1a + i -= len(m.ResourceName) + copy(dAtA[i:], m.ResourceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceName))) + i-- + dAtA[i] = 0x12 + i -= len(m.ContainerName) + copy(dAtA[i:], m.ContainerName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContainerName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ContainerImage) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9712,6 +9969,81 @@ func (m *ContainerResizePolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ContainerRestartRule) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerRestartRule) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerRestartRule) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ExitCodes != nil { + { + size, err := m.ExitCodes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ContainerRestartRuleOnExitCodes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerRestartRuleOnExitCodes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerRestartRuleOnExitCodes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Values) > 0 { + for iNdEx := len(m.Values) - 1; iNdEx >= 0; iNdEx-- { + i = encodeVarintGenerated(dAtA, i, uint64(m.Values[iNdEx])) + i-- + dAtA[i] = 0x10 + } + } + i -= len(m.Operator) + copy(dAtA[i:], m.Operator) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ContainerState) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10681,6 +11013,18 @@ func (m *EnvVarSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.FileKeyRef != nil { + { + size, err := m.FileKeyRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if m.SecretKeyRef != nil { { size, err := m.SecretKeyRef.MarshalToSizedBuffer(dAtA[:i]) @@ -10790,6 +11134,22 @@ func (m *EphemeralContainerCommon) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if len(m.RestartPolicyRules) > 0 { + for iNdEx := len(m.RestartPolicyRules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RestartPolicyRules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } + } if m.RestartPolicy != nil { i -= len(*m.RestartPolicy) copy(dAtA[i:], *m.RestartPolicy) @@ -11426,6 +11786,54 @@ func (m *FCVolumeSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *FileKeySelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FileKeySelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *FileKeySelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Optional != nil { + i-- + if *m.Optional { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0x1a + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x12 + i -= len(m.VolumeName) + copy(dAtA[i:], m.VolumeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *FlexPersistentVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -15791,6 +16199,59 @@ func (m *PodAttachOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PodCertificateProjection) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateProjection) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateProjection) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.CertificateChainPath) + copy(dAtA[i:], m.CertificateChainPath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CertificateChainPath))) + i-- + dAtA[i] = 0x32 + i -= len(m.KeyPath) + copy(dAtA[i:], m.KeyPath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.KeyPath))) + i-- + dAtA[i] = 0x2a + i -= len(m.CredentialBundlePath) + copy(dAtA[i:], m.CredentialBundlePath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CredentialBundlePath))) + i-- + dAtA[i] = 0x22 + if m.MaxExpirationSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxExpirationSeconds)) + i-- + dAtA[i] = 0x18 + } + i -= len(m.KeyType) + copy(dAtA[i:], m.KeyType) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.KeyType))) + i-- + dAtA[i] = 0x12 + i -= len(m.SignerName) + copy(dAtA[i:], m.SignerName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.SignerName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *PodCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -16016,6 +16477,48 @@ func (m *PodExecOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PodExtendedResourceClaimStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodExtendedResourceClaimStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodExtendedResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.ResourceClaimName) + copy(dAtA[i:], m.ResourceClaimName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceClaimName))) + i-- + dAtA[i] = 0x12 + if len(m.RequestMappings) > 0 { + for iNdEx := len(m.RequestMappings) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RequestMappings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *PodIP) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -16597,6 +17100,15 @@ func (m *PodSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.HostnameOverride != nil { + i -= len(*m.HostnameOverride) + copy(dAtA[i:], *m.HostnameOverride) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.HostnameOverride))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xca + } if m.Resources != nil { { size, err := m.Resources.MarshalToSizedBuffer(dAtA[:i]) @@ -17085,6 +17597,20 @@ func (m *PodStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.ExtendedResourceClaimStatus != nil { + { + size, err := m.ExtendedResourceClaimStatus.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) i-- dAtA[i] = 0x1 @@ -21108,6 +21634,18 @@ func (m *VolumeProjection) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PodCertificate != nil { + { + size, err := m.PodCertificate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if m.ClusterTrustBundle != nil { { size, err := m.ClusterTrustBundle.MarshalToSizedBuffer(dAtA[:i]) @@ -22471,6 +23009,27 @@ func (m *Container) Size() (n int) { l = len(*m.RestartPolicy) n += 2 + l + sovGenerated(uint64(l)) } + if len(m.RestartPolicyRules) > 0 { + for _, e := range m.RestartPolicyRules { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ContainerExtendedResourceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ContainerName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ResourceName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.RequestName) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -22520,6 +23079,37 @@ func (m *ContainerResizePolicy) Size() (n int) { return n } +func (m *ContainerRestartRule) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + n += 1 + l + sovGenerated(uint64(l)) + if m.ExitCodes != nil { + l = m.ExitCodes.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *ContainerRestartRuleOnExitCodes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Operator) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Values) > 0 { + for _, e := range m.Values { + n += 1 + sovGenerated(uint64(e)) + } + } + return n +} + func (m *ContainerState) Size() (n int) { if m == nil { return 0 @@ -22896,6 +23486,10 @@ func (m *EnvVarSource) Size() (n int) { l = m.SecretKeyRef.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.FileKeyRef != nil { + l = m.FileKeyRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -23007,6 +23601,12 @@ func (m *EphemeralContainerCommon) Size() (n int) { l = len(*m.RestartPolicy) n += 2 + l + sovGenerated(uint64(l)) } + if len(m.RestartPolicyRules) > 0 { + for _, e := range m.RestartPolicyRules { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -23149,6 +23749,24 @@ func (m *FCVolumeSource) Size() (n int) { return n } +func (m *FileKeySelector) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.VolumeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Path) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + if m.Optional != nil { + n += 2 + } + return n +} + func (m *FlexPersistentVolumeSource) Size() (n int) { if m == nil { return 0 @@ -24752,6 +25370,28 @@ func (m *PodAttachOptions) Size() (n int) { return n } +func (m *PodCertificateProjection) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SignerName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.KeyType) + n += 1 + l + sovGenerated(uint64(l)) + if m.MaxExpirationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.MaxExpirationSeconds)) + } + l = len(m.CredentialBundlePath) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.KeyPath) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.CertificateChainPath) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PodCondition) Size() (n int) { if m == nil { return 0 @@ -24837,6 +25477,23 @@ func (m *PodExecOptions) Size() (n int) { return n } +func (m *PodExtendedResourceClaimStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.RequestMappings) > 0 { + for _, e := range m.RequestMappings { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.ResourceClaimName) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PodIP) Size() (n int) { if m == nil { return 0 @@ -25224,6 +25881,10 @@ func (m *PodSpec) Size() (n int) { l = m.Resources.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.HostnameOverride != nil { + l = len(*m.HostnameOverride) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -25296,6 +25957,10 @@ func (m *PodStatus) Size() (n int) { } } n += 2 + sovGenerated(uint64(m.ObservedGeneration)) + if m.ExtendedResourceClaimStatus != nil { + l = m.ExtendedResourceClaimStatus.Size() + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -26751,6 +27416,10 @@ func (m *VolumeProjection) Size() (n int) { l = m.ClusterTrustBundle.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.PodCertificate != nil { + l = m.PodCertificate.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -27426,6 +28095,11 @@ func (this *Container) String() string { repeatedStringForResizePolicy += strings.Replace(strings.Replace(f.String(), "ContainerResizePolicy", "ContainerResizePolicy", 1), `&`, ``, 1) + "," } repeatedStringForResizePolicy += "}" + repeatedStringForRestartPolicyRules := "[]ContainerRestartRule{" + for _, f := range this.RestartPolicyRules { + repeatedStringForRestartPolicyRules += strings.Replace(strings.Replace(f.String(), "ContainerRestartRule", "ContainerRestartRule", 1), `&`, ``, 1) + "," + } + repeatedStringForRestartPolicyRules += "}" s := strings.Join([]string{`&Container{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Image:` + fmt.Sprintf("%v", this.Image) + `,`, @@ -27451,6 +28125,19 @@ func (this *Container) String() string { `StartupProbe:` + strings.Replace(this.StartupProbe.String(), "Probe", "Probe", 1) + `,`, `ResizePolicy:` + repeatedStringForResizePolicy + `,`, `RestartPolicy:` + valueToStringGenerated(this.RestartPolicy) + `,`, + `RestartPolicyRules:` + repeatedStringForRestartPolicyRules + `,`, + `}`, + }, "") + return s +} +func (this *ContainerExtendedResourceRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerExtendedResourceRequest{`, + `ContainerName:` + fmt.Sprintf("%v", this.ContainerName) + `,`, + `ResourceName:` + fmt.Sprintf("%v", this.ResourceName) + `,`, + `RequestName:` + fmt.Sprintf("%v", this.RequestName) + `,`, `}`, }, "") return s @@ -27491,6 +28178,28 @@ func (this *ContainerResizePolicy) String() string { }, "") return s } +func (this *ContainerRestartRule) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerRestartRule{`, + `Action:` + fmt.Sprintf("%v", this.Action) + `,`, + `ExitCodes:` + strings.Replace(this.ExitCodes.String(), "ContainerRestartRuleOnExitCodes", "ContainerRestartRuleOnExitCodes", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerRestartRuleOnExitCodes) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerRestartRuleOnExitCodes{`, + `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, + `Values:` + fmt.Sprintf("%v", this.Values) + `,`, + `}`, + }, "") + return s +} func (this *ContainerState) String() string { if this == nil { return "nil" @@ -27777,6 +28486,7 @@ func (this *EnvVarSource) String() string { `ResourceFieldRef:` + strings.Replace(this.ResourceFieldRef.String(), "ResourceFieldSelector", "ResourceFieldSelector", 1) + `,`, `ConfigMapKeyRef:` + strings.Replace(this.ConfigMapKeyRef.String(), "ConfigMapKeySelector", "ConfigMapKeySelector", 1) + `,`, `SecretKeyRef:` + strings.Replace(this.SecretKeyRef.String(), "SecretKeySelector", "SecretKeySelector", 1) + `,`, + `FileKeyRef:` + strings.Replace(this.FileKeyRef.String(), "FileKeySelector", "FileKeySelector", 1) + `,`, `}`, }, "") return s @@ -27826,6 +28536,11 @@ func (this *EphemeralContainerCommon) String() string { repeatedStringForResizePolicy += strings.Replace(strings.Replace(f.String(), "ContainerResizePolicy", "ContainerResizePolicy", 1), `&`, ``, 1) + "," } repeatedStringForResizePolicy += "}" + repeatedStringForRestartPolicyRules := "[]ContainerRestartRule{" + for _, f := range this.RestartPolicyRules { + repeatedStringForRestartPolicyRules += strings.Replace(strings.Replace(f.String(), "ContainerRestartRule", "ContainerRestartRule", 1), `&`, ``, 1) + "," + } + repeatedStringForRestartPolicyRules += "}" s := strings.Join([]string{`&EphemeralContainerCommon{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Image:` + fmt.Sprintf("%v", this.Image) + `,`, @@ -27851,6 +28566,7 @@ func (this *EphemeralContainerCommon) String() string { `StartupProbe:` + strings.Replace(this.StartupProbe.String(), "Probe", "Probe", 1) + `,`, `ResizePolicy:` + repeatedStringForResizePolicy + `,`, `RestartPolicy:` + valueToStringGenerated(this.RestartPolicy) + `,`, + `RestartPolicyRules:` + repeatedStringForRestartPolicyRules + `,`, `}`, }, "") return s @@ -27951,6 +28667,19 @@ func (this *FCVolumeSource) String() string { }, "") return s } +func (this *FileKeySelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FileKeySelector{`, + `VolumeName:` + fmt.Sprintf("%v", this.VolumeName) + `,`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Optional:` + valueToStringGenerated(this.Optional) + `,`, + `}`, + }, "") + return s +} func (this *FlexPersistentVolumeSource) String() string { if this == nil { return "nil" @@ -29169,6 +29898,21 @@ func (this *PodAttachOptions) String() string { }, "") return s } +func (this *PodCertificateProjection) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodCertificateProjection{`, + `SignerName:` + fmt.Sprintf("%v", this.SignerName) + `,`, + `KeyType:` + fmt.Sprintf("%v", this.KeyType) + `,`, + `MaxExpirationSeconds:` + valueToStringGenerated(this.MaxExpirationSeconds) + `,`, + `CredentialBundlePath:` + fmt.Sprintf("%v", this.CredentialBundlePath) + `,`, + `KeyPath:` + fmt.Sprintf("%v", this.KeyPath) + `,`, + `CertificateChainPath:` + fmt.Sprintf("%v", this.CertificateChainPath) + `,`, + `}`, + }, "") + return s +} func (this *PodCondition) String() string { if this == nil { return "nil" @@ -29228,6 +29972,22 @@ func (this *PodExecOptions) String() string { }, "") return s } +func (this *PodExtendedResourceClaimStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForRequestMappings := "[]ContainerExtendedResourceRequest{" + for _, f := range this.RequestMappings { + repeatedStringForRequestMappings += strings.Replace(strings.Replace(f.String(), "ContainerExtendedResourceRequest", "ContainerExtendedResourceRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForRequestMappings += "}" + s := strings.Join([]string{`&PodExtendedResourceClaimStatus{`, + `RequestMappings:` + repeatedStringForRequestMappings + `,`, + `ResourceClaimName:` + fmt.Sprintf("%v", this.ResourceClaimName) + `,`, + `}`, + }, "") + return s +} func (this *PodIP) String() string { if this == nil { return "nil" @@ -29503,6 +30263,7 @@ func (this *PodSpec) String() string { `SchedulingGates:` + repeatedStringForSchedulingGates + `,`, `ResourceClaims:` + repeatedStringForResourceClaims + `,`, `Resources:` + strings.Replace(this.Resources.String(), "ResourceRequirements", "ResourceRequirements", 1) + `,`, + `HostnameOverride:` + valueToStringGenerated(this.HostnameOverride) + `,`, `}`, }, "") return s @@ -29564,6 +30325,7 @@ func (this *PodStatus) String() string { `ResourceClaimStatuses:` + repeatedStringForResourceClaimStatuses + `,`, `HostIPs:` + repeatedStringForHostIPs + `,`, `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, + `ExtendedResourceClaimStatus:` + strings.Replace(this.ExtendedResourceClaimStatus.String(), "PodExtendedResourceClaimStatus", "PodExtendedResourceClaimStatus", 1) + `,`, `}`, }, "") return s @@ -30673,6 +31435,7 @@ func (this *VolumeProjection) String() string { `ConfigMap:` + strings.Replace(this.ConfigMap.String(), "ConfigMapProjection", "ConfigMapProjection", 1) + `,`, `ServiceAccountToken:` + strings.Replace(this.ServiceAccountToken.String(), "ServiceAccountTokenProjection", "ServiceAccountTokenProjection", 1) + `,`, `ClusterTrustBundle:` + strings.Replace(this.ClusterTrustBundle.String(), "ClusterTrustBundleProjection", "ClusterTrustBundleProjection", 1) + `,`, + `PodCertificate:` + strings.Replace(this.PodCertificate.String(), "PodCertificateProjection", "PodCertificateProjection", 1) + `,`, `}`, }, "") return s @@ -36465,61 +37228,11 @@ func (m *Container) Unmarshal(dAtA []byte) error { s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) m.RestartPolicy = &s iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ContainerImage) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ContainerImage: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerImage: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 25: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Names", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicyRules", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36529,43 +37242,26 @@ func (m *ContainerImage) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Names = append(m.Names, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SizeBytes", wireType) - } - m.SizeBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SizeBytes |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + m.RestartPolicyRules = append(m.RestartPolicyRules, ContainerRestartRule{}) + if err := m.RestartPolicyRules[len(m.RestartPolicyRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -36587,7 +37283,7 @@ func (m *ContainerImage) Unmarshal(dAtA []byte) error { } return nil } -func (m *ContainerPort) Unmarshal(dAtA []byte) error { +func (m *ContainerExtendedResourceRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36610,15 +37306,15 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ContainerPort: wiretype end group for non-group") + return fmt.Errorf("proto: ContainerExtendedResourceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerPort: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContainerExtendedResourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContainerName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36646,49 +37342,11 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.ContainerName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostPort", wireType) - } - m.HostPort = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HostPort |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ContainerPort", wireType) - } - m.ContainerPort = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ContainerPort |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36716,11 +37374,11 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Protocol = Protocol(dAtA[iNdEx:postIndex]) + m.ResourceName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HostIP", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RequestName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36748,7 +37406,7 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.HostIP = string(dAtA[iNdEx:postIndex]) + m.RequestName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -36771,7 +37429,7 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { } return nil } -func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { +func (m *ContainerImage) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36794,15 +37452,15 @@ func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ContainerResizePolicy: wiretype end group for non-group") + return fmt.Errorf("proto: ContainerImage: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerResizePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContainerImage: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Names", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36830,13 +37488,13 @@ func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResourceName = ResourceName(dAtA[iNdEx:postIndex]) + m.Names = append(m.Names, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SizeBytes", wireType) } - var stringLen uint64 + m.SizeBytes = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36846,24 +37504,585 @@ func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.SizeBytes |= int64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RestartPolicy = ResourceResizeRestartPolicy(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerPort) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerPort: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerPort: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HostPort", wireType) + } + m.HostPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HostPort |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerPort", wireType) + } + m.ContainerPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContainerPort |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Protocol = Protocol(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostIP", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HostIP = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerResizePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerResizePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceName = ResourceName(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RestartPolicy = ResourceResizeRestartPolicy(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerRestartRule) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerRestartRule: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerRestartRule: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = ContainerRestartRuleAction(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExitCodes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExitCodes == nil { + m.ExitCodes = &ContainerRestartRuleOnExitCodes{} + } + if err := m.ExitCodes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerRestartRuleOnExitCodes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerRestartRuleOnExitCodes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerRestartRuleOnExitCodes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Operator = ContainerRestartRuleOnExitCodesOperator(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Values = append(m.Values, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.Values) == 0 { + m.Values = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Values = append(m.Values, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -38790,13 +40009,196 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.IP = string(dAtA[iNdEx:postIndex]) + m.IP = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TargetRef == nil { + m.TargetRef = &ObjectReference{} + } + if err := m.TargetRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.NodeName = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointPort) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointPort: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointPort: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TargetRef", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) } - var msglen int + m.Port = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -38806,31 +40208,14 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Port |= int32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TargetRef == nil { - m.TargetRef = &ObjectReference{} - } - if err := m.TargetRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -38858,11 +40243,11 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Hostname = string(dAtA[iNdEx:postIndex]) + m.Protocol = Protocol(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppProtocol", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -38891,7 +40276,7 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.NodeName = &s + m.AppProtocol = &s iNdEx = postIndex default: iNdEx = preIndex @@ -38914,7 +40299,7 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { } return nil } -func (m *EndpointPort) Unmarshal(dAtA []byte) error { +func (m *EndpointSubset) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -38937,17 +40322,17 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EndpointPort: wiretype end group for non-group") + return fmt.Errorf("proto: EndpointSubset: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointPort: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EndpointSubset: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -38957,48 +40342,31 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Addresses = append(m.Addresses, EndpointAddress{}) + if err := m.Addresses[len(m.Addresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) - } - m.Port = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Port |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NotReadyAddresses", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -39008,29 +40376,31 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Protocol = Protocol(dAtA[iNdEx:postIndex]) + m.NotReadyAddresses = append(m.NotReadyAddresses, EndpointAddress{}) + if err := m.NotReadyAddresses[len(m.NotReadyAddresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppProtocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -39040,24 +40410,25 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.AppProtocol = &s + m.Ports = append(m.Ports, EndpointPort{}) + if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -39080,7 +40451,7 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } return nil } -func (m *EndpointSubset) Unmarshal(dAtA []byte) error { +func (m *Endpoints) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39103,15 +40474,15 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EndpointSubset: wiretype end group for non-group") + return fmt.Errorf("proto: Endpoints: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointSubset: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Endpoints: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39138,48 +40509,13 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Addresses = append(m.Addresses, EndpointAddress{}) - if err := m.Addresses[len(m.Addresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NotReadyAddresses", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NotReadyAddresses = append(m.NotReadyAddresses, EndpointAddress{}) - if err := m.NotReadyAddresses[len(m.NotReadyAddresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Subsets", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39206,8 +40542,8 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Ports = append(m.Ports, EndpointPort{}) - if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Subsets = append(m.Subsets, EndpointSubset{}) + if err := m.Subsets[len(m.Subsets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39232,7 +40568,7 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { } return nil } -func (m *Endpoints) Unmarshal(dAtA []byte) error { +func (m *EndpointsList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39255,15 +40591,15 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Endpoints: wiretype end group for non-group") + return fmt.Errorf("proto: EndpointsList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Endpoints: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EndpointsList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39290,13 +40626,13 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Subsets", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39323,8 +40659,8 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Subsets = append(m.Subsets, EndpointSubset{}) - if err := m.Subsets[len(m.Subsets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, Endpoints{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39349,7 +40685,7 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { } return nil } -func (m *EndpointsList) Unmarshal(dAtA []byte) error { +func (m *EnvFromSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39372,15 +40708,47 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EndpointsList: wiretype end group for non-group") + return fmt.Errorf("proto: EnvFromSource: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointsList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvFromSource: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Prefix = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39407,13 +40775,16 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ConfigMapRef == nil { + m.ConfigMapRef = &ConfigMapEnvSource{} + } + if err := m.ConfigMapRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39440,8 +40811,10 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, Endpoints{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.SecretRef == nil { + m.SecretRef = &SecretEnvSource{} + } + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39466,7 +40839,7 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvFromSource) Unmarshal(dAtA []byte) error { +func (m *EnvVar) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39489,15 +40862,15 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvFromSource: wiretype end group for non-group") + return fmt.Errorf("proto: EnvVar: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvFromSource: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvVar: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -39525,13 +40898,13 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Prefix = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -39541,31 +40914,27 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConfigMapRef == nil { - m.ConfigMapRef = &ConfigMapEnvSource{} - } - if err := m.ConfigMapRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValueFrom", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39592,10 +40961,10 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SecretRef == nil { - m.SecretRef = &SecretEnvSource{} + if m.ValueFrom == nil { + m.ValueFrom = &EnvVarSource{} } - if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ValueFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39620,7 +40989,7 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvVar) Unmarshal(dAtA []byte) error { +func (m *EnvVarSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39643,79 +41012,15 @@ func (m *EnvVar) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvVar: wiretype end group for non-group") + return fmt.Errorf("proto: EnvVarSource: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvVar: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvVarSource: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValueFrom", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39742,66 +41047,16 @@ func (m *EnvVar) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ValueFrom == nil { - m.ValueFrom = &EnvVarSource{} + if m.FieldRef == nil { + m.FieldRef = &ObjectFieldSelector{} } - if err := m.ValueFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.FieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvVarSource) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EnvVarSource: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvVarSource: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceFieldRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39828,16 +41083,16 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.FieldRef == nil { - m.FieldRef = &ObjectFieldSelector{} + if m.ResourceFieldRef == nil { + m.ResourceFieldRef = &ResourceFieldSelector{} } - if err := m.FieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceFieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceFieldRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapKeyRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39864,16 +41119,16 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ResourceFieldRef == nil { - m.ResourceFieldRef = &ResourceFieldSelector{} + if m.ConfigMapKeyRef == nil { + m.ConfigMapKeyRef = &ConfigMapKeySelector{} } - if err := m.ResourceFieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConfigMapKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapKeyRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SecretKeyRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39900,16 +41155,16 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConfigMapKeyRef == nil { - m.ConfigMapKeyRef = &ConfigMapKeySelector{} + if m.SecretKeyRef == nil { + m.SecretKeyRef = &SecretKeySelector{} } - if err := m.ConfigMapKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SecretKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretKeyRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FileKeyRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39936,10 +41191,10 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SecretKeyRef == nil { - m.SecretKeyRef = &SecretKeySelector{} + if m.FileKeyRef == nil { + m.FileKeyRef = &FileKeySelector{} } - if err := m.SecretKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.FileKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -40700,46 +41955,116 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EnvFrom = append(m.EnvFrom, EnvFromSource{}) - if err := m.EnvFrom[len(m.EnvFrom)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 20: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TerminationMessagePolicy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated + m.EnvFrom = append(m.EnvFrom, EnvFromSource{}) + if err := m.EnvFrom[len(m.EnvFrom)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TerminationMessagePolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TerminationMessagePolicy = TerminationMessagePolicy(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeDevices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeDevices = append(m.VolumeDevices, VolumeDevice{}) + if err := m.VolumeDevices[len(m.VolumeDevices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartupProbe", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.StartupProbe == nil { + m.StartupProbe = &Probe{} } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.StartupProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.TerminationMessagePolicy = TerminationMessagePolicy(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 21: + case 23: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VolumeDevices", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResizePolicy", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -40766,16 +42091,16 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeDevices = append(m.VolumeDevices, VolumeDevice{}) - if err := m.VolumeDevices[len(m.VolumeDevices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.ResizePolicy = append(m.ResizePolicy, ContainerResizePolicy{}) + if err := m.ResizePolicy[len(m.ResizePolicy)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 22: + case 24: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartupProbe", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -40785,31 +42110,28 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.StartupProbe == nil { - m.StartupProbe = &Probe{} - } - if err := m.StartupProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) + m.RestartPolicy = &s iNdEx = postIndex - case 23: + case 25: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResizePolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicyRules", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -40836,44 +42158,11 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResizePolicy = append(m.ResizePolicy, ContainerResizePolicy{}) - if err := m.ResizePolicy[len(m.ResizePolicy)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.RestartPolicyRules = append(m.RestartPolicyRules, ContainerRestartRule{}) + if err := m.RestartPolicyRules[len(m.RestartPolicyRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 24: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) - m.RestartPolicy = &s - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -42113,6 +43402,173 @@ func (m *FCVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *FileKeySelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FileKeySelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FileKeySelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Optional = &b + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *FlexPersistentVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -55916,17 +57372,297 @@ func (m *PodAntiAffinity) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PodAntiAffinity: wiretype end group for non-group") + return fmt.Errorf("proto: PodAntiAffinity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodAntiAffinity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequiredDuringSchedulingIgnoredDuringExecution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RequiredDuringSchedulingIgnoredDuringExecution = append(m.RequiredDuringSchedulingIgnoredDuringExecution, PodAffinityTerm{}) + if err := m.RequiredDuringSchedulingIgnoredDuringExecution[len(m.RequiredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreferredDuringSchedulingIgnoredDuringExecution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PreferredDuringSchedulingIgnoredDuringExecution = append(m.PreferredDuringSchedulingIgnoredDuringExecution, WeightedPodAffinityTerm{}) + if err := m.PreferredDuringSchedulingIgnoredDuringExecution[len(m.PreferredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodAttachOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodAttachOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdin = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdout = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stderr = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TTY = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Container = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateProjection) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateProjection: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PodAntiAffinity: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PodCertificateProjection: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RequiredDuringSchedulingIgnoredDuringExecution", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SignerName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -55936,31 +57672,29 @@ func (m *PodAntiAffinity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.RequiredDuringSchedulingIgnoredDuringExecution = append(m.RequiredDuringSchedulingIgnoredDuringExecution, PodAffinityTerm{}) - if err := m.RequiredDuringSchedulingIgnoredDuringExecution[len(m.RequiredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.SignerName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PreferredDuringSchedulingIgnoredDuringExecution", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KeyType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -55970,81 +57704,29 @@ func (m *PodAntiAffinity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.PreferredDuringSchedulingIgnoredDuringExecution = append(m.PreferredDuringSchedulingIgnoredDuringExecution, WeightedPodAffinityTerm{}) - if err := m.PreferredDuringSchedulingIgnoredDuringExecution[len(m.PreferredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.KeyType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PodAttachOptions: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PodAttachOptions: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MaxExpirationSeconds", wireType) } - var v int + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56054,17 +57736,17 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + v |= int32(b&0x7F) << shift if b < 0x80 { break } } - m.Stdin = bool(v != 0) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) + m.MaxExpirationSeconds = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CredentialBundlePath", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56074,37 +57756,29 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.Stdout = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated } - m.Stderr = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) + if postIndex > l { + return io.ErrUnexpectedEOF } - var v int + m.CredentialBundlePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KeyPath", wireType) + } + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56114,15 +57788,27 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.TTY = bool(v != 0) - case 5: + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KeyPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CertificateChainPath", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56150,7 +57836,7 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Container = string(dAtA[iNdEx:postIndex]) + m.CertificateChainPath = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -56607,15 +58293,210 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PodDNSConfigOption: wiretype end group for non-group") + return fmt.Errorf("proto: PodDNSConfigOption: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodDNSConfigOption: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Value = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodExecOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodExecOptions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PodDNSConfigOption: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PodExecOptions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdin = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdout = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stderr = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TTY = bool(v != 0) + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56643,11 +58524,11 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Container = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56675,8 +58556,7 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.Value = &s + m.Command = append(m.Command, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -56699,7 +58579,7 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { } return nil } -func (m *PodExecOptions) Unmarshal(dAtA []byte) error { +func (m *PodExtendedResourceClaimStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -56722,97 +58602,17 @@ func (m *PodExecOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PodExecOptions: wiretype end group for non-group") + return fmt.Errorf("proto: PodExtendedResourceClaimStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PodExecOptions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PodExtendedResourceClaimStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Stdin = bool(v != 0) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Stdout = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Stderr = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.TTY = bool(v != 0) - case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RequestMappings", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56822,27 +58622,29 @@ func (m *PodExecOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Container = string(dAtA[iNdEx:postIndex]) + m.RequestMappings = append(m.RequestMappings, ContainerExtendedResourceRequest{}) + if err := m.RequestMappings[len(m.RequestMappings)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceClaimName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56870,7 +58672,7 @@ func (m *PodExecOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Command = append(m.Command, string(dAtA[iNdEx:postIndex])) + m.ResourceClaimName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -60088,6 +61890,39 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 41: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostnameOverride", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.HostnameOverride = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -60687,6 +62522,42 @@ func (m *PodStatus) Unmarshal(dAtA []byte) error { break } } + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtendedResourceClaimStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExtendedResourceClaimStatus == nil { + m.ExtendedResourceClaimStatus = &PodExtendedResourceClaimStatus{} + } + if err := m.ExtendedResourceClaimStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -73489,6 +75360,42 @@ func (m *VolumeProjection) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodCertificate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PodCertificate == nil { + m.PodCertificate = &PodCertificateProjection{} + } + if err := m.PodCertificate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 9b48fb1c39..fb26953147 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -737,8 +737,8 @@ message Container { repeated ContainerPort ports = 6; // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -768,10 +768,10 @@ message Container { repeated ContainerResizePolicy resizePolicy = 23; // RestartPolicy defines the restart behavior of individual containers in a pod. - // This field may only be set for init containers, and the only allowed value is "Always". - // For non-init containers or when this field is not specified, + // This overrides the pod-level restart policy. When this field is not specified, // the restart behavior is defined by the Pod's restart policy and the container type. - // Setting the RestartPolicy as "Always" for the init container will have the following effect: + // Additionally, setting the RestartPolicy as "Always" for the init container will + // have the following effect: // this init container will be continually restarted on // exit until all regular containers have terminated. Once all regular // containers have completed, all init containers with restartPolicy "Always" @@ -786,6 +786,22 @@ message Container { // +optional optional string restartPolicy = 24; + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. The rules are evaluated in + // order. Once a rule matches a container exit condition, the remaining + // rules are ignored. If no rule matches the container exit condition, + // the Container-level restart policy determines the whether the container + // is restarted or not. Constraints on the rules: + // - At most 20 rules are allowed. + // - Rules can have the same action. + // - Identical rules are not forbidden in validations. + // When rules are specified, container MUST set RestartPolicy explicitly + // even it if matches the Pod's RestartPolicy. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + repeated ContainerRestartRule restartPolicyRules = 25; + // Pod volumes to mount into the container's filesystem. // Cannot be updated. // +optional @@ -888,6 +904,19 @@ message Container { optional bool tty = 18; } +// ContainerExtendedResourceRequest has the mapping of container name, +// extended resource name to the device request name. +message ContainerExtendedResourceRequest { + // The name of the container requesting resources. + optional string containerName = 1; + + // The name of the extended resource in that container which gets backed by DRA. + optional string resourceName = 2; + + // The name of the request in the special ResourceClaim which corresponds to the extended resource. + optional string requestName = 3; +} + // Describe a container image message ContainerImage { // Names by which this image is known. @@ -942,6 +971,39 @@ message ContainerResizePolicy { optional string restartPolicy = 2; } +// ContainerRestartRule describes how a container exit is handled. +message ContainerRestartRule { + // Specifies the action taken on a container exit if the requirements + // are satisfied. The only possible value is "Restart" to restart the + // container. + // +required + optional string action = 1; + + // Represents the exit codes to check on container exits. + // +optional + // +oneOf=when + optional ContainerRestartRuleOnExitCodes exitCodes = 2; +} + +// ContainerRestartRuleOnExitCodes describes the condition +// for handling an exited container based on its exit codes. +message ContainerRestartRuleOnExitCodes { + // Represents the relationship between the container exit code(s) and the + // specified values. Possible values are: + // - In: the requirement is satisfied if the container exit code is in the + // set of specified values. + // - NotIn: the requirement is satisfied if the container exit code is + // not in the set of specified values. + // +required + optional string operator = 1; + + // Specifies the set of values to check for container exit codes. + // At most 255 elements are allowed. + // +optional + // +listType=set + repeated int32 values = 2; +} + // ContainerState holds a possible state of container. // Only one of its members may be specified. // If none of them is specified, the default one is ContainerStateWaiting. @@ -1344,7 +1406,8 @@ message EndpointsList { // EnvFromSource represents the source of a set of ConfigMaps or Secrets message EnvFromSource { - // Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + // Optional text to prepend to the name of each environment variable. + // May consist of any printable ASCII characters except '='. // +optional optional string prefix = 1; @@ -1359,7 +1422,8 @@ message EnvFromSource { // EnvVar represents an environment variable present in a Container. message EnvVar { - // Name of the environment variable. Must be a C_IDENTIFIER. + // Name of the environment variable. + // May consist of any printable ASCII characters except '='. optional string name = 1; // Variable references $(VAR_NAME) are expanded @@ -1398,6 +1462,13 @@ message EnvVarSource { // Selects a key of a secret in the pod's namespace // +optional optional SecretKeySelector secretKeyRef = 4; + + // FileKeyRef selects a key of the env file. + // Requires the EnvFiles feature gate to be enabled. + // + // +featureGate=EnvFiles + // +optional + optional FileKeySelector fileKeyRef = 5; } // An EphemeralContainer is a temporary container that you may add to an existing Pod for @@ -1479,8 +1550,8 @@ message EphemeralContainerCommon { repeated ContainerPort ports = 6; // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -1510,12 +1581,19 @@ message EphemeralContainerCommon { // Restart policy for the container to manage the restart behavior of each // container within a pod. - // This may only be set for init containers. You cannot set this field on - // ephemeral containers. + // You cannot set this field on ephemeral containers. // +featureGate=SidecarContainers // +optional optional string restartPolicy = 24; + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. You cannot set this field on + // ephemeral containers. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + repeated ContainerRestartRule restartPolicyRules = 25; + // Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. // Cannot be updated. // +optional @@ -1776,6 +1854,36 @@ message FCVolumeSource { repeated string wwids = 5; } +// FileKeySelector selects a key of the env file. +// +structType=atomic +message FileKeySelector { + // The name of the volume mount containing the env file. + // +required + optional string volumeName = 1; + + // The path within the volume from which to select the file. + // Must be relative and may not contain the '..' path or start with '..'. + // +required + optional string path = 2; + + // The key within the env file. An invalid key will prevent the pod from starting. + // The keys defined within a source may consist of any printable ASCII characters except '='. + // During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + // +required + optional string key = 3; + + // Specify whether the file or its key must be defined. If the file or key + // does not exist, then the env var is not published. + // If optional is set to true and the specified key does not exist, + // the environment variable will not be set in the Pod's containers. + // + // If optional is set to false and the specified key does not exist, + // an error will be returned during Pod creation. + // +optional + // +default=false + optional bool optional = 4; +} + // FlexPersistentVolumeSource represents a generic persistent volume resource that is // provisioned/attached using an exec based plugin. message FlexPersistentVolumeSource { @@ -1949,7 +2057,6 @@ message GlusterfsPersistentVolumeSource { // Glusterfs volumes do not support ownership management or SELinux relabeling. message GlusterfsVolumeSource { // endpoints is the endpoint name that details Glusterfs topology. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod optional string endpoints = 1; // path is the Glusterfs volume path. @@ -3160,15 +3267,13 @@ message PersistentVolumeClaimSpec { // volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. // If specified, the CSI driver will create or update the volume with the attributes defined // in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - // it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - // will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - // If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - // will be set by the persistentvolume controller if it exists. + // it can be changed after the claim is created. An empty string or nil value indicates that no + // VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + // this field can be reset to its previous value (including nil) to cancel the modification. // If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be // set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource // exists. // More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - // (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). // +featureGate=VolumeAttributesClass // +optional optional string volumeAttributesClassName = 9; @@ -3267,14 +3372,12 @@ message PersistentVolumeClaimStatus { // currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. // When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional optional string currentVolumeAttributesClassName = 8; // ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. // When this is unset, there is no ModifyVolume operation being attempted. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional optional ModifyVolumeStatus modifyVolumeStatus = 9; @@ -3515,7 +3618,6 @@ message PersistentVolumeSpec { // after a volume has been updated successfully to a new class. // For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound // PersistentVolumeClaims during the binding process. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional optional string volumeAttributesClassName = 10; @@ -3684,8 +3786,8 @@ message PodAntiAffinity { // most preferred is the one with the greatest sum of weights, i.e. // for each node that meets all of the scheduling requirements (resource // request, requiredDuringScheduling anti-affinity expressions, etc.), - // compute a sum by iterating through the elements of this field and adding - // "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + // compute a sum by iterating through the elements of this field and subtracting + // "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the // node(s) with the highest sum are the most preferred. // +optional // +listType=atomic @@ -3725,6 +3827,79 @@ message PodAttachOptions { optional string container = 5; } +// PodCertificateProjection provides a private key and X.509 certificate in the +// pod filesystem. +message PodCertificateProjection { + // Kubelet's generated CSRs will be addressed to this signer. + // + // +required + optional string signerName = 1; + + // The type of keypair Kubelet will generate for the pod. + // + // Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + // "ECDSAP521", and "ED25519". + // + // +required + optional string keyType = 2; + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // Kubelet copies this value verbatim into the PodCertificateRequests it + // generates for this projection. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + optional int32 maxExpirationSeconds = 3; + + // Write the credential bundle at this path in the projected volume. + // + // The credential bundle is a single file that contains multiple PEM blocks. + // The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + // key. + // + // The remaining blocks are CERTIFICATE blocks, containing the issued + // certificate chain from the signer (leaf and any intermediates). + // + // Using credentialBundlePath lets your Pod's application code make a single + // atomic read that retrieves a consistent key and certificate chain. If you + // project them to separate files, your application code will need to + // additionally check that the leaf certificate was issued to the key. + // + // +optional + optional string credentialBundlePath = 4; + + // Write the key at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + optional string keyPath = 5; + + // Write the certificate chain at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + optional string certificateChainPath = 6; +} + // PodCondition contains details for the current condition of this pod. message PodCondition { // Type is the type of the condition. @@ -3829,6 +4004,20 @@ message PodExecOptions { repeated string command = 6; } +// PodExtendedResourceClaimStatus is stored in the PodStatus for the extended +// resource requests backed by DRA. It stores the generated name for +// the corresponding special ResourceClaim created by the scheduler. +message PodExtendedResourceClaimStatus { + // RequestMappings identifies the mapping of to device request + // in the generated ResourceClaim. + // +listType=atomic + repeated ContainerExtendedResourceRequest requestMappings = 1; + + // ResourceClaimName is the name of the ResourceClaim that was + // generated for the Pod in the namespace of the Pod. + optional string resourceClaimName = 2; +} + // PodIP represents a single IP address allocated to the pod. message PodIP { // IP is the IP address assigned to the pod @@ -4269,7 +4458,9 @@ message PodSpec { optional string nodeName = 10; // Host networking requested for this pod. Use the host's network namespace. - // If this option is set, the ports that will be used must be specified. + // When using HostNetwork you should specify ports so the scheduler is aware. + // When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + // and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. // Default to false. // +k8s:conversion-gen=false // +optional @@ -4434,6 +4625,7 @@ message PodSpec { // - spec.hostPID // - spec.hostIPC // - spec.hostUsers + // - spec.resources // - spec.securityContext.appArmorProfile // - spec.securityContext.seLinuxOptions // - spec.securityContext.seccompProfile @@ -4504,7 +4696,7 @@ message PodSpec { // Resources is the total amount of CPU and Memory resources required by all // containers in the pod. It supports specifying Requests and Limits for - // "cpu" and "memory" resource names only. ResourceClaims are not supported. + // "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. // // This field enables fine-grained control over resource allocation for the // entire pod, allowing resource sharing among containers in a pod. @@ -4516,6 +4708,21 @@ message PodSpec { // +featureGate=PodLevelResources // +optional optional ResourceRequirements resources = 40; + + // HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + // This field only specifies the pod's hostname and does not affect its DNS records. + // When this field is set to a non-empty string: + // - It takes precedence over the values set in `hostname` and `subdomain`. + // - The Pod's hostname will be set to this value. + // - `setHostnameAsFQDN` must be nil or set to false. + // - `hostNetwork` must be set to false. + // + // This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + // Requires the HostnameOverride feature gate to be enabled. + // + // +featureGate=HostnameOverride + // +optional + optional string hostnameOverride = 41; } // PodStatus represents information about the status of a pod. Status may trail the actual @@ -4674,6 +4881,11 @@ message PodStatus { // +featureGate=DynamicResourceAllocation // +optional repeated PodResourceClaimStatus resourceClaimStatuses = 15; + + // Status of extended resource claim backed by DRA. + // +featureGate=DRAExtendedResource + // +optional + optional PodExtendedResourceClaimStatus extendedResourceClaimStatus = 18; } // PodStatusResult is a wrapper for PodStatus returned by kubelet that can be encode/decoded @@ -5298,7 +5510,7 @@ message ResourceRequirements { // Claims lists the names of resources, defined in spec.resourceClaims, // that are used by this container. // - // This is an alpha field and requires enabling the + // This field depends on the // DynamicResourceAllocation feature gate. // // This field is immutable. It can only be set for containers. @@ -6301,7 +6513,6 @@ message Taint { optional string effect = 3; // TimeAdded represents the time at which the taint was added. - // It is only written for NoExecute taints. // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time timeAdded = 4; } @@ -6682,6 +6893,44 @@ message VolumeProjection { // +featureGate=ClusterTrustBundleProjection // +optional optional ClusterTrustBundleProjection clusterTrustBundle = 5; + + // Projects an auto-rotating credential bundle (private key and certificate + // chain) that the pod can use either as a TLS client or server. + // + // Kubelet generates a private key and uses it to send a + // PodCertificateRequest to the named signer. Once the signer approves the + // request and issues a certificate chain, Kubelet writes the key and + // certificate chain to the pod filesystem. The pod does not start until + // certificates have been issued for each podCertificate projected volume + // source in its spec. + // + // Kubelet will begin trying to rotate the certificate at the time indicated + // by the signer using the PodCertificateRequest.Status.BeginRefreshAt + // timestamp. + // + // Kubelet can write a single file, indicated by the credentialBundlePath + // field, or separate files, indicated by the keyPath and + // certificateChainPath fields. + // + // The credential bundle is a single file in PEM format. The first PEM + // entry is the private key (in PKCS#8 format), and the remaining PEM + // entries are the certificate chain issued by the signer (typically, + // signers will return their certificate chain in leaf-to-root order). + // + // Prefer using the credential bundle format, since your application code + // can read it atomically. If you use keyPath and certificateChainPath, + // your application must make two separate file reads. If these coincide + // with a certificate rotation, it is possible that the private key and leaf + // certificate you read may not correspond to each other. Your application + // will need to check for this condition, and re-read until they are + // consistent. + // + // The named signer controls chooses the format of the certificate it + // issues; consult the signer implementation's documentation to learn how to + // use the certificates it issues. + // + // +featureGate=PodCertificateProjection +optional + optional PodCertificateProjection podCertificate = 6; } // VolumeResourceRequirements describes the storage resource requirements for a volume. @@ -6753,13 +7002,12 @@ message VolumeSource { // iscsi represents an ISCSI Disk resource that is attached to a // kubelet's host machine and then exposed to the pod. - // More info: https://examples.k8s.io/volumes/iscsi/README.md + // More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi // +optional optional ISCSIVolumeSource iscsi = 8; // glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. // Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md // +optional optional GlusterfsVolumeSource glusterfs = 9; @@ -6771,7 +7019,6 @@ message VolumeSource { // rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. // Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - // More info: https://examples.k8s.io/volumes/rbd/README.md // +optional optional RBDVolumeSource rbd = 11; diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index f7641e485a..08b6d351cc 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -91,12 +91,11 @@ type VolumeSource struct { NFS *NFSVolumeSource `json:"nfs,omitempty" protobuf:"bytes,7,opt,name=nfs"` // iscsi represents an ISCSI Disk resource that is attached to a // kubelet's host machine and then exposed to the pod. - // More info: https://examples.k8s.io/volumes/iscsi/README.md + // More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi // +optional ISCSI *ISCSIVolumeSource `json:"iscsi,omitempty" protobuf:"bytes,8,opt,name=iscsi"` // glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. // Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md // +optional Glusterfs *GlusterfsVolumeSource `json:"glusterfs,omitempty" protobuf:"bytes,9,opt,name=glusterfs"` // persistentVolumeClaimVolumeSource represents a reference to a @@ -106,7 +105,6 @@ type VolumeSource struct { PersistentVolumeClaim *PersistentVolumeClaimVolumeSource `json:"persistentVolumeClaim,omitempty" protobuf:"bytes,10,opt,name=persistentVolumeClaim"` // rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. // Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - // More info: https://examples.k8s.io/volumes/rbd/README.md // +optional RBD *RBDVolumeSource `json:"rbd,omitempty" protobuf:"bytes,11,opt,name=rbd"` // flexVolume represents a generic volume resource that is @@ -437,7 +435,6 @@ type PersistentVolumeSpec struct { // after a volume has been updated successfully to a new class. // For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound // PersistentVolumeClaims during the binding process. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty" protobuf:"bytes,10,opt,name=volumeAttributesClassName"` @@ -616,15 +613,13 @@ type PersistentVolumeClaimSpec struct { // volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. // If specified, the CSI driver will create or update the volume with the attributes defined // in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - // it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - // will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - // If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - // will be set by the persistentvolume controller if it exists. + // it can be changed after the claim is created. An empty string or nil value indicates that no + // VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + // this field can be reset to its previous value (including nil) to cancel the modification. // If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be // set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource // exists. // More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - // (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). // +featureGate=VolumeAttributesClass // +optional VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty" protobuf:"bytes,9,opt,name=volumeAttributesClassName"` @@ -851,13 +846,11 @@ type PersistentVolumeClaimStatus struct { AllocatedResourceStatuses map[ResourceName]ClaimResourceStatus `json:"allocatedResourceStatuses,omitempty" protobuf:"bytes,7,rep,name=allocatedResourceStatuses"` // currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. // When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional CurrentVolumeAttributesClassName *string `json:"currentVolumeAttributesClassName,omitempty" protobuf:"bytes,8,opt,name=currentVolumeAttributesClassName"` // ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. // When this is unset, there is no ModifyVolume operation being attempted. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional ModifyVolumeStatus *ModifyVolumeStatus `json:"modifyVolumeStatus,omitempty" protobuf:"bytes,9,opt,name=modifyVolumeStatus"` @@ -972,7 +965,6 @@ type EmptyDirVolumeSource struct { // Glusterfs volumes do not support ownership management or SELinux relabeling. type GlusterfsVolumeSource struct { // endpoints is the endpoint name that details Glusterfs topology. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod EndpointsName string `json:"endpoints" protobuf:"bytes,1,opt,name=endpoints"` // path is the Glusterfs volume path. @@ -1993,6 +1985,79 @@ type ClusterTrustBundleProjection struct { Path string `json:"path" protobuf:"bytes,4,rep,name=path"` } +// PodCertificateProjection provides a private key and X.509 certificate in the +// pod filesystem. +type PodCertificateProjection struct { + // Kubelet's generated CSRs will be addressed to this signer. + // + // +required + SignerName string `json:"signerName,omitempty" protobuf:"bytes,1,rep,name=signerName"` + + // The type of keypair Kubelet will generate for the pod. + // + // Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + // "ECDSAP521", and "ED25519". + // + // +required + KeyType string `json:"keyType,omitempty" protobuf:"bytes,2,rep,name=keyType"` + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // Kubelet copies this value verbatim into the PodCertificateRequests it + // generates for this projection. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + MaxExpirationSeconds *int32 `json:"maxExpirationSeconds,omitempty" protobuf:"varint,3,opt,name=maxExpirationSeconds"` + + // Write the credential bundle at this path in the projected volume. + // + // The credential bundle is a single file that contains multiple PEM blocks. + // The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + // key. + // + // The remaining blocks are CERTIFICATE blocks, containing the issued + // certificate chain from the signer (leaf and any intermediates). + // + // Using credentialBundlePath lets your Pod's application code make a single + // atomic read that retrieves a consistent key and certificate chain. If you + // project them to separate files, your application code will need to + // additionally check that the leaf certificate was issued to the key. + // + // +optional + CredentialBundlePath string `json:"credentialBundlePath,omitempty" protobuf:"bytes,4,rep,name=credentialBundlePath"` + + // Write the key at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + KeyPath string `json:"keyPath,omitempty" protobuf:"bytes,5,rep,name=keyPath"` + + // Write the certificate chain at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + CertificateChainPath string `json:"certificateChainPath,omitempty" protobuf:"bytes,6,rep,name=certificateChainPath"` +} + // Represents a projected volume source type ProjectedVolumeSource struct { // sources is the list of volume projections. Each entry in this list @@ -2043,6 +2108,44 @@ type VolumeProjection struct { // +featureGate=ClusterTrustBundleProjection // +optional ClusterTrustBundle *ClusterTrustBundleProjection `json:"clusterTrustBundle,omitempty" protobuf:"bytes,5,opt,name=clusterTrustBundle"` + + // Projects an auto-rotating credential bundle (private key and certificate + // chain) that the pod can use either as a TLS client or server. + // + // Kubelet generates a private key and uses it to send a + // PodCertificateRequest to the named signer. Once the signer approves the + // request and issues a certificate chain, Kubelet writes the key and + // certificate chain to the pod filesystem. The pod does not start until + // certificates have been issued for each podCertificate projected volume + // source in its spec. + // + // Kubelet will begin trying to rotate the certificate at the time indicated + // by the signer using the PodCertificateRequest.Status.BeginRefreshAt + // timestamp. + // + // Kubelet can write a single file, indicated by the credentialBundlePath + // field, or separate files, indicated by the keyPath and + // certificateChainPath fields. + // + // The credential bundle is a single file in PEM format. The first PEM + // entry is the private key (in PKCS#8 format), and the remaining PEM + // entries are the certificate chain issued by the signer (typically, + // signers will return their certificate chain in leaf-to-root order). + // + // Prefer using the credential bundle format, since your application code + // can read it atomically. If you use keyPath and certificateChainPath, + // your application must make two separate file reads. If these coincide + // with a certificate rotation, it is possible that the private key and leaf + // certificate you read may not correspond to each other. Your application + // will need to check for this condition, and re-read until they are + // consistent. + // + // The named signer controls chooses the format of the certificate it + // issues; consult the signer implementation's documentation to learn how to + // use the certificates it issues. + // + // +featureGate=PodCertificateProjection +optional + PodCertificate *PodCertificateProjection `json:"podCertificate,omitempty" protobuf:"bytes,6,opt,name=podCertificate"` } const ( @@ -2351,7 +2454,8 @@ type VolumeDevice struct { // EnvVar represents an environment variable present in a Container. type EnvVar struct { - // Name of the environment variable. Must be a C_IDENTIFIER. + // Name of the environment variable. + // May consist of any printable ASCII characters except '='. Name string `json:"name" protobuf:"bytes,1,opt,name=name"` // Optional: no more than one of the following may be specified. @@ -2388,6 +2492,39 @@ type EnvVarSource struct { // Selects a key of a secret in the pod's namespace // +optional SecretKeyRef *SecretKeySelector `json:"secretKeyRef,omitempty" protobuf:"bytes,4,opt,name=secretKeyRef"` + // FileKeyRef selects a key of the env file. + // Requires the EnvFiles feature gate to be enabled. + // + // +featureGate=EnvFiles + // +optional + FileKeyRef *FileKeySelector `json:"fileKeyRef,omitempty" protobuf:"bytes,5,opt,name=fileKeyRef"` +} + +// FileKeySelector selects a key of the env file. +// +structType=atomic +type FileKeySelector struct { + // The name of the volume mount containing the env file. + // +required + VolumeName string `json:"volumeName" protobuf:"bytes,1,opt,name=volumeName"` + // The path within the volume from which to select the file. + // Must be relative and may not contain the '..' path or start with '..'. + // +required + Path string `json:"path" protobuf:"bytes,2,opt,name=path"` + // The key within the env file. An invalid key will prevent the pod from starting. + // The keys defined within a source may consist of any printable ASCII characters except '='. + // During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + // +required + Key string `json:"key" protobuf:"bytes,3,opt,name=key"` + // Specify whether the file or its key must be defined. If the file or key + // does not exist, then the env var is not published. + // If optional is set to true and the specified key does not exist, + // the environment variable will not be set in the Pod's containers. + // + // If optional is set to false and the specified key does not exist, + // an error will be returned during Pod creation. + // +optional + // +default=false + Optional *bool `json:"optional,omitempty" protobuf:"varint,4,opt,name=optional"` } // ObjectFieldSelector selects an APIVersioned field of an object. @@ -2439,7 +2576,8 @@ type SecretKeySelector struct { // EnvFromSource represents the source of a set of ConfigMaps or Secrets type EnvFromSource struct { - // Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + // Optional text to prepend to the name of each environment variable. + // May consist of any printable ASCII characters except '='. // +optional Prefix string `json:"prefix,omitempty" protobuf:"bytes,1,opt,name=prefix"` // The ConfigMap to select from @@ -2697,7 +2835,7 @@ type ResourceRequirements struct { // Claims lists the names of resources, defined in spec.resourceClaims, // that are used by this container. // - // This is an alpha field and requires enabling the + // This field depends on the // DynamicResourceAllocation feature gate. // // This field is immutable. It can only be set for containers. @@ -2805,8 +2943,8 @@ type Container struct { // +listMapKey=protocol Ports []ContainerPort `json:"ports,omitempty" patchStrategy:"merge" patchMergeKey:"containerPort" protobuf:"bytes,6,rep,name=ports"` // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -2832,10 +2970,10 @@ type Container struct { // +listType=atomic ResizePolicy []ContainerResizePolicy `json:"resizePolicy,omitempty" protobuf:"bytes,23,rep,name=resizePolicy"` // RestartPolicy defines the restart behavior of individual containers in a pod. - // This field may only be set for init containers, and the only allowed value is "Always". - // For non-init containers or when this field is not specified, + // This overrides the pod-level restart policy. When this field is not specified, // the restart behavior is defined by the Pod's restart policy and the container type. - // Setting the RestartPolicy as "Always" for the init container will have the following effect: + // Additionally, setting the RestartPolicy as "Always" for the init container will + // have the following effect: // this init container will be continually restarted on // exit until all regular containers have terminated. Once all regular // containers have completed, all init containers with restartPolicy "Always" @@ -2849,6 +2987,21 @@ type Container struct { // +featureGate=SidecarContainers // +optional RestartPolicy *ContainerRestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,24,opt,name=restartPolicy,casttype=ContainerRestartPolicy"` + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. The rules are evaluated in + // order. Once a rule matches a container exit condition, the remaining + // rules are ignored. If no rule matches the container exit condition, + // the Container-level restart policy determines the whether the container + // is restarted or not. Constraints on the rules: + // - At most 20 rules are allowed. + // - Rules can have the same action. + // - Identical rules are not forbidden in validations. + // When rules are specified, container MUST set RestartPolicy explicitly + // even it if matches the Pod's RestartPolicy. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + RestartPolicyRules []ContainerRestartRule `json:"restartPolicyRules,omitempty" protobuf:"bytes,25,rep,name=restartPolicyRules"` // Pod volumes to mount into the container's filesystem. // Cannot be updated. // +optional @@ -3478,11 +3631,64 @@ const ( ) // ContainerRestartPolicy is the restart policy for a single container. -// This may only be set for init containers and only allowed value is "Always". +// The only allowed values are "Always", "Never", and "OnFailure". type ContainerRestartPolicy string const ( - ContainerRestartPolicyAlways ContainerRestartPolicy = "Always" + ContainerRestartPolicyAlways ContainerRestartPolicy = "Always" + ContainerRestartPolicyNever ContainerRestartPolicy = "Never" + ContainerRestartPolicyOnFailure ContainerRestartPolicy = "OnFailure" +) + +// ContainerRestartRule describes how a container exit is handled. +type ContainerRestartRule struct { + // Specifies the action taken on a container exit if the requirements + // are satisfied. The only possible value is "Restart" to restart the + // container. + // +required + Action ContainerRestartRuleAction `json:"action,omitempty" proto:"bytes,1,opt,name=action" protobuf:"bytes,1,opt,name=action,casttype=ContainerRestartRuleAction"` + + // Represents the exit codes to check on container exits. + // +optional + // +oneOf=when + ExitCodes *ContainerRestartRuleOnExitCodes `json:"exitCodes,omitempty" proto:"bytes,2,opt,name=exitCodes" protobuf:"bytes,2,opt,name=exitCodes"` +} + +// ContainerRestartRuleAction describes the action to take when the +// container exits. +type ContainerRestartRuleAction string + +// The only valid action is Restart. +const ( + ContainerRestartRuleActionRestart ContainerRestartRuleAction = "Restart" +) + +// ContainerRestartRuleOnExitCodes describes the condition +// for handling an exited container based on its exit codes. +type ContainerRestartRuleOnExitCodes struct { + // Represents the relationship between the container exit code(s) and the + // specified values. Possible values are: + // - In: the requirement is satisfied if the container exit code is in the + // set of specified values. + // - NotIn: the requirement is satisfied if the container exit code is + // not in the set of specified values. + // +required + Operator ContainerRestartRuleOnExitCodesOperator `json:"operator,omitempty" proto:"bytes,1,opt,name=operator" protobuf:"bytes,1,opt,name=operator,casttype=ContainerRestartRuleOnExitCodesOperator"` + + // Specifies the set of values to check for container exit codes. + // At most 255 elements are allowed. + // +optional + // +listType=set + Values []int32 `json:"values,omitempty" proto:"varint,2,rep,name=values" protobuf:"varint,2,rep,name=values"` +} + +// ContainerRestartRuleOnExitCodesOperator describes the operator +// to take for the exit codes. +type ContainerRestartRuleOnExitCodesOperator string + +const ( + ContainerRestartRuleOnExitCodesOpIn ContainerRestartRuleOnExitCodesOperator = "In" + ContainerRestartRuleOnExitCodesOpNotIn ContainerRestartRuleOnExitCodesOperator = "NotIn" ) // DNSPolicy defines how a pod's DNS will be configured. @@ -3678,8 +3884,8 @@ type PodAntiAffinity struct { // most preferred is the one with the greatest sum of weights, i.e. // for each node that meets all of the scheduling requirements (resource // request, requiredDuringScheduling anti-affinity expressions, etc.), - // compute a sum by iterating through the elements of this field and adding - // "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + // compute a sum by iterating through the elements of this field and subtracting + // "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the // node(s) with the highest sum are the most preferred. // +optional // +listType=atomic @@ -3806,7 +4012,6 @@ type Taint struct { // Valid effects are NoSchedule, PreferNoSchedule and NoExecute. Effect TaintEffect `json:"effect" protobuf:"bytes,3,opt,name=effect,casttype=TaintEffect"` // TimeAdded represents the time at which the taint was added. - // It is only written for NoExecute taints. // +optional TimeAdded *metav1.Time `json:"timeAdded,omitempty" protobuf:"bytes,4,opt,name=timeAdded"` } @@ -3983,7 +4188,9 @@ type PodSpec struct { // +optional NodeName string `json:"nodeName,omitempty" protobuf:"bytes,10,opt,name=nodeName"` // Host networking requested for this pod. Use the host's network namespace. - // If this option is set, the ports that will be used must be specified. + // When using HostNetwork you should specify ports so the scheduler is aware. + // When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + // and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. // Default to false. // +k8s:conversion-gen=false // +optional @@ -4126,6 +4333,7 @@ type PodSpec struct { // - spec.hostPID // - spec.hostIPC // - spec.hostUsers + // - spec.resources // - spec.securityContext.appArmorProfile // - spec.securityContext.seLinuxOptions // - spec.securityContext.seccompProfile @@ -4194,7 +4402,7 @@ type PodSpec struct { ResourceClaims []PodResourceClaim `json:"resourceClaims,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name" protobuf:"bytes,39,rep,name=resourceClaims"` // Resources is the total amount of CPU and Memory resources required by all // containers in the pod. It supports specifying Requests and Limits for - // "cpu" and "memory" resource names only. ResourceClaims are not supported. + // "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. // // This field enables fine-grained control over resource allocation for the // entire pod, allowing resource sharing among containers in a pod. @@ -4206,6 +4414,20 @@ type PodSpec struct { // +featureGate=PodLevelResources // +optional Resources *ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,40,opt,name=resources"` + // HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + // This field only specifies the pod's hostname and does not affect its DNS records. + // When this field is set to a non-empty string: + // - It takes precedence over the values set in `hostname` and `subdomain`. + // - The Pod's hostname will be set to this value. + // - `setHostnameAsFQDN` must be nil or set to false. + // - `hostNetwork` must be set to false. + // + // This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + // Requires the HostnameOverride feature gate to be enabled. + // + // +featureGate=HostnameOverride + // +optional + HostnameOverride *string `json:"hostnameOverride,omitempty" protobuf:"bytes,41,opt,name=hostnameOverride"` } // PodResourceClaim references exactly one ResourceClaim, either directly @@ -4267,6 +4489,31 @@ type PodResourceClaimStatus struct { ResourceClaimName *string `json:"resourceClaimName,omitempty" protobuf:"bytes,2,opt,name=resourceClaimName"` } +// PodExtendedResourceClaimStatus is stored in the PodStatus for the extended +// resource requests backed by DRA. It stores the generated name for +// the corresponding special ResourceClaim created by the scheduler. +type PodExtendedResourceClaimStatus struct { + // RequestMappings identifies the mapping of to device request + // in the generated ResourceClaim. + // +listType=atomic + RequestMappings []ContainerExtendedResourceRequest `json:"requestMappings" protobuf:"bytes,1,rep,name=requestMappings"` + + // ResourceClaimName is the name of the ResourceClaim that was + // generated for the Pod in the namespace of the Pod. + ResourceClaimName string `json:"resourceClaimName" protobuf:"bytes,2,name=resourceClaimName"` +} + +// ContainerExtendedResourceRequest has the mapping of container name, +// extended resource name to the device request name. +type ContainerExtendedResourceRequest struct { + // The name of the container requesting resources. + ContainerName string `json:"containerName" protobuf:"bytes,1,name=containerName"` + // The name of the extended resource in that container which gets backed by DRA. + ResourceName string `json:"resourceName" protobuf:"bytes,2,name=resourceName"` + // The name of the request in the special ResourceClaim which corresponds to the extended resource. + RequestName string `json:"requestName" protobuf:"bytes,3,name=requestName"` +} + // OSName is the set of OS'es that can be used in OS. type OSName string @@ -4799,8 +5046,8 @@ type EphemeralContainerCommon struct { // +listMapKey=protocol Ports []ContainerPort `json:"ports,omitempty" patchStrategy:"merge" patchMergeKey:"containerPort" protobuf:"bytes,6,rep,name=ports"` // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -4826,11 +5073,17 @@ type EphemeralContainerCommon struct { ResizePolicy []ContainerResizePolicy `json:"resizePolicy,omitempty" protobuf:"bytes,23,rep,name=resizePolicy"` // Restart policy for the container to manage the restart behavior of each // container within a pod. - // This may only be set for init containers. You cannot set this field on - // ephemeral containers. + // You cannot set this field on ephemeral containers. // +featureGate=SidecarContainers // +optional RestartPolicy *ContainerRestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,24,opt,name=restartPolicy,casttype=ContainerRestartPolicy"` + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. You cannot set this field on + // ephemeral containers. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + RestartPolicyRules []ContainerRestartRule `json:"restartPolicyRules,omitempty" protobuf:"bytes,25,rep,name=restartPolicyRules"` // Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. // Cannot be updated. // +optional @@ -5091,6 +5344,10 @@ type PodStatus struct { // +featureGate=DynamicResourceAllocation // +optional ResourceClaimStatuses []PodResourceClaimStatus `json:"resourceClaimStatuses,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name" protobuf:"bytes,15,rep,name=resourceClaimStatuses"` + // Status of extended resource claim backed by DRA. + // +featureGate=DRAExtendedResource + // +optional + ExtendedResourceClaimStatus *PodExtendedResourceClaimStatus `json:"extendedResourceClaimStatus,omitempty" protobuf:"bytes,18,opt,name=extendedResourceClaimStatus"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -5311,6 +5568,7 @@ type ReplicationControllerCondition struct { // +genclient:method=UpdateScale,verb=update,subresource=scale,input=k8s.io/api/autoscaling/v1.Scale,result=k8s.io/api/autoscaling/v1.Scale // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.0 +// +k8s:supportsSubresource=/scale // ReplicationController represents the configuration of a replication controller. type ReplicationController struct { diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 9e987eefdd..1204307667 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -356,11 +356,12 @@ var map_Container = map[string]string{ "args": "Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", "workingDir": "Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.", "ports": "List of ports to expose from the container. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Modifying this array with strategic merge patch may corrupt the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. Cannot be updated.", - "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "resizePolicy": "Resources resize policy for the container.", - "restartPolicy": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "restartPolicy": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "restartPolicyRules": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", "volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container.", "livenessProbe": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", @@ -380,6 +381,17 @@ func (Container) SwaggerDoc() map[string]string { return map_Container } +var map_ContainerExtendedResourceRequest = map[string]string{ + "": "ContainerExtendedResourceRequest has the mapping of container name, extended resource name to the device request name.", + "containerName": "The name of the container requesting resources.", + "resourceName": "The name of the extended resource in that container which gets backed by DRA.", + "requestName": "The name of the request in the special ResourceClaim which corresponds to the extended resource.", +} + +func (ContainerExtendedResourceRequest) SwaggerDoc() map[string]string { + return map_ContainerExtendedResourceRequest +} + var map_ContainerImage = map[string]string{ "": "Describe a container image", "names": "Names by which this image is known. e.g. [\"kubernetes.example/hyperkube:v1.0.7\", \"cloud-vendor.registry.example/cloud-vendor/hyperkube:v1.0.7\"]", @@ -413,6 +425,26 @@ func (ContainerResizePolicy) SwaggerDoc() map[string]string { return map_ContainerResizePolicy } +var map_ContainerRestartRule = map[string]string{ + "": "ContainerRestartRule describes how a container exit is handled.", + "action": "Specifies the action taken on a container exit if the requirements are satisfied. The only possible value is \"Restart\" to restart the container.", + "exitCodes": "Represents the exit codes to check on container exits.", +} + +func (ContainerRestartRule) SwaggerDoc() map[string]string { + return map_ContainerRestartRule +} + +var map_ContainerRestartRuleOnExitCodes = map[string]string{ + "": "ContainerRestartRuleOnExitCodes describes the condition for handling an exited container based on its exit codes.", + "operator": "Represents the relationship between the container exit code(s) and the specified values. Possible values are: - In: the requirement is satisfied if the container exit code is in the\n set of specified values.\n- NotIn: the requirement is satisfied if the container exit code is\n not in the set of specified values.", + "values": "Specifies the set of values to check for container exit codes. At most 255 elements are allowed.", +} + +func (ContainerRestartRuleOnExitCodes) SwaggerDoc() map[string]string { + return map_ContainerRestartRuleOnExitCodes +} + var map_ContainerState = map[string]string{ "": "ContainerState holds a possible state of container. Only one of its members may be specified. If none of them is specified, the default one is ContainerStateWaiting.", "waiting": "Details about a waiting container", @@ -597,7 +629,7 @@ func (EndpointsList) SwaggerDoc() map[string]string { var map_EnvFromSource = map[string]string{ "": "EnvFromSource represents the source of a set of ConfigMaps or Secrets", - "prefix": "Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER.", + "prefix": "Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.", "configMapRef": "The ConfigMap to select from", "secretRef": "The Secret to select from", } @@ -608,7 +640,7 @@ func (EnvFromSource) SwaggerDoc() map[string]string { var map_EnvVar = map[string]string{ "": "EnvVar represents an environment variable present in a Container.", - "name": "Name of the environment variable. Must be a C_IDENTIFIER.", + "name": "Name of the environment variable. May consist of any printable ASCII characters except '='.", "value": "Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to \"\".", "valueFrom": "Source for the environment variable's value. Cannot be used if value is not empty.", } @@ -623,6 +655,7 @@ var map_EnvVarSource = map[string]string{ "resourceFieldRef": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.", "configMapKeyRef": "Selects a key of a ConfigMap.", "secretKeyRef": "Selects a key of a secret in the pod's namespace", + "fileKeyRef": "FileKeyRef selects a key of the env file. Requires the EnvFiles feature gate to be enabled.", } func (EnvVarSource) SwaggerDoc() map[string]string { @@ -646,11 +679,12 @@ var map_EphemeralContainerCommon = map[string]string{ "args": "Arguments to the entrypoint. The image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", "workingDir": "Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.", "ports": "Ports are not allowed for ephemeral containers.", - "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod.", "resizePolicy": "Resources resize policy for the container.", - "restartPolicy": "Restart policy for the container to manage the restart behavior of each container within a pod. This may only be set for init containers. You cannot set this field on ephemeral containers.", + "restartPolicy": "Restart policy for the container to manage the restart behavior of each container within a pod. You cannot set this field on ephemeral containers.", + "restartPolicyRules": "Represents a list of rules to be checked to determine if the container should be restarted on exit. You cannot set this field on ephemeral containers.", "volumeMounts": "Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container.", "livenessProbe": "Probes are not allowed for ephemeral containers.", @@ -754,6 +788,18 @@ func (FCVolumeSource) SwaggerDoc() map[string]string { return map_FCVolumeSource } +var map_FileKeySelector = map[string]string{ + "": "FileKeySelector selects a key of the env file.", + "volumeName": "The name of the volume mount containing the env file.", + "path": "The path within the volume from which to select the file. Must be relative and may not contain the '..' path or start with '..'.", + "key": "The key within the env file. An invalid key will prevent the pod from starting. The keys defined within a source may consist of any printable ASCII characters except '='. During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.", + "optional": "Specify whether the file or its key must be defined. If the file or key does not exist, then the env var is not published. If optional is set to true and the specified key does not exist, the environment variable will not be set in the Pod's containers.\n\nIf optional is set to false and the specified key does not exist, an error will be returned during Pod creation.", +} + +func (FileKeySelector) SwaggerDoc() map[string]string { + return map_FileKeySelector +} + var map_FlexPersistentVolumeSource = map[string]string{ "": "FlexPersistentVolumeSource represents a generic persistent volume resource that is provisioned/attached using an exec based plugin.", "driver": "driver is the name of the driver to use for this volume.", @@ -837,7 +883,7 @@ func (GlusterfsPersistentVolumeSource) SwaggerDoc() map[string]string { var map_GlusterfsVolumeSource = map[string]string{ "": "Represents a Glusterfs mount that lasts the lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling.", - "endpoints": "endpoints is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "endpoints": "endpoints is the endpoint name that details Glusterfs topology.", "path": "path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", "readOnly": "readOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", } @@ -1446,7 +1492,7 @@ var map_PersistentVolumeClaimSpec = map[string]string{ "volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", "dataSource": "dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.", "dataSourceRef": "dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef\n allows any non-core object, as well as PersistentVolumeClaim objects.\n* While dataSource ignores disallowed values (dropping them), dataSourceRef\n preserves all values, and generates an error if a disallowed value is\n specified.\n* While dataSource only allows local objects, dataSourceRef allows objects\n in any namespaces.\n(Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.", - "volumeAttributesClassName": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default).", + "volumeAttributesClassName": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/", } func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { @@ -1461,8 +1507,8 @@ var map_PersistentVolumeClaimStatus = map[string]string{ "conditions": "conditions is the current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'Resizing'.", "allocatedResources": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nCapacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity.\n\nA controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", "allocatedResourceStatuses": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nClaimResourceStatus can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState set when resize controller starts resizing the volume in control-plane.\n\t- ControllerResizeFailed:\n\t\tState set when resize has failed in resize controller with a terminal error.\n\t- NodeResizePending:\n\t\tState set when resize controller has finished resizing the volume but further resizing of\n\t\tvolume is needed on the node.\n\t- NodeResizeInProgress:\n\t\tState set when kubelet starts resizing the volume.\n\t- NodeResizeFailed:\n\t\tState set when resizing has failed in kubelet with a terminal error. Transient errors don't set\n\t\tNodeResizeFailed.\nFor example: if expanding a PVC for more capacity - this field can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\"\nWhen this field is not set, it means that no resize operation is in progress for the given PVC.\n\nA controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "currentVolumeAttributesClassName": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is a beta field and requires enabling VolumeAttributesClass feature (off by default).", - "modifyVolumeStatus": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is a beta field and requires enabling VolumeAttributesClass feature (off by default).", + "currentVolumeAttributesClassName": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim", + "modifyVolumeStatus": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted.", } func (PersistentVolumeClaimStatus) SwaggerDoc() map[string]string { @@ -1539,7 +1585,7 @@ var map_PersistentVolumeSpec = map[string]string{ "mountOptions": "mountOptions is the list of mount options, e.g. [\"ro\", \"soft\"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options", "volumeMode": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.", "nodeAffinity": "nodeAffinity defines constraints that limit what nodes this volume can be accessed from. This field influences the scheduling of pods that use this volume.", - "volumeAttributesClassName": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is a beta field and requires enabling VolumeAttributesClass feature (off by default).", + "volumeAttributesClassName": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process.", } func (PersistentVolumeSpec) SwaggerDoc() map[string]string { @@ -1606,7 +1652,7 @@ func (PodAffinityTerm) SwaggerDoc() map[string]string { var map_PodAntiAffinity = map[string]string{ "": "Pod anti affinity is a group of inter pod anti affinity scheduling rules.", "requiredDuringSchedulingIgnoredDuringExecution": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", - "preferredDuringSchedulingIgnoredDuringExecution": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", + "preferredDuringSchedulingIgnoredDuringExecution": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting \"weight\" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", } func (PodAntiAffinity) SwaggerDoc() map[string]string { @@ -1626,6 +1672,20 @@ func (PodAttachOptions) SwaggerDoc() map[string]string { return map_PodAttachOptions } +var map_PodCertificateProjection = map[string]string{ + "": "PodCertificateProjection provides a private key and X.509 certificate in the pod filesystem.", + "signerName": "Kubelet's generated CSRs will be addressed to this signer.", + "keyType": "The type of keypair Kubelet will generate for the pod.\n\nValid values are \"RSA3072\", \"RSA4096\", \"ECDSAP256\", \"ECDSAP384\", \"ECDSAP521\", and \"ED25519\".", + "maxExpirationSeconds": "maxExpirationSeconds is the maximum lifetime permitted for the certificate.\n\nKubelet copies this value verbatim into the PodCertificateRequests it generates for this projection.\n\nIf omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver will reject values shorter than 3600 (1 hour). The maximum allowable value is 7862400 (91 days).\n\nThe signer implementation is then free to issue a certificate with any lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 seconds (1 hour). This constraint is enforced by kube-apiserver. `kubernetes.io` signers will never issue certificates with a lifetime longer than 24 hours.", + "credentialBundlePath": "Write the credential bundle at this path in the projected volume.\n\nThe credential bundle is a single file that contains multiple PEM blocks. The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private key.\n\nThe remaining blocks are CERTIFICATE blocks, containing the issued certificate chain from the signer (leaf and any intermediates).\n\nUsing credentialBundlePath lets your Pod's application code make a single atomic read that retrieves a consistent key and certificate chain. If you project them to separate files, your application code will need to additionally check that the leaf certificate was issued to the key.", + "keyPath": "Write the key at this path in the projected volume.\n\nMost applications should use credentialBundlePath. When using keyPath and certificateChainPath, your application needs to check that the key and leaf certificate are consistent, because it is possible to read the files mid-rotation.", + "certificateChainPath": "Write the certificate chain at this path in the projected volume.\n\nMost applications should use credentialBundlePath. When using keyPath and certificateChainPath, your application needs to check that the key and leaf certificate are consistent, because it is possible to read the files mid-rotation.", +} + +func (PodCertificateProjection) SwaggerDoc() map[string]string { + return map_PodCertificateProjection +} + var map_PodCondition = map[string]string{ "": "PodCondition contains details for the current condition of this pod.", "type": "Type is the type of the condition. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", @@ -1676,6 +1736,16 @@ func (PodExecOptions) SwaggerDoc() map[string]string { return map_PodExecOptions } +var map_PodExtendedResourceClaimStatus = map[string]string{ + "": "PodExtendedResourceClaimStatus is stored in the PodStatus for the extended resource requests backed by DRA. It stores the generated name for the corresponding special ResourceClaim created by the scheduler.", + "requestMappings": "RequestMappings identifies the mapping of to device request in the generated ResourceClaim.", + "resourceClaimName": "ResourceClaimName is the name of the ResourceClaim that was generated for the Pod in the namespace of the Pod.", +} + +func (PodExtendedResourceClaimStatus) SwaggerDoc() map[string]string { + return map_PodExtendedResourceClaimStatus +} + var map_PodIP = map[string]string{ "": "PodIP represents a single IP address allocated to the pod.", "ip": "IP is the IP address assigned to the pod", @@ -1824,7 +1894,7 @@ var map_PodSpec = map[string]string{ "serviceAccount": "DeprecatedServiceAccount is a deprecated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.", "automountServiceAccountToken": "AutomountServiceAccountToken indicates whether a service account token should be automatically mounted.", "nodeName": "NodeName indicates in which node this pod is scheduled. If empty, this pod is a candidate for scheduling by the scheduler defined in schedulerName. Once this field is set, the kubelet for this node becomes responsible for the lifecycle of this pod. This field should not be used to express a desire for the pod to be scheduled on a specific node. https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename", - "hostNetwork": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + "hostNetwork": "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", "hostPID": "Use the host's pid namespace. Optional: Default to false.", "hostIPC": "Use the host's ipc namespace. Optional: Default to false.", "shareProcessNamespace": "Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.", @@ -1846,11 +1916,12 @@ var map_PodSpec = map[string]string{ "overhead": "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md", "topologySpreadConstraints": "TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed.", "setHostnameAsFQDN": "If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false.", - "os": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + "os": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", "hostUsers": "Use the host's user namespace. Optional: Default to true. If set to true or not present, the pod will be run in the host user namespace, useful for when the pod needs a feature only available to the host user namespace, such as loading a kernel module with CAP_SYS_MODULE. When set to false, a new userns is created for the pod. Setting false is useful for mitigating container breakout vulnerabilities even allowing users to run their containers as root without actually having root privileges on the host. This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.", "schedulingGates": "SchedulingGates is an opaque list of values that if specified will block scheduling the pod. If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the scheduler will not attempt to schedule the pod.\n\nSchedulingGates can only be set at pod creation time, and be removed only afterwards.", "resourceClaims": "ResourceClaims defines which ResourceClaims must be allocated and reserved before the Pod is allowed to start. The resources will be made available to those containers which consume them by name.\n\nThis is an alpha field and requires enabling the DynamicResourceAllocation feature gate.\n\nThis field is immutable.", - "resources": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + "resources": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + "hostnameOverride": "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", } func (PodSpec) SwaggerDoc() map[string]string { @@ -1858,24 +1929,25 @@ func (PodSpec) SwaggerDoc() map[string]string { } var map_PodStatus = map[string]string{ - "": "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.", - "observedGeneration": "If set, this represents the .metadata.generation that the pod status was set based upon. This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.", - "phase": "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", - "conditions": "Current service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", - "message": "A human readable message indicating details about why the pod is in this condition.", - "reason": "A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'", - "nominatedNodeName": "nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.", - "hostIP": "hostIP holds the IP address of the host to which the pod is assigned. Empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns mean that HostIP will not be updated even if there is a node is assigned to pod", - "hostIPs": "hostIPs holds the IP addresses allocated to the host. If this field is specified, the first entry must match the hostIP field. This list is empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns means that HostIPs will not be updated even if there is a node is assigned to this pod.", - "podIP": "podIP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.", - "podIPs": "podIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.", - "startTime": "RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod.", - "initContainerStatuses": "Statuses of init containers in this pod. The most recent successful non-restartable init container will have ready = true, the most recently started container will have startTime set. Each init container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-and-container-status", - "containerStatuses": "Statuses of containers in this pod. Each container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", - "qosClass": "The Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/#quality-of-service-classes", - "ephemeralContainerStatuses": "Statuses for any ephemeral containers that have run in this pod. Each ephemeral container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", - "resize": "Status of resources resize desired for pod's containers. It is empty if no resources resize is pending. Any changes to container resources will automatically set this to \"Proposed\" Deprecated: Resize status is moved to two pod conditions PodResizePending and PodResizeInProgress. PodResizePending will track states where the spec has been resized, but the Kubelet has not yet allocated the resources. PodResizeInProgress will track in-progress resizes, and should be present whenever allocated resources != acknowledged resources.", - "resourceClaimStatuses": "Status of resource claims.", + "": "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.", + "observedGeneration": "If set, this represents the .metadata.generation that the pod status was set based upon. This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.", + "phase": "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", + "conditions": "Current service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", + "message": "A human readable message indicating details about why the pod is in this condition.", + "reason": "A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'", + "nominatedNodeName": "nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.", + "hostIP": "hostIP holds the IP address of the host to which the pod is assigned. Empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns mean that HostIP will not be updated even if there is a node is assigned to pod", + "hostIPs": "hostIPs holds the IP addresses allocated to the host. If this field is specified, the first entry must match the hostIP field. This list is empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns means that HostIPs will not be updated even if there is a node is assigned to this pod.", + "podIP": "podIP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.", + "podIPs": "podIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.", + "startTime": "RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod.", + "initContainerStatuses": "Statuses of init containers in this pod. The most recent successful non-restartable init container will have ready = true, the most recently started container will have startTime set. Each init container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-and-container-status", + "containerStatuses": "Statuses of containers in this pod. Each container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", + "qosClass": "The Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/#quality-of-service-classes", + "ephemeralContainerStatuses": "Statuses for any ephemeral containers that have run in this pod. Each ephemeral container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", + "resize": "Status of resources resize desired for pod's containers. It is empty if no resources resize is pending. Any changes to container resources will automatically set this to \"Proposed\" Deprecated: Resize status is moved to two pod conditions PodResizePending and PodResizeInProgress. PodResizePending will track states where the spec has been resized, but the Kubelet has not yet allocated the resources. PodResizeInProgress will track in-progress resizes, and should be present whenever allocated resources != acknowledged resources.", + "resourceClaimStatuses": "Status of resource claims.", + "extendedResourceClaimStatus": "Status of extended resource claim backed by DRA.", } func (PodStatus) SwaggerDoc() map[string]string { @@ -2205,7 +2277,7 @@ var map_ResourceRequirements = map[string]string{ "": "ResourceRequirements describes the compute resource requirements.", "limits": "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "requests": "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", - "claims": "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container.\n\nThis is an alpha field and requires enabling the DynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.", + "claims": "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container.\n\nThis field depends on the DynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.", } func (ResourceRequirements) SwaggerDoc() map[string]string { @@ -2587,7 +2659,7 @@ var map_Taint = map[string]string{ "key": "Required. The taint key to be applied to a node.", "value": "The taint value corresponding to the taint key.", "effect": "Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute.", - "timeAdded": "TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints.", + "timeAdded": "TimeAdded represents the time at which the taint was added.", } func (Taint) SwaggerDoc() map[string]string { @@ -2727,6 +2799,7 @@ var map_VolumeProjection = map[string]string{ "configMap": "configMap information about the configMap data to project", "serviceAccountToken": "serviceAccountToken is information about the serviceAccountToken data to project", "clusterTrustBundle": "ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field of ClusterTrustBundle objects in an auto-updating file.\n\nAlpha, gated by the ClusterTrustBundleProjection feature gate.\n\nClusterTrustBundle objects can either be selected by name, or by the combination of signer name and a label selector.\n\nKubelet performs aggressive normalization of the PEM contents written into the pod filesystem. Esoteric PEM features such as inter-block comments and block headers are stripped. Certificates are deduplicated. The ordering of certificates within the file is arbitrary, and Kubelet may change the order over time.", + "podCertificate": "Projects an auto-rotating credential bundle (private key and certificate chain) that the pod can use either as a TLS client or server.\n\nKubelet generates a private key and uses it to send a PodCertificateRequest to the named signer. Once the signer approves the request and issues a certificate chain, Kubelet writes the key and certificate chain to the pod filesystem. The pod does not start until certificates have been issued for each podCertificate projected volume source in its spec.\n\nKubelet will begin trying to rotate the certificate at the time indicated by the signer using the PodCertificateRequest.Status.BeginRefreshAt timestamp.\n\nKubelet can write a single file, indicated by the credentialBundlePath field, or separate files, indicated by the keyPath and certificateChainPath fields.\n\nThe credential bundle is a single file in PEM format. The first PEM entry is the private key (in PKCS#8 format), and the remaining PEM entries are the certificate chain issued by the signer (typically, signers will return their certificate chain in leaf-to-root order).\n\nPrefer using the credential bundle format, since your application code can read it atomically. If you use keyPath and certificateChainPath, your application must make two separate file reads. If these coincide with a certificate rotation, it is possible that the private key and leaf certificate you read may not correspond to each other. Your application will need to check for this condition, and re-read until they are consistent.\n\nThe named signer controls chooses the format of the certificate it issues; consult the signer implementation's documentation to learn how to use the certificates it issues.", } func (VolumeProjection) SwaggerDoc() map[string]string { @@ -2752,10 +2825,10 @@ var map_VolumeSource = map[string]string{ "gitRepo": "gitRepo represents a git repository at a particular revision. Deprecated: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", "secret": "secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret", "nfs": "nfs represents an NFS mount on the host that shares a pod's lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs", - "iscsi": "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md", - "glusterfs": "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. More info: https://examples.k8s.io/volumes/glusterfs/README.md", + "iscsi": "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi", + "glusterfs": "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported.", "persistentVolumeClaim": "persistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims", - "rbd": "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. More info: https://examples.k8s.io/volumes/rbd/README.md", + "rbd": "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported.", "flexVolume": "flexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. Deprecated: FlexVolume is deprecated. Consider using a CSIDriver instead.", "cinder": "cinder represents a cinder volume attached and mounted on kubelets host machine. Deprecated: Cinder is deprecated. All operations for the in-tree cinder type are redirected to the cinder.csi.openstack.org CSI driver. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", "cephfs": "cephFS represents a Ceph FS mount on the host that shares a pod's lifetime. Deprecated: CephFS is deprecated and the in-tree cephfs type is no longer supported.", diff --git a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index 619c525427..bcd91bd019 100644 --- a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -829,6 +829,13 @@ func (in *Container) DeepCopyInto(out *Container) { *out = new(ContainerRestartPolicy) **out = **in } + if in.RestartPolicyRules != nil { + in, out := &in.RestartPolicyRules, &out.RestartPolicyRules + *out = make([]ContainerRestartRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.VolumeMounts != nil { in, out := &in.VolumeMounts, &out.VolumeMounts *out = make([]VolumeMount, len(*in)) @@ -879,6 +886,22 @@ func (in *Container) DeepCopy() *Container { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerExtendedResourceRequest) DeepCopyInto(out *ContainerExtendedResourceRequest) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerExtendedResourceRequest. +func (in *ContainerExtendedResourceRequest) DeepCopy() *ContainerExtendedResourceRequest { + if in == nil { + return nil + } + out := new(ContainerExtendedResourceRequest) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContainerImage) DeepCopyInto(out *ContainerImage) { *out = *in @@ -932,6 +955,48 @@ func (in *ContainerResizePolicy) DeepCopy() *ContainerResizePolicy { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerRestartRule) DeepCopyInto(out *ContainerRestartRule) { + *out = *in + if in.ExitCodes != nil { + in, out := &in.ExitCodes, &out.ExitCodes + *out = new(ContainerRestartRuleOnExitCodes) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerRestartRule. +func (in *ContainerRestartRule) DeepCopy() *ContainerRestartRule { + if in == nil { + return nil + } + out := new(ContainerRestartRule) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerRestartRuleOnExitCodes) DeepCopyInto(out *ContainerRestartRuleOnExitCodes) { + *out = *in + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]int32, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerRestartRuleOnExitCodes. +func (in *ContainerRestartRuleOnExitCodes) DeepCopy() *ContainerRestartRuleOnExitCodes { + if in == nil { + return nil + } + out := new(ContainerRestartRuleOnExitCodes) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContainerState) DeepCopyInto(out *ContainerState) { *out = *in @@ -1433,6 +1498,11 @@ func (in *EnvVarSource) DeepCopyInto(out *EnvVarSource) { *out = new(SecretKeySelector) (*in).DeepCopyInto(*out) } + if in.FileKeyRef != nil { + in, out := &in.FileKeyRef, &out.FileKeyRef + *out = new(FileKeySelector) + (*in).DeepCopyInto(*out) + } return } @@ -1506,6 +1576,13 @@ func (in *EphemeralContainerCommon) DeepCopyInto(out *EphemeralContainerCommon) *out = new(ContainerRestartPolicy) **out = **in } + if in.RestartPolicyRules != nil { + in, out := &in.RestartPolicyRules, &out.RestartPolicyRules + *out = make([]ContainerRestartRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.VolumeMounts != nil { in, out := &in.VolumeMounts, &out.VolumeMounts *out = make([]VolumeMount, len(*in)) @@ -1736,6 +1813,27 @@ func (in *FCVolumeSource) DeepCopy() *FCVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FileKeySelector) DeepCopyInto(out *FileKeySelector) { + *out = *in + if in.Optional != nil { + in, out := &in.Optional, &out.Optional + *out = new(bool) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FileKeySelector. +func (in *FileKeySelector) DeepCopy() *FileKeySelector { + if in == nil { + return nil + } + out := new(FileKeySelector) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FlexPersistentVolumeSource) DeepCopyInto(out *FlexPersistentVolumeSource) { *out = *in @@ -3797,6 +3895,27 @@ func (in *PodAttachOptions) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateProjection) DeepCopyInto(out *PodCertificateProjection) { + *out = *in + if in.MaxExpirationSeconds != nil { + in, out := &in.MaxExpirationSeconds, &out.MaxExpirationSeconds + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateProjection. +func (in *PodCertificateProjection) DeepCopy() *PodCertificateProjection { + if in == nil { + return nil + } + out := new(PodCertificateProjection) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodCondition) DeepCopyInto(out *PodCondition) { *out = *in @@ -3899,6 +4018,27 @@ func (in *PodExecOptions) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodExtendedResourceClaimStatus) DeepCopyInto(out *PodExtendedResourceClaimStatus) { + *out = *in + if in.RequestMappings != nil { + in, out := &in.RequestMappings, &out.RequestMappings + *out = make([]ContainerExtendedResourceRequest, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodExtendedResourceClaimStatus. +func (in *PodExtendedResourceClaimStatus) DeepCopy() *PodExtendedResourceClaimStatus { + if in == nil { + return nil + } + out := new(PodExtendedResourceClaimStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodIP) DeepCopyInto(out *PodIP) { *out = *in @@ -4412,6 +4552,11 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { *out = new(ResourceRequirements) (*in).DeepCopyInto(*out) } + if in.HostnameOverride != nil { + in, out := &in.HostnameOverride, &out.HostnameOverride + *out = new(string) + **out = **in + } return } @@ -4477,6 +4622,11 @@ func (in *PodStatus) DeepCopyInto(out *PodStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.ExtendedResourceClaimStatus != nil { + in, out := &in.ExtendedResourceClaimStatus, &out.ExtendedResourceClaimStatus + *out = new(PodExtendedResourceClaimStatus) + (*in).DeepCopyInto(*out) + } return } @@ -6412,6 +6562,11 @@ func (in *VolumeProjection) DeepCopyInto(out *VolumeProjection) { *out = new(ClusterTrustBundleProjection) (*in).DeepCopyInto(*out) } + if in.PodCertificate != nil { + in, out := &in.PodCertificate, &out.PodCertificate + *out = new(PodCertificateProjection) + (*in).DeepCopyInto(*out) + } return } diff --git a/vendor/k8s.io/api/extensions/v1beta1/doc.go b/vendor/k8s.io/api/extensions/v1beta1/doc.go index 7770fab5d2..be710973cb 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/doc.go +++ b/vendor/k8s.io/api/extensions/v1beta1/doc.go @@ -18,5 +18,7 @@ limitations under the License. // +k8s:protobuf-gen=package // +k8s:openapi-gen=true // +k8s:prerelease-lifecycle-gen=true +// +k8s:validation-gen=TypeMeta +// +k8s:validation-gen-input=k8s.io/api/extensions/v1beta1 package v1beta1 diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.proto b/vendor/k8s.io/api/extensions/v1beta1/generated.proto index 70fcec0cc5..fed0b4835d 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.proto +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.proto @@ -980,7 +980,7 @@ message RollingUpdateDaemonSet { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may @@ -1039,6 +1039,9 @@ message Scale { message ScaleSpec { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/extensions/v1beta1/types.go b/vendor/k8s.io/api/extensions/v1beta1/types.go index b80a7a7e16..c7b50e0590 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types.go @@ -27,6 +27,9 @@ import ( type ScaleSpec struct { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } @@ -54,6 +57,7 @@ type ScaleStatus struct { // +k8s:prerelease-lifecycle-gen:introduced=1.1 // +k8s:prerelease-lifecycle-gen:deprecated=1.2 // +k8s:prerelease-lifecycle-gen:removed=1.16 +// +k8s:isSubresource=/scale // represents a scaling request for a resource. type Scale struct { @@ -398,7 +402,7 @@ type RollingUpdateDaemonSet struct { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 923fab3aa1..8a158233ef 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -482,7 +482,7 @@ func (RollbackConfig) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediately created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.validations.go b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.validations.go new file mode 100644 index 0000000000..6d2a1666ae --- /dev/null +++ b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.validations.go @@ -0,0 +1,78 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes 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. +*/ + +// Code generated by validation-gen. DO NOT EDIT. + +package v1beta1 + +import ( + context "context" + fmt "fmt" + + operation "k8s.io/apimachinery/pkg/api/operation" + safe "k8s.io/apimachinery/pkg/api/safe" + validate "k8s.io/apimachinery/pkg/api/validate" + runtime "k8s.io/apimachinery/pkg/runtime" + field "k8s.io/apimachinery/pkg/util/validation/field" +) + +func init() { localSchemeBuilder.Register(RegisterValidations) } + +// RegisterValidations adds validation functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterValidations(scheme *runtime.Scheme) error { + scheme.AddValidationFunc((*Scale)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList { + switch op.Request.SubresourcePath() { + case "/scale": + return Validate_Scale(ctx, op, nil /* fldPath */, obj.(*Scale), safe.Cast[*Scale](oldObj)) + } + return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))} + }) + return nil +} + +func Validate_Scale(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Scale) (errs field.ErrorList) { + // field Scale.TypeMeta has no validation + // field Scale.ObjectMeta has no validation + + // field Scale.Spec + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *ScaleSpec) (errs field.ErrorList) { + errs = append(errs, Validate_ScaleSpec(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("spec"), &obj.Spec, safe.Field(oldObj, func(oldObj *Scale) *ScaleSpec { return &oldObj.Spec }))...) + + // field Scale.Status has no validation + return errs +} + +func Validate_ScaleSpec(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ScaleSpec) (errs field.ErrorList) { + // field ScaleSpec.Replicas + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) { + // optional value-type fields with zero-value defaults are purely documentation + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil // no changes + } + errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...) + return + }(fldPath.Child("replicas"), &obj.Replicas, safe.Field(oldObj, func(oldObj *ScaleSpec) *int32 { return &oldObj.Replicas }))...) + + return errs +} diff --git a/vendor/k8s.io/api/networking/v1/generated.proto b/vendor/k8s.io/api/networking/v1/generated.proto index e3e3e9215e..16a2792aa6 100644 --- a/vendor/k8s.io/api/networking/v1/generated.proto +++ b/vendor/k8s.io/api/networking/v1/generated.proto @@ -534,11 +534,12 @@ message NetworkPolicyPort { // NetworkPolicySpec provides the specification of a NetworkPolicy message NetworkPolicySpec { // podSelector selects the pods to which this NetworkPolicy object applies. - // The array of ingress rules is applied to any pods selected by this field. + // The array of rules is applied to any pods selected by this field. An empty + // selector matches all pods in the policy's namespace. // Multiple network policies can select the same set of pods. In this case, // the ingress rules for each are combined additively. - // This field is NOT optional and follows standard label selector semantics. - // An empty podSelector matches all pods in this namespace. + // This field is optional. If it is not specified, it defaults to an empty selector. + // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector podSelector = 1; // ingress is a list of ingress rules to be applied to the selected pods. diff --git a/vendor/k8s.io/api/networking/v1/types.go b/vendor/k8s.io/api/networking/v1/types.go index 216647ceeb..7d9a4fc94c 100644 --- a/vendor/k8s.io/api/networking/v1/types.go +++ b/vendor/k8s.io/api/networking/v1/types.go @@ -60,11 +60,12 @@ const ( // NetworkPolicySpec provides the specification of a NetworkPolicy type NetworkPolicySpec struct { // podSelector selects the pods to which this NetworkPolicy object applies. - // The array of ingress rules is applied to any pods selected by this field. + // The array of rules is applied to any pods selected by this field. An empty + // selector matches all pods in the policy's namespace. // Multiple network policies can select the same set of pods. In this case, // the ingress rules for each are combined additively. - // This field is NOT optional and follows standard label selector semantics. - // An empty podSelector matches all pods in this namespace. + // This field is optional. If it is not specified, it defaults to an empty selector. + // +optional PodSelector metav1.LabelSelector `json:"podSelector" protobuf:"bytes,1,opt,name=podSelector"` // ingress is a list of ingress rules to be applied to the selected pods. diff --git a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go index 0e294848ba..6210bb7a5a 100644 --- a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -313,7 +313,7 @@ func (NetworkPolicyPort) SwaggerDoc() map[string]string { var map_NetworkPolicySpec = map[string]string{ "": "NetworkPolicySpec provides the specification of a NetworkPolicy", - "podSelector": "podSelector selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace.", + "podSelector": "podSelector selects the pods to which this NetworkPolicy object applies. The array of rules is applied to any pods selected by this field. An empty selector matches all pods in the policy's namespace. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is optional. If it is not specified, it defaults to an empty selector.", "ingress": "ingress is a list of ingress rules to be applied to the selected pods. Traffic is allowed to a pod if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic source is the pod's local node, OR if the traffic matches at least one ingress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy does not allow any traffic (and serves solely to ensure that the pods it selects are isolated by default)", "egress": "egress is a list of egress rules to be applied to the selected pods. Outgoing traffic is allowed if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic matches at least one egress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy limits all outgoing traffic (and serves solely to ensure that the pods it selects are isolated by default). This field is beta-level in 1.8", "policyTypes": "policyTypes is a list of rule types that the NetworkPolicy relates to. Valid options are [\"Ingress\"], [\"Egress\"], or [\"Ingress\", \"Egress\"]. If this field is not specified, it will default based on the existence of ingress or egress rules; policies that contain an egress section are assumed to affect egress, and all policies (whether or not they contain an ingress section) are assumed to affect ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", diff --git a/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go b/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go deleted file mode 100644 index 0d42034837..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go +++ /dev/null @@ -1,1929 +0,0 @@ -/* -Copyright The Kubernetes 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. -*/ - -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: k8s.io/api/networking/v1alpha1/generated.proto - -package v1alpha1 - -import ( - fmt "fmt" - - io "io" - - proto "github.com/gogo/protobuf/proto" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - math "math" - math_bits "math/bits" - reflect "reflect" - strings "strings" -) - -// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -func (m *IPAddress) Reset() { *m = IPAddress{} } -func (*IPAddress) ProtoMessage() {} -func (*IPAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{0} -} -func (m *IPAddress) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IPAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *IPAddress) XXX_Merge(src proto.Message) { - xxx_messageInfo_IPAddress.Merge(m, src) -} -func (m *IPAddress) XXX_Size() int { - return m.Size() -} -func (m *IPAddress) XXX_DiscardUnknown() { - xxx_messageInfo_IPAddress.DiscardUnknown(m) -} - -var xxx_messageInfo_IPAddress proto.InternalMessageInfo - -func (m *IPAddressList) Reset() { *m = IPAddressList{} } -func (*IPAddressList) ProtoMessage() {} -func (*IPAddressList) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{1} -} -func (m *IPAddressList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IPAddressList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *IPAddressList) XXX_Merge(src proto.Message) { - xxx_messageInfo_IPAddressList.Merge(m, src) -} -func (m *IPAddressList) XXX_Size() int { - return m.Size() -} -func (m *IPAddressList) XXX_DiscardUnknown() { - xxx_messageInfo_IPAddressList.DiscardUnknown(m) -} - -var xxx_messageInfo_IPAddressList proto.InternalMessageInfo - -func (m *IPAddressSpec) Reset() { *m = IPAddressSpec{} } -func (*IPAddressSpec) ProtoMessage() {} -func (*IPAddressSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{2} -} -func (m *IPAddressSpec) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IPAddressSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *IPAddressSpec) XXX_Merge(src proto.Message) { - xxx_messageInfo_IPAddressSpec.Merge(m, src) -} -func (m *IPAddressSpec) XXX_Size() int { - return m.Size() -} -func (m *IPAddressSpec) XXX_DiscardUnknown() { - xxx_messageInfo_IPAddressSpec.DiscardUnknown(m) -} - -var xxx_messageInfo_IPAddressSpec proto.InternalMessageInfo - -func (m *ParentReference) Reset() { *m = ParentReference{} } -func (*ParentReference) ProtoMessage() {} -func (*ParentReference) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{3} -} -func (m *ParentReference) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ParentReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ParentReference) XXX_Merge(src proto.Message) { - xxx_messageInfo_ParentReference.Merge(m, src) -} -func (m *ParentReference) XXX_Size() int { - return m.Size() -} -func (m *ParentReference) XXX_DiscardUnknown() { - xxx_messageInfo_ParentReference.DiscardUnknown(m) -} - -var xxx_messageInfo_ParentReference proto.InternalMessageInfo - -func (m *ServiceCIDR) Reset() { *m = ServiceCIDR{} } -func (*ServiceCIDR) ProtoMessage() {} -func (*ServiceCIDR) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{4} -} -func (m *ServiceCIDR) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDR) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDR) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDR.Merge(m, src) -} -func (m *ServiceCIDR) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDR) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDR.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDR proto.InternalMessageInfo - -func (m *ServiceCIDRList) Reset() { *m = ServiceCIDRList{} } -func (*ServiceCIDRList) ProtoMessage() {} -func (*ServiceCIDRList) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{5} -} -func (m *ServiceCIDRList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDRList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDRList) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDRList.Merge(m, src) -} -func (m *ServiceCIDRList) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDRList) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDRList.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDRList proto.InternalMessageInfo - -func (m *ServiceCIDRSpec) Reset() { *m = ServiceCIDRSpec{} } -func (*ServiceCIDRSpec) ProtoMessage() {} -func (*ServiceCIDRSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{6} -} -func (m *ServiceCIDRSpec) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDRSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDRSpec) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDRSpec.Merge(m, src) -} -func (m *ServiceCIDRSpec) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDRSpec) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDRSpec.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDRSpec proto.InternalMessageInfo - -func (m *ServiceCIDRStatus) Reset() { *m = ServiceCIDRStatus{} } -func (*ServiceCIDRStatus) ProtoMessage() {} -func (*ServiceCIDRStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{7} -} -func (m *ServiceCIDRStatus) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDRStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDRStatus) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDRStatus.Merge(m, src) -} -func (m *ServiceCIDRStatus) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDRStatus) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDRStatus.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDRStatus proto.InternalMessageInfo - -func init() { - proto.RegisterType((*IPAddress)(nil), "k8s.io.api.networking.v1alpha1.IPAddress") - proto.RegisterType((*IPAddressList)(nil), "k8s.io.api.networking.v1alpha1.IPAddressList") - proto.RegisterType((*IPAddressSpec)(nil), "k8s.io.api.networking.v1alpha1.IPAddressSpec") - proto.RegisterType((*ParentReference)(nil), "k8s.io.api.networking.v1alpha1.ParentReference") - proto.RegisterType((*ServiceCIDR)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDR") - proto.RegisterType((*ServiceCIDRList)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDRList") - proto.RegisterType((*ServiceCIDRSpec)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDRSpec") - proto.RegisterType((*ServiceCIDRStatus)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDRStatus") -} - -func init() { - proto.RegisterFile("k8s.io/api/networking/v1alpha1/generated.proto", fileDescriptor_c1cb39e7b48ce50d) -} - -var fileDescriptor_c1cb39e7b48ce50d = []byte{ - // 634 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcd, 0x6e, 0xd3, 0x4a, - 0x18, 0x8d, 0xdb, 0xa4, 0xaa, 0x27, 0xb7, 0xb7, 0xb7, 0x5e, 0x45, 0x5d, 0x38, 0x91, 0xef, 0xa6, - 0x08, 0x3a, 0x26, 0x11, 0x42, 0x6c, 0x71, 0x2b, 0xa1, 0x4a, 0xd0, 0x96, 0xe9, 0x0a, 0xd4, 0x05, - 0xd3, 0xc9, 0x57, 0x67, 0x08, 0xfe, 0xd1, 0xcc, 0x24, 0xc0, 0x8e, 0x47, 0xe0, 0x05, 0x78, 0x0e, - 0x56, 0x20, 0xb1, 0xeb, 0xb2, 0xcb, 0xae, 0x2a, 0x6a, 0x5e, 0x04, 0xcd, 0xd8, 0xb1, 0x93, 0x46, - 0xfd, 0xdb, 0x74, 0xe7, 0xef, 0xcc, 0x39, 0x67, 0xbe, 0xf3, 0xcd, 0x8c, 0x8c, 0xf0, 0xf0, 0x99, - 0xc4, 0x3c, 0xf1, 0x69, 0xca, 0xfd, 0x18, 0xd4, 0xc7, 0x44, 0x0c, 0x79, 0x1c, 0xfa, 0xe3, 0x2e, - 0xfd, 0x90, 0x0e, 0x68, 0xd7, 0x0f, 0x21, 0x06, 0x41, 0x15, 0xf4, 0x71, 0x2a, 0x12, 0x95, 0x38, - 0x6e, 0xce, 0xc7, 0x34, 0xe5, 0xb8, 0xe2, 0xe3, 0x09, 0x7f, 0x7d, 0x33, 0xe4, 0x6a, 0x30, 0x3a, - 0xc2, 0x2c, 0x89, 0xfc, 0x30, 0x09, 0x13, 0xdf, 0xc8, 0x8e, 0x46, 0xc7, 0xa6, 0x32, 0x85, 0xf9, - 0xca, 0xed, 0xd6, 0x9f, 0x54, 0xdb, 0x47, 0x94, 0x0d, 0x78, 0x0c, 0xe2, 0xb3, 0x9f, 0x0e, 0x43, - 0x0d, 0x48, 0x3f, 0x02, 0x45, 0xfd, 0xf1, 0x5c, 0x13, 0xeb, 0xfe, 0x55, 0x2a, 0x31, 0x8a, 0x15, - 0x8f, 0x60, 0x4e, 0xf0, 0xf4, 0x26, 0x81, 0x64, 0x03, 0x88, 0xe8, 0x65, 0x9d, 0xf7, 0xd3, 0x42, - 0xf6, 0xce, 0xfe, 0xf3, 0x7e, 0x5f, 0x80, 0x94, 0xce, 0x3b, 0xb4, 0xac, 0x3b, 0xea, 0x53, 0x45, - 0x5b, 0x56, 0xc7, 0xda, 0x68, 0xf6, 0x1e, 0xe3, 0x6a, 0x1c, 0xa5, 0x31, 0x4e, 0x87, 0xa1, 0x06, - 0x24, 0xd6, 0x6c, 0x3c, 0xee, 0xe2, 0xbd, 0xa3, 0xf7, 0xc0, 0xd4, 0x2b, 0x50, 0x34, 0x70, 0x4e, - 0xce, 0xdb, 0xb5, 0xec, 0xbc, 0x8d, 0x2a, 0x8c, 0x94, 0xae, 0xce, 0x1e, 0xaa, 0xcb, 0x14, 0x58, - 0x6b, 0xc1, 0xb8, 0x6f, 0xe2, 0xeb, 0x87, 0x8d, 0xcb, 0xd6, 0x0e, 0x52, 0x60, 0xc1, 0x3f, 0x85, - 0x75, 0x5d, 0x57, 0xc4, 0x18, 0x79, 0x3f, 0x2c, 0xb4, 0x52, 0xb2, 0x5e, 0x72, 0xa9, 0x9c, 0xc3, - 0xb9, 0x10, 0xf8, 0x76, 0x21, 0xb4, 0xda, 0x44, 0xf8, 0xaf, 0xd8, 0x67, 0x79, 0x82, 0x4c, 0x05, - 0xd8, 0x45, 0x0d, 0xae, 0x20, 0x92, 0xad, 0x85, 0xce, 0xe2, 0x46, 0xb3, 0xf7, 0xe0, 0xd6, 0x09, - 0x82, 0x95, 0xc2, 0xb5, 0xb1, 0xa3, 0xf5, 0x24, 0xb7, 0xf1, 0xa2, 0xa9, 0xf6, 0x75, 0x2c, 0xe7, - 0x10, 0xd9, 0x29, 0x15, 0x10, 0x2b, 0x02, 0xc7, 0x45, 0xff, 0xfe, 0x4d, 0x9b, 0xec, 0x4f, 0x04, - 0x20, 0x20, 0x66, 0x10, 0xac, 0x64, 0xe7, 0x6d, 0xbb, 0x04, 0x49, 0x65, 0xe8, 0x7d, 0xb7, 0xd0, - 0xea, 0x25, 0xb6, 0xf3, 0x3f, 0x6a, 0x84, 0x22, 0x19, 0xa5, 0x66, 0x37, 0xbb, 0xea, 0xf3, 0x85, - 0x06, 0x49, 0xbe, 0xe6, 0x3c, 0x42, 0xcb, 0x02, 0x64, 0x32, 0x12, 0x0c, 0xcc, 0xe1, 0xd9, 0xd5, - 0x94, 0x48, 0x81, 0x93, 0x92, 0xe1, 0xf8, 0xc8, 0x8e, 0x69, 0x04, 0x32, 0xa5, 0x0c, 0x5a, 0x8b, - 0x86, 0xbe, 0x56, 0xd0, 0xed, 0xdd, 0xc9, 0x02, 0xa9, 0x38, 0x4e, 0x07, 0xd5, 0x75, 0xd1, 0xaa, - 0x1b, 0x6e, 0x79, 0xd0, 0x9a, 0x4b, 0xcc, 0x8a, 0xf7, 0x6d, 0x01, 0x35, 0x0f, 0x40, 0x8c, 0x39, - 0x83, 0xad, 0x9d, 0x6d, 0x72, 0x0f, 0x77, 0xf5, 0xf5, 0xcc, 0x5d, 0xbd, 0xf1, 0x10, 0xa6, 0x9a, - 0xbb, 0xea, 0xb6, 0x3a, 0x6f, 0xd0, 0x92, 0x54, 0x54, 0x8d, 0xa4, 0x19, 0x4a, 0xb3, 0xd7, 0xbd, - 0x8b, 0xa9, 0x11, 0x06, 0xff, 0x16, 0xb6, 0x4b, 0x79, 0x4d, 0x0a, 0x43, 0xef, 0x97, 0x85, 0x56, - 0xa7, 0xd8, 0xf7, 0xf0, 0x14, 0xf6, 0x67, 0x9f, 0xc2, 0xc3, 0x3b, 0x64, 0xb9, 0xe2, 0x31, 0xf4, - 0x66, 0x22, 0x98, 0xe7, 0xd0, 0x46, 0x0d, 0xc6, 0xfb, 0x42, 0xb6, 0xac, 0xce, 0xe2, 0x86, 0x1d, - 0xd8, 0x5a, 0xa3, 0x17, 0x25, 0xc9, 0x71, 0xef, 0x13, 0x5a, 0x9b, 0x1b, 0x92, 0xc3, 0x10, 0x62, - 0x49, 0xdc, 0xe7, 0x8a, 0x27, 0x71, 0x2e, 0x9d, 0x3d, 0xc0, 0x6b, 0xa2, 0x6f, 0x4d, 0x74, 0xd5, - 0xed, 0x28, 0x21, 0x49, 0xa6, 0x6c, 0x83, 0xed, 0x93, 0x0b, 0xb7, 0x76, 0x7a, 0xe1, 0xd6, 0xce, - 0x2e, 0xdc, 0xda, 0x97, 0xcc, 0xb5, 0x4e, 0x32, 0xd7, 0x3a, 0xcd, 0x5c, 0xeb, 0x2c, 0x73, 0xad, - 0xdf, 0x99, 0x6b, 0x7d, 0xfd, 0xe3, 0xd6, 0xde, 0xba, 0xd7, 0xff, 0x7f, 0xfe, 0x06, 0x00, 0x00, - 0xff, 0xff, 0xb1, 0xd0, 0x33, 0x02, 0xa0, 0x06, 0x00, 0x00, -} - -func (m *IPAddress) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IPAddress) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IPAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *IPAddressList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IPAddressList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IPAddressList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *IPAddressSpec) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IPAddressSpec) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IPAddressSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ParentRef != nil { - { - size, err := m.ParentRef.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ParentReference) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ParentReference) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ParentReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0x22 - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0x1a - i -= len(m.Resource) - copy(dAtA[i:], m.Resource) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Resource))) - i-- - dAtA[i] = 0x12 - i -= len(m.Group) - copy(dAtA[i:], m.Group) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Group))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceCIDR) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDR) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDR) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceCIDRList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDRList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDRList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceCIDRSpec) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDRSpec) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDRSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.CIDRs) > 0 { - for iNdEx := len(m.CIDRs) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.CIDRs[iNdEx]) - copy(dAtA[i:], m.CIDRs[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.CIDRs[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ServiceCIDRStatus) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDRStatus) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDRStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Conditions) > 0 { - for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *IPAddress) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *IPAddressList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *IPAddressSpec) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ParentRef != nil { - l = m.ParentRef.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *ParentReference) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Group) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Resource) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *ServiceCIDR) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *ServiceCIDRList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ServiceCIDRSpec) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.CIDRs) > 0 { - for _, s := range m.CIDRs { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ServiceCIDRStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Conditions) > 0 { - for _, e := range m.Conditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *IPAddress) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&IPAddress{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "IPAddressSpec", "IPAddressSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *IPAddressList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]IPAddress{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "IPAddress", "IPAddress", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&IPAddressList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *IPAddressSpec) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&IPAddressSpec{`, - `ParentRef:` + strings.Replace(this.ParentRef.String(), "ParentReference", "ParentReference", 1) + `,`, - `}`, - }, "") - return s -} -func (this *ParentReference) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ParentReference{`, - `Group:` + fmt.Sprintf("%v", this.Group) + `,`, - `Resource:` + fmt.Sprintf("%v", this.Resource) + `,`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDR) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ServiceCIDR{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ServiceCIDRSpec", "ServiceCIDRSpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ServiceCIDRStatus", "ServiceCIDRStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDRList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]ServiceCIDR{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ServiceCIDR", "ServiceCIDR", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ServiceCIDRList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDRSpec) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ServiceCIDRSpec{`, - `CIDRs:` + fmt.Sprintf("%v", this.CIDRs) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDRStatus) String() string { - if this == nil { - return "nil" - } - repeatedStringForConditions := "[]Condition{" - for _, f := range this.Conditions { - repeatedStringForConditions += fmt.Sprintf("%v", f) + "," - } - repeatedStringForConditions += "}" - s := strings.Join([]string{`&ServiceCIDRStatus{`, - `Conditions:` + repeatedStringForConditions + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *IPAddress) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IPAddress: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IPAddress: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *IPAddressList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IPAddressList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IPAddressList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, IPAddress{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *IPAddressSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IPAddressSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IPAddressSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ParentRef", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ParentRef == nil { - m.ParentRef = &ParentReference{} - } - if err := m.ParentRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ParentReference) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ParentReference: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ParentReference: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Group = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Resource = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Namespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDR) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDR: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDR: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDRList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDRList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDRList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, ServiceCIDR{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDRSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDRSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDRSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CIDRs", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CIDRs = append(m.CIDRs, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDRStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDRStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDRStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Conditions = append(m.Conditions, v1.Condition{}) - if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenerated(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenerated - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenerated - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenerated - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") -) diff --git a/vendor/k8s.io/api/networking/v1alpha1/generated.proto b/vendor/k8s.io/api/networking/v1alpha1/generated.proto deleted file mode 100644 index 80ec6af735..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/generated.proto +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright The Kubernetes 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. -*/ - - -// This file was autogenerated by go-to-protobuf. Do not edit it manually! - -syntax = "proto2"; - -package k8s.io.api.networking.v1alpha1; - -import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; - -// Package-wide variables from generator "generated". -option go_package = "k8s.io/api/networking/v1alpha1"; - -// IPAddress represents a single IP of a single IP Family. The object is designed to be used by APIs -// that operate on IP addresses. The object is used by the Service core API for allocation of IP addresses. -// An IP address can be represented in different formats, to guarantee the uniqueness of the IP, -// the name of the object is the IP address in canonical format, four decimal digits separated -// by dots suppressing leading zeros for IPv4 and the representation defined by RFC 5952 for IPv6. -// Valid: 192.168.1.5 or 2001:db8::1 or 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 -// Invalid: 10.01.2.3 or 2001:db8:0:0:0::1 -message IPAddress { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // spec is the desired state of the IPAddress. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional IPAddressSpec spec = 2; -} - -// IPAddressList contains a list of IPAddress. -message IPAddressList { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // items is the list of IPAddresses. - repeated IPAddress items = 2; -} - -// IPAddressSpec describe the attributes in an IP Address. -message IPAddressSpec { - // ParentRef references the resource that an IPAddress is attached to. - // An IPAddress must reference a parent object. - // +required - optional ParentReference parentRef = 1; -} - -// ParentReference describes a reference to a parent object. -message ParentReference { - // Group is the group of the object being referenced. - // +optional - optional string group = 1; - - // Resource is the resource of the object being referenced. - // +required - optional string resource = 2; - - // Namespace is the namespace of the object being referenced. - // +optional - optional string namespace = 3; - - // Name is the name of the object being referenced. - // +required - optional string name = 4; -} - -// ServiceCIDR defines a range of IP addresses using CIDR format (e.g. 192.168.0.0/24 or 2001:db2::/64). -// This range is used to allocate ClusterIPs to Service objects. -message ServiceCIDR { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // spec is the desired state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional ServiceCIDRSpec spec = 2; - - // status represents the current state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional ServiceCIDRStatus status = 3; -} - -// ServiceCIDRList contains a list of ServiceCIDR objects. -message ServiceCIDRList { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // items is the list of ServiceCIDRs. - repeated ServiceCIDR items = 2; -} - -// ServiceCIDRSpec define the CIDRs the user wants to use for allocating ClusterIPs for Services. -message ServiceCIDRSpec { - // CIDRs defines the IP blocks in CIDR notation (e.g. "192.168.0.0/24" or "2001:db8::/64") - // from which to assign service cluster IPs. Max of two CIDRs is allowed, one of each IP family. - // The network address of each CIDR, the address that identifies the subnet of a host, is reserved - // and will not be allocated. The broadcast address for IPv4 CIDRs is also reserved and will not be - // allocated. - // This field is immutable. - // +optional - // +listType=atomic - repeated string cidrs = 1; -} - -// ServiceCIDRStatus describes the current state of the ServiceCIDR. -message ServiceCIDRStatus { - // conditions holds an array of metav1.Condition that describe the state of the ServiceCIDR. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 1; -} - diff --git a/vendor/k8s.io/api/networking/v1alpha1/types.go b/vendor/k8s.io/api/networking/v1alpha1/types.go deleted file mode 100644 index 0e454f0263..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/types.go +++ /dev/null @@ -1,154 +0,0 @@ -/* -Copyright 2022 The Kubernetes 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 v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +genclient -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// IPAddress represents a single IP of a single IP Family. The object is designed to be used by APIs -// that operate on IP addresses. The object is used by the Service core API for allocation of IP addresses. -// An IP address can be represented in different formats, to guarantee the uniqueness of the IP, -// the name of the object is the IP address in canonical format, four decimal digits separated -// by dots suppressing leading zeros for IPv4 and the representation defined by RFC 5952 for IPv6. -// Valid: 192.168.1.5 or 2001:db8::1 or 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 -// Invalid: 10.01.2.3 or 2001:db8:0:0:0::1 -type IPAddress struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // spec is the desired state of the IPAddress. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Spec IPAddressSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` -} - -// IPAddressSpec describe the attributes in an IP Address. -type IPAddressSpec struct { - // ParentRef references the resource that an IPAddress is attached to. - // An IPAddress must reference a parent object. - // +required - ParentRef *ParentReference `json:"parentRef,omitempty" protobuf:"bytes,1,opt,name=parentRef"` -} - -// ParentReference describes a reference to a parent object. -type ParentReference struct { - // Group is the group of the object being referenced. - // +optional - Group string `json:"group,omitempty" protobuf:"bytes,1,opt,name=group"` - // Resource is the resource of the object being referenced. - // +required - Resource string `json:"resource,omitempty" protobuf:"bytes,2,opt,name=resource"` - // Namespace is the namespace of the object being referenced. - // +optional - Namespace string `json:"namespace,omitempty" protobuf:"bytes,3,opt,name=namespace"` - // Name is the name of the object being referenced. - // +required - Name string `json:"name,omitempty" protobuf:"bytes,4,opt,name=name"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// IPAddressList contains a list of IPAddress. -type IPAddressList struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // items is the list of IPAddresses. - Items []IPAddress `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// +genclient -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// ServiceCIDR defines a range of IP addresses using CIDR format (e.g. 192.168.0.0/24 or 2001:db2::/64). -// This range is used to allocate ClusterIPs to Service objects. -type ServiceCIDR struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // spec is the desired state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Spec ServiceCIDRSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` - // status represents the current state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Status ServiceCIDRStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` -} - -// ServiceCIDRSpec define the CIDRs the user wants to use for allocating ClusterIPs for Services. -type ServiceCIDRSpec struct { - // CIDRs defines the IP blocks in CIDR notation (e.g. "192.168.0.0/24" or "2001:db8::/64") - // from which to assign service cluster IPs. Max of two CIDRs is allowed, one of each IP family. - // The network address of each CIDR, the address that identifies the subnet of a host, is reserved - // and will not be allocated. The broadcast address for IPv4 CIDRs is also reserved and will not be - // allocated. - // This field is immutable. - // +optional - // +listType=atomic - CIDRs []string `json:"cidrs,omitempty" protobuf:"bytes,1,opt,name=cidrs"` -} - -const ( - // ServiceCIDRConditionReady represents status of a ServiceCIDR that is ready to be used by the - // apiserver to allocate ClusterIPs for Services. - ServiceCIDRConditionReady = "Ready" - // ServiceCIDRReasonTerminating represents a reason where a ServiceCIDR is not ready because it is - // being deleted. - ServiceCIDRReasonTerminating = "Terminating" -) - -// ServiceCIDRStatus describes the current state of the ServiceCIDR. -type ServiceCIDRStatus struct { - // conditions holds an array of metav1.Condition that describe the state of the ServiceCIDR. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// ServiceCIDRList contains a list of ServiceCIDR objects. -type ServiceCIDRList struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // items is the list of ServiceCIDRs. - Items []ServiceCIDR `json:"items" protobuf:"bytes,2,rep,name=items"` -} diff --git a/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go deleted file mode 100644 index 4c8eb57a7a..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go +++ /dev/null @@ -1,110 +0,0 @@ -/* -Copyright The Kubernetes 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 v1alpha1 - -// This file contains a collection of methods that can be used from go-restful to -// generate Swagger API documentation for its models. Please read this PR for more -// information on the implementation: https://github.com/emicklei/go-restful/pull/215 -// -// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if -// they are on one line! For multiple line or blocks that you want to ignore use ---. -// Any context after a --- is ignored. -// -// Those methods can be generated by using hack/update-codegen.sh - -// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. -var map_IPAddress = map[string]string{ - "": "IPAddress represents a single IP of a single IP Family. The object is designed to be used by APIs that operate on IP addresses. The object is used by the Service core API for allocation of IP addresses. An IP address can be represented in different formats, to guarantee the uniqueness of the IP, the name of the object is the IP address in canonical format, four decimal digits separated by dots suppressing leading zeros for IPv4 and the representation defined by RFC 5952 for IPv6. Valid: 192.168.1.5 or 2001:db8::1 or 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 Invalid: 10.01.2.3 or 2001:db8:0:0:0::1", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "spec": "spec is the desired state of the IPAddress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", -} - -func (IPAddress) SwaggerDoc() map[string]string { - return map_IPAddress -} - -var map_IPAddressList = map[string]string{ - "": "IPAddressList contains a list of IPAddress.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "items": "items is the list of IPAddresses.", -} - -func (IPAddressList) SwaggerDoc() map[string]string { - return map_IPAddressList -} - -var map_IPAddressSpec = map[string]string{ - "": "IPAddressSpec describe the attributes in an IP Address.", - "parentRef": "ParentRef references the resource that an IPAddress is attached to. An IPAddress must reference a parent object.", -} - -func (IPAddressSpec) SwaggerDoc() map[string]string { - return map_IPAddressSpec -} - -var map_ParentReference = map[string]string{ - "": "ParentReference describes a reference to a parent object.", - "group": "Group is the group of the object being referenced.", - "resource": "Resource is the resource of the object being referenced.", - "namespace": "Namespace is the namespace of the object being referenced.", - "name": "Name is the name of the object being referenced.", -} - -func (ParentReference) SwaggerDoc() map[string]string { - return map_ParentReference -} - -var map_ServiceCIDR = map[string]string{ - "": "ServiceCIDR defines a range of IP addresses using CIDR format (e.g. 192.168.0.0/24 or 2001:db2::/64). This range is used to allocate ClusterIPs to Service objects.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "spec": "spec is the desired state of the ServiceCIDR. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - "status": "status represents the current state of the ServiceCIDR. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", -} - -func (ServiceCIDR) SwaggerDoc() map[string]string { - return map_ServiceCIDR -} - -var map_ServiceCIDRList = map[string]string{ - "": "ServiceCIDRList contains a list of ServiceCIDR objects.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "items": "items is the list of ServiceCIDRs.", -} - -func (ServiceCIDRList) SwaggerDoc() map[string]string { - return map_ServiceCIDRList -} - -var map_ServiceCIDRSpec = map[string]string{ - "": "ServiceCIDRSpec define the CIDRs the user wants to use for allocating ClusterIPs for Services.", - "cidrs": "CIDRs defines the IP blocks in CIDR notation (e.g. \"192.168.0.0/24\" or \"2001:db8::/64\") from which to assign service cluster IPs. Max of two CIDRs is allowed, one of each IP family. The network address of each CIDR, the address that identifies the subnet of a host, is reserved and will not be allocated. The broadcast address for IPv4 CIDRs is also reserved and will not be allocated. This field is immutable.", -} - -func (ServiceCIDRSpec) SwaggerDoc() map[string]string { - return map_ServiceCIDRSpec -} - -var map_ServiceCIDRStatus = map[string]string{ - "": "ServiceCIDRStatus describes the current state of the ServiceCIDR.", - "conditions": "conditions holds an array of metav1.Condition that describe the state of the ServiceCIDR. Current service state", -} - -func (ServiceCIDRStatus) SwaggerDoc() map[string]string { - return map_ServiceCIDRStatus -} - -// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/networking/v1alpha1/well_known_labels.go b/vendor/k8s.io/api/networking/v1alpha1/well_known_labels.go deleted file mode 100644 index 5f9c23f708..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/well_known_labels.go +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2023 The Kubernetes 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 v1alpha1 - -const ( - - // TODO: Use IPFamily as field with a field selector,And the value is set based on - // the name at create time and immutable. - // LabelIPAddressFamily is used to indicate the IP family of a Kubernetes IPAddress. - // This label simplify dual-stack client operations allowing to obtain the list of - // IP addresses filtered by family. - LabelIPAddressFamily = "ipaddress.kubernetes.io/ip-family" - // LabelManagedBy is used to indicate the controller or entity that manages - // an IPAddress. This label aims to enable different IPAddress - // objects to be managed by different controllers or entities within the - // same cluster. It is highly recommended to configure this label for all - // IPAddress objects. - LabelManagedBy = "ipaddress.kubernetes.io/managed-by" -) diff --git a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 5c8f697ba3..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,229 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes 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. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPAddress) DeepCopyInto(out *IPAddress) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddress. -func (in *IPAddress) DeepCopy() *IPAddress { - if in == nil { - return nil - } - out := new(IPAddress) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *IPAddress) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPAddressList) DeepCopyInto(out *IPAddressList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]IPAddress, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressList. -func (in *IPAddressList) DeepCopy() *IPAddressList { - if in == nil { - return nil - } - out := new(IPAddressList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *IPAddressList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPAddressSpec) DeepCopyInto(out *IPAddressSpec) { - *out = *in - if in.ParentRef != nil { - in, out := &in.ParentRef, &out.ParentRef - *out = new(ParentReference) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressSpec. -func (in *IPAddressSpec) DeepCopy() *IPAddressSpec { - if in == nil { - return nil - } - out := new(IPAddressSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ParentReference) DeepCopyInto(out *ParentReference) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParentReference. -func (in *ParentReference) DeepCopy() *ParentReference { - if in == nil { - return nil - } - out := new(ParentReference) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDR) DeepCopyInto(out *ServiceCIDR) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDR. -func (in *ServiceCIDR) DeepCopy() *ServiceCIDR { - if in == nil { - return nil - } - out := new(ServiceCIDR) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ServiceCIDR) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDRList) DeepCopyInto(out *ServiceCIDRList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ServiceCIDR, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDRList. -func (in *ServiceCIDRList) DeepCopy() *ServiceCIDRList { - if in == nil { - return nil - } - out := new(ServiceCIDRList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ServiceCIDRList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDRSpec) DeepCopyInto(out *ServiceCIDRSpec) { - *out = *in - if in.CIDRs != nil { - in, out := &in.CIDRs, &out.CIDRs - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDRSpec. -func (in *ServiceCIDRSpec) DeepCopy() *ServiceCIDRSpec { - if in == nil { - return nil - } - out := new(ServiceCIDRSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDRStatus) DeepCopyInto(out *ServiceCIDRStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDRStatus. -func (in *ServiceCIDRStatus) DeepCopy() *ServiceCIDRStatus { - if in == nil { - return nil - } - out := new(ServiceCIDRStatus) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go deleted file mode 100644 index 714e7b6253..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go +++ /dev/null @@ -1,94 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes 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. -*/ - -// Code generated by prerelease-lifecycle-gen. DO NOT EDIT. - -package v1alpha1 - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *IPAddress) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *IPAddress) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *IPAddress) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *IPAddressList) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *IPAddressList) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *IPAddressList) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *ServiceCIDR) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *ServiceCIDR) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *ServiceCIDR) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *ServiceCIDRList) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *ServiceCIDRList) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *ServiceCIDRList) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} diff --git a/vendor/k8s.io/api/resource/v1/devicetaint.go b/vendor/k8s.io/api/resource/v1/devicetaint.go new file mode 100644 index 0000000000..a5c2e20a6e --- /dev/null +++ b/vendor/k8s.io/api/resource/v1/devicetaint.go @@ -0,0 +1,35 @@ +/* +Copyright 2025 The Kubernetes 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 v1 + +import "fmt" + +var _ fmt.Stringer = DeviceTaint{} + +// String converts to a string in the format '=:', '=:', ':', or ''. +func (t DeviceTaint) String() string { + if len(t.Effect) == 0 { + if len(t.Value) == 0 { + return fmt.Sprintf("%v", t.Key) + } + return fmt.Sprintf("%v=%v:", t.Key, t.Value) + } + if len(t.Value) == 0 { + return fmt.Sprintf("%v:%v", t.Key, t.Effect) + } + return fmt.Sprintf("%v=%v:%v", t.Key, t.Value, t.Effect) +} diff --git a/vendor/k8s.io/api/networking/v1alpha1/doc.go b/vendor/k8s.io/api/resource/v1/doc.go similarity index 83% rename from vendor/k8s.io/api/networking/v1alpha1/doc.go rename to vendor/k8s.io/api/resource/v1/doc.go index 55264ae707..c94ca75ddc 100644 --- a/vendor/k8s.io/api/networking/v1alpha1/doc.go +++ b/vendor/k8s.io/api/resource/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2022 The Kubernetes Authors. +Copyright 2025 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,10 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ +// +k8s:openapi-gen=true // +k8s:deepcopy-gen=package // +k8s:protobuf-gen=package -// +k8s:openapi-gen=true // +k8s:prerelease-lifecycle-gen=true -// +groupName=networking.k8s.io +// +groupName=resource.k8s.io -package v1alpha1 +// Package v1 is the v1 version of the resource API. +package v1 diff --git a/vendor/k8s.io/api/resource/v1/generated.pb.go b/vendor/k8s.io/api/resource/v1/generated.pb.go new file mode 100644 index 0000000000..5695e2c7e0 --- /dev/null +++ b/vendor/k8s.io/api/resource/v1/generated.pb.go @@ -0,0 +1,12777 @@ +/* +Copyright The Kubernetes 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. +*/ + +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: k8s.io/api/resource/v1/generated.proto + +package v1 + +import ( + fmt "fmt" + + io "io" + + proto "github.com/gogo/protobuf/proto" + github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" + v11 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" + + k8s_io_apimachinery_pkg_types "k8s.io/apimachinery/pkg/types" +) + +// 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.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +func (m *AllocatedDeviceStatus) Reset() { *m = AllocatedDeviceStatus{} } +func (*AllocatedDeviceStatus) ProtoMessage() {} +func (*AllocatedDeviceStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{0} +} +func (m *AllocatedDeviceStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocatedDeviceStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AllocatedDeviceStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocatedDeviceStatus.Merge(m, src) +} +func (m *AllocatedDeviceStatus) XXX_Size() int { + return m.Size() +} +func (m *AllocatedDeviceStatus) XXX_DiscardUnknown() { + xxx_messageInfo_AllocatedDeviceStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocatedDeviceStatus proto.InternalMessageInfo + +func (m *AllocationResult) Reset() { *m = AllocationResult{} } +func (*AllocationResult) ProtoMessage() {} +func (*AllocationResult) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{1} +} +func (m *AllocationResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocationResult.Merge(m, src) +} +func (m *AllocationResult) XXX_Size() int { + return m.Size() +} +func (m *AllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_AllocationResult.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocationResult proto.InternalMessageInfo + +func (m *CELDeviceSelector) Reset() { *m = CELDeviceSelector{} } +func (*CELDeviceSelector) ProtoMessage() {} +func (*CELDeviceSelector) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{2} +} +func (m *CELDeviceSelector) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CELDeviceSelector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CELDeviceSelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_CELDeviceSelector.Merge(m, src) +} +func (m *CELDeviceSelector) XXX_Size() int { + return m.Size() +} +func (m *CELDeviceSelector) XXX_DiscardUnknown() { + xxx_messageInfo_CELDeviceSelector.DiscardUnknown(m) +} + +var xxx_messageInfo_CELDeviceSelector proto.InternalMessageInfo + +func (m *CapacityRequestPolicy) Reset() { *m = CapacityRequestPolicy{} } +func (*CapacityRequestPolicy) ProtoMessage() {} +func (*CapacityRequestPolicy) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{3} +} +func (m *CapacityRequestPolicy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CapacityRequestPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CapacityRequestPolicy) XXX_Merge(src proto.Message) { + xxx_messageInfo_CapacityRequestPolicy.Merge(m, src) +} +func (m *CapacityRequestPolicy) XXX_Size() int { + return m.Size() +} +func (m *CapacityRequestPolicy) XXX_DiscardUnknown() { + xxx_messageInfo_CapacityRequestPolicy.DiscardUnknown(m) +} + +var xxx_messageInfo_CapacityRequestPolicy proto.InternalMessageInfo + +func (m *CapacityRequestPolicyRange) Reset() { *m = CapacityRequestPolicyRange{} } +func (*CapacityRequestPolicyRange) ProtoMessage() {} +func (*CapacityRequestPolicyRange) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{4} +} +func (m *CapacityRequestPolicyRange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CapacityRequestPolicyRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CapacityRequestPolicyRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_CapacityRequestPolicyRange.Merge(m, src) +} +func (m *CapacityRequestPolicyRange) XXX_Size() int { + return m.Size() +} +func (m *CapacityRequestPolicyRange) XXX_DiscardUnknown() { + xxx_messageInfo_CapacityRequestPolicyRange.DiscardUnknown(m) +} + +var xxx_messageInfo_CapacityRequestPolicyRange proto.InternalMessageInfo + +func (m *CapacityRequirements) Reset() { *m = CapacityRequirements{} } +func (*CapacityRequirements) ProtoMessage() {} +func (*CapacityRequirements) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{5} +} +func (m *CapacityRequirements) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CapacityRequirements) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CapacityRequirements) XXX_Merge(src proto.Message) { + xxx_messageInfo_CapacityRequirements.Merge(m, src) +} +func (m *CapacityRequirements) XXX_Size() int { + return m.Size() +} +func (m *CapacityRequirements) XXX_DiscardUnknown() { + xxx_messageInfo_CapacityRequirements.DiscardUnknown(m) +} + +var xxx_messageInfo_CapacityRequirements proto.InternalMessageInfo + +func (m *Counter) Reset() { *m = Counter{} } +func (*Counter) ProtoMessage() {} +func (*Counter) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{6} +} +func (m *Counter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Counter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Counter.Merge(m, src) +} +func (m *Counter) XXX_Size() int { + return m.Size() +} +func (m *Counter) XXX_DiscardUnknown() { + xxx_messageInfo_Counter.DiscardUnknown(m) +} + +var xxx_messageInfo_Counter proto.InternalMessageInfo + +func (m *CounterSet) Reset() { *m = CounterSet{} } +func (*CounterSet) ProtoMessage() {} +func (*CounterSet) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{7} +} +func (m *CounterSet) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CounterSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CounterSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_CounterSet.Merge(m, src) +} +func (m *CounterSet) XXX_Size() int { + return m.Size() +} +func (m *CounterSet) XXX_DiscardUnknown() { + xxx_messageInfo_CounterSet.DiscardUnknown(m) +} + +var xxx_messageInfo_CounterSet proto.InternalMessageInfo + +func (m *Device) Reset() { *m = Device{} } +func (*Device) ProtoMessage() {} +func (*Device) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{8} +} +func (m *Device) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Device) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Device) XXX_Merge(src proto.Message) { + xxx_messageInfo_Device.Merge(m, src) +} +func (m *Device) XXX_Size() int { + return m.Size() +} +func (m *Device) XXX_DiscardUnknown() { + xxx_messageInfo_Device.DiscardUnknown(m) +} + +var xxx_messageInfo_Device proto.InternalMessageInfo + +func (m *DeviceAllocationConfiguration) Reset() { *m = DeviceAllocationConfiguration{} } +func (*DeviceAllocationConfiguration) ProtoMessage() {} +func (*DeviceAllocationConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{9} +} +func (m *DeviceAllocationConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceAllocationConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceAllocationConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAllocationConfiguration.Merge(m, src) +} +func (m *DeviceAllocationConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceAllocationConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAllocationConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceAllocationConfiguration proto.InternalMessageInfo + +func (m *DeviceAllocationResult) Reset() { *m = DeviceAllocationResult{} } +func (*DeviceAllocationResult) ProtoMessage() {} +func (*DeviceAllocationResult) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{10} +} +func (m *DeviceAllocationResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceAllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAllocationResult.Merge(m, src) +} +func (m *DeviceAllocationResult) XXX_Size() int { + return m.Size() +} +func (m *DeviceAllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAllocationResult.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceAllocationResult proto.InternalMessageInfo + +func (m *DeviceAttribute) Reset() { *m = DeviceAttribute{} } +func (*DeviceAttribute) ProtoMessage() {} +func (*DeviceAttribute) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{11} +} +func (m *DeviceAttribute) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceAttribute) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAttribute.Merge(m, src) +} +func (m *DeviceAttribute) XXX_Size() int { + return m.Size() +} +func (m *DeviceAttribute) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAttribute.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceAttribute proto.InternalMessageInfo + +func (m *DeviceCapacity) Reset() { *m = DeviceCapacity{} } +func (*DeviceCapacity) ProtoMessage() {} +func (*DeviceCapacity) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{12} +} +func (m *DeviceCapacity) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceCapacity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceCapacity) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceCapacity.Merge(m, src) +} +func (m *DeviceCapacity) XXX_Size() int { + return m.Size() +} +func (m *DeviceCapacity) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceCapacity.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceCapacity proto.InternalMessageInfo + +func (m *DeviceClaim) Reset() { *m = DeviceClaim{} } +func (*DeviceClaim) ProtoMessage() {} +func (*DeviceClaim) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{13} +} +func (m *DeviceClaim) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClaim) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClaim) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClaim.Merge(m, src) +} +func (m *DeviceClaim) XXX_Size() int { + return m.Size() +} +func (m *DeviceClaim) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClaim.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClaim proto.InternalMessageInfo + +func (m *DeviceClaimConfiguration) Reset() { *m = DeviceClaimConfiguration{} } +func (*DeviceClaimConfiguration) ProtoMessage() {} +func (*DeviceClaimConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{14} +} +func (m *DeviceClaimConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClaimConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClaimConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClaimConfiguration.Merge(m, src) +} +func (m *DeviceClaimConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceClaimConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClaimConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClaimConfiguration proto.InternalMessageInfo + +func (m *DeviceClass) Reset() { *m = DeviceClass{} } +func (*DeviceClass) ProtoMessage() {} +func (*DeviceClass) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{15} +} +func (m *DeviceClass) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClass) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClass) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClass.Merge(m, src) +} +func (m *DeviceClass) XXX_Size() int { + return m.Size() +} +func (m *DeviceClass) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClass.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClass proto.InternalMessageInfo + +func (m *DeviceClassConfiguration) Reset() { *m = DeviceClassConfiguration{} } +func (*DeviceClassConfiguration) ProtoMessage() {} +func (*DeviceClassConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{16} +} +func (m *DeviceClassConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClassConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClassConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassConfiguration.Merge(m, src) +} +func (m *DeviceClassConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceClassConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClassConfiguration proto.InternalMessageInfo + +func (m *DeviceClassList) Reset() { *m = DeviceClassList{} } +func (*DeviceClassList) ProtoMessage() {} +func (*DeviceClassList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{17} +} +func (m *DeviceClassList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClassList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClassList) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassList.Merge(m, src) +} +func (m *DeviceClassList) XXX_Size() int { + return m.Size() +} +func (m *DeviceClassList) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassList.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClassList proto.InternalMessageInfo + +func (m *DeviceClassSpec) Reset() { *m = DeviceClassSpec{} } +func (*DeviceClassSpec) ProtoMessage() {} +func (*DeviceClassSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{18} +} +func (m *DeviceClassSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClassSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClassSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassSpec.Merge(m, src) +} +func (m *DeviceClassSpec) XXX_Size() int { + return m.Size() +} +func (m *DeviceClassSpec) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClassSpec proto.InternalMessageInfo + +func (m *DeviceConfiguration) Reset() { *m = DeviceConfiguration{} } +func (*DeviceConfiguration) ProtoMessage() {} +func (*DeviceConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{19} +} +func (m *DeviceConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceConfiguration.Merge(m, src) +} +func (m *DeviceConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceConfiguration proto.InternalMessageInfo + +func (m *DeviceConstraint) Reset() { *m = DeviceConstraint{} } +func (*DeviceConstraint) ProtoMessage() {} +func (*DeviceConstraint) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{20} +} +func (m *DeviceConstraint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceConstraint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceConstraint) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceConstraint.Merge(m, src) +} +func (m *DeviceConstraint) XXX_Size() int { + return m.Size() +} +func (m *DeviceConstraint) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceConstraint.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceConstraint proto.InternalMessageInfo + +func (m *DeviceCounterConsumption) Reset() { *m = DeviceCounterConsumption{} } +func (*DeviceCounterConsumption) ProtoMessage() {} +func (*DeviceCounterConsumption) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{21} +} +func (m *DeviceCounterConsumption) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceCounterConsumption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceCounterConsumption) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceCounterConsumption.Merge(m, src) +} +func (m *DeviceCounterConsumption) XXX_Size() int { + return m.Size() +} +func (m *DeviceCounterConsumption) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceCounterConsumption.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceCounterConsumption proto.InternalMessageInfo + +func (m *DeviceRequest) Reset() { *m = DeviceRequest{} } +func (*DeviceRequest) ProtoMessage() {} +func (*DeviceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{22} +} +func (m *DeviceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceRequest.Merge(m, src) +} +func (m *DeviceRequest) XXX_Size() int { + return m.Size() +} +func (m *DeviceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceRequest proto.InternalMessageInfo + +func (m *DeviceRequestAllocationResult) Reset() { *m = DeviceRequestAllocationResult{} } +func (*DeviceRequestAllocationResult) ProtoMessage() {} +func (*DeviceRequestAllocationResult) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{23} +} +func (m *DeviceRequestAllocationResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceRequestAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceRequestAllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceRequestAllocationResult.Merge(m, src) +} +func (m *DeviceRequestAllocationResult) XXX_Size() int { + return m.Size() +} +func (m *DeviceRequestAllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceRequestAllocationResult.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceRequestAllocationResult proto.InternalMessageInfo + +func (m *DeviceSelector) Reset() { *m = DeviceSelector{} } +func (*DeviceSelector) ProtoMessage() {} +func (*DeviceSelector) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{24} +} +func (m *DeviceSelector) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceSelector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceSelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceSelector.Merge(m, src) +} +func (m *DeviceSelector) XXX_Size() int { + return m.Size() +} +func (m *DeviceSelector) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceSelector.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceSelector proto.InternalMessageInfo + +func (m *DeviceSubRequest) Reset() { *m = DeviceSubRequest{} } +func (*DeviceSubRequest) ProtoMessage() {} +func (*DeviceSubRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{25} +} +func (m *DeviceSubRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceSubRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceSubRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceSubRequest.Merge(m, src) +} +func (m *DeviceSubRequest) XXX_Size() int { + return m.Size() +} +func (m *DeviceSubRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceSubRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceSubRequest proto.InternalMessageInfo + +func (m *DeviceTaint) Reset() { *m = DeviceTaint{} } +func (*DeviceTaint) ProtoMessage() {} +func (*DeviceTaint) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{26} +} +func (m *DeviceTaint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceTaint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceTaint) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceTaint.Merge(m, src) +} +func (m *DeviceTaint) XXX_Size() int { + return m.Size() +} +func (m *DeviceTaint) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceTaint.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceTaint proto.InternalMessageInfo + +func (m *DeviceToleration) Reset() { *m = DeviceToleration{} } +func (*DeviceToleration) ProtoMessage() {} +func (*DeviceToleration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{27} +} +func (m *DeviceToleration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceToleration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceToleration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceToleration.Merge(m, src) +} +func (m *DeviceToleration) XXX_Size() int { + return m.Size() +} +func (m *DeviceToleration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceToleration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceToleration proto.InternalMessageInfo + +func (m *ExactDeviceRequest) Reset() { *m = ExactDeviceRequest{} } +func (*ExactDeviceRequest) ProtoMessage() {} +func (*ExactDeviceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{28} +} +func (m *ExactDeviceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExactDeviceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ExactDeviceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExactDeviceRequest.Merge(m, src) +} +func (m *ExactDeviceRequest) XXX_Size() int { + return m.Size() +} +func (m *ExactDeviceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ExactDeviceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ExactDeviceRequest proto.InternalMessageInfo + +func (m *NetworkDeviceData) Reset() { *m = NetworkDeviceData{} } +func (*NetworkDeviceData) ProtoMessage() {} +func (*NetworkDeviceData) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{29} +} +func (m *NetworkDeviceData) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NetworkDeviceData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *NetworkDeviceData) XXX_Merge(src proto.Message) { + xxx_messageInfo_NetworkDeviceData.Merge(m, src) +} +func (m *NetworkDeviceData) XXX_Size() int { + return m.Size() +} +func (m *NetworkDeviceData) XXX_DiscardUnknown() { + xxx_messageInfo_NetworkDeviceData.DiscardUnknown(m) +} + +var xxx_messageInfo_NetworkDeviceData proto.InternalMessageInfo + +func (m *OpaqueDeviceConfiguration) Reset() { *m = OpaqueDeviceConfiguration{} } +func (*OpaqueDeviceConfiguration) ProtoMessage() {} +func (*OpaqueDeviceConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{30} +} +func (m *OpaqueDeviceConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *OpaqueDeviceConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *OpaqueDeviceConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_OpaqueDeviceConfiguration.Merge(m, src) +} +func (m *OpaqueDeviceConfiguration) XXX_Size() int { + return m.Size() +} +func (m *OpaqueDeviceConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_OpaqueDeviceConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_OpaqueDeviceConfiguration proto.InternalMessageInfo + +func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } +func (*ResourceClaim) ProtoMessage() {} +func (*ResourceClaim) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{31} +} +func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaim) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaim) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaim.Merge(m, src) +} +func (m *ResourceClaim) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaim) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaim.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo + +func (m *ResourceClaimConsumerReference) Reset() { *m = ResourceClaimConsumerReference{} } +func (*ResourceClaimConsumerReference) ProtoMessage() {} +func (*ResourceClaimConsumerReference) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{32} +} +func (m *ResourceClaimConsumerReference) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimConsumerReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimConsumerReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimConsumerReference.Merge(m, src) +} +func (m *ResourceClaimConsumerReference) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimConsumerReference) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimConsumerReference.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimConsumerReference proto.InternalMessageInfo + +func (m *ResourceClaimList) Reset() { *m = ResourceClaimList{} } +func (*ResourceClaimList) ProtoMessage() {} +func (*ResourceClaimList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{33} +} +func (m *ResourceClaimList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimList.Merge(m, src) +} +func (m *ResourceClaimList) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimList) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimList.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimList proto.InternalMessageInfo + +func (m *ResourceClaimSpec) Reset() { *m = ResourceClaimSpec{} } +func (*ResourceClaimSpec) ProtoMessage() {} +func (*ResourceClaimSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{34} +} +func (m *ResourceClaimSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimSpec.Merge(m, src) +} +func (m *ResourceClaimSpec) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimSpec proto.InternalMessageInfo + +func (m *ResourceClaimStatus) Reset() { *m = ResourceClaimStatus{} } +func (*ResourceClaimStatus) ProtoMessage() {} +func (*ResourceClaimStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{35} +} +func (m *ResourceClaimStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimStatus.Merge(m, src) +} +func (m *ResourceClaimStatus) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimStatus) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimStatus proto.InternalMessageInfo + +func (m *ResourceClaimTemplate) Reset() { *m = ResourceClaimTemplate{} } +func (*ResourceClaimTemplate) ProtoMessage() {} +func (*ResourceClaimTemplate) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{36} +} +func (m *ResourceClaimTemplate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimTemplate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimTemplate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimTemplate.Merge(m, src) +} +func (m *ResourceClaimTemplate) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimTemplate) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimTemplate.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimTemplate proto.InternalMessageInfo + +func (m *ResourceClaimTemplateList) Reset() { *m = ResourceClaimTemplateList{} } +func (*ResourceClaimTemplateList) ProtoMessage() {} +func (*ResourceClaimTemplateList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{37} +} +func (m *ResourceClaimTemplateList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimTemplateList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimTemplateList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimTemplateList.Merge(m, src) +} +func (m *ResourceClaimTemplateList) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimTemplateList) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimTemplateList.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimTemplateList proto.InternalMessageInfo + +func (m *ResourceClaimTemplateSpec) Reset() { *m = ResourceClaimTemplateSpec{} } +func (*ResourceClaimTemplateSpec) ProtoMessage() {} +func (*ResourceClaimTemplateSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{38} +} +func (m *ResourceClaimTemplateSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimTemplateSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimTemplateSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimTemplateSpec.Merge(m, src) +} +func (m *ResourceClaimTemplateSpec) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimTemplateSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimTemplateSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimTemplateSpec proto.InternalMessageInfo + +func (m *ResourcePool) Reset() { *m = ResourcePool{} } +func (*ResourcePool) ProtoMessage() {} +func (*ResourcePool) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{39} +} +func (m *ResourcePool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourcePool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourcePool) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourcePool.Merge(m, src) +} +func (m *ResourcePool) XXX_Size() int { + return m.Size() +} +func (m *ResourcePool) XXX_DiscardUnknown() { + xxx_messageInfo_ResourcePool.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourcePool proto.InternalMessageInfo + +func (m *ResourceSlice) Reset() { *m = ResourceSlice{} } +func (*ResourceSlice) ProtoMessage() {} +func (*ResourceSlice) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{40} +} +func (m *ResourceSlice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceSlice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceSlice) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceSlice.Merge(m, src) +} +func (m *ResourceSlice) XXX_Size() int { + return m.Size() +} +func (m *ResourceSlice) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceSlice.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceSlice proto.InternalMessageInfo + +func (m *ResourceSliceList) Reset() { *m = ResourceSliceList{} } +func (*ResourceSliceList) ProtoMessage() {} +func (*ResourceSliceList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{41} +} +func (m *ResourceSliceList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceSliceList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceSliceList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceSliceList.Merge(m, src) +} +func (m *ResourceSliceList) XXX_Size() int { + return m.Size() +} +func (m *ResourceSliceList) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceSliceList.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceSliceList proto.InternalMessageInfo + +func (m *ResourceSliceSpec) Reset() { *m = ResourceSliceSpec{} } +func (*ResourceSliceSpec) ProtoMessage() {} +func (*ResourceSliceSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{42} +} +func (m *ResourceSliceSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceSliceSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceSliceSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceSliceSpec.Merge(m, src) +} +func (m *ResourceSliceSpec) XXX_Size() int { + return m.Size() +} +func (m *ResourceSliceSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceSliceSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceSliceSpec proto.InternalMessageInfo + +func init() { + proto.RegisterType((*AllocatedDeviceStatus)(nil), "k8s.io.api.resource.v1.AllocatedDeviceStatus") + proto.RegisterType((*AllocationResult)(nil), "k8s.io.api.resource.v1.AllocationResult") + proto.RegisterType((*CELDeviceSelector)(nil), "k8s.io.api.resource.v1.CELDeviceSelector") + proto.RegisterType((*CapacityRequestPolicy)(nil), "k8s.io.api.resource.v1.CapacityRequestPolicy") + proto.RegisterType((*CapacityRequestPolicyRange)(nil), "k8s.io.api.resource.v1.CapacityRequestPolicyRange") + proto.RegisterType((*CapacityRequirements)(nil), "k8s.io.api.resource.v1.CapacityRequirements") + proto.RegisterMapType((map[QualifiedName]resource.Quantity)(nil), "k8s.io.api.resource.v1.CapacityRequirements.RequestsEntry") + proto.RegisterType((*Counter)(nil), "k8s.io.api.resource.v1.Counter") + proto.RegisterType((*CounterSet)(nil), "k8s.io.api.resource.v1.CounterSet") + proto.RegisterMapType((map[string]Counter)(nil), "k8s.io.api.resource.v1.CounterSet.CountersEntry") + proto.RegisterType((*Device)(nil), "k8s.io.api.resource.v1.Device") + proto.RegisterMapType((map[QualifiedName]DeviceAttribute)(nil), "k8s.io.api.resource.v1.Device.AttributesEntry") + proto.RegisterMapType((map[QualifiedName]DeviceCapacity)(nil), "k8s.io.api.resource.v1.Device.CapacityEntry") + proto.RegisterType((*DeviceAllocationConfiguration)(nil), "k8s.io.api.resource.v1.DeviceAllocationConfiguration") + proto.RegisterType((*DeviceAllocationResult)(nil), "k8s.io.api.resource.v1.DeviceAllocationResult") + proto.RegisterType((*DeviceAttribute)(nil), "k8s.io.api.resource.v1.DeviceAttribute") + proto.RegisterType((*DeviceCapacity)(nil), "k8s.io.api.resource.v1.DeviceCapacity") + proto.RegisterType((*DeviceClaim)(nil), "k8s.io.api.resource.v1.DeviceClaim") + proto.RegisterType((*DeviceClaimConfiguration)(nil), "k8s.io.api.resource.v1.DeviceClaimConfiguration") + proto.RegisterType((*DeviceClass)(nil), "k8s.io.api.resource.v1.DeviceClass") + proto.RegisterType((*DeviceClassConfiguration)(nil), "k8s.io.api.resource.v1.DeviceClassConfiguration") + proto.RegisterType((*DeviceClassList)(nil), "k8s.io.api.resource.v1.DeviceClassList") + proto.RegisterType((*DeviceClassSpec)(nil), "k8s.io.api.resource.v1.DeviceClassSpec") + proto.RegisterType((*DeviceConfiguration)(nil), "k8s.io.api.resource.v1.DeviceConfiguration") + proto.RegisterType((*DeviceConstraint)(nil), "k8s.io.api.resource.v1.DeviceConstraint") + proto.RegisterType((*DeviceCounterConsumption)(nil), "k8s.io.api.resource.v1.DeviceCounterConsumption") + proto.RegisterMapType((map[string]Counter)(nil), "k8s.io.api.resource.v1.DeviceCounterConsumption.CountersEntry") + proto.RegisterType((*DeviceRequest)(nil), "k8s.io.api.resource.v1.DeviceRequest") + proto.RegisterType((*DeviceRequestAllocationResult)(nil), "k8s.io.api.resource.v1.DeviceRequestAllocationResult") + proto.RegisterMapType((map[QualifiedName]resource.Quantity)(nil), "k8s.io.api.resource.v1.DeviceRequestAllocationResult.ConsumedCapacityEntry") + proto.RegisterType((*DeviceSelector)(nil), "k8s.io.api.resource.v1.DeviceSelector") + proto.RegisterType((*DeviceSubRequest)(nil), "k8s.io.api.resource.v1.DeviceSubRequest") + proto.RegisterType((*DeviceTaint)(nil), "k8s.io.api.resource.v1.DeviceTaint") + proto.RegisterType((*DeviceToleration)(nil), "k8s.io.api.resource.v1.DeviceToleration") + proto.RegisterType((*ExactDeviceRequest)(nil), "k8s.io.api.resource.v1.ExactDeviceRequest") + proto.RegisterType((*NetworkDeviceData)(nil), "k8s.io.api.resource.v1.NetworkDeviceData") + proto.RegisterType((*OpaqueDeviceConfiguration)(nil), "k8s.io.api.resource.v1.OpaqueDeviceConfiguration") + proto.RegisterType((*ResourceClaim)(nil), "k8s.io.api.resource.v1.ResourceClaim") + proto.RegisterType((*ResourceClaimConsumerReference)(nil), "k8s.io.api.resource.v1.ResourceClaimConsumerReference") + proto.RegisterType((*ResourceClaimList)(nil), "k8s.io.api.resource.v1.ResourceClaimList") + proto.RegisterType((*ResourceClaimSpec)(nil), "k8s.io.api.resource.v1.ResourceClaimSpec") + proto.RegisterType((*ResourceClaimStatus)(nil), "k8s.io.api.resource.v1.ResourceClaimStatus") + proto.RegisterType((*ResourceClaimTemplate)(nil), "k8s.io.api.resource.v1.ResourceClaimTemplate") + proto.RegisterType((*ResourceClaimTemplateList)(nil), "k8s.io.api.resource.v1.ResourceClaimTemplateList") + proto.RegisterType((*ResourceClaimTemplateSpec)(nil), "k8s.io.api.resource.v1.ResourceClaimTemplateSpec") + proto.RegisterType((*ResourcePool)(nil), "k8s.io.api.resource.v1.ResourcePool") + proto.RegisterType((*ResourceSlice)(nil), "k8s.io.api.resource.v1.ResourceSlice") + proto.RegisterType((*ResourceSliceList)(nil), "k8s.io.api.resource.v1.ResourceSliceList") + proto.RegisterType((*ResourceSliceSpec)(nil), "k8s.io.api.resource.v1.ResourceSliceSpec") +} + +func init() { + proto.RegisterFile("k8s.io/api/resource/v1/generated.proto", fileDescriptor_f4fc532aec02d243) +} + +var fileDescriptor_f4fc532aec02d243 = []byte{ + // 3028 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x6c, 0x24, 0x47, + 0xf5, 0x77, 0xcf, 0xcc, 0x8e, 0xc7, 0x6f, 0x6c, 0xaf, 0x5d, 0xbb, 0xeb, 0x4c, 0xfc, 0xff, 0xc7, + 0xe3, 0xf4, 0x92, 0xc4, 0x49, 0x76, 0xc7, 0x6b, 0x8b, 0x44, 0x51, 0x12, 0x10, 0x1e, 0xdb, 0x9b, + 0x38, 0xfb, 0x11, 0xa7, 0xc6, 0x6b, 0x36, 0x28, 0x84, 0xb4, 0x7b, 0xca, 0x76, 0xe3, 0x9e, 0xee, + 0x49, 0x77, 0x8d, 0x77, 0xcd, 0x29, 0xe2, 0x00, 0x57, 0x04, 0x12, 0x02, 0x24, 0x24, 0x94, 0x03, + 0x12, 0x17, 0x84, 0x38, 0x11, 0x04, 0x28, 0xc7, 0x08, 0x29, 0x28, 0x17, 0xa4, 0x20, 0xa1, 0x81, + 0x1d, 0x4e, 0x48, 0x08, 0x89, 0x0b, 0x07, 0x1f, 0x10, 0xaa, 0xea, 0xaa, 0xfe, 0x9a, 0x6e, 0x4f, + 0xdb, 0x59, 0xaf, 0x96, 0x9b, 0xe7, 0xd5, 0x7b, 0xbf, 0xaa, 0x7a, 0xf5, 0xbe, 0xea, 0x75, 0x19, + 0x9e, 0xdc, 0x7b, 0xc1, 0xad, 0x19, 0xf6, 0xbc, 0xd6, 0x36, 0xe6, 0x1d, 0xe2, 0xda, 0x1d, 0x47, + 0x27, 0xf3, 0xfb, 0x0b, 0xf3, 0x3b, 0xc4, 0x22, 0x8e, 0x46, 0x49, 0xb3, 0xd6, 0x76, 0x6c, 0x6a, + 0xa3, 0x29, 0x8f, 0xaf, 0xa6, 0xb5, 0x8d, 0x9a, 0xe4, 0xab, 0xed, 0x2f, 0x4c, 0x5f, 0xde, 0x31, + 0xe8, 0x6e, 0x67, 0xab, 0xa6, 0xdb, 0xad, 0xf9, 0x1d, 0x7b, 0xc7, 0x9e, 0xe7, 0xec, 0x5b, 0x9d, + 0x6d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0x79, 0x30, 0xd3, 0x6a, 0x68, 0x3a, 0xdd, 0x76, 0x92, 0xa6, + 0x9a, 0xfe, 0x7c, 0xc0, 0xd3, 0xd2, 0xf4, 0x5d, 0xc3, 0x22, 0xce, 0xc1, 0x7c, 0x7b, 0x6f, 0x27, + 0xba, 0xc6, 0xe3, 0x48, 0xb9, 0xf3, 0x2d, 0x42, 0xb5, 0xa4, 0xb9, 0xe6, 0xd3, 0xa4, 0x9c, 0x8e, + 0x45, 0x8d, 0x56, 0xff, 0x34, 0xcf, 0x0f, 0x12, 0x70, 0xf5, 0x5d, 0xd2, 0xd2, 0xe2, 0x72, 0xea, + 0x87, 0x79, 0xb8, 0xb0, 0x64, 0x9a, 0xb6, 0xce, 0x68, 0x2b, 0x64, 0xdf, 0xd0, 0x49, 0x83, 0x6a, + 0xb4, 0xe3, 0xa2, 0x27, 0xa1, 0xd8, 0x74, 0x8c, 0x7d, 0xe2, 0x54, 0x94, 0x59, 0x65, 0x6e, 0xa4, + 0x3e, 0xfe, 0x51, 0xb7, 0x3a, 0xd4, 0xeb, 0x56, 0x8b, 0x2b, 0x9c, 0x8a, 0xc5, 0x28, 0x9a, 0x85, + 0x42, 0xdb, 0xb6, 0xcd, 0x4a, 0x8e, 0x73, 0x8d, 0x0a, 0xae, 0xc2, 0xba, 0x6d, 0x9b, 0x98, 0x8f, + 0x70, 0x24, 0x8e, 0x5c, 0xc9, 0xc7, 0x90, 0x38, 0x15, 0x8b, 0x51, 0xf4, 0x04, 0x0c, 0xbb, 0xbb, + 0x9a, 0x43, 0xd6, 0x56, 0x2a, 0xc3, 0x9c, 0xb1, 0xdc, 0xeb, 0x56, 0x87, 0x1b, 0x1e, 0x09, 0xcb, + 0x31, 0xa4, 0x03, 0xe8, 0xb6, 0xd5, 0x34, 0xa8, 0x61, 0x5b, 0x6e, 0xa5, 0x30, 0x9b, 0x9f, 0x2b, + 0x2f, 0xce, 0xd7, 0x02, 0x3b, 0xf0, 0xf7, 0x5f, 0x6b, 0xef, 0xed, 0x30, 0x82, 0x5b, 0x63, 0x6a, + 0xae, 0xed, 0x2f, 0xd4, 0x96, 0xa5, 0x5c, 0x1d, 0x89, 0x35, 0x80, 0x4f, 0x72, 0x71, 0x08, 0x16, + 0x5d, 0x83, 0x42, 0x53, 0xa3, 0x5a, 0xe5, 0xcc, 0xac, 0x32, 0x57, 0x5e, 0xbc, 0x9c, 0x0a, 0x2f, + 0xd4, 0x5b, 0xc3, 0xda, 0x9d, 0xd5, 0xbb, 0x94, 0x58, 0x2e, 0x03, 0x2f, 0x31, 0x05, 0xac, 0x68, + 0x54, 0xc3, 0x1c, 0x04, 0xbd, 0x05, 0x65, 0x8b, 0xd0, 0x3b, 0xb6, 0xb3, 0xc7, 0x88, 0x95, 0x22, + 0xc7, 0x7c, 0xba, 0x96, 0x6c, 0xba, 0xb5, 0x9b, 0x82, 0x95, 0x2b, 0x85, 0x09, 0xd4, 0xcf, 0xf6, + 0xba, 0xd5, 0xf2, 0xcd, 0x00, 0x01, 0x87, 0xe1, 0xd4, 0xdf, 0xe4, 0x60, 0x42, 0x1c, 0xa1, 0x61, + 0x5b, 0x98, 0xb8, 0x1d, 0x93, 0xa2, 0x37, 0x61, 0xd8, 0xd3, 0xaa, 0xcb, 0x8f, 0xaf, 0xbc, 0x58, + 0x4b, 0x9b, 0xce, 0x9b, 0x27, 0x0e, 0x50, 0x3f, 0x2b, 0x14, 0x34, 0xec, 0x8d, 0xbb, 0x58, 0xe2, + 0xa1, 0x4d, 0x18, 0xb5, 0xec, 0x26, 0x69, 0x10, 0x93, 0xe8, 0xd4, 0x76, 0xf8, 0xa1, 0x96, 0x17, + 0x67, 0xc3, 0xf8, 0xcc, 0x85, 0xf8, 0x56, 0x42, 0x7c, 0xf5, 0x89, 0x5e, 0xb7, 0x3a, 0x1a, 0xa6, + 0xe0, 0x08, 0x0e, 0xea, 0xc0, 0x39, 0xcd, 0x5f, 0xc5, 0x86, 0xd1, 0x22, 0x2e, 0xd5, 0x5a, 0x6d, + 0x71, 0x02, 0xcf, 0x64, 0x3b, 0x60, 0x26, 0x56, 0x7f, 0xa4, 0xd7, 0xad, 0x9e, 0x5b, 0xea, 0x87, + 0xc2, 0x49, 0xf8, 0xea, 0x2b, 0x30, 0xb9, 0xbc, 0x7a, 0x5d, 0x98, 0xbe, 0x5c, 0xcb, 0x22, 0x00, + 0xb9, 0xdb, 0x76, 0x88, 0xcb, 0xce, 0x53, 0x38, 0x80, 0x6f, 0x32, 0xab, 0xfe, 0x08, 0x0e, 0x71, + 0xa9, 0x1f, 0xe4, 0xe0, 0xc2, 0xb2, 0xd6, 0xd6, 0x74, 0x83, 0x1e, 0x60, 0xf2, 0x6e, 0x87, 0xb8, + 0x74, 0xdd, 0x36, 0x0d, 0xfd, 0x00, 0xdd, 0x62, 0x87, 0xb1, 0xad, 0x75, 0x4c, 0x9a, 0x70, 0x18, + 0x7d, 0xbb, 0x09, 0x4e, 0xe7, 0x8d, 0x8e, 0x66, 0x51, 0x83, 0x1e, 0x78, 0x8e, 0xb0, 0xe2, 0x41, + 0x60, 0x89, 0x85, 0x08, 0x94, 0xf7, 0x35, 0xd3, 0x68, 0x6e, 0x6a, 0x66, 0x87, 0xb8, 0x95, 0x3c, + 0xf7, 0x84, 0xe3, 0x42, 0x9f, 0x13, 0xbb, 0x2a, 0x6f, 0x06, 0x50, 0x38, 0x8c, 0x8b, 0xb6, 0x00, + 0xf8, 0x4f, 0xac, 0x59, 0x3b, 0xa4, 0x52, 0xe0, 0x1b, 0x58, 0x4c, 0xb3, 0xa6, 0x44, 0x05, 0x70, + 0xc9, 0xfa, 0x38, 0xd3, 0xdd, 0xa6, 0x8f, 0x84, 0x43, 0xa8, 0xea, 0x7b, 0x39, 0x98, 0x4e, 0x17, + 0x45, 0x6b, 0x90, 0x6f, 0x19, 0xd6, 0x09, 0x95, 0x37, 0xdc, 0xeb, 0x56, 0xf3, 0x37, 0x0c, 0x0b, + 0x33, 0x0c, 0x0e, 0xa5, 0xdd, 0xe5, 0xd1, 0xea, 0xa4, 0x50, 0xda, 0x5d, 0xcc, 0x30, 0xd0, 0x75, + 0x28, 0xb8, 0x94, 0xb4, 0x85, 0x03, 0x1c, 0x17, 0x8b, 0x07, 0x89, 0x06, 0x25, 0x6d, 0xcc, 0x51, + 0xd4, 0xff, 0x28, 0x70, 0x3e, 0xac, 0x02, 0xc3, 0x21, 0x2d, 0x62, 0x51, 0x17, 0x1d, 0x40, 0xc9, + 0xf1, 0x54, 0xc2, 0x7c, 0x99, 0x9d, 0xf1, 0x8b, 0x59, 0xb4, 0x2f, 0xe5, 0x6b, 0x42, 0x9f, 0xee, + 0xaa, 0x45, 0x9d, 0x83, 0xfa, 0xe3, 0xe2, 0xbc, 0x4b, 0x92, 0xfc, 0xcd, 0xbf, 0x54, 0xc7, 0xde, + 0xe8, 0x68, 0xa6, 0xb1, 0x6d, 0x90, 0xe6, 0x4d, 0xad, 0x45, 0xb0, 0x3f, 0xdd, 0xf4, 0x1e, 0x8c, + 0x45, 0xa4, 0xd1, 0x04, 0xe4, 0xf7, 0xc8, 0x81, 0xe7, 0x10, 0x98, 0xfd, 0x89, 0x56, 0xe0, 0xcc, + 0x3e, 0xb3, 0x93, 0x93, 0x69, 0x14, 0x7b, 0xc2, 0x2f, 0xe6, 0x5e, 0x50, 0xd4, 0xb7, 0x61, 0x78, + 0xd9, 0xee, 0x58, 0x94, 0x38, 0xa8, 0x21, 0x41, 0x4f, 0x76, 0xe2, 0x63, 0x62, 0x8f, 0x67, 0xb8, + 0x05, 0x8b, 0x39, 0xd4, 0x7f, 0x28, 0x00, 0x62, 0x82, 0x06, 0xa1, 0x2c, 0x6f, 0x59, 0x5a, 0x8b, + 0x08, 0xe7, 0xf6, 0xf3, 0x16, 0xd7, 0x00, 0x1f, 0x41, 0x6f, 0x43, 0x49, 0xf7, 0xf8, 0xdd, 0x4a, + 0x8e, 0x2b, 0xfe, 0x4a, 0xaa, 0xe2, 0x7d, 0x5c, 0xf9, 0xa7, 0x50, 0xf7, 0x84, 0x54, 0xb7, 0x24, + 0x63, 0x1f, 0x73, 0xfa, 0x2d, 0x18, 0x8b, 0x30, 0x27, 0x68, 0xf7, 0xb9, 0xa8, 0x76, 0xab, 0x03, + 0xe6, 0x0f, 0xab, 0xf3, 0xdf, 0x25, 0x10, 0x09, 0x36, 0xc3, 0x56, 0x5d, 0x00, 0x8d, 0x52, 0xc7, + 0xd8, 0xea, 0x50, 0x22, 0x37, 0x3b, 0x20, 0x63, 0xd4, 0x96, 0x7c, 0x01, 0x6f, 0xab, 0x17, 0x65, + 0x7c, 0x0c, 0x06, 0xfa, 0x6d, 0x2b, 0x34, 0x0d, 0xda, 0x83, 0x92, 0x2e, 0x0c, 0x56, 0x04, 0xaf, + 0x4b, 0x03, 0xa6, 0x94, 0xf6, 0x1d, 0x33, 0x65, 0x49, 0x4e, 0x30, 0x65, 0x39, 0x01, 0xda, 0x87, + 0x09, 0xdd, 0xb6, 0xdc, 0x4e, 0x8b, 0xb8, 0x52, 0xe9, 0xa2, 0x76, 0xb8, 0x72, 0xf4, 0xa4, 0x82, + 0x7b, 0x99, 0x0b, 0xb7, 0x79, 0xf1, 0x50, 0x11, 0x13, 0x4f, 0x2c, 0xc7, 0x10, 0x71, 0xdf, 0x1c, + 0x68, 0x0e, 0x4a, 0x2c, 0xcb, 0xb1, 0xd5, 0xf0, 0x54, 0x36, 0x52, 0x1f, 0x65, 0x4b, 0xbe, 0x29, + 0x68, 0xd8, 0x1f, 0xed, 0xcb, 0xab, 0xc5, 0xfb, 0x94, 0x57, 0xe7, 0xa0, 0xa4, 0x99, 0x26, 0x63, + 0x70, 0x79, 0x5d, 0x55, 0xf2, 0x56, 0xb0, 0x24, 0x68, 0xd8, 0x1f, 0x45, 0xd7, 0xa0, 0x48, 0x35, + 0xc3, 0xa2, 0x6e, 0xa5, 0xc4, 0x35, 0x73, 0xf1, 0x68, 0xcd, 0x6c, 0x30, 0xde, 0xa0, 0x9a, 0xe3, + 0x3f, 0x5d, 0x2c, 0x20, 0xd0, 0x02, 0x94, 0xb7, 0x0c, 0xab, 0xe9, 0x6e, 0xd8, 0x0c, 0xbc, 0x32, + 0xc2, 0x67, 0xe6, 0x95, 0x4c, 0x3d, 0x20, 0xe3, 0x30, 0x0f, 0x5a, 0x86, 0x49, 0xf6, 0xd3, 0xb0, + 0x76, 0x82, 0xaa, 0xac, 0x02, 0xb3, 0xf9, 0xb9, 0x91, 0xfa, 0x85, 0x5e, 0xb7, 0x3a, 0x59, 0x8f, + 0x0f, 0xe2, 0x7e, 0x7e, 0x74, 0x1b, 0x2a, 0x82, 0x78, 0x55, 0x33, 0xcc, 0x8e, 0x43, 0x42, 0x58, + 0x65, 0x8e, 0xf5, 0xff, 0xbd, 0x6e, 0xb5, 0x52, 0x4f, 0xe1, 0xc1, 0xa9, 0xd2, 0x0c, 0x99, 0x15, + 0x10, 0x77, 0x6e, 0x74, 0x4c, 0x6a, 0xb4, 0xcd, 0x50, 0xcd, 0xe4, 0x56, 0x46, 0xf9, 0xf6, 0x38, + 0xf2, 0x52, 0x0a, 0x0f, 0x4e, 0x95, 0x9e, 0xde, 0x86, 0xb3, 0x31, 0x6f, 0x4a, 0x88, 0x05, 0x5f, + 0x88, 0xc6, 0x82, 0xa7, 0x06, 0x14, 0x74, 0x12, 0x2f, 0x14, 0x13, 0xa6, 0x75, 0x18, 0x8b, 0xb8, + 0x50, 0xc2, 0x2c, 0x2f, 0x47, 0x67, 0x79, 0x72, 0x80, 0x73, 0xc8, 0x84, 0x13, 0x0a, 0x3c, 0xdf, + 0xce, 0xc1, 0x63, 0xf1, 0xa2, 0x72, 0xd9, 0xb6, 0xb6, 0x8d, 0x9d, 0x8e, 0xc3, 0x7f, 0xa0, 0x2f, + 0x41, 0xd1, 0x03, 0x12, 0x11, 0x69, 0x4e, 0x9a, 0x50, 0x83, 0x53, 0x0f, 0xbb, 0xd5, 0xa9, 0xb8, + 0xa8, 0x37, 0x82, 0x85, 0x1c, 0xb3, 0x69, 0x3f, 0x27, 0xe6, 0xf8, 0xa1, 0x8e, 0x86, 0x73, 0x5a, + 0x90, 0xc2, 0xd0, 0x37, 0xe0, 0x5c, 0x53, 0xf8, 0x71, 0x68, 0x09, 0x22, 0x67, 0x3f, 0x3b, 0xc8, + 0xf5, 0x43, 0x22, 0xf5, 0xff, 0x13, 0xab, 0x3c, 0x97, 0x30, 0x88, 0x93, 0x26, 0x51, 0xff, 0xa4, + 0xc0, 0x54, 0x72, 0x79, 0x8d, 0xde, 0x81, 0x61, 0x87, 0xff, 0x25, 0x73, 0xfa, 0x73, 0x47, 0x2f, + 0x45, 0xec, 0x2c, 0xbd, 0x4c, 0xf7, 0x7e, 0xbb, 0x58, 0xc2, 0xa2, 0xaf, 0x42, 0x51, 0xe7, 0xab, + 0x11, 0xe1, 0xfc, 0xb9, 0xac, 0x17, 0x80, 0xe8, 0xae, 0x7d, 0xf7, 0xf6, 0xc8, 0x58, 0x80, 0xaa, + 0x3f, 0x53, 0xe0, 0x6c, 0xcc, 0xd2, 0xd0, 0x0c, 0xe4, 0x0d, 0x8b, 0x72, 0xcb, 0xc9, 0x7b, 0x07, + 0xb2, 0x66, 0x51, 0x2f, 0x07, 0xb3, 0x01, 0xf4, 0x38, 0x14, 0xb6, 0xd8, 0x55, 0x31, 0xcf, 0x9d, + 0x65, 0xac, 0xd7, 0xad, 0x8e, 0xd4, 0x6d, 0xdb, 0xf4, 0x38, 0xf8, 0x10, 0x7a, 0x0a, 0x8a, 0x2e, + 0x75, 0x0c, 0x6b, 0x87, 0x17, 0x9a, 0x23, 0x5e, 0xc0, 0x68, 0x70, 0x8a, 0xc7, 0x26, 0x86, 0xd1, + 0x33, 0x30, 0xbc, 0x4f, 0x1c, 0x5e, 0x9e, 0x7b, 0x61, 0x95, 0x87, 0xc1, 0x4d, 0x8f, 0xe4, 0xb1, + 0x4a, 0x06, 0xf5, 0x63, 0x05, 0xc6, 0xa3, 0xf6, 0x7a, 0x2a, 0x15, 0x06, 0xda, 0x86, 0x31, 0x27, + 0x5c, 0xbc, 0x0a, 0x1f, 0xba, 0x7c, 0xac, 0x62, 0xb9, 0x3e, 0xd9, 0xeb, 0x56, 0xc7, 0xa2, 0x45, + 0x70, 0x14, 0x56, 0xfd, 0x71, 0x0e, 0xca, 0x62, 0x3f, 0xa6, 0x66, 0xb4, 0x50, 0xa3, 0xaf, 0x42, + 0x7c, 0x22, 0x93, 0x35, 0x05, 0xd5, 0x49, 0x82, 0xe3, 0x7c, 0x0d, 0xca, 0x2c, 0x99, 0x51, 0xc7, + 0xcb, 0x08, 0x9e, 0x11, 0xcd, 0x0d, 0x74, 0x18, 0x21, 0x10, 0xdc, 0x2b, 0x02, 0x9a, 0x8b, 0xc3, + 0x88, 0xe8, 0xb6, 0x6f, 0xa0, 0xf9, 0x4c, 0x79, 0x98, 0x6d, 0x35, 0x9b, 0x6d, 0x7e, 0xa8, 0x40, + 0x25, 0x4d, 0x28, 0x12, 0x3a, 0x94, 0x93, 0x84, 0x8e, 0xdc, 0x83, 0x08, 0x1d, 0xbf, 0x56, 0x42, + 0x47, 0xec, 0xba, 0xe8, 0x1d, 0x28, 0xb1, 0x3b, 0x2e, 0xef, 0x49, 0x78, 0x26, 0x7b, 0x25, 0xdb, + 0x8d, 0xf8, 0xf5, 0xad, 0xaf, 0x13, 0x9d, 0xde, 0x20, 0x54, 0x0b, 0x2e, 0xb0, 0x01, 0x0d, 0xfb, + 0xa8, 0x68, 0x0d, 0x0a, 0x6e, 0x9b, 0xe8, 0xd9, 0xb2, 0x0b, 0x5f, 0x54, 0xa3, 0x4d, 0xf4, 0xa0, + 0x9a, 0x64, 0xbf, 0x30, 0x87, 0x50, 0xbf, 0x1f, 0xd6, 0xbf, 0xeb, 0x46, 0xf5, 0x9f, 0xa2, 0x55, + 0xe5, 0x41, 0x68, 0xf5, 0x03, 0x3f, 0x68, 0xf1, 0x85, 0x5d, 0x37, 0x5c, 0x8a, 0xde, 0xea, 0xd3, + 0x6c, 0x2d, 0x9b, 0x66, 0x99, 0x34, 0xd7, 0xab, 0xef, 0x45, 0x92, 0x12, 0xd2, 0xea, 0xab, 0x70, + 0xc6, 0xa0, 0xa4, 0x25, 0xfd, 0xe7, 0x62, 0x06, 0xb5, 0x06, 0xc1, 0x65, 0x8d, 0x49, 0x62, 0x0f, + 0x40, 0xfd, 0x6e, 0x2e, 0xb2, 0x76, 0xa6, 0x6e, 0xf4, 0x65, 0x18, 0x71, 0x45, 0x99, 0x27, 0x3d, + 0x7f, 0x40, 0xc2, 0xf6, 0xab, 0xc6, 0x49, 0x31, 0xc9, 0x88, 0xa4, 0xb8, 0x38, 0xc0, 0x0a, 0xf9, + 0x66, 0x2e, 0xa3, 0x6f, 0xc6, 0x8e, 0x39, 0xcd, 0x37, 0xd1, 0x75, 0x38, 0x4f, 0xee, 0x52, 0x62, + 0x35, 0x49, 0x13, 0x0b, 0x1c, 0x5e, 0x1b, 0x7b, 0xe1, 0xbe, 0xd2, 0xeb, 0x56, 0xcf, 0xaf, 0x26, + 0x8c, 0xe3, 0x44, 0x29, 0xd5, 0x84, 0xa4, 0xc3, 0x47, 0xb7, 0xa0, 0x68, 0xb7, 0xb5, 0x77, 0xfd, + 0xf0, 0xbe, 0x90, 0xb6, 0xfc, 0xd7, 0x39, 0x57, 0x92, 0x71, 0x01, 0x5b, 0xbb, 0x37, 0x8c, 0x05, + 0x98, 0xfa, 0x77, 0x05, 0x26, 0xe2, 0x81, 0xee, 0x18, 0xf1, 0x64, 0x1d, 0xc6, 0x5b, 0x1a, 0xd5, + 0x77, 0xfd, 0x84, 0x29, 0x7a, 0xa6, 0x73, 0xbd, 0x6e, 0x75, 0xfc, 0x46, 0x64, 0xe4, 0xb0, 0x5b, + 0x45, 0x57, 0x3b, 0xa6, 0x79, 0x10, 0xbd, 0xce, 0xc4, 0xe4, 0xd1, 0x9b, 0x30, 0xd9, 0x34, 0x5c, + 0x6a, 0x58, 0x3a, 0x0d, 0x40, 0xbd, 0x26, 0xeb, 0xb3, 0xac, 0x60, 0x5e, 0x89, 0x0f, 0xa6, 0xe0, + 0xf6, 0xa3, 0xa8, 0x3f, 0xca, 0xf9, 0x3e, 0xdc, 0x77, 0x01, 0x42, 0x8b, 0x00, 0xba, 0x7f, 0xe3, + 0x8d, 0xb7, 0xc7, 0x82, 0xbb, 0x30, 0x0e, 0x71, 0x21, 0xb3, 0xef, 0x36, 0xfd, 0xc5, 0xe3, 0x5e, + 0xbc, 0x1e, 0x9a, 0xbb, 0xf5, 0x3f, 0x15, 0x18, 0x8b, 0x64, 0xd2, 0x0c, 0x57, 0xec, 0x37, 0x60, + 0x98, 0xdc, 0xd5, 0x74, 0x6a, 0xca, 0xb2, 0xe0, 0x99, 0xb4, 0x09, 0x57, 0x19, 0x5b, 0x34, 0x51, + 0xf3, 0x06, 0xe0, 0xaa, 0x27, 0x8e, 0x25, 0x0e, 0xda, 0x85, 0xf1, 0x6d, 0xc3, 0x71, 0xe9, 0xd2, + 0xbe, 0x66, 0x98, 0xda, 0x96, 0x49, 0x44, 0x26, 0x1d, 0x90, 0xa5, 0x1b, 0x9d, 0x2d, 0x89, 0x3b, + 0x25, 0x16, 0x3a, 0x7e, 0x35, 0x82, 0x83, 0x63, 0xb8, 0xea, 0x1f, 0x8b, 0xb2, 0xa6, 0x4f, 0x29, + 0x44, 0xd1, 0xd3, 0xac, 0xa0, 0xe5, 0x43, 0x42, 0x07, 0xa1, 0xca, 0x94, 0x93, 0xb1, 0x1c, 0x0f, + 0x7d, 0x59, 0xc8, 0x65, 0xfa, 0xb2, 0x90, 0xcf, 0xf0, 0x65, 0xa1, 0x70, 0xe4, 0x97, 0x85, 0x05, + 0x28, 0x6b, 0xcd, 0x96, 0x61, 0x2d, 0xe9, 0x3a, 0x71, 0x5d, 0x5e, 0x30, 0x8a, 0xbb, 0xe8, 0x52, + 0x40, 0xc6, 0x61, 0x1e, 0x56, 0xfe, 0x50, 0xdb, 0x24, 0x8e, 0xb8, 0xdf, 0x15, 0xb3, 0x28, 0x76, + 0xc3, 0x17, 0x08, 0xca, 0x9f, 0x80, 0xe6, 0xe2, 0x30, 0x62, 0xf2, 0x65, 0x77, 0xf8, 0x3e, 0x5e, + 0x76, 0x4b, 0x9f, 0xe9, 0xb2, 0xfb, 0x5a, 0xf0, 0x31, 0x66, 0x84, 0xeb, 0xf6, 0x4a, 0xe8, 0x63, + 0xcc, 0x61, 0xb7, 0xfa, 0x78, 0xda, 0x07, 0x27, 0x7a, 0xd0, 0x26, 0x6e, 0xed, 0x56, 0xf8, 0x8b, + 0xcd, 0xfb, 0x8a, 0xdf, 0x7c, 0x69, 0xca, 0x9a, 0x97, 0xdf, 0xeb, 0xcb, 0x8b, 0xd7, 0x4e, 0x74, + 0xed, 0xa9, 0x2d, 0xc7, 0xd0, 0xbc, 0x80, 0xf0, 0x74, 0xac, 0x2f, 0xd3, 0x4c, 0x6f, 0x0c, 0xf5, + 0xad, 0x67, 0xda, 0x85, 0x0b, 0x89, 0xa8, 0xa7, 0xda, 0xf3, 0xdc, 0x94, 0x17, 0x13, 0xbf, 0x5b, + 0xb3, 0x02, 0x79, 0x9d, 0x98, 0x22, 0x6f, 0xa5, 0x7e, 0x23, 0xea, 0xfb, 0x62, 0xe1, 0xb5, 0xa6, + 0x97, 0x57, 0xaf, 0x63, 0x26, 0xae, 0x7e, 0xab, 0x20, 0x33, 0x55, 0xe0, 0xec, 0x19, 0x62, 0xd4, + 0x12, 0x9c, 0x6d, 0x06, 0x09, 0x9d, 0xe7, 0x65, 0xcf, 0x45, 0x1f, 0x11, 0xcc, 0xe1, 0x0a, 0x84, + 0xcb, 0xc5, 0xf9, 0xa3, 0x25, 0x49, 0xfe, 0x3e, 0x96, 0x24, 0x9b, 0x30, 0x1e, 0x7c, 0xbe, 0xb9, + 0x61, 0x37, 0xa5, 0xcf, 0xd7, 0x64, 0x08, 0x5b, 0x8a, 0x8c, 0x1e, 0x76, 0xab, 0xe7, 0xe3, 0x37, + 0x5b, 0x46, 0xc7, 0x31, 0x14, 0x74, 0x11, 0xce, 0xf0, 0xac, 0xc1, 0xa3, 0x42, 0x3e, 0x28, 0xbe, + 0x78, 0xd8, 0xc7, 0xde, 0xd8, 0xe9, 0x47, 0x83, 0xcd, 0x50, 0x2f, 0x74, 0x98, 0x9f, 0xfd, 0xa5, + 0xe3, 0x34, 0xf9, 0xbd, 0x9a, 0xc3, 0x1f, 0xf1, 0xb1, 0xd4, 0x7f, 0xf9, 0xf7, 0x08, 0xde, 0x9e, + 0x43, 0x8f, 0x85, 0x8c, 0xb9, 0x5e, 0x16, 0xcb, 0xca, 0x5f, 0x23, 0x07, 0x9e, 0x65, 0x5f, 0x0c, + 0x5b, 0xf6, 0x48, 0xca, 0x35, 0xf7, 0x25, 0x28, 0x92, 0xed, 0x6d, 0xa2, 0x53, 0x11, 0x99, 0x65, + 0xe3, 0xb7, 0xb8, 0xca, 0xa9, 0x87, 0xac, 0xf0, 0x08, 0xa6, 0xf4, 0x88, 0x58, 0x88, 0x30, 0xfb, + 0xa0, 0x46, 0x8b, 0x2c, 0x35, 0x9b, 0xa4, 0x29, 0x3e, 0x26, 0x1d, 0xe7, 0xdb, 0x1e, 0x6f, 0x1a, + 0x6c, 0x48, 0x00, 0x1c, 0x60, 0xbd, 0x58, 0xfa, 0xc1, 0x4f, 0xaa, 0x43, 0xef, 0xfd, 0x79, 0x76, + 0x48, 0x7d, 0x3f, 0x27, 0x8d, 0x3f, 0x50, 0xf7, 0xa0, 0x8d, 0xbf, 0x0a, 0x25, 0xbb, 0xcd, 0x78, + 0x6d, 0x99, 0x95, 0x2e, 0xc9, 0xea, 0xe2, 0x75, 0x41, 0x3f, 0xec, 0x56, 0x2b, 0x71, 0x58, 0x39, + 0x86, 0x7d, 0xe9, 0x40, 0x85, 0xf9, 0x4c, 0x2a, 0x2c, 0x1c, 0x5f, 0x85, 0xcb, 0x30, 0x19, 0x98, + 0x4e, 0x83, 0xe8, 0xb6, 0xd5, 0x74, 0x85, 0xf5, 0xf2, 0xcc, 0xb1, 0x11, 0x1f, 0xc4, 0xfd, 0xfc, + 0xea, 0x0f, 0x0b, 0x80, 0xfa, 0x0b, 0x8d, 0xa4, 0x08, 0xa0, 0x7c, 0x96, 0x08, 0x90, 0x3b, 0xd5, + 0x08, 0x90, 0xbf, 0xbf, 0x11, 0xa0, 0x70, 0x44, 0x04, 0x78, 0x18, 0x4b, 0x88, 0xd3, 0x0a, 0x1a, + 0x3f, 0x57, 0x60, 0xb2, 0xef, 0x15, 0x02, 0x7a, 0x09, 0xc6, 0x0c, 0x56, 0x08, 0x6f, 0x6b, 0xe2, + 0xca, 0xe6, 0x19, 0xc6, 0x05, 0xb1, 0xcc, 0xb1, 0xb5, 0xf0, 0x20, 0x8e, 0xf2, 0xa2, 0x47, 0x21, + 0x6f, 0xb4, 0x65, 0xaf, 0x96, 0xe7, 0xaa, 0xb5, 0x75, 0x17, 0x33, 0x1a, 0x33, 0xb9, 0x5d, 0xcd, + 0x69, 0xde, 0xd1, 0x1c, 0xe6, 0xc9, 0x0e, 0xd3, 0x6e, 0x3e, 0x6a, 0x72, 0xaf, 0x46, 0x87, 0x71, + 0x9c, 0x5f, 0xfd, 0xa9, 0x02, 0x8f, 0xa6, 0x5e, 0xe5, 0x32, 0xbf, 0x64, 0xd1, 0x00, 0xda, 0x9a, + 0xa3, 0xb5, 0x88, 0xb8, 0xa3, 0x9c, 0xe0, 0xe5, 0x87, 0x7f, 0x09, 0x5a, 0xf7, 0x81, 0x70, 0x08, + 0x54, 0xfd, 0x5e, 0x0e, 0xc6, 0xe4, 0x05, 0xd6, 0xeb, 0xdd, 0x9d, 0x7e, 0x63, 0xe7, 0x5a, 0xa4, + 0xb1, 0x93, 0x5a, 0x52, 0x44, 0x96, 0x95, 0xd6, 0xda, 0x41, 0x0d, 0x28, 0xba, 0xfc, 0x7d, 0xd0, + 0xa0, 0x0e, 0x7a, 0x14, 0x8e, 0x8b, 0x04, 0x8a, 0xf7, 0x7e, 0x63, 0x01, 0xa5, 0xf6, 0x14, 0x98, + 0x89, 0xf0, 0x8b, 0x42, 0xcc, 0xc1, 0x64, 0x9b, 0x38, 0xc4, 0xd2, 0x09, 0xba, 0x04, 0x25, 0xad, + 0x6d, 0xbc, 0xe2, 0xd8, 0x9d, 0xb6, 0x38, 0x45, 0xff, 0xf6, 0xb7, 0xb4, 0xbe, 0xc6, 0xe9, 0xd8, + 0xe7, 0x60, 0xdc, 0x72, 0x2d, 0xc2, 0x96, 0x42, 0x9d, 0x4e, 0x8f, 0x8e, 0x7d, 0x0e, 0xbf, 0x2e, + 0x2a, 0xa4, 0xd6, 0x45, 0x75, 0xc8, 0x77, 0x8c, 0xa6, 0x68, 0x34, 0x5f, 0x91, 0xc9, 0xe3, 0x56, + 0xd6, 0x42, 0x98, 0x09, 0xab, 0xbf, 0x55, 0x60, 0x32, 0xb2, 0xc9, 0x07, 0xd0, 0x7d, 0x7a, 0x2d, + 0xda, 0x7d, 0x7a, 0x22, 0xd3, 0x61, 0xa5, 0xf4, 0x9f, 0xf4, 0xd8, 0xf2, 0x79, 0x03, 0xea, 0x66, + 0xfc, 0x99, 0xd1, 0xc5, 0x0c, 0x4d, 0xdc, 0xf4, 0xb7, 0x45, 0xea, 0xaf, 0x72, 0x70, 0x2e, 0xc1, + 0x72, 0xd0, 0x6d, 0x80, 0x20, 0x68, 0x8b, 0xa9, 0x52, 0x23, 0x69, 0xdf, 0x47, 0x12, 0xfe, 0xf2, + 0x24, 0x44, 0x0d, 0x61, 0xa1, 0x16, 0x94, 0x1d, 0xe2, 0x12, 0x67, 0x9f, 0x34, 0xaf, 0xf2, 0xdc, + 0xcf, 0x14, 0xf5, 0x7c, 0x26, 0x45, 0xf5, 0x59, 0x69, 0x10, 0xb2, 0x71, 0x00, 0x89, 0xc3, 0xf8, + 0xe8, 0x76, 0xa0, 0x30, 0xef, 0xeb, 0xf3, 0xe5, 0x01, 0xbb, 0x88, 0xbe, 0xca, 0x3b, 0x42, 0x75, + 0x7f, 0x50, 0xe0, 0x42, 0x64, 0x79, 0x1b, 0xa4, 0xd5, 0x36, 0x35, 0x4a, 0x1e, 0x40, 0x88, 0x69, + 0x44, 0x42, 0xcc, 0x42, 0x26, 0xed, 0xc9, 0xe5, 0xa5, 0x76, 0x91, 0x3f, 0x56, 0xe0, 0xd1, 0x44, + 0x89, 0x07, 0xe0, 0x38, 0x38, 0xea, 0x38, 0x97, 0x8f, 0xb5, 0xa3, 0x14, 0x07, 0xfa, 0x7d, 0xda, + 0x7e, 0xb8, 0x27, 0xfd, 0x6f, 0xe5, 0x01, 0xf5, 0x17, 0x0a, 0x8c, 0x4a, 0xce, 0x75, 0xdb, 0x36, + 0x33, 0x5c, 0x2e, 0x17, 0x01, 0xc4, 0xeb, 0x53, 0xf9, 0x15, 0x25, 0x1f, 0xac, 0xf8, 0x15, 0x7f, + 0x04, 0x87, 0xb8, 0xd0, 0x6b, 0x80, 0xe4, 0xda, 0x1a, 0xa6, 0xec, 0x09, 0xf2, 0x90, 0x9e, 0xaf, + 0x4f, 0x0b, 0x59, 0x84, 0xfb, 0x38, 0x70, 0x82, 0x94, 0xfa, 0x3b, 0x25, 0xc8, 0xbd, 0x9c, 0xfc, + 0xf0, 0xe9, 0x9c, 0x2f, 0x2b, 0x55, 0xe7, 0xe1, 0x0c, 0xc2, 0x39, 0x1f, 0xc2, 0x0c, 0xc2, 0xd7, + 0x95, 0xe2, 0x00, 0xbf, 0x2c, 0xc4, 0xd6, 0xcf, 0x0d, 0x3f, 0x6b, 0x75, 0x76, 0x35, 0xf4, 0xce, + 0xb8, 0xbc, 0xf8, 0xb9, 0x41, 0x0b, 0x61, 0x46, 0x99, 0xd8, 0x33, 0x0c, 0x3f, 0xc8, 0xc9, 0x1f, + 0xeb, 0x41, 0x4e, 0xe1, 0x14, 0x1e, 0xe4, 0x9c, 0x39, 0xf2, 0x41, 0xce, 0x5a, 0x90, 0x2d, 0xbc, + 0xdb, 0xc3, 0xcc, 0xd1, 0xe9, 0xf5, 0x88, 0x57, 0xbb, 0x18, 0xa6, 0xda, 0xc4, 0xf1, 0xc8, 0xc1, + 0xda, 0x98, 0x27, 0x7a, 0x6f, 0x82, 0xa6, 0x7b, 0xdd, 0xea, 0xd4, 0x7a, 0x22, 0x07, 0x4e, 0x91, + 0x44, 0x5b, 0x30, 0xce, 0x5b, 0x7c, 0x4d, 0xff, 0x45, 0x95, 0xf7, 0x6e, 0x48, 0x1d, 0xfc, 0x4c, + 0x2e, 0xe8, 0x3c, 0x37, 0x22, 0x08, 0x38, 0x86, 0x58, 0x7f, 0xf9, 0xa3, 0x7b, 0x33, 0x43, 0x9f, + 0xdc, 0x9b, 0x19, 0xfa, 0xf4, 0xde, 0xcc, 0xd0, 0x7b, 0xbd, 0x19, 0xe5, 0xa3, 0xde, 0x8c, 0xf2, + 0x49, 0x6f, 0x46, 0xf9, 0xb4, 0x37, 0xa3, 0xfc, 0xb5, 0x37, 0xa3, 0x7c, 0xe7, 0x6f, 0x33, 0x43, + 0x5f, 0x99, 0x4a, 0xfe, 0x77, 0x81, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x0c, 0xec, 0x16, + 0x47, 0x30, 0x00, 0x00, +} + +func (m *AllocatedDeviceStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocatedDeviceStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocatedDeviceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ShareID != nil { + i -= len(*m.ShareID) + copy(dAtA[i:], *m.ShareID) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ShareID))) + i-- + dAtA[i] = 0x3a + } + if m.NetworkData != nil { + { + size, err := m.NetworkData.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + i -= len(m.Device) + copy(dAtA[i:], m.Device) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Device))) + i-- + dAtA[i] = 0x1a + i -= len(m.Pool) + copy(dAtA[i:], m.Pool) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Pool))) + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *AllocationResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocationResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AllocationTimestamp != nil { + { + size, err := m.AllocationTimestamp.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + { + size, err := m.Devices.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CELDeviceSelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CELDeviceSelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CELDeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CapacityRequestPolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CapacityRequestPolicy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CapacityRequestPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ValidRange != nil { + { + size, err := m.ValidRange.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.ValidValues) > 0 { + for iNdEx := len(m.ValidValues) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ValidValues[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.Default != nil { + { + size, err := m.Default.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CapacityRequestPolicyRange) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CapacityRequestPolicyRange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CapacityRequestPolicyRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Step != nil { + { + size, err := m.Step.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Max != nil { + { + size, err := m.Max.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Min != nil { + { + size, err := m.Min.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CapacityRequirements) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CapacityRequirements) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CapacityRequirements) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Requests) > 0 { + keysForRequests := make([]string, 0, len(m.Requests)) + for k := range m.Requests { + keysForRequests = append(keysForRequests, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForRequests) + for iNdEx := len(keysForRequests) - 1; iNdEx >= 0; iNdEx-- { + v := m.Requests[QualifiedName(keysForRequests[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForRequests[iNdEx]) + copy(dAtA[i:], keysForRequests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForRequests[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Counter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Counter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Counter) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Value.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CounterSet) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CounterSet) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CounterSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Counters) > 0 { + keysForCounters := make([]string, 0, len(m.Counters)) + for k := range m.Counters { + keysForCounters = append(keysForCounters, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + for iNdEx := len(keysForCounters) - 1; iNdEx >= 0; iNdEx-- { + v := m.Counters[string(keysForCounters[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForCounters[iNdEx]) + copy(dAtA[i:], keysForCounters[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForCounters[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Device) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Device) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Device) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AllowMultipleAllocations != nil { + i-- + if *m.AllowMultipleAllocations { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } + if len(m.BindingFailureConditions) > 0 { + for iNdEx := len(m.BindingFailureConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingFailureConditions[iNdEx]) + copy(dAtA[i:], m.BindingFailureConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingFailureConditions[iNdEx]))) + i-- + dAtA[i] = 0x5a + } + } + if len(m.BindingConditions) > 0 { + for iNdEx := len(m.BindingConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingConditions[iNdEx]) + copy(dAtA[i:], m.BindingConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingConditions[iNdEx]))) + i-- + dAtA[i] = 0x52 + } + } + if m.BindsToNode != nil { + i-- + if *m.BindsToNode { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x48 + } + if len(m.Taints) > 0 { + for iNdEx := len(m.Taints) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Taints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + } + if m.AllNodes != nil { + i-- + if *m.AllNodes { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.NodeName != nil { + i -= len(*m.NodeName) + copy(dAtA[i:], *m.NodeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeName))) + i-- + dAtA[i] = 0x2a + } + if len(m.ConsumesCounters) > 0 { + for iNdEx := len(m.ConsumesCounters) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ConsumesCounters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.Capacity) > 0 { + keysForCapacity := make([]string, 0, len(m.Capacity)) + for k := range m.Capacity { + keysForCapacity = append(keysForCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCapacity) + for iNdEx := len(keysForCapacity) - 1; iNdEx >= 0; iNdEx-- { + v := m.Capacity[QualifiedName(keysForCapacity[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForCapacity[iNdEx]) + copy(dAtA[i:], keysForCapacity[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForCapacity[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Attributes) > 0 { + keysForAttributes := make([]string, 0, len(m.Attributes)) + for k := range m.Attributes { + keysForAttributes = append(keysForAttributes, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAttributes) + for iNdEx := len(keysForAttributes) - 1; iNdEx >= 0; iNdEx-- { + v := m.Attributes[QualifiedName(keysForAttributes[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForAttributes[iNdEx]) + copy(dAtA[i:], keysForAttributes[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForAttributes[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceAllocationConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAllocationConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAllocationConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.Source) + copy(dAtA[i:], m.Source) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Source))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceAllocationResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAllocationResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Results) > 0 { + for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceAttribute) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAttribute) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.VersionValue != nil { + i -= len(*m.VersionValue) + copy(dAtA[i:], *m.VersionValue) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VersionValue))) + i-- + dAtA[i] = 0x2a + } + if m.StringValue != nil { + i -= len(*m.StringValue) + copy(dAtA[i:], *m.StringValue) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.StringValue))) + i-- + dAtA[i] = 0x22 + } + if m.BoolValue != nil { + i-- + if *m.BoolValue { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.IntValue != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.IntValue)) + i-- + dAtA[i] = 0x10 + } + return len(dAtA) - i, nil +} + +func (m *DeviceCapacity) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceCapacity) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceCapacity) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RequestPolicy != nil { + { + size, err := m.RequestPolicy.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + { + size, err := m.Value.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClaim) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClaim) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Constraints) > 0 { + for iNdEx := len(m.Constraints) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Constraints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Requests[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceClaimConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClaimConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClaimConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceClass) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClass) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClass) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClassConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClassList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClassSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ExtendedResourceName != nil { + i -= len(*m.ExtendedResourceName) + copy(dAtA[i:], *m.ExtendedResourceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ExtendedResourceName))) + i-- + dAtA[i] = 0x22 + } + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Opaque != nil { + { + size, err := m.Opaque.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DeviceConstraint) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceConstraint) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceConstraint) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.DistinctAttribute != nil { + i -= len(*m.DistinctAttribute) + copy(dAtA[i:], *m.DistinctAttribute) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.DistinctAttribute))) + i-- + dAtA[i] = 0x1a + } + if m.MatchAttribute != nil { + i -= len(*m.MatchAttribute) + copy(dAtA[i:], *m.MatchAttribute) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchAttribute))) + i-- + dAtA[i] = 0x12 + } + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceCounterConsumption) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceCounterConsumption) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceCounterConsumption) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Counters) > 0 { + keysForCounters := make([]string, 0, len(m.Counters)) + for k := range m.Counters { + keysForCounters = append(keysForCounters, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + for iNdEx := len(keysForCounters) - 1; iNdEx >= 0; iNdEx-- { + v := m.Counters[string(keysForCounters[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForCounters[iNdEx]) + copy(dAtA[i:], keysForCounters[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForCounters[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.CounterSet) + copy(dAtA[i:], m.CounterSet) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CounterSet))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.FirstAvailable) > 0 { + for iNdEx := len(m.FirstAvailable) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FirstAvailable[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.Exactly != nil { + { + size, err := m.Exactly.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceRequestAllocationResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceRequestAllocationResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceRequestAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ConsumedCapacity) > 0 { + keysForConsumedCapacity := make([]string, 0, len(m.ConsumedCapacity)) + for k := range m.ConsumedCapacity { + keysForConsumedCapacity = append(keysForConsumedCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForConsumedCapacity) + for iNdEx := len(keysForConsumedCapacity) - 1; iNdEx >= 0; iNdEx-- { + v := m.ConsumedCapacity[QualifiedName(keysForConsumedCapacity[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForConsumedCapacity[iNdEx]) + copy(dAtA[i:], keysForConsumedCapacity[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForConsumedCapacity[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x52 + } + } + if m.ShareID != nil { + i -= len(*m.ShareID) + copy(dAtA[i:], *m.ShareID) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ShareID))) + i-- + dAtA[i] = 0x4a + } + if len(m.BindingFailureConditions) > 0 { + for iNdEx := len(m.BindingFailureConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingFailureConditions[iNdEx]) + copy(dAtA[i:], m.BindingFailureConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingFailureConditions[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } + if len(m.BindingConditions) > 0 { + for iNdEx := len(m.BindingConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingConditions[iNdEx]) + copy(dAtA[i:], m.BindingConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingConditions[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } + if len(m.Tolerations) > 0 { + for iNdEx := len(m.Tolerations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tolerations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.AdminAccess != nil { + i-- + if *m.AdminAccess { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + i -= len(m.Device) + copy(dAtA[i:], m.Device) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Device))) + i-- + dAtA[i] = 0x22 + i -= len(m.Pool) + copy(dAtA[i:], m.Pool) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Pool))) + i-- + dAtA[i] = 0x1a + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0x12 + i -= len(m.Request) + copy(dAtA[i:], m.Request) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Request))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceSelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceSelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CEL != nil { + { + size, err := m.CEL.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DeviceSubRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceSubRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceSubRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Capacity != nil { + { + size, err := m.Capacity.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.Tolerations) > 0 { + for iNdEx := len(m.Tolerations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tolerations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) + i-- + dAtA[i] = 0x28 + i -= len(m.AllocationMode) + copy(dAtA[i:], m.AllocationMode) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AllocationMode))) + i-- + dAtA[i] = 0x22 + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + i -= len(m.DeviceClassName) + copy(dAtA[i:], m.DeviceClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DeviceClassName))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceTaint) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceTaint) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceTaint) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TimeAdded != nil { + { + size, err := m.TimeAdded.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + i -= len(m.Effect) + copy(dAtA[i:], m.Effect) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Effect))) + i-- + dAtA[i] = 0x1a + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceToleration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceToleration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceToleration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TolerationSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TolerationSeconds)) + i-- + dAtA[i] = 0x28 + } + i -= len(m.Effect) + copy(dAtA[i:], m.Effect) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Effect))) + i-- + dAtA[i] = 0x22 + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + i -= len(m.Operator) + copy(dAtA[i:], m.Operator) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) + i-- + dAtA[i] = 0x12 + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ExactDeviceRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExactDeviceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExactDeviceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Capacity != nil { + { + size, err := m.Capacity.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.Tolerations) > 0 { + for iNdEx := len(m.Tolerations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tolerations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.AdminAccess != nil { + i-- + if *m.AdminAccess { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) + i-- + dAtA[i] = 0x20 + i -= len(m.AllocationMode) + copy(dAtA[i:], m.AllocationMode) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AllocationMode))) + i-- + dAtA[i] = 0x1a + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.DeviceClassName) + copy(dAtA[i:], m.DeviceClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DeviceClassName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *NetworkDeviceData) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetworkDeviceData) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NetworkDeviceData) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.HardwareAddress) + copy(dAtA[i:], m.HardwareAddress) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.HardwareAddress))) + i-- + dAtA[i] = 0x1a + if len(m.IPs) > 0 { + for iNdEx := len(m.IPs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IPs[iNdEx]) + copy(dAtA[i:], m.IPs[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IPs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.InterfaceName) + copy(dAtA[i:], m.InterfaceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.InterfaceName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *OpaqueDeviceConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OpaqueDeviceConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OpaqueDeviceConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Parameters.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaim) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaim) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimConsumerReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimConsumerReference) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimConsumerReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.UID) + copy(dAtA[i:], m.UID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.UID))) + i-- + dAtA[i] = 0x2a + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x22 + i -= len(m.Resource) + copy(dAtA[i:], m.Resource) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Resource))) + i-- + dAtA[i] = 0x1a + i -= len(m.APIGroup) + copy(dAtA[i:], m.APIGroup) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIGroup))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Devices.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.ReservedFor) > 0 { + for iNdEx := len(m.ReservedFor) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ReservedFor[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Allocation != nil { + { + size, err := m.Allocation.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResourceClaimTemplate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimTemplate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimTemplateList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimTemplateList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimTemplateList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimTemplateSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimTemplateSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourcePool) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourcePool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourcePool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceSliceCount)) + i-- + dAtA[i] = 0x18 + i = encodeVarintGenerated(dAtA, i, uint64(m.Generation)) + i-- + dAtA[i] = 0x10 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceSlice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceSlice) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceSliceList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceSliceList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceSliceList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceSliceSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceSliceSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceSliceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SharedCounters) > 0 { + for iNdEx := len(m.SharedCounters) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SharedCounters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + } + if m.PerDeviceNodeSelection != nil { + i-- + if *m.PerDeviceNodeSelection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.AllNodes != nil { + i-- + if *m.AllNodes { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.NodeName != nil { + i -= len(*m.NodeName) + copy(dAtA[i:], *m.NodeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeName))) + i-- + dAtA[i] = 0x1a + } + { + size, err := m.Pool.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *AllocatedDeviceStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Pool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Device) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NetworkData != nil { + l = m.NetworkData.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ShareID != nil { + l = len(*m.ShareID) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *AllocationResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Devices.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AllocationTimestamp != nil { + l = m.AllocationTimestamp.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CELDeviceSelector) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *CapacityRequestPolicy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Default != nil { + l = m.Default.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ValidValues) > 0 { + for _, e := range m.ValidValues { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.ValidRange != nil { + l = m.ValidRange.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CapacityRequestPolicyRange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Min != nil { + l = m.Min.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Max != nil { + l = m.Max.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Step != nil { + l = m.Step.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CapacityRequirements) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for k, v := range m.Requests { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *Counter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Value.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *CounterSet) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Counters) > 0 { + for k, v := range m.Counters { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *Device) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Attributes) > 0 { + for k, v := range m.Attributes { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.Capacity) > 0 { + for k, v := range m.Capacity { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.ConsumesCounters) > 0 { + for _, e := range m.ConsumesCounters { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.NodeName != nil { + l = len(*m.NodeName) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AllNodes != nil { + n += 2 + } + if len(m.Taints) > 0 { + for _, e := range m.Taints { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.BindsToNode != nil { + n += 2 + } + if len(m.BindingConditions) > 0 { + for _, s := range m.BindingConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.BindingFailureConditions) > 0 { + for _, s := range m.BindingFailureConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.AllowMultipleAllocations != nil { + n += 2 + } + return n +} + +func (m *DeviceAllocationConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Source) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceAllocationResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceAttribute) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.IntValue != nil { + n += 1 + sovGenerated(uint64(*m.IntValue)) + } + if m.BoolValue != nil { + n += 2 + } + if m.StringValue != nil { + l = len(*m.StringValue) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.VersionValue != nil { + l = len(*m.VersionValue) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceCapacity) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Value.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.RequestPolicy != nil { + l = m.RequestPolicy.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceClaim) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, e := range m.Requests { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Constraints) > 0 { + for _, e := range m.Constraints { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceClaimConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClass) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClassConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClassList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceClassSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.ExtendedResourceName != nil { + l = len(*m.ExtendedResourceName) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Opaque != nil { + l = m.Opaque.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceConstraint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchAttribute != nil { + l = len(*m.MatchAttribute) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.DistinctAttribute != nil { + l = len(*m.DistinctAttribute) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceCounterConsumption) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.CounterSet) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Counters) > 0 { + for k, v := range m.Counters { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *DeviceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Exactly != nil { + l = m.Exactly.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.FirstAvailable) > 0 { + for _, e := range m.FirstAvailable { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceRequestAllocationResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Request) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Pool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Device) + n += 1 + l + sovGenerated(uint64(l)) + if m.AdminAccess != nil { + n += 2 + } + if len(m.Tolerations) > 0 { + for _, e := range m.Tolerations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.BindingConditions) > 0 { + for _, s := range m.BindingConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.BindingFailureConditions) > 0 { + for _, s := range m.BindingFailureConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.ShareID != nil { + l = len(*m.ShareID) + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ConsumedCapacity) > 0 { + for k, v := range m.ConsumedCapacity { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *DeviceSelector) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CEL != nil { + l = m.CEL.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceSubRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.DeviceClassName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.AllocationMode) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Count)) + if len(m.Tolerations) > 0 { + for _, e := range m.Tolerations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Capacity != nil { + l = m.Capacity.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceTaint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Value) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Effect) + n += 1 + l + sovGenerated(uint64(l)) + if m.TimeAdded != nil { + l = m.TimeAdded.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceToleration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Operator) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Value) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Effect) + n += 1 + l + sovGenerated(uint64(l)) + if m.TolerationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TolerationSeconds)) + } + return n +} + +func (m *ExactDeviceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DeviceClassName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.AllocationMode) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Count)) + if m.AdminAccess != nil { + n += 2 + } + if len(m.Tolerations) > 0 { + for _, e := range m.Tolerations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Capacity != nil { + l = m.Capacity.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *NetworkDeviceData) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.InterfaceName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.IPs) > 0 { + for _, s := range m.IPs { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.HardwareAddress) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *OpaqueDeviceConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Parameters.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaim) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimConsumerReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.APIGroup) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Resource) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.UID) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceClaimSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Devices.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Allocation != nil { + l = m.Allocation.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ReservedFor) > 0 { + for _, e := range m.ReservedFor { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceClaimTemplate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimTemplateList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceClaimTemplateSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourcePool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Generation)) + n += 1 + sovGenerated(uint64(m.ResourceSliceCount)) + return n +} + +func (m *ResourceSlice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceSliceList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceSliceSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Pool.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NodeName != nil { + l = len(*m.NodeName) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AllNodes != nil { + n += 2 + } + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.PerDeviceNodeSelection != nil { + n += 2 + } + if len(m.SharedCounters) > 0 { + for _, e := range m.SharedCounters { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *AllocatedDeviceStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&AllocatedDeviceStatus{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, + `Device:` + fmt.Sprintf("%v", this.Device) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `Data:` + strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1) + `,`, + `NetworkData:` + strings.Replace(this.NetworkData.String(), "NetworkDeviceData", "NetworkDeviceData", 1) + `,`, + `ShareID:` + valueToStringGenerated(this.ShareID) + `,`, + `}`, + }, "") + return s +} +func (this *AllocationResult) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AllocationResult{`, + `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceAllocationResult", "DeviceAllocationResult", 1), `&`, ``, 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, + `AllocationTimestamp:` + strings.Replace(fmt.Sprintf("%v", this.AllocationTimestamp), "Time", "v1.Time", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CELDeviceSelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CELDeviceSelector{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *CapacityRequestPolicy) String() string { + if this == nil { + return "nil" + } + repeatedStringForValidValues := "[]Quantity{" + for _, f := range this.ValidValues { + repeatedStringForValidValues += fmt.Sprintf("%v", f) + "," + } + repeatedStringForValidValues += "}" + s := strings.Join([]string{`&CapacityRequestPolicy{`, + `Default:` + strings.Replace(fmt.Sprintf("%v", this.Default), "Quantity", "resource.Quantity", 1) + `,`, + `ValidValues:` + repeatedStringForValidValues + `,`, + `ValidRange:` + strings.Replace(this.ValidRange.String(), "CapacityRequestPolicyRange", "CapacityRequestPolicyRange", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CapacityRequestPolicyRange) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CapacityRequestPolicyRange{`, + `Min:` + strings.Replace(fmt.Sprintf("%v", this.Min), "Quantity", "resource.Quantity", 1) + `,`, + `Max:` + strings.Replace(fmt.Sprintf("%v", this.Max), "Quantity", "resource.Quantity", 1) + `,`, + `Step:` + strings.Replace(fmt.Sprintf("%v", this.Step), "Quantity", "resource.Quantity", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CapacityRequirements) String() string { + if this == nil { + return "nil" + } + keysForRequests := make([]string, 0, len(this.Requests)) + for k := range this.Requests { + keysForRequests = append(keysForRequests, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForRequests) + mapStringForRequests := "map[QualifiedName]resource.Quantity{" + for _, k := range keysForRequests { + mapStringForRequests += fmt.Sprintf("%v: %v,", k, this.Requests[QualifiedName(k)]) + } + mapStringForRequests += "}" + s := strings.Join([]string{`&CapacityRequirements{`, + `Requests:` + mapStringForRequests + `,`, + `}`, + }, "") + return s +} +func (this *Counter) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Counter{`, + `Value:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Value), "Quantity", "resource.Quantity", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CounterSet) String() string { + if this == nil { + return "nil" + } + keysForCounters := make([]string, 0, len(this.Counters)) + for k := range this.Counters { + keysForCounters = append(keysForCounters, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + mapStringForCounters := "map[string]Counter{" + for _, k := range keysForCounters { + mapStringForCounters += fmt.Sprintf("%v: %v,", k, this.Counters[k]) + } + mapStringForCounters += "}" + s := strings.Join([]string{`&CounterSet{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Counters:` + mapStringForCounters + `,`, + `}`, + }, "") + return s +} +func (this *Device) String() string { + if this == nil { + return "nil" + } + repeatedStringForConsumesCounters := "[]DeviceCounterConsumption{" + for _, f := range this.ConsumesCounters { + repeatedStringForConsumesCounters += strings.Replace(strings.Replace(f.String(), "DeviceCounterConsumption", "DeviceCounterConsumption", 1), `&`, ``, 1) + "," + } + repeatedStringForConsumesCounters += "}" + repeatedStringForTaints := "[]DeviceTaint{" + for _, f := range this.Taints { + repeatedStringForTaints += fmt.Sprintf("%v", f) + "," + } + repeatedStringForTaints += "}" + keysForAttributes := make([]string, 0, len(this.Attributes)) + for k := range this.Attributes { + keysForAttributes = append(keysForAttributes, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAttributes) + mapStringForAttributes := "map[QualifiedName]DeviceAttribute{" + for _, k := range keysForAttributes { + mapStringForAttributes += fmt.Sprintf("%v: %v,", k, this.Attributes[QualifiedName(k)]) + } + mapStringForAttributes += "}" + keysForCapacity := make([]string, 0, len(this.Capacity)) + for k := range this.Capacity { + keysForCapacity = append(keysForCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCapacity) + mapStringForCapacity := "map[QualifiedName]DeviceCapacity{" + for _, k := range keysForCapacity { + mapStringForCapacity += fmt.Sprintf("%v: %v,", k, this.Capacity[QualifiedName(k)]) + } + mapStringForCapacity += "}" + s := strings.Join([]string{`&Device{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Attributes:` + mapStringForAttributes + `,`, + `Capacity:` + mapStringForCapacity + `,`, + `ConsumesCounters:` + repeatedStringForConsumesCounters + `,`, + `NodeName:` + valueToStringGenerated(this.NodeName) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, + `AllNodes:` + valueToStringGenerated(this.AllNodes) + `,`, + `Taints:` + repeatedStringForTaints + `,`, + `BindsToNode:` + valueToStringGenerated(this.BindsToNode) + `,`, + `BindingConditions:` + fmt.Sprintf("%v", this.BindingConditions) + `,`, + `BindingFailureConditions:` + fmt.Sprintf("%v", this.BindingFailureConditions) + `,`, + `AllowMultipleAllocations:` + valueToStringGenerated(this.AllowMultipleAllocations) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAllocationConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceAllocationConfiguration{`, + `Source:` + fmt.Sprintf("%v", this.Source) + `,`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAllocationResult) String() string { + if this == nil { + return "nil" + } + repeatedStringForResults := "[]DeviceRequestAllocationResult{" + for _, f := range this.Results { + repeatedStringForResults += strings.Replace(strings.Replace(f.String(), "DeviceRequestAllocationResult", "DeviceRequestAllocationResult", 1), `&`, ``, 1) + "," + } + repeatedStringForResults += "}" + repeatedStringForConfig := "[]DeviceAllocationConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceAllocationConfiguration", "DeviceAllocationConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceAllocationResult{`, + `Results:` + repeatedStringForResults + `,`, + `Config:` + repeatedStringForConfig + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAttribute) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceAttribute{`, + `IntValue:` + valueToStringGenerated(this.IntValue) + `,`, + `BoolValue:` + valueToStringGenerated(this.BoolValue) + `,`, + `StringValue:` + valueToStringGenerated(this.StringValue) + `,`, + `VersionValue:` + valueToStringGenerated(this.VersionValue) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceCapacity) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceCapacity{`, + `Value:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Value), "Quantity", "resource.Quantity", 1), `&`, ``, 1) + `,`, + `RequestPolicy:` + strings.Replace(this.RequestPolicy.String(), "CapacityRequestPolicy", "CapacityRequestPolicy", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClaim) String() string { + if this == nil { + return "nil" + } + repeatedStringForRequests := "[]DeviceRequest{" + for _, f := range this.Requests { + repeatedStringForRequests += strings.Replace(strings.Replace(f.String(), "DeviceRequest", "DeviceRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForRequests += "}" + repeatedStringForConstraints := "[]DeviceConstraint{" + for _, f := range this.Constraints { + repeatedStringForConstraints += strings.Replace(strings.Replace(f.String(), "DeviceConstraint", "DeviceConstraint", 1), `&`, ``, 1) + "," + } + repeatedStringForConstraints += "}" + repeatedStringForConfig := "[]DeviceClaimConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceClaimConfiguration", "DeviceClaimConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceClaim{`, + `Requests:` + repeatedStringForRequests + `,`, + `Constraints:` + repeatedStringForConstraints + `,`, + `Config:` + repeatedStringForConfig + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClaimConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceClaimConfiguration{`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClass) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceClass{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "DeviceClassSpec", "DeviceClassSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceClassConfiguration{`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]DeviceClass{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "DeviceClass", "DeviceClass", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&DeviceClassList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassSpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + repeatedStringForConfig := "[]DeviceClassConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceClassConfiguration", "DeviceClassConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceClassSpec{`, + `Selectors:` + repeatedStringForSelectors + `,`, + `Config:` + repeatedStringForConfig + `,`, + `ExtendedResourceName:` + valueToStringGenerated(this.ExtendedResourceName) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceConfiguration{`, + `Opaque:` + strings.Replace(this.Opaque.String(), "OpaqueDeviceConfiguration", "OpaqueDeviceConfiguration", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceConstraint) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceConstraint{`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `MatchAttribute:` + valueToStringGenerated(this.MatchAttribute) + `,`, + `DistinctAttribute:` + valueToStringGenerated(this.DistinctAttribute) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceCounterConsumption) String() string { + if this == nil { + return "nil" + } + keysForCounters := make([]string, 0, len(this.Counters)) + for k := range this.Counters { + keysForCounters = append(keysForCounters, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + mapStringForCounters := "map[string]Counter{" + for _, k := range keysForCounters { + mapStringForCounters += fmt.Sprintf("%v: %v,", k, this.Counters[k]) + } + mapStringForCounters += "}" + s := strings.Join([]string{`&DeviceCounterConsumption{`, + `CounterSet:` + fmt.Sprintf("%v", this.CounterSet) + `,`, + `Counters:` + mapStringForCounters + `,`, + `}`, + }, "") + return s +} +func (this *DeviceRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForFirstAvailable := "[]DeviceSubRequest{" + for _, f := range this.FirstAvailable { + repeatedStringForFirstAvailable += strings.Replace(strings.Replace(f.String(), "DeviceSubRequest", "DeviceSubRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForFirstAvailable += "}" + s := strings.Join([]string{`&DeviceRequest{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Exactly:` + strings.Replace(this.Exactly.String(), "ExactDeviceRequest", "ExactDeviceRequest", 1) + `,`, + `FirstAvailable:` + repeatedStringForFirstAvailable + `,`, + `}`, + }, "") + return s +} +func (this *DeviceRequestAllocationResult) String() string { + if this == nil { + return "nil" + } + repeatedStringForTolerations := "[]DeviceToleration{" + for _, f := range this.Tolerations { + repeatedStringForTolerations += strings.Replace(strings.Replace(f.String(), "DeviceToleration", "DeviceToleration", 1), `&`, ``, 1) + "," + } + repeatedStringForTolerations += "}" + keysForConsumedCapacity := make([]string, 0, len(this.ConsumedCapacity)) + for k := range this.ConsumedCapacity { + keysForConsumedCapacity = append(keysForConsumedCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForConsumedCapacity) + mapStringForConsumedCapacity := "map[QualifiedName]resource.Quantity{" + for _, k := range keysForConsumedCapacity { + mapStringForConsumedCapacity += fmt.Sprintf("%v: %v,", k, this.ConsumedCapacity[QualifiedName(k)]) + } + mapStringForConsumedCapacity += "}" + s := strings.Join([]string{`&DeviceRequestAllocationResult{`, + `Request:` + fmt.Sprintf("%v", this.Request) + `,`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, + `Device:` + fmt.Sprintf("%v", this.Device) + `,`, + `AdminAccess:` + valueToStringGenerated(this.AdminAccess) + `,`, + `Tolerations:` + repeatedStringForTolerations + `,`, + `BindingConditions:` + fmt.Sprintf("%v", this.BindingConditions) + `,`, + `BindingFailureConditions:` + fmt.Sprintf("%v", this.BindingFailureConditions) + `,`, + `ShareID:` + valueToStringGenerated(this.ShareID) + `,`, + `ConsumedCapacity:` + mapStringForConsumedCapacity + `,`, + `}`, + }, "") + return s +} +func (this *DeviceSelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceSelector{`, + `CEL:` + strings.Replace(this.CEL.String(), "CELDeviceSelector", "CELDeviceSelector", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceSubRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + repeatedStringForTolerations := "[]DeviceToleration{" + for _, f := range this.Tolerations { + repeatedStringForTolerations += strings.Replace(strings.Replace(f.String(), "DeviceToleration", "DeviceToleration", 1), `&`, ``, 1) + "," + } + repeatedStringForTolerations += "}" + s := strings.Join([]string{`&DeviceSubRequest{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `DeviceClassName:` + fmt.Sprintf("%v", this.DeviceClassName) + `,`, + `Selectors:` + repeatedStringForSelectors + `,`, + `AllocationMode:` + fmt.Sprintf("%v", this.AllocationMode) + `,`, + `Count:` + fmt.Sprintf("%v", this.Count) + `,`, + `Tolerations:` + repeatedStringForTolerations + `,`, + `Capacity:` + strings.Replace(this.Capacity.String(), "CapacityRequirements", "CapacityRequirements", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceToleration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceToleration{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `Effect:` + fmt.Sprintf("%v", this.Effect) + `,`, + `TolerationSeconds:` + valueToStringGenerated(this.TolerationSeconds) + `,`, + `}`, + }, "") + return s +} +func (this *ExactDeviceRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + repeatedStringForTolerations := "[]DeviceToleration{" + for _, f := range this.Tolerations { + repeatedStringForTolerations += strings.Replace(strings.Replace(f.String(), "DeviceToleration", "DeviceToleration", 1), `&`, ``, 1) + "," + } + repeatedStringForTolerations += "}" + s := strings.Join([]string{`&ExactDeviceRequest{`, + `DeviceClassName:` + fmt.Sprintf("%v", this.DeviceClassName) + `,`, + `Selectors:` + repeatedStringForSelectors + `,`, + `AllocationMode:` + fmt.Sprintf("%v", this.AllocationMode) + `,`, + `Count:` + fmt.Sprintf("%v", this.Count) + `,`, + `AdminAccess:` + valueToStringGenerated(this.AdminAccess) + `,`, + `Tolerations:` + repeatedStringForTolerations + `,`, + `Capacity:` + strings.Replace(this.Capacity.String(), "CapacityRequirements", "CapacityRequirements", 1) + `,`, + `}`, + }, "") + return s +} +func (this *NetworkDeviceData) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NetworkDeviceData{`, + `InterfaceName:` + fmt.Sprintf("%v", this.InterfaceName) + `,`, + `IPs:` + fmt.Sprintf("%v", this.IPs) + `,`, + `HardwareAddress:` + fmt.Sprintf("%v", this.HardwareAddress) + `,`, + `}`, + }, "") + return s +} +func (this *OpaqueDeviceConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&OpaqueDeviceConfiguration{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Parameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Parameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaim) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaim{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ResourceClaimStatus", "ResourceClaimStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimConsumerReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimConsumerReference{`, + `APIGroup:` + fmt.Sprintf("%v", this.APIGroup) + `,`, + `Resource:` + fmt.Sprintf("%v", this.Resource) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `UID:` + fmt.Sprintf("%v", this.UID) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ResourceClaim{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceClaim", "ResourceClaim", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ResourceClaimList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimSpec{`, + `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceClaim", "DeviceClaim", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForReservedFor := "[]ResourceClaimConsumerReference{" + for _, f := range this.ReservedFor { + repeatedStringForReservedFor += strings.Replace(strings.Replace(f.String(), "ResourceClaimConsumerReference", "ResourceClaimConsumerReference", 1), `&`, ``, 1) + "," + } + repeatedStringForReservedFor += "}" + repeatedStringForDevices := "[]AllocatedDeviceStatus{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(strings.Replace(f.String(), "AllocatedDeviceStatus", "AllocatedDeviceStatus", 1), `&`, ``, 1) + "," + } + repeatedStringForDevices += "}" + s := strings.Join([]string{`&ResourceClaimStatus{`, + `Allocation:` + strings.Replace(this.Allocation.String(), "AllocationResult", "AllocationResult", 1) + `,`, + `ReservedFor:` + repeatedStringForReservedFor + `,`, + `Devices:` + repeatedStringForDevices + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimTemplate) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimTemplate{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimTemplateSpec", "ResourceClaimTemplateSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimTemplateList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ResourceClaimTemplate{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceClaimTemplate", "ResourceClaimTemplate", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ResourceClaimTemplateList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimTemplateSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimTemplateSpec{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourcePool) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourcePool{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Generation:` + fmt.Sprintf("%v", this.Generation) + `,`, + `ResourceSliceCount:` + fmt.Sprintf("%v", this.ResourceSliceCount) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceSlice) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceSlice{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceSliceSpec", "ResourceSliceSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceSliceList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ResourceSlice{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceSlice", "ResourceSlice", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ResourceSliceList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ResourceSliceSpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForDevices := "[]Device{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(strings.Replace(f.String(), "Device", "Device", 1), `&`, ``, 1) + "," + } + repeatedStringForDevices += "}" + repeatedStringForSharedCounters := "[]CounterSet{" + for _, f := range this.SharedCounters { + repeatedStringForSharedCounters += strings.Replace(strings.Replace(f.String(), "CounterSet", "CounterSet", 1), `&`, ``, 1) + "," + } + repeatedStringForSharedCounters += "}" + s := strings.Join([]string{`&ResourceSliceSpec{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + strings.Replace(strings.Replace(this.Pool.String(), "ResourcePool", "ResourcePool", 1), `&`, ``, 1) + `,`, + `NodeName:` + valueToStringGenerated(this.NodeName) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, + `AllNodes:` + valueToStringGenerated(this.AllNodes) + `,`, + `Devices:` + repeatedStringForDevices + `,`, + `PerDeviceNodeSelection:` + valueToStringGenerated(this.PerDeviceNodeSelection) + `,`, + `SharedCounters:` + repeatedStringForSharedCounters + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *AllocatedDeviceStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocatedDeviceStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocatedDeviceStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pool = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Device = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Data == nil { + m.Data = &runtime.RawExtension{} + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetworkData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NetworkData == nil { + m.NetworkData = &NetworkDeviceData{} + } + if err := m.NetworkData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ShareID = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AllocationResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocationResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Devices.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeSelector == nil { + m.NodeSelector = &v11.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AllocationTimestamp == nil { + m.AllocationTimestamp = &v1.Time{} + } + if err := m.AllocationTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CELDeviceSelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CELDeviceSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CELDeviceSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CapacityRequestPolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CapacityRequestPolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CapacityRequestPolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Default == nil { + m.Default = &resource.Quantity{} + } + if err := m.Default.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidValues", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidValues = append(m.ValidValues, resource.Quantity{}) + if err := m.ValidValues[len(m.ValidValues)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidRange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ValidRange == nil { + m.ValidRange = &CapacityRequestPolicyRange{} + } + if err := m.ValidRange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CapacityRequestPolicyRange) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CapacityRequestPolicyRange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CapacityRequestPolicyRange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Min", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Min == nil { + m.Min = &resource.Quantity{} + } + if err := m.Min.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Max", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Max == nil { + m.Max = &resource.Quantity{} + } + if err := m.Max.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Step", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Step == nil { + m.Step = &resource.Quantity{} + } + if err := m.Step.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CapacityRequirements) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CapacityRequirements: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CapacityRequirements: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Requests == nil { + m.Requests = make(map[QualifiedName]resource.Quantity) + } + var mapkey QualifiedName + mapvalue := &resource.Quantity{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Requests[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Counter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Counter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Counter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CounterSet) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CounterSet: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CounterSet: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Counters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Counters == nil { + m.Counters = make(map[string]Counter) + } + var mapkey string + mapvalue := &Counter{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Counter{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Counters[mapkey] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Device) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Device: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Attributes == nil { + m.Attributes = make(map[QualifiedName]DeviceAttribute) + } + var mapkey QualifiedName + mapvalue := &DeviceAttribute{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &DeviceAttribute{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Attributes[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Capacity == nil { + m.Capacity = make(map[QualifiedName]DeviceCapacity) + } + var mapkey QualifiedName + mapvalue := &DeviceCapacity{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &DeviceCapacity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Capacity[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsumesCounters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConsumesCounters = append(m.ConsumesCounters, DeviceCounterConsumption{}) + if err := m.ConsumesCounters[len(m.ConsumesCounters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.NodeName = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeSelector == nil { + m.NodeSelector = &v11.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllNodes", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AllNodes = &b + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taints = append(m.Taints, DeviceTaint{}) + if err := m.Taints[len(m.Taints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BindsToNode", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.BindsToNode = &b + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingConditions = append(m.BindingConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingFailureConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingFailureConditions = append(m.BindingFailureConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowMultipleAllocations", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AllowMultipleAllocations = &b + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAllocationConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceAllocationConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAllocationConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Source = AllocationConfigSource(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAllocationResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceAllocationResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Results = append(m.Results, DeviceRequestAllocationResult{}) + if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = append(m.Config, DeviceAllocationConfiguration{}) + if err := m.Config[len(m.Config)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAttribute) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceAttribute: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAttribute: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IntValue", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IntValue = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BoolValue", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.BoolValue = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StringValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.StringValue = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VersionValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.VersionValue = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceCapacity) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceCapacity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceCapacity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestPolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RequestPolicy == nil { + m.RequestPolicy = &CapacityRequestPolicy{} + } + if err := m.RequestPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClaim) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClaim: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClaim: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, DeviceRequest{}) + if err := m.Requests[len(m.Requests)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Constraints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Constraints = append(m.Constraints, DeviceConstraint{}) + if err := m.Constraints[len(m.Constraints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = append(m.Config, DeviceClaimConfiguration{}) + if err := m.Config[len(m.Config)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClaimConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClaimConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClaimConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClass) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClass: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClass: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClassConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClassConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClassList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClassList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, DeviceClass{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClassSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClassSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = append(m.Config, DeviceClassConfiguration{}) + if err := m.Config[len(m.Config)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtendedResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ExtendedResourceName = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Opaque", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Opaque == nil { + m.Opaque = &OpaqueDeviceConfiguration{} + } + if err := m.Opaque.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceConstraint) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceConstraint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceConstraint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchAttribute", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FullyQualifiedName(dAtA[iNdEx:postIndex]) + m.MatchAttribute = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DistinctAttribute", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FullyQualifiedName(dAtA[iNdEx:postIndex]) + m.DistinctAttribute = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceCounterConsumption) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceCounterConsumption: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceCounterConsumption: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CounterSet", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CounterSet = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Counters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Counters == nil { + m.Counters = make(map[string]Counter) + } + var mapkey string + mapvalue := &Counter{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Counter{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Counters[mapkey] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exactly", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Exactly == nil { + m.Exactly = &ExactDeviceRequest{} + } + if err := m.Exactly.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FirstAvailable", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FirstAvailable = append(m.FirstAvailable, DeviceSubRequest{}) + if err := m.FirstAvailable[len(m.FirstAvailable)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceRequestAllocationResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceRequestAllocationResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceRequestAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Request = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pool = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Device = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AdminAccess", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AdminAccess = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tolerations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tolerations = append(m.Tolerations, DeviceToleration{}) + if err := m.Tolerations[len(m.Tolerations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingConditions = append(m.BindingConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingFailureConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingFailureConditions = append(m.BindingFailureConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + m.ShareID = &s + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsumedCapacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsumedCapacity == nil { + m.ConsumedCapacity = make(map[QualifiedName]resource.Quantity) + } + var mapkey QualifiedName + mapvalue := &resource.Quantity{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ConsumedCapacity[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceSelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CEL", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CEL == nil { + m.CEL = &CELDeviceSelector{} + } + if err := m.CEL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceSubRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceSubRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceSubRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeviceClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllocationMode = DeviceAllocationMode(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tolerations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tolerations = append(m.Tolerations, DeviceToleration{}) + if err := m.Tolerations[len(m.Tolerations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Capacity == nil { + m.Capacity = &CapacityRequirements{} + } + if err := m.Capacity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceTaint) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceTaint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceTaint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Effect", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Effect = DeviceTaintEffect(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeAdded", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TimeAdded == nil { + m.TimeAdded = &v1.Time{} + } + if err := m.TimeAdded.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceToleration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceToleration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceToleration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Operator = DeviceTolerationOperator(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Effect", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Effect = DeviceTaintEffect(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TolerationSeconds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TolerationSeconds = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExactDeviceRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExactDeviceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExactDeviceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeviceClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllocationMode = DeviceAllocationMode(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AdminAccess", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AdminAccess = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tolerations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tolerations = append(m.Tolerations, DeviceToleration{}) + if err := m.Tolerations[len(m.Tolerations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Capacity == nil { + m.Capacity = &CapacityRequirements{} + } + if err := m.Capacity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NetworkDeviceData) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NetworkDeviceData: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NetworkDeviceData: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InterfaceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InterfaceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IPs = append(m.IPs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HardwareAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HardwareAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OpaqueDeviceConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OpaqueDeviceConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OpaqueDeviceConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Parameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaim) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaim: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaim: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimConsumerReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimConsumerReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimConsumerReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.APIGroup = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resource = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ResourceClaim{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Devices.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Allocation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Allocation == nil { + m.Allocation = &AllocationResult{} + } + if err := m.Allocation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReservedFor", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReservedFor = append(m.ReservedFor, ResourceClaimConsumerReference{}) + if err := m.ReservedFor[len(m.ReservedFor)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, AllocatedDeviceStatus{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimTemplate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimTemplate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimTemplate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimTemplateList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimTemplateList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimTemplateList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ResourceClaimTemplate{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimTemplateSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimTemplateSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimTemplateSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourcePool) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourcePool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourcePool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Generation", wireType) + } + m.Generation = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Generation |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceSliceCount", wireType) + } + m.ResourceSliceCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ResourceSliceCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceSlice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceSlice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceSlice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceSliceList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceSliceList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceSliceList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ResourceSlice{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceSliceSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceSliceSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceSliceSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Pool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.NodeName = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeSelector == nil { + m.NodeSelector = &v11.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllNodes", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AllNodes = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, Device{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PerDeviceNodeSelection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PerDeviceNodeSelection = &b + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SharedCounters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SharedCounters = append(m.SharedCounters, CounterSet{}) + if err := m.SharedCounters[len(m.SharedCounters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenerated + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenerated + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/k8s.io/api/resource/v1/generated.proto b/vendor/k8s.io/api/resource/v1/generated.proto new file mode 100644 index 0000000000..816a430c26 --- /dev/null +++ b/vendor/k8s.io/api/resource/v1/generated.proto @@ -0,0 +1,1589 @@ +/* +Copyright The Kubernetes 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. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = "proto2"; + +package k8s.io.api.resource.v1; + +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "k8s.io/api/resource/v1"; + +// AllocatedDeviceStatus contains the status of an allocated device, if the +// driver chooses to report it. This may include driver-specific information. +// +// The combination of Driver, Pool, Device, and ShareID must match the corresponding key +// in Status.Allocation.Devices. +message AllocatedDeviceStatus { + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 1; + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + optional string pool = 2; + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + optional string device = 3; + + // ShareID uniquely identifies an individual allocation share of the device. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional string shareID = 7; + + // Conditions contains the latest observation of the device's state. + // If the device has been configured according to the class and claim + // config references, the `Ready` condition should be True. + // + // Must not contain more than 8 entries. + // + // +optional + // +listType=map + // +listMapKey=type + repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 4; + + // Data contains arbitrary driver-specific data. + // + // The length of the raw data must be smaller or equal to 10 Ki. + // + // +optional + optional .k8s.io.apimachinery.pkg.runtime.RawExtension data = 5; + + // NetworkData contains network-related information specific to the device. + // + // +optional + optional NetworkDeviceData networkData = 6; +} + +// AllocationResult contains attributes of an allocated resource. +message AllocationResult { + // Devices is the result of allocating devices. + // + // +optional + optional DeviceAllocationResult devices = 1; + + // NodeSelector defines where the allocated resources are available. If + // unset, they are available everywhere. + // + // +optional + optional .k8s.io.api.core.v1.NodeSelector nodeSelector = 3; + + // AllocationTimestamp stores the time when the resources were allocated. + // This field is not guaranteed to be set, in which case that time is unknown. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gate. + // + // +optional + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time allocationTimestamp = 5; +} + +// CELDeviceSelector contains a CEL expression for selecting a device. +message CELDeviceSelector { + // Expression is a CEL expression which evaluates a single device. It + // must evaluate to true when the device under consideration satisfies + // the desired criteria, and false when it does not. Any other result + // is an error and causes allocation of devices to abort. + // + // The expression's input is an object named "device", which carries + // the following properties: + // - driver (string): the name of the driver which defines this device. + // - attributes (map[string]object): the device's attributes, grouped by prefix + // (e.g. device.attributes["dra.example.com"] evaluates to an object with all + // of the attributes which were prefixed by "dra.example.com". + // - capacity (map[string]object): the device's capacities, grouped by prefix. + // - allowMultipleAllocations (bool): the allowMultipleAllocations property of the device + // (v1.34+ with the DRAConsumableCapacity feature enabled). + // + // Example: Consider a device with driver="dra.example.com", which exposes + // two attributes named "model" and "ext.example.com/family" and which + // exposes one capacity named "modules". This input to this expression + // would have the following fields: + // + // device.driver + // device.attributes["dra.example.com"].model + // device.attributes["ext.example.com"].family + // device.capacity["dra.example.com"].modules + // + // The device.driver field can be used to check for a specific driver, + // either as a high-level precondition (i.e. you only want to consider + // devices from this driver) or as part of a multi-clause expression + // that is meant to consider devices from different drivers. + // + // The value type of each attribute is defined by the device + // definition, and users who write these expressions must consult the + // documentation for their specific drivers. The value type of each + // capacity is Quantity. + // + // If an unknown prefix is used as a lookup in either device.attributes + // or device.capacity, an empty map will be returned. Any reference to + // an unknown field will cause an evaluation error and allocation to + // abort. + // + // A robust expression should check for the existence of attributes + // before referencing them. + // + // For ease of use, the cel.bind() function is enabled, and can be used + // to simplify expressions that access multiple attributes with the + // same domain. For example: + // + // cel.bind(dra, device.attributes["dra.example.com"], dra.someBool && dra.anotherBool) + // + // The length of the expression must be smaller or equal to 10 Ki. The + // cost of evaluating it is also limited based on the estimated number + // of logical steps. + // + // +required + optional string expression = 1; +} + +// CapacityRequestPolicy defines how requests consume device capacity. +// +// Must not set more than one ValidRequestValues. +message CapacityRequestPolicy { + // Default specifies how much of this capacity is consumed by a request + // that does not contain an entry for it in DeviceRequest's Capacity. + // + // +optional + optional .k8s.io.apimachinery.pkg.api.resource.Quantity default = 1; + + // ValidValues defines a set of acceptable quantity values in consuming requests. + // + // Must not contain more than 10 entries. + // Must be sorted in ascending order. + // + // If this field is set, + // Default must be defined and it must be included in ValidValues list. + // + // If the requested amount does not match any valid value but smaller than some valid values, + // the scheduler calculates the smallest valid value that is greater than or equal to the request. + // That is: min(ceil(requestedValue) ∈ validValues), where requestedValue ≤ max(validValues). + // + // If the requested amount exceeds all valid values, the request violates the policy, + // and this device cannot be allocated. + // + // +optional + // +listType=atomic + // +oneOf=ValidRequestValues + repeated .k8s.io.apimachinery.pkg.api.resource.Quantity validValues = 3; + + // ValidRange defines an acceptable quantity value range in consuming requests. + // + // If this field is set, + // Default must be defined and it must fall within the defined ValidRange. + // + // If the requested amount does not fall within the defined range, the request violates the policy, + // and this device cannot be allocated. + // + // If the request doesn't contain this capacity entry, Default value is used. + // + // +optional + // +oneOf=ValidRequestValues + optional CapacityRequestPolicyRange validRange = 4; +} + +// CapacityRequestPolicyRange defines a valid range for consumable capacity values. +// +// - If the requested amount is less than Min, it is rounded up to the Min value. +// - If Step is set and the requested amount is between Min and Max but not aligned with Step, +// it will be rounded up to the next value equal to Min + (n * Step). +// - If Step is not set, the requested amount is used as-is if it falls within the range Min to Max (if set). +// - If the requested or rounded amount exceeds Max (if set), the request does not satisfy the policy, +// and the device cannot be allocated. +message CapacityRequestPolicyRange { + // Min specifies the minimum capacity allowed for a consumption request. + // + // Min must be greater than or equal to zero, + // and less than or equal to the capacity value. + // requestPolicy.default must be more than or equal to the minimum. + // + // +required + optional .k8s.io.apimachinery.pkg.api.resource.Quantity min = 1; + + // Max defines the upper limit for capacity that can be requested. + // + // Max must be less than or equal to the capacity value. + // Min and requestPolicy.default must be less than or equal to the maximum. + // + // +optional + optional .k8s.io.apimachinery.pkg.api.resource.Quantity max = 2; + + // Step defines the step size between valid capacity amounts within the range. + // + // Max (if set) and requestPolicy.default must be a multiple of Step. + // Min + Step must be less than or equal to the capacity value. + // + // +optional + optional .k8s.io.apimachinery.pkg.api.resource.Quantity step = 3; +} + +// CapacityRequirements defines the capacity requirements for a specific device request. +message CapacityRequirements { + // Requests represent individual device resource requests for distinct resources, + // all of which must be provided by the device. + // + // This value is used as an additional filtering condition against the available capacity on the device. + // This is semantically equivalent to a CEL selector with + // `device.capacity[]..compareTo(quantity()) >= 0`. + // For example, device.capacity['test-driver.cdi.k8s.io'].counters.compareTo(quantity('2')) >= 0. + // + // When a requestPolicy is defined, the requested amount is adjusted upward + // to the nearest valid value based on the policy. + // If the requested amount cannot be adjusted to a valid value—because it exceeds what the requestPolicy allows— + // the device is considered ineligible for allocation. + // + // For any capacity that is not explicitly requested: + // - If no requestPolicy is set, the default consumed capacity is equal to the full device capacity + // (i.e., the whole device is claimed). + // - If a requestPolicy is set, the default consumed capacity is determined according to that policy. + // + // If the device allows multiple allocation, + // the aggregated amount across all requests must not exceed the capacity value. + // The consumed capacity, which may be adjusted based on the requestPolicy if defined, + // is recorded in the resource claim’s status.devices[*].consumedCapacity field. + // + // +optional + map requests = 1; +} + +// Counter describes a quantity associated with a device. +message Counter { + // Value defines how much of a certain device counter is available. + // + // +required + optional .k8s.io.apimachinery.pkg.api.resource.Quantity value = 1; +} + +// CounterSet defines a named set of counters +// that are available to be used by devices defined in the +// ResourceSlice. +// +// The counters are not allocatable by themselves, but +// can be referenced by devices. When a device is allocated, +// the portion of counters it uses will no longer be available for use +// by other devices. +message CounterSet { + // Name defines the name of the counter set. + // It must be a DNS label. + // + // +required + optional string name = 1; + + // Counters defines the set of counters for this CounterSet + // The name of each counter must be unique in that set and must be a DNS label. + // + // The maximum number of counters in all sets is 32. + // + // +required + map counters = 2; +} + +// Device represents one individual hardware instance that can be selected based +// on its attributes. Besides the name, exactly one field must be set. +message Device { + // Name is unique identifier among all devices managed by + // the driver in the pool. It must be a DNS label. + // + // +required + optional string name = 1; + + // Attributes defines the set of attributes for this device. + // The name of each attribute must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + map attributes = 2; + + // Capacity defines the set of capacities for this device. + // The name of each capacity must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + map capacity = 3; + + // ConsumesCounters defines a list of references to sharedCounters + // and the set of counters that the device will + // consume from those counter sets. + // + // There can only be a single entry per counterSet. + // + // The total number of device counter consumption entries + // must be <= 32. In addition, the total number in the + // entire ResourceSlice must be <= 1024 (for example, + // 64 devices with 16 counters each). + // + // +optional + // +listType=atomic + // +featureGate=DRAPartitionableDevices + repeated DeviceCounterConsumption consumesCounters = 4; + + // NodeName identifies the node where the device is available. + // + // Must only be set if Spec.PerDeviceNodeSelection is set to true. + // At most one of NodeName, NodeSelector and AllNodes can be set. + // + // +optional + // +oneOf=DeviceNodeSelection + // +featureGate=DRAPartitionableDevices + optional string nodeName = 5; + + // NodeSelector defines the nodes where the device is available. + // + // Must use exactly one term. + // + // Must only be set if Spec.PerDeviceNodeSelection is set to true. + // At most one of NodeName, NodeSelector and AllNodes can be set. + // + // +optional + // +oneOf=DeviceNodeSelection + // +featureGate=DRAPartitionableDevices + optional .k8s.io.api.core.v1.NodeSelector nodeSelector = 6; + + // AllNodes indicates that all nodes have access to the device. + // + // Must only be set if Spec.PerDeviceNodeSelection is set to true. + // At most one of NodeName, NodeSelector and AllNodes can be set. + // + // +optional + // +oneOf=DeviceNodeSelection + // +featureGate=DRAPartitionableDevices + optional bool allNodes = 7; + + // If specified, these are the driver-defined taints. + // + // The maximum number of taints is 4. + // + // This is an alpha field and requires enabling the DRADeviceTaints + // feature gate. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceTaints + repeated DeviceTaint taints = 8; + + // BindsToNode indicates if the usage of an allocation involving this device + // has to be limited to exactly the node that was chosen when allocating the claim. + // If set to true, the scheduler will set the ResourceClaim.Status.Allocation.NodeSelector + // to match the node where the allocation was made. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + optional bool bindsToNode = 9; + + // BindingConditions defines the conditions for proceeding with binding. + // All of these conditions must be set in the per-device status + // conditions with a value of True to proceed with binding the pod to the node + // while scheduling the pod. + // + // The maximum number of binding conditions is 4. + // + // The conditions must be a valid condition type string. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingConditions = 10; + + // BindingFailureConditions defines the conditions for binding failure. + // They may be set in the per-device status conditions. + // If any is set to "True", a binding failure occurred. + // + // The maximum number of binding failure conditions is 4. + // + // The conditions must be a valid condition type string. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingFailureConditions = 11; + + // AllowMultipleAllocations marks whether the device is allowed to be allocated to multiple DeviceRequests. + // + // If AllowMultipleAllocations is set to true, the device can be allocated more than once, + // and all of its capacity is consumable, regardless of whether the requestPolicy is defined or not. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional bool allowMultipleAllocations = 12; +} + +// DeviceAllocationConfiguration gets embedded in an AllocationResult. +message DeviceAllocationConfiguration { + // Source records whether the configuration comes from a class and thus + // is not something that a normal user would have been able to set + // or from a claim. + // + // +required + optional string source = 1; + + // Requests lists the names of requests where the configuration applies. + // If empty, its applies to all requests. + // + // References to subrequests must include the name of the main request + // and may include the subrequest using the format
[/]. If just + // the main request is given, the configuration applies to all subrequests. + // + // +optional + // +listType=atomic + repeated string requests = 2; + + optional DeviceConfiguration deviceConfiguration = 3; +} + +// DeviceAllocationResult is the result of allocating devices. +message DeviceAllocationResult { + // Results lists all allocated devices. + // + // +optional + // +listType=atomic + repeated DeviceRequestAllocationResult results = 1; + + // This field is a combination of all the claim and class configuration parameters. + // Drivers can distinguish between those based on a flag. + // + // This includes configuration parameters for drivers which have no allocated + // devices in the result because it is up to the drivers which configuration + // parameters they support. They can silently ignore unknown configuration + // parameters. + // + // +optional + // +listType=atomic + repeated DeviceAllocationConfiguration config = 2; +} + +// DeviceAttribute must have exactly one field set. +message DeviceAttribute { + // IntValue is a number. + // + // +optional + // +oneOf=ValueType + optional int64 int = 2; + + // BoolValue is a true/false value. + // + // +optional + // +oneOf=ValueType + optional bool bool = 3; + + // StringValue is a string. Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + optional string string = 4; + + // VersionValue is a semantic version according to semver.org spec 2.0.0. + // Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + optional string version = 5; +} + +// DeviceCapacity describes a quantity associated with a device. +message DeviceCapacity { + // Value defines how much of a certain capacity that device has. + // + // This field reflects the fixed total capacity and does not change. + // The consumed amount is tracked separately by scheduler + // and does not affect this value. + // + // +required + optional .k8s.io.apimachinery.pkg.api.resource.Quantity value = 1; + + // RequestPolicy defines how this DeviceCapacity must be consumed + // when the device is allowed to be shared by multiple allocations. + // + // The Device must have allowMultipleAllocations set to true in order to set a requestPolicy. + // + // If unset, capacity requests are unconstrained: + // requests can consume any amount of capacity, as long as the total consumed + // across all allocations does not exceed the device's defined capacity. + // If request is also unset, default is the full capacity value. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional CapacityRequestPolicy requestPolicy = 2; +} + +// DeviceClaim defines how to request devices with a ResourceClaim. +message DeviceClaim { + // Requests represent individual requests for distinct devices which + // must all be satisfied. If empty, nothing needs to be allocated. + // + // +optional + // +listType=atomic + repeated DeviceRequest requests = 1; + + // These constraints must be satisfied by the set of devices that get + // allocated for the claim. + // + // +optional + // +listType=atomic + repeated DeviceConstraint constraints = 2; + + // This field holds configuration for multiple potential drivers which + // could satisfy requests in this claim. It is ignored while allocating + // the claim. + // + // +optional + // +listType=atomic + repeated DeviceClaimConfiguration config = 3; +} + +// DeviceClaimConfiguration is used for configuration parameters in DeviceClaim. +message DeviceClaimConfiguration { + // Requests lists the names of requests where the configuration applies. + // If empty, it applies to all requests. + // + // References to subrequests must include the name of the main request + // and may include the subrequest using the format
[/]. If just + // the main request is given, the configuration applies to all subrequests. + // + // +optional + // +listType=atomic + repeated string requests = 1; + + optional DeviceConfiguration deviceConfiguration = 2; +} + +// DeviceClass is a vendor- or admin-provided resource that contains +// device configuration and selectors. It can be referenced in +// the device requests of a claim to apply these presets. +// Cluster scoped. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. +message DeviceClass { + // Standard object metadata + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Spec defines what can be allocated and how to configure it. + // + // This is mutable. Consumers have to be prepared for classes changing + // at any time, either because they get updated or replaced. Claim + // allocations are done once based on whatever was set in classes at + // the time of allocation. + // + // Changing the spec automatically increments the metadata.generation number. + optional DeviceClassSpec spec = 2; +} + +// DeviceClassConfiguration is used in DeviceClass. +message DeviceClassConfiguration { + optional DeviceConfiguration deviceConfiguration = 1; +} + +// DeviceClassList is a collection of classes. +message DeviceClassList { + // Standard list metadata + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is the list of resource classes. + repeated DeviceClass items = 2; +} + +// DeviceClassSpec is used in a [DeviceClass] to define what can be allocated +// and how to configure it. +message DeviceClassSpec { + // Each selector must be satisfied by a device which is claimed via this class. + // + // +optional + // +listType=atomic + repeated DeviceSelector selectors = 1; + + // Config defines configuration parameters that apply to each device that is claimed via this class. + // Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor + // configuration applies to exactly one driver. + // + // They are passed to the driver, but are not considered while allocating the claim. + // + // +optional + // +listType=atomic + repeated DeviceClassConfiguration config = 2; + + // ExtendedResourceName is the extended resource name for the devices of this class. + // The devices of this class can be used to satisfy a pod's extended resource requests. + // It has the same format as the name of a pod's extended resource. + // It should be unique among all the device classes in a cluster. + // If two device classes have the same name, then the class created later + // is picked to satisfy a pod's extended resource requests. + // If two classes are created at the same time, then the name of the class + // lexicographically sorted first is picked. + // + // This is an alpha field. + // +optional + // +featureGate=DRAExtendedResource + optional string extendedResourceName = 4; +} + +// DeviceConfiguration must have exactly one field set. It gets embedded +// inline in some other structs which have other fields, so field names must +// not conflict with those. +message DeviceConfiguration { + // Opaque provides driver-specific configuration parameters. + // + // +optional + // +oneOf=ConfigurationType + optional OpaqueDeviceConfiguration opaque = 1; +} + +// DeviceConstraint must have exactly one field set besides Requests. +message DeviceConstraint { + // Requests is a list of the one or more requests in this claim which + // must co-satisfy this constraint. If a request is fulfilled by + // multiple devices, then all of the devices must satisfy the + // constraint. If this is not specified, this constraint applies to all + // requests in this claim. + // + // References to subrequests must include the name of the main request + // and may include the subrequest using the format
[/]. If just + // the main request is given, the constraint applies to all subrequests. + // + // +optional + // +listType=atomic + repeated string requests = 1; + + // MatchAttribute requires that all devices in question have this + // attribute and that its type and value are the same across those + // devices. + // + // For example, if you specified "dra.example.com/numa" (a hypothetical example!), + // then only devices in the same NUMA node will be chosen. A device which + // does not have that attribute will not be chosen. All devices should + // use a value of the same type for this attribute because that is part of + // its specification, but if one device doesn't, then it also will not be + // chosen. + // + // Must include the domain qualifier. + // + // +optional + // +oneOf=ConstraintType + optional string matchAttribute = 2; + + // DistinctAttribute requires that all devices in question have this + // attribute and that its type and value are unique across those devices. + // + // This acts as the inverse of MatchAttribute. + // + // This constraint is used to avoid allocating multiple requests to the same device + // by ensuring attribute-level differentiation. + // + // This is useful for scenarios where resource requests must be fulfilled by separate physical devices. + // For example, a container requests two network interfaces that must be allocated from two different physical NICs. + // + // +optional + // +oneOf=ConstraintType + // +featureGate=DRAConsumableCapacity + optional string distinctAttribute = 3; +} + +// DeviceCounterConsumption defines a set of counters that +// a device will consume from a CounterSet. +message DeviceCounterConsumption { + // CounterSet is the name of the set from which the + // counters defined will be consumed. + // + // +required + optional string counterSet = 1; + + // Counters defines the counters that will be consumed by the device. + // + // The maximum number counters in a device is 32. + // In addition, the maximum number of all counters + // in all devices is 1024 (for example, 64 devices with + // 16 counters each). + // + // +required + map counters = 2; +} + +// DeviceRequest is a request for devices required for a claim. +// This is typically a request for a single resource like a device, but can +// also ask for several identical devices. With FirstAvailable it is also +// possible to provide a prioritized list of requests. +message DeviceRequest { + // Name can be used to reference this request in a pod.spec.containers[].resources.claims + // entry and in a constraint of the claim. + // + // References using the name in the DeviceRequest will uniquely + // identify a request when the Exactly field is set. When the + // FirstAvailable field is set, a reference to the name of the + // DeviceRequest will match whatever subrequest is chosen by the + // scheduler. + // + // Must be a DNS label. + // + // +required + optional string name = 1; + + // Exactly specifies the details for a single request that must + // be met exactly for the request to be satisfied. + // + // One of Exactly or FirstAvailable must be set. + // + // +optional + // +oneOf=deviceRequestType + optional ExactDeviceRequest exactly = 2; + + // FirstAvailable contains subrequests, of which exactly one will be + // selected by the scheduler. It tries to + // satisfy them in the order in which they are listed here. So if + // there are two entries in the list, the scheduler will only check + // the second one if it determines that the first one can not be used. + // + // DRA does not yet implement scoring, so the scheduler will + // select the first set of devices that satisfies all the + // requests in the claim. And if the requirements can + // be satisfied on more than one node, other scheduling features + // will determine which node is chosen. This means that the set of + // devices allocated to a claim might not be the optimal set + // available to the cluster. Scoring will be implemented later. + // + // +optional + // +oneOf=deviceRequestType + // +listType=atomic + // +featureGate=DRAPrioritizedList + repeated DeviceSubRequest firstAvailable = 3; +} + +// DeviceRequestAllocationResult contains the allocation result for one request. +message DeviceRequestAllocationResult { + // Request is the name of the request in the claim which caused this + // device to be allocated. If it references a subrequest in the + // firstAvailable list on a DeviceRequest, this field must + // include both the name of the main request and the subrequest + // using the format
/. + // + // Multiple devices may have been allocated per request. + // + // +required + optional string request = 1; + + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 2; + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + optional string pool = 3; + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + optional string device = 4; + + // AdminAccess indicates that this device was allocated for + // administrative access. See the corresponding request field + // for a definition of mode. + // + // This is an alpha field and requires enabling the DRAAdminAccess + // feature gate. Admin access is disabled if this field is unset or + // set to false, otherwise it is enabled. + // + // +optional + // +featureGate=DRAAdminAccess + optional bool adminAccess = 5; + + // A copy of all tolerations specified in the request at the time + // when the device got allocated. + // + // The maximum number of tolerations is 16. + // + // This is an alpha field and requires enabling the DRADeviceTaints + // feature gate. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceTaints + repeated DeviceToleration tolerations = 6; + + // BindingConditions contains a copy of the BindingConditions + // from the corresponding ResourceSlice at the time of allocation. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingConditions = 7; + + // BindingFailureConditions contains a copy of the BindingFailureConditions + // from the corresponding ResourceSlice at the time of allocation. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingFailureConditions = 8; + + // ShareID uniquely identifies an individual allocation share of the device, + // used when the device supports multiple simultaneous allocations. + // It serves as an additional map key to differentiate concurrent shares + // of the same device. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional string shareID = 9; + + // ConsumedCapacity tracks the amount of capacity consumed per device as part of the claim request. + // The consumed amount may differ from the requested amount: it is rounded up to the nearest valid + // value based on the device’s requestPolicy if applicable (i.e., may not be less than the requested amount). + // + // The total consumed capacity for each device must not exceed the DeviceCapacity's Value. + // + // This field is populated only for devices that allow multiple allocations. + // All capacity entries are included, even if the consumed amount is zero. + // + // +optional + // +featureGate=DRAConsumableCapacity + map consumedCapacity = 10; +} + +// DeviceSelector must have exactly one field set. +message DeviceSelector { + // CEL contains a CEL expression for selecting a device. + // + // +optional + // +oneOf=SelectorType + optional CELDeviceSelector cel = 1; +} + +// DeviceSubRequest describes a request for device provided in the +// claim.spec.devices.requests[].firstAvailable array. Each +// is typically a request for a single resource like a device, but can +// also ask for several identical devices. +// +// DeviceSubRequest is similar to ExactDeviceRequest, but doesn't expose the +// AdminAccess field as that one is only supported when requesting a +// specific device. +message DeviceSubRequest { + // Name can be used to reference this subrequest in the list of constraints + // or the list of configurations for the claim. References must use the + // format
/. + // + // Must be a DNS label. + // + // +required + optional string name = 1; + + // DeviceClassName references a specific DeviceClass, which can define + // additional configuration and selectors to be inherited by this + // subrequest. + // + // A class is required. Which classes are available depends on the cluster. + // + // Administrators may use this to restrict which devices may get + // requested by only installing classes with selectors for permitted + // devices. If users are free to request anything without restrictions, + // then administrators can create an empty DeviceClass for users + // to reference. + // + // +required + optional string deviceClassName = 2; + + // Selectors define criteria which must be satisfied by a specific + // device in order for that device to be considered for this + // subrequest. All selectors must be satisfied for a device to be + // considered. + // + // +optional + // +listType=atomic + repeated DeviceSelector selectors = 3; + + // AllocationMode and its related fields define how devices are allocated + // to satisfy this subrequest. Supported values are: + // + // - ExactCount: This request is for a specific number of devices. + // This is the default. The exact number is provided in the + // count field. + // + // - All: This subrequest is for all of the matching devices in a pool. + // Allocation will fail if some devices are already allocated, + // unless adminAccess is requested. + // + // If AllocationMode is not specified, the default mode is ExactCount. If + // the mode is ExactCount and count is not specified, the default count is + // one. Any other subrequests must specify this field. + // + // More modes may get added in the future. Clients must refuse to handle + // requests with unknown modes. + // + // +optional + optional string allocationMode = 4; + + // Count is used only when the count mode is "ExactCount". Must be greater than zero. + // If AllocationMode is ExactCount and this field is not specified, the default is one. + // + // +optional + // +oneOf=AllocationMode + optional int64 count = 5; + + // If specified, the request's tolerations. + // + // Tolerations for NoSchedule are required to allocate a + // device which has a taint with that effect. The same applies + // to NoExecute. + // + // In addition, should any of the allocated devices get tainted + // with NoExecute after allocation and that effect is not tolerated, + // then all pods consuming the ResourceClaim get deleted to evict + // them. The scheduler will not let new pods reserve the claim while + // it has these tainted devices. Once all pods are evicted, the + // claim will get deallocated. + // + // The maximum number of tolerations is 16. + // + // This is an alpha field and requires enabling the DRADeviceTaints + // feature gate. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceTaints + repeated DeviceToleration tolerations = 6; + + // Capacity define resource requirements against each capacity. + // + // If this field is unset and the device supports multiple allocations, + // the default value will be applied to each capacity according to requestPolicy. + // For the capacity that has no requestPolicy, default is the full capacity value. + // + // Applies to each device allocation. + // If Count > 1, + // the request fails if there aren't enough devices that meet the requirements. + // If AllocationMode is set to All, + // the request fails if there are devices that otherwise match the request, + // and have this capacity, with a value >= the requested amount, but which cannot be allocated to this request. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional CapacityRequirements capacity = 7; +} + +// The device this taint is attached to has the "effect" on +// any claim which does not tolerate the taint and, through the claim, +// to pods using the claim. +// +// +protobuf.options.(gogoproto.goproto_stringer)=false +message DeviceTaint { + // The taint key to be applied to a device. + // Must be a label name. + // + // +required + optional string key = 1; + + // The taint value corresponding to the taint key. + // Must be a label value. + // + // +optional + optional string value = 2; + + // The effect of the taint on claims that do not tolerate the taint + // and through such claims on the pods using them. + // Valid effects are NoSchedule and NoExecute. PreferNoSchedule as used for + // nodes is not valid here. + // + // +required + optional string effect = 3; + + // TimeAdded represents the time at which the taint was added. + // Added automatically during create or update if not set. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time timeAdded = 4; +} + +// The ResourceClaim this DeviceToleration is attached to tolerates any taint that matches +// the triple using the matching operator . +message DeviceToleration { + // Key is the taint key that the toleration applies to. Empty means match all taint keys. + // If the key is empty, operator must be Exists; this combination means to match all values and all keys. + // Must be a label name. + // + // +optional + optional string key = 1; + + // Operator represents a key's relationship to the value. + // Valid operators are Exists and Equal. Defaults to Equal. + // Exists is equivalent to wildcard for value, so that a ResourceClaim can + // tolerate all taints of a particular category. + // + // +optional + // +default="Equal" + optional string operator = 2; + + // Value is the taint value the toleration matches to. + // If the operator is Exists, the value must be empty, otherwise just a regular string. + // Must be a label value. + // + // +optional + optional string value = 3; + + // Effect indicates the taint effect to match. Empty means match all taint effects. + // When specified, allowed values are NoSchedule and NoExecute. + // + // +optional + optional string effect = 4; + + // TolerationSeconds represents the period of time the toleration (which must be + // of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, + // it is not set, which means tolerate the taint forever (do not evict). Zero and + // negative values will be treated as 0 (evict immediately) by the system. + // If larger than zero, the time when the pod needs to be evicted is calculated as